about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/python-modules
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/python-modules')
-rw-r--r--nixpkgs/pkgs/development/python-modules/3to2/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/Cython/default.nix88
-rw-r--r--nixpkgs/pkgs/development/python-modules/Cython/setup-hook.sh3
-rw-r--r--nixpkgs/pkgs/development/python-modules/Cython/trashcan.patch354
-rw-r--r--nixpkgs/pkgs/development/python-modules/Flask-PyMongo/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/IPy/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/a2wsgi/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/aadict/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/aafigure/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/aardwolf/default.nix86
-rw-r--r--nixpkgs/pkgs/development/python-modules/abjad/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/about-time/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/absl-py/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/accelerate/default.nix111
-rw-r--r--nixpkgs/pkgs/development/python-modules/accessible-pygments/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/accupy/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/accuweather/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/acme-tiny/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/acme/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/acoustics/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/acquire/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/actdiag/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/acunetix/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/adafruit-io/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/adafruit-platformdetect/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/adafruit-pureio/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/adal/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/adax-local/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/adax/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/adb-enhanced/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/adb-homeassistant/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/adb-shell/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/adblock/default.nix97
-rw-r--r--nixpkgs/pkgs/development/python-modules/add-trailing-comma/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/addict/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/adext/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/adguardhome/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/adjusttext/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/adlfs/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/advantage-air/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/advocate/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/aemet-opendata/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/aenum/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/aeppl/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/aesara/default.nix100
-rw-r--r--nixpkgs/pkgs/development/python-modules/aesedb/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/afdko/default.nix132
-rw-r--r--nixpkgs/pkgs/development/python-modules/afdko/no-pypi-build-tools.patch24
-rw-r--r--nixpkgs/pkgs/development/python-modules/afdko/use-dynamic-system-antlr4-runtime.patch53
-rw-r--r--nixpkgs/pkgs/development/python-modules/affine/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/afsapi/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/agate-dbf/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/agate-excel/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/agate-sql/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/agate/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/agent-py/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/aggdraw/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/aigpy/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/ailment/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/aio-geojson-client/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/aio-geojson-generic-client/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/aio-geojson-geonetnz-quakes/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/aio-geojson-geonetnz-volcano/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/aio-geojson-nsw-rfs-incidents/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/aio-geojson-usgs-earthquakes/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/aio-georss-client/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/aio-georss-gdacs/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/aio-pika/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioairq/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioairzone-cloud/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioairzone/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioaladdinconnect/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioambient/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioamqp/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioapns/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioaseko/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioasuswrt/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioazuredevops/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiobafi6/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiobiketrax/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioblescan/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioboto3/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiobotocore/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiobroadlink/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiocache/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiocoap/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiocomelit/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioconsole/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiocontextvars/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiocron/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiocsv/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiocurrencylayer/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiodiscover/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiodns/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiodocker/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioeafm/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioeagle/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioecowitt/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioelectricitymaps/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioemonitor/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioesphomeapi/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioextensions/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiofile/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiofiles/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioflo/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioftp/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiogithubapi/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiogram/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioguardian/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioharmony/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohomekit/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-apispec/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-basicauth/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-client-cache/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-cors/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-fast-url-dispatcher/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-jinja2/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-oauthlib/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-openmetrics/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-remotes/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-retry/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-socks/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-swagger/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp-wsgi/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp/default.nix132
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohttp_remotes/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohue/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiohwenergy/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioimaplib/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioinflux/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioitertools/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiojobs/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiokafka/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiokef/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiolifx-connection/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiolifx-effects/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiolifx-themes/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiolifx/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiolimiter/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiolip/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiolivisi/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiolookin/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiolyric/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiomisc-pytest/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiomisc/default.nix97
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiomodernforms/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiomqtt/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiomultiprocess/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiomusiccast/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiomysensors/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiomysql/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/aionanoleaf/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/aionotion/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiooncue/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioopenexchangerates/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioopenssl/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiooss2/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiopegelonline/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiopg/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioprocessing/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioprometheus/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiopulse/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiopurpleair/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiopvapi/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiopvpc/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiopyarr/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiopylgtv/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioqsw/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioquic-mitmproxy/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioquic/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiorecollect/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioredis/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioresponses/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioridwell/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiormq/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiorpcx/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiortm/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioruckus/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiorun/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioruuvigateway/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiorwlock/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiosasl/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiosenz/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioserial/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioshelly/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioshutil/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiosignal/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioskybell/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioslimproto/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiosmb/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiosmtpd/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiosmtplib/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiosomecomfort/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiosql/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiosqlite/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiosteamist/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiostream/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioswitcher/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiosyncthing/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiotractive/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiounifi/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiounittest/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiovlc/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiovodafone/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiowaqi/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiowatttime/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiowebostv/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioweenect/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiowinreg/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiowithings/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioxmpp/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/aioymaps/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/aiozeroconf/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/airly/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/airthings-ble/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/airthings-cloud/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/airtouch4pyapi/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/ajpy/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/ajsonrpc/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/alabaster/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/aladdin-connect/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/alarmdecoder/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/albumentations/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/ale-py/cmake-pybind11.patch18
-rw-r--r--nixpkgs/pkgs/development/python-modules/ale-py/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/alectryon/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/alembic/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/alexapy/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/algebraic-data-types/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/alive-progress/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-cdn/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-config/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-core/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-dbfs/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-iot/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-kms/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-sts/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/allpairspy/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/allure-behave/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/allure-pytest/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/allure-python-commons-test/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/allure-python-commons/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/alpha-vantage/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/altair/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/altgraph/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/amaranth-boards/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/amaranth-soc/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/amaranth/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/amarna/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/amazon-ion/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/amazon-kclpy/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/ambee/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/amberelectric/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/ambiclimate/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/amcrest/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/amiibo-py/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/amply/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/amqp/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/amqplib/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/amqtt/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/ancp-bids/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/androguard/default.nix94
-rw-r--r--nixpkgs/pkgs/development/python-modules/android-backup/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/androidtv/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/androidtvremote2/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/anel-pwrctrl-homeassistant/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/angr/default.nix98
-rw-r--r--nixpkgs/pkgs/development/python-modules/angrcli/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/angrop/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/aniso8601/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/annexremote/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/annotated-types/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/annoy/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/anonip/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansi/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansi2html/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansi2image/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansible-compat/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansible-kernel/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansible-pylibssh/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansible-runner/default.nix110
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansible-vault-rw/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansible/core.nix98
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansible/default.nix88
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansicolor/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansicolors/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansiconv/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansimarkup/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/ansiwrap/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/anthemav/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/anthropic/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/antlr4-python3-runtime/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/anyascii/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/anybadge/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/anyconfig/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/anyio/default.nix112
-rw-r--r--nixpkgs/pkgs/development/python-modules/anyqt/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/anytree/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/anytree/graphviz.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/anywidget/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/aocd/default.nix114
-rw-r--r--nixpkgs/pkgs/development/python-modules/apache-beam/default.nix215
-rw-r--r--nixpkgs/pkgs/development/python-modules/apcaccess/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/apipkg/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/apischema/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/apispec-webframeworks/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/apispec/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/apkit/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/aplpy/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/app-model/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/appdirs/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/apple-weatherkit/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/applicationinsights/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/appnope/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/apprise/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/approval-utilities/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/approvaltests/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/appthreat-vulnerability-db/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/apptools/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/apricot-select/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/aprslib/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/apscheduler/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/apsw/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/apycula/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/aqipy-atmotech/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/aqualogic/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/arabic-reshaper/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/aranet4/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/arc4/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/arcam-fmj/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/archinfo/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/archspec/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/area/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/arelle/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/arelle/tests.patch14
-rw-r--r--nixpkgs/pkgs/development/python-modules/aresponses/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/argcomplete/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/argh/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/argilla/default.nix187
-rw-r--r--nixpkgs/pkgs/development/python-modules/argon2-cffi-bindings/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/argon2-cffi/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/argos-translate-files/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/argostranslate/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/argparse-addons/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/argparse-dataclass/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/args/default.nix16
-rw-r--r--nixpkgs/pkgs/development/python-modules/aria2p/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/ariadne/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/arnparse/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/arpeggio/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/arpy/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/array-record/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/arrayqueues/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/arris-tg2492lg/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/arrow/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/arsenic/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/art/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/arviz/default.nix117
-rw-r--r--nixpkgs/pkgs/development/python-modules/arxiv2bib/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/asana/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/ascii-magic/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/asciimatics/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/asciitree/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/asdf-standard/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/asdf-transform-schemas/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/asdf/default.nix100
-rw-r--r--nixpkgs/pkgs/development/python-modules/ase/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/asf-search/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/asgi-csrf/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/asgineer/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/asgiref/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/asks/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/asmog/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/asn1/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/asn1ate/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/asn1crypto/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/asn1tools/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/aspectlib/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/aspell-python/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/aspy-refactor-imports/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/aspy.yaml/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/assay/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/assertpy/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/asterisk-mbox/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/asteval/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/astor/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/astral/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/astroid/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/astropy-extension-helpers/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/astropy-healpix/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/astropy-helpers/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/astropy/default.nix91
-rw-r--r--nixpkgs/pkgs/development/python-modules/astroquery/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/asttokens/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/astunparse/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyauth/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/async-dns/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/async-generator/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/async-interrupt/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/async-lru/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/async-modbus/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/async-modbus/fix-tests.patch73
-rw-r--r--nixpkgs/pkgs/development/python-modules/async-stagger/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/async-timeout/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/async-tkinter-loop/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/async-upnp-client/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncclick/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/asynccmd/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncinotify/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncio-dgram/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncio-mqtt/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncio-rlock/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncio-throttle/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncmy/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncpg/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncserial/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncsleepiq/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncssh/default.nix104
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncssh/fix-sftp-chmod-test-nixos.patch15
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncstdlib/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/asynctest/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncua/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/asyncwhois/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/asysocks/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/atc-ble/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/atenpdu/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/atlassian-python-api/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/atom/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/atomiclong/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/atomicwrites-homeassistant/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/atomicwrites/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/atomman/default.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/atpublic/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/atsim-potentials/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/attrdict/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/attrs/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/attrs/remove-hatch-plugins.patch74
-rw-r--r--nixpkgs/pkgs/development/python-modules/attrs/tests.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/aubio/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/audible/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/audio-metadata/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/audioread/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/audiotools/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/auditok/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/auditwheel/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/augeas/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/augmax/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/auroranoaa/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/aurorapy/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/autarco/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/auth0-python/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/authcaptureproxy/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/authheaders/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/authlib/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/authres/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/autobahn/default.nix113
-rw-r--r--nixpkgs/pkgs/development/python-modules/autocommand/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/autofaiss/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/autoflake/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/autograd-gamma/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/autograd/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/autoit-ripper/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/autologging/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/automat/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/automate-home/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/automx2/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/autopage/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/autopep8/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/autoslot/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/av/default.nix154
-rw-r--r--nixpkgs/pkgs/development/python-modules/avea/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/avion/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/avro-python3/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/avro/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/avro3k/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/aw-client/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/aw-core/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/awacs/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/awesome-slugify/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/awesome-slugify/slugify_filename_test.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/awesomeversion/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/awkward-cpp/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/awkward/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/aws-adfs/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/aws-encryption-sdk/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/aws-lambda-builders/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/aws-sam-translator/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/aws-secretsmanager-caching/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/aws-secretsmanager-caching/remove-coverage-tests.patch14
-rw-r--r--nixpkgs/pkgs/development/python-modules/aws-xray-sdk/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/awscrt/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/awsiotpythonsdk/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/awslambdaric/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/awswrangler/default.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/ax/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/axis/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-appconfiguration/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-applicationinsights/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-batch/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-common/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-containerregistry/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-core/default.nix107
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-cosmos/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-cosmosdb-nspkg/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-cosmosdb-table/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-data-tables/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-datalake-store/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-eventgrid/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-eventhub/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-functions-devops-build/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-graphrbac/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-identity/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-keyvault-administration/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-keyvault-certificates/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-keyvault-keys/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-keyvault-nspkg/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-keyvault-secrets/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-keyvault/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-loganalytics/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-advisor/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-apimanagement/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-appconfiguration/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-appcontainers/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-applicationinsights/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-authorization/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-batch/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-batchai/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-billing/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-botservice/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-cdn/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-cognitiveservices/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-commerce/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-common/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-compute/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-consumption/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-containerinstance/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-containerregistry/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-containerservice/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-core/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-cosmosdb/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-databoxedge/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-datafactory/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-datalake-analytics/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-datalake-nspkg/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-datalake-store/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-datamigration/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-deploymentmanager/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-devspaces/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-devtestlabs/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-dns/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-eventgrid/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-eventhub/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-extendedlocation/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-frontdoor/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-hanaonazure/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-hdinsight/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-imagebuilder/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-iotcentral/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-iothub/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-iothubprovisioningservices/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-keyvault/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-kusto/azure-mgmt-apimanagement/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-kusto/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-loganalytics/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-logic/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-machinelearningcompute/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-managedservices/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-managementgroups/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-managementpartner/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-maps/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-marketplaceordering/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-media/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-monitor/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-msi/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-netapp/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-network/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-notificationhubs/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-nspkg/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-policyinsights/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-powerbiembedded/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-privatedns/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-rdbms/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-recoveryservices/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-recoveryservicesbackup/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-redhatopenshift/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-redis/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-relay/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-reservations/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-resource/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-scheduler/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-search/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-security/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-servicebus/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-servicefabric/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-servicefabricmanagedclusters/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-servicelinker/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-signalr/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-sql/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-sqlvirtualmachine/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-storage/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-subscription/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-synapse/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-trafficmanager/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-mgmt-web/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-monitor-ingestion/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-multiapi-storage/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-nspkg/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-servicebus/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-servicefabric/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-servicemanagement-legacy/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-storage-blob/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-storage-common/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-storage-file-share/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-storage-file/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-storage-nspkg/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-storage-queue/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-synapse-accesscontrol/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-synapse-artifacts/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-synapse-managedprivateendpoints/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/azure-synapse-spark/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/b2sdk/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/babel/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/babelfish/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/babelgladeextractor/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/backcall/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/backoff/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/backports-cached-property/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/backports-datetime-fromisoformat/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/backports-entry-points-selectable/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/backports-shutil-which/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/backports-strenum/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/backports-zoneinfo/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/backports-zoneinfo/zoneinfo.patch17
-rw-r--r--nixpkgs/pkgs/development/python-modules/backports_shutil_get_terminal_size/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/bacpypes/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/bagit/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/bambi/default.nix94
-rw-r--r--nixpkgs/pkgs/development/python-modules/banal/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/bandcamp-api/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/bandit/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/bangla/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/bap/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/barectf/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/baron/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/base36/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/base58/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/base58check/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/base64io/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/baseline/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/baselines/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/basemap-data/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/basemap/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/bash-kernel/bash-path.patch22
-rw-r--r--nixpkgs/pkgs/development/python-modules/bash-kernel/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/bashlex/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/basiciw/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/batchgenerators/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/batchspawner/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/batinfo/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/baycomp/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/bayesian-optimization/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/bayespy/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/bbox/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/bc-detect-secrets/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/bc-jsonpath-ng/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/bc-python-hcl2/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/bcdoc/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/bcf/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/bcg/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/bch/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/bcrypt/3.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/bcrypt/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/beaker/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/beancount-black/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/beancount-docverif/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/beancount-parser/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/beancount/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/beanstalkc/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/beartype/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/beautiful-date/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/beautifulsoup4/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/beautifultable/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/beautysh/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/bech32/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/before-after/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/behave/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/bellows/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/bencode-py/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/bencoder/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/beniget/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/bentoml/default.nix208
-rw-r--r--nixpkgs/pkgs/development/python-modules/bespon/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/betacode/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/betamax-matchers/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/betamax-serializers/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/betamax/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/betterproto/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/bibtexparser/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/bidict/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/bids-validator/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/biliass/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/billiard/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/bimmer-connected/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/binary/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/binaryornot/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/bincopy/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/binho-host-adapter/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/binwalk/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/biopandas/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/biopython/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/bip-utils/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/bip32/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/biplist/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitarray/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitbox02/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitcoin-utils-fork-minimal/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitcoinlib/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitcoinrpc/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/bite-parser/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitlist/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitmath/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitsandbytes/default.nix96
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitstring/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitstruct/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/bitvavo-aio/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/bizkaibus/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/bjoern/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/bkcharts/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/black-macchiato/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/black/default.nix113
-rw-r--r--nixpkgs/pkgs/development/python-modules/blackjax/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/bleach-allowlist/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/bleach/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/bleak-retry-connector/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/bleak/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/blebox-uniapi/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/bless/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/blessed/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/blessings/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/blinker/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/blinkpy/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/blinkstick/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/blis/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/blobfile/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/block-io/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/blockchain/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/blockdiag/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/blockfrost-python/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/blocksat-cli/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/blosc2/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/bluemaestro-ble/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/bluepy-devices/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/bluepy/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/bluetooth-adapters/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/bluetooth-auto-recovery/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/bluetooth-data-tools/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/bluetooth-sensor-state-data/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/blurhash/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/bme280spi/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/bme680/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/bnnumerizer/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/bnunicodenormalizer/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/boa-api/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/boiboite-opener-framework/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/boilerpy3/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/bokeh/default.nix135
-rw-r--r--nixpkgs/pkgs/development/python-modules/bokeh/hardcode-nodejs-npmjs-paths.patch14
-rw-r--r--nixpkgs/pkgs/development/python-modules/boltons/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/boltztrap2/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/bond-api/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/bond-async/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/bonsai/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/boolean-py/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/booleanoperations/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/boost-histogram/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/bootstrap/build/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/bootstrap/flit-core/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/bootstrap/installer/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/bork/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/boschshcpy/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/boto/0005-Don-t-mock-list-subclass.patch21
-rw-r--r--nixpkgs/pkgs/development/python-modules/boto/bug-953970_python3.8-compat.patch53
-rw-r--r--nixpkgs/pkgs/development/python-modules/boto/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/boto3-stubs/default.nix1823
-rw-r--r--nixpkgs/pkgs/development/python-modules/boto3/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/botocore-stubs/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/botocore/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/botorch/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/bottle/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/bottleneck/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/bottombar/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/boxx/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/bpycv/bpycv-test.py80
-rw-r--r--nixpkgs/pkgs/development/python-modules/bpycv/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/bpython/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/bqplot/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/bqscales/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/braceexpand/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/bracex/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/braintree/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/branca/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/bravado-core/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/bravia-tv/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/breathe/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/breezy/Cargo.lock332
-rw-r--r--nixpkgs/pkgs/development/python-modules/breezy/default.nix137
-rw-r--r--nixpkgs/pkgs/development/python-modules/brelpy/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/brian2/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/broadbean/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/broadlink/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/brother-ql/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/brother/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/brotli-asgi/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/brotli/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/brotlicffi/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/brotlipy/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/brottsplatskartan/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/browser-cookie3/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/brunt/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/bsddb3/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/bsdiff4/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/bson/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/bsuite/default.nix104
-rw-r--r--nixpkgs/pkgs/development/python-modules/bt-proximity/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/btchip-python/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/btest/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/bthome-ble/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/btrees/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/btrfs/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/btrfsutil/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/btsmarthub_devicelist/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/btsocket/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/bucketstore/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/bugsnag/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/bugwarrior/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/bugz/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/bugzilla/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/buienradar/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/build/default.nix108
-rw-r--r--nixpkgs/pkgs/development/python-modules/buildcatrust/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/buildout/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/bumps/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/bunch/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/bundlewrap/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/busypie/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/bwapy/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/bx-py-utils/default.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/bx-python/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/bytecode/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/bytewax/Cargo.lock3029
-rw-r--r--nixpkgs/pkgs/development/python-modules/bytewax/default.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/bytewax/remove-docs-test.patch10
-rw-r--r--nixpkgs/pkgs/development/python-modules/bz2file/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/cachecontrol/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/cached-property/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/cachelib/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/cachetools/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/cachey/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/cacheyou/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/cachier/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/cachy/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/cadquery/default.nix99
-rw-r--r--nixpkgs/pkgs/development/python-modules/caio/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/cairocffi/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/cairocffi/dlopen-paths.patch61
-rw-r--r--nixpkgs/pkgs/development/python-modules/cairocffi/fix_test_scaled_font.patch11
-rw-r--r--nixpkgs/pkgs/development/python-modules/cairosvg/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/caldav/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/callee/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/calmjs-parse/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/calmjs-types/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/calmjs/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/calver/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/calysto-scheme/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/calysto/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/camel-converter/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/camelot/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/can/default.nix105
-rw-r--r--nixpkgs/pkgs/development/python-modules/canals/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/canmatrix/default.nix99
-rw-r--r--nixpkgs/pkgs/development/python-modules/canonicaljson/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/canopen/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/cantools/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/capstone/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/captcha/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/capturer/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/carbon/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/cart/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/cartopy/default.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/casa-formats-io/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/casbin/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/case/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/cassandra-driver/default.nix127
-rw-r--r--nixpkgs/pkgs/development/python-modules/castepxbin/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/casttube/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/catalogue/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/catboost/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/catppuccin/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/cattrs/default.nix103
-rw-r--r--nixpkgs/pkgs/development/python-modules/cbor/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/cbor2/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/cccolutils/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/cdcs/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/celery-redbeat/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/celery-singleton/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/celery-types/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/celery/default.nix102
-rw-r--r--nixpkgs/pkgs/development/python-modules/cement/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/cemm/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/censys/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/cepa/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/cerberus/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/cert-chain-resolver/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/certauth/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/certbot-dns-cloudflare/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/certbot-dns-google/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/certbot-dns-inwx/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/certbot-dns-ovh/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/certbot-dns-rfc2136/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/certbot-dns-route53/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/certbot/default.nix100
-rw-r--r--nixpkgs/pkgs/development/python-modules/certifi/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/certifi/env.patch86
-rw-r--r--nixpkgs/pkgs/development/python-modules/certipy-ad/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/certipy/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/certomancer/default.nix99
-rw-r--r--nixpkgs/pkgs/development/python-modules/certvalidator/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/cexprtk/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/cf-xarray/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/cffi/clang-pointer-substraction-warning.diff11
-rw-r--r--nixpkgs/pkgs/development/python-modules/cffi/darwin-use-libffi-closures.diff22
-rw-r--r--nixpkgs/pkgs/development/python-modules/cffi/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/cffsubr/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/cfgv/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/cfn-flip/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/cfn-lint/default.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/cfscrape/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/cftime/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/cgen/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/cgroup-utils/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/chacha20poly1305-reuseable/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/chacha20poly1305/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/chai/default.nix15
-rw-r--r--nixpkgs/pkgs/development/python-modules/chainer/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/chainmap/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/chalice/default.nix110
-rw-r--r--nixpkgs/pkgs/development/python-modules/chameleon/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/channels-redis/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/channels/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/characteristic/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/chardet/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/charset-normalizer/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/chart-studio/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/chat-downloader/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/check-manifest/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/checkdmarc/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/checksumdir/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/cheetah3/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/cheroot/default.nix95
-rw-r--r--nixpkgs/pkgs/development/python-modules/cherrypy/default.nix132
-rw-r--r--nixpkgs/pkgs/development/python-modules/chess/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/chevron/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/chex/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/chirpstack-api/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/chispa/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/chromaprint/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/ci-info/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/ci-py/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/cinemagoer/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/circuit-webhook/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/circuitbreaker/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/circus/default.nix88
-rw-r--r--nixpkgs/pkgs/development/python-modules/cirq-aqt/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/cirq-core/default.nix108
-rw-r--r--nixpkgs/pkgs/development/python-modules/cirq-ft/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/cirq-google/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/cirq-ionq/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/cirq-pasqal/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/cirq-rigetti/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/cirq-web/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/cirq/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/ciscoconfparse/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/ciscomobilityexpress/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/ciso8601/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/citeproc-py/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/cjkwrap/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/ckcc-protocol/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/clarifai-grpc/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/clarifai/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/claripy/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/class-doc/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/classify-imports/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/cld2-cffi/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/cle/default.nix93
-rw-r--r--nixpkgs/pkgs/development/python-modules/clean-fid/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/cleanlab/default.nix88
-rw-r--r--nixpkgs/pkgs/development/python-modules/cleo/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/clevercsv/default.nix86
-rw-r--r--nixpkgs/pkgs/development/python-modules/clf/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/cli-helpers/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/cliche/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-aliases/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-command-tree/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-completion/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-configfile/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-datetime/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-default-group/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-didyoumean/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-help-colors/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-log/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-odoo-contrib/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-odoo/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-option-group/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-plugins/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-repl/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-shell/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-spinner/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/click-threading/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/click/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/clickclick/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/clickgen/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/clickhouse-cityhash/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/clickhouse-cli/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/clickhouse-connect/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/clickhouse-driver/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/cliff/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/cliff/tests.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/clifford/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/cligj/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/clikit/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/clint/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/clintermission/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/clip-anytorch/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/clip/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/clize/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/clldutils/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/cloudflare/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/cloudpathlib/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/cloudpickle/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/cloudscraper/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/cloudsmith-api/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/cloudsplaining/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/cloup/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/clr-loader/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/clr-loader/deps.nix11
-rw-r--r--nixpkgs/pkgs/development/python-modules/clustershell/default.nix107
-rw-r--r--nixpkgs/pkgs/development/python-modules/cma/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmaes/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmake/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmake/stub/cmake/__init__.py19
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmake/stub/pyproject.toml13
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmarkgfm/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmd2-ext-test/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmd2/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmdline/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmdstanpy/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmdstanpy/use-nix-cmdstan-path.patch25
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmigemo/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmsis-pack-manager/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/cmsis-svd/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/cnvkit/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/co2signal/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/coapthon3/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/cobs/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/cock/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/coconut/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/cocotb-bus/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/cocotb/0001-Patch-LDCXXSHARED-for-macOS-along-with-LDSHARED.patch26
-rw-r--r--nixpkgs/pkgs/development/python-modules/cocotb/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/codecov/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/codepy/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/coffea/default.nix98
-rw-r--r--nixpkgs/pkgs/development/python-modules/cogapp/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/cohere/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/coincurve/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/coinmetrics-api-client/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/colander/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/colanderalchemy/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/collections-extended/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/colorama/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/colorcet/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/colorclass/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/colored-traceback/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/colored/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/coloredlogs/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/colorful/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/colorlog/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/colorlover/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/colormath/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/colorspacious/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/colorthief/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/colorzero/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/colour/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/colour/remove-unmaintained-d2to1.diff65
-rw-r--r--nixpkgs/pkgs/development/python-modules/colout/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/cometblue-lite/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/comicon/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/comm/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/command_runner/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/commandparse/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/commentjson/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/commoncode/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/commonmark/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/compiledb/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/complycube/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/compreffor/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/compressai/default.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/concurrent-log-handler/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/conda/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/confection/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/configargparse/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/configclass/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/confight/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/configobj/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/configparser/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/configshell/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/configupdater/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/confluent-kafka/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/confuse/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/connect_box/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/connection-pool/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/connexion/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/connio/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/cons/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/consonance/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/constantly/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/construct-classes/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/construct/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/consul/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/container-inspector/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/contexter/default.nix14
-rw-r--r--nixpkgs/pkgs/development/python-modules/contextlib2/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/contexttimer/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/contourpy/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/controku/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/convertdate/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/cookiecutter/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/cookies/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/coordinates/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/coqpit/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/coreapi/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/coredis/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/coreschema/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/cornice/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/correctionlib/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/corsair-scan/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/cose/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/cot/default.nix91
-rw-r--r--nixpkgs/pkgs/development/python-modules/cov-core/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/coverage/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/coveralls/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/cppe/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/cppheaderparser/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/cppy/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/cpyparsing/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/cram/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/cramjam/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/crashtest/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/crate/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/crayons/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/crc/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/crc16/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/crc32c/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/crccheck/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/crcmod/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/credstash/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/criticality-score/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/cron-descriptor/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/croniter/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/cronsim/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/crossplane/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/crownstone-cloud/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/crownstone-core/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/crownstone-sse/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/crownstone-uart/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/cryptacular/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/cryptg/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/cryptodatahub/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/cryptography/default.nix115
-rw-r--r--nixpkgs/pkgs/development/python-modules/cryptography/vectors.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/cryptolyzer/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/cryptoparser/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/crysp/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/crytic-compile/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/cson/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/csrmesh/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/css-html-js-minify/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/css-inline/Cargo.lock1388
-rw-r--r--nixpkgs/pkgs/development/python-modules/css-inline/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/css-parser/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/cssbeautifier/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/csscompressor/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/cssmin/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/cssselect/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/cssselect2/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/cssutils/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/cstruct/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/csvw/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/ctap-keyring-device/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/ctranslate2/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/cu2qu/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/cucumber-tag-expressions/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/cufflinks/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/cupy/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/curio/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/curlify/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/curtsies/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/curve25519-donna/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/cvelib/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/cvss/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/cvxopt/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/cvxpy/default.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/cwcwidth/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/cwl-upgrader/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/cwl-utils/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/cwlformat/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/cx-freeze/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/cx_oracle/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/cxxfilt/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/cycler/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/cyclonedx-python-lib/default.nix100
-rw-r--r--nixpkgs/pkgs/development/python-modules/cymem/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/cypari2/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/cypherpunkpay/default.nix116
-rw-r--r--nixpkgs/pkgs/development/python-modules/cysignals/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/cython-test-exception-raiser/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/cytoolz/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/dacite/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/daemonize/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/daemonocle/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/daiquiri/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/dalle-mini/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/daphne/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/daqp/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/darkdetect/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/dasbus/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/dash-core-components/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/dash-html-components/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/dash-renderer/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/dash-table/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/dash/default.nix134
-rw-r--r--nixpkgs/pkgs/development/python-modules/dashing/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-awkward/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-gateway-server/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-gateway/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-glm/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-histogram/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-image/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-jobqueue/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-ml/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-mpi/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask-yarn/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/dask/default.nix175
-rw-r--r--nixpkgs/pkgs/development/python-modules/databases/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/databricks-cli/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/databricks-connect/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/databricks-sql-connector/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/dataclass-factory/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/dataclass-wizard/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/dataclasses-json/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/dataclasses-serialization/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/datadiff/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/datadog/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/datafusion/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/datamodeldict/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/datapoint/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/dataprep-ml/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/dataproperty/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/dataset/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/datasets/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/datasette-publish-fly/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/datasette-template-sql/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/datasette/default.nix107
-rw-r--r--nixpkgs/pkgs/development/python-modules/datashader/default.nix103
-rw-r--r--nixpkgs/pkgs/development/python-modules/datashape/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/datatable/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/datauri/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/datefinder/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/dateparser/default.nix86
-rw-r--r--nixpkgs/pkgs/development/python-modules/datetime/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/dateutil/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/dateutils/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/datrie/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/dawg-python/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/db-dtypes/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbf/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbfread/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbt-bigquery/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbt-core/default.nix116
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbt-core/with-adapters.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbt-extractor/Cargo.lock531
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbt-extractor/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbt-postgres/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbt-redshift/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbt-semantic-interfaces/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbt-snowflake/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbus-client-gen/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbus-deviation/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbus-fast/default.nix108
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbus-next/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbus-python-client-gen/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbus-signature-pyparsing/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbus/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbus/fix-includedir.patch8
-rw-r--r--nixpkgs/pkgs/development/python-modules/dbutils/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/dcmstack/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/dctorch/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/ddt/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/deal-solver/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/deal/default.nix105
-rw-r--r--nixpkgs/pkgs/development/python-modules/deap/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/debian-inspector/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/debian/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/debianbts/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/debtcollector/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/debtcollector/tests.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/debts/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/debuglater/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/debugpy/default.nix127
-rw-r--r--nixpkgs/pkgs/development/python-modules/debugpy/fix-test-pythonpath.patch12
-rw-r--r--nixpkgs/pkgs/development/python-modules/debugpy/hardcode-gdb.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/debugpy/hardcode-lldb.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/debugpy/hardcode-version.patch47
-rw-r--r--nixpkgs/pkgs/development/python-modules/decli/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/decopatch/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/decorator/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/deemix/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/deep-chainmap/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/deep-translator/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/deepdiff/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/deepdish/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/deepl/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/deepmerge/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/deeptoolsintervals/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/deepwave/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/deezer-py/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/deezer-python/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/defcon/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/deform/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/defusedcsv/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/defusedxml/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/deid/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/delegator-py/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/delorean/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/deltachat/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/deluge-client/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/demes/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/demesdraw/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/demetriek/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/demjson3/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/dendropy/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/denonavr/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/dependency-injector/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/deploykit/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/deprecat/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/deprecated/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/deprecation/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/derpconf/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/desktop-entry-lib/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/desktop-notifier/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/detect-secrets/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/detectron2/default.nix182
-rw-r--r--nixpkgs/pkgs/development/python-modules/devito/default.nix125
-rw-r--r--nixpkgs/pkgs/development/python-modules/devolo-home-control-api/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/devolo-plc-api/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/devpi-common/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/devtools/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/diagrams/build_poetry.patch12
-rw-r--r--nixpkgs/pkgs/development/python-modules/diagrams/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/diagrams/remove-black-requirement.patch33
-rw-r--r--nixpkgs/pkgs/development/python-modules/diceware/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/dicom-numpy/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/dicom2nifti/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/dicomweb-client/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/dict2xml/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/dictdiffer/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/dictionaries/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/dicttoxml/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/dicttoxml2/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/diff-cover/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/diff-match-patch/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/diffimg/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/diffsync/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/digi-xbee/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/digitalocean/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/dill/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/dinghy/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/dingz/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/diofant/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/dipy/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/directv/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/dirty-equals/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/discid/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/discogs-client/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/discordpy/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/discovery30303/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/diskcache/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-cim/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-clfs/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-cobaltstrike/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-cstruct/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-esedb/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-etl/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-eventlog/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-evidence/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-executable/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-extfs/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-fat/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-ffs/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-hypervisor/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-ntfs/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-ole/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-regf/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-shellitem/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-sql/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-squashfs/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-target/default.nix136
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-thumbcache/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-util/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-vmfs/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-volume/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect-xfs/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissect/default.nix95
-rw-r--r--nixpkgs/pkgs/development/python-modules/dissononce/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/distlib/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/distorm3/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/distrax/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/distributed/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/distro/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/distutils-cfg/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/distutils-extra/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/dj-database-url/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/dj-email-url/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/dj-rest-auth/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/dj-search-url/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/dj-static/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-admin-datta/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-admin-sortable2/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-allauth-2fa/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-allauth/default.nix88
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-annoying/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-anymail/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-appconf/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-auditlog/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-auth-ldap/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-autocomplete-light/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-bootstrap3/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-bootstrap4/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-bootstrap5/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-cachalot/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-cachalot/disable-unsupported-tests.patch65
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-cache-url/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-cacheops/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-celery-beat/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-celery-email/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-celery-results/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-ckeditor/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-classy-tags/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-cleanup/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-colorful/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-compression-middleware/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-compressor/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-configurations/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-context-decorator/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-contrib-comments/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-cors-headers/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-countries/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-crispy-bootstrap4/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-crispy-forms/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-crontab/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-cryptography/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-cryptography/fix-setup-cfg.patch16
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-csp/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-debug-toolbar/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-dynamic-preferences/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-encrypted-model-fields/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-environ/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-extensions/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-filter/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-formset-js-improved/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-formtools/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-google-analytics-app/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-graphiql-debug-toolbar/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-gravatar2/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-guardian/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-haystack/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-hcaptcha/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-health-check/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-hierarkey/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-hijack/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-i18nfield/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-import-export/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-ipware/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-jinja2/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-jquery-js/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-js-asset/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-js-reverse/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-leaflet/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-libsass/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-localflavor/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-logentry-admin/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-login-required-middleware/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-mailman3/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-maintenance-mode/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-markup/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-model-utils/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-modelcluster/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-mptt/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-multiselectfield/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-mysql/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-ninja/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-nose/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-oauth-toolkit/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-otp/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-paintstore/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-parler/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-pattern-library/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-payments/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-pglocks/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-phonenumber-field/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-picklefield/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-polymorphic/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-postgresql-netfields/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-prometheus/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-prometheus/drop-untestable-database-backends.patch38
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-pwa/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-q/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-q/pep-621.patch32
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-ranged-response/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-raster/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-redis/default.nix101
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-rest-auth/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-rest-polymorphic/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-rest-registration/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-reversion/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-rosetta/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-rq/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-scheduler/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-scim2/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-scopes/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-sekizai/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-sesame/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-shortuuidfield/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-silk/default.nix100
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-simple-captcha/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-simple-history/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-sites/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-sr/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-statici18n/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-storages/default.nix91
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-stubs-ext/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-stubs/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-tables2/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-tagging/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-taggit/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-tastypie/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-timezone-field/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-treebeard/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-two-factor-auth/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-types/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-versatileimagefield/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-vite/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-webpack-loader/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-webpush/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/django-widget-tweaks/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/django/3.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/django/4.nix143
-rw-r--r--nixpkgs/pkgs/development/python-modules/django/5.nix144
-rw-r--r--nixpkgs/pkgs/development/python-modules/django/django_3_set_geos_gdal_lib.patch24
-rw-r--r--nixpkgs/pkgs/development/python-modules/django/django_3_set_zoneinfo_dir.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/django/django_4_set_geos_gdal_lib.patch26
-rw-r--r--nixpkgs/pkgs/development/python-modules/django/django_4_set_zoneinfo_dir.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/django/django_4_tests.patch51
-rw-r--r--nixpkgs/pkgs/development/python-modules/django/django_5_disable_failing_tests.patch21
-rw-r--r--nixpkgs/pkgs/development/python-modules/django/django_5_set_geos_gdal_lib.patch26
-rw-r--r--nixpkgs/pkgs/development/python-modules/django/django_5_set_zoneinfo_dir.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/django/django_5_tests_pythonpath.patch12
-rw-r--r--nixpkgs/pkgs/development/python-modules/djangoql/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/djangorestframework-camel-case/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/djangorestframework-dataclasses/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/djangorestframework-guardian/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/djangorestframework-guardian2/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/djangorestframework-recursive/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/djangorestframework-simplejwt/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/djangorestframework-stubs/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/djangorestframework/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/djmail/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/dkimpy/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/dlib/build-cores.patch27
-rw-r--r--nixpkgs/pkgs/development/python-modules/dlib/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/dlinfo/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/dllogger/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/dlms-cosem/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/dlx/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/dm-env/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/dm-haiku/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/dm-haiku/tests.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/dm-sonnet/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/dm-tree/cmake.patch141
-rw-r--r--nixpkgs/pkgs/development/python-modules/dm-tree/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/dmenu/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/dnachisel/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/dnfile/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/dns-lexicon/default.nix118
-rw-r--r--nixpkgs/pkgs/development/python-modules/dnslib/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/dnspython/default.nix95
-rw-r--r--nixpkgs/pkgs/development/python-modules/doc8/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/docformatter/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/docformatter/test-path.patch29
-rw-r--r--nixpkgs/pkgs/development/python-modules/docker-py/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/docker-pycreds/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/docker/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/dockerfile-parse/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/dockerpty/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/dockerspawner/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/docloud/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/docopt-ng/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/docopt/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/docplex/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/docrep/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/docstring-parser/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/docstring-to-markdown/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/docstring-to-markdown/remove-coverage-tests.patch16
-rw-r--r--nixpkgs/pkgs/development/python-modules/doctest-ignore-unicode/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/docutils/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/docx2python/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/docx2txt/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/dodgy/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/dogpile-cache/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/dogtag-pki/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/dogtail/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/dogtail/nix-support.patch35
-rw-r--r--nixpkgs/pkgs/development/python-modules/doit-py/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/doit/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/dokuwiki/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/domeneshop/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/dominate/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/doorbirdpy/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/dopy/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/dot2tex/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/dot2tex/path.patch104
-rw-r--r--nixpkgs/pkgs/development/python-modules/dot2tex/remove-duplicate-script.patch34
-rw-r--r--nixpkgs/pkgs/development/python-modules/dot2tex/test.patch12
-rw-r--r--nixpkgs/pkgs/development/python-modules/dotmap/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/dotty-dict/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/dotwiz/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/downloader-cli/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/dparse/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/dparse2/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/dpath/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/dpcontracts/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/dpkt/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/draftjs-exporter/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/dragonfly/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/dramatiq/default.nix106
-rw-r--r--nixpkgs/pkgs/development/python-modules/drawille/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/drawilleplot/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/dremel3dpy/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/drf-jwt/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/drf-nested-routers/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/drf-spectacular-sidecar/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/drf-spectacular/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/drf-ujson2/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/drf-writable-nested/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/drf-yasg/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/drivelib/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/drms/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/dronecan/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/dropbox/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/ds-store/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/ds4drv/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/dsinternals/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/dsmr-parser/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/dsnap/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/dtlssocket/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/dtschema/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/dtschema/fix_libfdt_name.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/dtw-python/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/ducc0/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/duckdb-engine/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/duckdb-engine/remote_data.patch24
-rw-r--r--nixpkgs/pkgs/development/python-modules/duckdb/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/duckdb/setup.patch30
-rw-r--r--nixpkgs/pkgs/development/python-modules/duckduckgo-search/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/duct-py/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/duecredit/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/duet/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/dufte/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/dugong/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/dulwich/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/dunamai/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/dungeon-eos/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/duo-client/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/durus/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/dvc-azure/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/dvc-data/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/dvc-gs/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/dvc-http/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/dvc-objects/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/dvc-render/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/dvc-s3/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/dvc-ssh/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/dvc-studio-client/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/dvc-task/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/dvc/default.nix151
-rw-r--r--nixpkgs/pkgs/development/python-modules/dvc/dvc-daemon.patch18
-rw-r--r--nixpkgs/pkgs/development/python-modules/dvclive/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/dwdwfsapi/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/dyn/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/dynalite-devices/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/dynd/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/e3-core/0001-use-distro-over-ld.patch42
-rw-r--r--nixpkgs/pkgs/development/python-modules/e3-core/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/eagle100/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/easy-thumbnails/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/easydict/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/easyenergy/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/easygui/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/easyocr/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/easyprocess/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/easywatch/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/ebaysdk/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/ebooklib/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/ecdsa/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/echo/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/ecoaliface/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/ecos/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/ecpy/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/ecs-logging/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/ed25519-blake2b/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/ed25519/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/edalize/default.nix104
-rw-r--r--nixpkgs/pkgs/development/python-modules/editables/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/editdistance-s/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/editdistance/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/editorconfig/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/edk2-pytool-library/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/edlib/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/edward/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/effdet/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/effect/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/eggdeps/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/eigenpy/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/einops/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/eiswarnung/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/elastic-apm/default.nix98
-rw-r--r--nixpkgs/pkgs/development/python-modules/elastic-transport/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/elasticsearch-dsl/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/elasticsearch/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/elasticsearch8/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/elegy/default.nix105
-rw-r--r--nixpkgs/pkgs/development/python-modules/elementpath/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/elevate/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/elgato/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/eliot/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/eliqonline/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/elkm1-lib/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/elmax-api/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/elmax/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/email-validator/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/emailthreads/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/embedding-reader/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/emborg/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/embrace/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/emcee/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/emoji/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/empty-files/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/empy/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/emulated-roku/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/emv/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/enaml/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/enamlx/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/enamlx/replace-unicode-with-str.patch274
-rw-r--r--nixpkgs/pkgs/development/python-modules/encodec/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/energyflip-client/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/energyflow/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/energyzero/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/enlighten/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/enocean/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/enochecker-core/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/enrich/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/entrance/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/entry-points-txt/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/entrypoint2/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/entrypoints/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/enturclient/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/enum-compat/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/enum34/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/env-canada/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/environmental-override/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/environs/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/envisage/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/envoy-reader/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/envoy-utils/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/envs/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/enzyme/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/epc/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/ephem/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/ephemeral-port-reserve/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/epson-projector/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/equinox/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/eradicate/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/es-client/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/escapism/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/esig/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/espeak-phonemizer/cdll.patch17
-rw-r--r--nixpkgs/pkgs/development/python-modules/espeak-phonemizer/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/esphome-dashboard-api/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/esprima/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/et-xmlfile/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/etcd/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/etcd3/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/ete3/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/etebase/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/etelemetry/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/eternalegypt/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/etesync/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/eth-abi/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/eth-account/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/eth-hash/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/eth-keyfile/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/eth-keys/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/eth-rlp/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/eth-typing/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/eth-utils/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/etils/default.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/etuples/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/euclid3/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/eufylife-ble-client/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/evaluate/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/evdev/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/eve/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/eventlet/default.nix103
-rw-r--r--nixpkgs/pkgs/development/python-modules/events/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/evernote/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/evohome-async/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/evtx/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/ewmh/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/exceptiongroup/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/exchangelib/default.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/exdown/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/execnb/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/execnet/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/executing/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/executor/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/exif/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/exifread/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/exitcode/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/expandvars/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/expects/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/expecttest/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/experiment-utilities/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/expiring-dict/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/expiringdict/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/explorerscript/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/exrex/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/extractcode/7z.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/extractcode/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/extractcode/libarchive.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/extras/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/extruct/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/eyed3/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/ezdxf/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/ezyrb/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/f5-icontrol-rest/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/f5-sdk/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/f90nml/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/faadelays/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/fabric/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/fabulous/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/fabulous/relative_import.patch27
-rw-r--r--nixpkgs/pkgs/development/python-modules/face-recognition/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/face-recognition/models.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/face/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/facebook-sdk/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/facedancer/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/factory-boy/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/fairscale/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/fairseq/default.nix122
-rw-r--r--nixpkgs/pkgs/development/python-modules/fake-useragent/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/faker/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/fakeredis/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/falcon/default.nix100
-rw-r--r--nixpkgs/pkgs/development/python-modules/faraday-agent-parameters-types/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/faraday-plugins/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/farama-notifications/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/farm-haystack/default.nix290
-rw-r--r--nixpkgs/pkgs/development/python-modules/fast-histogram/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastai/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastapi-mail/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastapi/default.nix127
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastavro/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastbencode/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastcache/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastcore/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastdiff/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastdownload/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastdtw/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastecdsa/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastembed/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/fasteners/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastentrypoints/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/faster-fifo/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/faster-whisper/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastimport/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastjsonschema/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastnumbers/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastpair/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastparquet/default.nix95
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastpbkdf2/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastprogress/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/fastrlock/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/fasttext-predict/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/fasttext/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/faulthandler/disable-env-test.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/faust-cchardet/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/favicon/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/fb-re2/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/fe25519/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/feedgen/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/feedgenerator/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/feedparser/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/fenics/default.nix280
-rw-r--r--nixpkgs/pkgs/development/python-modules/ffcv/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/ffmpeg-progress-yield/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/ffmpeg-python/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/ffmpeg-python/ffmpeg-location.patch84
-rw-r--r--nixpkgs/pkgs/development/python-modules/ffmpy/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/fiblary3-fork/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/fido2/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/fields/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/file-read-backwards/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/filebrowser_safe/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/filebytes/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/filecheck/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/filedepot/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/filelock/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/filetype/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/filterpy/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/finalfusion/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/find-libpython/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/findimports/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/findpython/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/fingerprints/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/finitude/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/fints/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/finvizfinance/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/fiona/default.nix100
-rw-r--r--nixpkgs/pkgs/development/python-modules/fipy/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/fire/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/fireflyalgorithm/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/firetv/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/first/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/fitbit/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/fivem-api/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/fixerio/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/fixtures/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/fjaraskupan/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/flake8-blind-except/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/flake8-bugbear/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/flake8-debugger/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/flake8-docstrings/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/flake8-future-import/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/flake8-future-import/fix-annotations-version-10.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/flake8-future-import/fix-annotations-version-11.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/flake8-future-import/skip-test.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/flake8-import-order/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/flake8-length/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/flake8-polyfill/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/flake8/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/flaky/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/flametree/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/flammkuchen/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/flasgger/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/flashtext/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-admin/default.nix125
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-api/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-appbuilder/default.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-appbuilder/upgrade-to-flask_jwt_extended-4.patch45
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-assets/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-autoindex/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-babel/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-babelex/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-basicauth/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-bcrypt/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-bootstrap/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-caching/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-common/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-compress/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-cors/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-dramatiq/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-elastic/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-expects-json/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-gravatar/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-httpauth/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-jwt-extended/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-limiter/default.nix94
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-login/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-mail/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-mailman/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-marshmallow/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-migrate/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-mongoengine/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-mysqldb/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-openid/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-paginate/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-paranoid/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-principal/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-restful/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-restful/werkzeug-2.1.0-compat.patch114
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-restx/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-reverse-proxy-fix/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-script/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-seasurf/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-security-too/default.nix131
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-session-captcha/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-session/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-sessionstore/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-silk/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-sock/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-socketio/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-sockets/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-sqlalchemy/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-sslify/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-swagger-ui/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-swagger/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-talisman/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-testing/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-themes2/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-versioned/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask-wtf/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/flask/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/flatbuffers/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/flatdict/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/flatten-dict/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/flax/default.nix101
-rw-r--r--nixpkgs/pkgs/development/python-modules/fleep/0001-Fixing-paths-on-tests.patch48
-rw-r--r--nixpkgs/pkgs/development/python-modules/fleep/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/flet-core/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/flet/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/flexmock/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/flickrapi/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/flipr-api/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/flit-core/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/flit-scm/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/flit/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/floret/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/flow-record/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/flower/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/flowlogs_reader/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/fluent-logger/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/flufl/bounce.nix14
-rw-r--r--nixpkgs/pkgs/development/python-modules/flufl/i18n.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/flufl/lock.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/flux-led/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/flyingsquid/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/flynt/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/fn/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/fnv-hash-fast/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/fnvhash/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/folium/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/fontawesomefree/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/fontmake/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/fontmath/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/fontparts/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/fontpens/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/fonttools/default.nix100
-rw-r--r--nixpkgs/pkgs/development/python-modules/foobot-async/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/foolscap/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/forbiddenfruit/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/fordpass/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/forecast-solar/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/formbox/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/formencode/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/formulae/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/formulaic/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/fortiosapi/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/fountains/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/foxdot/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/fpdf/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/fpylll/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/fpyutils/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/fqdn/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/freebox-api/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/freetype-py/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/freetype-py/library-paths.patch37
-rw-r--r--nixpkgs/pkgs/development/python-modules/freezegun/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/frida-python/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/frigidaire/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/frilouz/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/fritzconnection/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/fritzprofiles/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/frozendict/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/frozenlist/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/fs-s3fs/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/fs/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/fschat/default.nix102
-rw-r--r--nixpkgs/pkgs/development/python-modules/fsspec/default.nix165
-rw-r--r--nixpkgs/pkgs/development/python-modules/fst-pso/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/ftfy/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/ftputil/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/fugashi/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/func-timeout/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/funcparserlib/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/funcsigs/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/funcsigs/fix-pypy3-tests.patch94
-rw-r--r--nixpkgs/pkgs/development/python-modules/functiontrace/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/functools32/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/funcy/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/funsor/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/funsor/patch-makefile-for-tests.patch27
-rw-r--r--nixpkgs/pkgs/development/python-modules/furl/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/furo/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/fuse-python/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/fusepy/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/future-fstrings/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/future-typing/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/future/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/fuzzyfinder/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/fuzzytm/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/fuzzywuzzy/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/fvcore/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/fvs/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/fx2/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/fypp/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/g2pkk/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/galois/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/gamble/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/gaphas/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/garminconnect-aio/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/garminconnect/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/garth/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/gassist-text/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/gast/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/gatt/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/gattlib/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/gattlib/setup.patch18
-rw-r--r--nixpkgs/pkgs/development/python-modules/gb-io/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/gbinder-python/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/gbulb/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/gcal-sync/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/gcodepy/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/gcovr/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/gcs-oauth2-boto-plugin/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/gcsa/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/gcsfs/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/gdata/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/gdown/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/ge25519/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/geeknote/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/gehomesdk/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/gekitchen/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/gekko/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/gemfileparser/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/gemfileparser2/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/genanki/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/generic/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/geniushub-client/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/genome-collector/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/genpy/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/genshi/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/gensim/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/gentools/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/genzshcomp/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/geoalchemy2/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/geocachingapi/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/geographiclib/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/geoip/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/geoip2/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/geojson-client/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/geojson/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/geomet/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/geometric/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/geopandas/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/geopy/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/georss-client/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/georss-generic-client/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/georss-ign-sismologia-client/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/georss-ingv-centro-nazionale-terremoti-client/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/georss-nrcan-earthquakes-client/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/georss-qld-bushfire-alert-client/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/georss-tfs-incidents-client/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/georss-wa-dfes-client/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/get-video-properties/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/getjump/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/getkey/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/getmac/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/gevent-socketio/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/gevent-websocket/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/gevent/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/geventhttpclient/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/gflags/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/ghapi/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/ghdiff/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/ghp-import/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/ghrepo-stats/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/gibberish-detector/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/gidgethub/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/gin-config/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/gios/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/gipc/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/gistyc/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/git-annex-adapter/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/git-annex-adapter/git-annex-path.patch75
-rw-r--r--nixpkgs/pkgs/development/python-modules/git-filter-repo/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/git-revise/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/git-sweep/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/git-url-parse/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/gitdb/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/github-to-sqlite/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/github-webhook/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/github3_py/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/githubkit/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/gitignore-parser/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/gitlike-commands/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/gitpython/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/glad/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/glad2/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/glances-api/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/glcontext/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/glean-parser/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/glean-sdk/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/glfw/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/glfw/search-path.patch11
-rw-r--r--nixpkgs/pkgs/development/python-modules/glob2/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/globre/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/globus-sdk/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/glom/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/glueviz/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/glymur/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/glyphslib/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/gmpy/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/gmpy2/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/gntp/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/gnureadline/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/goalzero/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/gocardless-pro/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/goobook/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/goocalendar/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/goodwe/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-ai-generativelanguage/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-api-core/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-api-python-client/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-auth-httplib2/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-auth-oauthlib/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-auth/default.nix123
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-access-context-manager/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-appengine-logging/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-artifact-registry/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-asset/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-audit-log/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-automl/default.nix86
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-bigquery-datatransfer/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-bigquery-logging/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-bigquery-storage/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-bigquery/default.nix138
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-bigtable/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-compute/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-container/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-core/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-datacatalog/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-dataproc/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-datastore/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-dlp/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-dns/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-error-reporting/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-firestore/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-iam-logging/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-iam/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-iot/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-kms/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-language/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-logging/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-monitoring/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-org-policy/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-os-config/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-pubsub/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-redis/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-resource-manager/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-runtimeconfig/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-secret-manager/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-securitycenter/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-spanner/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-speech/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-storage/default.nix94
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-tasks/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-testutils/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-texttospeech/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-trace/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-translate/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-videointelligence/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-vision/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-cloud-websecurityscanner/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-crc32c/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-generativeai/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-i18n-address/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-nest-sdm/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-pasta/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-re2/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-reauth/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-resumable-media/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/google-search-results/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/google/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/googleapis-common-protos/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/googlemaps/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/googletrans/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/gorilla/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/gotenberg-client/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/govee-ble/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/goveelights/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/gpapi/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/gpaw/SetupPath.patch18
-rw-r--r--nixpkgs/pkgs/development/python-modules/gpaw/default.nix128
-rw-r--r--nixpkgs/pkgs/development/python-modules/gphoto2/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/gpib-ctypes/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/gpiozero/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/gplaycli/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/gprof2dot/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/gps3/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/gpsoauth/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/gpt-2-simple/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/gptcache/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/gpustat/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/gpxpy/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/gpy/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/gpytorch/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/gql/default.nix131
-rw-r--r--nixpkgs/pkgs/development/python-modules/grad-cam/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/gradient-utils/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/gradient/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/gradient_statsd/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/gradio/client.nix109
-rw-r--r--nixpkgs/pkgs/development/python-modules/gradio/conftest-skip-network-errors.py57
-rw-r--r--nixpkgs/pkgs/development/python-modules/gradio/default.nix174
-rw-r--r--nixpkgs/pkgs/development/python-modules/grammalecte/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/grandalf/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/grandalf/no-setup-requires-pytestrunner.patch15
-rw-r--r--nixpkgs/pkgs/development/python-modules/graph-tool/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/grapheme/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphene-django/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphene/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphite-web/default.nix105
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphql-core/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphql-relay/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphql-server-core/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphql-subscription-manager/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphqlclient/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphtage/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphviz/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/graphviz/paths.patch79
-rw-r--r--nixpkgs/pkgs/development/python-modules/grappelli-safe/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/graspologic/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/greatfet/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/greeclimate/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/green/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/green/tests.patch22
-rw-r--r--nixpkgs/pkgs/development/python-modules/greeneye-monitor/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/greenlet/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/gremlinpython/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/grequests/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/greynoise/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/gridnet/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/griffe/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/grip/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/groestlcoin_hash/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/growattserver/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/grpc-google-iam-v1/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/grpc-interceptor/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/grpcio-channelz/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/grpcio-gcp/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/grpcio-health-checking/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/grpcio-reflection/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/grpcio-status/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/grpcio-testing/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/grpcio-tools/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/grpcio/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/grpclib/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/gruut-ipa/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/gruut/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/gruut/language-pack.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/gsd/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/gsm0338/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/gspread/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/gssapi/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/gst-python/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/gtfs-realtime-bindings/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/gtimelog/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/gtts-token/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/gtts/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/gudhi/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/gudhi/remove_explicit_PYTHONPATH.patch195
-rw-r--r--nixpkgs/pkgs/development/python-modules/guessit/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/guestfs/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/guidance/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/gumath/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/gunicorn/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/guppy3/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/gurobipy/darwin.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/gurobipy/linux.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/gurobipy/no-clever-setup.patch41
-rw-r--r--nixpkgs/pkgs/development/python-modules/guzzle-sphinx-theme/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/gviz-api/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/gvm-tools/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/gym-notices/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/gym/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/gymnasium/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/gyp/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/gyp/no-darwin-cflags.patch40
-rw-r--r--nixpkgs/pkgs/development/python-modules/gyp/no-xcode.patch25
-rw-r--r--nixpkgs/pkgs/development/python-modules/h11/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/h2/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/h3/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/h5netcdf/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/h5py/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/ha-ffmpeg/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/ha-mqtt-discoverable/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/ha-philipsjs/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/habanero/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/habitipy/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/hachoir/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/hacking/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/hahomematic/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/halo/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/halohome/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/handout/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/hap-python/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/hass-nabucasa/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/hassil/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/hatasmota/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/hatch-fancy-pypi-readme/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/hatch-jupyter-builder/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/hatch-nodejs-version/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/hatch-requirements-txt/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/hatch-vcs/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/hatchling/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/haversine/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/hawkauthlib/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/hcloud/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/hcs_utils/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/hdate/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/hdbscan/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/hdf5plugin/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/hdfs/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/hdmedians/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/headerparser/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/heapdict/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/heatshrink2/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/heatzypy/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/help2man/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/helpdev/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/helper/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/hepunits/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/here-routing/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/here-transit/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/herepy/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/hetzner/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/heudiconv/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/hexbytes/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/hexdump/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/hfst/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/hg-commitsigs/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/hg-evolve/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/hg-git/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/hickle/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/hid-parser/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/hid/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/hidapi/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/hieroglyph/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/hijri-converter/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/hikvision/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/hiredis/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/hiro/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/hist/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/histoprint/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/hiyapyco/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/hjson/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/hkavr/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/hkdf/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/hledger-utils/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/hlk-sw16/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/hmmlearn/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/hnswlib/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/hocr-tools/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/hole/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/holidays/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/hologram/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/holoviews/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/home-assistant-bluetooth/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/home-assistant-chip-clusters/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/home-assistant-chip-core/default.nix107
-rw-r--r--nixpkgs/pkgs/development/python-modules/homeassistant-pyozw/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/homeconnect/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/homematicip/default.nix94
-rw-r--r--nixpkgs/pkgs/development/python-modules/homepluscontrol/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/hoomd-blue/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/hopcroftkarp/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/horizon-eda/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/howdoi/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/hpack/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/hpccm/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/hs-dbus-signature/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/hsaudiotag3k/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/hsluv/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/hstspreload/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/html-sanitizer/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/html-tag-names/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/html-text/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/html-void-elements/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/html2text/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/html5-parser/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/html5lib/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/html5tagger/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/htmllaundry/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/htmllistparse/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/htmlmin/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/htseq/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/httmock/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/http-ece/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/http-message-signatures/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/http-parser/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/http-sfv/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpagentparser/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpauth/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpbin/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpcore/default.nix95
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpie-ntlm/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpie/default.nix126
-rw-r--r--nixpkgs/pkgs/development/python-modules/httplib2/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpretty/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpserver/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpsig/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/httptools/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpx-auth/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpx-ntlm/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpx-socks/default.nix88
-rw-r--r--nixpkgs/pkgs/development/python-modules/httpx/default.nix130
-rw-r--r--nixpkgs/pkgs/development/python-modules/huawei-lte-api/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/huey/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/hug/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/huggingface-hub/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/huisbaasje-client/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/humanfriendly/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/humanize/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/humblewx/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/hupper/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/huum/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/hvac/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/hvplot/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/hwdata/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/hwi/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/hy/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/hydra-check/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/hydra-core/antlr4.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/hydra-core/default.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/hydrawiser/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/hydrus-api/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/hypchat/default.nix14
-rw-r--r--nixpkgs/pkgs/development/python-modules/hypercorn/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/hyperframe/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/hyperion-py/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/hyperlink/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/hyperopt/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/hyperpyyaml/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/hyperscan/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/hypothesis-auto/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/hypothesis/default.nix113
-rw-r--r--nixpkgs/pkgs/development/python-modules/hypothesmith/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/hypothesmith/remove-black.patch87
-rw-r--r--nixpkgs/pkgs/development/python-modules/hyppo/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/hyrule/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/i-pi/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/i2c-tools/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/i2csense/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/i3-py/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/i3ipc/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/iammeter/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/iapws/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/iaqualink/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/ibeacon-ble/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/ibis-framework/default.nix214
-rw-r--r--nixpkgs/pkgs/development/python-modules/ibis/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/ibm-cloud-sdk-core/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/ibm-watson/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/ical/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/icalendar/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/icecream/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/iceportal/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/icmplib/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/icnsutil/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/icoextract/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/icoextract/exe-thumbnailer.thumbnailer3
-rw-r--r--nixpkgs/pkgs/development/python-modules/icontract/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/ics/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/id/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/idasen/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/identify/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/idna-ssl/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/idna/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/ifaddr/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/ifconfig-parser/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/ifcopenshell/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/ignite/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/igraph/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/ihm/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/iisignature/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/ijson/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/ilua/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/image-diff/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/image-go-nord/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/imagecodecs-lite/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/imagecorruptions/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/imagededup/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/imagehash/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/imageio-ffmpeg/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/imageio-ffmpeg/ffmpeg-path.patch35
-rw-r--r--nixpkgs/pkgs/development/python-modules/imageio/default.nix133
-rw-r--r--nixpkgs/pkgs/development/python-modules/imageio/libgl-path.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/imagesize/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/imantics/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/imap-tools/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/imapclient/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/imaplib2/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/imbalanced-learn/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/img2pdf/default-icc-profile.patch23
-rw-r--r--nixpkgs/pkgs/development/python-modules/img2pdf/default.nix100
-rw-r--r--nixpkgs/pkgs/development/python-modules/imgdiff/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/imgsize/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/imgtool/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/iminuit/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/immutabledict/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/immutables/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/impacket/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/importlab/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/importlib-metadata/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/importlib-resources/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/importmagic/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/imread/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/imutils/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/in-n-out/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/in-place/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/incomfort-client/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/incremental/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/indexed-bzip2/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/indexed-gzip/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/indexed-zstd/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/infinity/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/inflect/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/inflection/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/influxdb-client/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/influxdb/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/inform/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/iniconfig/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/iniconfig/version.patch42
-rw-r--r--nixpkgs/pkgs/development/python-modules/inifile/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/iniparse/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/injector/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/inkbird-ble/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/inkex/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/inlinestyler/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/inotify-simple/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/inotify/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/inotifyrecursive/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/inquirer/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/inquirerpy/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/inscriptis/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/insegel/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/insightface/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/installer/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/insteon-frontend-home-assistant/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/intake-parquet/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/intake/default.nix139
-rw-r--r--nixpkgs/pkgs/development/python-modules/intbitset/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/intelhex/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/intellifire4py/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/intensity-normalization/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/interface-meta/0001-fix-version.patch36
-rw-r--r--nixpkgs/pkgs/development/python-modules/interface-meta/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/internetarchive/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/interruptingcow/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/intervaltree/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/into-dbus-python/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/invisible-watermark/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/invisible-watermark/tests/cli.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/invisible-watermark/tests/python/decode.py19
-rw-r--r--nixpkgs/pkgs/development/python-modules/invisible-watermark/tests/python/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/invisible-watermark/tests/python/encode.py21
-rw-r--r--nixpkgs/pkgs/development/python-modules/invocations/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/invoke/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/iocapture/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/iocextract/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/iodata/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/ionhash/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/ionoscloud/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/iopath/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/iotawattpy/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/iowait/default.nix16
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipaddr/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipadic/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipdb/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipdbplugin/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipfshttpclient/default.nix97
-rw-r--r--nixpkgs/pkgs/development/python-modules/iptools/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipwhl/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipwhois/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipycanvas/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipydatawidgets/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipykernel/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipykernel/tests.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipymarkup/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipympl/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipynbname/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipyniivue/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipyparallel/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipytablewidgets/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipython-genutils/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipython-sql/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipython/default.nix97
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipyvue/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipyvuetify/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipywidgets/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/ipyxact/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/irc/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/ircrobots/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/ircstates/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/irctokens/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/isbnlib/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/islpy/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/ismartgate/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/iso-639/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/iso3166/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/iso4217/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/iso8601/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/isodate/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/isoduration/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/isort/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/isosurfaces/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/isounidecode/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/isoweek/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/itanium-demangler/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/itemadapter/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/itemdb/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/itemloaders/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/iteration-utilities/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/iterative-telemetry/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/iterm2/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/itsdangerous/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/itunespy/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/itypes/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/iwlib/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/j2cli/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaconv/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaeger-client/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/jamo/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/janus/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco-abode/default.nix98
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco-classes/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco-collections/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco-context/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco-email/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco-functools/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco-itertools/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco-logging/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco-net/default.nix105
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco-stream/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco-test/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaraco-text/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/jarowinkler/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/javaobj-py3/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/javaproperties/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/jax-jumpy/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/jax/default.nix130
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaxlib/bin.nix217
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaxlib/default.nix359
-rwxr-xr-xnixpkgs/pkgs/development/python-modules/jaxlib/prefetch.sh18
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaxopt/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaxtyping/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/jaydebeapi/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/jc/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/jdatetime/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/jdcal/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/jedi-language-server/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/jedi/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/jeepney/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/jello/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/jellyfin-apiclient-python/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/jellyfish/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/jenkins-job-builder/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/jenkinsapi/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/jieba/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/jinja2-ansible-filters/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/jinja2-git/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/jinja2-pluralize/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/jinja2-time/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/jinja2/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/jinja2/patches/import-order.patch27
-rw-r--r--nixpkgs/pkgs/development/python-modules/jira/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/jiwer/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/jmespath/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/jmp/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/joblib/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/johnnycanencrypt/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/josepy/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/jplephem/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/jproperties/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/jpylyzer/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/jpype1/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/jq/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/jq/jq-py-setup.patch111
-rw-r--r--nixpkgs/pkgs/development/python-modules/js2py/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsbeautifier/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/jschema-to-python/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsmin/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/json-home-client/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/json-logging/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/json-merge-patch/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/json-rpc/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/json-schema-for-humans/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/json-stream-rs-tokenizer/Cargo.lock742
-rw-r--r--nixpkgs/pkgs/development/python-modules/json-stream-rs-tokenizer/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/json-stream/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/json-tricks/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/json5/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonable/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonconversion/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsondate/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsondiff/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonfield/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonlines/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonmerge/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonpatch/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonpath-ng/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonpath/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonpath_rw/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonpickle/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonpointer/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonref/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonrpc-async/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonrpc-base/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonrpc-websocket/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonrpclib-pelix/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsons/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonschema-spec/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonschema-specifications/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonschema/default.nix99
-rw-r--r--nixpkgs/pkgs/development/python-modules/jsonstreams/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/jstyleson/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/jug/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/junit-xml/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/junit2html/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/junitparser/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/junos-eznc/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-book/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-c-kernel/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-cache/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-client/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-collaboration/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-console/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-contrib-core/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-contrib-nbextensions/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-core/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-core/tests_respect_pythonpath.patch22
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-events/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-highlight-selected-word/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-lsp/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-nbextensions-configurator/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-packaging/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-repo2docker/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-server-fileid/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-server-mathjax/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-server-terminals/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-server/default.nix125
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-sphinx/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-telemetry/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-ui-poll/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter-ydoc/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyter/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterhub-ldapauthenticator/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterhub-systemdspawner/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterhub-tmpauthenticator/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterhub/default.nix212
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterlab-git/default.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterlab-lsp/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterlab-pygments/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterlab-server/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterlab-widgets/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupyterlab/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/jupytext/default.nix100
-rw-r--r--nixpkgs/pkgs/development/python-modules/justbackoff/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/justbases/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/justbytes/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/justnimbus/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/jwcrypto/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/jwt/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/jxmlease/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/k-diffusion/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/k5test/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/k5test/fix-paths.patch116
-rw-r--r--nixpkgs/pkgs/development/python-modules/kaa-base/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/kaa-metadata/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/kafka-python/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/kaggle/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/kaitaistruct/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/kajiki/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/0001-stub.patch158
-rw-r--r--nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/0002-exec-path.patch34
-rw-r--r--nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/0003-ffi-path.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/0004-fork-cmake.patch20
-rw-r--r--nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/0006-fork-configure.patch26
-rw-r--r--nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/fork.nix111
-rw-r--r--nixpkgs/pkgs/development/python-modules/kanidm/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/kaptan/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/karton-asciimagic/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/karton-autoit-ripper/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/karton-classifier/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/karton-config-extractor/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/karton-core/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/karton-dashboard/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/karton-mwdb-reporter/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/karton-yaramatcher/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/kasa-crypt/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/kazoo/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/kbcstorage/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/kconfiglib/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/keba-kecontact/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/keep/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/keepalive/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/keepkey/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/keepkey_agent/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/kegtron-ble/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/keras-applications/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/keras-preprocessing/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/keras/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/kerberos/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/keyboard/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/keyring/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/keyrings-alt/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/keyrings-cryptfile/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/keyrings-google-artifactregistry-auth/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/keyrings-passwordstore/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/keystone-engine/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/keystoneauth1/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/keyutils/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/kinparse/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/kiss-headers/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/kitchen/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/kivy-garden/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/kivy/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/kiwiki-client/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/kiwisolver/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/klaus/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/klein/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/kmapper/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/kml2geojson/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/knack/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/kneed/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/knx-frontend/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/kombu/default.nix111
-rw-r--r--nixpkgs/pkgs/development/python-modules/konnected/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/korean-lunar-calendar/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/kornia/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/kotsu/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/kotsu/disable-pytest-coverage-flags.patch18
-rw-r--r--nixpkgs/pkgs/development/python-modules/krakenex/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/krfzf-py/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/kubernetes/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/l18n/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/labelbox/default.nix103
-rw-r--r--nixpkgs/pkgs/development/python-modules/labgrid/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/labmath/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/lakeside/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/langchain/default.nix293
-rw-r--r--nixpkgs/pkgs/development/python-modules/langchainplus-sdk/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/langcodes/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/langdetect/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/langid/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/langsmith/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/language-data/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/language-tags/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/lanms-neo/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/lark/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/laspy/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/laszip/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/latex2mathml/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/latexcodec/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/latexify-py/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/launchpadlib/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/laundrify-aio/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/layoutparser/default.nix100
-rw-r--r--nixpkgs/pkgs/development/python-modules/lazr-restfulclient/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/lazr-uri/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/lazr/config.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/lazr/delegates.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/lazy-imports/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/lazy-loader/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/lazy-object-proxy/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/lazy/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/lazy_import/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/lc7001/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/lcgit/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/lcov_cobertura/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/ld2410-ble/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/ldap3/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/ldapdomaindump/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/ldappool/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/ldaptor/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/ldfparser/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/leather/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/leb128/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/led-ble/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/ledger-bitcoin/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/ledger_agent/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/ledgerblue/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/ledgercomm/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/ledgerwallet/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/leidenalg/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/leveldb/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/levenshtein/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/lexid/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/libagent/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/libais/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/libarchive-c/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/libarcus/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/libasyncns/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/libasyncns/libasyncns-fix-res-consts.patch14
-rw-r--r--nixpkgs/pkgs/development/python-modules/libclang/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/libcloud/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/libcst/default.nix99
-rw-r--r--nixpkgs/pkgs/development/python-modules/libevdev/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/libevdev/fix-paths.patch22
-rw-r--r--nixpkgs/pkgs/development/python-modules/libgpiod/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/libgpuarray/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/libkeepass/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/libknot/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/liblarch/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/liblzfse/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/libmr/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/libnacl/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/libpcap/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/libpurecool/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/libpyfoscam/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/libpyvivotek/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/librespot/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/libretranslate/default.nix94
-rw-r--r--nixpkgs/pkgs/development/python-modules/librosa/default.nix119
-rw-r--r--nixpkgs/pkgs/development/python-modules/librouteros/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/libsass/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/libsavitar/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/libsixel/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/libsoundtouch/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/libthumbor/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/libtmux/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/libusb1/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/libusbsio/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/libversion/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/libvirt/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/liccheck/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/license-expression/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/life360/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/lifelines/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/lightgbm/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/lightning-utilities/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/lightparam/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/lightwave/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/lightwave2/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/lima/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/lime/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/limiter/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/limitlessled/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/limits/default.nix88
-rw-r--r--nixpkgs/pkgs/development/python-modules/limnoria/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/line-profiler/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/linear_operator/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/linecache2/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/lineedit/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/linetable/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/lingua/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/linkify-it-py/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/linknlink/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/linode-api/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/linode/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/linuxfd/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/lion-pytorch/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/liquidctl/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/lit/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/litellm/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/litemapy/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/littleutils/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/livelossplot/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/livereload/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/livestreamer-curses/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/livestreamer/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/lizard/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/llfuse/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/llm/001-disable-install-uninstall-commands.patch34
-rw-r--r--nixpkgs/pkgs/development/python-modules/llm/default.nix107
-rw-r--r--nixpkgs/pkgs/development/python-modules/llvmlite/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/lmdb/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/lmfit/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/lml/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/lmnotify/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/lmtpd/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/loca/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/localimport/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/localstack-client/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/localstack-ext/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/localstack/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/localzone/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/locationsharinglib/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/locket/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/lockfile/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/log-symbols/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/logbook/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/logfury/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/logging-journald/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/logi-circle/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/logical-unification/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/logilab/common.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/logilab/constraint.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/logster/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/loguru/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/logutils/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/logzero/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/lomond/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/loopy/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/looseversion/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/loqedapi/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/losant-rest/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/lpc-checksum/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/lrcalc-python/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/lru-dict/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/lsassy/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/lsprotocol/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/ltpycld2/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/luddite/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/luftdaten/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/luhn/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/lunarcalendar/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/lupa/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/lupupy/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/luqum/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/luxor/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/luxtronik/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/lxmf/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/lxml-stubs/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/lxml/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/lyricwikia/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/lz4/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/lzallright/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/lzallright/tests.nix15
-rw-r--r--nixpkgs/pkgs/development/python-modules/lzstring/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/m2crypto/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/m2r/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/m2r/docutils-0.19-compat.patch15
-rw-r--r--nixpkgs/pkgs/development/python-modules/m3u8/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/mac-vendor-lookup/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/mac_alias/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/macaddress/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/macfsevents/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/macropy/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/maestral/default.nix105
-rw-r--r--nixpkgs/pkgs/development/python-modules/magic-filter/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/magic-wormhole-mailbox-server/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/magic-wormhole-transit-relay/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/magic-wormhole/default.nix122
-rw-r--r--nixpkgs/pkgs/development/python-modules/magic/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/magicgui/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/mahotas/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/mail-parser/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/mailcap-fix/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/mailchecker/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/mailchimp/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/mailmanclient/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/mailsuite/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/maison/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/makefun/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/mako/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/malduck/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/managesieve/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/mando/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/mandown/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/manhole/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/manifest-ml/default.nix113
-rw-r--r--nixpkgs/pkgs/development/python-modules/manifestoo-core/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/manifestoo/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/manimpango/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/manuel/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/manuf/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/manuf/fix_manuf_url.patch14
-rw-r--r--nixpkgs/pkgs/development/python-modules/manuf/internal_db_update_nix.patch31
-rw-r--r--nixpkgs/pkgs/development/python-modules/mapbox-earcut/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/mapbox/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/mariadb/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/marionette-harness/manifestparser.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/marisa-trie/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/marisa/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/markdown-include/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/markdown-it-py/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/markdown-macros/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/markdown/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/markdown2/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/markdownify/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/markuppy/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/markups/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/markupsafe/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/marshmallow-dataclass/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/marshmallow-enum/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/marshmallow-oneofschema/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/marshmallow-polyfield/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/marshmallow-sqlalchemy/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/marshmallow/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/mashumaro/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/masky/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/mastodon-py/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/mat2/bubblewrap-path.patch35
-rw-r--r--nixpkgs/pkgs/development/python-modules/mat2/default.nix106
-rw-r--r--nixpkgs/pkgs/development/python-modules/mat2/executable-name.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/mat2/paths.patch66
-rw-r--r--nixpkgs/pkgs/development/python-modules/mat2/tests.patch18
-rw-r--r--nixpkgs/pkgs/development/python-modules/matchpy/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/material-color-utilities/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/mathlibtools/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/matlink-gpapi/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/matplotlib-inline/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/matplotlib-sixel/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/matplotlib/default.nix206
-rw-r--r--nixpkgs/pkgs/development/python-modules/matplotx/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/matrix-api-async/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/matrix-client/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/matrix-common/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/matrix-nio/default.nix106
-rw-r--r--nixpkgs/pkgs/development/python-modules/mattermostdriver/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/mautrix/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/maxcube-api/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/maxminddb/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/maya/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/mayavi/default.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/mbddns/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/mbstrdecoder/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/mccabe/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/mcstatus/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/mcuuid/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/md-toc/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/md2gemini/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdformat-admon/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdformat-beautysh/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdformat-footnote/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdformat-frontmatter/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdformat-gfm/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdformat-mkdocs/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdformat-nix-alejandra/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdformat-simple-breaks/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdformat-tables/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdformat-toc/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdformat/default.nix103
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdit-py-plugins/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdp/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdtraj/default.nix102
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdurl/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdutils/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/mdx-truly-sane-lists/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/measurement/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/meater-python/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/mecab-python3/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/mechanicalsoup/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/mechanize/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/mediafile/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/mediapy/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/meeko/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/meep/default.nix150
-rw-r--r--nixpkgs/pkgs/development/python-modules/meilisearch/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/meinheld/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/meld3/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/memestra/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/memory-allocator/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/memory-profiler/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/meraki/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/mercadopago/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/mercantile/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/merge3/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/mergedb/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/mergedeep/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/mergedict/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/merkletools/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/meross-iot/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/mesa/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/meshcat/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/meshio/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/meshlabxml/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/meshtastic/default.nix123
-rw-r--r--nixpkgs/pkgs/development/python-modules/meson-python/add-build-flags.sh10
-rw-r--r--nixpkgs/pkgs/development/python-modules/meson-python/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/mesonpep517/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/messagebird/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/metakernel/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/metar/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/metawear/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/meteoalertapi/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/meteocalc/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/meteofrance-api/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/mezzanine/default.nix91
-rw-r--r--nixpkgs/pkgs/development/python-modules/mf2py/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/mhcflurry/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/mhcgnomes/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/miauth/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/micawber/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/micloud/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/microdata/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/midiutil/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/mido/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/mido/libportmidi-cdll.patch19
-rw-r--r--nixpkgs/pkgs/development/python-modules/migen/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/mike/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/milc/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/milksnake/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/mill-local/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/millheater/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/mindsdb-evaluator/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/minexr/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/miniaudio/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/minichain/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/minidb/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/minidump/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/miniful/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/minikanren/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/minikerberos/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/minimal-snowplow-tracker/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/minimock/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/minio/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/miniupnpc/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/mip/default.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/mip/test-data-path.patch30
-rw-r--r--nixpkgs/pkgs/development/python-modules/mir_eval/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/mirakuru/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/misaka/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/misoc/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/mistletoe/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/mistune/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/mitmproxy-macos/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/mitmproxy-rs/Cargo.lock2762
-rw-r--r--nixpkgs/pkgs/development/python-modules/mitmproxy-rs/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/mitmproxy-wireguard/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/mitmproxy/default.nix141
-rw-r--r--nixpkgs/pkgs/development/python-modules/mitogen/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/mixins/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/mixpanel/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/mizani/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-autorefs/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-drawio-exporter/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-exclude/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-git-authors-plugin/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-git-revision-date-localized-plugin/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-gitlab-plugin/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-gitlab-plugin/mkdocs-gitlab-plugin.diff37
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-jupyter/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-linkcheck/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-macros/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-macros/mkdocs-macros-test.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-macros/tests.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-material/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-material/mkdocs-material-extensions.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-mermaid2-plugin/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-minify/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-redirects/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-simple-hooks/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs-swagger-ui-tag/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocs/default.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocstrings-python/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkdocstrings/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/mkl-service/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/ml-collections/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/ml-dtypes/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/mlflow/default.nix112
-rw-r--r--nixpkgs/pkgs/development/python-modules/mlrose/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/mlxtend/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/mmcif-pdbx/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/mmcv/default.nix125
-rw-r--r--nixpkgs/pkgs/development/python-modules/mmengine/default.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/mmh3/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/mmpython/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/mmtf-python/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/mne-python/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/mnemonic/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/mnist/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/moat-ble/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/mobi/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/mobly/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/mock-open/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/mock-services/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/mock-ssh-server/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/mock/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/mocket/default.nix115
-rw-r--r--nixpkgs/pkgs/development/python-modules/mockfs/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/mockito/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/mockupdb/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/moddb/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/model-bakery/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/modelcif/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/modeled/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/moderngl/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/moderngl_window/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/modestmaps/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/mohawk/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/molecule/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/molecule/plugins.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/monai-deploy/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/monai/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/monero/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/mongodict/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/mongoengine/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/mongomock/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/mongoquery/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/monkeyhex/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/monotonic/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/monty/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/moonraker-api/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/mopeka-iot-ble/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/more-itertools/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/more-properties/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/moreorless/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/moretools/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/morfessor/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/morphys/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/mortgage/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/motionblinds/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/motioneye-client/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/moto/default.nix159
-rw-r--r--nixpkgs/pkgs/development/python-modules/motor/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/mouseinfo/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/mouseinfo/fix-xlib-version.patch14
-rw-r--r--nixpkgs/pkgs/development/python-modules/mouseinfo/pillow-version.patch20
-rw-r--r--nixpkgs/pkgs/development/python-modules/moviepy/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/mox3/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/mpd2/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/mpi4py/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/mpi4py/tests.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/mpl-scatter-density/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/mpldatacursor/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/mplfinance/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/mplhep-data/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/mplhep/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/mplleaflet/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/mpmath/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/mpris-server/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/mpv/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/mpyq/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/mqtt2influxdb/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/mrjob/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/mrsqm/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/ms-active-directory/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/ms-cv/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/msal-extensions/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/msal/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/mscerts/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/msg-parser/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/msgpack-numpy/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/msgpack/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/msgraph-core/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/msgspec/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/msldap/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/msoffcrypto-tool/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/msprime/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/msrest/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/msrestazure/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/mss/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/mt-940/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/mujson/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/mullvad-api/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/mullvad-closest/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/mulpyplexer/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/multi-key-dict/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/multidict/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/multimethod/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/multipart/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/multipledispatch/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/multiprocess/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/multiset/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/multitasking/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/munch/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/mung/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/munkres/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/murmurhash/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/muscima/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/music-tag/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/musicbrainzngs/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/mutag/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/mutagen/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/mutatormath/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/mutesync/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/mutf8/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/mwcli/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/mwclient/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/mwdblib/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/mwoauth/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/mwparserfromhell/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/mwtypes/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/mwxml/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/mxnet/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/myfitnesspal/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/mygpoclient/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/myhdl/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/myhome/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/myjwt/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/mypy-boto3-builder/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/mypy-boto3/default.nix755
-rw-r--r--nixpkgs/pkgs/development/python-modules/mypy-protobuf/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/mypy/default.nix123
-rw-r--r--nixpkgs/pkgs/development/python-modules/mypy/extensions.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/mysql-connector/0001-Revert-Fix-MacOS-wheels-platform-tag.patch22
-rw-r--r--nixpkgs/pkgs/development/python-modules/mysql-connector/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/mysqlclient/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/myst-docutils/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/myst-nb/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/myst-parser/default.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/n3fit/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/nad-receiver/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/nagiosplugin/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/name-that-hash/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/namedlist/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/nameparser/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/names/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/nampa/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/nanoid/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/nanoleaf/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/nanomsg-python/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/nanotime/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/napalm/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/napalm/hp-procurve.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/napari-console/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/napari-npe2/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/napari-plugin-engine/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/napari-svg/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/napari/default.nix112
-rw-r--r--nixpkgs/pkgs/development/python-modules/nasdaq-data-link/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/natasha/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/nats-py/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/nats-python/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/natsort/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/naturalsort/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/navec/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbclassic/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbclient/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbconflux/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbconflux/setup-py.patch16
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbconvert/default.nix110
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbconvert/templates.patch12
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbdev/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbdime/default.nix96
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbexec/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbformat/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbmerge/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbsmoke/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbsphinx/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbtlib/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbval/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/nbxmpp/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/nc-dnsapi/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/ncclient/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/nclib/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/ndeflib/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/ndg-httpsclient/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/ndindex/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/ndjson/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/ndms2-client/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/ndspy/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/ndtypes/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/nengo/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/neo/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/neo4j/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/nessclient/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/nest-asyncio/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/nested-lookup/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/nestedtext/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/netaddr/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/netapp-lib/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/netapp-ontap/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/netcdf4/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/netdata/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/netdisco/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/netifaces/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/netio/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/netmap/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/netmap/nmap-path.patch17
-rw-r--r--nixpkgs/pkgs/development/python-modules/netmiko/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/nettigo-air-monitor/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/netutils/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/networkx/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/nevow/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/newick/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/newversion/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/nexia/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/nextcloudmonitor/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/nextcord/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/nextcord/paths.patch74
-rw-r--r--nixpkgs/pkgs/development/python-modules/nextdns/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/nfcpy/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/nh3/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/niaaml/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/niaarm/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/niaclass/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/nianet/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/niapy/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/nibabel/default.nix91
-rw-r--r--nixpkgs/pkgs/development/python-modules/nibe/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/nidaqmx/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/niko-home-control/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/nikola/default.nix119
-rw-r--r--nixpkgs/pkgs/development/python-modules/nilearn/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/niluclient/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/nimfa/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/nine/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/ninebot-ble/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/ninja/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/ninja/stub/ninja/__init__.py13
-rw-r--r--nixpkgs/pkgs/development/python-modules/ninja/stub/pyproject.toml11
-rw-r--r--nixpkgs/pkgs/development/python-modules/nipy/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/nipype/default.nix112
-rw-r--r--nixpkgs/pkgs/development/python-modules/nitime/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/nitransforms/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/nix-kernel/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/nix-prefetch-github/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/nixpkgs-pytools/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/nixpkgs/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/nkdfu/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/nlpcloud/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/nltk/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/nmapthon2/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/nocasedict/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/nocaselist/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/nocturne/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/nocturne/dependencies.patch27
-rw-r--r--nixpkgs/pkgs/development/python-modules/node-semver/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/nodeenv/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/nodepy-runtime/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/noise/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/noiseprotocol/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/nomadnet/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/normality/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/nose-cov/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/nose-cprof/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/nose-exclude/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/nose-pattern-exclude/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/nose-randomly/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/nose-timer/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/nose/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/nose2/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/nose3/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/nose_warnings_filters/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/nosejs/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/nosexcover/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/notebook-shim/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/notebook/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/notedown/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/notifications-android-tv/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/notifications-python-client/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/notify-events/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/notify-py/darwin-paths.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/notify-py/default.nix95
-rw-r--r--nixpkgs/pkgs/development/python-modules/notify-py/linux-paths.patch22
-rw-r--r--nixpkgs/pkgs/development/python-modules/notify2/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/notion-client/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/notmuch/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/notmuch2/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/notus-scanner/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/nox/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/nplusone/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/nptyping/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/npyscreen/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/nsapi/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/nsz/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/ntc-templates/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/ntplib/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/nuheat/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/nuitka/darwin-lto.patch15
-rw-r--r--nixpkgs/pkgs/development/python-modules/nuitka/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/nulltype/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/num2words/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/numba-scipy/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/numba/cuda_path.patch79
-rw-r--r--nixpkgs/pkgs/development/python-modules/numba/default.nix130
-rw-r--r--nixpkgs/pkgs/development/python-modules/numcodecs/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/numdifftools/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/numericalunits/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/numexpr/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/numpy-stl/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/numpy/default.nix175
-rw-r--r--nixpkgs/pkgs/development/python-modules/numpy/disable-failing-long-double-test-Rosetta-2.patch23
-rw-r--r--nixpkgs/pkgs/development/python-modules/numpy/numpy-distutils-C++.patch30
-rw-r--r--nixpkgs/pkgs/development/python-modules/numpydoc/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/numpyro/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/nunavut/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/nutils/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/nvchecker/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/nvidia-ml-py/0001-locate-libnvidia-ml.so.1-on-NixOS.patch17
-rw-r--r--nixpkgs/pkgs/development/python-modules/nvidia-ml-py/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/nwdiag/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/nxt-python/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/oasatelematics/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/oath/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/oauth/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/oauth2/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/oauth2client/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/oauthenticator/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/oauthlib/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/obfsproxy/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/objax/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/objgraph/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/objgraph/hardcode-graphviz-path.patch61
-rw-r--r--nixpkgs/pkgs/development/python-modules/objsize/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/obspy/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/oca-port/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/ochre/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/oci/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/ocifs/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/ocrmypdf/default.nix110
-rw-r--r--nixpkgs/pkgs/development/python-modules/ocrmypdf/paths.patch119
-rw-r--r--nixpkgs/pkgs/development/python-modules/od/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/odfpy/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/odp-amsterdam/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/oelint-parser/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/oemthermostat/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/offtrac/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/ofxclient/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/ofxhome/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/ofxparse/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/ofxtools/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/okonomiyaki/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/okta/default.nix86
-rw-r--r--nixpkgs/pkgs/development/python-modules/oldest-supported-numpy/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/olefile/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/oletools/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/ome-zarr/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/omegaconf/0000-add-support-for-dataclasses_missing_type.patch21
-rw-r--r--nixpkgs/pkgs/development/python-modules/omegaconf/antlr4.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/omegaconf/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/omemo-dr/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/omnikinverter/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/omnilogic/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/omorfi/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/omorfi/importfix.patch76
-rw-r--r--nixpkgs/pkgs/development/python-modules/omrdatasettools/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/ondilo/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/onetimepad/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/onetimepass/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/onkyo-eiscp/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/online-judge-api-client/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/online-judge-api-client/fix-paths.patch39
-rw-r--r--nixpkgs/pkgs/development/python-modules/online-judge-tools/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/onlykey-solo-python/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/onnx/default.nix152
-rw-r--r--nixpkgs/pkgs/development/python-modules/onnxconverter-common/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/onnxmltools/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/onnxruntime-tools/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/onnxruntime/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/onvif-zeep-async/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/oocsi/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/opcua-widgets/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/open-garage/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/open-meteo/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/openai-triton/0000-dont-download-ptxas.patch39
-rw-r--r--nixpkgs/pkgs/development/python-modules/openai-triton/bin.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/openai-triton/binary-hashes.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/openai-triton/default.nix184
-rwxr-xr-xnixpkgs/pkgs/development/python-modules/openai-triton/prefetch.sh40
-rw-r--r--nixpkgs/pkgs/development/python-modules/openai-whisper/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/openai-whisper/ffmpeg-path.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/openai/default.nix98
-rw-r--r--nixpkgs/pkgs/development/python-modules/openaiauth/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/openant/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/openapi-core/default.nix111
-rw-r--r--nixpkgs/pkgs/development/python-modules/openapi-schema-validator/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/openapi-spec-validator/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/openapi3/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/openbabel-bindings/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/opencensus-context/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/opencensus-ext-azure/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/opencensus/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/opencontainers/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/openerz-api/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/openevsewifi/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/openhomedevice/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/openidc-client/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/openllm-client/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/openllm-core/default.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/openllm/default.nix190
-rw-r--r--nixpkgs/pkgs/development/python-modules/openpyxl/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/openrazer/common.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/openrazer/daemon.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/openrazer/pylib.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/openrgb-python/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/openrouteservice/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/opensearch-py/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/opensensemap-api/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/opensfm/0002-cmake-find-system-distributed-gtest.patch57
-rw-r--r--nixpkgs/pkgs/development/python-modules/opensfm/0003-cmake-use-system-pybind11.patch161
-rw-r--r--nixpkgs/pkgs/development/python-modules/opensfm/0004-pybind_utils.h-conflicts-with-nixpkgs-pybind.patch86
-rw-r--r--nixpkgs/pkgs/development/python-modules/opensfm/default.nix125
-rw-r--r--nixpkgs/pkgs/development/python-modules/opensfm/fix-scripts.patch41
-rw-r--r--nixpkgs/pkgs/development/python-modules/openshift/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/opensimplex/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/openstackdocstheme/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/openstacksdk/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/openstacksdk/tests.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/openstep-plist/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentelemetry-api/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentelemetry-exporter-otlp-proto-common/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentelemetry-exporter-otlp-proto-grpc/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentelemetry-exporter-otlp-proto-http/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentelemetry-exporter-otlp/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentelemetry-exporter-prometheus/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation-aiohttp-client/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation-asgi/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation-django/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation-grpc/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation-wsgi/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentelemetry-proto/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentelemetry-sdk/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentelemetry-semantic-conventions/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentelemetry-test-utils/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentelemetry-util-http/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentimestamps/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentracing/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/opentsne/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/openusd/default.nix131
-rw-r--r--nixpkgs/pkgs/development/python-modules/openvino/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/openwebifpy/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/openwrt-luci-rpc/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/openwrt-ubus-rpc/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/opower/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/opsdroid-get-image-size/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/opt-einsum/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/optax/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/optax/tests.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/optimum/default.nix115
-rw-r--r--nixpkgs/pkgs/development/python-modules/optuna/default.nix142
-rw-r--r--nixpkgs/pkgs/development/python-modules/opuslib/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/opuslib/opuslib-paths.patch26
-rw-r--r--nixpkgs/pkgs/development/python-modules/opytimark/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/oracledb/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/oralb-ble/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/orange-canvas-core/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/orange-widget-base/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/orange3/default.nix178
-rw-r--r--nixpkgs/pkgs/development/python-modules/ordered-set/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/orderedmultidict/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/orderedset/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/orjson/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/orm/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/ormar/default.nix168
-rw-r--r--nixpkgs/pkgs/development/python-modules/orvibo/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/os-service-types/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/os-service-types/tests.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/osc-lib/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/osc/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/oscpy/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/oscrypto/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/oscrypto/support-openssl-3.0.10.patch11
-rw-r--r--nixpkgs/pkgs/development/python-modules/oset/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/oslo-concurrency/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/oslo-config/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/oslo-config/tests.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/oslo-context/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/oslo-db/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/oslo-i18n/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/oslo-log/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/oslo-serialization/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/oslo-utils/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/oslotest/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/oslotest/tests.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/osmnx/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/osmpythontools/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/ospd/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/osqp/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/oss2/default.nix122
-rw-r--r--nixpkgs/pkgs/development/python-modules/ossfs/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/outcome/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/overly/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/overpy/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/overrides/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/ovh/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/ovmfvartool/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/ovoenergy/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/owslib/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/oyaml/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/p1monitor/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pa-ringbuffer/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/packageurl-python/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/packaging/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/packbits/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/packet-python/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/packvers/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pad4pi/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/paddle-bfloat/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/paddle2onnx/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/paddleocr/default.nix111
-rw-r--r--nixpkgs/pkgs/development/python-modules/paddleocr/remove-import-imaug.patch20
-rw-r--r--nixpkgs/pkgs/development/python-modules/paddlepaddle/binary-hashes.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/paddlepaddle/default.nix97
-rw-r--r--nixpkgs/pkgs/development/python-modules/pagelabels/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/paho-mqtt/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/palace/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/palettable/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pallets-sphinx-themes/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pamela/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pamqp/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/panacotta/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/panasonic-viera/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pandas-datareader/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pandas-stubs/default.nix130
-rw-r--r--nixpkgs/pkgs/development/python-modules/pandas/default.nix266
-rw-r--r--nixpkgs/pkgs/development/python-modules/pandoc-attributes/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pandoc-xnos/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pandocfilters/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/panel/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/panflute/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/papermill/default.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/papis-python-rofi/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/papis/default.nix121
-rw-r--r--nixpkgs/pkgs/development/python-modules/para/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/param/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/parameter-expansion-patched/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/parameterized/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/parametrize-from-file/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/paramiko/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/paramz/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/paranoid-crypto/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/parfive/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/parquet/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/parse-type/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/parse/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/parsedatetime/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/parsedmarc/default.nix107
-rw-r--r--nixpkgs/pkgs/development/python-modules/parsel/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/parsimonious/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/parsley/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/parso/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/parsy/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/partd/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/particle/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/parts/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/parver/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pasimple/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/passlib/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/paste/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pastedeploy/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pastel/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pastescript/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/patator/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/patch-ng/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/patch/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/path-and-address/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/path/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pathable/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pathlib/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pathlib2/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pathos/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pathspec/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pathtools/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pathvalidate/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pathy/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/patiencediff/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/patool/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/patrowl4py/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/patsy/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/paver/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/paypal-checkout-serversdk/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/paypalhttp/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pbkdf2/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/pbr/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pbr/tests.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pc-ble-driver-py/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/pcapy-ng/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pcbnew-transition/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pcodedmp/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pcpp/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdb2pqr/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdbfixer/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdf2docx/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdf2image/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdfkit/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdfminer-six/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdfplumber/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdfrw/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdftotext/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdfx/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdm-backend/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdm-backend/setup-hook.sh8
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdm-pep517/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdoc/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdoc3/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pdunehd/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/peaqevcore/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pebble/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pecan/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/peco/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/peewee-migrate/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/peewee/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/pefile/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/peft/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pegen/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pelican/default.nix114
-rw-r--r--nixpkgs/pkgs/development/python-modules/pem/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/pencompy/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pendulum/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pep440/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pep517/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pep8-naming/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pep8/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/peppercorn/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/percol/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/perfplot/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/periodictable/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/periodiq/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/permissionedforms/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/persim/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/persist-queue/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/persistent/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/persisting-theory/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pescea/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/pex/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pexif/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pexpect/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pfzy/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pg8000/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pgcli/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/pglast/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pgmpy/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/pgpdump/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pgpy/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pgsanity/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pgspecial/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pgvector/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/phe/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/phik/default.nix99
-rw-r--r--nixpkgs/pkgs/development/python-modules/phone-modem/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/phonemizer/backend-paths.patch18
-rw-r--r--nixpkgs/pkgs/development/python-modules/phonemizer/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/phonenumbers/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/phonopy/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/phpserialize/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/phx-class-registry/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pi1wire/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/piano-transcription-inference/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/piccata/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/piccolo-theme/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pick/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pickleshare/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/picobox/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/picos/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/picosvg/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pid/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/piep/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/piexif/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pijuice/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/pijuice/patch-shebang.diff9
-rw-r--r--nixpkgs/pkgs/development/python-modules/pika-pool/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pika/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/pikepdf/default.nix94
-rw-r--r--nixpkgs/pkgs/development/python-modules/pikepdf/paths.patch35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pilkit/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pillow-heif/default.nix93
-rw-r--r--nixpkgs/pkgs/development/python-modules/pillow-simd/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pillow/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pillow/generic.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/pillowfight/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pims/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/pinboard/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pinecone-client/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/ping3/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pint-pandas/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pint/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/pip-api/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pip-requirements-parser/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pip-tools/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/pip-tools/fix-setup-py-bad-syntax-detection.patch21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pip/default.nix96
-rw-r--r--nixpkgs/pkgs/development/python-modules/pipdate/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pipdeptree/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/pipenv-poetry-migrate/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/piper-phonemize/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pipx/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/pivy/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pixcat/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pixel-ring/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pixelmatch/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pkce/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pkg-about/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pkgconfig/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pkginfo/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pkginfo2/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pkgutil-resolve-name/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pkuseg/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pkutils/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/plac/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/plaid-python/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/plantuml-markdown/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/plantuml/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/plaster-pastedeploy/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/plaster/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/platformdirs/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/playsound/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/playwright/default.nix108
-rw-r--r--nixpkgs/pkgs/development/python-modules/playwright/driver-location.patch47
-rwxr-xr-xnixpkgs/pkgs/development/python-modules/playwright/update.sh35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pleroma-bot/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/plexapi/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/plexauth/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/plexwebsocket/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/plone-testing/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/plotext/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/plotly/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/plotnine/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/pluggy/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pluggy/tests.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/pluginbase/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/plugincode/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/plugnplay/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/plugwise/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/plum-py/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/plumbum/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/plux/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/ply/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/plyer/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/plyfile/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/plyplus/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/plyvel/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pmdarima/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/pmdsky-debug-py/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pmsensor/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pmw/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pnglatex/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pocket/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/podcastparser/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/podcats/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/podman/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/poetry-core/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/poetry-dynamic-versioning/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/poetry-dynamic-versioning/setup-hook.sh8
-rw-r--r--nixpkgs/pkgs/development/python-modules/poetry-semver/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/polarizationsolver/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/polars/Cargo.lock3167
-rw-r--r--nixpkgs/pkgs/development/python-modules/polars/default.nix91
-rw-r--r--nixpkgs/pkgs/development/python-modules/polib/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/policy-sentry/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/policyuniverse/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/polling/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/polygon3/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/polyline/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/pomegranate/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pomegranate/disable-failed-on-nextworkx-2.6.patch26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pontos/default.nix86
-rw-r--r--nixpkgs/pkgs/development/python-modules/pony/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/ponywhoosh/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pooch/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/pook/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/poolsense/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/poppler-qt5/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/port-for/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/portalocker/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/portend/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/portpicker/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/posix_ipc/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/posthog/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/pot/default.nix122
-rw-r--r--nixpkgs/pkgs/development/python-modules/potentials/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/potr/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/power/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/powerline-mem-segment/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/powerline/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pox/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/poyo/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/ppdeep/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/ppft/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pplpy/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/pprintpp/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pproxy/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/ppscore/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pq/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/prance/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/praw/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/prawcore/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/prayer-times-calculator/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pre-commit-hooks/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/precis-i18n/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/prefixed/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/preggy/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/premailer/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/preprocess-cancellation/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/preprocess-cancellation/pep-621.patch20
-rw-r--r--nixpkgs/pkgs/development/python-modules/preshed/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pretend/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/prettytable/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/primecountpy/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/primer3/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/priority/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/prison/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/proboscis/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/process-tests/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/procmon-parser/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/prodict/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/proglog/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/progress/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/progressbar/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/progressbar2/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/progressbar33/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/prometheus-client/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/prometheus-flask-exporter/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/prometheus-pandas/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/promise/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/prompt-toolkit/1.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/prompt-toolkit/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/prompthub-py/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/property-manager/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/prophet/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/propka/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/protego/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/proto-plus/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/protobuf/3.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/protobuf/default.nix118
-rw-r--r--nixpkgs/pkgs/development/python-modules/protobuf/use-nixpkgs-abseil-cpp.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/protobuf3-to-dict/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/proton-client/0001-OpenSSL-path-fix.patch41
-rw-r--r--nixpkgs/pkgs/development/python-modules/proton-client/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/protonup-ng/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/protonvpn-nm-lib/0001-Patching-GIRepository.patch22
-rw-r--r--nixpkgs/pkgs/development/python-modules/protonvpn-nm-lib/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/prov/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/prox-tv/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/proxmoxer/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/proxy-db/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/proxy-py/default.nix101
-rw-r--r--nixpkgs/pkgs/development/python-modules/proxy-tools/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/psautohint/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/pscript/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/psd-tools/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/psrpcore/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/psutil-home-assistant/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/psutil/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/psychrolib/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/psycopg/ctypes.patch46
-rw-r--r--nixpkgs/pkgs/development/python-modules/psycopg/default.nix232
-rw-r--r--nixpkgs/pkgs/development/python-modules/psycopg2/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/psycopg2cffi/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/psygnal/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/ptable/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/ptest/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/ptpython/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/ptyprocess/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/publicsuffix/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/publicsuffix2/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/publicsuffixlist/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pubnub/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/pubnubsub-handler/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pudb/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pulp/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pulsectl-asyncio/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pulsectl/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pulsectl/library-paths.patch22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pulumi-aws/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pulumi/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/pure-cdb/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pure-eval/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pure-pcapy3/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pure-protobuf/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pure-python-adb-homeassistant/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pure-python-adb/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/puremagic/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/purepng/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/purl/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/push-receiver/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pushbullet-py/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pushover-complete/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pvextractor/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/pvlib/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/pvo/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/pweave/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pwntools/default.nix88
-rw-r--r--nixpkgs/pkgs/development/python-modules/pxml/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-air-control-exporter/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-air-control/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-bip39-bindings/Cargo.lock758
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-bip39-bindings/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-canary/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-cid/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-cpuinfo/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-deprecate/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-desmume/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-dmidecode/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-dormakaba-dkey/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-ecc/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-eth-sig-utils/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-expression-eval/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-libzfs/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-lru-cache/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-multiaddr/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-multibase/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-multicodec/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-multihash/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-nextbusnext/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-nightscout/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-partiql-parser/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-pdf-parser/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-radix-sr/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-serializable/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-sneakers/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-sonic/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-sr25519-bindings/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-stringmatching/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-synologydsm-api/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-tes/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-tree-sitter/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-ubjson/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-vapid/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/py-zabbix/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/py/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/py17track/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/py2bit/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/py3buddy/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/py3dns/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/py3exiv2/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/py3nvml/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/py3rijndael/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/py3status/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/py4j/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/py65/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyTelegramBotAPI/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/py_scrypt/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyacaia-async/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyacoustid/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyads/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyaehw4a1/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyaes/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyaftership/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyahocorasick/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyairnow/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyairvisual/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyalgotrade/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyamg/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyaml/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyannotate/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyarlo/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyarr/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyarrow/default.nix173
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyasn/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyasn1-modules/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyasn1/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyatag/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyathena/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyatmo/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyatome/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyatspi/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyatv/default.nix119
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyaudio/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyaussiebb/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyautogui/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyautogui/fix-locateOnWindow-and-xlib.patch30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyavm/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyaxmlparser/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybalboa/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybars3/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybase64/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybids/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybigwig/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybind11/default.nix125
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybind11/setup-hook.sh12
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybindgen/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyblackbird/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybloom-live/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybluez/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybotvac/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybotvac/urllib3-2.0-compat.patch21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybox2d/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybravia/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybrowserid/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybtex-docutils/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybtex/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybullet/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pybullet/static-libs.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycairo/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycangjie/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycapnp/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycaption/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycardano/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycares/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycarwings2/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycatch22/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycategories/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycategories/infix.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycddl/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycdio/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycec/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycep-parser/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycfdns/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycflow2dot/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycfmodel/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pychannels/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pychart/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/pychm/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pychromecast/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycketcasts/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyclimacell/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyclip/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyclipper/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycm/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycmarkgfm/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycocotools/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycodestyle/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycognito/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycoin/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycollada/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycomfoconnect/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycomposefile/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycontracts/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycontrol4/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycookiecheat/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycoolmasternet-async/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycosat/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycotap/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycountry/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycparser/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycrc/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycritty/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycron/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycrypto/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycryptodome/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycryptodome/vectors.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycryptodomex/default.nix13
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycsdr/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyct/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyctr/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycuda/compyte.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycuda/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycups/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycurl/default.nix86
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycxx/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pycyphal/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydaikin/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydal/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydanfossair/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydantic-core/01-remove-benchmark-flags.patch18
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydantic-core/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydantic-extra-types/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydantic-scim/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydantic-settings/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydantic/default.nix132
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydash/0001-Only-build-unit-tests.patch30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydash/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydata-google-auth/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydata-sphinx-theme/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydateinfer/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydbus/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydeck/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydeconz/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydelijn/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydenticon/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydeps/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydes/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydevccu/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydevd/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydevtool/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydexcom/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydicom-seg/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydicom/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydicom/pillow-10.1.0-compat.patch29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydigiham/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydiscourse/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydiscovergy/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydispatcher/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydmd/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydocstyle/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydocumentdb/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydoods/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydot/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydot/hardcode-graphviz-path.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydrawise/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydrive2/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydroid-ipcam/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydruid/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydsdl/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydub/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyduke-energy/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyduotecno/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydy/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pydyf/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyeapi/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyebus/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyechonest/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyeclib/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyecoforest/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyeconet/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyecowitt/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyedimax/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyee/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyefergy/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyeight/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyelftools/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyemby/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyemd/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyenchant/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyenphase/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyenvisalink/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyephember/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyepsg/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyerfa/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyeverlights/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyevilgenius/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyevmasm/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyexcel-io/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyexcel-ods/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyexcel-xls/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyexcel/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyexploitdb/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyezviz/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyface/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfaidx/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfakefs/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfakewebcam/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfantom/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfcm/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfftw/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfibaro/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfido/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfiglet/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfireservicerota/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyflakes/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyflexit/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyflic/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyflick/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfluidsynth/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyflume/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfma/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfnip/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfreedompro/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfribidi/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfribidi/pyfribidi-clang.patch17
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfritzhome/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfronius/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyftdi/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyftgl/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyftpdlib/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfttt/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfume/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfuse3/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfxa/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyfzf/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygal/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygame-gui/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygame/default.nix88
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygame/fix-dependency-finding.patch41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygame_sdl2/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygatt/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygccxml/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygdbmi/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygeoip/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygeos/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygetwindow/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygit2/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygitguardian/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygithub/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyglet/default.nix111
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyglm/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygls/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygmars/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygments-better-html/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygments-markdown-lexer/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygments-style-github/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygments/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygmo/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygmt/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygnmi/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygobject-stubs/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygobject/3.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygogo/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygpgme/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygraphviz/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygraphviz/path.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygreat/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygrok/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygsl/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygtail/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygtfs/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygti/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygtkspellcheck/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pygtrie/default.nix15
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhamcrest/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhanko-certvalidator/default.nix86
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhanko/0001-Updating-pytest-aiohttp-version.patch25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhanko/default.nix143
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhaversion/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhcl/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyheck/Cargo.lock377
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyheck/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyheif/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyheos/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhepmc/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhiveapi/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhocon/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhomematic/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhomepilot/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhomeworks/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhs100/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyhumps/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyi2cflash/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyialarm/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyicloud/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyicu/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyimpfuzzy/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyinfra/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyinotify/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyinputevent/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyinstaller-versionfile/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyinsteon/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyinstrument/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyintesishome/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyipma/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyipp/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyiqvia/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyisbn/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyisy/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyixapi/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyjet/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyjks/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyjnius/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyjsparser/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyjwkest/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyjwt/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykakasi/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykaleidescape/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykalman/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykalman/fix-masked-arrays-not-supported.patch14
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykalman/fix-p311-issues.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykdl/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykdtree/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykeepass/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykerberos/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykeyatome/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykira/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykka/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykmtronic/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykodi/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykoplenti/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykostalpiko/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykrakenapi/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykulersky/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykwalify/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/pykwb/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylacrosse/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylama/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylama/paths.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylast/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylatexenc/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylaunches/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyld/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylddwrap/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylddwrap/replace_env_with_placeholder.patch25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyleri/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylev/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylgnetcast/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylibacl/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylibconfig2/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylibdmtx/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylibftdi/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylibjpeg-libjpeg/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyliblo/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylibmc/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylink-square/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylint-celery/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylint-django/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylint-flask/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylint-plugin-utils/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylint-venv/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylint/default.nix138
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylion/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylitterbot/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylnk3/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylpsd/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylru/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyls-flake8/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyls-isort/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyls-memestra/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyls-spyder/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylsp-mypy/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylsp-rope/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylsqpack/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylti/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylutron-caseta/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylutron/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylxd/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylyrics/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pylzma/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymacaroons/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymailgunner/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymanopt/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymarshal/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymata-express/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymatgen/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymatting/01-kdtree-signature.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymatting/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymaven-patch/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymavlink/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymbolic/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymc/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymdown-extensions/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymdstat/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymediainfo/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymediaroom/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymedio/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymeeus/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymelcloud/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymemcache/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymemoize/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyment/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymeta3/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymetar/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymeteireann/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymeteoclimatic/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymetno/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymfy/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymicrobot/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymilter/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymilvus/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymitv/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymodbus/default.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymongo-inmemory/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymongo/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymoo/default.nix105
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymorphy2/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymorphy2/dicts-ru.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymorphy3/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymorphy3/dicts-ru.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymorphy3/dicts-uk.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pympler/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymsgbox/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymsteams/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymumble/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymunk/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymupdf/default.nix97
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymvglive/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymysensors/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymysql/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymysqlsa/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pymystem3/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynac/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynacl/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynamecheap/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynamodb/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynanoleaf/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pync/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynello/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynest2d/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynetbox/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynetdicom/default.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynetgear/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyngo/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyngrok/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynina/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynisher/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynmea2/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynndescent/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynobo/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynput/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynrrd/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynuki/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynut2/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynvim-pp/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynvim/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynvml/0001-locate-libnvidia-ml.so.1-on-NixOS.patch17
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynvml/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynws/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynx584/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pynzb/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyobihai/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyocd/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyocr/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyocr/paths.patch357
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyoctoprintapi/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyodbc/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyogg/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyogg/pyogg-paths.patch79
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyombi/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyomo/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyopencl/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyopengl-accelerate/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyopengl/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyopenssl/default.nix100
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyopenuv/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyopnsense/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyoppleio/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyorthanc/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyosf/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyosmium/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyotgw/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyotp/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyoutbreaksnearme/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyoverkiz/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyowm/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyownet/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyp/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypandoc/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypandoc/skip-tests.patch12
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypandoc/static-pandoc-path.patch12
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyparser/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyparsing/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyparted/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypass/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypass/mark-executables.patch255
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypblib/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypca/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypcap/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypck/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypdf/default.nix99
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypdf2/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypdf3/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypeg2/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypemicro/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyperclip/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyperf/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyperscan/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyphen/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyphotonfile/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypika/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypillowfight/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypinyin/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypiserver/default.nix91
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypitoken/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyplaato/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyplatec/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypng/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypoint/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypoolstation/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyppeteer/default.nix95
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyprecice/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypresence/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyprind/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyprof2calltree/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyproj/001.proj.patch48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyproj/default.nix110
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyproject-api/default.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyproject-hooks/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyproject-metadata/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyprosegur/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyprusalink/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypsrp/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyptlib/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypubsub/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypugjs/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypykatz/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pypytools/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqldb/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqrcode/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqt-builder/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqt-builder/use-sip-distinfo-from-path.patch20
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqt/5.x.nix203
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqt/6.x.nix148
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqt/pyqt5-confirm-license.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqt/pyqt5-fix-dbus-mainloop-support.patch80
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqt/pyqt6-sip.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqt/sip.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqt3d/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqt5-stubs/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqt6-charts.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqt6-webengine.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqtchart/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqtdatavisualization/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqtgraph/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqtwebengine/default.nix93
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqtwebengine/fix-build-with-qt-514.patch31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyquaternion/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyquery/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyquil/default.nix122
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqvrpro/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyqwikswitch/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrabbit2/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrad/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyradiomics/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyradios/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrainbird/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyramid-beaker/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyramid-chameleon/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyramid-chameleon/test-renderers-pyramid-import.patch11
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyramid-exclog/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyramid-jinja2/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyramid-mako/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyramid-multiauth/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyramid/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrate-limiter/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrdfa3/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyre-extensions/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyreaderwriterlock/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyreadstat/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrect/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyregion/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrender/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrevolve/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrfc3339/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrfxtrx/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyric/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrisco/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrituals/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrmvtransport/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyro-api/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyro-ppl/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyro4/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyro5/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrogram/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyroma/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyroute2/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrr/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrsistent/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrss2gen/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyrtlsdr/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysabnzbd/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysaj/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysam/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysaml2/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysaml2/hardcode-xmlsec1-path.patch39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysatochip/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysbd/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysc2/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysc2/fix-setup-for-py3.patch64
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysc2/parameterize-runconfig-sc2path.patch18
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyscard/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyscf/default.nix103
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyschedule/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyschemes/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyschlage/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyscreenshot/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyscreeze/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyscrypt/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyscss/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysdcp/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysdl2/PySDL2-dll.patch102
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysdl2/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysecuritas/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysendfile/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysensibo/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysensors/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysequoia/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyserial-asyncio-fast/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyserial-asyncio/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyserial/001-rfc2217-only-negotiate-on-value-change.patch42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyserial/002-rfc2217-timeout-setter-for-rfc2217.patch42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyserial/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysftp/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyshark/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyshp/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysiaalarm/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyside2-tools/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyside2-tools/remove_hacky_binary_copying.patch50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyside2/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyside2/dont_ignore_optional_modules.patch11
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyside6/default.nix86
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysigma-backend-elasticsearch/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysigma-backend-insightidr/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysigma-backend-opensearch/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysigma-backend-qradar/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysigma-backend-splunk/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysigma-pipeline-crowdstrike/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysigma-pipeline-sysmon/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysigma-pipeline-windows/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysigma/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysignalclirestapi/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysigset/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysim/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysimplegui/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysimplesoap/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysimplesoap/stringIO.patch31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysingleton/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyskyqhub/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyskyqremote/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyslim/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyslurm/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysma/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysmappee/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysmart/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysmartapp/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysmartdl/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysmartthings/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysmb/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysmbc/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysmf/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysmi/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysml/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysmt/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysnmp-pyasn1/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysnmp-pysmi/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysnmp/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysnmp/setup.py-Fix-the-setuptools-version-check.patch27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysnmplib/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysnooper/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysnooz/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysnow/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysocks/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysol-cards/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysolcast/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysolr/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysoma/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysonos/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyspark/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyspcwebgw/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyspellchecker/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyspf/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyspice/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyspiflash/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyspinel/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyspnego/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysptk/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyspx/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysqlcipher3/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysqlitecipher/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysqueezebox/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysrim/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysrt/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyssim/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pystache/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pystardict/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pystemd/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pystemmer/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/pystray/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysubs2/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysuez/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysvg-py3/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysvn/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysvn/replace-python-first.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyswitchbee/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyswitchbot/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysychonaut/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysyncobj/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pysyncthru/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytabix/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytablewriter/default.nix130
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytado/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytaglib/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytankerkoenig/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytap2/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytapo/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytautulli/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyte/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytenable/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytensor/default.nix102
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytesseract/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytesseract/tesseract-binary.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-aio/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-aiohttp/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-annotate/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-ansible/default.nix95
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-arraydiff/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-astropy-header/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-astropy/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-asyncio/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-asyncio/tests.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-base-url/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-bdd/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-benchmark/default.nix94
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-black/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-cases/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-catchlog/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-celery/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-check/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-cid/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-click/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-console-scripts/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-cov/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-cram/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-datadir/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-datafiles/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-dependency/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-describe/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-django/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-doctestplus/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-dotenv/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-emoji/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-env/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-error-for-skips/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-examples/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-expect/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-factoryboy/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-filter-subpackage/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-fixture-config/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-flake8/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-flakes/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-flask/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-forked/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-forked/setup-hook.sh25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-freezegun/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-freezer/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-golden/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-grpc/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-helpers-namespace/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-html/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-httpbin/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-httpserver/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-httpx/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-image-diff/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-instafail/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-isort/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-json-report/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-jupyter/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-lazy-fixture/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-localserver/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-logdog/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-md-report/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-metadata/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-mock/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-mockito/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-mockservers/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-mpl/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-mypy-plugins/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-mypy/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-openfiles/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-order/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-parallel/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-param-files/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-playwright/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-plt/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-postgresql/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-pudb/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-pylint/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-pytestrail/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-qt/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-quickcheck/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-raises/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-raisesregexp/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-raisin/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-random-order/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-randomly/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-recording/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-regressions/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-relaxed/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-remotedata/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-repeat/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-rerunfailures/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-resource-path/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-reverse/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-runner/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-server-fixtures/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-services/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-shutil/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-snapshot/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-socket/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-spec/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-subprocess/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-subtesthack/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-subtests/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-sugar/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-tap/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-test-utils/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-testinfra/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-testmon/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-timeout/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-tornado/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-tornasync/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-trio/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-twisted/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-unordered/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-vcr/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-virtualenv/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-voluptuous/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-warnings/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-watch/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-xdist/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-xdist/setup-hook.sh17
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-xprocess/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest-xvfb/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest/default.nix93
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytest/tests.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytestcache/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-arango/default.nix163
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-awair/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-axolotl-curve25519/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-axolotl/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-barcode/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-baseconv/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-benedict/default.nix94
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-bidi/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-binance/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-box/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-bsblan/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-cinderclient/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-codon-tables/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-constraint/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-creole/default.nix96
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-crfsuite/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-crontab/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-csxcad/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-ctags3/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-daemon/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-datemath/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-dbusmock/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-decouple/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-didl-lite/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-docs-theme/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-docx/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-doi/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-dotenv/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-ecobee-api/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-editor/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-efl/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-engineio/default.nix88
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-etcd/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-ethtool/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-ev3dev2/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-family-hub-local/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-fedora/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-flirt/Cargo.lock1698
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-flirt/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-fontconfig/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-frontmatter/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-fsutil/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-fullykiosk/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-fx/default.nix100
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-gammu/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-gitlab/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-glanceclient/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-gnupg/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-google-nest/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-gvm/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-heatclient/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-hglib/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-hl7/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-homewizard-energy/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-hosts/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-hpilo/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-http-client/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-i18n/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-ipmi/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-ipware/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-ironicclient/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-izone/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-jenkins/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-jose/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-json-logger/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-jsonrpc-server/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-juicenet/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-kasa/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-keycloak/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-keystoneclient/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-ldap-test/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-ldap/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-libnmap/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-linux-procfs/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-logstash/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-louvain/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-lsp-black/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-lsp-jsonrpc/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-lsp-ruff/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-lsp-server/default.nix171
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-ly/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-lzf/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-lzo/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-magic/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-magic/libmagic-path.patch28
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-manilaclient/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-manilaclient/tests.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-mapnik/default.nix148
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-mapnik/find-libmapnik.patch30
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-mapnik/find-pycairo-with-pkg-config.patch18
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-markdown-math/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-matter-server/default.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-mbedtls/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-memcached/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-miio/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-mimeparse/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-mnist/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-mpv-jsonipc/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-multipart/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-musicpd/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-myq/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-mystrom/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-ndn/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-nest/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-nmap/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-nomad/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-novaclient/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-nvd3/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-oauth2/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-olm/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-on-whales/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-opendata-transport/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-openems/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-opensky/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-openstackclient/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-openzwave-mqtt/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-osc/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-otbr-api/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-owasp-zap-v2-4/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-packer/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-pae/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-pam/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-periphery/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-picnic-api/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-pidfile/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-pipedrive/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-pkcs11/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-pptx/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-prctl/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-ptrace/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-rabbitair/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-rapidjson/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-redis-lock/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-registry/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-roborock/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-rtmidi/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-sat/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-simple-hipchat/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-slugify/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-smarttub/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-snap7/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-snappy/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-socketio/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-socks/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-songpal/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-sql/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-status/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-stdnum/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-string-utils/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-swiftclient/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-tado/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-tds/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-telegram-bot/default.nix134
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-telegram/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-toolbox/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-trovo/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-twitch-client/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-twitter/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-u2flib-host/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-u2flib-server/cryptography-37-compat.patch112
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-u2flib-server/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-uinput/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-ulid/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-unshare/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-utils/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-vagrant/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-velbus/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-vipaccess/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-vlc/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-vlc/vlc-paths.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-whois/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-wifi/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-wink/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-xmp-toolkit/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-xz/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-yate/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-youtube/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-zbar/0001-python-enum-fix-build-for-Python-3.11.patch61
-rw-r--r--nixpkgs/pkgs/development/python-modules/python-zbar/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/python3-application/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/python3-eventlib/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/python3-gnutls/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/python3-gnutls/libgnutls-path.patch42
-rw-r--r--nixpkgs/pkgs/development/python-modules/python3-openid/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/python3-saml/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/python_openzwave/cython.patch20
-rw-r--r--nixpkgs/pkgs/development/python-modules/python_openzwave/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pythondialog/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pythonegardia/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/pythonfinder/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/pythonix/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pythonnet/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/pythonnet/deps.nix194
-rw-r--r--nixpkgs/pkgs/development/python-modules/pythonocc-core/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/pythran/0001-hardcode-path-to-libgomp.patch79
-rw-r--r--nixpkgs/pkgs/development/python-modules/pythran/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytibber/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytidylib/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytile/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytimeparse/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytimeparse2/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytlv/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytm/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytmx/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytomlpp/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytomorrowio/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytoolconfig/default.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytools/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytorch-lightning/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytorch-metric-learning/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytorch-msssim/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytorch-pfn-extras/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytraccar/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytradfri/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytrafikverket/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytransportnsw/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytransportnswv2/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytrends/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytricia/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytrydan/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyttsx3/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytube/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytun/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyturbojpeg/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyturbojpeg/lib-path.patch28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytweening/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytz-deprecation-shim/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytz/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pytzdata/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyu2f/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyuavcan/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyuca/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyudev/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyunifi/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyunifiprotect/default.nix106
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyunpack/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyupdate/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyupgrade/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyuptimerobot/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyusb/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyuseragents/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyutil/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyutilib/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyuv/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvcd/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvera/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyverilog/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyversasense/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvesync/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvex/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvicare/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvips/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvirtualdisplay/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvis/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvisa-py/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvisa-sim/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvisa/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvista/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyviz-comms/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvizio/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvlx/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvmomi/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvo/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvolumio/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyvoro/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywal/convert.patch21
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywal/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywal/feh.patch39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywatchman/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywaterkotte/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywavelets/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywayland/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywaze/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywbem/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyweatherflowrest/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyweatherflowudp/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywebpush/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywebview/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywemo/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywerview/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywfa/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywilight/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywinrm/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywizlight/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pywlroots/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyworld/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyws66i/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyx/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyxattr/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyxb/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyxbe/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyxdg/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyxeoma/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyxiaomigateway/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyxl3/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyxlsb/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyxnat/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyyaml-env-tag/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyyaml-include/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyyaml/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyyardian/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyzbar/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyzerproc/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyzipper/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyzmq/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/pyzufall/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/qasync/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/qbittorrent-api/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/qcelemental/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/qcengine/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/qcodes-contrib-drivers/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/qcodes/default.nix162
-rw-r--r--nixpkgs/pkgs/development/python-modules/qcs-api-client/default.nix88
-rw-r--r--nixpkgs/pkgs/development/python-modules/qdarkstyle/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/qdldl/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/qdrant-client/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/qds-sdk/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/qgrid/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/qiling/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/qimage2ndarray/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/qingping-ble/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/qiskit-aer/default.nix158
-rw-r--r--nixpkgs/pkgs/development/python-modules/qiskit-finance/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/qiskit-ibmq-provider/default.nix105
-rw-r--r--nixpkgs/pkgs/development/python-modules/qiskit-ignis/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/qiskit-machine-learning/default.nix86
-rw-r--r--nixpkgs/pkgs/development/python-modules/qiskit-nature/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/qiskit-optimization/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/qiskit-terra/default.nix209
-rw-r--r--nixpkgs/pkgs/development/python-modules/qiskit/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/qmk-dotty-dict/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/qnap-qsw/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/qnapstats/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/qpageview/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/qpsolvers/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/qrcode/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/qreactor/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/qscintilla-qt5/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/qstylizer/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/qt-material/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/qt5reactor/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/qtawesome/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/qtconsole/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/qtile-extras/default.nix107
-rw-r--r--nixpkgs/pkgs/development/python-modules/qtile/default.nix102
-rw-r--r--nixpkgs/pkgs/development/python-modules/qtile/fix-restart.patch22
-rw-r--r--nixpkgs/pkgs/development/python-modules/qtile/wrapper.nix8
-rw-r--r--nixpkgs/pkgs/development/python-modules/qtpy/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/quadprog/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/qualysclient/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/quamash/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/quandl/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/quandl/pandas2-datetime-removal.patch33
-rw-r--r--nixpkgs/pkgs/development/python-modules/quantile-python/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/quantiphy-eval/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/quantiphy/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/quantities/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/quantulum3/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/quantum-gateway/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/quart-cors/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/quart/default.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/quaternion/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/qudida/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/querystring-parser/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/questionary/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/queuelib/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/qutip/default.nix94
-rw-r--r--nixpkgs/pkgs/development/python-modules/r2pipe/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/rachiopy/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/radian/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/radicale_infcloud/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/radio-beam/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/radios/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/radiotherm/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/radish-bdd/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/radon/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/railroad-diagrams/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/rainbowstream/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/rainbowstream/image.patch18
-rw-r--r--nixpkgs/pkgs/development/python-modules/raincloudy/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/ramlfications/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/random2/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/range-typed-integers/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/rangehttpserver/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/rank-bm25/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/rapidfuzz-capi/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/rapidfuzz/default.nix91
-rw-r--r--nixpkgs/pkgs/development/python-modules/rapidgzip/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/rapt-ble/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/rarfile/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/rasterio/default.nix124
-rw-r--r--nixpkgs/pkgs/development/python-modules/ratarmount/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/ratarmountcore/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/ratelim/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/ratelimit/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/rauth/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/raven/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/rawkit/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/ray/binary-hashes.nix11
-rw-r--r--nixpkgs/pkgs/development/python-modules/ray/default.nix167
-rw-r--r--nixpkgs/pkgs/development/python-modules/razdel/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/rbtools/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/rchitect/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/rcssmin/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/rdflib/default.nix104
-rw-r--r--nixpkgs/pkgs/development/python-modules/rdkit/default.nix161
-rw-r--r--nixpkgs/pkgs/development/python-modules/re-assert/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/reactivex/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/readability-lxml/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/readchar/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/readlike/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/readmdict/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/readme/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/readme_renderer/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/readthedocs-sphinx-ext/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/rebulk/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/recipe-scrapers/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/recline/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/recommonmark/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/recordlinkage/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/recurring-ical-events/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/recursive-pth-loader/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/recursive-pth-loader/sitecustomize.py46
-rw-r--r--nixpkgs/pkgs/development/python-modules/redbaron/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/redis-om/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/redis/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/redshift-connector/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/reedsolo/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/referencing/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/reflink/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/regenmaschine/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/regex/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/regional/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/reikna/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/related/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/relatorio/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/releases/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/remarshal/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/remi/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/remote-pdb/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/remotezip/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/renault-api/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/rencode/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/reolink-aio/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/reolink/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/reorder-python-imports/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/reparser/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/repath/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/repeated-test/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/repocheck/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/reportengine/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/reportlab/darwin-m1-compat.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/reportlab/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/repoze_lru/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/repoze_sphinx_autointerface/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/repoze_who/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/reproject/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/reprshed/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/reptor/default.nix111
-rw-r--r--nixpkgs/pkgs/development/python-modules/reqif/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-aws4auth/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-cache/default.nix127
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-credssp/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-file/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-futures/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-hawk/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-http-signature/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-kerberos/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-mock/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-oauthlib/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-pkcs12/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-ratelimiter/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-toolbelt/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-unixsocket/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests-wsgi-adapter/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests/default.nix94
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests_download/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/requests_ntlm/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/requestsexceptions/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/requirements-detector/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/requirements-parser/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/reretry/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/resampy/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/resize-right/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/resolvelib/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/responses/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/respx/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/restfly/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/restrictedpython/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/restructuredtext-lint/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/restview/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/result/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/rethinkdb/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/retry/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/retry_decorator/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/retrying/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/returns/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/rfc3339-validator/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/rfc3339/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/rfc3986-validator/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/rfc3986/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/rfc3987/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/rfc6555/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/rfc7464/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/rfcat/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/rflink/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/rich-argparse-plus/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/rich-argparse/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/rich-click/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/rich-pixels/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/rich-rst/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/rich/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/ring-doorbell/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/ripe-atlas-cousteau/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/ripe-atlas-sagan/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/riprova/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/ripser/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/riscof/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/riscof/make_writeable.patch25
-rw-r--r--nixpkgs/pkgs/development/python-modules/riscv-config/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/riscv-isac/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/rising/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/ritassist/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/rjpl/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/rjsmin/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/rki-covid-parser/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/rkm-codes/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/rlax/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/rlp/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/rmcl/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/rmrl/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/rmsd/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/rnc2rng/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/rnginline/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/rns/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/robomachine/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/robot-detection/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/robotframework-databaselibrary/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/robotframework-pythonlibcore/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/robotframework-requests/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/robotframework-selenium2library/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/robotframework-seleniumlibrary/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/robotframework-sshlibrary/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/robotframework-tools/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/robotframework/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/robotstatuschecker/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/robotsuite/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/rocket-errbot/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/roku/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/rokuecp/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/rollbar/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/roman/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/ronin/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/roombapy/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/roonapi/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/rope/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/ropgadget/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/ropper/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/rotary-embedding-torch/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/rouge-score/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/routeros-api/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/routes/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/rova/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/rpcq/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/rpdb/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/rpds-py/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/rpi-bad-power/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/rpi-gpio/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/rpi-gpio2/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/rplcd/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/rply/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/rpmfile/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/rpmfluff/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/rpy2/default.nix99
-rw-r--r--nixpkgs/pkgs/development/python-modules/rpy2/rpy2-3.x-r-libs-site.patch21
-rw-r--r--nixpkgs/pkgs/development/python-modules/rpyc/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/rq/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/rsa/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/rsskey/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/rst2ansi/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/rst2pdf/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/rstcheck-core/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/rstcheck/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/rtmidi-python/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/rtmixer/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/rtoml/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/rtp/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/rtree/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/rtslib/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/rtsp-to-webrtc/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/ruamel-base/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/ruamel-yaml-clib/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/ruamel-yaml-clib/fix-incompatible-function-pointers.patch79
-rw-r--r--nixpkgs/pkgs/development/python-modules/ruamel-yaml/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/rubymarshal/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/ruffus/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/rules/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/rustworkx/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/ruuvitag-ble/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/ruyaml/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/rx/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/rxv/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/rzpipe/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/s2clientprotocol/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/s2clientprotocol/pure-version.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/s3-credentials/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/s3fs/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/s3transfer/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/sabctools/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/sabyenc/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/sabyenc3/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/sacn/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/sacrebleu/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/sacremoses/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/safe-pysha3/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/safe/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/safeio/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/safetensors/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/safety/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/sagemaker/default.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/salmon-mail/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/sampledata/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/samplerate/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/samsungctl/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/samsungtvws/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/sane/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/saneyaml/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/sanic-auth/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/sanic-routing/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/sanic-testing/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/sanic-testing/tests.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/sanic/default.nix175
-rw-r--r--nixpkgs/pkgs/development/python-modules/sansio-multipart/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/sarge/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/sarif-om/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/sasmodels/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/scales/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/scancode-toolkit/default.nix176
-rw-r--r--nixpkgs/pkgs/development/python-modules/scapy/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/scapy/find-library.patch12
-rw-r--r--nixpkgs/pkgs/development/python-modules/schedule/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/schema-salad/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/schema/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/schemainspect/default.nix118
-rw-r--r--nixpkgs/pkgs/development/python-modules/schemdraw/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/schiene/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/schwifty/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-bio/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-build-core/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-build/default.nix95
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-fmm/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-fuzzy/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-hep-testdata/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-image/default.nix165
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-image/suppress-deprecation-warning.patch30
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-learn-extra/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-learn/default.nix105
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-misc/default.nix91
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-optimize/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-posthocs/0001-increased-abs-tolerance-for-wilcoxon-test.patch25
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-posthocs/0002-Update-test_posthocs.py.patch34
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-posthocs/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-rf/default.nix121
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-survival/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikit-tda/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikits-odes/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/scikits-samplerate/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/scim2-filter-parser/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/scipy/default.nix223
-rwxr-xr-xnixpkgs/pkgs/development/python-modules/scipy/update.sh31
-rw-r--r--nixpkgs/pkgs/development/python-modules/scmrepo/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/scooby/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/scour/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/scp/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/scramp/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/scrap-engine/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/scrapy-deltafetch/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/scrapy-fake-useragent/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/scrapy-splash/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/scrapy/default.nix166
-rw-r--r--nixpkgs/pkgs/development/python-modules/screed/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/screeninfo/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/screenlogicpy/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/scripttest/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/scs/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/sdds/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/sdkmanager/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/sdnotify/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/seaborn/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/seabreeze/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/seasonal/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/seatconnect/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/seccomp/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/secp256k1/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/secretstorage/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/sectools/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/secure/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/securesystemslib/default.nix96
-rw-r--r--nixpkgs/pkgs/development/python-modules/securetar/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/seedir/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/seekpath/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/segments/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/segno/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/segyio/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/selectors2/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/selectors2/mapping-import.patch14
-rw-r--r--nixpkgs/pkgs/development/python-modules/selenium/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/semantic-version/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/semaphore-bot/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/semver/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/send2trash/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/sendgrid/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/sense-energy/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/sensirion-ble/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/sensor-state-data/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/sensorpro-ble/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/sensorpush-ble/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/sentence-splitter/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/sentence-transformers/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/sentencepiece/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/sentinel/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/sentinels/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/sentry-sdk/default.nix158
-rw-r--r--nixpkgs/pkgs/development/python-modules/sepaxml/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/seqdiag/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/seqeval/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/serialio/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/serializable/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/serpent/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/serpy/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/servefile/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/serverfiles/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/serverlessrepo/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/service-identity/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/setproctitle/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/setupmeta/default.nix72
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools-changelog-shortener/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools-declarative-requirements/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools-generate/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools-gettext/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools-git-versioning/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools-git/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools-lint/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools-odoo/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools-rust/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools-rust/pyo3-test/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools-scm-git-archive/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools-scm/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools-scm/tests.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools-trial/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools/setuptools-distutils-C++.patch171
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools/tag-date.patch12
-rw-r--r--nixpkgs/pkgs/development/python-modules/setuptools_dso/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/seventeentrack/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/sexpdata/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/sfepy/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/sfrbox-api/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/sgmllib3k/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/sgp4/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/sh/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/shamir-mnemonic/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/shap/default.nix154
-rw-r--r--nixpkgs/pkgs/development/python-modules/shapely/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/sharedmem/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/sharkiq/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/shazamio/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/shellescape/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/shellingham/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/shiboken2/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/shiboken2/nix_compile_cflags.patch30
-rw-r--r--nixpkgs/pkgs/development/python-modules/shiboken6/default.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/shiboken6/fix-include-qt-headers.patch80
-rw-r--r--nixpkgs/pkgs/development/python-modules/shippai/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/shiv/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/shlib/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/shodan/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/shortuuid/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/should-dsl/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/shouldbe/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/show-in-file-manager/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/showit/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/shtab/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/shutilwhich/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/sievelib/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/signalslot/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/signedjson/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/signify/certificate-expiration-date.patch18
-rw-r--r--nixpkgs/pkgs/development/python-modules/signify/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/sigrok/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/sigrok/python-install.patch16
-rw-r--r--nixpkgs/pkgs/development/python-modules/sigstore-protobuf-specs/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/sigstore-rekor-types/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/sigtools/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/simanneal/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/simber/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/simpful/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/simple-di/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/simple-rest-client/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/simple-rlp/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/simple-salesforce/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/simple-websocket-server/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/simple-websocket/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/simpleaudio/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/simplebayes/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/simpleeval/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/simplefix/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/simplegeneric/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/simplehound/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/simpleitk/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/simplejson/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/simplekml/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/simplekv/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/simplemma/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/simplenote/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/simplepush/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/simplesat/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/simplisafe-python/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/simpy/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/single-source/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/single-version/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/siobrultech-protocols/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/siosocks/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/sip/4.x.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/sip/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/sipyco/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/sisyphus-control/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/siuba/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/six/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/sjcl/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/skein/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/skein/skeinjar.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/skia-pathops/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/skidl/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/skl2onnx/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/sklearn-deap/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/skodaconnect/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/skorch/default.nix86
-rw-r--r--nixpkgs/pkgs/development/python-modules/skrl/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/skybellpy/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/skyfield/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/skytemple-dtef/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/skytemple-eventserver/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/skytemple-files/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/skytemple-icons/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/skytemple-rust/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/skytemple-ssb-debugger/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/skytemple-ssb-emulator/Cargo.lock887
-rw-r--r--nixpkgs/pkgs/development/python-modules/skytemple-ssb-emulator/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/slack-bolt/default.nix125
-rw-r--r--nixpkgs/pkgs/development/python-modules/slack-sdk/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/slackclient/default.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/sleekxmpp/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/sleekxmpp/dnspython-ip6.patch55
-rw-r--r--nixpkgs/pkgs/development/python-modules/sleepyq/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/slicedimage/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/slicer/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/slicerator/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/slimit/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/slither-analyzer/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/slixmpp/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/slixmpp/hardcode-gnupg-path.patch26
-rw-r--r--nixpkgs/pkgs/development/python-modules/slob/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/slovnet/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/slowapi/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/slpp/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/slugid/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/sly/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/smart-meter-texas/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/smart-open/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/smarthab/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/smartypants/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/smbprotocol/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/smbus-cffi/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/smbus2/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/smdebug-rulesconfig/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/smhi-pkg/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/smmap/default.nix19
-rw-r--r--nixpkgs/pkgs/development/python-modules/smpp.pdu/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/smpplib/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/snakebite/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/snakeviz/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/snapcast/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/snapshottest/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/snaptime/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/sniffio/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/snitun/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/snorkel/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/snowballstemmer/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/snowflake-connector-python/default.nix107
-rw-r--r--nixpkgs/pkgs/development/python-modules/snowflake-sqlalchemy/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/snscrape/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/snuggs/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/social-auth-app-django/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/social-auth-core/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/socialscan/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/socid-extractor/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/socketio-client/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/sockio/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/sockjs-tornado/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/sockjs/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/socksio/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/socksipy-branch/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/soco/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/softlayer/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/solaredge/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/solax/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/solc-select/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/solo-python/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/somajo/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/somfy-mylink-synergy/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/sonarr/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/sonos-websocket/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/sopel/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/sopel/python311-support.patch96
-rw-r--r--nixpkgs/pkgs/development/python-modules/sorl-thumbnail/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/sortedcollections/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/sortedcontainers/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/soundcloud-v2/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/sounddevice/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/sounddevice/fix-portaudio-library-path.patch35
-rw-r--r--nixpkgs/pkgs/development/python-modules/soundfile/0001-Fix-build-on-linux-arm64.patch25
-rw-r--r--nixpkgs/pkgs/development/python-modules/soundfile/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/soupsieve/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/sourmash/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/soxr/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/spacy-alignments/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/spacy-loggers/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/spacy-pkuseg/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/spacy-transformers/annotation-test/annotate.py69
-rw-r--r--nixpkgs/pkgs/development/python-modules/spacy-transformers/annotation-test/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/spacy-transformers/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/spacy/annotation-test/annotate.py69
-rw-r--r--nixpkgs/pkgs/development/python-modules/spacy/annotation-test/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/spacy/default.nix126
-rw-r--r--nixpkgs/pkgs/development/python-modules/spacy/legacy.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/spacy/lookups-data.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/spacy/models.json506
-rw-r--r--nixpkgs/pkgs/development/python-modules/spacy/models.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/spake2/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/spark_parser/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/sparklines/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/sparqlwrapper/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/sparse/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/spdx-tools/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/speaklater/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/speaklater3/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/spectral-cube/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/speechbrain/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/speedtest-cli/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/speg/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/spglib/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphfile/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-argparse/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-autoapi/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-autobuild/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-autodoc-typehints/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-automodapi/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-basic-ng/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-better-theme/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-book-theme/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-codeautolink/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-comments/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-copybutton/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-design/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-external-toc/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-fortran/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-hoverxref/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-inline-tabs/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-intl/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-issues/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-jinja/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-jupyterbook-latex/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-markdown-parser/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-markdown-tables/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-material/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-mdinclude/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-multitoc-numbering/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-notfound-page/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-prompt/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-pytest/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-rtd-theme/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-serve/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-sitemap/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-tabs/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-testing/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-thebe/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-togglebutton/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx-version-warning/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinx/default.nix153
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-actdiag/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-apidoc/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-applehelp/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-asyncio/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-bayesnet/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-bibtex/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-blockdiag/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-confluencebuilder/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-devhelp/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-excel-table/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-fulltoc/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-htmlhelp/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-httpdomain/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-jquery/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-jsmath/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-katex/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-log-cabinet/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-mscgen/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-newsfeed/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-nwdiag/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-openapi/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-plantuml/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-programoutput/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-qthelp/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-seqdiag/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-serializinghtml/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-spelling/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-tikz/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-wavedrom/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-websupport/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxcontrib-youtube/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxemoji/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/sphinxext-opengraph/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/spiderpy/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/spidev/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/spinners/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/splinter/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/spotipy/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/spsdk/default.nix116
-rw-r--r--nixpkgs/pkgs/development/python-modules/spur/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/spyder-kernels/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/spyder/default.nix138
-rw-r--r--nixpkgs/pkgs/development/python-modules/spyder/dont-clear-pythonpath.patch25
-rw-r--r--nixpkgs/pkgs/development/python-modules/spyse-python/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqids/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-citext/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-continuum/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-i18n/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-jsonfield/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-migrate/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-migrate/python3.11-comp.diff13
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-mixins/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-utils/default.nix105
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-utils/skip-database-tests.patch34
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy-views/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlalchemy/default.nix156
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlbag/default.nix95
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlglot/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlite-fts4/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlite-migrate/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlite-utils/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlitedict/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlmap/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlmodel/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlobject/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlparse/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqlsoup/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/sqltrie/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/squarify/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/srp/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/srpenergy/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/srptools/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/srsly/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/srt/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/srvlookup/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/ssdeep/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/ssdp/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/ssdpy/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/sseclient-py/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/sseclient/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/sshfs/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/sshpubkeys/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/sshtunnel/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/sslib/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/stack-data/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/stanio/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/stanza/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/starkbank-ecdsa/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/starlette/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/starline/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/stashy/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/static3/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/staticjinja/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/staticjinja/test-minimal-template/default.nix11
-rw-r--r--nixpkgs/pkgs/development/python-modules/staticjinja/test-minimal-template/templates/include1
-rw-r--r--nixpkgs/pkgs/development/python-modules/staticjinja/test-minimal-template/templates/index1
-rw-r--r--nixpkgs/pkgs/development/python-modules/staticmap/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/statistics/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/statmake/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/statsd/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/statsmodels/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/std2/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/stdiomask/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/stdlib-list/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/stdlibs/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/steamodd/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/steamship/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/stem/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/stemming/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/stestr/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/stestr/tests.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/stevedore/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/stickytape/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/stim/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/stix2-patterns/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/stm32loader/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/stone/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/stookalert/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/stopit/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/stransi/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/strategies/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/stravalib/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/strawberry-graphql/default.nix186
-rw-r--r--nixpkgs/pkgs/development/python-modules/streamdeck/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/streamdeck/hardcode-libusb.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/streaming-form-data/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/streamlabswater/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/streamlit/default.nix95
-rw-r--r--nixpkgs/pkgs/development/python-modules/streamz/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/strenum/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/strict-rfc3339/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/strictyaml/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/stringcase/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/stringly/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/stringparser/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/stripe/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/striprtf/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/structlog/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/stubserver/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/stumpy/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/stups-cli-support/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/stups-fullstop/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/stups-pierone/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/stups-tokens/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/stups-zign/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/stytra/0000-workaround-pyqtgraph.patch26
-rw-r--r--nixpkgs/pkgs/development/python-modules/stytra/default.nix93
-rw-r--r--nixpkgs/pkgs/development/python-modules/subarulink/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/subliminal/default.nix95
-rw-r--r--nixpkgs/pkgs/development/python-modules/subprocess-tee/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/subunit/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/subunit2sql/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/subzerod/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/succulent/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/summarytools/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/sumo/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/sumtypes/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/sunpy/default.nix164
-rw-r--r--nixpkgs/pkgs/development/python-modules/sunwatcher/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/sunweg/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/superqt/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/supervise-api/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/supervisor/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/sure/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/surepy/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/surt/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/survey/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/sv-ttk/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/svg-path/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/svg2tikz/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/svgelements/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/svglib/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/svgwrite/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/swagger-spec-validator/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/swagger-ui-bundle/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/swift/default.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/swisshydrodata/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/swspotify/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/sybil/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/symengine/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/sympy/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/syncedlyrics/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/syncer/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/synergy/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/synologydsm-api/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/syrupy/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/syslog-rfc5424-formatter/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/systembridge/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/systemd/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/sysv_ipc/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/tabcmd/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/tableaudocumentapi/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/tableauserverclient/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/tabledata/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/tables/default.nix117
-rw-r--r--nixpkgs/pkgs/development/python-modules/tablib/default.nix96
-rw-r--r--nixpkgs/pkgs/development/python-modules/tabula-py/default.nix80
-rw-r--r--nixpkgs/pkgs/development/python-modules/tabulate/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/tabview/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/tadasets/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/tag-expressions/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/tago/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/tagoio-sdk/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/tahoma-api/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/tailer/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/tailscale/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/takethetime/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/tank-utility/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/tappy/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/tasklib/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/taskw/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/taskw/support-relative-path-in-taskrc.patch79
-rw-r--r--nixpkgs/pkgs/development/python-modules/taskw/use-template-for-taskwarrior-install-path.patch14
-rw-r--r--nixpkgs/pkgs/development/python-modules/tatsu/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/taxi/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/tbats/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/tblib/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/tbm-utils/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/tcolorpy/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/tcxparser/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/tcxreader/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/teamcity-messages/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/telegram-text/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/telegram/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/telegraph/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/telepath/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/telethon-session-sqlalchemy/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/telethon/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/teletype/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/telfhash/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/tellduslive/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/temescal/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/temperusb/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/tempest/default.nix93
-rw-r--r--nixpkgs/pkgs/development/python-modules/tempita/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/tempora/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/tenacity/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorboard-data-server/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorboard-plugin-profile/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorboard-plugin-wit/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorboard/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorboardx/default.nix84
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow-datasets/corruptions.patch22
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow-datasets/default.nix180
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow-estimator/bin.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow-metadata/build.patch15
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow-metadata/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow-probability/default.nix121
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow/absl_py_argparse_flags.patch11
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow/absl_to_std.patch389
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow/bin.nix214
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow/binary-hashes.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow/com_google_absl_add_log.patch166
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow/com_google_absl_fix_macos.patch15
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow/default.nix602
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow/llvm_bazel_fix_macos_10_12_sdk.patch12
-rwxr-xr-xnixpkgs/pkgs/development/python-modules/tensorflow/prefetcher.sh43
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow/protobuf_python.patch19
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow/pybind11_protobuf_newer_version.patch16
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorflow/pybind11_protobuf_python_runtime_dep.patch30
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorly/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorrt/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/tensorstore/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/termcolor/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/termgraph/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/terminado/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/terminaltables/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/termplotlib/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/termplotlib/gnuplot-subprocess.patch26
-rw-r--r--nixpkgs/pkgs/development/python-modules/termstyle/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/tern/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/tesla-powerwall/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/tesla-wall-connector/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/teslajsonpy/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/tess/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/tesserocr/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/test-tube/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/testbook/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/testcontainers/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/testfixtures/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/testing-common-database/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/testing-postgresql/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/testpath/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/testrail-api/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/testrepository/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/testresources/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/testscenarios/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/testtools/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/text-unidecode/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/textacy/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/textdistance/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/textfsm/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/textile/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/textnets/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/textparser/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/texttable/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/textual-dev/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/textual-universal-directorytree/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/textual/default.nix86
-rw-r--r--nixpkgs/pkgs/development/python-modules/textwrap3/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/textx/default.nix177
-rw-r--r--nixpkgs/pkgs/development/python-modules/textx/tests.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/tf2onnx/default.nix86
-rw-r--r--nixpkgs/pkgs/development/python-modules/tflearn/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/tftpy/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/tgcrypto/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/theano-pymc/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/theano/default.nix106
-rw-r--r--nixpkgs/pkgs/development/python-modules/thefuzz/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/thelogrus/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/thermobeacon-ble/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/thermopro-ble/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/thespian/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/thinc/default.nix104
-rw-r--r--nixpkgs/pkgs/development/python-modules/thorlabspm100/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/threadloop/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/threadpool/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/threadpoolctl/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/threat9-test-bed/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/three-merge/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/thrift/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/thriftpy2/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/throttler/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/thumborpexif/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/tidalapi/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/tidyexc/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/tifffile/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/tika-client/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/tika/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/tiktoken/Cargo.lock394
-rw-r--r--nixpkgs/pkgs/development/python-modules/tiktoken/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/tikzplotlib/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/tiledb/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/tilequant/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/tiler/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/tilestache/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/tilt-ble/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/time-machine/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/timeago/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/timecop/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/timelib/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/timeout-decorator/default.nix16
-rw-r--r--nixpkgs/pkgs/development/python-modules/timeslot/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/timetagger/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/timezonefinder/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/timm/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/tiny-proxy/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/tinycss/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/tinycss2/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/tinydb/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/tinyobjloader-py/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/tinyrecord/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/tissue/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/titlecase/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/tkinter/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/tld/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/tldextract/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/tlds/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/tls-parser/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/tlsh/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/tlslite-ng/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/tlslite/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/tlv8/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/tmb/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/todoist-api-python/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/todoist/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/toggl-cli/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/token-bucket/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/tokenize-rt/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/tokenizers/Cargo.lock1261
-rw-r--r--nixpkgs/pkgs/development/python-modules/tokenizers/default.nix146
-rw-r--r--nixpkgs/pkgs/development/python-modules/tokenlib/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/tokentrim/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/tololib/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/toml-adapt/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/toml/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/tomli-w/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/tomli/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/tomlkit/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/toolz/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/toonapi/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/toposort/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/torch-tb-profiler/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/torch/bin.nix116
-rw-r--r--nixpkgs/pkgs/development/python-modules/torch/binary-hashes.nix91
-rw-r--r--nixpkgs/pkgs/development/python-modules/torch/default.nix494
-rw-r--r--nixpkgs/pkgs/development/python-modules/torch/fix-cmake-cuda-toolkit.patch65
-rwxr-xr-xnixpkgs/pkgs/development/python-modules/torch/prefetch.sh53
-rw-r--r--nixpkgs/pkgs/development/python-modules/torch/pthreadpool-disable-gcd.diff45
-rw-r--r--nixpkgs/pkgs/development/python-modules/torch/pytorch-pr-108847.patch31
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchaudio/bin.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchaudio/binary-hashes.nix91
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchaudio/default.nix93
-rwxr-xr-xnixpkgs/pkgs/development/python-modules/torchaudio/prefetch.sh53
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchdiffeq/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchgpipe/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchinfo/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchio/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchlibrosa/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchmetrics/default.nix98
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchsde/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchvision/bin.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchvision/binary-hashes.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/torchvision/default.nix91
-rwxr-xr-xnixpkgs/pkgs/development/python-modules/torchvision/prefetch.sh48
-rw-r--r--nixpkgs/pkgs/development/python-modules/tornado/4.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/tornado/5.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/tornado/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/torpy/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/torrent-parser/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/torrequest/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/total-connect-client/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/towncrier/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/tox/default.nix79
-rw-r--r--nixpkgs/pkgs/development/python-modules/tplink-omada-client/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/tpm2-pytss/default.nix111
-rw-r--r--nixpkgs/pkgs/development/python-modules/tpm2-pytss/fapi-config.patch12
-rw-r--r--nixpkgs/pkgs/development/python-modules/tqdm/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/traceback2/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/tracerite/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/tracing/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/trackpy/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/trailrunner/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/trainer/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/traitlets/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/traits/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/traitsui/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/traittypes/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/trampoline/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/transaction/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/transformers/default.nix182
-rw-r--r--nixpkgs/pkgs/development/python-modules/transforms3d/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/transitions/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/translatehtml/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/translatepy/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/translationstring/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/transmission-rpc/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/transmissionrpc/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/trectools/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/tree-sitter/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/treelib/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/treelog/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/treeo/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/treex/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/treq/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/trezor/default.nix86
-rw-r--r--nixpkgs/pkgs/development/python-modules/trezor_agent/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/trfl/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/trimesh/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/trino-python-client/default.nix81
-rw-r--r--nixpkgs/pkgs/development/python-modules/trio-asyncio/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/trio-websocket/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/trio/default.nix94
-rw-r--r--nixpkgs/pkgs/development/python-modules/tritonclient/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/troposphere/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/trove-classifiers/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/trueskill/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/trustme/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/truststore/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/trytond/default.nix87
-rw-r--r--nixpkgs/pkgs/development/python-modules/tsfresh/default.nix93
-rw-r--r--nixpkgs/pkgs/development/python-modules/tsfresh/remove-pyscaffold.patch14
-rw-r--r--nixpkgs/pkgs/development/python-modules/tsfresh/remove-pytest-coverage-flags.patch15
-rw-r--r--nixpkgs/pkgs/development/python-modules/tskit/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/ttach/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/ttls/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/ttp-templates/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/ttp/default.nix111
-rw-r--r--nixpkgs/pkgs/development/python-modules/ttstokenizer/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/tubes/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/tubeup/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/tuf/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/tunigo/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/turnt/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/tuya-iot-py-sdk/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/tuyaha/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/tvdb-api/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/tweedledum/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/tweepy/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/twentemilieu/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/twiggy/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/twilio/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/twill/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/twine/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/twinkly-client/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/twisted/default.nix205
-rw-r--r--nixpkgs/pkgs/development/python-modules/twitch-python/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/twitchapi/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/twitter-common-collections/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/twitter-common-confluence/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/twitter-common-dirutil/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/twitter-common-lang/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/twitter-common-log/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/twitter-common-options/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/twitter/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/twitterapi/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/twofish/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/txaio/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/txamqp/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/txdbus/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/txgithub/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/txi2p-tahoe/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/txredisapi/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/txrequests/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/txtai/default.nix156
-rw-r--r--nixpkgs/pkgs/development/python-modules/txtorcon/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/txzmq/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/type-infer/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/typechecks/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/typecode/default.nix74
-rw-r--r--nixpkgs/pkgs/development/python-modules/typecode/libmagic.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/typed-ast/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/typed-settings/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/typeguard/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/typepy/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/typer/default.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-aiobotocore-packages/default.nix752
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-aiobotocore/default.nix1824
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-appdirs/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-awscrt/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-beautifulsoup4/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-click/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-colorama/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-dateutil/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-decorator/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-deprecated/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-docopt/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-docutils/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-enum34/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-freezegun/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-futures/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-html5lib/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-ipaddress/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-mock/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-pillow/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-protobuf/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-psutil/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-pyopenssl/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-python-dateutil/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-pytz/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-pyyaml/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-redis/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-requests/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-retry/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-s3transfer/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-setuptools/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-tabulate/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-toml/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-tqdm/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-typed-ast/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-ujson/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/types-urllib3/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/typesentry/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/typesystem/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/typical/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/typing-extensions/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/typing-inspect/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/typish/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/typogrify/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/tzdata/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/tzlocal/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/u-msgpack-python/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/ua-parser/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/ua-parser/dont-fetch-submodule.patch17
-rw-r--r--nixpkgs/pkgs/development/python-modules/uamqp/clang-fix-incompatible-function-pointer-conversion.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/uamqp/darwin-azure-c-shared-utility-corefoundation.patch37
-rw-r--r--nixpkgs/pkgs/development/python-modules/uamqp/default.nix94
-rw-r--r--nixpkgs/pkgs/development/python-modules/uarray/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/uasiren/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/ubelt/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/uc-micro-py/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/ucsmsdk/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/udatetime/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/ueagle/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/ueberzug/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/ufmt/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/ufo2ft/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/ufo2ft/fonttools-cu2qu.patch130
-rw-r--r--nixpkgs/pkgs/development/python-modules/ufoLib2/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/ufonormalizer/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/ufoprocessor/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/uharfbuzz/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/uhi/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/ujson/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/ukkonen/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/ukpostcodeparser/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/ukrainealarm/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/ulid-transform/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/ultraheat-api/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/umalqurra/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/umap-learn/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/umodbus/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/unasync/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/uncertainties/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/uncompyle6/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/unearth/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/unicode-slugify/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/unicodecsv/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/unicodedata2/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/unicorn/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/unicrypto/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/unicurses/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/unidecode/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/unidic-lite/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/unidic/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/unidic/fix-download-directory.patch23
-rw-r--r--nixpkgs/pkgs/development/python-modules/unidiff/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/unifi-discovery/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/unifi/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/unifiled/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/unify/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/units/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/unittest-data-provider/default.nix21
-rw-r--r--nixpkgs/pkgs/development/python-modules/unittest-xml-reporting/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/univers/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/universal-pathlib/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/universal-silabs-flasher/default.nix73
-rw-r--r--nixpkgs/pkgs/development/python-modules/unpaddedbase64/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/unrardll/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/unrpa/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/unstructured-api-tools/default.nix93
-rw-r--r--nixpkgs/pkgs/development/python-modules/unstructured-inference/default.nix99
-rw-r--r--nixpkgs/pkgs/development/python-modules/unstructured/default.nix145
-rw-r--r--nixpkgs/pkgs/development/python-modules/untangle/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/untokenize/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/uonet-request-signer-hebe/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/upass/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/upb-lib/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/upcloud-api/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/update-copyright/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/update-dotdee/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/update_checker/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/upnpy/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/uproot/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/uptime-kuma-api/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/uptime-kuma-monitor/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/uptime/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/uqbar/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/uranium/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/uri-template/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/uritemplate/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/uritools/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/url-normalize/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/urlextract/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/urlgrabber/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/urllib3/default.nix93
-rw-r--r--nixpkgs/pkgs/development/python-modules/urlman/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/urlpy/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/urwid-mitmproxy/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/urwid-readline/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/urwid/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/urwidtrees/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/us/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/usb-devices/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/usbtmc/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/user-agents/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/userpath/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/ush/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/usort/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/utils/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/uuid/default.nix16
-rw-r--r--nixpkgs/pkgs/development/python-modules/uvcclient/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/uvicorn/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/uvicorn/tests.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/uvloop/default.nix99
-rw-r--r--nixpkgs/pkgs/development/python-modules/vaa/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/validate-email/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/validators/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/validobj/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/validphys2/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/vallox-websocket-api/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/vapoursynth/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/variants/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/varint/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/vat-moss/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/vcard/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/vcrpy/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/vcver/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/vcversioner/default.nix17
-rw-r--r--nixpkgs/pkgs/development/python-modules/vdf/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/vdirsyncer/default.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/vector/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/vega-datasets/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/vega/default.nix88
-rw-r--r--nixpkgs/pkgs/development/python-modules/vehicle/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/velbus-aio/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/venstarcolortouch/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/venusian/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/verboselogs/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/versioneer/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/versionfinder/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/versioningit/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/versiontag/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/versiontools/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/verspec/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/vertica-python/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/veryprettytable/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/vg/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/videocr/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/vidstab/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/viewstate/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/vilfo-api-client/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/vincenty/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/vine/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/virtkey/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/virtualenv-clone/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/virtualenv/default.nix94
-rw-r--r--nixpkgs/pkgs/development/python-modules/virtualenvwrapper/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/visitor/default.nix18
-rw-r--r--nixpkgs/pkgs/development/python-modules/vispy/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/vispy/library-paths.patch39
-rw-r--r--nixpkgs/pkgs/development/python-modules/viv-utils/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/vivisect/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/vmprof/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/vncdo/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/vobject/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/volatile/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/volkszaehler/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/voluptuous-serialize/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/voluptuous-stubs/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/voluptuous/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/volvooncall/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/vowpalwabbit/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/vpk/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/vqgan-jax/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/vsts-cd-manager/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/vsts/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/vsure/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/vt-py/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/vulcan-api/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/vultr/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/vulture/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/vxi11/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/w1thermsensor/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/w3lib/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/wadllib/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/wagtail-factories/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/wagtail-factories/tests.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/wagtail-localize/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/wagtail/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/wagtail/tests.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/waitress-django/default.nix16
-rw-r--r--nixpkgs/pkgs/development/python-modules/waitress-django/setup.py12
-rwxr-xr-xnixpkgs/pkgs/development/python-modules/waitress-django/src/waitress-serve-django14
-rw-r--r--nixpkgs/pkgs/development/python-modules/waitress/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/wakeonlan/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/wallbox/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/walrus/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/wand/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/wandb/default.nix297
-rw-r--r--nixpkgs/pkgs/development/python-modules/wandb/hardcode-git-path.patch57
-rw-r--r--nixpkgs/pkgs/development/python-modules/waqiasync/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/warble/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/warcio/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/ward/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/warlock/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/warrant-lite/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/warrant/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/wasabi/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/wasmer/default.nix106
-rw-r--r--nixpkgs/pkgs/development/python-modules/wasmer/tests.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/wasserstein/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/watchdog-gevent/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/watchdog/default.nix110
-rw-r--r--nixpkgs/pkgs/development/python-modules/watchdog/force-kqueue.patch26
-rw-r--r--nixpkgs/pkgs/development/python-modules/watchfiles/default.nix89
-rw-r--r--nixpkgs/pkgs/development/python-modules/watchgod/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/waterfurnace/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/watermark/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/wavedrom/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/wavefile/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/wavefile/libsndfile.py.patch18
-rw-r--r--nixpkgs/pkgs/development/python-modules/wavinsentio/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/wazeroutecalculator/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/wcag-contrast-ratio/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/wcmatch/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/wcwidth/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/weasel/default.nix83
-rw-r--r--nixpkgs/pkgs/development/python-modules/weasyprint/default.nix107
-rw-r--r--nixpkgs/pkgs/development/python-modules/weasyprint/library-paths.patch31
-rw-r--r--nixpkgs/pkgs/development/python-modules/weaviate-client/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/web-cache/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/web/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/web3/default.nix71
-rw-r--r--nixpkgs/pkgs/development/python-modules/webargs/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/webassets/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/webauthn/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/webcolors/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/webdav4/default.nix100
-rw-r--r--nixpkgs/pkgs/development/python-modules/webdavclient3/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/webencodings/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/webexteamssdk/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/webhelpers/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/webob/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/weboob/default.nix97
-rw-r--r--nixpkgs/pkgs/development/python-modules/webrtc-noise-gain/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/webrtcvad/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/websocket-client/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/websockets/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/websockify/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/webssh/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/webtest-aiohttp/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/webtest/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/webthing-ws/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/webthing/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/weconnect-mqtt/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/weconnect/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/werkzeug/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/west/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/wfuzz/default.nix82
-rw-r--r--nixpkgs/pkgs/development/python-modules/wget/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/whatthepatch/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/wheel-filename/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/wheel-inspect/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/wheel/0001-tests-Rename-a-a-o-_-.py-_-.py.patch34
-rw-r--r--nixpkgs/pkgs/development/python-modules/wheel/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/wheezy-captcha/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/wheezy-template/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/whichcraft/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/whirlpool-sixth-sense/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/whisper/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/whispers/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/whitenoise/default.nix65
-rw-r--r--nixpkgs/pkgs/development/python-modules/whodap/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/whois-api/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/whois/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/whoosh/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/widgetsnbextension/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/widlparser/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/wiffi/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/wifi/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/wikipedia-api/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/wikipedia/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/wikitextparser/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/willow/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/winacl/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/winsspi/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/withings-api/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/withings-sync/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/wktutils/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/wled/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/wn/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/woob/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/woodblock/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/wordcloud/default.nix70
-rw-r--r--nixpkgs/pkgs/development/python-modules/wordfreq/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/worldengine/default.nix77
-rw-r--r--nixpkgs/pkgs/development/python-modules/wrapio/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/wrapt/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/wrf-python/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/ws4py/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/wsdiscovery/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/wsgi-intercept/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/wsgidav/default.nix63
-rw-r--r--nixpkgs/pkgs/development/python-modules/wsgiprox/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/wsgiproxy2/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/wsgitools/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/wsme/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/wsnsimpy/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/wsproto/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/wtf-peewee/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/wtforms/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/wurlitzer/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/wxPython/4.2-ctypes.patch18
-rw-r--r--nixpkgs/pkgs/development/python-modules/wxPython/4.2.nix136
-rw-r--r--nixpkgs/pkgs/development/python-modules/wyoming/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/x-wr-timezone/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/x11-hash/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/x256/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/xapian/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/xapp/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/xarray-einstats/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/xarray/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/xattr/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/xbox-webapi/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/xboxapi/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/xcffib/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/xdg-base-dirs/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/xdg/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/xdis/default.nix69
-rw-r--r--nixpkgs/pkgs/development/python-modules/xdoctest/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/xdot/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/xformers/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/xgboost/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/xhtml2pdf/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/xiaomi-ble/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/xkbcommon/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/xkcdpass/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/xknx/default.nix76
-rw-r--r--nixpkgs/pkgs/development/python-modules/xknxproject/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/xlib/default.nix61
-rw-r--r--nixpkgs/pkgs/development/python-modules/xlib/fix-no-protocol-specified.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/xlrd/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/xlsx2csv/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/xlsxwriter/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/xlwt/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/xmind/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/xml-marshaller/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/xml2rfc/default.nix97
-rw-r--r--nixpkgs/pkgs/development/python-modules/xmldiff/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/xmljson/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/xmlschema/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/xmlsec/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/xmltodict/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/xmodem/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/xnatpy/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/xnd/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/xpath-expressions/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/xpybutil/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/xsdata/default.nix92
-rw-r--r--nixpkgs/pkgs/development/python-modules/xstatic-asciinema-player/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/xstatic-bootbox/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/xstatic-bootstrap/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/xstatic-font-awesome/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/xstatic-jquery-file-upload/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/xstatic-jquery-ui/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/xstatic-jquery/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/xstatic-pygments/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/xstatic/default.nix25
-rw-r--r--nixpkgs/pkgs/development/python-modules/xtensor-python/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/xvfbwrapper/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/xxhash/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/xyzservices/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/y-py/default.nix50
-rw-r--r--nixpkgs/pkgs/development/python-modules/yabadaba/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/yacs/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/yahooweather/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/yalesmartalarmclient/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/yalexs-ble/default.nix64
-rw-r--r--nixpkgs/pkgs/development/python-modules/yalexs/default.nix66
-rw-r--r--nixpkgs/pkgs/development/python-modules/yamale/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/yamlfix/default.nix55
-rw-r--r--nixpkgs/pkgs/development/python-modules/yamllint/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/yamlloader/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/yamlordereddictloader/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/yanc/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/yangson/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/yapf/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/yappi/default.nix45
-rw-r--r--nixpkgs/pkgs/development/python-modules/yappi/tests.patch14
-rw-r--r--nixpkgs/pkgs/development/python-modules/yapsy/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/yara-python/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/yaramod/default.nix78
-rw-r--r--nixpkgs/pkgs/development/python-modules/yarg/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/yargy/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/yark/default.nix57
-rw-r--r--nixpkgs/pkgs/development/python-modules/yarl/default.nix67
-rw-r--r--nixpkgs/pkgs/development/python-modules/yasi/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/yaspin/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/yaswfp/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/yattag/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/ydiff/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/yeelight/default.nix54
-rw-r--r--nixpkgs/pkgs/development/python-modules/yfinance/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/yolink-api/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/youless-api/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/youtube-search-python/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/youtube-search/default.nix37
-rw-r--r--nixpkgs/pkgs/development/python-modules/youtube-transcript-api/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/yowsup/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/yoyo-migrations/default.nix36
-rw-r--r--nixpkgs/pkgs/development/python-modules/ypy-websocket/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/yq/default.nix56
-rw-r--r--nixpkgs/pkgs/development/python-modules/yq/jq-path.patch26
-rw-r--r--nixpkgs/pkgs/development/python-modules/yte/default.nix59
-rw-r--r--nixpkgs/pkgs/development/python-modules/ytmusicapi/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/yubico-client/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/yubico/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/z3c-checkversions/default.nix34
-rw-r--r--nixpkgs/pkgs/development/python-modules/zadnegoale/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/zamg/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/zarr/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/zbaemon/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/zc_lockfile/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/zcbor/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/zconfig/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/zconfig/remove-setlocale-test.patch24
-rw-r--r--nixpkgs/pkgs/development/python-modules/zcs/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/zcs/fix-test-yaml.patch13
-rw-r--r--nixpkgs/pkgs/development/python-modules/zdaemon/default.nix38
-rw-r--r--nixpkgs/pkgs/development/python-modules/zeep/default.nix90
-rw-r--r--nixpkgs/pkgs/development/python-modules/zephyr-python-api/default.nix35
-rw-r--r--nixpkgs/pkgs/development/python-modules/zeroc-ice/default.nix23
-rw-r--r--nixpkgs/pkgs/development/python-modules/zeroconf/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/zerorpc/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/zetup/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/zeversolarlocal/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/zfec/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/zha-quirks/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/ziafont/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/ziamath/default.nix53
-rw-r--r--nixpkgs/pkgs/development/python-modules/zict/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/zigpy-cc/default.nix62
-rw-r--r--nixpkgs/pkgs/development/python-modules/zigpy-deconz/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/zigpy-xbee/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/zigpy-zigate/default.nix60
-rw-r--r--nixpkgs/pkgs/development/python-modules/zigpy-znp/default.nix68
-rw-r--r--nixpkgs/pkgs/development/python-modules/zigpy/default.nix85
-rw-r--r--nixpkgs/pkgs/development/python-modules/zimports/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/zipfile2/default.nix27
-rw-r--r--nixpkgs/pkgs/development/python-modules/zipfile2/no-setuid.patch15
-rw-r--r--nixpkgs/pkgs/development/python-modules/zipp/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/zipstream-new/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/zipstream-ng/default.nix41
-rw-r--r--nixpkgs/pkgs/development/python-modules/zipstream/default.nix20
-rw-r--r--nixpkgs/pkgs/development/python-modules/zm-py/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/zodb/default.nix58
-rw-r--r--nixpkgs/pkgs/development/python-modules/zodbpickle/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope-cachedescriptors/default.nix40
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope-component/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope-contenttype/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope-deferredimport/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope-deprecation/default.nix46
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope-dottedname/default.nix49
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope-hookable/default.nix24
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope-i18nmessageid/default.nix39
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope-lifecycleevent/default.nix44
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope-proxy/default.nix42
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope-testbrowser/default.nix75
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope_configuration/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope_copy/default.nix31
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope_event/default.nix22
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope_exceptions/default.nix28
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope_filerepresentation/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope_interface/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope_location/default.nix32
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope_schema/default.nix33
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope_size/default.nix26
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope_testing/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/zope_testrunner/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/zopfli/default.nix30
-rw-r--r--nixpkgs/pkgs/development/python-modules/zstandard/default.nix43
-rw-r--r--nixpkgs/pkgs/development/python-modules/zstd/default.nix52
-rw-r--r--nixpkgs/pkgs/development/python-modules/zulip/default.nix48
-rw-r--r--nixpkgs/pkgs/development/python-modules/zwave-js-server-python/default.nix51
-rw-r--r--nixpkgs/pkgs/development/python-modules/zwave-me-ws/default.nix47
-rw-r--r--nixpkgs/pkgs/development/python-modules/zxcvbn/default.nix29
-rw-r--r--nixpkgs/pkgs/development/python-modules/zxing-cpp/default.nix53
7196 files changed, 373317 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/python-modules/3to2/default.nix b/nixpkgs/pkgs/development/python-modules/3to2/default.nix
new file mode 100644
index 000000000000..18e93a1ff77a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/3to2/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "py3to2";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "3to2";
+    extension = "zip";
+    sha256 = "fef50b2b881ef743f269946e1090b77567b71bb9a9ce64b7f8e699b562ff685c";
+  };
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test lib3to2/tests
+  '';
+
+  # Test failing due to upstream issue (https://bitbucket.org/amentajo/lib3to2/issues/50/testsuite-fails-with-new-python-35)
+  doCheck = false;
+
+  meta = {
+    homepage = "https://bitbucket.org/amentajo/lib3to2";
+    description = "Refactors valid 3.x syntax into valid 2.x syntax, if a syntactical conversion is possible";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ mt-caret ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/Cython/default.nix b/nixpkgs/pkgs/development/python-modules/Cython/default.nix
new file mode 100644
index 000000000000..c2bb5811336d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Cython/default.nix
@@ -0,0 +1,88 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, python
+, pkg-config
+, gdb
+, numpy
+, ncurses
+}:
+
+let
+  excludedTests = [ "reimport_from_subinterpreter" ]
+    # cython's testsuite is not working very well with libc++
+    # We are however optimistic about things outside of testsuite still working
+    ++ lib.optionals (stdenv.cc.isClang or false) [ "cpdef_extern_func" "libcpp_algo" ]
+    # Some tests in the test suite isn't working on aarch64. Disable them for
+    # now until upstream finds a workaround.
+    # Upstream issue here: https://github.com/cython/cython/issues/2308
+    ++ lib.optionals stdenv.isAarch64 [ "numpy_memoryview" ]
+    ++ lib.optionals stdenv.isi686 [ "future_division" "overflow_check_longlong" ]
+  ;
+
+in buildPythonPackage rec {
+  pname = "cython";
+  version = "0.29.36";
+
+  src = fetchPypi {
+    pname = "Cython";
+    inherit version;
+    hash = "sha256-QcDP0tdU44PJ7rle/8mqSrhH0Ml0cHfd18Dctow7wB8=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  nativeCheckInputs = [
+    gdb numpy ncurses
+  ];
+
+  LC_ALL = "en_US.UTF-8";
+
+  patches = [
+    # backport Cython 3.0 trashcan support (https://github.com/cython/cython/pull/2842) to 0.X series.
+    # it does not affect Python code unless the code explicitly uses the feature.
+    # trashcan support is needed to avoid stack overflows during object deallocation in sage (https://trac.sagemath.org/ticket/27267)
+    ./trashcan.patch
+    # The above commit introduces custom trashcan macros, as well as
+    # compiler changes to use them in Cython-emitted code. The latter
+    # change is still useful, but the former has been upstreamed as of
+    # Python 3.8, and the patch below makes Cython use the upstream
+    # trashcan macros whenever available. This is needed for Python
+    # 3.11 support, because the API used in Cython's implementation
+    # changed: https://github.com/cython/cython/pull/4475
+    (fetchpatch {
+      name = "disable-trashcan.patch";
+      url = "https://github.com/cython/cython/commit/e337825cdcf5e94d38ba06a0cb0188e99ce0cc92.patch";
+      hash = "sha256-q0f63eetKrDpmP5Z4v8EuGxg26heSyp/62OYqhRoSso=";
+    })
+  ];
+
+  checkPhase = ''
+    export HOME="$NIX_BUILD_TOP"
+    ${python.interpreter} runtests.py -j$NIX_BUILD_CORES \
+      --no-code-style \
+      ${lib.optionalString (builtins.length excludedTests != 0)
+        ''--exclude="(${builtins.concatStringsSep "|" excludedTests})"''}
+  '';
+
+  # https://github.com/cython/cython/issues/2785
+  # Temporary solution
+  doCheck = false;
+  # doCheck = !stdenv.isDarwin;
+
+  # force regeneration of generated code in source distributions
+  # https://github.com/cython/cython/issues/5089
+  setupHook = ./setup-hook.sh;
+
+  meta = {
+    changelog = "https://github.com/cython/cython/blob/${version}/CHANGES.rst";
+    description = "An optimising static compiler for both the Python programming language and the extended Cython programming language";
+    homepage = "https://cython.org";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/Cython/setup-hook.sh b/nixpkgs/pkgs/development/python-modules/Cython/setup-hook.sh
new file mode 100644
index 000000000000..c26330a53644
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Cython/setup-hook.sh
@@ -0,0 +1,3 @@
+if [ -z "${dontForceRegenCython-}"]; then
+  export CYTHON_FORCE_REGEN=1
+fi
diff --git a/nixpkgs/pkgs/development/python-modules/Cython/trashcan.patch b/nixpkgs/pkgs/development/python-modules/Cython/trashcan.patch
new file mode 100644
index 000000000000..398422e76f39
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Cython/trashcan.patch
@@ -0,0 +1,354 @@
+From 1b77e35d848340f2c5f4c9b82965c25a0572d48f Mon Sep 17 00:00:00 2001
+From: Jeroen Demeyer <J.Demeyer@UGent.be>
+Date: Thu, 14 Feb 2019 10:02:41 +0100
+Subject: [PATCH] @cython.trashcan directive to enable the Python trashcan for
+ deallocations
+
+---
+ Cython/Compiler/ModuleNode.py   |  10 +++
+ Cython/Compiler/Options.py      |   2 +
+ Cython/Compiler/PyrexTypes.py   |   8 +-
+ Cython/Compiler/Symtab.py       |  18 +++-
+ Cython/Utility/ExtensionTypes.c |  43 ++++++++++
+ tests/run/trashcan.pyx          | 148 ++++++++++++++++++++++++++++++++
+ 6 files changed, 227 insertions(+), 2 deletions(-)
+ create mode 100644 tests/run/trashcan.pyx
+
+diff --git a/Cython/Compiler/ModuleNode.py b/Cython/Compiler/ModuleNode.py
+index 56845330d..3a3e8a956 100644
+--- a/Cython/Compiler/ModuleNode.py
++++ b/Cython/Compiler/ModuleNode.py
+@@ -1443,6 +1443,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
+ 
+         is_final_type = scope.parent_type.is_final_type
+         needs_gc = scope.needs_gc()
++        needs_trashcan = scope.needs_trashcan()
+ 
+         weakref_slot = scope.lookup_here("__weakref__") if not scope.is_closure_class_scope else None
+         if weakref_slot not in scope.var_entries:
+@@ -1481,6 +1482,11 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
+             # running this destructor.
+             code.putln("PyObject_GC_UnTrack(o);")
+ 
++        if needs_trashcan:
++            code.globalstate.use_utility_code(
++                UtilityCode.load_cached("PyTrashcan", "ExtensionTypes.c"))
++            code.putln("__Pyx_TRASHCAN_BEGIN(o, %s)" % slot_func_cname)
++
+         # call the user's __dealloc__
+         self.generate_usr_dealloc_call(scope, code)
+ 
+@@ -1554,6 +1560,10 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
+             code.putln("(*Py_TYPE(o)->tp_free)(o);")
+             if freelist_size:
+                 code.putln("}")
++
++        if needs_trashcan:
++            code.putln("__Pyx_TRASHCAN_END")
++
+         code.putln(
+             "}")
+ 
+diff --git a/Cython/Compiler/Options.py b/Cython/Compiler/Options.py
+index d03119fca..05a728135 100644
+--- a/Cython/Compiler/Options.py
++++ b/Cython/Compiler/Options.py
+@@ -319,6 +319,7 @@ directive_types = {
+     'freelist': int,
+     'c_string_type': one_of('bytes', 'bytearray', 'str', 'unicode'),
+     'c_string_encoding': normalise_encoding_name,
++    'trashcan': bool,
+     'cpow': bool
+ }
+ 
+@@ -362,6 +363,7 @@ directive_scopes = {  # defaults to available everywhere
+     'np_pythran': ('module',),
+     'fast_gil': ('module',),
+     'iterable_coroutine': ('module', 'function'),
++    'trashcan' : ('cclass',),
+ }
+ 
+ 
+diff --git a/Cython/Compiler/PyrexTypes.py b/Cython/Compiler/PyrexTypes.py
+index c309bd04b..9231130b5 100644
+--- a/Cython/Compiler/PyrexTypes.py
++++ b/Cython/Compiler/PyrexTypes.py
+@@ -1129,6 +1129,7 @@ class PyObjectType(PyrexType):
+     is_extern = False
+     is_subclassed = False
+     is_gc_simple = False
++    builtin_trashcan = False  # builtin type using trashcan
+ 
+     def __str__(self):
+         return "Python object"
+@@ -1183,10 +1184,14 @@ class PyObjectType(PyrexType):
+ 
+ 
+ builtin_types_that_cannot_create_refcycles = set([
+-    'bool', 'int', 'long', 'float', 'complex',
++    'object', 'bool', 'int', 'long', 'float', 'complex',
+     'bytearray', 'bytes', 'unicode', 'str', 'basestring'
+ ])
+ 
++builtin_types_with_trashcan = set([
++    'dict', 'list', 'set', 'frozenset', 'tuple', 'type',
++])
++
+ 
+ class BuiltinObjectType(PyObjectType):
+     #  objstruct_cname  string           Name of PyObject struct
+@@ -1211,6 +1216,7 @@ class BuiltinObjectType(PyObjectType):
+         self.typeptr_cname = "(&%s)" % cname
+         self.objstruct_cname = objstruct_cname
+         self.is_gc_simple = name in builtin_types_that_cannot_create_refcycles
++        self.builtin_trashcan = name in builtin_types_with_trashcan
+         if name == 'type':
+             # Special case the type type, as many C API calls (and other
+             # libraries) actually expect a PyTypeObject* for type arguments.
+diff --git a/Cython/Compiler/Symtab.py b/Cython/Compiler/Symtab.py
+index 7361a55ae..f0c311ba6 100644
+--- a/Cython/Compiler/Symtab.py
++++ b/Cython/Compiler/Symtab.py
+@@ -2043,7 +2043,7 @@ class PyClassScope(ClassScope):
+ class CClassScope(ClassScope):
+     #  Namespace of an extension type.
+     #
+-    #  parent_type           CClassType
++    #  parent_type           PyExtensionType
+     #  #typeobj_cname        string or None
+     #  #objstruct_cname      string
+     #  method_table_cname    string
+@@ -2087,6 +2087,22 @@ class CClassScope(ClassScope):
+             return not self.parent_type.is_gc_simple
+         return False
+ 
++    def needs_trashcan(self):
++        # If the trashcan directive is explicitly set to False,
++        # unconditionally disable the trashcan.
++        directive = self.directives.get('trashcan')
++        if directive is False:
++            return False
++        # If the directive is set to True and the class has Python-valued
++        # C attributes, then it should use the trashcan in tp_dealloc.
++        if directive and self.has_cyclic_pyobject_attrs:
++            return True
++        # Use the trashcan if the base class uses it
++        base_type = self.parent_type.base_type
++        if base_type and base_type.scope is not None:
++            return base_type.scope.needs_trashcan()
++        return self.parent_type.builtin_trashcan
++
+     def needs_tp_clear(self):
+         """
+         Do we need to generate an implementation for the tp_clear slot? Can
+diff --git a/Cython/Utility/ExtensionTypes.c b/Cython/Utility/ExtensionTypes.c
+index dc187ab49..f359165df 100644
+--- a/Cython/Utility/ExtensionTypes.c
++++ b/Cython/Utility/ExtensionTypes.c
+@@ -119,6 +119,49 @@ static int __Pyx_PyType_Ready(PyTypeObject *t) {
+     return r;
+ }
+ 
++/////////////// PyTrashcan.proto ///////////////
++
++// These macros are taken from https://github.com/python/cpython/pull/11841
++// Unlike the Py_TRASHCAN_SAFE_BEGIN/Py_TRASHCAN_SAFE_END macros, they
++// allow dealing correctly with subclasses.
++
++// This requires CPython version >= 2.7.4
++// (or >= 3.2.4 but we don't support such old Python 3 versions anyway)
++#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02070400
++#define __Pyx_TRASHCAN_BEGIN_CONDITION(op, cond) \
++    do { \
++        PyThreadState *_tstate = NULL; \
++        // If "cond" is false, then _tstate remains NULL and the deallocator
++        // is run normally without involving the trashcan
++        if (cond) { \
++            _tstate = PyThreadState_GET(); \
++            if (_tstate->trash_delete_nesting >= PyTrash_UNWIND_LEVEL) { \
++                // Store the object (to be deallocated later) and jump past
++                // Py_TRASHCAN_END, skipping the body of the deallocator
++                _PyTrash_thread_deposit_object((PyObject*)(op)); \
++                break; \
++            } \
++            ++_tstate->trash_delete_nesting; \
++        }
++        // The body of the deallocator is here.
++#define __Pyx_TRASHCAN_END \
++        if (_tstate) { \
++            --_tstate->trash_delete_nesting; \
++            if (_tstate->trash_delete_later && _tstate->trash_delete_nesting <= 0) \
++                _PyTrash_thread_destroy_chain(); \
++        } \
++    } while (0);
++
++#define __Pyx_TRASHCAN_BEGIN(op, dealloc) __Pyx_TRASHCAN_BEGIN_CONDITION(op, \
++        Py_TYPE(op)->tp_dealloc == (destructor)(dealloc))
++
++#else
++// The trashcan is a no-op on other Python implementations
++// or old CPython versions
++#define __Pyx_TRASHCAN_BEGIN(op, dealloc)
++#define __Pyx_TRASHCAN_END
++#endif
++
+ /////////////// CallNextTpDealloc.proto ///////////////
+ 
+ static void __Pyx_call_next_tp_dealloc(PyObject* obj, destructor current_tp_dealloc);
+diff --git a/tests/run/trashcan.pyx b/tests/run/trashcan.pyx
+new file mode 100644
+index 000000000..93a501ff8
+--- /dev/null
++++ b/tests/run/trashcan.pyx
+@@ -0,0 +1,148 @@
++# mode: run
++
++cimport cython
++
++
++# Count number of times an object was deallocated twice. This should remain 0.
++cdef int double_deallocations = 0
++def assert_no_double_deallocations():
++    global double_deallocations
++    err = double_deallocations
++    double_deallocations = 0
++    assert not err
++
++
++# Compute x = f(f(f(...(None)...))) nested n times and throw away the result.
++# The real test happens when exiting this function: then a big recursive
++# deallocation of x happens. We are testing two things in the tests below:
++# that Python does not crash and that no double deallocation happens.
++# See also https://github.com/python/cpython/pull/11841
++def recursion_test(f, int n=2**20):
++    x = None
++    cdef int i
++    for i in range(n):
++        x = f(x)
++
++
++@cython.trashcan(True)
++cdef class Recurse:
++    """
++    >>> recursion_test(Recurse)
++    >>> assert_no_double_deallocations()
++    """
++    cdef public attr
++    cdef int deallocated
++
++    def __init__(self, x):
++        self.attr = x
++
++    def __dealloc__(self):
++        # Check that we're not being deallocated twice
++        global double_deallocations
++        double_deallocations += self.deallocated
++        self.deallocated = 1
++
++
++cdef class RecurseSub(Recurse):
++    """
++    >>> recursion_test(RecurseSub)
++    >>> assert_no_double_deallocations()
++    """
++    cdef int subdeallocated
++
++    def __dealloc__(self):
++        # Check that we're not being deallocated twice
++        global double_deallocations
++        double_deallocations += self.subdeallocated
++        self.subdeallocated = 1
++
++
++@cython.freelist(4)
++@cython.trashcan(True)
++cdef class RecurseFreelist:
++    """
++    >>> recursion_test(RecurseFreelist)
++    >>> recursion_test(RecurseFreelist, 1000)
++    >>> assert_no_double_deallocations()
++    """
++    cdef public attr
++    cdef int deallocated
++
++    def __init__(self, x):
++        self.attr = x
++
++    def __dealloc__(self):
++        # Check that we're not being deallocated twice
++        global double_deallocations
++        double_deallocations += self.deallocated
++        self.deallocated = 1
++
++
++# Subclass of list => uses trashcan by default
++# As long as https://github.com/python/cpython/pull/11841 is not fixed,
++# this does lead to double deallocations, so we skip that check.
++cdef class RecurseList(list):
++    """
++    >>> RecurseList(42)
++    [42]
++    >>> recursion_test(RecurseList)
++    """
++    def __init__(self, x):
++        super().__init__((x,))
++
++
++# Some tests where the trashcan is NOT used. When the trashcan is not used
++# in a big recursive deallocation, the __dealloc__s of the base classs are
++# only run after the __dealloc__s of the subclasses.
++# We use this to detect trashcan usage.
++cdef int base_deallocated = 0
++cdef int trashcan_used = 0
++def assert_no_trashcan_used():
++    global base_deallocated, trashcan_used
++    err = trashcan_used
++    trashcan_used = base_deallocated = 0
++    assert not err
++
++
++cdef class Base:
++    def __dealloc__(self):
++        global base_deallocated
++        base_deallocated = 1
++
++
++# Trashcan disabled by default
++cdef class Sub1(Base):
++    """
++    >>> recursion_test(Sub1, 100)
++    >>> assert_no_trashcan_used()
++    """
++    cdef public attr
++
++    def __init__(self, x):
++        self.attr = x
++
++    def __dealloc__(self):
++        global base_deallocated, trashcan_used
++        trashcan_used += base_deallocated
++
++
++@cython.trashcan(True)
++cdef class Middle(Base):
++    cdef public foo
++
++
++# Trashcan disabled explicitly
++@cython.trashcan(False)
++cdef class Sub2(Middle):
++    """
++    >>> recursion_test(Sub2, 1000)
++    >>> assert_no_trashcan_used()
++    """
++    cdef public attr
++
++    def __init__(self, x):
++        self.attr = x
++
++    def __dealloc__(self):
++        global base_deallocated, trashcan_used
++        trashcan_used += base_deallocated
+-- 
+2.39.0
+
diff --git a/nixpkgs/pkgs/development/python-modules/Flask-PyMongo/default.nix b/nixpkgs/pkgs/development/python-modules/Flask-PyMongo/default.nix
new file mode 100644
index 000000000000..bbbdc29d45f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/Flask-PyMongo/default.nix
@@ -0,0 +1,36 @@
+{ buildPythonPackage
+, fetchPypi
+, flask
+, pymongo
+, vcversioner
+, lib
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "flask-pymongo";
+  version = "2.3.0";
+
+  src = fetchPypi {
+    pname = "Flask-PyMongo";
+    inherit version;
+    sha256 = "051kwdk07y4xm4yawcjhn6bz8swxp9nanv7jj35mz2l0r0nv03k2";
+  };
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  # Tests seem to hang
+  doCheck = false;
+
+  propagatedBuildInputs = [ flask pymongo vcversioner ];
+
+  meta = {
+    homepage = "https://flask-pymongo.readthedocs.org/";
+    description = "PyMongo support for Flask applications";
+    license = lib.licenses.bsd2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/IPy/default.nix b/nixpkgs/pkgs/development/python-modules/IPy/default.nix
new file mode 100644
index 000000000000..5f370e7888d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/IPy/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, nose }:
+
+buildPythonPackage rec {
+  pname = "IPy";
+  version = "1.01";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "edeca741dea2d54aca568fa23740288c3fe86c0f3ea700344571e9ef14a7cc1a";
+  };
+
+  nativeCheckInputs = [ nose ];
+
+  checkPhase = ''
+    nosetests -e fuzz
+  '';
+
+  meta = with lib; {
+    description = "Class and tools for handling of IPv4 and IPv6 addresses and networks";
+    homepage = "https://github.com/autocracy/python-ipy";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ y0no ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/a2wsgi/default.nix b/nixpkgs/pkgs/development/python-modules/a2wsgi/default.nix
new file mode 100644
index 000000000000..7cb150264cf7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/a2wsgi/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, asgiref
+, httpx
+, pdm-backend
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "a2wsgi";
+  version = "1.8.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sgQ2uS8z25/xQ2vmS4boLhhwluu10aUt4nlKcNuYFRA=";
+  };
+
+  nativeBuildInputs = [
+    pdm-backend
+  ];
+
+  nativeCheckInputs = [
+    asgiref
+    httpx
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Convert WSGI app to ASGI app or ASGI app to WSGI app";
+    homepage = "https://github.com/abersheeran/a2wsgi";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aadict/default.nix b/nixpkgs/pkgs/development/python-modules/aadict/default.nix
new file mode 100644
index 000000000000..c124cb7695db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aadict/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, nose
+, coverage
+}:
+
+buildPythonPackage rec {
+  pname = "aadict";
+  version = "0.2.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "013pn9ii6mkql6khgdvsd1gi7zmya418fhclm5fp7dfvann2hwx7";
+  };
+
+  propagatedBuildInputs = [ six ];
+  nativeCheckInputs = [ nose coverage ];
+
+  meta = with lib; {
+    homepage = "https://github.com/metagriffin/aadict";
+    description = "An auto-attribute dict (and a couple of other useful dict functions).";
+    maintainers = with maintainers; [ glittershark ];
+    license = licenses.gpl3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aafigure/default.nix b/nixpkgs/pkgs/development/python-modules/aafigure/default.nix
new file mode 100644
index 000000000000..0b9f14571781
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aafigure/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, pillow }:
+
+buildPythonPackage rec {
+  pname = "aafigure";
+  version = "0.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "49f2c1fd2b579c1fffbac1386a2670b3f6f475cc7ff6cc04d8b984888c2d9e1e";
+  };
+
+  propagatedBuildInputs = [ pillow ];
+
+  # error: invalid command 'test'
+  doCheck = false;
+
+  # Fix impurity. TODO: Do the font lookup using fontconfig instead of this
+  # manual method. Until that is fixed, we get this whenever we run aafigure:
+  #   WARNING: font not found, using PIL default font
+  patchPhase = ''
+    sed -i "s|/usr/share/fonts|/nonexisting-fonts-path|" aafigure/PILhelper.py
+  '';
+
+  meta = with lib; {
+    description = "ASCII art to image converter";
+    homepage = "https://launchpad.net/aafigure/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ bjornfor ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aardwolf/default.nix b/nixpkgs/pkgs/development/python-modules/aardwolf/default.nix
new file mode 100644
index 000000000000..add8b364591f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aardwolf/default.nix
@@ -0,0 +1,86 @@
+{ lib
+, stdenv
+, arc4
+, asn1crypto
+, asn1tools
+, asyauth
+, asysocks
+, buildPythonPackage
+, cargo
+, colorama
+, fetchFromGitHub
+, iconv
+, minikerberos
+, pillow
+, pyperclip
+, pythonOlder
+, rustPlatform
+, rustc
+, setuptools-rust
+, tqdm
+, unicrypto
+, winsspi
+}:
+
+buildPythonPackage rec {
+  pname = "aardwolf";
+  version = "0.2.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "skelsec";
+    repo = "aardwolf";
+    rev = "refs/tags/${version}";
+    hash = "sha256-4kJsW0uwWfcgVruEdDw3QhbzfPDuLjmK+YvcLrgF4SI=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    sourceRoot = "${src.name}/aardwolf/utils/rlers";
+    name = "${pname}-${version}";
+    hash = "sha256-i7fmdWOseRQGdvdBnlGi+lgWvhC2WFI2FwXU9JywYsc=";
+  };
+
+  cargoRoot = "aardwolf/utils/rlers";
+
+  nativeBuildInputs = [
+    rustPlatform.cargoSetupHook
+    setuptools-rust
+    cargo
+    rustc
+  ];
+
+  propagatedBuildInputs = [
+    arc4
+    asn1crypto
+    asn1tools
+    asyauth
+    asysocks
+    colorama
+    minikerberos
+    pillow
+    pyperclip
+    tqdm
+    unicrypto
+    winsspi
+  ] ++ lib.optionals (stdenv.isDarwin) [
+    iconv
+  ];
+
+  # Module doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aardwolf"
+  ];
+
+  meta = with lib; {
+    description = "Asynchronous RDP protocol implementation";
+    homepage = "https://github.com/skelsec/aardwolf";
+    changelog = "https://github.com/skelsec/aardwolf/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/abjad/default.nix b/nixpkgs/pkgs/development/python-modules/abjad/default.nix
new file mode 100644
index 000000000000..3c501a029b18
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/abjad/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ply
+, roman
+, uqbar
+, pythonOlder
+, pytestCheckHook
+, lilypond
+}:
+
+buildPythonPackage rec {
+  pname = "abjad";
+  version = "3.19";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-I9t3ORUKFFlMfXJsAzXhCzl1B4a9/ZNmvSX2/R44TPs=";
+  };
+
+  propagatedBuildInputs = [
+    ply
+    roman
+    uqbar
+  ];
+
+  buildInputs = [
+    lilypond
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace abjad/io.py \
+      --replace 'lilypond_path = self.get_lilypond_path()' \
+                'lilypond_path = "${lilypond}/bin/lilypond"'
+    # general invocations of binary for IO purposes
+
+    substituteInPlace abjad/configuration.py \
+      --replace '["lilypond"' '["${lilypond}/bin/lilypond"'
+    # get_lilypond_version_string
+  '';
+
+  pythonImportsCheck = [ "abjad" ];
+
+  meta = {
+    description = "GNU LilyPond wrapper for Python";
+    longDescription = ''
+      Abjad helps composers build up complex pieces of music notation in
+      iterative and incremental ways. Use Abjad to create a symbolic
+      representation of all the notes, rests, chords, tuplets, beams and slurs
+      in any score. Because Abjad extends the Python programming language, you
+      can use Abjad to make systematic changes to music as you work. Because
+      Abjad wraps the LilyPond music notation package, you can use Abjad to
+      control the typographic detail of symbols on the page.
+    '';
+    license = lib.licenses.mit;
+    homepage = "https://abjad.github.io/";
+    changelog = "https://abjad.github.io/appendices/changes.html";
+    maintainers = [ lib.maintainers.davisrichard437 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/about-time/default.nix b/nixpkgs/pkgs/development/python-modules/about-time/default.nix
new file mode 100644
index 000000000000..3759957c9ca6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/about-time/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+}:
+
+buildPythonPackage rec {
+  pname = "about-time";
+  version = "4.2.1";
+
+  # PyPi release does not contain test files, but the repo has no release tags,
+  # so while having no tests is not ideal, follow the PyPi releases for now
+  # TODO: switch to fetchFromGitHub once this issue is fixed:
+  # https://github.com/rsalmei/about-time/issues/15
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-alOIYtM85n2ZdCnRSZgxDh2/2my32bv795nEcJhH/s4=";
+  };
+
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "about_time"
+  ];
+
+  meta = with lib; {
+    description = "A cool helper for tracking time and throughput of code blocks, with beautiful human friendly renditions";
+    homepage = "https://github.com/rsalmei/about-time";
+    license = licenses.mit;
+    maintainers = with maintainers; [ thiagokokada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/absl-py/default.nix b/nixpkgs/pkgs/development/python-modules/absl-py/default.nix
new file mode 100644
index 000000000000..00846838b25d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/absl-py/default.nix
@@ -0,0 +1,33 @@
+{ buildPythonPackage
+, lib
+, pythonOlder
+, fetchPypi
+, six
+, enum34
+}:
+
+buildPythonPackage rec {
+  pname = "absl-py";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-0sJE0BBIukdufAgL0sbfXhQdIR3oAiNGDVs7iipYQz0=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ] ++ lib.optionals (pythonOlder "3.4") [
+    enum34
+  ];
+
+  # checks use bazel; should be revisited
+  doCheck = false;
+
+  meta = {
+    description = "Abseil Python Common Libraries";
+    homepage = "https://github.com/abseil/abseil-py";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/accelerate/default.nix b/nixpkgs/pkgs/development/python-modules/accelerate/default.nix
new file mode 100644
index 000000000000..24ed871c4037
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/accelerate/default.nix
@@ -0,0 +1,111 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pythonAtLeast
+, pythonOlder
+, pytestCheckHook
+, setuptools
+, numpy
+, packaging
+, psutil
+, pyyaml
+, torch
+, evaluate
+, parameterized
+, transformers
+}:
+
+buildPythonPackage rec {
+  pname = "accelerate";
+  version = "0.24.1";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "huggingface";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-DKyFb+4DUMhVUwr+sgF2IaJS9pEj2o2shGYwExfffWg=";
+  };
+
+  patches = [
+    # https://github.com/huggingface/accelerate/pull/2121
+    (fetchpatch {
+      name = "fix-import-error-without-torch_distributed.patch";
+      url = "https://github.com/huggingface/accelerate/commit/42048092eabd67a407ea513a62f2acde97079fbc.patch";
+      hash = "sha256-9lvnU6z5ZEFc5RVw2bP0cGVyrwAp/pxX4ZgnmCN7qH8=";
+    })
+  ];
+
+  nativeBuildInputs = [ setuptools ];
+
+  propagatedBuildInputs = [
+    numpy
+    packaging
+    psutil
+    pyyaml
+    torch
+  ];
+
+  nativeCheckInputs = [
+    evaluate
+    parameterized
+    pytestCheckHook
+    transformers
+  ];
+  preCheck = ''
+    export HOME=$(mktemp -d)
+    export PATH=$out/bin:$PATH
+  '';
+  pytestFlagsArray = [ "tests" ];
+  disabledTests = [
+    # try to download data:
+    "FeatureExamplesTests"
+    "test_infer_auto_device_map_on_t0pp"
+
+    # require socket communication
+    "test_explicit_dtypes"
+    "test_gated"
+    "test_invalid_model_name"
+    "test_invalid_model_name_transformers"
+    "test_no_metadata"
+    "test_no_split_modules"
+    "test_remote_code"
+    "test_transformers_model"
+
+    # set the environment variable, CC, which conflicts with standard environment
+    "test_patch_environment_key_exists"
+  ] ++ lib.optionals (stdenv.isLinux && stdenv.isAarch64) [
+    # usual aarch64-linux RuntimeError: DataLoader worker (pid(s) <...>) exited unexpectedly
+    "CheckpointTest"
+  ] ++ lib.optionals (stdenv.isDarwin && stdenv.isx86_64) [
+    # RuntimeError: torch_shm_manager: execl failed: Permission denied
+    "CheckpointTest"
+  ] ++ lib.optionals (pythonAtLeast "3.11") [
+    # python3.11 not yet supported for torch.compile
+    "test_dynamo_extract_model"
+  ];
+
+  disabledTestPaths = lib.optionals (!(stdenv.isLinux && stdenv.isx86_64)) [
+    # numerous instances of torch.multiprocessing.spawn.ProcessRaisedException:
+    "tests/test_cpu.py"
+    "tests/test_grad_sync.py"
+    "tests/test_metrics.py"
+    "tests/test_scheduler.py"
+  ];
+
+  pythonImportsCheck = [
+    "accelerate"
+  ];
+
+  meta = with lib; {
+    homepage = "https://huggingface.co/docs/accelerate";
+    description = "A simple way to train and use PyTorch models with multi-GPU, TPU, mixed-precision";
+    changelog = "https://github.com/huggingface/accelerate/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ bcdarwin ];
+    mainProgram = "accelerate";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/accessible-pygments/default.nix b/nixpkgs/pkgs/development/python-modules/accessible-pygments/default.nix
new file mode 100644
index 000000000000..334a4c5f2ee3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/accessible-pygments/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "accessible-pygments";
+  version = "0.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-57V6mxWVjpYBx+nrB6RAyBMoNUWiCXPyV0pfRT0OlT4=";
+  };
+
+  propagatedBuildInputs = [
+    pygments
+  ];
+
+  # Tests only execute pygments with these styles
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "a11y_pygments"
+    "a11y_pygments.utils"
+  ];
+
+  meta = with lib; {
+    description = "A collection of accessible pygments styles";
+    homepage = "https://github.com/Quansight-Labs/accessible-pygments";
+    changelog = "https://github.com/Quansight-Labs/accessible-pygments/raw/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/accupy/default.nix b/nixpkgs/pkgs/development/python-modules/accupy/default.nix
new file mode 100644
index 000000000000..8b67fa4d9dbc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/accupy/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, mpmath
+, numpy
+, pybind11
+, pyfma
+, eigen
+, importlib-metadata
+, pytestCheckHook
+, matplotlib
+, dufte
+, perfplot
+}:
+
+buildPythonPackage rec {
+  pname = "accupy";
+  version = "0.3.6";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nschloe";
+    repo = pname;
+    rev = version;
+    sha256 = "0sxkwpp2xy2jgakhdxr4nh1cspqv8l89kz6s832h05pbpyc0n767";
+  };
+
+  nativeBuildInputs = [
+    pybind11
+  ];
+
+  buildInputs = [
+    eigen
+  ];
+
+  propagatedBuildInputs = [
+    mpmath
+    numpy
+    pyfma
+  ] ++ lib.optional (pythonOlder "3.8") importlib-metadata;
+
+  nativeCheckInputs = [
+    perfplot
+    pytestCheckHook
+    matplotlib
+    dufte
+  ];
+
+  postConfigure = ''
+   substituteInPlace setup.py \
+     --replace "/usr/include/eigen3/" "${eigen}/include/eigen3/"
+  '';
+
+  preBuild = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  # This variable is needed to suppress the "Trace/BPT trap: 5" error in Darwin's checkPhase.
+  # Not sure of the details, but we can avoid it by changing the matplotlib backend during testing.
+  env.MPLBACKEND = lib.optionalString stdenv.isDarwin "Agg";
+
+  # performance tests aren't useful to us and disabling them allows us to
+  # decouple ourselves from an unnecessary build dep
+  preCheck = ''
+    for f in test/test*.py ; do
+      substituteInPlace $f --replace 'import perfplot' ""
+    done
+  '';
+  disabledTests = [ "test_speed_comparison1" "test_speed_comparison2" ];
+  pythonImportsCheck = [ "accupy" ];
+
+  meta = with lib; {
+    description = "Accurate sums and dot products for Python";
+    homepage = "https://github.com/nschloe/accupy";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/accuweather/default.nix b/nixpkgs/pkgs/development/python-modules/accuweather/default.nix
new file mode 100644
index 000000000000..6069d06d9984
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/accuweather/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, orjson
+, pytest-asyncio
+, pytest-error-for-skips
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "accuweather";
+  version = "2.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bieniu";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-hbmeQnxVhBbXKHNdeXzAwRnMKBNvKsdfHg8MzALinhc=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    orjson
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytest-asyncio
+    pytest-error-for-skips
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "accuweather"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for getting weather data from AccuWeather servers";
+    homepage = "https://github.com/bieniu/accuweather";
+    changelog = "https://github.com/bieniu/accuweather/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jamiemagee ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/acme-tiny/default.nix b/nixpkgs/pkgs/development/python-modules/acme-tiny/default.nix
new file mode 100644
index 000000000000..0ecae898a670
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/acme-tiny/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, fusepy
+, fuse
+, openssl
+}:
+
+buildPythonPackage rec {
+  pname = "acme-tiny";
+  version = "5.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "378549808eece574c3b5dcea82b216534949423d5c7ac241d9419212d676bc8d";
+  };
+
+  patchPhase = ''
+    substituteInPlace acme_tiny.py --replace '"openssl"' '"${openssl.bin}/bin/openssl"'
+    substituteInPlace tests/test_module.py --replace '"openssl"' '"${openssl.bin}/bin/openssl"'
+    substituteInPlace tests/utils.py --replace /etc/ssl/openssl.cnf ${openssl.out}/etc/ssl/openssl.cnf
+  '';
+
+  buildInputs = [ setuptools-scm ];
+
+  nativeCheckInputs = [ fusepy fuse ];
+
+  doCheck = false; # seems to hang, not sure
+
+  pythonImportsCheck = [ "acme_tiny" ];
+
+  meta = with lib; {
+    description = "A tiny script to issue and renew TLS certs from Let's Encrypt";
+    homepage = "https://github.com/diafygi/acme-tiny";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/acme/default.nix b/nixpkgs/pkgs/development/python-modules/acme/default.nix
new file mode 100644
index 000000000000..531ed8ae8d9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/acme/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage
+, certbot
+, cryptography
+, pyasn1
+, pyopenssl
+, pyRFC3339
+, josepy
+, pytz
+, requests
+, requests-toolbelt
+, six
+, werkzeug
+, ndg-httpsclient
+}:
+
+buildPythonPackage rec {
+  inherit (certbot) src version;
+
+  pname = "acme";
+
+  propagatedBuildInputs = [
+    cryptography pyasn1 pyopenssl pyRFC3339 pytz requests requests-toolbelt six
+    werkzeug ndg-httpsclient josepy
+  ];
+
+  # does not contain any tests
+  doCheck = false;
+  pythonImportsCheck = [ "acme" ];
+
+  sourceRoot = "${src.name}/${pname}";
+
+  meta = certbot.meta // {
+    description = "ACME protocol implementation in Python";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/acoustics/default.nix b/nixpkgs/pkgs/development/python-modules/acoustics/default.nix
new file mode 100644
index 000000000000..174fd9c22376
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/acoustics/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, matplotlib
+, numpy
+, pandas
+, pytestCheckHook
+, pythonOlder
+, scipy
+, tabulate
+}:
+
+buildPythonPackage rec {
+  pname = "acoustics";
+  version = "0.2.6-unstable-2023-08-20";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "python-acoustics";
+    repo  = "python-acoustics";
+    rev = "99d79206159b822ea2f4e9d27c8b2fbfeb704d38";
+    hash = "sha256-/4bVjlhj8ihpAFHEWPaZ/xBILi3rb8f0NmwAexJCg+o=";
+  };
+
+  nativeBuildInputs = [ flit-core ];
+
+  propagatedBuildInputs = [
+    matplotlib
+    numpy
+    pandas
+    scipy
+    tabulate
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+    mkdir -p $HOME/.matplotlib
+    echo "backend: ps" > $HOME/.matplotlib/matplotlibrc
+  '';
+
+  pytestFlagsArray = [
+    "-Wignore::DeprecationWarning"
+  ];
+
+  pythonImportsCheck = [ "acoustics" ];
+
+  meta = with lib; {
+    description = "Python package for acousticians";
+    maintainers = with maintainers; [ fridh ];
+    license = with licenses; [ bsd3 ];
+    homepage = "https://github.com/python-acoustics/python-acoustics";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/acquire/default.nix b/nixpkgs/pkgs/development/python-modules/acquire/default.nix
new file mode 100644
index 000000000000..87e1ef293071
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/acquire/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, defusedxml
+, dissect-cstruct
+, dissect-target
+, fetchFromGitHub
+, minio
+, pycryptodome
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-toolbelt
+, rich
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "acquire";
+  version = "3.10";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "acquire";
+    rev = "refs/tags/${version}";
+    hash = "sha256-8fvVK/mH+pgPaaxNKvKOw1qU0ElWAmNVP6YAqvBTwio=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    defusedxml
+    dissect-cstruct
+    dissect-target
+  ];
+
+  passthru.optional-dependencies = {
+    full = [
+      dissect-target
+      minio
+      pycryptodome
+      requests
+      requests-toolbelt
+      rich
+    ] ++ dissect-target.optional-dependencies.full;
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.full;
+
+  pythonImportsCheck = [
+    "acquire"
+  ];
+
+  meta = with lib; {
+    description = "Tool to quickly gather forensic artifacts from disk images or a live system";
+    homepage = "https://github.com/fox-it/acquire";
+    changelog = "https://github.com/fox-it/acquire/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/actdiag/default.nix b/nixpkgs/pkgs/development/python-modules/actdiag/default.nix
new file mode 100644
index 000000000000..0f1e20041adf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/actdiag/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, blockdiag
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "actdiag";
+  version = "3.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "blockdiag";
+    repo = pname;
+    rev = version;
+    hash = "sha256-WmprkHOgvlsOIg8H77P7fzEqxGnj6xaL7Df7urRkg3o=";
+  };
+
+  propagatedBuildInputs = [
+    blockdiag
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    nose
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "src/actdiag/tests/"
+  ];
+
+  pythonImportsCheck = [
+    "actdiag"
+  ];
+
+  meta = with lib; {
+    description = "Generate activity-diagram image from spec-text file (similar to Graphviz)";
+    homepage = "http://blockdiag.com/";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/acunetix/default.nix b/nixpkgs/pkgs/development/python-modules/acunetix/default.nix
new file mode 100644
index 000000000000..b28a6beefbc7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/acunetix/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, aiofiles
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "acunetix";
+  version = "0.0.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "hikariatama";
+    repo = "acunetix";
+    # https://github.com/hikariatama/acunetix/issues/1
+    rev = "67584746731b9f7abd1cf10ff8161eb3085800ce";
+    hash = "sha256-ycdCz8CNSP0USxv657jf6Vz4iF//reCeO2tG+und86A=";
+  };
+
+  propagatedBuildInputs = [
+    aiofiles
+    requests
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "acunetix"
+  ];
+
+  meta = with lib; {
+    description = "Acunetix Web Vulnerability Scanner SDK for Python";
+    homepage = "https://github.com/hikariatama/acunetix";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/adafruit-io/default.nix b/nixpkgs/pkgs/development/python-modules/adafruit-io/default.nix
new file mode 100644
index 000000000000..382fea4601cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adafruit-io/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, paho-mqtt
+, pytestCheckHook
+, pythonOlder
+, requests
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "adafruit-io";
+  version = "2.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "adafruit";
+    repo = "Adafruit_IO_Python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-BIquSrhtRv2NEOn/G6TTfYMrL2OBwwJQYZ455fznwdU=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    paho-mqtt
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "Adafruit_IO"
+  ];
+
+  disabledTestPaths = [
+    # Tests requires valid credentials
+    "tests/test_client.py"
+    "tests/test_errors.py"
+    "tests/test_mqtt_client.py"
+  ];
+
+  meta = with lib; {
+    description = "Module for interacting with Adafruit IO";
+    homepage = "https://github.com/adafruit/Adafruit_IO_Python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/adafruit-platformdetect/default.nix b/nixpkgs/pkgs/development/python-modules/adafruit-platformdetect/default.nix
new file mode 100644
index 000000000000..97966e6bb33e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adafruit-platformdetect/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "adafruit-platformdetect";
+  version = "3.54.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Adafruit-PlatformDetect";
+    inherit version;
+    hash = "sha256-P+f7eBqD0/KIEry/807dQQCvtokB2cYu4i0H6CTYIWg=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  # Project has not published tests yet
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "adafruit_platformdetect"
+  ];
+
+  meta = with lib; {
+    description = "Platform detection for use by Adafruit libraries";
+    homepage = "https://github.com/adafruit/Adafruit_Python_PlatformDetect";
+    changelog = "https://github.com/adafruit/Adafruit_Python_PlatformDetect/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/adafruit-pureio/default.nix b/nixpkgs/pkgs/development/python-modules/adafruit-pureio/default.nix
new file mode 100644
index 000000000000..82d39fa23aba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adafruit-pureio/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "adafruit-pureio";
+  version = "1.1.11";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Adafruit_PureIO";
+    inherit version;
+    hash = "sha256-xM+7NlcxlC0fEJKhFvR9/a4K7xjFsn8QcrWCStXqjHw=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  # Physical SMBus is not present
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "Adafruit_PureIO"
+  ];
+
+  meta = with lib; {
+    description = "Python interface to Linux IO including I2C and SPI";
+    homepage = "https://github.com/adafruit/Adafruit_Python_PureIO";
+    changelog = "https://github.com/adafruit/Adafruit_Python_PureIO/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/adal/default.nix b/nixpkgs/pkgs/development/python-modules/adal/default.nix
new file mode 100644
index 000000000000..cbce5d2af148
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adal/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpretty
+, pyjwt
+, pytestCheckHook
+, python-dateutil
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "adal";
+  version = "1.2.7";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "AzureAD";
+    repo = "azure-activedirectory-library-for-python";
+    rev = version;
+    hash = "sha256-HE8/P0aohoZNeMdcQVKdz6M31FMrjsd7oVytiaD0idI=";
+  };
+
+  postPatch = ''
+    sed -i '/cryptography/d' setup.py
+  '';
+
+  propagatedBuildInputs = [
+    pyjwt
+    python-dateutil
+    requests
+  ];
+
+  nativeCheckInputs = [
+    httpretty
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # AssertionError: 'Mex [23 chars]tp error:...
+    "test_failed_request"
+  ];
+
+  pythonImportsCheck = [
+    "adal"
+  ];
+
+  meta = with lib; {
+    description = "Python module to authenticate to Azure Active Directory (AAD) in order to access AAD protected web resources";
+    homepage = "https://github.com/AzureAD/azure-activedirectory-library-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/adax-local/default.nix b/nixpkgs/pkgs/development/python-modules/adax-local/default.nix
new file mode 100644
index 000000000000..4571816cfa07
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adax-local/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, aiohttp
+, bleak
+, buildPythonPackage
+, fetchFromGitHub
+, async-timeout
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "adax-local";
+  version = "0.1.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "pyAdaxLocal";
+    rev = "refs/tags/${version}";
+    hash = "sha256-V3jSBdYDo32oTAGNTvHJi+GSwlL3keSDhXpNpMoCkWs=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    bleak
+    async-timeout
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "adax_local"
+  ];
+
+  meta = with lib; {
+    description = "Module for local access to Adax";
+    homepage = "https://github.com/Danielhiversen/pyAdaxLocal";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/adax/default.nix b/nixpkgs/pkgs/development/python-modules/adax/default.nix
new file mode 100644
index 000000000000..19e1e9a6fb02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adax/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "adax";
+  version = "0.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "pyadax";
+    rev = "refs/tags/${version}";
+    hash = "sha256-wmcZtiML02i1XfqpFzni2WDrxutTvP5laVvTAGtNg0Y=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "adax"
+  ];
+
+  meta = with lib; {
+    description = "Python module to communicate with Adax";
+    homepage = "https://github.com/Danielhiversen/pyAdax";
+    changelog = "https://github.com/Danielhiversen/pyAdax/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/adb-enhanced/default.nix b/nixpkgs/pkgs/development/python-modules/adb-enhanced/default.nix
new file mode 100644
index 000000000000..739d34014357
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adb-enhanced/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, docopt
+, fetchFromGitHub
+, jdk11
+, psutil
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "adb-enhanced";
+  version = "2.5.22";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ashishb";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-n1CME/swV+NsZdUfWwVY1qQeYzawwy+sm0mkRPQKm6A=";
+  };
+
+  propagatedBuildInputs = [
+    psutil
+    docopt
+  ];
+
+  postPatch = ''
+    substituteInPlace adbe/adb_enhanced.py \
+      --replace "cmd = 'java" "cmd = '${jdk11}/bin/java"
+  '';
+
+  # Disable tests because they require a dedicated Android emulator
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "adbe"
+  ];
+
+  meta = with lib; {
+    description = "Tool for Android testing and development";
+    homepage = "https://github.com/ashishb/adb-enhanced";
+    sourceProvenance = with sourceTypes; [
+      fromSource
+      binaryBytecode
+    ];
+    license = licenses.asl20;
+    maintainers = with maintainers; [ vtuan10 ];
+    mainProgram = "adbe";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/adb-homeassistant/default.nix b/nixpkgs/pkgs/development/python-modules/adb-homeassistant/default.nix
new file mode 100644
index 000000000000..72e6d6acd4d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adb-homeassistant/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, libusb1
+, rsa
+, pycryptodome
+, pytest
+, mock
+}:
+buildPythonPackage {
+  pname = "adb-homeassistant";
+  version = "1.3.1";
+
+  # pypi does not contain tests, using github sources instead
+  src = fetchFromGitHub {
+    owner = "JeffLIrion";
+    repo = "python-adb";
+    rev = "5949bf432307cbba7128e84d7bc6add7f054a078";
+    sha256 = "0s3fazvbzchn1fsvjrd1jl8w9y4dvvgq6q8m8p5lr2gri0npr581";
+
+  };
+
+  propagatedBuildInputs = [
+    libusb1
+    rsa
+    pycryptodome
+  ];
+
+  nativeCheckInputs = [ pytest mock ];
+  checkPhase = ''
+    py.test test
+  '';
+
+  meta = with lib; {
+    description = "A pure python implementation of the Android ADB and Fastboot protocols";
+    homepage = "https://github.com/JeffLIrion/python-adb/tree/adb-homeassistant";
+    license = licenses.asl20;
+    maintainers = [ maintainers.makefu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/adb-shell/default.nix b/nixpkgs/pkgs/development/python-modules/adb-shell/default.nix
new file mode 100644
index 000000000000..c2f189e2749a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adb-shell/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, aiofiles
+, async-timeout
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, isPy3k
+, libusb1
+, mock
+, pyasn1
+, pythonAtLeast
+, pycryptodome
+, pytestCheckHook
+, rsa
+}:
+
+buildPythonPackage rec {
+  pname = "adb-shell";
+  version = "0.4.4";
+  format = "setuptools";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "JeffLIrion";
+    repo = "adb_shell";
+    rev = "v${version}";
+    hash = "sha256-pOkFUh3SEu/ch9R1lVoQn50nufQp8oI+D4/+Ybal5CA=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    pyasn1
+    rsa
+  ];
+
+  passthru.optional-dependencies = {
+    async = [
+      aiofiles
+      async-timeout
+    ];
+    usb = [
+      libusb1
+    ];
+  };
+
+  nativeCheckInputs = [
+    mock
+    pycryptodome
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "adb_shell"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of ADB with shell and FileSync functionality";
+    homepage = "https://github.com/JeffLIrion/adb_shell";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jamiemagee ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/adblock/default.nix b/nixpkgs/pkgs/development/python-modules/adblock/default.nix
new file mode 100644
index 000000000000..87f42fbd35b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adblock/default.nix
@@ -0,0 +1,97 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchpatch
+, buildPythonPackage
+, rustPlatform
+, pkg-config
+, openssl
+, publicsuffix-list
+, pythonOlder
+, libiconv
+, CoreFoundation
+, Security
+, pytestCheckHook
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "adblock";
+  version = "0.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  # Pypi only has binary releases
+  src = fetchFromGitHub {
+    owner = "ArniDagur";
+    repo = "python-adblock";
+    rev = "refs/tags/${version}";
+    hash = "sha256-5g5xdUzH/RTVwu4Vfb5Cb1t0ruG0EXgiXjrogD/+JCU=";
+  };
+
+  patches = [
+    # https://github.com/ArniDagur/python-adblock/pull/91
+    (fetchpatch {
+      name = "pep-621-compat.patch";
+      url = "https://github.com/ArniDagur/python-adblock/commit/2a8716e0723b60390f0aefd0e05f40ba598ac73f.patch";
+      hash = "sha256-n9+LDs0no66OdNZxw3aU57ngWrAbmm6hx4qIuxXoatM=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "0.0.0" "${version}"
+  '';
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-1xmYmF5P7a5O9MilxDy+CVhmWMGRetdM2fGvTPy7JmM=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+  ] ++ (with rustPlatform; [
+    cargoSetupHook
+    maturinBuildHook
+  ]);
+
+  buildInputs = [
+    openssl
+  ] ++ lib.optionals stdenv.isDarwin [
+    libiconv
+    CoreFoundation
+    Security
+  ];
+
+  PSL_PATH = "${publicsuffix-list}/share/publicsuffix/public_suffix_list.dat";
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    toml
+  ];
+
+  preCheck = ''
+    # import from $out instead
+    rm -r adblock
+  '';
+
+  disabledTestPaths = [
+    # relies on directory removed above
+    "tests/test_typestubs.py"
+  ];
+
+  pythonImportsCheck = [
+    "adblock"
+    "adblock.adblock"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for Brave's adblocking library";
+    homepage = "https://github.com/ArniDagur/python-adblock/";
+    changelog = "https://github.com/ArniDagur/python-adblock/blob/${version}/CHANGELOG.md";
+    maintainers = with maintainers; [ dotlambda ];
+    license = with licenses; [ asl20 /* or */ mit ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/add-trailing-comma/default.nix b/nixpkgs/pkgs/development/python-modules/add-trailing-comma/default.nix
new file mode 100644
index 000000000000..785c011c6d66
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/add-trailing-comma/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, tokenize-rt
+}:
+
+buildPythonPackage rec {
+  pname = "add-trailing-comma";
+  version = "3.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "asottile";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-B+wjBy42RwabVz/6qEMGpB0JmwJ9hqSskwcNj4x/B/k=";
+  };
+
+  propagatedBuildInputs = [
+    tokenize-rt
+  ];
+
+  pythonImportsCheck = [
+    "add_trailing_comma"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A tool (and pre-commit hook) to automatically add trailing commas to calls and literals";
+    homepage = "https://github.com/asottile/add-trailing-comma";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/addict/default.nix b/nixpkgs/pkgs/development/python-modules/addict/default.nix
new file mode 100644
index 000000000000..235c34af263d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/addict/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "addict";
+  version = "2.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b3b2210e0e067a281f5646c8c5db92e99b7231ea8b0eb5f74dbdf9e259d4e494";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "addict" ];
+
+  meta = with lib; {
+    description = "Module that exposes a dictionary subclass that allows items to be set like attributes";
+    homepage = "https://github.com/mewwts/addict";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/adext/default.nix b/nixpkgs/pkgs/development/python-modules/adext/default.nix
new file mode 100644
index 000000000000..649ab4b732c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adext/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, alarmdecoder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "adext";
+  version = "0.4.2";
+
+  src = fetchFromGitHub {
+    owner = "ajschmidt8";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0h5k9kzms2f0r48pdhsgv8pimk0vsxw8vs0k6880mank8ij914wr";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    alarmdecoder
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "adext" ];
+
+  meta = with lib; {
+    description = "Python extension for AlarmDecoder";
+    homepage = "https://github.com/ajschmidt8/adext";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/adguardhome/default.nix b/nixpkgs/pkgs/development/python-modules/adguardhome/default.nix
new file mode 100644
index 000000000000..a92e6e8ae33d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adguardhome/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "adguardhome";
+  version = "0.6.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-${pname}";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-V8SsWsGYmUhR9/yV6BZBK1UjYGHlDrXrF8nt0eZbTnI=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov" "" \
+      --replace '"0.0.0"' '"${version}"'
+
+    substituteInPlace tests/test_adguardhome.py \
+      --replace 0.0.0 ${version}
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "adguardhome"
+  ];
+
+  meta = with lib; {
+    description = "Python client for the AdGuard Home API";
+    homepage = "https://github.com/frenck/python-adguardhome";
+    changelog = "https://github.com/frenck/python-adguardhome/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jamiemagee ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/adjusttext/default.nix b/nixpkgs/pkgs/development/python-modules/adjusttext/default.nix
new file mode 100644
index 000000000000..d8d82edb8a31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adjusttext/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, matplotlib
+, numpy
+, packaging
+}:
+
+buildPythonPackage rec {
+  pname = "adjusttext";
+  version = "0.8.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Phlya";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Lhl6ykx5ynf+pBub5tBUaALm1w/88jbuSXPigE216NY=";
+  };
+
+  nativeBuildInputs = [
+    packaging
+  ];
+
+  propagatedBuildInputs = [
+    matplotlib
+    numpy
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "adjustText"
+  ];
+
+  meta = with lib; {
+    description = "Iteratively adjust text position in matplotlib plots to minimize overlaps";
+    homepage = "https://github.com/Phlya/adjustText";
+    license = licenses.mit;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/adlfs/default.nix b/nixpkgs/pkgs/development/python-modules/adlfs/default.nix
new file mode 100644
index 000000000000..7e293f953c07
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/adlfs/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, aiohttp
+, azure-core
+, azure-datalake-store
+, azure-identity
+, azure-storage-blob
+, buildPythonPackage
+, fetchFromGitHub
+, fsspec
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "adlfs";
+  version = "2023.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fsspec";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-pmKqMNVSW+Jzz4MZaiUbzXFcLzTKj52RJH7WvFMj6NM=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    azure-core
+    azure-datalake-store
+    azure-identity
+    azure-storage-blob
+    fsspec
+  ];
+
+  # Tests require a running Docker instance
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "adlfs"
+  ];
+
+  meta = with lib; {
+    description = "Filesystem interface to Azure-Datalake Gen1 and Gen2 Storage";
+    homepage = "https://github.com/fsspec/adlfs";
+    changelog = "https://github.com/fsspec/adlfs/blob/${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/advantage-air/default.nix b/nixpkgs/pkgs/development/python-modules/advantage-air/default.nix
new file mode 100644
index 000000000000..ffe66565dc2c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/advantage-air/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "advantage-air";
+  version = "0.4.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "advantage_air";
+    inherit version;
+    hash = "sha256-4rRR9IxzH5EiYfWzWYeyCwoLB2LetBVyH7L3nkvp+gA=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # No tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "advantage_air"
+  ];
+
+  meta = with lib; {
+    description = "API helper for Advantage Air's MyAir and e-zone API";
+    homepage = "https://github.com/Bre77/advantage_air";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jamiemagee ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/advocate/default.nix b/nixpkgs/pkgs/development/python-modules/advocate/default.nix
new file mode 100644
index 000000000000..e0062be35cb8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/advocate/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ndg-httpsclient
+, netifaces
+, pyasn1
+, pyopenssl
+, requests
+, six
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "advocate";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "JordanMilne";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-opObkjkad+yrLE2b7DULHjGuNeVhu4fEmSavgA39YPw=";
+  };
+
+  propagatedBuildInputs = [
+    ndg-httpsclient
+    netifaces
+    pyasn1
+    pyopenssl
+    requests
+    six
+    urllib3
+  ];
+
+  # The tests do network requests, so disabled
+  doCheck = false;
+
+  pythonImportsCheck = [ "advocate" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/JordanMilne/Advocate";
+    description = "An SSRF-preventing wrapper around Python's requests library";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ pborzenkov ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aemet-opendata/default.nix b/nixpkgs/pkgs/development/python-modules/aemet-opendata/default.nix
new file mode 100644
index 000000000000..b238f184f0c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aemet-opendata/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, geopy
+, pythonOlder
+, requests
+, setuptools
+, urllib3
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "aemet-opendata";
+  version = "0.4.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "Noltari";
+    repo = "AEMET-OpenData";
+    rev = "refs/tags/${version}";
+    hash = "sha256-eAHj37d0akxSz4rnf9f0tDknJQe//cMg0Korp1rtxfQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    geopy
+    requests
+    urllib3
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aemet_opendata.interface"
+  ];
+
+  meta = with lib; {
+    description = "Python client for AEMET OpenData Rest API";
+    homepage = "https://github.com/Noltari/AEMET-OpenData";
+    changelog = "https://github.com/Noltari/AEMET-OpenData/releases/tag/${version}";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aenum/default.nix b/nixpkgs/pkgs/development/python-modules/aenum/default.nix
new file mode 100644
index 000000000000..d1ff94519646
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aenum/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyparsing
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aenum";
+  version = "3.1.15";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jL12zRjE+HD/ObJChNPqAo++hzGljfOqWB5DTFdblVk=";
+  };
+
+  nativeCheckInputs = [
+    pyparsing
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aenum"
+  ];
+
+  disabledTests = [
+    # https://github.com/ethanfurman/aenum/issues/27
+    "test_class_nested_enum_and_pickle_protocol_four"
+    "test_pickle_enum_function_with_qualname"
+    "test_stdlib_inheritence"
+    "test_subclasses_with_getnewargs_ex"
+    "test_arduino_headers"
+    "test_c_header_scanner"
+    "test_extend_flag_backwards_stdlib"
+  ];
+
+  meta = with lib; {
+    description = "Advanced Enumerations (compatible with Python's stdlib Enum), NamedTuples, and NamedConstants";
+    homepage = "https://github.com/ethanfurman/aenum";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ vrthra ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aeppl/default.nix b/nixpkgs/pkgs/development/python-modules/aeppl/default.nix
new file mode 100644
index 000000000000..1633be12bb97
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aeppl/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, aesara
+, buildPythonPackage
+, fetchFromGitHub
+, numdifftools
+, numpy
+, pytestCheckHook
+, pythonOlder
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "aeppl";
+  version = "0.1.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aesara-devs";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-mqBbXwWJwQA2wSHuEdBeXQMfTIcgwYEjpq8AVmOjmHM=";
+  };
+
+  propagatedBuildInputs = [
+    aesara
+    numpy
+    scipy
+  ];
+
+  nativeCheckInputs = [
+    numdifftools
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  pythonImportsCheck = [
+    "aeppl"
+  ];
+
+  disabledTests = [
+    # Compute issue
+    "test_initial_values"
+  ];
+
+  meta = with lib; {
+    description = "Library for an Aesara-based PPL";
+    homepage = "https://github.com/aesara-devs/aeppl";
+    changelog = "https://github.com/aesara-devs/aeppl/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aesara/default.nix b/nixpkgs/pkgs/development/python-modules/aesara/default.nix
new file mode 100644
index 000000000000..589799c1b848
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aesara/default.nix
@@ -0,0 +1,100 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cons
+, cython
+, etuples
+, fetchFromGitHub
+, filelock
+, hatch-vcs
+, hatchling
+, jax
+, jaxlib
+, logical-unification
+, minikanren
+, numba
+, numba-scipy
+, numpy
+, pytestCheckHook
+, pythonOlder
+, scipy
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "aesara";
+  version = "2.9.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "aesara-devs";
+    repo = "aesara";
+    rev = "refs/tags/rel-${version}";
+    hash = "sha256-aO0+O7Ts9phsV4ghunNolxfAruGBbC+tHjVkmFedcCI=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    cons
+    etuples
+    filelock
+    logical-unification
+    minikanren
+    numpy
+    scipy
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    jax
+    jaxlib
+    numba
+    numba-scipy
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--durations=50" ""
+  '';
+
+  preBuild = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  pythonImportsCheck = [
+    "aesara"
+  ];
+
+  disabledTestPaths = [
+    # Don't run the most compute-intense tests
+    "tests/scan/"
+    "tests/tensor/"
+    "tests/sandbox/"
+    "tests/sparse/sandbox/"
+    # JAX is not available on all platform and often broken
+    "tests/link/jax/"
+  ];
+
+  disabledTests = [
+    # Disable all benchmark tests
+    "test_scan_multiple_output"
+    "test_logsumexp_benchmark"
+  ];
+
+  meta = with lib; {
+    description = "Python library to define, optimize, and efficiently evaluate mathematical expressions involving multi-dimensional arrays";
+    homepage = "https://github.com/aesara-devs/aesara";
+    changelog = "https://github.com/aesara-devs/aesara/releases/tag/rel-${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ Etjean ];
+    broken = (stdenv.isLinux && stdenv.isAarch64);
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aesedb/default.nix b/nixpkgs/pkgs/development/python-modules/aesedb/default.nix
new file mode 100644
index 000000000000..5dd95fe9eae5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aesedb/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, aiowinreg
+, buildPythonPackage
+, colorama
+, fetchFromGitHub
+, pycryptodomex
+, pythonOlder
+, setuptools
+, tqdm
+, unicrypto
+}:
+
+buildPythonPackage rec {
+  pname = "aesedb";
+  version = "0.1.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "skelsec";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-QqPy68rWabRY0Y98W+odwP/10gMtLAQ0Ah2+ZLkqHPI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiowinreg
+    colorama
+    pycryptodomex
+    tqdm
+    unicrypto
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aesedb"
+  ];
+
+  meta = with lib; {
+    description = "Parser for JET databases";
+    homepage = "https://github.com/skelsec/aesedb";
+    changelog = "https://github.com/skelsec/aesedb/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/afdko/default.nix b/nixpkgs/pkgs/development/python-modules/afdko/default.nix
new file mode 100644
index 000000000000..556261277ea0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/afdko/default.nix
@@ -0,0 +1,132 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pythonOlder
+, fonttools
+, defcon
+, lxml
+, fs
+, unicodedata2
+, zopfli
+, brotlipy
+, fontpens
+, brotli
+, fontmath
+, mutatormath
+, booleanoperations
+, ufoprocessor
+, ufonormalizer
+, psautohint
+, tqdm
+, setuptools-scm
+, scikit-build
+, cmake
+, ninja
+, antlr4_9
+, libxml2
+, pytestCheckHook
+# Enables some expensive tests, useful for verifying an update
+, runAllTests ? false
+, afdko
+}:
+
+buildPythonPackage rec {
+  pname = "afdko";
+  version = "4.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-66faoWBuCW0lQZP8/mBJLT+ErRGBl396HdG1RfPOYcM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+    scikit-build
+    cmake
+    ninja
+  ];
+
+  buildInputs = [
+    antlr4_9.runtime.cpp
+    libxml2.dev
+  ];
+
+  patches = [
+    # Don't try to install cmake and ninja using pip
+    ./no-pypi-build-tools.patch
+
+    # Use antlr4 runtime from nixpkgs and link it dynamically
+    ./use-dynamic-system-antlr4-runtime.patch
+  ];
+
+  env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.cc.isClang (toString [
+    "-Wno-error=incompatible-function-pointer-types"
+    "-Wno-error=int-conversion"
+  ]);
+
+  # setup.py will always (re-)execute cmake in buildPhase
+  dontConfigure = true;
+
+  propagatedBuildInputs = [
+    booleanoperations
+    fonttools
+    lxml           # fonttools[lxml], defcon[lxml] extra
+    fs             # fonttools[ufo] extra
+    unicodedata2   # fonttools[unicode] extra
+    brotlipy       # fonttools[woff] extra
+    zopfli         # fonttools[woff] extra
+    fontpens
+    brotli
+    defcon
+    fontmath
+    mutatormath
+    ufoprocessor
+    ufonormalizer
+    psautohint
+    tqdm
+  ];
+
+  # Use system libxml2
+  FORCE_SYSTEM_LIBXML2 = true;
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  preCheck = ''
+    export PATH=$PATH:$out/bin
+  '';
+
+  disabledTests = lib.optionals (!runAllTests) [
+    # Disable slow tests, reduces test time ~25 %
+    "test_report"
+    "test_post_overflow"
+    "test_cjk"
+    "test_extrapolate"
+    "test_filename_without_dir"
+    "test_overwrite"
+    "test_options"
+  ] ++ lib.optionals (stdenv.hostPlatform.isAarch || stdenv.hostPlatform.isRiscV) [
+    # unknown reason so far
+    # https://github.com/adobe-type-tools/afdko/issues/1425
+    "test_spec"
+  ] ++ lib.optionals (stdenv.hostPlatform.isi686) [
+    "test_dump_option"
+    "test_type1mm_inputs"
+  ];
+
+  passthru.tests = {
+    fullTestsuite = afdko.override { runAllTests = true; };
+  };
+
+  meta = with lib; {
+    changelog = "https://github.com/adobe-type-tools/afdko/blob/${version}/NEWS.md";
+    description = "Adobe Font Development Kit for OpenType";
+    homepage = "https://adobe-type-tools.github.io/afdko";
+    license = licenses.asl20;
+    maintainers = [ maintainers.sternenseemann ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/afdko/no-pypi-build-tools.patch b/nixpkgs/pkgs/development/python-modules/afdko/no-pypi-build-tools.patch
new file mode 100644
index 000000000000..4acc351e7bd7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/afdko/no-pypi-build-tools.patch
@@ -0,0 +1,24 @@
+commit 72b0ab672d1080049431eeee07ae6d2556ae9e4a
+Author: sternenseemann <sternenseemann@systemli.org>
+Date:   Tue Oct 5 18:17:20 2021 +0200
+
+    Don't use pypi distributions of build tools
+    
+    We want to use regular cmake and ninja and not the pypi projects which
+    somehow wrap and vendor a version of the proper tool.
+
+diff --git a/setup.py b/setup.py
+index 50deb781..81417971 100644
+--- a/setup.py
++++ b/setup.py
+@@ -196,9 +196,7 @@ def main():
+           setup_requires=[
+               'wheel',
+               'setuptools_scm',
+-              'scikit-build',
+-              'cmake',
+-              'ninja'
++              'scikit-build'
+           ],
+           tests_require=[
+               'pytest',
diff --git a/nixpkgs/pkgs/development/python-modules/afdko/use-dynamic-system-antlr4-runtime.patch b/nixpkgs/pkgs/development/python-modules/afdko/use-dynamic-system-antlr4-runtime.patch
new file mode 100644
index 000000000000..a8ecb02c3e78
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/afdko/use-dynamic-system-antlr4-runtime.patch
@@ -0,0 +1,53 @@
+commit 286b9c6e69691292dce4f2b4beaac8f886da184d
+Author: sternenseemann <sternenseemann@systemli.org>
+Date:   Tue Oct 5 18:16:10 2021 +0200
+
+    Link against system antlr4 runtime, dynamically
+    
+    Instead of cloning a antlr4 version from git, use the system one. Also
+    don't link it statically, but dynamically by default (the library is
+    called antlr4-runtime, not antlr4_static).
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 9ce80598..a75b6fb1 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -36,11 +36,11 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
+ # https://www.antlr.org/download/antlr4-cpp-runtime-4.9.3-source.zip
+ # set(ANTLR4_ZIP_REPOSITORY "/path_to_antlr4_archive/a4.zip")
+ 
+-add_definitions(-DANTLR4CPP_STATIC)
+ set(ANTLR4_WITH_STATIC_CRT OFF)
+ # 4.9.3 is the latest ANTLR4 version
+ set(ANTLR4_TAG tags/4.9.3)
+-include(ExternalAntlr4Cpp)
++find_path(ANTLR4_HEADER antlr4-runtime.h PATH_SUFFIXES antlr4-runtime)
++set(ANTLR4_INCLUDE_DIRS ${ANTLR4_HEADER})
+ 
+ FIND_PACKAGE(LibXml2)
+ IF (NOT ${LibXml2_FOUND})
+diff --git a/c/makeotf/lib/cffread/CMakeLists.txt b/c/makeotf/lib/cffread/CMakeLists.txt
+index 9a400fde..5452d987 100644
+--- a/c/makeotf/lib/cffread/CMakeLists.txt
++++ b/c/makeotf/lib/cffread/CMakeLists.txt
+@@ -13,6 +13,6 @@ else ()
+     endif()
+ endif()
+ 
+-target_link_libraries(makeotf_cffread PUBLIC antlr4_static)
++target_link_libraries(makeotf_cffread PUBLIC antlr4-runtime)
+ 
+ target_compile_definitions(makeotf_cffread PRIVATE $<$<CONFIG:Debug>:CFF_DEBUG=1> CFF_T13_SUPPORT=0)
+diff --git a/c/makeotf/lib/hotconv/CMakeLists.txt b/c/makeotf/lib/hotconv/CMakeLists.txt
+index 3cceceea..9695ea21 100644
+--- a/c/makeotf/lib/hotconv/CMakeLists.txt
++++ b/c/makeotf/lib/hotconv/CMakeLists.txt
+@@ -69,7 +69,7 @@ add_library(hotconv STATIC
+ 
+ set_property(TARGET hotconv PROPERTY C_STANDARD 99)
+ target_include_directories(hotconv PRIVATE AFTER $<$<COMPILE_LANGUAGE:CXX>:${ANTLR4_INCLUDE_DIRS}>)
+-target_link_libraries(hotconv PUBLIC antlr4_static)
++target_link_libraries(hotconv PUBLIC antlr4-runtime)
+ 
+ if (${LibXml2_FOUND})
+     target_link_libraries(hotconv PUBLIC ${LIBXML2_LIBRARY})
diff --git a/nixpkgs/pkgs/development/python-modules/affine/default.nix b/nixpkgs/pkgs/development/python-modules/affine/default.nix
new file mode 100644
index 000000000000..4f121cbdbf94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/affine/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, flit-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "affine";
+  version = "2.4.0";
+
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ok2BjWqDbBMZdtIvjCe408oy0K9kwdjSnet7r6TaHuo=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/rasterio/affine/blob/${version}/CHANGES.txt";
+    description = "Matrices describing affine transformation of the plane";
+    license = licenses.bsd3;
+    homepage = "https://github.com/rasterio/affine";
+    maintainers = with maintainers; [ mredaelli ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/afsapi/default.nix b/nixpkgs/pkgs/development/python-modules/afsapi/default.nix
new file mode 100644
index 000000000000..8d40361c6d06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/afsapi/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, lxml
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "afsapi";
+  version = "0.2.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "wlcrs";
+    repo = "python-afsapi";
+    rev = "refs/tags/${version}";
+    hash = "sha256-eE5BsXNtSU6YUhRn4/SKpMrqaYf8tyfLKdxxGOmNJ9I=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    lxml
+  ];
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "async_tests.py"
+  ];
+
+  pythonImportsCheck = [
+    "afsapi"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of the Frontier Silicon API";
+    homepage = "https://github.com/wlcrs/python-afsapi";
+    changelog = "https://github.com/wlcrs/python-afsapi/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/agate-dbf/default.nix b/nixpkgs/pkgs/development/python-modules/agate-dbf/default.nix
new file mode 100644
index 000000000000..0299a94ebb0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/agate-dbf/default.nix
@@ -0,0 +1,20 @@
+{ lib, fetchPypi, buildPythonPackage, agate, dbf, dbfread }:
+
+buildPythonPackage rec {
+    pname = "agate-dbf";
+    version = "0.2.2";
+
+    propagatedBuildInputs = [ agate dbf dbfread ];
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "589682b78c5c03f2dc8511e6e3edb659fb7336cd118e248896bb0b44c2f1917b";
+    };
+
+    meta = with lib; {
+      description = "Adds read support for dbf files to agate";
+      homepage    = "https://github.com/wireservice/agate-dbf";
+      license     = with licenses; [ mit ];
+      maintainers = with maintainers; [ vrthra ];
+    };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/agate-excel/default.nix b/nixpkgs/pkgs/development/python-modules/agate-excel/default.nix
new file mode 100644
index 000000000000..64b4718a2bc2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/agate-excel/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, agate
+, openpyxl
+, xlrd
+, olefile
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "agate-excel";
+  version = "0.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-KEJmGMkHRxEebVZumD2Djx4vrmQeppcNessOnUs4QJE=";
+  };
+
+  propagatedBuildInputs = [
+    agate
+    openpyxl
+    xlrd
+    olefile
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "agate"
+  ];
+
+  meta = with lib; {
+    description = "Adds read support for excel files to agate";
+    homepage = "https://github.com/wireservice/agate-excel";
+    changelog = "https://github.com/wireservice/agate-excel/blob/${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ vrthra ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/agate-sql/default.nix b/nixpkgs/pkgs/development/python-modules/agate-sql/default.nix
new file mode 100644
index 000000000000..a6c515d1d1cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/agate-sql/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchPypi
+, agate
+, sqlalchemy
+, crate
+, pytestCheckHook
+, geojson
+}:
+
+buildPythonPackage rec {
+  pname = "agate-sql";
+  version = "0.7.0";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uyHkkc3KzuYulOtod9KkHQmszVh2mrrCOLwvQt6JTMk=";
+  };
+
+  propagatedBuildInputs = [ agate sqlalchemy ];
+
+  nativeCheckInputs = [ crate geojson pytestCheckHook ];
+
+  pythonImportsCheck = [ "agatesql" ];
+
+  meta = with lib; {
+    description = "Adds SQL read/write support to agate.";
+    homepage = "https://github.com/wireservice/agate-sql";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ vrthra ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/agate/default.nix b/nixpkgs/pkgs/development/python-modules/agate/default.nix
new file mode 100644
index 000000000000..80daa780685b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/agate/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, babel
+, buildPythonPackage
+, cssselect
+, fetchFromGitHub
+, glibcLocales
+, isodate
+, leather
+, lxml
+, nose
+, parsedatetime
+, pyicu
+, python-slugify
+, pytimeparse
+, pythonOlder
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "agate";
+  version = "1.7.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "wireservice";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-7Ew9bgeheymCL8xXSW5li0LdFvGYb/7gPxmC4w6tHvM=";
+  };
+
+  propagatedBuildInputs = [
+    babel
+    isodate
+    leather
+    parsedatetime
+    python-slugify
+    pytimeparse
+  ];
+
+  nativeCheckInputs = [
+    cssselect
+    glibcLocales
+    lxml
+    nose
+    pyicu
+    pytz
+  ];
+
+  checkPhase = ''
+    LC_ALL="en_US.UTF-8" nosetests tests
+  '';
+
+  pythonImportsCheck = [
+    "agate"
+  ];
+
+  meta = with lib; {
+    description = "Python data analysis library that is optimized for humans instead of machines";
+    homepage = "https://github.com/wireservice/agate";
+    changelog = "https://github.com/wireservice/agate/blob/${version}/CHANGELOG.rst";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ vrthra ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/agent-py/default.nix b/nixpkgs/pkgs/development/python-modules/agent-py/default.nix
new file mode 100644
index 000000000000..2a9e358cf043
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/agent-py/default.nix
@@ -0,0 +1,26 @@
+{ aiohttp, buildPythonPackage, fetchPypi, isPy3k, lib, python, requests }:
+
+buildPythonPackage rec {
+  pname = "agent-py";
+  version = "0.0.23";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1hx88m8b8kfb2gm6hii5ldjv7hlvqf99cz0w2vj0d0grrxcbn5cz";
+  };
+
+  propagatedBuildInputs = [ requests aiohttp ];
+
+  checkPhase = ''
+    ${python.interpreter} tests/test_agent.py
+  '';
+
+  meta = with lib; {
+    description = "A python wrapper around the Agent REST API.";
+    homepage = "https://github.com/ispysoftware/agent-py";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jamiemagee ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aggdraw/default.nix b/nixpkgs/pkgs/development/python-modules/aggdraw/default.nix
new file mode 100644
index 000000000000..ef44979c4394
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aggdraw/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, fetchFromGitHub
+, fetchpatch
+, buildPythonPackage
+, packaging
+, setuptools
+, pkgconfig
+, freetype
+, pytest
+, python
+, pillow
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "aggdraw";
+  version = "1.3.16";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pytroll";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-2yajhuRyQ7BqghbSgPClW3inpw4TW2DhgQbomcRFx94=";
+  };
+
+  patches = [
+    # Removes `register` storage class specifier, which is not allowed in C++17.
+    (fetchpatch {
+      url = "https://github.com/pytroll/aggdraw/commit/157ed49803567e8c3eeb7dfeff4c116db35747f7.patch";
+      hash = "sha256-QSzpO90u5oSBWUzehRFbXgZ1ApEfLlfp11MUx6w11aI=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    packaging
+    setuptools
+    pkgconfig
+  ];
+
+  buildInputs = [
+    freetype
+  ];
+
+  nativeCheckInputs = [
+    numpy
+    pillow
+    pytest
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} selftest.py
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "aggdraw" ];
+
+  meta = with lib; {
+    description = "High quality drawing interface for PIL";
+    homepage = "https://github.com/pytroll/aggdraw";
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aigpy/default.nix b/nixpkgs/pkgs/development/python-modules/aigpy/default.nix
new file mode 100644
index 000000000000..50249e93ab04
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aigpy/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mutagen
+, requests
+, colorama
+, prettytable
+, pycrypto
+, pydub
+}:
+
+buildPythonPackage rec {
+  pname = "aigpy";
+  version = "2022.7.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-1kQced6YdC/wvegqFVhZfej4+4aemGXvKysKjejP13w=";
+  };
+
+  propagatedBuildInputs = [ mutagen requests colorama prettytable pycrypto pydub ];
+
+  meta = {
+    homepage = "https://github.com/AIGMix/AIGPY";
+    description = "A python library with miscellaneous tools";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.misterio77 ];
+    platforms = lib.platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ailment/default.nix b/nixpkgs/pkgs/development/python-modules/ailment/default.nix
new file mode 100644
index 000000000000..976a0d02fed4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ailment/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pyvex
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "ailment";
+  version = "9.2.79";
+  pyproject = true;
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "angr";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-aMp28g7a44u4VC0g3v9oVhYcBkSZkMJ/83eFTNNBbc0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pyvex
+  ];
+
+  # Tests depend on angr (possibly a circular dependency)
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ailment"
+  ];
+
+  meta = with lib; {
+    description = "The angr Intermediate Language";
+    homepage = "https://github.com/angr/ailment";
+    license = with licenses; [ bsd2 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aio-geojson-client/default.nix b/nixpkgs/pkgs/development/python-modules/aio-geojson-client/default.nix
new file mode 100644
index 000000000000..22c59bd64d9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aio-geojson-client/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, geojson
+, haversine
+, mock
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aio-geojson-client";
+  version = "0.18";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-aio-geojson-client";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-nvfy1XLiMjyCiQo/YuzRbDtxGmAUAiq8UJwS/SkN3oM=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    geojson
+    haversine
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aio_geojson_client"
+  ];
+
+  meta = with lib; {
+    description = "Python module for accessing GeoJSON feeds";
+    homepage = "https://github.com/exxamalte/python-aio-geojson-client";
+    changelog = "https://github.com/exxamalte/python-aio-geojson-client/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aio-geojson-generic-client/default.nix b/nixpkgs/pkgs/development/python-modules/aio-geojson-generic-client/default.nix
new file mode 100644
index 000000000000..4ff502a2cf83
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aio-geojson-generic-client/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, aio-geojson-client
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "aio-geojson-generic-client";
+  version = "0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-aio-geojson-generic-client";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-toDvliFMxicaEhlxb7wCadDJErpsIPcZbJz7TpO83GE=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    aio-geojson-client
+    pytz
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aio_geojson_generic_client"
+  ];
+
+  meta = with lib; {
+    description = "Python library for accessing GeoJSON feeds";
+    homepage = "https://github.com/exxamalte/python-aio-geojson-generic-client";
+    changelog = "https://github.com/exxamalte/python-aio-geojson-generic-client/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aio-geojson-geonetnz-quakes/default.nix b/nixpkgs/pkgs/development/python-modules/aio-geojson-geonetnz-quakes/default.nix
new file mode 100644
index 000000000000..f8daf10c3c1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aio-geojson-geonetnz-quakes/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, aio-geojson-client
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pytz
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aio-geojson-geonetnz-quakes";
+  version = "0.15";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-aio-geojson-geonetnz-quakes";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-/EPPEGLtiZBorZMnVg0NqwnHCbCXyZzz4449MzAYQx8=";
+  };
+
+  propagatedBuildInputs = [
+    aio-geojson-client
+    aiohttp
+    pytz
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aio_geojson_geonetnz_quakes"
+  ];
+
+  meta = with lib; {
+    description = "Python module for accessing the GeoNet NZ Quakes GeoJSON feeds";
+    homepage = "https://github.com/exxamalte/python-aio-geojson-geonetnz-quakes";
+    changelog = "https://github.com/exxamalte/python-aio-geojson-geonetnz-quakes/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aio-geojson-geonetnz-volcano/default.nix b/nixpkgs/pkgs/development/python-modules/aio-geojson-geonetnz-volcano/default.nix
new file mode 100644
index 000000000000..d97070df5907
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aio-geojson-geonetnz-volcano/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, aio-geojson-client
+, aiohttp
+, aresponses
+, mock
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pytz
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aio-geojson-geonetnz-volcano";
+  version = "0.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-aio-geojson-geonetnz-volcano";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-wJVFjy6QgYb6GX9pZTylYFvCRWmD2lAFZKnodsa8Yqo=";
+  };
+
+  propagatedBuildInputs = [
+    aio-geojson-client
+    aiohttp
+    pytz
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aio_geojson_geonetnz_volcano"
+  ];
+
+  meta = with lib; {
+    description = "Python module for accessing the GeoNet NZ Volcanic GeoJSON feeds";
+    homepage = "https://github.com/exxamalte/pythonaio-geojson-geonetnz-volcano";
+    changelog = "https://github.com/exxamalte/python-aio-geojson-geonetnz-volcano/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aio-geojson-nsw-rfs-incidents/default.nix b/nixpkgs/pkgs/development/python-modules/aio-geojson-nsw-rfs-incidents/default.nix
new file mode 100644
index 000000000000..bf18c2bf184b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aio-geojson-nsw-rfs-incidents/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, aio-geojson-client
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pytz
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aio-geojson-nsw-rfs-incidents";
+  version = "0.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-aio-geojson-nsw-rfs-incidents";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-pn0r5iLpNnK3xmAhq/oX90hdiHgFDuwDQqfAzkp5jmw=";
+  };
+
+  propagatedBuildInputs = [
+    aio-geojson-client
+    aiohttp
+    pytz
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aio_geojson_nsw_rfs_incidents"
+  ];
+
+  meta = with lib; {
+    description = "Python module for accessing the NSW Rural Fire Service incidents feeds";
+    homepage = "https://github.com/exxamalte/python-aio-geojson-nsw-rfs-incidents";
+    changelog = "https://github.com/exxamalte/python-aio-geojson-geonetnz-quakes/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aio-geojson-usgs-earthquakes/default.nix b/nixpkgs/pkgs/development/python-modules/aio-geojson-usgs-earthquakes/default.nix
new file mode 100644
index 000000000000..89a1fd75b8f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aio-geojson-usgs-earthquakes/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, aio-geojson-client
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pytz
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aio-geojson-usgs-earthquakes";
+  version = "0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-aio-geojson-usgs-earthquakes";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ET8wcOep4tSZJXyL+XvfW2j9eKp6LrBk/g18ZlgLIzc=";
+  };
+
+  propagatedBuildInputs = [
+    aio-geojson-client
+    aiohttp
+    pytz
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  checkInputs = [
+    aresponses
+    pytest-asyncio
+  ];
+
+  pythonImportsCheck = [
+    "aio_geojson_usgs_earthquakes"
+  ];
+
+  meta = with lib; {
+    description = "Python module for accessing the U.S. Geological Survey Earthquake Hazards Program feeds";
+    homepage = "https://github.com/exxamalte/python-aio-geojson-usgs-earthquakes";
+    changelog = "https://github.com/exxamalte/python-aio-geojson-usgs-earthquakes/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aio-georss-client/default.nix b/nixpkgs/pkgs/development/python-modules/aio-georss-client/default.nix
new file mode 100644
index 000000000000..9c3cda759039
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aio-georss-client/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, dateparser
+, fetchFromGitHub
+, haversine
+, mock
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, requests
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "aio-georss-client";
+  version = "0.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-aio-georss-client";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Voc1ME0iGQCMaDfBXDSVnRp8olvId+fLhH8sqHwB2Ak=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    haversine
+    xmltodict
+    requests
+    dateparser
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aio_georss_client"
+  ];
+
+  meta = with lib; {
+    description = "Python library for accessing GeoRSS feeds";
+    homepage = "https://github.com/exxamalte/python-aio-georss-client";
+    changelog = "https://github.com/exxamalte/python-aio-georss-client/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aio-georss-gdacs/default.nix b/nixpkgs/pkgs/development/python-modules/aio-georss-gdacs/default.nix
new file mode 100644
index 000000000000..f55a42b5dd22
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aio-georss-gdacs/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, aio-georss-client
+, aresponses
+, buildPythonPackage
+, dateparser
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aio-georss-gdacs";
+  version = "0.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-aio-georss-gdacs";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-1mpOWd4Z2gTQtRewWfZsfEtmS6i5uMPAMTlC8UpawxM=";
+  };
+
+  propagatedBuildInputs = [
+    aio-georss-client
+    dateparser
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aio_georss_gdacs"
+  ];
+
+  meta = with lib; {
+    description = "Python library for accessing GeoRSS feeds";
+    homepage = "https://github.com/exxamalte/python-aio-georss-gdacs";
+    changelog = "https://github.com/exxamalte/python-aio-georss-gdacs/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aio-pika/default.nix b/nixpkgs/pkgs/development/python-modules/aio-pika/default.nix
new file mode 100644
index 000000000000..574d386b95de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aio-pika/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, aiomisc-pytest
+, aiormq
+, buildPythonPackage
+, fetchFromGitHub
+, pamqp
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, shortuuid
+, typing-extensions
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "aio-pika";
+  version = "9.3.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mosquito";
+    repo = "aio-pika";
+    rev = "refs/tags/${version}";
+    hash = "sha256-RbDiJvbFNuXIqFvevLpk5sy5WDinwaWwSqa+XI6Dljo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiormq
+    yarl
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    aiomisc-pytest
+    pamqp
+    pytestCheckHook
+    shortuuid
+  ];
+
+  disabledTestPaths = [
+    # Tests attempt to connect to a RabbitMQ server
+    "tests/test_amqp.py"
+    "tests/test_amqp_robust.py"
+    "tests/test_amqp_robust_proxy.py"
+    "tests/test_amqps.py"
+    "tests/test_master.py"
+    "tests/test_memory_leak.py"
+    "tests/test_rpc.py"
+    "tests/test_types.py"
+  ];
+
+  pythonImportsCheck = [
+    "aio_pika"
+  ];
+
+  meta = with lib; {
+    description = "AMQP 0.9 client designed for asyncio and humans";
+    homepage = "https://github.com/mosquito/aio-pika";
+    changelog = "https://github.com/mosquito/aio-pika/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ emilytrau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioairq/default.nix b/nixpkgs/pkgs/development/python-modules/aioairq/default.nix
new file mode 100644
index 000000000000..13eff2506598
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioairq/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pycryptodome
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioairq";
+  version = "0.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "CorantGmbH";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-SRsDSHTZkkygaQZjHENKNLx3ZWMi/PubS1m/MonEKNk=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    pycryptodome
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aioairq"
+  ];
+
+  meta = with lib; {
+    description = "Library to retrieve data from air-Q devices";
+    homepage = "https://github.com/CorantGmbH/aioairq";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioairzone-cloud/default.nix b/nixpkgs/pkgs/development/python-modules/aioairzone-cloud/default.nix
new file mode 100644
index 000000000000..c494b81b6335
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioairzone-cloud/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "aioairzone-cloud";
+  version = "0.3.6";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Noltari";
+    repo = "aioairzone-cloud";
+    rev = "refs/tags/${version}";
+    hash = "sha256-K2/q4JQV6GkNXJ6pKDPfhwKvftdezMp5VdOa5iabmvk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  pythonImportsCheck = [
+    "aioairzone_cloud"
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Library to control Airzone via Cloud API";
+    homepage = "https://github.com/Noltari/aioairzone-cloud";
+    changelog = "https://github.com/Noltari/aioairzone-cloud/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioairzone/default.nix b/nixpkgs/pkgs/development/python-modules/aioairzone/default.nix
new file mode 100644
index 000000000000..39c12ac6e2c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioairzone/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "aioairzone";
+  version = "0.6.9";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "Noltari";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-0nbH0pnTYRuSOkzG5Yn/fJmRKtXBMd6ti6Z+AW72j3Q=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aioairzone"
+  ];
+
+  meta = with lib; {
+    description = "Module to control AirZone devices";
+    homepage = "https://github.com/Noltari/aioairzone";
+    changelog = "https://github.com/Noltari/aioairzone/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/aioaladdinconnect/default.nix b/nixpkgs/pkgs/development/python-modules/aioaladdinconnect/default.nix
new file mode 100644
index 000000000000..f1bee9f07ea1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioaladdinconnect/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioaladdinconnect";
+  version = "0.1.58";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "AIOAladdinConnect";
+    inherit version;
+    hash = "sha256-ymynaOKvnqqHIEuQc+5CagsaH5cHnQit8ileoUO6G+I=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "AIOAladdinConnect"
+  ];
+
+  meta = with lib; {
+    description = "Library for controlling Genie garage doors connected to Aladdin Connect devices";
+    homepage = "https://github.com/mkmer/AIOAladdinConnect";
+    changelog = "https://github.com/mkmer/AIOAladdinConnect/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioambient/default.nix b/nixpkgs/pkgs/development/python-modules/aioambient/default.nix
new file mode 100644
index 000000000000..7ec26592696b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioambient/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, python-engineio
+, python-socketio
+, pythonOlder
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "aioambient";
+  version = "2023.10.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Q7jb0tJsbVM2vEqKgjXOWJN2OwR9qLchU/4ShOUGPT4=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'websockets = ">=11.0.1"' 'websockets = "*"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    python-engineio
+    python-socketio
+    websockets
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  # Ignore the examples directory as the files are prefixed with test_
+  disabledTestPaths = [
+    "examples/"
+  ];
+
+  pythonImportsCheck = [
+    "aioambient"
+  ];
+
+  meta = with lib; {
+    description = "Python library for the Ambient Weather API";
+    homepage = "https://github.com/bachya/aioambient";
+    changelog = "https://github.com/bachya/aioambient/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioamqp/default.nix b/nixpkgs/pkgs/development/python-modules/aioamqp/default.nix
new file mode 100644
index 000000000000..8bdc72a019ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioamqp/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pamqp
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioamqp";
+  version = "0.15.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Polyconseil";
+    repo = pname;
+    rev = "${pname}-${version}";
+    hash = "sha256-fssPknJn1tLtzb+2SFyZjfdhUdD8jqkwlInoi5uaplk=";
+  };
+
+  propagatedBuildInputs = [
+    pamqp
+  ];
+
+  # Tests assume rabbitmq server running
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aioamqp"
+  ];
+
+  meta = with lib; {
+    description = "AMQP implementation using asyncio";
+    homepage = "https://github.com/polyconseil/aioamqp";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioapns/default.nix b/nixpkgs/pkgs/development/python-modules/aioapns/default.nix
new file mode 100644
index 000000000000..4b6c4faa123a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioapns/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, h2
+, pyjwt
+, pyopenssl
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "aioapns";
+  version = "3.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BUSRIDAxeVKlZteYgGZZkMcUn6hAo1fWCbuZcHZXUhU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    h2
+    pyopenssl
+    pyjwt
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aioapns"
+  ];
+
+  meta = with lib; {
+    description = "An efficient APNs Client Library";
+    homepage = "https://github.com/Fatal1ty/aioapns";
+    changelog = "https://github.com/Fatal1ty/aioapns/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioaseko/default.nix b/nixpkgs/pkgs/development/python-modules/aioaseko/default.nix
new file mode 100644
index 000000000000..beea7e05a750
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioaseko/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, pyjwt
+}:
+
+buildPythonPackage rec {
+  pname = "aioaseko";
+  version = "0.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "milanmeu";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-bjPl0yrRaTIEEuPV8NbWu2hx/es5bcu2tDBZV+95fUc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pyjwt
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aioaseko"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with the Aseko Pool Live API";
+    homepage = "https://github.com/milanmeu/aioaseko";
+    changelog = "https://github.com/milanmeu/aioaseko/releases/tag/v${version}";
+    license = with licenses; [ lgpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioasuswrt/default.nix b/nixpkgs/pkgs/development/python-modules/aioasuswrt/default.nix
new file mode 100644
index 000000000000..00d451a2b422
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioasuswrt/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, asyncssh
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aioasuswrt";
+  version = "1.4.0";
+
+  src = fetchFromGitHub {
+    owner = "kennedyshead";
+    repo = pname;
+    rev = "V${version}";
+    sha256 = "1iv9f22v834g8wrjcynjn2azpzk8gsczv71jf7dw8aix0n04h325";
+  };
+
+  propagatedBuildInputs = [
+    asyncssh
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov-report html" "" \
+      --replace "--cov-report term-missing" ""
+  '';
+
+  pythonImportsCheck = [
+    "aioasuswrt"
+  ];
+
+  meta = with lib; {
+    description = "Python module for Asuswrt";
+    homepage = "https://github.com/kennedyshead/aioasuswrt";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioazuredevops/default.nix b/nixpkgs/pkgs/development/python-modules/aioazuredevops/default.nix
new file mode 100644
index 000000000000..2054b49b7ce2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioazuredevops/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchPypi
+, aiohttp
+, click
+}:
+
+buildPythonPackage rec {
+  pname = "aioazuredevops";
+  version = "1.4.3";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vNTvSQYjjptdPsHz0zM9paq3iodZrhcEralPm6YRZJE=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    click
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aioazuredevops.builds"
+    "aioazuredevops.client"
+    "aioazuredevops.core"
+  ];
+
+  meta = with lib; {
+    description = "Get data from the Azure DevOps API";
+    homepage = "https://github.com/timmo001/aioazuredevops";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiobafi6/default.nix b/nixpkgs/pkgs/development/python-modules/aiobafi6/default.nix
new file mode 100644
index 000000000000..9bdd4f9eb420
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiobafi6/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, zeroconf
+}:
+
+buildPythonPackage rec {
+  pname = "aiobafi6";
+  version = "0.9.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "jfroy";
+    repo = "aiobafi6";
+    rev = "refs/tags/${version}";
+    hash = "sha256-QxjrspvNrcMcGChjj1B4QF/SnWCsGmPxnI2bWAL6BiI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    protobuf
+    zeroconf
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aiobafi6"
+  ];
+
+  meta = with lib; {
+    description = "Library for communication with the Big Ass Fans i6 firmware";
+    homepage = "https://github.com/jfroy/aiobafi6";
+    changelog = "https://github.com/jfroy/aiobafi6/releases/tag/0.8.2";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiobiketrax/default.nix b/nixpkgs/pkgs/development/python-modules/aiobiketrax/default.nix
new file mode 100644
index 000000000000..757c9c1915d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiobiketrax/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, aiohttp
+, auth0-python
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pyjwt
+, pytest-aiohttp
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "aiobiketrax";
+  version = "1.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "basilfx";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-YvPWvdA4BslkOLt3IkzSgUgex8h1CjCOVZC6oxNf3ZA=";
+  };
+
+  postPatch = ''
+    # https://github.com/basilfx/aiobiketrax/pull/63
+    substituteInPlace aiobiketrax/api.py \
+      --replace "auth0.v3" "auth0"
+  '';
+
+  pythonRelaxDeps = [
+    "auth0-python"
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    auth0-python
+    python-dateutil
+    pyjwt
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aiobiketrax"
+  ];
+
+  meta = with lib; {
+    description = "Library for interacting with the PowUnity BikeTrax GPS tracker";
+    homepage = "https://github.com/basilfx/aiobiketrax";
+    changelog = "https://github.com/basilfx/aiobiketrax/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioblescan/default.nix b/nixpkgs/pkgs/development/python-modules/aioblescan/default.nix
new file mode 100644
index 000000000000..312dcd20ee90
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioblescan/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioblescan";
+  version = "0.2.14";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "frawau";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-JeA9jX566OSRiejdnlifbcNGm0J0C+xzA6zXDUyZ6jc=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aioblescan"
+  ];
+
+  meta = with lib; {
+    description = "Library to listen for BLE advertized packets";
+    homepage = "https://github.com/frawau/aioblescan";
+    changelog = "https://github.com/frawau/aioblescan/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioboto3/default.nix b/nixpkgs/pkgs/development/python-modules/aioboto3/default.nix
new file mode 100644
index 000000000000..6494bf65a6e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioboto3/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, poetry-dynamic-versioning
+, aiobotocore
+, chalice
+, cryptography
+, boto3
+, pytestCheckHook
+, pytest-asyncio
+, requests
+, aiofiles
+, moto
+, dill
+}:
+
+buildPythonPackage rec {
+  pname = "aioboto3";
+  version = "11.3.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "terrycain";
+    repo = "aioboto3";
+    rev = "v${version}";
+    hash = "sha256-jU9sKhbUdVeOvOXQnXR/S/4sBwTNcQCc9ZduO+HDXho=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+    --replace poetry.masonry.api poetry.core.masonry.api \
+    --replace "poetry>=0.12" "poetry-core>=0.12"
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+    poetry-dynamic-versioning
+  ];
+
+  propagatedBuildInputs = [
+    aiobotocore
+    boto3
+  ];
+
+  passthru.optional-dependencies = {
+    chalice = [
+      chalice
+    ];
+    s3cse = [
+      cryptography
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+    requests
+    aiofiles
+    moto
+    dill
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [ "aioboto3" ];
+
+  meta = with lib; {
+    description = "Wrapper to use boto3 resources with the aiobotocore async backend";
+    homepage = "https://github.com/terrycain/aioboto3";
+    changelog = "https://github.com/terrycain/aioboto3/blob/${src.rev}/CHANGELOG.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiobotocore/default.nix b/nixpkgs/pkgs/development/python-modules/aiobotocore/default.nix
new file mode 100644
index 000000000000..5f226d26018e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiobotocore/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, aiohttp
+, aioitertools
+, botocore
+, buildPythonPackage
+, dill
+, fetchFromGitHub
+, flask
+, flask-cors
+, moto
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, wrapt
+}:
+
+buildPythonPackage rec {
+  pname = "aiobotocore";
+  version = "2.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-e8FBUG08yWNL9B51Uv4ftYx1C0kcdoweOreUtvvvTAk=";
+  };
+
+  # Relax version constraints: aiobotocore works with newer botocore versions
+  # the pinning used to match some `extras_require` we're not using.
+  postPatch = ''
+    sed -i "s/'botocore>=.*'/'botocore'/" setup.py
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+    aioitertools
+    botocore
+    wrapt
+  ];
+
+  nativeCheckInputs = [
+    dill
+    flask
+    flask-cors
+    moto
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aiobotocore"
+  ];
+
+  disabledTestPaths = [
+    # Tests require network access
+    "tests/boto_tests/test_signers.py"
+    "tests/python3.8/"
+    "tests/test_basic_s3.py"
+    "tests/test_batch.py"
+    "tests/test_dynamodb.py"
+    "tests/test_ec2.py"
+    "tests/test_eventstreams.py"
+    "tests/test_lambda.py"
+    "tests/test_monitor.py"
+    "tests/test_mturk.py"
+    "tests/test_patches.py"
+    "tests/test_sns.py"
+    "tests/test_sqs.py"
+    "tests/test_version.py"
+    "tests/test_waiter.py"
+  ];
+
+  disabledTests = [
+    "test_get_credential"
+    "test_load_sso_credentials_without_cache"
+    "test_load_sso_credentials"
+    "test_required_config_not_set"
+    "test_sso_cred_fetcher_raises_helpful_message_on_unauthorized_exception"
+    "test_sso_credential_fetcher_can_fetch_credentials"
+  ];
+
+  meta = with lib; {
+    description = "Python client for amazon services";
+    homepage = "https://github.com/aio-libs/aiobotocore";
+    changelog = "https://github.com/aio-libs/aiobotocore/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ teh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiobroadlink/default.nix b/nixpkgs/pkgs/development/python-modules/aiobroadlink/default.nix
new file mode 100644
index 000000000000..4be53769784b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiobroadlink/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiobroadlink";
+  version = "0.1.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uTUtDhL9VtWZE+Y6ZJY4prmlE+Yh2UrCg5+eSyAQzMk=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aiobroadlink"
+  ];
+
+  meta = with lib; {
+    description = "Python module to control various Broadlink devices";
+    homepage = "https://github.com/frawau/aiobroadlink";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiocache/default.nix b/nixpkgs/pkgs/development/python-modules/aiocache/default.nix
new file mode 100644
index 000000000000..215a4029daca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiocache/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, aioredis
+, buildPythonPackage
+, fetchFromGitHub
+, msgpack
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiocache";
+  version = "0.12.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-yvXDNJL8uxReaU81klVWudJwh1hmvg5GeeILcNpm/YA=";
+  };
+
+  passthru.optional-dependencies = {
+    redis = [
+      aioredis
+    ];
+    msgpack = [
+      msgpack
+    ];
+  };
+
+  # aiomcache would be required but last release was in 2017
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aiocache"
+  ];
+
+  meta = with lib; {
+    description = "Python API Rate Limit Decorator";
+    homepage = "https://github.com/aio-libs/aiocache";
+    changelog = "https://github.com/aio-libs/aiocache/releases/tag/v${version}";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiocoap/default.nix b/nixpkgs/pkgs/development/python-modules/aiocoap/default.nix
new file mode 100644
index 000000000000..4feb6fc185c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiocoap/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pygments
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiocoap";
+  version = "0.4.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "chrysn";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-4iwoPfmIwk+PlWUp60aqA5qZgzyj34pnZHf9uH5UhnY=";
+  };
+
+  propagatedBuildInputs = [
+    pygments
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Don't test the plugins
+    "tests/test_tls.py"
+    "tests/test_reverseproxy.py"
+    "tests/test_oscore_plugtest.py"
+  ];
+
+  disabledTests = [
+    # Communication is not properly mocked
+    "test_uri_parser"
+  ];
+
+  pythonImportsCheck = [
+    "aiocoap"
+  ];
+
+  meta = with lib; {
+    description = "Python CoAP library";
+    homepage = "https://aiocoap.readthedocs.io/";
+    changelog = "https://github.com/chrysn/aiocoap/blob/${version}/NEWS";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiocomelit/default.nix b/nixpkgs/pkgs/development/python-modules/aiocomelit/default.nix
new file mode 100644
index 000000000000..82007382c23a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiocomelit/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, colorlog
+, fetchFromGitHub
+, pint
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiocomelit";
+  version = "0.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "chemelli74";
+    repo = "aiocomelit";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-bs+iSe4vu0ej4SQww6mvQqboVKfQrkd9OirBLGbU3gs=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=aiocomelit --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pint
+  ];
+
+  nativeCheckInputs = [
+    colorlog
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aiocomelit"
+  ];
+
+  meta = with lib; {
+    description = "Library to control Comelit Simplehome";
+    homepage = "https://github.com/chemelli74/aiocomelit";
+    changelog = "https://github.com/chemelli74/aiocomelit/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioconsole/default.nix b/nixpkgs/pkgs/development/python-modules/aioconsole/default.nix
new file mode 100644
index 000000000000..1845a2501603
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioconsole/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+# This package provides a binary "apython" which sometimes invokes
+# [sys.executable, '-m', 'aioconsole'] as a subprocess. If apython is
+# run directly out of this derivation, it won't work, because
+# sys.executable will point to a Python binary that is not wrapped to
+# be able to find aioconsole.
+# However, apython will work fine when using python##.withPackages,
+# because with python##.withPackages the sys.executable is already
+# wrapped to be able to find aioconsole and any other packages.
+buildPythonPackage rec {
+  pname = "aioconsole";
+  version = "0.6.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "vxgmichel";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-axUJLh7yg2A+HB0fxBueuNT/rohHVq6svQUZvR2LKzo=";
+  };
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov aioconsole --count 2" ""
+  '';
+
+  __darwinAllowLocalNetworking = true;
+
+  disabledTests = [
+    "test_interact_syntax_error"
+    # Output and the sandbox don't work well together
+    "test_interact_multiple_indented_lines"
+  ];
+
+  pythonImportsCheck = [
+    "aioconsole"
+  ];
+
+  meta = with lib; {
+    description = "Asynchronous console and interfaces for asyncio";
+    homepage = "https://github.com/vxgmichel/aioconsole";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ catern ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiocontextvars/default.nix b/nixpkgs/pkgs/development/python-modules/aiocontextvars/default.nix
new file mode 100644
index 000000000000..24f6f1b2e488
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiocontextvars/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pytest-asyncio
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "aiocontextvars";
+  version = "0.2.2";
+  format = "setuptools";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "fantix";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0a2gmrm9csiknc8n3si67sgzffkydplh9d7ga1k87ygk2aj22mmk";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'," ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  meta = with lib; {
+    description = "Asyncio support for PEP-567 contextvars backport";
+    homepage = "https://github.com/fantix/aiocontextvars";
+    license = licenses.bsd3;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiocron/default.nix b/nixpkgs/pkgs/development/python-modules/aiocron/default.nix
new file mode 100644
index 000000000000..2b3f6e595d36
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiocron/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, croniter
+, tzlocal
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aiocron";
+  version = "1.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-SFRlE/ry63kB5lpk66e2U8gBBu0A7ZyjQZw9ELZVWgE=";
+  };
+
+  propagatedBuildInputs = [
+    croniter
+    tzlocal
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    tzlocal
+  ];
+
+  postPatch = ''
+    sed -i "/--cov/d" setup.cfg
+    sed -i "/--ignore/d" setup.cfg
+  '';
+
+  postInstall = ''
+    rm -rf $out/${python.sitePackages}/tests
+  '';
+
+  pythonImportsCheck = [ "aiocron" ];
+
+  meta = with lib; {
+    description = "Crontabs for asyncio";
+    homepage = "https://github.com/gawel/aiocron/";
+    license = licenses.mit;
+    maintainers = [ maintainers.starcraft66 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiocsv/default.nix b/nixpkgs/pkgs/development/python-modules/aiocsv/default.nix
new file mode 100644
index 000000000000..8feda8b86aa8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiocsv/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, aiofiles
+, buildPythonPackage
+, cython
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiocsv";
+  version = "1.2.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "MKuranowski";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-4QvVYcTpwhFH57r+iMgmYciWIC2prRnL+ih7qx/CA/U=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  nativeCheckInputs = [
+    aiofiles
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  preBuild = ''
+    export CYTHONIZE=1
+  '';
+
+  pythonImportsCheck = [
+    "aiocsv"
+  ];
+
+  disabledTestPaths = [
+    # Import issue
+    "tests/test_parser.py"
+  ];
+
+  meta = with lib; {
+    description = "Library for for asynchronous CSV reading/writing";
+    homepage = "https://github.com/MKuranowski/aiocsv";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiocurrencylayer/default.nix b/nixpkgs/pkgs/development/python-modules/aiocurrencylayer/default.nix
new file mode 100644
index 000000000000..39fb1deeb9b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiocurrencylayer/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, poetry-core
+, pytest-asyncio
+, pytest-httpx
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiocurrencylayer";
+  version = "1.0.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-ecosystem";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-468OBQV7ISnPRUfi/CM3dCh1ez0jwSVnM6DduPvAgPI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-httpx
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aiocurrencylayer"
+  ];
+
+  meta = with lib; {
+    description = "Python API for interacting with currencylayer";
+    homepage = "https://github.com/home-assistant-ecosystem/aiocurrencylayer";
+    changelog = "https://github.com/home-assistant-ecosystem/aiocurrencylayer/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiodiscover/default.nix b/nixpkgs/pkgs/development/python-modules/aiodiscover/default.nix
new file mode 100644
index 000000000000..3a7af196d172
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiodiscover/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, dnspython
+, fetchFromGitHub
+, ifaddr
+, netifaces
+, pyroute2
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiodiscover";
+  version = "1.5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-rFypv0gCj+Jskk+dlRNJ2ufj2sDud7AuJzj3cl4bB4Y=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+    dnspython
+    netifaces
+    pyroute2
+    ifaddr
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner>=5.2",' ""
+  '';
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests require access to /etc/resolv.conf
+    "test_async_discover_hosts"
+  ];
+
+  pythonImportsCheck = [
+    "aiodiscover"
+  ];
+
+  meta = with lib; {
+    description = "Python module to discover hosts via ARP and PTR lookup";
+    homepage = "https://github.com/bdraco/aiodiscover";
+    changelog = "https://github.com/bdraco/aiodiscover/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiodns/default.nix b/nixpkgs/pkgs/development/python-modules/aiodns/default.nix
new file mode 100644
index 000000000000..a5cf035aa060
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiodns/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pycares
+, pythonOlder
+, typing
+}:
+
+buildPythonPackage rec {
+  pname = "aiodns";
+  version = "3.0.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "saghul";
+    repo = pname;
+    rev = "aiodns-${version}";
+    sha256 = "1i91a43gsq222r8212jn4m6bxc3fl04z1mf2h7s39nqywxkggvlp";
+  };
+
+  propagatedBuildInputs = [
+    pycares
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    typing
+  ];
+
+  # Could not contact DNS servers
+  doCheck = false;
+
+  pythonImportsCheck = [ "aiodns" ];
+
+  meta = with lib; {
+    description = "Simple DNS resolver for asyncio";
+    homepage = "https://github.com/saghul/aiodns";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiodocker/default.nix b/nixpkgs/pkgs/development/python-modules/aiodocker/default.nix
new file mode 100644
index 000000000000..b6cc55d7fd84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiodocker/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+}:
+
+buildPythonPackage rec {
+  pname = "aiodocker";
+  # unstable includes support for python 3.10+
+  version = "unstable-2022-01-20";
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = pname;
+    rev = "f1dbdc3d42147f4c2ab5e6802acf6f7d0f885be4";
+    sha256 = "RL5Ck4wsBZO88afmoojeFKbdIeCjDo/SwNqUcERH6Ls=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # tests require docker daemon
+  doCheck = false;
+  pythonImportsCheck = [ "aiodocker" ];
+
+  meta = with lib; {
+    description = "Docker API client for asyncio";
+    homepage = "https://github.com/aio-libs/aiodocker";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ emilytrau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioeafm/default.nix b/nixpkgs/pkgs/development/python-modules/aioeafm/default.nix
new file mode 100644
index 000000000000..f1535eb07d90
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioeafm/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pytest-aiohttp
+, pytest-asyncio
+, pytest-cov
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aioeafm";
+  version = "1.0.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "Jc2k";
+    repo = pname;
+    rev = version;
+    sha256 = "048cxn3fw2hynp27zlizq7k8ps67qq9sib1ddgirnxy5zc87vgkc";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "use-poetry-core.patch";
+      url = "https://github.com/Jc2k/aioeafm/commit/549590e2ed465be40e2406416d89b8a8cd8c6185.patch";
+      hash = "sha256-cG/vQI1XQO8LVvWsHrAj8KlPGRulvO7Ny+k0CKUpPqQ=";
+    })
+  ];
+
+  nativeBuildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytest-asyncio
+    pytest-cov
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "aioeafm" ];
+
+  meta = with lib; {
+    description = "Python client for access the Real Time flood monitoring API";
+    homepage = "https://github.com/Jc2k/aioeafm";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioeagle/default.nix b/nixpkgs/pkgs/development/python-modules/aioeagle/default.nix
new file mode 100644
index 000000000000..8862758880c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioeagle/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "aioeagle";
+  version = "1.1.0";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = version;
+    sha256 = "117nb50cxwrixif2r6fxmr9v0jxkcamm816v48hbhyc660w6xvk4";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    xmltodict
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "aioeagle" ];
+
+  meta = with lib; {
+    description = "Python library to control EAGLE-200";
+    homepage = "https://github.com/home-assistant-libs/aioeagle";
+    changelog = "https://github.com/home-assistant-libs/aioshelly/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioecowitt/default.nix b/nixpkgs/pkgs/development/python-modules/aioecowitt/default.nix
new file mode 100644
index 000000000000..6d7600a1c7b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioecowitt/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, meteocalc
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioecowitt";
+  version = "2023.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-uEA3OA/QOQ/h6ZMnb5hGQXHyqNO+KLmDSZMQBvmRwtE=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    meteocalc
+  ];
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aioecowitt"
+  ];
+
+  meta = with lib; {
+    description = "Wrapper for the EcoWitt protocol";
+    homepage = "https://github.com/home-assistant-libs/aioecowitt";
+    changelog = "https://github.com/home-assistant-libs/aioecowitt/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioelectricitymaps/default.nix b/nixpkgs/pkgs/development/python-modules/aioelectricitymaps/default.nix
new file mode 100644
index 000000000000..79a07c06e9e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioelectricitymaps/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, dataclasses-json
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, syrupy
+}:
+
+buildPythonPackage rec {
+  pname = "aioelectricitymaps";
+  version = "0.1.5";
+  pyproject = true;
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "jpbede";
+    repo = "aioelectricitymaps";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-XJw3oy5IHyXmdoVxSU15dWHcc4Wd435Lyr/wpz53aZI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    dataclasses-json
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+    syrupy
+  ];
+
+  pythonImportsCheck = [
+    "aioelectricitymaps"
+  ];
+
+  meta = with lib; {
+    description = "Module for interacting with Electricity maps";
+    homepage = "https://github.com/jpbede/aioelectricitymaps";
+    changelog = "https://github.com/jpbede/aioelectricitymaps/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioemonitor/default.nix b/nixpkgs/pkgs/development/python-modules/aioemonitor/default.nix
new file mode 100644
index 000000000000..88ae374e5d42
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioemonitor/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-raises
+, pytestCheckHook
+, pythonOlder
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "aioemonitor";
+  version = "1.0.5";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0h8zqqy8v8r1fl9bp3m8icr2sy44p0mbfl1hbb0zni17r9r50dhn";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    xmltodict
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytest-asyncio
+    pytest-raises
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py --replace '"pytest-runner>=5.2",' ""
+  '';
+
+  pythonImportsCheck = [ "aioemonitor" ];
+
+  meta = with lib; {
+    description = "Python client for SiteSage Emonitor";
+    homepage = "https://github.com/bdraco/aioemonitor";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioesphomeapi/default.nix b/nixpkgs/pkgs/development/python-modules/aioesphomeapi/default.nix
new file mode 100644
index 000000000000..b22090a7593d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioesphomeapi/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build-system
+, cython_3
+, setuptools
+
+# dependencies
+, async-timeout
+, chacha20poly1305-reuseable
+, noiseprotocol
+, protobuf
+, zeroconf
+
+# tests
+, mock
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aioesphomeapi";
+  version = "18.5.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "esphome";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-kj4FHsNsGsMxK+EI1jgqBfvldkyAoBkCTGT1yiZMmzY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    cython_3
+  ];
+
+  propagatedBuildInputs = [
+    chacha20poly1305-reuseable
+    noiseprotocol
+    protobuf
+    zeroconf
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    async-timeout
+  ];
+
+  pythonImportsCheck = [
+    "aioesphomeapi"
+  ];
+  nativeCheckInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/esphome/aioesphomeapi/releases/tag/v${version}";
+    description = "Python Client for ESPHome native API";
+    homepage = "https://github.com/esphome/aioesphomeapi";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioextensions/default.nix b/nixpkgs/pkgs/development/python-modules/aioextensions/default.nix
new file mode 100644
index 000000000000..b5508d8d7434
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioextensions/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, pythonOlder
+
+# Python dependencies
+, uvloop
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "aioextensions";
+  version = "21.7.2261349";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2eacc52692495f331437e8c8e9782ca71f4617ec84f174ca17acdd77631efc47";
+  };
+
+  propagatedBuildInputs = [ uvloop ];
+
+  nativeCheckInputs = [ pytest ];
+  checkPhase = ''
+    cd test/
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "High performance functions to work with the async IO";
+    homepage = "https://kamadorueda.github.io/aioextensions";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kamadorueda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiofile/default.nix b/nixpkgs/pkgs/development/python-modules/aiofile/default.nix
new file mode 100644
index 000000000000..ba9bd0652cfb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiofile/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, aiomisc
+, aiomisc-pytest
+, caio
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiofile";
+  version = "3.8.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mosquito";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-KBly/aeHHZh7mL8MJ9gmxbqS7PmR4sedtBY/2HCXt54=";
+  };
+
+  propagatedBuildInputs = [
+    caio
+  ];
+
+  nativeCheckInputs = [
+    aiomisc
+    aiomisc-pytest
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aiofile"
+  ];
+
+  disabledTests = [
+    # Tests (SystemError) fails randomly during nix-review
+    "test_async_open_fp"
+    "test_async_open_iter_chunked"
+    "test_async_open_iter_chunked"
+    "test_async_open_line_iter"
+    "test_async_open_line_iter"
+    "test_async_open_readline"
+    "test_async_open_unicode"
+    "test_async_open"
+    "test_binary_io_wrapper"
+    "test_modes"
+    "test_text_io_wrapper"
+    "test_unicode_writer"
+    "test_write_read_nothing"
+  ];
+
+  meta = with lib; {
+    description = "File operations with asyncio support";
+    homepage = "https://github.com/mosquito/aiofile";
+    changelog = "https://github.com/aiokitchen/aiomisc/blob/master/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiofiles/default.nix b/nixpkgs/pkgs/development/python-modules/aiofiles/default.nix
new file mode 100644
index 000000000000..fe72ff28c78b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiofiles/default.nix
@@ -0,0 +1,54 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiofiles";
+  version = "23.2.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Tinche";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-EbRQD/AoTMWAlPOMWmD0UdFjRyjt5MUBkJtcydUCdHM=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    "test_sendfile_file"
+
+    # require loopback networking:
+    "test_sendfile_socket"
+    "test_serve_small_bin_file_sync"
+    "test_serve_small_bin_file"
+    "test_slow_file"
+  ];
+
+  pythonImportsCheck = [
+    "aiofiles"
+  ];
+
+  meta = with lib; {
+    description = "File support for asyncio";
+    homepage = "https://github.com/Tinche/aiofiles";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioflo/default.nix b/nixpkgs/pkgs/development/python-modules/aioflo/default.nix
new file mode 100644
index 000000000000..4ec24cb77a9a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioflo/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioflo";
+  version = "2021.11.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = version;
+    hash = "sha256-7NrOoc1gi8YzZaKvCnHnzAKPlMnMhqxjdyZGN5H/8TQ=";
+  };
+
+  patches = [
+    # This patch removes references to setuptools and wheel that are no longer
+    # necessary and changes poetry to poetry-core, so that we don't need to add
+    # unnecessary nativeBuildInputs.
+    #
+    #   https://github.com/bachya/aioflo/pull/65
+    #
+    (fetchpatch {
+      name = "clean-up-build-dependencies.patch";
+      url = "https://github.com/bachya/aioflo/commit/f38d3f6427777ab0eeb56177943679e2570f0634.patch";
+      hash = "sha256-iLgklhEZ61rrdzQoO6rp1HGZcqLsqGNitwIiPNLNHQ4=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aioflo"
+  ];
+
+  meta = with lib; {
+    description = "Python library for Flo by Moen Smart Water Detectors";
+    homepage = "https://github.com/bachya/aioflo";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioftp/default.nix b/nixpkgs/pkgs/development/python-modules/aioftp/default.nix
new file mode 100644
index 000000000000..290935e8c2ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioftp/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, stdenv
+, async-timeout
+, buildPythonPackage
+, fetchPypi
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, siosocks
+, trustme
+}:
+
+buildPythonPackage rec {
+  pname = "aioftp";
+  version = "0.21.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-KLsm1GFsfDgaFUMoH5hwUbjS0dW/rwI9nn4sIQXFG7k=";
+  };
+
+  propagatedBuildInputs = [
+    siosocks
+  ];
+
+  nativeCheckInputs = [
+    async-timeout
+    pytest-asyncio
+    pytestCheckHook
+    trustme
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # uses 127.0.0.2, which macos doesn't like
+    "test_pasv_connection_pasv_forced_response_address"
+  ];
+
+  pythonImportsCheck = [
+    "aioftp"
+  ];
+
+  meta = with lib; {
+    description = "Python FTP client/server for asyncio";
+    homepage = "https://github.com/aio-libs/aioftp";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiogithubapi/default.nix b/nixpkgs/pkgs/development/python-modules/aiogithubapi/default.nix
new file mode 100644
index 000000000000..ba943865a444
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiogithubapi/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, aiohttp
+, aresponses
+, async-timeout
+, backoff
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiogithubapi";
+  version = "23.2.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ludeeus";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-J6kcEVqADmVJZDbU9eqLCL0rohMSA/Ig7FSp/Ye5Sfk=";
+  };
+
+  postPatch = ''
+    # Upstream is releasing with the help of a CI to PyPI, GitHub releases
+    # are not in their focus
+    substituteInPlace pyproject.toml \
+      --replace 'version = "0"' 'version = "${version}"' \
+      --replace 'backoff = "^1.10.0"' 'backoff = "*"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    backoff
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=auto"
+  ];
+
+  pythonImportsCheck = [
+    "aiogithubapi"
+  ];
+
+  meta = with lib; {
+    description = "Python client for the GitHub API";
+    homepage = "https://github.com/ludeeus/aiogithubapi";
+    changelog = "https://github.com/ludeeus/aiogithubapi/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiogram/default.nix b/nixpkgs/pkgs/development/python-modules/aiogram/default.nix
new file mode 100644
index 000000000000..7638c4efb48f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiogram/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, aiohttp
+, aiohttp-socks
+, aioredis
+, aresponses
+, babel
+, certifi
+, magic-filter
+, pytest-asyncio
+, pytest-lazy-fixture
+, redis
+}:
+
+buildPythonPackage rec {
+  pname = "aiogram";
+  version = "3.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aiogram";
+    repo = "aiogram";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-bWwK761gn7HsR9ObcBDfvQH0fJfTAo0QAcL/HcNdHik=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "aiohttp>=3.8.0,<3.9.0" "aiohttp" \
+      --replace "Babel>=2.9.1,<2.10.0" "Babel" \
+      --replace "magic-filter>=1.0.9" "magic-filter"
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+    babel
+    certifi
+    magic-filter
+  ];
+
+  nativeCheckInputs = [
+    aiohttp-socks
+    aioredis
+    aresponses
+    pytest-asyncio
+    pytest-lazy-fixture
+    pytestCheckHook
+    redis
+  ];
+
+  # requires network
+  disabledTests = [
+    "test_download_file_404"
+    "test_download_404"
+  ];
+
+  pythonImportsCheck = [ "aiogram" ];
+
+  meta = with lib; {
+    description = "Modern and fully asynchronous framework for Telegram Bot API";
+    homepage = "https://github.com/aiogram/aiogram";
+    changelog = "https://github.com/aiogram/aiogram/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sikmir ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioguardian/default.nix b/nixpkgs/pkgs/development/python-modules/aioguardian/default.nix
new file mode 100644
index 000000000000..3b72b53045b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioguardian/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, aiohttp
+, async-timeout
+, asyncio-dgram
+, buildPythonPackage
+, docutils
+, fetchFromGitHub
+, poetry-core
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "aioguardian";
+  version = "2023.11.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = "aioguardian";
+    rev = "refs/tags/${version}";
+    hash = "sha256-hTV6P9J7SS5lnV/9eFUCFPZu1GIeshytWQvNTbGs52w=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    asyncio-dgram
+    docutils
+    voluptuous
+  ];
+
+  nativeCheckInputs = [
+    asyncio-dgram
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    "examples/"
+  ];
+
+  pythonImportsCheck = [
+    "aioguardian"
+  ];
+
+  meta = with lib; {
+    description = " Python library to interact with Elexa Guardian devices";
+    longDescription = ''
+      aioguardian is an asyncio-focused library for interacting with the
+      Guardian line of water valves and sensors from Elexa.
+    '';
+    homepage = "https://github.com/bachya/aioguardian";
+    changelog = "https://github.com/bachya/aioguardian/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioharmony/default.nix b/nixpkgs/pkgs/development/python-modules/aioharmony/default.nix
new file mode 100644
index 000000000000..cd3abbb4af8d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioharmony/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, slixmpp
+}:
+
+buildPythonPackage rec {
+  pname = "aioharmony";
+  version = "0.2.10";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-18+38QunEdEGdirQOT+528vYqiqDuUr/CWRQtXKf4rs=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    slixmpp
+  ];
+
+  # aioharmony does not seem to include tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aioharmony.harmonyapi"
+    "aioharmony.harmonyclient"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ehendrix23/aioharmony";
+    description = "Python library for interacting the Logitech Harmony devices";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ oro ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiohomekit/default.nix b/nixpkgs/pkgs/development/python-modules/aiohomekit/default.nix
new file mode 100644
index 000000000000..86c186f4220f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohomekit/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, buildPythonPackage
+, aiocoap
+, async-interrupt
+, bleak
+, bleak-retry-connector
+, chacha20poly1305
+, chacha20poly1305-reuseable
+, commentjson
+, cryptography
+, fetchFromGitHub
+, orjson
+, poetry-core
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, zeroconf
+}:
+
+buildPythonPackage rec {
+  pname = "aiohomekit";
+  version = "3.0.9";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Jc2k";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-YaLSpWSaiEP7X+IujrQgXgWl3aPc1WDMq2yaMUTu328=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiocoap
+    async-interrupt
+    bleak
+    bleak-retry-connector
+    chacha20poly1305
+    chacha20poly1305-reuseable
+    commentjson
+    cryptography
+    orjson
+    zeroconf
+  ];
+
+  doCheck = lib.versionAtLeast pytest-aiohttp.version "1.0.0";
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Tests require network access
+    "tests/test_ip_pairing.py"
+  ];
+
+  pythonImportsCheck = [
+    "aiohomekit"
+  ];
+
+  meta = with lib; {
+    description = "Python module that implements the HomeKit protocol";
+    longDescription = ''
+      This Python library implements the HomeKit protocol for controlling
+      Homekit accessories.
+    '';
+    homepage = "https://github.com/Jc2k/aiohomekit";
+    changelog = "https://github.com/Jc2k/aiohomekit/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiohttp-apispec/default.nix b/nixpkgs/pkgs/development/python-modules/aiohttp-apispec/default.nix
new file mode 100644
index 000000000000..ea908ff54414
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp-apispec/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, aiohttp
+, apispec
+, buildPythonPackage
+, callPackage
+, fetchFromGitHub
+, fetchPypi
+, jinja2
+, packaging
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, webargs
+}:
+
+buildPythonPackage rec {
+  pname = "aiohttp-apispec";
+  version = "3.0.0b2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "maximdanilchenko";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-C+/M25oCLTNGGEUj2EyXn3UjcvPvDYFmmUW8IOoF1uU=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    apispec
+    jinja2
+    packaging
+    webargs
+  ];
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aiohttp_apispec"
+  ];
+
+  meta = with lib; {
+    description = "Build and document REST APIs with aiohttp and apispec";
+    homepage = "https://github.com/maximdanilchenko/aiohttp-apispec/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ viric ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiohttp-basicauth/default.nix b/nixpkgs/pkgs/development/python-modules/aiohttp-basicauth/default.nix
new file mode 100644
index 000000000000..b7ce89c13476
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp-basicauth/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, pytestCheckHook
+, pytest-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiohttp-basicauth";
+  version = "1.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "romis2012";
+    repo = "aiohttp-basicauth";
+    rev = "v${version}";
+    hash = "sha256-UaRzauHmBHYwXFqRwDn1py79BScqq5j5SWALM4dQBP4=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  pythonImportsCheck = [ "aiohttp_basicauth" ];
+
+  meta = with lib; {
+    description = "HTTP basic authentication middleware for aiohttp 3.0";
+    homepage = "https://github.com/romis2012/aiohttp-basicauth";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiohttp-client-cache/default.nix b/nixpkgs/pkgs/development/python-modules/aiohttp-client-cache/default.nix
new file mode 100644
index 000000000000..dc5b34aad95e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp-client-cache/default.nix
@@ -0,0 +1,26 @@
+{ lib, fetchPypi, python3, ...}:
+
+python3.pkgs.buildPythonPackage rec {
+  pname = "aiohttp_client_cache";
+  version = "0.10.0";
+  pyproject = true;
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-FXU4QNqa8B8ZADmoEyJfd8gsUDI0HEjIR9B2CBP55wU=";
+  };
+  nativeBuildInputs = with python3.pkgs; [
+    poetry-core
+  ];
+  propagatedBuildInputs = with python3.pkgs; [
+    aiohttp
+    attrs
+    itsdangerous
+    url-normalize
+  ];
+  meta = with lib; {
+    description = "An async persistent cache for aiohttp requests";
+    homepage = "https://pypi.org/project/aiohttp-client-cache/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ seirl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiohttp-cors/default.nix b/nixpkgs/pkgs/development/python-modules/aiohttp-cors/default.nix
new file mode 100644
index 000000000000..fc5dc87f4ef2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp-cors/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder
+, typing ? null, aiohttp
+}:
+
+buildPythonPackage rec {
+  pname = "aiohttp-cors";
+  version = "0.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0pczn54bqd32v8zhfbjfybiza6xh1szwxy6as577dn8g23bwcfad";
+  };
+
+  disabled = pythonOlder "3.5";
+
+  propagatedBuildInputs = [ aiohttp ]
+  ++ lib.optional (pythonOlder "3.5") typing;
+
+  # Requires network access
+  doCheck = false;
+
+  meta = with lib; {
+    description = "CORS support for aiohttp";
+    homepage = "https://github.com/aio-libs/aiohttp-cors";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ primeos ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiohttp-fast-url-dispatcher/default.nix b/nixpkgs/pkgs/development/python-modules/aiohttp-fast-url-dispatcher/default.nix
new file mode 100644
index 000000000000..905705c992dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp-fast-url-dispatcher/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiohttp-fast-url-dispatcher";
+  version = "0.3.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = "aiohttp-fast-url-dispatcher";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-DZTW9CazcUY3hyxr0MbVfM/yJzUzwN43c2n07Sloxa8=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=aiohttp_fast_url_dispatcher --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aiohttp_fast_url_dispatcher"
+  ];
+
+  meta = with lib; {
+    description = "A faster URL dispatcher for aiohttp";
+    homepage = "https://github.com/bdraco/aiohttp-fast-url-dispatcher";
+    changelog = "https://github.com/bdraco/aiohttp-fast-url-dispatcher/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiohttp-jinja2/default.nix b/nixpkgs/pkgs/development/python-modules/aiohttp-jinja2/default.nix
new file mode 100644
index 000000000000..6008b94179fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp-jinja2/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, jinja2
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiohttp-jinja2";
+  version = "1.5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jRSbKlfZH3lLM6OU6lvGa1Z/OMdKWmqUd6/CRQ8QXAE=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    jinja2
+  ];
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --cov=aiohttp_jinja2 --cov-report xml --cov-report html --cov-report term" ""
+  '';
+
+  pytestFlagsArray = [
+    "-W"
+    "ignore::DeprecationWarning"
+  ];
+
+  pythonImportsCheck = [
+    "aiohttp_jinja2"
+  ];
+
+  # Tests are outdated (1.5)
+  # pytest.PytestUnhandledCoroutineWarning: async def functions...
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Jinja2 support for aiohttp";
+    homepage = "https://github.com/aio-libs/aiohttp_jinja2";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiohttp-oauthlib/default.nix b/nixpkgs/pkgs/development/python-modules/aiohttp-oauthlib/default.nix
new file mode 100644
index 000000000000..92981ea952c7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp-oauthlib/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, oauthlib
+, aiohttp
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "aiohttp-oauthlib";
+  version = "0.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-iTzRpZ3dDC5OmA46VE+XELfE/7nie0zQOLUf4dcDk7c=";
+  };
+
+  propagatedBuildInputs = [
+    oauthlib
+    aiohttp
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  # Package has no tests.
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://git.sr.ht/~whynothugo/aiohttp-oauthlib";
+    description = "oauthlib integration for aiohttp clients";
+    license = licenses.isc;
+    maintainers = with maintainers; [ sumnerevans ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiohttp-openmetrics/default.nix b/nixpkgs/pkgs/development/python-modules/aiohttp-openmetrics/default.nix
new file mode 100644
index 000000000000..11b979c4f6c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp-openmetrics/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+, prometheus-client
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiohttp-openmetrics";
+  version = "0.0.12";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/ZRngcMlroCVTvIl+30DR4SI8LsSnTovuzg3YduWgWA=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    prometheus-client
+  ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aiohttp_openmetrics"
+  ];
+
+  meta = with lib; {
+    description = "OpenMetrics provider for aiohttp";
+    homepage = "https://github.com/jelmer/aiohttp-openmetrics/";
+    changelog = "https://github.com/jelmer/aiohttp-openmetrics/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiohttp-remotes/default.nix b/nixpkgs/pkgs/development/python-modules/aiohttp-remotes/default.nix
new file mode 100644
index 000000000000..66f81b123298
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp-remotes/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, flit
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "aiohttp-remotes";
+  version = "1.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "aiohttp_remotes";
+    inherit version;
+    sha256 = "f95c3a6be5e2de746a85ce9af49ec548da6db8378d7e81bb171ec77b13562a6c";
+  };
+
+  nativeBuildInputs = [
+    flit
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --no-cov-on-fail --cov-branch --cov=aiohttp_remotes --cov-report=term --cov-report=html" ""
+  '';
+
+  pythonImportsCheck = [
+    "aiohttp_remotes"
+  ];
+
+  pytestFlagsArray = [
+    "-W"
+    "ignore::DeprecationWarning"
+    "--asyncio-mode=auto"
+  ];
+
+  meta = with lib; {
+    description = "Set of useful tools for aiohttp.web server";
+    homepage = "https://github.com/wikibusiness/aiohttp-remotes";
+    license = licenses.mit;
+    maintainers = with maintainers; [ qyliss ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiohttp-retry/default.nix b/nixpkgs/pkgs/development/python-modules/aiohttp-retry/default.nix
new file mode 100644
index 000000000000..262fcef8e442
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp-retry/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pytest-aiohttp
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiohttp-retry";
+  version = "2.8.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "inyutin";
+    repo = "aiohttp_retry";
+    rev = "v${version}";
+    hash = "sha256-Zr68gx8ZR9jKrogmqaFLvpBAIHE9ptHm0zZ/b49cCLw=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aiohttp_retry"
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=auto"
+  ];
+
+  meta = with lib; {
+    description = "Retry client for aiohttp";
+    homepage = "https://github.com/inyutin/aiohttp_retry";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiohttp-socks/default.nix b/nixpkgs/pkgs/development/python-modules/aiohttp-socks/default.nix
new file mode 100644
index 000000000000..0a60d0af2801
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp-socks/default.nix
@@ -0,0 +1,26 @@
+{ lib, fetchPypi, buildPythonPackage, pythonOlder, aiohttp, python-socks, attrs }:
+
+buildPythonPackage rec {
+  pname = "aiohttp-socks";
+  version = "0.8.3";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "aiohttp_socks";
+    hash = "sha256-aqtSj2aeCHMBj9N3c7gzouK6KEJDvmcoF/pAG8eUHsY=";
+  };
+
+  propagatedBuildInputs = [ aiohttp attrs python-socks ];
+
+  # Checks needs internet access
+  doCheck = false;
+  pythonImportsCheck = [ "aiohttp_socks" ];
+
+  disabled = pythonOlder "3.5.3";
+
+  meta = {
+    description = "SOCKS proxy connector for aiohttp";
+    license = lib.licenses.asl20;
+    homepage = "https://github.com/romis2012/aiohttp-socks";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiohttp-swagger/default.nix b/nixpkgs/pkgs/development/python-modules/aiohttp-swagger/default.nix
new file mode 100644
index 000000000000..19c822acf1a7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp-swagger/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, jinja2
+, markupsafe
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "aiohttp-swagger";
+  version = "1.0.15";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "cr0hn";
+    repo = pname;
+    rev = version;
+    hash = "sha256-M43sNpbXWXFRTd549cZhvhO35nBB6OH+ki36BzSk87Q=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    jinja2
+    markupsafe
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-aiohttp
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "markupsafe~=1.1.1" "markupsafe>=1.1.1" \
+      --replace "jinja2~=2.11.2" "jinja2>=2.11.2"
+  '';
+
+  preCheck = ''
+    # The custom client is obsolete
+    rm tests/conftest.py
+  '';
+
+  pythonImportsCheck = [
+    "aiohttp_swagger"
+  ];
+
+  meta = with lib; {
+    description = "Swagger API Documentation builder for aiohttp";
+    homepage = "https://github.com/cr0hn/aiohttp-swagger";
+    license = licenses.mit;
+    maintainers = with maintainers; [ elohmeier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiohttp-wsgi/default.nix b/nixpkgs/pkgs/development/python-modules/aiohttp-wsgi/default.nix
new file mode 100644
index 000000000000..298b8b00b22c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp-wsgi/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiohttp-wsgi";
+  version = "0.10.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "etianen";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-3Q00FidZWV1KueuHyHKQf1PsDJGOaRW6v/kBy7lzD4Q=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "aiohttp_wsgi" ];
+
+  meta = with lib; {
+    description = "WSGI adapter for aiohttp";
+    homepage = "https://github.com/etianen/aiohttp-wsgi";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiohttp/default.nix b/nixpkgs/pkgs/development/python-modules/aiohttp/default.nix
new file mode 100644
index 000000000000..ebbcf6ea82a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp/default.nix
@@ -0,0 +1,132 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pythonOlder
+# build_requires
+, setuptools
+, wheel
+# install_requires
+, attrs
+, charset-normalizer
+, multidict
+, async-timeout
+, yarl
+, frozenlist
+, aiosignal
+, aiodns
+, brotli
+, faust-cchardet
+, typing-extensions
+# tests_require
+, async-generator
+, freezegun
+, gunicorn
+, pytest-mock
+, pytestCheckHook
+, re-assert
+, trustme
+}:
+
+buildPythonPackage rec {
+  pname = "aiohttp";
+  version = "3.8.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sM8qRQG/+TMKilJItM6VGFHkFb3M6dwVjnbP1V4VCFw=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # https://github.com/aio-libs/aiohttp/pull/7260
+      # Merged upstream, should be dropped once updated to 3.9.0
+      url = "https://github.com/aio-libs/aiohttp/commit/7dcc235cafe0c4521bbbf92f76aecc82fee33e8b.patch";
+      hash = "sha256-ZzhlE50bmA+e2XX2RH1FuWQHZIAa6Dk/hZjxPoX5t4g=";
+    })
+  ];
+
+  postPatch = ''
+    sed -i '/--cov/d' setup.cfg
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    charset-normalizer
+    multidict
+    async-timeout
+    yarl
+    typing-extensions
+    frozenlist
+    aiosignal
+    aiodns
+    brotli
+    faust-cchardet
+  ];
+
+  # NOTE: pytest-xdist cannot be added because it is flaky. See https://github.com/NixOS/nixpkgs/issues/230597 for more info.
+  nativeCheckInputs = [
+    async-generator
+    freezegun
+    gunicorn
+    pytest-mock
+    pytestCheckHook
+    re-assert
+  ] ++ lib.optionals (!(stdenv.isDarwin && stdenv.isAarch64)) [
+    # Optional test dependency. Depends indirectly on pyopenssl, which is
+    # broken on aarch64-darwin.
+    trustme
+  ];
+
+  disabledTests = [
+    # Disable tests that require network access
+    "test_client_session_timeout_zero"
+    "test_mark_formdata_as_processed"
+    "test_requote_redirect_url_default"
+    # Disable tests that trigger deprecation warnings in pytest
+    "test_async_with_session"
+    "test_session_close_awaitable"
+    "test_close_run_until_complete_not_deprecated"
+    # https://github.com/aio-libs/aiohttp/issues/7130
+    "test_static_file_if_none_match"
+    "test_static_file_if_match"
+    "test_static_file_if_modified_since_past_date"
+  ] ++ lib.optionals stdenv.is32bit [
+    "test_cookiejar"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_addresses"  # https://github.com/aio-libs/aiohttp/issues/3572, remove >= v4.0.0
+    "test_close"
+  ];
+
+  disabledTestPaths = [
+    "test_proxy_functional.py" # FIXME package proxy.py
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  # aiohttp in current folder shadows installed version
+  # Probably because we run `python -m pytest` instead of `pytest` in the hook.
+  preCheck = ''
+    cd tests
+  '' + lib.optionalString stdenv.isDarwin ''
+    # Work around "OSError: AF_UNIX path too long"
+    export TMPDIR="/tmp"
+  '';
+
+  meta = with lib; {
+    changelog = "https://github.com/aio-libs/aiohttp/blob/v${version}/CHANGES.rst";
+    description = "Asynchronous HTTP Client/Server for Python and asyncio";
+    license = licenses.asl20;
+    homepage = "https://github.com/aio-libs/aiohttp";
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiohttp_remotes/default.nix b/nixpkgs/pkgs/development/python-modules/aiohttp_remotes/default.nix
new file mode 100644
index 000000000000..c519f7fd4cfb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohttp_remotes/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, aiohttp }:
+
+buildPythonPackage rec {
+  pname = "aiohttp_remotes";
+  version = "0.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "43c3f7e1c5ba27f29fb4dbde5d43b900b5b5fc7e37bf7e35e6eaedabaec4a3fc";
+  };
+
+  LC_ALL = "en_US.UTF-8";
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  meta = with lib; {
+    homepage = https://github.com/wikibusiness/aiohttp-remotes;
+    description = "A set of useful tools for aiohttp.web server";
+    license = [ licenses.mit ];
+    maintainers = [ maintainers.qyliss ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiohue/default.nix b/nixpkgs/pkgs/development/python-modules/aiohue/default.nix
new file mode 100644
index 000000000000..56b911ee4f89
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohue/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, aiohttp
+, asyncio-throttle
+, awesomeversion
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pytest-aiohttp
+, pytest-asyncio
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "aiohue";
+  version = "4.7.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-t48rUPAM0XpbDreCwHU/smoyhPtxhwrpDkb1170GkQM=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'version = "0.0.0"' 'version = "${version}"'
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    awesomeversion
+    aiohttp
+    asyncio-throttle
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+    pytest-aiohttp
+  ];
+
+  pythonImportsCheck = [
+    "aiohue"
+    "aiohue.discovery"
+  ];
+
+  disabledTestPaths = [
+    # File are prefixed with test_
+    "examples/"
+  ];
+
+  meta = with lib; {
+    description = "Python package to talk to Philips Hue";
+    homepage = "https://github.com/home-assistant-libs/aiohue";
+    changelog = "https://github.com/home-assistant-libs/aiohue/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiohwenergy/default.nix b/nixpkgs/pkgs/development/python-modules/aiohwenergy/default.nix
new file mode 100644
index 000000000000..fb4d89adab51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiohwenergy/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiohwenergy";
+  version = "0.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "DCSBL";
+    repo = pname;
+    rev = version;
+    hash = "sha256-WfkwIxyDzLNzhWNWST/V3iN9Bhu2oXDwGiA5UXCq5ho=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aiohwenergy"
+  ];
+
+  meta = with lib; {
+    description = "Python library to interact with the HomeWizard Energy devices API";
+    homepage = "https://github.com/DCSBL/aiohwenergy";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioimaplib/default.nix b/nixpkgs/pkgs/development/python-modules/aioimaplib/default.nix
new file mode 100644
index 000000000000..84020ba7ac54
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioimaplib/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, pythonOlder
+, pythonAtLeast
+, asynctest
+, buildPythonPackage
+, docutils
+, fetchFromGitHub
+, imaplib2
+, mock
+, nose
+, pyopenssl
+, pytestCheckHook
+, pytz
+, tzlocal
+}:
+
+buildPythonPackage rec {
+  pname = "aioimaplib";
+  version = "1.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "bamthomas";
+    repo = pname;
+    rev = version;
+    hash = "sha256-7Ta0BhtQSm228vvUa5z+pzM3UC7+BskgBNjxsbEb9P0=";
+  };
+
+  # https://github.com/bamthomas/aioimaplib/issues/54
+  doCheck = pythonOlder "3.11";
+
+  nativeCheckInputs = [
+    asynctest
+    docutils
+    imaplib2
+    mock
+    nose
+    pyopenssl
+    pytestCheckHook
+    pytz
+    tzlocal
+  ];
+
+  disabledTests = [
+    # https://github.com/bamthomas/aioimaplib/issues/77
+    "test_get_quotaroot"
+    # asyncio.exceptions.TimeoutError
+    "test_idle"
+  ];
+
+  pythonImportsCheck = [
+    "aioimaplib"
+  ];
+
+  meta = with lib; {
+    description = "Python asyncio IMAP4rev1 client library";
+    homepage = "https://github.com/bamthomas/aioimaplib";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioinflux/default.nix b/nixpkgs/pkgs/development/python-modules/aioinflux/default.nix
new file mode 100644
index 000000000000..25aa7f587b25
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioinflux/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+, ciso8601
+, pandas
+}:
+
+buildPythonPackage rec {
+  pname = "aioinflux";
+  version = "0.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1jy5mcg9wdz546s9wdwsgkxhm2ac4dmphd9vz243db39j1m0a3bj";
+  };
+
+  propagatedBuildInputs = [ aiohttp ciso8601 pandas ];
+
+  # Tests require InfluxDB server
+  doCheck = false;
+
+  pythonImportsCheck = [ "aioinflux" ];
+
+  meta = with lib; {
+    description = "Asynchronous Python client for InfluxDB";
+    homepage = "https://github.com/gusutabopb/aioinflux";
+    license = licenses.mit;
+    maintainers = with maintainers; [ liamdiprose lopsided98 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioitertools/default.nix b/nixpkgs/pkgs/development/python-modules/aioitertools/default.nix
new file mode 100644
index 000000000000..6fdc7dfd4d62
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioitertools/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, pythonOlder
+
+# native
+, flit-core
+
+# propagates
+, typing-extensions
+
+# tests
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aioitertools";
+  version = "0.11.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QsaLjdOmnCv38iM7999LtYtVe8pSUqwC7VGHu8Z9aDE=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.10") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aioitertools"
+  ];
+
+  meta = with lib; {
+    description = "Implementation of itertools, builtins, and more for AsyncIO and mixed-type iterables";
+    homepage = "https://aioitertools.omnilib.dev/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ teh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiojobs/default.nix b/nixpkgs/pkgs/development/python-modules/aiojobs/default.nix
new file mode 100644
index 000000000000..1061b4f777a7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiojobs/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "aiojobs";
+  version = "1.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = "aiojobs";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-/+PTHLrZyf2UuYkLWkNgzf9amFywDJnP2OKVWvARcAA=";
+  };
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace "--cov=aiojobs/ --cov=tests/ --cov-report term" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.11") [
+    async-timeout
+  ];
+
+  passthru.optional-dependencies = {
+    aiohttp = [
+      aiohttp
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-aiohttp
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "aiojobs"
+  ];
+
+  disabledTests = [
+    # RuntimeWarning: coroutine 'Scheduler._wait_failed' was never awaited
+    "test_scheduler_must_be_created_within_running_loop"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Jobs scheduler for managing background task (asyncio)";
+    homepage = "https://github.com/aio-libs/aiojobs";
+    changelog = "https://github.com/aio-libs/aiojobs/blob/v${version}/CHANGES.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ cmcdragonkai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiokafka/default.nix b/nixpkgs/pkgs/development/python-modules/aiokafka/default.nix
new file mode 100644
index 000000000000..849e51314d4b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiokafka/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, cython
+, fetchFromGitHub
+, gssapi
+, kafka-python
+, lz4
+, packaging
+, python-snappy
+, pythonOlder
+, zlib
+, zstandard
+}:
+
+buildPythonPackage rec {
+  pname = "aiokafka";
+  version = "0.8.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-O5cDP0PWFrxNSdwWqUUkErUKf1Tt9agKJqWIjd4jGqk=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  buildInputs = [
+    zlib
+  ];
+
+  propagatedBuildInputs = [
+    async-timeout
+    kafka-python
+    packaging
+  ];
+
+  passthru.optional-dependencies = {
+    snappy = [
+      python-snappy
+    ];
+    lz4 = [
+      lz4
+    ];
+    zstd = [
+      zstandard
+    ];
+    gssapi = [
+      gssapi
+    ];
+  };
+
+  # Checks require running Kafka server
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aiokafka"
+  ];
+
+  meta = with lib; {
+    description = "Kafka integration with asyncio";
+    homepage = "https://aiokafka.readthedocs.org";
+    changelog = "https://github.com/aio-libs/aiokafka/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiokef/default.nix b/nixpkgs/pkgs/development/python-modules/aiokef/default.nix
new file mode 100644
index 000000000000..0fb7f161436f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiokef/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, tenacity
+}:
+
+buildPythonPackage rec {
+  pname = "aiokef";
+  version = "0.2.17";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "basnijholt";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0ms0dwrpj80w55svcppbnp7vyl5ipnjfp1c436k5c7pph4q5pxk9";
+  };
+
+  postPatch = ''
+    substituteInPlace tox.ini \
+      --replace "--cov --cov-append --cov-fail-under=30 --cov-report=" "" \
+      --replace "--mypy" ""
+  '';
+
+  propagatedBuildInputs = [
+    async-timeout
+    tenacity
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [ "tests" ];
+  pythonImportsCheck = [ "aiokef" ];
+
+  meta = with lib; {
+    description = "Python API for KEF speakers";
+    homepage = "https://github.com/basnijholt/aiokef";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiolifx-connection/default.nix b/nixpkgs/pkgs/development/python-modules/aiolifx-connection/default.nix
new file mode 100644
index 000000000000..92cece410ee4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiolifx-connection/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, aiolifx
+}:
+
+buildPythonPackage rec {
+  pname = "aiolifx-connection";
+  version = "1.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "aiolifx_connection";
+    inherit version;
+    hash = "sha256:09fydp5fqqh1s0vav39mw98i1la6qcgk17gch0m5ihyl9q50ks13";
+  };
+
+  propagatedBuildInputs = [
+    aiolifx
+  ];
+
+  # tests are not implemented
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aiolifx_connection"
+  ];
+
+  meta = with lib; {
+    description = "Wrapper for aiolifx to connect to a single LIFX device";
+    homepage = "https://github.com/bdraco/aiolifx_connection";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ lukegb ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiolifx-effects/default.nix b/nixpkgs/pkgs/development/python-modules/aiolifx-effects/default.nix
new file mode 100644
index 000000000000..282a87c43d8d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiolifx-effects/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, aiolifx
+}:
+
+buildPythonPackage rec {
+  pname = "aiolifx-effects";
+  version = "0.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "aiolifx_effects";
+    hash = "sha256-Mhxs5PNr2W9ych56WYUZTEGck4HVTQfkil3S3zHv6Qc=";
+  };
+
+  propagatedBuildInputs = [
+    aiolifx
+  ];
+
+  # tests are not implemented
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aiolifx_effects"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/amelchio/aiolifx_effects/releases/tag/v${version}";
+    description = "Light effects (pulse, colorloop ...) for LIFX lights running on aiolifx";
+    homepage = "https://github.com/amelchio/aiolifx_effects";
+    license = licenses.mit;
+    maintainers = with maintainers; [ netixx ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiolifx-themes/default.nix b/nixpkgs/pkgs/development/python-modules/aiolifx-themes/default.nix
new file mode 100644
index 000000000000..593d1e77b460
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiolifx-themes/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, aiolifx
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, typer
+}:
+
+buildPythonPackage rec {
+  pname = "aiolifx-themes";
+  version = "0.4.11";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Djelibeybi";
+    repo = "aiolifx-themes";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-pldmkdkDI6RFMcBOF1MtQBddOo+uF23CMHPztEV+kf0=";
+  };
+
+  prePatch = ''
+    # Don't run coverage, or depend on typer for no reason.
+    substituteInPlace pyproject.toml \
+      --replace " --cov=aiolifx_themes --cov-report=term-missing:skip-covered" "" \
+      --replace "typer = " "# unused: typer = "
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiolifx
+  ];
+
+  nativeCheckInputs = [
+    async-timeout
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  pythonImportsCheck = [
+    "aiolifx_themes"
+  ];
+
+  meta = with lib; {
+    description = "Color themes for LIFX lights running on aiolifx";
+    homepage = "https://github.com/Djelibeybi/aiolifx-themes";
+    changelog = "https://github.com/Djelibeybi/aiolifx-themes/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lukegb ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiolifx/default.nix b/nixpkgs/pkgs/development/python-modules/aiolifx/default.nix
new file mode 100644
index 000000000000..9bda581ff39f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiolifx/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, async-timeout
+, click
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, ifaddr
+, inquirerpy
+, bitstring
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "aiolifx";
+  version = "1.0.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2lWC2eTYh/YX0Pn3W11uVqqT2ycsa993siiDR2BV4qU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    async-timeout
+    bitstring
+    click
+    ifaddr
+    inquirerpy
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aiolifx"
+  ];
+
+  meta = with lib; {
+    description = "Module for local communication with LIFX devices over a LAN";
+    homepage = "https://github.com/frawau/aiolifx";
+    changelog = "https://github.com/frawau/aiolifx/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ netixx ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiolimiter/default.nix b/nixpkgs/pkgs/development/python-modules/aiolimiter/default.nix
new file mode 100644
index 000000000000..5757a77da65b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiolimiter/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, importlib-metadata
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "aiolimiter";
+  version = "1.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mjpieters";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-BpLh9utf2oJe+83rsIZeV5+MjbJ3aO5slMNVbUywQIo=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    toml
+  ];
+
+  postPatch = ''
+    substituteInPlace tox.ini \
+      --replace " --cov=aiolimiter --cov-config=tox.ini --cov-report term-missing" ""
+  '';
+
+  pythonImportsCheck = [
+    "aiolimiter"
+  ];
+
+  meta = with lib; {
+    description = "Implementation of a rate limiter for asyncio";
+    homepage = "https://github.com/mjpieters/aiolimiter";
+    changelog = "https://github.com/mjpieters/aiolimiter/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiolip/default.nix b/nixpkgs/pkgs/development/python-modules/aiolip/default.nix
new file mode 100644
index 000000000000..a3d773cf04f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiolip/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiolip";
+  version = "1.1.6";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = pname;
+    rev = version;
+    sha256 = "1bgmcl8q1p6f2xm3w2qylvla6vf6bd1p2hfwj4l8w6w0w04vr02g";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "'pytest-runner'," ""
+  '';
+
+  pythonImportsCheck = [ "aiolip" ];
+
+  meta = with lib; {
+    description = "Python module for the Lutron Integration Protocol";
+    homepage = "https://github.com/bdraco/aiolip";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiolivisi/default.nix b/nixpkgs/pkgs/development/python-modules/aiolivisi/default.nix
new file mode 100644
index 000000000000..1cad96a9425b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiolivisi/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pydantic
+, pytestCheckHook
+, pythonOlder
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "aiolivisi";
+  version = "0.0.19";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-eT/sqLykd4gQVt972646mH+QArf7p/XQH53/UtsuKRs=";
+  };
+
+  postPatch = ''
+    # https://github.com/StefanIacobLivisi/aiolivisi/pull/3
+    substituteInPlace setup.py \
+      --replace 'REQUIREMENTS = list(val.strip() for val in open("requirements.txt"))' "" \
+      --replace "REQUIREMENTS," "[],"
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+    pydantic
+    websockets
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aiolivisi"
+  ];
+
+  meta = with lib; {
+    description = "Module to communicate with LIVISI Smart Home Controller";
+    homepage = "https://github.com/StefanIacobLivisi/aiolivisi";
+    changelog = "https://github.com/StefanIacobLivisi/aiolivisi/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiolookin/default.nix b/nixpkgs/pkgs/development/python-modules/aiolookin/default.nix
new file mode 100644
index 000000000000..75a6b0715d20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiolookin/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, faker
+, fetchFromGitHub
+, pytest-aiohttp
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiolookin";
+  version = "1.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ANMalko";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-G3/lUgV60CMLskUo83TlvLLIfJtu5DEz+94mdVI4OrI=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    faker
+    pytest-aiohttp
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Not all tests are ready yet
+    "test_successful"
+  ];
+
+  pythonImportsCheck = [
+    "aiolookin"
+  ];
+
+  meta = with lib; {
+    description = "Python client for interacting with LOOKin devices";
+    homepage = "https://github.com/ANMalko/aiolookin";
+    changelog = "https://github.com/ANMalko/aiolookin/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiolyric/default.nix b/nixpkgs/pkgs/development/python-modules/aiolyric/default.nix
new file mode 100644
index 000000000000..b6346a511aa5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiolyric/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aiolyric";
+  version = "1.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "timmo001";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-LDLpNuwkoPacI/a2NSlqUABRgwy+jAjGwOxmShLskso=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # AssertionError, https://github.com/timmo001/aiolyric/issues/61
+    "test_priority"
+  ];
+
+  pythonImportsCheck = [
+    "aiolyric"
+  ];
+
+  meta = with lib; {
+    description = "Python module for the Honeywell Lyric Platform";
+    homepage = "https://github.com/timmo001/aiolyric";
+    changelog = "https://github.com/timmo001/aiolyric/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiomisc-pytest/default.nix b/nixpkgs/pkgs/development/python-modules/aiomisc-pytest/default.nix
new file mode 100644
index 000000000000..c3f720cdadeb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiomisc-pytest/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, aiomisc
+, buildPythonPackage
+, fetchPypi
+, poetry-core
+, pytest
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiomisc-pytest";
+  version = "1.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "aiomisc_pytest";
+    inherit version;
+    hash = "sha256-LDeMQbB4wFdgJ95r9/vFN6fmkoXSPq9NRXONXQ3lbdM=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    aiomisc
+  ];
+
+  pythonImportsCheck = [
+    "aiomisc_pytest"
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Pytest integration for aiomisc";
+    homepage = "https://github.com/aiokitchen/aiomisc";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiomisc/default.nix b/nixpkgs/pkgs/development/python-modules/aiomisc/default.nix
new file mode 100644
index 000000000000..38a692910d4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiomisc/default.nix
@@ -0,0 +1,97 @@
+{ lib
+, aiocontextvars
+  #, aiocarbon
+, aiohttp
+  #, aiohttp-asgi
+, async-timeout
+, buildPythonPackage
+, colorlog
+, croniter
+, fastapi
+, fetchPypi
+, logging-journald
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, raven
+  #, raven-aiohttp
+, setproctitle
+, setuptools
+, uvloop
+}:
+
+buildPythonPackage rec {
+  pname = "aiomisc";
+  version = "17.3.41";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-thJBptiwH3jLQIYw7ucCv4xwaGPXMpE+dUwRvsyURtw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    colorlog
+    logging-journald
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    aiocontextvars
+    async-timeout
+    fastapi
+    pytestCheckHook
+    raven
+    setproctitle
+  ] ++ passthru.optional-dependencies.aiohttp
+  ++ passthru.optional-dependencies.cron
+  ++ passthru.optional-dependencies.uvloop;
+
+  passthru.optional-dependencies = {
+    aiohttp = [
+      aiohttp
+    ];
+    #asgi = [
+    #  aiohttp-asgi
+    #];
+    cron = [
+      croniter
+    ];
+    #carbon = [
+    #  aiocarbon
+    #];
+    #raven = [
+    #  raven-aiohttp
+    #];
+    uvloop = [
+      uvloop
+    ];
+  };
+
+  pythonImportsCheck = [
+    "aiomisc"
+  ];
+
+  # Upstream stopped tagging with 16.2
+  doCheck = false;
+
+  # disabledTestPaths = [
+  #   # Dependencies are not available at the moment
+  #   "tests/test_entrypoint.py"
+  #   "tests/test_raven_service.py"
+  # ];
+
+  meta = with lib; {
+    description = "Miscellaneous utils for asyncio";
+    homepage = "https://github.com/aiokitchen/aiomisc";
+    changelog = "https://github.com/aiokitchen/aiomisc/blob/master/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiomodernforms/default.nix b/nixpkgs/pkgs/development/python-modules/aiomodernforms/default.nix
new file mode 100644
index 000000000000..dd8cbde722c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiomodernforms/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, backoff
+, yarl
+, aresponses
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aiomodernforms";
+  version = "0.1.8";
+
+  src = fetchFromGitHub {
+    owner = "wonderslug";
+    repo = "aiomodernforms";
+    rev = "v${version}";
+    hash = "sha256-Vx51WBjjNPIfLlwMnAuwHnGNljhnjKkU0tWB9M9rjsw=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    backoff
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "aiomodernforms" ];
+
+  meta = with lib; {
+    description = "Asynchronous Python client for Modern Forms fans";
+    homepage = "https://github.com/wonderslug/aiomodernforms";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiomqtt/default.nix b/nixpkgs/pkgs/development/python-modules/aiomqtt/default.nix
new file mode 100644
index 000000000000..c7d7b5dd7a99
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiomqtt/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, anyio
+, buildPythonPackage
+, fetchFromGitHub
+, paho-mqtt
+, poetry-core
+, poetry-dynamic-versioning
+, pytestCheckHook
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "aiomqtt";
+  version = "1.2.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "sbtinstruments";
+    repo = "aiomqtt";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-P8p21wjmFDvI0iobpQsWkKYleY4M0R3yod3/mJ7V+Og=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    poetry-dynamic-versioning
+  ];
+
+  propagatedBuildInputs = [
+    paho-mqtt
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    anyio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aiomqtt"
+  ];
+
+  pytestFlagsArray = [
+    "-m" "'not network'"
+  ];
+
+  meta = with lib; {
+    description = "The idiomatic asyncio MQTT client, wrapped around paho-mqtt";
+    homepage = "https://github.com/sbtinstruments/aiomqtt";
+    changelog = "https://github.com/sbtinstruments/aiomqtt/blob/${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiomultiprocess/default.nix b/nixpkgs/pkgs/development/python-modules/aiomultiprocess/default.nix
new file mode 100644
index 000000000000..579ea497fb45
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiomultiprocess/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiomultiprocess";
+  version = "0.9.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "omnilib";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-yOP69FXDb2Grmtszx7oa6uiJGUar8su3KwqQPI+xjrw=";
+  };
+
+  nativeBuildInputs = [ flit-core ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pytestFlagsArray = [ "aiomultiprocess/tests/*.py" ];
+
+  disabledTests = [
+    # tests are flaky and make the whole test suite time out
+    "test_pool_worker_exceptions"
+    "test_pool_worker_max_tasks"
+    "test_pool_worker_stop"
+  ];
+
+  pythonImportsCheck = [ "aiomultiprocess" ];
+
+  meta = with lib; {
+    description = "Python module to improve performance";
+    longDescription = ''
+      aiomultiprocess presents a simple interface, while running a full
+      AsyncIO event loop on each child process, enabling levels of
+      concurrency never before seen in a Python application. Each child
+      process can execute multiple coroutines at once, limited only by
+      the workload and number of cores available.
+    '';
+    homepage = "https://github.com/omnilib/aiomultiprocess";
+    license = with licenses; [ mit ];
+    maintainers = [ maintainers.fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiomusiccast/default.nix b/nixpkgs/pkgs/development/python-modules/aiomusiccast/default.nix
new file mode 100644
index 000000000000..f2639400bb72
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiomusiccast/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, aiohttp
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "aiomusiccast";
+  version = "0.14.8";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "vigonotion";
+    repo = "aiomusiccast";
+    rev = "refs/tags/${version}";
+    hash = "sha256-V4xl2QY+pPEnJtx7dxSNj/aXqHvV9Z6uuWgbVHNyLjA=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"0.0.0"' '"${version}"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    setuptools
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aiomusiccast"
+  ];
+
+  meta = with lib; {
+    description = "Companion library for musiccast devices intended for the Home Assistant integration";
+    homepage = "https://github.com/vigonotion/aiomusiccast";
+    changelog = "https://github.com/vigonotion/aiomusiccast/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiomysensors/default.nix b/nixpkgs/pkgs/development/python-modules/aiomysensors/default.nix
new file mode 100644
index 000000000000..e26c6eb53bd9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiomysensors/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, aiofiles
+, asyncio-mqtt
+, awesomeversion
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, marshmallow
+, poetry-core
+, pyserial-asyncio
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiomysensors";
+  version = "0.3.10";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "MartinHjelmare";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-b462OZzRS9aldfJ+4ztczxbCMK76UM0pSOI1cIi1NM8=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=src --cov-report=term-missing:skip-covered" "" \
+      --replace 'marshmallow = "^3.17"' 'marshmallow = "*"' \
+      --replace 'awesomeversion = "^22.6"' 'awesomeversion = "*"'
+  '';
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiofiles
+    asyncio-mqtt
+    awesomeversion
+    click
+    marshmallow
+    pyserial-asyncio
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aiomysensors"
+  ];
+
+  meta = with lib; {
+    description = "Library to connect to MySensors gateways";
+    homepage = "https://github.com/MartinHjelmare/aiomysensors";
+    changelog = "https://github.com/MartinHjelmare/aiomysensors/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiomysql/default.nix b/nixpkgs/pkgs/development/python-modules/aiomysql/default.nix
new file mode 100644
index 000000000000..acd3cc56e4a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiomysql/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pymysql
+, pythonOlder
+, setuptools-scm
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "aiomysql";
+  version = "0.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-m/EgoBU3e+s3soXyYtACMDSjJfMLBOk/00qPtgawwQ8=";
+  };
+
+  patches = [
+    # https://github.com/aio-libs/aiomysql/pull/955
+    (fetchpatch {
+      name = "remove-setuptools-scm-git-archive-dependency.patch";
+      url = "https://github.com/aio-libs/aiomysql/commit/fee997d2e848b634a84ce0c4e9025e3b3e761640.patch";
+      hash = "sha256-qKcOfdDaA9DLS2fdHOEUW37aCCdtZjN0zsFV9dK/umQ=";
+      includes = [ "pyproject.toml" ];
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    pymysql
+  ];
+
+  # Tests require MySQL database
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aiomysql"
+  ];
+
+  meta = with lib; {
+    description = "MySQL driver for asyncio";
+    homepage = "https://github.com/aio-libs/aiomysql";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aionanoleaf/default.nix b/nixpkgs/pkgs/development/python-modules/aionanoleaf/default.nix
new file mode 100644
index 000000000000..e819431a4220
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aionanoleaf/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aionanoleaf";
+  version = "0.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "milanmeu";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-f0TyXhuAzI0s0n6sXH9mKWA4nad2YchZkQ0+jw/Bmv0=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aionanoleaf"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for the Nanoleaf API";
+    homepage = "https://github.com/milanmeu/aionanoleaf";
+    changelog = "https://github.com/milanmeu/aionanoleaf/releases/tag/v${version}";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aionotion/default.nix b/nixpkgs/pkgs/development/python-modules/aionotion/default.nix
new file mode 100644
index 000000000000..c99a317d2ca1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aionotion/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pydantic
+, pytest-aiohttp
+, pytest-asyncio
+, pytest-cov
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aionotion";
+  version = "2023.05.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = version;
+    hash = "sha256-/2sF8m5R8YXkP89bi5zR3h13r5LrFOl1OsixAcX0D4o=";
+  };
+
+  patches = [
+    # This patch removes references to setuptools and wheel that are no longer
+    # necessary and changes poetry to poetry-core, so that we don't need to add
+    # unnecessary nativeBuildInputs.
+    #
+    #   https://github.com/bachya/aionotion/pull/269
+    #
+    (fetchpatch {
+      name = "clean-up-build-dependencies.patch";
+      url = "https://github.com/bachya/aionotion/commit/53c7285110d12810f9b43284295f71d052a81b83.patch";
+      hash = "sha256-RLRbHmaR2A8MNc96WHx0L8ccyygoBUaOulAuRJkFuUM=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pydantic
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-aiohttp
+    pytest-asyncio
+    pytest-cov
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    "examples"
+  ];
+
+  pythonImportsCheck = [
+    "aionotion"
+  ];
+
+  meta = with lib; {
+    description = "Python library for Notion Home Monitoring";
+    homepage = "https://github.com/bachya/aionotion";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiooncue/default.nix b/nixpkgs/pkgs/development/python-modules/aiooncue/default.nix
new file mode 100644
index 000000000000..1c19c02222c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiooncue/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiooncue";
+  version = "0.3.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = pname;
+    rev = version;
+    hash = "sha256-i3b/W2EeH/rNmMcNW+BA9w2BRzeV6EACSJI3zffVQS4=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Module doesn't have tests
+  doCheck = false;
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner",' ""
+  '';
+
+  pythonImportsCheck = [
+    "aiooncue"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with the Kohler Oncue API";
+    homepage = "https://github.com/bdraco/aiooncue";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioopenexchangerates/default.nix b/nixpkgs/pkgs/development/python-modules/aioopenexchangerates/default.nix
new file mode 100644
index 000000000000..1cfee59a0003
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioopenexchangerates/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, aiohttp
+, aioresponses
+, pydantic
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioopenexchangerates";
+  version = "0.4.5";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "MartinHjelmare";
+    repo = "aioopenexchangerates";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-4mvd5G4qpebocg74Kz/+XtJovDnGJJYPigyhke9YDjA=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=aioopenexchangerates --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pydantic
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aioopenexchangerates"
+  ];
+
+  meta = with lib; {
+    description = "Library for the Openexchangerates API";
+    homepage = "https://github.com/MartinHjelmare/aioopenexchangerates";
+    changelog = "https://github.com/MartinHjelmare/aioopenexchangerates/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioopenssl/default.nix b/nixpkgs/pkgs/development/python-modules/aioopenssl/default.nix
new file mode 100644
index 000000000000..0ecbbc4e6a53
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioopenssl/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyopenssl
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aioopenssl";
+  version = "0.6.0";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "horazont";
+    repo = "aioopenssl";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-7Q+4/DlP+kUnC3YNk7woJaxLEEiuVmolUOajepM003Q=";
+  };
+
+  propagatedBuildInputs = [
+    pyopenssl
+  ];
+
+  pythonImportsCheck = [ "aioopenssl" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = {
+    description = "TLS-capable transport using OpenSSL for asyncio";
+    homepage = "https://github.com/horazont/aioopenssl";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiooss2/default.nix b/nixpkgs/pkgs/development/python-modules/aiooss2/default.nix
new file mode 100644
index 000000000000..85561d6472b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiooss2/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, oss2
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, requests
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "aiooss2";
+  version = "0.2.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "karajan1001";
+    repo = "aiooss2";
+    rev = "refs/tags/${version}";
+    hash = "sha256-eMmJpX7bjX5r6GW9N5KmLQpo5V8i6F95TfInct34a2g=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  pythonRelaxDeps = [
+    "aiohttp"
+    "oss2"
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    oss2
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytest-asyncio
+    pytestCheckHook
+    requests
+  ];
+
+  pythonImportsCheck = [
+    "aiooss2"
+  ];
+
+  disabledTestPaths = [
+    # Tests require network access
+    "tests/func/test_bucket.py"
+    "tests/func/test_object.py"
+    "tests/func/test_resumable.py"
+    "tests/unit/test_adapter.py"
+  ];
+
+  meta = with lib; {
+    description = "Library for aliyun OSS (Object Storage Service)";
+    homepage = "https://github.com/karajan1001/aiooss2";
+    changelog = "https://github.com/karajan1001/aiooss2/blob/${version}/CHANGES.txt";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiopegelonline/default.nix b/nixpkgs/pkgs/development/python-modules/aiopegelonline/default.nix
new file mode 100644
index 000000000000..a596791e74c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiopegelonline/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiopegelonline";
+  version = "0.0.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "mib1185";
+    repo = "aiopegelonline";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-r+5b52N/vliKHx6qOLJ4lWcQt1TPEcn5Dz7cZNhRbNg=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aiopegelonline"
+  ];
+
+  meta = with lib; {
+    description = "Library to retrieve data from PEGELONLINE";
+    homepage = "https://github.com/mib1185/aiopegelonline";
+    changelog = "https://github.com/mib1185/aiopegelonline/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiopg/default.nix b/nixpkgs/pkgs/development/python-modules/aiopg/default.nix
new file mode 100644
index 000000000000..fb49bba0f4ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiopg/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, psycopg2
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiopg";
+  version = "1.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-GD5lRSUjASTwBk5vEK8v3xD8eNyxpwSrO3HHvtwubmk=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+    psycopg2
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "psycopg2-binary" "psycopg2"
+  '';
+
+  # Tests requires a PostgreSQL Docker instance
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aiopg"
+  ];
+
+  meta = with lib; {
+    description = "Python library for accessing a PostgreSQL database";
+    homepage = "https://aiopg.readthedocs.io/";
+    license = with licenses; [ bsd2 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioprocessing/default.nix b/nixpkgs/pkgs/development/python-modules/aioprocessing/default.nix
new file mode 100644
index 000000000000..4a66a8f35d02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioprocessing/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioprocessing";
+  version = "2.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/gHHsaOMeBaGEdMEDnPZMDbDt8imSdY23J7Xo7ybG6I=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  # Tests aren't included in pypi package
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aioprocessing"
+  ];
+
+  meta = with lib; {
+    description = "Library that integrates the multiprocessing module with asyncio";
+    homepage = "https://github.com/dano/aioprocessing";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ uskudnik ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioprometheus/default.nix b/nixpkgs/pkgs/development/python-modules/aioprometheus/default.nix
new file mode 100644
index 000000000000..273d35fe13d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioprometheus/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, orjson
+, quantile-python
+, aiohttp
+, aiohttp-basicauth
+, starlette
+, quart
+, pytestCheckHook
+, httpx
+, fastapi
+, uvicorn
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioprometheus";
+  version = "unstable-2023-03-14";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "claws";
+    repo = "aioprometheus";
+    rev = "4786678b413d166c0b6e0041558d11bc1a7097b2";
+    hash = "sha256-2z68rQkMjYqkszg5Noj9owWUWQGOEp/91RGiWiyZVOY=";
+  };
+
+  propagatedBuildInputs = [
+    orjson
+    quantile-python
+  ];
+
+  passthru.optional-dependencies = {
+    aiohttp = [
+      aiohttp
+    ];
+    starlette = [
+      starlette
+    ];
+    quart = [
+      quart
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    aiohttp-basicauth
+    httpx
+    fastapi
+    uvicorn
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [ "aioprometheus" ];
+
+  meta = with lib; {
+    description = "A Prometheus Python client library for asyncio-based applications";
+    homepage = "https://github.com/claws/aioprometheus";
+    changelog = "https://github.com/claws/aioprometheus/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiopulse/default.nix b/nixpkgs/pkgs/development/python-modules/aiopulse/default.nix
new file mode 100644
index 000000000000..df93e9f8e1f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiopulse/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, async-timeout
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiopulse";
+  version = "0.4.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JbdJbkzd55KeM3Sf1ExvMuHRKNu5VAvGG4y+wkMS0Wo=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+  ];
+
+  # tests are not present
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aiopulse"
+  ];
+
+  meta = with lib; {
+    description = "Python Rollease Acmeda Automate Pulse hub protocol implementation";
+    longDescription = ''
+      The Rollease Acmeda Pulse Hub is a WiFi hub that communicates with
+      Rollease Acmeda Automate roller blinds via a proprietary RF protocol.
+      This module communicates over a local area network using a propriatery
+      binary protocol to issues commands to the Pulse Hub.
+    '';
+    homepage = "https://github.com/atmurray/aiopulse";
+    changelog = "https://github.com/atmurray/aiopulse/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiopurpleair/default.nix b/nixpkgs/pkgs/development/python-modules/aiopurpleair/default.nix
new file mode 100644
index 000000000000..bdbc83fd2ab3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiopurpleair/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pydantic
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiopurpleair";
+  version = "2022.12.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-YmJH4brWkTpgzyHwu9UnIWrY5qlDCmMtvF+KxQFXwfk=";
+  };
+
+  patches = [
+    # This patch removes references to setuptools and wheel that are no longer
+    # necessary and changes poetry to poetry-core, so that we don't need to add
+    # unnecessary nativeBuildInputs.
+    #
+    #   https://github.com/bachya/aiopurpleair/pull/207
+    #
+    (fetchpatch {
+      name = "clean-up-build-dependencies.patch";
+      url = "https://github.com/bachya/aiopurpleair/commit/8c704c51ea50da266f52a7f53198d29d643b30c5.patch";
+      hash = "sha256-RLRbHmaR2A8MNc96WHx0L8ccyygoBUaOulAuRJkFuUM=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'pydantic = "^1.10.2"' 'pydantic = "*"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pydantic
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Ignore the examples directory as the files are prefixed with test_.
+    "examples/"
+  ];
+
+  pythonImportsCheck = [
+    "aiopurpleair"
+  ];
+
+  meta = with lib; {
+    description = "Python library for interacting with the PurpleAir API";
+    homepage = "https://github.com/bachya/aiopurpleair";
+    changelog = "https://github.com/bachya/aiopurpleair/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiopvapi/default.nix b/nixpkgs/pkgs/development/python-modules/aiopvapi/default.nix
new file mode 100644
index 000000000000..055239052ddb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiopvapi/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiopvapi";
+  version = "2.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sander76";
+    repo = "aio-powerview-api";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-cghfNi5T343/7GxNLDrE0iAewMlRMycQTP7SvDVpU2M=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aiopvapi"
+  ];
+
+  meta = with lib; {
+    description = "Python API for the PowerView API";
+    homepage = "https://github.com/sander76/aio-powerview-api";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiopvpc/default.nix b/nixpkgs/pkgs/development/python-modules/aiopvpc/default.nix
new file mode 100644
index 000000000000..602128265fdc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiopvpc/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, aiohttp
+, async-timeout
+, backports-zoneinfo
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, python-dotenv
+}:
+
+buildPythonPackage rec {
+  pname = "aiopvpc";
+  version = "4.2.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "azogue";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-k02lNjFjOcMfHa1jLJlMFUOOVrdTrACNoEXDSZ693K8=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml --replace \
+      " --cov --cov-report term --cov-report html" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    backports-zoneinfo
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-timeout
+    pytestCheckHook
+    python-dotenv
+  ];
+
+  pythonImportsCheck = [
+    "aiopvpc"
+  ];
+
+  meta = with lib; {
+    description = "Python module to download Spanish electricity hourly prices (PVPC)";
+    homepage = "https://github.com/azogue/aiopvpc";
+    changelog = "https://github.com/azogue/aiopvpc/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiopyarr/default.nix b/nixpkgs/pkgs/development/python-modules/aiopyarr/default.nix
new file mode 100644
index 000000000000..c4a6cf05ad51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiopyarr/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, ciso8601
+, fetchFromGitHub
+, orjson
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiopyarr";
+  version = "23.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "tkdrob";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-CzNB6ymvDTktiOGdcdCvWLVQ3mKmbdMpc/vezSXCpG4=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'version="master"' 'version="${version}"'
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+    ciso8601
+    orjson
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aiopyarr"
+  ];
+
+  meta = with lib; {
+    description = "Python API client for Lidarr/Radarr/Readarr/Sonarr";
+    homepage = "https://github.com/tkdrob/aiopyarr";
+    changelog = "https://github.com/tkdrob/aiopyarr/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiopylgtv/default.nix b/nixpkgs/pkgs/development/python-modules/aiopylgtv/default.nix
new file mode 100644
index 000000000000..3039f5766757
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiopylgtv/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, pythonOlder
+, sqlitedict
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "aiopylgtv";
+  version = "0.4.1";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bendavid";
+    repo = pname;
+    rev = version;
+    hash = "sha256-NkWJGy5QUrhpbARoscrXy/ilCjAz01YxeVTH0I+IjNM=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    sqlitedict
+    websockets
+  ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "aiopylgtv" ];
+
+  meta = with lib; {
+    description = "Python library to control webOS based LG TV units";
+    homepage = "https://github.com/bendavid/aiopylgtv";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioqsw/default.nix b/nixpkgs/pkgs/development/python-modules/aioqsw/default.nix
new file mode 100644
index 000000000000..7e62d1f2089d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioqsw/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "aioqsw";
+  version = "0.3.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "Noltari";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-kSwTHwVSMGyXA0SF74f9gyBN82XhdjdN6DWrQV0PiaU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aioqsw"
+  ];
+
+  meta = with lib; {
+    description = "Library to fetch data from QNAP QSW switches";
+    homepage = "https://github.com/Noltari/aioqsw";
+    changelog = "https://github.com/Noltari/aioqsw/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioquic-mitmproxy/default.nix b/nixpkgs/pkgs/development/python-modules/aioquic-mitmproxy/default.nix
new file mode 100644
index 000000000000..75ccd6072741
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioquic-mitmproxy/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, certifi
+, cryptography
+, fetchFromGitHub
+, pylsqpack
+, pyopenssl
+, pytestCheckHook
+, pythonOlder
+, service-identity
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "aioquic-mitmproxy";
+  version = "0.9.21.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "meitinger";
+    repo = "aioquic_mitmproxy";
+    rev = "refs/tags/${version}";
+    hash = "sha256-eD3eICE9jS1jyqMgWwcv6w3gkR0EyGcKwgSXhasXNeA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    certifi
+    cryptography
+    pylsqpack
+    pyopenssl
+    service-identity
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aioquic"
+  ];
+
+  meta = with lib; {
+    description = "QUIC and HTTP/3 implementation in Python";
+    homepage = "https://github.com/meitinger/aioquic_mitmproxy";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioquic/default.nix b/nixpkgs/pkgs/development/python-modules/aioquic/default.nix
new file mode 100644
index 000000000000..9aeb06a1382d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioquic/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, certifi
+, fetchPypi
+, openssl
+, pylsqpack
+, pyopenssl
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioquic";
+  version = "0.9.21";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ecfsBjGOeFYnZlyk6HI63zR7ciW30AbjMtJXWh9RbvU=";
+  };
+
+  propagatedBuildInputs = [
+    certifi
+    pylsqpack
+    pyopenssl
+  ];
+
+  buildInputs = [
+    openssl
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aioquic"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Implementation of QUIC and HTTP/3";
+    homepage = "https://github.com/aiortc/aioquic";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiorecollect/default.nix b/nixpkgs/pkgs/development/python-modules/aiorecollect/default.nix
new file mode 100644
index 000000000000..c2b6f3609e53
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiorecollect/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, freezegun
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiorecollect";
+  version = "2023.11.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-CRiYde3FKVXhqB3W5rD7T3v93PAcsXBj0gG0L0umHSg=";
+  };
+
+  postPatch = ''
+    # this is not used directly by the project
+    sed -i '/certifi =/d' pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    freezegun
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Ignore the examples directory as the files are prefixed with test_.
+    "examples/"
+  ];
+
+  pythonImportsCheck = [
+    "aiorecollect"
+  ];
+
+  meta = with lib; {
+    description = "Python library for the Recollect Waste API";
+    longDescription = ''
+      aiorecollect is a Python asyncio-based library for the ReCollect
+      Waste API. It allows users to programmatically retrieve schedules
+      for waste removal in their area, including trash, recycling, compost
+      and more.
+    '';
+    homepage = "https://github.com/bachya/aiorecollect";
+    changelog = "https://github.com/bachya/aiorecollect/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioredis/default.nix b/nixpkgs/pkgs/development/python-modules/aioredis/default.nix
new file mode 100644
index 000000000000..2c944600ef91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioredis/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, async-timeout
+, typing-extensions
+, hiredis
+, isPyPy
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioredis";
+  version = "2.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6qUar5k/LXH1S3BSfEQEN7plNAWIr+t4bNh8Vcic2Y4=";
+  };
+
+  patches = [
+    # https://github.com/aio-libs-abandoned/aioredis-py/pull/1490
+    (fetchpatch {
+      name = "python-3.11-compatibility.patch";
+      url = "https://github.com/aio-libs-abandoned/aioredis-py/commit/1b951502dc8f149fa66beafeea40c782f1c5c1d3.patch";
+      hash = "sha256-EqkiYktxISg0Rv4ShXOksGvuUyljPxjJsfNOVaaax2o=";
+      includes = [ "aioredis/exceptions.py" ];
+    })
+  ];
+
+  propagatedBuildInputs = [
+    async-timeout
+    typing-extensions
+  ] ++ lib.optional (!isPyPy) hiredis;
+
+  # Wants to run redis-server, hardcoded FHS paths, too much trouble.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Asyncio (PEP 3156) Redis client library";
+    homepage = "https://github.com/aio-libs-abandoned/aioredis-py";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mmai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioresponses/default.nix b/nixpkgs/pkgs/development/python-modules/aioresponses/default.nix
new file mode 100644
index 000000000000..85cac7f96710
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioresponses/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, ddt
+, fetchPypi
+, pbr
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "aioresponses";
+  version = "0.7.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-m4wQizY1TARjO60Op1K1XZVqdgL+PjI0uTn8RK+W8dg=";
+  };
+
+  nativeBuildInputs = [
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    ddt
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Skip a test which makes requests to httpbin.org
+    "test_address_as_instance_of_url_combined_with_pass_through"
+    "test_pass_through_with_origin_params"
+  ];
+
+  pythonImportsCheck = [
+    "aioresponses"
+  ];
+
+  meta = {
+    description = "A helper to mock/fake web requests in python aiohttp package";
+    homepage = "https://github.com/pnuckowski/aioresponses";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ rvl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioridwell/default.nix b/nixpkgs/pkgs/development/python-modules/aioridwell/default.nix
new file mode 100644
index 000000000000..c5b1c9bb70fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioridwell/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, freezegun
+, poetry-core
+, pyjwt
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, pytz
+, titlecase
+, types-pytz
+}:
+
+buildPythonPackage rec {
+  pname = "aioridwell";
+  version = "2023.10.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-psynooRbX34EFYY7FTqy3KdFsv939z/qYfIfyNTVkiM=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pyjwt
+    pytz
+    titlecase
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    freezegun
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+    types-pytz
+  ];
+
+  disabledTests = [
+    # AssertionError: assert datetime.date(...
+    "test_get_next_pickup_event"
+  ];
+
+  disabledTestPaths = [
+    # Ignore the examples directory as the files are prefixed with test_
+    "examples/"
+  ];
+
+  pythonImportsCheck = [
+    "aioridwell"
+  ];
+
+  meta = with lib; {
+    description = "Python library for interacting with Ridwell waste recycling";
+    homepage = "https://github.com/bachya/aioridwell";
+    changelog = "https://github.com/bachya/aioridwell/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiormq/default.nix b/nixpkgs/pkgs/development/python-modules/aiormq/default.nix
new file mode 100644
index 000000000000..3a5b809c13fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiormq/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, aiomisc-pytest
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, pamqp
+, yarl
+, setuptools
+, poetry-core
+, aiomisc
+}:
+
+buildPythonPackage rec {
+  pname = "aiormq";
+  version = "6.7.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mosquito";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-X5Uy1DGxvsyEFR1UgVYqxOX6mESLnNzQl7sVkvzjcw4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pamqp
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  checkInputs = [
+    aiomisc-pytest
+  ];
+
+  # Tests attempt to connect to a RabbitMQ server
+  disabledTestPaths = [
+    "tests/test_channel.py"
+    "tests/test_connection.py"
+  ];
+
+  pythonImportsCheck = [
+    "aiormq"
+  ];
+
+  meta = with lib; {
+    description = "AMQP 0.9.1 asynchronous client library";
+    homepage = "https://github.com/mosquito/aiormq";
+    changelog = "https://github.com/mosquito/aiormq/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ emilytrau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiorpcx/default.nix b/nixpkgs/pkgs/development/python-modules/aiorpcx/default.nix
new file mode 100644
index 000000000000..eae5b4a537c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiorpcx/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, attrs
+}:
+
+buildPythonPackage rec {
+  pname = "aiorpcx";
+  version = "0.22.1";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "aiorpcX";
+    sha256 = "0lx54bcinp44fmr8q4bbffsqbkg8kdcwykf9i5jj0bj3sfzgf9k0";
+  };
+
+  propagatedBuildInputs = [ attrs ];
+
+  disabled = pythonOlder "3.6";
+
+  # Checks needs internet access
+  doCheck = false;
+
+  pythonImportsCheck = [ "aiorpcx" ];
+
+  meta = with lib; {
+    description = "Transport, protocol and framing-independent async RPC client and server implementation";
+    homepage = "https://github.com/kyuupichan/aiorpcX";
+    license = licenses.mit;
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiortm/default.nix b/nixpkgs/pkgs/development/python-modules/aiortm/default.nix
new file mode 100644
index 000000000000..b04e55251dea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiortm/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, ciso8601
+, click
+, fetchFromGitHub
+, mashumaro
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "aiortm";
+  version = "0.8.6";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "MartinHjelmare";
+    repo = "aiortm";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-bchfFtggmKXjAVTeFFy+3YXF3PCfAcFPC5fanw3l/RE=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=aiortm --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    ciso8601
+    click
+    mashumaro
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aiortm"
+  ];
+
+  meta = with lib; {
+    description = "Library for the Remember the Milk API";
+    homepage = "https://github.com/MartinHjelmare/aiortm";
+    changelog = "https://github.com/MartinHjelmare/aiortm/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioruckus/default.nix b/nixpkgs/pkgs/development/python-modules/aioruckus/default.nix
new file mode 100644
index 000000000000..a3d77994f432
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioruckus/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, wheel
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "aioruckus";
+  version = "0.34";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "ms264556";
+    repo = "aioruckus";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-SPj1w1jAJFBsWj1+N8srAbvlh+yB3ZTT7aDcZTnmUto=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "setuptools>=68.1" "setuptools"
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    xmltodict
+  ];
+
+  pythonImportsCheck = [
+    "aioruckus"
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # these require a local ruckus device
+    "test_ap_info"
+    "test_authentication_error"
+    "test_connect_success"
+    "test_current_active_clients"
+    "test_mesh_info"
+    "test_system_info"
+  ];
+
+  meta = with lib; {
+    description = "Python client for Ruckus Unleashed and Ruckus ZoneDirector";
+    homepage = "https://github.com/ms264556/aioruckus";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiorun/default.nix b/nixpkgs/pkgs/development/python-modules/aiorun/default.nix
new file mode 100644
index 000000000000..f0e63e0ae374
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiorun/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, fetchpatch
+, flit-core
+, pygments
+, pytestCheckHook
+, uvloop
+}:
+
+buildPythonPackage rec {
+  pname = "aiorun";
+  version = "2023.7.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "cjrh";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-3AGsT8IUNi5SZHBsBfd7akj8eQ+xb0mrR7ydIr3T8gs=";
+  };
+
+  patches = [
+    # Raise flit-core version constrains
+    (fetchpatch { # https://github.com/cjrh/aiorun/pull/85
+      url = "https://github.com/cjrh/aiorun/commit/a0c027ea331167712738e35ca70fefcd794e16d5.patch";
+      hash = "sha256-M1rcrkdFcoFa3IncPnJaRhnXbelyk56QnMGtmgB6bvk=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    pygments
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    uvloop
+  ];
+
+  # allow for writable directory for darwin
+  preBuild = ''
+    export HOME=$TMPDIR
+  '';
+
+  pythonImportsCheck = [
+    "aiorun"
+  ];
+
+  meta = with lib; {
+    description = "Boilerplate for asyncio applications";
+    homepage = "https://github.com/cjrh/aiorun";
+    changelog = "https://github.com/cjrh/aiorun/blob/v${version}/CHANGES";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioruuvigateway/default.nix b/nixpkgs/pkgs/development/python-modules/aioruuvigateway/default.nix
new file mode 100644
index 000000000000..215d34d098b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioruuvigateway/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, bluetooth-data-tools
+, httpx
+, pytest-asyncio
+, pytest-httpx
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aioruuvigateway";
+  version = "0.1.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "akx";
+    repo = "aioruuvigateway";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Etv+kPFYEK79hpDeNmDfuyNj1vJ6udry1u+TRO5gLV4=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-data-tools
+    httpx
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-httpx
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aioruuvigateway"
+  ];
+
+  meta = with lib; {
+    description = "An asyncio-native library for requesting data from a Ruuvi Gateway";
+    homepage = "https://github.com/akx/aioruuvigateway";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiorwlock/default.nix b/nixpkgs/pkgs/development/python-modules/aiorwlock/default.nix
new file mode 100644
index 000000000000..f959ec734ef5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiorwlock/default.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, pytest-asyncio
+, pytest-cov
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aiorwlock";
+  version = "1.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-g/Eth99LlyiguP2hdWWFqw1lKxB7q1nGCE4bGtaSq0U=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  pythonImportsCheck = [ "aiorwlock" ];
+
+  meta = with lib; {
+    description = "Read write lock for asyncio";
+    homepage = "https://github.com/aio-libs/aiorwlock";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ billhuang ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiosasl/default.nix b/nixpkgs/pkgs/development/python-modules/aiosasl/default.nix
new file mode 100644
index 000000000000..d904802ff61a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiosasl/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pyopenssl
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aiosasl";
+  version = "0.5.0";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "horazont";
+    repo = "aiosasl";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-JIuNPb/l4QURMQc905H2iNGCfMz+zM/QJhDQOR8LPdc=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "python311-compat.patch";
+      url = "https://github.com/horazont/aiosasl/commit/44c48d36b416bd635d970dba2607a31b2167ea1b.patch";
+      hash = "sha256-u6PJKV54dU2MA9hXa/9hJ3eLVds1DuLHGbt8y/OakWs=";
+    })
+  ];
+
+  nativeCheckInputs = [
+    pyopenssl
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "aiosasl" ];
+
+  meta = {
+    description = "Asyncio SASL library";
+    homepage = "https://github.com/horazont/aiosasl";
+    license = lib.licenses.lgpl3Plus;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiosenz/default.nix b/nixpkgs/pkgs/development/python-modules/aiosenz/default.nix
new file mode 100644
index 000000000000..cddb2f37071f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiosenz/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, authlib
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "aiosenz";
+  version = "1.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "milanmeu";
+    repo = pname;
+    rev = version;
+    hash = "sha256-ODdWPS14zzptxuS6mff51f0s1SYnIqjF40DmvT0sL0w=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+    authlib
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aiosenz"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for the nVent Raychem SENZ RestAPI";
+    homepage = "https://github.com/milanmeu/aiosenz";
+    license = with licenses; [ lgpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioserial/default.nix b/nixpkgs/pkgs/development/python-modules/aioserial/default.nix
new file mode 100644
index 000000000000..1a02f7acd305
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioserial/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyserial
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioserial";
+  version = "1.3.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-cCvwOw64S47y2NrFy5JeHmhdzpj3exJVabxv0rO1gig=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "aioserial" ];
+
+  meta = with lib; {
+    description = "Python module for async serial communication";
+    homepage = "https://github.com/changyuheng/aioserial";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioshelly/default.nix b/nixpkgs/pkgs/development/python-modules/aioshelly/default.nix
new file mode 100644
index 000000000000..e0547c9484fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioshelly/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, aiohttp
+, bluetooth-data-tools
+, buildPythonPackage
+, fetchFromGitHub
+, orjson
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioshelly";
+  version = "6.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-LkcUcGx31GwrbmBWCyEuD5x9yzeszUHBCYSBgTzgz9A=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    bluetooth-data-tools
+    orjson
+  ];
+
+  # Project has no test
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aioshelly"
+  ];
+
+  meta = with lib; {
+    description = "Python library to control Shelly";
+    homepage = "https://github.com/home-assistant-libs/aioshelly";
+    changelog = "https://github.com/home-assistant-libs/aioshelly/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioshutil/default.nix b/nixpkgs/pkgs/development/python-modules/aioshutil/default.nix
new file mode 100644
index 000000000000..0fc144ac6f2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioshutil/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "aioshutil";
+  version = "1.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "kumaraditya303";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-XIGjiLjoyS/7vUDIyBPvHNMyHOBa0gsg/c/vGgrhZAg=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --cov aioshutil --cov-report xml" ""
+  '';
+
+  pythonImportsCheck = [
+    "aioshutil"
+  ];
+
+  meta = with lib; {
+    description = "Asynchronous version of function of shutil module";
+    homepage = "https://github.com/kumaraditya303/aioshutil";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiosignal/default.nix b/nixpkgs/pkgs/development/python-modules/aiosignal/default.nix
new file mode 100644
index 000000000000..2b3addc35917
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiosignal/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, frozenlist
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiosignal";
+  version = "1.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-vx3Fe28r+0it1UFwyDSD9NNyeIN4tywTyr4pVp49WuU=";
+  };
+
+  propagatedBuildInputs = [
+    frozenlist
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "filterwarnings = error" "" \
+      --replace "--cov=aiosignal" ""
+  '';
+
+  pythonImportsCheck = [
+    "aiosignal"
+  ];
+
+  meta = with lib; {
+    description = "Python list of registered asynchronous callbacks";
+    homepage = "https://github.com/aio-libs/aiosignal";
+    changelog = "https://github.com/aio-libs/aiosignal/blob/v${version}/CHANGES.rst";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioskybell/default.nix b/nixpkgs/pkgs/development/python-modules/aioskybell/default.nix
new file mode 100644
index 000000000000..4fd3afe9de2c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioskybell/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, aiofiles
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioskybell";
+  version = "22.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "tkdrob";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-aBT1fDFtq1vasTvCnAXKV2vmZ6LBLZqRCiepv1HDJ+Q=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'version="master",' 'version="${version}",'
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+    aiofiles
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aioskybell"
+  ];
+
+  meta = with lib; {
+    description = "API client for Skybell doorbells";
+    homepage = "https://github.com/tkdrob/aioskybell";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioslimproto/default.nix b/nixpkgs/pkgs/development/python-modules/aioslimproto/default.nix
new file mode 100644
index 000000000000..2294960ce59a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioslimproto/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pillow
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "aioslimproto";
+  version = "2.3.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-d+PEzCF1Cw/7NmumxIRRlr3hojpNsZM/JMQ0KWdosXk=";
+  };
+
+  patches = [
+    # https://github.com/home-assistant-libs/aioslimproto/pull/189
+    (fetchpatch {
+      name = "unpin-setuptools-version.patch";
+      url = "https://github.com/home-assistant-libs/aioslimproto/commit/06fd56987be8903ff147bad38af84b21bc31bc18.patch";
+      hash = "sha256-kTu1+IwDrcdqelyK/vfhxw8MQBis5I1jag7YTytKQhs=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    async-timeout
+    pillow
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aioslimproto"
+  ];
+
+  meta = with lib; {
+    description = "Module to control Squeezebox players";
+    homepage = "https://github.com/home-assistant-libs/aioslimproto";
+    changelog = "https://github.com/home-assistant-libs/aioslimproto/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiosmb/default.nix b/nixpkgs/pkgs/development/python-modules/aiosmb/default.nix
new file mode 100644
index 000000000000..873eb8d24acf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiosmb/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, asyauth
+, asysocks
+, buildPythonPackage
+, colorama
+, cryptography
+, fetchPypi
+, minikerberos
+, prompt-toolkit
+, pycryptodomex
+, pythonOlder
+, six
+, tqdm
+, winacl
+, winsspi
+}:
+
+buildPythonPackage rec {
+  pname = "aiosmb";
+  version = "0.4.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uN5lbhuPt9axp2ZTTxDgHuDRwlQjXANEkGPgQJL1o90=";
+  };
+
+  propagatedBuildInputs = [
+    asyauth
+    asysocks
+    colorama
+    cryptography
+    minikerberos
+    prompt-toolkit
+    pycryptodomex
+    six
+    tqdm
+    winacl
+    winsspi
+  ];
+
+  # Project doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aiosmb"
+  ];
+
+  meta = with lib; {
+    description = "Python SMB library";
+    homepage = "https://github.com/skelsec/aiosmb";
+    changelog = "https://github.com/skelsec/aiosmb/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiosmtpd/default.nix b/nixpkgs/pkgs/development/python-modules/aiosmtpd/default.nix
new file mode 100644
index 000000000000..fa66e0ca53cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiosmtpd/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, atpublic
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "aiosmtpd";
+  version = "1.4.4.post2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-iWKOxXtOBmszDBgeSHNY4a74D00p/9Pf7h/n+ohpTqs=";
+  };
+
+  propagatedBuildInputs = [
+    atpublic
+    attrs
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  # Fixes for Python 3.10 can't be applied easily, https://github.com/aio-libs/aiosmtpd/pull/294
+  doCheck = pythonOlder "3.10";
+
+  disabledTests = [
+    # Requires git
+    "test_ge_master"
+    # Seems to be a sandbox issue
+    "test_byclient"
+  ];
+
+  pythonImportsCheck = [
+    "aiosmtpd"
+  ];
+
+  meta = with lib; {
+    description = "Asyncio based SMTP server";
+    homepage = "https://aiosmtpd.readthedocs.io/";
+    longDescription = ''
+      This is a server for SMTP and related protocols, similar in utility to the
+      standard library's smtpd.py module.
+    '';
+    license = licenses.asl20;
+    maintainers = with maintainers; [ eadwu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiosmtplib/default.nix b/nixpkgs/pkgs/development/python-modules/aiosmtplib/default.nix
new file mode 100644
index 000000000000..dda58fc011e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiosmtplib/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, aiosmtpd
+, buildPythonPackage
+, fetchFromGitHub
+, hypothesis
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, trustme
+}:
+
+buildPythonPackage rec {
+  pname = "aiosmtplib";
+  version = "3.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "cole";
+    repo = "aiosmtplib";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-67Z+k+PBIGP2oGb/52dMtsapUsHufvFcX+wWiMj5Jsg=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    aiosmtpd
+    hypothesis
+    pytest-asyncio
+    pytestCheckHook
+    trustme
+  ];
+
+  pythonImportsCheck = [
+    "aiosmtplib"
+  ];
+
+  meta = with lib; {
+    description = "Module which provides a SMTP client";
+    homepage = "https://github.com/cole/aiosmtplib";
+    changelog = "https://github.com/cole/aiosmtplib/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiosomecomfort/default.nix b/nixpkgs/pkgs/development/python-modules/aiosomecomfort/default.nix
new file mode 100644
index 000000000000..5775aece8060
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiosomecomfort/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, prettytable
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "aiosomecomfort";
+  version = "0.0.22";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mkmer";
+    repo = "AIOSomecomfort";
+    rev = "refs/tags/${version}";
+    hash = "sha256-d4pyt9+sBPNo/PL05HQ4sjyjubMtTZI9WUGRU1B/dH0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    prettytable
+  ];
+
+  pythonImportsCheck = [
+    "aiosomecomfort"
+  ];
+
+  # Tests only run on Windows, due to WindowsSelectorEventLoopPolicy
+  doCheck = false;
+
+  meta = {
+    description = "AsyicIO client for US models of Honeywell Thermostats";
+    homepage = "https://github.com/mkmer/AIOSomecomfort";
+    changelog = "https://github.com/mkmer/AIOSomecomfort/releases/tag/${version}";
+    license = lib.licenses.gpl3Only;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiosql/default.nix b/nixpkgs/pkgs/development/python-modules/aiosql/default.nix
new file mode 100644
index 000000000000..7160eccace60
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiosql/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pg8000
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+, sphinx-rtd-theme
+, sphinxHook
+}:
+
+buildPythonPackage rec {
+  pname = "aiosql";
+  version = "9.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  outputs = [
+    "doc"
+    "out"
+  ];
+
+  src = fetchFromGitHub {
+    owner = "nackjicholson";
+    repo = "aiosql";
+    rev = "refs/tags/${version}";
+    hash = "sha256-AwuZ3y/qAyZzffTG6mHLk0b+zFB9307VjAX8g1pvWto=";
+  };
+
+  sphinxRoot = "docs/source";
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    sphinx-rtd-theme
+    sphinxHook
+  ];
+
+  propagatedBuildInputs = [
+    pg8000
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Simple SQL in Python";
+    homepage = "https://nackjicholson.github.io/aiosql/";
+    changelog = "https://github.com/nackjicholson/aiosql/releases/tag/${version}";
+    license = with licenses; [ bsd2 ];
+    maintainers = with maintainers; [ kaction ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiosqlite/default.nix b/nixpkgs/pkgs/development/python-modules/aiosqlite/default.nix
new file mode 100644
index 000000000000..2da12df9edbc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiosqlite/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aiounittest
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiosqlite";
+  version = "0.19.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "omnilib";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-dm7uqG59FP40hcQt+R7qfQiD8P42AYZ2WcH1RoEC5wQ=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  nativeCheckInputs = [
+    aiounittest
+    pytestCheckHook
+  ];
+
+  # Tests are not pick-up automatically by the hook
+  pytestFlagsArray = [
+    "aiosqlite/tests/*.py"
+  ];
+
+  pythonImportsCheck = [
+    "aiosqlite"
+  ];
+
+  meta = with lib; {
+    description = "Asyncio bridge to the standard sqlite3 module";
+    homepage = "https://github.com/jreese/aiosqlite";
+    changelog = "https://github.com/omnilib/aiosqlite/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiosteamist/default.nix b/nixpkgs/pkgs/development/python-modules/aiosteamist/default.nix
new file mode 100644
index 000000000000..535594e3d28d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiosteamist/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pythonOlder
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "aiosteamist";
+  version = "0.3.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = pname;
+    rev = version;
+    hash = "sha256-IKrAJ4QDcYJRO4hcomL9FRs8hJ3k7SgRgK4H1b8SxIM=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    xmltodict
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov=aiosteamist" "" \
+      --replace 'xmltodict = "^0.12.0"' 'xmltodict = "*"'
+  '';
+
+  pythonImportsCheck = [
+    "aiosteamist"
+  ];
+
+  # Modules doesn't have test suite
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Module to control Steamist steam systems";
+    homepage = "https://github.com/bdraco/aiosteamist";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiostream/default.nix b/nixpkgs/pkgs/development/python-modules/aiostream/default.nix
new file mode 100644
index 000000000000..43f3ae89f138
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiostream/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "aiostream";
+  version = "0.5.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "vxgmichel";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-g2W2TtCh2ANPjeTdASVgEu+qKfz/Ugh1rDWJcFvOJpI=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --cov aiostream --cov-report html --cov-report term" ""
+  '';
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aiostream"
+  ];
+
+  meta = with lib; {
+    description = "Generator-based operators for asynchronous iteration";
+    homepage = "https://aiostream.readthedocs.io";
+    changelog = "https://github.com/vxgmichel/aiostream/releases/tag/v${version}";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ rmcgibbo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioswitcher/default.nix b/nixpkgs/pkgs/development/python-modules/aioswitcher/default.nix
new file mode 100644
index 000000000000..8d652cc0d9ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioswitcher/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, assertpy
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytest-mockservers
+, pytest-resource-path
+, pytest-sugar
+, pytestCheckHook
+, pythonOlder
+, time-machine
+}:
+
+buildPythonPackage rec {
+  pname = "aioswitcher";
+  version = "3.4.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "TomerFi";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-coTENnNX8GFLstpQtuJOC8050llW4QuLiutYARDWaSo=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  preCheck = ''
+    export TZ=Asia/Jerusalem
+  '';
+
+  nativeCheckInputs = [
+    assertpy
+    pytest-asyncio
+    pytest-mockservers
+    pytest-resource-path
+    pytest-sugar
+    pytestCheckHook
+    time-machine
+  ];
+
+  disabledTests = [
+    # AssertionError: Expected <14:00> to be equal to <17:00>, but was not.
+    "test_schedule_parser_with_a_weekly_recurring_enabled_schedule_data"
+    "test_schedule_parser_with_a_daily_recurring_enabled_schedule_data"
+    "test_schedule_parser_with_a_partial_daily_recurring_enabled_schedule_data"
+    "test_schedule_parser_with_a_non_recurring_enabled_schedule_data"
+    "test_hexadecimale_timestamp_to_localtime_with_the_current_timestamp_should_return_a_time_string"
+  ];
+
+  pythonImportsCheck = [
+    "aioswitcher"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interact with Switcher water heater";
+    homepage = "https://github.com/TomerFi/aioswitcher";
+    changelog = "https://github.com/TomerFi/aioswitcher/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiosyncthing/default.nix b/nixpkgs/pkgs/development/python-modules/aiosyncthing/default.nix
new file mode 100644
index 000000000000..e45ddb5dec0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiosyncthing/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, expects
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "aiosyncthing";
+  version = "0.6.3";
+
+  src = fetchFromGitHub {
+    owner = "zhulik";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-vn8S2/kRW5C2Hbes9oLM4LGm1jWWK0zeLdujR14y6EI=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    expects
+    pytestCheckHook
+    pytest-asyncio
+    pytest-mock
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=auto"
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=aiosyncthing --cov-report=html" ""
+  '';
+
+  pythonImportsCheck = [ "aiosyncthing" ];
+
+  meta = with lib; {
+    description = "Python client for the Syncthing REST API";
+    homepage = "https://github.com/zhulik/aiosyncthing";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiotractive/default.nix b/nixpkgs/pkgs/development/python-modules/aiotractive/default.nix
new file mode 100644
index 000000000000..5891fa703a90
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiotractive/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "aiotractive";
+  version = "0.5.6";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "zhulik";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-jJw1L1++Z/r+E12tA6zoyyy4MmTpaaVVzKwfI6xcDBQ=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "aiotractive" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/zhulik/aiotractive/releases/tag/v${version}";
+    description = "Python client for the Tractive REST API";
+    homepage = "https://github.com/zhulik/aiotractive";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiounifi/default.nix b/nixpkgs/pkgs/development/python-modules/aiounifi/default.nix
new file mode 100644
index 000000000000..36b7aa587dda
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiounifi/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, orjson
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, segno
+, setuptools
+, trustme
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "aiounifi";
+  version = "66";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "Kane610";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-UWKsx7giGrNR04X/2vgdaCFulxbzQkvlRfCEodVoHY8=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "setuptools==" "setuptools>=" \
+      --replace "wheel==" "wheel>="
+
+    sed -i '/--cov=/d' pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    orjson
+    segno
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+    trustme
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=auto"
+  ];
+
+  pythonImportsCheck = [
+    "aiounifi"
+  ];
+
+  meta = with lib; {
+    description = "Python library for communicating with Unifi Controller API";
+    homepage = "https://github.com/Kane610/aiounifi";
+    changelog = "https://github.com/Kane610/aiounifi/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiounittest/default.nix b/nixpkgs/pkgs/development/python-modules/aiounittest/default.nix
new file mode 100644
index 000000000000..4cc8203625db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiounittest/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, coverage
+, isPy27
+, wrapt
+}:
+
+buildPythonPackage rec {
+  pname = "aiounittest";
+  version = "1.4.2";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "kwarunek";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-7lDOI1SHPpRZLTHRTmfbKlZH18T73poJdFyVmb+HKms=";
+  };
+
+  propagatedBuildInputs = [
+    wrapt
+  ];
+
+  nativeCheckInputs = [
+    nose
+    coverage
+  ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  pythonImportsCheck = [ "aiounittest" ];
+
+  meta = with lib; {
+    description = "Test asyncio code more easily";
+    homepage = "https://github.com/kwarunek/aiounittest";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiovlc/default.nix b/nixpkgs/pkgs/development/python-modules/aiovlc/default.nix
new file mode 100644
index 000000000000..39607c9fdde5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiovlc/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiovlc";
+  version = "0.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "MartinHjelmare";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+IpWX661Axl2Ke1NGN6W9CMMQMEu7EQ/2PeRkkByAxI=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml --replace \
+      " --cov=aiovlc --cov-report=term-missing:skip-covered" ""
+  '';
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aiovlc"
+  ];
+
+  meta = with lib; {
+    description = "Python module to control VLC";
+    homepage = "https://github.com/MartinHjelmare/aiovlc";
+    changelog = "https://github.com/MartinHjelmare/aiovlc/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiovodafone/default.nix b/nixpkgs/pkgs/development/python-modules/aiovodafone/default.nix
new file mode 100644
index 000000000000..573075095cb3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiovodafone/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, aiohttp
+, beautifulsoup4
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiovodafone";
+  version = "0.4.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "chemelli74";
+    repo = "aiovodafone";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-nYMruxEqLvkcspz0damh9tBYYROz5gleLiyhjco+rsQ=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=aiovodafone --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    beautifulsoup4
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aiovodafone"
+  ];
+
+  meta = with lib; {
+    description = "Library to control Vodafon Station";
+    homepage = "https://github.com/chemelli74/aiovodafone";
+    changelog = "https://github.com/chemelli74/aiovodafone/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiowaqi/default.nix b/nixpkgs/pkgs/development/python-modules/aiowaqi/default.nix
new file mode 100644
index 000000000000..19e133e27cbd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiowaqi/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, syrupy
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "aiowaqi";
+  version = "3.0.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "joostlek";
+    repo = "python-waqi";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+4l820FGQI66GGr+KGEeDmPUFwRrMNvYFJuSouesakY=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+    syrupy
+  ];
+
+  pythonImportsCheck = [
+    "aiowaqi"
+  ];
+
+  disabledTests = [
+    # Upstream mocking fails
+    "test_search"
+  ];
+
+  pytestFlagsArray = [
+    "--snapshot-update"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with the WAQI API";
+    homepage = "https://github.com/joostlek/python-waqi";
+    changelog = "https://github.com/joostlek/python-waqi/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiowatttime/default.nix b/nixpkgs/pkgs/development/python-modules/aiowatttime/default.nix
new file mode 100644
index 000000000000..fd5da5c330d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiowatttime/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aiowatttime";
+  version = "2023.08.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-/ulDImbLOTcoA4iH8e65A01aqqnCLn+01DWuM/4H4p4=";
+  };
+
+  patches = [
+    # This patch removes references to setuptools and wheel that are no longer
+    # necessary and changes poetry to poetry-core, so that we don't need to add
+    # unnecessary nativeBuildInputs.
+    #
+    #   https://github.com/bachya/aiowatttime/pull/206
+    #
+    (fetchpatch {
+      name = "clean-up-build-dependencies.patch";
+      url = "https://github.com/bachya/aiowatttime/commit/c3cd53f794964c5435148caacd04f4e0ab8f550a.patch";
+      hash = "sha256-RLRbHmaR2A8MNc96WHx0L8ccyygoBUaOulAuRJkFuUM=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  # Ignore the examples directory as the files are prefixed with test_
+  disabledTestPaths = [ "examples/" ];
+
+  pythonImportsCheck = [ "aiowatttime" ];
+
+  meta = with lib; {
+    description = "Python library for interacting with WattTime";
+    homepage = "https://github.com/bachya/aiowatttime";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiowebostv/default.nix b/nixpkgs/pkgs/development/python-modules/aiowebostv/default.nix
new file mode 100644
index 000000000000..7b00bfb5b0de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiowebostv/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "aiowebostv";
+  version = "0.3.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-djcfYpHkhXhjQwJzHP3mNflKrcP6Yj3/z62qeXg67ss=";
+  };
+
+  propagatedBuildInputs = [
+    websockets
+  ];
+
+  # Module doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aiowebostv"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with LG webOS based TV devices";
+    homepage = "https://github.com/home-assistant-libs/aiowebostv";
+    changelog = "https://github.com/home-assistant-libs/aiowebostv/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioweenect/default.nix b/nixpkgs/pkgs/development/python-modules/aioweenect/default.nix
new file mode 100644
index 000000000000..a55c1ad65046
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioweenect/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioweenect";
+  version = "1.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "eifinger";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-9CYdOUPCt4TkepVuVJHMZngFHyCLFwVvik1xDnfneEc=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov --cov-report term-missing --cov-report xml --cov=aioweenect tests" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+
+  pythonImportsCheck = [
+    "aioweenect"
+  ];
+
+  meta = with lib; {
+    description = "Library for the weenect API";
+    homepage = "https://github.com/eifinger/aioweenect";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiowinreg/default.nix b/nixpkgs/pkgs/development/python-modules/aiowinreg/default.nix
new file mode 100644
index 000000000000..19959b7accd4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiowinreg/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, prompt-toolkit
+, pythonOlder
+, winacl
+}:
+
+buildPythonPackage rec {
+  pname = "aiowinreg";
+  version = "0.0.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "skelsec";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-PkrBjH+yeSLpwL9kH242xQKBsjv6a11k2c26qBwR6Fw=";
+  };
+
+  propagatedBuildInputs = [
+    prompt-toolkit
+    winacl
+  ];
+
+  # Project doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aiowinreg"
+  ];
+
+  meta = with lib; {
+    description = "Python module to parse the registry hive";
+    homepage = "https://github.com/skelsec/aiowinreg";
+    changelog = "https://github.com/skelsec/aiowinreg/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiowithings/default.nix b/nixpkgs/pkgs/development/python-modules/aiowithings/default.nix
new file mode 100644
index 000000000000..542511d2d3b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiowithings/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, syrupy
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "aiowithings";
+  version = "1.0.3";
+  pyproject = true;
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "joostlek";
+    repo = "python-withings";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-n76bpFIWUfztTDEg32uopxukAtvFT3tdbtqWOLghi4I=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+    syrupy
+  ];
+
+  pythonImportsCheck = [
+    "aiowithings"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with Withings";
+    homepage = "https://github.com/joostlek/python-withings";
+    changelog = "https://github.com/joostlek/python-withings/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioxmpp/default.nix b/nixpkgs/pkgs/development/python-modules/aioxmpp/default.nix
new file mode 100644
index 000000000000..6c7660f9f3e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioxmpp/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiosasl
+, aioopenssl
+, babel
+, dnspython
+, lxml
+, multidict
+, pyasn1
+, pyasn1-modules
+, pyopenssl
+, pytz
+, sortedcollections
+, tzlocal
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aioxmpp";
+  version = "0.13.3";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "horazont";
+    repo = "aioxmpp";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-bQPKEM5eKhFI3Kx3U1espdxqjnG4yUgOXmYCrd98PDo=";
+  };
+
+  propagatedBuildInputs = [
+    aiosasl
+    aioopenssl
+    babel
+    dnspython
+    lxml
+    multidict
+    pyasn1
+    pyasn1-modules
+    pyopenssl
+    pytz
+    sortedcollections
+    tzlocal
+  ];
+
+  pythonImportsCheck = [
+    "aioxmpp"
+    "aioxmpp.node"
+    "aioxmpp.security_layer"
+    "aioxmpp.stanza"
+    "aioxmpp.stream"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    "benchmarks"
+  ];
+
+  disabledTests = [
+    # AttributeError: 'zoneinfo.ZoneInfo' object has no attribute 'normalize'
+    "test_convert_field_datetime_default_locale"
+  ];
+
+  meta = {
+    changelog = "https://github.com/horazont/aioxmpp/blob/${src.rev}/docs/api/changelog.rst";
+    description = "Pure-python XMPP library for asyncio";
+    homepage = "https://github.com/horazont/aioxmpp";
+    license = lib.licenses.lgpl3Plus;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aioymaps/default.nix b/nixpkgs/pkgs/development/python-modules/aioymaps/default.nix
new file mode 100644
index 000000000000..fb57614be9fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aioymaps/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aioymaps";
+  version = "1.2.3";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-pW8FoMdA8XdQZmLRwk5SBBgFhYhgEMJPA9+b+8aicuE=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "aioymaps" ];
+
+  meta = with lib; {
+    description = "Python package fetch data from Yandex maps";
+    homepage = "https://github.com/devbis/aioymaps";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aiozeroconf/default.nix b/nixpkgs/pkgs/development/python-modules/aiozeroconf/default.nix
new file mode 100644
index 000000000000..fe3943c25b1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aiozeroconf/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, netifaces
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "aiozeroconf";
+  version = "0.1.8";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "074plydm7sd113p3k0siihwwz62d3r42q3g83vqaffp569msknqh";
+  };
+
+  propagatedBuildInputs = [ netifaces ];
+
+  meta = with lib; {
+    description = "A pure python implementation of multicast DNS service discovery";
+    homepage = "https://github.com/jstasiak/python-zeroconf";
+    license = licenses.lgpl21;
+    maintainers = with maintainers; [ obadz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/airly/default.nix b/nixpkgs/pkgs/development/python-modules/airly/default.nix
new file mode 100644
index 000000000000..b83cdefd8a51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/airly/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, aiohttp
+, aioresponses
+, aiounittest
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "airly";
+  version = "1.1.0";
+
+  src = fetchFromGitHub {
+    owner = "ak-ambi";
+    repo = "python-airly";
+    rev = "v${version}";
+    hash = "sha256-weliT/FYnRX+pzVAyRWFly7lfj2z7P+hpq5SIhyIgmI=";
+  };
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  nativeCheckInputs = [
+    aioresponses
+    aiounittest
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    cd tests
+  '';
+
+  disabledTests = [
+    "InstallationsLoaderTestCase"
+    "MeasurementsSessionTestCase"
+  ];
+
+  pythonImportsCheck = [ "airly" ];
+
+  meta = with lib; {
+    description = "Python module for getting air quality data from Airly sensors";
+    homepage = "https://github.com/ak-ambi/python-airly";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/airthings-ble/default.nix b/nixpkgs/pkgs/development/python-modules/airthings-ble/default.nix
new file mode 100644
index 000000000000..eec4830837f0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/airthings-ble/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, bleak
+, bleak-retry-connector
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "airthings-ble";
+  version = "0.5.6-4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "vincegio";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Ft5A2ZGVH9VHoRDAqDcc0rBfnQRxoXMylCAwUSwmViE=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'bleak-retry-connector = "^0.15.1"' 'bleak = "*"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bleak
+    bleak-retry-connector
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "airthings_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for Airthings BLE devices";
+    homepage = "https://github.com/vincegio/airthings-ble";
+    changelog = "https://github.com/vincegio/airthings-ble/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/airthings-cloud/default.nix b/nixpkgs/pkgs/development/python-modules/airthings-cloud/default.nix
new file mode 100644
index 000000000000..c7560d6ec926
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/airthings-cloud/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "airthings-cloud";
+  version = "0.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "pyAirthings";
+    rev = version;
+    hash = "sha256-sqHNK6biSWso4uOYimzU7PkEn0uP5sHAaPGsS2vSMNY=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "airthings"
+  ];
+
+  meta = with lib; {
+    description = "Python module for Airthings";
+    homepage = "https://github.com/Danielhiversen/pyAirthings";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/airtouch4pyapi/default.nix b/nixpkgs/pkgs/development/python-modules/airtouch4pyapi/default.nix
new file mode 100644
index 000000000000..de19c5965364
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/airtouch4pyapi/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "airtouch4pyapi";
+  version = "1.0.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "LonePurpleWolf";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-RiRwebumidn0nijL/e9J74ZYx0DASi1up5BTNxYoGEA=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "airtouch4pyapi" ];
+
+  meta = with lib; {
+    description = "Python API for Airtouch 4 controllers";
+    homepage = "https://github.com/LonePurpleWolf/airtouch4pyapi";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ajpy/default.nix b/nixpkgs/pkgs/development/python-modules/ajpy/default.nix
new file mode 100644
index 000000000000..926b5ed7efee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ajpy/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "ajpy";
+  version = "0.0.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "173wm207zyi86m2ms7vscakdi4mmjqfxqsdx1gn0j9nn0gsf241h";
+  };
+
+  # ajpy doesn't have tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "AJP package crafting library";
+    homepage = "https://github.com/hypn0s/AJPy/";
+    license = licenses.lgpl2;
+    maintainers = with maintainers; [ y0no ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ajsonrpc/default.nix b/nixpkgs/pkgs/development/python-modules/ajsonrpc/default.nix
new file mode 100644
index 000000000000..0dd07c0f4eea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ajsonrpc/default.nix
@@ -0,0 +1,24 @@
+{ lib, pythonOlder, buildPythonPackage, fetchPypi, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "ajsonrpc";
+  version = "1.2.0";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "791bac18f0bf0dee109194644f151cf8b7ff529c4b8d6239ac48104a3251a19f";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "ajsonrpc" ];
+
+  meta = with lib; {
+    description = "Async JSON-RPC 2.0 protocol + asyncio server";
+    homepage = "https://github.com/pavlov99/ajsonrpc";
+    license = licenses.mit;
+    maintainers = with maintainers; [ oxzi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/alabaster/default.nix b/nixpkgs/pkgs/development/python-modules/alabaster/default.nix
new file mode 100644
index 000000000000..31f9e14f6da8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/alabaster/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi
+, pygments }:
+
+buildPythonPackage rec {
+  pname = "alabaster";
+  version = "0.7.13";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-onpKCE1eaQ4W4B4DrSsuVSxhplRpQZuQckMZPeGoSuI=";
+  };
+
+  propagatedBuildInputs = [ pygments ];
+
+  # No tests included
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/bitprophet/alabaster";
+    description = "A Sphinx theme";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aladdin-connect/default.nix b/nixpkgs/pkgs/development/python-modules/aladdin-connect/default.nix
new file mode 100644
index 000000000000..3ca8016cd765
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aladdin-connect/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, requests
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aladdin-connect";
+  version = "0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "shoejosh";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-kLvMpSGa5WyDOH3ejAJyFGsB9IiMXp+nvVxM/ZkxyFw=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aladdin_connect"
+  ];
+
+  meta = with lib; {
+    description = "Python library for interacting with Genie Aladdin Connect devices";
+    homepage = "https://github.com/shoejosh/aladdin-connect";
+    changelog = "https://github.com/shoejosh/aladdin-connect/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/alarmdecoder/default.nix b/nixpkgs/pkgs/development/python-modules/alarmdecoder/default.nix
new file mode 100644
index 000000000000..3e9bdffdadff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/alarmdecoder/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pyftdi
+, pyopenssl
+, pyserial
+, pytestCheckHook
+, pythonOlder
+, pyusb
+}:
+
+buildPythonPackage rec {
+  pname = "alarmdecoder";
+  version = "1.13.11";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "nutechsoftware";
+    repo = "alarmdecoder";
+    rev = version;
+    hash = "sha256-q2s+wngDKtWm5mxGHNAc63Ed6tiQD9gLHVoQZNWFB0w=";
+  };
+
+  propagatedBuildInputs = [
+    pyftdi
+    pyopenssl
+    pyserial
+    pyusb
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Socket issue, https://github.com/nutechsoftware/alarmdecoder/issues/45
+    "test_ssl"
+    "test_ssl_exception"
+  ];
+
+  pythonImportsCheck = [ "alarmdecoder" ];
+
+  meta = with lib; {
+    description = "Python interface for the Alarm Decoder (AD2USB, AD2SERIAL and AD2PI) devices";
+    homepage = "https://github.com/nutechsoftware/alarmdecoder";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/albumentations/default.nix b/nixpkgs/pkgs/development/python-modules/albumentations/default.nix
new file mode 100644
index 000000000000..e2104641b78d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/albumentations/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, opencv4
+, pyyaml
+, qudida
+, scikit-image
+, scipy
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "albumentations";
+  version = "1.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-pqODiP5UbFaAcejIL0FEmOhsntA8CLWOeoizHPeiRMY=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  pythonRemoveDeps = [
+    "opencv-python"
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    opencv4
+    pyyaml
+    qudida
+    scikit-image
+    scipy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # this test hangs up
+    "test_transforms"
+  ];
+
+  pythonImportsCheck = [ "albumentations" ];
+
+  meta = with lib; {
+    description = "Fast image augmentation library and easy to use wrapper around other libraries";
+    homepage = "https://github.com/albumentations-team/albumentations";
+    changelog = "https://github.com/albumentations-team/albumentations/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ale-py/cmake-pybind11.patch b/nixpkgs/pkgs/development/python-modules/ale-py/cmake-pybind11.patch
new file mode 100644
index 000000000000..5bcf5b1d9b2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ale-py/cmake-pybind11.patch
@@ -0,0 +1,18 @@
+diff --git a/src/python/CMakeLists.txt b/src/python/CMakeLists.txt
+index 911e280..d484943 100644
+--- a/src/python/CMakeLists.txt
++++ b/src/python/CMakeLists.txt
+@@ -1,12 +1,6 @@
+ find_package(Python3 COMPONENTS Interpreter Development.Module REQUIRED)
+ 
+-include(FetchContent)
+-FetchContent_Declare(
+-    pybind11
+-    GIT_REPOSITORY https://github.com/pybind/pybind11
+-    GIT_TAG v2.10.0)
+-FetchContent_MakeAvailable(pybind11)
+-
++find_package(pybind11 REQUIRED)
+ add_library(ale-py MODULE ale_python_interface.cpp)
+ # Depend on the ALE and pybind11 module
+ target_link_libraries(ale-py PUBLIC ale ale-lib)
diff --git a/nixpkgs/pkgs/development/python-modules/ale-py/default.nix b/nixpkgs/pkgs/development/python-modules/ale-py/default.nix
new file mode 100644
index 000000000000..77978654e68f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ale-py/default.nix
@@ -0,0 +1,84 @@
+{ buildPythonPackage
+, SDL2
+, cmake
+, fetchFromGitHub
+, git
+, gym
+, importlib-metadata
+, importlib-resources
+, lib
+, ninja
+, numpy
+, pybind11
+, pytestCheckHook
+, python
+, pythonOlder
+, setuptools
+, stdenv
+, typing-extensions
+, wheel
+, zlib
+}:
+
+buildPythonPackage rec {
+  pname = "ale-py";
+  version = "0.8.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "mgbellemare";
+    repo = "Arcade-Learning-Environment";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-B2AxhlzvBy1lJ3JttJjImgTjMtEUyZBv+xHU2IC7BVE=";
+  };
+
+  patches = [
+    # don't download pybind11, use local pybind11
+    ./cmake-pybind11.patch
+  ];
+
+  nativeBuildInputs = [
+    cmake
+    ninja
+    setuptools
+    wheel
+    pybind11
+  ];
+
+  buildInputs = [
+    zlib
+    SDL2
+  ];
+
+  propagatedBuildInputs = [
+    typing-extensions
+    importlib-resources
+    numpy
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    gym
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'dynamic = ["version"]' 'version = "${version}"'
+    substituteInPlace setup.py \
+      --replace 'subprocess.check_output(["git", "rev-parse", "--short", "HEAD"], cwd=here)' 'b"${src.rev}"'
+  '';
+
+  dontUseCmakeConfigure = true;
+
+  pythonImportsCheck = [ "ale_py" ];
+
+  meta = with lib; {
+    description = "a simple framework that allows researchers and hobbyists to develop AI agents for Atari 2600 games";
+    homepage = "https://github.com/mgbellemare/Arcade-Learning-Environment";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ billhuang ];
+    broken = stdenv.isDarwin; # fails to link with missing library
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/alectryon/default.nix b/nixpkgs/pkgs/development/python-modules/alectryon/default.nix
new file mode 100644
index 000000000000..08fcd9f9651f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/alectryon/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi
+, pygments, dominate, beautifulsoup4, docutils, sphinx }:
+
+buildPythonPackage rec {
+  pname = "alectryon";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "00cxzfifvgcf3d3s8lsj1yxcwyf3a1964p86fj7b42q8pa0b4r3i";
+  };
+
+  propagatedBuildInputs = [
+    pygments
+    dominate
+    beautifulsoup4
+    docutils
+    sphinx
+  ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/cpitclaudel/alectryon";
+    description = "A collection of tools for writing technical documents that mix Coq code and prose";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Zimmi48 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/alembic/default.nix b/nixpkgs/pkgs/development/python-modules/alembic/default.nix
new file mode 100644
index 000000000000..c1bb0f1d3c7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/alembic/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, mako
+, python-dateutil
+, sqlalchemy
+, importlib-metadata
+, importlib-resources
+, pytest-xdist
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "alembic";
+  version = "1.12.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jnZFwy5PIAZ15p8HRUFTNetZo2Y/X+tIer+gswxFiIs=";
+  };
+
+  propagatedBuildInputs = [
+    mako
+    python-dateutil
+    sqlalchemy
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  pythonImportsCheck = [
+    "alembic"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-xdist
+  ];
+
+  meta = with lib; {
+    homepage = "https://bitbucket.org/zzzeek/alembic";
+    description = "A database migration tool for SQLAlchemy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/alexapy/default.nix b/nixpkgs/pkgs/development/python-modules/alexapy/default.nix
new file mode 100644
index 000000000000..2ab2d2612365
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/alexapy/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, aiofiles
+, aiohttp
+, authcaptureproxy
+, backoff
+, beautifulsoup4
+, buildPythonPackage
+, certifi
+, cryptography
+, fetchFromGitLab
+, poetry-core
+, pyotp
+, pythonOlder
+, pythonRelaxDepsHook
+, requests
+, simplejson
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "alexapy";
+  version = "1.27.10";
+  pyproject = true;
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitLab {
+    owner = "keatontaylor";
+    repo = "alexapy";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-eoL7q+p0m3YZd7Ub7U8nE3tQGNA2oQXelvN+H01b0BM=";
+  };
+
+  pythonRelaxDeps = [
+    "aiofiles"
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    aiofiles
+    aiohttp
+    authcaptureproxy
+    backoff
+    beautifulsoup4
+    certifi
+    cryptography
+    pyotp
+    requests
+    simplejson
+    yarl
+  ];
+
+  pythonImportsCheck = [
+    "alexapy"
+  ];
+
+  # Module has no tests (only a websocket test which seems unrelated to the module)
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python Package for controlling Alexa devices (echo dot, etc) programmatically";
+    homepage = "https://gitlab.com/keatontaylor/alexapy";
+    changelog = "https://gitlab.com/keatontaylor/alexapy/-/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/algebraic-data-types/default.nix b/nixpkgs/pkgs/development/python-modules/algebraic-data-types/default.nix
new file mode 100644
index 000000000000..9c19470fbddc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/algebraic-data-types/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, hypothesis
+, mypy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "algebraic-data-types";
+  version = "0.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jspahrsummers";
+    repo = "adt";
+    rev = "v" + version;
+    hash = "sha256-RHLI5rmFxklzG9dyYgYfSS/srCjcxNpzNcK/RPNJBPE=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    hypothesis
+    mypy
+  ];
+
+  disabledTestPaths = [
+    # AttributeError: module 'mypy.types' has no attribute 'TypeVarDef'
+    "tests/test_mypy_plugin.py"
+  ];
+
+  pythonImportsCheck = [
+    "adt"
+  ];
+
+  meta = with lib; {
+    description = "Algebraic data types for Python";
+    homepage = "https://github.com/jspahrsummers/adt";
+    license = licenses.mit;
+    maintainers = with maintainers; [ uri-canva ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/alive-progress/default.nix b/nixpkgs/pkgs/development/python-modules/alive-progress/default.nix
new file mode 100644
index 000000000000..7e3adbf1166e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/alive-progress/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, about-time
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, grapheme
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "alive-progress";
+  version = "3.1.4";
+
+  src = fetchFromGitHub {
+    owner = "rsalmei";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-27PgxQ9nw8p5hfaSf/jPYG7419o3i8B8R09o93szSOk=";
+  };
+
+  propagatedBuildInputs = [
+    about-time
+    grapheme
+  ];
+
+  nativeCheckInputs = [
+    click
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "alive_progress"
+  ];
+
+  meta = with lib; {
+    description = "A new kind of Progress Bar, with real-time throughput, ETA, and very cool animations";
+    homepage = "https://github.com/rsalmei/alive-progress";
+    license = licenses.mit;
+    maintainers = with maintainers; [ thiagokokada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-cdn/default.nix b/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-cdn/default.nix
new file mode 100644
index 000000000000..3f29826f0a34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-cdn/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, aliyun-python-sdk-core
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aliyun-python-sdk-cdn";
+  version = "3.8.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-LMCNvjV85TvdSM0OXean4dPzAiV8apVdRLTvUISOKec=";
+  };
+
+  propagatedBuildInputs = [
+    aliyun-python-sdk-core
+  ];
+
+  # All components are stored in a mono repo
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aliyunsdkcdn"
+  ];
+
+  meta = with lib; {
+    description = "CDN module of Aliyun Python SDK";
+    homepage = "https://github.com/aliyun/aliyun-openapi-python-sdk";
+    changelog = "https://github.com/aliyun/aliyun-openapi-python-sdk/blob/master/aliyun-python-sdk-cdn/ChangeLog.txt";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-config/default.nix b/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-config/default.nix
new file mode 100644
index 000000000000..5801e6a5ee14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-config/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, aliyun-python-sdk-core
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aliyun-python-sdk-config";
+  version = "2.2.12";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-blrT/yCQ2vxaociSqKvRX3fUyKLsAFT3UyFGB/AzZHI=";
+  };
+
+  propagatedBuildInputs = [
+    aliyun-python-sdk-core
+  ];
+
+  # All components are stored in a mono repo
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aliyunsdkconfig"
+  ];
+
+  meta = with lib; {
+    description = "Configuration module of Aliyun Python SDK";
+    homepage = "https://github.com/aliyun/aliyun-openapi-python-sdk";
+    changelog = "https://github.com/aliyun/aliyun-openapi-python-sdk/blob/master/aliyun-python-sdk-config/ChangeLog.txt";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-core/default.nix b/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-core/default.nix
new file mode 100644
index 000000000000..1ab81cd86b52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-core/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchPypi
+, jmespath
+, pythonOlder
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "aliyun-python-sdk-core";
+  version = "2.14.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-yAaBWkj/24lMxbzhW4JZuaMBLMDNoBvi89+7hE8/TyE=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    jmespath
+  ];
+
+  # All components are stored in a mono repo
+  doCheck = false;
+
+  pythonRelaxDeps = true;
+
+  pythonImportsCheck = [
+    "aliyunsdkcore"
+  ];
+
+  meta = with lib; {
+    description = "Core module of Aliyun Python SDK";
+    homepage = "https://github.com/aliyun/aliyun-openapi-python-sdk";
+    changelog = "https://github.com/aliyun/aliyun-openapi-python-sdk/blob/master/aliyun-python-sdk-core/ChangeLog.txt";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-dbfs/default.nix b/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-dbfs/default.nix
new file mode 100644
index 000000000000..1dc10a140cc1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-dbfs/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, aliyun-python-sdk-core
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aliyun-python-sdk-dbfs";
+  version = "2.0.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Kj6DfnXZq5ilE+vnZrAoZEhPDoNrMIs5p2OcBc24qXM=";
+  };
+
+  propagatedBuildInputs = [
+    aliyun-python-sdk-core
+  ];
+
+  # All components are stored in a mono repo
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aliyunsdkdbfs"
+  ];
+
+  meta = with lib; {
+    description = "DBFS module of Aliyun Python SDK";
+    homepage = "https://github.com/aliyun/aliyun-openapi-python-sdk";
+    changelog = "https://github.com/aliyun/aliyun-openapi-python-sdk/blob/master/aliyun-python-sdk-dbfs/ChangeLog.txt";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-iot/default.nix b/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-iot/default.nix
new file mode 100644
index 000000000000..2a753b425103
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-iot/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, aliyun-python-sdk-core
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aliyun-python-sdk-iot";
+  version = "8.57.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Ea0IUn2mlu0c7QYJZkUrBUrtjUuTHoTeuvZHw/il+4A=";
+  };
+
+  propagatedBuildInputs = [
+    aliyun-python-sdk-core
+  ];
+
+  # All components are stored in a mono repo
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aliyunsdkiot"
+  ];
+
+  meta = with lib; {
+    description = "IoT module of Aliyun Python SDK";
+    homepage = "https://github.com/aliyun/aliyun-openapi-python-sdk";
+    changelog = "https://github.com/aliyun/aliyun-openapi-python-sdk/blob/master/aliyun-python-sdk-iot/ChangeLog.txt";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-kms/default.nix b/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-kms/default.nix
new file mode 100644
index 000000000000..55288c2b6d2a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-kms/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, aliyun-python-sdk-core
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aliyun-python-sdk-kms";
+  version = "2.16.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+HI0qLZNRXyiM4+HZQ2xijzn99vJv+9x7+jyiUre09Y=";
+  };
+
+  propagatedBuildInputs = [
+    aliyun-python-sdk-core
+  ];
+
+  # All components are stored in a mono repo
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aliyunsdkkms"
+  ];
+
+  meta = with lib; {
+    description = "KMS module of Aliyun Python SDK";
+    homepage = "https://github.com/aliyun/aliyun-openapi-python-sdk";
+    changelog = "https://github.com/aliyun/aliyun-openapi-python-sdk/blob/master/aliyun-python-sdk-kms/ChangeLog.txt";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-sts/default.nix b/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-sts/default.nix
new file mode 100644
index 000000000000..8de611716748
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aliyun-python-sdk-sts/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, aliyun-python-sdk-core
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aliyun-python-sdk-sts";
+  version = "3.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GLzieAX0j/aEKeKj37PtBQJy3c2zWgy1no7/lXiYSU0=";
+  };
+
+  propagatedBuildInputs = [
+    aliyun-python-sdk-core
+  ];
+
+  # All components are stored in a mono repo
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aliyunsdksts"
+  ];
+
+  meta = with lib; {
+    description = "STS module of Aliyun Python SDK";
+    homepage = "https://github.com/aliyun/aliyun-openapi-python-sdk";
+    changelog = "https://github.com/aliyun/aliyun-openapi-python-sdk/blob/master/aliyun-python-sdk-sts/ChangeLog.txt";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/allpairspy/default.nix b/nixpkgs/pkgs/development/python-modules/allpairspy/default.nix
new file mode 100644
index 000000000000..31bc1229e2ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/allpairspy/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "allpairspy";
+  version = "2.5.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "thombashi";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-0wzoQDHB7Tt80ZTlKrNxFutztsgUuin5D2eb80c4PBI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "allpairspy"
+  ];
+
+  meta = with lib; {
+    description = "Pairwise test combinations generator";
+    homepage = "https://github.com/thombashi/allpairspy";
+    changelog = "https://github.com/thombashi/allpairspy/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/allure-behave/default.nix b/nixpkgs/pkgs/development/python-modules/allure-behave/default.nix
new file mode 100644
index 000000000000..a67ff5e98d9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/allure-behave/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, behave
+, allure-python-commons
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "allure-behave";
+  version = "2.13.2";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-mxXb7+1tvf5EmVbD6eOmGfza9lAjbEVoxWZBSeZmPxQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  pythonImportsCheck = [ "allure_behave" ];
+
+  propagatedBuildInputs = [
+    allure-python-commons
+    behave
+  ];
+
+  meta = with lib; {
+    description = "Allure behave integration.";
+    homepage = "https://github.com/allure-framework/allure-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/allure-pytest/default.nix b/nixpkgs/pkgs/development/python-modules/allure-pytest/default.nix
new file mode 100644
index 000000000000..ba86e0723a5d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/allure-pytest/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, allure-python-commons
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "allure-pytest";
+  version = "2.13.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-IiQxWejsgc4rUlS0ATgCGYghsbQvEY9p1KKJOWYHx7M=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    allure-python-commons
+  ];
+
+  # Tests were moved to the meta package
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "allure_pytest"
+  ];
+
+  meta = with lib; {
+    description = "Allure integrations for Python test frameworks";
+    homepage = "https://github.com/allure-framework/allure-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ evanjs ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/allure-python-commons-test/default.nix b/nixpkgs/pkgs/development/python-modules/allure-python-commons-test/default.nix
new file mode 100644
index 000000000000..c358a2f14d7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/allure-python-commons-test/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, attrs
+, pluggy
+, six
+, pyhamcrest
+, setuptools-scm
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "allure-python-commons-test";
+  version = "2.13.2";
+
+  disabled = pythonOlder "3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Xh6NtqiuTg7UxKqJ7/p45rCUQGWiGDEaNAslzeYtgfg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [ attrs pluggy six pyhamcrest ];
+
+  checkPhase = ''
+    ${python.interpreter} -m doctest ./src/container.py
+    ${python.interpreter} -m doctest ./src/report.py
+    ${python.interpreter} -m doctest ./src/label.py
+    ${python.interpreter} -m doctest ./src/result.py
+  '';
+
+  pythonImportsCheck = [ "allure_commons_test" ];
+
+  meta = with lib; {
+    description = "Just pack of hamcrest matchers for validation result in allure2 json format";
+    homepage = "https://github.com/allure-framework/allure-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ evanjs ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/allure-python-commons/default.nix b/nixpkgs/pkgs/development/python-modules/allure-python-commons/default.nix
new file mode 100644
index 000000000000..0b50f23f77c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/allure-python-commons/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, attrs
+, pluggy
+, six
+, allure-python-commons-test
+, setuptools-scm
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "allure-python-commons";
+  version = "2.13.2";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-igNoEzAjGx3q3Ya5f/aIQcZZEyARSuY4Vw8e1g16IDM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [ attrs pluggy six allure-python-commons-test ];
+
+  checkPhase = ''
+    ${python.interpreter} -m doctest ./src/utils.py
+    ${python.interpreter} -m doctest ./src/mapping.py
+  '';
+
+  pythonImportsCheck = [ "allure" "allure_commons" ];
+
+  meta = with lib; {
+    description = "Common engine for all modules. It is useful for make integration with your homemade frameworks";
+    homepage = "https://github.com/allure-framework/allure-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ evanjs ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/alpha-vantage/default.nix b/nixpkgs/pkgs/development/python-modules/alpha-vantage/default.nix
new file mode 100644
index 000000000000..23ffd7d8b4b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/alpha-vantage/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, pandas
+, pytestCheckHook
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "alpha-vantage";
+  version = "2.3.1";
+
+  src = fetchFromGitHub {
+    owner = "RomelTorres";
+    repo = "alpha_vantage";
+    rev = version;
+    sha256 = "0cyw6zw7c7r076rmhnmg905ihwb9r7g511n6gdlph06v74pdls8d";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    requests
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    requests-mock
+    pandas
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Tests require network access
+    "test_alpha_vantage/test_integration_alphavantage.py"
+    "test_alpha_vantage/test_integration_alphavantage_async.py"
+  ];
+
+  pythonImportsCheck = [ "alpha_vantage" ];
+
+  meta = with lib; {
+    description = "Python module for the Alpha Vantage API";
+    homepage = "https://github.com/RomelTorres/alpha_vantage";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/altair/default.nix b/nixpkgs/pkgs/development/python-modules/altair/default.nix
new file mode 100644
index 000000000000..3b9b53b9a6c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/altair/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# Runtime dependencies
+, hatchling
+, toolz
+, numpy
+, jsonschema
+, typing-extensions
+, pandas
+, jinja2
+, packaging
+
+# Build, dev and test dependencies
+, anywidget
+, ipython
+, pytestCheckHook
+, vega-datasets
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "altair";
+  version = "5.2.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "altair-viz";
+    repo = "altair";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-uTG+V0SQgAQtMjvrVvKVKgIBT9qO+26EPRxQCEXj/gc=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    jinja2
+    jsonschema
+    numpy
+    packaging
+    pandas
+    toolz
+  ] ++ lib.optional (pythonOlder "3.11") typing-extensions;
+
+  nativeCheckInputs = [
+    anywidget
+    ipython
+    sphinx
+    vega-datasets
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "altair" ];
+
+  disabledTestPaths = [
+    # Disabled because it requires internet connectivity
+    "tests/test_examples.py"
+    # TODO: Disabled because of missing altair_viewer package
+    "tests/vegalite/v5/test_api.py"
+    # avoid updating files and dependency on black
+    "tests/test_toplevel.py"
+    # require vl-convert package
+    "tests/utils/test_compiler.py"
+  ];
+
+  meta = with lib; {
+    description = "A declarative statistical visualization library for Python.";
+    homepage = "https://altair-viz.github.io";
+    downloadPage = "https://github.com/altair-viz/altair";
+    changelog = "https://altair-viz.github.io/releases/changes.html";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ teh vinetos ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/altgraph/default.nix b/nixpkgs/pkgs/development/python-modules/altgraph/default.nix
new file mode 100644
index 000000000000..3a42414aa8d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/altgraph/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "altgraph";
+  version = "0.17.4";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-G1r7uY9sTcrbLirmq5+plLu4wddfT6ltNA+UN65FRAY=";
+  };
+
+  pythonImportsCheck = [ "altgraph" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/ronaldoussoren/altgraph/tags${version}";
+    description = "A fork of graphlib: a graph (network) package for constructing graphs";
+    longDescription = ''
+      altgraph is a fork of graphlib: a graph (network) package for constructing graphs,
+      BFS and DFS traversals, topological sort, shortest paths, etc. with graphviz output.
+      altgraph includes some additional usage of Python 2.6+ features and enhancements related to modulegraph and macholib.
+    '';
+    homepage = "https://altgraph.readthedocs.io/";
+    downloadPage = "https://pypi.org/project/altgraph/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ septem9er ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/amaranth-boards/default.nix b/nixpkgs/pkgs/development/python-modules/amaranth-boards/default.nix
new file mode 100644
index 000000000000..1b152e70d7b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amaranth-boards/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, amaranth
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "amaranth-boards";
+  version = "unstable-2021-12-17";
+  # python setup.py --version
+  realVersion = "0.1.dev202+g${lib.substring 0 7 src.rev}";
+
+  src = fetchFromGitHub {
+    owner = "amaranth-lang";
+    repo = "amaranth-boards";
+    rev = "8e2615765e255144403431ca95c5cdf6c78eb638";
+    sha256 = "3EOG8SO5xBNevshXMRrxKWoJUbeaVi8ckbkmqd6Tw70=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+  propagatedBuildInputs = [ setuptools amaranth ];
+
+  preBuild = ''
+    export SETUPTOOLS_SCM_PRETEND_VERSION="${realVersion}"
+  '';
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Board definitions for Amaranth HDL";
+    homepage = "https://github.com/amaranth-lang/amaranth-boards";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ emily thoughtpolice ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/amaranth-soc/default.nix b/nixpkgs/pkgs/development/python-modules/amaranth-soc/default.nix
new file mode 100644
index 000000000000..685d63414ec5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amaranth-soc/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, amaranth
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "amaranth-soc";
+  version = "unstable-2023-09-15";
+  # python setup.py --version
+  realVersion = "0.1.dev70+g${lib.substring 0 7 src.rev}";
+
+  src = fetchFromGitHub {
+    owner = "amaranth-lang";
+    repo = "amaranth-soc";
+    rev = "cce8a79a37498f4d5900be21a295ba77e51e6c9d";
+    sha256 = "sha256-hfkJaqICuy3iSTwLM9lbUPvSMDBLW8GdxqswyAOsowo=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+  propagatedBuildInputs = [ setuptools amaranth ];
+
+  preBuild = ''
+    export SETUPTOOLS_SCM_PRETEND_VERSION="${realVersion}"
+  '';
+
+  meta = with lib; {
+    description = "System on Chip toolkit for Amaranth HDL";
+    homepage = "https://github.com/amaranth-lang/amaranth-soc";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ emily thoughtpolice ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/amaranth/default.nix b/nixpkgs/pkgs/development/python-modules/amaranth/default.nix
new file mode 100644
index 000000000000..ad2cacb2ced8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amaranth/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pdm-backend
+, pyvcd
+, jinja2
+, importlib-resources
+, importlib-metadata
+, git
+
+# for tests
+, pytestCheckHook
+, symbiyosys
+, yices
+, yosys
+}:
+
+buildPythonPackage rec {
+  pname = "amaranth";
+  format = "pyproject";
+  # python -m setuptools_scm
+  version = "0.4.dev197+g${lib.substring 0 7 src.rev}";
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "amaranth-lang";
+    repo = "amaranth";
+    rev = "11d5bb19eb34463918c07dc5e2e0eac7dbf822b0";
+    sha256 = "sha256-Ji5oYfF2hKSunAdAQTniv8Ajj6NE/bvW5cvadrGKa+U=";
+  };
+
+  nativeBuildInputs = [
+    git
+    pdm-backend
+  ];
+
+  propagatedBuildInputs = [
+    jinja2
+    pyvcd
+  ] ++
+    lib.optional (pythonOlder "3.9") importlib-resources ++
+    lib.optional (pythonOlder "3.8") importlib-metadata;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    symbiyosys
+    yices
+    yosys
+  ];
+
+  pythonImportsCheck = [ "amaranth" ];
+
+  meta = with lib; {
+    description = "A modern hardware definition language and toolchain based on Python";
+    homepage = "https://amaranth-lang.org/docs/amaranth";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ emily thoughtpolice ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/amarna/default.nix b/nixpkgs/pkgs/development/python-modules/amarna/default.nix
new file mode 100644
index 000000000000..778a585a69f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amarna/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, lark
+, pydot
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "amarna";
+  version = "0.1.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "crytic";
+    repo = "amarna";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-tyvHWBhanR7YH87MDWdXUsDEzZG6MgnbshezAbxWO+I=";
+  };
+
+  propagatedBuildInputs = [
+    lark
+    pydot
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "amarna"
+  ];
+
+  meta = with lib; {
+    description = "Static-analyzer and linter for the Cairo programming language";
+    homepage = "https://github.com/crytic/amarna";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ raitobezarius ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/amazon-ion/default.nix b/nixpkgs/pkgs/development/python-modules/amazon-ion/default.nix
new file mode 100644
index 000000000000..0a2479dd38f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amazon-ion/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, jsonconversion
+, six
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "amazon-ion";
+  version = "0.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  # test vectors require git submodule
+  src = fetchFromGitHub {
+    owner = "amzn";
+    repo = "ion-python";
+    rev = "refs/tags/v${version}";
+    fetchSubmodules = true;
+    hash = "sha256-pCm3jd/dVqO/uIvT5N/w5yoUWU6ni62Pl2A862e+qSk=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'," ""
+  '';
+
+  propagatedBuildInputs = [
+    jsonconversion
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # ValueError: Exceeds the limit (4300) for integer string conversion
+    "test_roundtrips"
+  ];
+
+  pythonImportsCheck = [
+    "amazon.ion"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of Amazon Ion";
+    homepage = "https://github.com/amzn/ion-python";
+    sourceProvenance = with sourceTypes; [
+      fromSource
+      binaryNativeCode
+    ];
+    license = licenses.asl20;
+    maintainers = with maintainers; [ terlar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/amazon-kclpy/default.nix b/nixpkgs/pkgs/development/python-modules/amazon-kclpy/default.nix
new file mode 100644
index 000000000000..fca55e3bc0dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amazon-kclpy/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchFromGitHub, python, mock, boto, pytest }:
+
+buildPythonPackage rec {
+  pname = "amazon-kclpy";
+  version = "2.1.3";
+
+  src = fetchFromGitHub {
+    owner = "awslabs";
+    repo = "amazon-kinesis-client-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-3BhccRJd6quElXZSix1aVIqWr9wdcTTziDhnIOLiPPo=";
+  };
+
+  # argparse is just required for python2.6
+  prePatch = ''
+    substituteInPlace setup.py \
+      --replace "'argparse'," ""
+  '';
+
+  propagatedBuildInputs =  [ mock boto ];
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    ${python.interpreter} -m pytest
+  '';
+
+  meta = with lib; {
+    description = "Amazon Kinesis Client Library for Python";
+    homepage = "https://github.com/awslabs/amazon-kinesis-client-python";
+    license = licenses.amazonsl;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ambee/default.nix b/nixpkgs/pkgs/development/python-modules/ambee/default.nix
new file mode 100644
index 000000000000..3e3f719b7afd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ambee/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, aiohttp
+, poetry-core
+, yarl
+, aresponses
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ambee";
+  version = "0.4.0";
+  disabled = pythonOlder "3.8";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-ambee";
+    rev = "v${version}";
+    hash = "sha256-2wX2CLr6kdVw2AGPW6DmYI2OBfQFI/iWVorok2d3wx4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # Upstream doesn't set a version for the pyproject.toml
+    substituteInPlace pyproject.toml \
+      --replace "0.0.0" "${version}" \
+      --replace "--cov" ""
+  '';
+
+  pythonImportsCheck = [ "ambee" ];
+
+  meta = with lib; {
+    description = "Python client for Ambee API";
+    homepage = "https://github.com/frenck/python-ambee";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/amberelectric/default.nix b/nixpkgs/pkgs/development/python-modules/amberelectric/default.nix
new file mode 100644
index 000000000000..1f1422a6b36a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amberelectric/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest-mock
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "amberelectric";
+  version = "1.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5SWJnTxRm6mzP0RxrgA+jnV+Gp23WjqQA57wbT2V9Dk=";
+  };
+
+  propagatedBuildInputs = [
+    urllib3
+    python-dateutil
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "amberelectric" ];
+
+  meta = with lib; {
+    description = "Python Amber Electric API interface";
+    homepage = "https://github.com/madpilot/amberelectric.py";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ambiclimate/default.nix b/nixpkgs/pkgs/development/python-modules/ambiclimate/default.nix
new file mode 100644
index 000000000000..e375d347f2aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ambiclimate/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+, async-timeout
+}:
+
+buildPythonPackage rec {
+  pname = "ambiclimate";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    pname = "Ambiclimate";
+    inherit version;
+    sha256 = "0vhmpazc2n7qyyh7wqsz635w0f8afk2i5d592ikb84bgnfn83483";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # tests are not present
+  doCheck = false;
+
+  pythonImportsCheck = [ "ambiclimate" ];
+
+  meta = with lib; {
+    description = "Python library to communicate with ambiclimate";
+    homepage = "https://github.com/Danielhiversen/pyAmbiclimate";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/amcrest/default.nix b/nixpkgs/pkgs/development/python-modules/amcrest/default.nix
new file mode 100644
index 000000000000..1de7da6f829f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amcrest/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, argcomplete
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, httpx
+, pytestCheckHook
+, pythonOlder
+, requests
+, responses
+, urllib3
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "amcrest";
+  version = "1.9.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tchellomello";
+    repo = "python-amcrest";
+    rev = "refs/tags/${version}";
+    hash = "sha256-v0jWEZo06vltEq//suGrvJ/AeeDxUG5CCFhbf03q34w=";
+  };
+
+  propagatedBuildInputs = [
+    argcomplete
+    httpx
+    requests
+    urllib3
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "amcrest"
+  ];
+
+  meta = with lib; {
+    description = "Python module for Amcrest and Dahua Cameras";
+    homepage = "https://github.com/tchellomello/python-amcrest";
+    changelog = "https://github.com/tchellomello/python-amcrest/releases/tag/${version}";
+    license = with licenses; [ gpl2Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/amiibo-py/default.nix b/nixpkgs/pkgs/development/python-modules/amiibo-py/default.nix
new file mode 100644
index 000000000000..5fb70397fa71
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amiibo-py/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, aiohttp
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "amiibo-py";
+  version = "unstable-2021-01-16";
+  disabled = pythonOlder "3.5.3"; # Older versions are not supported upstream
+
+  src = fetchFromGitHub {
+    owner = "XiehCanCode";
+    repo = "amiibo.py";
+    rev = "4766037530f41ad11368240e994888d196783b83";
+    sha256 = "0ln8ykaws8c5fvzlzccn60mpbdbvxlhkp3nsvs2xqdbsqp270yv2";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    requests
+  ];
+
+  doCheck = false; # No tests are available upstream
+  pythonImportsCheck = [ "amiibo" ];
+
+  meta = with lib; {
+    description = "API Wrapper for amiiboapi.com";
+    homepage = "https://github.com/XiehCanCode/amiibo.py";
+    license = licenses.mit;
+    maintainers = [ maintainers.ivar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/amply/default.nix b/nixpkgs/pkgs/development/python-modules/amply/default.nix
new file mode 100644
index 000000000000..235a697d2af4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amply/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, setuptools-scm
+, docutils
+, pyparsing
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "amply";
+  version = "0.1.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-YUIRA8z44QZnFxFf55F2ENgx1VHGjTGhEIdqW2x4rqQ=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+  propagatedBuildInputs = [
+    docutils
+    pyparsing
+  ];
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "amply" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/willu47/amply";
+    description = ''
+      Allows you to load and manipulate AMPL/GLPK data as Python data structures
+    '';
+    maintainers = with maintainers; [ ris ];
+    license = licenses.epl10;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/amqp/default.nix b/nixpkgs/pkgs/development/python-modules/amqp/default.nix
new file mode 100644
index 000000000000..36fc48c35f35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amqp/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, case
+, fetchPypi
+, pytestCheckHook
+, pytest-rerunfailures
+, pythonOlder
+, vine
+}:
+
+buildPythonPackage rec {
+  pname = "amqp";
+  version = "5.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-oez/QlrQY61CpIbJAoB9FIIxFIHIrZWnJpSyl1519/0=";
+  };
+
+  propagatedBuildInputs = [
+    vine
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    case
+    pytestCheckHook
+    pytest-rerunfailures
+  ];
+
+  disabledTests = [
+    # Requires network access
+    "test_rmq.py"
+  ];
+
+  pythonImportsCheck = [
+    "amqp"
+  ];
+
+  meta = with lib; {
+    description = "Python client for the Advanced Message Queuing Procotol (AMQP). This is a fork of amqplib which is maintained by the Celery project";
+    homepage = "https://github.com/celery/py-amqp";
+    changelog = "https://github.com/celery/py-amqp/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/amqplib/default.nix b/nixpkgs/pkgs/development/python-modules/amqplib/default.nix
new file mode 100644
index 000000000000..430065b7d1f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amqplib/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, python }:
+
+buildPythonPackage rec {
+  pname = "amqplib";
+  version = "1.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "tgz";
+    sha256 = "843d69b681a60afd21fbf50f310404ec67fcdf9d13dfcf6e9d41f3b456217e5b";
+  };
+
+  # testing assumes network connection
+  doCheck = false;
+
+  checkPhase = ''
+    ${python.interpreter} tests/client_0_8/run_all.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/barryp/py-amqplib";
+    description = "Python client for the Advanced Message Queuing Procotol (AMQP)";
+    license = licenses.lgpl21;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/amqtt/default.nix b/nixpkgs/pkgs/development/python-modules/amqtt/default.nix
new file mode 100644
index 000000000000..b25c1fa46ed2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/amqtt/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, buildPythonPackage
+, docopt
+, fetchFromGitHub
+, fetchpatch
+, hypothesis
+, passlib
+, poetry-core
+, pytest-logdog
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, setuptools
+, transitions
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "amqtt";
+  version = "unstable-2022-05-29";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Yakifo";
+    repo = pname;
+    rev = "09ac98d39a711dcff0d8f22686916e1c2495144b";
+    hash = "sha256-8T1XhBSOiArlUQbQ41LsUogDgOurLhf+M8mjIrrAC4s=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'transitions = "^0.8.0"' 'transitions = "*"' \
+      --replace 'websockets = ">=9.0,<11.0"' 'websockets = "*"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    docopt
+    passlib
+    pyyaml
+    setuptools
+    transitions
+    websockets
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytest-logdog
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=auto"
+  ];
+
+  disabledTestPaths = [
+    # Test are not ported from hbmqtt yet
+    "tests/test_client.py"
+  ];
+
+  preCheck = ''
+    # Some tests need amqtt
+    export PATH=$out/bin:$PATH
+  '';
+
+  pythonImportsCheck = [
+    "amqtt"
+  ];
+
+  meta = with lib; {
+    description = "Python MQTT client and broker implementation";
+    homepage = "https://amqtt.readthedocs.io/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ancp-bids/default.nix b/nixpkgs/pkgs/development/python-modules/ancp-bids/default.nix
new file mode 100644
index 000000000000..366b00e9c6e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ancp-bids/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pythonOlder
+, pytestCheckHook
+, setuptools
+, wheel
+, numpy
+, pandas
+}:
+
+buildPythonPackage rec {
+  pname = "ancp-bids";
+  version = "0.2.1";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  # `tests/data` dir missing from PyPI dist
+  src = fetchFromGitHub {
+    owner = "ANCPLabOldenburg";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Nu9pulVSZysgm/F7jl+VpoqMCiHeysZjQDQ1dT7AnpE=";
+  };
+
+  patches = [
+    # https://github.com/ANCPLabOldenburg/ancp-bids/pull/78
+    (fetchpatch {
+      name = "unpin-wheel-build-dependency.patch";
+      url = "https://github.com/ANCPLabOldenburg/ancp-bids/commit/6e7a0733002845aacb0152c5aacfb42054a9b65e.patch";
+      hash = "sha256-WbQRwb8Wew46OJu+zo7n4qBtgtH/Lr6x3YHAyN9ko9M=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  nativeCheckInputs = [
+    numpy
+    pandas
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ancpbids"
+  ];
+
+  pytestFlagsArray = [ "tests/auto" ];
+
+  disabledTests = [ "test_fetch_dataset" ];
+
+  meta = with lib; {
+    homepage = "https://ancpbids.readthedocs.io";
+    description = "Read/write/validate/query BIDS datasets";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/androguard/default.nix b/nixpkgs/pkgs/development/python-modules/androguard/default.nix
new file mode 100644
index 000000000000..ee808f973bae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/androguard/default.nix
@@ -0,0 +1,94 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, future
+, networkx
+, pygments
+, lxml
+, colorama
+, matplotlib
+, asn1crypto
+, click
+, pydot
+, ipython
+, packaging
+, pyqt5
+, pyperclip
+, nose
+, nose-timer
+, mock
+, python-magic
+, codecov
+, coverage
+, qt5
+# This is usually used as a library, and it'd be a shame to force the GUI
+# libraries to the closure if GUI is not desired.
+, withGui ? false
+# Tests take a very long time, and currently fail, but next release' tests
+# shouldn't fail
+, doCheck ? false
+}:
+
+buildPythonPackage rec {
+  pname = "androguard";
+  version = "3.4.0a1";
+
+  src = fetchFromGitHub {
+    repo = pname;
+    owner = pname;
+    rev = "v${version}";
+    sha256 = "1aparxiq11y0hbvkayp92w684nyxyyx7mi0n1x6x51g5z6c58vmy";
+  };
+
+  nativeBuildInputs = [
+    packaging
+  ] ++ lib.optionals withGui [
+    qt5.wrapQtAppsHook
+  ];
+
+  propagatedBuildInputs = [
+    asn1crypto
+    click
+    colorama
+    future
+    ipython
+    lxml
+    matplotlib
+    networkx
+    pydot
+    pygments
+  ] ++ lib.optionals withGui [
+    pyqt5
+    pyperclip
+  ];
+
+  nativeCheckInputs = [
+    codecov
+    coverage
+    mock
+    nose
+    nose-timer
+    pyperclip
+    pyqt5
+    python-magic
+  ];
+  inherit doCheck;
+
+  # If it won't be verbose, you'll see nothing going on for a long time.
+  checkPhase = ''
+    runHook preCheck
+    nosetests --verbosity=3
+    runHook postCheck
+  '';
+
+  preFixup = lib.optionalString withGui ''
+    makeWrapperArgs+=("''${qtWrapperArgs[@]}")
+  '';
+
+  meta = with lib; {
+    description = "Tool and Python library to interact with Android Files";
+    homepage = "https://github.com/androguard/androguard";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ pmiddend ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/android-backup/default.nix b/nixpkgs/pkgs/development/python-modules/android-backup/default.nix
new file mode 100644
index 000000000000..df2096582ccd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/android-backup/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pycrypto
+, pythonOlder
+, enum34
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "android-backup";
+  version = "0.2.0";
+
+  src = fetchFromGitHub {
+    owner = "bluec0re";
+    repo = "android-backup-tools";
+    rev = "v${version}";
+    sha256 = "0c436hv64ddqrjs77pa7z6spiv49pjflbmgg31p38haj5mzlrqvw";
+  };
+
+  propagatedBuildInputs = [
+    pycrypto
+  ] ++ lib.optional (pythonOlder "3.4") enum34;
+
+  checkPhase = ''
+    ${python.interpreter} -m android_backup.tests
+  '';
+
+  pythonImportsCheck = [ "android_backup" ];
+
+  meta = with lib; {
+    description = "Unpack and repack android backups";
+    homepage = "https://github.com/bluec0re/android-backup-tools";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/androidtv/default.nix b/nixpkgs/pkgs/development/python-modules/androidtv/default.nix
new file mode 100644
index 000000000000..0516388b3f89
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/androidtv/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, adb-shell
+, aiofiles
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pure-python-adb
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "androidtv";
+  version = "0.0.73";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "JeffLIrion";
+    repo = "python-androidtv";
+    rev = "v${version}";
+    hash = "sha256-FJUTJfS9jiC7KDf6XcGVRNXf75bVUOBPZe8y9M39Uak=";
+  };
+
+  propagatedBuildInputs = [
+    adb-shell
+    async-timeout
+    pure-python-adb
+  ];
+
+  passthru.optional-dependencies = {
+    async = [
+      aiofiles
+    ];
+    inherit (adb-shell.optional-dependencies) usb;
+  };
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ]
+  ++ passthru.optional-dependencies.async
+  ++ passthru.optional-dependencies.usb;
+
+  disabledTests = [
+    # Requires git but fails anyway
+    "test_no_underscores"
+  ];
+
+  pythonImportsCheck = [
+    "androidtv"
+  ];
+
+  meta = with lib; {
+    description = "Communicate with an Android TV or Fire TV device via ADB over a network";
+    homepage = "https://github.com/JeffLIrion/python-androidtv/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jamiemagee ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/androidtvremote2/default.nix b/nixpkgs/pkgs/development/python-modules/androidtvremote2/default.nix
new file mode 100644
index 000000000000..976ba217ce46
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/androidtvremote2/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aiofiles
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, protobuf
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "androidtvremote2";
+  version = "0.0.14";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tronikos";
+    repo = "androidtvremote2";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-m53TlNrrCjA4CqvR02Yph7Gr5Dt17VJFBX6MC3arWOI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiofiles
+    cryptography
+    protobuf
+  ];
+
+  pythonImportsCheck = [
+    "androidtvremote2"
+  ];
+
+  # Module only has a dummy test
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Library to interact with the Android TV Remote protocol v2";
+    homepage = "https://github.com/tronikos/androidtvremote2";
+    changelog = "https://github.com/tronikos/androidtvremote2/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/anel-pwrctrl-homeassistant/default.nix b/nixpkgs/pkgs/development/python-modules/anel-pwrctrl-homeassistant/default.nix
new file mode 100644
index 000000000000..d32138c68dfa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/anel-pwrctrl-homeassistant/default.nix
@@ -0,0 +1,30 @@
+{
+  lib,
+  buildPythonPackage,
+  fetchPypi,
+}:
+buildPythonPackage rec {
+  pname = "anel-pwrctrl-homeassistant";
+  version = "0.0.1.dev2";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "anel_pwrctrl-homeassistant";
+    hash = "sha256-AcsnYD9CeGAarm5QdweUF6CUFwUywhfmU46NG8+Cm4s=";
+  };
+
+  # No tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "anel_pwrctrl"
+  ];
+
+  meta = with lib; {
+    description = "Discover and control ANEL NET-PwrCtrl devices";
+    homepage = "https://github.com/mweinelt/anel-pwrctrl";
+    license = licenses.mit;
+    maintainers = with maintainers; [jamiemagee];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/angr/default.nix b/nixpkgs/pkgs/development/python-modules/angr/default.nix
new file mode 100644
index 000000000000..8ecc9c02c0e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/angr/default.nix
@@ -0,0 +1,98 @@
+{ lib
+, stdenv
+, ailment
+, archinfo
+, buildPythonPackage
+, cachetools
+, capstone
+, cffi
+, claripy
+, cle
+, cppheaderparser
+, dpkt
+, fetchFromGitHub
+, gitpython
+, itanium-demangler
+, mulpyplexer
+, nampa
+, networkx
+, progressbar2
+, protobuf
+, psutil
+, pycparser
+, pythonOlder
+, pyvex
+, rich
+, rpyc
+, sortedcontainers
+, sqlalchemy
+, sympy
+, unicorn
+}:
+
+buildPythonPackage rec {
+  pname = "angr";
+  version = "9.2.79";
+  pyproject = true;
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "angr";
+    repo = "angr";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-J5ZjJPX5bL3xuKB9dbSlEvHVQS4XnrQfpZ6IXy/1uMw=";
+  };
+
+  propagatedBuildInputs = [
+    ailment
+    archinfo
+    cachetools
+    capstone
+    cffi
+    claripy
+    cle
+    cppheaderparser
+    dpkt
+    gitpython
+    itanium-demangler
+    mulpyplexer
+    nampa
+    networkx
+    progressbar2
+    protobuf
+    psutil
+    pycparser
+    pyvex
+    rich
+    rpyc
+    sortedcontainers
+    sqlalchemy
+    sympy
+    unicorn
+  ];
+
+  setupPyBuildFlags = lib.optionals stdenv.isLinux [
+    "--plat-name"
+    "linux"
+  ];
+
+  # Tests have additional requirements, e.g., pypcode and angr binaries
+  # cle is executing the tests with the angr binaries
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "angr"
+    "claripy"
+    "cle"
+    "pyvex"
+    "archinfo"
+  ];
+
+  meta = with lib; {
+    description = "Powerful and user-friendly binary analysis platform";
+    homepage = "https://angr.io/";
+    license = with licenses; [ bsd2 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/angrcli/default.nix b/nixpkgs/pkgs/development/python-modules/angrcli/default.nix
new file mode 100644
index 000000000000..368ea4c9a27e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/angrcli/default.nix
@@ -0,0 +1,60 @@
+{ stdenv
+, lib
+, angr
+, buildPythonPackage
+, cmd2
+, coreutils
+, fetchFromGitHub
+, pygments
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "angrcli";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "fmagin";
+    repo = "angr-cli";
+    rev = "v${version}";
+    hash = "sha256-a5ajUBQwt3xUNkeSOeGOAFf47wd4UVk+LcuAHGqbq4s=";
+  };
+
+  postPatch = ''
+    substituteInPlace tests/test_derefs.py \
+      --replace "/bin/ls" "${coreutils}/bin/ls"
+  '';
+
+  propagatedBuildInputs = [
+    angr
+    cmd2
+    pygments
+  ];
+
+  nativeCheckInputs = [
+    coreutils
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals (!stdenv.hostPlatform.isx86) [
+    # expects the x86 register "rax" to exist
+    "test_cc"
+    "test_loop"
+    "test_max_depth"
+  ];
+
+  pythonImportsCheck = [
+    "angrcli"
+  ];
+
+  meta = with lib; {
+    description = "Python modules to allow easier interactive use of angr";
+    homepage = "https://github.com/fmagin/angr-cli";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/angrop/default.nix b/nixpkgs/pkgs/development/python-modules/angrop/default.nix
new file mode 100644
index 000000000000..69b06e58784d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/angrop/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, angr
+, buildPythonPackage
+, fetchFromGitHub
+, progressbar
+, pythonOlder
+, setuptools
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "angrop";
+  version = "9.2.8";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "angr";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-zmWdGbFzwLDP7MUqEprZcIgA7lAdCrafWYohAehJyh0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    angr
+    progressbar
+    tqdm
+  ];
+
+  # Tests have additional requirements, e.g., angr binaries
+  # cle is executing the tests with the angr binaries already and is a requirement of angr
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "angrop"
+  ];
+
+  meta = with lib; {
+    description = "ROP gadget finder and chain builder";
+    homepage = "https://github.com/angr/angrop";
+    license = with licenses; [ bsd2 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aniso8601/default.nix b/nixpkgs/pkgs/development/python-modules/aniso8601/default.nix
new file mode 100644
index 000000000000..5e22e6f87add
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aniso8601/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, python-dateutil
+, fetchPypi
+, isPy3k
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aniso8601";
+  version = "9.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-cuMRdmfu32aVG7LZP0KWpWuUsHioqVkFoFJhH7PxuXM=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.optional (!isPy3k) mock;
+
+  pythonImportsCheck = [ "aniso8601" ];
+
+  meta = with lib; {
+    description = "Python Parser for ISO 8601 strings";
+    homepage = "https://bitbucket.org/nielsenb/aniso8601";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/annexremote/default.nix b/nixpkgs/pkgs/development/python-modules/annexremote/default.nix
new file mode 100644
index 000000000000..02067d4ebaa9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/annexremote/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "annexremote";
+  version = "1.6.4";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Lykos153";
+    repo = "AnnexRemote";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-eBq1nZnNuzTLvc11G/XaenZlVEUke3kpWlZ7P5g4kc8=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "annexremote"
+  ];
+
+  meta = with lib; {
+    description = "Helper module to easily develop git-annex remotes";
+    homepage = "https://github.com/Lykos153/AnnexRemote";
+    changelog = "https://github.com/Lykos153/AnnexRemote/releases/tag/v${version}";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ montag451 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/annotated-types/default.nix b/nixpkgs/pkgs/development/python-modules/annotated-types/default.nix
new file mode 100644
index 000000000000..85e2379507c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/annotated-types/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, typing-extensions
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "annotated-types";
+  version = "0.6.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "annotated-types";
+    repo = "annotated-types";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-SZ9/rXYcns4DFM6vk6SRKvuv3MY3T7xO9aW7WAQqtVE=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.9") [
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [ "annotated_types" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Reusable constraint types to use with typing.Annotated";
+    homepage = "https://github.com/annotated-types/annotated-types";
+    changelog = "https://github.com/annotated-types/annotated-types/releases/tag/${src.rev}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ blaggacao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/annoy/default.nix b/nixpkgs/pkgs/development/python-modules/annoy/default.nix
new file mode 100644
index 000000000000..2dc3afa56a6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/annoy/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, h5py
+, nose
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "annoy";
+  version = "1.17.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-nL/r7+Cl+EPropxr5MhNYB9PQa1N7QSG8biMOwdznBU=";
+  };
+
+  nativeBuildInputs = [
+    h5py
+  ];
+
+  nativeCheckInputs = [
+    nose
+  ];
+
+  pythonImportsCheck = [
+    "annoy"
+  ];
+
+  meta = with lib; {
+    description = "Approximate Nearest Neighbors in C++/Python optimized for memory usage and loading/saving to disk";
+    homepage = "https://github.com/spotify/annoy";
+    changelog = "https://github.com/spotify/annoy/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ timokau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/anonip/default.nix b/nixpkgs/pkgs/development/python-modules/anonip/default.nix
new file mode 100644
index 000000000000..264acc781393
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/anonip/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "anonip";
+  version = "1.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "DigitaleGesellschaft";
+    repo = "Anonip";
+    rev = "v${version}";
+    sha256 = "0cssdcridadjzichz1vv1ng7jwphqkn8ihh83hpz9mcjmxyb94qc";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --cov=anonip --cov-report=term-missing --no-cov-on-fail" ""
+  '';
+
+  pytestFlagsArray = [
+    "tests.py"
+  ];
+
+  pythonImportsCheck = [
+    "anonip"
+  ];
+
+  meta = with lib; {
+    description = "Tool to anonymize IP addresses in log files";
+    homepage = "https://github.com/DigitaleGesellschaft/Anonip";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ mmahut ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ansi/default.nix b/nixpkgs/pkgs/development/python-modules/ansi/default.nix
new file mode 100644
index 000000000000..287bf13a5dee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansi/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ansi";
+  version = "0.3.6";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "tehmaze";
+    repo = pname;
+    rev = "${pname}-${version}";
+    hash = "sha256-2gu2Dba3LOjMhbCCZrBqzlOor5KqDYThhe8OP8J3O2M=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ansi.colour"
+    "ansi.color"
+  ];
+
+  meta = with lib; {
+    description = "ANSI cursor movement and graphics";
+    homepage = "https://github.com/tehmaze/ansi/";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ansi2html/default.nix b/nixpkgs/pkgs/development/python-modules/ansi2html/default.nix
new file mode 100644
index 000000000000..192ecaf2eab4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansi2html/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, pytestCheckHook
+, setuptools
+, setuptools-scm
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "ansi2html";
+  version = "1.8.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-OLgqKYSCofomE/D5yb6z23Ko+DLurFjrLke/Ms039tU=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "update-build-requirements.patch";
+      url = "https://github.com/pycontribs/ansi2html/commit/be9c47dd39e500b2e34e95efde90d0a3b44daaee.patch";
+      hash = "sha256-nvOclsgysg+4sK694ppls0BLfq5MCJJQW3V/Ru30D/k=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  preCheck = "export PATH=$PATH:$out/bin";
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "ansi2html" ];
+
+  meta = with lib; {
+    description = "Convert text with ANSI color codes to HTML";
+    homepage = "https://github.com/ralphbean/ansi2html";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ davidtwco ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ansi2image/default.nix b/nixpkgs/pkgs/development/python-modules/ansi2image/default.nix
new file mode 100644
index 000000000000..1d66f846bacd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansi2image/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, colorama
+, fetchFromGitHub
+, pillow
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ansi2image";
+  version = "0.1.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "helviojunior";
+    repo = "ansi2image";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-1sPEEWcOzesLQXSeMsUra8ZRSMAKzH6iisOgdhpxhKM=";
+  };
+
+  propagatedBuildInputs = [
+    colorama
+    pillow
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ansi2image"
+  ];
+
+  pytestFlagsArray = [
+    "tests/tests.py"
+  ];
+
+  meta = with lib; {
+    description = "Module to convert ANSI text to an image";
+    homepage = "https://github.com/helviojunior/ansi2image";
+    changelog = "https://github.com/helviojunior/ansi2image/blob/${version}/CHANGELOG";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ansible-compat/default.nix b/nixpkgs/pkgs/development/python-modules/ansible-compat/default.nix
new file mode 100644
index 000000000000..b6c88d2df162
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansible-compat/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ansible-core
+, flaky
+, pytest-mock
+, pytestCheckHook
+, pyyaml
+, setuptools-scm
+, subprocess-tee
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ansible-compat";
+  version = "4.1.10";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-K+jHtRDS4V7tHp70QyCdZ9muyPQnAmuIk21FNf9Zhj0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    pyyaml
+    subprocess-tee
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+    export PATH=$PATH:$out/bin
+  '';
+
+  nativeCheckInputs = [
+    ansible-core
+    flaky
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # require network
+    "test_prepare_environment_with_collections"
+    "test_prerun_reqs_v1"
+    "test_prerun_reqs_v2"
+    "test_require_collection_wrong_version"
+    "test_require_collection"
+    "test_install_collection"
+    "test_install_collection_dest"
+    "test_upgrade_collection"
+    "test_require_collection_no_cache_dir"
+    "test_runtime"
+  ];
+
+  pythonImportsCheck = [
+    "ansible_compat"
+  ];
+
+  meta = with lib; {
+    description = "Function collection that help interacting with various versions of Ansible";
+    homepage = "https://github.com/ansible/ansible-compat";
+    changelog = "https://github.com/ansible/ansible-compat/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ansible-kernel/default.nix b/nixpkgs/pkgs/development/python-modules/ansible-kernel/default.nix
new file mode 100644
index 000000000000..4acdddb523d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansible-kernel/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, writeText
+, ipywidgets
+, six
+, docopt
+, tqdm
+, jupyter
+, psutil
+, pyyaml
+, ansible-runner
+, ansible
+, python
+}:
+
+let
+  kernelSpecFile = writeText "kernel.json" (builtins.toJSON {
+    argv = [ python.interpreter "-m" "ansible_kernel" "-f" "{connection_file}" ];
+    codemirror_mode = "yaml";
+    display_name = "Ansible";
+    language = "ansible";
+  });
+in
+buildPythonPackage rec {
+  pname = "ansible-kernel";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-UJjm9FpmXSznXtaIR2rVv5YJS/H83FvRkNz09vwoe0c=";
+  };
+
+  propagatedBuildInputs = [ ipywidgets six docopt tqdm jupyter psutil pyyaml ansible-runner ansible ];
+
+  postPatch = ''
+   # remove when merged
+   # https://github.com/ansible/ansible-jupyter-kernel/pull/82
+   touch LICENSE.md
+
+   # remove custom install
+   sed -i "s/cmdclass={'install': Installer},//" setup.py
+  '';
+
+  # tests hang with launched kernel
+  doCheck = false;
+
+  # install kernel manually
+  postInstall = ''
+    mkdir -p $out/share/jupyter/kernels/ansible/
+    ln -s ${kernelSpecFile} $out/share/jupyter/kernels/ansible/kernel.json
+  '';
+
+  meta = with lib; {
+    description = "An Ansible kernel for Jupyter";
+    homepage = "https://github.com/ansible/ansible-jupyter-kernel";
+    license = licenses.asl20;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ansible-pylibssh/default.nix b/nixpkgs/pkgs/development/python-modules/ansible-pylibssh/default.nix
new file mode 100644
index 000000000000..cfe8d7e1e1fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansible-pylibssh/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, libssh
+, cython
+, wheel
+, setuptools
+, setuptools-scm
+, toml
+, expandvars
+}:
+
+buildPythonPackage rec {
+  pname = "ansible-pylibssh";
+  version = "1.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-spaGux6dYvtUtpOdU6oN7SEn8IgBof2NpQSPvr+Zplg=";
+  };
+
+  # remove after https://github.com/ansible/pylibssh/pull/502 is merged
+  postPatch = ''
+    sed -i "/setuptools_scm_git_archive/d" pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    cython
+    wheel
+    setuptools
+    setuptools-scm
+    toml
+    expandvars
+  ];
+
+  propagatedBuildInputs = [
+    libssh
+  ];
+
+  pythonImportsCheck = [
+    "pylibsshext"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings to client functionality of libssh specific to Ansible use case";
+    homepage = "https://github.com/ansible/pylibssh";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ geluk ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ansible-runner/default.nix b/nixpkgs/pkgs/development/python-modules/ansible-runner/default.nix
new file mode 100644
index 000000000000..4a9ff67c3cba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansible-runner/default.nix
@@ -0,0 +1,110 @@
+{ lib
+, stdenv
+, ansible-core
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, glibcLocales
+, importlib-metadata
+, mock
+, openssh
+, pbr
+, pexpect
+, psutil
+, pytest-mock
+, pytest-timeout
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, python-daemon
+, pyyaml
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "ansible-runner";
+  version = "2.3.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-eaG9E02BPI6jdAWZxv2WGhFCXOd1fy/XJc9W1qGnI2w=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "fix-tests.patch";
+      url = "https://github.com/ansible/ansible-runner/commit/0d522c90cfc1f305e118705a1b3335ccb9c1633d.patch";
+      hash = "sha256-eTnQkftvjK0YHU+ovotRVSuVlvaVeXp5SvYk1DPCg88=";
+      excludes = [ ".github/workflows/ci.yml" "tox.ini" ];
+    })
+  ];
+
+  nativeBuildInputs = [
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    ansible-core
+    psutil
+    pexpect
+    python-daemon
+    pyyaml
+    six
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    ansible-core # required to place ansible CLI onto the PATH in tests
+    glibcLocales
+    pytestCheckHook
+    pytest-mock
+    pytest-timeout
+    pytest-xdist
+    mock
+    openssh
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+    export PATH="$PATH:$out/bin";
+    # avoid coverage flags
+    rm pytest.ini
+  '';
+
+  disabledTests = [
+    # Requires network access
+    "test_callback_plugin_task_args_leak"
+    "test_env_accuracy"
+    # Times out on slower hardware
+    "test_large_stdout_blob"
+    # Failed: DID NOT RAISE <class 'RuntimeError'>
+    "test_validate_pattern"
+  ];
+
+  disabledTestPaths = [
+    # These tests unset PATH and then run executables like `bash` (see https://github.com/ansible/ansible-runner/pull/918)
+    "test/integration/test_runner.py"
+    "test/unit/test_runner.py"
+  ]
+  ++ lib.optionals stdenv.isDarwin [
+    # Integration tests on Darwin are not regularly passing in ansible-runner's own CI
+    "test/integration"
+    # These tests write to `/tmp` which is not writable on Darwin
+    "test/unit/config/test__base.py"
+  ];
+
+  pythonImportsCheck = [
+    "ansible_runner"
+  ];
+
+  meta = with lib; {
+    description = "Helps when interfacing with Ansible";
+    homepage = "https://github.com/ansible/ansible-runner";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ansible-vault-rw/default.nix b/nixpkgs/pkgs/development/python-modules/ansible-vault-rw/default.nix
new file mode 100644
index 000000000000..b5a4c7a03631
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansible-vault-rw/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, ansible-core, ... }:
+
+buildPythonPackage rec {
+  pname = "ansible-vault-rw";
+  version = "2.1.0";
+  src = fetchPypi {
+    pname = "ansible-vault";
+    inherit version;
+    sha256 = "sha256-XOj9tUcPFEm3a/B64qvFZIDa1INWrkBchbaG77ZNvV4";
+  };
+  propagatedBuildInputs = [ ansible-core ];
+
+  # Otherwise tests will fail to create directory
+  # Permission denied: '/homeless-shelter'
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  meta = with lib; {
+    description = "This project aim to R/W an ansible-vault yaml file.";
+    homepage = "https://github.com/tomoh1r/ansible-vault";
+    changelog =
+      "https://github.com/tomoh1r/ansible-vault/blob/master/CHANGES.txt";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ StillerHarpo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ansible/core.nix b/nixpkgs/pkgs/development/python-modules/ansible/core.nix
new file mode 100644
index 000000000000..12002f4933c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansible/core.nix
@@ -0,0 +1,98 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pythonRelaxDepsHook
+, installShellFiles
+, ansible
+, cryptography
+, importlib-resources
+, jinja2
+, junit-xml
+, lxml
+, ncclient
+, packaging
+, paramiko
+, ansible-pylibssh
+, passlib
+, pexpect
+, psutil
+, pycrypto
+, pyyaml
+, requests
+, resolvelib
+, scp
+, windowsSupport ? false, pywinrm
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "ansible-core";
+  version = "2.15.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jMU5y41DSa8//ZAccHIvenogOuZCfdrJX/31RqbkFgI=";
+  };
+
+  # ansible_connection is already wrapped, so don't pass it through
+  # the python interpreter again, as it would break execution of
+  # connection plugins.
+  postPatch = ''
+    substituteInPlace lib/ansible/executor/task_executor.py \
+      --replace "[python," "["
+  '';
+
+  nativeBuildInputs = [
+    installShellFiles
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    # depend on ansible instead of the other way around
+    ansible
+    # from requirements.txt
+    cryptography
+    jinja2
+    packaging
+    passlib
+    pyyaml
+    resolvelib # This library is a PITA, since ansible requires a very old version of it
+    # optional dependencies
+    junit-xml
+    lxml
+    ncclient
+    paramiko
+    ansible-pylibssh
+    pexpect
+    psutil
+    pycrypto
+    requests
+    scp
+    xmltodict
+  ] ++ lib.optionals windowsSupport [
+    pywinrm
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    importlib-resources
+  ];
+
+  pythonRelaxDeps = lib.optionals (pythonOlder "3.10") [
+    "importlib-resources"
+  ];
+
+  postInstall = ''
+    installManPage docs/man/man1/*.1
+  '';
+
+  # internal import errors, missing dependencies
+  doCheck = false;
+
+  meta = with lib; {
+    changelog = "https://github.com/ansible/ansible/blob/v${version}/changelogs/CHANGELOG-v${lib.versions.majorMinor version}.rst";
+    description = "Radically simple IT automation";
+    homepage = "https://www.ansible.com";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ansible/default.nix b/nixpkgs/pkgs/development/python-modules/ansible/default.nix
new file mode 100644
index 000000000000..5c08a0f5bf07
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansible/default.nix
@@ -0,0 +1,88 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchPypi
+, jsonschema
+, jxmlease
+, ncclient
+, netaddr
+, paramiko
+, ansible-pylibssh
+, pynetbox
+, scp
+, textfsm
+, ttp
+, xmltodict
+
+# optionals
+, withJunos ? false
+, withNetbox ? false
+}:
+
+let
+  pname = "ansible";
+  version = "8.6.0";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lfTlkydNWdU/NvYiB1NbfScq3CcBrHoO169qbYFjemA=";
+  };
+
+  postPatch = ''
+    # we make ansible-core depend on ansible, not the other way around
+    sed -Ei '/ansible-core/d' setup.py
+  '';
+
+  propagatedBuildInputs = lib.unique ([
+    # Support ansible collections by default, make all others optional
+    # ansible.netcommon
+    jxmlease
+    ncclient
+    netaddr
+    paramiko
+    ansible-pylibssh
+    xmltodict
+    # ansible.posix
+    # ansible.utils
+    jsonschema
+    textfsm
+    ttp
+    xmltodict
+    # ansible.windows
+
+    # lots of collections with dedicated requirements.txt and pyproject.toml files,
+    # add the dependencies for the collections you need conditionally and install
+    # ansible using overrides to enable the collections you need.
+  ] ++ lib.optionals (withJunos) [
+    # ansible_collections/junipernetworks/junos/requirements.txt
+    jxmlease
+    ncclient
+    paramiko
+    ansible-pylibssh
+    scp
+    xmltodict
+  ] ++ lib.optionals (withNetbox) [
+    # ansible_collections/netbox/netbox/pyproject.toml
+    pynetbox
+  ]);
+
+  # don't try and fail to strip 48000+ non strippable files, it takes >5 minutes!
+  dontStrip = true;
+
+  # difficult to test
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Radically simple IT automation";
+    homepage = "https://www.ansible.com";
+    changelog = "https://github.com/ansible-community/ansible-build-data/blob/${version}/${lib.versions.major version}/CHANGELOG-v${lib.versions.major version}.rst";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ansicolor/default.nix b/nixpkgs/pkgs/development/python-modules/ansicolor/default.nix
new file mode 100644
index 000000000000..07a8190727bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansicolor/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "ansicolor";
+  version = "0.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3b840a6b1184b5f1568635b1adab28147947522707d41ceba02d5ed0a0877279";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/numerodix/ansicolor/";
+    description = "A library to produce ansi color output and colored highlighting and diffing";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ andsild ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ansicolors/default.nix b/nixpkgs/pkgs/development/python-modules/ansicolors/default.nix
new file mode 100644
index 000000000000..3f2d549694e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansicolors/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, pytest }:
+
+buildPythonPackage rec {
+  pname = "ansicolors";
+  version = "1.1.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "99f94f5e3348a0bcd43c82e5fc4414013ccc19d70bd939ad71e0133ce9c372e0";
+  };
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/verigak/colors/";
+    description = "ANSI colors for Python";
+    license = licenses.isc;
+    maintainers = with maintainers; [ copumpkin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ansiconv/default.nix b/nixpkgs/pkgs/development/python-modules/ansiconv/default.nix
new file mode 100644
index 000000000000..b0676258e107
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansiconv/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytest }:
+
+buildPythonPackage rec {
+  pname = "ansiconv";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "ansible";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0ljfpl8x069arzginvpi1v6hlaq4x2qpjqj01qds2ylz33scq8r4";
+  };
+
+  nativeCheckInputs = [ pytest ];
+
+  meta = with lib; {
+    description = "A module for converting ANSI coded text and converts it to either plain text or HTML";
+    homepage = "https://github.com/ansible/ansiconv";
+    license = licenses.mit;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ansimarkup/default.nix b/nixpkgs/pkgs/development/python-modules/ansimarkup/default.nix
new file mode 100644
index 000000000000..d249dddd1e3d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansimarkup/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, colorama
+}:
+
+buildPythonPackage rec {
+  pname = "ansimarkup";
+  version = "1.5.0";
+
+  src = fetchFromGitHub {
+    owner = "gvalkov";
+    repo = "python-ansimarkup";
+    rev = "v${version}";
+    hash = "sha256-HGeVapv2Z5GtPwSp3+dvUwAH0bFqu+Bmk5E6SRr7NO4=";
+  };
+
+  propagatedBuildInputs = [ colorama ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "ansimarkup" ];
+
+  meta = with lib; {
+    description = "An XML-like markup for producing colored terminal text.";
+    homepage = "https://github.com/gvalkov/python-ansimarkup";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ansiwrap/default.nix b/nixpkgs/pkgs/development/python-modules/ansiwrap/default.nix
new file mode 100644
index 000000000000..7e55912bed20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ansiwrap/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, ansicolors
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, textwrap3
+}:
+
+buildPythonPackage rec {
+  pname = "ansiwrap";
+  version = "0.8.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "ca0c740734cde59bf919f8ff2c386f74f9a369818cdc60efe94893d01ea8d9b7";
+  };
+
+  postPatch = ''
+    # https://github.com/jonathaneunice/ansiwrap/issues/18
+    substituteInPlace test/test_ansiwrap.py \
+      --replace "set(range(20, 120)).difference(LINE_LENGTHS)" "sorted(set(range(20, 120)).difference(LINE_LENGTHS))" \
+      --replace "set(range(120, 400)).difference(LINE_LENGTHS)" "sorted(set(range(120, 400)).difference(LINE_LENGTHS))"
+  '';
+
+  checkInputs = [
+    ansicolors
+    pytestCheckHook
+  ];
+
+  propagatedBuildInputs = [
+    textwrap3
+  ];
+
+  pythonImportsCheck = [
+    "ansiwrap"
+  ];
+
+  meta = with lib; {
+    description = "Textwrap, but savvy to ANSI colors and styles";
+    homepage = "https://github.com/jonathaneunice/ansiwrap";
+    changelog = "https://github.com/jonathaneunice/ansiwrap/blob/master/CHANGES.yml";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/anthemav/default.nix b/nixpkgs/pkgs/development/python-modules/anthemav/default.nix
new file mode 100644
index 000000000000..965d399d573c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/anthemav/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "anthemav";
+  version = "1.4.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nugget";
+    repo = "python-anthemav";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ZjAt4oODx09Qij0PwBvLCplSjwdBx2fReiwjmKhdPa0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "anthemav"
+  ];
+
+  meta = with lib; {
+    description = "Python asyncio module to interface with Anthem AVM and MRX receivers";
+    homepage = "https://github.com/nugget/python-anthemav";
+    changelog = "https://github.com/nugget/python-anthemav/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/anthropic/default.nix b/nixpkgs/pkgs/development/python-modules/anthropic/default.nix
new file mode 100644
index 000000000000..228342f97082
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/anthropic/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, anyio
+, distro
+, dirty-equals
+, httpx
+, pydantic
+, pytest-asyncio
+, respx
+, tokenizers
+, typing-extensions
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "anthropic";
+  version = "0.7.4";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "anthropics";
+    repo = "anthropic-sdk-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-iLHzoWgAMDZ0AJGVXw2Xnaby07FbhJqNGfW5bPNgfws=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    anyio
+    distro
+    httpx
+    pydantic
+    tokenizers
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    dirty-equals
+    pytest-asyncio
+    pytestCheckHook
+    respx
+  ];
+
+  disabledTests = [
+    "api_resources"
+  ];
+
+  pythonImportsCheck = [
+    "anthropic"
+  ];
+
+  meta = with lib; {
+    description = "Anthropic's safety-first language model APIs";
+    homepage = "https://github.com/anthropics/anthropic-sdk-python";
+    changelog = "https://github.com/anthropics/anthropic-sdk-python/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/antlr4-python3-runtime/default.nix b/nixpkgs/pkgs/development/python-modules/antlr4-python3-runtime/default.nix
new file mode 100644
index 000000000000..20daf71c8cda
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/antlr4-python3-runtime/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, setuptools
+, python
+, antlr4
+}:
+
+buildPythonPackage rec {
+  pname = "antlr4-python3-runtime";
+  inherit (antlr4.runtime.cpp) version src;
+
+  format = "pyproject";
+
+  disabled = python.pythonOlder "3.6";
+
+  sourceRoot = "${src.name}/runtime/Python3";
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  # We use an asterisk because this expression is used also for old antlr
+  # versions, where there the tests directory is `test` and not `tests`.
+  # See e.g in package `baserow`.
+  checkPhase = ''
+    cd test*
+    ${python.interpreter} run.py
+  '';
+
+  meta = with lib; {
+    description = "Runtime for ANTLR";
+    homepage = "https://www.antlr.org/";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/anyascii/default.nix b/nixpkgs/pkgs/development/python-modules/anyascii/default.nix
new file mode 100644
index 000000000000..d781a552cca1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/anyascii/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "anyascii";
+  version = "0.3.2";
+  format = "setuptools";
+  disabled = pythonOlder "3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-nV0y74RP4iW4vHy6f5UFNPrk2iepvzpr6iyw6kbORzA=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/anyascii/anyascii/blob/${version}/CHANGELOG.md";
+    description = "Unicode to ASCII transliteration";
+    homepage = "https://github.com/anyascii/anyascii";
+    license = licenses.isc;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/anybadge/default.nix b/nixpkgs/pkgs/development/python-modules/anybadge/default.nix
new file mode 100644
index 000000000000..0418de37a251
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/anybadge/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, packaging
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "anybadge";
+  version = "1.14.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jongracecox";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+CkkFCShCYtxKiCWRQcgTFcekc/g7ujQj9MdnG1+a0A=";
+  };
+
+  # setup.py reads its version from the TRAVIS_TAG environment variable
+  TRAVIS_TAG = "v${version}";
+
+  propagatedBuildInputs = [
+    packaging
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests
+  ];
+
+  disabledTests = [
+    # Comparison of CLI output fails
+    "test_module_same_output_as_main_cli"
+  ];
+
+  disabledTestPaths = [
+    # No anybadge-server
+    "tests/test_server.py"
+  ];
+
+  pythonImportsCheck = [
+    "anybadge"
+  ];
+
+  meta = with lib; {
+    description = "Python tool for generating badges for your projects";
+    homepage = "https://github.com/jongracecox/anybadge";
+    changelog = "https://github.com/jongracecox/anybadge/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fabiangd ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/anyconfig/default.nix b/nixpkgs/pkgs/development/python-modules/anyconfig/default.nix
new file mode 100644
index 000000000000..7f1855ad6c5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/anyconfig/default.nix
@@ -0,0 +1,48 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "anyconfig";
+  version = "0.13.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-A/8uF2KvOI+7vtHBq3+fHsAGqR2n2zpouWPabneV0qw=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=src -vv" ""
+  '';
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # OSError: /build/anyconfig-0.12.0/tests/res/cli/no_template/10/e/10.* should exists but not
+    "test_runs_for_datasets"
+  ];
+
+  disabledTestPaths = [
+    # NameError: name 'TT' is not defined
+    "tests/schema/test_jsonschema.py"
+  ];
+
+  pythonImportsCheck = [ "anyconfig" ];
+
+  meta = with lib; {
+    description = "Python library provides common APIs to load and dump configuration files in various formats";
+    homepage = "https://github.com/ssato/python-anyconfig";
+    license = licenses.mit;
+    maintainers = with maintainers; [ tboerger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/anyio/default.nix b/nixpkgs/pkgs/development/python-modules/anyio/default.nix
new file mode 100644
index 000000000000..06112cccdc3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/anyio/default.nix
@@ -0,0 +1,112 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build-system
+, setuptools
+, setuptools-scm
+
+# dependencies
+, exceptiongroup
+, idna
+, sniffio
+
+# optionals
+, trio
+
+# tests
+, hypothesis
+, psutil
+, pytest-mock
+, pytest-xdist
+, pytestCheckHook
+, trustme
+, uvloop
+}:
+
+buildPythonPackage rec {
+  pname = "anyio";
+  version = "4.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "agronholm";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-gUFd2gHWIElYfzOvg7Yx7iJyhU6+iAcJpHTVsJtxTsk=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    idna
+    sniffio
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    exceptiongroup
+  ];
+
+  passthru.optional-dependencies = {
+    trio = [
+      trio
+    ];
+  };
+
+  # trustme uses pyopenssl
+  doCheck = !(stdenv.isDarwin && stdenv.isAarch64);
+
+  nativeCheckInputs = [
+    hypothesis
+    psutil
+    pytest-mock
+    pytest-xdist
+    pytestCheckHook
+    trustme
+  ] ++ lib.optionals (pythonOlder "3.12") [
+    uvloop
+  ] ++ passthru.optional-dependencies.trio;
+
+  pytestFlagsArray = [
+    "-W" "ignore::trio.TrioDeprecationWarning"
+    "-m" "'not network'"
+  ];
+
+  disabledTests = [
+    # INTERNALERROR> AttributeError: 'NonBaseMultiError' object has no attribute '_exceptions'. Did you mean: 'exceptions'?
+    "test_exception_group_children"
+    "test_exception_group_host"
+    "test_exception_group_filtering"
+    # timing sensitive
+    # assert threading.active_count() == initial_count + 1
+    # assert 4 == (4 + 1)
+    "test_run_sync_from_thread_pooling"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # PermissionError: [Errno 1] Operation not permitted: '/dev/console'
+    "test_is_block_device"
+  ];
+
+  disabledTestPaths = [
+    # lots of DNS lookups
+    "tests/test_sockets.py"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [ "anyio" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/agronholm/anyio/blob/${src.rev}/docs/versionhistory.rst";
+    description = "High level compatibility layer for multiple asynchronous event loop implementations on Python";
+    homepage = "https://github.com/agronholm/anyio";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/anyqt/default.nix b/nixpkgs/pkgs/development/python-modules/anyqt/default.nix
new file mode 100644
index 000000000000..a4fbb041822a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/anyqt/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyqt5
+, pytestCheckHook
+, nix-update-script
+}:
+
+buildPythonPackage rec {
+  pname = "anyqt";
+  version = "0.2.0";
+
+  src = fetchFromGitHub {
+    owner = "ales-erjavec";
+    repo = "anyqt";
+    rev = version;
+    hash = "sha256-dL2EUAMzWKq/oN3rXiEC6emDJddmg4KclT5ONKA0jfk=";
+  };
+
+  nativeCheckInputs = [ pyqt5 pytestCheckHook ];
+
+  # All of these fail because Qt modules cannot be imported
+  disabledTestPaths = [
+    "tests/test_qabstractitemview.py"
+    "tests/test_qaction_set_menu.py"
+    "tests/test_qactionevent_action.py"
+    "tests/test_qfontdatabase_static.py"
+    "tests/test_qpainter_draw_pixmap_fragments.py"
+    "tests/test_qsettings.py"
+    "tests/test_qstandarditem_insertrow.py"
+    "tests/test_qtest.py"
+  ];
+
+  pythonImportsCheck = [ "AnyQt" ];
+
+  passthru.updateScript = nix-update-script { };
+
+  meta = {
+    description = "PyQt/PySide compatibility layer";
+    homepage = "https://github.com/ales-erjavec/anyqt";
+    license = [ lib.licenses.gpl3Only ];
+    maintainers = [ lib.maintainers.lucasew ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/anytree/default.nix b/nixpkgs/pkgs/development/python-modules/anytree/default.nix
new file mode 100644
index 000000000000..8e55337e4100
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/anytree/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fontconfig
+, graphviz
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, six
+, substituteAll
+, withGraphviz ? true
+}:
+
+buildPythonPackage rec {
+  pname = "anytree";
+  version = "2.12.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "c0fec0de";
+    repo = "anytree";
+    rev = "refs/tags/${version}";
+    hash = "sha256-8mV9Lf6NLPUDVurXCxG+tqe7+3TrIn2H+7tHa6BpTzk=";
+  };
+
+  patches = lib.optionals withGraphviz [
+    (substituteAll {
+      src = ./graphviz.patch;
+      inherit graphviz;
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Tests print “Fontconfig error: Cannot load default config file”
+  preCheck = lib.optionalString withGraphviz ''
+    export FONTCONFIG_FILE=${fontconfig.out}/etc/fonts/fonts.conf
+  '';
+
+  # Circular dependency anytree → graphviz → pango → glib → gtk-doc → anytree
+  doCheck = withGraphviz;
+
+  pythonImportsCheck = [
+    "anytree"
+  ];
+
+  meta = with lib; {
+    description = "Powerful and Lightweight Python Tree Data Structure";
+    homepage = "https://github.com/c0fec0de/anytree";
+    changelog = "https://github.com/c0fec0de/anytree/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maitnainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/anytree/graphviz.patch b/nixpkgs/pkgs/development/python-modules/anytree/graphviz.patch
new file mode 100644
index 000000000000..583b60444e35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/anytree/graphviz.patch
@@ -0,0 +1,13 @@
+diff --git a/anytree/exporter/dotexporter.py b/anytree/exporter/dotexporter.py
+index 9c10a68..209a952 100644
+--- a/anytree/exporter/dotexporter.py
++++ b/anytree/exporter/dotexporter.py
+@@ -228,7 +228,7 @@ class DotExporter(object):
+             for line in self:
+                 dotfile.write(("%s\n" % line).encode("utf-8"))
+             dotfile.flush()
+-            cmd = ["dot", dotfilename, "-T", fileformat, "-o", filename]
++            cmd = ["@graphviz@/bin/dot", dotfilename, "-T", fileformat, "-o", filename]
+             check_call(cmd)
+         try:
+             remove(dotfilename)
diff --git a/nixpkgs/pkgs/development/python-modules/anywidget/default.nix b/nixpkgs/pkgs/development/python-modules/anywidget/default.nix
new file mode 100644
index 000000000000..25aa92449105
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/anywidget/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, hatch-jupyter-builder
+, hatchling
+, importlib-metadata
+, ipywidgets
+, psygnal
+, typing-extensions
+, watchfiles
+}:
+
+buildPythonPackage rec {
+  pname = "anywidget";
+  version = "0.7.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-HEy1EGP47FFyuMjvsb+3mGHTQMNJEiDVa4wqaqjbOz0=";
+  };
+
+  # We do not need the jupyterlab build dependency, because we do not need to
+  # build any JS components; these are present already in the PyPI artifact.
+  #
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"jupyterlab==3.*"' ""
+  '';
+
+  nativeBuildInputs = [
+    hatch-jupyter-builder
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    ipywidgets
+    psygnal
+    typing-extensions
+  ] ++ lib.optional (pythonOlder "3.8") importlib-metadata;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    watchfiles
+  ];
+
+  pythonImportsCheck = [ "anywidget" ];
+
+  meta = with lib; {
+    description = "Custom jupyter widgets made easy";
+    homepage = "https://github.com/manzt/anywidget";
+    changelog = "https://github.com/manzt/anywidget/releases/tag/anywidget%40${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aocd/default.nix b/nixpkgs/pkgs/development/python-modules/aocd/default.nix
new file mode 100644
index 000000000000..f1a31ee243b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aocd/default.nix
@@ -0,0 +1,114 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, pytestCheckHook
+, tzlocal
+, pytest-mock
+, pytest-freezegun
+, pytest-raisin
+, pytest-socket
+, requests-mock
+, pook
+, numpy
+, rich
+, pebble
+, python-dateutil
+, termcolor
+, beautifulsoup4
+, setuptools
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aocd";
+  version = "2.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "wimglenn";
+    repo = "advent-of-code-data";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-YZvcR97uHceloqwoP+azaBmj3GLusYNbItLIaeJ3QD0=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    requests
+    termcolor
+    beautifulsoup4
+    pebble
+    tzlocal
+    setuptools
+    rich # for example parser aoce. must either be here or checkInputs
+  ];
+
+  # Too many failing tests
+  preCheck = "rm pytest.ini";
+
+  disabledTests = [
+    "test_results"
+    "test_results_xmas"
+    "test_run_error"
+    "test_run_and_autosubmit"
+    "test_run_and_no_autosubmit"
+    "test_load_input_from_file"
+    "test_examples_cache" # IndexError: list index out of range
+    "test_example_partial" # ValueError: not enough values to unpack (expected 1, got 0)
+    "test_run_against_examples" # AssertionError: assert '2022/25 - The Puzzle Title' in ''
+    "test_aocd_no_examples" # SystemExit: 2
+    "test_aocd_examples" # SystemExit: 2
+    "test_aoce" # SystemExit: 1
+
+    # TypeError: sequence item 0: expected str instance, bool found
+    # Likely because they use `pook.get` to get a webpage
+    "test_submit_prevents_bad_guesses_too_high"
+    "test_submit_prevents_bad_guesses_too_low"
+    "test_submit_prevents_bad_guesses_known_incorrect"
+    "test_submit_correct_answer"
+    "test_correct_submit_reopens_browser_on_answer_page"
+    "test_server_error"
+    "test_submit_when_already_solved"
+    "test_submitted_too_recently_autoretry"
+    "test_submitted_too_recently_autoretry_quiet"
+    "test_submit_when_submitted_too_recently_no_autoretry"
+    "test_submit_wrong_answer "
+    "test_correct_submit_records_good_answer"
+    "test_submits_for_partb_when_already_submitted_parta"
+    "test_submit_when_parta_solved_but_answer_unsaved"
+    "test_submit_saves_both_answers_if_possible"
+    "test_submit_puts_level1_by_default"
+    "test_cannot_submit_same_bad_answer_twice"
+    "test_submit_float_warns"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+    pytest-freezegun
+    pytest-raisin
+    pytest-socket
+  ];
+
+  checkInputs = [
+    pook
+    numpy
+    requests-mock
+  ];
+
+  pythonImportsCheck = [
+    "aocd"
+  ];
+
+  meta = with lib; {
+    description = "Get your Advent of Code data with a single import statement";
+    homepage = "https://github.com/wimglenn/advent-of-code-data";
+    changelog = "https://github.com/wimglenn/advent-of-code-data/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ aadibajpai ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/apache-beam/default.nix b/nixpkgs/pkgs/development/python-modules/apache-beam/default.nix
new file mode 100644
index 000000000000..d0e36a989b94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apache-beam/default.nix
@@ -0,0 +1,215 @@
+{ buildPythonPackage
+, cloudpickle
+, crcmod
+, cython
+, dill
+, fastavro
+, fasteners
+, fetchFromGitHub
+, fetchpatch
+, freezegun
+, grpcio
+, grpcio-tools
+, hdfs
+, httplib2
+, hypothesis
+, lib
+, mock
+, mypy-protobuf
+, numpy
+, objsize
+, orjson
+, pandas
+, parameterized
+, proto-plus
+, protobuf
+, psycopg2
+, pyarrow
+, pydot
+, pyhamcrest
+, pymongo
+, pytest-xdist
+, pytestCheckHook
+, python
+, python-dateutil
+, pythonRelaxDepsHook
+, pytz
+, pyyaml
+, regex
+, requests
+, requests-mock
+, scikit-learn
+, sqlalchemy
+, tenacity
+, testcontainers
+, typing-extensions
+, zstandard
+}:
+
+buildPythonPackage rec {
+  pname = "apache-beam";
+  version = "2.50.0";
+
+  src = fetchFromGitHub {
+    owner = "apache";
+    repo = "beam";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-qaxYWPVdMlegvH/W66UBoQbcQ5Ac/3DNoQs8xo+KfLc=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # https://github.com/apache/beam/pull/24143
+      name = "fix-for-dill-0.3.6.patch";
+      url = "https://github.com/apache/beam/commit/7e014435b816015d21cc07f3f6c80809f3d8023d.patch";
+      hash = "sha256-iUmnzrItTFM98w3mpadzrmtI3t0fucpSujAg/6qxCGk=";
+      stripLen = 2;
+    })
+  ];
+
+  pythonRelaxDeps = [
+    # See https://github.com/NixOS/nixpkgs/issues/156957
+    "dill"
+    "numpy"
+    "pymongo"
+
+    # See https://github.com/NixOS/nixpkgs/issues/193613
+    "protobuf"
+
+    # As of apache-beam v2.45.0, the requirement is httplib2>=0.8,<0.21.0, but
+    # the current (2023-02-08) nixpkgs's httplib2 version is 0.21.0. This can be
+    # removed once beam is upgraded since the current requirement on master is
+    # for httplib2>=0.8,<0.22.0.
+    "httplib2"
+
+    # As of apache-beam v2.45.0, the requirement is pyarrow<10.0.0,>=0.15.1, but
+    # the current (2023-02-22) nixpkgs's pyarrow version is 11.0.0.
+    "pyarrow"
+  ];
+
+  sourceRoot = "${src.name}/sdks/python";
+
+  nativeBuildInputs = [
+    cython
+    grpcio-tools
+    mypy-protobuf
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    cloudpickle
+    crcmod
+    dill
+    fastavro
+    fasteners
+    grpcio
+    hdfs
+    httplib2
+    numpy
+    objsize
+    orjson
+    proto-plus
+    protobuf
+    pyarrow
+    pydot
+    pymongo
+    python-dateutil
+    pytz
+    regex
+    requests
+    typing-extensions
+    zstandard
+  ];
+
+  enableParallelBuilding = true;
+
+  pythonImportsCheck = [
+    "apache_beam"
+  ];
+
+  checkInputs = [
+    freezegun
+    hypothesis
+    mock
+    pandas
+    parameterized
+    psycopg2
+    pyhamcrest
+    pytestCheckHook
+    pytest-xdist
+    pyyaml
+    requests-mock
+    scikit-learn
+    sqlalchemy
+    tenacity
+    testcontainers
+  ];
+
+  # Make sure we're running the tests for the actually installed
+  # package, so that cython's .so files are available.
+  preCheck = "cd $out/lib/${python.libPrefix}/site-packages";
+
+  disabledTestPaths = [
+    # Fails with
+    #     _______ ERROR collecting apache_beam/io/external/xlang_jdbcio_it_test.py _______
+    #     apache_beam/io/external/xlang_jdbcio_it_test.py:80: in <module>
+    #         class CrossLanguageJdbcIOTest(unittest.TestCase):
+    #     apache_beam/io/external/xlang_jdbcio_it_test.py:99: in CrossLanguageJdbcIOTest
+    #         container_init: Callable[[], Union[PostgresContainer, MySqlContainer]],
+    #     E   NameError: name 'MySqlContainer' is not defined
+    #
+    "apache_beam/io/external/xlang_jdbcio_it_test.py"
+
+    # These tests depend on the availability of specific servers backends.
+    "apache_beam/runners/portability/flink_runner_test.py"
+    "apache_beam/runners/portability/samza_runner_test.py"
+    "apache_beam/runners/portability/spark_runner_test.py"
+
+    # Fails starting from dill 0.3.6 because it tries to pickle pytest globals:
+    # https://github.com/uqfoundation/dill/issues/482#issuecomment-1139017499.
+    "apache_beam/transforms/window_test.py"
+
+    # See https://github.com/apache/beam/issues/25390.
+    "apache_beam/coders/slow_coders_test.py"
+    "apache_beam/dataframe/pandas_doctests_test.py"
+    "apache_beam/typehints/typed_pipeline_test.py"
+    "apache_beam/coders/fast_coders_test.py"
+    "apache_beam/dataframe/schemas_test.py"
+  ];
+
+  disabledTests = [
+    # The reasons of failures for these tests are unclear.
+    # They reproduce in Docker with Ubuntu 22.04
+    # (= they're not `nixpkgs`-specific) but given the upstream uses
+    # quite elaborate testing infra with containers and multiple
+    # different runners - I don't expect them to help debugging these
+    # when running via our (= custom from their PoV) testing infra.
+    "test_with_main_session"
+    # AssertionErrors
+    "test_unified_repr"
+    "testDictComprehension"
+    "testDictComprehensionSimple"
+    "testGenerator"
+    "testGeneratorComprehension"
+    "testListComprehension"
+    "testNoneReturn"
+    "testSet"
+    "testTupleListComprehension"
+    "test_newtype"
+    "test_pardo_type_inference"
+    "test_get_output_batch_type"
+    "test_pformat_namedtuple_with_unnamed_fields"
+    "test_row_coder_fail_early_bad_schema"
+    # See https://github.com/apache/beam/issues/26004.
+    "test_batch_encode_decode"
+  ];
+
+  meta = with lib; {
+    description = "Unified model for defining both batch and streaming data-parallel processing pipelines";
+    homepage = "https://beam.apache.org/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ndl ];
+    # https://github.com/apache/beam/issues/27221
+    broken = lib.versionAtLeast pandas.version "2";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/apcaccess/default.nix b/nixpkgs/pkgs/development/python-modules/apcaccess/default.nix
new file mode 100644
index 000000000000..fd4627b558de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apcaccess/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "apcaccess";
+  version = "0.0.13";
+
+  src = fetchFromGitHub {
+    owner = "flyte";
+    repo = "apcaccess";
+    rev = version;
+    hash = "sha256-XLoNRh6MgXCfRtWD9NpVZSyroW6E9nRYw6Grxa+AQkc=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "setup_requires='pytest-runner'," ""
+  '';
+
+  pythonImportsCheck = [
+    "apcaccess"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Library offers programmatic access to the status information provided by apcupsd over its Network Information Server";
+    homepage = "https://github.com/flyte/apcaccess";
+    license = licenses.mit;
+    maintainers = with maintainers; [ uvnikita ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/apipkg/default.nix b/nixpkgs/pkgs/development/python-modules/apipkg/default.nix
new file mode 100644
index 000000000000..0edddd68be32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apipkg/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatch-vcs
+, hatchling
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "apipkg";
+  version = "3.0.2";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pytest-dev";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ANLD7fUMKN3RmAVjVkcpwUH6U9ASalXdwKtPpoC8Urs=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "test_apipkg.py"
+  ];
+
+  pythonImportsCheck = [
+    "apipkg"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/pytest-dev/apipkg/blob/main/CHANGELOG";
+    description = "Namespace control and lazy-import mechanism";
+    homepage = "https://github.com/pytest-dev/apipkg";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/apischema/default.nix b/nixpkgs/pkgs/development/python-modules/apischema/default.nix
new file mode 100644
index 000000000000..eb385ccaf90e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apischema/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, graphql-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "apischema";
+  version = "0.18.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "wyfo";
+    repo = "apischema";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-omw6znk09r2SigPfaVrtA6dd8KeSfjaPgGfK12ty23g=";
+  };
+
+  passthru.optional-dependencies = {
+    graphql = [
+      graphql-core
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "apischema"
+  ];
+
+  meta = with lib; {
+    description = "JSON (de)serialization, GraphQL and JSON schema generation using typing";
+    homepage = "https://github.com/wyfo/apischema";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/apispec-webframeworks/default.nix b/nixpkgs/pkgs/development/python-modules/apispec-webframeworks/default.nix
new file mode 100644
index 000000000000..3211eed5aa3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apispec-webframeworks/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, apispec
+, bottle
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, mock
+, pytestCheckHook
+, pythonOlder
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "apispec-webframeworks";
+  version = "0.5.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "marshmallow-code";
+    repo = "apispec-webframeworks";
+    rev = version;
+    hash = "sha256-ByNmmBLO99njw9JrT+cCW/K4NJBH92smAiIgg47Cvkk=";
+  };
+
+  propagatedBuildInputs = [
+    apispec
+  ] ++ apispec.optional-dependencies.yaml;
+
+  nativeCheckInputs = [
+    bottle
+    flask
+    mock
+    pytestCheckHook
+    tornado
+  ];
+
+  pythonImportsCheck = [
+    "apispec_webframeworks"
+  ];
+
+  meta = with lib; {
+    description = "Web framework plugins for apispec";
+    homepage = "https://github.com/marshmallow-code/apispec-webframeworks";
+    changelog = "https://github.com/marshmallow-code/apispec-webframeworks/blob/${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/apispec/default.nix b/nixpkgs/pkgs/development/python-modules/apispec/default.nix
new file mode 100644
index 000000000000..dab433e1619f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apispec/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, marshmallow
+, mock
+, openapi-spec-validator
+, packaging
+, prance
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "apispec";
+  version = "6.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bLCNks5z/ws79Gyy6lwA1XKJsPJ5+wJWo99GgYK6U0Q=";
+  };
+
+  propagatedBuildInputs = [
+    packaging
+  ];
+
+  passthru.optional-dependencies = {
+    marshmallow = [
+      marshmallow
+    ];
+    yaml = [
+      pyyaml
+    ];
+    validation = [
+      openapi-spec-validator
+      prance
+    ] ++ prance.optional-dependencies.osv;
+  };
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "apispec"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/marshmallow-code/apispec/blob/${version}/CHANGELOG.rst";
+    description = "A pluggable API specification generator with support for the OpenAPI Specification";
+    homepage = "https://github.com/marshmallow-code/apispec";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/apkit/default.nix b/nixpkgs/pkgs/development/python-modules/apkit/default.nix
new file mode 100644
index 000000000000..7e2c45ca8bc7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apkit/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, scipy
+}:
+
+buildPythonPackage {
+  pname = "apkit";
+  version = "unstable-2022-08-23";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "hwp";
+    repo = "apkit";
+    rev = "40561738c3f585c590c3f0584bf2e3354eefbd48";
+    hash = "sha256-/pwoEKB6BD+wWy7QwPwwzSxGn+TAOaMzduOXyuoXC8g=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+  ];
+
+  pythonImportsCheck = [ "apkit" ];
+
+  # This package has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Audio processing toolkit";
+    homepage = "https://github.com/hwp/apkit";
+    license = licenses.mit;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aplpy/default.nix b/nixpkgs/pkgs/development/python-modules/aplpy/default.nix
new file mode 100644
index 000000000000..0304a8eff852
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aplpy/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, astropy
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, matplotlib
+, numpy
+, pillow
+, pyavm
+, pyregion
+, pytest-astropy
+, pytestCheckHook
+, pythonOlder
+, reproject
+, scikit-image
+, setuptools
+, setuptools-scm
+, shapely
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "aplpy";
+  version = "2.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "aplpy";
+    inherit version;
+    hash = "sha256-KCdmBwQWt7IfHsjq7pWlbSISEpfQZDyt+SQSTDaUCV4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    astropy
+    matplotlib
+    numpy
+    pillow
+    pyavm
+    pyregion
+    reproject
+    scikit-image
+    shapely
+  ];
+
+  nativeCheckInputs = [
+    pytest-astropy
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    OPENMP_EXPECTED=0
+  '';
+
+  pythonImportsCheck = [
+    "aplpy"
+  ];
+
+  meta = with lib; {
+    description = "The Astronomical Plotting Library in Python";
+    homepage = "http://aplpy.github.io";
+    license = licenses.mit;
+    maintainers = with maintainers; [ smaret ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/app-model/default.nix b/nixpkgs/pkgs/development/python-modules/app-model/default.nix
new file mode 100644
index 000000000000..1371cc72de3b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/app-model/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, in-n-out
+, psygnal
+, pydantic
+, pytestCheckHook
+, pythonOlder
+, typing-extensions
+, hatch-vcs
+, hatchling
+}:
+
+buildPythonPackage rec {
+  pname = "app-model";
+  version = "0.2.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pyapp-kit";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-vo10BHUzvYlldAqTw/1LxgvSXgTM3LAls9jQIeB5LcU=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    psygnal
+    pydantic
+    in-n-out
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "app_model"
+  ];
+
+  meta = with lib; {
+    description = "Module to implement generic application schema";
+    homepage = "https://github.com/pyapp-kit/app-model";
+    changelog = "https://github.com/pyapp-kit/app-model/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/appdirs/default.nix b/nixpkgs/pkgs/development/python-modules/appdirs/default.nix
new file mode 100644
index 000000000000..22fa3dc98fb0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/appdirs/default.nix
@@ -0,0 +1,20 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "appdirs";
+  version = "1.4.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41";
+  };
+
+  meta = {
+    description = "A python module for determining appropriate platform-specific dirs";
+    homepage = "https://github.com/ActiveState/appdirs";
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/apple-weatherkit/default.nix b/nixpkgs/pkgs/development/python-modules/apple-weatherkit/default.nix
new file mode 100644
index 000000000000..89363e859bd0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apple-weatherkit/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, aiohttp
+, pythonOlder
+, pyjwt
+}:
+
+buildPythonPackage rec {
+  pname = "apple-weatherkit";
+  version = "1.0.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "tjhorner";
+    repo = "python-weatherkit";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-G/0hyK2rjdSSnVnvAUGyDvsfNMHVgAD7NHfNFmdBCNA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pyjwt
+  ] ++ pyjwt.optional-dependencies.crypto;
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "apple_weatherkit"
+  ];
+
+  meta = with lib; {
+    description = "Python library for Apple WeatherKit";
+    homepage = "https://github.com/tjhorner/python-weatherkit";
+    changelog = "https://github.com/tjhorner/python-weatherkit/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/applicationinsights/default.nix b/nixpkgs/pkgs/development/python-modules/applicationinsights/default.nix
new file mode 100644
index 000000000000..7576bcbdf1dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/applicationinsights/default.nix
@@ -0,0 +1,24 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, portalocker
+}:
+
+buildPythonPackage rec {
+  version = "0.11.10";
+  pname = "applicationinsights";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0b761f3ef0680acf4731906dfc1807faa6f2a57168ae74592db0084a6099f7b3";
+  };
+
+  propagatedBuildInputs = [ portalocker ];
+
+  meta = with lib; {
+    description = "This project extends the Application Insights API surface to support Python";
+    homepage = "https://github.com/Microsoft/ApplicationInsights-Python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/appnope/default.nix b/nixpkgs/pkgs/development/python-modules/appnope/default.nix
new file mode 100644
index 000000000000..68ada3b4b4cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/appnope/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "appnope";
+  version = "0.1.3";
+
+  src = fetchFromGitHub {
+    owner = "minrk";
+    repo = "appnope";
+    rev = version;
+    hash = "sha256-JYzNOPD1ofOrtZK5TTKxbF1ausmczsltR7F1Vwss8Sw=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  meta = {
+    description = "Disable App Nap on macOS";
+    homepage = "https://github.com/minrk/appnope";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ OPNA2608 ];
+    # Not Darwin-specific because dummy fallback may be used cross-platform
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/apprise/default.nix b/nixpkgs/pkgs/development/python-modules/apprise/default.nix
new file mode 100644
index 000000000000..486b7fd6c25c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apprise/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, babel
+, buildPythonPackage
+, click
+, cryptography
+, fetchPypi
+, gntp
+, installShellFiles
+, markdown
+, paho-mqtt
+, pytest-mock
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, requests
+, requests-oauthlib
+}:
+
+buildPythonPackage rec {
+  pname = "apprise";
+  version = "1.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Pu+rHF15eLDmXFCR0c2+kgaGXcPLXRnKXPvdt26Kr/4=";
+  };
+
+  nativeBuildInputs = [
+    installShellFiles
+  ];
+
+  propagatedBuildInputs = [
+    click
+    cryptography
+    markdown
+    pyyaml
+    requests
+    requests-oauthlib
+  ];
+
+  nativeCheckInputs = [
+    babel
+    gntp
+    paho-mqtt
+    pytest-mock
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_apprise_cli_nux_env"
+    "test_plugin_mqtt_general"
+  ];
+
+  disabledTestPaths = [
+    # AttributeError: module 'apprise.plugins' has no attribute 'NotifyBulkSMS'
+    "test/test_plugin_bulksms.py"
+  ];
+
+  postInstall = ''
+    installManPage packaging/man/apprise.1
+  '';
+
+  pythonImportsCheck = [
+    "apprise"
+  ];
+
+  meta = with lib; {
+    description = "Push Notifications that work with just about every platform";
+    homepage = "https://github.com/caronc/apprise";
+    changelog = "https://github.com/caronc/apprise/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/approval-utilities/default.nix b/nixpkgs/pkgs/development/python-modules/approval-utilities/default.nix
new file mode 100644
index 000000000000..3b21c3ffab83
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/approval-utilities/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, approvaltests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "approval-utilities";
+  inherit (approvaltests) version src;
+  disabled = pythonOlder "3.7";
+  format = "setuptools";
+
+  postPatch = ''
+    mv setup.approval_utilities.py setup.py
+  '';
+
+  pythonImportsCheck = [ "approval_utilities" ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  meta = {
+    description = "Utilities for your production code that work well with approvaltests";
+    homepage = "https://github.com/approvals/ApprovalTests.Python";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/approvaltests/default.nix b/nixpkgs/pkgs/development/python-modules/approvaltests/default.nix
new file mode 100644
index 000000000000..b8ec645c42d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/approvaltests/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, allpairspy
+, approval-utilities
+, beautifulsoup4
+, buildPythonPackage
+, empty-files
+, fetchFromGitHub
+, mock
+, mrjob
+, numpy
+, pyperclip
+, pytest
+, pytestCheckHook
+, pythonOlder
+, testfixtures
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "approvaltests";
+  version = "10.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "approvals";
+    repo = "ApprovalTests.Python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-3KorHpJUeWSJKVN/4IN0AqKOIL0sT5MaxkvQqpeilhw=";
+  };
+
+  propagatedBuildInputs = [
+    allpairspy
+    approval-utilities
+    beautifulsoup4
+    empty-files
+    mrjob
+    pyperclip
+    pytest
+    testfixtures
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    mock
+    numpy
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests expects paths below ApprovalTests.Python directory
+    "test_received_filename"
+    "test_pytest_namer"
+  ];
+
+  pythonImportsCheck = [
+    "approvaltests.approvals"
+    "approvaltests.reporters.generic_diff_reporter_factory"
+  ];
+
+  meta = with lib; {
+    description = "Assertion/verification library to aid testing";
+    homepage = "https://github.com/approvals/ApprovalTests.Python";
+    changelog = "https://github.com/approvals/ApprovalTests.Python/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/appthreat-vulnerability-db/default.nix b/nixpkgs/pkgs/development/python-modules/appthreat-vulnerability-db/default.nix
new file mode 100644
index 000000000000..e42ae97e2b4e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/appthreat-vulnerability-db/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, appdirs
+, buildPythonPackage
+, cvss
+, fetchFromGitHub
+, httpx
+, msgpack
+, orjson
+, packageurl-python
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, semver
+, setuptools
+, tabulate
+}:
+
+buildPythonPackage rec {
+  pname = "appthreat-vulnerability-db";
+  version = "5.5.4";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "AppThreat";
+    repo = "vulnerability-db";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-LWlB7ZIcGoNXq6WodJE6hinGDBFgUqP4tXa51T5yI8c=";
+  };
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace " --cov-append --cov-report term --cov vdb" ""
+  '';
+
+  pythonRelaxDeps = [
+    "semver"
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    appdirs
+    cvss
+    httpx
+    msgpack
+    orjson
+    packageurl-python
+    semver
+    tabulate
+  ] ++ httpx.optional-dependencies.http2;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  disabledTests = [
+    # Tests require network access
+    "test_bulk_search"
+    "test_download_recent"
+  ];
+
+  pythonImportsCheck = [
+    "vdb"
+  ];
+
+  meta = with lib; {
+    description = "Vulnerability database and package search for sources such as OSV, NVD, GitHub and npm";
+    homepage = "https://github.com/appthreat/vulnerability-db";
+    changelog = "https://github.com/AppThreat/vulnerability-db/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/apptools/default.nix b/nixpkgs/pkgs/development/python-modules/apptools/default.nix
new file mode 100644
index 000000000000..faaf6bec0796
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apptools/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, configobj
+, fetchPypi
+, importlib-resources
+, pandas
+, pytestCheckHook
+, pythonOlder
+, tables
+, traits
+, traitsui
+}:
+
+buildPythonPackage rec {
+  pname = "apptools";
+  version = "5.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xiaPXfzzCIvK92oAA+ULd3TQG1JY1xmbQQtIUv8iRuM=";
+  };
+
+  propagatedBuildInputs = [
+    configobj
+    traits
+    traitsui
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ];
+
+  nativeCheckInputs = [
+    tables
+    pandas
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TMP
+  '';
+
+  pythonImportsCheck = [
+    "apptools"
+  ];
+
+  meta = with lib; {
+    description = "Set of packages that Enthought has found useful in creating a number of applications";
+    homepage = "https://github.com/enthought/apptools";
+    changelog = "https://github.com/enthought/apptools/releases/tag/${version}";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ knedlsepp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/apricot-select/default.nix b/nixpkgs/pkgs/development/python-modules/apricot-select/default.nix
new file mode 100644
index 000000000000..105f6a71c915
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apricot-select/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numba
+, numpy
+, pytestCheckHook
+, pythonOlder
+, torchvision
+, scikit-learn
+, scipy
+, setuptools
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "apricot-select";
+  version = "0.6.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jmschrei";
+    repo = "apricot";
+    rev = "refs/tags/${version}";
+    hash = "sha256-v9BHFxmlbwXVipPze/nV35YijdFBuka3gAl85AlsffQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    numba
+    numpy
+    scipy
+    tqdm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    torchvision
+    scikit-learn
+  ];
+
+  pythonImportsCheck = [
+    "apricot"
+  ];
+
+  disabledTestPaths = [
+    # Tests require nose
+    "tests/test_optimizers/test_knapsack_facility_location.py"
+    "tests/test_optimizers/test_knapsack_feature_based.py"
+  ];
+
+  meta = with lib; {
+    description = "Module for submodular optimization for the purpose of selecting subsets of massive data sets";
+    homepage = "https://github.com/jmschrei/apricot";
+    changelog = "https://github.com/jmschrei/apricot/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aprslib/default.nix b/nixpkgs/pkgs/development/python-modules/aprslib/default.nix
new file mode 100644
index 000000000000..ab56bf58b8e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aprslib/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aprslib";
+  version = "0.7.2";
+
+  src = fetchFromGitHub {
+    owner = "rossengeorgiev";
+    repo = "aprs-python";
+    rev = "v${version}";
+    hash = "sha256-2bYTnbJ8wF/smTpZ2tV+3ZRae7FpbNBtXoaR2Sc9Pek=";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/rossengeorgiev/aprs-python/commit/c2a0f18ce028a4cced582567a73d57f0d03cd00f.patch";
+      hash = "sha256-uxiLIagz1PIUUa6/qdBW15yhm/0QXqznVzZnzUVCWuQ=";
+    })
+  ];
+
+  doCheck = false; # mox3 is disabled on python311
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "aprslib" ];
+
+  meta = with lib; {
+    description = "Module for accessing APRS-IS and parsing APRS packets";
+    homepage = "https://github.com/rossengeorgiev/aprs-python";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/apscheduler/default.nix b/nixpkgs/pkgs/development/python-modules/apscheduler/default.nix
new file mode 100644
index 000000000000..771d9a3d0200
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apscheduler/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, gevent
+, pytest-asyncio
+, pytest-tornado
+, pytestCheckHook
+, pythonOlder
+, pytz
+, setuptools
+, setuptools-scm
+, six
+, tornado
+, twisted
+, tzlocal
+}:
+
+buildPythonPackage rec {
+  pname = "apscheduler";
+  version = "3.10.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "APScheduler";
+    inherit version;
+    hash = "sha256-5t8HGyfZvomOSGvHlAp75QtK8unafAjwdEqW1L1M70o=";
+  };
+
+  buildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    pytz
+    setuptools
+    six
+    tzlocal
+  ];
+
+  nativeCheckInputs = [
+    gevent
+    pytest-asyncio
+    pytest-tornado
+    pytestCheckHook
+    tornado
+    twisted
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --cov --tb=short" ""
+  '';
+
+  disabledTests = [
+    "test_broken_pool"
+    # gevent tests have issue on newer Python releases
+    "test_add_live_job"
+    "test_add_pending_job"
+    "test_shutdown"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_submit_job"
+    "test_max_instances"
+  ];
+
+  pythonImportsCheck = [
+    "apscheduler"
+  ];
+
+  meta = with lib; {
+    description = "Library that lets you schedule your Python code to be executed";
+    homepage = "https://github.com/agronholm/apscheduler";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/apsw/default.nix b/nixpkgs/pkgs/development/python-modules/apsw/default.nix
new file mode 100644
index 000000000000..59576a129d68
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apsw/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, sqlite
+, isPyPy
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "apsw";
+  version = "3.43.1.0";
+  format = "setuptools";
+
+  disabled = isPyPy;
+
+  src = fetchFromGitHub {
+    owner = "rogerbinns";
+    repo = "apsw";
+    rev = "refs/tags/${version}";
+    hash = "sha256-x+bSft37DgF2tXXCL6ac86g1+mj/wJeDLoCSiVSXedA=";
+  };
+
+  buildInputs = [
+    sqlite
+  ];
+
+  # Project uses custom test setup to exclude some tests by default, so using pytest
+  # requires more maintenance
+  # https://github.com/rogerbinns/apsw/issues/335
+  checkPhase = ''
+    ${python.interpreter} setup.py test
+  '';
+
+  pythonImportsCheck = [
+    "apsw"
+  ];
+
+  meta = with lib; {
+    description = "A Python wrapper for the SQLite embedded relational database engine";
+    homepage = "https://github.com/rogerbinns/apsw";
+    license = licenses.zlib;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/apycula/default.nix b/nixpkgs/pkgs/development/python-modules/apycula/default.nix
new file mode 100644
index 000000000000..c09d616b4d50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/apycula/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, setuptools-scm
+, numpy
+, pandas
+, pillow
+, crcmod
+, openpyxl
+}:
+
+buildPythonPackage rec {
+  pname = "apycula";
+  version = "0.9.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "Apycula";
+    hash = "sha256-9THKebhyoUUSnZek1uBIFckFM0Xh1fKRpxEt5Eptugw=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    pandas
+    pillow
+    crcmod
+    openpyxl
+  ];
+
+  # tests require a physical FPGA
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "apycula"
+  ];
+
+  meta = with lib; {
+    description = "Open Source tools for Gowin FPGAs";
+    homepage = "https://github.com/YosysHQ/apicula";
+    changelog = "https://github.com/YosysHQ/apicula/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ newam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aqipy-atmotech/default.nix b/nixpkgs/pkgs/development/python-modules/aqipy-atmotech/default.nix
new file mode 100644
index 000000000000..a9b82ca6ad19
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aqipy-atmotech/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "aqipy-atmotech";
+  version = "0.1.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "atmotube";
+    repo = "aqipy";
+    rev = version;
+    hash = "sha256-tqHhfJmtVFUSO57Cid9y3LK4pOoG7ROtwDT2hY5IE1Y=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'" ""
+  '';
+
+  pythonImportsCheck = [
+    "aqipy"
+  ];
+
+  meta = with lib; {
+    description = "Library for AQI calculation";
+    homepage = "https://github.com/atmotube/aqipy";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aqualogic/default.nix b/nixpkgs/pkgs/development/python-modules/aqualogic/default.nix
new file mode 100644
index 000000000000..9b904033b7c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aqualogic/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+, pytestCheckHook
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "aqualogic";
+  version = "3.4";
+
+  src = fetchFromGitHub {
+    owner = "swilson";
+    repo = pname;
+    rev = version;
+    hash = "sha256-hBg02Wypd+MyqM2SUD53djhm5OMP2QAmsp8Stf+UT2c=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    pyserial
+    websockets
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # With 3.4 the event loop is not terminated after the first test
+  # https://github.com/swilson/aqualogic/issues/9
+  doCheck = false;
+
+  pythonImportsCheck = [ "aqualogic" ];
+
+  meta = with lib; {
+    description = "Python library to interface with Hayward/Goldline AquaLogic/ProLogic pool controllers";
+    homepage = "https://github.com/swilson/aqualogic";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/arabic-reshaper/default.nix b/nixpkgs/pkgs/development/python-modules/arabic-reshaper/default.nix
new file mode 100644
index 000000000000..f9c82cd0a699
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arabic-reshaper/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fonttools
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "arabic-reshaper";
+  version = "3.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mpcabd";
+    repo = "python-arabic-reshaper";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ucSC5aTvpnlAVQcT0afVecnoN3hIZKtzUhEQ6Qg0jQM=";
+  };
+
+  passthru.optional-dependencies = {
+    with-fonttools = [
+      fonttools
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "arabic_reshaper"
+  ];
+
+  meta = with lib; {
+    description = "Reconstruct Arabic sentences to be used in applications that don't support Arabic";
+    homepage = "https://github.com/mpcabd/python-arabic-reshaper";
+    changelog = "https://github.com/mpcabd/python-arabic-reshaper/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ freezeboy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aranet4/default.nix b/nixpkgs/pkgs/development/python-modules/aranet4/default.nix
new file mode 100644
index 000000000000..dda10a9d6f22
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aranet4/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, bleak
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "aranet4";
+  version = "2.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Anrijs";
+    repo = "Aranet4-Python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-HiveHkGQUCvG4aqK2HSCbONObidT7yof4LzKSJPEOKU=";
+  };
+
+  propagatedBuildInputs = [
+    bleak
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "aranet4"
+  ];
+
+  disabledTests = [
+    # Test compares rendered output
+    "test_current_values"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with Aranet4 devices";
+    homepage = "https://github.com/Anrijs/Aranet4-Python";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/arc4/default.nix b/nixpkgs/pkgs/development/python-modules/arc4/default.nix
new file mode 100644
index 000000000000..9e873328a308
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arc4/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "arc4";
+  version = "0.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "manicmaniac";
+    repo = pname;
+    rev = version;
+    hash = "sha256-DlZIygf5v3ZNY2XFmrKOA15ccMo3Rv0kf6hZJ0CskeQ=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "arc4"
+  ];
+
+  meta = with lib; {
+    description = "ARCFOUR (RC4) cipher implementation";
+    homepage = "https://github.com/manicmaniac/arc4";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/arcam-fmj/default.nix b/nixpkgs/pkgs/development/python-modules/arcam-fmj/default.nix
new file mode 100644
index 000000000000..df5bcc40836f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arcam-fmj/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, aiohttp
+, attrs
+, defusedxml
+, pytest-aiohttp
+, pytest-mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "arcam-fmj";
+  version = "1.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "elupus";
+    repo = "arcam_fmj";
+    rev = "refs/tags/${version}";
+    hash = "sha256-/A3Fs0JyzW05L80CtI07Y/kTTrIC6yqubJfYO0kAEf0=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    attrs
+    defusedxml
+  ];
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "arcam.fmj"
+    "arcam.fmj.client"
+    "arcam.fmj.state"
+    "arcam.fmj.utils"
+  ];
+
+  meta = with lib; {
+    description = "Python library for speaking to Arcam receivers";
+    homepage = "https://github.com/elupus/arcam_fmj";
+    changelog = "https://github.com/elupus/arcam_fmj/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/archinfo/default.nix b/nixpkgs/pkgs/development/python-modules/archinfo/default.nix
new file mode 100644
index 000000000000..9e0858f14066
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/archinfo/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, backports-strenum
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "archinfo";
+  version = "9.2.79";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "angr";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-7gnNGUxl/K8GWV99uB/dEv9/ukQ4QV4nvyyByobhBt0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.11") [
+    backports-strenum
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "archinfo"
+  ];
+
+  meta = with lib; {
+    description = "Classes with architecture-specific information";
+    homepage = "https://github.com/angr/archinfo";
+    license = with licenses; [ bsd2 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/archspec/default.nix b/nixpkgs/pkgs/development/python-modules/archspec/default.nix
new file mode 100644
index 000000000000..5be16a16771f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/archspec/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, jsonschema
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "archspec";
+  version = "0.2.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    fetchSubmodules = true;
+    hash = "sha256-2rMsxSAnPIVqvsbAUtBbHLb3AvrZFjGzxYO6A/1qXnY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    jsonschema
+  ];
+
+  pythonImportsCheck = [
+    "archspec"
+  ];
+
+  meta = with lib; {
+    description = "Library for detecting, labeling, and reasoning about microarchitectures";
+    homepage = "https://archspec.readthedocs.io/";
+    changelog = "https://github.com/archspec/archspec/releases/tag/v0.2.1";
+    license = with licenses; [ mit asl20 ];
+    maintainers = with maintainers; [ atila ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/area/default.nix b/nixpkgs/pkgs/development/python-modules/area/default.nix
new file mode 100644
index 000000000000..37d7369dbeee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/area/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "area";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "18k5hwmlxhajlq306zxndsglb11vv8vd4vpmwx8dpvfxd1kbksya";
+  };
+
+  # tests not working on the package from pypi
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Calculate the area inside of any GeoJSON geometry. This is a port of Mapbox’s geojson-area for Python.";
+    homepage = "https://github.com/scisco/area";
+    license = licenses.bsd2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/arelle/default.nix b/nixpkgs/pkgs/development/python-modules/arelle/default.nix
new file mode 100644
index 000000000000..a5a78c332ab2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arelle/default.nix
@@ -0,0 +1,71 @@
+{ gui ? true,
+  buildPythonPackage, fetchFromGitHub, lib,
+  sphinx, lxml, isodate, numpy, openpyxl,
+  tkinter ? null, py3to2, isPy3k, python,
+  ... }:
+
+buildPythonPackage rec {
+  pname = "arelle${lib.optionalString (!gui) "-headless"}";
+  version = "18.3";
+
+  disabled = !isPy3k;
+
+  # Releases are published at http://arelle.org/download/ but sadly no
+  # tags are published on github.
+  src = fetchFromGitHub {
+    owner = "Arelle";
+    repo = "Arelle";
+    rev = "edgr${version}";
+    sha256 = "12a94ipdp6xalqyds7rcp6cjwps6fbj3byigzfy403hlqc9n1g33";
+  };
+  outputs = ["out" "doc"];
+  patches = [
+    ./tests.patch
+  ];
+  postPatch = "rm testParser2.py";
+  nativeBuildInputs = [
+    sphinx
+    py3to2
+  ];
+  propagatedBuildInputs = [
+    lxml
+    isodate
+    numpy
+    openpyxl
+  ] ++ lib.optionals gui [
+    tkinter
+  ];
+
+  # arelle-gui is useless without gui dependencies, so delete it when !gui.
+  postInstall = lib.optionalString (!gui) ''
+    find $out/bin -name "*arelle-gui*" -delete
+  '' +
+  # By default, not the entirety of the src dir is copied. This means we don't
+  # copy the `images` dir, which is needed for the gui version.
+  lib.optionalString (gui) ''
+    targetDir=$out/${python.sitePackages}
+    cp -vr $src/arelle $targetDir
+  '';
+
+  # Documentation
+  postBuild = ''
+    (cd apidocs && make html && cp -r _build $doc)
+    '';
+
+  doCheck = false;
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    description = ''
+      An open source facility for XBRL, the eXtensible Business Reporting
+      Language supporting various standards, exposed through a Python or
+      REST API'' + lib.optionalString gui " and a graphical user interface";
+    homepage = "http://arelle.org/";
+    license = licenses.asl20;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ roberth ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/arelle/tests.patch b/nixpkgs/pkgs/development/python-modules/arelle/tests.patch
new file mode 100644
index 000000000000..e34cda99b251
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arelle/tests.patch
@@ -0,0 +1,14 @@
+diff --git c/arelle/CntlrProfiler.py i/arelle/CntlrProfiler.py
+index a64bb1b..dc0299d 100644
+--- c/arelle/CntlrProfiler.py
++++ i/arelle/CntlrProfiler.py
+@@ -1,5 +1,6 @@
+
+-import Cntlr, ModelManager, FileSource, time
++from arelle import Cntlr, ModelManager, FileSource
++import time
+ from optparse import OptionParser
+ import cProfile
+ import gettext
+diff --git c/arelle/ValidateFilingText.py i/arelle/ValidateFilingText.py
+index 12dbbbb..c0e98c3 100644
diff --git a/nixpkgs/pkgs/development/python-modules/aresponses/default.nix b/nixpkgs/pkgs/development/python-modules/aresponses/default.nix
new file mode 100644
index 000000000000..01b0c3c44a6e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aresponses/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytest
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aresponses";
+  version = "2.1.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CircleUp";
+    repo = pname;
+    rev = version;
+    hash = "sha256-Ui9ZpWaVBfCbDlZH3EgHX32FIZtyTHnc/UXqtoEyFcw=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  buildInputs = [
+    pytest
+    pytest-asyncio
+  ];
+
+  nativeCheckInputs = [
+    aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Disable tests which requires network access
+    "test_foo"
+    "test_passthrough"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [
+    "aresponses"
+  ];
+
+  meta = with lib; {
+    description = "Asyncio testing server";
+    homepage = "https://github.com/circleup/aresponses";
+    license = licenses.mit;
+    maintainers = with maintainers; [ makefu ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/argcomplete/default.nix b/nixpkgs/pkgs/development/python-modules/argcomplete/default.nix
new file mode 100644
index 000000000000..765a7848ac56
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/argcomplete/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "argcomplete";
+  version = "3.1.6";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "kislyuk";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Akwa6dsf8w/Sw0ydUrqKEP5+dzHYX4hS8vcl7Gw4ePc=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  # Tries to build and install test packages which fails
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "argcomplete"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/kislyuk/argcomplete/blob/v${version}/Changes.rst";
+    description = "Bash tab completion for argparse";
+    downloadPage = "https://github.com/kislyuk/argcomplete";
+    homepage = "https://kislyuk.github.io/argcomplete/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ womfoo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/argh/default.nix b/nixpkgs/pkgs/development/python-modules/argh/default.nix
new file mode 100644
index 000000000000..a03e441c8fda
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/argh/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, flit-core
+, iocapture
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "argh";
+  version = "0.29.4";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-aVwK5FNCcMriaXhBtKVvQ0qZBpSgAmTqEOu7zcAsE/c=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  nativeCheckInputs = [
+    iocapture
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "argh" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/neithere/argh/blob/v${version}/CHANGES";
+    homepage = "https://github.com/neithere/argh";
+    description = "An unobtrusive argparse wrapper with natural syntax";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/argilla/default.nix b/nixpkgs/pkgs/development/python-modules/argilla/default.nix
new file mode 100644
index 000000000000..26a527eb4f8f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/argilla/default.nix
@@ -0,0 +1,187 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pythonRelaxDepsHook
+, deprecated
+, rich
+, backoff
+, packaging
+, pydantic
+, typer
+, tqdm
+, wrapt
+, numpy
+, httpx
+, pandas
+, monotonic
+# optional-dependencies
+, fastapi
+, opensearch-py
+, elasticsearch8
+, uvicorn
+, smart-open
+, brotli-asgi
+, alembic
+, sqlalchemy
+, greenlet
+, aiosqlite
+, luqum
+, scikit-learn
+, aiofiles
+, pyyaml
+, python-multipart
+, python-jose
+, passlib
+, psutil
+# , segment-analytics-python
+, asyncpg
+, psycopg2
+, schedule
+, prodict
+, cleanlab
+, datasets
+, huggingface-hub
+# , flair
+, faiss
+, flyingsquid
+, pgmpy
+, plotly
+, snorkel
+, spacy
+, transformers
+, evaluate
+, seqeval
+# , setfit
+# , span_marker
+, openai
+, peft
+# test dependencies
+, pytestCheckHook
+, pytest-cov
+, pytest-mock
+, pytest-asyncio
+, factory-boy
+}:
+let
+  pname = "argilla";
+  version = "1.19.0";
+  optional-dependencies = {
+    server = [
+      fastapi
+      opensearch-py
+      elasticsearch8
+      uvicorn
+      smart-open
+      brotli-asgi
+      alembic
+      sqlalchemy
+      greenlet
+      aiosqlite
+      luqum
+      scikit-learn
+      aiofiles
+      pyyaml
+      python-multipart
+      python-jose
+      passlib
+      psutil
+      # segment-analytics-python
+    ] ++
+      elasticsearch8.optional-dependencies.async ++
+      uvicorn.optional-dependencies.standard ++
+      python-jose.optional-dependencies.cryptography ++
+      passlib.optional-dependencies.bcrypt;
+    postgresql = [ asyncpg psycopg2 ];
+    listeners = [ schedule prodict ];
+    integrations = [
+      pyyaml
+      cleanlab
+      datasets
+      huggingface-hub
+      # flair
+      faiss
+      flyingsquid
+      pgmpy
+      plotly
+      snorkel
+      spacy
+      transformers
+      evaluate
+      seqeval
+      # setfit
+      # span_marker
+      openai
+      peft
+    ] ++ transformers.optional-dependencies.torch;
+  };
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "argilla-io";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Idl5Tm1XWgBLVgHPbXiyt9MW4J5wZdPb2J7iIDBnorg=";
+  };
+
+  pythonRelaxDeps = [
+    "typer"
+    "rich"
+    "numpy"
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+    deprecated
+    packaging
+    pandas
+    pydantic
+    wrapt
+    numpy
+    tqdm
+    backoff
+    monotonic
+    rich
+    typer
+  ];
+
+  # still quite a bit of optional dependencies missing
+  doCheck = false;
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-cov
+    pytest-mock
+    pytest-asyncio
+    factory-boy
+  ]
+    ++ optional-dependencies.server
+    ++ optional-dependencies.postgresql
+    ++ optional-dependencies.listeners
+    ++ optional-dependencies.integrations;
+
+  pytestFlagsArray = [ "--ignore=tests/server/datasets/test_dao.py" ];
+
+  passthru.optional-dependencies = optional-dependencies;
+
+  meta = with lib; {
+    description = "Argilla: the open-source data curation platform for LLMs";
+    homepage = "https://github.com/argilla-io/argilla";
+    changelog = "https://github.com/argilla-io/argilla/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/argon2-cffi-bindings/default.nix b/nixpkgs/pkgs/development/python-modules/argon2-cffi-bindings/default.nix
new file mode 100644
index 000000000000..77182cbd6a43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/argon2-cffi-bindings/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, libargon2
+, cffi
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "argon2-cffi-bindings";
+  version = "21.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3";
+  };
+
+  buildInputs = [ libargon2 ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+    cffi
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+  ];
+
+  env.ARGON2_CFFI_USE_SYSTEM = 1;
+
+  # tarball doesn't include tests, but the upstream tests are minimal
+  doCheck = false;
+  pythonImportsCheck = [ "_argon2_cffi_bindings" ];
+
+  meta = with lib; {
+    description = "Low-level CFFI bindings for Argon2";
+    homepage = "https://github.com/hynek/argon2-cffi-bindings";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/argon2-cffi/default.nix b/nixpkgs/pkgs/development/python-modules/argon2-cffi/default.nix
new file mode 100644
index 000000000000..da9022c93f19
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/argon2-cffi/default.nix
@@ -0,0 +1,36 @@
+{ hypothesis
+, pytestCheckHook
+, buildPythonPackage
+, fetchPypi
+, lib
+, hatchling
+, hatch-vcs
+, hatch-fancy-pypi-readme
+, argon2-cffi-bindings
+}:
+
+buildPythonPackage rec {
+  pname = "argon2-cffi";
+  version = "23.1.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "argon2_cffi";
+    inherit version;
+    hash = "sha256-h5w+eaJynOdo67fTbUYJ46eKTKLsOp8SKGygV+PQ2wg=";
+  };
+
+  nativeBuildInputs = [ hatchling hatch-vcs hatch-fancy-pypi-readme ];
+
+  propagatedBuildInputs = [ argon2-cffi-bindings ];
+
+  nativeCheckInputs = [ hypothesis pytestCheckHook ];
+
+  pythonImportsCheck = [ "argon2" ];
+
+  meta = with lib; {
+    description = "Secure Password Hashes for Python";
+    homepage    = "https://argon2-cffi.readthedocs.io/";
+    license     = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/argos-translate-files/default.nix b/nixpkgs/pkgs/development/python-modules/argos-translate-files/default.nix
new file mode 100644
index 000000000000..0f0e3ea22354
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/argos-translate-files/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, lxml
+, translatehtml
+}:
+
+buildPythonPackage rec {
+  pname = "argos-translate-files";
+  version = "1.1.4";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-YSTqqd+Kv2QVlAjA0lf4IRx7rJ1DmvB0JIReBv3yZcM=";
+  };
+
+  propagatedBuildInputs = [
+    lxml
+    translatehtml
+  ];
+
+  postPatch = ''
+    ln -s */requires.txt requirements.txt
+  '';
+
+  # required for import check to work (argostranslate)
+  env.HOME = "/tmp";
+
+  pythonImportsCheck = [ "argostranslatefiles" ];
+
+  doCheck = false; # no tests
+
+  meta = with lib; {
+    description = "Translate files using Argos Translate";
+    homepage = "https://www.argosopentech.com";
+    license = licenses.mit;
+    maintainers = with maintainers; [ misuzu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/argostranslate/default.nix b/nixpkgs/pkgs/development/python-modules/argostranslate/default.nix
new file mode 100644
index 000000000000..9d958c2e1e9e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/argostranslate/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, ctranslate2
+, ctranslate2-cpp
+, sentencepiece
+, stanza
+}:
+let
+  ctranslate2OneDNN = ctranslate2.override {
+    ctranslate2-cpp = ctranslate2-cpp.override {
+      # https://github.com/OpenNMT/CTranslate2/issues/1294
+      withOneDNN = true;
+      withOpenblas = false;
+    };
+  };
+in
+buildPythonPackage rec {
+  pname = "argostranslate";
+  version = "1.9.1";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-OlVrRfBhbJpIFjWdLQsn7zEteRP6UfkIpGT4Y933QKk=";
+  };
+
+  propagatedBuildInputs = [
+    ctranslate2OneDNN
+    sentencepiece
+    stanza
+  ];
+
+  postPatch = ''
+    ln -s */requires.txt requirements.txt
+
+    substituteInPlace requirements.txt  \
+      --replace "==" ">="
+  '';
+
+  doCheck = false; # needs network access
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # required for import check to work
+  # PermissionError: [Errno 13] Permission denied: '/homeless-shelter'
+  env.HOME = "/tmp";
+
+  pythonImportsCheck = [
+    "argostranslate"
+    "argostranslate.translate"
+  ];
+
+  meta = with lib; {
+    description = "Open-source offline translation library written in Python";
+    homepage = "https://www.argosopentech.com";
+    license = licenses.mit;
+    maintainers = with maintainers; [ misuzu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/argparse-addons/default.nix b/nixpkgs/pkgs/development/python-modules/argparse-addons/default.nix
new file mode 100644
index 000000000000..1d50820d4e5d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/argparse-addons/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "argparse-addons";
+  version = "0.12.0";
+
+  src = fetchPypi {
+    pname = "argparse_addons";
+    inherit version;
+    hash = "sha256-YyKg3NcGiH52MI0jE21bhtoOq3WigtxklnAdEhC0YK8=";
+  };
+
+  pythonImportsCheck = [ "argparse_addons" ];
+
+  meta = with lib; {
+    description = "Additional Python argparse types and actions";
+    homepage = "https://github.com/eerimoq/argparse_addons";
+    license = licenses.mit;
+    maintainers = with maintainers; [ frogamic sbruder ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/argparse-dataclass/default.nix b/nixpkgs/pkgs/development/python-modules/argparse-dataclass/default.nix
new file mode 100644
index 000000000000..993242e4bd80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/argparse-dataclass/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "argparse-dataclass";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "mivade";
+    repo = "argparse_dataclass";
+    rev = version;
+    sha256 = "6//XQKUnCH3ZtOL6M/EstMJ537nEmbuGQNqfelTluOs=";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "argparse_dataclass" ];
+
+  meta = with lib; {
+    description = "Declarative CLIs with argparse and dataclasses";
+    homepage = "https://github.com/mivade/argparse_dataclass";
+    license = licenses.mit;
+    maintainers = with maintainers; [ tm-drtina ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/args/default.nix b/nixpkgs/pkgs/development/python-modules/args/default.nix
new file mode 100644
index 000000000000..9faf16037d04
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/args/default.nix
@@ -0,0 +1,16 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "args";
+  version = "0.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a785b8d837625e9b61c39108532d95b85274acd679693b71ebb5156848fcf814";
+  };
+
+  meta = with lib; {
+    description = "Command Arguments for Humans";
+    homepage = "https://github.com/kennethreitz/args";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aria2p/default.nix b/nixpkgs/pkgs/development/python-modules/aria2p/default.nix
new file mode 100644
index 000000000000..e505ac015bca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aria2p/default.nix
@@ -0,0 +1,84 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pdm-pep517
+, appdirs
+, loguru
+, requests
+, setuptools
+, toml
+, websocket-client
+, asciimatics
+, pyperclip
+, aria2
+, fastapi
+, pytest-xdist
+, pytestCheckHook
+, responses
+, uvicorn
+}:
+
+buildPythonPackage rec {
+  pname = "aria2p";
+  version = "0.11.2";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "pawamoy";
+    repo = pname;
+    rev = version;
+    hash = "sha256-z74ej6J6Yh1aVsXR5fE+XhoCzCS+zfDxQL8gKFd7tBA=";
+  };
+
+  nativeBuildInputs = [
+    pdm-pep517
+  ];
+
+  propagatedBuildInputs = [
+    appdirs
+    loguru
+    requests
+    setuptools # for pkg_resources
+    toml
+    websocket-client
+  ];
+
+  passthru.optional-dependencies = {
+    tui = [ asciimatics pyperclip ];
+  };
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  nativeCheckInputs = [
+    aria2
+    fastapi
+    pytest-xdist
+    pytestCheckHook
+    responses
+    uvicorn
+  ] ++ passthru.optional-dependencies.tui;
+
+  disabledTests = [
+    # require a running display server
+    "test_add_downloads_torrents_and_metalinks"
+    "test_add_downloads_uris"
+    # require a running aria2 server
+    "test_get_files_method"
+    "test_pause_subcommand"
+    "test_resume_method"
+  ];
+
+  pythonImportsCheck = [ "aria2p" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pawamoy/aria2p";
+    changelog = "https://github.com/pawamoy/aria2p/blob/${src.rev}/CHANGELOG.md";
+    description = "Command-line tool and library to interact with an aria2c daemon process with JSON-RPC";
+    license = licenses.isc;
+    maintainers = with maintainers; [ koral ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ariadne/default.nix b/nixpkgs/pkgs/development/python-modules/ariadne/default.nix
new file mode 100644
index 000000000000..3810934eefeb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ariadne/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, freezegun
+, graphql-core
+, opentracing
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, snapshottest
+, starlette
+, typing-extensions
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "ariadne";
+  version = "0.20.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mirumee";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-v3CaLMTo/zbNEoE3K+aWnFTCgLetcnN7vOU/sFqLq2k=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    graphql-core
+    starlette
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    opentracing
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+    snapshottest
+    werkzeug
+  ];
+
+  pythonImportsCheck = [
+    "ariadne"
+  ];
+
+  disabledTests = [
+    # TypeError: TestClient.request() got an unexpected keyword argument 'content'
+    "test_attempt_parse_request_missing_content_type_raises_bad_request_error"
+    "test_attempt_parse_non_json_request_raises_bad_request_error"
+    "test_attempt_parse_non_json_request_body_raises_bad_request_error"
+  ];
+
+  disabledTestPaths = [
+    # missing graphql-sync-dataloader test dep
+    "tests/test_dataloaders.py"
+    "tests/wsgi/test_configuration.py"
+  ];
+
+  meta = with lib; {
+    description = "Python library for implementing GraphQL servers using schema-first approach";
+    homepage = "https://ariadnegraphql.org";
+    changelog = "https://github.com/mirumee/ariadne/blob/${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/arnparse/default.nix b/nixpkgs/pkgs/development/python-modules/arnparse/default.nix
new file mode 100644
index 000000000000..5da008aa650f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arnparse/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "arnparse";
+  version = "0.0.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "PokaInc";
+    repo = "arnparse";
+    rev = version;
+    hash = "sha256-2+wxzYoS/KJXjYM6lZguxbr2Oxobo0eFNnzWZHLi0WM=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "arnparse"
+  ];
+
+  meta = with lib; {
+    description = "Parse ARNs using Python";
+    homepage = "https://github.com/PokaInc/arnparse";
+    license = licenses.mit;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/arpeggio/default.nix b/nixpkgs/pkgs/development/python-modules/arpeggio/default.nix
new file mode 100644
index 000000000000..8c7da464c453
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arpeggio/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "arpeggio";
+  version = "2.0.2";
+
+  src = fetchPypi {
+    pname = "Arpeggio";
+    inherit version;
+    hash = "sha256-x5CysG4ibS3UaOT7+1t/UGzsZkFgMf3hRBzx3ioLpwA=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "arpeggio" ];
+
+  meta = with lib; {
+    description = "Recursive descent parser with memoization based on PEG grammars (aka Packrat parser)";
+    homepage = "https://github.com/textX/Arpeggio";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/arpy/default.nix b/nixpkgs/pkgs/development/python-modules/arpy/default.nix
new file mode 100644
index 000000000000..229e15d24ff3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arpy/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "arpy";
+  version = "2.3.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "viraptor";
+    repo = pname;
+    rev = version;
+    hash = "sha256-jD1XJJhcpJymn0CwZ65U06xLKm1JjHffmx/umEO7a5s=";
+  };
+
+  checkInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [ "arpy" ];
+
+  meta = with lib; {
+    description = "A library for accessing the archive files and reading the contents";
+    homepage = "https://github.com/viraptor/arpy";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ thornycrackers ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/array-record/default.nix b/nixpkgs/pkgs/development/python-modules/array-record/default.nix
new file mode 100644
index 000000000000..0497c542fe24
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/array-record/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, python
+, fetchPypi
+, absl-py
+, etils
+, importlib-resources
+, typing-extensions
+, zipp
+}:
+
+buildPythonPackage rec {
+  pname = "array-record";
+  version = "0.5.0";
+  format = "wheel";
+
+  # As of 2023-10-31, PyPI includes wheels for Python 3.9, 3.10, and 3.11.
+  disabled = pythonOlder "3.9";
+
+  src = let
+    pyShortVersion = "cp${builtins.replaceStrings ["."] [""] python.pythonVersion}";
+  in fetchPypi {
+    inherit version format;
+    pname = "array_record";
+    dist = pyShortVersion;
+    python = pyShortVersion;
+    abi = pyShortVersion;
+    platform = "manylinux_2_17_x86_64.manylinux2014_x86_64";
+    hash = {
+      cp39 = "sha256-BzMOVue7E1S1+5+XTcPELko81ujc9MbmqLhNsU7pqO0=";
+      cp310 = "sha256-eUD9pQu9GsbV8MPD1MiF3Ihr+zYioSOo6P15hYIwPYo=";
+      cp311 = "sha256-rAmkI3EIZPYiXrxFowfDC0Gf3kRw0uX0i6Kx6Zu+hNM=";
+    }.${pyShortVersion};
+  };
+
+  propagatedBuildInputs = [
+    absl-py
+    etils
+    importlib-resources
+    typing-extensions
+    zipp
+  ];
+
+  pythonImportsCheck = [ "array_record" ];
+
+  meta = with lib; {
+    description = "ArrayRecord is a new file format derived from Riegeli, achieving a new frontier of IO efficiency";
+    homepage = "https://github.com/google/array_record";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ GaetanLepage ];
+    platforms = [ "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/arrayqueues/default.nix b/nixpkgs/pkgs/development/python-modules/arrayqueues/default.nix
new file mode 100644
index 000000000000..3add43b6509a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arrayqueues/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "arrayqueues";
+  version = "1.4.1";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-7I+5BQO/gsvTREDkBfxrMblw3JPfY48S4KI4PCGPtFY=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  meta = {
+    homepage = "https://github.com/portugueslab/arrayqueues";
+    description = "Multiprocessing queues for numpy arrays using shared memory";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ tbenst ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/arris-tg2492lg/default.nix b/nixpkgs/pkgs/development/python-modules/arris-tg2492lg/default.nix
new file mode 100644
index 000000000000..78239b1a4af6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arris-tg2492lg/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "arris-tg2492lg";
+  version = "2.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "vanbalken";
+    repo = pname;
+    rev = version;
+    hash = "sha256-C1o9HWWJ/G/7Pp6I0FbRmX2PQvUJx71L9wHRkUMtnL4=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "arris_tg2492lg"
+  ];
+
+  meta = with lib; {
+    description = "Library to connect to an Arris TG2492LG";
+    homepage = "https://github.com/vanbalken/arris-tg2492lg";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/arrow/default.nix b/nixpkgs/pkgs/development/python-modules/arrow/default.nix
new file mode 100644
index 000000000000..db8124a98a5e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arrow/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, python-dateutil
+, typing-extensions
+, pytestCheckHook
+, pytest-mock
+, pytz
+, simplejson
+}:
+
+buildPythonPackage rec {
+  pname = "arrow";
+  version = "1.2.3";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-OTSzDKG58pI3bZ2xWxlEYIjRLsWGKbw/DaKP1V+2M6E=";
+  };
+
+  postPatch = ''
+    # no coverage reports
+    sed -i "/addopts/d" tox.ini
+  '';
+
+  propagatedBuildInputs = [ python-dateutil ]
+    ++ lib.optionals (pythonOlder "3.8") [ typing-extensions ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+    pytz
+    simplejson
+  ];
+
+  # ParserError: Could not parse timezone expression "America/Nuuk"
+  disabledTests = [
+    "test_parse_tz_name_zzz"
+  ];
+
+  pythonImportsCheck = [ "arrow" ];
+
+  meta = with lib; {
+    description = "Python library for date manipulation";
+    homepage = "https://github.com/crsmithdev/arrow";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ thoughtpolice ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/arsenic/default.nix b/nixpkgs/pkgs/development/python-modules/arsenic/default.nix
new file mode 100644
index 000000000000..e2c929b25147
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arsenic/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, aiohttp
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pytestCheckHook
+, pythonRelaxDepsHook
+, pythonOlder
+, structlog
+}:
+
+buildPythonPackage rec {
+  pname = "arsenic";
+  version = "21.8";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "HENNGE";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-fsLo22PR9WdX2FazPgr8B8dFq6EM1LLTpRFGEm/ymCE=";
+  };
+
+  patches = [
+    # Switch to poetry-core, https://github.com/HENNGE/arsenic/pull/160
+    (fetchpatch {
+      name = "switch-to-poetry-core.patch";
+      url = "https://github.com/HENNGE/arsenic/commit/ca82894a5f1e832ab9283a245258b334bdd48855.patch";
+      hash = "sha256-ECCUaJF4MRmFOKH1C6HowJ+zmbEPPiS7h9DlKw5otZc=";
+    })
+  ];
+
+  pythonRelaxDeps = [
+    "structlog"
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    attrs
+    structlog
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Depends on asyncio_extras which is not longer maintained
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "arsenic"
+  ];
+
+  meta = with lib; {
+    description = "WebDriver implementation for asyncio and asyncio-compatible frameworks";
+    homepage = "https://github.com/HENNGE/arsenic/";
+    changelog = "https://github.com/HENNGE/arsenic/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/art/default.nix b/nixpkgs/pkgs/development/python-modules/art/default.nix
new file mode 100644
index 000000000000..2bf6f51cd163
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/art/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "art";
+  version = "6.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "sepandhaghighi";
+    repo = "art";
+    rev = "v${version}";
+    hash = "sha256-RJexYOGWwAwxQ7lWGgXzFSR2aly1twB9pC4QFs5m7k8=";
+  };
+
+  pythonImportsCheck = [ "art" ];
+
+  # TypeError: art() missing 1 required positional argument: 'artname'
+  checkPhase = ''
+    runHook preCheck
+
+    $out/bin/art
+    $out/bin/art test
+    $out/bin/art test2
+
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "ASCII art library for Python";
+    homepage = "https://github.com/sepandhaghighi/art";
+    changelog = "https://github.com/sepandhaghighi/art/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/arviz/default.nix b/nixpkgs/pkgs/development/python-modules/arviz/default.nix
new file mode 100644
index 000000000000..0a186781b4a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arviz/default.nix
@@ -0,0 +1,117 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, emcee
+, h5netcdf
+, matplotlib
+, netcdf4
+, numba
+, numpy
+, pandas
+, pytest
+, setuptools
+, cloudpickle
+, pytestCheckHook
+, scipy
+, packaging
+, typing-extensions
+, pythonOlder
+, xarray
+, xarray-einstats
+, zarr
+, ffmpeg
+, h5py
+, jaxlib
+, torchvision
+, jax
+  # , pymc3 (circular dependency)
+, pyro-ppl
+  #, pystan (not packaged)
+, numpyro
+, bokeh
+}:
+
+buildPythonPackage rec {
+  pname = "arviz";
+  version = "0.16.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "arviz-devs";
+    repo = "arviz";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-kixWGj0M0flTq5rXSiPB0nfZaGYRvvMBGAJpehdW8KY=";
+  };
+
+  propagatedBuildInputs = [
+    h5netcdf
+    matplotlib
+    netcdf4
+    numpy
+    packaging
+    pandas
+    scipy
+    setuptools
+    xarray
+    xarray-einstats
+  ];
+
+  nativeCheckInputs = [
+    cloudpickle
+    emcee
+    ffmpeg
+    h5py
+    jax
+    jaxlib
+    numba
+    numpyro
+    # pymc3 (circular dependency)
+    pyro-ppl
+    # pystan (not packaged)
+    pytestCheckHook
+    torchvision
+    zarr
+    bokeh
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  pytestFlagsArray = [
+    "arviz/tests/base_tests/"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_plot_separation"
+    "test_plot_trace_legend"
+    "test_cov"
+    # countourpy is not available at the moment
+    "test_plot_kde"
+    "test_plot_kde_2d"
+    "test_plot_pair"
+    # Array mismatch
+    "test_plot_ts"
+    # The following two tests fail in a common venv-based setup.
+    # An issue has been opened upstream: https://github.com/arviz-devs/arviz/issues/2282
+    "test_plot_ppc_discrete"
+    "test_plot_ppc_discrete_save_animation"
+    # Assertion error
+    "test_data_zarr"
+  ];
+
+  pythonImportsCheck = [
+    "arviz"
+  ];
+
+  meta = with lib; {
+    description = "Library for exploratory analysis of Bayesian models";
+    homepage = "https://arviz-devs.github.io/arviz/";
+    changelog = "https://github.com/arviz-devs/arviz/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ omnipotententity ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/arxiv2bib/default.nix b/nixpkgs/pkgs/development/python-modules/arxiv2bib/default.nix
new file mode 100644
index 000000000000..bcffe0c3bb1d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/arxiv2bib/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage
+, lib
+, fetchFromGitHub
+, mock
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "arxiv2bib";
+  version = "1.0.8";
+
+  # Missing tests on Pypi
+  src = fetchFromGitHub {
+    owner = "nathangrigg";
+    repo = "arxiv2bib";
+    rev = version;
+    sha256 = "1kp2iyx20lpc9dv4qg5fgwf83a1wx6f7hj1ldqyncg0kn9xcrhbg";
+  };
+
+  nativeCheckInputs = [ unittestCheckHook mock ];
+  unittestFlagsArray = [ "-s" "tests" ];
+
+  meta = with lib; {
+    description = "Get a BibTeX entry from an arXiv id number, using the arxiv.org API";
+    homepage = "http://nathangrigg.github.io/arxiv2bib/";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.nico202 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asana/default.nix b/nixpkgs/pkgs/development/python-modules/asana/default.nix
new file mode 100644
index 000000000000..87a996a45523
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asana/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-oauthlib
+, responses
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "asana";
+  version = "4.0.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "asana";
+    repo = "python-asana";
+    rev = "refs/tags/${version}";
+    hash = "sha256-B98X8ErmoMIpXu4KKvRGgtElPs/va2+UIR+ARUgafgo=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    requests-oauthlib
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "asana"
+  ];
+
+  meta = with lib; {
+    description = "Python client library for Asana";
+    homepage = "https://github.com/asana/python-asana";
+    changelog = "https://github.com/Asana/python-asana/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ascii-magic/default.nix b/nixpkgs/pkgs/development/python-modules/ascii-magic/default.nix
new file mode 100644
index 000000000000..0c876d756ebe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ascii-magic/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, colorama
+, fetchPypi
+, pillow
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ascii-magic";
+  version = "2.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "ascii_magic";
+    inherit version;
+    hash = "sha256-PtQaHLFn3u1cz8YotmnzWjoD9nvdctzBi+X/2KJkPYU=";
+  };
+
+  propagatedBuildInputs = [
+    colorama
+    pillow
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ascii_magic"
+  ];
+
+  preCheck = ''
+    cd tests
+  '';
+
+  disabledTests = [
+    # Test requires network access
+    "test_from_url"
+    "test_quick_test"
+    "test_wrong_url"
+    # No clipboard in the sandbox
+    "test_from_clipboard"
+  ];
+
+  meta = with lib; {
+    description = "Python module to converts pictures into ASCII art";
+    homepage = "https://github.com/LeandroBarone/python-ascii_magic";
+    changelog = "https://github.com/LeandroBarone/python-ascii_magic#changelog";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asciimatics/default.nix b/nixpkgs/pkgs/development/python-modules/asciimatics/default.nix
new file mode 100644
index 000000000000..c990c9477bbf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asciimatics/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, pyfiglet
+, pillow
+, wcwidth
+, future
+, mock
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "asciimatics";
+  version = "1.15.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-z905gEJydRnYtz5iuO+CwL7P7U60IImcO5bJjQuWgho=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    pyfiglet
+    pillow
+    wcwidth
+    future
+  ];
+
+  nativeCheckInputs = [
+    mock
+    nose
+  ];
+
+  # tests require a pty emulator
+  # which is too complicated to setup here
+  doCheck = false;
+
+  pythonImportsCheck =  [
+    "asciimatics.effects"
+    "asciimatics.renderers"
+    "asciimatics.scene"
+    "asciimatics.screen"
+  ];
+
+  meta = with lib; {
+    description = "Helps to create full-screen text UIs (from interactive forms to ASCII animations) on any platform";
+    homepage = "https://github.com/peterbrittain/asciimatics";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ cmcdragonkai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asciitree/default.nix b/nixpkgs/pkgs/development/python-modules/asciitree/default.nix
new file mode 100644
index 000000000000..ad978efffb5f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asciitree/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "asciitree";
+  version = "0.3.3";
+
+  src = fetchFromGitHub {
+    owner = "mbr";
+    repo = pname;
+    rev = version;
+    sha256 = "071wlpyi8pa262sj9xdy0zbj163z84dasxad363z3sfndqxw78h1";
+  };
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Draws ASCII trees";
+    homepage = "https://github.com/mbr/asciitree";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asdf-standard/default.nix b/nixpkgs/pkgs/development/python-modules/asdf-standard/default.nix
new file mode 100644
index 000000000000..170cefa42e86
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asdf-standard/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, importlib-resources
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "asdf-standard";
+  version = "1.0.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "asdf_standard";
+    inherit version;
+    hash = "sha256-r9j/mnDnsX9rzGTrkqVEhn1dT+HwB2cZFC/fYrls/UQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ];
+
+  # Circular dependency on asdf
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "asdf_standard"
+  ];
+
+  meta = with lib; {
+    description = "Standards document describing ASDF";
+    homepage = "https://github.com/asdf-format/asdf-standard";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asdf-transform-schemas/default.nix b/nixpkgs/pkgs/development/python-modules/asdf-transform-schemas/default.nix
new file mode 100644
index 000000000000..d00e43e756a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asdf-transform-schemas/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, asdf-standard
+, buildPythonPackage
+, fetchPypi
+, importlib-resources
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "asdf-transform-schemas";
+  version = "0.4.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "asdf_transform_schemas";
+    inherit version;
+    hash = "sha256-3n/cP+41+5V/wylXh3oOnX3U0uhRvWMaclnxHCvSlMo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    asdf-standard
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ];
+
+  # Circular dependency on asdf
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "asdf_transform_schemas"
+  ];
+
+  meta = with lib; {
+    description = "ASDF schemas for validating transform tags";
+    homepage = "https://github.com/asdf-format/asdf-transform-schemas";
+    changelog = "https://github.com/asdf-format/asdf-transform-schemas/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asdf/default.nix b/nixpkgs/pkgs/development/python-modules/asdf/default.nix
new file mode 100644
index 000000000000..f4a45ecaf9ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asdf/default.nix
@@ -0,0 +1,100 @@
+{ lib
+, asdf-standard
+, asdf-transform-schemas
+, astropy
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, importlib-resources
+, jmespath
+, jsonschema
+, lz4
+, numpy
+, packaging
+, pytest-astropy
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, semantic-version
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "asdf";
+  version = "2.13.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "asdf-format/";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-u8e7ot5NDRqQFH0eLVnGinBQmQD73BlR5K9HVjA7SIg=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  patches = [
+    # Fix default validation, https://github.com/asdf-format/asdf/pull/1203
+    (fetchpatch {
+      name = "default-validation.patch";
+      url = "https://github.com/asdf-format/asdf/commit/6f79f620b4632e20178d9bd53528702605d3e976.patch";
+      hash = "sha256-h/dYhXRCf5oIIC+u6+8C91mJnmEzuNmlEzqc0UEhLy0=";
+      excludes = [
+          "CHANGES.rst"
+      ];
+    })
+  ];
+
+  postPatch = ''
+    # https://github.com/asdf-format/asdf/pull/1203
+    substituteInPlace pyproject.toml \
+      --replace "'jsonschema >=4.0.1, <4.10.0'," "'jsonschema >=4.0.1',"
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    asdf-standard
+    asdf-transform-schemas
+    jmespath
+    jsonschema
+    numpy
+    packaging
+    pyyaml
+    semantic-version
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ];
+
+  nativeCheckInputs = [
+    astropy
+    lz4
+    pytest-astropy
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export PY_IGNORE_IMPORTMISMATCH=1
+  '';
+
+  pythonImportsCheck = [
+    "asdf"
+  ];
+
+  disabledTests = [
+    "config.rst"
+  ];
+
+  meta = with lib; {
+    description = "Python tools to handle ASDF files";
+    homepage = "https://github.com/asdf-format/asdf";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+    # Many tests fail, according to Hydra
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ase/default.nix b/nixpkgs/pkgs/development/python-modules/ase/default.nix
new file mode 100644
index 000000000000..cad89cd576b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ase/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, isPy27
+, numpy
+, scipy
+, matplotlib
+, flask
+, pillow
+, psycopg2
+}:
+
+buildPythonPackage rec {
+  pname = "ase";
+  version = "3.22.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-AE32sOoEsRFMeQ+t/kXUEl6w5TElxmqTQlr4U9gqtDI=";
+  };
+
+  propagatedBuildInputs = [ numpy scipy matplotlib flask pillow psycopg2 ];
+
+  checkPhase = ''
+    $out/bin/ase test
+  '';
+
+  # tests just hang most likely due to something with subprocesses and cli
+  doCheck = false;
+
+  pythonImportsCheck = [ "ase" ];
+
+  meta = with lib; {
+    description = "Atomic Simulation Environment";
+    homepage = "https://wiki.fysik.dtu.dk/ase/";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asf-search/default.nix b/nixpkgs/pkgs/development/python-modules/asf-search/default.nix
new file mode 100644
index 000000000000..69c452ecb153
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asf-search/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, dateparser
+, defusedxml
+, fetchFromGitHub
+, importlib-metadata
+, numpy
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pytz
+, remotezip
+, requests
+, requests-mock
+, shapely
+, tenacity
+}:
+
+buildPythonPackage rec {
+  pname = "asf-search";
+  version = "6.6.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "asfadmin";
+    repo = "Discovery-asf_search";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-w4xpCqNal0BHsmf1cL4k/DKzs/e9WQXTQNJNs8puJUU=";
+  };
+
+  propagatedBuildInputs = [
+    dateparser
+    importlib-metadata
+    numpy
+    python-dateutil
+    pytz
+    remotezip
+    requests
+    shapely
+  ];
+
+  nativeCheckInputs = [
+    defusedxml
+    pytestCheckHook
+    requests-mock
+    tenacity
+  ];
+
+  pythonImportsCheck = [
+    "asf_search"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/asfadmin/Discovery-asf_search/blob/${src.rev}/CHANGELOG.md";
+    description = "Python wrapper for the ASF SearchAPI";
+    homepage = "https://github.com/asfadmin/Discovery-asf_search";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bzizou ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asgi-csrf/default.nix b/nixpkgs/pkgs/development/python-modules/asgi-csrf/default.nix
new file mode 100644
index 000000000000..062d3259b82a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asgi-csrf/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitHub
+, itsdangerous
+, python-multipart
+, pytestCheckHook
+, starlette
+, httpx
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  version = "0.9";
+  pname = "asgi-csrf";
+  disabled = isPy27;
+
+  # PyPI tarball doesn't include tests directory
+  src = fetchFromGitHub {
+    owner = "simonw";
+    repo = pname;
+    rev = version;
+    hash = "sha256-mmOsN2mW6eGtapq3xLqHK8hhSD0Gjzp3DsY5AGUlI8g=";
+  };
+
+  propagatedBuildInputs = [
+    itsdangerous
+    python-multipart
+  ];
+
+  nativeCheckInputs = [
+    httpx
+    pytest-asyncio
+    pytestCheckHook
+    starlette
+  ];
+
+  doCheck = false; # asgi-lifespan missing
+
+  pythonImportsCheck = [ "asgi_csrf" ];
+
+  meta = with lib; {
+    description = "ASGI middleware for protecting against CSRF attacks";
+    license = licenses.asl20;
+    homepage = "https://github.com/simonw/asgi-csrf";
+    maintainers = [ maintainers.ris ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asgineer/default.nix b/nixpkgs/pkgs/development/python-modules/asgineer/default.nix
new file mode 100644
index 000000000000..2559cda2a018
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asgineer/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "asgineer";
+  version = "0.8.1";
+
+  # PyPI tarball doesn't include tests directory
+  src = fetchFromGitHub {
+    owner = "almarklein";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0hd1i9pc8m7sc8bkn31q4ygkmnl5vklrcziq9zkdiqaqm8clyhcx";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests
+  ];
+
+  meta = with lib; {
+    description = "A really thin ASGI web framework";
+    license = licenses.bsd2;
+    homepage = "https://asgineer.readthedocs.io";
+    maintainers = [ maintainers.matthiasbeyer ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/asgiref/default.nix b/nixpkgs/pkgs/development/python-modules/asgiref/default.nix
new file mode 100644
index 000000000000..11fd868ebd91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asgiref/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  version = "3.7.2";
+  pname = "asgiref";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "django";
+    repo = "asgiref";
+    rev = "refs/tags/${version}";
+    hash = "sha256-VW1PBh6+nLMD7qxmL83ymuxCPYKVY3qGKsB7ZiMqMu8=";
+  };
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    "test_multiprocessing"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [ "asgiref" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/django/asgiref/blob/${src.rev}/CHANGELOG.txt";
+    description = "Reference ASGI adapters and channel layers";
+    homepage = "https://github.com/django/asgiref";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asks/default.nix b/nixpkgs/pkgs/development/python-modules/asks/default.nix
new file mode 100644
index 000000000000..8be9a9b21160
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asks/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, anyio
+, async-generator
+, h11
+, curio
+, overly
+, pytestCheckHook
+, trio
+}:
+
+buildPythonPackage rec {
+  pname = "asks";
+  version = "3.0.0";
+
+  disabled = pythonOlder "3.6";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "theelous3";
+    repo = "asks";
+    rev = "v${version}";
+    hash = "sha256-ipQ5n2386DqR3kNpmTVhNPG+LC7gfCbvrlZ97+UP55g=";
+  };
+
+  propagatedBuildInputs = [
+    anyio
+    async-generator
+    h11
+  ];
+
+  nativeCheckInputs = [
+    curio
+    overly
+    pytestCheckHook
+    trio
+  ];
+
+  pythonImportsCheck = [ "asks" ];
+
+  meta = {
+    description = "Async requests-like HTTP library for Python";
+    homepage = "https://github.com/theelous3/asks";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asmog/default.nix b/nixpkgs/pkgs/development/python-modules/asmog/default.nix
new file mode 100644
index 000000000000..a1d8c340ba68
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asmog/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "asmog";
+  version = "0.0.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "14b8hdxcks6qyrqpp4mm77fvzznbskqn7fw9qgwgcqx81pg45iwk";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # Project doesn't ship the tests
+  # https://github.com/kstaniek/python-ampio-smog-api/issues/2
+  doCheck = false;
+
+  pythonImportsCheck = [ "asmog" ];
+
+  meta = with lib; {
+    description = "Python module for Ampio Smog Sensors";
+    homepage = "https://github.com/kstaniek/python-ampio-smog-api";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asn1/default.nix b/nixpkgs/pkgs/development/python-modules/asn1/default.nix
new file mode 100644
index 000000000000..4e62df50aff5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asn1/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, future
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "asn1";
+  version = "2.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "andrivet";
+    repo = "python-asn1";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-pXLG2Mkrv6EeJn6Dk+SefzNtrPdQ6of95LbVTKjTADQ=";
+  };
+
+  propagatedBuildInputs = [
+    future
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "enum-compat" ""
+  '';
+
+  pytestFlagsArray = [
+    "tests/test_asn1.py"
+  ];
+
+  pythonImportsCheck = [
+    "asn1"
+  ];
+
+  meta = with lib; {
+    description = "Python ASN.1 encoder and decoder";
+    homepage = "https://github.com/andrivet/python-asn1";
+    changelog = "https://github.com/andrivet/python-asn1/blob/v${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asn1ate/default.nix b/nixpkgs/pkgs/development/python-modules/asn1ate/default.nix
new file mode 100644
index 000000000000..a141fc746f78
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asn1ate/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pyparsing }:
+
+buildPythonPackage rec {
+  pname = "asn1ate";
+  version= "0.6";
+
+  src = fetchFromGitHub {
+    sha256 = "1p8hv4gsyqsdr0gafcq497n52pybiqmc22di8ai4nsj60fv0km45";
+    rev = "v${version}";
+    owner = "kimgr";
+    repo = pname;
+  };
+
+  propagatedBuildInputs = [ pyparsing ];
+
+  meta = with lib; {
+    description = "Python library for translating ASN.1 into other forms";
+    license = licenses.bsd3;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ leenaars ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asn1crypto/default.nix b/nixpkgs/pkgs/development/python-modules/asn1crypto/default.nix
new file mode 100644
index 000000000000..4822c5a16ac8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asn1crypto/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "asn1crypto";
+  version = "1.5.1";
+  format = "setuptools";
+
+  # Pulling from Github to run tests
+  src = fetchFromGitHub {
+    owner = "wbond";
+    repo = "asn1crypto";
+    rev = version;
+    hash = "sha256-M8vASxhaJPgkiTrAckxz7gk/QHkrFlNz7fFbnLEBT+M=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = {
+    description = "Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, PKCS#5, X.509 and TSP";
+    license = lib.licenses.mit;
+    homepage = "https://github.com/wbond/asn1crypto";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asn1tools/default.nix b/nixpkgs/pkgs/development/python-modules/asn1tools/default.nix
new file mode 100644
index 000000000000..89abcb152639
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asn1tools/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, bitstruct
+, diskcache
+, prompt-toolkit
+, pyparsing
+, python
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "asn1tools";
+  version = "0.166.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "eerimoq";
+    repo = "asn1tools";
+    rev = version;
+    hash = "sha256-TWAOML6nsLX3TYqoQ9fcSjrUmC4byXOfczfkmSaSa0k=";
+  };
+
+  propagatedBuildInputs = [
+    bitstruct
+    pyparsing
+  ];
+
+  passthru.optional-depdendencies = {
+    shell = [
+      prompt-toolkit
+    ];
+    cache = [
+      diskcache
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-depdendencies);
+
+
+  pythonImportsCheck = [
+    "asn1tools"
+  ];
+
+  meta = with lib; {
+    description = "ASN.1 parsing, encoding and decoding";
+    homepage = "https://github.com/eerimoq/asn1tools";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aspectlib/default.nix b/nixpkgs/pkgs/development/python-modules/aspectlib/default.nix
new file mode 100644
index 000000000000..70fd8e8db2e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aspectlib/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, fetchpatch
+, setuptools
+, fields
+, process-tests
+, pytestCheckHook
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "aspectlib";
+  version = "2.0.0";
+
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-pLRhudoLUxrry5PvzePegIpyxgIm3Y2QLEZ9E/r3zpI=";
+  };
+
+  patches = [
+    # https://github.com/ionelmc/python-aspectlib/pull/25
+    (fetchpatch {
+      name = "darwin-compat.patch";
+      url = "https://github.com/ionelmc/python-aspectlib/commit/ef2c12304f08723dc8e79d1c59bc32c946d758dc.patch";
+      hash = "sha256-gtPFtwDsGIMkHTyuoiLk+SAGgB2Wyx/Si9HIdoIsvI8=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    fields
+  ];
+
+  pythonImportsCheck = [
+    "aspectlib"
+    "aspectlib.contrib"
+    "aspectlib.debug"
+    "aspectlib.test"
+  ];
+
+  checkInputs = [
+    process-tests
+    pytestCheckHook
+    tornado
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = {
+    changelog = "https://github.com/ionelmc/python-aspectlib/blob/v${version}/CHANGELOG.rst";
+    description = "Aspect-oriented programming, monkey-patch and decorators library";
+    homepage = "https://github.com/ionelmc/python-aspectlib";
+    license = lib.licenses.bsd2;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aspell-python/default.nix b/nixpkgs/pkgs/development/python-modules/aspell-python/default.nix
new file mode 100644
index 000000000000..1af34b43fc29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aspell-python/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, aspell
+, aspellDicts
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pytestCheckHook
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "aspell-python";
+  version = "1.15";
+  format = "setuptools";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    pname = "aspell-python-py3";
+    inherit version;
+    extension = "tar.bz2";
+    hash = "sha256-IEKRDmQY5fOH9bQk0dkUAy7UzpBOoZW4cNtVvLMcs40=";
+  };
+
+  buildInputs = [
+    aspell
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export ASPELL_CONF="dict-dir ${aspellDicts.en}/lib/aspell"
+    export HOME=$(mktemp -d)
+  '';
+
+  pytestFlagsArray = [
+    "test/unittests.py"
+  ];
+
+  disabledTests = lib.optionals (pythonAtLeast "3.10") [
+    # https://github.com/WojciechMula/aspell-python/issues/22
+    "test_add"
+    "test_get"
+    "test_saveall"
+  ];
+
+  pythonImportsCheck = [
+    "aspell"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for aspell (C extension and Python version)";
+    homepage = "https://github.com/WojciechMula/aspell-python";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aspy-refactor-imports/default.nix b/nixpkgs/pkgs/development/python-modules/aspy-refactor-imports/default.nix
new file mode 100644
index 000000000000..8eff00db43d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aspy-refactor-imports/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "aspy-refactor-imports";
+  version = "3.0.1";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "asottile";
+    repo = "aspy.refactor_imports";
+    rev = "v${version}";
+    sha256 = "MlCM3zNTQZJ1RWrTQG0AN28RUepWINKCeLENykbu2nw=";
+  };
+
+  pythonImportsCheck = [
+    "aspy.refactor_imports"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # fails on darwin due to case-insensitive file system
+  disabledTests = lib.optionals stdenv.isDarwin ["test_application_directory_case"];
+
+  meta = with lib; {
+    description = "Utilities for refactoring imports in python-like syntax.";
+    homepage = "https://github.com/asottile/aspy.refactor_imports";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aspy.yaml/default.nix b/nixpkgs/pkgs/development/python-modules/aspy.yaml/default.nix
new file mode 100644
index 000000000000..5abe60742747
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aspy.yaml/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, pyyaml }:
+
+buildPythonPackage rec {
+  pname = "aspy.yaml";
+  version = "1.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0i9z2jm2hjwdxdv4vw4kbs70h2ciz49rv8w73zbawb7z5qw45iz7";
+  };
+
+  propagatedBuildInputs = [ pyyaml ];
+
+  # Tests not included in PyPI tarball
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A few extensions to pyyaml";
+    homepage = "https://github.com/asottile/aspy.yaml";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/assay/default.nix b/nixpkgs/pkgs/development/python-modules/assay/default.nix
new file mode 100644
index 000000000000..881c4bbf730e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/assay/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonAtLeast }:
+
+buildPythonPackage rec {
+  pname = "assay";
+  version = "unstable-2022-01-19";
+
+  src = fetchFromGitHub {
+    owner = "brandon-rhodes";
+    repo = pname;
+    rev = "bb62d1f7d51d798b05a88045fff3a2ff92c299c3";
+    hash = "sha256-FuAD74mFJ9F9AMgB3vPmODAlZKgPR7FQ4yn7HEBS5Rw=";
+  };
+
+  pythonImportsCheck = [ "assay" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/brandon-rhodes/assay";
+    description = "Attempt to write a Python testing framework I can actually stand";
+    license = licenses.mit;
+    maintainers = with maintainers; [ zane ];
+    broken = pythonAtLeast "3.11";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/assertpy/default.nix b/nixpkgs/pkgs/development/python-modules/assertpy/default.nix
new file mode 100644
index 000000000000..1800a14d507c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/assertpy/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "assertpy";
+  version = "1.1";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    sha256 = "0hnfh45cmqyp7zasrllwf8gbq3mazqlhhk0sq1iqlh6fig0yfq2f";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "assertpy"
+  ];
+
+  meta = with lib; {
+    description = "Simple assertion library for unit testing with a fluent API";
+    homepage = "https://github.com/assertpy/assertpy";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asterisk-mbox/default.nix b/nixpkgs/pkgs/development/python-modules/asterisk-mbox/default.nix
new file mode 100644
index 000000000000..0da70911a17c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asterisk-mbox/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "asterisk-mbox";
+  version = "0.5.0";
+
+  src = fetchPypi {
+    pname = "asterisk_mbox";
+    inherit version;
+    sha256 = "0624f9ab85ce9c4d43655f8653e8539fa10c81b60fd7b94b1a15dce306c20888";
+  };
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "asterisk_mbox" ];
+
+  meta = with lib; {
+    description = "The client side of a client/server to interact with Asterisk voicemail mailboxes";
+    homepage = "https://github.com/PhracturedBlue/asterisk_mbox";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asteval/default.nix b/nixpkgs/pkgs/development/python-modules/asteval/default.nix
new file mode 100644
index 000000000000..49abd982a0f0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asteval/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "asteval";
+  version = "0.9.31";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "newville";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-XIRDm/loZOOPQ7UO/XAo86TzhtHHRrnWFU7MNI4f1vM=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --cov=asteval --cov-report xml" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "asteval"
+  ];
+
+  disabledTests = [
+    # AssertionError: 'ImportError' != None
+    "test_set_default_nodehandler"
+  ];
+
+  meta = with lib; {
+    description = "AST evaluator of Python expression using ast module";
+    homepage = "https://github.com/newville/asteval";
+    changelog = "https://github.com/newville/asteval/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/astor/default.nix b/nixpkgs/pkgs/development/python-modules/astor/default.nix
new file mode 100644
index 000000000000..f69afaf55252
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astor/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "astor";
+  version = "0.8.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ppscdzzvxpznclkmhhj53iz314x3pfv4yc7c6gwxqgljgdgyvka";
+  };
+
+  # disable tests broken with python3.6: https://github.com/berkerpeksag/astor/issues/89
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # https://github.com/berkerpeksag/astor/issues/196
+    "test_convert_stdlib"
+    # https://github.com/berkerpeksag/astor/issues/212
+    "test_huge_int"
+  ];
+
+  meta = with lib; {
+    description = "Library for reading, writing and rewriting python AST";
+    homepage = "https://github.com/berkerpeksag/astor";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ nixy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/astral/default.nix b/nixpkgs/pkgs/development/python-modules/astral/default.nix
new file mode 100644
index 000000000000..40f66dc26ab4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astral/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+# build
+, poetry-core
+
+# runtime
+, backports-zoneinfo
+
+# tests
+, pytestCheckHook
+, freezegun
+}:
+
+buildPythonPackage rec {
+  pname = "astral";
+  version = "3.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-m3w7QS6eadFyz7JL4Oat3MnxvQGijbi+vmbXXMxTPYg=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.9") [
+    backports-zoneinfo
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/sffjunkie/astral/releases/tag/${version}";
+    description = "Calculations for the position of the sun and the moon";
+    homepage = "https://github.com/sffjunkie/astral/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ flokli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/astroid/default.nix b/nixpkgs/pkgs/development/python-modules/astroid/default.nix
new file mode 100644
index 000000000000..5fd0a5281b2c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astroid/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, isPyPy
+, lazy-object-proxy
+, setuptools
+, wheel
+, typing-extensions
+, typed-ast
+, pip
+, pylint
+, pytestCheckHook
+, wrapt
+}:
+
+buildPythonPackage rec {
+  pname = "astroid";
+  version = "2.15.6"; # Check whether the version is compatible with pylint
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7.2";
+
+  src = fetchFromGitHub {
+    owner = "PyCQA";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-0oNNEVD8rYGkM11nGUD+XMwE7xgk7mJIaplrAXaECFg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    lazy-object-proxy
+    wrapt
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    typing-extensions
+  ] ++ lib.optionals (!isPyPy && pythonOlder "3.8") [
+    typed-ast
+  ];
+
+  nativeCheckInputs = [
+    pip
+    pytestCheckHook
+    typing-extensions
+  ];
+
+  disabledTests = [
+    # DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('tests.testdata.python3.data.path_pkg_resources_1.package')`.
+    "test_identify_old_namespace_package_protocol"
+  ];
+
+  passthru.tests = {
+    inherit pylint;
+  };
+
+  meta = with lib; {
+    changelog = "https://github.com/PyCQA/astroid/blob/${src.rev}/ChangeLog";
+    description = "An abstract syntax tree for Python with inference support";
+    homepage = "https://github.com/PyCQA/astroid";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/astropy-extension-helpers/default.nix b/nixpkgs/pkgs/development/python-modules/astropy-extension-helpers/default.nix
new file mode 100644
index 000000000000..d02ed1236154
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astropy-extension-helpers/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, findutils
+, pytestCheckHook
+, pythonOlder
+, pip
+, setuptools-scm
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "extension-helpers";
+  version = "1.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-SUYMeKP40fjOwXRHn16FrURZSMzEFgM8WqPm3fLFAik=";
+  };
+
+  patches = [
+    # Not needed to allow this package to build, but meant for it's dependent
+    # packages, like astropy. See explanation at:
+    # https://github.com/astropy/extension-helpers/pull/59
+    (fetchpatch {
+      url = "https://github.com/astropy/extension-helpers/commit/796f3e7831298df2d26b6d994b13fd57061a56d1.patch";
+      hash = "sha256-NnqK9HQq1hQ66RUJf9gTCuLyA0BVqVtL292mSXJ9860=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+    wheel
+  ];
+
+  nativeCheckInputs = [
+    findutils
+    pip
+    pytestCheckHook
+  ];
+
+  # avoid import mismatch errors, as conftest.py is copied to build dir
+  pytestFlagsArray = [
+    "extension_helpers"
+  ];
+
+  disabledTests = [
+    # https://github.com/astropy/extension-helpers/issues/43
+    "test_write_if_different"
+  ];
+
+  pythonImportsCheck = [
+    "extension_helpers"
+  ];
+
+  meta = with lib; {
+    description = "Utilities for building and installing packages in the Astropy ecosystem";
+    homepage = "https://github.com/astropy/extension-helpers";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ rmcgibbo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/astropy-healpix/default.nix b/nixpkgs/pkgs/development/python-modules/astropy-healpix/default.nix
new file mode 100644
index 000000000000..0d66f4c728dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astropy-healpix/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, numpy
+, astropy
+, astropy-extension-helpers
+, setuptools-scm
+, pytestCheckHook
+, pytest-doctestplus
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "astropy-healpix";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit version;
+    pname = lib.replaceStrings ["-"] ["_"] pname;
+    hash = "sha256-9ILvYqEOaGMD84xm8I3xe53e5a2CIZwjVx7oDXar7qM=";
+  };
+
+  patches = [
+    # remove on next udpate. make Numpy loop function args const correct.
+    # https://github.com/astropy/astropy-healpix/pull/199
+    (fetchpatch {
+      name = "numpy-const-args-match.patch";
+      url = "https://github.com/astropy/astropy-healpix/commit/ccf6d9ea4be131f56646adbd7bc482bfcd84f21c.patch";
+      hash = "sha256-fpDxTbs3sHJSb4mnveorM+wlseXbZu1biGyBTNC9ZUo=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    astropy-extension-helpers
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    astropy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-doctestplus
+    hypothesis
+  ];
+
+  disabledTests = lib.optional (!stdenv.hostPlatform.isDarwin) "test_interpolate_bilinear_skycoord";
+
+  # tests must be run in the build directory
+  preCheck = ''
+    cd build/lib*
+  '';
+
+  meta = with lib; {
+    description = "BSD-licensed HEALPix for Astropy";
+    homepage = "https://github.com/astropy/astropy-healpix";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.smaret ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/astropy-helpers/default.nix b/nixpkgs/pkgs/development/python-modules/astropy-helpers/default.nix
new file mode 100644
index 000000000000..dd8897ab1390
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astropy-helpers/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "astropy-helpers";
+  version = "4.0.1";
+
+  disabled = !isPy3k;
+
+  doCheck = false; # tests requires sphinx-astropy
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f1096414d108778218d6bea06d4d9c7b2ff7c83856a451331ac194e74de9f413";
+  };
+
+  meta = with lib; {
+    description = "Utilities for building and installing Astropy, Astropy affiliated packages, and their respective documentation";
+    homepage = "https://github.com/astropy/astropy-helpers";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.smaret ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/astropy/default.nix b/nixpkgs/pkgs/development/python-modules/astropy/default.nix
new file mode 100644
index 000000000000..0a70e40e9e8a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astropy/default.nix
@@ -0,0 +1,91 @@
+{ lib
+, fetchPypi
+, fetchpatch
+, buildPythonPackage
+, pythonOlder
+
+# build time
+, astropy-extension-helpers
+, cython
+, jinja2
+, oldest-supported-numpy
+, setuptools-scm
+, wheel
+# testing
+, pytestCheckHook
+, pytest-xdist
+, pytest-astropy
+, python
+
+# runtime
+, numpy
+, packaging
+, pyerfa
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "astropy";
+  version = "5.3.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8"; # according to setup.cfg
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-1JD34vqsLMwBySRCAtYpFUJZr4qXkQTO2J3ErOTm8dg=";
+  };
+  # Relax cython dependency to allow this to build, upstream only doesn't
+  # support cython 3 as of writing. See:
+  # https://github.com/astropy/astropy/issues/15315
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'cython==' 'cython>='
+  '';
+
+  nativeBuildInputs = [
+    astropy-extension-helpers
+    cython
+    jinja2
+    oldest-supported-numpy
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    packaging
+    pyerfa
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-xdist
+    pytest-astropy
+  ];
+
+  # Not running it inside the build directory. See:
+  # https://github.com/astropy/astropy/issues/15316#issuecomment-1722190547
+  preCheck = ''
+    cd "$out"
+    export HOME="$(mktemp -d)"
+    export OMP_NUM_THREADS=$(( $NIX_BUILD_CORES / 4 ))
+  '';
+  pythonImportsCheck = [
+    "astropy"
+  ];
+  disabledTests = [
+    # May fail due to parallelism, see:
+    # https://github.com/astropy/astropy/issues/15441
+    "TestUnifiedOutputRegistry"
+  ];
+
+  meta = {
+    description = "Astronomy/Astrophysics library for Python";
+    homepage = "https://www.astropy.org";
+    license = lib.licenses.bsd3;
+    platforms = lib.platforms.all;
+    maintainers = with lib.maintainers; [ kentjames doronbehar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/astroquery/default.nix b/nixpkgs/pkgs/development/python-modules/astroquery/default.nix
new file mode 100644
index 000000000000..610238559a2c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astroquery/default.nix
@@ -0,0 +1,76 @@
+{ pkgs
+, buildPythonPackage
+, fetchPypi
+, astropy
+, requests
+, keyring
+, beautifulsoup4
+, html5lib
+, matplotlib
+, pillow
+, pytest
+, pytest-astropy
+, pytestCheckHook
+, pyvo
+, astropy-helpers
+, setuptools
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "astroquery";
+  version = "0.4.6";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MHylVMtzSgypoi+G9e/+fkE6+ROuZeFXiXLYR7H+E+4=";
+  };
+
+  disabled = !isPy3k;
+
+  propagatedBuildInputs = [
+    astropy
+    requests
+    keyring
+    beautifulsoup4
+    html5lib
+    pyvo
+  ];
+
+  nativeBuildInputs = [ astropy-helpers setuptools ];
+
+  # Disable automatic update of the astropy-helper module
+  postPatch = ''
+    substituteInPlace setup.cfg --replace "auto_use = True" "auto_use = False"
+  '';
+
+  nativeCheckInputs = [
+    matplotlib
+    pillow
+    pytest
+    pytest-astropy
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    # DeprecationWarning: 'cgi' is deprecated and slated for removal in Python 3.13
+    "-W" "ignore::DeprecationWarning"
+  ];
+
+  # Tests must be run in the build directory. The tests create files
+  # in $HOME/.astropy so we need to set HOME to $TMPDIR.
+  preCheck = ''
+    export HOME=$TMPDIR
+    cd build/lib
+  '';
+
+  pythonImportsCheck = [ "astroquery" ];
+
+  meta = with pkgs.lib; {
+    description = "Functions and classes to access online data resources";
+    homepage = "https://astroquery.readthedocs.io/";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.smaret ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asttokens/default.nix b/nixpkgs/pkgs/development/python-modules/asttokens/default.nix
new file mode 100644
index 000000000000..452abd626e0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asttokens/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, setuptools-scm
+, six
+, astroid
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "asttokens";
+  version = "2.4.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-LgFxuZGyyVmsxsSTGASSNoRKXaHWW6JnLEiAwciUg04=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    astroid
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Test is currently failing on Hydra, works locally
+    "test_slices"
+  ];
+
+  disabledTestPaths = [
+    # incompatible with astroid 2.11.0, pins <= 2.5.3
+    "tests/test_astroid.py"
+  ];
+
+  pythonImportsCheck = [ "asttokens" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/gristlabs/asttokens";
+    description = "Annotate Python AST trees with source text and token information";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ leenaars ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/astunparse/default.nix b/nixpkgs/pkgs/development/python-modules/astunparse/default.nix
new file mode 100644
index 000000000000..b32df24f5bbd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/astunparse/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, six
+, wheel
+ }:
+
+buildPythonPackage rec {
+  pname = "astunparse";
+  version =  "1.6.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872";
+  };
+
+  propagatedBuildInputs = [ six wheel ];
+
+  # tests not included with pypi release
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is a factored out version of unparse found in the Python source distribution";
+    homepage = "https://github.com/simonpercivall/astunparse";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jyp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asyauth/default.nix b/nixpkgs/pkgs/development/python-modules/asyauth/default.nix
new file mode 100644
index 000000000000..a08a20831f1b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyauth/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, asn1crypto
+, asysocks
+, buildPythonPackage
+, fetchPypi
+, minikerberos
+, pythonOlder
+, unicrypto
+}:
+
+buildPythonPackage rec {
+  pname = "asyauth";
+  version = "0.0.16";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ktmL2EFWDTzZwhxfleYEeJtMiiDP28JaCGbsvxx73Ok=";
+  };
+
+  propagatedBuildInputs = [
+    asn1crypto
+    asysocks
+    minikerberos
+    unicrypto
+  ];
+
+  # Project doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "asyauth"
+  ];
+
+  meta = with lib; {
+    description = "Unified authentication library";
+    homepage = "https://github.com/skelsec/asyauth";
+    changelog = "https://github.com/skelsec/asyauth/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/async-dns/default.nix b/nixpkgs/pkgs/development/python-modules/async-dns/default.nix
new file mode 100644
index 000000000000..375e72d24fdd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/async-dns/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "async-dns";
+  version = "2.0.0";
+  disabled = pythonOlder "3.6";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "gera2ld";
+    repo = "async_dns";
+    rev = "v${version}";
+    sha256 = "0vn7hxvpzikd7q61a27fwzal4lwsra2063awyr6fjpy6lh3cjdwf";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  checkPhase = ''
+    export HOME=$TMPDIR
+    # Test needs network access
+    rm -r tests/resolver
+    ${python.interpreter} -m unittest
+  '';
+
+  pythonImportsCheck = [ "async_dns" ];
+
+  meta = with lib; {
+    description = "Python DNS library";
+    homepage = "https://github.com/gera2ld/async_dns";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/async-generator/default.nix b/nixpkgs/pkgs/development/python-modules/async-generator/default.nix
new file mode 100644
index 000000000000..17014a410d4c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/async-generator/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "async-generator";
+  version = "1.10";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    pname = "async_generator";
+    inherit version;
+    hash = "sha256-brs9EGwSkgqq5CzLb3h+9e79zdFm6j1ij6hHar5xIUQ=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "async_generator" ];
+
+  meta = with lib; {
+    description = "Async generators and context managers for Python 3.5+";
+    homepage = "https://github.com/python-trio/async_generator";
+    license = with licenses; [ mit asl20 ];
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/async-interrupt/default.nix b/nixpkgs/pkgs/development/python-modules/async-interrupt/default.nix
new file mode 100644
index 000000000000..b6e16f54963d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/async-interrupt/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "async-interrupt";
+  version = "1.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = "async_interrupt";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-mbvOj1ybCkDNr3je3PtFwmddkh2k/nHOerpC6hGSUYI=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=async_interrupt --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "async_interrupt"
+  ];
+
+  meta = with lib; {
+    description = "Context manager to raise an exception when a future is done";
+    homepage = "https://github.com/bdraco/async_interrupt";
+    changelog = "https://github.com/bdraco/async_interrupt/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/async-lru/default.nix b/nixpkgs/pkgs/development/python-modules/async-lru/default.nix
new file mode 100644
index 000000000000..2f4ef7262acd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/async-lru/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, typing-extensions
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "async-lru";
+  version = "2.0.4";
+
+  disabled = pythonOlder "3.8";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = "async-lru";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-S2sOkgtS+YdMtVP7UHD3+oR8Fem8roLhhgVVfh33PcM=";
+  };
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.11") [
+    typing-extensions
+  ];
+
+  postPatch = ''
+    sed -i -e '/^addopts/d' -e '/^filterwarnings/,+2d' setup.cfg
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  pythonImportsCheck = [ "async_lru" ];
+
+  meta = with lib; {
+    description = "Simple lru cache for asyncio";
+    homepage = "https://github.com/wikibusiness/async_lru";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/async-modbus/default.nix b/nixpkgs/pkgs/development/python-modules/async-modbus/default.nix
new file mode 100644
index 000000000000..05d926744352
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/async-modbus/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, connio
+, fetchFromGitHub
+, fetchpatch
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, umodbus
+}:
+
+buildPythonPackage rec {
+  pname = "async-modbus";
+  version = "0.2.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tiagocoutinho";
+    repo = "async_modbus";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-OTt/rUa3KLVSFOIUyMNHnqHvPtISxTposNFAgoixRfk=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # Fix tests; https://github.com/tiagocoutinho/async_modbus/pull/13
+      url = "https://github.com/tiagocoutinho/async_modbus/commit/d81d8ffe94870f0f505e0c8a0694768c98053ecc.patch";
+      hash = "sha256-mG3XO2nAFYitatkswU7er29BJc/A0IL1rL2Zu4daZ7k=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"--cov=async_modbus",' "" \
+      --replace '"--cov-report=html", "--cov-report=term",' "" \
+      --replace '"--durations=2", "--verbose"' ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    connio
+    umodbus
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "async_modbus"
+  ];
+
+  meta = with lib; {
+    description = "Library for Modbus communication";
+    homepage = "https://github.com/tiagocoutinho/async_modbus";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/async-modbus/fix-tests.patch b/nixpkgs/pkgs/development/python-modules/async-modbus/fix-tests.patch
new file mode 100644
index 000000000000..1c9dd605f5b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/async-modbus/fix-tests.patch
@@ -0,0 +1,73 @@
+diff --git a/tests/test_async_modbus.py b/tests/test_async_modbus.py
+index b0bd3fd..6b8df87 100644
+--- a/tests/test_async_modbus.py
++++ b/tests/test_async_modbus.py
+@@ -194,7 +194,7 @@ async def test_read_coils(proto, slave_id, starting_address, expected_reply):
+             await coro
+     else:
+         reply = await coro
+-        assert (reply == expected_reply).all()
++        assert reply == expected_reply
+ 
+     server = Server(slave_id, starting_address, expected_reply)
+     client = AsyncClient(server, protocol)
+@@ -204,7 +204,7 @@ async def test_read_coils(proto, slave_id, starting_address, expected_reply):
+             await coro
+     else:
+         reply = await coro
+-        assert (reply == expected_reply).all()
++        assert reply == expected_reply
+ 
+ 
+ @pytest.mark.asyncio
+@@ -273,7 +273,7 @@ async def test_read_discrete_inputs(proto, slave_id, starting_address, expected_
+             await coro
+     else:
+         reply = await coro
+-        assert (reply == expected_reply).all()
++        assert reply == expected_reply
+ 
+     server = Server(slave_id, starting_address, expected_reply)
+     client = AsyncClient(server, protocol)
+@@ -283,7 +283,7 @@ async def test_read_discrete_inputs(proto, slave_id, starting_address, expected_
+             await coro
+     else:
+         reply = await coro
+-        assert (reply == expected_reply).all()
++        assert reply == expected_reply
+ 
+ 
+ @pytest.mark.asyncio
+@@ -306,7 +306,7 @@ async def test_read_holding_registers(
+             await coro
+     else:
+         reply = await coro
+-        assert (reply == expected_reply).all()
++        assert reply == expected_reply
+ 
+     server = Server(slave_id, starting_address, expected_reply)
+     client = AsyncClient(server, protocol)
+@@ -316,7 +316,7 @@ async def test_read_holding_registers(
+             await coro
+     else:
+         reply = await coro
+-        assert (reply == expected_reply).all()
++        assert reply == expected_reply
+ 
+ 
+ @pytest.mark.asyncio
+@@ -383,7 +383,7 @@ async def test_read_input_registers(proto, slave_id, starting_address, expected_
+             await coro
+     else:
+         reply = await coro
+-        assert (reply == expected_reply).all()
++        assert reply == expected_reply
+ 
+     server = Server(slave_id, starting_address, expected_reply)
+     client = AsyncClient(server, protocol)
+@@ -393,4 +393,4 @@ async def test_read_input_registers(proto, slave_id, starting_address, expected_
+             await coro
+     else:
+         reply = await coro
+-        assert (reply == expected_reply).all()
++        assert reply == expected_reply
diff --git a/nixpkgs/pkgs/development/python-modules/async-stagger/default.nix b/nixpkgs/pkgs/development/python-modules/async-stagger/default.nix
new file mode 100644
index 000000000000..379056ad56f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/async-stagger/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytestCheckHook
+, pytest-asyncio
+, pytest-mock
+}:
+
+buildPythonPackage rec {
+  pname = "async-stagger";
+  version = "0.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "async_stagger";
+    inherit version;
+    hash = "sha256-qp81fp79J36aUWqUvegSStXkZ+m8Zcn62qrJjpVqQ9Y=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+    pytest-mock
+  ];
+
+  disabledTests = [
+    # RuntimeError: Logic bug in...
+    "test_stagger_coro_gen"
+  ];
+
+  pythonImportsCheck = [
+    "async_stagger"
+  ];
+
+  meta = with lib; {
+    description = "Happy Eyeballs connection algorithm and underlying scheduling logic in asyncio";
+    homepage = "https://github.com/twisteroidambassador/async_stagger";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/async-timeout/default.nix b/nixpkgs/pkgs/development/python-modules/async-timeout/default.nix
new file mode 100644
index 000000000000..59c8b51fbb67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/async-timeout/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "async-timeout";
+  version = "4.0.3";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-RkDZa+hNgtAu1Z6itxBaD3szq+hwNwPNCrC/h8QnUi8=";
+  };
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  # Circular dependency on aiohttp
+  doCheck = false;
+
+  meta = {
+    description = "Timeout context manager for asyncio programs";
+    homepage = "https://github.com/aio-libs/async_timeout/";
+    license = lib.licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/async-tkinter-loop/default.nix b/nixpkgs/pkgs/development/python-modules/async-tkinter-loop/default.nix
new file mode 100644
index 000000000000..d376ec154263
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/async-tkinter-loop/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python3Packages
+, poetry-core
+, tkinter
+, pythonRelaxDepsHook
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "async-tkinter-loop";
+  version = "0.9.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "async_tkinter_loop";
+    hash = "sha256-YwmW+zXAx9TAxgoRLEr7/3o1rrO4eSNScuoTh3ud2Vo=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    tkinter
+  ];
+
+  pythonRemoveDeps = [
+    "asyncio"
+  ];
+
+  pythonImportsCheck = [
+    "async_tkinter_loop"
+  ];
+
+  meta = with lib; {
+    description = "Implementation of asynchronous mainloop for tkinter, the use of which allows using async handler functions";
+    homepage = "https://github.com/insolor/async-tkinter-loop";
+    changelog = "https://github.com/insolor/async-tkinter-loop/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ AngryAnt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/async-upnp-client/default.nix b/nixpkgs/pkgs/development/python-modules/async-upnp-client/default.nix
new file mode 100644
index 000000000000..c51c99d00f0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/async-upnp-client/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, stdenv
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, defusedxml
+, fetchFromGitHub
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, python-didl-lite
+, pythonOlder
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "async-upnp-client";
+  version = "0.36.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "StevenLooman";
+    repo = "async_upnp_client";
+    rev = "refs/tags/${version}";
+    hash = "sha256-f3x5adxLHT/C5dXfdBH6stKv0y2nuhbpe8jkJex1DKU=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    defusedxml
+    python-didl-lite
+    voluptuous
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-aiohttp
+    pytest-asyncio
+  ];
+
+  disabledTests = [
+    # socket.gaierror: [Errno -2] Name or service not known
+    "test_async_get_local_ip"
+    "test_get_local_ip"
+    # OSError: [Errno 101] Network is unreachable
+    "test_auto_resubscribe_fail"
+    "test_init"
+    "test_on_notify_dlna_event"
+    "test_on_notify_upnp_event"
+    "test_server_init"
+    "test_server_start"
+    "test_start_server"
+    "test_subscribe"
+    "test_subscribe_auto_resubscribe"
+    "test_subscribe_fail"
+    "test_subscribe_manual_resubscribe"
+    "test_subscribe_renew"
+    "test_unsubscribe"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_deferred_callback_url"
+  ];
+
+  disabledTestPaths = [
+    # Tries to bind to multicast socket and fails to find proper interface
+    "tests/test_ssdp_listener.py"
+  ];
+
+  pythonImportsCheck = [
+    "async_upnp_client"
+  ];
+
+  meta = with lib; {
+    description = "Asyncio UPnP Client library for Python";
+    homepage = "https://github.com/StevenLooman/async_upnp_client";
+    changelog = "https://github.com/StevenLooman/async_upnp_client/blob/${version}/CHANGES.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asyncclick/default.nix b/nixpkgs/pkgs/development/python-modules/asyncclick/default.nix
new file mode 100644
index 000000000000..832b87c774aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncclick/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, anyio
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, pytestCheckHook
+, pythonOlder
+, trio
+}:
+
+buildPythonPackage rec {
+  pname = "asyncclick";
+  version = "8.1.3.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "python-trio";
+    repo = pname;
+    rev = version;
+    hash = "sha256-by1clF+WAfN/gjOg/F60O1tCZ3qAhWqiiJJY04iMzQ8=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    anyio
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    trio
+  ];
+
+  pytestFlagsArray = [
+    "-W" "ignore::trio.TrioDeprecationWarning"
+  ];
+
+  disabledTests = [
+    # RuntimeWarning: coroutine 'Context.invoke' was never awaited
+    "test_context_invoke_type"
+  ];
+
+  pythonImportsCheck = [ "asyncclick" ];
+
+  meta = with lib; {
+    description = "Python composable command line utility";
+    homepage = "https://github.com/python-trio/asyncclick";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asynccmd/default.nix b/nixpkgs/pkgs/development/python-modules/asynccmd/default.nix
new file mode 100644
index 000000000000..623424047429
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asynccmd/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "asynccmd";
+  version = "0.2.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "valentinmk";
+    repo = pname;
+    rev = version;
+    sha256 = "02sa0k0zgwv0y8k00pd1yh4x7k7xqhdikk2c0avpih1204lcw26h";
+  };
+
+  patches = [
+    # Deprecation of asyncio.Task.all_tasks(), https://github.com/valentinmk/asynccmd/pull/2
+    (fetchpatch {
+      name = "deprecation-python-38.patch";
+      url = "https://github.com/valentinmk/asynccmd/commit/12afa60ac07db17e96755e266061f2c88cb545ff.patch";
+      sha256 = "0l6sk93gj51qqrpw01a8iiyz14k6dd2z68vr9l9w9vx76l8725yf";
+    })
+  ];
+
+  # Tests are outdated
+  doCheck = false;
+
+  pythonImportsCheck = [ "asynccmd" ];
+
+  meta = with lib; {
+    description = "Asyncio implementation of Cmd Python library";
+    homepage = "https://github.com/valentinmk/asynccmd";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asyncinotify/default.nix b/nixpkgs/pkgs/development/python-modules/asyncinotify/default.nix
new file mode 100644
index 000000000000..feb778c729aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncinotify/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitLab
+, flit-core
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "asyncinotify";
+  version = "4.0.2";
+  format = "pyproject";
+
+  src = fetchFromGitLab {
+    owner = "Taywee";
+    repo = "asyncinotify";
+    rev = "v${version}";
+    hash = "sha256-Q7b406UENCmD9SGbaml+y2YLDi7VLZBmDkYMo8CLuVw=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  checkPhase = ''
+    ${python.pythonOnBuildForHost.interpreter} ${src}/test.py
+  '';
+  pythonImportsCheck = ["asyncinotify"];
+
+  meta = with lib; {
+    description = "A simple optionally-async python inotify library, focused on simplicity of use and operation, and leveraging modern Python features";
+    homepage = "https://pypi.org/project/asyncinotify/";
+    changelog = "https://gitlab.com/Taywee/asyncinotify/-/blob/master/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cynerd ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asyncio-dgram/default.nix b/nixpkgs/pkgs/development/python-modules/asyncio-dgram/default.nix
new file mode 100644
index 000000000000..f999cd3b3b34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncio-dgram/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "asyncio-dgram";
+  version = "2.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "jsbronder";
+    repo = pname;
+    rev = "refs/tagsv${version}";
+    hash = "sha256-Eb/9JtgPT2yOlfnn5Ox8M0kcQhSlRCuX8+Rq6amki8Q=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+  ];
+
+  # OSError: AF_UNIX path too long
+  doCheck = !stdenv.isDarwin;
+
+  disabledTests = [
+    "test_protocol_pause_resume"
+    # TypeError: socket type must be 2
+    "test_from_socket_bad_socket"
+  ];
+
+  pythonImportsCheck = [
+    "asyncio_dgram"
+  ];
+
+  meta = with lib; {
+    description = "Python support for higher level Datagram";
+    homepage = "https://github.com/jsbronder/asyncio-dgram";
+    changelog = "https://github.com/jsbronder/asyncio-dgram/blob/v${version}/ChangeLog";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asyncio-mqtt/default.nix b/nixpkgs/pkgs/development/python-modules/asyncio-mqtt/default.nix
new file mode 100644
index 000000000000..8274f5493967
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncio-mqtt/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, anyio
+, buildPythonPackage
+, fetchFromGitHub
+, paho-mqtt
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+, typing-extensions
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "asyncio-mqtt";
+  version = "0.16.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sbtinstruments";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-f3JqocjOEwNjo6Uv17ij6oEdrjb6Z2wTzdhdVhx46iM=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    paho-mqtt
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    anyio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "asyncio_mqtt"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_client_filtered_messages"
+    "test_client_logger"
+    "test_client_max_concurrent_outgoing_calls"
+    "test_client_no_pending_calls_warnings_with_max_concurrent_outgoing_calls"
+    "test_client_pending_calls_threshold"
+    "test_client_tls_context"
+    "test_client_tls_params"
+    "test_client_unfiltered_messages"
+    "test_client_unsubscribe"
+    "test_client_username_password "
+    "test_client_websockets"
+    "test_client_will"
+    "test_multiple_messages_generators"
+  ];
+
+  meta = with lib; {
+    description = "Idomatic asyncio wrapper around paho-mqtt";
+    homepage = "https://github.com/sbtinstruments/asyncio-mqtt";
+    license = licenses.bsd3;
+    changelog = "https://github.com/sbtinstruments/asyncio-mqtt/blob/v${version}/CHANGELOG.md";
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asyncio-rlock/default.nix b/nixpkgs/pkgs/development/python-modules/asyncio-rlock/default.nix
new file mode 100644
index 000000000000..5ad616180cee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncio-rlock/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "asyncio-rlock";
+  version = "0.1.0";
+
+  src = fetchPypi {
+    pname = "asyncio_rlock";
+    inherit version;
+    sha256 = "7e29824331619873e10d5d99dcc46d7b8f196c4a11b203f4eeccc0c091039d43";
+  };
+
+  # no tests on PyPI, no tags on GitLab
+  doCheck = false;
+
+  pythonImportsCheck = [ "asyncio_rlock" ];
+
+  meta = with lib; {
+    description = "Rlock like in threading module but for asyncio";
+    homepage = "https://gitlab.com/heckad/asyncio_rlock";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asyncio-throttle/default.nix b/nixpkgs/pkgs/development/python-modules/asyncio-throttle/default.nix
new file mode 100644
index 000000000000..052cfc01f997
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncio-throttle/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "asyncio-throttle";
+  version = "1.0.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "hallazzang";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1hsjcymdcm0hf4l68scf9n8j7ba89azgh96xhxrnyvwxfs5acnmv";
+  };
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "asyncio_throttle" ];
+
+  meta = with lib; {
+    description = "Simple, easy-to-use throttler for asyncio";
+    homepage = "https://github.com/hallazzang/asyncio-throttle";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asyncmy/default.nix b/nixpkgs/pkgs/development/python-modules/asyncmy/default.nix
new file mode 100644
index 000000000000..76a6d86a5bee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncmy/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchFromGitHub
+, poetry-core
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "asyncmy";
+  version = "0.2.9";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "long2ice";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-BjjC8pvvQfnvaExhei+F4a2eryHiRbI527BZFLpJk2w=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    poetry-core
+    setuptools
+  ];
+
+  # Not running tests as aiomysql is missing support for pymysql>=0.9.3
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "asyncmy"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interact with MySQL/mariaDB";
+    homepage = "https://github.com/long2ice/asyncmy";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asyncpg/default.nix b/nixpkgs/pkgs/development/python-modules/asyncpg/default.nix
new file mode 100644
index 000000000000..9e43c0494d14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncpg/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, uvloop
+, postgresql
+, pythonOlder
+, pytest-xdist
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "asyncpg";
+  version = "0.28.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-clLNw6yy9S/qo2ZCgNO814pGvWwQv9aBrP/++hEg4ng=";
+  };
+
+  # sandboxing issues on aarch64-darwin, see https://github.com/NixOS/nixpkgs/issues/198495
+  doCheck = postgresql.doCheck;
+
+  nativeCheckInputs = [
+    uvloop
+    postgresql
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    rm -rf asyncpg/
+  '';
+
+  pythonImportsCheck = [
+    "asyncpg"
+  ];
+
+  meta = with lib; {
+    description = "Asyncio PosgtreSQL driver";
+    homepage = "https://github.com/MagicStack/asyncpg";
+    changelog = "https://github.com/MagicStack/asyncpg/releases/tag/v${version}";
+    longDescription = ''
+      Asyncpg is a database interface library designed specifically for
+      PostgreSQL and Python/asyncio. asyncpg is an efficient, clean
+      implementation of PostgreSQL server binary protocol for use with Python's
+      asyncio framework.
+    '';
+    license = licenses.asl20;
+    maintainers = with maintainers; [ eadwu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asyncserial/default.nix b/nixpkgs/pkgs/development/python-modules/asyncserial/default.nix
new file mode 100644
index 000000000000..34ab492b9ae8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncserial/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+}:
+
+buildPythonPackage rec {
+  pname = "asyncserial";
+  version = "unstable-2022-06-10";
+
+  src = fetchFromGitHub {
+    owner = "m-labs";
+    repo = "asyncserial";
+    rev = "446559fec892a556876b17d17f182ae9647d5952";
+    hash = "sha256-WExmgh55sTH2w7wV3i96J1F1FN7L5rX3L/Ayvt2Kw/g=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+  ];
+
+  pythonImportsCheck = [ "asyncserial" ];
+
+  meta = with lib; {
+    description = "asyncio support for pyserial";
+    homepage = "https://github.com/m-labs/asyncserial";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ doronbehar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asyncsleepiq/default.nix b/nixpkgs/pkgs/development/python-modules/asyncsleepiq/default.nix
new file mode 100644
index 000000000000..5ffe2e769cc9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncsleepiq/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "asyncsleepiq";
+  version = "1.3.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-nKXZXOpwVN8Xe1vwwPGPucvyffiIQ8I4D+0A3qGco5w=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "asyncsleepiq"
+  ];
+
+  meta = with lib; {
+    description = "Async interface to SleepIQ API";
+    homepage = "https://github.com/kbickar/asyncsleepiq";
+    changelog = "https://github.com/kbickar/asyncsleepiq/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asyncssh/default.nix b/nixpkgs/pkgs/development/python-modules/asyncssh/default.nix
new file mode 100644
index 000000000000..f499adc7bb1e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncssh/default.nix
@@ -0,0 +1,104 @@
+{ lib
+, stdenv
+, bcrypt
+, buildPythonPackage
+, cryptography
+, fetchPypi
+, fido2
+, gssapi
+, libnacl
+, libsodium
+, nettle
+, openssh
+, openssl
+, pyopenssl
+, pytestCheckHook
+, python-pkcs11
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "asyncssh";
+  version = "2.14.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GsMcMzoNg8iIMVIyRVAMqoFFA0I3QbDkZTOe9tpbXik=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    libsodium
+    nettle
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = {
+    bcrypt = [
+      bcrypt
+    ];
+    fido2 = [
+      fido2
+    ];
+    gssapi = [
+      gssapi
+    ];
+    libnacl = [
+      libnacl
+    ];
+    pkcs11 = [
+      python-pkcs11
+    ];
+    pyOpenSSL = [
+      pyopenssl
+    ];
+  };
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    openssh
+    openssl
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  patches = [
+    # Reverts https://github.com/ronf/asyncssh/commit/4b3dec994b3aa821dba4db507030b569c3a32730
+    #
+    # This changed the test to avoid setting the sticky bit
+    # because that's not allowed for plain files in FreeBSD.
+    # However that broke the test on NixOS, failing with
+    # "Operation not permitted"
+    ./fix-sftp-chmod-test-nixos.patch
+  ];
+
+  disabledTestPaths = [
+    # Disables windows specific test (specifically the GSSAPI wrapper for Windows)
+    "tests/sspi_stub.py"
+  ];
+
+  disabledTests = [
+    # No PIN set
+    "TestSKAuthCTAP2"
+    # Requires network access
+    "test_connect_timeout_exceeded"
+    # Fails in the sandbox
+    "test_forward_remote"
+  ];
+
+  pythonImportsCheck = [
+    "asyncssh"
+  ];
+
+  meta = with lib; {
+    description = "Asynchronous SSHv2 Python client and server library";
+    homepage = "https://asyncssh.readthedocs.io/";
+    changelog = "https://github.com/ronf/asyncssh/blob/v${version}/docs/changes.rst";
+    license = licenses.epl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asyncssh/fix-sftp-chmod-test-nixos.patch b/nixpkgs/pkgs/development/python-modules/asyncssh/fix-sftp-chmod-test-nixos.patch
new file mode 100644
index 000000000000..b53063313a47
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncssh/fix-sftp-chmod-test-nixos.patch
@@ -0,0 +1,15 @@
+diff --git a/tests/test_sftp.py b/tests/test_sftp.py
+index d94379f..4ee46a9 100644
+--- a/tests/test_sftp.py
++++ b/tests/test_sftp.py
+@@ -955,8 +955,8 @@ class _TestSFTP(_CheckSFTP):
+ 
+         try:
+             self._create_file('file')
+-            await sftp.chmod('file', 0o4321)
+-            self.assertEqual(stat.S_IMODE(os.stat('file').st_mode), 0o4321)
++            await sftp.chmod('file', 0o1234)
++            self.assertEqual(stat.S_IMODE(os.stat('file').st_mode), 0o1234)
+         finally:
+             remove('file')
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/asyncstdlib/default.nix b/nixpkgs/pkgs/development/python-modules/asyncstdlib/default.nix
new file mode 100644
index 000000000000..2f61273c161e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncstdlib/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, typing-extensions
+, flit-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "asyncstdlib";
+  version = "3.10.9";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "maxfischer2781";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Wvp2orIGxy10jJOyskY3QMCciH33pPgX4Yd0nHjRjsM=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "asyncstdlib"
+  ];
+
+  meta = with lib; {
+    description = "Python library that extends the Python asyncio standard library";
+    homepage = "https://asyncstdlib.readthedocs.io/";
+    changelog = "https://github.com/maxfischer2781/asyncstdlib/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asynctest/default.nix b/nixpkgs/pkgs/development/python-modules/asynctest/default.nix
new file mode 100644
index 000000000000..cc58e3d6eeb4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asynctest/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder, python, pythonAtLeast }:
+
+buildPythonPackage rec {
+  pname = "asynctest";
+  version = "0.13.0";
+
+  # Unmaintained and incompatible python 3.11
+  disabled = pythonAtLeast "3.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1b3zsy7p84gag6q8ai2ylyrhx213qdk2h2zb6im3xn0m5n264y62";
+  };
+
+  postPatch = ''
+    # Skip failing test, probably caused by file system access
+    substituteInPlace test/test_selector.py \
+      --replace "test_events_watched_outside_test_are_ignored" "xtest_events_watched_outside_test_are_ignored"
+  '';
+
+  # https://github.com/Martiusweb/asynctest/issues/132
+  doCheck = pythonOlder "3.7";
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest test
+  '';
+
+  meta = with lib; {
+    description = "Enhance the standard unittest package with features for testing asyncio libraries";
+    homepage = "https://github.com/Martiusweb/asynctest";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asyncua/default.nix b/nixpkgs/pkgs/development/python-modules/asyncua/default.nix
new file mode 100644
index 000000000000..a4904cdb5e92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncua/default.nix
@@ -0,0 +1,84 @@
+{ lib
+, stdenv
+, aiofiles
+, aiosqlite
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pyopenssl
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pytz
+, sortedcontainers
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "asyncua";
+  version = "1.0.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "FreeOpcUa";
+    repo = "opcua-asyncio";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-eDrnDDiijkr5377BVWVAc5QEQCCDBoFynuT4MncCx9g=";
+    fetchSubmodules = true;
+  };
+
+  postPatch = ''
+    # https://github.com/FreeOpcUa/opcua-asyncio/issues/1263
+    substituteInPlace setup.py \
+      --replace ", 'asynctest'" ""
+
+    # Workaround hardcoded paths in test
+    # "test_cli_tools_which_require_sigint"
+    substituteInPlace tests/test_tools.py \
+      --replace "tools/" "$out/bin/"
+  '';
+
+  propagatedBuildInputs = [
+    aiofiles
+    aiosqlite
+    cryptography
+    pyopenssl
+    python-dateutil
+    pytz
+    sortedcontainers
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+    pytest-mock
+  ];
+
+  pythonImportsCheck = [
+    "asyncua"
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # Failed: DID NOT RAISE <class 'asyncio.exceptions.TimeoutError'>
+    "test_publish"
+    # OSError: [Errno 48] error while attempting to bind on address ('127.0.0.1',...
+    "test_anonymous_rejection"
+    "test_certificate_handling_success"
+    "test_encrypted_private_key_handling_success"
+    "test_encrypted_private_key_handling_success_with_cert_props"
+    "test_encrypted_private_key_handling_failure"
+  ];
+
+  meta = with lib; {
+    description = "OPC UA / IEC 62541 Client and Server for Python";
+    homepage = "https://github.com/FreeOpcUa/opcua-asyncio";
+    changelog = "https://github.com/FreeOpcUa/opcua-asyncio/releases/tag/v${version}";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ harvidsen ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asyncwhois/default.nix b/nixpkgs/pkgs/development/python-modules/asyncwhois/default.nix
new file mode 100644
index 000000000000..e462a0d0b49c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asyncwhois/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, python-socks
+, pythonOlder
+, tldextract
+, whodap
+}:
+
+buildPythonPackage rec {
+  pname = "asyncwhois";
+  version = "1.0.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pogzyb";
+    repo = "asyncwhois";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-5T/h4YzODH7zFyQpG8qVZetTK7V+Ii9jc+MQFgMUA8w=";
+  };
+
+  propagatedBuildInputs = [
+    python-socks
+    tldextract
+    whodap
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "python-socks[asyncio]" "python-socks"
+  '';
+
+  disabledTests = [
+    # Tests require network access
+    "test_pywhois_aio_get_hostname_from_ip"
+    "test_pywhois_get_hostname_from_ip"
+    "test_pywhois_aio_lookup_ipv4"
+    "test_not_found"
+    "test_aio_from_whois_cmd"
+    "test_aio_get_hostname_from_ip"
+    "test_from_whois_cmd"
+    "test_get_hostname_from_ip"
+    "test_whois_query_run"
+    "test_whois_query_create_connection"
+    "test_whois_query_send_and_recv"
+    "test_input_parameters_for_domain_query"
+    "test__get_top_level_domain"
+  ];
+
+  pythonImportsCheck = [
+    "asyncwhois"
+  ];
+
+  meta = with lib; {
+    description = "Python module for retrieving WHOIS information";
+    homepage = "https://github.com/pogzyb/asyncwhois";
+    changelog = "https://github.com/pogzyb/asyncwhois/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/asysocks/default.nix b/nixpkgs/pkgs/development/python-modules/asysocks/default.nix
new file mode 100644
index 000000000000..b28315a44e8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/asysocks/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, asn1crypto
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "asysocks";
+  version = "0.2.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Fwm898mU7wvH5OkYVUrw3rL4VT5yyvoHxVtfcuL+4bQ=";
+  };
+
+  propagatedBuildInputs = [
+    asn1crypto
+  ];
+
+  # Upstream hasn't release the tests yet
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "asysocks"
+  ];
+
+  meta = with lib; {
+    description = "Python Socks4/5 client and server library";
+    homepage = "https://github.com/skelsec/asysocks";
+    changelog = "https://github.com/skelsec/asysocks/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/atc-ble/default.nix b/nixpkgs/pkgs/development/python-modules/atc-ble/default.nix
new file mode 100644
index 000000000000..187aaeeb99ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atc-ble/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pycryptodomex
+, pytestCheckHook
+, pythonOlder
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "atc-ble";
+  version = "0.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-rwOFKxUlbbNIDJRdCmZpHstXwxcTnvlExgcVDdGbIVY=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=atc_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-sensor-state-data
+    pycryptodomex
+    sensor-state-data
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "atc_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for ATC devices with custom firmware";
+    homepage = "https://github.com/Bluetooth-Devices/atc-ble";
+    changelog = "https://github.com/Bluetooth-Devices/atc-ble/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/atenpdu/default.nix b/nixpkgs/pkgs/development/python-modules/atenpdu/default.nix
new file mode 100644
index 000000000000..f29936d3174a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atenpdu/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, async-timeout
+, pysnmplib
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "atenpdu";
+  version = "0.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Of7tQJNqaLDgO8nie6rSd1saMbauXJBp8vWfXYAziEE=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+    pysnmplib
+  ];
+
+  # Project has no test
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "atenpdu"
+  ];
+
+  meta = with lib; {
+    description = "Python interface to control ATEN PE PDUs";
+    homepage = "https://github.com/mtdcr/pductl";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/atlassian-python-api/default.nix b/nixpkgs/pkgs/development/python-modules/atlassian-python-api/default.nix
new file mode 100644
index 000000000000..45f61e63c10c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atlassian-python-api/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, deprecated
+, oauthlib
+, requests
+, requests-oauthlib
+, six
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "atlassian-python-api";
+  version = "3.41.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "atlassian-api";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-MIzBuIeQfAVlllaU02htx1eufRlpe+V9Kzo+EFF45ME=";
+  };
+
+  propagatedBuildInputs = [
+    deprecated
+    oauthlib
+    requests
+    requests-oauthlib
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "atlassian"
+  ];
+
+  meta = with lib; {
+    description = "Python Atlassian REST API Wrapper";
+    homepage = "https://github.com/atlassian-api/atlassian-python-api";
+    changelog = "https://github.com/atlassian-api/atlassian-python-api/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ arnoldfarkas ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/atom/default.nix b/nixpkgs/pkgs/development/python-modules/atom/default.nix
new file mode 100644
index 000000000000..4232716d4829
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atom/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, future
+, cppy
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "atom";
+  version = "0.10.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "nucleic";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-NXjvRVYcWU9p7b8y2ICOzYe6TeMh1S70Edy/JvTG7a4=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    cppy
+  ];
+
+  preCheck = ''
+    rm -rf atom
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "atom.api"
+  ];
+
+  meta = with lib; {
+    description = "Memory efficient Python objects";
+    homepage = "https://github.com/nucleic/atom";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bhipple ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/atomiclong/default.nix b/nixpkgs/pkgs/development/python-modules/atomiclong/default.nix
new file mode 100644
index 000000000000..0fccc943c8a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atomiclong/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, pytest, cffi }:
+
+buildPythonPackage rec {
+  pname = "atomiclong";
+  version = "0.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1gjbc9lvpkgg8vj7dspif1gz9aq4flkhxia16qj6yvb7rp27h4yb";
+  };
+
+  buildInputs = [ pytest ];
+  propagatedBuildInputs = [ cffi ];
+
+  meta = with lib; {
+    description = "Long data type with atomic operations using CFFI";
+    homepage = "https://github.com/dreid/atomiclong";
+    license = licenses.mit;
+    maintainers = with maintainers; [ robbinch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/atomicwrites-homeassistant/default.nix b/nixpkgs/pkgs/development/python-modules/atomicwrites-homeassistant/default.nix
new file mode 100644
index 000000000000..b340c0f9e80c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atomicwrites-homeassistant/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+let
+  pname = "atomicwrites-homeassistant";
+  version = "1.4.1";
+in
+
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JWpnIQbxZ0VEUijZZiQLd7VfRqCW0gMFkBpXql0fTC8=";
+  };
+
+  pythonImportsCheck = [
+    "atomicwrites"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Atomic file writes";
+    homepage = "https://pypi.org/project/atomicwrites-homeassistant/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/atomicwrites/default.nix b/nixpkgs/pkgs/development/python-modules/atomicwrites/default.nix
new file mode 100644
index 000000000000..26187a0078b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atomicwrites/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, pytest }:
+
+buildPythonPackage rec {
+  pname = "atomicwrites";
+  version = "1.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gbLJBxpJNnp/dwFw5e7Iy2ZWfPu8jHPSDOXKSo1xzxE=";
+  };
+
+  # Tests depend on pytest but atomicwrites is a dependency of pytest
+  doCheck = false;
+  nativeCheckInputs = [ pytest ];
+
+  meta = with lib; {
+    description = "Atomic file writes on POSIX";
+    homepage = "https://pypi.python.org/pypi/atomicwrites";
+    maintainers = with maintainers; [ matthiasbeyer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/atomman/default.nix b/nixpkgs/pkgs/development/python-modules/atomman/default.nix
new file mode 100644
index 000000000000..a245c93e3618
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atomman/default.nix
@@ -0,0 +1,90 @@
+{ lib
+, ase
+, buildPythonPackage
+, cython
+, datamodeldict
+, fetchFromGitHub
+, matplotlib
+, numericalunits
+, numpy
+, pandas
+, phonopy
+, potentials
+, pymatgen
+, pytestCheckHook
+, pythonOlder
+, requests
+, scipy
+, setuptools
+, toolz
+, wheel
+, xmltodict
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  version = "unstable-2023-07-28";
+  pname = "atomman";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "usnistgov";
+    repo = "atomman";
+    rev = "b8af21a9285959d38ee26173081db1b4488401bc";
+    hash = "sha256-WfB+OY61IPprT6OCVHl8VA60p7lLVkRGuyYX+nm7bbA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    cython
+    datamodeldict
+    matplotlib
+    numericalunits
+    numpy
+    pandas
+    potentials
+    requests
+    scipy
+    toolz
+    xmltodict
+  ];
+
+  pythonRelaxDeps = [ "potentials" ];
+
+  preCheck = ''
+    # By default, pytestCheckHook imports atomman from the current directory
+    # instead of from where `pip` installs it and fails due to missing Cython
+    # modules. Fix this by removing atomman from the current directory.
+    #
+    rm -r atomman
+  '';
+
+  nativeCheckInputs = [
+    ase
+    phonopy
+    pymatgen
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_unique_shifts_prototype" # needs network access to download database files
+  ];
+
+  pythonImportsCheck = [
+    "atomman"
+  ];
+
+  meta = with lib; {
+    description = "Atomistic Manipulation Toolkit";
+    homepage = "https://github.com/usnistgov/atomman/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/atpublic/default.nix b/nixpkgs/pkgs/development/python-modules/atpublic/default.nix
new file mode 100644
index 000000000000..20fc37d45999
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atpublic/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, pdm-backend
+, sybil
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "atpublic";
+  version = "4.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-D0BDMhnhJO3xFcbDY4CMpvDhz6fRYNhrL7lHkwhtEpQ=";
+  };
+
+  nativeBuildInputs = [
+    pdm-backend
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    sybil
+  ];
+
+  postPatch = ''
+    sed -i '/cov=public/d' pyproject.toml
+  '';
+
+  pythonImportsCheck = [
+    "public"
+  ];
+
+  meta = with lib; {
+    description = "Python decorator and function which populates a module's __all__ and globals";
+    homepage = "https://public.readthedocs.io/";
+    longDescription = ''
+      This is a very simple decorator and function which populates a module's
+      __all__ and optionally the module globals.
+    '';
+    license = licenses.asl20;
+    maintainers = with maintainers; [ eadwu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/atsim-potentials/default.nix b/nixpkgs/pkgs/development/python-modules/atsim-potentials/default.nix
new file mode 100644
index 000000000000..f9977ec84121
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/atsim-potentials/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, configparser
+, pyparsing
+, pytestCheckHook
+, future
+, openpyxl
+, wrapt
+, scipy
+, cexprtk
+, deepdiff
+, sympy
+}:
+
+buildPythonPackage rec {
+  version = "0.4.1";
+  pname = "atsim-potentials";
+
+  src = fetchFromGitHub {
+    owner = "mjdrushton";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-G7lNqwEUwAT0f7M2nUTCxpXOAl6FWKlh7tcsvbur1eM=";
+  };
+
+  postPatch = ''
+    # Remove conflicting openpyxl dependency version check
+    sed -i '/openpyxl==2.6.4/d' setup.py
+  '';
+
+  propagatedBuildInputs = [
+    cexprtk
+    configparser
+    future
+    openpyxl
+    pyparsing
+    scipy
+    sympy
+    wrapt
+  ];
+
+  nativeCheckInputs = [
+    deepdiff
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Missing lammps executable
+    "eam_tabulate_example2TestCase"
+    "test_pymath"
+  ];
+
+  pythonImportsCheck = [ "atsim.potentials" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mjdrushton/atsim-potentials";
+    description = "Provides tools for working with pair and embedded atom method potential models including tabulation routines for DL_POLY and LAMMPS";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/attrdict/default.nix b/nixpkgs/pkgs/development/python-modules/attrdict/default.nix
new file mode 100644
index 000000000000..4054fbd78b68
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/attrdict/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, coverage
+, pythonOlder
+, nose
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "attrdict";
+  version = "2.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NckGmLVcaDlGCRF3F3qenAcToIYPDgSf69cmSczXe3A=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    coverage
+    nose
+  ];
+
+  postPatch = ''
+    substituteInPlace attrdict/merge.py \
+      --replace "from collections" "from collections.abc"
+    substituteInPlace attrdict/mapping.py \
+      --replace "from collections" "from collections.abc"
+    substituteInPlace attrdict/default.py \
+      --replace "from collections" "from collections.abc"
+    substituteInPlace attrdict/mixins.py \
+      --replace "from collections" "from collections.abc"
+  '';
+
+  # Tests are not shipped and source is not tagged
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "attrdict"
+  ];
+
+  meta = with lib; {
+    description = "A dict with attribute-style access";
+    homepage = "https://github.com/bcj/AttrDict";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/attrs/default.nix b/nixpkgs/pkgs/development/python-modules/attrs/default.nix
new file mode 100644
index 000000000000..a298dc36f507
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/attrs/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, callPackage
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, hatchling
+}:
+
+buildPythonPackage rec {
+  pname = "attrs";
+  version = "23.1.0";
+  disabled = pythonOlder "3.7";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-YnmDbVgVE6JvG/I1+azTM7yRFWg/FPfo+uRsmPxQ4BU=";
+  };
+
+  patches = [
+    # hatch-vcs and hatch-fancy-pypi-readme depend on pytest, which depends on attrs
+    ./remove-hatch-plugins.patch
+  ];
+
+  postPatch = ''
+    substituteAllInPlace pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  outputs = [
+    "out"
+    "testout"
+  ];
+
+  postInstall = ''
+    # Install tests as the tests output.
+    mkdir $testout
+    cp -R conftest.py tests $testout
+  '';
+
+  pythonImportsCheck = [
+    "attr"
+  ];
+
+  # pytest depends on attrs, so we can't do this out-of-the-box.
+  # Instead, we do this as a passthru.tests test.
+  doCheck = false;
+
+  passthru.tests = {
+    pytest = callPackage ./tests.nix { };
+  };
+
+  meta = with lib; {
+    description = "Python attributes without boilerplate";
+    homepage = "https://github.com/python-attrs/attrs";
+    changelog = "https://github.com/python-attrs/attrs/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/attrs/remove-hatch-plugins.patch b/nixpkgs/pkgs/development/python-modules/attrs/remove-hatch-plugins.patch
new file mode 100644
index 000000000000..7d7b83a366e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/attrs/remove-hatch-plugins.patch
@@ -0,0 +1,74 @@
+diff --git a/pyproject.toml b/pyproject.toml
+index fb8fae3..998211f 100644
+--- a/pyproject.toml
++++ b/pyproject.toml
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: MIT
+ 
+ [build-system]
+-requires = ["hatchling", "hatch-vcs", "hatch-fancy-pypi-readme"]
++requires = ["hatchling"]
+ build-backend = "hatchling.build"
+ 
+ 
+@@ -26,7 +26,8 @@ classifiers = [
+     "Typing :: Typed",
+ ]
+ dependencies = ["importlib_metadata;python_version<'3.8'"]
+-dynamic = ["version", "readme"]
++dynamic = ["readme"]
++version = "@version@"
+ 
+ [project.optional-dependencies]
+ tests-no-zope = [
+@@ -67,50 +68,9 @@ Changelog = "https://www.attrs.org/en/stable/changelog.html"
+ Funding = "https://github.com/sponsors/hynek"
+ Tidelift = "https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=pypi"
+ 
+-
+-[tool.hatch.version]
+-source = "vcs"
+-raw-options = { local_scheme = "no-local-version" }
+-
+ [tool.hatch.build.targets.wheel]
+ packages = ["src/attr", "src/attrs"]
+ 
+-[tool.hatch.metadata.hooks.fancy-pypi-readme]
+-content-type = "text/markdown"
+-
+-# PyPI doesn't support the <picture> tag.
+-[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]]
+-text = """<p align="center">
+-  <a href="https://www.attrs.org/">
+-    <img src="https://raw.githubusercontent.com/python-attrs/attrs/main/docs/_static/attrs_logo.svg" width="35%" alt="attrs" />
+-  </a>
+-</p>
+-"""
+-
+-[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]]
+-path = "README.md"
+-start-after = "<!-- teaser-begin -->"
+-
+-[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]]
+-text = """
+-
+-## Release Information
+-
+-"""
+-
+-[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]]
+-path = "CHANGELOG.md"
+-pattern = "\n(###.+?\n)## "
+-
+-[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]]
+-text = """
+-
+----
+-
+-[Full changelog](https://www.attrs.org/en/stable/changelog.html)
+-"""
+-
+-
+ # Make coverage play nicely with pytest-xdist.
+ [tool.hatch.build.targets.wheel.hooks.autorun]
+ dependencies = ["hatch-autorun"]
diff --git a/nixpkgs/pkgs/development/python-modules/attrs/tests.nix b/nixpkgs/pkgs/development/python-modules/attrs/tests.nix
new file mode 100644
index 000000000000..2614716d71d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/attrs/tests.nix
@@ -0,0 +1,22 @@
+{ buildPythonPackage
+, pytestCheckHook
+, attrs
+, hypothesis
+}:
+
+buildPythonPackage {
+  pname = "attrs-tests";
+  inherit (attrs) version;
+  format = "other";
+
+  srcs = attrs.testout;
+
+  dontBuild = true;
+  dontInstall = true;
+
+  nativeCheckInputs = [
+    attrs
+    hypothesis
+    pytestCheckHook
+  ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aubio/default.nix b/nixpkgs/pkgs/development/python-modules/aubio/default.nix
new file mode 100644
index 000000000000..9b8eccabb6e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aubio/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, pytestCheckHook
+, stdenv
+, darwin
+}:
+
+buildPythonPackage rec {
+  pname = "aubio";
+  version = "0.4.9";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    sha256 = "0fhxikvlr010nbh02g455d5y8bq6j5yw180cdh4gsd0hb43y3z26";
+  };
+
+  buildInputs = lib.optionals stdenv.isDarwin (with darwin.apple_sdk.frameworks; [ Accelerate AudioToolbox CoreVideo CoreGraphics ]);
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "aubio" ];
+
+  meta = with lib; {
+    description = "a library for audio and music analysis";
+    homepage = "https://aubio.org";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/audible/default.nix b/nixpkgs/pkgs/development/python-modules/audible/default.nix
new file mode 100644
index 000000000000..ddb80eec0534
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/audible/default.nix
@@ -0,0 +1,31 @@
+{ lib, fetchFromGitHub, buildPythonPackage, beautifulsoup4, httpx, pbkdf2, pillow, pyaes, rsa }:
+
+buildPythonPackage rec {
+  pname = "audible";
+  version = "0.8.2";
+
+  src = fetchFromGitHub {
+    owner = "mkb79";
+    repo = "Audible";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-SIEDBuMCC/Hap2mGVbKEFic96ClN369SEsV06Sg+poY=";
+  };
+
+  propagatedBuildInputs = [ beautifulsoup4 httpx pbkdf2 pillow pyaes rsa ];
+
+  postPatch = ''
+    sed -i "s/httpx.*/httpx',/" setup.py
+  '';
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "audible"];
+
+  meta = with lib; {
+    description = "A(Sync) Interface for internal Audible API written in pure Python";
+    license = licenses.agpl3;
+    homepage = "https://github.com/mkb79/Audible";
+    maintainers = with maintainers; [ jvanbruegge ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/audio-metadata/default.nix b/nixpkgs/pkgs/development/python-modules/audio-metadata/default.nix
new file mode 100644
index 000000000000..d1d6de0bcba8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/audio-metadata/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, attrs
+, bidict
+, bitstruct
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, more-itertools
+, poetry-core
+, pprintpp
+, pythonOlder
+, pythonRelaxDepsHook
+, tbm-utils
+}:
+
+buildPythonPackage rec {
+  pname = "audio-metadata";
+  version = "0.11.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "thebigmunch";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-5ZX4HwbuB9ZmFfHuxaMCrn3R7/znuDsoyqqLql2Nizg=";
+  };
+
+  patches = [
+    # Switch to poetry-core, https://github.com/thebigmunch/audio-metadata/pull/41
+    (fetchpatch {
+      name = "switch-to-poetry-core.patch";
+      url = "https://github.com/thebigmunch/audio-metadata/commit/dfe91a69ee37e9dcefb692165eb0f9cd36a7e5b8.patch";
+      hash = "sha256-ut3mqgZQu0YFbsTEA13Ch0+aSNl17ndMV0fuIu3n5tc=";
+    })
+  ];
+
+  pythonRelaxDeps = [
+    "attrs"
+    "more-itertools"
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    bidict
+    bitstruct
+    more-itertools
+    pprintpp
+    tbm-utils
+  ];
+
+  # Tests require ward which is not ready to be used
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "audio_metadata"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/thebigmunch/audio-metadata";
+    description = "A library for reading and, in the future, writing metadata from audio files";
+    changelog = "https://github.com/thebigmunch/audio-metadata/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jakewaksbaum ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/audioread/default.nix b/nixpkgs/pkgs/development/python-modules/audioread/default.nix
new file mode 100644
index 000000000000..bdee5ba6cc9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/audioread/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "audioread";
+  version = "3.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-EhmVvSB+sf2j1Wa+uFHTU0J1klvDWk+22gyxHeD3JRo=";
+  };
+
+  # No tests, need to disable or py3k breaks
+  doCheck = false;
+
+  meta = {
+    description = "Cross-platform audio decoding";
+    homepage = "https://github.com/sampsyo/audioread";
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/audiotools/default.nix b/nixpkgs/pkgs/development/python-modules/audiotools/default.nix
new file mode 100644
index 000000000000..15ffe7af8c85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/audiotools/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, stdenv
+, AudioToolbox
+, AudioUnit
+, CoreServices
+}:
+
+buildPythonPackage rec {
+  pname = "audiotools";
+  version = "3.1.1";
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    AudioToolbox
+    AudioUnit
+    CoreServices
+  ];
+
+  src = fetchFromGitHub {
+    owner = "tuffy";
+    repo = "python-audio-tools";
+    rev = "v${version}";
+    hash = "sha256-y+EiK9BktyTWowOiJvOb2YjtbPa7R62Wb5zinkyt1OM=";
+  };
+
+  meta = with lib; {
+    description = "Utilities and Python modules for handling audio";
+    homepage = "https://audiotools.sourceforge.net/";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/auditok/default.nix b/nixpkgs/pkgs/development/python-modules/auditok/default.nix
new file mode 100644
index 000000000000..459662df15d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/auditok/default.nix
@@ -0,0 +1,44 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, matplotlib
+, numpy
+, pyaudio
+, pydub
+, pythonOlder
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "auditok";
+  version = "0.1.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "auditok";
+    hash = "sha256-HNsw9VLP7XEgs8E2X6p7ygDM47AwWxMYjptipknFig4=";
+  };
+
+  propagatedBuildInputs = [ matplotlib numpy pyaudio pydub ];
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  unittestFlagsArray = [ "-s" "tests" ];
+
+  pythonImportsCheck = [ "auditok" ];
+
+  # The most recent version is 0.2.0, but the only dependent package is
+  # ffsubsync, which is pinned at 0.1.5.
+  passthru.skipBulkUpdate = true;
+
+  meta = with lib; {
+    description = "Audio Activity Detection tool that can process online data as well as audio files";
+    homepage = "https://github.com/amsehili/auditok/";
+    changelog = "https://github.com/amsehili/auditok/blob/v${version}/CHANGELOG";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Benjamin-L ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/auditwheel/default.nix b/nixpkgs/pkgs/development/python-modules/auditwheel/default.nix
new file mode 100644
index 000000000000..836bbaf1cd0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/auditwheel/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, setuptools-scm
+, pyelftools
+, importlib-metadata
+, pretend
+, pytestCheckHook
+# non-python dependencies
+, bzip2
+, gnutar
+, patchelf
+, unzip
+}:
+
+buildPythonPackage rec {
+  pname = "auditwheel";
+  version = "5.4.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-qvgVOreinMmaZjziSYgE2vGIfqG3oyMboNP+5oo8zxk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    pyelftools
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    pretend
+    pytestCheckHook
+  ];
+
+  # Integration tests require docker and networking
+  disabledTestPaths = [
+    "tests/integration"
+  ];
+
+  # Ensure that there are no undeclared deps
+  postCheck = ''
+    PATH= PYTHONPATH= $out/bin/auditwheel --version > /dev/null
+  '';
+
+  makeWrapperArgs = [
+    "--prefix" "PATH" ":" (lib.makeBinPath [ bzip2 gnutar patchelf unzip ])
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/pypa/auditwheel/blob/${version}/CHANGELOG.md";
+    description = "Auditing and relabeling cross-distribution Linux wheels";
+    homepage = "https://github.com/pypa/auditwheel";
+    license = with licenses; [
+      mit  # auditwheel and nibabel
+      bsd2  # from https://github.com/matthew-brett/delocate
+      bsd3  # from https://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-projects/pax-utils/lddtree.py
+    ];
+    mainProgram = "auditwheel";
+    maintainers = with maintainers; [ davhau ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/augeas/default.nix b/nixpkgs/pkgs/development/python-modules/augeas/default.nix
new file mode 100644
index 000000000000..4872a4ac18d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/augeas/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, unittestCheckHook
+, pkg-config
+, augeas
+, cffi
+, pkgs # for libxml2
+}:
+buildPythonPackage rec {
+    pname = "augeas";
+    version = "1.2.0";
+
+    src = fetchFromGitHub {
+      owner = "hercules-team";
+      repo = "python-augeas";
+      rev = "v${version}";
+      hash = "sha256-Lq8ckra3sqN38zo1d5JsEq6U5TtLKRmqysoWNwR9J9A=";
+    };
+
+    nativeBuildInputs = [ pkg-config ];
+
+    buildInputs = [ augeas pkgs.libxml2 ];
+
+    propagatedBuildInputs = [ cffi ];
+
+    nativeCheckInputs = [ unittestCheckHook ];
+
+    pythonImportsCheck = [ "augeas" ];
+
+    meta = with lib; {
+      changelog = "https://github.com/hercules-team/python-augeas/releases/tag/v${version}";
+      description = "Pure python bindings for augeas";
+      homepage = "https://github.com/hercules-team/python-augeas";
+      license = licenses.lgpl2Plus;
+      platforms = platforms.unix;
+    };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/augmax/default.nix b/nixpkgs/pkgs/development/python-modules/augmax/default.nix
new file mode 100644
index 000000000000..2ab159cfc6f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/augmax/default.nix
@@ -0,0 +1,44 @@
+{ buildPythonPackage
+, einops
+, fetchFromGitHub
+, jax
+, jaxlib
+, lib
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "augmax";
+  version = "0.3.1";
+  pyproject = true;
+
+  disbaled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "khdlr";
+    repo = "augmax";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-hDNNoE7KVaH3jrXZA4A8f0UoQJPl6KHA3XwMc3Ccohk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [ einops jax ];
+
+  # augmax does not have any tests at the time of writing (2022-02-19), but
+  # jaxlib is necessary for the pythonImportsCheckPhase.
+  nativeCheckInputs = [ jaxlib ];
+
+  pythonImportsCheck = [ "augmax" ];
+
+  meta = with lib; {
+    description = "Efficiently Composable Data Augmentation on the GPU with Jax";
+    homepage = "https://github.com/khdlr/augmax";
+    changelog = "https://github.com/khdlr/augmax/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/auroranoaa/default.nix b/nixpkgs/pkgs/development/python-modules/auroranoaa/default.nix
new file mode 100644
index 000000000000..bab39ebd64f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/auroranoaa/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "auroranoaa";
+  version = "0.0.3";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "djtimca";
+    repo = "aurora-api";
+    rev = version;
+    hash = "sha256-ho0O5aEHCKaTuWh2eW2kY5a7dVGIGBLm4nKxAMq0bZ4=";
+  };
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "auroranoaa" ];
+
+  meta = with lib; {
+    description = "Python wrapper for the Aurora API";
+    homepage = "https://github.com/djtimca/aurora-api";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aurorapy/default.nix b/nixpkgs/pkgs/development/python-modules/aurorapy/default.nix
new file mode 100644
index 000000000000..6ee2be80d3b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aurorapy/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitLab
+, future
+, pyserial
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "aurorapy";
+  version = "0.2.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitLab {
+    owner = "energievalsabbia";
+    repo = pname;
+    rev = version;
+    hash = "sha256-rGwfGq3zdoG9NCGqVN29Q4bWApk5B6CRdsW9ctWgOec=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    future
+    pyserial
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    six
+  ];
+
+  pythonImportsCheck = [
+    "aurorapy"
+  ];
+
+  meta = with lib; {
+    description = "Implementation of the communication protocol for Power-One Aurora inverters";
+    homepage = "https://gitlab.com/energievalsabbia/aurorapy";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/autarco/default.nix b/nixpkgs/pkgs/development/python-modules/autarco/default.nix
new file mode 100644
index 000000000000..b5a8715f6ced
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/autarco/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "autarco";
+  version = "0.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "klaasnicolaas";
+    repo = "python-autarco";
+    rev = "v${version}";
+    hash = "sha256-3f6N4b6WZPAUUQTuGeb20q0f7ZqDR+O24QRze5RpRlw=";
+  };
+
+  patches = [
+    # https://github.com/klaasnicolaas/python-autarco/pull/265
+    (fetchpatch {
+      name = "remove-setuptools-dependency.patch";
+      url = "https://github.com/klaasnicolaas/python-autarco/commit/bf40e8a4f64cd9c9cf72930260895537ea5b2adc.patch";
+      hash = "sha256-Fgijy7sd67LUIqh3qjQjyothnjdW7Zcil/bQSuVsBR8=";
+    })
+  ];
+
+  postPatch = ''
+    # Upstream doesn't set a version for the pyproject.toml
+    substituteInPlace pyproject.toml \
+      --replace "0.0.0" "${version}" \
+      --replace "--cov" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "autarco"
+  ];
+
+  meta = with lib; {
+    description = "Module for the Autarco Inverter";
+    homepage = "https://github.com/klaasnicolaas/python-autarco";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/auth0-python/default.nix b/nixpkgs/pkgs/development/python-modules/auth0-python/default.nix
new file mode 100644
index 000000000000..3b0cc0eb8030
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/auth0-python/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, callee
+, fetchFromGitHub
+, mock
+, poetry-core
+, poetry-dynamic-versioning
+, pyjwt
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "auth0-python";
+  version = "4.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "auth0";
+    repo = "auth0-python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-KNhuonqFt+KrRYctQ426FcnzxISp5sBRs28hFL/Du0Q=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    poetry-dynamic-versioning
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    pyjwt
+  ] ++ pyjwt.optional-dependencies.crypto;
+
+  nativeCheckInputs = [
+    aiohttp
+    aioresponses
+    callee
+    mock
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tries to ping websites (e.g. google.com)
+    "can_timeout"
+    "test_options_are_created_by_default"
+    "test_options_are_used_and_override"
+  ];
+
+  pythonImportsCheck = [
+    "auth0"
+  ];
+
+  meta = with lib; {
+    description = "Auth0 Python SDK";
+    homepage = "https://github.com/auth0/auth0-python";
+    changelog = "https://github.com/auth0/auth0-python/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/authcaptureproxy/default.nix b/nixpkgs/pkgs/development/python-modules/authcaptureproxy/default.nix
new file mode 100644
index 000000000000..37e640ca6a8d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/authcaptureproxy/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, poetry-core
+
+# dependencies
+, aiohttp
+, beautifulsoup4
+, httpx
+, multidict
+, typer
+, yarl
+
+# tests
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "authcaptureproxy";
+  version = "1.3.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "alandtse";
+    repo = "auth_capture_proxy";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-qkvr8uYI6+lbNsAPw2PAnPyWRQTE4AEHf3djBfSp3XU=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    beautifulsoup4
+    httpx
+    multidict
+    typer
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # test fails with frequency 1/200
+    # https://github.com/alandtse/auth_capture_proxy/issues/25
+    "test_return_timer_countdown_refresh_html"
+  ];
+
+  pythonImportsCheck = [
+    "authcaptureproxy"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/alandtse/auth_capture_proxy/releases/tag/v${version}";
+    description = "A proxy to capture authentication information from a webpage";
+    homepage = "https://github.com/alandtse/auth_capture_proxy";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ graham33 hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/authheaders/default.nix b/nixpkgs/pkgs/development/python-modules/authheaders/default.nix
new file mode 100644
index 000000000000..7d4a4075439e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/authheaders/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, authres
+, buildPythonPackage
+, dkimpy
+, dnspython
+, fetchFromGitHub
+, publicsuffix2
+, pythonOlder
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "authheaders";
+  version = "0.15.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ValiMail";
+    repo = "authentication-headers";
+    rev = "refs/tags/${version}";
+    hash = "sha256-96fCx5uN7yegTrCN+LSjtu4u3RL+dcxV/Puyo0eziI8=";
+  };
+
+  propagatedBuildInputs = [
+    authres
+    dnspython
+    dkimpy
+    publicsuffix2
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "authheaders"
+  ];
+
+  meta = with lib; {
+    description = "Python library for the generation of email authentication headers";
+    homepage = "https://github.com/ValiMail/authentication-headers";
+    changelog = "https://github.com/ValiMail/authentication-headers/blob${version}/CHANGES";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/authlib/default.nix b/nixpkgs/pkgs/development/python-modules/authlib/default.nix
new file mode 100644
index 000000000000..325fe6c0894a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/authlib/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, cachelib
+, cryptography
+, fetchFromGitHub
+, flask
+, flask-sqlalchemy
+, httpx
+, mock
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, requests
+, starlette
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "authlib";
+  version = "1.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "lepture";
+    repo = "authlib";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-K6u590poZ9C3Uzi3a8k8aXMeSeRgn91e+p2PWYno3Y8=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    requests
+  ];
+
+  nativeCheckInputs = [
+    cachelib
+    flask
+    flask-sqlalchemy
+    httpx
+    mock
+    pytest-asyncio
+    pytestCheckHook
+    starlette
+    werkzeug
+  ];
+
+  pythonImportsCheck = [
+    "authlib"
+  ];
+
+  disabledTestPaths = [
+    # Django tests require a running instance
+    "tests/django/"
+    "tests/clients/test_django/"
+    # Unsupported encryption algorithm
+    "tests/jose/test_chacha20.py"
+  ];
+
+  meta = with lib; {
+    description = "Library for building OAuth and OpenID Connect servers";
+    homepage = "https://github.com/lepture/authlib";
+    changelog = "https://github.com/lepture/authlib/blob/v${version}/docs/changelog.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ flokli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/authres/default.nix b/nixpkgs/pkgs/development/python-modules/authres/default.nix
new file mode 100644
index 000000000000..196e573717b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/authres/default.nix
@@ -0,0 +1,28 @@
+{ lib, fetchPypi, buildPythonPackage, python }:
+
+buildPythonPackage rec {
+  pname = "authres";
+  version = "1.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1dr5zpqnb54h4f5ax8334l1dcp8j9083d7v4vdi1xqkwmnavklck";
+  };
+
+  checkPhase = ''
+    # run doctests
+    ${python.interpreter} -m authres
+  '';
+
+  meta = with lib; {
+    description = "Email Authentication-Results Headers generation and parsing for Python/Python3";
+    longDescription = ''
+      Python module that implements various internet RFC's: 5451/7001/7601
+      Authentication-Results Headers generation and parsing for
+      Python/Python3.
+    '';
+    homepage = "https://launchpad.net/authentication-results-python";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ leenaars ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/autobahn/default.nix b/nixpkgs/pkgs/development/python-modules/autobahn/default.nix
new file mode 100644
index 000000000000..363763efd60e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/autobahn/default.nix
@@ -0,0 +1,113 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, attrs
+, argon2-cffi
+, base58
+, cbor2
+, cffi
+, click
+, cryptography
+, ecdsa
+, eth-abi
+, eth-account
+, flatbuffers
+, jinja2
+, hkdf
+, hyperlink
+, mnemonic
+, mock
+, msgpack
+, passlib
+, py-ecc
+# , py-eth-sig-utils
+, py-multihash
+, py-ubjson
+, pynacl
+, pygobject3
+, pyopenssl
+, qrcode
+, pytest-asyncio
+, python-snappy
+, pytestCheckHook
+, pythonOlder
+  # , pytrie
+, rlp
+, service-identity
+, spake2
+, twisted
+, txaio
+, ujson
+  # , web3
+  # , wsaccel
+  # , xbr
+, yapf
+  # , zlmdb
+, zope_interface
+}@args:
+
+buildPythonPackage rec {
+  pname = "autobahn";
+  version = "23.6.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7JQhxSohAzZNHvBGgDbmAZ7oT3FyHoazb+Ga1pZsEYE=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest>=2.8.6,<3.3.0" "pytest"
+  '';
+
+  propagatedBuildInputs = [
+    cryptography
+    hyperlink
+    pynacl
+    txaio
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.scram
+  ++ passthru.optional-dependencies.serialization
+  ++ passthru.optional-dependencies.xbr;
+
+  preCheck = ''
+    # Run asyncio tests (requires twisted)
+    export USE_ASYNCIO=1
+  '';
+
+  pytestFlagsArray = [
+    "--pyargs autobahn"
+  ];
+
+  pythonImportsCheck = [
+    "autobahn"
+  ];
+
+  passthru.optional-dependencies = rec {
+    all = accelerate ++ compress ++ encryption ++ nvx ++ serialization ++ scram ++ twisted ++ ui ++ xbr;
+    accelerate = [ /* wsaccel */ ];
+    compress = [ python-snappy ];
+    encryption = [ pynacl pyopenssl qrcode /* pytrie */ service-identity ];
+    nvx = [ cffi ];
+    scram = [ argon2-cffi cffi passlib ];
+    serialization = [ cbor2 flatbuffers msgpack ujson py-ubjson ];
+    twisted = [ attrs args.twisted zope_interface ];
+    ui = [ pygobject3 ];
+    xbr = [ base58 cbor2 click ecdsa eth-abi jinja2 hkdf mnemonic py-ecc /* py-eth-sig-utils */ py-multihash rlp spake2 twisted /* web3 xbr */ yapf /* zlmdb */ ];
+  };
+
+  meta = with lib; {
+    description = "WebSocket and WAMP in Python for Twisted and asyncio";
+    homepage = "https://crossbar.io/autobahn";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/autocommand/default.nix b/nixpkgs/pkgs/development/python-modules/autocommand/default.nix
new file mode 100644
index 000000000000..eeee08ec4927
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/autocommand/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "autocommand";
+  version = "2.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Lucretiel";
+    repo = "autocommand";
+    rev = "refs/tags/${version}";
+    hash = "sha256-9bv9Agj4RpeyNJvTLUaMwygQld2iZZkoLb81rkXOd3E=";
+  };
+
+  # fails with: SyntaxError: invalid syntax
+  doCheck = false;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "autocommand"
+  ];
+
+  meta = with lib; {
+    description = "Autocommand turns a python function into a CLI program";
+    homepage = "https://github.com/Lucretiel/autocommand";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/autofaiss/default.nix b/nixpkgs/pkgs/development/python-modules/autofaiss/default.nix
new file mode 100644
index 000000000000..eddea783def8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/autofaiss/default.nix
@@ -0,0 +1,79 @@
+{ buildPythonPackage
+, embedding-reader
+, faiss
+, fetchFromGitHub
+, fire
+, fsspec
+, lib
+, numpy
+, pyarrow
+, pytestCheckHook
+, pythonRelaxDepsHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "autofaiss";
+  version = "2.15.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "criteo";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-vB906xbpEjNNzc8Dc8i3ENgl9lCPOgB9vs7QVRS7UcM=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  pythonRemoveDeps = [
+    # The `dataclasses` packages is a python2-only backport, unnecessary in
+    # python3.
+    "dataclasses"
+    # We call it faiss, not faiss-cpu.
+    "faiss-cpu"
+  ];
+
+  pythonRelaxDeps = [
+    # As of v2.15.4, autofaiss asks for fire<0.5 but we have fire v0.5.0 in
+    # nixpkgs at the time of writing (2022-12-25).
+    "fire"
+    # As of v2.15.3, autofaiss asks for pyarrow<8 but we have pyarrow v9.0.0 in
+    # nixpkgs at the time of writing (2022-12-15).
+    "pyarrow"
+  ];
+
+  propagatedBuildInputs = [
+    embedding-reader
+    fsspec
+    numpy
+    faiss
+    fire
+    pyarrow
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Attempts to spin up a Spark cluster and talk to it which doesn't work in
+    # the Nix build environment.
+    "test_build_partitioned_indexes"
+    "test_index_correctness_in_distributed_mode_with_multiple_indices"
+    "test_index_correctness_in_distributed_mode"
+    "test_quantize_with_pyspark"
+  ];
+
+  meta = with lib; {
+    description = "Automatically create Faiss knn indices with the most optimal similarity search parameters";
+    homepage = "https://github.com/criteo/autofaiss";
+    changelog = "https://github.com/criteo/autofaiss/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/autoflake/default.nix b/nixpkgs/pkgs/development/python-modules/autoflake/default.nix
new file mode 100644
index 000000000000..0897abe77b84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/autoflake/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hatchling
+, pyflakes
+, pytestCheckHook
+, pythonOlder
+, tomli
+}:
+buildPythonPackage rec {
+  pname = "autoflake";
+  version = "2.2.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Yre2RJppLDybDJFpGbvCFkjacoHoUGvPjT+CgOQx68E=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    pyflakes
+  ]
+  ++ lib.optional (pythonOlder "3.11") tomli;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "autoflake"
+  ];
+
+  disabledTests = [
+    # AssertionError: True is not false
+    "test_is_literal_or_name"
+  ];
+
+  meta = with lib; {
+    description = "Tool to remove unused imports and unused variables";
+    homepage = "https://github.com/myint/autoflake";
+    license = licenses.mit;
+    maintainers = with maintainers; [ yuriaisaka ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/autograd-gamma/default.nix b/nixpkgs/pkgs/development/python-modules/autograd-gamma/default.nix
new file mode 100644
index 000000000000..bbb5683e0cee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/autograd-gamma/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytestCheckHook, autograd, scipy }:
+
+buildPythonPackage rec {
+  pname = "autograd-gamma";
+  version = "0.4.3";
+
+  src = fetchFromGitHub {
+    owner = "CamDavidsonPilon";
+    repo = "autograd-gamma";
+    rev = "v${version}";
+    sha256 = "0v03gly5k3a1hzb54zpw6409m3riak49qd27hkq2f66ai42ivqz2";
+  };
+
+  propagatedBuildInputs = [
+    autograd
+    scipy
+  ];
+
+  pythonImportsCheck = [ "autograd_gamma" ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  meta = {
+    homepage = "https://github.com/CamDavidsonPilon/autograd-gamma";
+    description = "Autograd compatible approximations to the gamma family of functions";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ swflint ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/autograd/default.nix b/nixpkgs/pkgs/development/python-modules/autograd/default.nix
new file mode 100644
index 000000000000..26f636e85bf0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/autograd/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, future
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "autograd";
+  version = "1.6.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-hzHgigxOOJ2GlaQAcq2kUSZBwRO2ys6PTPvo636a7es=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    future
+  ];
+
+  # Currently, the PyPI tarball doesn't contain the tests. When that has been
+  # fixed, enable testing. See: https://github.com/HIPS/autograd/issues/404
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "autograd"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/HIPS/autograd";
+    description = "Compute derivatives of NumPy code efficiently";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/autoit-ripper/default.nix b/nixpkgs/pkgs/development/python-modules/autoit-ripper/default.nix
new file mode 100644
index 000000000000..ed0c716bbc95
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/autoit-ripper/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pefile
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "autoit-ripper";
+  version = "1.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-a30SDJdKoljWjV0O1sZ35NnQPFcJ0XOPcmTanozWpHY=";
+  };
+
+  propagatedBuildInputs = [
+    pefile
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "pefile==2019.4.18" "pefile>=2019.4.18"
+  '';
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "autoit_ripper"
+  ];
+
+  meta = with lib; {
+    description = "Python module to extract AutoIt scripts embedded in PE binaries";
+    homepage = "https://github.com/nazywam/AutoIt-Ripper";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/autologging/default.nix b/nixpkgs/pkgs/development/python-modules/autologging/default.nix
new file mode 100644
index 000000000000..1b3a7d652185
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/autologging/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "Autologging";
+  version = "1.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "117659584d8aab8cf62046f682f8e57b54d958b8571c737fa8bf15c32937fbb6";
+    extension = "zip";
+  };
+
+  meta = with lib; {
+    homepage = "https://ninthtest.info/python-autologging/";
+    description = "Easier logging and tracing for Python classes";
+    license = licenses.mit;
+    maintainers = with maintainers; [ twey ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/automat/default.nix b/nixpkgs/pkgs/development/python-modules/automat/default.nix
new file mode 100644
index 000000000000..301e71a0a7ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/automat/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, attrs
+, pytest-benchmark
+, pytestCheckHook
+, setuptools-scm
+, six
+}:
+
+let automat = buildPythonPackage rec {
+  version = "22.10.0";
+  pname = "automat";
+
+  src = fetchPypi {
+    pname = "Automat";
+    inherit version;
+    hash = "sha256-5WvrhO2tGdzBHTDo2biV913ute9elrhKRnBms7hLsE4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    six
+    attrs
+  ];
+
+  nativeCheckInputs = [
+    pytest-benchmark
+    pytestCheckHook
+  ];
+
+  # escape infinite recursion with twisted
+  doCheck = false;
+
+  passthru.tests = {
+    check = automat.overridePythonAttrs (_: { doCheck = true; });
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/glyph/Automat";
+    description = "Self-service finite-state machines for the programmer on the go";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}; in automat
diff --git a/nixpkgs/pkgs/development/python-modules/automate-home/default.nix b/nixpkgs/pkgs/development/python-modules/automate-home/default.nix
new file mode 100644
index 000000000000..c13395aa42e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/automate-home/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, apscheduler
+, hiredis
+, aioredis
+, ephem
+, pytz
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "automate-home";
+  version = "0.9.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-41qd+KPSrOrczkovwXht3irbcYlYehBZ1HZ44yZe4cM=";
+  };
+
+  propagatedBuildInputs = [
+    apscheduler
+    hiredis
+    aioredis
+    ephem
+    pytz
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # Rename pyephem, https://github.com/majamassarini/automate-home/pull/3
+    substituteInPlace setup.py \
+      --replace "pyephem" "ephem" \
+      --replace "aioredis==1.3.1" "aioredis"
+  '';
+
+  pythonImportsCheck = [
+    "home"
+  ];
+
+  meta = with lib; {
+    description = "Python module to automate (home) devices";
+    homepage = "https://github.com/majamassarini/automate-home";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/automx2/default.nix b/nixpkgs/pkgs/development/python-modules/automx2/default.nix
new file mode 100644
index 000000000000..cfc3a8484b67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/automx2/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, flask-migrate
+, ldap3
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "automx2";
+  version = "unstable-2023-08-23";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rseichter";
+    repo = pname;
+    rev = "f3e3fc8e769c3799361001d51b7d9335a6a9d1a8";
+    hash = "sha256-NkeazjjGDYUXfoydvEfww6e7SkSZ8rMRlML+oOaf374=";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    flask-migrate
+    ldap3
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "automx2"
+  ];
+
+  meta = with lib; {
+    description = "Email client configuration made easy";
+    homepage = "https://rseichter.github.io/automx2/";
+    changelog = "https://github.com/rseichter/automx2/blob/${version}/CHANGELOG";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ twey ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/autopage/default.nix b/nixpkgs/pkgs/development/python-modules/autopage/default.nix
new file mode 100644
index 000000000000..0973220438ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/autopage/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, setuptools }:
+
+buildPythonPackage rec {
+  pname = "autopage";
+  version = "0.5.1";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Ab4+5hu3FOkJD8xcEPTPVGw5YzHGIMauUKIyGyjtMZk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  pythonImportsCheck = [ "autopage" ];
+
+  meta = with lib; {
+    description = "A library to provide automatic paging for console output";
+    homepage = "https://github.com/zaneb/autopage";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/autopep8/default.nix b/nixpkgs/pkgs/development/python-modules/autopep8/default.nix
new file mode 100644
index 000000000000..9a177d7b4936
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/autopep8/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, glibcLocales
+, pycodestyle
+, pytestCheckHook
+, pythonOlder
+, tomli
+}:
+
+buildPythonPackage rec {
+  pname = "autopep8";
+  version = "2.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "hhatto";
+    repo = "autopep8";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-TuaDnZqn9mRUsoDJkj9JK4ztvzl9JTwAk8nghIkZBvw=";
+  };
+
+  propagatedBuildInputs = [
+    pycodestyle
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  nativeCheckInputs = [
+    glibcLocales
+    pytestCheckHook
+  ];
+
+  env.LC_ALL = "en_US.UTF-8";
+
+  meta = with lib; {
+    changelog = "https://github.com/hhatto/autopep8/releases/tag/v${version}";
+    description = "A tool that automatically formats Python code to conform to the PEP 8 style guide";
+    homepage = "https://github.com/hhatto/autopep8";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/autoslot/default.nix b/nixpkgs/pkgs/development/python-modules/autoslot/default.nix
new file mode 100644
index 000000000000..c234b35e0e58
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/autoslot/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "autoslot";
+  version = "2022.12.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "cjrh";
+    repo = "autoslot";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-fG4rRwRubJt2aXChEsMybEKal6LscZI7GA2uwtK5Vtg=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'requires = ["flit"]' 'requires = ["flit_core"]' \
+      --replace 'build-backend = "flit.buildapi"' 'build-backend = "flit_core.buildapi"'
+  '';
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "autoslot"
+  ];
+
+  meta = with lib; {
+    description = "Automatic __slots__ for your Python classes";
+    homepage = "https://github.com/cjrh/autoslot";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/av/default.nix b/nixpkgs/pkgs/development/python-modules/av/default.nix
new file mode 100644
index 000000000000..e80f521efb2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/av/default.nix
@@ -0,0 +1,154 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, stdenv
+
+# build
+, cython
+, pkg-config
+, setuptools
+
+# runtime
+, ffmpeg_5-headless
+
+# tests
+, numpy
+, pillow
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "av";
+  version = "10.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mikeboers";
+    repo = "PyAV";
+    rev = "v${version}";
+    hash = "sha256-XcHP8RwC2iwD64Jc7SS+t9OxjFTsz3FbrnjMgJnN7Ak=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    pkg-config
+    setuptools
+  ];
+
+  buildInputs = [
+    ffmpeg_5-headless
+  ];
+
+  preCheck = ''
+    # ensure we import the built version
+    rm -r av
+  '';
+
+  nativeCheckInputs = [
+    numpy
+    pillow
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    # Tests that want to download FATE data
+    # https://github.com/PyAV-Org/PyAV/issues/955
+    "--deselect=tests/test_audiofifo.py::TestAudioFifo::test_data"
+    "--deselect=tests/test_codec_context.py::TestCodecContext::test_codec_tag"
+    "--deselect=tests/test_codec_context.py::TestCodecContext::test_parse"
+    "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_aac"
+    "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_dnxhd"
+    "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_dvvideo"
+    "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_h264"
+    "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_mjpeg"
+    "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_mp2"
+    "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_mpeg1video"
+    "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_mpeg4"
+    "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_pcm_s24le"
+    "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_png"
+    "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_tiff"
+    "--deselect=tests/test_codec_context.py::TestEncoding::test_encoding_xvid"
+    "--deselect=tests/test_decode.py::TestDecode::test_decode_audio_sample_count"
+    "--deselect=tests/test_decode.py::TestDecode::test_decoded_motion_vectors"
+    "--deselect=tests/test_decode.py::TestDecode::test_decoded_motion_vectors_no_flag"
+    "--deselect=tests/test_decode.py::TestDecode::test_decoded_time_base"
+    "--deselect=tests/test_decode.py::TestDecode::test_decoded_video_frame_count"
+    "--deselect=tests/test_encode.py::TestBasicAudioEncoding::test_transcode"
+    "--deselect=tests/test_file_probing.py::TestAudioProbe::test_container_probing"
+    "--deselect=tests/test_file_probing.py::TestAudioProbe::test_stream_probing"
+    "--deselect=tests/test_file_probing.py::TestDataProbe::test_container_probing"
+    "--deselect=tests/test_file_probing.py::TestDataProbe::test_stream_probing"
+    "--deselect=tests/test_file_probing.py::TestSubtitleProbe::test_container_probing"
+    "--deselect=tests/test_file_probing.py::TestSubtitleProbe::test_stream_probing"
+    "--deselect=tests/test_file_probing.py::TestVideoProbe::test_container_probing"
+    "--deselect=tests/test_file_probing.py::TestVideoProbe::test_stream_probing"
+    "--deselect=tests/test_python_io.py::TestPythonIO::test_reading_from_buffer"
+    "--deselect=tests/test_python_io.py::TestPythonIO::test_reading_from_buffer_no_see"
+    "--deselect=tests/test_python_io.py::TestPythonIO::test_reading_from_file"
+    "--deselect=tests/test_python_io.py::TestPythonIO::test_reading_from_pipe_readonly"
+    "--deselect=tests/test_python_io.py::TestPythonIO::test_reading_from_write_readonl"
+    "--deselect=tests/test_seek.py::TestSeek::test_decode_half"
+    "--deselect=tests/test_seek.py::TestSeek::test_seek_end"
+    "--deselect=tests/test_seek.py::TestSeek::test_seek_float"
+    "--deselect=tests/test_seek.py::TestSeek::test_seek_int64"
+    "--deselect=tests/test_seek.py::TestSeek::test_seek_middle"
+    "--deselect=tests/test_seek.py::TestSeek::test_seek_start"
+    "--deselect=tests/test_seek.py::TestSeek::test_stream_seek"
+    "--deselect=tests/test_streams.py::TestStreams::test_selection"
+    "--deselect=tests/test_streams.py::TestStreams::test_stream_tuples"
+    "--deselect=tests/test_subtitles.py::TestSubtitle::test_movtext"
+    "--deselect=tests/test_subtitles.py::TestSubtitle::test_vobsub"
+    "--deselect=tests/test_videoframe.py::TestVideoFrameImage::test_roundtrip"
+  ] ++ lib.optionals (stdenv.isDarwin) [
+    # Segmentation Faults
+    "--deselect=tests/test_encode.py::TestBasicVideoEncoding::test_encoding_with_pts"
+    "--deselect=tests/test_pyav.py::test_bayer_write"
+  ];
+
+  disabledTests = [
+    # urlopen fails during DNS resolution
+    "test_writing_to_custom_io"
+  ];
+
+  disabledTestPaths = [
+    # urlopen fails during DNS resolution
+    "tests/test_doctests.py"
+    "tests/test_timeout.py"
+  ];
+
+  pythonImportsCheck = [
+    "av"
+    "av.audio"
+    "av.buffer"
+    "av.bytesource"
+    "av.codec"
+    "av.container"
+    "av._core"
+    "av.datasets"
+    "av.descriptor"
+    "av.dictionary"
+    "av.enum"
+    "av.error"
+    "av.filter"
+    "av.format"
+    "av.frame"
+    "av.logging"
+    "av.option"
+    "av.packet"
+    "av.plane"
+    "av.stream"
+    "av.subtitles"
+    "av.utils"
+    "av.video"
+  ];
+
+  meta = with lib; {
+    description = "Pythonic bindings for FFmpeg/Libav";
+    homepage = "https://github.com/mikeboers/PyAV/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/avea/default.nix b/nixpkgs/pkgs/development/python-modules/avea/default.nix
new file mode 100644
index 000000000000..64e0dc286330
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/avea/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, bluepy
+}:
+
+buildPythonPackage rec {
+  pname = "avea";
+  version = "1.5.2";
+
+  src = fetchFromGitHub {
+    owner = "k0rventen";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1dirf0zdf4hb941w1dvh97vsvcy4h3w9r8jwdgr1ggmhdf9kfx4v";
+  };
+
+  propagatedBuildInputs = [
+    bluepy
+  ];
+
+  # no tests are present
+  doCheck = false;
+  pythonImportsCheck = [ "avea" ];
+
+  meta = with lib; {
+    description = "Python module for interacting with Elgato's Avea bulb";
+    homepage = "https://github.com/k0rventen/avea";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/avion/default.nix b/nixpkgs/pkgs/development/python-modules/avion/default.nix
new file mode 100644
index 000000000000..8bb0f339cd48
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/avion/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, bluepy
+, buildPythonPackage
+, csrmesh
+, fetchPypi
+, pycryptodome
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "avion";
+  version = "0.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-v/0NwFmxDZ9kEOx5qs5L9sKzOg/kto79syctg0Ah+30=";
+  };
+
+  postPatch = ''
+    # https://github.com/mjg59/python-avion/pull/16
+    substituteInPlace setup.py \
+      --replace "bluepy>==1.1.4" "bluepy>=1.1.4"
+  '';
+
+  propagatedBuildInputs = [
+    bluepy
+    csrmesh
+    pycryptodome
+    requests
+  ];
+
+  # Module has no test
+  doCheck = false;
+
+  # bluepy/uuids.json is not found
+  # pythonImportsCheck = [ "avion" ];
+
+  meta = with lib; {
+    description = "Python API for controlling Avi-on Bluetooth dimmers";
+    homepage = "https://github.com/mjg59/python-avion";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/avro-python3/default.nix b/nixpkgs/pkgs/development/python-modules/avro-python3/default.nix
new file mode 100644
index 000000000000..fb51b698ed82
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/avro-python3/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, pycodestyle, isort }:
+
+buildPythonPackage rec {
+  pname = "avro-python3";
+  version = "1.10.2";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3b63f24e6b04368c3e4a6f923f484be0230d821aad65ac36108edbff29e9aaab";
+  };
+
+  buildInputs = [ pycodestyle isort ];
+  doCheck = false;        # No such file or directory: './run_tests.py
+
+  meta = with lib; {
+    description = "A serialization and RPC framework";
+    homepage = "https://pypi.python.org/pypi/avro-python3/";
+    license = licenses.asl20;
+
+    maintainers = [ maintainers.shlevy maintainers.timma ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/avro/default.nix b/nixpkgs/pkgs/development/python-modules/avro/default.nix
new file mode 100644
index 000000000000..e59a7d475079
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/avro/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, typing-extensions
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "avro";
+  version = "1.11.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-U9zVv/zLmnITbwjQsYdxeV6vTu+wKLuq7V9OF4fw4mg=";
+  };
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Requires network access
+    "test_server_with_path"
+    # AssertionError: 'reader type: null not compatible with writer type: int'
+    "test_schema_compatibility_type_mismatch"
+  ];
+
+  pythonImportsCheck = [
+    "avro"
+  ];
+
+  meta = with lib; {
+    description = "Python serialization and RPC framework";
+    homepage = "https://github.com/apache/avro";
+    changelog = "https://github.com/apache/avro/releases/tag/release-${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ zimbatm ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/avro3k/default.nix b/nixpkgs/pkgs/development/python-modules/avro3k/default.nix
new file mode 100644
index 000000000000..65dfc975837f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/avro3k/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "avro3k";
+  version = "1.7.7-SNAPSHOT";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "15ahl0irwwj558s964abdxg4vp6iwlabri7klsm2am6q5r0ngsky";
+  };
+
+  # setuptools.extern.packaging.version.InvalidVersion: Invalid version: '1.7.7-SNAPSHOT'
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "1.7.7-SNAPSHOT" "1.7.7"
+  '';
+
+  doCheck = false;        # No such file or directory: './run_tests.py
+
+  meta = with lib; {
+    description = "A serialization and RPC framework";
+    homepage = "https://pypi.python.org/pypi/avro3k/";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aw-client/default.nix b/nixpkgs/pkgs/development/python-modules/aw-client/default.nix
new file mode 100644
index 000000000000..c856d384d8f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aw-client/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, poetry-core
+, aw-core
+, requests
+, persist-queue
+, click
+, tabulate
+, typing-extensions
+, pytestCheckHook
+, gitUpdater
+}:
+
+buildPythonPackage rec {
+  pname = "aw-client";
+  version = "0.5.13";
+
+  format = "pyproject";
+
+  # pypi distribution doesn't include tests, so build from source instead
+  src = fetchFromGitHub {
+    owner = "ActivityWatch";
+    repo = "aw-client";
+    rev = "v${version}";
+    sha256 = "sha256-A9f1Wj4F6qRvCVj3iRQvsnILewJK1L5tfI2MnAXZ4nY=";
+  };
+
+  disabled = pythonOlder "3.8";
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aw-core
+    requests
+    persist-queue
+    click
+    tabulate
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Only run this test, the others are integration tests that require
+  # an instance of aw-server running in order to function.
+  pytestFlagsArray = [ "tests/test_requestqueue.py" ];
+
+  preCheck = ''
+    # Fake home folder for tests that write to $HOME
+    export HOME="$TMPDIR"
+  '';
+
+  pythonImportsCheck = [ "aw_client" ];
+
+  passthru.updateScript = gitUpdater {
+    rev-prefix = "v";
+  };
+
+  meta = with lib; {
+    description = "Client library for ActivityWatch";
+    homepage = "https://github.com/ActivityWatch/aw-client";
+    maintainers = with maintainers; [ huantian ];
+    license = licenses.mpl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aw-core/default.nix b/nixpkgs/pkgs/development/python-modules/aw-core/default.nix
new file mode 100644
index 000000000000..9707e7978601
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aw-core/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, poetry-core
+, jsonschema
+, peewee
+, platformdirs
+, iso8601
+, rfc3339-validator
+, strict-rfc3339
+, tomlkit
+, deprecation
+, timeslot
+, pytestCheckHook
+, gitUpdater
+}:
+
+buildPythonPackage rec {
+  pname = "aw-core";
+  version = "0.5.16";
+
+  format = "pyproject";
+
+  # pypi distribution doesn't include tests, so build from source instead
+  src = fetchFromGitHub {
+    owner = "ActivityWatch";
+    repo = "aw-core";
+    rev = "v${version}";
+    sha256 = "sha256-7xT7bOGzH5G4WpgNo8pDyiQqX0dWNLNHpgssozUa9kQ=";
+  };
+
+  disabled = pythonOlder "3.8";
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    jsonschema
+    peewee
+    platformdirs
+    iso8601
+    rfc3339-validator
+    strict-rfc3339
+    tomlkit
+    deprecation
+    timeslot
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    # Fake home folder for tests that write to $HOME
+    export HOME="$TMPDIR"
+  '';
+
+  pythonImportsCheck = [ "aw_core" ];
+
+  passthru.updateScript = gitUpdater {
+    rev-prefix = "v";
+  };
+
+  meta = with lib; {
+    description = "Core library for ActivityWatch";
+    homepage = "https://github.com/ActivityWatch/aw-core";
+    maintainers = with maintainers; [ huantian ];
+    license = licenses.mpl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/awacs/default.nix b/nixpkgs/pkgs/development/python-modules/awacs/default.nix
new file mode 100644
index 000000000000..f59eaccd1b9a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/awacs/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, python
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "awacs";
+  version = "2.4.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-iflg6tjqFl1gWOzlJhQwGHhAQ/pKm9n8GVvUz6fSboM=";
+  };
+
+  propagatedBuildInputs = lib.lists.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest discover
+  '';
+
+  pythonImportsCheck = [
+    "awacs"
+  ];
+
+  meta = with lib; {
+    description = "AWS Access Policy Language creation library";
+    homepage = "https://github.com/cloudtools/awacs";
+    changelog = "https://github.com/cloudtools/awacs/blob/${version}/CHANGELOG.md";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ jlesquembre ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/awesome-slugify/default.nix b/nixpkgs/pkgs/development/python-modules/awesome-slugify/default.nix
new file mode 100644
index 000000000000..2ddccf85f82f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/awesome-slugify/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi, unidecode, regex, unittestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "awesome-slugify";
+  version = "1.6.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0wgxrhr8s5vk2xmcz9s1z1aml4ppawmhkbggl9rp94c747xc7pmv";
+  };
+
+  prePatch = ''
+    substituteInPlace setup.py \
+        --replace 'Unidecode>=0.04.14,<0.05' 'Unidecode>=0.04.14'
+  '';
+
+  patches = [
+    ./slugify_filename_test.patch # fixes broken test by new unidecode
+  ];
+
+  propagatedBuildInputs = [ unidecode regex ];
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  meta = with lib; {
+    homepage = "https://github.com/dimka665/awesome-slugify";
+    description = "Python flexible slugify function";
+    license = licenses.gpl3;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/awesome-slugify/slugify_filename_test.patch b/nixpkgs/pkgs/development/python-modules/awesome-slugify/slugify_filename_test.patch
new file mode 100644
index 000000000000..3283d76eae05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/awesome-slugify/slugify_filename_test.patch
@@ -0,0 +1,13 @@
+diff --git i/slugify/tests.py w/slugify/tests.py
+index 4c9fa1c..3e14328 100644
+--- i/slugify/tests.py
++++ w/slugify/tests.py
+@@ -57,7 +57,7 @@ class PredefinedSlugifyTestCase(unittest.TestCase):
+         self.assertEqual(slugify_url('The Über article'), 'uber-article')
+ 
+     def test_slugify_filename(self):
+-        self.assertEqual(slugify_filename(u'Дrаft №2.txt'), u'Draft_2.txt')
++        self.assertEqual(slugify_filename(u'Дrаft №2.txt'), u'Draft_No._2.txt')
+ 
+ 
+ class ToLowerTestCase(unittest.TestCase):
diff --git a/nixpkgs/pkgs/development/python-modules/awesomeversion/default.nix b/nixpkgs/pkgs/development/python-modules/awesomeversion/default.nix
new file mode 100644
index 000000000000..790a9c4bbb1d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/awesomeversion/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "awesomeversion";
+  version = "23.8.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ludeeus";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-7JJNO25UfzLs1jEO7XpqFFuEqpY4UecUk25hpONRjrI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # Upstream doesn't set a version
+    substituteInPlace pyproject.toml \
+      --replace 'version = "0"' 'version = "${version}"'
+  '';
+
+  pythonImportsCheck = [
+    "awesomeversion"
+  ];
+
+  meta = with lib; {
+    description = "Python module to deal with versions";
+    homepage = "https://github.com/ludeeus/awesomeversion";
+    changelog = "https://github.com/ludeeus/awesomeversion/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/awkward-cpp/default.nix b/nixpkgs/pkgs/development/python-modules/awkward-cpp/default.nix
new file mode 100644
index 000000000000..2c3bd96fcf22
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/awkward-cpp/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, cmake
+, ninja
+, pybind11
+, scikit-build-core
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "awkward-cpp";
+  version = "26";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-o3wI+JEmtjfUczRUob8/KLGNn3lH0h3GuhIDfYg7HGY=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    ninja
+    pybind11
+    scikit-build-core
+  ] ++ scikit-build-core.optional-dependencies.pyproject;
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  pythonImportsCheck = [
+    "awkward_cpp"
+  ];
+
+  meta = with lib; {
+    description = "CPU kernels and compiled extensions for Awkward Array";
+    homepage = "https://github.com/scikit-hep/awkward";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/awkward/default.nix b/nixpkgs/pkgs/development/python-modules/awkward/default.nix
new file mode 100644
index 000000000000..b4e4774af8ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/awkward/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, hatch-fancy-pypi-readme
+, hatchling
+, awkward-cpp
+, importlib-metadata
+, numpy
+, packaging
+, typing-extensions
+, fsspec
+, jax
+, jaxlib
+, numba
+, setuptools
+, numexpr
+, pandas
+, pyarrow
+, pytest-xdist
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "awkward";
+  version = "2.4.10";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "scikit-hep";
+    repo = "awkward";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-D+bgKI6olK3smgnRdACvd0gYMWvS6ao6f7nQh3YExXw=";
+  };
+
+  nativeBuildInputs = [
+    hatch-fancy-pypi-readme
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    awkward-cpp
+    importlib-metadata
+    numpy
+    packaging
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    typing-extensions
+  ] ++ lib.optionals (pythonOlder "3.12") [
+    importlib-metadata
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  pythonImportsCheck = [ "awkward" ];
+
+  nativeCheckInputs = [
+    fsspec
+    jax
+    jaxlib
+    numba
+    setuptools
+    numexpr
+    pandas
+    pyarrow
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  # The following tests have been disabled because they need to be run on a GPU platform.
+  disabledTestPaths = [
+    "tests-cuda"
+  ];
+
+  meta = with lib; {
+    description = "Manipulate JSON-like data with NumPy-like idioms";
+    homepage = "https://github.com/scikit-hep/awkward";
+    changelog = "https://github.com/scikit-hep/awkward/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aws-adfs/default.nix b/nixpkgs/pkgs/development/python-modules/aws-adfs/default.nix
new file mode 100644
index 000000000000..a4d3fb4c838d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aws-adfs/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, boto3
+, botocore
+, buildPythonPackage
+, click
+, configparser
+, fetchFromGitHub
+, fido2
+, lxml
+, poetry-core
+, pyopenssl
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-kerberos
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "aws-adfs";
+  version = "2.9.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "venth";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-IZeEb87NX3fyw1hENF1LldbgbaXXPG3u2AiCeci6MIw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    boto3
+    botocore
+    click
+    configparser
+    fido2
+    lxml
+    pyopenssl
+    requests
+    requests-kerberos
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    toml
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  pythonImportsCheck = [
+    "aws_adfs"
+  ];
+
+  meta = with lib; {
+    description = "Command line tool to ease AWS CLI authentication against ADFS";
+    homepage = "https://github.com/venth/aws-adfs";
+    changelog = "https://github.com/venth/aws-adfs/releases/tag/v${version}";
+    license = licenses.psfl;
+    maintainers = with maintainers; [ bhipple ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aws-encryption-sdk/default.nix b/nixpkgs/pkgs/development/python-modules/aws-encryption-sdk/default.nix
new file mode 100644
index 000000000000..7c69b062bd80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aws-encryption-sdk/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, attrs
+, boto3
+, cryptography
+, setuptools
+, wrapt
+, mock
+, pytest
+, pytest-mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aws-encryption-sdk";
+  version = "3.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jV+/AY/GjWscrL5N0Df9gFKWx3Nqn+RX62hNBT9/lWM=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    boto3
+    cryptography
+    setuptools
+    wrapt
+  ];
+
+  doCheck = true;
+
+  nativeCheckInputs = [
+    mock
+    pytest
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # requires networking
+    "examples"
+    "test/integration"
+  ];
+
+  meta = with lib; {
+    homepage = "https://aws-encryption-sdk-python.readthedocs.io/";
+    changelog = "https://github.com/aws/aws-encryption-sdk-python/blob/v${version}/CHANGELOG.rst";
+    description = "Fully compliant, native Python implementation of the AWS Encryption SDK.";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ anthonyroussel ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aws-lambda-builders/default.nix b/nixpkgs/pkgs/development/python-modules/aws-lambda-builders/default.nix
new file mode 100644
index 000000000000..0509ccced740
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aws-lambda-builders/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, parameterized
+, pip
+, pyelftools
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "aws-lambda-builders";
+  version = "1.42.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "awslabs";
+    repo = "aws-lambda-builders";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-rgRGKpthZ0nitO91Z5xUimakDFvcLh4UFKnxnEmRLHI=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "version=read_version()," 'version="${version}",'
+  '';
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    mock
+    parameterized
+    pip
+    pyelftools
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # CLI don't work in the sandbox
+    "test_run_hello_workflow"
+    # Don't tests integrations
+    "TestCustomMakeWorkflow"
+    "TestDotnet31"
+    "TestDotnet6"
+    "TestGoWorkflow"
+    "TestJavaGradle"
+    "TestJavaMaven"
+    "TestNodejsNpmWorkflow"
+    "TestNodejsNpmWorkflowWithEsbuild"
+    "TestPipRunner"
+    "TestPythonPipWorkflow"
+    "TestRubyWorkflow"
+    "TestRustCargo"
+    # Tests which are passing locally but not on Hydra
+    "test_copy_dependencies_action_1_multiple_files"
+    "test_move_dependencies_action_1_multiple_files"
+  ];
+
+  pythonImportsCheck = [
+    "aws_lambda_builders"
+  ];
+
+  meta = with lib; {
+    description = "Tool to compile, build and package AWS Lambda functions";
+    homepage = "https://github.com/awslabs/aws-lambda-builders";
+    changelog = "https://github.com/aws/aws-lambda-builders/releases/tag/v${version}";
+    longDescription = ''
+      Lambda Builders is a Python library to compile, build and package
+      AWS Lambda functions for several runtimes & frameworks.
+    '';
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dhkl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aws-sam-translator/default.nix b/nixpkgs/pkgs/development/python-modules/aws-sam-translator/default.nix
new file mode 100644
index 000000000000..5d7cbaf889f0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aws-sam-translator/default.nix
@@ -0,0 +1,87 @@
+{ lib
+, boto3
+, buildPythonPackage
+, fetchFromGitHub
+, jsonschema
+, parameterized
+, pydantic
+, pytest-env
+, pytest-rerunfailures
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "aws-sam-translator";
+  version = "1.81.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aws";
+    repo = "serverless-application-model";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Ik9ZO7l2dbjJg+PlSRUoMkrjSBeghKN5DZjx7CjDBPg=";
+  };
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace " --cov samtranslator --cov-report term-missing --cov-fail-under 95" ""
+  '';
+
+  propagatedBuildInputs = [
+    boto3
+    jsonschema
+    pydantic
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    parameterized
+    pytest-env
+    pytest-rerunfailures
+    pytest-xdist
+    pytestCheckHook
+    pyyaml
+  ];
+
+  pythonImportsCheck = [
+    "samtranslator"
+  ];
+
+  preCheck = ''
+    sed -i '2ienv =\n\tAWS_DEFAULT_REGION=us-east-1' pytest.ini
+  '';
+
+  disabledTests = [
+    # urllib3 2.0 compat
+    "test_plugin_accepts_different_sar_client"
+    "test_plugin_accepts_flags"
+    "test_plugin_accepts_parameters"
+    "test_plugin_default_values"
+    "test_plugin_invalid_configuration_raises_exception"
+    "test_plugin_must_setup_correct_name"
+    "test_must_process_applications"
+    "test_must_process_applications_validate"
+    "test_process_invalid_applications"
+    "test_process_invalid_applications_validate"
+    "test_resolve_intrinsics"
+    "test_sar_service_calls"
+    "test_sar_success_one_app"
+    "test_sar_throttling_doesnt_stop_processing"
+    "test_sleep_between_sar_checks"
+    "test_unexpected_sar_error_stops_processing"
+  ];
+
+  meta = with lib; {
+    description = "Python library to transform SAM templates into AWS CloudFormation templates";
+    homepage = "https://github.com/aws/serverless-application-model";
+    changelog = "https://github.com/aws/serverless-application-model/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aws-secretsmanager-caching/default.nix b/nixpkgs/pkgs/development/python-modules/aws-secretsmanager-caching/default.nix
new file mode 100644
index 000000000000..7e54c030bf1e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aws-secretsmanager-caching/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, setuptools
+, setuptools-scm
+, botocore
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "aws_secretsmanager_caching";
+  version = "1.1.1.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5cee2762bb89b72f3e5123feee8e45fbe44ffe163bfca08b28f27b2e2b7772e1";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    botocore
+    setuptools  # Needs pkg_resources at runtime.
+  ];
+
+  patches = [
+    # Remove coverage tests from the pytest invocation in setup.cfg.
+    ./remove-coverage-tests.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'," ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Integration tests require networking.
+    "test/integ"
+  ];
+
+  pythonImportsCheck = [
+    "aws_secretsmanager_caching"
+  ];
+
+  meta = with lib; {
+    description = "Client-side AWS secrets manager caching library";
+    homepage = "https://github.com/aws/aws-secretsmanager-caching-python";
+    changelog = "https://github.com/aws/aws-secretsmanager-caching-python/releases/tag/v${version}";
+    longDescription = ''
+      The AWS Secrets Manager Python caching client enables in-process caching of secrets for Python applications.
+    '';
+    license = licenses.asl20;
+    maintainers = with maintainers; [ tomaskala ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/aws-secretsmanager-caching/remove-coverage-tests.patch b/nixpkgs/pkgs/development/python-modules/aws-secretsmanager-caching/remove-coverage-tests.patch
new file mode 100644
index 000000000000..57af75dcb4fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aws-secretsmanager-caching/remove-coverage-tests.patch
@@ -0,0 +1,14 @@
+diff --git a/setup.cfg b/setup.cfg
+index 5aa81b2..0c02ded 100644
+--- a/setup.cfg
++++ b/setup.cfg
+@@ -3,9 +3,6 @@ xfail_strict = true
+ addopts = 
+ 	--verbose
+ 	--doctest-modules
+-	--cov aws_secretsmanager_caching
+-	--cov-fail-under 90
+-	--cov-report term-missing
+ 	--ignore doc/
+ 
+ [aliases]
diff --git a/nixpkgs/pkgs/development/python-modules/aws-xray-sdk/default.nix b/nixpkgs/pkgs/development/python-modules/aws-xray-sdk/default.nix
new file mode 100644
index 000000000000..e2fb2414a2c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/aws-xray-sdk/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, importlib-metadata
+, jsonpickle
+, wrapt
+, requests
+, future
+, botocore
+}:
+
+buildPythonPackage rec {
+  pname = "aws-xray-sdk";
+  version = "2.12.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-KVr8I3BzqAlW19TyfDGDDty5qMzKnviqRJkLre8V5bc=";
+  };
+
+  propagatedBuildInputs = [
+    jsonpickle wrapt requests future botocore
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  meta = {
+    description = "AWS X-Ray SDK for the Python programming language";
+    license = lib.licenses.asl20;
+    homepage = "https://github.com/aws/aws-xray-sdk-python";
+  };
+
+  doCheck = false;
+}
diff --git a/nixpkgs/pkgs/development/python-modules/awscrt/default.nix b/nixpkgs/pkgs/development/python-modules/awscrt/default.nix
new file mode 100644
index 000000000000..9d739c81f700
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/awscrt/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cmake
+, perl
+, stdenv
+, gcc10
+, CoreFoundation
+, Security
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "awscrt";
+  version = "0.19.18";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NQtu/Y6+4ILqPz5SxZo8PsWUza8B24tIU9zrn+yQyJ0=";
+  };
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    CoreFoundation
+    Security
+  ];
+
+  # gcc <10 is not supported, LLVM on darwin is just fine
+  nativeBuildInputs = [
+    cmake
+  ] ++ lib.optionals (!stdenv.isDarwin && stdenv.isAarch64) [
+    gcc10
+    perl
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  pythonImportsCheck = [
+    "awscrt"
+  ];
+
+  # Unable to import test module
+  # https://github.com/awslabs/aws-crt-python/issues/281
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/awslabs/aws-crt-python";
+    changelog = "https://github.com/awslabs/aws-crt-python/releases/tag/v${version}";
+    description = "Python bindings for the AWS Common Runtime";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ davegallant ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/awsiotpythonsdk/default.nix b/nixpkgs/pkgs/development/python-modules/awsiotpythonsdk/default.nix
new file mode 100644
index 000000000000..5907b74ba220
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/awsiotpythonsdk/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "AWSIoTPythonSDK";
+  version = "1.5.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aws";
+    repo = "aws-iot-device-sdk-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-GHMnDRxXkaKDTaawwPtMqa7EZJ8Y35+ScgtfEP9PJGs=";
+  };
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "AWSIoTPythonSDK"
+  ];
+
+  meta = with lib; {
+    description = "Python SDK for connecting to AWS IoT";
+    homepage = "https://github.com/aws/aws-iot-device-sdk-python";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/awslambdaric/default.nix b/nixpkgs/pkgs/development/python-modules/awslambdaric/default.nix
new file mode 100644
index 000000000000..1d89f2e93241
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/awslambdaric/default.nix
@@ -0,0 +1,67 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, isPy27
+, pytestCheckHook
+, autoconf
+, automake
+, cmake
+, gcc
+, libtool
+, perl
+, simplejson
+}:
+
+buildPythonPackage rec {
+  pname = "awslambdaric";
+  version = "2.0.7";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "aws";
+    repo = "aws-lambda-python-runtime-interface-client";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-9PgdLzeSafglguXksMetzopbDlBWlGDSSXiZHfuWgE8=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # https://github.com/aws/aws-lambda-python-runtime-interface-client/pull/58
+      url = "https://github.com/aws/aws-lambda-python-runtime-interface-client/commit/162c3c0051bb9daa92e4a2a4af7e90aea60ee405.patch";
+      sha256 = "09qqq5x6npc9jw2qbhzifqn5sqiby4smiin1aw30psmlp21fv7j8";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements/base.txt \
+      --replace 'simplejson==3' 'simplejson~=3'
+  '';
+
+  propagatedBuildInputs = [ simplejson ];
+
+  nativeBuildInputs = [ autoconf automake cmake libtool perl ];
+
+  buildInputs = [ gcc ];
+
+  dontUseCmakeConfigure = true;
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  disabledTests = [
+    # Test fails with: Assertion error
+    "test_handle_event_request_fault_exception_logging_syntax_error"
+  ];
+
+  pythonImportsCheck = [ "awslambdaric" "runtime_client" ];
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64);
+    description = "AWS Lambda Runtime Interface Client for Python";
+    homepage = "https://github.com/aws/aws-lambda-python-runtime-interface-client";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ austinbutler ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/awswrangler/default.nix b/nixpkgs/pkgs/development/python-modules/awswrangler/default.nix
new file mode 100644
index 000000000000..11dc67a61f63
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/awswrangler/default.nix
@@ -0,0 +1,90 @@
+{ backoff
+, sparqlwrapper
+, boto3
+, buildPythonPackage
+, fetchFromGitHub
+, gremlinpython
+, jsonpath-ng
+, lib
+, moto
+, openpyxl
+, opensearch-py
+, pandas
+, pg8000
+, poetry-core
+, progressbar2
+, pyarrow
+, pymysql
+, pyodbc
+, pyparsing
+, pytestCheckHook
+, pythonOlder
+, redshift-connector
+, requests-aws4auth
+}:
+
+buildPythonPackage rec {
+  pname = "awswrangler";
+  version = "3.4.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "aws";
+    repo = "aws-sdk-pandas";
+    rev = "refs/tags/${version}";
+    hash = "sha256-fvqtSDd5lResArquOdhcLYqpDo5yFWaknQlq3pODbX8=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    boto3
+    gremlinpython
+    jsonpath-ng
+    openpyxl
+    opensearch-py
+    pandas
+    pg8000
+    progressbar2
+    pyarrow
+    pymysql
+    redshift-connector
+    requests-aws4auth
+  ];
+
+  nativeCheckInputs = [
+    moto
+    pyparsing
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    # Subset of tests that run in upstream CI (many others require credentials)
+    # https://github.com/aws/aws-sdk-pandas/blob/20fec775515e9e256e8cee5aee12966516608840/.github/workflows/minimal-tests.yml#L36-L43
+    "tests/unit/test_metadata.py"
+    "tests/unit/test_session.py"
+    "tests/unit/test_utils.py"
+    "tests/unit/test_moto.py"
+  ];
+
+  passthru.optional-dependencies = {
+    sqlserver = [
+      pyodbc
+    ];
+    sparql = [
+      sparqlwrapper
+    ];
+  };
+
+  meta = with lib; {
+    description = "Pandas on AWS";
+    homepage = "https://github.com/aws/aws-sdk-pandas";
+    changelog = "https://github.com/aws/aws-sdk-pandas/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ mcwitt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ax/default.nix b/nixpkgs/pkgs/development/python-modules/ax/default.nix
new file mode 100644
index 000000000000..1a4da01df6d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ax/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, botorch
+, ipywidgets
+, jinja2
+, pandas
+, plotly
+, setuptools
+, setuptools-scm
+, typeguard
+, wheel
+, hypothesis
+, mercurial
+, pyfakefs
+, pytestCheckHook
+, yappi
+}:
+
+buildPythonPackage rec {
+  pname = "ax";
+  version = "0.3.4";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "facebook";
+    repo = pname;
+    rev = version;
+    hash = "sha256-Yc6alEKXbtQ0hitIdPhkJWhZQg150b0NJJRLZ+f1hdY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    botorch
+    ipywidgets
+    jinja2
+    pandas
+    plotly
+    typeguard
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  checkInputs = [
+    hypothesis
+    mercurial
+    pyfakefs
+    pytestCheckHook
+    yappi
+  ];
+  pytestFlagsArray = [
+    "--ignore=ax/benchmark"
+    "--ignore=ax/runners/tests/test_torchx.py"
+    # requires pyre_extensions
+    "--ignore=ax/telemetry/tests"
+    "--ignore=ax/core/tests/test_utils.py"
+    "--ignore=ax/early_stopping/tests/test_strategies.py"
+    # broken with sqlalchemy 2
+    "--ignore=ax/service/tests/test_ax_client.py"
+    "--ignore=ax/service/tests/test_scheduler.py"
+    "--ignore=ax/service/tests/test_with_db_settings_base.py"
+    "--ignore=ax/storage"
+  ];
+  disabledTests = [
+    # exact comparison of floating points
+    "test_optimize_l0_homotopy"
+    # AssertionError: 5 != 2
+    "test_get_standard_plots_moo"
+    # AssertionError: Expected 'warning' to be called once. Called 3 times
+    "test_validate_kwarg_typing"
+  ];
+  pythonImportsCheck = [ "ax" ];
+
+  meta = with lib; {
+    description = "Ax is an accessible, general-purpose platform for understanding, managing, deploying, and automating adaptive experiments";
+    homepage = "https://ax.dev/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/axis/default.nix b/nixpkgs/pkgs/development/python-modules/axis/default.nix
new file mode 100644
index 000000000000..ba0526837ec2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/axis/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, async-timeout
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, orjson
+, packaging
+, pythonOlder
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "axis";
+  version = "48";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Kane610";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-/Iz1F40Y00bgJUvNrkPGyA8Kkch92Kijeg8TQ8mostM=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+    attrs
+    httpx
+    orjson
+    packaging
+    xmltodict
+  ];
+
+  # Tests requires a server on localhost
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "axis"
+  ];
+
+  meta = with lib; {
+    description = "Python library for communicating with devices from Axis Communications";
+    homepage = "https://github.com/Kane610/axis";
+    changelog = "https://github.com/Kane610/axis/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-appconfiguration/default.nix b/nixpkgs/pkgs/development/python-modules/azure-appconfiguration/default.nix
new file mode 100644
index 000000000000..40726506f72b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-appconfiguration/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, pythonOlder
+, isodate
+, fetchPypi
+, buildPythonPackage
+, azure-core
+}:
+
+buildPythonPackage rec {
+  pname = "azure-appconfiguration";
+  version = "1.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-cJIRe68GzY6T7ukhN+coF2m0AD/EFtSh7aZGuyVkAnw=";
+  };
+
+  propagatedBuildInputs = [
+    azure-core
+    isodate
+  ];
+
+  # Tests are not shipped
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.appconfiguration"
+  ];
+
+  meta = with lib; {
+    description = "Microsoft App Configuration Data Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/appconfiguration/azure-appconfiguration";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-appconfiguration_${version}/sdk/appconfiguration/azure-appconfiguration/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-applicationinsights/default.nix b/nixpkgs/pkgs/development/python-modules/azure-applicationinsights/default.nix
new file mode 100644
index 000000000000..1d4e17edc64b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-applicationinsights/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-common
+, msrest
+}:
+
+buildPythonPackage rec {
+  pname = "azure-applicationinsights";
+  version = "0.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-qIRbgDZbfyALrR9xqA0NMfO+wB7f1GfftsE+or1xupY=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    msrest
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Application Insights Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-batch/default.nix b/nixpkgs/pkgs/development/python-modules/azure-batch/default.nix
new file mode 100644
index 000000000000..2ca6a6d743ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-batch/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, azure-common
+, msrestazure
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-batch";
+  version = "14.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-FlsembhvghAkxProX7NIadQHqg67DKS5b7JthZwmyTQ=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.batch"
+  ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Batch Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-common/default.nix b/nixpkgs/pkgs/development/python-modules/azure-common/default.nix
new file mode 100644
index 000000000000..47d0039e5e4b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-common/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-nspkg
+, isPyPy
+, setuptools
+, python
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  version = "1.1.28";
+  pname = "azure-common";
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-SsDNMhTja2obakQmhnIqXYzESWA6qDPz8PQL2oNnBKM=";
+  };
+
+  propagatedBuildInputs = [
+    azure-nspkg
+  ] ++ lib.optionals (!isPy3k) [ setuptools ]; # need for namespace lookup
+
+  postInstall = lib.optionalString (!isPy3k) ''
+    echo "__import__('pkg_resources').declare_namespace(__name__)" >> "$out/lib/${python.libPrefix}"/site-packages/azure/__init__.py
+  '';
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure common code";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ olcai maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-containerregistry/default.nix b/nixpkgs/pkgs/development/python-modules/azure-containerregistry/default.nix
new file mode 100644
index 000000000000..7b6d8ba17915
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-containerregistry/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, azure-core
+, msrest
+, msrestazure
+, isodate
+}:
+
+buildPythonPackage rec {
+  pname = "azure-containerregistry";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Ss0ygh0IZVPqvV3f7Lsh+5FbXRPvg3XRWvyyyAvclqM=";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    azure-core
+    msrest
+    msrestazure
+    isodate
+  ];
+
+  # tests require azure-devtools which are not published (since 2020)
+  # https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/containerregistry/azure-containerregistry/dev_requirements.txt
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.core"
+    "azure.containerregistry"
+  ];
+
+  meta = with lib; {
+    description = "Microsoft Azure Container Registry client library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/containerregistry/azure-containerregistry";
+    license = licenses.mit;
+    maintainers = with maintainers; [ peterromfeldhk ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-core/default.nix b/nixpkgs/pkgs/development/python-modules/azure-core/default.nix
new file mode 100644
index 000000000000..44f3c1b81085
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-core/default.nix
@@ -0,0 +1,107 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, aiodns
+, aiohttp
+, flask
+, mock
+, pytest
+, pytest-asyncio
+, pytest-trio
+, pytestCheckHook
+, requests
+, six
+, trio
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  version = "1.28.0";
+  pname = "azure-core";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  __darwinAllowLocalNetworking = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-6e78Zvwf3lbatvBNTl0SxgdU1an6Sb3P2FNPyW7ZNr0=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    six
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = {
+    aio = [
+      aiohttp
+    ];
+  };
+
+  nativeCheckInputs = [
+    aiodns
+    flask
+    mock
+    pytest
+    pytest-trio
+    pytest-asyncio
+    pytestCheckHook
+    trio
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  # test server needs to be available
+  preCheck = ''
+    export PYTHONPATH=tests/testserver_tests/coretestserver:$PYTHONPATH
+  '';
+
+  pytestFlagsArray = [
+    "tests/"
+  ];
+
+  # disable tests which touch network
+  disabledTests = [
+    "aiohttp"
+    "multipart_send"
+    "response"
+    "request"
+    "timeout"
+    "test_sync_transport_short_read_download_stream"
+    "test_aio_transport_short_read_download_stream"
+  # disable 8 tests failing on some darwin machines with errors:
+  # azure.core.polling.base_polling.BadStatus: Invalid return status 403 for 'GET' operation
+  # azure.core.exceptions.HttpResponseError: Operation returned an invalid status 'Forbidden'
+  ] ++ lib.optionals stdenv.isDarwin [
+    "location_polling_fail"
+  ];
+
+  disabledTestPaths = [
+    # requires testing modules which aren't published, and likely to create cyclic dependencies
+    "tests/test_connection_string_parsing.py"
+    # wants network
+    "tests/async_tests/test_streaming_async.py"
+    "tests/test_streaming.py"
+    # testserver tests require being in a very specific working directory to make it work
+    "tests/testserver_tests/"
+    # requires missing pytest plugin
+    "tests/async_tests/test_rest_asyncio_transport.py"
+    # needs msrest, which cannot be included in nativeCheckInputs due to circular dependency new in msrest 0.7.1
+    # azure-core needs msrest which needs azure-core
+    "tests/test_polling.py"
+    "tests/async_tests/test_base_polling_async.py"
+    "tests/async_tests/test_polling_async.py"
+  ];
+
+  meta = with lib; {
+    description = "Microsoft Azure Core Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/main/sdk/core/azure-core/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-cosmos/default.nix b/nixpkgs/pkgs/development/python-modules/azure-cosmos/default.nix
new file mode 100644
index 000000000000..f41bc696d56f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-cosmos/default.nix
@@ -0,0 +1,30 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, six
+, requests
+}:
+
+buildPythonPackage rec {
+  version = "4.5.1";
+  pname = "azure-cosmos";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-xK2oOBMG7sQTwBvFCneOJk3D9Pr6nWlvnfhDYUjSrqg=";
+  };
+
+  propagatedBuildInputs = [ six requests ];
+
+  pythonNamespaces = [ "azure" ];
+
+  # requires an active Azure Cosmos service
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Azure Cosmos DB API";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-cosmosdb-nspkg/default.nix b/nixpkgs/pkgs/development/python-modules/azure-cosmosdb-nspkg/default.nix
new file mode 100644
index 000000000000..a2b686af6887
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-cosmosdb-nspkg/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-cosmosdb-nspkg";
+  version = "2.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "acf691e692818d9a65c653c7a3485eb8e35c0bdc496bba652e5ea3905ba09cd8";
+  };
+
+  propagatedBuildInputs = [
+    azure-nspkg
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure CosmosDB namespace package";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-cosmosdb-table/default.nix b/nixpkgs/pkgs/development/python-modules/azure-cosmosdb-table/default.nix
new file mode 100644
index 000000000000..8d92e1559d59
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-cosmosdb-table/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cryptography
+, azure-common
+, azure-storage-common
+, azure-cosmosdb-nspkg
+, futures ? null
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-cosmosdb-table";
+  version = "1.0.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5f061d2ab8dcf2f0b4e965d5976e7b7aeb1247ea896911f0e1d29092aaaa29c7";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    azure-common
+    azure-storage-common
+    azure-cosmosdb-nspkg
+  ] ++ lib.optionals (!isPy3k) [
+    futures
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Log Analytics Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-data-tables/default.nix b/nixpkgs/pkgs/development/python-modules/azure-data-tables/default.nix
new file mode 100644
index 000000000000..783a792513be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-data-tables/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, azure-core
+, buildPythonPackage
+, fetchPypi
+, isodate
+, pythonOlder
+, typing-extensions
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "azure-data-tables";
+  version = "12.4.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-HWjIQBWYmU43pSxKLcwx45EExn10jeEkyY9Hpbyn0vw=";
+  };
+
+  propagatedBuildInputs = [
+    azure-core
+    isodate
+    typing-extensions
+    yarl
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.data.tables"
+  ];
+
+  meta = with lib; {
+    description = "NoSQL data storage service that can be accessed from anywhere";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-data-tables_${version}/sdk/tables/azure-data-tables/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-datalake-store/default.nix b/nixpkgs/pkgs/development/python-modules/azure-datalake-store/default.nix
new file mode 100644
index 000000000000..7dcf5c8b7398
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-datalake-store/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, adal
+, azure-common
+, buildPythonPackage
+, fetchPypi
+, msal
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "azure-datalake-store";
+  version = "0.0.53";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-BbbeYu4/KgpuaUHmkzt5K4AMPn9v/OL8MkvBmHV1c5M=";
+  };
+
+  propagatedBuildInputs = [
+    adal
+    azure-common
+    msal
+    requests
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This project is the Python filesystem library for Azure Data Lake Store";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-eventgrid/default.nix b/nixpkgs/pkgs/development/python-modules/azure-eventgrid/default.nix
new file mode 100644
index 000000000000..4d9c50bb0594
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-eventgrid/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, azure-common
+, azure-core
+, buildPythonPackage
+, fetchPypi
+, isodate
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "azure-eventgrid";
+  version = "4.16.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-o895Xjp/su2mc1WHbsQvWDe28sX/HhLtOb7BC5TFkyg=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    isodate
+  ]  ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.eventgrid"
+  ];
+
+  meta = with lib; {
+    description = "A fully-managed intelligent event routing service that allows for uniform event consumption using a publish-subscribe model";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-eventgrid_${version}/sdk/eventgrid/azure-eventgrid/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-eventhub/default.nix b/nixpkgs/pkgs/development/python-modules/azure-eventhub/default.nix
new file mode 100644
index 000000000000..ba589b8aa5e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-eventhub/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-core
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "azure-eventhub";
+  version = "5.11.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-HDdOmQezNIPVCLTHst8p+crGM15dpaGNIYU0+UL01Uw=";
+  };
+
+  propagatedBuildInputs = [
+    azure-core
+    typing-extensions
+  ];
+
+  # too complicated to set up
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.eventhub"
+    "azure.eventhub.aio"
+  ];
+
+  meta = with lib; {
+    description = "Microsoft Azure Event Hubs Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/eventhub/azure-eventhub";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-eventhub_${version}/sdk/eventhub/azure-eventhub/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-functions-devops-build/default.nix b/nixpkgs/pkgs/development/python-modules/azure-functions-devops-build/default.nix
new file mode 100644
index 000000000000..03007ae3c236
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-functions-devops-build/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, jinja2
+, msrest
+, vsts
+}:
+
+buildPythonPackage rec {
+  version = "0.0.22";
+  pname = "azure-functions-devops-build";
+
+  src = fetchFromGitHub {
+    owner = "Azure";
+    repo = "azure-functions-devops-build";
+    # rev picked based on pypi release date
+    rev = "c8249670acc77333e3de8b21dec60faf7ecf0951";
+    sha256 = "1slc7jd92v9q1qg1yacnrpi2a7hi7iw61wzbzfd6wx9q63pw9yqi";
+  };
+
+  propagatedBuildInputs = [ jinja2 msrest vsts ];
+
+  # circular dependency with azure-cli-core
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Integrate Azure Functions with Azure DevOps. Specifically made for the Azure CLI";
+    homepage = "https://github.com/Azure/azure-functions-devops-build";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-graphrbac/default.nix b/nixpkgs/pkgs/development/python-modules/azure-graphrbac/default.nix
new file mode 100644
index 000000000000..2b05d9ac83d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-graphrbac/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+}:
+
+buildPythonPackage rec {
+  version = "0.61.1";
+  pname = "azure-graphrbac";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "1qmjhpqw0sgy406ij5xyzkffisjah9m1pfz9x54v66bwrbi8msak";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Graph RBAC Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-identity/default.nix b/nixpkgs/pkgs/development/python-modules/azure-identity/default.nix
new file mode 100644
index 000000000000..624ce81e5bca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-identity/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, azure-common
+, azure-mgmt-core
+, buildPythonPackage
+, fetchPypi
+, isodate
+, msal
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-identity";
+  version = "1.15.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-TCj8JGt/kmVhDrUmHWWTEYPQGaI9Sw6ZNX+ssubCJ8g=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    isodate
+    msal
+  ];
+
+  pythonImportsCheck = [
+    "azure.identity"
+  ];
+
+  # Requires checkout from mono-repo and a mock account:
+  # https://github.com/Azure/azure-sdk-for-python/blob/master/sdk/identity/tests.yml
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Microsoft Azure Identity Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-identity_${version}/sdk/keyvault/azure-mgmt-keyvault/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kamadorueda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-keyvault-administration/default.nix b/nixpkgs/pkgs/development/python-modules/azure-keyvault-administration/default.nix
new file mode 100644
index 000000000000..07d608dfa56f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-keyvault-administration/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, azure-common
+, azure-core
+, msrest
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "azure-keyvault-administration";
+  version = "4.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-PuKjui0OP0ODNErjbjJ90hOgee97JDrVT2sh+MufxWY=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    msrest
+    six
+  ];
+
+  # no tests in pypi tarball
+  doCheck = false;
+
+  pythonNamespaces = [
+    "azure.keyvault"
+  ];
+
+  pythonImportsCheck = [
+    "azure.keyvault.administration"
+  ];
+
+  meta = with lib; {
+    description = "Microsoft Azure Key Vault Administration Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/keyvault/azure-keyvault-administration";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-keyvault-certificates/default.nix b/nixpkgs/pkgs/development/python-modules/azure-keyvault-certificates/default.nix
new file mode 100644
index 000000000000..77d81c87ec31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-keyvault-certificates/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-common
+, azure-core
+, msrest
+, msrestazure
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-keyvault-certificates";
+  version = "4.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-nkfZp0gl5QKxPVSByZwYIEDE9Ucj9DNx4AhZQ23888o=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    msrest
+    msrestazure
+  ];
+
+  pythonNamespaces = [
+    "azure.keyvault"
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.keyvault.certificates"
+  ];
+
+  meta = with lib; {
+    description = "Microsoft Azure Key Vault Certificates Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-keyvault-keys/default.nix b/nixpkgs/pkgs/development/python-modules/azure-keyvault-keys/default.nix
new file mode 100644
index 000000000000..7c2bef4a0844
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-keyvault-keys/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, aiohttp
+, azure-common
+, azure-core
+, cryptography
+, msrest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "azure-keyvault-keys";
+  version = "4.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-bAuy94MgKjSj5ex0hm5iEuWRrHEk8DuWadGwm2giS8Q=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    msrest
+    cryptography
+  ];
+
+  nativeCheckInputs = [
+    aiohttp
+    pytestCheckHook
+  ];
+
+  pythonNamespaces = [
+    "azure.keyvault"
+  ];
+
+  # requires relative paths to utilities in the mono-repo
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure"
+    "azure.core"
+    "azure.common"
+    "azure.keyvault"
+    "azure.keyvault.keys"
+  ];
+
+  meta = with lib; {
+    description = "Microsoft Azure Key Vault Keys Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-keyvault-nspkg/default.nix b/nixpkgs/pkgs/development/python-modules/azure-keyvault-nspkg/default.nix
new file mode 100644
index 000000000000..fd3f3c0284f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-keyvault-nspkg/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+
+# pythonPackages
+, azure-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-keyvault-nspkg";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "0hdnd6124hx7s16z1pssmq5m5mqqqz8s38ixl9aayv4wmf5bhs5c";
+  };
+
+  propagatedBuildInputs = [
+    azure-nspkg
+  ];
+
+  # Just a namespace package, no tests exist:
+  #   https://github.com/Azure/azure-sdk-for-python/blob/master/sdk/keyvault/tests.yml
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Microsoft Azure Key Vault Namespace Package [Internal]";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [
+      kamadorueda
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-keyvault-secrets/default.nix b/nixpkgs/pkgs/development/python-modules/azure-keyvault-secrets/default.nix
new file mode 100644
index 000000000000..ddb5d440b0b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-keyvault-secrets/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, azure-common
+, azure-core
+, msrest
+}:
+
+buildPythonPackage rec {
+  pname = "azure-keyvault-secrets";
+  version = "4.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-d+4lNLplGh8wbIXXtQW8PM7o/qd0UOuvr8Jq7BblRF0=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    msrest
+  ];
+
+  pythonNamespaces = [
+    "azure.keyvault"
+  ];
+
+  # requires checkout from mono-repo
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Microsoft Azure Key Vault Secrets Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-keyvault/default.nix b/nixpkgs/pkgs/development/python-modules/azure-keyvault/default.nix
new file mode 100644
index 000000000000..4fedfd4cbf55
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-keyvault/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, azure-keyvault-certificates
+, azure-keyvault-keys
+, azure-keyvault-secrets
+}:
+
+buildPythonPackage rec {
+  pname = "azure-keyvault";
+  version = "4.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-cxrdEIo+KatP1QGjxHclbChsNNCZazg/tqOUVGKTN2E=";
+  };
+
+  propagatedBuildInputs = [
+    azure-keyvault-certificates
+    azure-keyvault-keys
+    azure-keyvault-secrets
+  ];
+
+  # this is just a meta package, which contains keys and secrets packages
+  doCheck = false;
+  doBuild = false;
+
+  pythonImportsCheck = [
+    "azure.keyvault.keys"
+    "azure.keyvault.secrets"
+  ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Key Vault Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-loganalytics/default.nix b/nixpkgs/pkgs/development/python-modules/azure-loganalytics/default.nix
new file mode 100644
index 000000000000..ee3f0460fd7e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-loganalytics/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, azure-common
+}:
+
+buildPythonPackage rec {
+  version = "0.1.1";
+  pname = "azure-loganalytics";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "68ffb9a2206e06b9672100a8e6351cc04f75bb81867f30d416c68b55d624d793";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    azure-common
+  ];
+
+  pythonNamespaces = [ "azure" ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Log Analytics Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-advisor/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-advisor/default.nix
new file mode 100644
index 000000000000..81afa6ff7ed0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-advisor/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, isPy3k
+, azure-mgmt-core
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-advisor";
+  version = "9.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "fc408b37315fe84781b519124f8cb1b8ac10b2f4241e439d0d3e25fd6ca18d7b";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ] ++ lib.optionals (!isPy3k) [
+    azure-mgmt-nspkg
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Advisor Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-apimanagement/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-apimanagement/default.nix
new file mode 100644
index 000000000000..2e8765d27524
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-apimanagement/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, azure-mgmt-core
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  version = "4.0.0";
+  pname = "azure-mgmt-apimanagement";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-AiTjLJ28g80xnrRFLfPUevJgeaxLpuGmvkd3+FskNiw=";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+    msrestazure
+  ];
+
+  # no tests included
+  doCheck = false;
+
+  pythonImportsCheck = [ "azure.common" "azure.mgmt.apimanagement" ];
+
+  meta = with lib; {
+    description = "Microsoft Azure API Management Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-appconfiguration/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-appconfiguration/default.nix
new file mode 100644
index 000000000000..9915297eb120
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-appconfiguration/default.nix
@@ -0,0 +1,39 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, azure-mgmt-core
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  version = "3.0.0";
+  pname = "azure-mgmt-appconfiguration";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-FJhuVgqNjdRIegP4vUISrAtHvvVle5VQFVITPm4HLEw=";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+    msrestazure
+  ];
+
+  # no tests included
+  doCheck = false;
+
+  pythonNamespaces = [ "azure.mgmt" ];
+
+  pythonImportsCheck = [ "azure.common" "azure.mgmt.appconfiguration" ];
+
+  meta = with lib; {
+    description = "Microsoft Azure App Configuration Management Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-appcontainers/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-appcontainers/default.nix
new file mode 100644
index 000000000000..624c9735b6ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-appcontainers/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, azure-common
+, azure-mgmt-core
+, isodate
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-appcontainers";
+  version = "3.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-oqKPEOnZaIU7IMzDqT552IBJr9RtWt3vFO3SlG8igs0=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    isodate
+  ]  ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  # no tests included
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.mgmt.appcontainers"
+  ];
+
+  meta = with lib; {
+    description = "Microsoft Azure Appcontainers Management Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/appcontainers/azure-mgmt-appcontainers";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jfroche ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-applicationinsights/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-applicationinsights/default.nix
new file mode 100644
index 000000000000..2f2c1c72b578
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-applicationinsights/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-applicationinsights";
+  version = "4.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-UMPbBVc+DMLVYxSgVW+zRu8F7EiawAD01yDZLGtkfgY=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+    msrestazure
+  ] ++ lib.optionals (!isPy3k) [
+    azure-mgmt-nspkg
+  ];
+
+  pythonNamespaces = [ "azure.mgmt" ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Application Insights Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-authorization/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-authorization/default.nix
new file mode 100644
index 000000000000..08b3c763227b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-authorization/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-authorization";
+  version = "4.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-abhavAmuZPxyl1vUNDEXDYx+tdFmdUuYqsXzhF3lfcQ=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ] ++ lib.optionals (!isPy3k) [
+    azure-mgmt-nspkg
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Authorization Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-batch/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-batch/default.nix
new file mode 100644
index 000000000000..1d55b6c78530
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-batch/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-batch";
+  version = "17.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-OFv5IImNwtWAeGX75FAZ8QzfvvZRxtv6R0WoQlJduvs=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Batch Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-batchai/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-batchai/default.nix
new file mode 100644
index 000000000000..0c005c3ea3c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-batchai/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-batchai";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "f1870b0f97d5001cdb66208e5a236c9717a0ed18b34dbfdb238a828f3ca2a683";
+  };
+
+  propagatedBuildInputs = [
+    msrestazure
+    azure-common
+    azure-mgmt-core
+    azure-mgmt-nspkg
+ ];
+
+  pythonNamespaces = [ "azure.mgmt" ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Batch AI Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-billing/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-billing/default.nix
new file mode 100644
index 000000000000..94b90e6b196d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-billing/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-billing";
+  version = "6.0.0"; #pypi's 0.2.0 doesn't build ootb
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d4f5c5a4188a456fe1eb32b6c45f55ca2069c74be41eb76921840b39f2f5c07f";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    msrestazure
+    azure-common
+    azure-mgmt-core
+    azure-mgmt-nspkg
+  ];
+
+  preBuild = ''
+    rm -rf azure_bdist_wheel.py
+    substituteInPlace setup.cfg \
+      --replace "azure-namespace-package = azure-mgmt-nspkg" ""
+  '';
+
+  pythonNamespaces = [ "azure.mgmt" ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Billing Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-botservice/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-botservice/default.nix
new file mode 100644
index 000000000000..6bc3b2c7c6f0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-botservice/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, azure-mgmt-core
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  version = "2.0.0";
+  pname = "azure-mgmt-botservice";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-hsBNJ8UnwZ2WAKiCFfriulJNxnRFU4ew0OUXIrWm1ro=";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+    msrestazure
+  ];
+
+  # no tests included
+  doCheck = false;
+
+  pythonImportsCheck = [ "azure.common" "azure.mgmt.botservice" ];
+
+  meta = with lib; {
+    description = "Microsoft Azure API Management Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-cdn/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-cdn/default.nix
new file mode 100644
index 000000000000..3b6c5fd88b7b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-cdn/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, azure-common
+, azure-mgmt-core
+, buildPythonPackage
+, fetchPypi
+, isodate
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-cdn";
+  version = "13.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-yJ8jTeT4Gu23YSHl5GZ0+zdlC3s+GIxS4ir8z/HBkA4=";
+  };
+
+  propagatedBuildInputs = [
+    isodate
+    azure-common
+    azure-mgmt-core
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure CDN Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-mgmt-cdn_${version}/sdk/cdn/azure-mgmt-cdn/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-cognitiveservices/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-cognitiveservices/default.nix
new file mode 100644
index 000000000000..25dfe383e35d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-cognitiveservices/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-common
+, azure-mgmt-core
+, msrestazure
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-cognitiveservices";
+  version = "13.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-RK8LGbH4J+nN6gnGBUweZgkqUcMrwe9aVtvZtAvFeBU=";
+  };
+
+  propagatedBuildInputs = [
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Cognitive Services Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-commerce/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-commerce/default.nix
new file mode 100644
index 000000000000..89aed74bbb3d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-commerce/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-commerce";
+  version = "6.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "6f5447395503b2318f451d24f8021ee08db1cac44f1c3337ea690700419626b6";
+  };
+
+  propagatedBuildInputs = [
+    msrestazure
+    azure-common
+    azure-mgmt-core
+    azure-mgmt-nspkg
+  ];
+
+  prePatch = ''
+    rm -f azure_bdist_wheel.py tox.ini
+    substituteInPlace setup.py \
+      --replace "wheel==0.30.0" "wheel"
+    sed -i "/azure-namespace-package/c\ " setup.cfg
+  '';
+
+  pythonNamespaces = [ "azure.mgmt" ];
+
+  # has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "azure.mgmt.commerce" ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Commerce Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-common/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-common/default.nix
new file mode 100644
index 000000000000..dfd7ac2a3f05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-common/default.nix
@@ -0,0 +1,42 @@
+{ pkgs
+, buildPythonPackage
+, fetchPypi
+, python
+, azure-common
+, azure-mgmt-nspkg
+, requests
+, msrestazure
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  version = "0.20.0";
+  pname = "azure-mgmt-common";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "c63812c13d9f36615c07f874bc602b733bb516f1ed62ab73189b8f71c6bfbfe6";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-nspkg
+    requests
+    msrestazure
+  ];
+
+  postInstall = pkgs.lib.optionalString (!isPy3k) ''
+    echo "__import__('pkg_resources').declare_namespace(__name__)" >> "$out/lib/${python.libPrefix}"/site-packages/azure/mgmt/__init__.py
+    echo "__import__('pkg_resources').declare_namespace(__name__)" >> "$out/lib/${python.libPrefix}"/site-packages/azure/__init__.py
+  '';
+
+  doCheck = false;
+
+  meta = with pkgs.lib; {
+    description = "This is the Microsoft Azure Resource Management common code";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ olcai maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-compute/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-compute/default.nix
new file mode 100644
index 000000000000..495b448c4c99
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-compute/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, azure-mgmt-common
+, azure-mgmt-core
+, buildPythonPackage
+, fetchPypi
+, isodate
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-compute";
+  version = "30.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5Sl4Y0D4YqpqIYp61qW+trn7VYM8XKoIUcwzFNBJO2M=";
+  };
+
+  propagatedBuildInputs = [
+    azure-mgmt-common
+    azure-mgmt-core
+    isodate
+  ]  ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  pythonNamespaces = [
+    "azure.mgmt"
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.mgmt.compute"
+  ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Compute Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-mgmt-compute_${version}/sdk/compute/azure-mgmt-compute/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ olcai maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-consumption/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-consumption/default.nix
new file mode 100644
index 000000000000..c910587a615f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-consumption/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-consumption";
+  version = "10.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-BqCGQ2wXN/d6uGiU1R9Zc7bg+l7fVlWOTCllieurkTA=";
+  };
+
+  propagatedBuildInputs = [
+    msrestazure
+    azure-common
+    azure-mgmt-core
+    azure-mgmt-nspkg
+  ];
+
+  preBuild = ''
+    rm -f azure_bdist_wheel.py
+    substituteInPlace setup.cfg \
+      --replace "azure-namespace-package = azure-mgmt-nspkg" ""
+  '';
+
+  pythonNamespaces = [ "azure.mgmt" ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Consumption Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-containerinstance/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-containerinstance/default.nix
new file mode 100644
index 000000000000..06a9c072f279
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-containerinstance/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-containerinstance";
+  version = "10.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-eNQ3rbKFdPRIyDjtXwH5ztN4GWCYBh3rWdn3AxcEwX4=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.mgmt.containerinstance"
+  ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Container Instance Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-containerregistry/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-containerregistry/default.nix
new file mode 100644
index 000000000000..40e86961a892
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-containerregistry/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, azure-common
+, azure-mgmt-core
+, isodate
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-containerregistry";
+  version = "10.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-riFlGFXfsZxC2R1rOpZcbGEeI/i8S/cTiDXmUtL5GOM=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    isodate
+  ];
+
+  # no tests included
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.common"
+    "azure.mgmt.containerregistry"
+  ];
+
+  meta = with lib; {
+    description = "Microsoft Azure Container Registry 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-containerregistry_${version}/sdk/containerregistry/azure-mgmt-containerregistry/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-containerservice/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-containerservice/default.nix
new file mode 100644
index 000000000000..c72c54ffbdce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-containerservice/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+, buildPythonPackage
+, fetchPypi
+, isodate
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-containerservice";
+  version = "28.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-tVYFpEUV9v0OOk3CK/oPRA8+fhYl668Gqz6wa/NabNs=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    isodate
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.mgmt.containerservice"
+  ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Container Service Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-mgmt-containerservice_${version}/sdk/containerservice/azure-mgmt-containerservice/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-core/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-core/default.nix
new file mode 100644
index 000000000000..d4e2f40b211a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-core/default.nix
@@ -0,0 +1,36 @@
+{ pkgs
+, buildPythonPackage
+, fetchPypi
+, azure-core
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  version = "1.4.0";
+  pname = "azure-mgmt-core";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-0ZUgg0AJT5jlpmYbeBzeb2oFHnnOMXyqvY/5cDCps64=";
+  };
+
+  propagatedBuildInputs = [
+    azure-core
+    typing-extensions
+  ];
+
+  pythonNamespaces = "azure.mgmt";
+
+  # not included
+  doCheck = false;
+
+  pythonImportsCheck = [ "azure.mgmt.core" "azure.core" ];
+
+  meta = with pkgs.lib; {
+    description = "Microsoft Azure Management Core Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-cosmosdb/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-cosmosdb/default.nix
new file mode 100644
index 000000000000..9d2857c1c740
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-cosmosdb/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, azure-common
+, azure-mgmt-core
+, buildPythonPackage
+, fetchPypi
+, isodate
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-cosmosdb";
+  version = "9.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-02DisUN2/auBDhPgE9aUvEvYwoQUQC4NYGD/PQZOl/Y=";
+  };
+
+  propagatedBuildInputs = [
+    isodate
+    azure-common
+    azure-mgmt-core
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.mgmt.cosmosdb"
+  ];
+
+  meta = with lib; {
+    description = "Module to work with the Microsoft Azure Cosmos DB Management";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-mgmt-cosmosdb_${version}/sdk/cosmos/azure-mgmt-cosmosdb/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-databoxedge/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-databoxedge/default.nix
new file mode 100644
index 000000000000..7c76daf619d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-databoxedge/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi
+, msrestazure
+, azure-common
+, azure-mgmt-core
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-databoxedge";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "04090062bc1e8f00c2f45315a3bceb0fb3b3479ec1474d71b88342e13499b087";
+  };
+
+  propagatedBuildInputs = [
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ];
+
+  # no tests in pypi tarball
+  doCheck = false;
+
+  pythonImportsCheck = [ "azure.mgmt.databoxedge" ];
+
+  meta = with lib; {
+    description = "Microsoft Azure Databoxedge Management Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-datafactory/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-datafactory/default.nix
new file mode 100644
index 000000000000..3de8b1c16fab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-datafactory/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, azure-common
+, azure-mgmt-core
+, buildPythonPackage
+, fetchPypi
+, isodate
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-datafactory";
+  version = "4.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XfTLbVdoPVLKgVlBDr59N0EKe+G9fAS+SjI9cWhhs4g=";
+  };
+
+  propagatedBuildInputs = [
+    isodate
+    azure-common
+    azure-mgmt-core
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.mgmt.datafactory"
+  ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Data Factory Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/tree/azure-mgmt-datafactory_${version}/sdk/datafactory/azure-mgmt-datafactory";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-datalake-analytics/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-datalake-analytics/default.nix
new file mode 100644
index 000000000000..473ebda1b874
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-datalake-analytics/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrestazure
+, azure-common
+, azure-mgmt-datalake-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-datalake-analytics";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "0d64c4689a67d6138eb9ffbaff2eda2bace7d30b846401673183dcb42714de8f";
+  };
+
+  propagatedBuildInputs = [
+    msrestazure
+    azure-common
+    azure-mgmt-datalake-nspkg
+  ];
+
+  pythonNamespaces = [ "azure.mgmt.datalake" ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Data Lake Analytics Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-datalake-nspkg/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-datalake-nspkg/default.nix
new file mode 100644
index 000000000000..8af5fbd0c2e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-datalake-nspkg/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-datalake-nspkg";
+  version = "3.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "deb192ba422f8b3ec272ce4e88736796f216f28ea5b03f28331d784b7a3f4880";
+  };
+
+  propagatedBuildInputs = [
+    azure-mgmt-nspkg
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Data Lake Management namespace package";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-datalake-store/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-datalake-store/default.nix
new file mode 100644
index 000000000000..95cbb7bb896b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-datalake-store/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrestazure
+, azure-common
+, azure-mgmt-datalake-nspkg
+, azure-mgmt-core
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-datalake-store";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-GrmVK97M+iojevPLVTuLmfQRLxvrHtr9DRHymJvLYHE=";
+  };
+
+  propagatedBuildInputs = [
+    msrestazure
+    azure-common
+    azure-mgmt-core
+    azure-mgmt-datalake-nspkg
+  ];
+
+  pythonNamespaces = [ "azure.mgmt.datalake" ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Data Lake Store Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-datamigration/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-datamigration/default.nix
new file mode 100644
index 000000000000..66945c67c6a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-datamigration/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+, azure-mgmt-core
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-datamigration";
+  version = "10.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "5cee70f97fe3a093c3cb70c2a190c2df936b772e94a09ef7e3deb1ed177c9f32";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ] ++ lib.optionals (!isPy3k) [
+    azure-mgmt-nspkg
+  ];
+
+  pythonNamespaces = [ "azure.mgmt" ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Data Migration Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-deploymentmanager/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-deploymentmanager/default.nix
new file mode 100644
index 000000000000..c8f15f5960c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-deploymentmanager/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, azure-mgmt-core
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  version = "1.0.0";
+  pname = "azure-mgmt-deploymentmanager";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9badb768617209149c33e68ca2e59c35b1d3d11427e2969872f2e236e14eee78";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+    msrestazure
+  ];
+
+  # no tests included
+  doCheck = false;
+
+  pythonImportsCheck = [ "azure.common" "azure.mgmt.deploymentmanager" ];
+
+  meta = with lib; {
+    description = "Microsoft Azure Deployment Manager Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-devspaces/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-devspaces/default.nix
new file mode 100644
index 000000000000..5ca30f45de29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-devspaces/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-devspaces";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "0dvjsr9i87j1ggbj3dcmgifpk64xr5f5ziwf7z1fwkcx0szcid7k";
+  };
+
+  propagatedBuildInputs = [
+    msrestazure
+    azure-common
+    azure-mgmt-nspkg
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Dev Spaces Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-devtestlabs/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-devtestlabs/default.nix
new file mode 100644
index 000000000000..40ab2fbedcce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-devtestlabs/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-devtestlabs";
+  version = "9.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "d8160d93fd3d947e5613c6919176b0edf72c94ac69679ea3b92cf27ff7398e64";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ] ++ lib.optionals (!isPy3k) [
+    azure-mgmt-nspkg
+  ];
+
+  pythonNamespaces = [ "azure.mgmt" ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure DevTestLabs Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-dns/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-dns/default.nix
new file mode 100644
index 000000000000..85f84b34a79c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-dns/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-dns";
+  version = "8.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "sha256-2DedS7kZS4G3nlKE2HX6bfgHBzRvLLtcVJGiDzUmb9A=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ];
+
+  # this is still needed for when the version is overrided
+  pythonNamespaces = [ "azure.mgmt" ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure DNS Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-eventgrid/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-eventgrid/default.nix
new file mode 100644
index 000000000000..98c897aeabff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-eventgrid/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-eventgrid";
+  version = "10.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-jJ+gvJmOTz2YXQ9BDrFgXCybplgwvOYZ5Gv7FHLhxQA=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-mgmt-core
+    azure-common
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.mgmt.eventgrid"
+  ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure EventGrid Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-eventhub/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-eventhub/default.nix
new file mode 100644
index 000000000000..92bb1bf301a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-eventhub/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-eventhub";
+  version = "11.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-FxB9ToXd6PZ1eUrMWDAtbOmKclTuA/QdP72WsG7za5Y=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure EventHub Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-extendedlocation/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-extendedlocation/default.nix
new file mode 100644
index 000000000000..a0b942e6de56
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-extendedlocation/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi
+, azure-common
+, azure-mgmt-core
+, msrest
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-extendedlocation";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-jRo6EFP8Dg3i9U8HLfjED9QFfWbdg+X3o9PSf4eus9o=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+  ];
+
+  pythonImportsCheck = [ "azure.mgmt.extendedlocation" ];
+
+  meta = with lib; {
+    description = "Microsoft Azure Extendedlocation Management Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-frontdoor/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-frontdoor/default.nix
new file mode 100644
index 000000000000..094e79819c2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-frontdoor/default.nix
@@ -0,0 +1,38 @@
+{ azure-common
+, azure-mgmt-core
+, buildPythonPackage
+, fetchPypi
+, lib
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-frontdoor";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "sha256-GqrJNNcQrNffgqRywgaJ2xkwy+fOJai/RlSVkpw6NWg=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "azure.mgmt.frontdoor" ];
+
+  meta = with lib; {
+    description = "Microsoft Azure Front Door Service Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sephi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-hanaonazure/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-hanaonazure/default.nix
new file mode 100644
index 000000000000..9b9a84bbe21e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-hanaonazure/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-hanaonazure";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "f2f8342fbfded8be4165fb0d6f010b68df074886811db3e2c9a50b360ee2dd3a";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ] ++ lib.optionals (!isPy3k) [
+    azure-mgmt-nspkg
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure SAP Hana on Azure Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-hdinsight/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-hdinsight/default.nix
new file mode 100644
index 000000000000..a6920815f0fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-hdinsight/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, azure-mgmt-core
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  version = "9.0.0";
+  pname = "azure-mgmt-hdinsight";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "41ebdc69c0d1f81d25dd30438c14fff4331f66639f55805b918b9649eaffe78a";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+    msrestazure
+  ];
+
+  # no tests included
+  doCheck = false;
+
+  pythonImportsCheck = [ "azure.common" "azure.mgmt.hdinsight" ];
+
+  meta = with lib; {
+    description = "Microsoft Azure HDInsight Management Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-imagebuilder/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-imagebuilder/default.nix
new file mode 100644
index 000000000000..c8aadd1f4d6a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-imagebuilder/default.nix
@@ -0,0 +1,41 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, azure-mgmt-core
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  version = "1.2.0";
+  pname = "azure-mgmt-imagebuilder";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XmGIzw+yGYgdaNGZJClFRl531BGsQUH+HESUXGVK6TI=";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+    msrestazure
+  ];
+
+  # no tests included
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.common"
+    "azure.mgmt.core"
+    "azure.mgmt.imagebuilder"
+  ];
+
+  meta = with lib; {
+    description = "Microsoft Azure Image Builder Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-iotcentral/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-iotcentral/default.nix
new file mode 100644
index 000000000000..6d226816082d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-iotcentral/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-iotcentral";
+  version = "9.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "64df73df449a6f3717f3d0963e5869224ed3e6216c79de571493bea7c1b52cb6";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+    msrestazure
+  ] ++ lib.optionals (!isPy3k) [
+    azure-mgmt-nspkg
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure IoTCentral Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-iothub/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-iothub/default.nix
new file mode 100644
index 000000000000..8890f65af3af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-iothub/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, azure-common
+, azure-mgmt-core
+, buildPythonPackage
+, fetchPypi
+, isodate
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-iothub";
+  version = "3.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2vIfyYxoo1PsYWMYwOYr4EyNaJmWC+jCy/mRZzrItyI=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    isodate
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.mgmt.iothub"
+  ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure IoTHub Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-mgmt-iothub_${version}/sdk/iothub/azure-mgmt-iothub/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-iothubprovisioningservices/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-iothubprovisioningservices/default.nix
new file mode 100644
index 000000000000..7b75fdbde58e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-iothubprovisioningservices/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-iothubprovisioningservices";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-04OoJuff93L62G6IozpmHpEaUbHHHD6nKlkMHVoJvJ4=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+    azure-mgmt-nspkg
+  ];
+
+  pythonNamespaces = [ "azure.mgmt" ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure IoTHub Provisioning Services Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-keyvault/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-keyvault/default.nix
new file mode 100644
index 000000000000..9b954760fe1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-keyvault/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, azure-common
+, azure-mgmt-core
+, buildPythonPackage
+, fetchPypi
+, isodate
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-keyvault";
+  version = "10.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GDtBZM8YaLjqfv6qmO2tfSpOFKm9l3woGLErdRUM0qI=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    isodate
+  ];
+
+  pythonNamespaces = [
+    "azure.mgmt"
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Key Vault Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-mgmt-keyvault_${version}/sdk/keyvault/azure-mgmt-keyvault/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-kusto/azure-mgmt-apimanagement/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-kusto/azure-mgmt-apimanagement/default.nix
new file mode 100644
index 000000000000..f1effb72b4ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-kusto/azure-mgmt-apimanagement/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  version = "3.0.0";
+  pname = "azure-mgmt-apimanagement";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-kmL1TtOH6wg9ja5m0yqN81ZHMZuQK9SYzcN29QoS0VQ=";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [ azure-common msrest msrestazure ];
+
+  # no tests included
+  doCheck = false;
+
+  pythonImportsCheck = [ "azure.common" "azure.mgmt.apimanagement" ];
+
+  meta = with lib; {
+    description = "Microsoft Azure API Management Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-kusto/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-kusto/default.nix
new file mode 100644
index 000000000000..5195c0102db4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-kusto/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, azure-mgmt-core
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  version = "3.2.0";
+  pname = "azure-mgmt-kusto";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zgkFMrufHoX3gq9QXo8SlJYZOfV5GlY3pVQXmIWyx7c=";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+    msrestazure
+  ];
+
+  # no tests included
+  doCheck = false;
+
+  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";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-loganalytics/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-loganalytics/default.nix
new file mode 100644
index 000000000000..9629c6e7bba0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-loganalytics/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-loganalytics";
+  version = "12.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "da128a7e0291be7fa2063848df92a9180cf5c16d42adc09d2bc2efd711536bfb";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ];
+
+  pythonNamespaces = [ "azure.mgmt" ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "azure.mgmt.loganalytics" ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Log Analytics Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-logic/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-logic/default.nix
new file mode 100644
index 000000000000..fc22b57d98a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-logic/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-logic";
+  version = "10.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-s/pIZPFKqnr0HXeNkl8FHtKbYBb0Y0R2Xs0PSdDwTdY=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.mgmt.logic"
+  ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Logic Apps Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-machinelearningcompute/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-machinelearningcompute/default.nix
new file mode 100644
index 000000000000..543589b7aecb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-machinelearningcompute/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-machinelearningcompute";
+  version = "0.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "7a52f85591114ef33a599dabbef840d872b7f599b7823e596af9490ec51b873f";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-nspkg
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Machine Learning Compute Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-managedservices/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-managedservices/default.nix
new file mode 100644
index 000000000000..140f08e13f4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-managedservices/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, azure-mgmt-core
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  version = "6.0.0";
+  pname = "azure-mgmt-managedservices";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ec0cb3858bcf8edf5eee0eddee81560424eb84352e0df082ddc94eb99badfd5e";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+    msrestazure
+  ];
+
+  # no tests included
+  doCheck = false;
+
+  pythonImportsCheck = [ "azure.common" "azure.mgmt.managedservices" ];
+
+  meta = with lib; {
+    description = "Microsoft Azure Managed Services Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-managementgroups/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-managementgroups/default.nix
new file mode 100644
index 000000000000..eb744b78ff7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-managementgroups/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-managementgroups";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "bab9bd532a1c34557f5b0ab9950e431e3f00bb96e8a3ce66df0f6ce2ae19cd73";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ] ++ lib.optionals (!isPy3k) [
+    azure-mgmt-nspkg
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Management Groups Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-managementpartner/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-managementpartner/default.nix
new file mode 100644
index 000000000000..169f52c86d52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-managementpartner/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-managementpartner";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "1cd591848454a115c216d216a3fb7802c1b5de04b105e2696e4237b0f8768f2f";
+  };
+
+  propagatedBuildInputs = [
+    msrestazure
+    azure-common
+    azure-mgmt-core
+    azure-mgmt-nspkg
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure ManagementPartner Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-maps/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-maps/default.nix
new file mode 100644
index 000000000000..81b216804ae4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-maps/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, azure-common
+, azure-mgmt-core
+, buildPythonPackage
+, fetchPypi
+, isodate
+, pythonOlder
+, typing-extensions
+, msrest
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-maps";
+  version = "2.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XVaml4UuVBanYYHxjB1YT/PvExzgAPbD4gI3Hbc0dI0=";
+  };
+
+  propagatedBuildInputs = [
+    isodate
+    azure-common
+    azure-mgmt-core
+    msrest
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  pythonNamespaces = [
+    "azure.mgmt"
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.mgmt.maps"
+  ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Maps Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/v${version}/sdk/maps/azure-mgmt-maps/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-marketplaceordering/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-marketplaceordering/default.nix
new file mode 100644
index 000000000000..628d0bbcac03
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-marketplaceordering/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+, isPy3k
+, azure-mgmt-core
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-marketplaceordering";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "68b381f52a4df4435dacad5a97e1c59ac4c981f667dcca8f9d04453417d60ad8";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ] ++ lib.optionals (!isPy3k) [
+    azure-mgmt-nspkg
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Market Place Ordering Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-media/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-media/default.nix
new file mode 100644
index 000000000000..a9c47aca1ead
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-media/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-media";
+  version = "10.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-TVq/6dHttDGIUFzn8KTVeDTwcBMmphz3zrsGK7ux4aU=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.mgmt.media"
+  ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Media Services Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-monitor/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-monitor/default.nix
new file mode 100644
index 000000000000..e4d0ae9b288f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-monitor/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, azure-common
+, azure-mgmt-core
+, buildPythonPackage
+, fetchPypi
+, isodate
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-monitor";
+  version = "6.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-X/v1AOSZq3kSsbptJs7yZIDZrkEVMgGbt41yViGW4Hs=";
+  };
+
+  propagatedBuildInputs = [
+    isodate
+    azure-common
+    azure-mgmt-core
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  pythonNamespaces = [
+    "azure.mgmt"
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Monitor Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-msi/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-msi/default.nix
new file mode 100644
index 000000000000..8351622cd42f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-msi/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, msrest
+, azure-common
+, azure-mgmt-core
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-msi";
+  version = "7.0.0";
+
+  disabled = pythonOlder "3.6";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-ctRsmmJ4PsTqthm+nRt4/+u9qhZNQG/TA/FjA/NyVrI=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    azure-common
+    azure-mgmt-core
+  ];
+
+  pythonNamespaces = [ "azure.mgmt" ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "azure.mgmt.msi" ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure MSI Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/resources/azure-mgmt-msi";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-netapp/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-netapp/default.nix
new file mode 100644
index 000000000000..8b5ae2435d0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-netapp/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, azure-common
+, azure-mgmt-core
+, isodate
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-netapp";
+  version = "11.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-00cDFHpaEciRQLHM+Kt3uOtw/geOn5+onrY7lav6EeU=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    isodate
+  ];
+
+  # no tests included
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.common"
+    "azure.mgmt.netapp"
+  ];
+
+  meta = with lib; {
+    description = "Microsoft Azure NetApp Files 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-netapp_${version}/sdk/netapp/azure-mgmt-netapp/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-network/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-network/default.nix
new file mode 100644
index 000000000000..61e979ee10a7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-network/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, azure-common
+, azure-mgmt-core
+, buildPythonPackage
+, fetchPypi
+, isodate
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-network";
+  version = "25.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+Tn3W/E54D0sRXpPB6XrrbWv/dcKpUvpoK9EuOUhMvw=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    isodate
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonNamespaces = [
+    "azure.mgmt"
+  ];
+
+  pythonImportsCheck = [
+    "azure.mgmt.network"
+  ];
+
+  meta = with lib; {
+    description = "Microsoft Azure SDK for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ olcai maxwilson jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-notificationhubs/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-notificationhubs/default.nix
new file mode 100644
index 000000000000..7b7704401c17
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-notificationhubs/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-notificationhubs";
+  version = "8.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "4dd924f4704993e3ebf1d42e2be1cbe0b0d908e695857fa08c4369ae11d0eb36";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+    azure-mgmt-nspkg
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Notification Hubs Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-nspkg/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-nspkg/default.nix
new file mode 100644
index 000000000000..4a01c753a626
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-nspkg/default.nix
@@ -0,0 +1,27 @@
+{ pkgs
+, buildPythonPackage
+, fetchPypi
+, azure-nspkg
+}:
+
+buildPythonPackage rec {
+  version = "3.0.2";
+  pname = "azure-mgmt-nspkg";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "8b2287f671529505b296005e6de9150b074344c2c7d1c805b3f053d081d58c52";
+  };
+
+  propagatedBuildInputs = [ azure-nspkg ];
+
+  doCheck = false;
+
+  meta = with pkgs.lib; {
+    description = "Microsoft Azure SDK for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ olcai maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-policyinsights/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-policyinsights/default.nix
new file mode 100644
index 000000000000..30fce3885453
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-policyinsights/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-policyinsights";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "75103fb4541aeae30bb687dee1fedd9ca65530e6b97b2d9ea87f74816905202a";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+    msrestazure
+  ] ++ lib.optionals (!isPy3k) [
+    azure-mgmt-nspkg
+  ];
+
+  # has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "azure.mgmt.policyinsights" ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Policy Insights Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-powerbiembedded/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-powerbiembedded/default.nix
new file mode 100644
index 000000000000..24b446146856
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-powerbiembedded/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-powerbiembedded";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "2f05be73f2a086c579a78fc900e3b2ae14ccde5bcec54e29dfc73e626b377476";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-nspkg
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Power BI Embedded Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-privatedns/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-privatedns/default.nix
new file mode 100644
index 000000000000..2a89a0460cd8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-privatedns/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, azure-common
+, azure-mgmt-core
+, buildPythonPackage
+, fetchPypi
+, isodate
+, msrest
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-privatedns";
+  version = "1.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MtucYFpKj/ANNON1UdXrBrTsJnq53iph3SJ1ypWj+5g=";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    isodate
+    msrest
+  ]  ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  # no tests included
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.common"
+    "azure.mgmt.privatedns"
+  ];
+
+  meta = with lib; {
+    description = "Microsoft Azure DNS Private Zones Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-rdbms/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-rdbms/default.nix
new file mode 100644
index 000000000000..b24c6ea69b2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-rdbms/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-rdbms";
+  version = "10.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-qH1AHIdshHNM3UiIr1UeShRhtLMo2YFq9gy4rFl58DU=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+    msrestazure
+  ] ++ lib.optionals (!isPy3k) [
+    azure-mgmt-nspkg
+  ];
+
+  # has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "azure.mgmt.rdbms" ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure RDBMS Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-recoveryservices/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-recoveryservices/default.nix
new file mode 100644
index 000000000000..5f6377d54edd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-recoveryservices/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, azure-common
+, azure-mgmt-core
+, buildPythonPackage
+, fetchPypi
+, isodate
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-recoveryservices";
+  version = "2.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XxowjEhYx5uD/4vY5hGSCSvcarmdbdc5Y2GLHciEurU=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    isodate
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.mgmt.recoveryservices"
+  ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Recovery Services Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-mgmt-recoveryservices_${version}/sdk/recoveryservices/azure-mgmt-recoveryservices/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-recoveryservicesbackup/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-recoveryservicesbackup/default.nix
new file mode 100644
index 000000000000..a9c9da857478
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-recoveryservicesbackup/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, azure-common
+, azure-mgmt-core
+, buildPythonPackage
+, fetchPypi
+, isodate
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-recoveryservicesbackup";
+  version = "7.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GuW6x8JGdBedywum4fDAQ8rwbVU9UgQWgHrFqJ6Uz9A=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    isodate
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.mgmt.recoveryservicesbackup"
+  ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Recovery Services Backup Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-mgmt-recoveryservicesbackup_${version}/sdk/recoveryservices/azure-mgmt-recoveryservicesbackup/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-redhatopenshift/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-redhatopenshift/default.nix
new file mode 100644
index 000000000000..fd6fe1b3e65b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-redhatopenshift/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, azure-common
+, azure-mgmt-core
+, buildPythonPackage
+, fetchPypi
+, isodate
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-redhatopenshift";
+  version = "1.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BL2a2L2AwJWvs0V+VpSGaS8//AWMy5m6rdAPDJPbrEo=";
+  };
+
+  propagatedBuildInputs = [
+    isodate
+    azure-common
+    azure-mgmt-core
+  ]  ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  pythonNamespaces = "azure.mgmt";
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.mgmt.redhatopenshift"
+  ];
+
+  meta = with lib; {
+    description = "Microsoft Azure Red Hat Openshift Management Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-redis/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-redis/default.nix
new file mode 100644
index 000000000000..4bfbc40d7a42
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-redis/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, azure-common
+, azure-mgmt-core
+, buildPythonPackage
+, fetchPypi
+, isodate
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-redis";
+  version = "14.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-eoMbY4oNzYXkn3uFUhxecJQD+BxYkGTbWhAWSgAoLyA=";
+  };
+
+  propagatedBuildInputs = [
+    isodate
+    azure-common
+    azure-mgmt-core
+   ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.mgmt.redis"
+  ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Redis Cache Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-mgmt-redis_${version}/sdk/redis/azure-mgmt-redis/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-relay/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-relay/default.nix
new file mode 100644
index 000000000000..a49080152ed4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-relay/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-relay";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "c93b7550e64b6734bf23ce57ca974a3ea929b734c58d1fe3669728c4fd2d2eb3";
+  };
+
+  propagatedBuildInputs = [
+    msrestazure
+    azure-common
+    azure-mgmt-core
+    azure-mgmt-nspkg
+  ];
+
+  preBuild = ''
+    rm -f azure_bdist_wheel.py
+    substituteInPlace setup.cfg \
+      --replace "azure-namespace-package = azure-mgmt-nspkg" ""
+  '';
+
+  pythonNamespaces = [ "azure.mgmt" ];
+
+  # has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "azure.mgmt.relay" ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Relay Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-reservations/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-reservations/default.nix
new file mode 100644
index 000000000000..ee97aab67805
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-reservations/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-reservations";
+  version = "2.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-BHCFEFst5jfyIEo0hm86belpxW7EygZCBJ8PTqzqHKc=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Reservations Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-resource/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-resource/default.nix
new file mode 100644
index 000000000000..648b22df3860
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-resource/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-mgmt-core
+, azure-mgmt-common
+, msrest
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-resource";
+  version = "23.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-wrps/ZnflfVfNurcQkXj3HEyVzAqH9And1bZS9jLKOA=";
+  };
+
+  propagatedBuildInputs = [
+    azure-mgmt-common
+    azure-mgmt-core
+    msrest
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonNamespaces = [
+    "azure.mgmt"
+  ];
+
+  pythonImportsCheck = [
+    "azure.mgmt.resource"
+  ];
+
+  meta = with lib; {
+    description = "Microsoft Azure SDK for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ olcai maxwilson jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-scheduler/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-scheduler/default.nix
new file mode 100644
index 000000000000..7fc7a152cb41
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-scheduler/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-scheduler";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "c6e6edd386ddc4c21d54b1497c3397b970bc127b71809b51bd2391cb1f3d1a14";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-nspkg
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Scheduler Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-search/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-search/default.nix
new file mode 100644
index 000000000000..5ba74007734a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-search/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, azure-common
+, azure-mgmt-core
+, buildPythonPackage
+, fetchPypi
+, isodate
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-search";
+  version = "9.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-U7xu6tsJdNIfEguyG7Xmgn321lDhc0dGD9g+LWiINZk=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    isodate
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.mgmt.search"
+  ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Search Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-mgmt-search_${version}/sdk/search/azure-mgmt-search/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-security/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-security/default.nix
new file mode 100644
index 000000000000..b760acc8c8a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-security/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-common
+, azure-mgmt-core
+, msrest
+, msrestazure
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-security";
+  version = "5.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-OLA+/oLCNEzqID/alebQC3rCJ4L6HAtYXNDqLI/z5wI=";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+    msrestazure
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  # no tests included
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.common"
+    "azure.mgmt.security"
+  ];
+
+  meta = with lib; {
+    description = "Microsoft Azure Security Center Management Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-servicebus/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-servicebus/default.nix
new file mode 100644
index 000000000000..182fa1599752
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-servicebus/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-servicebus";
+  version = "8.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-i+kgjxQdmnifaNuNIZdU/3gGn9j5OQ6fdkS7laO+nsI=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Service Bus Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-servicefabric/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-servicefabric/default.nix
new file mode 100644
index 000000000000..c7ae3b1acb5e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-servicefabric/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-servicefabric";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "4c6f3de2526a27af78aecae248604f941c4d059fbcf2265912a380e3c788735d";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+    azure-mgmt-nspkg
+  ];
+
+  pythonNamespaces = [ "azure.mgmt" ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Service Fabric Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-servicefabricmanagedclusters/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-servicefabricmanagedclusters/default.nix
new file mode 100644
index 000000000000..d3a52e76a681
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-servicefabricmanagedclusters/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-servicefabricmanagedclusters";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-EJyjolHrt92zWg+IKWFKTapwZaFrwTtSyEIu5/mZXOg=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ];
+
+  pythonNamespaces = [ "azure.mgmt" ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Service Fabric Cluster Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-servicelinker/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-servicelinker/default.nix
new file mode 100644
index 000000000000..83916038d996
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-servicelinker/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-common
+, azure-mgmt-core
+, msrest
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-servicelinker";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QVw6Y9HachwBRwCbF0cSGLCAkSJtNnXBvsj5YX1TmJU=";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+  ];
+
+  pythonImportsCheck = [ "azure.mgmt.servicelinker" ];
+
+  # no tests with sdist
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Microsoft Azure Servicelinker Management Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-signalr/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-signalr/default.nix
new file mode 100644
index 000000000000..2079cd8d0d98
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-signalr/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-signalr";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-jbFhVoJbObpvcVJr2VoUzY5CmSblJ6OK7Q3l17SARfg=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure SignalR Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-sql/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-sql/default.nix
new file mode 100644
index 000000000000..75b41758b3d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-sql/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-sql";
+  version = "3.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "129042cc011225e27aee6ef2697d585fa5722e5d1aeb0038af6ad2451a285457";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ] ++ lib.optionals (!isPy3k) [
+    azure-mgmt-nspkg
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "azure.mgmt.sql" ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure SQL Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-sqlvirtualmachine/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-sqlvirtualmachine/default.nix
new file mode 100644
index 000000000000..76f0d7a2b39c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-sqlvirtualmachine/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, azure-mgmt-core
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  version = "0.5.0";
+  pname = "azure-mgmt-sqlvirtualmachine";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1b9am8raa17hxnz7d5pk2ix0309wsnhnchq1mi22icd728sl5adm";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+    msrestazure
+  ];
+
+  # no tests included
+  doCheck = false;
+
+  pythonImportsCheck = [ "azure.common" "azure.mgmt.sqlvirtualmachine" ];
+
+  meta = with lib; {
+    description = "Microsoft Azure SQL Virtual Machine Management Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-storage/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-storage/default.nix
new file mode 100644
index 000000000000..5643ab8ce545
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-storage/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-mgmt-common
+, azure-mgmt-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-storage";
+  version = "21.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-1tPA6RfJiLye0Eckd9PvP5CIYAnrHZenEZRPg3VjAWI=";
+  };
+
+  propagatedBuildInputs = [
+    azure-mgmt-common
+    azure-mgmt-core
+  ];
+
+  pythonNamespaces = [
+    "azure.mgmt"
+  ];
+
+  pythonImportsCheck = [
+    "azure.mgmt.storage"
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Storage Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer olcai maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-subscription/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-subscription/default.nix
new file mode 100644
index 000000000000..9c244435c2d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-subscription/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-subscription";
+  version = "3.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-TiVbTOm5JDV7uMUAmzyIogFNMgOySV4iVvoCe/hOgA4=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+    msrestazure
+  ] ++ lib.optionals (!isPy3k) [
+    azure-mgmt-nspkg
+  ];
+
+  # has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "azure.mgmt.subscription" ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Subscription Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-synapse/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-synapse/default.nix
new file mode 100644
index 000000000000..a09677ab8e7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-synapse/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder
+, azure-common
+, azure-mgmt-core
+, msrest
+, msrestazure
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-synapse";
+  version = "2.0.0";
+  disabled = pythonOlder "3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bec6bdfaeb55b4fdd159f2055e8875bf50a720bb0fce80a816e92a2359b898c8";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    msrest
+    msrestazure
+  ];
+
+  pythonImportsCheck = [ "azure.mgmt.synapse" ];
+
+  meta = with lib; {
+    description = "Azure python SDK";
+    homepage = "https://github.com/Azure/azure-sdk-for-python/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-trafficmanager/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-trafficmanager/default.nix
new file mode 100644
index 000000000000..c5190b6d3368
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-trafficmanager/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msrest
+, msrestazure
+, azure-common
+, azure-mgmt-core
+, azure-mgmt-nspkg
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-trafficmanager";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-Nb8ZAr8VidYm41lx5aqgCeiECUZytHm3mM0buNTy/fk=";
+  };
+
+  propagatedBuildInputs = [
+    msrest
+    msrestazure
+    azure-common
+    azure-mgmt-core
+  ] ++ lib.optionals (!isPy3k) [
+    azure-mgmt-nspkg
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Traffic Manager Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-mgmt-web/default.nix b/nixpkgs/pkgs/development/python-modules/azure-mgmt-web/default.nix
new file mode 100644
index 000000000000..0008035e91e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-mgmt-web/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, azure-common
+, azure-mgmt-core
+, buildPythonPackage
+, fetchPypi
+, isodate
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-mgmt-web";
+  version = "7.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-78/m9/Ug7Qq8/oZRfhyM8CpxL3N6PbDbfLRsbWR5ge0=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-mgmt-core
+    isodate
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Web Apps Management Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-mgmt-web_${version}/sdk/appservice/azure-mgmt-web/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-monitor-ingestion/default.nix b/nixpkgs/pkgs/development/python-modules/azure-monitor-ingestion/default.nix
new file mode 100644
index 000000000000..7058a1bddbea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-monitor-ingestion/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, setuptools
+, azure-core
+, isodate
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "azure-monitor-ingestion";
+  version = "1.0.3";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-idAEqP+HaZs/0fzyBaqO8enTTySg88w3TSIUceiYdDs=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    azure-core
+    isodate
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [
+    "azure.monitor.ingestion"
+    "azure.monitor.ingestion.aio"
+  ];
+
+  # requires checkout from mono-repo and a mock account
+  doCheck = false;
+
+  meta = with lib; {
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-monitor-ingestion_${version}/sdk/monitor/azure-monitor-ingestion/CHANGELOG.md";
+    description = "Send custom logs to Azure Monitor using the Logs Ingestion API";
+    homepage = "https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/monitor/azure-monitor-ingestion";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-multiapi-storage/default.nix b/nixpkgs/pkgs/development/python-modules/azure-multiapi-storage/default.nix
new file mode 100644
index 000000000000..09f8e3b1fad0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-multiapi-storage/default.nix
@@ -0,0 +1,41 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, azure-common
+, azure-core
+, msrest
+, msrestazure
+, requests
+}:
+
+buildPythonPackage rec {
+  version = "1.2.0";
+  pname = "azure-multiapi-storage";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-CQuoWHeh0EMitTRsvifotrTwpWd/Q9LWWD7jZ2w9r8I=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    msrest
+    msrestazure
+    requests
+  ];
+
+  # fix namespace
+  pythonNamespaces = [ "azure.multiapi" ];
+
+  # no tests included
+  doCheck = false;
+
+  pythonImportsCheck = [ "azure.common" "azure.multiapi.storage" ];
+
+  meta = with lib; {
+    description = "Microsoft Azure Storage Client Library for Python with multi API version support.";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-nspkg/default.nix b/nixpkgs/pkgs/development/python-modules/azure-nspkg/default.nix
new file mode 100644
index 000000000000..f9c8e8d68c64
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-nspkg/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  version = "3.0.2";
+  pname = "azure-nspkg";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "e7d3cea6af63e667d87ba1ca4f8cd7cb4dfca678e4c55fc1cedb320760e39dd0";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Microsoft Azure SDK for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ olcai maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-servicebus/default.nix b/nixpkgs/pkgs/development/python-modules/azure-servicebus/default.nix
new file mode 100644
index 000000000000..562340f93e4d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-servicebus/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, azure-common
+, azure-core
+, buildPythonPackage
+, fetchPypi
+, isodate
+, msrest
+, pythonOlder
+, typing-extensions
+, uamqp
+}:
+
+buildPythonPackage rec {
+  pname = "azure-servicebus";
+  version = "7.11.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-970pd5G2pXfONqOeoKuxCqD4dba7DTFSLtntK7AojUw=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    isodate
+    msrest
+    typing-extensions
+    uamqp
+  ];
+
+  # Tests require dev-tools
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.servicebus"
+  ];
+
+  meta = with lib; {
+    description = "Microsoft Azure Service Bus Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-servicebus_${version}/sdk/servicebus/azure-servicebus/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-servicefabric/default.nix b/nixpkgs/pkgs/development/python-modules/azure-servicefabric/default.nix
new file mode 100644
index 000000000000..64e7a8f63d32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-servicefabric/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-common
+, msrest
+}:
+
+buildPythonPackage rec {
+  pname = "azure-servicefabric";
+  version = "8.2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "f49c8759447970817b9b2d3d4b97439765dcf75ba01b6066ce96b605052fbb23";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    msrest
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This project provides a client library in Python that makes it easy to consume Microsoft Azure Storage services";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-servicemanagement-legacy/default.nix b/nixpkgs/pkgs/development/python-modules/azure-servicemanagement-legacy/default.nix
new file mode 100644
index 000000000000..b54e17db283e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-servicemanagement-legacy/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-common
+, requests
+}:
+
+buildPythonPackage rec {
+  version = "0.20.7";
+  pname = "azure-servicemanagement-legacy";
+
+  src = fetchPypi {
+    inherit version pname;
+    extension = "zip";
+    sha256 = "1kcibw17qm8c02y28xabm3k1zrawi6g4q8kzc751l5l3vagqnf2x";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    requests
+  ];
+
+  pythonNamespaces = [ "azure" ];
+  # has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "azure.servicemanagement" ];
+
+  meta = with lib; {
+    description = "This is the Microsoft Azure Service Management Legacy Client Library";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ olcai maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-storage-blob/default.nix b/nixpkgs/pkgs/development/python-modules/azure-storage-blob/default.nix
new file mode 100644
index 000000000000..e0846bc60514
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-storage-blob/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, azure-core
+, buildPythonPackage
+, cryptography
+, fetchPypi
+, isodate
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "azure-storage-blob";
+  version = "12.18.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-4Rk1NImB/8AFuEi1XbJcBPLR+Q4e4zAAZZkGt2PPFMg=";
+  };
+
+  propagatedBuildInputs = [
+    azure-core
+    cryptography
+    isodate
+    typing-extensions
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Client library for Microsoft Azure Storage services containing the blob service APIs";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-storage-blob_${version}/sdk/storage/azure-storage-blob/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cmcdragonkai maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-storage-common/default.nix b/nixpkgs/pkgs/development/python-modules/azure-storage-common/default.nix
new file mode 100644
index 000000000000..50fb3450d84f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-storage-common/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-common
+, cryptography
+, python-dateutil
+, requests
+, isPy3k
+, azure-storage-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-storage-common";
+  version = "2.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ccedef5c67227bc4d6670ffd37cec18fb529a1b7c3a5e53e4096eb0cf23dc73f";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    cryptography
+    python-dateutil
+    requests
+  ] ++ lib.optional (!isPy3k) azure-storage-nspkg;
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Client library for Microsoft Azure Storage services containing common code shared by blob, file and queue";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cmcdragonkai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-storage-file-share/default.nix b/nixpkgs/pkgs/development/python-modules/azure-storage-file-share/default.nix
new file mode 100644
index 000000000000..b89653fb6781
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-storage-file-share/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, azure-core
+, buildPythonPackage
+, cryptography
+, fetchPypi
+, isodate
+, msrest
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "azure-storage-file-share";
+  version = "12.15.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-AJjxz6k0TE94HODNUE/zo1JVdRVTwB5yDczQyqjYqio=";
+  };
+
+  propagatedBuildInputs = [
+    azure-core
+    cryptography
+    isodate
+    typing-extensions
+  ];
+
+  # Tests require checkout from monorepo
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.core"
+    "azure.storage"
+  ];
+
+  meta = with lib; {
+    description = "Microsoft Azure File Share Storage Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-storage-file-share_${version}/sdk/storage/azure-storage-file-share/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kamadorueda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-storage-file/default.nix b/nixpkgs/pkgs/development/python-modules/azure-storage-file/default.nix
new file mode 100644
index 000000000000..8ce1d572e8e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-storage-file/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-common
+, azure-storage-common
+, isPy3k
+, futures ? null
+}:
+
+buildPythonPackage rec {
+  pname = "azure-storage-file";
+  version = "2.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3559b9c7ab13450c66ea833eb82c28233bee24f1bd8ca19aa7d27f8c23d5bc53";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-storage-common
+  ] ++ lib.optional (!isPy3k) futures;
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Client library for Microsoft Azure Storage services containing the file service APIs";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cmcdragonkai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-storage-nspkg/default.nix b/nixpkgs/pkgs/development/python-modules/azure-storage-nspkg/default.nix
new file mode 100644
index 000000000000..b8e243c9b6aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-storage-nspkg/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, azure-nspkg
+}:
+
+buildPythonPackage rec {
+  pname = "azure-storage-nspkg";
+  version = "3.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6f3bbe8652d5f542767d8433e7f96b8df7f518774055ac7c92ed7ca85f653811";
+  };
+
+  propagatedBuildInputs = [
+    azure-nspkg
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Client library for Microsoft Azure Storage services owning the azure.storage namespace, user should not use this directly";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cmcdragonkai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-storage-queue/default.nix b/nixpkgs/pkgs/development/python-modules/azure-storage-queue/default.nix
new file mode 100644
index 000000000000..70f1b5589d91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-storage-queue/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, azure-core
+, buildPythonPackage
+, cryptography
+, fetchPypi
+, isodate
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "azure-storage-queue";
+  version = "12.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-mHwAjOv6d+Xh6mwKhVK6w3Rsh3HgijntkvEmRqOrYRk=";
+  };
+
+  propagatedBuildInputs = [
+    azure-core
+    cryptography
+    isodate
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = {
+    aio = [
+      azure-core
+    ] ++ azure-core.optional-dependencies.aio;
+  };
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.storage.queue"
+  ];
+
+  meta = with lib; {
+    description = "Client library for Microsoft Azure Storage services containing the queue service APIs";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-storage-queue_${version}/sdk/storage/azure-storage-queue/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cmcdragonkai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-synapse-accesscontrol/default.nix b/nixpkgs/pkgs/development/python-modules/azure-synapse-accesscontrol/default.nix
new file mode 100644
index 000000000000..fc6cd765cdbb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-synapse-accesscontrol/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi
+, azure-common
+, azure-core
+, msrest
+}:
+
+buildPythonPackage rec {
+  pname = "azure-synapse-accesscontrol";
+  version = "0.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "565aa26336d560c028775e8ae50d0691aa7089e96170e78342371b773da3137c";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    msrest
+  ];
+
+  # zero tests run
+  doCheck = false;
+
+  pythonImportsCheck = [ "azure.synapse.accesscontrol" ];
+
+  meta = with lib; {
+    description = "Azure python SDK";
+    homepage = "https://github.com/Azure/azure-sdk-for-python/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-synapse-artifacts/default.nix b/nixpkgs/pkgs/development/python-modules/azure-synapse-artifacts/default.nix
new file mode 100644
index 000000000000..1782dd56e485
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-synapse-artifacts/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, azure-common
+, azure-core
+, azure-mgmt-core
+, buildPythonPackage
+, fetchPypi
+, isodate
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "azure-synapse-artifacts";
+  version = "0.18.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-qgiHMzW7T5NuQl0jwZheMXp7wHhNOHyH24J6wfc4VqQ=";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    azure-mgmt-core
+    isodate
+  ];
+
+  # Tests are only available in mono-repo
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "azure.synapse.artifacts"
+  ];
+
+  meta = with lib; {
+    description = "Microsoft Azure Synapse Artifacts Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-synapse-artifacts_${version}/sdk/synapse/azure-synapse-artifacts/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-synapse-managedprivateendpoints/default.nix b/nixpkgs/pkgs/development/python-modules/azure-synapse-managedprivateendpoints/default.nix
new file mode 100644
index 000000000000..4a8b98be01ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-synapse-managedprivateendpoints/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi
+, azure-common
+, azure-core
+, msrest
+}:
+
+buildPythonPackage rec {
+  pname = "azure-synapse-managedprivateendpoints";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "900eaeaccffdcd01012b248a7d049008c92807b749edd1c9074ca9248554c17e";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    msrest
+  ];
+
+  pythonNamespaces = [ "azure.synapse" ];
+
+  pythonImportsCheck = [ "azure.synapse.managedprivateendpoints" ];
+
+  meta = with lib; {
+    description = "Microsoft Azure Synapse Managed Private Endpoints Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/azure-synapse-spark/default.nix b/nixpkgs/pkgs/development/python-modules/azure-synapse-spark/default.nix
new file mode 100644
index 000000000000..554b97c35619
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/azure-synapse-spark/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi
+, azure-common
+, azure-core
+, msrest
+}:
+
+buildPythonPackage rec {
+  pname = "azure-synapse-spark";
+  version = "0.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "86fa29463a24b7c37025ff21509b70e36b4dace28e5d92001bc920488350acd5";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    azure-common
+    azure-core
+    msrest
+  ];
+
+  pythonImportsCheck = [ "azure.synapse.spark" ];
+
+  meta = with lib; {
+    description = "Azure python SDK";
+    homepage = "https://github.com/Azure/azure-sdk-for-python/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/b2sdk/default.nix b/nixpkgs/pkgs/development/python-modules/b2sdk/default.nix
new file mode 100644
index 000000000000..7bb1551c5770
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/b2sdk/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, glibcLocales
+, importlib-metadata
+, logfury
+, pyfakefs
+, pytestCheckHook
+, pytest-lazy-fixture
+, pytest-mock
+, pythonOlder
+, requests
+, setuptools-scm
+, tqdm
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "b2sdk";
+  version = "1.24.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Tp9RjtybqCSxB1gFZXrjwNJ4mmwl+OWTzVyHd250Jas=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    logfury
+    requests
+    tqdm
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ] ++ lib.optionals (pythonOlder "3.12") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-lazy-fixture
+    pytest-mock
+    pyfakefs
+  ] ++ lib.optionals stdenv.isLinux [
+    glibcLocales
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'setuptools_scm<6.0' 'setuptools_scm'
+  '';
+
+  disabledTestPaths = [
+    # requires aws s3 auth
+    "test/integration/test_download.py"
+    "test/integration/test_upload.py"
+  ];
+
+  disabledTests = [
+    # Test requires an API key
+    "test_raw_api"
+    "test_files_headers"
+    "test_large_file"
+  ];
+
+  pythonImportsCheck = [
+    "b2sdk"
+  ];
+
+  meta = with lib; {
+    description = "Client library and utilities for access to B2 Cloud Storage (backblaze)";
+    homepage = "https://github.com/Backblaze/b2-sdk-python";
+    changelog = "https://github.com/Backblaze/b2-sdk-python/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/babel/default.nix b/nixpkgs/pkgs/development/python-modules/babel/default.nix
new file mode 100644
index 000000000000..a97224b5c860
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/babel/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, pythonAtLeast
+, pythonOlder
+, tzdata
+
+# tests
+, freezegun
+, pytestCheckHook
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "babel";
+  version = "2.12.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Babel";
+    inherit version;
+    hash = "sha256-zC2ZmZzQHURCCuclohyeNxGzqtx5dtYUf2IthYGWNFU=";
+  };
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.9") [
+    pytz
+  ];
+
+  # including backports.zoneinfo for python<3.9 yields infinite recursion
+  doCheck = pythonAtLeast "3.9";
+
+  nativeCheckInputs = [
+    freezegun
+    pytestCheckHook
+    # https://github.com/python-babel/babel/issues/988#issuecomment-1521765563
+    pytz
+  ] ++ lib.optionals isPyPy [
+    tzdata
+  ];
+
+  disabledTests = [
+    # fails on days switching from and to daylight saving time in EST
+    # https://github.com/python-babel/babel/issues/988
+    "test_format_time"
+  ];
+
+  meta = with lib; {
+    homepage = "https://babel.pocoo.org/";
+    changelog = "https://github.com/python-babel/babel/releases/tag/v${version}";
+    description = "Collection of internationalizing tools";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/babelfish/default.nix b/nixpkgs/pkgs/development/python-modules/babelfish/default.nix
new file mode 100644
index 000000000000..4f64e65bae03
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/babelfish/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, setuptools }:
+
+buildPythonPackage rec {
+  pname = "babelfish";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2dadfadd1b205ca5fa5dc9fa637f5b7933160a0418684c7c46a7a664033208a2";
+  };
+
+  propagatedBuildInputs = [ setuptools ];
+
+  # no tests executed
+  doCheck = false;
+
+  pythonImportsCheck = [ "babelfish" ];
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/babelfish";
+    description = "A module to work with countries and languages";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/babelgladeextractor/default.nix b/nixpkgs/pkgs/development/python-modules/babelgladeextractor/default.nix
new file mode 100644
index 000000000000..60978371eb95
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/babelgladeextractor/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, isPy3k
+, buildPythonPackage
+, fetchPypi
+, babel
+}:
+
+buildPythonPackage rec {
+  pname = "babelgladeextractor";
+  version = "0.7.0";
+  disabled = (!isPy3k); # uses python3 specific file io in setup.py
+
+  src = fetchPypi {
+    pname = "BabelGladeExtractor";
+    inherit version;
+    extension = "tar.bz2";
+    sha256 = "160p4wi2ss69g141c2z59azvrhn7ymy5m9h9d65qrcabigi0by5w";
+  };
+
+  propagatedBuildInputs = [
+    babel
+  ];
+
+  # SyntaxError: Non-ASCII character '\xc3' in file /build/BabelGladeExtractor-0.6.3/babelglade/tests/test_translate.py on line 20, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
+  doCheck = isPy3k;
+
+  meta = with lib; {
+    homepage = "https://github.com/gnome-keysign/babel-glade";
+    description = "Babel Glade XML files translatable strings extractor";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/backcall/default.nix b/nixpkgs/pkgs/development/python-modules/backcall/default.nix
new file mode 100644
index 000000000000..acc189904461
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backcall/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "backcall";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e";
+  };
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = {
+    description = "Specifications for callback functions passed in to an API";
+    homepage = "https://github.com/takluyver/backcall";
+    license = lib.licenses.bsd3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/backoff/default.nix b/nixpkgs/pkgs/development/python-modules/backoff/default.nix
new file mode 100644
index 000000000000..000f02447676
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backoff/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pytest-asyncio
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "backoff";
+  version = "2.2.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "litl";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-g8bYGJ6Kw6y3BUnuoP1IAye5CL0geH5l7pTb3xxq7jI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "backoff"
+  ];
+
+  meta = with lib; {
+    description = "Function decoration for backoff and retry";
+    homepage = "https://github.com/litl/backoff";
+    license = licenses.mit;
+    maintainers = with maintainers; [ chkno ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/backports-cached-property/default.nix b/nixpkgs/pkgs/development/python-modules/backports-cached-property/default.nix
new file mode 100644
index 000000000000..27ad57237063
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports-cached-property/default.nix
@@ -0,0 +1,46 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder
+, setuptools-scm, wheel
+, pytestCheckHook, pytest-mock, pytest-sugar
+}:
+
+buildPythonPackage rec {
+  pname = "backports-cached-property";
+  version = "1.0.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "penguinolog";
+    repo = "backports.cached_property";
+    rev = version;
+    hash = "sha256-rdgKbVQaELilPrN4ve8RbbaLiT14Xex0esy5vUX2ZBc=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    wheel
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+    pytest-sugar
+  ];
+
+  pythonImportsCheck = [
+    "backports.cached_property"
+  ];
+
+  meta = with lib; {
+    description = "Python 3.8 functools.cached_property backport to python 3.6";
+    homepage = "https://github.com/penguinolog/backports.cached_property";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ izorkin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/backports-datetime-fromisoformat/default.nix b/nixpkgs/pkgs/development/python-modules/backports-datetime-fromisoformat/default.nix
new file mode 100644
index 000000000000..88e140ad82f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports-datetime-fromisoformat/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytz
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "backports-datetime-fromisoformat";
+  version = "2.0.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "movermeyer";
+    repo = "backports.datetime_fromisoformat";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-aHF3E/fLN+j/T4W9lvuVSMy6iRSEn+ARWmL01rY+ixs=";
+  };
+
+  nativeCheckInputs = [
+    pytz
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "backports.datetime_fromisoformat"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/movermeyer/backports.datetime_fromisoformat/releases/tag/v${version}";
+    description = "Backport of Python 3.11's datetime.fromisoformat";
+    homepage = "https://github.com/movermeyer/backports.datetime_fromisoformat";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/backports-entry-points-selectable/default.nix b/nixpkgs/pkgs/development/python-modules/backports-entry-points-selectable/default.nix
new file mode 100644
index 000000000000..669f997f6e86
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports-entry-points-selectable/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools-scm
+, importlib-metadata
+}:
+
+buildPythonPackage rec {
+  pname = "backports-entry-points-selectable";
+  version = "1.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "backports.entry_points_selectable";
+    inherit version;
+    hash = "sha256-Rwb1kXllfKfB0yWlQ+4TcPj0YzH0MrysYvqyQv3wr6U=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "backports.entry_points_selectable" ];
+
+  pythonNamespaces = [ "backports" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/jaraco/backports.entry_points_selectable/blob/v${version}/CHANGES.rst";
+    description = "Compatibility shim providing selectable entry points for older implementations";
+    homepage = "https://github.com/jaraco/backports.entry_points_selectable";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/backports-shutil-which/default.nix b/nixpkgs/pkgs/development/python-modules/backports-shutil-which/default.nix
new file mode 100644
index 000000000000..95b47bb6028e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports-shutil-which/default.nix
@@ -0,0 +1,24 @@
+{ lib, fetchPypi, buildPythonPackage, pytest }:
+
+buildPythonPackage rec {
+  pname = "backports.shutil_which";
+  version = "3.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fe39f567cbe4fad89e8ac4dbeb23f87ef80f7fe8e829669d0221ecdb0437c133";
+  };
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test test
+  '';
+
+  meta = with lib; {
+    description = "Backport of shutil.which from Python 3.3";
+    homepage = "https://github.com/minrk/backports.shutil_which";
+    license = licenses.psfl;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/backports-strenum/default.nix b/nixpkgs/pkgs/development/python-modules/backports-strenum/default.nix
new file mode 100644
index 000000000000..229f9282c355
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports-strenum/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "backports-strenum";
+  version = "1.2.8";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "clbarnes";
+    repo = "backports.strenum";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-jbMR9VAGsMAJTP2VQyRr+RPYwWwk8hGAYs4KoZEWa7U=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "backports.strenum"
+  ];
+
+  meta = with lib; {
+    description = "Base class for creating enumerated constants that are also subclasses of str";
+    homepage = "https://github.com/clbarnes/backports.strenum";
+    license = with licenses; [ psfl ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/backports-zoneinfo/default.nix b/nixpkgs/pkgs/development/python-modules/backports-zoneinfo/default.nix
new file mode 100644
index 000000000000..faed6af9cbbd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports-zoneinfo/default.nix
@@ -0,0 +1,80 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, pythonAtLeast
+, pythonOlder
+, python
+, substituteAll
+, importlib-resources
+, tzdata
+, hypothesis
+, pytestCheckHook
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "backports-zoneinfo";
+  version = "0.2.1";
+
+  disabled = pythonAtLeast "3.9";
+
+  src = fetchFromGitHub {
+    owner = "pganssle";
+    repo = "zoneinfo";
+    rev = version;
+    hash = "sha256-00xdDOVdDanfsjQTd3yjMN2RFGel4cWRrAA3CvSnl24=";
+  };
+
+  # Make sure test data update patch applies
+  prePatch = ''
+    substituteInPlace tests/data/zoneinfo_data.json --replace \"2020a\" \"2021a\"
+  '';
+
+  patches = [
+    # Update test suite's test data to zoneinfo 2022a
+    # https://github.com/pganssle/zoneinfo/pull/115
+    (fetchpatch {
+      name = "backports-zoneinfo-2022a-update-test-data1.patch";
+      url = "https://github.com/pganssle/zoneinfo/pull/115/commits/837e2a0f9f1a1332e4233f83e3648fa564a9ec9e.patch";
+      sha256 = "196knwa212mr0b7zsh8papzr3f5mii87gcjjjx1r9zzvmk3g3ri0";
+    })
+    (fetchpatch {
+      name = "backports-zoneinfo-2022a-update-test-data2.patch";
+      url = "https://github.com/pganssle/zoneinfo/pull/115/commits/9fd330265b177916d6182249439bb40d5691eb58.patch";
+      sha256 = "1zxa5bkwi8hbnh4c0qv72wv6vdp5jlxqizfjsc05ymzvwa99cf75";
+    })
+
+    (substituteAll {
+      name = "zoneinfo-path";
+      src = ./zoneinfo.patch;
+      zoneinfo = "${tzdata}/lib/${python.libPrefix}/site-packages/tzdata/zoneinfo";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    tzdata
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    importlib-resources
+  ];
+
+  pythonImportsCheck = [ "backports.zoneinfo" ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # AssertionError: 'AEDT' != 'AEST'
+    "test_folds_and_gaps"
+    # AssertionError: 0 != 1 : (datetime.datetime(1917, 3, 25, 2, 0, 1, tzinfo=backports.zoneinfo.ZoneInfo(key='Australia/Sydney')), datetime.datetime(1917, 3, 24, 15, 0, tzinfo=datetime.timezone.utc))
+    "test_folds_from_utc"
+    # backports.zoneinfo._common.ZoneInfoNotFoundError: 'No time zone found with key Eurasia/Badzone'
+    "test_bad_keys"
+  ];
+
+  meta = with lib; {
+    description = "Backport of the standard library module zoneinfo";
+    homepage = "https://github.com/pganssle/zoneinfo";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/backports-zoneinfo/zoneinfo.patch b/nixpkgs/pkgs/development/python-modules/backports-zoneinfo/zoneinfo.patch
new file mode 100644
index 000000000000..69dd75030ab2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports-zoneinfo/zoneinfo.patch
@@ -0,0 +1,17 @@
+diff --git a/src/backports/zoneinfo/_tzpath.py b/src/backports/zoneinfo/_tzpath.py
+index 9baaf6b..3f842af 100644
+--- a/src/backports/zoneinfo/_tzpath.py
++++ b/src/backports/zoneinfo/_tzpath.py
+@@ -24,10 +24,7 @@ def reset_tzpath(to=None):
+             base_tzpath = _parse_python_tzpath(env_var)
+         elif sys.platform != "win32":
+             base_tzpath = [
+-                "/usr/share/zoneinfo",
+-                "/usr/lib/zoneinfo",
+-                "/usr/share/lib/zoneinfo",
+-                "/etc/zoneinfo",
++                "@zoneinfo@"
+             ]
+ 
+             base_tzpath.sort(key=lambda x: not os.path.exists(x))
+
diff --git a/nixpkgs/pkgs/development/python-modules/backports_shutil_get_terminal_size/default.nix b/nixpkgs/pkgs/development/python-modules/backports_shutil_get_terminal_size/default.nix
new file mode 100644
index 000000000000..aec6077dd766
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/backports_shutil_get_terminal_size/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, pythonOlder
+}:
+
+if !(pythonOlder "3.3") then null else buildPythonPackage {
+  pname = "backports.shutil_get_terminal_size";
+  version = "unstable-2016-02-21";
+
+  # there have been numerous fixes committed since the initial release.
+  # Most notably fixing a problem where the backport would always return
+  # terminal size 0. See https://trac.sagemath.org/ticket/25320#comment:5.
+  # Unfortunately the maintainer seems inactive and has not responded to
+  # a request for a new release since 2016:
+  # https://github.com/chrippa/backports.shutil_get_terminal_size/issues/7
+  src = fetchFromGitHub {
+    owner = "chrippa";
+    repo = "backports.shutil_get_terminal_size";
+    rev = "159e269450dbf37c3a837f6ea7e628d59acbb96a";
+    sha256 = "17sgv8vg0xxfdnca45l1mmwwvj29gich5c8kqznnj51kfccch7sg";
+  };
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  meta = with lib; {
+    description = "A backport of the get_terminal_size function from Python 3.3’s shutil.";
+    homepage = "https://github.com/chrippa/backports.shutil_get_terminal_size";
+    license = with licenses; [ mit ];
+    maintainers = teams.sage.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bacpypes/default.nix b/nixpkgs/pkgs/development/python-modules/bacpypes/default.nix
new file mode 100644
index 000000000000..9804dd20f576
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bacpypes/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, wheel
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bacpypes";
+  version = "0.18.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "JoelBender";
+    repo = "bacpypes";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-BHCHI36nTqBj2dkHB/Y5qkC4uJCmzbHGzSFWKNsIdbc=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'," "" \
+      --replace "(3, 8): 'py34'," "(3, 8): 'py34', (3, 9): 'py34', (3, 10): 'py34', (3, 11): 'py34', (3, 12): 'py34',"
+  '';
+
+  propagatedBuildInputs = [
+    wheel
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Test fails with a an error: AssertionError: assert 30 == 31
+    "test_recurring_task_5"
+  ];
+
+  pythonImportsCheck = [
+    "bacpypes"
+  ];
+
+  meta = with lib; {
+    description = "Module for the BACnet application layer and network layer";
+    homepage = "https://github.com/JoelBender/bacpypes";
+    changelog = "https://github.com/JoelBender/bacpypes/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bachp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bagit/default.nix b/nixpkgs/pkgs/development/python-modules/bagit/default.nix
new file mode 100644
index 000000000000..5f15060c4e2d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bagit/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, gettext
+, mock
+, pytestCheckHook
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "bagit";
+  version = "1.8.1";
+
+  src = fetchFromGitHub {
+    owner = "LibraryOfCongress";
+    repo = "bagit-python";
+    rev = "v${version}";
+    hash = "sha256-t01P7MPWgOrktuW2zF0TIzt6u/jkLmrpD2OnqawhJaI=";
+  };
+
+  nativeBuildInputs = [ gettext setuptools-scm ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+  pytestFlagsArray = [ "test.py" ];
+  pythonImportsCheck = [ "bagit" ];
+
+  meta = with lib; {
+    description = "Python library and command line utility for working with BagIt style packages";
+    homepage = "https://libraryofcongress.github.io/bagit-python/";
+    license = with licenses; [ publicDomain ];
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bambi/default.nix b/nixpkgs/pkgs/development/python-modules/bambi/default.nix
new file mode 100644
index 000000000000..5a3a23a4e3d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bambi/default.nix
@@ -0,0 +1,94 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, arviz
+, formulae
+, graphviz
+, pandas
+, pymc
+, blackjax
+, numpyro
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "bambi";
+  version = "0.13.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bambinos";
+    repo = "bambi";
+    rev = "refs/tags/${version}";
+    hash = "sha256-9+uTyV3mQlHOKAjXohwkhTzNe/+I5XR/LuH1ZYvhc8I=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    arviz
+    formulae
+    graphviz
+    pandas
+    pymc
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  nativeCheckInputs = [
+    blackjax
+    numpyro
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_alias_equal_to_name"
+    "test_average_by"
+    "test_ax"
+    "test_basic"
+    "test_censored_response"
+    "test_custom_prior"
+    "test_data_is_copied"
+    "test_distributional_model"
+    "test_elasticity"
+    "test_extra_namespace"
+    "test_fig_kwargs"
+    "test_gamma_with_splines"
+    "test_group_effects"
+    "test_hdi_prob"
+    "test_legend"
+    "test_non_distributional_model"
+    "test_normal_with_splines"
+    "test_predict_offset"
+    "test_predict_new_groups"
+    "test_predict_new_groups_fail"
+    "test_set_alias_warnings"
+    "test_subplot_kwargs"
+    "test_transforms"
+    "test_use_hdi"
+    "test_with_groups"
+    "test_with_group_and_panel"
+    "test_with_user_values"
+  ];
+
+  pythonImportsCheck = [
+    "bambi"
+  ];
+
+  meta = with lib; {
+    homepage = "https://bambinos.github.io/bambi";
+    description = "High-level Bayesian model-building interface";
+    changelog = "https://github.com/bambinos/bambi/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/banal/default.nix b/nixpkgs/pkgs/development/python-modules/banal/default.nix
new file mode 100644
index 000000000000..066fba0b5c95
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/banal/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+}:
+buildPythonPackage rec {
+  pname = "banal";
+  version = "1.0.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2fe02c9305f53168441948f4a03dfbfa2eacc73db30db4a93309083cb0e250a5";
+  };
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "banal"
+  ];
+
+  meta = with lib; {
+    description = "Commons of banal micro-functions for Python";
+    homepage = "https://github.com/pudo/banal";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bandcamp-api/default.nix b/nixpkgs/pkgs/development/python-modules/bandcamp-api/default.nix
new file mode 100644
index 000000000000..31efe43cbef5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bandcamp-api/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, beautifulsoup4
+, demjson3
+, html5lib
+, lxml
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "bandcamp-api";
+  version = "0.2.3";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "bandcamp_api";
+    inherit version;
+    hash = "sha256-7/WXMo7fCDMHATp4hEB8b7fNJWisUv06hbP+O878Phs=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    demjson3
+    html5lib
+    lxml
+    requests
+  ];
+
+  pythonImportsCheck = [ "bandcamp_api" ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  meta = {
+    description = "Obtains information from bandcamp.com";
+    homepage = "https://github.com/RustyRin/bandcamp-api";
+    license = lib.licenses.gpl3Only;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bandit/default.nix b/nixpkgs/pkgs/development/python-modules/bandit/default.nix
new file mode 100644
index 000000000000..79c19ba765b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bandit/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, pythonOlder
+, gitpython
+, pbr
+, pyyaml
+, rich
+, stevedore
+}:
+
+buildPythonPackage rec {
+  pname = "bandit";
+  version = "1.7.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vfxzm6oDuIDC0V0EMbMcZY/8NI6Qf+GX5U4Did1Z4R4=";
+  };
+
+  nativeBuildInputs = [
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    gitpython
+    pyyaml
+    rich
+    stevedore
+  ];
+
+  # Framework is Tox, tox performs 'pip install' inside the virtual-env
+  #   and this requires Network Connectivity
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "bandit"
+  ];
+
+  meta = with lib; {
+    description = "Security oriented static analyser for python code";
+    homepage = "https://bandit.readthedocs.io/";
+    changelog = "https://github.com/PyCQA/bandit/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ kamadorueda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bangla/default.nix b/nixpkgs/pkgs/development/python-modules/bangla/default.nix
new file mode 100644
index 000000000000..d5664d7aeae0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bangla/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "bangla";
+  version = "0.0.2";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-F8j9UBMhZgB31atqebdGu6cfnkk573isDZp1171xXag=";
+  };
+
+  pythonImportsCheck = [ "bangla" ];
+
+  # https://github.com/arsho/bangla/issues/5
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Bangla is a package for Bangla language users with various functionalities including Bangla date and Bangla numeric conversation";
+    homepage = "https://github.com/arsho/bangla";
+    license = licenses.mit;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bap/default.nix b/nixpkgs/pkgs/development/python-modules/bap/default.nix
new file mode 100644
index 000000000000..03abf67f86a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bap/default.nix
@@ -0,0 +1,23 @@
+{lib, buildPythonPackage, fetchFromGitHub, bap, requests}:
+
+buildPythonPackage rec {
+  pname = "bap";
+  version = "1.3.1";
+  src = fetchFromGitHub {
+    owner = "BinaryAnalysisPlatform";
+    repo = "bap-python";
+    rev = version;
+    sha256 = "1ahkrmcn7qaivps1gar8wd9mq2qqyx6zzvznf5r9rr05h17x5lbp";
+  };
+
+  propagatedBuildInputs = [bap requests];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Platform for binary analysis. It is written in OCaml, but can be used from other languages.";
+    homepage = "https://github.com/BinaryAnalysisPlatform/bap/";
+    maintainers = [ maintainers.maurer ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/barectf/default.nix b/nixpkgs/pkgs/development/python-modules/barectf/default.nix
new file mode 100644
index 000000000000..429e03fbe940
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/barectf/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, setuptools
+, jsonschema
+, pyyaml
+, jinja2
+, termcolor
+}:
+
+buildPythonPackage rec {
+  pname = "barectf";
+  version = "3.1.2";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "efficios";
+    repo = "barectf";
+    rev = "v${version}";
+    hash = "sha256-JelFfd3WS012dveNlIljhLdyPmgE9VEOXoZE3MBA/Gw=";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  propagatedBuildInputs = [
+    setuptools # needs pkg_resources at runtime
+    jsonschema
+    pyyaml
+    jinja2
+    termcolor
+  ];
+
+  pythonImportsCheck = [ "barectf" ];
+
+  meta = with lib; {
+    description = "Generator of ANSI C tracers which output CTF data streams ";
+    homepage = "https://github.com/efficios/barectf";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Madouura ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/baron/default.nix b/nixpkgs/pkgs/development/python-modules/baron/default.nix
new file mode 100644
index 000000000000..af8c1a1d36a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/baron/default.nix
@@ -0,0 +1,24 @@
+{ lib, fetchPypi, buildPythonPackage, rply, pytestCheckHook, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "baron";
+  version = "0.10.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "af822ad44d4eb425c8516df4239ac4fdba9fdb398ef77e4924cd7c9b4045bc2f";
+  };
+
+  propagatedBuildInputs = [ rply ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  doCheck = isPy3k;
+
+  meta = with lib; {
+    homepage = "https://github.com/gristlabs/asttokens";
+    description = "Abstraction on top of baron, a FST for python to make writing refactoring code a realistic task";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ marius851000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/base36/default.nix b/nixpkgs/pkgs/development/python-modules/base36/default.nix
new file mode 100644
index 000000000000..92b4faf7d9e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/base36/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "base36";
+  version = "0.1.1";
+
+  src = fetchFromGitHub {
+    owner = "tonyseek";
+    repo = "python-base36";
+    rev = "v${version}";
+    sha256 = "076nmk9s0zkmgs2zqzkaqij5cmzhf4mrhivbb9n6cvz52i1mppr5";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "[pytest]" "[tool:pytest]" \
+      --replace "--pep8 --cov" ""
+  '';
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pytestFlagsArray = [ "test_base36.py" ];
+  pythonImportsCheck = [ "base36" ];
+
+  meta = with lib; {
+    description = "Python implementation for the positional numeral system using 36 as the radix";
+    homepage = "https://github.com/tonyseek/python-base36";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/base58/default.nix b/nixpkgs/pkgs/development/python-modules/base58/default.nix
new file mode 100644
index 000000000000..9a4d30f6149a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/base58/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyhamcrest
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "base58";
+  version = "2.1.1";
+  format = "setuptools";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c";
+  };
+
+  nativeCheckInputs = [
+    pyhamcrest
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # avoid dependency on pytest-benchmark
+    "test_decode_random"
+    "test_encode_random"
+  ];
+
+  pythonImportsCheck = [ "base58" ];
+
+  meta = with lib; {
+    description = "Base58 and Base58Check implementation";
+    homepage = "https://github.com/keis/base58";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nyanloutre ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/base58check/default.nix b/nixpkgs/pkgs/development/python-modules/base58check/default.nix
new file mode 100644
index 000000000000..7b635abd0de1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/base58check/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "base58check";
+  version = "1.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "joeblackwaslike";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Tig6beLRDsXC//x4+t/z2BGaJQWzcP0J+QEKx3D0rhs=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "base58check"
+  ];
+
+  meta = with lib; {
+    description = "Implementation of the Base58Check encoding scheme";
+    homepage = "https://github.com/joeblackwaslike/base58check";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/base64io/default.nix b/nixpkgs/pkgs/development/python-modules/base64io/default.nix
new file mode 100644
index 000000000000..4fefa1336214
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/base64io/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "base64io";
+  version = "1.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JPLQ/nZcNTOeGy0zqpX5E3sbdltZQWT60QFsFYJ6cHM=";
+  };
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    homepage = "https://base64io-python.readthedocs.io/";
+    changelog = "https://github.com/aws/base64io-python/blob/${version}/CHANGELOG.rst";
+    description = "Python stream implementation for base64 encoding/decoding";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ anthonyroussel ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/baseline/default.nix b/nixpkgs/pkgs/development/python-modules/baseline/default.nix
new file mode 100644
index 000000000000..947ab4b6c1cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/baseline/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy3k, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "baseline";
+  version = "1.2.1";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "dmgass";
+    repo = "baseline";
+    rev = "95a0b71806ed16310eb0f27bc48aa5e21f731423";
+    sha256 = "0qjg46ipyfjflvjqzqr5p7iylwwqn2mhhrq952d01vi8wvfds10d";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Easy String Baseline";
+    longDescription = ''
+      This tool streamlines creation and maintenance of tests which compare
+      string output against a baseline.
+    '';
+    homepage = "https://github.com/dmgass/baseline";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dnr ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/baselines/default.nix b/nixpkgs/pkgs/development/python-modules/baselines/default.nix
new file mode 100644
index 000000000000..dd5139990128
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/baselines/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, gym
+, scipy
+, tqdm
+, joblib
+, dill
+, progressbar2
+, cloudpickle
+, click
+, pyzmq
+, tensorflow
+, mpi4py
+}:
+
+buildPythonPackage {
+  pname = "baselines";
+  version = "0.1.6"; # remember to manually adjust the rev
+
+  src = fetchFromGitHub {
+    owner = "openai";
+    repo = "baselines";
+    # Unfortunately releases are not tagged. This commit bumps the version in setup.py
+    rev = "2bca7901f51c88cdef3ca0666c6a87c454a4dbe8";
+    sha256 = "0j2ck7rsrcyny9qbmrw9aqvzfhv70nbign8iva2dsisa2x24gbcl";
+  };
+
+  propagatedBuildInputs = [
+    gym
+    scipy
+    tqdm
+    joblib
+    pyzmq
+    dill
+    progressbar2
+    mpi4py
+    cloudpickle
+    tensorflow
+    click
+  ];
+
+  postPatch = ''
+    # Needed for the atari wrapper, but the gym-atari package is not supported
+    # in nixos anyways. Since opencv-python is not currently packaged, we
+    # disable it.
+    sed -ie '/opencv-python/d' setup.py
+  '';
+
+  # fails to create a daemon, probably because of sandboxing
+  doCheck = false;
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  meta = with lib; {
+    description = "High-quality implementations of reinforcement learning algorithms";
+    homepage = "https://github.com/openai/baselines";
+    license = licenses.mit;
+    maintainers = with maintainers; [ timokau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/basemap-data/default.nix b/nixpkgs/pkgs/development/python-modules/basemap-data/default.nix
new file mode 100644
index 000000000000..158c3f3f19c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/basemap-data/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonAtLeast
+, basemap
+, cython
+, geos
+, numpy
+, matplotlib
+, pyproj
+, pyshp
+, python
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "basemap-data";
+  inherit (basemap) version src;
+
+  sourceRoot = "${src.name}/packages/basemap_data";
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck =  [ "mpl_toolkits.basemap_data" ];
+
+  meta = with lib; {
+    homepage = "https://matplotlib.org/basemap/";
+    description = "Data assets for matplotlib basemap";
+    license = with licenses; [ mit lgpl3Plus ];
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/basemap/default.nix b/nixpkgs/pkgs/development/python-modules/basemap/default.nix
new file mode 100644
index 000000000000..9c5ea550abb1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/basemap/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonAtLeast
+, basemap-data
+, cython
+, geos
+, numpy
+, matplotlib
+, pillow
+, pyproj
+, pyshp
+, python
+, pythonRelaxDepsHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "basemap";
+  version = "1.3.8";
+
+  src = fetchFromGitHub {
+    owner = "matplotlib";
+    repo = "basemap";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-QH/pC1WIa0XQaDbAhYwKbCeCyxUprJbNyRfguiLjlHI=";
+  };
+
+  sourceRoot = "${src.name}/packages/basemap";
+
+  nativeBuildInputs = [
+    cython
+    geos
+    pythonRelaxDepsHook
+    setuptools
+  ];
+
+  pythonRelaxDeps = true;
+
+  propagatedBuildInputs = [
+    basemap-data
+    numpy
+    matplotlib
+    pillow # undocumented optional dependency
+    pyproj
+    pyshp
+  ];
+
+  # Standard configurePhase from `buildPythonPackage` seems to break the setup.py script
+  preBuild = ''
+    export GEOS_DIR=${geos}
+  '';
+
+  # test have various problems including requiring internet connection, permissions issues, problems with latest version of pillow
+  doCheck = false;
+
+  checkPhase = ''
+    cd ../../examples
+    export HOME=$TEMPDIR
+    ${python.interpreter} run_all.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://matplotlib.org/basemap/";
+    description = "Plot data on map projections with matplotlib";
+    longDescription = ''
+      An add-on toolkit for matplotlib that lets you plot data on map projections with
+      coastlines, lakes, rivers and political boundaries. See
+      http://matplotlib.github.com/basemap/users/examples.html for examples of what it can do.
+    '';
+    maintainers = with maintainers; [ ];
+    license = with licenses; [ mit lgpl21 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bash-kernel/bash-path.patch b/nixpkgs/pkgs/development/python-modules/bash-kernel/bash-path.patch
new file mode 100644
index 000000000000..98c3cc511ab7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bash-kernel/bash-path.patch
@@ -0,0 +1,22 @@
+diff --git a/bash_kernel/kernel.py b/bash_kernel/kernel.py
+index 0496f1e..bd13c4f 100644
+--- a/bash_kernel/kernel.py
++++ b/bash_kernel/kernel.py
+@@ -88,7 +88,7 @@ class BashKernel(Kernel):
+     @property
+     def banner(self):
+         if self._banner is None:
+-            self._banner = check_output(['bash', '--version']).decode('utf-8')
++            self._banner = check_output(['@bash@', '--version']).decode('utf-8')
+         return self._banner
+ 
+     language_info = {'name': 'bash',
+@@ -116,7 +116,7 @@ class BashKernel(Kernel):
+             # source code there for comments and context for
+             # understanding the code here.
+             bashrc = os.path.join(os.path.dirname(pexpect.__file__), 'bashrc.sh')
+-            child = pexpect.spawn("bash", ['--rcfile', bashrc], echo=False,
++            child = pexpect.spawn("@bash@", ['--rcfile', bashrc], echo=False,
+                                   encoding='utf-8', codec_errors='replace')
+             # Following comment stolen from upstream's REPLWrap:
+             # If the user runs 'env', the value of PS1 will be in the output. To avoid
diff --git a/nixpkgs/pkgs/development/python-modules/bash-kernel/default.nix b/nixpkgs/pkgs/development/python-modules/bash-kernel/default.nix
new file mode 100644
index 000000000000..1c50b151f01e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bash-kernel/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, flit-core
+, ipykernel
+, python
+, pexpect
+, bash
+, substituteAll
+}:
+
+buildPythonPackage rec {
+  pname = "bash-kernel";
+  version = "0.9.1";
+  pyproject = true;
+
+  src = fetchPypi {
+    pname = "bash_kernel";
+    inherit version;
+    hash = "sha256-AYPVPjYP+baEcQUqmiiagWIXMlFrA04njpcgtdFaFis=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./bash-path.patch;
+      bash = lib.getExe bash;
+    })
+  ];
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    ipykernel
+    pexpect
+  ];
+
+  preBuild = ''
+    export HOME=$TMPDIR
+  '';
+
+  postInstall = ''
+    ${python.pythonOnBuildForHost.interpreter} -m bash_kernel.install --prefix $out
+  '';
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Bash Kernel for Jupyter";
+    homepage = "https://github.com/takluyver/bash_kernel";
+    changelog = "https://github.com/takluyver/bash_kernel/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ zimbatm ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bashlex/default.nix b/nixpkgs/pkgs/development/python-modules/bashlex/default.nix
new file mode 100644
index 000000000000..ed5cb1a6091a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bashlex/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "bashlex";
+  version = "0.18";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "idank";
+    repo = pname;
+    rev = version;
+    hash = "sha256-ddZN91H95RiTLXx4lpES1Dmz7nNsSVUeuFuOEpJ7LQI=";
+  };
+
+  # workaround https://github.com/idank/bashlex/issues/51
+  preBuild = ''
+    ${python.pythonOnBuildForHost.interpreter} -c 'import bashlex'
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "bashlex" ];
+
+  meta = with lib; {
+    description = "Python parser for bash";
+    license = licenses.gpl3Plus;
+    homepage = "https://github.com/idank/bashlex";
+    maintainers = with maintainers; [ multun ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/basiciw/default.nix b/nixpkgs/pkgs/development/python-modules/basiciw/default.nix
new file mode 100644
index 000000000000..8ae4a59cfb47
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/basiciw/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, gcc
+, wirelesstools
+, isPy27
+, isPyPy
+}:
+
+buildPythonPackage rec {
+  pname = "basiciw";
+  version = "0.2.2";
+
+  disabled = isPy27 || isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ajmflvvlkflrcmqmkrx0zaira84z8kv4ssb2jprfwvjh8vfkysb";
+  };
+
+  buildInputs = [ gcc ];
+  propagatedBuildInputs = [ wirelesstools ];
+
+  meta = {
+    description = "Get info about wireless interfaces using libiw";
+    homepage = "https://github.com/enkore/basiciw";
+    platforms = lib.platforms.linux;
+    license = lib.licenses.gpl2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/batchgenerators/default.nix b/nixpkgs/pkgs/development/python-modules/batchgenerators/default.nix
new file mode 100644
index 000000000000..b2fc1043f29c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/batchgenerators/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+, future
+, numpy
+, pillow
+, fetchpatch
+, scipy
+, scikit-learn
+, scikit-image
+, threadpoolctl
+}:
+
+buildPythonPackage rec {
+  pname = "batchgenerators";
+  version = "0.25";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "MIC-DKFZ";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-L2mWH2t8PN9o1M67KDdl1Tj2ZZ02MY4icsJY2VNrj3A=";
+  };
+
+  propagatedBuildInputs = [
+    future
+    numpy
+    pillow
+    scipy
+    scikit-learn
+    scikit-image
+    threadpoolctl
+  ];
+
+  # see https://github.com/MIC-DKFZ/batchgenerators/pull/78
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"unittest2",' ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # see https://github.com/MIC-DKFZ/batchgenerators/pull/78
+  disabledTestPaths = [ "tests/test_axis_mirroring.py" ];
+
+  pythonImportsCheck = [
+    "batchgenerators"
+    "batchgenerators.augmentations"
+    "batchgenerators.dataloading"
+    "batchgenerators.datasets"
+    "batchgenerators.transforms"
+    "batchgenerators.utilities"
+  ];
+
+  meta = with lib; {
+    description = "2D and 3D image data augmentation for deep learning";
+    homepage = "https://github.com/MIC-DKFZ/batchgenerators";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/batchspawner/default.nix b/nixpkgs/pkgs/development/python-modules/batchspawner/default.nix
new file mode 100644
index 000000000000..f2e8acfe7a0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/batchspawner/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, jupyterhub
+, packaging
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "batchspawner";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "jupyterhub";
+    repo = "batchspawner";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-oyS47q+gsO7JmRsbVJXglZsSRfits5rS/nrHW5E7EV0=";
+  };
+
+  propagatedBuildInputs = [
+    jupyterhub
+    packaging
+  ];
+
+  # Tests require a job scheduler e.g. slurm, pbs, etc.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "batchspawner"
+  ];
+
+  meta = with lib; {
+    description = "A spawner for Jupyterhub to spawn notebooks using batch resource managers";
+    homepage = "https://github.com/jupyterhub/batchspawner";
+    changelog = "https://github.com/jupyterhub/batchspawner/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/batinfo/default.nix b/nixpkgs/pkgs/development/python-modules/batinfo/default.nix
new file mode 100644
index 000000000000..17d28c129141
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/batinfo/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "batinfo";
+  version = "0.4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "497e29efc9353ec52e71d43bd040bdfb6d685137ddc2b9143cded4583af572f5";
+  };
+
+  # No tests included
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/nicolargo/batinfo";
+    description = "A simple Python lib to retrieve battery information";
+    license = licenses.lgpl3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ koral ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/baycomp/default.nix b/nixpkgs/pkgs/development/python-modules/baycomp/default.nix
new file mode 100644
index 000000000000..0d4f59745f00
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/baycomp/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, scipy
+, scikit-learn
+, matplotlib
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "baycomp";
+  version = "1.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MrJa17FtWyUd259hEKMtezlTuYcJbaHSXvJ3k10l2uw=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    matplotlib
+  ];
+
+  nativeCheckInputs = [ unittestCheckHook ];
+  pythonImportsCheck = [ "baycomp" ];
+
+  meta = {
+    description = "A library for Bayesian comparison of classifiers";
+    homepage = "https://github.com/janezd/baycomp";
+    license = [ lib.licenses.mit ];
+    maintainers = [ lib.maintainers.lucasew ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bayesian-optimization/default.nix b/nixpkgs/pkgs/development/python-modules/bayesian-optimization/default.nix
new file mode 100644
index 000000000000..dda52e8ebba8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bayesian-optimization/default.nix
@@ -0,0 +1,46 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, scikit-learn
+, scipy
+, colorama
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bayesian-optimization";
+  version = "1.4.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bayesian-optimization";
+    repo = "BayesianOptimization";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Bp/ZhVSW5lTGwnsd/doOXu++Gxw/51owCfMm96Qmgd4=";
+  };
+
+  propagatedBuildInputs = [
+    scikit-learn
+    scipy
+    colorama
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "bayes_opt" ];
+
+  meta = with lib; {
+    broken = stdenv.isLinux && stdenv.isAarch64;
+    description = ''
+      A Python implementation of global optimization with gaussian processes
+    '';
+    homepage = "https://github.com/bayesian-optimization/BayesianOptimization";
+    changelog = "https://github.com/bayesian-optimization/BayesianOptimization/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = [ maintainers.juliendehos ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bayespy/default.nix b/nixpkgs/pkgs/development/python-modules/bayespy/default.nix
new file mode 100644
index 000000000000..0d2d87acfad5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bayespy/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, pythonOlder
+, pytestCheckHook, nose, glibcLocales, fetchpatch
+, numpy, scipy, matplotlib, h5py }:
+
+buildPythonPackage rec {
+  pname = "bayespy";
+  version = "0.5.26";
+
+  # Python 2 not supported and not some old Python 3 because MPL doesn't support
+  # them properly.
+  disabled = pythonOlder "3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-NOvuqPKioRIqScd2jC7nakonDEovTo9qKp/uTk9z1BE=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook nose glibcLocales ];
+
+  propagatedBuildInputs = [ numpy scipy matplotlib h5py ];
+
+  disabledTests = [
+    # Assertion error
+    "test_message_to_parents"
+  ];
+
+  pythonImportsCheck = [ "bayespy" ];
+
+  meta = with lib; {
+    homepage = "http://www.bayespy.org";
+    description = "Variational Bayesian inference tools for Python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bbox/default.nix b/nixpkgs/pkgs/development/python-modules/bbox/default.nix
new file mode 100644
index 000000000000..df28d568b010
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bbox/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, matplotlib
+, numpy
+, pendulum
+, pillow
+, poetry-core
+, pyquaternion
+}:
+
+buildPythonPackage rec {
+  pname = "bbox";
+  version = "0.9.4";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "varunagrawal";
+    repo = pname;
+    # matches 0.9.4 on PyPi + tests
+    rev = "d3f07ed0e38b6015cf4181e3b3edae6a263f8565";
+    hash = "sha256-FrJ8FhlqwmnEB/QvPlkDfqZncNGPhwY9aagM9yv1LGs=";
+  };
+
+  propagatedBuildInputs = [ pyquaternion numpy ];
+  buildInputs = [ poetry-core ];
+
+  nativeCheckInputs = [
+    matplotlib
+    pendulum
+    pillow
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "bbox" ];
+
+  meta = with lib; {
+    description = "Python library for 2D/3D bounding boxes";
+    homepage = "https://github.com/varunagrawal/bbox";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lucasew ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bc-detect-secrets/default.nix b/nixpkgs/pkgs/development/python-modules/bc-detect-secrets/default.nix
new file mode 100644
index 000000000000..0b7d04c69e85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bc-detect-secrets/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, gibberish-detector
+, mock
+, pkgs
+, pyahocorasick
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, requests
+, responses
+, unidiff
+}:
+
+buildPythonPackage rec {
+  pname = "bc-detect-secrets";
+  version = "1.4.30";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bridgecrewio";
+    repo = "detect-secrets";
+    rev = "refs/tags/${version}";
+    hash = "sha256-wq+SKOiMcVO7OiK+RdRk4RNsjSAT7lBdAjLHfurSIRo=";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+    requests
+    unidiff
+  ];
+
+  passthru.optional-dependencies = {
+    word_list = [
+      pyahocorasick
+    ];
+    gibberish = [
+      gibberish-detector
+    ];
+  };
+
+  nativeCheckInputs = [
+    mock
+    pkgs.gitMinimal
+    pytestCheckHook
+    responses
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  disabledTests = [
+    # Tests are failing for various reasons (missing git repo, missing test data, etc.)
+    "test_baseline_filters_out_known_secrets"
+    "test_make_decisions"
+    "test_saves_to_baseline"
+    "test_start_halfway"
+    "TestCreate"
+    "TestDiff"
+    "TestGetFilesToScan"
+    "TestLineNumberChanges"
+    "TestModifiesBaselineFromVersionChange"
+  ];
+
+  pythonImportsCheck = [
+    "detect_secrets"
+  ];
+
+  meta = with lib; {
+    description = "Tool to detect secrets in the code";
+    homepage = "https://github.com/bridgecrewio/detect-secrets";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/bc-jsonpath-ng/default.nix b/nixpkgs/pkgs/development/python-modules/bc-jsonpath-ng/default.nix
new file mode 100644
index 000000000000..5565adcd8899
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bc-jsonpath-ng/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, decorator
+, fetchFromGitHub
+, ply
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bc-jsonpath-ng";
+  version = "1.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bridgecrewio";
+    repo = "jsonpath-ng";
+    rev = "refs/tags/${version}";
+    hash = "sha256-FWP4tzlacAWVXG3YnPwl5MKc12geaCxZ2xyKx9PSarU=";
+  };
+
+  propagatedBuildInputs = [
+    decorator
+    ply
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Exclude tests that require oslotest
+    "tests/test_jsonpath_rw_ext.py"
+  ];
+
+  pythonImportsCheck = [
+    "bc_jsonpath_ng"
+  ];
+
+  meta = with lib; {
+    description = "JSONPath implementation for Python";
+    homepage = "https://github.com/bridgecrewio/jsonpath-ng";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bc-python-hcl2/default.nix b/nixpkgs/pkgs/development/python-modules/bc-python-hcl2/default.nix
new file mode 100644
index 000000000000..5be65f31f601
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bc-python-hcl2/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, lark
+, nose
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bc-python-hcl2";
+  version = "0.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-cqQ4zuztfS5MiY4hj1WipKunqIfB1kpM+RODcZPERrY=";
+  };
+
+  # Nose is required during build process, so can not use `nativeCheckInputs`.
+  buildInputs = [
+    nose
+  ];
+
+  propagatedBuildInputs = [
+    lark
+  ];
+
+  # This fork of python-hcl2 doesn't ship tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "hcl2"
+  ];
+
+  meta = with lib; {
+    description = "Parser for HCL2 written in Python using Lark";
+    longDescription = ''
+      This parser only supports HCL2 and isn't backwards compatible with HCL v1.
+      It can be used to parse any HCL2 config file such as Terraform.
+    '';
+    # Although this is the main homepage from PyPi but it is also a homepage
+    # of another PyPi package (python-hcl2). But these two are different.
+    homepage = "https://github.com/amplify-education/python-hcl2";
+    license = licenses.mit;
+    maintainers = with maintainers; [ anhdle14 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bcdoc/default.nix b/nixpkgs/pkgs/development/python-modules/bcdoc/default.nix
new file mode 100644
index 000000000000..29c267aa45fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bcdoc/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, docutils, six }:
+
+buildPythonPackage rec {
+  pname = "bcdoc";
+  version = "0.16.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f568c182e06883becf7196f227052435cffd45604700c82362ca77d3427b6202";
+  };
+
+  buildInputs = [ docutils six ];
+
+  # Tests fail due to nix file timestamp normalization.
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/boto/bcdoc";
+    license = licenses.asl20;
+    description = "ReST document generation tools for botocore";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bcf/default.nix b/nixpkgs/pkgs/development/python-modules/bcf/default.nix
new file mode 100644
index 000000000000..03b53ca2e6e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bcf/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, appdirs
+, click
+, colorama
+, intelhex
+, packaging
+, pyaml
+, pyftdi
+, pyserial
+, requests
+, schema
+}:
+buildPythonPackage rec {
+  pname = "bcf";
+  version = "1.9.0";
+
+  src = fetchFromGitHub {
+    owner = "hardwario";
+    repo = "bch-firmware-tool";
+    rev = "v${version}";
+    sha256 = "i28VewTB2XEZSfk0UeCuwB7Z2wz4qPBhzvxJIYkKwJ4=";
+  };
+
+  postPatch = ''
+    sed -ri 's/@@VERSION@@/${version}/g' \
+      bcf/__init__.py setup.py
+  '';
+
+  propagatedBuildInputs = [
+    appdirs
+    click
+    colorama
+    intelhex
+    packaging
+    pyaml
+    pyftdi
+    pyserial
+    requests
+    schema
+  ];
+
+  pythonImportsCheck = [ "bcf" ];
+  doCheck = false; # Project provides no tests
+
+  meta = with lib; {
+    homepage = "https://github.com/hardwario/bch-firmware-tool";
+    description = "HARDWARIO Firmware Tool";
+    platforms = platforms.linux;
+    license = licenses.mit;
+    maintainers = with maintainers; [ cynerd ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bcg/default.nix b/nixpkgs/pkgs/development/python-modules/bcg/default.nix
new file mode 100644
index 000000000000..ce32e61ff809
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bcg/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, appdirs
+, click
+, click-log
+, paho-mqtt
+, pyaml
+, pyserial
+, schema
+, simplejson
+}:
+buildPythonPackage rec {
+  pname = "bcg";
+  version = "1.17.0";
+
+  src = fetchFromGitHub {
+    owner = "hardwario";
+    repo = "bch-gateway";
+    rev = "v${version}";
+    sha256 = "2Yh5MeIv+BIxjoO9GOPqq7xTAFhyBvnxPy7DeO2FrkI=";
+  };
+
+  postPatch = ''
+    sed -ri 's/@@VERSION@@/${version}/g' \
+      bcg/__init__.py setup.py
+  '';
+
+  propagatedBuildInputs = [
+    appdirs
+    click
+    click-log
+    paho-mqtt
+    pyaml
+    pyserial
+    schema
+    simplejson
+  ];
+
+  pythonImportsCheck = [ "bcg" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/hardwario/bch-gateway";
+    description = "HARDWARIO Gateway (Python Application «bcg»)";
+    platforms = platforms.linux;
+    license = licenses.mit;
+    maintainers = with maintainers; [ cynerd ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bch/default.nix b/nixpkgs/pkgs/development/python-modules/bch/default.nix
new file mode 100644
index 000000000000..8b9308cf0217
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bch/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, click
+, click-log
+, paho-mqtt
+, pyaml
+}:
+
+buildPythonPackage rec {
+  pname = "bch";
+  version = "1.2.1";
+
+  src = fetchFromGitHub {
+    owner = "hardwario";
+    repo = "bch-control-tool";
+    rev = "v${version}";
+    sha256 = "/C+NbJ0RrWZ/scv/FiRBTh4h7u0xS4mHVDWQ0WwmlEY=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    click-log
+    paho-mqtt
+    pyaml
+  ];
+
+  postPatch = ''
+    sed -ri 's/@@VERSION@@/${version}/g' \
+      bch/cli.py setup.py
+  '';
+
+  pythonImportsCheck = [ "bch" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/hardwario/bch-control-tool";
+    description = "HARDWARIO Hub Control Tool";
+    platforms = platforms.linux;
+    license = licenses.mit;
+    maintainers = with maintainers; [ cynerd ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bcrypt/3.nix b/nixpkgs/pkgs/development/python-modules/bcrypt/3.nix
new file mode 100644
index 000000000000..fec467f983cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bcrypt/3.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, setuptools
+, isPyPy
+, fetchPypi
+, pythonOlder
+, cffi
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "bcrypt";
+  version = "3.2.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QzxBDCF3BXcF2iqfLNAd0VdJOyp6wUyFk6FrPatra/s=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    six
+    cffi
+  ];
+
+  propagatedNativeBuildInputs = [
+    cffi
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "bcrypt"
+  ];
+
+  meta = with lib; {
+    description = "Modern password hashing for your software and your servers";
+    homepage = "https://github.com/pyca/bcrypt/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bcrypt/default.nix b/nixpkgs/pkgs/development/python-modules/bcrypt/default.nix
new file mode 100644
index 000000000000..f0e23e713c3a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bcrypt/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, buildPythonPackage
+, cargo
+, rustPlatform
+, rustc
+, setuptools
+, setuptools-rust
+, isPyPy
+, fetchPypi
+, pythonOlder
+, cffi
+, pytestCheckHook
+, libiconv
+, stdenv
+  # for passthru.tests
+, asyncssh
+, django_4
+, fastapi
+, paramiko
+, twisted
+}:
+
+buildPythonPackage rec {
+  pname = "bcrypt";
+  version = "4.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-J9N1kDrIJhz+QEf2cJ0W99GNObHskqr3KvmJVSplDr0=";
+  };
+
+  cargoRoot = "src/_bcrypt";
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    sourceRoot = "${pname}-${version}/${cargoRoot}";
+    name = "${pname}-${version}";
+    hash = "sha256-lDWX69YENZFMu7pyBmavUZaalGvFqbHSHfkwkzmDQaY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-rust
+    rustPlatform.cargoSetupHook
+    cargo
+    rustc
+  ];
+
+  # Remove when https://github.com/NixOS/nixpkgs/pull/190093 lands.
+  buildInputs = lib.optional stdenv.isDarwin libiconv;
+
+  propagatedBuildInputs = [
+    cffi
+  ];
+
+  propagatedNativeBuildInputs = [
+    cffi
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "bcrypt"
+  ];
+
+  passthru.tests = {
+    inherit asyncssh django_4 fastapi paramiko twisted;
+  };
+
+  meta = with lib; {
+    description = "Modern password hashing for your software and your servers";
+    homepage = "https://github.com/pyca/bcrypt/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/beaker/default.nix b/nixpkgs/pkgs/development/python-modules/beaker/default.nix
new file mode 100644
index 000000000000..58f7515c10d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/beaker/default.nix
@@ -0,0 +1,80 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, glibcLocales
+, nose
+, pylibmc
+, python-memcached
+, redis
+, pymongo
+, mock
+, webtest
+, sqlalchemy
+, pycrypto
+, cryptography
+, isPy27
+, isPy3k
+, funcsigs ? null
+, pycryptopp ? null
+}:
+
+buildPythonPackage rec {
+  pname = "Beaker";
+  version = "1.11.0";
+
+  # The pypy release do not contains the tests
+  src = fetchFromGitHub {
+    owner = "bbangert";
+    repo = "beaker";
+    rev = version;
+    sha256 = "059sc7iar90lc2y9mppdis5ddfcxyirz03gmsfb0307f5dsa1dhj";
+  };
+
+  propagatedBuildInputs = [
+    sqlalchemy
+    pycrypto
+    cryptography
+  ] ++ lib.optionals (isPy27) [
+    funcsigs
+    pycryptopp
+  ];
+
+  nativeCheckInputs = [
+    glibcLocales
+    python-memcached
+    mock
+    nose
+    pylibmc
+    pymongo
+    redis
+    webtest
+  ];
+
+  # Can not run memcached tests because it immediately tries to connect
+  postPatch = ''
+    rm tests/test_memcached.py
+  '';
+
+  # Disable external tests because they need to connect to a live database.
+  # Also disable a test in test_cache.py called "test_upgrade" because
+  # it currently fails on darwin.
+  # Please see issue https://github.com/bbangert/beaker/issues/166
+  checkPhase = ''
+    nosetests \
+      -e ".*test_ext_.*" \
+      -e "test_upgrade" \
+      ${lib.optionalString (!stdenv.isLinux) ''-e "test_cookie_expires_different_locale"''} \
+      -vv tests
+  '';
+
+  meta = {
+    description = "A Session and Caching library with WSGI Middleware";
+    homepage = "https://github.com/bbangert/beaker";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ domenkozar ];
+    knownVulnerabilities = [
+      "CVE-2013-7489"
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/beancount-black/default.nix b/nixpkgs/pkgs/development/python-modules/beancount-black/default.nix
new file mode 100644
index 000000000000..9dcd709bff11
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/beancount-black/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, beancount-parser
+, click
+, poetry-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "beancount-black";
+  version = "0.2.1";
+
+  disabled = pythonOlder "3.9";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "LaunchPlatform";
+    repo = "beancount-black";
+    rev = version;
+    hash = "sha256-wvAQnwnyHn5Koc/UN4zpJ3JDmFbDoUrpCTmJCpSP7Mg=";
+  };
+
+  buildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    beancount-parser
+    click
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "beancount_black"
+  ];
+
+  meta = with lib; {
+    description = "Opinioned code formatter for Beancount";
+    homepage = "https://github.com/LaunchPlatform/beancount-black/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ ambroisie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/beancount-docverif/default.nix b/nixpkgs/pkgs/development/python-modules/beancount-docverif/default.nix
new file mode 100644
index 000000000000..d614b2f12d4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/beancount-docverif/default.nix
@@ -0,0 +1,46 @@
+{ lib, buildPythonPackage, fetchPypi
+, setuptools-scm
+, beancount
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  version = "1.0.1";
+  pname = "beancount-docverif";
+  pyproject = true;
+
+  src = fetchPypi {
+    pname = "beancount_docverif";
+    inherit version;
+    hash = "sha256-CFBv1FZP5JO+1MPnD86ttrO42zZlvE157zqig7s4HOg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    beancount
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/siriobalmelli/beancount_docverif";
+    description = "Document verification plugin for Beancount";
+    longDescription = ''
+        Docverif is the "Document Verification" plugin for beancount, fulfilling the following functions:
+
+        - Require that every transaction touching an account have an accompanying document on disk.
+        - Explicitly declare the name of a document accompanying a transaction.
+        - Explicitly declare that a transaction is expected not to have an accompanying document.
+        - Look for an "implicit" PDF document matching transaction data.
+        - Associate (and require) a document with any type of entry, including open entries themselves.
+        - Guarantee integrity: verify that every document declared does in fact exist on disk.
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ siriobalmelli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/beancount-parser/default.nix b/nixpkgs/pkgs/development/python-modules/beancount-parser/default.nix
new file mode 100644
index 000000000000..b7fe986209fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/beancount-parser/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, lark
+, poetry-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "beancount-parser";
+  version = "0.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "LaunchPlatform";
+    repo = "beancount-parser";
+    rev = "refs/tags/${version}";
+    hash = "sha256-VSl+Jde/mDSUpICXjmPKID6qZiKUUaK8ixztP1qaoDM=";
+  };
+
+  buildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    lark
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "beancount_parser"
+  ];
+
+  meta = with lib; {
+    description = "Standalone Lark based Beancount syntax parser";
+    homepage = "https://github.com/LaunchPlatform/beancount-parser/";
+    changelog = "https://github.com/LaunchPlatform/beancount-parser/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ ambroisie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/beancount/default.nix b/nixpkgs/pkgs/development/python-modules/beancount/default.nix
new file mode 100644
index 000000000000..103f88082068
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/beancount/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, beautifulsoup4
+, bottle
+, chardet
+, python-dateutil
+, google-api-python-client
+, google-auth-oauthlib
+, lxml
+, oauth2client
+, ply
+, pytest
+, python-magic
+, requests
+}:
+
+buildPythonPackage rec {
+  version = "2.3.6";
+  pname = "beancount";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gB+Tvta1fS4iQ2aIxInVob8fduIQ887RhoB1fmDTR1o=";
+  };
+
+  # Tests require files not included in the PyPI archive.
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    bottle
+    chardet
+    python-dateutil
+    google-api-python-client
+    google-auth-oauthlib
+    lxml
+    oauth2client
+    ply
+    python-magic
+    requests
+    # pytest really is a runtime dependency
+    # https://github.com/beancount/beancount/blob/v2/setup.py#L81-L82
+    pytest
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/beancount/beancount";
+    description = "Double-entry bookkeeping computer language";
+    longDescription = ''
+        A double-entry bookkeeping computer language that lets you define
+        financial transaction records in a text file, read them in memory,
+        generate a variety of reports from them, and provides a web interface.
+    '';
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ bhipple ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/beanstalkc/default.nix b/nixpkgs/pkgs/development/python-modules/beanstalkc/default.nix
new file mode 100644
index 000000000000..ffdb2f6f8f2a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/beanstalkc/default.nix
@@ -0,0 +1,22 @@
+{ lib, fetchFromGitHub, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "beanstalkc";
+  version = "0.5.2";
+
+  src = fetchFromGitHub {
+    owner = "bosondata";
+    repo = "beanstalkc";
+    rev = "v${version}";
+    sha256 = "1dpb1yimp2pfnikmgsb2fr9x6h8riixlsx3xfqphnfvrid49vw5s";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A simple beanstalkd client library for Python";
+    maintainers = with maintainers; [ aanderse ];
+    license = licenses.asl20;
+    homepage = "https://github.com/earl/beanstalkc";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/beartype/default.nix b/nixpkgs/pkgs/development/python-modules/beartype/default.nix
new file mode 100644
index 000000000000..3eba6f3317a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/beartype/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "beartype";
+  version = "0.16.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GtqJzy1usw624Vbu0utUkzV3gpN5ENdDgJGOU8Lq4L8=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [
+    "beartype"
+  ];
+
+  meta = with lib; {
+    description = "Fast runtime type checking for Python";
+    homepage = "https://github.com/beartype/beartype";
+    changelog = "https://github.com/beartype/beartype/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/beautiful-date/default.nix b/nixpkgs/pkgs/development/python-modules/beautiful-date/default.nix
new file mode 100644
index 000000000000..05ebf87f2a05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/beautiful-date/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, freezegun
+, python-dateutil
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "beautiful-date";
+  version = "2.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "kuzmoyev";
+    repo = "beautiful-date";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-e6YJBaDwWqVehxBPOvsIdV4FIXlIwj29H5untXGJvT0=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "beautiful_date"
+  ];
+
+  meta = with lib; {
+    description = "Simple and beautiful way to create date and datetime objects";
+    homepage = "https://github.com/kuzmoyev/beautiful-date";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/beautifulsoup4/default.nix b/nixpkgs/pkgs/development/python-modules/beautifulsoup4/default.nix
new file mode 100644
index 000000000000..e803bcf154e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/beautifulsoup4/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, chardet
+, hatchling
+, html5lib
+, lxml
+, pytestCheckHook
+, pythonOlder
+, soupsieve
+, sphinxHook
+
+# for passthru.tests
+, html-sanitizer
+, markdownify
+, mechanicalsoup
+, nbconvert
+, subliminal
+, wagtail
+}:
+
+buildPythonPackage rec {
+  pname = "beautifulsoup4";
+  version = "4.12.2";
+  format = "pyproject";
+
+  outputs = ["out" "doc"];
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-SSu8adyjXRLarHHE2xv/8Mh2wA70ov+sziJtRjjrcto=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+    sphinxHook
+  ];
+
+  propagatedBuildInputs = [
+    chardet
+    soupsieve
+  ];
+
+  passthru.optional-dependencies = {
+    html5lib = [
+      html5lib
+    ];
+    lxml = [
+      lxml
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "bs4"
+  ];
+
+  passthru.tests = {
+    inherit html-sanitizer
+      markdownify
+      mechanicalsoup
+      nbconvert
+      subliminal
+      wagtail;
+  };
+
+  meta = with lib; {
+    changelog = "https://git.launchpad.net/beautifulsoup/tree/CHANGELOG?h=${version}";
+    description = "HTML and XML parser";
+    homepage = "http://crummy.com/software/BeautifulSoup/bs4/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/beautifultable/default.nix b/nixpkgs/pkgs/development/python-modules/beautifultable/default.nix
new file mode 100644
index 000000000000..97b13414f36b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/beautifultable/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, wcwidth
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "beautifultable";
+  version = "1.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pri22296";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-/SReCEvSwiNjBoz/3tGJ9zUNBAag4mLsHlUXwm47zCw=";
+  };
+
+  propagatedBuildInputs = [
+    wcwidth
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "test.py"
+  ];
+
+  pythonImportsCheck = [
+    "beautifultable"
+  ];
+
+  meta = with lib; {
+    description = "Python package for printing visually appealing tables";
+    homepage = "https://github.com/pri22296/beautifultable";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/beautysh/default.nix b/nixpkgs/pkgs/development/python-modules/beautysh/default.nix
new file mode 100644
index 000000000000..c41414075f38
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/beautysh/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, colorama
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pytestCheckHook
+, setuptools
+, types-colorama
+, types-setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "beautysh";
+  version = "6.2.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "lovesegfault";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-rPeGRcyNK45Y7OvtzaIH93IIzexBf/jM1SzYP0phQ1o=";
+  };
+
+  patches = [
+    # https://github.com/lovesegfault/beautysh/pull/247
+    (fetchpatch {
+      name = "poetry-to-poetry-core.patch";
+      url = "https://github.com/lovesegfault/beautysh/commit/5f4fcac083fa68568a50f3c2bcee3ead0f3ca7c5.patch";
+      hash = "sha256-H/kIJKww5ouWu8rmRkaMOXcsq2daZWDdwxBqbc99x0s=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'types-setuptools = "^57.4.0"' 'types-setuptools = "*"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    colorama
+    setuptools
+    types-colorama
+    types-setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "beautysh"
+  ];
+
+  meta = with lib; {
+    description = "Tool for beautifying Bash scripts";
+    homepage = "https://github.com/lovesegfault/beautysh";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+    mainProgram = "beautysh";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bech32/default.nix b/nixpkgs/pkgs/development/python-modules/bech32/default.nix
new file mode 100644
index 000000000000..43fc00ee0105
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bech32/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+buildPythonPackage rec {
+  pname = "bech32";
+  version = "1.2.0";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-fW24IUYDvXhx/PpsCCbvaLhbCr2Q+iHChanF4h0r2Jk=";
+  };
+
+  meta = with lib; {
+    homepage = "https://pypi.org/project/bech32/";
+    license = with licenses; [ mit ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/before-after/default.nix b/nixpkgs/pkgs/development/python-modules/before-after/default.nix
new file mode 100644
index 000000000000..919914d7fd7a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/before-after/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage, fetchPypi, fetchpatch, pytestCheckHook, lib }:
+
+buildPythonPackage rec {
+  pname = "before-after";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    pname = "before_after";
+    inherit version;
+    hash = "sha256-x9T5uLi7UgldoUxLnFnqaz9bnqn9zop7/HLsrg9aP4U=";
+  };
+
+  patches = [
+    # drop 'mock' dependency for python >=3.3
+    (fetchpatch {
+      url = "https://github.com/c-oreills/before_after/commit/cf3925148782c8c290692883d1215ae4d2c35c3c.diff";
+      hash = "sha256-FYCpLxcOLolNPiKzHlgrArCK/QKCwzag+G74wGhK4dc=";
+    })
+    (fetchpatch {
+      url = "https://github.com/c-oreills/before_after/commit/11c0ecc7e8a2f90a762831e216c1bc40abfda43a.diff";
+      hash = "sha256-8YJumF/U8H+hc7rLZLy3UhXHdYJmcuN+O8kMx8yqMJ0=";
+    })
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "before_after" ];
+
+  meta = with lib; {
+    description = "sugar over the Mock library to help test race conditions";
+    homepage = "https://github.com/c-oreills/before_after";
+    maintainers = with maintainers; [ yuka ];
+    license = licenses.gpl2Only;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/behave/default.nix b/nixpkgs/pkgs/development/python-modules/behave/default.nix
new file mode 100644
index 000000000000..f90b664ee7aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/behave/default.nix
@@ -0,0 +1,52 @@
+{ lib, stdenv, fetchFromGitHub
+, buildPythonPackage, python
+, pytestCheckHook, mock, path, pyhamcrest, pytest-html
+, glibcLocales
+, colorama, cucumber-tag-expressions, parse, parse-type, six
+}:
+
+buildPythonPackage rec {
+  pname = "behave";
+  version = "1.2.7.dev2";
+
+  src = fetchFromGitHub {
+    owner = "behave";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-B8PUN1Q4UAsDWrHjPZDlpaPjCKjI/pAogCSI+BQnaWs=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook mock path pyhamcrest pytest-html ];
+
+  # upstream tests are failing, so instead we only check if we can import it
+  doCheck = false;
+
+  pythonImportsCheck = [ "behave" ];
+
+  buildInputs = [ glibcLocales ];
+  propagatedBuildInputs = [ colorama cucumber-tag-expressions parse parse-type six ];
+
+  postPatch = ''
+    patchShebangs bin
+  '';
+
+  # timing-based test flaky on Darwin
+  # https://github.com/NixOS/nixpkgs/pull/97737#issuecomment-691489824
+  disabledTests = lib.optionals stdenv.isDarwin [ "test_step_decorator_async_run_until_complete" ];
+
+  postCheck = ''
+    export LANG="en_US.UTF-8"
+    export LC_ALL="en_US.UTF-8"
+
+    ${python.interpreter} bin/behave -f progress3 --stop --tags='~@xfail' features/
+    ${python.interpreter} bin/behave -f progress3 --stop --tags='~@xfail' tools/test-features/
+    ${python.interpreter} bin/behave -f progress3 --stop --tags='~@xfail' issue.features/
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/behave/behave";
+    description = "behaviour-driven development, Python style";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ alunduil maxxk ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bellows/default.nix b/nixpkgs/pkgs/development/python-modules/bellows/default.nix
new file mode 100644
index 000000000000..846b58a677b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bellows/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, click
+, click-log
+, fetchFromGitHub
+, pure-pcapy3
+, pyserial-asyncio
+, pytest-asyncio
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, voluptuous
+, zigpy
+}:
+
+buildPythonPackage rec {
+  pname = "bellows";
+  version = "0.36.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "zigpy";
+    repo = "bellows";
+    rev = "refs/tags/${version}";
+    hash = "sha256-+p3As+fi6mw9i5q2klFTM9QQ2JoQarwrphc6tB6C94M=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    click-log
+    pure-pcapy3
+    pyserial-asyncio
+    voluptuous
+    zigpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+    pytest-timeout
+  ];
+
+  pythonImportsCheck = [
+    "bellows"
+  ];
+
+  meta = with lib; {
+    description = "Python module to implement EZSP for EmberZNet devices";
+    homepage = "https://github.com/zigpy/bellows";
+    changelog = "https://github.com/zigpy/bellows/releases/tag/${version}";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ mvnetbiz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bencode-py/default.nix b/nixpkgs/pkgs/development/python-modules/bencode-py/default.nix
new file mode 100644
index 000000000000..4a2dfc5c320f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bencode-py/default.nix
@@ -0,0 +1,38 @@
+{
+  lib,
+  buildPythonPackage,
+  fetchPypi,
+  python,
+  pbr,
+  pytestCheckHook,
+}:
+buildPythonPackage rec {
+  pname = "beconde-py";
+  version = "4.0.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "bencode.py";
+    hash = "sha256-KiTM2hclpRplCJPQtjJgE4NZ6qKZu256CZYTUKKm4Fw=";
+  };
+
+  pythonImportsCheck = [
+    "bencodepy"
+  ];
+
+  nativeBuildInputs = [
+    pbr
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Simple bencode parser (for Python 2, Python 3 and PyPy)";
+    homepage = "https://github.com/fuzeman/bencode.py";
+    license = licenses.bitTorrent11;
+    maintainers = with maintainers; [vamega];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bencoder/default.nix b/nixpkgs/pkgs/development/python-modules/bencoder/default.nix
new file mode 100644
index 000000000000..2fa730630c0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bencoder/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, setuptools
+}:
+buildPythonPackage rec {
+  pname = "bencoder";
+  version = "0.2.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rENvM/3X51stkFdJHSq+77VjHvsTyBNAPbCtsRq1L8I=";
+  };
+
+  pythonImportsCheck = [ "bencoder" ];
+
+  # There are no tests.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A simple bencode decoder/encoder library in pure Python";
+    homepage = "https://github.com/utdemir/bencoder";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ somasis ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/beniget/default.nix b/nixpkgs/pkgs/development/python-modules/beniget/default.nix
new file mode 100644
index 000000000000..51f641c51eb4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/beniget/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, gast
+}:
+
+buildPythonPackage rec {
+  pname = "beniget";
+  version = "0.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "75554b3b8ad0553ce2f607627dad3d95c60c441189875b98e097528f8e23ac0c";
+  };
+
+  propagatedBuildInputs = [
+    gast
+  ];
+
+  meta = {
+    description = "Extract semantic information about static Python code";
+    homepage = "https://github.com/serge-sans-paille/beniget";
+    license = lib.licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bentoml/default.nix b/nixpkgs/pkgs/development/python-modules/bentoml/default.nix
new file mode 100644
index 000000000000..e65af66ba449
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bentoml/default.nix
@@ -0,0 +1,208 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, hatch-vcs
+, aiohttp
+, attrs
+, cattrs
+, circus
+, click
+, click-option-group
+, cloudpickle
+, deepmerge
+, fs
+, httpx
+, inflection
+, jinja2
+, numpy
+, opentelemetry-api
+, opentelemetry-instrumentation
+, opentelemetry-instrumentation-aiohttp-client
+, opentelemetry-instrumentation-asgi
+, opentelemetry-sdk
+, opentelemetry-semantic-conventions
+, opentelemetry-util-http
+, packaging
+, pathspec
+, pip-requirements-parser
+, pip-tools
+, prometheus-client
+, psutil
+, nvidia-ml-py
+, python-dateutil
+, python-json-logger
+, python-multipart
+, pyyaml
+, requests
+, rich
+, schema
+, simple-di
+, starlette
+, uvicorn
+, watchfiles
+, fs-s3fs
+, grpcio
+, grpcio-health-checking
+, opentelemetry-instrumentation-grpc
+, protobuf
+, grpcio-channelz
+, grpcio-reflection
+, filetype
+, pillow
+, pydantic
+, pandas
+, pyarrow
+, opentelemetry-exporter-otlp-proto-http
+# https://pypi.org/project/opentelemetry-exporter-jaeger-proto-grpc/
+# , opentelemetry-exporter-jaeger # support for this exporter ends in july 2023
+, opentelemetry-exporter-otlp
+# , opentelemetry-exporter-zipkin
+, tritonclient
+# native check inputs
+, pytestCheckHook
+, scikit-learn
+, lxml
+, orjson
+, pytest-asyncio
+, fastapi
+}:
+
+let
+  version = "1.1.10";
+  aws = [ fs-s3fs ];
+  grpc = [
+    grpcio
+    grpcio-health-checking
+    opentelemetry-instrumentation-grpc
+    protobuf
+  ];
+  io-file = [ filetype ];
+  io-image = io-file ++ [ pillow ];
+  io-json = [ pydantic ];
+  io-pandas = [ pandas pyarrow ];
+  grpc-reflection = grpc ++ [ grpcio-reflection ];
+  grpc-channelz = grpc ++ [ grpcio-channelz ];
+  monitor-otlp = [ opentelemetry-exporter-otlp-proto-http ];
+  # tracing-jaeger = [ opentelemetry-exporter-jaeger ];
+  tracing-otlp = [ opentelemetry-exporter-otlp ];
+  # tracing-zipkin = [ opentelemetry-exporter-zipkin ];
+  io = io-json ++ io-image ++ io-pandas ++ io-file;
+  tracing = tracing-otlp; # ++ tracing-zipkin ++ tracing-jaeger
+  optional-dependencies = {
+    all = aws ++ io ++ grpc ++ grpc-reflection ++ grpc-channelz ++ tracing ++ monitor-otlp;
+    inherit aws grpc io-file io-image io-json io-pandas io grpc-reflection
+      grpc-channelz monitor-otlp tracing-otlp tracing;
+    triton = [ tritonclient ] ++ tritonclient.optional-dependencies.http ++ tritonclient.optional-dependencies.grpc;
+  };
+in
+buildPythonPackage {
+  pname = "bentoml";
+  inherit version;
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "bentoml";
+    repo = "BentoML";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-QUp0ISVcOOtpQtOwT8Ii83J1VzAQoWlQzT1maGTDBSE=";
+  };
+
+  # https://github.com/bentoml/BentoML/pull/4227 should fix this test
+  postPatch = ''
+    substituteInPlace tests/unit/_internal/utils/test_analytics.py \
+      --replace "requests" "httpx"
+  '';
+
+  pythonRelaxDeps = [
+    "opentelemetry-semantic-conventions"
+  ];
+
+  nativeBuildInputs = [
+    hatchling
+    hatch-vcs
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    attrs
+    cattrs
+    circus
+    click
+    click-option-group
+    cloudpickle
+    deepmerge
+    fs
+    httpx
+    inflection
+    jinja2
+    numpy
+    opentelemetry-api
+    opentelemetry-instrumentation
+    opentelemetry-instrumentation-aiohttp-client
+    opentelemetry-instrumentation-asgi
+    opentelemetry-sdk
+    opentelemetry-semantic-conventions
+    opentelemetry-util-http
+    packaging
+    pathspec
+    pip-requirements-parser
+    pip-tools
+    prometheus-client
+    psutil
+    nvidia-ml-py
+    python-dateutil
+    python-json-logger
+    python-multipart
+    pyyaml
+    requests
+    rich
+    schema
+    simple-di
+    starlette
+    uvicorn
+    watchfiles
+  ];
+
+  passthru.optional-dependencies = optional-dependencies;
+
+  pythonImportsCheck = [ "bentoml" ];
+
+  preCheck = ''
+    # required for CI testing
+    # https://github.com/bentoml/BentoML/pull/4056/commits/66302b502a3f4df4e8e6643d2afefefca974073e
+    export GITHUB_ACTIONS=1
+  '';
+
+  disabledTestPaths = [
+    "tests/e2e"
+    "tests/integration"
+  ];
+
+  disabledTests = [
+    # flaky test
+    "test_store"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pandas
+    pydantic
+    scikit-learn
+    lxml
+    orjson
+    pytest-asyncio
+    pillow
+    fastapi
+    starlette
+  ] ++ optional-dependencies.grpc;
+
+
+  meta = with lib; {
+    description = "Build Production-Grade AI Applications";
+    homepage = "https://github.com/bentoml/BentoML";
+    changelog = "https://github.com/bentoml/BentoML/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bespon/default.nix b/nixpkgs/pkgs/development/python-modules/bespon/default.nix
new file mode 100644
index 000000000000..a942651dcb73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bespon/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+}:
+
+buildPythonPackage rec {
+  version = "0.7.0";
+  pname = "bespon";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-dGtXw4uq6pdyXBVfSi9s7kCFUqA1PO7qWEGY0JNAz8Q=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+  # upstream doesn't contain tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "bespon" ];
+  meta = with lib; {
+    description = "Encodes and decodes data in the BespON format.";
+    homepage = "https://github.com/gpoore/bespon_py";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ synthetica ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/betacode/default.nix b/nixpkgs/pkgs/development/python-modules/betacode/default.nix
new file mode 100644
index 000000000000..79136e479d26
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/betacode/default.nix
@@ -0,0 +1,19 @@
+{ fetchPypi, buildPythonPackage, pygtrie, isPy3k, lib, }:
+buildPythonPackage rec {
+  pname = "betacode";
+  version = "1.0";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0s84kd9vblbjz61q7zchx64a6hmdqb4lillna5ryh0g9ij76g6r5";
+  };
+  preBuild = "echo > README.rst";
+  # setup.py uses a python3 os.path.join
+  disabled = !isPy3k;
+  propagatedBuildInputs = [ pygtrie ];
+  meta = {
+    homepage = "https://github.com/matgrioni/betacode";
+    description = "A small python package to flexibly convert from betacode to unicode and back.";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ kmein ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/betamax-matchers/default.nix b/nixpkgs/pkgs/development/python-modules/betamax-matchers/default.nix
new file mode 100644
index 000000000000..087329d103e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/betamax-matchers/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi
+, betamax, requests-toolbelt }:
+
+buildPythonPackage rec {
+  pname = "betamax-matchers";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "07qpwjyq2i2aqhz5iwghnj4pqr2ys5n45v1vmpcfx9r5mhwrsq43";
+  };
+
+  buildInputs = [ betamax requests-toolbelt ];
+
+  meta = with lib; {
+    homepage = "https://github.com/sigmavirus24/betamax_matchers";
+    description = "A group of experimental matchers for Betamax";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ pSub ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/betamax-serializers/default.nix b/nixpkgs/pkgs/development/python-modules/betamax-serializers/default.nix
new file mode 100644
index 000000000000..0ddc9845bfa7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/betamax-serializers/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi
+, betamax, pyyaml }:
+
+buildPythonPackage rec {
+  pname = "betamax-serializers";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ja9isbjmzzhxdj69s0kdsvw8nkp073w6an6a4liy5vk3fdl2p1l";
+  };
+
+  buildInputs = [ betamax pyyaml ];
+
+  meta = with lib; {
+    homepage = "https://gitlab.com/betamax/serializers";
+    description = "A set of third-party serializers for Betamax";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/betamax/default.nix b/nixpkgs/pkgs/development/python-modules/betamax/default.nix
new file mode 100644
index 000000000000..5906a531f22d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/betamax/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, requests }:
+
+buildPythonPackage rec {
+  pname = "betamax";
+  version = "0.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1hki1c2vs7adq7zr56wi6i5bhrkia4s2ywpv2c98ibnczz709w2v";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://betamax.readthedocs.org/en/latest/";
+    description = "A VCR imitation for requests";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ pSub ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/betterproto/default.nix b/nixpkgs/pkgs/development/python-modules/betterproto/default.nix
new file mode 100644
index 000000000000..6de1933fca8d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/betterproto/default.nix
@@ -0,0 +1,73 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, pythonOlder
+, poetry-core
+, grpclib
+, python-dateutil
+, black
+, jinja2
+, isort
+, python
+, pytestCheckHook
+, pytest-asyncio
+, pytest-mock
+, tomlkit
+, grpcio-tools
+}:
+
+buildPythonPackage rec {
+  pname = "betterproto";
+  version = "2.0.0b5";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "danielgtaylor";
+    repo = "python-betterproto";
+    rev = "v${version}";
+    hash = "sha256-XyXdpo3Yo4aO1favMWC7i9utz4fNDbKbsnYXJW0b7Gc=";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [
+    grpclib
+    python-dateutil
+  ];
+
+  passthru.optional-dependencies.compiler = [
+    black
+    jinja2
+    isort
+  ];
+
+  pythonImportsCheck = [ "betterproto" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+    pytest-mock
+    tomlkit
+    grpcio-tools
+  ] ++ passthru.optional-dependencies.compiler;
+
+  # The tests require the generation of code before execution. This requires
+  # the protoc-gen-python_betterproto script from the package to be on PATH.
+  preCheck = ''
+    export PATH=$PATH:$out/bin
+    ${python.interpreter} -m tests.generate
+  '';
+
+  meta = with lib; {
+    description = "Clean, modern, Python 3.6+ code generator & library for Protobuf 3 and async gRPC";
+    longDescription = ''
+      This project aims to provide an improved experience when using Protobuf /
+      gRPC in a modern Python environment by making use of modern language
+      features and generating readable, understandable, idiomatic Python code.
+    '';
+    homepage = "https://github.com/danielgtaylor/python-betterproto";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nikstur ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bibtexparser/default.nix b/nixpkgs/pkgs/development/python-modules/bibtexparser/default.nix
new file mode 100644
index 000000000000..aef733f93878
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bibtexparser/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyparsing
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bibtexparser";
+  version = "1.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sciunto-org";
+    repo = "python-${pname}";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-YMkLSx7L2srLINZa6Ec0rPoxE2SdMv6CnI4BpHgHuzM=";
+  };
+
+  propagatedBuildInputs = [
+    pyparsing
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "bibtexparser"
+  ];
+
+  meta = with lib; {
+    description = "Bibtex parser for Python";
+    homepage = "https://github.com/sciunto-org/python-bibtexparser";
+    license = with licenses; [ lgpl3Only /* or */ bsd3 ];
+    maintainers = with maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bidict/default.nix b/nixpkgs/pkgs/development/python-modules/bidict/default.nix
new file mode 100644
index 000000000000..2ecbd1124685
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bidict/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, sphinx
+, hypothesis
+, py
+, pytest-xdist
+, pytestCheckHook
+, pytest-benchmark
+, sortedcollections
+, sortedcontainers
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bidict";
+  version = "0.22.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jab";
+    repo = "bidict";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-mPBruasjQwErl5M91OBf71hArztdRVONOCnqos180DY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    sphinx
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    py
+    pytest-xdist
+    pytestCheckHook
+    pytest-benchmark
+    sortedcollections
+    sortedcontainers
+  ];
+
+  pythonImportsCheck = [ "bidict" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jab/bidict";
+    changelog = "https://github.com/jab/bidict/blob/v${version}/CHANGELOG.rst";
+    description = "Efficient, Pythonic bidirectional map data structures and related functionality";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ jakewaksbaum ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bids-validator/default.nix b/nixpkgs/pkgs/development/python-modules/bids-validator/default.nix
new file mode 100644
index 000000000000..115c80553cc5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bids-validator/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bids-validator";
+  version = "1.13.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-cgXOTmj7oXIhUzLHhvGsFmUCW3Arbf8rHhWPAKLfmJA=";
+  };
+
+  # needs packages which are not available in nixpkgs
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "bids_validator"
+  ];
+
+  meta = with lib; {
+    description = "Validator for the Brain Imaging Data Structure";
+    homepage = "https://github.com/bids-standard/bids-validator";
+    changelog = "https://github.com/bids-standard/bids-validator/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/biliass/default.nix b/nixpkgs/pkgs/development/python-modules/biliass/default.nix
new file mode 100644
index 000000000000..a6ce06c8a971
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/biliass/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, poetry-core
+, protobuf
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "biliass";
+  version = "1.3.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "yutto-dev";
+    repo = "biliass";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Opb4rlGe+LDJZs3F7e/NZYfuMtHEWUZeMm8VZQfEzKI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    protobuf
+  ];
+
+  doCheck = false; # test artifacts missing
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "biliass"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/yutto-dev/biliass";
+    description = "Convert Bilibili XML/protobuf danmaku to ASS subtitle";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ linsui ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/billiard/default.nix b/nixpkgs/pkgs/development/python-modules/billiard/default.nix
new file mode 100644
index 000000000000..6c641a16f9be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/billiard/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, case
+, psutil
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "billiard";
+  version = "4.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GtLuro4oBT1ym6M3PTTZ1uIQ9uTYvwqcZPkr0FPx7fU=";
+  };
+
+  nativeCheckInputs = [
+    case
+    psutil
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # psutil.NoSuchProcess: process no longer exists (pid=168)
+    "test_set_pdeathsig"
+  ];
+
+  pythonImportsCheck = [
+    "billiard"
+  ];
+
+  meta = with lib; {
+    description = "Python multiprocessing fork with improvements and bugfixes";
+    homepage = "https://github.com/celery/billiard";
+    changelog = "https://github.com/celery/billiard/blob/v${version}/CHANGES.txt";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bimmer-connected/default.nix b/nixpkgs/pkgs/development/python-modules/bimmer-connected/default.nix
new file mode 100644
index 000000000000..af622dfd7624
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bimmer-connected/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pbr
+, httpx
+, pillow
+, pycryptodome
+, pyjwt
+, pytest-asyncio
+, pytestCheckHook
+, python
+, respx
+, time-machine
+, tzdata
+}:
+
+buildPythonPackage rec {
+  pname = "bimmer-connected";
+  version = "0.14.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "bimmerconnected";
+    repo = "bimmer_connected";
+    rev = "refs/tags/${version}";
+    hash = "sha256-I/MKjdEu69uis5f/Xuk4H6ynC71IQmfASLr07PdEBXE=";
+  };
+
+  nativeBuildInputs = [
+    pbr
+  ];
+
+  PBR_VERSION = version;
+
+  propagatedBuildInputs = [
+    httpx
+    pillow
+    pycryptodome
+    pyjwt
+  ];
+
+  postInstall = ''
+    cp -R bimmer_connected/tests/responses $out/${python.sitePackages}/bimmer_connected/tests/
+  '';
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    respx
+    time-machine
+  ];
+
+  preCheck = ''
+    export TZDIR=${tzdata}/${python.sitePackages}/tzdata/zoneinfo
+  '';
+
+  pythonImportsCheck = [
+    "bimmer_connected"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/bimmerconnected/bimmer_connected/releases/tag/${version}";
+    description = "Library to read data from the BMW Connected Drive portal";
+    homepage = "https://github.com/bimmerconnected/bimmer_connected";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/binary/default.nix b/nixpkgs/pkgs/development/python-modules/binary/default.nix
new file mode 100644
index 000000000000..9311289b7cc2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/binary/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "binary";
+  version = "1.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bsAQ5Y9zMevIvJY42+bGbWNd5g1YGLByO+9N6tDsKKY=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "binary" "binary.core" ];
+
+  meta = with lib; {
+    description = "Easily convert between binary and SI units (kibibyte, kilobyte, etc.)";
+    homepage = "https://github.com/ofek/binary";
+    license = with licenses; [ asl20 mit ];
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/binaryornot/default.nix b/nixpkgs/pkgs/development/python-modules/binaryornot/default.nix
new file mode 100644
index 000000000000..b7ca1223ccae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/binaryornot/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, chardet, hypothesis }:
+
+buildPythonPackage rec {
+  pname = "binaryornot";
+  version = "0.4.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061";
+  };
+
+  prePatch = ''
+    # TypeError: binary() got an unexpected keyword argument 'average_size'
+    substituteInPlace tests/test_check.py \
+      --replace "average_size=512" ""
+  '';
+
+  propagatedBuildInputs = [ chardet ];
+
+  nativeCheckInputs = [ hypothesis ];
+
+  meta = with lib; {
+    homepage = "https://github.com/audreyr/binaryornot";
+    description = "Ultra-lightweight pure Python package to check if a file is binary or text";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bincopy/default.nix b/nixpkgs/pkgs/development/python-modules/bincopy/default.nix
new file mode 100644
index 000000000000..67b64e2a71af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bincopy/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, argparse-addons
+, humanfriendly
+, pyelftools
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bincopy";
+  version = "20.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-FM+0z5cie/Kx9bhWI99MdnrSGa/cn+BzLdLP3/RGr98=";
+  };
+
+  propagatedBuildInputs = [
+    argparse-addons
+    humanfriendly
+    pyelftools
+  ];
+
+  pythonImportsCheck = [
+    "bincopy"
+  ];
+
+  meta = with lib; {
+    description = "Mangling of various file formats that conveys binary information (Motorola S-Record, Intel HEX, TI-TXT, ELF and binary files)";
+    homepage = "https://github.com/eerimoq/bincopy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ frogamic sbruder ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/binho-host-adapter/default.nix b/nixpkgs/pkgs/development/python-modules/binho-host-adapter/default.nix
new file mode 100644
index 000000000000..2249a28a5547
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/binho-host-adapter/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyserial
+}:
+
+buildPythonPackage rec {
+  pname = "binho-host-adapter";
+  version = "0.1.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0mp8xa1qwaww2k5g2nqg7mcivzsbfw2ny1l9yjsi73109slafv8y";
+  };
+
+  propagatedBuildInputs = [ pyserial ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "binhoHostAdapter" ];
+
+  meta = with lib; {
+    description = "Python library for Binho Multi-Protocol USB Host Adapters";
+    homepage = "https://github.com/adafruit/Adafruit_Python_PlatformDetect";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/binwalk/default.nix b/nixpkgs/pkgs/development/python-modules/binwalk/default.nix
new file mode 100644
index 000000000000..9fb243a5763d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/binwalk/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, stdenv
+, zlib
+, xz
+, gzip
+, bzip2
+, gnutar
+, p7zip
+, cabextract
+, cramfsprogs
+, cramfsswap
+, sasquatch
+, squashfsTools
+, matplotlib
+, nose
+, pycrypto
+, pyqtgraph
+, visualizationSupport ? false }:
+
+buildPythonPackage rec {
+  pname = "binwalk${lib.optionalString visualizationSupport "-full"}";
+  version = "2.3.4";
+
+  src = fetchFromGitHub {
+    owner = "ReFirmLabs";
+    repo = "binwalk";
+    rev = "v${version}";
+    hash = "sha256-hlPbzqGRSXcIqlI+SNKq37CnnHd1IoMBNSjhyeAM1TE=";
+  };
+
+  patches = [
+    # test_firmware_zip fails with 2.3.3 upgrade
+    # https://github.com/ReFirmLabs/binwalk/issues/566
+    (fetchpatch {
+      url = "https://github.com/ReFirmLabs/binwalk/commit/dd4f2efd275c9dd1001130e82e0f985110cd2754.patch";
+      sha256 = "1707n4nf1d1ay1yn4i8qlrvj2c1120g88hjwyklpsc2s2dcnqj9r";
+      includes = [
+        "testing/tests/test_firmware_zip.py"
+      ];
+      revert = true;
+    })
+  ];
+
+  propagatedBuildInputs = [ zlib xz gzip bzip2 gnutar p7zip cabextract squashfsTools xz pycrypto ]
+  ++ lib.optionals visualizationSupport [ matplotlib pyqtgraph ]
+  ++ lib.optionals (!stdenv.isDarwin) [ cramfsprogs cramfsswap sasquatch ];
+
+  # setup.py only installs version.py during install, not test
+  postPatch = ''
+    echo '__version__ = "${version}"' > src/binwalk/core/version.py
+  '';
+
+  # binwalk wants to access ~/.config/binwalk/magic
+  preCheck = ''
+    HOME=$(mktemp -d)
+  '';
+
+  nativeCheckInputs = [ nose ];
+
+  pythonImportsCheck = [ "binwalk" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ReFirmLabs/binwalk";
+    description = "A tool for searching a given binary image for embedded files";
+    maintainers = [ maintainers.koral ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/biopandas/default.nix b/nixpkgs/pkgs/development/python-modules/biopandas/default.nix
new file mode 100644
index 000000000000..d33a9faf4403
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/biopandas/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, looseversion
+, mmtf-python
+, nose
+, numpy
+, pandas
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "biopandas";
+  version = "0.4.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "BioPandas";
+    repo = "biopandas";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-PRdemBo+bB2xJWmF2NylFTfNwEEo67i6XSaeDAFmQ/c=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    "looseversion"
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    pandas
+    mmtf-python
+    looseversion
+  ];
+
+  nativeCheckInputs = [
+    nose
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    nosetests
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "biopandas"
+  ];
+
+  meta = {
+    description = "Working with molecular structures in pandas DataFrames";
+    homepage = "https://github.com/BioPandas/biopandas";
+    changelog = "https://github.com/BioPandas/biopandas/releases/tag/${src.rev}";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/biopython/default.nix b/nixpkgs/pkgs/development/python-modules/biopython/default.nix
new file mode 100644
index 000000000000..91b4f529f837
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/biopython/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "biopython";
+  version = "1.81";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-LPOBErbYQVrTnWphGYjNEftfM+sJNGZmqHJjvrqWFOA=";
+  };
+
+  disabled = !isPy3k;
+
+  propagatedBuildInputs = [ numpy ];
+  # Checks try to write to $HOME, which does not work with nix
+  doCheck = false;
+  meta = {
+    description = "Python library for bioinformatics";
+    longDescription = ''
+      Biopython is a set of freely available tools for biological computation
+      written in Python by an international team of developers. It is a
+      distributed collaborative effort to develop Python libraries and
+      applications which address the needs of current and future work in
+      bioinformatics.
+    '';
+    homepage = "https://biopython.org/wiki/Documentation";
+    maintainers = with lib.maintainers; [ luispedro ];
+    license = lib.licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bip-utils/default.nix b/nixpkgs/pkgs/development/python-modules/bip-utils/default.nix
new file mode 100644
index 000000000000..1608ecdf89f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bip-utils/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, cbor2
+, coincurve
+, crcmod
+, ecdsa
+, ed25519-blake2b
+, fetchFromGitHub
+, py-sr25519-bindings
+, pycryptodome
+, pynacl
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bip-utils";
+  version = "2.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ebellocchia";
+    repo = "bip_utils";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-FW3ni7kPB0VeVK/uWjDEeWgilP9dNiuvSaboUpG5DLo=";
+  };
+
+  propagatedBuildInputs = [
+    ecdsa
+    cbor2
+    pynacl
+    coincurve
+    crcmod
+    ed25519-blake2b
+    py-sr25519-bindings
+    pycryptodome
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "bip_utils"
+  ];
+
+  meta = with lib; {
+    description = "Implementation of BIP39, BIP32, BIP44, BIP49 and BIP84 for wallet seeds, keys and addresses generation";
+    homepage = "https://github.com/ebellocchia/bip_utils";
+    changelog = "https://github.com/ebellocchia/bip_utils/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ prusnak stargate01 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bip32/default.nix b/nixpkgs/pkgs/development/python-modules/bip32/default.nix
new file mode 100644
index 000000000000..96f37498c93b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bip32/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, base58
+, coincurve
+}:
+
+buildPythonPackage rec {
+  pname = "bip32";
+  version = "3.4";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  # the PyPi source distribution ships a broken setup.py, so use github instead
+  src = fetchFromGitHub {
+    owner = "darosior";
+    repo = "python-bip32";
+    rev = version;
+    hash = "sha256-o8UKR17XDWp1wTWYeDL0DJY+D11YI4mg0UuGEAPkHxE=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    base58
+    coincurve
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "bip32"
+  ];
+
+  meta = with lib; {
+    description = "Minimalistic implementation of the BIP32 key derivation scheme";
+    homepage = "https://github.com/darosior/python-bip32";
+    changelog = "https://github.com/darosior/python-bip32/blob/${version}/CHANGELOG.md";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ arcnmx ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/biplist/default.nix b/nixpkgs/pkgs/development/python-modules/biplist/default.nix
new file mode 100644
index 000000000000..605500c67490
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/biplist/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "biplist";
+  version = "1.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1im45a9z7ryrfyp1v6i39qia5qagw6i1mhif0hl0praz9iv4j1ac";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Failing tests
+    "testConvertToXMLPlistWithData"
+    "testWriteToFile"
+    "testXMLPlist"
+    "testXMLPlistWithData"
+  ];
+
+  pythonImportsCheck = [ "biplist" ];
+
+  meta = with lib; {
+    homepage = "https://bitbucket.org/wooster/biplist/src/master/";
+    description = "Binary plist parser/generator for Python";
+    longDescription = ''
+      Binary Property List (plist) files provide a faster and smaller
+      serialization format for property lists on OS X.
+
+      This is a library for generating binary plists which can be read
+      by OS X, iOS, or other clients.
+    '';
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ siriobalmelli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bitarray/default.nix b/nixpkgs/pkgs/development/python-modules/bitarray/default.nix
new file mode 100644
index 000000000000..e69b31b118f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bitarray/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bitarray";
+  version = "2.8.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-4VWHsr3xjTLrO6JfX1pRvt0NwGsxEqTFPated1O8ZYg=";
+  };
+
+  checkPhase = ''
+    cd $out
+    ${python.interpreter} -c 'import bitarray; bitarray.test()'
+  '';
+
+  pythonImportsCheck = [
+    "bitarray"
+  ];
+
+  meta = with lib; {
+    description = "Efficient arrays of booleans";
+    homepage = "https://github.com/ilanschnell/bitarray";
+    changelog = "https://github.com/ilanschnell/bitarray/raw/${version}/CHANGE_LOG";
+    license = licenses.psfl;
+    maintainers = with maintainers; [ bhipple ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bitbox02/default.nix b/nixpkgs/pkgs/development/python-modules/bitbox02/default.nix
new file mode 100644
index 000000000000..7d6f89175608
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bitbox02/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, base58
+, ecdsa
+, hidapi
+, noiseprotocol
+, protobuf
+, semver
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "bitbox02";
+  version = "6.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zt4G45nJjtU2/tbYpCEgjaoA+Xtpe9g2OpQaxfMzCb8=";
+  };
+
+  propagatedBuildInputs = [
+    base58
+    ecdsa
+    hidapi
+    noiseprotocol
+    protobuf
+    semver
+    typing-extensions
+  ];
+
+  # does not contain tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "bitbox02"
+  ];
+
+  meta = with lib; {
+    description = "Firmware code of the BitBox02 hardware wallet";
+    homepage = "https://github.com/digitalbitbox/bitbox02-firmware/";
+    changelog = "https://github.com/digitalbitbox/bitbox02-firmware/blob/py-bitbox02-${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bitcoin-utils-fork-minimal/default.nix b/nixpkgs/pkgs/development/python-modules/bitcoin-utils-fork-minimal/default.nix
new file mode 100644
index 000000000000..c548ce0bbf32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bitcoin-utils-fork-minimal/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, base58
+, buildPythonPackage
+, ecdsa
+, fetchPypi
+, sympy
+}:
+
+buildPythonPackage rec {
+  pname = "bitcoin-utils-fork-minimal";
+  version = "0.4.11.6";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-DzibvC8qr/5ync59cfFB7tBmZWkPs/hKh+e5OC4lcEw=";
+  };
+
+  propagatedBuildInputs = [
+    base58
+    ecdsa
+    sympy
+  ];
+
+  preConfigure = ''
+    substituteInPlace setup.py \
+      --replace "sympy==1.3" "sympy>=1.3" \
+      --replace "base58==2.1.0" "base58>=2.1.0" \
+      --replace "ecdsa==0.17.0" "ecdsa>=0.17.0"
+  '';
+
+  # Project doesn't ship tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "bitcoinutils"
+  ];
+
+  meta = with lib; {
+    description = "Bitcoin utility functions";
+    homepage = "https://github.com/doersf/python-bitcoin-utils";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bitcoinlib/default.nix b/nixpkgs/pkgs/development/python-modules/bitcoinlib/default.nix
new file mode 100644
index 000000000000..3b1ead8d8962
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bitcoinlib/default.nix
@@ -0,0 +1,31 @@
+{ stdenv, lib, buildPythonPackage, isPy3k, fetchFromGitHub, openssl }:
+
+buildPythonPackage rec {
+  pname = "bitcoinlib";
+  version = "0.12.2";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "petertodd";
+    repo = "python-bitcoinlib";
+    rev = "refs/tags/python-bitcoinlib-v${version}";
+    hash = "sha256-jfd2Buy6GSCH0ZeccRREC1NmlS6Mq1qtNv/NLNJOsX0=";
+  };
+
+  postPatch = ''
+    substituteInPlace bitcoin/core/key.py --replace \
+      "ctypes.util.find_library('ssl.35') or ctypes.util.find_library('ssl') or ctypes.util.find_library('libeay32')" \
+      "'${lib.getLib openssl}/lib/libssl${stdenv.hostPlatform.extensions.sharedLibrary}'"
+  '';
+
+  pythonImportsCheck = [ "bitcoin" "bitcoin.core.key" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/petertodd/python-bitcoinlib";
+    description = "Easy interface to the Bitcoin data structures and protocol";
+    changelog = "https://github.com/petertodd/python-bitcoinlib/raw/${src.rev}/release-notes.md";
+    license = with licenses; [ lgpl3Plus ];
+    maintainers = with maintainers; [ jb55 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bitcoinrpc/default.nix b/nixpkgs/pkgs/development/python-modules/bitcoinrpc/default.nix
new file mode 100644
index 000000000000..65c05c01991b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bitcoinrpc/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, orjson
+, httpx
+, typing-extensions
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bitcoinrpc";
+  version = "0.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bibajz";
+    repo = "bitcoin-python-async-rpc";
+    rev = "v${version}";
+    hash = "sha256-uxkSz99X9ior7l825PaXGIC5XJzO/Opv0vTyY1ixvxU=";
+  };
+
+  propagatedBuildInputs = [
+    orjson
+    httpx
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "bitcoinrpc"
+  ];
+
+  meta = with lib; {
+    description = "Bitcoin JSON-RPC client";
+    homepage = "https://github.com/bibajz/bitcoin-python-async-rpc";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bite-parser/default.nix b/nixpkgs/pkgs/development/python-modules/bite-parser/default.nix
new file mode 100644
index 000000000000..647818078790
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bite-parser/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "bite-parser";
+  version = "0.2.3";
+
+  disabled = pythonOlder "3.8";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "bite_parser";
+    inherit version;
+    hash = "sha256-5ZdmOhnxpBI4XGgT4n8JEriqOEkiUZ1Cc96/pyluhe4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "bite" ];
+
+  meta = {
+    description = "Asynchronous parser taking incremental bites out of your byte input stream";
+    homepage = "https://github.com/jgosmann/bite-parser";
+    changelog = "https://github.com/jgosmann/bite-parser/blob/v${version}/CHANGELOG.rst";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bitlist/default.nix b/nixpkgs/pkgs/development/python-modules/bitlist/default.nix
new file mode 100644
index 000000000000..30198b7a1a17
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bitlist/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, wheel
+, parts
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bitlist";
+  version = "1.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+/rBno+OH7yEiN4K9VC6BCEPuOv8nNp0hU+fWegjqPw=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '--cov=bitlist --cov-report term-missing' ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    parts
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "bitlist"
+  ];
+
+  meta = with lib; {
+    description = "Python library for working with little-endian list representation of bit strings";
+    homepage = "https://github.com/lapets/bitlist";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bitmath/default.nix b/nixpkgs/pkgs/development/python-modules/bitmath/default.nix
new file mode 100644
index 000000000000..661b477e65bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bitmath/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, progressbar231 ? null, progressbar33, mock }:
+
+buildPythonPackage rec {
+  pname = "bitmath";
+  version = "1.3.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "293325f01e65defe966853111df11d39215eb705a967cb115851da8c4cfa3eb8";
+  };
+
+  nativeCheckInputs = [ (if isPy3k then progressbar33 else progressbar231) mock ];
+
+  meta = with lib; {
+    description = "Module for representing and manipulating file sizes with different prefix";
+    homepage = "https://github.com/tbielawa/bitmath";
+    license = licenses.mit;
+    maintainers = with maintainers; [ twey ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bitsandbytes/default.nix b/nixpkgs/pkgs/development/python-modules/bitsandbytes/default.nix
new file mode 100644
index 000000000000..c511f01d6dcf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bitsandbytes/default.nix
@@ -0,0 +1,96 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, pythonOlder
+, setuptools
+, wheel
+, torch
+, scipy
+, symlinkJoin
+}:
+
+let
+  pname = "bitsandbytes";
+  version = "0.41.0";
+
+  inherit (torch) cudaCapabilities cudaPackages cudaSupport;
+  inherit (cudaPackages) backendStdenv cudaVersion;
+
+  # NOTE: torchvision doesn't use cudnn; torch does!
+  #   For this reason it is not included.
+  cuda-common-redist = with cudaPackages; [
+    cuda_cccl # <thrust/*>
+    libcublas # cublas_v2.h
+    libcurand
+    libcusolver # cusolverDn.h
+    libcusparse # cusparse.h
+  ];
+
+  cuda-native-redist = symlinkJoin {
+    name = "cuda-native-redist-${cudaVersion}";
+    paths = with cudaPackages; [
+      cuda_cudart # cuda_runtime.h cuda_runtime_api.h
+      cuda_nvcc
+    ] ++ cuda-common-redist;
+  };
+
+  cuda-redist = symlinkJoin {
+    name = "cuda-redist-${cudaVersion}";
+    paths = cuda-common-redist;
+  };
+
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "TimDettmers";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-e6SK2ylITookO6bhpfdRp/V4y2S9rk6Lo1PD3xXrcmM=";
+  };
+
+  postPatch = ''
+    substituteInPlace Makefile --replace "/usr/bin/g++" "g++" --replace "lib64" "lib"
+    substituteInPlace bitsandbytes/cuda_setup/main.py  \
+      --replace "binary_path = package_dir / self.binary_name"  \
+                "binary_path = Path('$out/${python.sitePackages}/${pname}')/self.binary_name"
+  '' + lib.optionalString torch.cudaSupport ''
+    substituteInPlace bitsandbytes/cuda_setup/main.py  \
+      --replace "/usr/local/cuda/lib64" "${cuda-native-redist}/lib"
+  '';
+
+  CUDA_HOME = "${cuda-native-redist}";
+
+  preBuild = if torch.cudaSupport then
+    with torch.cudaPackages;
+    let cudaVersion = lib.concatStrings (lib.splitVersion torch.cudaPackages.cudaMajorMinorVersion); in
+    ''make CUDA_VERSION=${cudaVersion} cuda${cudaMajorVersion}x''
+  else
+    ''make CUDA_VERSION=CPU cpuonly'';
+
+  nativeBuildInputs = [ setuptools wheel ] ++ lib.optionals torch.cudaSupport [ cuda-native-redist ];
+  buildInputs = lib.optionals torch.cudaSupport [ cuda-redist ];
+
+  propagatedBuildInputs = [
+    scipy
+    torch
+  ];
+
+  doCheck = false;  # tests require CUDA and also GPU access
+
+  pythonImportsCheck = [
+    "bitsandbytes"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/TimDettmers/bitsandbytes";
+    description = "8-bit CUDA functions for PyTorch";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bitstring/default.nix b/nixpkgs/pkgs/development/python-modules/bitstring/default.nix
new file mode 100644
index 000000000000..537905778ba3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bitstring/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, bitarray
+, setuptools
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "bitstring";
+  version = "4.1.3";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "scott-griffiths";
+    repo = pname;
+    rev = "refs/tags/bitstring-${version}";
+    hash = "sha256-RbHy36AnDlu/Ym5Ty2O9XfPj5xXd9hTgoClvISPoGBc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    bitarray
+  ];
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  pythonImportsCheck = [ "bitstring" ];
+
+  meta = with lib; {
+    description = "Module for binary data manipulation";
+    homepage = "https://github.com/scott-griffiths/bitstring";
+    license = licenses.mit;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bitstruct/default.nix b/nixpkgs/pkgs/development/python-modules/bitstruct/default.nix
new file mode 100644
index 000000000000..e16a6d7a38cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bitstruct/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bitstruct";
+  version = "8.19.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-11up3e2FwX6IWiCaAOuOJI7kB2IUny8qeTYMqFdGfaw=";
+  };
+
+  pythonImportsCheck = [
+    "bitstruct"
+  ];
+
+  meta = with lib; {
+    description = "Python bit pack/unpack package";
+    homepage = "https://github.com/eerimoq/bitstruct";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jakewaksbaum ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bitvavo-aio/default.nix b/nixpkgs/pkgs/development/python-modules/bitvavo-aio/default.nix
new file mode 100644
index 000000000000..39094d74e5f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bitvavo-aio/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bitvavo-aio";
+  version = "1.0.3";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "cyberjunky";
+    repo = pname;
+    rev = version;
+    sha256 = "1d9nbbvv7xnkixj03sfhs2da5j3i2m7p73r7j1yb7b39zas2rbig";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "bitvavo" ];
+
+  meta = with lib; {
+    description = "Python client for Bitvavo crypto exchange API";
+    homepage = "https://github.com/cyberjunky/bitvavo-aio";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bizkaibus/default.nix b/nixpkgs/pkgs/development/python-modules/bizkaibus/default.nix
new file mode 100644
index 000000000000..7de8f2ca223c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bizkaibus/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, requests
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bizkaibus";
+  version = "0.1.4";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "UgaitzEtxebarria";
+    repo = "BizkaibusRTPI";
+    rev = version;
+    sha256 = "1v7k9fclndb4x9npzhzj68kbrc3lb3wr6cwal2x46ib207593ckr";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "bizkaibus" ];
+
+  meta = with lib; {
+    description = "Python module to get information about Bizkaibus buses";
+    homepage = "https://github.com/UgaitzEtxebarria/BizkaibusRTPI";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bjoern/default.nix b/nixpkgs/pkgs/development/python-modules/bjoern/default.nix
new file mode 100644
index 000000000000..e8b11a6311a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bjoern/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchFromGitHub, libev, python }:
+
+buildPythonPackage rec {
+  pname = "bjoern";
+  version = "3.2.1";
+  format = "setuptools";
+
+  # tests are not published to pypi anymore
+  src = fetchFromGitHub {
+    owner = "jonashaag";
+    repo = pname;
+    rev = version;
+    hash = "sha256-d7u/lEh2Zr5NYWYu4Zr7kgyeOIQuHQLYrZeiZMHbpio=";
+    fetchSubmodules = true; # fetch http-parser and statsd-c-client submodules
+  };
+
+  buildInputs = [ libev ];
+
+  checkPhase = ''
+    ${python.interpreter} tests/keep-alive-behaviour.py 2>/dev/null
+    ${python.interpreter} tests/test_wsgi_compliance.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/jonashaag/bjoern";
+    description = "A screamingly fast Python 2/3 WSGI server written in C";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ cmcdragonkai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bkcharts/default.nix b/nixpkgs/pkgs/development/python-modules/bkcharts/default.nix
new file mode 100644
index 000000000000..9e105c09d57b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bkcharts/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pandas
+}:
+
+
+buildPythonPackage rec {
+  pname = "bkcharts";
+  version = "0.2";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "a5eaa8e78853dcecaa46345812e4fabe9cd3b96330ebf0809f640a4a0556d72e";
+  };
+
+  propagatedBuildInputs = [ numpy pandas ];
+
+  # Circular test dependency on bokeh
+  doCheck = false;
+
+  meta = {
+    description = "High level chart types built on top of Bokeh";
+    homepage = "https://github.com/bokeh/bkcharts";
+    license = lib.licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/black-macchiato/default.nix b/nixpkgs/pkgs/development/python-modules/black-macchiato/default.nix
new file mode 100644
index 000000000000..5a7c20e3c43e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/black-macchiato/default.nix
@@ -0,0 +1,35 @@
+{ lib,
+  buildPythonPackage,
+  fetchFromGitHub,
+  pythonOlder,
+  pytestCheckHook,
+  black
+}:
+
+buildPythonPackage rec {
+  pname = "black-macchiato";
+  version = "1.3.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner  = "wbolster";
+    repo   = pname;
+    rev    = version;
+    sha256 = "0lc9w50nlbmlzj44krk7kxcia202fhybbnwfh77xixlc7vb4rayl";
+  };
+
+  propagatedBuildInputs = [ black ];
+
+  nativeCheckInputs = [ pytestCheckHook black ];
+
+  pythonImportsCheck = [ "black" ];
+
+  meta = with lib; {
+    description = "This is a small utility built on top of the black Python code formatter to enable formatting of partial files";
+    homepage    = "https://github.com/wbolster/black-macchiato";
+    license     = licenses.bsd3;
+    maintainers = with maintainers; [ jperras ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/black/default.nix b/nixpkgs/pkgs/development/python-modules/black/default.nix
new file mode 100644
index 000000000000..76890aeda286
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/black/default.nix
@@ -0,0 +1,113 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytestCheckHook
+, aiohttp
+, aiohttp-cors
+, click
+, colorama
+, hatch-fancy-pypi-readme
+, hatch-vcs
+, hatchling
+, ipython
+, mypy-extensions
+, packaging
+, pathspec
+, parameterized
+, platformdirs
+, tokenize-rt
+, tomli
+, typed-ast
+, typing-extensions
+, uvloop
+}:
+
+buildPythonPackage rec {
+  pname = "black";
+  version = "23.9.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JLaz/1xtnqCKiIj2l36uhY4fNA1yYM9W1wpJgjI2ti0=";
+  };
+
+  nativeBuildInputs = [
+    hatch-fancy-pypi-readme
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    click
+    mypy-extensions
+    packaging
+    pathspec
+    platformdirs
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = {
+    colorama = [
+      colorama
+    ];
+    d = [
+      aiohttp
+    ];
+    uvloop = [
+      uvloop
+    ];
+    jupyter = [
+      ipython
+      tokenize-rt
+    ];
+  };
+
+  # Necessary for the tests to pass on Darwin with sandbox enabled.
+  # Black starts a local server and needs to bind a local address.
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    parameterized
+  ] ++ lib.flatten (lib.attrValues passthru.optional-dependencies);
+
+  preCheck = ''
+    export PATH="$PATH:$out/bin"
+
+    # The top directory /build matches black's DEFAULT_EXCLUDE regex.
+    # Make /build the project root for black tests to avoid excluding files.
+    touch ../.git
+  '' + lib.optionalString stdenv.isDarwin ''
+    # Work around https://github.com/psf/black/issues/2105
+    export TMPDIR="/tmp"
+  '';
+
+  disabledTests = [
+    # requires network access
+    "test_gen_check_output"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # fails on darwin
+    "test_expression_diff"
+    # Fail on Hydra, see https://github.com/NixOS/nixpkgs/pull/130785
+    "test_bpo_2142_workaround"
+    "test_skip_magic_trailing_comma"
+  ];
+  # multiple tests exceed max open files on hydra builders
+  doCheck = !(stdenv.isLinux && stdenv.isAarch64);
+
+  meta = with lib; {
+    description = "The uncompromising Python code formatter";
+    homepage = "https://github.com/psf/black";
+    changelog = "https://github.com/psf/black/blob/${version}/CHANGES.md";
+    license = licenses.mit;
+    mainProgram = "black";
+    maintainers = with maintainers; [ sveitser autophagy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/blackjax/default.nix b/nixpkgs/pkgs/development/python-modules/blackjax/default.nix
new file mode 100644
index 000000000000..4e47e692657a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blackjax/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+, setuptools-scm
+, fastprogress
+, jax
+, jaxlib
+, jaxopt
+, optax
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "blackjax";
+  version = "1.0.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "blackjax-devs";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-hqOKSHyZ/BmOu6MJLeecD3H1BbLbZqywmlBzn3xjQRk=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  propagatedBuildInputs = [
+    fastprogress
+    jax
+    jaxlib
+    jaxopt
+    optax
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  disabledTestPaths = [ "tests/test_benchmarks.py" ];
+  disabledTests = [
+    # too slow
+    "test_adaptive_tempered_smc"
+  ];
+
+  pythonImportsCheck = [
+    "blackjax"
+  ];
+
+  meta = with lib; {
+    homepage = "https://blackjax-devs.github.io/blackjax";
+    description = "Sampling library designed for ease of use, speed and modularity";
+    changelog = "https://github.com/blackjax-devs/blackjax/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bleach-allowlist/default.nix b/nixpkgs/pkgs/development/python-modules/bleach-allowlist/default.nix
new file mode 100644
index 000000000000..81aff57090fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bleach-allowlist/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, bleach
+}:
+
+buildPythonPackage rec {
+  pname = "bleach-allowlist";
+  version = "1.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VuIghgeaDmoxAK6Z5NuvIOslhUhlmOsOmUAIoRQo2ps=";
+  };
+
+  propagatedBuildInputs = [
+    bleach
+  ];
+
+  # No tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "bleach_allowlist" ];
+
+  meta = with lib; {
+    description = "Curated lists of tags and attributes for sanitizing html";
+    homepage = "https://github.com/yourcelf/bleach-allowlist";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ambroisie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bleach/default.nix b/nixpkgs/pkgs/development/python-modules/bleach/default.nix
new file mode 100644
index 000000000000..f35d05728ea5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bleach/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, six
+, html5lib
+, setuptools
+, tinycss2
+, packaging
+, pythonOlder
+, webencodings
+}:
+
+buildPythonPackage rec {
+  pname = "bleach";
+  version = "6.0.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GhqFwVleB9jbFMXwnwnmQzUCxRxZWXDtwJBVHw25lBQ=";
+  };
+
+  propagatedBuildInputs = [
+    html5lib
+    packaging
+    setuptools
+    six
+    webencodings
+  ];
+
+  passthru.optional-dependencies = {
+    css = [
+      tinycss2
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Disable network tests
+    "protocols"
+  ];
+
+  pythonImportsCheck = [
+    "bleach"
+  ];
+
+  meta = with lib; {
+    description = "An easy, HTML5, whitelisting HTML sanitizer";
+    longDescription = ''
+      Bleach is an HTML sanitizing library that escapes or strips markup and
+      attributes based on a white list. Bleach can also linkify text safely,
+      applying filters that Django's urlize filter cannot, and optionally
+      setting rel attributes, even on links already in the text.
+
+      Bleach is intended for sanitizing text from untrusted sources. If you
+      find yourself jumping through hoops to allow your site administrators
+      to do lots of things, you're probably outside the use cases. Either
+      trust those users, or don't.
+    '';
+    homepage = "https://github.com/mozilla/bleach";
+    downloadPage = "https://github.com/mozilla/bleach/releases";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ prikhi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bleak-retry-connector/default.nix b/nixpkgs/pkgs/development/python-modules/bleak-retry-connector/default.nix
new file mode 100644
index 000000000000..041fd9d84cff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bleak-retry-connector/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, async-timeout
+, bleak
+, bluetooth-adapters
+, dbus-fast
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "bleak-retry-connector";
+  version = "3.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-5yhr+W2ZSy/uSgmz23pyIKcoJ34h/eDsoyv+N9Hi36w=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=bleak_retry_connector --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    async-timeout
+    bleak
+    bluetooth-adapters
+    dbus-fast
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # broken mocking
+    "test_establish_connection_can_cache_services_services_missing"
+    "test_establish_connection_with_dangerous_use_cached_services"
+    "test_establish_connection_without_dangerous_use_cached_services"
+  ];
+
+  pythonImportsCheck = [
+    "bleak_retry_connector"
+  ];
+
+  meta = with lib; {
+    description = "Connector for Bleak Clients that handles transient connection failures";
+    homepage = "https://github.com/bluetooth-devices/bleak-retry-connector";
+    changelog = "https://github.com/bluetooth-devices/bleak-retry-connector/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bleak/default.nix b/nixpkgs/pkgs/development/python-modules/bleak/default.nix
new file mode 100644
index 000000000000..f53f614867ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bleak/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, async-timeout
+, bluez
+, buildPythonPackage
+, dbus-fast
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "bleak";
+  version = "0.21.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "hbldh";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-T0im8zKyNLbskAEDeUUFS/daJtvttlHlttjscqP8iSk=";
+  };
+
+  postPatch = ''
+    # bleak checks BlueZ's version with a call to `bluetoothctl --version`
+    substituteInPlace bleak/backends/bluezdbus/version.py \
+      --replace \"bluetoothctl\" \"${bluez}/bin/bluetoothctl\"
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    async-timeout
+    dbus-fast
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "bleak"
+  ];
+
+  meta = with lib; {
+    description = "Bluetooth Low Energy platform agnostic client";
+    homepage = "https://github.com/hbldh/bleak";
+    changelog = "https://github.com/hbldh/bleak/blob/v${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ oxzi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/blebox-uniapi/default.nix b/nixpkgs/pkgs/development/python-modules/blebox-uniapi/default.nix
new file mode 100644
index 000000000000..f93ef838751f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blebox-uniapi/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, semver
+, deepmerge
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "blebox-uniapi";
+  version = "2.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "blebox";
+    repo = "blebox_uniapi";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-cLSI6wa3gHE0QkSVVWMNpb5fyQy0TLDNSqOuGlDJGJc=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest-runner" ""
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+    semver
+  ];
+
+  nativeCheckInputs = [
+    deepmerge
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "blebox_uniapi"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/blebox/blebox_uniapi/blob/v${version}/HISTORY.rst";
+    description = "Python API for accessing BleBox smart home devices";
+    homepage = "https://github.com/blebox/blebox_uniapi";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bless/default.nix b/nixpkgs/pkgs/development/python-modules/bless/default.nix
new file mode 100644
index 000000000000..dbe92d76c73f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bless/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, aioconsole
+, bleak
+, buildPythonPackage
+, dbus-next
+, fetchFromGitHub
+, numpy
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bless";
+  version = "0.2.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "kevincar";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+rnMLqNfhIJASCKkIfOKpVil3S/d8BcMxnLHmdOcRIY=";
+  };
+
+  propagatedBuildInputs = [
+    bleak
+    dbus-next
+  ];
+
+  nativeCheckInputs = [
+    aioconsole
+    numpy
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "bless"
+  ];
+
+  meta = with lib; {
+    description = "Library for creating a BLE Generic Attribute Profile (GATT) server";
+    homepage = "https://github.com/kevincar/bless";
+    changelog = "https://github.com/kevincar/bless/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/blessed/default.nix b/nixpkgs/pkgs/development/python-modules/blessed/default.nix
new file mode 100644
index 000000000000..dd9c83181932
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blessed/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi, six
+, wcwidth, pytest, mock, glibcLocales
+}:
+
+buildPythonPackage rec {
+  pname = "blessed";
+  version = "1.20.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-LN1n+HRuBI8A30eiiA9NasvNs5kDG2BONLqPcdV4doA=";
+  };
+
+  nativeCheckInputs = [ pytest mock glibcLocales ];
+
+  # Default tox.ini parameters not needed
+  checkPhase = ''
+    rm tox.ini
+    pytest
+  '';
+
+  propagatedBuildInputs = [ wcwidth six ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jquast/blessed";
+    description = "A thin, practical wrapper around terminal capabilities in Python.";
+    maintainers = with maintainers; [ eqyiel ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/blessings/default.nix b/nixpkgs/pkgs/development/python-modules/blessings/default.nix
new file mode 100644
index 000000000000..31275a9f0703
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blessings/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "blessings";
+  version = "1.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "98e5854d805f50a5b58ac2333411b0482516a8210f23f43308baeb58d77c157d";
+  };
+
+  # 4 failing tests, 2to3
+  doCheck = false;
+
+  propagatedBuildInputs = [ six ];
+  nativeCheckInputs = [ nose ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/erikrose/blessings";
+    description = "A thin, practical wrapper around terminal coloring, styling, and positioning";
+    license = licenses.mit;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/blinker/default.nix b/nixpkgs/pkgs/development/python-modules/blinker/default.nix
new file mode 100644
index 000000000000..9864bbae3c61
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blinker/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pytest-asyncio
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "blinker";
+  version = "1.6.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Sv095m7zqfgGdVn7ehy+VVwX3L4VlxsF0bYlw+er4hM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  pythonImportsCheck = [
+    "blinker"
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/pallets-eco/blinker/releases/tag/${version}";
+    description = "Fast Python in-process signal/event dispatching system";
+    homepage = "https://github.com/pallets-eco/blinker/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/blinkpy/default.nix b/nixpkgs/pkgs/development/python-modules/blinkpy/default.nix
new file mode 100644
index 000000000000..9c9a1f99acff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blinkpy/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiofiles
+, aiohttp
+, pytestCheckHook
+, python-dateutil
+, python-slugify
+, pythonOlder
+, requests
+, setuptools
+, sortedcontainers
+}:
+
+buildPythonPackage rec {
+  pname = "blinkpy";
+  version = "0.22.3";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "fronzbot";
+    repo = "blinkpy";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-J9eBZv/uizkZz53IX1ZfF7IeMOnBonyMD2c5DphW8BQ=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace ', "wheel~=0.40.0"' ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiofiles
+    aiohttp
+    python-dateutil
+    python-slugify
+    requests
+    sortedcontainers
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "blinkpy"
+    "blinkpy.api"
+    "blinkpy.auth"
+    "blinkpy.blinkpy"
+    "blinkpy.camera"
+    "blinkpy.helpers.util"
+    "blinkpy.sync_module"
+  ];
+
+  meta = with lib; {
+    description = "Python library for the Blink Camera system";
+    homepage = "https://github.com/fronzbot/blinkpy";
+    changelog = "https://github.com/fronzbot/blinkpy/blob/${src.rev}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/blinkstick/default.nix b/nixpkgs/pkgs/development/python-modules/blinkstick/default.nix
new file mode 100644
index 000000000000..bafd5254b968
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blinkstick/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pyusb }:
+
+buildPythonPackage rec {
+  pname = "blinkstick";
+  version = "unstable-2023-05-04";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "arvydas";
+    repo = "blinkstick-python";
+    rev = "8140b9fa18a9ff4f0e9df8e70c073f41cb8f1d35";
+    hash = "sha256-9bc7TD/Ilc952ywLauFd0+3Lh64lQlYuDC1KG9eWDgs=";
+  };
+
+  propagatedBuildInputs = [ pyusb ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "blinkstick" ];
+
+  meta = {
+    description = "Python package to control BlinkStick USB devices";
+    homepage = "https://github.com/arvydas/blinkstick-python";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ np perstark ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/blis/default.nix b/nixpkgs/pkgs/development/python-modules/blis/default.nix
new file mode 100644
index 000000000000..91e443af460f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blis/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, cython
+, hypothesis
+, numpy
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "blis";
+  version = "0.7.11";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "explosion";
+    repo = "cython-blis";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-p8pzGZc5OiiGTvXULDgzsBC3jIhovTKUq3RtPnQ/+to=";
+  };
+
+  postPatch = ''
+    # See https://github.com/numpy/numpy/issues/21079
+    # has no functional difference as the name is only used in log output
+    substituteInPlace blis/benchmark.py \
+      --replace 'numpy.__config__.blas_ilp64_opt_info["libraries"]' '["dummy"]'
+  '';
+
+  preCheck = ''
+    # remove src module, so tests use the installed module instead
+    rm -rf ./blis
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "blis"
+  ];
+
+  passthru = {
+    # Do not update to BLIS 0.9.x until the following issue is resolved:
+    # https://github.com/explosion/thinc/issues/771#issuecomment-1255825935
+    skipBulkUpdate = true;
+  };
+
+  meta = with lib; {
+    description = "BLAS-like linear algebra library";
+    homepage = "https://github.com/explosion/cython-blis";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/blobfile/default.nix b/nixpkgs/pkgs/development/python-modules/blobfile/default.nix
new file mode 100644
index 000000000000..9c99c8502774
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blobfile/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, filelock
+, lxml
+, pycryptodomex
+, pythonOlder
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "blobfile";
+  version = "2.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "christopher-hesse";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-vVoiNIN/LNdbedaOQ+gtj4jhzmrGri49fftHKG+K/fg=";
+  };
+
+  propagatedBuildInputs = [
+    pycryptodomex
+    filelock
+    urllib3
+    lxml
+  ];
+
+  # Tests require a running Docker instance
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "blobfile"
+  ];
+
+  meta = with lib; {
+    description = "Read Google Cloud Storage, Azure Blobs, and local paths with the same interface";
+    homepage = "https://github.com/christopher-hesse/blobfile";
+    changelog = "https://github.com/christopher-hesse/blobfile/blob/v${version}/CHANGES.md";
+    license = licenses.unlicense;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/block-io/default.nix b/nixpkgs/pkgs/development/python-modules/block-io/default.nix
new file mode 100644
index 000000000000..6540ebe02eb8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/block-io/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, fetchPypi
+, bitcoin-utils-fork-minimal
+, buildPythonPackage
+, base58
+, pycryptodome
+, requests
+, setuptools
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "block-io";
+  version = "2.0.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-M7czfpagXqoWWSu4enB3Z2hc2GtAaskI6cnJzJdpC8I=";
+  };
+
+  propagatedBuildInputs = [
+    base58
+    bitcoin-utils-fork-minimal
+    pycryptodome
+    requests
+    setuptools
+  ];
+
+  preConfigure = ''
+    substituteInPlace setup.py \
+      --replace "base58==2.1.0" "base58>=2.1.0"
+  '';
+
+  # Tests needs a BlockIO API key to run properly
+  # https://github.com/BlockIo/block_io-python/blob/79006bc8974544b70a2d8e9f19c759941d32648e/test.py#L18
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "block_io"
+  ];
+
+  meta = with lib; {
+    description = "Integrate Bitcoin, Dogecoin and Litecoin in your Python applications using block.io";
+    homepage = "https://github.com/BlockIo/block_io-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nyanloutre ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/blockchain/default.nix b/nixpkgs/pkgs/development/python-modules/blockchain/default.nix
new file mode 100644
index 000000000000..e6d523c3c7b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blockchain/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, future
+}:
+
+buildPythonPackage rec {
+  pname = "blockchain";
+  version = "1.4.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1qpbmz6dk5gx1996dswpipwhj6sp5j0dlfap012l46zqnvmkxanv";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "enum-compat" ""
+  '';
+
+  propagatedBuildInputs = [
+    future
+  ];
+
+  # tests are interacting with the API and not mocking the calls
+  doCheck = false;
+
+  pythonImportsCheck = [ "blockchain" ];
+
+  meta = with lib; {
+    description = "Python client Blockchain Bitcoin Developer API";
+    homepage = "https://github.com/blockchain/api-v1-client-python";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/blockdiag/default.nix b/nixpkgs/pkgs/development/python-modules/blockdiag/default.nix
new file mode 100644
index 000000000000..b2d341b67c1e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blockdiag/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, buildPythonPackage
+, docutils
+, fetchFromGitHub
+, fetchpatch
+, funcparserlib
+, nose
+, pillow
+, ephem
+, pythonOlder
+, pytestCheckHook
+, reportlab
+, setuptools
+, webcolors
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "blockdiag";
+  version = "3.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "blockdiag";
+    repo = "blockdiag";
+    rev = version;
+    hash = "sha256-j8FoNUIJJOaahaol1MRPyY2jcPCEIlaAD4bmM2QKFFI=";
+  };
+
+  patches = [
+    # https://github.com/blockdiag/blockdiag/pull/179
+    (fetchpatch {
+      name = "pillow-10-compatibility.patch";
+      url = "https://github.com/blockdiag/blockdiag/commit/20d780cad84e7b010066cb55f848477957870165.patch";
+      hash = "sha256-t1zWFzAsLL2EUa0nD4Eui4Y5AhAZLRmp/yC9QpzzeUA=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    setuptools
+    funcparserlib
+    pillow
+    webcolors
+    reportlab
+    docutils
+  ];
+
+  nativeCheckInputs = [
+    ephem
+    nose
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "src/blockdiag/tests/"
+  ];
+
+  disabledTests = [
+    # Test require network access
+    "test_app_cleans_up_images"
+  ];
+
+  pythonImportsCheck = [
+    "blockdiag"
+  ];
+
+  meta = with lib; {
+    description = "Generate block-diagram image from spec-text file (similar to Graphviz)";
+    homepage = "http://blockdiag.com/";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/blockfrost-python/default.nix b/nixpkgs/pkgs/development/python-modules/blockfrost-python/default.nix
new file mode 100644
index 000000000000..043384e80bf0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blockfrost-python/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+# Python deps
+, requests
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "blockfrost-python";
+  version = "0.5.3";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "blockfrost";
+    repo = "blockfrost-python";
+    rev = "${version}";
+    hash = "sha256-mQ8avjyLARJONYn18neCyuHEuv3ySyCNMe+P4+Dlxck=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    setuptools
+  ];
+
+  pythonImportsCheck = [ "blockfrost" ];
+
+  meta = with lib; {
+    description = "Python SDK for the Blockfrost.io API";
+    homepage = "https://github.com/blockfrost/blockfrost-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ t4ccer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/blocksat-cli/default.nix b/nixpkgs/pkgs/development/python-modules/blocksat-cli/default.nix
new file mode 100644
index 000000000000..ac53b567e5a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blocksat-cli/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, distro
+, pysnmp
+, python-gnupg
+, qrcode
+, requests
+, sseclient-py
+, zfec
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "blocksat-cli";
+  version = "0.4.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uANAMNoAC4HUoUuR5ldxoiy+LLzZVpKosU5JttXLnqg=";
+  };
+
+  propagatedBuildInputs = [
+    distro
+    pysnmp
+    python-gnupg
+    qrcode
+    requests
+    sseclient-py
+    zfec
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # disable tests which require being connected to the satellite
+    "blocksatcli/test_satip.py"
+    "blocksatcli/api/test_listen.py"
+    "blocksatcli/api/test_msg.py"
+    "blocksatcli/api/test_net.py"
+    # disable tests which require being online
+    "blocksatcli/api/test_order.py"
+  ];
+
+  disabledTests = [
+    "test_monitor_get_stats"
+    "test_monitor_update_with_reporting_enabled"
+    "test_erasure_recovery"
+  ];
+
+  pythonImportsCheck = [
+    "blocksatcli"
+  ];
+
+  meta = with lib; {
+    description = "Blockstream Satellite CLI";
+    homepage = "https://github.com/Blockstream/satellite";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/blosc2/default.nix b/nixpkgs/pkgs/development/python-modules/blosc2/default.nix
new file mode 100644
index 000000000000..a4c1db3d7b70
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blosc2/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, cmake
+, cython
+, ninja
+, oldest-supported-numpy
+, scikit-build
+, setuptools
+, wheel
+
+# propagates
+, msgpack
+, ndindex
+, numpy
+, py-cpuinfo
+, rich
+
+# tests
+, psutil
+, pytestCheckHook
+, torch
+}:
+
+buildPythonPackage rec {
+  pname = "blosc2";
+  version = "2.2.7";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "Blosc";
+    repo = "python-blosc2";
+    rev = "refs/tags/v${version}";
+    fetchSubmodules = true;
+    hash = "sha256-5a94Zm6sYl/nSfkcFbKG7PkyXwLB6bAoIvfaq0yVGHo=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements-runtime.txt \
+      --replace "pytest" ""
+  '';
+
+  nativeBuildInputs = [
+    cmake
+    cython
+    ninja
+    oldest-supported-numpy
+    scikit-build
+    setuptools
+    wheel
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  propagatedBuildInputs = [
+    msgpack
+    ndindex
+    numpy
+    py-cpuinfo
+    rich
+  ];
+
+  nativeCheckInputs = [
+    psutil
+    pytestCheckHook
+    torch
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for the extremely fast Blosc2 compression library";
+    homepage = "https://github.com/Blosc/python-blosc2";
+    changelog = "https://github.com/Blosc/python-blosc2/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bluemaestro-ble/default.nix b/nixpkgs/pkgs/development/python-modules/bluemaestro-ble/default.nix
new file mode 100644
index 000000000000..d6eb12166a8a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bluemaestro-ble/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, bluetooth-data-tools
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "bluemaestro-ble";
+  version = "0.2.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-mJ5JNGN4F9U3WMJQDwiZwuxE0zOirwo1sWF3/bVwXhY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-data-tools
+    bluetooth-sensor-state-data
+    sensor-state-data
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=bluemaestro_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "bluemaestro_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for bluemaestro BLE devices";
+    homepage = "https://github.com/Bluetooth-Devices/bluemaestro-ble";
+    changelog = "https://github.com/Bluetooth-Devices/bluemaestro-ble/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bluepy-devices/default.nix b/nixpkgs/pkgs/development/python-modules/bluepy-devices/default.nix
new file mode 100644
index 000000000000..c1baeedcb5e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bluepy-devices/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, bluepy
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "bluepy-devices";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    pname = "bluepy_devices";
+    inherit  version;
+    sha256 = "02zzzivxq2vifgs65m2rm8pqlsbzsbc419c032irzvfxjx539mr8";
+  };
+
+  propagatedBuildInputs = [ bluepy ];
+
+  # Project has no test
+  doCheck = false;
+  pythonImportsCheck = [ "bluepy_devices" ];
+
+  meta = with lib; {
+    description = "Python BTLE Device Interface for bluepy";
+    homepage = "https://github.com/bimbar/bluepy_devices";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bluepy/default.nix b/nixpkgs/pkgs/development/python-modules/bluepy/default.nix
new file mode 100644
index 000000000000..11930050ba34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bluepy/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pkg-config
+, glib
+}:
+
+buildPythonPackage rec {
+  pname = "bluepy";
+  version = "1.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1v0wjy1rz0rbwghr1z3xhdm06lqn9iig6vr5j2wmymh3w6pysw9a";
+  };
+
+  buildInputs = [ glib ];
+  nativeBuildInputs = [ pkg-config ];
+
+  # tests try to access hardware
+  checkPhase = ''
+    $out/bin/blescan --help > /dev/null
+    $out/bin/sensortag --help > /dev/null
+    $out/bin/thingy52 --help > /dev/null
+  '';
+  pythonImportsCheck = [ "bluepy" ];
+
+  meta = with lib; {
+    description = "Python interface to Bluetooth LE on Linux";
+    homepage = "https://github.com/IanHarvey/bluepy";
+    maintainers = with maintainers; [ georgewhewell ];
+    platforms = platforms.linux;
+    license = licenses.gpl2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bluetooth-adapters/default.nix b/nixpkgs/pkgs/development/python-modules/bluetooth-adapters/default.nix
new file mode 100644
index 000000000000..f681ca357d81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bluetooth-adapters/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, aiohttp
+, async-timeout
+, bleak
+, dbus-fast
+, mac-vendor-lookup
+, myst-parser
+, pytestCheckHook
+, sphinxHook
+, sphinx-rtd-theme
+, usb-devices
+}:
+
+buildPythonPackage rec {
+  pname = "bluetooth-adapters";
+  version = "0.16.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-GJhrL6J/L1+tqa7fN5xwE+8IFZZ9kff2g+04H5M7beY=";
+  };
+
+  postPatch = ''
+    # Drop pytest arguments (coverage, ...)
+    sed -i '/addopts/d' pyproject.toml
+  '';
+
+  outputs = [
+    "out"
+    "doc"
+  ];
+
+  nativeBuildInputs = [
+    myst-parser
+    poetry-core
+    sphinx-rtd-theme
+    sphinxHook
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    bleak
+    dbus-fast
+    mac-vendor-lookup
+    usb-devices
+  ];
+
+  pythonImportsCheck = [
+    "bluetooth_adapters"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Tools to enumerate and find Bluetooth Adapters";
+    homepage = "https://bluetooth-adapters.readthedocs.io/";
+    changelog = "https://github.com/bluetooth-devices/bluetooth-adapters/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = teams.home-assistant.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bluetooth-auto-recovery/default.nix b/nixpkgs/pkgs/development/python-modules/bluetooth-auto-recovery/default.nix
new file mode 100644
index 000000000000..b9cd8bec9f08
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bluetooth-auto-recovery/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, async-timeout
+, bluetooth-adapters
+, btsocket
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pyric
+, pytestCheckHook
+, pythonOlder
+, usb-devices
+}:
+
+buildPythonPackage rec {
+  pname = "bluetooth-auto-recovery";
+  version = "1.2.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-1ytiTIAV00Wk2zqZKRAsstVLuyzPEGBISz0g0ssC5Eo=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    async-timeout
+    bluetooth-adapters
+    btsocket
+    pyric
+    usb-devices
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=bluetooth_auto_recovery --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "bluetooth_auto_recovery"
+  ];
+
+  meta = with lib; {
+    description = "Library for recovering Bluetooth adapters";
+    homepage = "https://github.com/Bluetooth-Devices/bluetooth-auto-recovery";
+    changelog = "https://github.com/Bluetooth-Devices/bluetooth-auto-recovery/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bluetooth-data-tools/default.nix b/nixpkgs/pkgs/development/python-modules/bluetooth-data-tools/default.nix
new file mode 100644
index 000000000000..ca4f1a540bbb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bluetooth-data-tools/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cryptography
+, cython_3
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "bluetooth-data-tools";
+  version = "1.15.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-8Gbw2vXqKvWo30QKExrmH7lUkZBg7zd3o2xWEqGxSBM=";
+  };
+
+  # The project can build both an optimized cython version and an unoptimized
+  # python version. This ensures we fail if we build the wrong one.
+  env.REQUIRE_CYTHON = 1;
+
+  nativeBuildInputs = [
+    cython_3
+    poetry-core
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=bluetooth_data_tools --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "bluetooth_data_tools"
+  ];
+
+  meta = with lib; {
+    description = "Library for converting bluetooth data and packets";
+    homepage = "https://github.com/Bluetooth-Devices/bluetooth-data-tools";
+    changelog = "https://github.com/Bluetooth-Devices/bluetooth-data-tools/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bluetooth-sensor-state-data/default.nix b/nixpkgs/pkgs/development/python-modules/bluetooth-sensor-state-data/default.nix
new file mode 100644
index 000000000000..a74769d0ec57
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bluetooth-sensor-state-data/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, home-assistant-bluetooth
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "bluetooth-sensor-state-data";
+  version = "1.6.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-NC0l3wbQKz4MVM0kHbXBAUol74ir7V/JQgeYCVuyRs4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    home-assistant-bluetooth
+    sensor-state-data
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=bluetooth_sensor_state_data --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "bluetooth_sensor_state_data"
+  ];
+
+  meta = with lib; {
+    description = "Models for storing and converting Bluetooth Sensor State Data";
+    homepage = "https://github.com/bluetooth-devices/bluetooth-sensor-state-data";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/blurhash/default.nix b/nixpkgs/pkgs/development/python-modules/blurhash/default.nix
new file mode 100644
index 000000000000..d0cf2135f1bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/blurhash/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pillow
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "blurhash";
+  version = "1.1.4";
+
+  src = fetchFromGitHub {
+    owner = "halcy";
+    repo = "blurhash-python";
+    # There are no tags: https://github.com/halcy/blurhash-python/issues/4
+    rev = "22e081ef1c24da1bb5c5eaa2c1d6649724deaef8";
+    sha256 = "1qq6mhydlp7q3na4kmaq3871h43wh3pyfyxr4b79bia73wjdylxf";
+  };
+
+  postPatch = ''
+    sed -i '/^addopts/d' setup.cfg
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pillow
+    numpy
+  ];
+
+  pythonImportsCheck = [ "blurhash" ];
+
+  meta = with lib; {
+    description = "Pure-Python implementation of the blurhash algorithm";
+    homepage = "https://github.com/halcy/blurhash-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bme280spi/default.nix b/nixpkgs/pkgs/development/python-modules/bme280spi/default.nix
new file mode 100644
index 000000000000..a7a1e0fb920e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bme280spi/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, spidev
+}:
+
+buildPythonPackage rec {
+  pname = "bme280spi";
+  version = "0.2.0";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "51682acefda6f29eaaf9f37815edbfdd48ef0e9f1509419eceafe7b440eddc6e";
+  };
+
+  propagatedBuildInputs = [
+    spidev
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Library for BME280 sensor through spidev";
+    homepage = "https://github.com/Kuzj/bme280spi";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bme680/default.nix b/nixpkgs/pkgs/development/python-modules/bme680/default.nix
new file mode 100644
index 000000000000..5c6f0f5baff9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bme680/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, smbus-cffi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "bme680";
+  version = "1.1.1";
+
+  src = fetchFromGitHub {
+    owner = "pimoroni";
+    repo = "bme680-python";
+    rev = "v${version}";
+    hash = "sha256-gmdRxMJ0DoCyNcb/bYp746PBi4HktHAAYOcSQJ0Uheg=";
+  };
+
+  propagatedBuildInputs = [
+    smbus-cffi
+  ];
+
+  preBuild = ''
+    cd library
+  '';
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace library/setup.cfg \
+      --replace "smbus" "smbus-cffi"
+  '';
+
+  pythonImportsCheck = [ "bme680" ];
+
+  meta = with lib; {
+    description = "Python library for driving the Pimoroni BME680 Breakout";
+    homepage = "https://github.com/pimoroni/bme680-python";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bnnumerizer/default.nix b/nixpkgs/pkgs/development/python-modules/bnnumerizer/default.nix
new file mode 100644
index 000000000000..c3beaa01cf12
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bnnumerizer/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "bnnumerizer";
+  version = "0.0.2";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Qd9v0Le1GqTsR3a2ZDzt6+5f0R4zXX1W1KIMCFFeXw0=";
+  };
+
+  pythonImportsCheck = [ "bnnumerizer" ];
+
+  # https://github.com/mnansary/bnUnicodeNormalizer/issues/10
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Bangla Number text to String Converter";
+    homepage = "https://github.com/banglakit/number-to-bengali-word";
+    license = licenses.mit;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bnunicodenormalizer/default.nix b/nixpkgs/pkgs/development/python-modules/bnunicodenormalizer/default.nix
new file mode 100644
index 000000000000..19aa011d3782
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bnunicodenormalizer/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "bnunicodenormalizer";
+  version = "0.1.6";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-qVC6+0SnAs25DFzKPHFUOoYPlrRvkGWFptjIVom8wJM=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "bnunicodenormalizer" ];
+
+  meta = with lib; {
+    description = "Bangla Unicode Normalization Toolkit";
+    homepage = "https://github.com/mnansary/bnUnicodeNormalizer";
+    license = licenses.mit;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/boa-api/default.nix b/nixpkgs/pkgs/development/python-modules/boa-api/default.nix
new file mode 100644
index 000000000000..d96b64522622
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boa-api/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "boa-api";
+  version = "0.1.14";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "boalang";
+    repo = "api-python";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-8tt68NLi5ewSKiHdu3gDawTBPylbDmB4zlUUqa7EQuY=";
+  };
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "boaapi"
+  ];
+
+  meta = {
+    homepage = "https://github.com/boalang/api-python";
+    description = "Python client API for communicating with Boa's (https://boa.cs.iastate.edu/) XML-RPC based services";
+    changelog = "https://github.com/boalang/api-python/blob/${src.rev}/Changes.txt";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ swflint ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/boiboite-opener-framework/default.nix b/nixpkgs/pkgs/development/python-modules/boiboite-opener-framework/default.nix
new file mode 100644
index 000000000000..e7a0b017f405
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boiboite-opener-framework/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, packaging
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, scapy
+}:
+
+buildPythonPackage rec {
+  pname = "boiboite-opener-framework";
+  version = "1.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Orange-Cyberdefense";
+    repo = "bof";
+    rev = "refs/tags/${version}";
+    hash = "sha256-atKqHRX24UjF/9Dy0aYXAN+80nBJKCd07FmaR5Vl1q4=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "scapy==2.5.0rc1" "scapy"
+  '';
+
+  propagatedBuildInputs = [
+    packaging
+    scapy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "bof"
+  ];
+
+  disabledTests = [
+    # Tests are using netcat and cat to do UDP connections
+    "test_0101_knxnet_instantiate"
+    "test_0101_modbusnet_instantiate"
+    "test_0102_knxnet_connect"
+    "test_0102_modbusnet_connect"
+    "test_0201_knxnet_send_knxpacket"
+    "test_0201_modbus_send_modbuspacket"
+    "test_0201_udp_send_str_bytes"
+    "test_0202_knxnet_send_knxpacket"
+    "test_0202_modbus_send_modbuspacket"
+    "test_0202_udp_send_receive"
+    "test_0203_knxnet_send_raw"
+    "test_0203_modbus_send_raw"
+    "test_0203_send_receive_timeout"
+    "test_0204_knxnet_receive"
+    "test_0204_modbus_receive"
+    "test_0204_multicast_error_handling"
+    "test_0205_broadcast_error_handling"
+    "test_0301_pndcp_device_raise"
+    "test_0301_tcp_instantiate"
+    "test_0302_tcp_connect"
+    "test_0303_tcp_connect_bad_addr"
+    "test_0304_tcp_connect_bad_port"
+    "test_0401_tcp_send_str_bytes"
+    "test_0402_tcp_send_receive"
+    "test_0802_search_valid"
+  ];
+
+  meta = with lib; {
+    description = "Testing framework for industrial protocols implementations and devices";
+    homepage = "https://github.com/Orange-Cyberdefense/bof";
+    changelog = "https://github.com/Orange-Cyberdefense/bof/releases/tag/${version}";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/boilerpy3/default.nix b/nixpkgs/pkgs/development/python-modules/boilerpy3/default.nix
new file mode 100644
index 000000000000..ef2980959d0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boilerpy3/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+let
+  pname = "boilerpy3";
+  version = "1.0.7";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "jmriebold";
+    repo = "BoilerPy3";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-dhAB0VbBGsSrgYGUlZEYaKA6sQB/f9Bb3alsRuQ8opo=";
+  };
+
+  postPatch = ''
+    # the version mangling in mautrix_signal/get_version.py interacts badly with pythonRelaxDepsHook
+    substituteInPlace setup.py \
+      --replace '>=3.6.*' '>=3.6'
+  '';
+
+
+  pythonImportsCheck = [ "boilerpy3" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jmriebold/BoilerPy3";
+    description = "Python port of Boilerpipe library";
+    changelog = "https://github.com/jmriebold/BoilerPy3/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bokeh/default.nix b/nixpkgs/pkgs/development/python-modules/bokeh/default.nix
new file mode 100644
index 000000000000..adca1fe308b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bokeh/default.nix
@@ -0,0 +1,135 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, fetchFromGitHub
+, pythonOlder
+, substituteAll
+, colorama
+, contourpy
+, jinja2
+, mock
+, numpy
+, nodejs
+, packaging
+, pandas
+, pillow
+, tornado
+, pytestCheckHook
+, pyyaml
+, setuptools
+, setuptools-git-versioning
+, xyzservices
+, beautifulsoup4
+, channels
+, click
+, colorcet
+, coverage
+, firefox
+, geckodriver
+, isort
+, json5
+, nbconvert
+, networkx
+, psutil
+, pygments
+, pygraphviz
+, pytest
+, pytest-asyncio
+, pytest-xdist
+, pytest-timeout
+, requests
+, scipy
+, selenium
+, toml
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "bokeh";
+  # update together with panel which is not straightforward
+  version = "3.2.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-spWbhSTWnsTniGvDZAdEXwqS4fGVMNO/xARSNqG3pv8=";
+  };
+
+  src_test = fetchFromGitHub {
+    owner = "bokeh";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-PK9iLOCcivr4oF9Riq73dzxGfxzWRk3bdrCCpRrTv5g=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./hardcode-nodejs-npmjs-paths.patch;
+      node_bin = "${nodejs}/bin/node";
+      npm_bin = "${nodejs}/bin/npm";
+    })
+  ];
+
+  nativeBuildInputs = [
+    colorama
+    nodejs
+    setuptools
+    setuptools-git-versioning
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    beautifulsoup4
+    channels
+    click
+    colorcet
+    coverage
+    firefox
+    geckodriver
+    isort
+    json5
+    nbconvert
+    networkx
+    psutil
+    pygments
+    pygraphviz
+    pytest
+    pytest-asyncio
+    pytest-xdist
+    pytest-timeout
+    requests
+    scipy
+    selenium
+    toml
+    typing-extensions
+  ];
+
+  propagatedBuildInputs = [
+    jinja2
+    contourpy
+    numpy
+    packaging
+    pandas
+    pillow
+    pyyaml
+    tornado
+    xyzservices
+  ];
+
+  doCheck = false; # need more work
+  pytestFlagsArray = "tests/test_defaults.py";
+  pythonImportsCheck = [ "bokeh" ];
+  preCheck = ''
+    cp -rv ''${src_test}/tests/* ./tests/
+  '';
+
+  meta = {
+    description = "Statistical and novel interactive HTML plots for Python";
+    homepage = "https://github.com/bokeh/bokeh";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ orivej ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bokeh/hardcode-nodejs-npmjs-paths.patch b/nixpkgs/pkgs/development/python-modules/bokeh/hardcode-nodejs-npmjs-paths.patch
new file mode 100644
index 000000000000..4ebfc7e3f2d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bokeh/hardcode-nodejs-npmjs-paths.patch
@@ -0,0 +1,14 @@
+diff -ru a/src/bokeh/util/compiler.py b/src/bokeh/util/compiler.py
+--- a/src/bokeh/util/compiler.py
++++ b/src/bokeh/util/compiler.py
+@@ -411,8 +411,8 @@
+     raise RuntimeError(f'node.js v{version_repr} or higher is needed to allow compilation of custom models ' +
+                        '("conda install nodejs" or follow https://nodejs.org/en/download/)')
+ 
+-_nodejs = None
+-_npmjs = None
++_nodejs = "@node_bin@"
++_npmjs = "@npm_bin@"
+ 
+ def _nodejs_path() -> str:
+     global _nodejs
diff --git a/nixpkgs/pkgs/development/python-modules/boltons/default.nix b/nixpkgs/pkgs/development/python-modules/boltons/default.nix
new file mode 100644
index 000000000000..770c523e31f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boltons/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "boltons";
+  version = "23.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mahmoud";
+    repo = "boltons";
+    rev = "refs/tags/${version}";
+    hash = "sha256-NqlCu0W/BQkLiaLYs9DB1RrEya6KGPfNtpAzKXxoRD0=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Tests bind to localhost
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [
+    "boltons"
+  ];
+
+  meta = with lib; {
+    description = "Constructs, recipes, and snippets extending the Python standard library";
+    longDescription = ''
+      Boltons is a set of over 200 BSD-licensed, pure-Python utilities
+      in the same spirit as - and yet conspicuously missing from - the
+      standard library, including:
+
+      - Atomic file saving, bolted on with fileutils
+      - A highly-optimized OrderedMultiDict, in dictutils
+      - Two types of PriorityQueue, in queueutils
+      - Chunked and windowed iteration, in iterutils
+      - Recursive data structure iteration and merging, with iterutils.remap
+      - Exponential backoff functionality, including jitter, through
+      iterutils.backoff
+      - A full-featured TracebackInfo type, for representing stack
+      traces, in tbutils
+    '';
+    homepage = "https://github.com/mahmoud/boltons";
+    changelog = "https://github.com/mahmoud/boltons/blob/${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ twey ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/boltztrap2/default.nix b/nixpkgs/pkgs/development/python-modules/boltztrap2/default.nix
new file mode 100644
index 000000000000..b8b493258354
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boltztrap2/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, spglib
+, numpy
+, scipy
+, matplotlib
+, ase
+, netcdf4
+, pytest
+, pythonOlder
+, cython
+, cmake
+}:
+
+buildPythonPackage rec {
+  pname = "boltztrap2";
+  version = "22.12.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    pname = "BoltzTraP2";
+    inherit version;
+    hash = "sha256-gzjWAMUJcF5AyDS1Qx7opVbYewaqGgmFMDGWCh/2Wz4=";
+  };
+
+  dontUseCmakeConfigure = true;
+
+  nativeBuildInputs = [
+    cmake
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    spglib
+    numpy
+    scipy
+    matplotlib
+    ase
+    netcdf4
+  ];
+
+  # pypi release does no include files for tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "BoltzTraP2"
+  ];
+
+  meta = with lib; {
+    description = "Band-structure interpolator and transport coefficient calculator";
+    homepage = "http://www.boltztrap.org/";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bond-api/default.nix b/nixpkgs/pkgs/development/python-modules/bond-api/default.nix
new file mode 100644
index 000000000000..e326688501e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bond-api/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, aioresponses
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bond-api";
+  version = "0.1.18";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "prystupa";
+    repo = "bond-api";
+    rev = "v${version}";
+    hash = "sha256-+87/j94eHyW3EMMBK+aXaNTVoNxsixeLusyBsPWa9yM=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "bond_api"
+  ];
+
+  meta = with lib; {
+    description = "Asynchronous Python wrapper library over Bond Local API";
+    homepage = "https://github.com/prystupa/bond-api";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bond-async/default.nix b/nixpkgs/pkgs/development/python-modules/bond-async/default.nix
new file mode 100644
index 000000000000..1278315d78cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bond-async/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, aioresponses
+, orjson
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bond-async";
+  version = "0.2.1";
+
+  disabled = pythonOlder "3.7";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "bondhome";
+    repo = "bond-async";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-YRJHUOYFLf4dtQGIFKHLdUQxWTnZzG1MPirMsGvDor8=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    orjson
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "bond_async"
+  ];
+
+  meta = with lib; {
+    description = "Asynchronous Python wrapper library over Bond Local API";
+    homepage = "https://github.com/bondhome/bond-async";
+    changelog = "https://github.com/bondhome/bond-async/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bonsai/default.nix b/nixpkgs/pkgs/development/python-modules/bonsai/default.nix
new file mode 100644
index 000000000000..43c88c1c73a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bonsai/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, cyrus_sasl
+, openldap
+, gevent
+, tornado
+, trio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "bonsai";
+  version = "1.5.2";
+
+  disabled = pythonOlder "3.8";
+
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "noirello";
+    repo = "bonsai";
+    rev = "v${version}";
+    hash = "sha256-h/PbwQ69fDcmUCazMtxXP1iE0fE1on+WoK+wYgQ9jLs=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  buildInputs = [
+    cyrus_sasl
+    openldap
+  ];
+
+  passthru.optional-dependencies = {
+    gevent = [ gevent ];
+    tornado = [ tornado ];
+    trio = [ trio ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # requires running LDAP server
+    "tests/test_asyncio.py"
+    "tests/test_ldapclient.py"
+    "tests/test_ldapconnection.py"
+    "tests/test_ldapentry.py"
+    "tests/test_ldapreference.py"
+    "tests/test_pool.py"
+  ];
+
+  disabledTests = [
+    # requires running LDAP server
+    "test_set_async_connect"
+  ];
+
+  pythonImportsCheck = [ "bonsai" ];
+
+  meta = {
+    changelog = "https://github.com/noirello/bonsai/blob/${src.rev}/CHANGELOG.rst";
+    description = "Python 3 module for accessing LDAP directory servers";
+    homepage = "https://github.com/noirello/bonsai";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/boolean-py/default.nix b/nixpkgs/pkgs/development/python-modules/boolean-py/default.nix
new file mode 100644
index 000000000000..47afe1ef02b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boolean-py/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "boolean-py";
+  version = "4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bastikr";
+    repo = "boolean.py";
+    rev = "v${version}";
+    hash = "sha256-i6aNzGDhZip9YHXLiuh9crGm2qT2toBU2xze4PDLleg=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "boolean"
+  ];
+
+  meta = with lib; {
+    description = "Implements boolean algebra in one module";
+    homepage = "https://github.com/bastikr/boolean.py";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/booleanoperations/default.nix b/nixpkgs/pkgs/development/python-modules/booleanoperations/default.nix
new file mode 100644
index 000000000000..af718d99aca7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/booleanoperations/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi
+, fonttools, fs, pyclipper, defcon, fontpens
+, setuptools-scm, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "booleanOperations";
+  version = "0.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1f41lb19m8azchl1aqz6j5ycbspb8jsf1cnn42hlydxd68f85ylc";
+    extension = "zip";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [
+    fonttools
+    fs
+    pyclipper
+    defcon
+    fontpens
+  ];
+
+  nativeCheckInputs = [ pytest ];
+
+  meta = with lib; {
+    description = "Boolean operations on paths";
+    homepage = "https://github.com/typemytype/booleanOperations";
+    license = licenses.mit;
+    maintainers = [ maintainers.sternenseemann ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/boost-histogram/default.nix b/nixpkgs/pkgs/development/python-modules/boost-histogram/default.nix
new file mode 100644
index 000000000000..ed29be91d81f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boost-histogram/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, boost
+, numpy
+, pytestCheckHook
+, pytest-benchmark
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "boost-histogram";
+  version = "1.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "boost_histogram";
+    inherit version;
+    hash = "sha256-z5gmz8/hAzUJa1emH2xlafZfAVklnusiUcW/MdhZ11M=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    boost
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-benchmark
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for the C++14 Boost::Histogram library";
+    homepage = "https://github.com/scikit-hep/boost-histogram";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bootstrap/build/default.nix b/nixpkgs/pkgs/development/python-modules/bootstrap/build/default.nix
new file mode 100644
index 000000000000..f4e49bd65605
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bootstrap/build/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, stdenv
+, python
+, build
+, flit-core
+, installer
+, packaging
+, pyproject-hooks
+, tomli
+, makeWrapper
+}:
+let
+  buildBootstrapPythonModule = basePackage: attrs: stdenv.mkDerivation ({
+    pname = "${python.libPrefix}-bootstrap-${basePackage.pname}";
+    inherit (basePackage) version src meta;
+
+    nativeBuildInputs = [ makeWrapper ];
+
+    buildPhase = ''
+      runHook preBuild
+
+      PYTHONPATH="${flit-core}/${python.sitePackages}" \
+        ${python.interpreter} -m flit_core.wheel
+
+      runHook postBuild
+    '';
+
+    installPhase = ''
+      runHook preInstall
+
+      PYTHONPATH="${installer}/${python.sitePackages}" \
+        ${python.interpreter} -m installer \
+          --destdir "$out" --prefix "" dist/*.whl
+
+      runHook postInstall
+    '';
+  } // attrs);
+
+  bootstrap-packaging = buildBootstrapPythonModule packaging {};
+
+  bootstrap-pyproject-hooks = buildBootstrapPythonModule pyproject-hooks {};
+
+  bootstrap-tomli = buildBootstrapPythonModule tomli {};
+
+  sitePkgs = python.sitePackages;
+in
+buildBootstrapPythonModule build {
+  # like the installPhase above, but wrapping the pyproject-build command
+  #   to set up PYTHONPATH with the correct dependencies.
+  # This allows using `pyproject-build` without propagating its dependencies
+  #   into the build environment, which is necessary to prevent
+  #   pythonCatchConflicts from raising false positive alerts.
+  # This would happen whenever the package to build has a dependency on
+  #   another version of a package that is also a dependency of pyproject-build.
+  installPhase = ''
+    runHook preInstall
+
+    PYTHONPATH="${installer}/${python.sitePackages}" \
+      ${python.interpreter} -m installer \
+        --destdir "$out" --prefix "" dist/*.whl
+
+    wrapProgram $out/bin/pyproject-build \
+      --prefix PYTHONPATH : "$out/${sitePkgs}" \
+      --prefix PYTHONPATH : "${bootstrap-pyproject-hooks}/${sitePkgs}" \
+      --prefix PYTHONPATH : "${bootstrap-packaging}/${sitePkgs}" \
+      --prefix PYTHONPATH : "${bootstrap-tomli}/${sitePkgs}"
+
+    runHook postInstall
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bootstrap/flit-core/default.nix b/nixpkgs/pkgs/development/python-modules/bootstrap/flit-core/default.nix
new file mode 100644
index 000000000000..ab9e52538d34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bootstrap/flit-core/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, stdenv
+, python
+, flit-core
+}:
+
+stdenv.mkDerivation {
+  pname = "${python.libPrefix}-bootstrap-${flit-core.pname}";
+  inherit (flit-core) version src patches meta;
+
+  sourceRoot = "source/flit_core";
+
+  buildPhase = ''
+    runHook preBuild
+
+    ${python.interpreter} -m flit_core.wheel
+
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    ${python.interpreter} bootstrap_install.py dist/flit_core-*.whl \
+      --install-root "$out" --installdir "/${python.sitePackages}"
+
+    runHook postInstall
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bootstrap/installer/default.nix b/nixpkgs/pkgs/development/python-modules/bootstrap/installer/default.nix
new file mode 100644
index 000000000000..b569e7fa6dc8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bootstrap/installer/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, stdenv
+, python
+, flit-core
+, installer
+}:
+
+stdenv.mkDerivation {
+  pname = "${python.libPrefix}-bootstrap-${installer.pname}";
+  inherit (installer) version src meta;
+
+  buildPhase = ''
+    runHook preBuild
+
+    PYTHONPATH="${flit-core}/${python.sitePackages}" \
+      ${python.interpreter} -m flit_core.wheel
+
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    PYTHONPATH=src ${python.interpreter} -m installer \
+      --destdir "$out" --prefix "" dist/installer-*.whl
+
+    runHook postInstall
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bork/default.nix b/nixpkgs/pkgs/development/python-modules/bork/default.nix
new file mode 100644
index 000000000000..29357c0cc439
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bork/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+
+, build
+, coloredlogs
+, packaging
+, pip
+, toml
+, twine
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "bork";
+  version = "7.0.2";
+  pyproject = true;
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "duckinator";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-sHCPT6nTenE6mbTifNPtg0OMNIJCs7LRcF8Xuk+MwLs=";
+  };
+
+  propagatedBuildInputs = [
+    build
+    coloredlogs
+    packaging
+    pip
+    toml
+    twine
+    wheel
+  ];
+
+  pythonImportsCheck = [
+    "bork"
+    "bork.api"
+    "bork.cli"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+  pytestFlagsArray = [
+    "-m 'not network'"
+  ];
+
+  meta = with lib; {
+    description = "Python build and release management tool";
+    homepage = "https://github.com/duckinator/bork";
+    maintainers = with maintainers; [ nicoo ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/boschshcpy/default.nix b/nixpkgs/pkgs/development/python-modules/boschshcpy/default.nix
new file mode 100644
index 000000000000..f71c5db849e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boschshcpy/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, getmac
+, pythonOlder
+, requests
+, zeroconf
+}:
+
+buildPythonPackage rec {
+  pname = "boschshcpy";
+  version = "0.2.79";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tschamm";
+    repo = pname;
+    rev = version;
+    hash = "sha256-boz4CiAmB9guhM9irW3m2ZRlt4mmcopWD+/3Y6O/Mxk=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    getmac
+    requests
+    zeroconf
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "boschshcpy"
+  ];
+
+  meta = with lib; {
+    description = "Python module to work with the Bosch Smart Home Controller API";
+    homepage = "https://github.com/tschamm/boschshcpy";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/boto/0005-Don-t-mock-list-subclass.patch b/nixpkgs/pkgs/development/python-modules/boto/0005-Don-t-mock-list-subclass.patch
new file mode 100644
index 000000000000..4add58640d7a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boto/0005-Don-t-mock-list-subclass.patch
@@ -0,0 +1,21 @@
+From: Jochen Sprickerhof <jspricke@debian.org>
+Date: Thu, 15 Dec 2022 07:44:54 +0100
+Subject: Don't mock list subclass
+
+---
+ tests/unit/ec2/test_volume.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tests/unit/ec2/test_volume.py b/tests/unit/ec2/test_volume.py
+index 81d7f55..d4d8e4f 100644
+--- a/tests/unit/ec2/test_volume.py
++++ b/tests/unit/ec2/test_volume.py
+@@ -55,7 +55,7 @@ class VolumeTests(unittest.TestCase):
+     @mock.patch("boto.resultset.ResultSet")
+     def test_startElement_with_name_tagSet_calls_ResultSet(self, ResultSet, startElement):
+         startElement.return_value = None
+-        result_set = mock.Mock(ResultSet([("item", Tag)]))
++        result_set = ResultSet([("item", Tag)])
+         volume = Volume()
+         volume.tags = result_set
+         retval = volume.startElement("tagSet", None, None)
diff --git a/nixpkgs/pkgs/development/python-modules/boto/bug-953970_python3.8-compat.patch b/nixpkgs/pkgs/development/python-modules/boto/bug-953970_python3.8-compat.patch
new file mode 100644
index 000000000000..ac5621042375
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boto/bug-953970_python3.8-compat.patch
@@ -0,0 +1,53 @@
+Index: python-boto/tests/unit/utils/test_utils.py
+===================================================================
+--- python-boto.orig/tests/unit/utils/test_utils.py
++++ python-boto/tests/unit/utils/test_utils.py
+@@ -85,7 +85,7 @@ class TestPassword(unittest.TestCase):
+         def hmac_hashfunc(cls, msg):
+             if not isinstance(msg, bytes):
+                 msg = msg.encode('utf-8')
+-            return hmac.new(b'mysecretkey', msg)
++            return hmac.new(b'mysecretkey', msg, digestmod='sha256')
+
+         class HMACPassword(Password):
+             hashfunc = hmac_hashfunc
+@@ -95,15 +95,15 @@ class TestPassword(unittest.TestCase):
+         password.set('foo')
+
+         self.assertEquals(str(password),
+-                          hmac.new(b'mysecretkey', b'foo').hexdigest())
++                          hmac.new(b'mysecretkey', b'foo', digestmod='sha256').hexdigest())
+
+     def test_constructor(self):
+-        hmac_hashfunc = lambda msg: hmac.new(b'mysecretkey', msg)
++        hmac_hashfunc = lambda msg: hmac.new(b'mysecretkey', msg, digestmod='sha256')
+
+         password = Password(hashfunc=hmac_hashfunc)
+         password.set('foo')
+         self.assertEquals(password.str,
+-                          hmac.new(b'mysecretkey', b'foo').hexdigest())
++                          hmac.new(b'mysecretkey', b'foo', digestmod='sha256').hexdigest())
+
+
+ class TestPythonizeName(unittest.TestCase):
+Index: python-boto/boto/ecs/item.py
+===================================================================
+--- python-boto.orig/boto/ecs/item.py
++++ python-boto/boto/ecs/item.py
+@@ -22,6 +22,7 @@
+
+ import xml.sax
+ import cgi
++from html import escape
+ from boto.compat import six, StringIO
+
+ class ResponseGroup(xml.sax.ContentHandler):
+@@ -67,7 +68,7 @@ class ResponseGroup(xml.sax.ContentHandl
+         return None
+
+     def endElement(self, name, value, connection):
+-        self._xml.write("%s</%s>" % (cgi.escape(value).replace("&amp;amp;", "&amp;"), name))
++        self._xml.write("%s</%s>" % (escape(value).replace("&amp;amp;", "&amp;"), name))
+         if len(self._nodepath) == 0:
+             return
+         obj = None
diff --git a/nixpkgs/pkgs/development/python-modules/boto/default.nix b/nixpkgs/pkgs/development/python-modules/boto/default.nix
new file mode 100644
index 000000000000..f731c0ebcd34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boto/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonAtLeast
+, python
+, nose
+, mock
+, requests
+, httpretty
+}:
+
+buildPythonPackage rec {
+  pname = "boto";
+  version = "2.49.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ea0d3b40a2d852767be77ca343b58a9e3a4b00d9db440efb8da74b4e58025e5a";
+  };
+
+  patches = [
+    # fixes hmac tests
+    # https://sources.debian.org/src/python-boto/2.49.0-4/debian/patches/bug-953970_python3.8-compat.patch/
+    ./bug-953970_python3.8-compat.patch
+    # fixes test_startElement_with_name_tagSet_calls_ResultSet
+    # https://sources.debian.org/src/python-boto/2.49.0-4.1/debian/patches/0005-Don-t-mock-list-subclass.patch/
+    ./0005-Don-t-mock-list-subclass.patch
+  ];
+
+  # boto is deprecated by upstream as of 2021-05-27 (https://github.com/boto/boto/commit/4980ac58764c3d401cb0b9552101f9c61c18f445)
+  # this patch is a bit simpler than https://github.com/boto/boto/pull/3898
+  # as we don't have to take care of pythonOlder "3.3".
+  postPatch = ''
+    substituteInPlace boto/dynamodb/types.py --replace 'from collections import Mapping' 'from collections.abc import Mapping'
+    substituteInPlace boto/mws/connection.py --replace 'import collections' 'import collections.abc as collections'
+  '';
+
+  checkPhase = ''
+    ${python.interpreter} tests/test.py default
+  '';
+
+  nativeCheckInputs = [ nose mock ];
+  propagatedBuildInputs = [ requests httpretty ];
+
+  meta = with lib; {
+    homepage = "https://github.com/boto/boto";
+    license = licenses.mit;
+    description = "Python interface to Amazon Web Services";
+    longDescription = ''
+      The boto module is an integrated interface to current and
+      future infrastructural services offered by Amazon Web
+      Services.  This includes S3, SQS, EC2, among others.
+    '';
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/boto3-stubs/default.nix b/nixpkgs/pkgs/development/python-modules/boto3-stubs/default.nix
new file mode 100644
index 000000000000..ad74f787e7ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boto3-stubs/default.nix
@@ -0,0 +1,1823 @@
+{ lib
+, boto3
+, botocore
+, botocore-stubs
+, buildPythonPackage
+, fetchPypi
+, mypy-boto3-accessanalyzer
+, mypy-boto3-account
+, mypy-boto3-acm
+, mypy-boto3-acm-pca
+, mypy-boto3-alexaforbusiness
+, mypy-boto3-amp
+, mypy-boto3-amplify
+, mypy-boto3-amplifybackend
+, mypy-boto3-amplifyuibuilder
+, mypy-boto3-apigateway
+, mypy-boto3-apigatewaymanagementapi
+, mypy-boto3-apigatewayv2
+, mypy-boto3-appconfig
+, mypy-boto3-appconfigdata
+, mypy-boto3-appfabric
+, mypy-boto3-appflow
+, mypy-boto3-appintegrations
+, mypy-boto3-application-autoscaling
+, mypy-boto3-application-insights
+, mypy-boto3-applicationcostprofiler
+, mypy-boto3-appmesh
+, mypy-boto3-apprunner
+, mypy-boto3-appstream
+, mypy-boto3-appsync
+, mypy-boto3-arc-zonal-shift
+, mypy-boto3-athena
+, mypy-boto3-auditmanager
+, mypy-boto3-autoscaling
+, mypy-boto3-autoscaling-plans
+, mypy-boto3-backup
+, mypy-boto3-backup-gateway
+, mypy-boto3-backupstorage
+, mypy-boto3-batch
+, mypy-boto3-billingconductor
+, mypy-boto3-braket
+, mypy-boto3-budgets
+, mypy-boto3-ce
+, mypy-boto3-chime
+, mypy-boto3-chime-sdk-identity
+, mypy-boto3-chime-sdk-media-pipelines
+, mypy-boto3-chime-sdk-meetings
+, mypy-boto3-chime-sdk-messaging
+, mypy-boto3-chime-sdk-voice
+, mypy-boto3-cleanrooms
+, mypy-boto3-cloud9
+, mypy-boto3-cloudcontrol
+, mypy-boto3-clouddirectory
+, mypy-boto3-cloudformation
+, mypy-boto3-cloudfront
+, mypy-boto3-cloudhsm
+, mypy-boto3-cloudhsmv2
+, mypy-boto3-cloudsearch
+, mypy-boto3-cloudsearchdomain
+, mypy-boto3-cloudtrail
+, mypy-boto3-cloudtrail-data
+, mypy-boto3-cloudwatch
+, mypy-boto3-codeartifact
+, mypy-boto3-codebuild
+, mypy-boto3-codecatalyst
+, mypy-boto3-codecommit
+, mypy-boto3-codedeploy
+, mypy-boto3-codeguru-reviewer
+, mypy-boto3-codeguru-security
+, mypy-boto3-codeguruprofiler
+, mypy-boto3-codepipeline
+, mypy-boto3-codestar
+, mypy-boto3-codestar-connections
+, mypy-boto3-codestar-notifications
+, mypy-boto3-cognito-identity
+, mypy-boto3-cognito-idp
+, mypy-boto3-cognito-sync
+, mypy-boto3-comprehend
+, mypy-boto3-comprehendmedical
+, mypy-boto3-compute-optimizer
+, mypy-boto3-config
+, mypy-boto3-connect
+, mypy-boto3-connect-contact-lens
+, mypy-boto3-connectcampaigns
+, mypy-boto3-connectcases
+, mypy-boto3-connectparticipant
+, mypy-boto3-controltower
+, mypy-boto3-cur
+, mypy-boto3-customer-profiles
+, mypy-boto3-databrew
+, mypy-boto3-dataexchange
+, mypy-boto3-datapipeline
+, mypy-boto3-datasync
+, mypy-boto3-dax
+, mypy-boto3-detective
+, mypy-boto3-devicefarm
+, mypy-boto3-devops-guru
+, mypy-boto3-directconnect
+, mypy-boto3-discovery
+, mypy-boto3-dlm
+, mypy-boto3-dms
+, mypy-boto3-docdb
+, mypy-boto3-docdb-elastic
+, mypy-boto3-drs
+, mypy-boto3-ds
+, mypy-boto3-dynamodb
+, mypy-boto3-dynamodbstreams
+, mypy-boto3-ebs
+, mypy-boto3-ec2
+, mypy-boto3-ec2-instance-connect
+, mypy-boto3-ecr
+, mypy-boto3-ecr-public
+, mypy-boto3-ecs
+, mypy-boto3-efs
+, mypy-boto3-eks
+, mypy-boto3-elastic-inference
+, mypy-boto3-elasticache
+, mypy-boto3-elasticbeanstalk
+, mypy-boto3-elastictranscoder
+, mypy-boto3-elb
+, mypy-boto3-elbv2
+, mypy-boto3-emr
+, mypy-boto3-emr-containers
+, mypy-boto3-emr-serverless
+, mypy-boto3-entityresolution
+, mypy-boto3-es
+, mypy-boto3-events
+, mypy-boto3-evidently
+, mypy-boto3-finspace
+, mypy-boto3-finspace-data
+, mypy-boto3-firehose
+, mypy-boto3-fis
+, mypy-boto3-fms
+, mypy-boto3-forecast
+, mypy-boto3-forecastquery
+, mypy-boto3-frauddetector
+, mypy-boto3-fsx
+, mypy-boto3-gamelift
+, mypy-boto3-gamesparks
+, mypy-boto3-glacier
+, mypy-boto3-globalaccelerator
+, mypy-boto3-glue
+, mypy-boto3-grafana
+, mypy-boto3-greengrass
+, mypy-boto3-greengrassv2
+, mypy-boto3-groundstation
+, mypy-boto3-guardduty
+, mypy-boto3-health
+, mypy-boto3-healthlake
+, mypy-boto3-honeycode
+, mypy-boto3-iam
+, mypy-boto3-identitystore
+, mypy-boto3-imagebuilder
+, mypy-boto3-importexport
+, mypy-boto3-inspector
+, mypy-boto3-inspector2
+, mypy-boto3-internetmonitor
+, mypy-boto3-iot
+, mypy-boto3-iot-data
+, mypy-boto3-iot-jobs-data
+, mypy-boto3-iot-roborunner
+, mypy-boto3-iot1click-devices
+, mypy-boto3-iot1click-projects
+, mypy-boto3-iotanalytics
+, mypy-boto3-iotdeviceadvisor
+, mypy-boto3-iotevents
+, mypy-boto3-iotevents-data
+, mypy-boto3-iotfleethub
+, mypy-boto3-iotfleetwise
+, mypy-boto3-iotsecuretunneling
+, mypy-boto3-iotsitewise
+, mypy-boto3-iotthingsgraph
+, mypy-boto3-iottwinmaker
+, mypy-boto3-iotwireless
+, mypy-boto3-ivs
+, mypy-boto3-ivs-realtime
+, mypy-boto3-ivschat
+, mypy-boto3-kafka
+, mypy-boto3-kafkaconnect
+, mypy-boto3-kendra
+, mypy-boto3-kendra-ranking
+, mypy-boto3-keyspaces
+, mypy-boto3-kinesis
+, mypy-boto3-kinesis-video-archived-media
+, mypy-boto3-kinesis-video-media
+, mypy-boto3-kinesis-video-signaling
+, mypy-boto3-kinesis-video-webrtc-storage
+, mypy-boto3-kinesisanalytics
+, mypy-boto3-kinesisanalyticsv2
+, mypy-boto3-kinesisvideo
+, mypy-boto3-kms
+, mypy-boto3-lakeformation
+, mypy-boto3-lambda
+, mypy-boto3-lex-models
+, mypy-boto3-lex-runtime
+, mypy-boto3-lexv2-models
+, mypy-boto3-lexv2-runtime
+, mypy-boto3-license-manager
+, mypy-boto3-license-manager-linux-subscriptions
+, mypy-boto3-license-manager-user-subscriptions
+, mypy-boto3-lightsail
+, mypy-boto3-location
+, mypy-boto3-logs
+, mypy-boto3-lookoutequipment
+, mypy-boto3-lookoutmetrics
+, mypy-boto3-lookoutvision
+, mypy-boto3-m2
+, mypy-boto3-machinelearning
+, mypy-boto3-macie
+, mypy-boto3-macie2
+, mypy-boto3-managedblockchain
+, mypy-boto3-managedblockchain-query
+, mypy-boto3-marketplace-catalog
+, mypy-boto3-marketplace-entitlement
+, mypy-boto3-marketplacecommerceanalytics
+, mypy-boto3-mediaconnect
+, mypy-boto3-mediaconvert
+, mypy-boto3-medialive
+, mypy-boto3-mediapackage
+, mypy-boto3-mediapackage-vod
+, mypy-boto3-mediapackagev2
+, mypy-boto3-mediastore
+, mypy-boto3-mediastore-data
+, mypy-boto3-mediatailor
+, mypy-boto3-medical-imaging
+, mypy-boto3-memorydb
+, mypy-boto3-meteringmarketplace
+, mypy-boto3-mgh
+, mypy-boto3-mgn
+, mypy-boto3-migration-hub-refactor-spaces
+, mypy-boto3-migrationhub-config
+, mypy-boto3-migrationhuborchestrator
+, mypy-boto3-migrationhubstrategy
+, mypy-boto3-mobile
+, mypy-boto3-mq
+, mypy-boto3-mturk
+, mypy-boto3-mwaa
+, mypy-boto3-neptune
+, mypy-boto3-network-firewall
+, mypy-boto3-networkmanager
+, mypy-boto3-nimble
+, mypy-boto3-oam
+, mypy-boto3-omics
+, mypy-boto3-opensearch
+, mypy-boto3-opensearchserverless
+, mypy-boto3-opsworks
+, mypy-boto3-opsworkscm
+, mypy-boto3-organizations
+, mypy-boto3-osis
+, mypy-boto3-outposts
+, mypy-boto3-panorama
+, mypy-boto3-payment-cryptography
+, mypy-boto3-payment-cryptography-data
+, mypy-boto3-personalize
+, mypy-boto3-personalize-events
+, mypy-boto3-personalize-runtime
+, mypy-boto3-pi
+, mypy-boto3-pinpoint
+, mypy-boto3-pinpoint-email
+, mypy-boto3-pinpoint-sms-voice
+, mypy-boto3-pinpoint-sms-voice-v2
+, mypy-boto3-pipes
+, mypy-boto3-polly
+, mypy-boto3-pricing
+, mypy-boto3-privatenetworks
+, mypy-boto3-proton
+, mypy-boto3-qldb
+, mypy-boto3-qldb-session
+, mypy-boto3-quicksight
+, mypy-boto3-ram
+, mypy-boto3-rbin
+, mypy-boto3-rds
+, mypy-boto3-rds-data
+, mypy-boto3-redshift
+, mypy-boto3-redshift-data
+, mypy-boto3-redshift-serverless
+, mypy-boto3-rekognition
+, mypy-boto3-resiliencehub
+, mypy-boto3-resource-explorer-2
+, mypy-boto3-resource-groups
+, mypy-boto3-resourcegroupstaggingapi
+, mypy-boto3-robomaker
+, mypy-boto3-rolesanywhere
+, mypy-boto3-route53
+, mypy-boto3-route53-recovery-cluster
+, mypy-boto3-route53-recovery-control-config
+, mypy-boto3-route53-recovery-readiness
+, mypy-boto3-route53domains
+, mypy-boto3-route53resolver
+, mypy-boto3-rum
+, mypy-boto3-s3
+, mypy-boto3-s3control
+, mypy-boto3-s3outposts
+, mypy-boto3-sagemaker
+, mypy-boto3-sagemaker-a2i-runtime
+, mypy-boto3-sagemaker-edge
+, mypy-boto3-sagemaker-featurestore-runtime
+, mypy-boto3-sagemaker-geospatial
+, mypy-boto3-sagemaker-metrics
+, mypy-boto3-sagemaker-runtime
+, mypy-boto3-savingsplans
+, mypy-boto3-scheduler
+, mypy-boto3-schemas
+, mypy-boto3-sdb
+, mypy-boto3-secretsmanager
+, mypy-boto3-securityhub
+, mypy-boto3-securitylake
+, mypy-boto3-serverlessrepo
+, mypy-boto3-service-quotas
+, mypy-boto3-servicecatalog
+, mypy-boto3-servicecatalog-appregistry
+, mypy-boto3-servicediscovery
+, mypy-boto3-ses
+, mypy-boto3-sesv2
+, mypy-boto3-shield
+, mypy-boto3-signer
+, mypy-boto3-simspaceweaver
+, mypy-boto3-sms
+, mypy-boto3-sms-voice
+, mypy-boto3-snow-device-management
+, mypy-boto3-snowball
+, mypy-boto3-sns
+, mypy-boto3-sqs
+, mypy-boto3-ssm
+, mypy-boto3-ssm-contacts
+, mypy-boto3-ssm-incidents
+, mypy-boto3-ssm-sap
+, mypy-boto3-sso
+, mypy-boto3-sso-admin
+, mypy-boto3-sso-oidc
+, mypy-boto3-stepfunctions
+, mypy-boto3-storagegateway
+, mypy-boto3-sts
+, mypy-boto3-support
+, mypy-boto3-support-app
+, mypy-boto3-swf
+, mypy-boto3-synthetics
+, mypy-boto3-textract
+, mypy-boto3-timestream-query
+, mypy-boto3-timestream-write
+, mypy-boto3-tnb
+, mypy-boto3-transcribe
+, mypy-boto3-transfer
+, mypy-boto3-translate
+, mypy-boto3-verifiedpermissions
+, mypy-boto3-voice-id
+, mypy-boto3-vpc-lattice
+, mypy-boto3-waf
+, mypy-boto3-waf-regional
+, mypy-boto3-wafv2
+, mypy-boto3-wellarchitected
+, mypy-boto3-wisdom
+, mypy-boto3-workdocs
+, mypy-boto3-worklink
+, mypy-boto3-workmail
+, mypy-boto3-workmailmessageflow
+, mypy-boto3-workspaces
+, mypy-boto3-workspaces-web
+, mypy-boto3-xray
+, types-s3transfer
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "boto3-stubs";
+  version = "1.29.7";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-PrVsWs8ESCmq3eAj1Ox3WPzByx0S6Uy0vIL20HvAruM=";
+  };
+
+  propagatedBuildInputs = [
+    botocore-stubs
+    types-s3transfer
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = {
+    accessanalyzer = [
+      mypy-boto3-accessanalyzer
+    ];
+    account = [
+      mypy-boto3-account
+    ];
+    acm = [
+      mypy-boto3-acm
+    ];
+    acm-pca = [
+      mypy-boto3-acm-pca
+    ];
+    alexaforbusiness = [
+      mypy-boto3-alexaforbusiness
+    ];
+    all = [
+      mypy-boto3-accessanalyzer
+      mypy-boto3-account
+      mypy-boto3-acm
+      mypy-boto3-acm-pca
+      mypy-boto3-alexaforbusiness
+      mypy-boto3-amp
+      mypy-boto3-amplify
+      mypy-boto3-amplifybackend
+      mypy-boto3-amplifyuibuilder
+      mypy-boto3-apigateway
+      mypy-boto3-apigatewaymanagementapi
+      mypy-boto3-apigatewayv2
+      mypy-boto3-appconfig
+      mypy-boto3-appconfigdata
+      mypy-boto3-appfabric
+      mypy-boto3-appflow
+      mypy-boto3-appintegrations
+      mypy-boto3-application-autoscaling
+      mypy-boto3-application-insights
+      mypy-boto3-applicationcostprofiler
+      mypy-boto3-appmesh
+      mypy-boto3-apprunner
+      mypy-boto3-appstream
+      mypy-boto3-appsync
+      mypy-boto3-arc-zonal-shift
+      mypy-boto3-athena
+      mypy-boto3-auditmanager
+      mypy-boto3-autoscaling
+      mypy-boto3-autoscaling-plans
+      mypy-boto3-backup
+      mypy-boto3-backup-gateway
+      mypy-boto3-backupstorage
+      mypy-boto3-batch
+      mypy-boto3-billingconductor
+      mypy-boto3-braket
+      mypy-boto3-budgets
+      mypy-boto3-ce
+      mypy-boto3-chime
+      mypy-boto3-chime-sdk-identity
+      mypy-boto3-chime-sdk-media-pipelines
+      mypy-boto3-chime-sdk-meetings
+      mypy-boto3-chime-sdk-messaging
+      mypy-boto3-chime-sdk-voice
+      mypy-boto3-cleanrooms
+      mypy-boto3-cloud9
+      mypy-boto3-cloudcontrol
+      mypy-boto3-clouddirectory
+      mypy-boto3-cloudformation
+      mypy-boto3-cloudfront
+      mypy-boto3-cloudhsm
+      mypy-boto3-cloudhsmv2
+      mypy-boto3-cloudsearch
+      mypy-boto3-cloudsearchdomain
+      mypy-boto3-cloudtrail
+      mypy-boto3-cloudtrail-data
+      mypy-boto3-cloudwatch
+      mypy-boto3-codeartifact
+      mypy-boto3-codebuild
+      mypy-boto3-codecatalyst
+      mypy-boto3-codecommit
+      mypy-boto3-codedeploy
+      mypy-boto3-codeguru-reviewer
+      mypy-boto3-codeguru-security
+      mypy-boto3-codeguruprofiler
+      mypy-boto3-codepipeline
+      mypy-boto3-codestar
+      mypy-boto3-codestar-connections
+      mypy-boto3-codestar-notifications
+      mypy-boto3-cognito-identity
+      mypy-boto3-cognito-idp
+      mypy-boto3-cognito-sync
+      mypy-boto3-comprehend
+      mypy-boto3-comprehendmedical
+      mypy-boto3-compute-optimizer
+      mypy-boto3-config
+      mypy-boto3-connect
+      mypy-boto3-connect-contact-lens
+      mypy-boto3-connectcampaigns
+      mypy-boto3-connectcases
+      mypy-boto3-connectparticipant
+      mypy-boto3-controltower
+      mypy-boto3-cur
+      mypy-boto3-customer-profiles
+      mypy-boto3-databrew
+      mypy-boto3-dataexchange
+      mypy-boto3-datapipeline
+      mypy-boto3-datasync
+      mypy-boto3-dax
+      mypy-boto3-detective
+      mypy-boto3-devicefarm
+      mypy-boto3-devops-guru
+      mypy-boto3-directconnect
+      mypy-boto3-discovery
+      mypy-boto3-dlm
+      mypy-boto3-dms
+      mypy-boto3-docdb
+      mypy-boto3-docdb-elastic
+      mypy-boto3-drs
+      mypy-boto3-ds
+      mypy-boto3-dynamodb
+      mypy-boto3-dynamodbstreams
+      mypy-boto3-ebs
+      mypy-boto3-ec2
+      mypy-boto3-ec2-instance-connect
+      mypy-boto3-ecr
+      mypy-boto3-ecr-public
+      mypy-boto3-ecs
+      mypy-boto3-efs
+      mypy-boto3-eks
+      mypy-boto3-elastic-inference
+      mypy-boto3-elasticache
+      mypy-boto3-elasticbeanstalk
+      mypy-boto3-elastictranscoder
+      mypy-boto3-elb
+      mypy-boto3-elbv2
+      mypy-boto3-emr
+      mypy-boto3-emr-containers
+      mypy-boto3-emr-serverless
+      mypy-boto3-entityresolution
+      mypy-boto3-es
+      mypy-boto3-events
+      mypy-boto3-evidently
+      mypy-boto3-finspace
+      mypy-boto3-finspace-data
+      mypy-boto3-firehose
+      mypy-boto3-fis
+      mypy-boto3-fms
+      mypy-boto3-forecast
+      mypy-boto3-forecastquery
+      mypy-boto3-frauddetector
+      mypy-boto3-fsx
+      mypy-boto3-gamelift
+      mypy-boto3-gamesparks
+      mypy-boto3-glacier
+      mypy-boto3-globalaccelerator
+      mypy-boto3-glue
+      mypy-boto3-grafana
+      mypy-boto3-greengrass
+      mypy-boto3-greengrassv2
+      mypy-boto3-groundstation
+      mypy-boto3-guardduty
+      mypy-boto3-health
+      mypy-boto3-healthlake
+      mypy-boto3-honeycode
+      mypy-boto3-iam
+      mypy-boto3-identitystore
+      mypy-boto3-imagebuilder
+      mypy-boto3-importexport
+      mypy-boto3-inspector
+      mypy-boto3-inspector2
+      mypy-boto3-internetmonitor
+      mypy-boto3-iot
+      mypy-boto3-iot-data
+      mypy-boto3-iot-jobs-data
+      mypy-boto3-iot-roborunner
+      mypy-boto3-iot1click-devices
+      mypy-boto3-iot1click-projects
+      mypy-boto3-iotanalytics
+      mypy-boto3-iotdeviceadvisor
+      mypy-boto3-iotevents
+      mypy-boto3-iotevents-data
+      mypy-boto3-iotfleethub
+      mypy-boto3-iotfleetwise
+      mypy-boto3-iotsecuretunneling
+      mypy-boto3-iotsitewise
+      mypy-boto3-iotthingsgraph
+      mypy-boto3-iottwinmaker
+      mypy-boto3-iotwireless
+      mypy-boto3-ivs
+      mypy-boto3-ivs-realtime
+      mypy-boto3-ivschat
+      mypy-boto3-kafka
+      mypy-boto3-kafkaconnect
+      mypy-boto3-kendra
+      mypy-boto3-kendra-ranking
+      mypy-boto3-keyspaces
+      mypy-boto3-kinesis
+      mypy-boto3-kinesis-video-archived-media
+      mypy-boto3-kinesis-video-media
+      mypy-boto3-kinesis-video-signaling
+      mypy-boto3-kinesis-video-webrtc-storage
+      mypy-boto3-kinesisanalytics
+      mypy-boto3-kinesisanalyticsv2
+      mypy-boto3-kinesisvideo
+      mypy-boto3-kms
+      mypy-boto3-lakeformation
+      mypy-boto3-lambda
+      mypy-boto3-lex-models
+      mypy-boto3-lex-runtime
+      mypy-boto3-lexv2-models
+      mypy-boto3-lexv2-runtime
+      mypy-boto3-license-manager
+      mypy-boto3-license-manager-linux-subscriptions
+      mypy-boto3-license-manager-user-subscriptions
+      mypy-boto3-lightsail
+      mypy-boto3-location
+      mypy-boto3-logs
+      mypy-boto3-lookoutequipment
+      mypy-boto3-lookoutmetrics
+      mypy-boto3-lookoutvision
+      mypy-boto3-m2
+      mypy-boto3-machinelearning
+      mypy-boto3-macie
+      mypy-boto3-macie2
+      mypy-boto3-managedblockchain
+      mypy-boto3-managedblockchain-query
+      mypy-boto3-marketplace-catalog
+      mypy-boto3-marketplace-entitlement
+      mypy-boto3-marketplacecommerceanalytics
+      mypy-boto3-mediaconnect
+      mypy-boto3-mediaconvert
+      mypy-boto3-medialive
+      mypy-boto3-mediapackage
+      mypy-boto3-mediapackage-vod
+      mypy-boto3-mediapackagev2
+      mypy-boto3-mediastore
+      mypy-boto3-mediastore-data
+      mypy-boto3-mediatailor
+      mypy-boto3-medical-imaging
+      mypy-boto3-memorydb
+      mypy-boto3-meteringmarketplace
+      mypy-boto3-mgh
+      mypy-boto3-mgn
+      mypy-boto3-migration-hub-refactor-spaces
+      mypy-boto3-migrationhub-config
+      mypy-boto3-migrationhuborchestrator
+      mypy-boto3-migrationhubstrategy
+      mypy-boto3-mobile
+      mypy-boto3-mq
+      mypy-boto3-mturk
+      mypy-boto3-mwaa
+      mypy-boto3-neptune
+      mypy-boto3-network-firewall
+      mypy-boto3-networkmanager
+      mypy-boto3-nimble
+      mypy-boto3-oam
+      mypy-boto3-omics
+      mypy-boto3-opensearch
+      mypy-boto3-opensearchserverless
+      mypy-boto3-opsworks
+      mypy-boto3-opsworkscm
+      mypy-boto3-organizations
+      mypy-boto3-osis
+      mypy-boto3-outposts
+      mypy-boto3-panorama
+      mypy-boto3-payment-cryptography
+      mypy-boto3-payment-cryptography-data
+      mypy-boto3-personalize
+      mypy-boto3-personalize-events
+      mypy-boto3-personalize-runtime
+      mypy-boto3-pi
+      mypy-boto3-pinpoint
+      mypy-boto3-pinpoint-email
+      mypy-boto3-pinpoint-sms-voice
+      mypy-boto3-pinpoint-sms-voice-v2
+      mypy-boto3-pipes
+      mypy-boto3-polly
+      mypy-boto3-pricing
+      mypy-boto3-privatenetworks
+      mypy-boto3-proton
+      mypy-boto3-qldb
+      mypy-boto3-qldb-session
+      mypy-boto3-quicksight
+      mypy-boto3-ram
+      mypy-boto3-rbin
+      mypy-boto3-rds
+      mypy-boto3-rds-data
+      mypy-boto3-redshift
+      mypy-boto3-redshift-data
+      mypy-boto3-redshift-serverless
+      mypy-boto3-rekognition
+      mypy-boto3-resiliencehub
+      mypy-boto3-resource-explorer-2
+      mypy-boto3-resource-groups
+      mypy-boto3-resourcegroupstaggingapi
+      mypy-boto3-robomaker
+      mypy-boto3-rolesanywhere
+      mypy-boto3-route53
+      mypy-boto3-route53-recovery-cluster
+      mypy-boto3-route53-recovery-control-config
+      mypy-boto3-route53-recovery-readiness
+      mypy-boto3-route53domains
+      mypy-boto3-route53resolver
+      mypy-boto3-rum
+      mypy-boto3-s3
+      mypy-boto3-s3control
+      mypy-boto3-s3outposts
+      mypy-boto3-sagemaker
+      mypy-boto3-sagemaker-a2i-runtime
+      mypy-boto3-sagemaker-edge
+      mypy-boto3-sagemaker-featurestore-runtime
+      mypy-boto3-sagemaker-geospatial
+      mypy-boto3-sagemaker-metrics
+      mypy-boto3-sagemaker-runtime
+      mypy-boto3-savingsplans
+      mypy-boto3-scheduler
+      mypy-boto3-schemas
+      mypy-boto3-sdb
+      mypy-boto3-secretsmanager
+      mypy-boto3-securityhub
+      mypy-boto3-securitylake
+      mypy-boto3-serverlessrepo
+      mypy-boto3-service-quotas
+      mypy-boto3-servicecatalog
+      mypy-boto3-servicecatalog-appregistry
+      mypy-boto3-servicediscovery
+      mypy-boto3-ses
+      mypy-boto3-sesv2
+      mypy-boto3-shield
+      mypy-boto3-signer
+      mypy-boto3-simspaceweaver
+      mypy-boto3-sms
+      mypy-boto3-sms-voice
+      mypy-boto3-snow-device-management
+      mypy-boto3-snowball
+      mypy-boto3-sns
+      mypy-boto3-sqs
+      mypy-boto3-ssm
+      mypy-boto3-ssm-contacts
+      mypy-boto3-ssm-incidents
+      mypy-boto3-ssm-sap
+      mypy-boto3-sso
+      mypy-boto3-sso-admin
+      mypy-boto3-sso-oidc
+      mypy-boto3-stepfunctions
+      mypy-boto3-storagegateway
+      mypy-boto3-sts
+      mypy-boto3-support
+      mypy-boto3-support-app
+      mypy-boto3-swf
+      mypy-boto3-synthetics
+      mypy-boto3-textract
+      mypy-boto3-timestream-query
+      mypy-boto3-timestream-write
+      mypy-boto3-tnb
+      mypy-boto3-transcribe
+      mypy-boto3-transfer
+      mypy-boto3-translate
+      mypy-boto3-verifiedpermissions
+      mypy-boto3-voice-id
+      mypy-boto3-vpc-lattice
+      mypy-boto3-waf
+      mypy-boto3-waf-regional
+      mypy-boto3-wafv2
+      mypy-boto3-wellarchitected
+      mypy-boto3-wisdom
+      mypy-boto3-workdocs
+      mypy-boto3-worklink
+      mypy-boto3-workmail
+      mypy-boto3-workmailmessageflow
+      mypy-boto3-workspaces
+      mypy-boto3-workspaces-web
+      mypy-boto3-xray
+    ];
+    amp = [
+      mypy-boto3-amp
+    ];
+    amplify = [
+      mypy-boto3-amplify
+    ];
+    amplifybackend = [
+      mypy-boto3-amplifybackend
+    ];
+    amplifyuibuilder = [
+      mypy-boto3-amplifyuibuilder
+    ];
+    apigateway = [
+      mypy-boto3-apigateway
+    ];
+    apigatewaymanagementapi = [
+      mypy-boto3-apigatewaymanagementapi
+    ];
+    apigatewayv2 = [
+      mypy-boto3-apigatewayv2
+    ];
+    appconfig = [
+      mypy-boto3-appconfig
+    ];
+    appconfigdata = [
+      mypy-boto3-appconfigdata
+    ];
+    appfabric = [
+      mypy-boto3-appfabric
+    ];
+    appflow = [
+      mypy-boto3-appflow
+    ];
+    appintegrations = [
+      mypy-boto3-appintegrations
+    ];
+    application-autoscaling = [
+      mypy-boto3-application-autoscaling
+    ];
+    application-insights = [
+      mypy-boto3-application-insights
+    ];
+    applicationcostprofiler = [
+      mypy-boto3-applicationcostprofiler
+    ];
+    appmesh = [
+      mypy-boto3-appmesh
+    ];
+    apprunner = [
+      mypy-boto3-apprunner
+    ];
+    appstream = [
+      mypy-boto3-appstream
+    ];
+    appsync = [
+      mypy-boto3-appsync
+    ];
+    arc-zonal-shift = [
+      mypy-boto3-arc-zonal-shift
+    ];
+    athena = [
+      mypy-boto3-athena
+    ];
+    auditmanager = [
+      mypy-boto3-auditmanager
+    ];
+    autoscaling = [
+      mypy-boto3-autoscaling
+    ];
+    autoscaling-plans = [
+      mypy-boto3-autoscaling-plans
+    ];
+    backup = [
+      mypy-boto3-backup
+    ];
+    backup-gateway = [
+      mypy-boto3-backup-gateway
+    ];
+    backupstorage = [
+      mypy-boto3-backupstorage
+    ];
+    batch = [
+      mypy-boto3-batch
+    ];
+    billingconductor = [
+      mypy-boto3-billingconductor
+    ];
+    boto3 = [
+      boto3
+      botocore
+    ];
+    braket = [
+      mypy-boto3-braket
+    ];
+    budgets = [
+      mypy-boto3-budgets
+    ];
+    ce = [
+      mypy-boto3-ce
+    ];
+    chime = [
+      mypy-boto3-chime
+    ];
+    chime-sdk-identity = [
+      mypy-boto3-chime-sdk-identity
+    ];
+    chime-sdk-media-pipelines = [
+      mypy-boto3-chime-sdk-media-pipelines
+    ];
+    chime-sdk-meetings = [
+      mypy-boto3-chime-sdk-meetings
+    ];
+    chime-sdk-messaging = [
+      mypy-boto3-chime-sdk-messaging
+    ];
+    chime-sdk-voice = [
+      mypy-boto3-chime-sdk-voice
+    ];
+    cleanrooms = [
+      mypy-boto3-cleanrooms
+    ];
+    cloud9 = [
+      mypy-boto3-cloud9
+    ];
+    cloudcontrol = [
+      mypy-boto3-cloudcontrol
+    ];
+    clouddirectory = [
+      mypy-boto3-clouddirectory
+    ];
+    cloudformation = [
+      mypy-boto3-cloudformation
+    ];
+    cloudfront = [
+      mypy-boto3-cloudfront
+    ];
+    cloudhsm = [
+      mypy-boto3-cloudhsm
+    ];
+    cloudhsmv2 = [
+      mypy-boto3-cloudhsmv2
+    ];
+    cloudsearch = [
+      mypy-boto3-cloudsearch
+    ];
+    cloudsearchdomain = [
+      mypy-boto3-cloudsearchdomain
+    ];
+    cloudtrail = [
+      mypy-boto3-cloudtrail
+    ];
+    cloudtrail-data = [
+      mypy-boto3-cloudtrail-data
+    ];
+    cloudwatch = [
+      mypy-boto3-cloudwatch
+    ];
+    codeartifact = [
+      mypy-boto3-codeartifact
+    ];
+    codebuild = [
+      mypy-boto3-codebuild
+    ];
+    codecatalyst = [
+      mypy-boto3-codecatalyst
+    ];
+    codecommit = [
+      mypy-boto3-codecommit
+    ];
+    codedeploy = [
+      mypy-boto3-codedeploy
+    ];
+    codeguru-reviewer = [
+      mypy-boto3-codeguru-reviewer
+    ];
+    codeguru-security = [
+      mypy-boto3-codeguru-security
+    ];
+    codeguruprofiler = [
+      mypy-boto3-codeguruprofiler
+    ];
+    codepipeline = [
+      mypy-boto3-codepipeline
+    ];
+    codestar = [
+      mypy-boto3-codestar
+    ];
+    codestar-connections = [
+      mypy-boto3-codestar-connections
+    ];
+    codestar-notifications = [
+      mypy-boto3-codestar-notifications
+    ];
+    cognito-identity = [
+      mypy-boto3-cognito-identity
+    ];
+    cognito-idp = [
+      mypy-boto3-cognito-idp
+    ];
+    cognito-sync = [
+      mypy-boto3-cognito-sync
+    ];
+    comprehend = [
+      mypy-boto3-comprehend
+    ];
+    comprehendmedical = [
+      mypy-boto3-comprehendmedical
+    ];
+    compute-optimizer = [
+      mypy-boto3-compute-optimizer
+    ];
+    config = [
+      mypy-boto3-config
+    ];
+    connect = [
+      mypy-boto3-connect
+    ];
+    connect-contact-lens = [
+      mypy-boto3-connect-contact-lens
+    ];
+    connectcampaigns = [
+      mypy-boto3-connectcampaigns
+    ];
+    connectcases = [
+      mypy-boto3-connectcases
+    ];
+    connectparticipant = [
+      mypy-boto3-connectparticipant
+    ];
+    controltower = [
+      mypy-boto3-controltower
+    ];
+    cur = [
+      mypy-boto3-cur
+    ];
+    customer-profiles = [
+      mypy-boto3-customer-profiles
+    ];
+    databrew = [
+      mypy-boto3-databrew
+    ];
+    dataexchange = [
+      mypy-boto3-dataexchange
+    ];
+    datapipeline = [
+      mypy-boto3-datapipeline
+    ];
+    datasync = [
+      mypy-boto3-datasync
+    ];
+    dax = [
+      mypy-boto3-dax
+    ];
+    detective = [
+      mypy-boto3-detective
+    ];
+    devicefarm = [
+      mypy-boto3-devicefarm
+    ];
+    devops-guru = [
+      mypy-boto3-devops-guru
+    ];
+    directconnect = [
+      mypy-boto3-directconnect
+    ];
+    discovery = [
+      mypy-boto3-discovery
+    ];
+    dlm = [
+      mypy-boto3-dlm
+    ];
+    dms = [
+      mypy-boto3-dms
+    ];
+    docdb = [
+      mypy-boto3-docdb
+    ];
+    docdb-elastic = [
+      mypy-boto3-docdb-elastic
+    ];
+    drs = [
+      mypy-boto3-drs
+    ];
+    ds = [
+      mypy-boto3-ds
+    ];
+    dynamodb = [
+      mypy-boto3-dynamodb
+    ];
+    dynamodbstreams = [
+      mypy-boto3-dynamodbstreams
+    ];
+    ebs = [
+      mypy-boto3-ebs
+    ];
+    ec2 = [
+      mypy-boto3-ec2
+    ];
+    ec2-instance-connect = [
+      mypy-boto3-ec2-instance-connect
+    ];
+    ecr = [
+      mypy-boto3-ecr
+    ];
+    ecr-public = [
+      mypy-boto3-ecr-public
+    ];
+    ecs = [
+      mypy-boto3-ecs
+    ];
+    efs = [
+      mypy-boto3-efs
+    ];
+    eks = [
+      mypy-boto3-eks
+    ];
+    elastic-inference = [
+      mypy-boto3-elastic-inference
+    ];
+    elasticache = [
+      mypy-boto3-elasticache
+    ];
+    elasticbeanstalk = [
+      mypy-boto3-elasticbeanstalk
+    ];
+    elastictranscoder = [
+      mypy-boto3-elastictranscoder
+    ];
+    elb = [
+      mypy-boto3-elb
+    ];
+    elbv2 = [
+      mypy-boto3-elbv2
+    ];
+    emr = [
+      mypy-boto3-emr
+    ];
+    emr-containers = [
+      mypy-boto3-emr-containers
+    ];
+    emr-serverless = [
+      mypy-boto3-emr-serverless
+    ];
+    entityresolution = [
+      mypy-boto3-entityresolution
+    ];
+    es = [
+      mypy-boto3-es
+    ];
+    essential = [
+      mypy-boto3-cloudformation
+      mypy-boto3-dynamodb
+      mypy-boto3-ec2
+      mypy-boto3-lambda
+      mypy-boto3-rds
+      mypy-boto3-s3
+      mypy-boto3-sqs
+    ];
+    events = [
+      mypy-boto3-events
+    ];
+    evidently = [
+      mypy-boto3-evidently
+    ];
+    finspace = [
+      mypy-boto3-finspace
+    ];
+    finspace-data = [
+      mypy-boto3-finspace-data
+    ];
+    firehose = [
+      mypy-boto3-firehose
+    ];
+    fis = [
+      mypy-boto3-fis
+    ];
+    fms = [
+      mypy-boto3-fms
+    ];
+    forecast = [
+      mypy-boto3-forecast
+    ];
+    forecastquery = [
+      mypy-boto3-forecastquery
+    ];
+    frauddetector = [
+      mypy-boto3-frauddetector
+    ];
+    fsx = [
+      mypy-boto3-fsx
+    ];
+    gamelift = [
+      mypy-boto3-gamelift
+    ];
+    gamesparks = [
+      mypy-boto3-gamesparks
+    ];
+    glacier = [
+      mypy-boto3-glacier
+    ];
+    globalaccelerator = [
+      mypy-boto3-globalaccelerator
+    ];
+    glue = [
+      mypy-boto3-glue
+    ];
+    grafana = [
+      mypy-boto3-grafana
+    ];
+    greengrass = [
+      mypy-boto3-greengrass
+    ];
+    greengrassv2 = [
+      mypy-boto3-greengrassv2
+    ];
+    groundstation = [
+      mypy-boto3-groundstation
+    ];
+    guardduty = [
+      mypy-boto3-guardduty
+    ];
+    health = [
+      mypy-boto3-health
+    ];
+    healthlake = [
+      mypy-boto3-healthlake
+    ];
+    honeycode = [
+      mypy-boto3-honeycode
+    ];
+    iam = [
+      mypy-boto3-iam
+    ];
+    identitystore = [
+      mypy-boto3-identitystore
+    ];
+    imagebuilder = [
+      mypy-boto3-imagebuilder
+    ];
+    importexport = [
+      mypy-boto3-importexport
+    ];
+    inspector = [
+      mypy-boto3-inspector
+    ];
+    inspector2 = [
+      mypy-boto3-inspector2
+    ];
+    internetmonitor = [
+      mypy-boto3-internetmonitor
+    ];
+    iot = [
+      mypy-boto3-iot
+    ];
+    iot-data = [
+      mypy-boto3-iot-data
+    ];
+    iot-jobs-data = [
+      mypy-boto3-iot-jobs-data
+    ];
+    iot-roborunner = [
+      mypy-boto3-iot-roborunner
+    ];
+    iot1click-devices = [
+      mypy-boto3-iot1click-devices
+    ];
+    iot1click-projects = [
+      mypy-boto3-iot1click-projects
+    ];
+    iotanalytics = [
+      mypy-boto3-iotanalytics
+    ];
+    iotdeviceadvisor = [
+      mypy-boto3-iotdeviceadvisor
+    ];
+    iotevents = [
+      mypy-boto3-iotevents
+    ];
+    iotevents-data = [
+      mypy-boto3-iotevents-data
+    ];
+    iotfleethub = [
+      mypy-boto3-iotfleethub
+    ];
+    iotfleetwise = [
+      mypy-boto3-iotfleetwise
+    ];
+    iotsecuretunneling = [
+      mypy-boto3-iotsecuretunneling
+    ];
+    iotsitewise = [
+      mypy-boto3-iotsitewise
+    ];
+    iotthingsgraph = [
+      mypy-boto3-iotthingsgraph
+    ];
+    iottwinmaker = [
+      mypy-boto3-iottwinmaker
+    ];
+    iotwireless = [
+      mypy-boto3-iotwireless
+    ];
+    ivs = [
+      mypy-boto3-ivs
+    ];
+    ivs-realtime = [
+      mypy-boto3-ivs-realtime
+    ];
+    ivschat = [
+      mypy-boto3-ivschat
+    ];
+    kafka = [
+      mypy-boto3-kafka
+    ];
+    kafkaconnect = [
+      mypy-boto3-kafkaconnect
+    ];
+    kendra = [
+      mypy-boto3-kendra
+    ];
+    kendra-ranking = [
+      mypy-boto3-kendra-ranking
+    ];
+    keyspaces = [
+      mypy-boto3-keyspaces
+    ];
+    kinesis = [
+      mypy-boto3-kinesis
+    ];
+    kinesis-video-archived-media = [
+      mypy-boto3-kinesis-video-archived-media
+    ];
+    kinesis-video-media = [
+      mypy-boto3-kinesis-video-media
+    ];
+    kinesis-video-signaling = [
+      mypy-boto3-kinesis-video-signaling
+    ];
+    kinesis-video-webrtc-storage = [
+      mypy-boto3-kinesis-video-webrtc-storage
+    ];
+    kinesisanalytics = [
+      mypy-boto3-kinesisanalytics
+    ];
+    kinesisanalyticsv2 = [
+      mypy-boto3-kinesisanalyticsv2
+    ];
+    kinesisvideo = [
+      mypy-boto3-kinesisvideo
+    ];
+    kms = [
+      mypy-boto3-kms
+    ];
+    lakeformation = [
+      mypy-boto3-lakeformation
+    ];
+    lambda = [
+      mypy-boto3-lambda
+    ];
+    lex-models = [
+      mypy-boto3-lex-models
+    ];
+    lex-runtime = [
+      mypy-boto3-lex-runtime
+    ];
+    lexv2-models = [
+      mypy-boto3-lexv2-models
+    ];
+    lexv2-runtime = [
+      mypy-boto3-lexv2-runtime
+    ];
+    license-manager = [
+      mypy-boto3-license-manager
+    ];
+    license-manager-linux-subscriptions = [
+      mypy-boto3-license-manager-linux-subscriptions
+    ];
+    license-manager-user-subscriptions = [
+      mypy-boto3-license-manager-user-subscriptions
+    ];
+    lightsail = [
+      mypy-boto3-lightsail
+    ];
+    location = [
+      mypy-boto3-location
+    ];
+    logs = [
+      mypy-boto3-logs
+    ];
+    lookoutequipment = [
+      mypy-boto3-lookoutequipment
+    ];
+    lookoutmetrics = [
+      mypy-boto3-lookoutmetrics
+    ];
+    lookoutvision = [
+      mypy-boto3-lookoutvision
+    ];
+    m2 = [
+      mypy-boto3-m2
+    ];
+    machinelearning = [
+      mypy-boto3-machinelearning
+    ];
+    macie = [
+      mypy-boto3-macie
+    ];
+    macie2 = [
+      mypy-boto3-macie2
+    ];
+    managedblockchain = [
+      mypy-boto3-managedblockchain
+    ];
+    managedblockchain-query = [
+      mypy-boto3-managedblockchain-query
+    ];
+    marketplace-catalog = [
+      mypy-boto3-marketplace-catalog
+    ];
+    marketplace-entitlement = [
+      mypy-boto3-marketplace-entitlement
+    ];
+    marketplacecommerceanalytics = [
+      mypy-boto3-marketplacecommerceanalytics
+    ];
+    mediaconnect = [
+      mypy-boto3-mediaconnect
+    ];
+    mediaconvert = [
+      mypy-boto3-mediaconvert
+    ];
+    medialive = [
+      mypy-boto3-medialive
+    ];
+    mediapackage = [
+      mypy-boto3-mediapackage
+    ];
+    mediapackage-vod = [
+      mypy-boto3-mediapackage-vod
+    ];
+    mediapackagev2 = [
+      mypy-boto3-mediapackagev2
+    ];
+    mediastore = [
+      mypy-boto3-mediastore
+    ];
+    mediastore-data = [
+      mypy-boto3-mediastore-data
+    ];
+    mediatailor = [
+      mypy-boto3-mediatailor
+    ];
+    medical-imaging = [
+      mypy-boto3-medical-imaging
+    ];
+    memorydb = [
+      mypy-boto3-memorydb
+    ];
+    meteringmarketplace = [
+      mypy-boto3-meteringmarketplace
+    ];
+    mgh = [
+      mypy-boto3-mgh
+    ];
+    mgn = [
+      mypy-boto3-mgn
+    ];
+    migration-hub-refactor-spaces = [
+      mypy-boto3-migration-hub-refactor-spaces
+    ];
+    migrationhub-config = [
+      mypy-boto3-migrationhub-config
+    ];
+    migrationhuborchestrator = [
+      mypy-boto3-migrationhuborchestrator
+    ];
+    migrationhubstrategy = [
+      mypy-boto3-migrationhubstrategy
+    ];
+    mobile = [
+      mypy-boto3-mobile
+    ];
+    mq = [
+      mypy-boto3-mq
+    ];
+    mturk = [
+      mypy-boto3-mturk
+    ];
+    mwaa = [
+      mypy-boto3-mwaa
+    ];
+    neptune = [
+      mypy-boto3-neptune
+    ];
+    network-firewall = [
+      mypy-boto3-network-firewall
+    ];
+    networkmanager = [
+      mypy-boto3-networkmanager
+    ];
+    nimble = [
+      mypy-boto3-nimble
+    ];
+    oam = [
+      mypy-boto3-oam
+    ];
+    omics = [
+      mypy-boto3-omics
+    ];
+    opensearch = [
+      mypy-boto3-opensearch
+    ];
+    opensearchserverless = [
+      mypy-boto3-opensearchserverless
+    ];
+    opsworks = [
+      mypy-boto3-opsworks
+    ];
+    opsworkscm = [
+      mypy-boto3-opsworkscm
+    ];
+    organizations = [
+      mypy-boto3-organizations
+    ];
+    osis = [
+      mypy-boto3-osis
+    ];
+    outposts = [
+      mypy-boto3-outposts
+    ];
+    panorama = [
+      mypy-boto3-panorama
+    ];
+    payment-cryptography = [
+      mypy-boto3-payment-cryptography
+    ];
+    payment-cryptography-data = [
+      mypy-boto3-payment-cryptography-data
+    ];
+    personalize = [
+      mypy-boto3-personalize
+    ];
+    personalize-events = [
+      mypy-boto3-personalize-events
+    ];
+    personalize-runtime = [
+      mypy-boto3-personalize-runtime
+    ];
+    pi = [
+      mypy-boto3-pi
+    ];
+    pinpoint = [
+      mypy-boto3-pinpoint
+    ];
+    pinpoint-email = [
+      mypy-boto3-pinpoint-email
+    ];
+    pinpoint-sms-voice = [
+      mypy-boto3-pinpoint-sms-voice
+    ];
+    pinpoint-sms-voice-v2 = [
+      mypy-boto3-pinpoint-sms-voice-v2
+    ];
+    pipes = [
+      mypy-boto3-pipes
+    ];
+    polly = [
+      mypy-boto3-polly
+    ];
+    pricing = [
+      mypy-boto3-pricing
+    ];
+    privatenetworks = [
+      mypy-boto3-privatenetworks
+    ];
+    proton = [
+      mypy-boto3-proton
+    ];
+    qldb = [
+      mypy-boto3-qldb
+    ];
+    qldb-session = [
+      mypy-boto3-qldb-session
+    ];
+    quicksight = [
+      mypy-boto3-quicksight
+    ];
+    ram = [
+      mypy-boto3-ram
+    ];
+    rbin = [
+      mypy-boto3-rbin
+    ];
+    rds = [
+      mypy-boto3-rds
+    ];
+    rds-data = [
+      mypy-boto3-rds-data
+    ];
+    redshift = [
+      mypy-boto3-redshift
+    ];
+    redshift-data = [
+      mypy-boto3-redshift-data
+    ];
+    redshift-serverless = [
+      mypy-boto3-redshift-serverless
+    ];
+    rekognition = [
+      mypy-boto3-rekognition
+    ];
+    resiliencehub = [
+      mypy-boto3-resiliencehub
+    ];
+    resource-explorer-2 = [
+      mypy-boto3-resource-explorer-2
+    ];
+    resource-groups = [
+      mypy-boto3-resource-groups
+    ];
+    resourcegroupstaggingapi = [
+      mypy-boto3-resourcegroupstaggingapi
+    ];
+    robomaker = [
+      mypy-boto3-robomaker
+    ];
+    rolesanywhere = [
+      mypy-boto3-rolesanywhere
+    ];
+    route53 = [
+      mypy-boto3-route53
+    ];
+    route53-recovery-cluster = [
+      mypy-boto3-route53-recovery-cluster
+    ];
+    route53-recovery-control-config = [
+      mypy-boto3-route53-recovery-control-config
+    ];
+    route53-recovery-readiness = [
+      mypy-boto3-route53-recovery-readiness
+    ];
+    route53domains = [
+      mypy-boto3-route53domains
+    ];
+    route53resolver = [
+      mypy-boto3-route53resolver
+    ];
+    rum = [
+      mypy-boto3-rum
+    ];
+    s3 = [
+      mypy-boto3-s3
+    ];
+    s3control = [
+      mypy-boto3-s3control
+    ];
+    s3outposts = [
+      mypy-boto3-s3outposts
+    ];
+    sagemaker = [
+      mypy-boto3-sagemaker
+    ];
+    sagemaker-a2i-runtime = [
+      mypy-boto3-sagemaker-a2i-runtime
+    ];
+    sagemaker-edge = [
+      mypy-boto3-sagemaker-edge
+    ];
+    sagemaker-featurestore-runtime = [
+      mypy-boto3-sagemaker-featurestore-runtime
+    ];
+    sagemaker-geospatial = [
+      mypy-boto3-sagemaker-geospatial
+    ];
+    sagemaker-metrics = [
+      mypy-boto3-sagemaker-metrics
+    ];
+    sagemaker-runtime = [
+      mypy-boto3-sagemaker-runtime
+    ];
+    savingsplans = [
+      mypy-boto3-savingsplans
+    ];
+    scheduler = [
+      mypy-boto3-scheduler
+    ];
+    schemas = [
+      mypy-boto3-schemas
+    ];
+    sdb = [
+      mypy-boto3-sdb
+    ];
+    secretsmanager = [
+      mypy-boto3-secretsmanager
+    ];
+    securityhub = [
+      mypy-boto3-securityhub
+    ];
+    securitylake = [
+      mypy-boto3-securitylake
+    ];
+    serverlessrepo = [
+      mypy-boto3-serverlessrepo
+    ];
+    service-quotas = [
+      mypy-boto3-service-quotas
+    ];
+    servicecatalog = [
+      mypy-boto3-servicecatalog
+    ];
+    servicecatalog-appregistry = [
+      mypy-boto3-servicecatalog-appregistry
+    ];
+    servicediscovery = [
+      mypy-boto3-servicediscovery
+    ];
+    ses = [
+      mypy-boto3-ses
+    ];
+    sesv2 = [
+      mypy-boto3-sesv2
+    ];
+    shield = [
+      mypy-boto3-shield
+    ];
+    signer = [
+      mypy-boto3-signer
+    ];
+    simspaceweaver = [
+      mypy-boto3-simspaceweaver
+    ];
+    sms = [
+      mypy-boto3-sms
+    ];
+    sms-voice = [
+      mypy-boto3-sms-voice
+    ];
+    snow-device-management = [
+      mypy-boto3-snow-device-management
+    ];
+    snowball = [
+      mypy-boto3-snowball
+    ];
+    sns = [
+      mypy-boto3-sns
+    ];
+    sqs = [
+      mypy-boto3-sqs
+    ];
+    ssm = [
+      mypy-boto3-ssm
+    ];
+    ssm-contacts = [
+      mypy-boto3-ssm-contacts
+    ];
+    ssm-incidents = [
+      mypy-boto3-ssm-incidents
+    ];
+    ssm-sap = [
+      mypy-boto3-ssm-sap
+    ];
+    sso = [
+      mypy-boto3-sso
+    ];
+    sso-admin = [
+      mypy-boto3-sso-admin
+    ];
+    sso-oidc = [
+      mypy-boto3-sso-oidc
+    ];
+    stepfunctions = [
+      mypy-boto3-stepfunctions
+    ];
+    storagegateway = [
+      mypy-boto3-storagegateway
+    ];
+    sts = [
+      mypy-boto3-sts
+    ];
+    support = [
+      mypy-boto3-support
+    ];
+    support-app = [
+      mypy-boto3-support-app
+    ];
+    swf = [
+      mypy-boto3-swf
+    ];
+    synthetics = [
+      mypy-boto3-synthetics
+    ];
+    textract = [
+      mypy-boto3-textract
+    ];
+    timestream-query = [
+      mypy-boto3-timestream-query
+    ];
+    timestream-write = [
+      mypy-boto3-timestream-write
+    ];
+    tnb = [
+      mypy-boto3-tnb
+    ];
+    transcribe = [
+      mypy-boto3-transcribe
+    ];
+    transfer = [
+      mypy-boto3-transfer
+    ];
+    translate = [
+      mypy-boto3-translate
+    ];
+    verifiedpermissions = [
+      mypy-boto3-verifiedpermissions
+    ];
+    voice-id = [
+      mypy-boto3-voice-id
+    ];
+    vpc-lattice = [
+      mypy-boto3-vpc-lattice
+    ];
+    waf = [
+      mypy-boto3-waf
+    ];
+    waf-regional = [
+      mypy-boto3-waf-regional
+    ];
+    wafv2 = [
+      mypy-boto3-wafv2
+    ];
+    wellarchitected = [
+      mypy-boto3-wellarchitected
+    ];
+    wisdom = [
+      mypy-boto3-wisdom
+    ];
+    workdocs = [
+      mypy-boto3-workdocs
+    ];
+    worklink = [
+      mypy-boto3-worklink
+    ];
+    workmail = [
+      mypy-boto3-workmail
+    ];
+    workmailmessageflow = [
+      mypy-boto3-workmailmessageflow
+    ];
+    workspaces = [
+      mypy-boto3-workspaces
+    ];
+    workspaces-web = [
+      mypy-boto3-workspaces-web
+    ];
+    xray = [
+      mypy-boto3-xray
+    ];
+  };
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "boto3-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Type annotations for boto3";
+    homepage = "https://pypi.org/project/boto3-stubs/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/boto3/default.nix b/nixpkgs/pkgs/development/python-modules/boto3/default.nix
new file mode 100644
index 000000000000..779871db10ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boto3/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, botocore
+, jmespath
+, s3transfer
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "boto3";
+  version = "1.28.57"; # N.B: if you change this, change botocore and awscli to a matching version
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "boto";
+    repo = pname;
+    rev = version;
+    hash = "sha256-+kuILCUK10tvpfTEAHZGvKKmpw6Pgn+v2kQkwCkPMKg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    botocore
+    jmespath
+    s3transfer
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "boto3"
+  ];
+
+  disabledTestPaths = [
+    # Integration tests require networking
+    "tests/integration"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/boto/boto3";
+    changelog = "https://github.com/boto/boto3/blob/${version}/CHANGELOG.rst";
+    license = licenses.asl20;
+    description = "AWS SDK for Python";
+    longDescription = ''
+      Boto3 is the Amazon Web Services (AWS) Software Development Kit (SDK) for
+      Python, which allows Python developers to write software that makes use of
+      services like Amazon S3 and Amazon EC2.
+    '';
+    maintainers = with maintainers; [ anthonyroussel ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/botocore-stubs/default.nix b/nixpkgs/pkgs/development/python-modules/botocore-stubs/default.nix
new file mode 100644
index 000000000000..0d65528f6dfa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/botocore-stubs/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, poetry-core
+, pythonOlder
+, types-awscrt
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "botocore-stubs";
+  version = "1.31.79";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "botocore_stubs";
+    inherit version;
+    hash = "sha256-ZEiLnziQX4pgBBmY+dyUV1QiLZAKM0W0SQWWZ4kMLBc=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    types-awscrt
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [
+    "botocore-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Type annotations and code completion for botocore";
+    homepage = "https://pypi.org/project/botocore-stubs/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/botocore/default.nix b/nixpkgs/pkgs/development/python-modules/botocore/default.nix
new file mode 100644
index 000000000000..ddb9d35d05fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/botocore/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python-dateutil
+, jmespath
+, urllib3
+, pytestCheckHook
+, jsonschema
+}:
+
+buildPythonPackage rec {
+  pname = "botocore";
+  version = "1.31.57"; # N.B: if you change this, change boto3 and awscli to a matching version
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MBQ2F0Y1vsc5siW4QPw2XKAOXBpj5bKhnuZ50gTgG3g=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    jmespath
+    urllib3
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    jsonschema
+  ];
+
+  disabledTestPaths = [
+    # Integration tests require networking
+    "tests/integration"
+
+    # Disable slow tests (only run unit tests)
+    "tests/functional"
+  ];
+
+  pythonImportsCheck = [
+    "botocore"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/boto/botocore";
+    changelog = "https://github.com/boto/botocore/blob/${version}/CHANGELOG.rst";
+    license = licenses.asl20;
+    description = "A low-level interface to a growing number of Amazon Web Services";
+    maintainers = with maintainers; [ anthonyroussel ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/botorch/default.nix b/nixpkgs/pkgs/development/python-modules/botorch/default.nix
new file mode 100644
index 000000000000..13bf46242439
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/botorch/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, gpytorch
+, linear_operator
+, multipledispatch
+, pyro-ppl
+, setuptools
+, setuptools-scm
+, wheel
+, torch
+, scipy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "botorch";
+  version = "0.9.4";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pytorch";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-MSbGjv+5/znoUeveePuTrTOMTQMQvsc064G7WoHfBMI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    gpytorch
+    linear_operator
+    multipledispatch
+    pyro-ppl
+    scipy
+    torch
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+  pythonImportsCheck = [ "botorch" ];
+
+  meta = with lib; {
+    description = "Bayesian Optimization in PyTorch";
+    homepage = "https://botorch.org";
+    license = licenses.mit;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bottle/default.nix b/nixpkgs/pkgs/development/python-modules/bottle/default.nix
new file mode 100644
index 000000000000..e64883140316
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bottle/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "bottle";
+  version = "0.12.25";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-4anJSXCubXELP7RSYpTf64byy0qB7/OkuY3ED7Dl4CE=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    cd test
+  '';
+
+  disabledTests = [
+    "test_delete_cookie"
+    "test_error"
+    "test_error_in_generator_callback"
+    # timing sensitive
+    "test_ims"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    homepage = "https://bottlepy.org/";
+    description = "A fast and simple micro-framework for small web-applications";
+    license = licenses.mit;
+    maintainers = with maintainers; [ koral ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bottleneck/default.nix b/nixpkgs/pkgs/development/python-modules/bottleneck/default.nix
new file mode 100644
index 000000000000..e327e135c48c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bottleneck/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pytestCheckHook
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bottleneck";
+  version = "1.3.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Bottleneck";
+    inherit version;
+    hash = "sha256-4UZ+NzrUado0DtD/KDIU1lMcwIv9yiCDNho6pkcGgfg=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "$out/${python.sitePackages}"
+  ];
+
+  disabledTests = [
+    "test_make_c_files"
+  ];
+
+  pythonImportsCheck = [
+    "bottleneck"
+  ];
+
+  meta = with lib; {
+    description = "Fast NumPy array functions";
+    homepage = "https://github.com/pydata/bottleneck";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bottombar/default.nix b/nixpkgs/pkgs/development/python-modules/bottombar/default.nix
new file mode 100644
index 000000000000..ab7a9b06d64f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bottombar/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+}:
+
+buildPythonPackage rec {
+  pname = "bottombar";
+  version = "2.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "evalf";
+    repo = "bottombar";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-W+Cbcgb664nVT/nsFdDruT688JWG2NZnF5hDDezTgnw=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  # The package only has some "interactive" tests where a user must check for
+  # the correct output and hit enter after every check
+  doCheck = false;
+  pythonImportsCheck = [
+    "bottombar"
+  ];
+
+  meta = with lib; {
+    description = "Context manager that prints a status line at the bottom of a terminal window";
+    homepage = "https://github.com/evalf/bottombar";
+    changelog = "https://github.com/evalf/bottombar/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ conni2461 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/boxx/default.nix b/nixpkgs/pkgs/development/python-modules/boxx/default.nix
new file mode 100644
index 000000000000..7dd580c345a7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/boxx/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, xvfb-run
+, matplotlib
+, scikit-image
+, numpy
+, pandas
+, imageio
+, snakeviz
+, fn
+, pyopengl
+, seaborn
+, torch
+, pythonOlder
+, torchvision
+}:
+
+buildPythonPackage rec {
+  pname = "boxx";
+  version = "0.10.12";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-pumkDVyotm8bJEl/rrpNSsP8KZIVIgThGFB/Sy4OdUs=";
+  };
+
+  propagatedBuildInputs = [
+    matplotlib
+    scikit-image
+    numpy
+    pandas
+    imageio
+    snakeviz
+    fn
+    pyopengl
+    seaborn
+  ];
+
+  nativeCheckInputs = [
+    xvfb-run
+    torch
+    torchvision
+  ];
+
+  pythonImportsCheck = [
+    "boxx"
+  ];
+
+  checkPhase = ''
+    xvfb-run ${python.interpreter} -m unittest
+  '';
+
+  meta = with lib; {
+    description = "Tool-box for efficient build and debug for Scientific Computing and Computer Vision";
+    homepage = "https://github.com/DIYer22/boxx";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lucasew ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bpycv/bpycv-test.py b/nixpkgs/pkgs/development/python-modules/bpycv/bpycv-test.py
new file mode 100644
index 000000000000..1bf2b9f5a8d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bpycv/bpycv-test.py
@@ -0,0 +1,80 @@
+# based on https://github.com/DIYer22/bpycv/blob/c576e01622d87eb3534f73bf1a5686bd2463de97/example/ycb_demo.py
+import bpy
+import bpycv
+
+import os
+import glob
+import random
+from pathlib import Path
+
+example_data_dir = os.environ['BPY_EXAMPLE_DATA']
+out_dir = Path(os.environ['out'])
+out_dir.mkdir(parents=True, exist_ok=True)
+
+models = sorted(glob.glob(os.path.join(example_data_dir, "model", "*", "*.obj")))
+cat_id_to_model_path = dict(enumerate(sorted(models), 1))
+
+distractors = sorted(glob.glob(os.path.join(example_data_dir, "distractor", "*.obj")))
+
+bpycv.clear_all()
+bpy.context.scene.frame_set(1)
+bpy.context.scene.render.engine = "CYCLES"
+bpy.context.scene.cycles.samples = 32
+bpy.context.scene.render.resolution_y = 1024
+bpy.context.scene.render.resolution_x = 1024
+bpy.context.view_layer.cycles.denoising_store_passes = False
+
+# A transparency stage for holding rigid body
+stage = bpycv.add_stage(transparency=True)
+
+bpycv.set_cam_pose(cam_radius=1, cam_deg=45)
+
+hdri_dir = os.path.join(example_data_dir, "background_and_light")
+hdri_manager = bpycv.HdriManager(
+    hdri_dir=hdri_dir, download=False
+)  # if download is True, will auto download .hdr file from HDRI Haven
+hdri_path = hdri_manager.sample()
+bpycv.load_hdri_world(hdri_path, random_rotate_z=True)
+
+# load 5 objects
+for index in range(5):
+    cat_id = random.choice(list(cat_id_to_model_path))
+    model_path = cat_id_to_model_path[cat_id]
+    obj = bpycv.load_obj(model_path)
+    obj.location = (
+        random.uniform(-0.2, 0.2),
+        random.uniform(-0.2, 0.2),
+        random.uniform(0.1, 0.3),
+    )
+    obj.rotation_euler = [random.uniform(-3.1415, 3.1415) for _ in range(3)]
+    # set each instance a unique inst_id, which is used to generate instance annotation.
+    obj["inst_id"] = cat_id * 1000 + index
+    with bpycv.activate_obj(obj):
+        bpy.ops.rigidbody.object_add()
+
+# load 6 distractors
+for index in range(6):
+    distractor_path = random.choice(distractors)
+    target_size = random.uniform(0.1, 0.3)
+    distractor = bpycv.load_distractor(distractor_path, target_size=target_size)
+    distractor.location = (
+        random.uniform(-0.2, 0.2),
+        random.uniform(-0.2, 0.2),
+        random.uniform(0.1, 0.3),
+    )
+    distractor.rotation_euler = [random.uniform(-3.1415, 3.1415) for _ in range(3)]
+    with bpycv.activate_obj(distractor):
+        bpy.ops.rigidbody.object_add()
+
+# run pyhsic engine for 20 frames
+for i in range(20):
+    bpy.context.scene.frame_set(bpy.context.scene.frame_current + 1)
+
+# render image, instance annoatation and depth in one line code
+result = bpycv.render_data()
+
+
+result.save(dataset_dir=str(out_dir.resolve()), fname="0", save_blend=True)
+print(f'Save to "{out_dir}"')
+print(f'Open "{out_dir}/vis/" to see visualize result.')
+
diff --git a/nixpkgs/pkgs/development/python-modules/bpycv/default.nix b/nixpkgs/pkgs/development/python-modules/bpycv/default.nix
new file mode 100644
index 000000000000..84085488ae4c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bpycv/default.nix
@@ -0,0 +1,67 @@
+{ stdenv
+, lib
+, beautifulsoup4
+, blender
+, boxx
+, bpycv
+, buildPythonPackage
+, fetchFromGitHub
+, fetchPypi
+, fetchurl
+, minexr
+, opencv4
+, python3Packages
+, requests
+, runCommand
+, writeText
+, zcs
+}:
+
+buildPythonPackage rec {
+  pname = "bpycv";
+  version = "0.4.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-qqNGemDB0aagCXjrECuh6kLksf+KujPejpnXVqFG8GY=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    minexr
+    zcs
+    requests
+    opencv4
+    boxx
+  ];
+
+  postPatch = ''
+    sed -i 's/opencv-python//g' requirements.txt
+  '';
+
+  # pythonImportsCheck = [ "bpycv" ]; # this import depends on bpy that is only available inside blender
+  doCheck = false;
+
+  passthru.tests = {
+    render = runCommand "bpycv-render-test" {
+      BPY_EXAMPLE_DATA = fetchFromGitHub {
+        owner = "DIYer22";
+        repo = "bpycv_example_data";
+        hash = "sha256-dGb6KvbXTGTu5f4AqhA+i4AwTqBoR5SdXk0vsMEcD3Q=";
+        rev = "6ce0e65c107d572011394da16ffdf851e988dbb4";
+      };
+    } ''
+      ${blender.withPackages (ps: [ps.bpycv])}/bin/blender-wrapped -b -P ${./bpycv-test.py}
+    '';
+  };
+
+  meta = with lib; {
+    description = "Computer vision utils for Blender";
+    homepage = "https://github.com/DIYer22/bpycv";
+    license = licenses.mit;
+    maintainers = [ maintainers.lucasew ];
+    broken = stdenv.isAarch64;
+    inherit (blender.meta) platforms;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bpython/default.nix b/nixpkgs/pkgs/development/python-modules/bpython/default.nix
new file mode 100644
index 000000000000..beb3d86cb70c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bpython/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, curtsies
+, cwcwidth
+, greenlet
+, jedi
+, pygments
+, pytestCheckHook
+, pythonOlder
+, pyperclip
+, pyxdg
+, requests
+, substituteAll
+, typing-extensions
+, urwid
+, watchdog
+}:
+
+buildPythonPackage rec {
+  pname = "bpython";
+  version = "0.24";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-mHNv/XqMSP0r+1PYmKR19CQb3gtnISVwavBNnQj9Pb0=";
+  };
+
+  propagatedBuildInputs = [
+    curtsies
+    cwcwidth
+    greenlet
+    jedi
+    pygments
+    pyperclip
+    pyxdg
+    requests
+    typing-extensions
+    urwid
+    watchdog
+  ];
+
+  postInstall = ''
+    substituteInPlace "$out/share/applications/org.bpython-interpreter.bpython.desktop" \
+      --replace "Exec=/usr/bin/bpython" "Exec=$out/bin/bpython"
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "bpython"
+  ];
+
+  disabledTests = [
+    # Check for syntax error ends with an AssertionError
+    "test_syntaxerror"
+  ];
+
+  meta = with lib; {
+    description = "A fancy curses interface to the Python interactive interpreter";
+    homepage = "https://bpython-interpreter.org/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ flokli dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bqplot/default.nix b/nixpkgs/pkgs/development/python-modules/bqplot/default.nix
new file mode 100644
index 000000000000..4ae4aae24263
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bqplot/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, jupyter-packaging
+, jupyterlab
+, bqscales
+, ipywidgets
+, numpy
+, pandas
+, traitlets
+, traittypes
+}:
+
+buildPythonPackage rec {
+  pname = "bqplot";
+  version = "0.12.42";
+
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-mUhvdMq8/f+EHf7kG6bStHeC2Fo0/zajSiI9Q//Apyk=";
+  };
+
+  # upstream seems in flux for 0.13 release. they seem to want to migrate from
+  # jupyter_packaging to hatch, so let's patch instead of fixing upstream
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "jupyter_packaging~=" "jupyter_packaging>=" \
+      --replace "jupyterlab~=" "jupyterlab>="
+  '';
+
+  nativeBuildInputs = [
+    jupyter-packaging
+    jupyterlab
+  ];
+
+  propagatedBuildInputs = [
+    bqscales
+    ipywidgets
+    numpy
+    pandas
+    traitlets
+    traittypes
+  ];
+
+  # no tests in PyPI dist, and not obvious to me how to build the js files from GitHub
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "bqplot"
+    "bqplot.pyplot"
+  ];
+
+  meta = {
+    description = "2D plotting library for Jupyter based on Grammar of Graphics";
+    homepage = "https://bqplot.github.io/bqplot";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bqscales/default.nix b/nixpkgs/pkgs/development/python-modules/bqscales/default.nix
new file mode 100644
index 000000000000..a5fae24a13eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bqscales/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, hatchling
+, hatch-jupyter-builder
+, jupyterlab
+, ipywidgets
+, numpy
+, traitlets
+, traittypes
+}:
+
+buildPythonPackage rec {
+  pname = "bqscales";
+  version = "0.3.3";
+  pyproject = true;
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-SlnNw4dWOzRedwIN3kCyl95qVqkY92QGOMS3Eyoqk0I=";
+  };
+
+  nativeBuildInputs = [
+    hatch-jupyter-builder
+    hatchling
+    jupyterlab
+  ];
+
+  propagatedBuildInputs = [
+    ipywidgets
+    numpy
+    traitlets
+    traittypes
+  ];
+
+  env.SKIP_JUPYTER_BUILDER = 1;
+
+  # no tests in PyPI dist
+  doCheck = false;
+
+  pythonImportsCheck = [ "bqscales" ];
+
+  meta = {
+    description = "Grammar of Graphics scales for bqplot and other Jupyter widgets libraries";
+    homepage = "https://github.com/bqplot/bqscales";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/braceexpand/default.nix b/nixpkgs/pkgs/development/python-modules/braceexpand/default.nix
new file mode 100644
index 000000000000..40977d139c10
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/braceexpand/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "braceexpand";
+  version = "0.1.7";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "01gpcnksnqv6np28i4x8s3wkngawzgs99zvjfia57spa42ykkrg6";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "braceexpand" ];
+
+  meta = with lib; {
+    description = "Bash-style brace expansion for Python";
+    homepage = "https://github.com/trendels/braceexpand";
+    changelog = "https://github.com/trendels/braceexpand/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ newam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bracex/default.nix b/nixpkgs/pkgs/development/python-modules/bracex/default.nix
new file mode 100644
index 000000000000..d2b8bb06ff9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bracex/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hatchling
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bracex";
+  version = "2.4";
+  format = "pyproject";
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-on6vHfQs9WH+1Yt6jz/fEp0eoWqB4frdHReYm8Y4S+s=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "bracex" ];
+
+  meta = with lib; {
+    description = "Bash style brace expansion for Python";
+    homepage = "https://github.com/facelessuser/bracex";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/braintree/default.nix b/nixpkgs/pkgs/development/python-modules/braintree/default.nix
new file mode 100644
index 000000000000..40715bcdacc1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/braintree/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "braintree";
+  version = "4.14.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = "braintree_python";
+    rev = version;
+    hash = "sha256-qeqQX+qyy78sLe+46CA4D6VAxNHUVahS4LMYdGDzc2k=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    nose
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "braintree"
+  ];
+
+  disabledTestPaths = [
+    # Don't test integrations
+    "tests/integration"
+  ];
+
+  meta = with lib; {
+    description = "Python library for integration with Braintree";
+    homepage = "https://github.com/braintree/braintree_python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/branca/default.nix b/nixpkgs/pkgs/development/python-modules/branca/default.nix
new file mode 100644
index 000000000000..119e166e3845
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/branca/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, jinja2
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, selenium
+}:
+
+buildPythonPackage rec {
+  pname = "branca";
+  version = "0.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "python-visualization";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-DH+XBj+VcS56+nAOGjjrKG0dnSKrqiU6N5vkILm+vSE=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  postPatch = ''
+    # We don't want flake8
+    rm setup.cfg
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    jinja2
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    selenium
+  ];
+
+  pythonImportsCheck = [
+    "branca"
+  ];
+
+  disabledTestPaths = [
+    # Some tests require a browser
+    "tests/test_utilities.py"
+  ];
+
+  disabledTests = [
+    "test_rendering_utf8_iframe"
+    "test_rendering_figure_notebook"
+  ];
+
+  meta = with lib; {
+    description = "Generate complex HTML+JS pages with Python";
+    homepage = "https://github.com/python-visualization/branca";
+    changelog = "https://github.com/python-visualization/branca/blob/v${version}/CHANGES.txt";
+    license = with licenses; [ mit ];
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bravado-core/default.nix b/nixpkgs/pkgs/development/python-modules/bravado-core/default.nix
new file mode 100644
index 000000000000..86c7f7b57c91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bravado-core/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+  # build inputs
+, jsonref
+, jsonschema
+, python-dateutil
+, pyyaml
+, requests
+, simplejson
+, six
+, swagger-spec-validator
+, pytz
+, msgpack
+  # check inputs
+, pytestCheckHook
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "bravado-core";
+  version = "6.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Yelp";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-/ePs3znbwamMHHzb/PD4UHq+7v0j1r1X3J3Bnb4S2VU=";
+  };
+
+  propagatedBuildInputs = [
+    jsonref
+    jsonschema # with optional dependencies for format
+    python-dateutil
+    pyyaml
+    requests
+    simplejson
+    six
+    swagger-spec-validator
+    pytz
+    msgpack
+  ] ++ jsonschema.optional-dependencies.format;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  checkInputs = [
+    mock
+  ];
+
+  pythonImportsCheck = [
+    "bravado_core"
+  ];
+
+  disabledTestPaths = [
+    # skip benchmarks
+    "tests/profiling"
+    # take too long to run
+    "tests/spec/Spec"
+  ];
+
+  meta = with lib; {
+    description = "Library for adding Swagger support to clients and servers";
+    homepage = "https://github.com/Yelp/bravado-core";
+    changelog = "https://github.com/Yelp/bravado-core/blob/v${version}/CHANGELOG.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ vanschelven nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bravia-tv/default.nix b/nixpkgs/pkgs/development/python-modules/bravia-tv/default.nix
new file mode 100644
index 000000000000..ce299e4612cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bravia-tv/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "bravia-tv";
+  version = "1.0.11";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "dcnielsen90";
+    repo = "python-bravia-tv";
+    rev = "v${version}";
+    hash = "sha256-g47bDd5bZl0jad3o6T1jJLcnZj8nx944kz3Vxv8gD2U=";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # Package does not include tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "bravia_tv" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/dcnielsen90/python-bravia-tv";
+    description = "Python library for Sony Bravia TV remote control";
+    license = licenses.mit;
+    maintainers = with maintainers; [ colemickens ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/breathe/default.nix b/nixpkgs/pkgs/development/python-modules/breathe/default.nix
new file mode 100644
index 000000000000..121777da32d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/breathe/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, docutils
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+, pythonOlder
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "breathe";
+  version = "4.35.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "michaeljones";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-LJXvtScyWRL8zfj877bJ4xuIbLV9IN3Sn9KPUTLMjMI=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # sphinx 7.2 support https://github.com/breathe-doc/breathe/pull/956
+      name = "breathe-sphinx7.2-support.patch";
+      url = "https://github.com/breathe-doc/breathe/commit/46abd77157a2a57e81586e4f8765ae8f1a09d167.patch";
+      hash = "sha256-zGFO/Ndk/9Yv2dbo8fpEoB/vchZP5vRceoC1E3sUny8=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    docutils
+    sphinx
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "breathe"
+  ];
+
+  meta = with lib; {
+    description = "Sphinx Doxygen renderer";
+    homepage = "https://github.com/michaeljones/breathe";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+    inherit (sphinx.meta) platforms;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/breezy/Cargo.lock b/nixpkgs/pkgs/development/python-modules/breezy/Cargo.lock
new file mode 100644
index 000000000000..6b1457497700
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/breezy/Cargo.lock
@@ -0,0 +1,332 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "aho-corasick"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "breezy"
+version = "3.3.4"
+dependencies = [
+ "pyo3",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "indoc"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306"
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "libc"
+version = "0.2.147"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
+
+[[package]]
+name = "lock_api"
+version = "0.4.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "memchr"
+version = "2.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c"
+
+[[package]]
+name = "memoffset"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+
+[[package]]
+name = "parking_lot"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-targets",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.66"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "pyo3"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e681a6cfdc4adcc93b4d3cf993749a4552018ee0a9b65fc0ccfad74352c72a38"
+dependencies = [
+ "cfg-if",
+ "indoc",
+ "libc",
+ "memoffset",
+ "parking_lot",
+ "pyo3-build-config",
+ "pyo3-ffi",
+ "pyo3-macros",
+ "unindent",
+]
+
+[[package]]
+name = "pyo3-build-config"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "076c73d0bc438f7a4ef6fdd0c3bb4732149136abd952b110ac93e4edb13a6ba5"
+dependencies = [
+ "once_cell",
+ "target-lexicon",
+]
+
+[[package]]
+name = "pyo3-ffi"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e53cee42e77ebe256066ba8aa77eff722b3bb91f3419177cf4cd0f304d3284d9"
+dependencies = [
+ "libc",
+ "pyo3-build-config",
+]
+
+[[package]]
+name = "pyo3-macros"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dfeb4c99597e136528c6dd7d5e3de5434d1ceaf487436a3f03b2d56b6fc9efd1"
+dependencies = [
+ "proc-macro2",
+ "pyo3-macros-backend",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "pyo3-macros-backend"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "947dc12175c254889edc0c02e399476c2f652b4b9ebd123aa655c224de259536"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "regex"
+version = "1.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"
+
+[[package]]
+name = "rio-py"
+version = "3.3.4"
+dependencies = [
+ "lazy_static",
+ "pyo3",
+ "regex",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
+[[package]]
+name = "smallvec"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9"
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "target-lexicon"
+version = "0.12.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"
+
+[[package]]
+name = "unindent"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1766d682d402817b5ac4490b3c3002d91dfa0d22812f341609f97b08757359c"
+
+[[package]]
+name = "windows-targets"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
diff --git a/nixpkgs/pkgs/development/python-modules/breezy/default.nix b/nixpkgs/pkgs/development/python-modules/breezy/default.nix
new file mode 100644
index 000000000000..505137993b08
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/breezy/default.nix
@@ -0,0 +1,137 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, cargo
+, configobj
+, cython
+, dulwich
+, fastbencode
+, fastimport
+, pygithub
+, libiconv
+, merge3
+, patiencediff
+, pyyaml
+, urllib3
+, breezy
+, launchpadlib
+, testtools
+, pythonOlder
+, installShellFiles
+, rustPlatform
+, rustc
+, setuptools-gettext
+, setuptools-rust
+, testers
+}:
+
+buildPythonPackage rec {
+  pname = "breezy";
+  version = "3.3.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-fEEvOfo8YWhx+xuiqD/KNstlso5/K1XJnGY64tkLIwE=";
+  };
+
+  patches = [
+    # Explicitly track which URLs are used for GitLab
+    (fetchpatch {
+      url = "https://github.com/breezy-team/breezy/commit/cc9fdf3774253183f726127c2ee191c24640d898.patch";
+      hash = "sha256-HTDAW3CPEZ1YBe0wnv6ncWEd0QRHwHawfTplbVDiOGc=";
+    })
+  ];
+
+  cargoDeps = rustPlatform.importCargoLock {
+    lockFile = ./Cargo.lock;
+  };
+
+  postPatch = ''
+    ln -s ${./Cargo.lock} Cargo.lock
+  '';
+
+  nativeBuildInputs = [
+    cython
+    installShellFiles
+    rustPlatform.cargoSetupHook
+    cargo
+    rustc
+    setuptools-gettext
+    setuptools-rust
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv ];
+
+  propagatedBuildInputs = [
+    configobj
+    dulwich
+    fastbencode
+    merge3
+    patiencediff
+    pyyaml
+    urllib3
+  ] ++ passthru.optional-dependencies.launchpad
+    ++ passthru.optional-dependencies.fastimport
+    ++ passthru.optional-dependencies.github;
+
+  nativeCheckInputs = [
+    testtools
+  ];
+
+  # multiple failures on sandbox
+  doCheck = false;
+
+  checkPhase = ''
+    runHook preCheck
+
+    HOME=$TMPDIR $out/bin/brz --no-plugins selftest
+
+    runHook postCheck
+  '';
+
+  postInstall = ''
+    wrapProgram $out/bin/brz --prefix PYTHONPATH : "$PYTHONPATH"
+
+    # symlink for bazaar compatibility
+    ln -s "$out/bin/brz" "$out/bin/bzr"
+
+    installShellCompletion --cmd brz --bash contrib/bash/brz
+  '';
+
+  pythonImportsCheck = [
+    "breezy"
+    "breezy.bzr.rio"
+  ];
+
+  passthru = {
+    tests.version = testers.testVersion {
+      package = breezy;
+      command = "HOME=$TMPDIR brz --version";
+    };
+    optional-dependencies = {
+      launchpad = [
+        launchpadlib
+      ];
+      fastimport = [
+        fastimport
+      ];
+      github = [
+        pygithub
+      ];
+    };
+  };
+
+  meta = with lib; {
+    description = "Friendly distributed version control system";
+    homepage = "https://www.breezy-vcs.org/";
+    changelog = "https://github.com/breezy-team/breezy/blob/brz-${version}/doc/en/release-notes/brz-${versions.majorMinor version}.txt";
+    license = licenses.gpl2Only;
+    maintainers = [ maintainers.marsam ];
+    mainProgram = "brz";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/brelpy/default.nix b/nixpkgs/pkgs/development/python-modules/brelpy/default.nix
new file mode 100644
index 000000000000..83d5946c54b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/brelpy/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pycryptodome
+, pygithub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "brelpy";
+  version = "0.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MYWSKYd7emHZfY+W/UweQtTg62GSUMybpecL9BR8dhg=";
+  };
+
+  propagatedBuildInputs = [
+    pycryptodome
+  ];
+
+  # Source not tagged and PyPI releases don't contain tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "brelpy"
+  ];
+
+  meta = with lib; {
+    description = "Python to communicate with the Brel hubs";
+    homepage = "https://gitlab.com/rogiervandergeer/brelpy";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/brian2/default.nix b/nixpkgs/pkgs/development/python-modules/brian2/default.nix
new file mode 100644
index 000000000000..a85e26b485f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/brian2/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cython
+, jinja2
+, numpy
+, pyparsing
+, setuptools
+, sympy
+, pytest
+, pytest-xdist
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "brian2";
+  version = "2.5.4";
+
+  src = fetchPypi {
+    pname = "Brian2";
+    inherit version;
+    hash = "sha256-XMXSOwcH8fLgzXCcT+grjYxhBdtF4H/Vr+S7J4GYZSw=";
+  };
+
+  propagatedBuildInputs = [
+    cython
+    jinja2
+    numpy
+    pyparsing
+    setuptools
+    sympy
+  ];
+
+  checkInputs = [
+    pytest
+    pytest-xdist
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    # Cython cache lies in home directory
+    export HOME=$(mktemp -d)
+    cd $HOME && ${python.interpreter} -c "import brian2;assert brian2.test()"
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "A clock-driven simulator for spiking neural networks";
+    homepage = "https://briansimulator.org/";
+    license = licenses.cecill21;
+    maintainers = with maintainers; [ jiegec ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/broadbean/default.nix b/nixpkgs/pkgs/development/python-modules/broadbean/default.nix
new file mode 100644
index 000000000000..cb2dff1b06e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/broadbean/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pythonOlder
+, setuptools
+, versioningit
+, wheel
+, numpy
+, matplotlib
+, schema
+, hypothesis
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "broadbean";
+  version = "0.11.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-e+LAcmWxT+SkaWtToPgg+x3QRu5fCSm+w4dLCcyZrw8=";
+  };
+
+  patches = [
+    # https://github.com/QCoDeS/broadbean/pull/538
+    (fetchpatch {
+      name = "drop-wheel-from-pyproject.patch";
+      url = "https://github.com/QCoDeS/broadbean/commit/31a2147e4f452fef1ca2b56b1cb0b10ac85ac867.patch";
+      hash = "sha256-lBikIRhaf3ecwE7NZrYWeHkQCHQdfS9eeOcFExGIsVk=";
+    })
+    # https://github.com/QCoDeS/broadbean/pull/638
+    (fetchpatch {
+      name = "unpin-versioningit-dependency.patch";
+      url = "https://github.com/QCoDeS/broadbean/commit/e4fd6c38d076aa3a6542dcd8fa7d2eb9d7a9b789.patch";
+      hash = "sha256-mw68pWAjztWBw22MeoWVbwIwjzMOJRtv6HctN3v6A2A=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    versioningit
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    matplotlib
+    schema
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "broadbean" ];
+
+  meta = {
+    homepage = "https://qcodes.github.io/broadbean";
+    description = "A library for making pulses that can be leveraged with QCoDeS";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ evilmav ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/broadlink/default.nix b/nixpkgs/pkgs/development/python-modules/broadlink/default.nix
new file mode 100644
index 000000000000..802fa6d23ba1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/broadlink/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cryptography
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "broadlink";
+  version = "0.18.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3+WKuMbH79v2i4wurObKQZowCmFbVsxlQp3aSk+eelg=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "broadlink"
+  ];
+
+  meta = with lib; {
+    description = "Python API for controlling Broadlink IR controllers";
+    homepage =  "https://github.com/mjg59/python-broadlink";
+    changelog = "https://github.com/mjg59/python-broadlink/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/brother-ql/default.nix b/nixpkgs/pkgs/development/python-modules/brother-ql/default.nix
new file mode 100644
index 000000000000..f6cfe5868209
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/brother-ql/default.nix
@@ -0,0 +1,38 @@
+{ stdenv
+, fetchPypi
+, buildPythonPackage
+, future
+, packbits
+, pillow
+, pyusb
+, pytest
+, mock
+, click
+, attrs
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "brother-ql";
+  version = "0.9.4";
+
+  src = fetchPypi {
+    pname = "brother_ql";
+    inherit version;
+    hash = "sha256-H1xXoDnwEsnCBDl/RwAB9267dINCHr3phdDLPGFOhmA=";
+  };
+
+  propagatedBuildInputs = [ future packbits pillow pyusb click attrs ];
+
+  meta = with lib; {
+    description = "Python package for the raster language protocol of the Brother QL series label printers";
+    longDescription = ''
+      Python package for the raster language protocol of the Brother QL series label printers
+      (QL-500, QL-550, QL-570, QL-700, QL-710W, QL-720NW, QL-800, QL-820NWB, QL-1050 and more)
+    '';
+    homepage = "https://github.com/pklaus/brother_ql";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ grahamc ];
+    mainProgram = "brother_ql";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/brother/default.nix b/nixpkgs/pkgs/development/python-modules/brother/default.nix
new file mode 100644
index 000000000000..ae0a4f131e2a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/brother/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, dacite
+, pysnmplib
+, pytest-asyncio
+, pytest-error-for-skips
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "brother";
+  version = "2.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bieniu";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-f55daLPBepNDIfZFAZWdkAvEkNb0cyYQt9LkqyIMrnY=";
+  };
+
+  propagatedBuildInputs = [
+    dacite
+    pysnmplib
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-error-for-skips
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "brother"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for getting data from Brother laser and inkjet printers via SNMP";
+    homepage = "https://github.com/bieniu/brother";
+    changelog = "https://github.com/bieniu/brother/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/brotli-asgi/default.nix b/nixpkgs/pkgs/development/python-modules/brotli-asgi/default.nix
new file mode 100644
index 000000000000..8bdd814cfe5e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/brotli-asgi/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+# build inputs
+, starlette
+, brotli
+# check inputs
+, requests
+, mypy
+, brotlipy
+}:
+let
+  pname = "brotli-asgi";
+  version = "1.4.0";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "fullonic";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-hQ6CSXnAoUSaKUSmE+2GHZemkFqd8Dc5+OvcUD7/r5Y=";
+  };
+
+  propagatedBuildInputs = [
+    starlette
+    brotli
+  ];
+
+  pythonImportsCheck = [ "brotli_asgi" ];
+
+  nativeCheckInputs = [
+    requests
+    mypy
+    brotlipy
+  ];
+
+  meta = with lib; {
+    description = "A compression AGSI middleware using brotli";
+    homepage = "https://github.com/fullonic/brotli-asgi";
+    license = licenses.mit;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/brotli/default.nix b/nixpkgs/pkgs/development/python-modules/brotli/default.nix
new file mode 100644
index 000000000000..91e907c3af33
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/brotli/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "brotli";
+  version = "1.1.0";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-MvceRcle2dSkkucC2PlsCizsIf8iv95d8Xjqew266wc=";
+    # .gitattributes is not correct or GitHub does not parse it correct and the archive is missing the test data
+    forceFetchGit = true;
+  };
+
+  # only returns information how to really build
+  dontConfigure = true;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "python/tests"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/google/brotli";
+    description = "Generic-purpose lossless compression algorithm";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/brotlicffi/default.nix b/nixpkgs/pkgs/development/python-modules/brotlicffi/default.nix
new file mode 100644
index 000000000000..fd30ab86c07c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/brotlicffi/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, cffi
+, brotli
+}:
+
+buildPythonPackage rec {
+  pname = "brotlicffi";
+  version = "1.1.0.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "python-hyper";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-oW4y1WBJ7+4XwNwwSSR0qUqN03cZYXUYQ6EAwce9dzI=";
+  };
+
+  buildInputs = [
+    brotli
+  ];
+
+  propagatedNativeBuildInputs = [
+    cffi
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+  ];
+
+  preBuild = ''
+    export USE_SHARED_BROTLI=1
+  '';
+
+  # Test data is not available, only when using libbrotli git checkout
+  doCheck = false;
+
+  pythonImportsCheck = [ "brotlicffi" ];
+
+  meta = with lib; {
+    description = "Python CFFI bindings to the Brotli library";
+    homepage = "https://github.com/python-hyper/brotlicffi";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/brotlipy/default.nix b/nixpkgs/pkgs/development/python-modules/brotlipy/default.nix
new file mode 100644
index 000000000000..57310eb6a0ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/brotlipy/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cffi
+, enum34
+, construct
+, pytest
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "brotlipy";
+  version = "0.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "36def0b859beaf21910157b4c33eb3b06d8ce459c942102f16988cca6ea164df";
+  };
+
+  propagatedBuildInputs = [ cffi enum34 construct ];
+
+  propagatedNativeBuildInputs = [ cffi ];
+
+  nativeCheckInputs = [ pytest hypothesis ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  # Missing test files
+  doCheck = false;
+
+  meta = {
+    description = "Python bindings for the reference Brotli encoder/decoder";
+    homepage = "https://github.com/python-hyper/brotlipy/";
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/brottsplatskartan/default.nix b/nixpkgs/pkgs/development/python-modules/brottsplatskartan/default.nix
new file mode 100644
index 000000000000..52c092c74b88
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/brottsplatskartan/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-cov
+, pytestCheckHook
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "brottsplatskartan";
+  version = "1.0.5";
+
+  src = fetchFromGitHub {
+    owner = "chrillux";
+    repo = pname;
+    rev = version;
+    sha256 = "07iwmnchvpw156j23yfccg4c32izbwm8b02bjr1xgmcwzbq21ks9";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  nativeCheckInputs = [
+    pytest-cov
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "brottsplatskartan" ];
+
+  meta = with lib; {
+    description = "Python API wrapper for brottsplatskartan.se";
+    homepage = "https://github.com/chrillux/brottsplatskartan";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/browser-cookie3/default.nix b/nixpkgs/pkgs/development/python-modules/browser-cookie3/default.nix
new file mode 100644
index 000000000000..f8616e0567a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/browser-cookie3/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, lz4
+, keyring
+, pbkdf2
+, pycryptodomex
+, pyaes
+}:
+
+buildPythonPackage rec {
+  pname = "browser-cookie3";
+  version = "0.19.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MDGtFLlrR+8eTIVF8vRj4QrYRO+DTc0Ova42HjHGEZo=";
+  };
+
+  propagatedBuildInputs = [
+    lz4
+    keyring
+    pbkdf2
+    pyaes
+    pycryptodomex
+  ];
+
+  # No tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "browser_cookie3"
+  ];
+
+  meta = with lib; {
+    description = "Loads cookies from your browser into a cookiejar object";
+    homepage = "https://github.com/borisbabic/browser_cookie3";
+    changelog = "https://github.com/borisbabic/browser_cookie3/blob/master/CHANGELOG.md";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ borisbabic ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/brunt/default.nix b/nixpkgs/pkgs/development/python-modules/brunt/default.nix
new file mode 100644
index 000000000000..40b0f665cb97
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/brunt/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, aiohttp
+, requests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "brunt";
+  version = "1.2.0";
+
+  disabled = pythonOlder "3.8";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e704627dc7b9c0a50c67ae90f1d320b14f99f2b2fc9bf1ef0461b141dcf1bce9";
+  };
+
+  postPatch = ''
+    sed -i '/--cov/d' setup.cfg
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # tests require Brunt hardware
+  doCheck = false;
+
+  pythonImportsCheck = [ "brunt" ];
+
+  meta = {
+    description = "Unofficial Python SDK for Brunt";
+    homepage = "https://github.com/eavanvalkenburg/brunt-api";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bsddb3/default.nix b/nixpkgs/pkgs/development/python-modules/bsddb3/default.nix
new file mode 100644
index 000000000000..ee2f5b16ad50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bsddb3/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pkgs
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "bsddb3";
+  version = "6.2.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "70d05ec8dc568f42e70fc919a442e0daadc2a905a1cfb7ca77f549d49d6e7801";
+  };
+
+  buildInputs = [ pkgs.db ];
+
+  checkPhase = ''
+    ${python.interpreter} test.py
+  '';
+
+  # Path to database need to be set.
+  # Somehow the setup.py flag is not propagated.
+  #setupPyBuildFlags = [ "--berkeley-db=${pkgs.db}" ];
+  # We can also use a variable
+  preConfigure = ''
+    export BERKELEYDB_DIR=${pkgs.db.dev};
+  '';
+
+  meta = with lib; {
+    description = "Python bindings for Oracle Berkeley DB";
+    homepage = "https://www.jcea.es/programacion/pybsddb.htm";
+    license = with licenses; [ agpl3 ]; # License changed from bsd3 to agpl3 since 6.x
+    maintainers = [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bsdiff4/default.nix b/nixpkgs/pkgs/development/python-modules/bsdiff4/default.nix
new file mode 100644
index 000000000000..f65fe77af252
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bsdiff4/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bsdiff4";
+  version = "1.2.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-HXEpqBIYYHMejM4pAdMYPhSuxwJE9k6PdFYyddw4gGc=";
+  };
+
+  pythonImportsCheck = [
+    "bsdiff4"
+  ];
+
+  checkPhase = ''
+    mv bsdiff4 _bsdiff4
+    python -c 'import bsdiff4; bsdiff4.test()'
+  '';
+
+  meta = with lib; {
+    description = "Binary diff and patch using the BSDIFF4-format";
+    homepage = "https://github.com/ilanschnell/bsdiff4";
+    changelog = "https://github.com/ilanschnell/bsdiff4/blob/${version}/CHANGELOG.txt";
+    license = licenses.bsdProtection;
+    maintainers = with maintainers; [ ris ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bson/default.nix b/nixpkgs/pkgs/development/python-modules/bson/default.nix
new file mode 100644
index 000000000000..ca78b0806f0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bson/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python-dateutil
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "bson";
+  version = "0.5.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "14355m3dchz446fl54ym78bn4wi20hddx1614f8rl4sin0m1nlfn";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    six
+  ];
+
+  # 0.5.10 was not tagged, https://github.com/py-bson/bson/issues/108
+  doCheck = false;
+
+  pythonImportsCheck = [ "bson" ];
+
+  meta = with lib; {
+    description = "BSON codec for Python";
+    homepage = "https://github.com/py-bson/bson";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bsuite/default.nix b/nixpkgs/pkgs/development/python-modules/bsuite/default.nix
new file mode 100644
index 000000000000..e039bf0fa07f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bsuite/default.nix
@@ -0,0 +1,104 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, frozendict
+, termcolor
+, matplotlib
+, gym
+, pandas
+, scipy
+, absl-py
+, dm-env
+, plotnine
+, scikit-image
+, dm-tree
+, patsy
+, tensorflow-probability
+, dm-haiku
+, statsmodels
+, mizani
+, trfl
+, optax
+, pytestCheckHook
+, dm-sonnet
+, rlax
+, distrax
+}:
+
+let bsuite = buildPythonPackage rec {
+  pname = "bsuite";
+  version = "0.3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ak9McvXl7Nz5toUaPaRaJek9lurxiQiIW209GnZEjX0=";
+  };
+
+  buildInputs = [
+    absl-py
+    dm-env
+    dm-tree
+    frozendict
+    gym
+    matplotlib
+    mizani
+    pandas
+    patsy
+    plotnine
+    scikit-image
+    scipy
+    statsmodels
+    termcolor
+  ];
+
+  nativeCheckInputs = [
+    distrax
+    dm-haiku
+    dm-sonnet
+    optax
+    pytestCheckHook
+    rlax
+    tensorflow-probability
+    trfl
+  ];
+
+  pythonImportsCheck = [
+    "bsuite"
+  ];
+
+  disabledTests = [
+    # Tests require network connection
+    "test_run9"
+    "test_longer_action_sequence"
+    "test_reset"
+    "test_step_after_reset"
+    "test_step_on_fresh_environment"
+    "test_longer_action_sequence"
+    "test_reset"
+    "test_step_after_reset"
+    "test_step_on_fresh_environment"
+    "test_longer_action_sequence"
+    "test_reset"
+    "test_step_after_reset"
+    "test_step_on_fresh_environment"
+    "test_logger"
+    "test_episode_truncation"
+  ];
+
+  # escape infinite recursion with rlax
+  doCheck = false;
+
+  passthru.tests = {
+    check = bsuite.overridePythonAttrs (_: { doCheck = true; });
+  };
+
+  meta = with lib; {
+    description = ''
+      Core RL Behaviour Suite. A collection of reinforcement learning
+      experiments
+    '';
+    homepage = "https://github.com/deepmind/bsuite";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ onny ];
+  };
+}; in bsuite
diff --git a/nixpkgs/pkgs/development/python-modules/bt-proximity/default.nix b/nixpkgs/pkgs/development/python-modules/bt-proximity/default.nix
new file mode 100644
index 000000000000..9de6dfbdefff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bt-proximity/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pybluez
+}:
+
+buildPythonPackage rec {
+  pname = "bt-proximity";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    pname = "bt_proximity";
+    inherit version;
+    sha256 = "0xlif91vblbz065531yjf8nmlcahrl4q5pz52bc1jmzz7iv9hpgq";
+  };
+
+  propagatedBuildInputs = [
+    pybluez
+  ];
+
+  # there are no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "bt_proximity" ];
+
+  meta = with lib; {
+    description = "Bluetooth Proximity Detection using Python";
+    homepage = "https://github.com/FrederikBolding/bluetooth-proximity";
+    maintainers = with maintainers; [ peterhoeg ];
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/btchip-python/default.nix b/nixpkgs/pkgs/development/python-modules/btchip-python/default.nix
new file mode 100644
index 000000000000..901a3b2cc954
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/btchip-python/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hidapi
+, pyscard
+, ecdsa
+ }:
+
+buildPythonPackage rec {
+  pname = "btchip-python";
+  version = "0.1.32";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NPXgwWHAj2XcDQcLov9MMV7SHEt+D6oypGhi0Nwbj1U=";
+  };
+
+  postPatch = ''
+    # fix extra_requires validation
+    substituteInPlace setup.py \
+      --replace "python-pyscard>=1.6.12-4build1" "python-pyscard>=1.6.12"
+  '';
+
+  propagatedBuildInputs = [
+    hidapi
+    ecdsa
+  ];
+
+  passthru.optional-dependencies.smartcard = [
+    pyscard
+  ];
+
+  # tests requires hardware
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "btchip.btchip"
+  ];
+
+  meta = with lib; {
+    description = "Python communication library for Ledger Hardware Wallet products";
+    homepage = "https://github.com/LedgerHQ/btchip-python";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/btest/default.nix b/nixpkgs/pkgs/development/python-modules/btest/default.nix
new file mode 100644
index 000000000000..dc36b1981940
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/btest/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "btest";
+  version = "1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "zeek";
+    repo = "btest";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-D01hAKcE52eKJRUh1/x5DGxRQpWgA2J0nutshpKrtRU=";
+  };
+
+  # No tests available and no module to import
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A Generic Driver for Powerful System Tests";
+    homepage = "https://github.com/zeek/btest";
+    changelog = "https://github.com/zeek/btest/blob/${version}/CHANGES";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bthome-ble/default.nix b/nixpkgs/pkgs/development/python-modules/bthome-ble/default.nix
new file mode 100644
index 000000000000..dddf9d5d9c1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bthome-ble/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, bluetooth-data-tools
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, pytz
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "bthome-ble";
+  version = "3.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = "bthome-ble";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-UYW7yEAg4RJR1ERFDDS6s8OBr0XRTHTJLSuOF7FO6u4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-data-tools
+    bluetooth-sensor-state-data
+    cryptography
+    sensor-state-data
+    pytz
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=bthome_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "bthome_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for BThome BLE devices";
+    homepage = "https://github.com/Bluetooth-Devices/bthome-ble";
+    changelog = "https://github.com/bluetooth-devices/bthome-ble/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/btrees/default.nix b/nixpkgs/pkgs/development/python-modules/btrees/default.nix
new file mode 100644
index 000000000000..930ede2cd120
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/btrees/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, persistent
+, zope_interface
+, transaction
+, zope_testrunner
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "btrees";
+  version = "5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "BTrees";
+    inherit version;
+    hash = "sha256-raDzHpMloEeV0dJOAn7ZsrZdpNZqz/i4eVWzUo1/w2k=";
+  };
+
+  propagatedBuildInputs = [
+    persistent
+    zope_interface
+  ];
+
+  nativeCheckInputs = [
+    transaction
+    zope_testrunner
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m zope.testrunner --test-path=src --auto-color --auto-progress
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "BTrees.OOBTree"
+    "BTrees.IOBTree"
+    "BTrees.IIBTree"
+    "BTrees.IFBTree"
+  ];
+
+  meta = with lib; {
+    description = "Scalable persistent components";
+    homepage = "http://packages.python.org/BTrees";
+    license = licenses.zpl21;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/btrfs/default.nix b/nixpkgs/pkgs/development/python-modules/btrfs/default.nix
new file mode 100644
index 000000000000..ee2044506899
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/btrfs/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "btrfs";
+  version = "13";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NSyzhpHYDkunuU104XnbVCcVRNDoVBz4KuJRrE7WMO0=";
+  };
+
+  # no tests (in v12)
+  doCheck = false;
+  pythonImportsCheck = [ "btrfs" ];
+
+  meta = with lib; {
+    description = "Inspect btrfs filesystems";
+    homepage = "https://github.com/knorrie/python-btrfs";
+    license = licenses.lgpl3Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ evils Luflosi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/btrfsutil/default.nix b/nixpkgs/pkgs/development/python-modules/btrfsutil/default.nix
new file mode 100644
index 000000000000..d529ec09c705
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/btrfsutil/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, btrfs-progs
+}:
+buildPythonPackage {
+  pname = "btrfsutil";
+  inherit (btrfs-progs) version src;
+  format = "setuptools";
+
+  buildInputs = [ btrfs-progs ];
+
+  preConfigure = ''
+    cd libbtrfsutil/python
+  '';
+
+  # No tests
+  doCheck = false;
+  pythonImportsCheck = [ "btrfsutil" ];
+
+  meta = with lib; {
+    description = "Library for managing Btrfs filesystems";
+    homepage = "https://btrfs.wiki.kernel.org/";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ raskin lopsided98 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/btsmarthub_devicelist/default.nix b/nixpkgs/pkgs/development/python-modules/btsmarthub_devicelist/default.nix
new file mode 100644
index 000000000000..ea5e61f7a49d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/btsmarthub_devicelist/default.nix
@@ -0,0 +1,44 @@
+{
+  lib,
+  buildPythonPackage,
+  fetchFromGitHub,
+  pytestCheckHook,
+  pythonOlder,
+  requests,
+  responses,
+}:
+buildPythonPackage rec {
+  pname = "btsmarthub_devicelist";
+  version = "0.2.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jxwolstenholme";
+    repo = "btsmarthub_devicelist";
+    rev = version;
+    hash = "sha256-7ncxCpY+A2SuSFa3k21QchrmFs1dPRUMb1r1z/laa6M=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    responses
+    requests
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_btsmarthub2_detection_neither_router_present"
+  ];
+
+  meta = with lib; {
+    description = "Retrieve a list of devices from a bt smarthub or bt smarthub 2 on a local network";
+    homepage = "https://github.com/jxwolstenholme/btsmarthub_devicelist";
+    license = licenses.mit;
+    maintainers = with maintainers; [jamiemagee];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/btsocket/default.nix b/nixpkgs/pkgs/development/python-modules/btsocket/default.nix
new file mode 100644
index 000000000000..e1c1f8a32887
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/btsocket/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "btsocket";
+  version = "0.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ukBaz";
+    repo = "python-btsocket";
+    rev = "v${version}";
+    hash = "sha256-IqlbFYbEyJPlcmT3DIQIwsjQEAGeIGRtFNx4jWwNtjE=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "btsocket"
+  ];
+
+  meta = with lib; {
+    description = "Library to interact with the Bluez Bluetooth Management API";
+    homepage = "https://github.com/ukBaz/python-btsocket";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bucketstore/default.nix b/nixpkgs/pkgs/development/python-modules/bucketstore/default.nix
new file mode 100644
index 000000000000..c87345732981
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bucketstore/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, boto3
+, moto
+}:
+
+buildPythonPackage rec {
+  pname = "bucketstore";
+  version = "0.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jpetrucciani";
+    repo = "bucketstore";
+    rev = "refs/tags/${version}";
+    hash = "sha256-BtoyGqFbeBhGQeXnmeSfiuJLZtXFrK26WO0SDlAtKG4=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "version=__version__," 'version="${version}",'
+  '';
+
+  propagatedBuildInputs = [
+    boto3
+  ];
+
+  nativeCheckInputs = [
+    moto
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "bucketstore"
+  ];
+
+  meta = with lib; {
+    description = "Library for interacting with Amazon S3";
+    homepage = "https://github.com/jpetrucciani/bucketstore";
+    changelog = "https://github.com/jpetrucciani/bucketstore/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jpetrucciani ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bugsnag/default.nix b/nixpkgs/pkgs/development/python-modules/bugsnag/default.nix
new file mode 100644
index 000000000000..0d20510e7cef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bugsnag/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, blinker
+, buildPythonPackage
+, fetchPypi
+, flask
+, pythonOlder
+, webob
+}:
+
+buildPythonPackage rec {
+  pname = "bugsnag";
+  version = "4.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-q+hxYDajPVkR/AHLfTRq/E8ofO3UepLNooUS/CLIN/4=";
+  };
+
+  propagatedBuildInputs = [
+    webob
+  ];
+
+  passthru.optional-dependencies = {
+    flask = [
+      blinker
+      flask
+    ];
+  };
+
+  pythonImportsCheck = [
+    "bugsnag"
+  ];
+
+  # Module ha no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Automatic error monitoring for Python applications";
+    homepage = "https://github.com/bugsnag/bugsnag-python";
+    changelog = "https://github.com/bugsnag/bugsnag-python/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bugwarrior/default.nix b/nixpkgs/pkgs/development/python-modules/bugwarrior/default.nix
new file mode 100644
index 000000000000..89bb744eb785
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bugwarrior/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder, setuptools
+, twiggy, requests, offtrac, bugzilla, taskw, python-dateutil, pytz, keyring, six
+, jinja2, pycurl, dogpile-cache, lockfile, click, pyxdg, future, jira }:
+
+buildPythonPackage rec {
+  pname = "bugwarrior";
+  version = "1.8.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f024c29d2089b826f05481cace33a62aa984f33e98d226f6e41897e6f11b3f51";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+    twiggy requests offtrac bugzilla taskw python-dateutil pytz keyring six
+    jinja2 pycurl dogpile-cache lockfile click pyxdg future jira
+  ];
+
+  # for the moment oauth2client <4.0.0 and megaplan>=1.4 are missing for running the test suite.
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/ralphbean/bugwarrior";
+    description = "Sync github, bitbucket, bugzilla, and trac issues with taskwarrior";
+    license = licenses.gpl3Plus;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ pierron ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bugz/default.nix b/nixpkgs/pkgs/development/python-modules/bugz/default.nix
new file mode 100644
index 000000000000..f67be664c227
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bugz/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage {
+  pname = "bugz-0.9.3";
+  version = "0.13";
+
+  src = fetchFromGitHub {
+    owner = "williamh";
+    repo = "pybugz";
+    rev = "0.13";
+    sha256 = "1nw07q7r078dp82rcrhvvnhmnaqjx6f8a6cdjgrsiy6fryrx9dwz";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/williamh/pybugz";
+    description = "Command line interface for Bugzilla";
+    license = licenses.gpl2;
+    maintainers = [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bugzilla/default.nix b/nixpkgs/pkgs/development/python-modules/bugzilla/default.nix
new file mode 100644
index 000000000000..2f38b6f63178
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bugzilla/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, pytestCheckHook
+, glibcLocalesUtf8
+}:
+
+buildPythonPackage rec {
+  pname = "bugzilla";
+  version = "3.2.0";
+
+  src = fetchPypi {
+    pname = "python-${pname}";
+    inherit version;
+    sha256 = "TvyM+il4N8nk6rIg4ZcXZxW9Ye4zzsLBsPJ5DweGA4c=";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  nativeCheckInputs = [
+    pytestCheckHook glibcLocalesUtf8
+  ];
+
+  preCheck = ''
+    mkdir -p check-phase
+    export HOME=$(pwd)/check-phase
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/python-bugzilla/python-bugzilla";
+    description = "Bugzilla XMLRPC access module";
+    license = licenses.gpl2Plus;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ pierron ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/buienradar/default.nix b/nixpkgs/pkgs/development/python-modules/buienradar/default.nix
new file mode 100644
index 000000000000..7612c62211d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/buienradar/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, docopt
+, pytz
+, requests
+, setuptools
+, vincenty
+, xmltodict
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "buienradar";
+  version = "1.0.5";
+
+  disabled = pythonOlder "3.4";
+
+  src = fetchFromGitHub {
+    owner = "mjj4791";
+    repo = "python-buienradar";
+    # https://github.com/mjj4791/python-buienradar/issues/14
+    rev = "caa66ea855dbcc7cf6ee13291d9b2ed7ac01ef98";
+    hash = "sha256:0xz03xj5qjayriaah20adh0ycvlvb8jdvgh7w5gm236n64g6krj0";
+  };
+
+  propagatedBuildInputs = [
+    docopt
+    pytz
+    requests
+    setuptools
+    vincenty
+    xmltodict
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # require network connection
+    "test_rain_data"
+    "test_json_data"
+    "test_xml_data"
+  ];
+
+  pythonImportsCheck = [
+    "buienradar.buienradar"
+    "buienradar.constants"
+  ];
+
+  meta = with lib; {
+    description = "Library and CLI tools for interacting with buienradar";
+    homepage = "https://github.com/mjj4791/python-buienradar";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/build/default.nix b/nixpkgs/pkgs/development/python-modules/build/default.nix
new file mode 100644
index 000000000000..4b06298f1d26
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/build/default.nix
@@ -0,0 +1,108 @@
+{ lib
+, stdenv
+, build
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, filelock
+, packaging
+, pyproject-hooks
+, pytest-mock
+, pytest-rerunfailures
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, tomli
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "build";
+  version = "1.0.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pypa";
+    repo = "build";
+    rev = "refs/tags/${version}";
+    hash = "sha256-SGWpm+AGIfqKMpDfmz2aMYmcs+XVREbHIXSuU4R7U/k=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+    pyproject-hooks
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  # We need to disable tests because this package is part of the bootstrap chain
+  # and its test dependencies cannot be built yet when this is being built.
+  doCheck = false;
+
+  passthru.tests = {
+    pytest = buildPythonPackage {
+      pname = "${pname}-pytest";
+      inherit src version;
+      format = "other";
+
+      dontBuild = true;
+      dontInstall = true;
+
+      nativeCheckInputs = [
+        build
+        filelock
+        pytest-mock
+        pytest-rerunfailures
+        pytest-xdist
+        pytestCheckHook
+        setuptools
+        wheel
+      ];
+
+      pytestFlagsArray = [
+        "-W"
+        "ignore::DeprecationWarning"
+      ];
+
+      __darwinAllowLocalNetworking = true;
+
+      disabledTests = [
+        # Tests often fail with StopIteration
+        "test_isolat"
+        "test_default_pip_is_never_too_old"
+        "test_build"
+        "test_with_get_requires"
+        "test_init"
+        "test_output"
+        "test_wheel_metadata"
+      ] ++ lib.optionals stdenv.isDarwin [
+        # Expects Apple's Python and its quirks
+        "test_can_get_venv_paths_with_conflicting_default_scheme"
+      ];
+    };
+  };
+
+  pythonImportsCheck = [
+    "build"
+  ];
+
+  meta = with lib; {
+    mainProgram = "pyproject-build";
+    description = "Simple, correct PEP517 package builder";
+    longDescription = ''
+      build will invoke the PEP 517 hooks to build a distribution package. It
+      is a simple build tool and does not perform any dependency management.
+    '';
+    homepage = "https://github.com/pypa/build";
+    changelog = "https://github.com/pypa/build/blob/${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = teams.python.members ++ [ maintainers.fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/buildcatrust/default.nix b/nixpkgs/pkgs/development/python-modules/buildcatrust/default.nix
new file mode 100644
index 000000000000..b875185ed2ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/buildcatrust/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "buildcatrust";
+  version = "0.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256:0s0m0fy943dakw9cbd40h46qmrhhgrcp292kppyb34m6y27sbagy";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+  disabledTestPaths = [
+    # Non-hermetic, needs internet access (e.g. attempts to retrieve NSS store).
+    "buildcatrust/tests/test_nonhermetic.py"
+  ];
+
+  pythonImportsCheck = [ "buildcatrust" "buildcatrust.cli" ];
+
+  meta = with lib; {
+    description = "Build SSL/TLS trust stores";
+    homepage = "https://github.com/lukegb/buildcatrust";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lukegb ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/buildout/default.nix b/nixpkgs/pkgs/development/python-modules/buildout/default.nix
new file mode 100644
index 000000000000..ace266347994
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/buildout/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, pip
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "zc-buildout";
+  version = "3.0.1";
+
+  src = fetchFromGitHub {
+    owner = "buildout";
+    repo = "buildout";
+    rev = version;
+    sha256 = "J/ymUCFhl7EviHMEYSUCTky0ULRT8aL4gNCGxrbqJi0=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+    pip
+    wheel
+  ];
+
+  doCheck = false; # Missing package & BLOCKED on "zc.recipe.egg"
+
+  pythonImportsCheck = [ "zc.buildout" ];
+
+  meta = with lib; {
+    description = "A software build and configuration system";
+    downloadPage = "https://github.com/buildout/buildout";
+    homepage = "https://www.buildout.org";
+    license = licenses.zpl21;
+    maintainers = with maintainers; [ gotcha ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bumps/default.nix b/nixpkgs/pkgs/development/python-modules/bumps/default.nix
new file mode 100644
index 000000000000..71d535141f0a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bumps/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "bumps";
+  version = "0.9.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-J8NeV9FCUC5dLkosBzVrovxiJJbeuj8Xc50NGEI9Bms=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "bumps"
+  ];
+
+  meta = with lib; {
+    description = "Data fitting with bayesian uncertainty analysis";
+    homepage = "https://bumps.readthedocs.io/";
+    changelog = "https://github.com/bumps/bumps/releases/tag/v${version}";
+    license = licenses.publicDomain;
+    maintainers = with maintainers; [ rprospero ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bunch/default.nix b/nixpkgs/pkgs/development/python-modules/bunch/default.nix
new file mode 100644
index 000000000000..39c858ebb676
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bunch/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "bunch";
+  version = "unstable-2017-11-21";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  # Use a fork as upstream is dead
+  src = fetchFromGitHub {
+    owner = "olivecoder";
+    repo = pname;
+    rev = "71ac9d5c712becd4c502ab3099203731a0f1122e";
+    hash = "sha256-XOgzJkcIqkAJFsKAyt2jSEIxcc0h2gFC15xy5kAs+7s=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "rU" "r"
+  '';
+
+  # No real tests available
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "bunch"
+  ];
+
+  meta = with lib; {
+    description = "Python dictionary that provides attribute-style access";
+    homepage = "https://github.com/dsc/bunch";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bundlewrap/default.nix b/nixpkgs/pkgs/development/python-modules/bundlewrap/default.nix
new file mode 100644
index 000000000000..7e811b2255a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bundlewrap/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, cryptography
+, jinja2
+, mako
+, passlib
+, pytest
+, pyyaml
+, requests
+, rtoml
+, setuptools
+, tomlkit
+, librouteros
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "bundlewrap";
+  version = "4.17.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bundlewrap";
+    repo = "bundlewrap";
+    rev = "refs/tags/${version}";
+    hash = "sha256-0yg8+OflTF3pNYz2TPNUW8ubTZjrEgtihV/21PpJUlM=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+  propagatedBuildInputs = [
+    setuptools cryptography jinja2 mako passlib pyyaml requests tomlkit librouteros
+  ] ++ lib.optionals (pythonOlder "3.11") [ rtoml ];
+
+  pythonImportsCheck = [ "bundlewrap" ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pytestFlagsArray = [
+    # only unit tests as integration tests need a OpenSSH client/server setup
+    "tests/unit"
+  ];
+
+  meta = with lib; {
+    homepage = "https://bundlewrap.org/";
+    description = "Easy, Concise and Decentralized Config management with Python";
+    license = [ licenses.gpl3 ] ;
+    maintainers = with maintainers; [ wamserma ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/busypie/default.nix b/nixpkgs/pkgs/development/python-modules/busypie/default.nix
new file mode 100644
index 000000000000..9539d3f4371e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/busypie/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "busypie";
+  version = "0.5.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rockem";
+    repo = "busypie";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-dw0Sc/a27/EYY7LVMQqDkYuxrUFYK+N6XLk6A7A/eS8=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest-runner" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "busypie"
+  ];
+
+  meta = with lib; {
+    description = "Expressive busy wait for Python";
+    homepage = "https://github.com/rockem/busypie";
+    changelog = "https://github.com/rockem/busypie/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bwapy/default.nix b/nixpkgs/pkgs/development/python-modules/bwapy/default.nix
new file mode 100644
index 000000000000..f6c926cf419a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bwapy/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, bwa
+, cffi
+, zlib
+}:
+
+buildPythonPackage rec {
+  pname = "bwapy";
+  version = "0.1.4";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "090qwx3vl729zn3a7sksbviyg04kc71gpbm3nd8dalqp673x1npw";
+  };
+  postPatch = ''
+    # replace bundled bwa
+    rm -r bwa/*
+    cp ${bwa}/lib/*.a ${bwa}/include/*.h bwa/
+
+    substituteInPlace setup.py \
+      --replace 'setuptools>=49.2.0' 'setuptools'
+  '';
+
+  buildInputs = [ zlib bwa ];
+
+  propagatedBuildInputs = [ cffi ];
+
+  # no tests
+  doCheck = false;
+  pythonImportsCheck = [ "bwapy" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ACEnglish/acebinf";
+    description = "Python bindings to bwa mem aligner";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ ris ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bx-py-utils/default.nix b/nixpkgs/pkgs/development/python-modules/bx-py-utils/default.nix
new file mode 100644
index 000000000000..55d1c971cf21
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bx-py-utils/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, beautifulsoup4
+, boto3
+, lxml
+, pdoc
+, pytestCheckHook
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "bx-py-utils";
+  version = "88";
+
+  disabled = pythonOlder "3.9";
+
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "boxine";
+    repo = "bx_py_utils";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Ds7Ljgp6OdbFkEWl1E0X03o0oJ/Nk8U3pO/ztK42DbY=";
+  };
+
+  postPatch = ''
+    rm bx_py_utils_tests/publish.py
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  pythonImportsCheck = [
+    "bx_py_utils.anonymize"
+    "bx_py_utils.auto_doc"
+    "bx_py_utils.compat"
+    "bx_py_utils.dict_utils"
+    "bx_py_utils.environ"
+    "bx_py_utils.error_handling"
+    "bx_py_utils.file_utils"
+    "bx_py_utils.graphql_introspection"
+    "bx_py_utils.hash_utils"
+    "bx_py_utils.html_utils"
+    "bx_py_utils.iteration"
+    "bx_py_utils.path"
+    "bx_py_utils.processify"
+    "bx_py_utils.rison"
+    "bx_py_utils.stack_info"
+    "bx_py_utils.string_utils"
+    "bx_py_utils.test_utils"
+    "bx_py_utils.text_tools"
+  ];
+
+  nativeCheckInputs = [
+    beautifulsoup4
+    boto3
+    lxml
+    pdoc
+    pytestCheckHook
+    requests-mock
+  ];
+
+  disabledTests = [
+    # too closely affected by bs4 updates
+    "test_pretty_format_html"
+    "test_assert_html_snapshot_by_css_selector"
+  ];
+
+  disabledTestPaths = [
+    "bx_py_utils_tests/tests/test_project_setup.py"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # processify() doesn't work under darwin
+    # https://github.com/boxine/bx_py_utils/issues/80
+    "bx_py_utils_tests/tests/test_processify.py"
+  ];
+
+  meta = {
+    description = "Various Python utility functions";
+    homepage = "https://github.com/boxine/bx_py_utils";
+    changelog = "https://github.com/boxine/bx_py_utils/releases/tag/${src.rev}";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bx-python/default.nix b/nixpkgs/pkgs/development/python-modules/bx-python/default.nix
new file mode 100644
index 000000000000..5fc21676d261
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bx-python/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, numpy
+, cython
+, zlib
+, python-lzo
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "bx-python";
+  version = "0.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bxlab";
+    repo = "bx-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-j2GKj2IGDBk4LBnISRx6ZW/lh5VSdQBasC0gCRj0Fiw=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  buildInputs = [
+    zlib
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    python-lzo
+  ];
+
+  nativeCheckInputs = [
+    nose
+  ];
+
+  postInstall = ''
+    cp -r scripts/* $out/bin
+
+    # This is a small hack; the test suite uses the scripts which need to
+    # be patched. Linking the patched scripts in $out back to the
+    # working directory allows the tests to run
+    rm -rf scripts
+    ln -s $out/bin scripts
+  '';
+
+  meta = with lib; {
+    description = "Tools for manipulating biological data, particularly multiple sequence alignments";
+    homepage = "https://github.com/bxlab/bx-python";
+    changelog = "https://github.com/bxlab/bx-python/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jbedo ];
+    platforms = [ "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bytecode/default.nix b/nixpkgs/pkgs/development/python-modules/bytecode/default.nix
new file mode 100644
index 000000000000..4df83b9e45df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bytecode/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "bytecode";
+  version = "0.15.1";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "vstinner";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Jzsh0m00SiJjTP7hXMDmuR4XHmsCYdURuFDkVopGyIE=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "bytecode" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/vstinner/bytecode";
+    description = "Python module to generate and modify bytecode";
+    license = licenses.mit;
+    maintainers = with maintainers; [ raboof ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bytewax/Cargo.lock b/nixpkgs/pkgs/development/python-modules/bytewax/Cargo.lock
new file mode 100644
index 000000000000..2837d3c6ca95
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bytewax/Cargo.lock
@@ -0,0 +1,3029 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "abomonation"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56e72913c99b1f927aa7bd59a41518fdd9995f63ffc8760f211609e0241c4fb2"
+
+[[package]]
+name = "abomonation_derive"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e50e2a046af56a864c62d97b7153fda72c596e646be1b0c7963736821f6e1efa"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "synstructure",
+]
+
+[[package]]
+name = "ahash"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
+dependencies = [
+ "getrandom",
+ "once_cell",
+ "version_check",
+]
+
+[[package]]
+name = "ahash"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "version_check",
+]
+
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.71"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8"
+
+[[package]]
+name = "async-stream"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51"
+dependencies = [
+ "async-stream-impl",
+ "futures-core",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "async-stream-impl"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.18",
+]
+
+[[package]]
+name = "async-trait"
+version = "0.1.68"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.18",
+]
+
+[[package]]
+name = "atoi"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d7c57d12312ff59c811c0643f4d80830505833c9ffaebd193d819392b265be8e"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "axum"
+version = "0.5.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "acee9fd5073ab6b045a275b3e709c163dd36c90685219cb21804a147b58dba43"
+dependencies = [
+ "async-trait",
+ "axum-core 0.2.9",
+ "bitflags",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "hyper",
+ "itoa",
+ "matchit 0.5.0",
+ "memchr",
+ "mime",
+ "percent-encoding",
+ "pin-project-lite",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "sync_wrapper",
+ "tokio",
+ "tower",
+ "tower-http",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "axum"
+version = "0.6.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8175979259124331c1d7bf6586ee7e0da434155e4b2d48ec2c8386281d8df39"
+dependencies = [
+ "async-trait",
+ "axum-core 0.3.4",
+ "bitflags",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "hyper",
+ "itoa",
+ "matchit 0.7.0",
+ "memchr",
+ "mime",
+ "percent-encoding",
+ "pin-project-lite",
+ "rustversion",
+ "serde",
+ "sync_wrapper",
+ "tower",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "axum-core"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37e5939e02c56fecd5c017c37df4238c0a839fa76b7f97acdd7efb804fd181cc"
+dependencies = [
+ "async-trait",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "mime",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "axum-core"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c"
+dependencies = [
+ "async-trait",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "mime",
+ "rustversion",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "base64"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
+
+[[package]]
+name = "base64"
+version = "0.21.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d"
+
+[[package]]
+name = "bincode"
+version = "1.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "block-buffer"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1"
+
+[[package]]
+name = "byteorder"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+
+[[package]]
+name = "bytes"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be"
+
+[[package]]
+name = "bytewax"
+version = "0.16.2"
+dependencies = [
+ "axum 0.5.17",
+ "bincode",
+ "chrono",
+ "futures",
+ "num",
+ "openssl-src",
+ "opentelemetry",
+ "opentelemetry-jaeger",
+ "opentelemetry-otlp",
+ "pyo3",
+ "rdkafka",
+ "sasl2-sys",
+ "serde",
+ "serde_test",
+ "sqlx",
+ "timely",
+ "tokio",
+ "tracing",
+ "tracing-opentelemetry",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "cc"
+version = "1.0.79"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "chrono"
+version = "0.4.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "num-traits",
+ "serde",
+ "winapi",
+]
+
+[[package]]
+name = "cmake"
+version = "0.1.50"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "columnation"
+version = "0.1.0"
+source = "git+https://github.com/frankmcsherry/columnation#eb8e20c10e748dcbfe6266be8e24e14422d3de0f"
+dependencies = [
+ "paste",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crc"
+version = "3.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe"
+dependencies = [
+ "crc-catalog",
+]
+
+[[package]]
+name = "crc-catalog"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9cace84e55f07e7301bae1c519df89cdad8cc3cd868413d3fdbdeca9ff3db484"
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-queue"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crypto-common"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+dependencies = [
+ "generic-array",
+ "typenum",
+]
+
+[[package]]
+name = "dashmap"
+version = "5.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc"
+dependencies = [
+ "cfg-if",
+ "hashbrown 0.12.3",
+ "lock_api",
+ "once_cell",
+ "parking_lot_core 0.9.7",
+]
+
+[[package]]
+name = "digest"
+version = "0.10.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+dependencies = [
+ "block-buffer",
+ "crypto-common",
+ "subtle",
+]
+
+[[package]]
+name = "dirs"
+version = "4.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059"
+dependencies = [
+ "dirs-sys",
+]
+
+[[package]]
+name = "dirs-sys"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6"
+dependencies = [
+ "libc",
+ "redox_users",
+ "winapi",
+]
+
+[[package]]
+name = "dotenvy"
+version = "0.15.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b"
+
+[[package]]
+name = "duct"
+version = "0.13.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37ae3fc31835f74c2a7ceda3aeede378b0ae2e74c8f1c36559fcc9ae2a4e7d3e"
+dependencies = [
+ "libc",
+ "once_cell",
+ "os_pipe",
+ "shared_child",
+]
+
+[[package]]
+name = "either"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
+
+[[package]]
+name = "encoding_rs"
+version = "0.8.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "errno"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
+dependencies = [
+ "errno-dragonfly",
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "errno-dragonfly"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "event-listener"
+version = "2.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
+
+[[package]]
+name = "fastrand"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
+dependencies = [
+ "instant",
+]
+
+[[package]]
+name = "fixedbitset"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
+
+[[package]]
+name = "flume"
+version = "0.10.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+ "pin-project",
+ "spin 0.9.8",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "form_urlencoded"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8"
+dependencies = [
+ "percent-encoding",
+]
+
+[[package]]
+name = "futures"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-intrusive"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a604f7a68fbf8103337523b1fadc8ade7361ee3f112f7c680ad179651616aed5"
+dependencies = [
+ "futures-core",
+ "lock_api",
+ "parking_lot 0.11.2",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"
+
+[[package]]
+name = "futures-macro"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.18",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e"
+
+[[package]]
+name = "futures-task"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"
+
+[[package]]
+name = "futures-util"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.14.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "getopts"
+version = "0.2.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5"
+dependencies = [
+ "unicode-width",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi",
+]
+
+[[package]]
+name = "h2"
+version = "0.3.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http",
+ "indexmap",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
+[[package]]
+name = "hashbrown"
+version = "0.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e"
+dependencies = [
+ "ahash 0.8.3",
+]
+
+[[package]]
+name = "hashlink"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0761a1b9491c4f2e3d66aa0f62d0fba0af9a0e2852e4d48ea506632a4b56e6aa"
+dependencies = [
+ "hashbrown 0.13.2",
+]
+
+[[package]]
+name = "heck"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+dependencies = [
+ "unicode-segmentation",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
+[[package]]
+name = "hkdf"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437"
+dependencies = [
+ "hmac",
+]
+
+[[package]]
+name = "hmac"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
+dependencies = [
+ "digest",
+]
+
+[[package]]
+name = "http"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "http-body"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
+dependencies = [
+ "bytes",
+ "http",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "http-range-header"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29"
+
+[[package]]
+name = "httparse"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+
+[[package]]
+name = "httpdate"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
+
+[[package]]
+name = "hyper"
+version = "0.14.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "socket2",
+ "tokio",
+ "tower-service",
+ "tracing",
+ "want",
+]
+
+[[package]]
+name = "hyper-timeout"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1"
+dependencies = [
+ "hyper",
+ "pin-project-lite",
+ "tokio",
+ "tokio-io-timeout",
+]
+
+[[package]]
+name = "iana-time-zone"
+version = "0.1.56"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "idna"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+dependencies = [
+ "autocfg",
+ "hashbrown 0.12.3",
+]
+
+[[package]]
+name = "indoc"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306"
+
+[[package]]
+name = "instant"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "integer-encoding"
+version = "3.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02"
+
+[[package]]
+name = "io-lifetimes"
+version = "1.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
+dependencies = [
+ "hermit-abi 0.3.1",
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "ipnet"
+version = "2.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f"
+
+[[package]]
+name = "itertools"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
+
+[[package]]
+name = "js-sys"
+version = "0.3.63"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "krb5-src"
+version = "0.3.2+1.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44cd3b7e7735d48bc3793837041294f2eb747bd0f63bbc081e89972abb9e48fb"
+dependencies = [
+ "duct",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "libc"
+version = "0.2.144"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1"
+
+[[package]]
+name = "libsqlite3-sys"
+version = "0.24.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "898745e570c7d0453cc1fbc4a701eb6c662ed54e8fec8b7d14be137ebeeb9d14"
+dependencies = [
+ "cc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "libz-sys"
+version = "1.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56ee889ecc9568871456d42f603d6a0ce59ff328d291063a45cbdf0036baf6db"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
+
+[[package]]
+name = "lock_api"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de"
+
+[[package]]
+name = "matchers"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
+dependencies = [
+ "regex-automata",
+]
+
+[[package]]
+name = "matchit"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb"
+
+[[package]]
+name = "matchit"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40"
+
+[[package]]
+name = "md-5"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca"
+dependencies = [
+ "digest",
+]
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "memoffset"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "mime"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
+[[package]]
+name = "mio"
+version = "0.8.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2"
+dependencies = [
+ "libc",
+ "wasi",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "multimap"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a"
+
+[[package]]
+name = "nom"
+version = "7.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]
+
+[[package]]
+name = "nu-ansi-term"
+version = "0.46.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
+dependencies = [
+ "overload",
+ "winapi",
+]
+
+[[package]]
+name = "num"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606"
+dependencies = [
+ "num-bigint",
+ "num-complex",
+ "num-integer",
+ "num-iter",
+ "num-rational",
+ "num-traits",
+]
+
+[[package]]
+name = "num-bigint"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-complex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-iter"
+version = "0.1.43"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-rational"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
+dependencies = [
+ "autocfg",
+ "num-bigint",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b"
+dependencies = [
+ "hermit-abi 0.2.6",
+ "libc",
+]
+
+[[package]]
+name = "num_enum"
+version = "0.5.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9"
+dependencies = [
+ "num_enum_derive",
+]
+
+[[package]]
+name = "num_enum_derive"
+version = "0.5.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799"
+dependencies = [
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.17.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9670a07f94779e00908f3e686eab508878ebb390ba6e604d3a284c00e8d0487b"
+
+[[package]]
+name = "openssl-src"
+version = "111.26.0+1.1.1u"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "efc62c9f12b22b8f5208c23a7200a442b2e5999f8bdf80233852122b5a4f6f37"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "openssl-sys"
+version = "0.9.88"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2ce0f250f34a308dcfdbb351f511359857d4ed2134ba715a4eadd46e1ffd617"
+dependencies = [
+ "cc",
+ "libc",
+ "openssl-src",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "opentelemetry"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69d6c3d7288a106c0a363e4b0e8d308058d56902adefb16f4936f417ffef086e"
+dependencies = [
+ "opentelemetry_api",
+ "opentelemetry_sdk",
+]
+
+[[package]]
+name = "opentelemetry-http"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc79add46364183ece1a4542592ca593e6421c60807232f5b8f7a31703825d"
+dependencies = [
+ "async-trait",
+ "bytes",
+ "http",
+ "opentelemetry_api",
+ "reqwest",
+]
+
+[[package]]
+name = "opentelemetry-jaeger"
+version = "0.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e785d273968748578931e4dc3b4f5ec86b26e09d9e0d66b55adda7fce742f7a"
+dependencies = [
+ "async-trait",
+ "futures",
+ "futures-executor",
+ "once_cell",
+ "opentelemetry",
+ "opentelemetry-semantic-conventions",
+ "thiserror",
+ "thrift",
+ "tokio",
+]
+
+[[package]]
+name = "opentelemetry-otlp"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d1c928609d087790fc936a1067bdc310ae702bdf3b090c3f281b713622c8bbde"
+dependencies = [
+ "async-trait",
+ "futures",
+ "futures-util",
+ "http",
+ "opentelemetry",
+ "opentelemetry-http",
+ "opentelemetry-proto",
+ "prost",
+ "reqwest",
+ "thiserror",
+ "tokio",
+ "tonic",
+]
+
+[[package]]
+name = "opentelemetry-proto"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d61a2f56df5574508dd86aaca016c917489e589ece4141df1b5e349af8d66c28"
+dependencies = [
+ "futures",
+ "futures-util",
+ "opentelemetry",
+ "prost",
+ "tonic",
+ "tonic-build",
+]
+
+[[package]]
+name = "opentelemetry-semantic-conventions"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b02e0230abb0ab6636d18e2ba8fa02903ea63772281340ccac18e0af3ec9eeb"
+dependencies = [
+ "opentelemetry",
+]
+
+[[package]]
+name = "opentelemetry_api"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c24f96e21e7acc813c7a8394ee94978929db2bcc46cf6b5014fc612bf7760c22"
+dependencies = [
+ "fnv",
+ "futures-channel",
+ "futures-util",
+ "indexmap",
+ "js-sys",
+ "once_cell",
+ "pin-project-lite",
+ "thiserror",
+]
+
+[[package]]
+name = "opentelemetry_sdk"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ca41c4933371b61c2a2f214bf16931499af4ec90543604ec828f7a625c09113"
+dependencies = [
+ "async-trait",
+ "crossbeam-channel",
+ "dashmap",
+ "fnv",
+ "futures-channel",
+ "futures-executor",
+ "futures-util",
+ "once_cell",
+ "opentelemetry_api",
+ "percent-encoding",
+ "rand",
+ "thiserror",
+ "tokio",
+ "tokio-stream",
+]
+
+[[package]]
+name = "ordered-float"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3305af35278dd29f46fcdd139e0b1fbfae2153f0e5928b39b035542dd31e37b7"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "os_pipe"
+version = "1.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ae859aa07428ca9a929b936690f8b12dc5f11dd8c6992a18ca93919f28bc177"
+dependencies = [
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "overload"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
+
+[[package]]
+name = "parking_lot"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
+dependencies = [
+ "instant",
+ "lock_api",
+ "parking_lot_core 0.8.6",
+]
+
+[[package]]
+name = "parking_lot"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+dependencies = [
+ "lock_api",
+ "parking_lot_core 0.9.7",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc"
+dependencies = [
+ "cfg-if",
+ "instant",
+ "libc",
+ "redox_syscall 0.2.16",
+ "smallvec",
+ "winapi",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall 0.2.16",
+ "smallvec",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "paste"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79"
+
+[[package]]
+name = "percent-encoding"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
+
+[[package]]
+name = "petgraph"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4"
+dependencies = [
+ "fixedbitset",
+ "indexmap",
+]
+
+[[package]]
+name = "pin-project"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c95a7476719eab1e366eaf73d0260af3021184f18177925b07f54b30089ceead"
+dependencies = [
+ "pin-project-internal",
+]
+
+[[package]]
+name = "pin-project-internal"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.18",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+
+[[package]]
+name = "prettyplease"
+version = "0.1.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86"
+dependencies = [
+ "proc-macro2",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "proc-macro-crate"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919"
+dependencies = [
+ "once_cell",
+ "toml_edit",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.59"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "prost"
+version = "0.11.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd"
+dependencies = [
+ "bytes",
+ "prost-derive",
+]
+
+[[package]]
+name = "prost-build"
+version = "0.11.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270"
+dependencies = [
+ "bytes",
+ "heck",
+ "itertools",
+ "lazy_static",
+ "log",
+ "multimap",
+ "petgraph",
+ "prettyplease",
+ "prost",
+ "prost-types",
+ "regex",
+ "syn 1.0.109",
+ "tempfile",
+ "which",
+]
+
+[[package]]
+name = "prost-derive"
+version = "0.11.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4"
+dependencies = [
+ "anyhow",
+ "itertools",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "prost-types"
+version = "0.11.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13"
+dependencies = [
+ "prost",
+]
+
+[[package]]
+name = "pyo3"
+version = "0.18.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3b1ac5b3731ba34fdaa9785f8d74d17448cd18f30cf19e0c7e7b1fdb5272109"
+dependencies = [
+ "cfg-if",
+ "chrono",
+ "indoc",
+ "libc",
+ "memoffset",
+ "parking_lot 0.12.1",
+ "pyo3-build-config",
+ "pyo3-ffi",
+ "pyo3-macros",
+ "unindent",
+]
+
+[[package]]
+name = "pyo3-build-config"
+version = "0.18.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9cb946f5ac61bb61a5014924910d936ebd2b23b705f7a4a3c40b05c720b079a3"
+dependencies = [
+ "once_cell",
+ "target-lexicon",
+]
+
+[[package]]
+name = "pyo3-ffi"
+version = "0.18.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd4d7c5337821916ea2a1d21d1092e8443cf34879e53a0ac653fbb98f44ff65c"
+dependencies = [
+ "libc",
+ "pyo3-build-config",
+]
+
+[[package]]
+name = "pyo3-macros"
+version = "0.18.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9d39c55dab3fc5a4b25bbd1ac10a2da452c4aca13bb450f22818a002e29648d"
+dependencies = [
+ "proc-macro2",
+ "pyo3-macros-backend",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "pyo3-macros-backend"
+version = "0.18.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97daff08a4c48320587b5224cc98d609e3c27b6d437315bd40b605c98eeb5918"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "rdkafka"
+version = "0.28.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1de127f294f2dba488ed46760b129d5ecbeabbd337ccbf3739cb29d50db2161c"
+dependencies = [
+ "futures",
+ "libc",
+ "log",
+ "rdkafka-sys",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "slab",
+ "tokio",
+]
+
+[[package]]
+name = "rdkafka-sys"
+version = "4.4.0+1.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87ac9d87c3aba1748e3112318459f2ac8bff80bfff7359e338e0463549590249"
+dependencies = [
+ "cmake",
+ "libc",
+ "libz-sys",
+ "num_enum",
+ "openssl-sys",
+ "pkg-config",
+ "sasl2-sys",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "redox_users"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
+dependencies = [
+ "getrandom",
+ "redox_syscall 0.2.16",
+ "thiserror",
+]
+
+[[package]]
+name = "regex"
+version = "1.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81ca098a9821bd52d6b24fd8b10bd081f47d39c22778cafaa75a2857a62c6390"
+dependencies = [
+ "regex-syntax 0.7.2",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+dependencies = [
+ "regex-syntax 0.6.29",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
+
+[[package]]
+name = "regex-syntax"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78"
+
+[[package]]
+name = "reqwest"
+version = "0.11.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55"
+dependencies = [
+ "base64 0.21.2",
+ "bytes",
+ "encoding_rs",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "hyper",
+ "ipnet",
+ "js-sys",
+ "log",
+ "mime",
+ "once_cell",
+ "percent-encoding",
+ "pin-project-lite",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "tokio",
+ "tower-service",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+ "winreg",
+]
+
+[[package]]
+name = "ring"
+version = "0.16.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"
+dependencies = [
+ "cc",
+ "libc",
+ "once_cell",
+ "spin 0.5.2",
+ "untrusted",
+ "web-sys",
+ "winapi",
+]
+
+[[package]]
+name = "rustix"
+version = "0.37.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d"
+dependencies = [
+ "bitflags",
+ "errno",
+ "io-lifetimes",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "rustls"
+version = "0.20.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f"
+dependencies = [
+ "log",
+ "ring",
+ "sct",
+ "webpki",
+]
+
+[[package]]
+name = "rustls-pemfile"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b"
+dependencies = [
+ "base64 0.21.2",
+]
+
+[[package]]
+name = "rustversion"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06"
+
+[[package]]
+name = "ryu"
+version = "1.0.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
+
+[[package]]
+name = "sasl2-sys"
+version = "0.1.20+2.1.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e645bd98535fc8fd251c43ba7c7c1f9be1e0369c99b6a5ea719052a773e655c"
+dependencies = [
+ "cc",
+ "duct",
+ "krb5-src",
+ "libc",
+ "openssl-sys",
+ "pkg-config",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "sct"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "serde"
+version = "1.0.163"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.163"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.18",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.96"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_test"
+version = "1.0.163"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "100168a8017b89fd4bcbeb8d857d95a8cfcbde829a7147c09cc82d3ab8d8cb41"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "serde_urlencoded"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
+dependencies = [
+ "form_urlencoded",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "sha1"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "sha2"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "sharded-slab"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "shared_child"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0d94659ad3c2137fef23ae75b03d5241d633f8acded53d672decfa0e6e0caef"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "slab"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
+
+[[package]]
+name = "socket2"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "spin"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
+
+[[package]]
+name = "spin"
+version = "0.9.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
+dependencies = [
+ "lock_api",
+]
+
+[[package]]
+name = "sqlformat"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c12bc9199d1db8234678b7051747c07f517cdcf019262d1847b94ec8b1aee3e"
+dependencies = [
+ "itertools",
+ "nom",
+ "unicode_categories",
+]
+
+[[package]]
+name = "sqlx"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8de3b03a925878ed54a954f621e64bf55a3c1bd29652d0d1a17830405350188"
+dependencies = [
+ "sqlx-core",
+ "sqlx-macros",
+]
+
+[[package]]
+name = "sqlx-core"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa8241483a83a3f33aa5fff7e7d9def398ff9990b2752b6c6112b83c6d246029"
+dependencies = [
+ "ahash 0.7.6",
+ "atoi",
+ "base64 0.13.1",
+ "bitflags",
+ "byteorder",
+ "bytes",
+ "chrono",
+ "crc",
+ "crossbeam-queue",
+ "dirs",
+ "dotenvy",
+ "either",
+ "event-listener",
+ "flume",
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-intrusive",
+ "futures-util",
+ "hashlink",
+ "hex",
+ "hkdf",
+ "hmac",
+ "indexmap",
+ "itoa",
+ "libc",
+ "libsqlite3-sys",
+ "log",
+ "md-5",
+ "memchr",
+ "once_cell",
+ "paste",
+ "percent-encoding",
+ "rand",
+ "rustls",
+ "rustls-pemfile",
+ "serde",
+ "serde_json",
+ "sha1",
+ "sha2",
+ "smallvec",
+ "sqlformat",
+ "sqlx-rt",
+ "stringprep",
+ "thiserror",
+ "tokio-stream",
+ "url",
+ "webpki-roots",
+ "whoami",
+]
+
+[[package]]
+name = "sqlx-macros"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9966e64ae989e7e575b19d7265cb79d7fc3cbbdf179835cb0d716f294c2049c9"
+dependencies = [
+ "dotenvy",
+ "either",
+ "heck",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "sha2",
+ "sqlx-core",
+ "sqlx-rt",
+ "syn 1.0.109",
+ "url",
+]
+
+[[package]]
+name = "sqlx-rt"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "804d3f245f894e61b1e6263c84b23ca675d96753b5abfd5cc8597d86806e8024"
+dependencies = [
+ "once_cell",
+ "tokio",
+ "tokio-rustls",
+]
+
+[[package]]
+name = "stringprep"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "subtle"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "sync_wrapper"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
+
+[[package]]
+name = "synstructure"
+version = "0.12.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+ "unicode-xid",
+]
+
+[[package]]
+name = "target-lexicon"
+version = "0.12.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd1ba337640d60c3e96bc6f0638a939b9c9a7f2c316a1598c279828b3d1dc8c5"
+
+[[package]]
+name = "tempfile"
+version = "3.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998"
+dependencies = [
+ "cfg-if",
+ "fastrand",
+ "redox_syscall 0.3.5",
+ "rustix",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.18",
+]
+
+[[package]]
+name = "thread_local"
+version = "1.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+]
+
+[[package]]
+name = "threadpool"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa"
+dependencies = [
+ "num_cpus",
+]
+
+[[package]]
+name = "thrift"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09678c4cdbb4eed72e18b7c2af1329c69825ed16fcbac62d083fc3e2b0590ff0"
+dependencies = [
+ "byteorder",
+ "integer-encoding",
+ "log",
+ "ordered-float",
+ "threadpool",
+]
+
+[[package]]
+name = "timely"
+version = "0.12.0"
+source = "git+https://github.com/TimelyDataflow/timely-dataflow.git?rev=432ef57#432ef57fae761f1e4773833b0474b41f1efe7e7c"
+dependencies = [
+ "abomonation",
+ "abomonation_derive",
+ "crossbeam-channel",
+ "futures-util",
+ "getopts",
+ "serde",
+ "serde_derive",
+ "timely_bytes",
+ "timely_communication",
+ "timely_container",
+ "timely_logging",
+]
+
+[[package]]
+name = "timely_bytes"
+version = "0.12.0"
+source = "git+https://github.com/TimelyDataflow/timely-dataflow.git?rev=432ef57#432ef57fae761f1e4773833b0474b41f1efe7e7c"
+
+[[package]]
+name = "timely_communication"
+version = "0.12.0"
+source = "git+https://github.com/TimelyDataflow/timely-dataflow.git?rev=432ef57#432ef57fae761f1e4773833b0474b41f1efe7e7c"
+dependencies = [
+ "abomonation",
+ "abomonation_derive",
+ "bincode",
+ "crossbeam-channel",
+ "getopts",
+ "serde",
+ "serde_derive",
+ "timely_bytes",
+ "timely_logging",
+]
+
+[[package]]
+name = "timely_container"
+version = "0.12.0"
+source = "git+https://github.com/TimelyDataflow/timely-dataflow.git?rev=432ef57#432ef57fae761f1e4773833b0474b41f1efe7e7c"
+dependencies = [
+ "columnation",
+ "serde",
+]
+
+[[package]]
+name = "timely_logging"
+version = "0.12.0"
+source = "git+https://github.com/TimelyDataflow/timely-dataflow.git?rev=432ef57#432ef57fae761f1e4773833b0474b41f1efe7e7c"
+
+[[package]]
+name = "tinyvec"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+
+[[package]]
+name = "tokio"
+version = "1.28.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2"
+dependencies = [
+ "autocfg",
+ "bytes",
+ "libc",
+ "mio",
+ "num_cpus",
+ "parking_lot 0.12.1",
+ "pin-project-lite",
+ "signal-hook-registry",
+ "socket2",
+ "tokio-macros",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "tokio-io-timeout"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf"
+dependencies = [
+ "pin-project-lite",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-macros"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.18",
+]
+
+[[package]]
+name = "tokio-rustls"
+version = "0.23.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59"
+dependencies = [
+ "rustls",
+ "tokio",
+ "webpki",
+]
+
+[[package]]
+name = "tokio-stream"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842"
+dependencies = [
+ "futures-core",
+ "pin-project-lite",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.7.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "toml_datetime"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a76a9312f5ba4c2dec6b9161fdf25d87ad8a09256ccea5a556fef03c706a10f"
+
+[[package]]
+name = "toml_edit"
+version = "0.19.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2380d56e8670370eee6566b0bfd4265f65b3f432e8c6d85623f728d4fa31f739"
+dependencies = [
+ "indexmap",
+ "toml_datetime",
+ "winnow",
+]
+
+[[package]]
+name = "tonic"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f219fad3b929bef19b1f86fbc0358d35daed8f2cac972037ac0dc10bbb8d5fb"
+dependencies = [
+ "async-stream",
+ "async-trait",
+ "axum 0.6.18",
+ "base64 0.13.1",
+ "bytes",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "hyper",
+ "hyper-timeout",
+ "percent-encoding",
+ "pin-project",
+ "prost",
+ "prost-derive",
+ "tokio",
+ "tokio-stream",
+ "tokio-util",
+ "tower",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+ "tracing-futures",
+]
+
+[[package]]
+name = "tonic-build"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5bf5e9b9c0f7e0a7c027dcfaba7b2c60816c7049171f679d99ee2ff65d0de8c4"
+dependencies = [
+ "prettyplease",
+ "proc-macro2",
+ "prost-build",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "tower"
+version = "0.4.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
+dependencies = [
+ "futures-core",
+ "futures-util",
+ "indexmap",
+ "pin-project",
+ "pin-project-lite",
+ "rand",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "tower-http"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858"
+dependencies = [
+ "bitflags",
+ "bytes",
+ "futures-core",
+ "futures-util",
+ "http",
+ "http-body",
+ "http-range-header",
+ "pin-project-lite",
+ "tower",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "tower-layer"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
+
+[[package]]
+name = "tower-service"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
+
+[[package]]
+name = "tracing"
+version = "0.1.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
+dependencies = [
+ "cfg-if",
+ "log",
+ "pin-project-lite",
+ "tracing-attributes",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-attributes"
+version = "0.1.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.18",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a"
+dependencies = [
+ "once_cell",
+ "valuable",
+]
+
+[[package]]
+name = "tracing-futures"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2"
+dependencies = [
+ "pin-project",
+ "tracing",
+]
+
+[[package]]
+name = "tracing-log"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
+dependencies = [
+ "lazy_static",
+ "log",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-opentelemetry"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "21ebb87a95ea13271332df069020513ab70bdb5637ca42d6e492dc3bbbad48de"
+dependencies = [
+ "once_cell",
+ "opentelemetry",
+ "tracing",
+ "tracing-core",
+ "tracing-log",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "tracing-subscriber"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77"
+dependencies = [
+ "matchers",
+ "nu-ansi-term",
+ "once_cell",
+ "regex",
+ "sharded-slab",
+ "smallvec",
+ "thread_local",
+ "tracing",
+ "tracing-core",
+ "tracing-log",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
+
+[[package]]
+name = "typenum"
+version = "1.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-segmentation"
+version = "1.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
+
+[[package]]
+name = "unicode-width"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
+
+[[package]]
+name = "unicode_categories"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e"
+
+[[package]]
+name = "unindent"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1766d682d402817b5ac4490b3c3002d91dfa0d22812f341609f97b08757359c"
+
+[[package]]
+name = "untrusted"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
+
+[[package]]
+name = "url"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "percent-encoding",
+]
+
+[[package]]
+name = "valuable"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
+
+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "want"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0"
+dependencies = [
+ "log",
+ "try-lock",
+]
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.86"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.86"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.18",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.36"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d1985d03709c53167ce907ff394f5316aa22cb4e12761295c5dc57dacb6297e"
+dependencies = [
+ "cfg-if",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.86"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.86"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.18",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.86"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93"
+
+[[package]]
+name = "web-sys"
+version = "0.3.63"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "webpki"
+version = "0.22.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "webpki-roots"
+version = "0.22.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87"
+dependencies = [
+ "webpki",
+]
+
+[[package]]
+name = "which"
+version = "4.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269"
+dependencies = [
+ "either",
+ "libc",
+ "once_cell",
+]
+
+[[package]]
+name = "whoami"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c70234412ca409cc04e864e89523cb0fc37f5e1344ebed5a3ebf4192b6b9f68"
+dependencies = [
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "windows"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
+dependencies = [
+ "windows-targets 0.48.0",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.45.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
+dependencies = [
+ "windows-targets 0.42.2",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets 0.48.0",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
+dependencies = [
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5"
+dependencies = [
+ "windows_aarch64_gnullvm 0.48.0",
+ "windows_aarch64_msvc 0.48.0",
+ "windows_i686_gnu 0.48.0",
+ "windows_i686_msvc 0.48.0",
+ "windows_x86_64_gnu 0.48.0",
+ "windows_x86_64_gnullvm 0.48.0",
+ "windows_x86_64_msvc 0.48.0",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
+
+[[package]]
+name = "winnow"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "winreg"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d"
+dependencies = [
+ "winapi",
+]
diff --git a/nixpkgs/pkgs/development/python-modules/bytewax/default.nix b/nixpkgs/pkgs/development/python-modules/bytewax/default.nix
new file mode 100644
index 000000000000..c27d756070de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bytewax/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cmake
+, confluent-kafka
+, cyrus_sasl
+, fetchFromGitHub
+, openssl
+, pkg-config
+, protobuf
+, pytestCheckHook
+, pythonOlder
+, rustPlatform
+, setuptools-rust
+}:
+
+buildPythonPackage rec {
+  pname = "bytewax";
+  version = "0.17.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bytewax";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Cv2bTgs3XfYOcHK628/RgGol7S6E4WfHb7gHXXjBhig=";
+  };
+
+  env = {
+    OPENSSL_NO_VENDOR = true;
+  };
+
+  # Remove docs tests, myst-docutils in nixpkgs is not compatible with package requirements.
+  # Package uses old version.
+  patches = [ ./remove-docs-test.patch ];
+
+  cargoDeps = rustPlatform.importCargoLock {
+    lockFile = ./Cargo.lock;
+    outputHashes = {
+      "columnation-0.1.0" = "sha256-RAyZKR+sRmeWGh7QYPZnJgX9AtWqmca85HcABEFUgX8=";
+      "timely-0.12.0" = "sha256-sZuVLBDCXurIe38m4UAjEuFeh73VQ5Jawy+sr3U/HbI=";
+    };
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+    rustPlatform.maturinBuildHook
+    rustPlatform.cargoSetupHook
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  buildInputs = [
+    openssl
+    cyrus_sasl
+    protobuf
+  ];
+
+  passthru.optional-dependencies = {
+    kafka = [
+      confluent-kafka
+    ];
+  };
+
+  preCheck = ''
+    export PY_IGNORE_IMPORTMISMATCH=1
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "bytewax"
+  ];
+
+  meta = with lib; {
+    description = "Python Stream Processing";
+    homepage = "https://github.com/bytewax/bytewax";
+    changelog = "https://github.com/bytewax/bytewax/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ mslingsby kfollesdal ];
+    # mismatched type expected u8, found i8
+    broken = stdenv.isAarch64;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/bytewax/remove-docs-test.patch b/nixpkgs/pkgs/development/python-modules/bytewax/remove-docs-test.patch
new file mode 100644
index 000000000000..d5c9269a01b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bytewax/remove-docs-test.patch
@@ -0,0 +1,10 @@
+diff --git a/pyproject.toml b/pyproject.toml
+index 41b5c90..e7c7b2d 100644
+--- a/pyproject.toml
++++ b/pyproject.toml
+@@ -50,6 +50,5 @@ doctest_optionflags = "NORMALIZE_WHITESPACE"
+ testpaths = [
+     "pytests",
+     "pysrc",
+-    "docs",
+ ]
diff --git a/nixpkgs/pkgs/development/python-modules/bz2file/default.nix b/nixpkgs/pkgs/development/python-modules/bz2file/default.nix
new file mode 100644
index 000000000000..8efb1c083f26
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/bz2file/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "bz2file";
+  version = "0.98";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "126s53fkpx04f33a829yqqk8fj4png3qwg4m66cvlmhmwc8zihb4";
+  };
+
+  doCheck = false;
+  # The test module (test_bz2file) is not available
+
+  meta = {
+    description = "Bz2file is a Python library for reading and writing bzip2-compressed files";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ jyp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cachecontrol/default.nix b/nixpkgs/pkgs/development/python-modules/cachecontrol/default.nix
new file mode 100644
index 000000000000..99a128b0496b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cachecontrol/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, cherrypy
+, fetchFromGitHub
+, flit-core
+, filelock
+, mock
+, msgpack
+, pytestCheckHook
+, pythonOlder
+, redis
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "cachecontrol";
+  version = "0.13.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  __darwinAllowLocalNetworking = true;
+
+  src = fetchFromGitHub {
+    owner = "ionrock";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-4N+vk65WxOrT+IJRn+lEnbs5vlWQh9ievVHWWe3BKJ0=";
+  };
+
+  postPatch = ''
+    # https://github.com/ionrock/cachecontrol/issues/297
+    substituteInPlace tests/test_etag.py --replace \
+      "requests.adapters.HTTPResponse.from_httplib" \
+      "urllib3.response.HTTPResponse.from_httplib"
+  '';
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    msgpack
+    requests
+  ];
+
+  passthru.optional-dependencies = {
+    filecache = [
+      filelock
+    ];
+    redis = [
+      redis
+    ];
+  };
+
+  nativeCheckInputs = [
+    cherrypy
+    mock
+    pytestCheckHook
+    requests
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "cachecontrol"
+  ];
+
+  meta = with lib; {
+    description = "Httplib2 caching for requests";
+    homepage = "https://github.com/ionrock/cachecontrol";
+    changelog = "https://github.com/psf/cachecontrol/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cached-property/default.nix b/nixpkgs/pkgs/development/python-modules/cached-property/default.nix
new file mode 100644
index 000000000000..555b1ce006e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cached-property/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+, freezegun
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cached-property";
+  version = "1.5.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pydanny";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-DGI8FaEjFd2bDeBDKcA0zDCE+5I6meapVNZgycE1gzs=";
+  };
+
+  patches = [
+    # Don't use asyncio.coroutine if it's not available, https://github.com/pydanny/cached-property/pull/267
+    (fetchpatch {
+      name = "asyncio-coroutine.patch";
+      url = "https://github.com/pydanny/cached-property/commit/297031687679762849dedeaf24aa3a19116f095b.patch";
+      hash = "sha256-qolrUdaX7db4hE125Lt9ICmPNYsD/uBmQrdO4q5NG3c=";
+    })
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    freezegun
+  ];
+
+  disabledTests = [
+    # https://github.com/pydanny/cached-property/issues/131
+    "test_threads_ttl_expiry"
+  ];
+
+  pythonImportsCheck = [
+    "cached_property"
+  ];
+
+  meta = with lib; {
+    description = "A decorator for caching properties in classes";
+    homepage = "https://github.com/pydanny/cached-property";
+    changelog = "https://github.com/pydanny/cached-property/releases/tag/${version}";
+    license = licenses.bsd3;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ ericsagnes ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cachelib/default.nix b/nixpkgs/pkgs/development/python-modules/cachelib/default.nix
new file mode 100644
index 000000000000..6a4f874a961c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cachelib/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-xprocess
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cachelib";
+  version = "0.10.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "pallets";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-2V2FvZC8jM84fZEdK9ShzFrjO8goOQsN6cnJTHDDL9E=";
+  };
+
+  nativeCheckInputs = [
+    pytest-xprocess
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # requires set up local server
+    "tests/test_dynamodb_cache.py"
+  ];
+
+  pythonImportsCheck = [ "cachelib" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pallets/cachelib";
+    description = "Collection of cache libraries in the same API interface";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ gebner ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cachetools/default.nix b/nixpkgs/pkgs/development/python-modules/cachetools/default.nix
new file mode 100644
index 000000000000..14682f23001f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cachetools/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cachetools";
+  version = "5.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tkem";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-7MbP3jz17lGwjAeWo8QmS5v1vGqIQmYLbKVcK/q89Z4=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "cachetools"
+  ];
+
+  meta = with lib; {
+    description = "Extensible memoizing collections and decorators";
+    homepage = "https://github.com/tkem/cachetools";
+    changelog = "https://github.com/tkem/cachetools/blob/v${version}/CHANGELOG.rst";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cachey/default.nix b/nixpkgs/pkgs/development/python-modules/cachey/default.nix
new file mode 100644
index 000000000000..ac175fa0793a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cachey/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, typing-extensions
+, heapdict
+, pytestCheckHook
+, pythonOlder
+}: buildPythonPackage rec {
+  pname = "cachey";
+  version = "0.2.1";
+  format = "setuptools";
+  disabled = pythonOlder "3.6";
+  src = fetchFromGitHub {
+    owner = "dask";
+    repo = pname;
+    rev = version;
+    hash = "sha256-5USmuufrrWtmgibpfkjo9NtgN30hdl8plJfythmxM4s=";
+  };
+  propagatedBuildInputs = [ typing-extensions heapdict ];
+  nativeCheckInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [
+    "cachey"
+  ];
+  meta = with lib; {
+    description = "Caching based on computation time and storage space";
+    homepage = "https://github.com/dask/cachey/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ SomeoneSerge ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cacheyou/default.nix b/nixpkgs/pkgs/development/python-modules/cacheyou/default.nix
new file mode 100644
index 000000000000..375beadd4f6d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cacheyou/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, cherrypy
+, fetchPypi
+, filelock
+, msgpack
+, pdm-backend
+, pytestCheckHook
+, pythonOlder
+, redis
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "cacheyou";
+  version = "23.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  __darwinAllowLocalNetworking = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-fkCPFfSXj+oiR3NLMIYh919/4Wm0YWeVGccuioXWHV0=";
+  };
+
+  nativeBuildInputs = [
+    pdm-backend
+  ];
+
+  propagatedBuildInputs = [
+    msgpack
+    requests
+  ];
+
+  passthru.optional-dependencies = {
+    filecache = [
+      filelock
+    ];
+    redis = [
+      redis
+    ];
+  };
+
+  nativeCheckInputs = [
+    cherrypy
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.filecache;
+
+  pythonImportsCheck = [
+    "cacheyou"
+  ];
+
+  meta = {
+    description = "The httplib2 caching algorithms packaged up for use with requests";
+    homepage = "https://github.com/frostming/cacheyou";
+    changelog = "https://github.com/frostming/cacheyou/releases/tag/${version}";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cachier/default.nix b/nixpkgs/pkgs/development/python-modules/cachier/default.nix
new file mode 100644
index 000000000000..2a1fe461d51c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cachier/default.nix
@@ -0,0 +1,87 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, pythonRelaxDepsHook
+, setuptools
+, watchdog
+, portalocker
+, pathtools
+, pytestCheckHook
+, pymongo
+, dnspython
+, pymongo-inmemory
+, pandas
+}:
+
+buildPythonPackage rec {
+  pname = "cachier";
+  version = "2.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-nm98LT87Z7yErKvIqMp93OEX9TDojqqtItgryHgSQJQ=";
+  };
+
+  pythonRemoveDeps = [ "setuptools" ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    watchdog
+    portalocker
+    pathtools
+  ];
+
+  preCheck = ''
+    substituteInPlace pytest.ini \
+      --replace  \
+        "--cov" \
+        "#--cov"
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pymongo
+    dnspython
+    pymongo-inmemory
+    pandas
+  ];
+
+  disabledTests = [
+    # touches network
+    "test_mongetter_default_param"
+    "test_stale_after_applies_dynamically"
+    "test_next_time_applies_dynamically"
+    "test_wait_for_calc_"
+    "test_precache_value"
+    "test_ignore_self_in_methods"
+    "test_mongo_index_creation"
+    "test_mongo_core"
+
+    # don't test formatting
+    "test_flake8"
+  ];
+
+  preBuild = ''
+    export HOME="$(mktemp -d)"
+  '';
+
+  pythonImportsCheck = [
+    "cachier"
+    "cachier.scripts"
+  ];
+
+  meta = {
+    homepage = "https://github.com/python-cachier/cachier";
+    description = "Persistent, stale-free, local and cross-machine caching for functions";
+    maintainers = with lib.maintainers; [ pbsds ];
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cachy/default.nix b/nixpkgs/pkgs/development/python-modules/cachy/default.nix
new file mode 100644
index 000000000000..c88067146f34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cachy/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi
+, redis
+, python-memcached
+, msgpack
+}:
+
+buildPythonPackage rec {
+  pname = "cachy";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "186581f4ceb42a0bbe040c407da73c14092379b1e4c0e327fdb72ae4a9b269b1";
+  };
+
+  propagatedBuildInputs = [
+    redis
+    python-memcached
+    msgpack
+  ];
+
+  # The Pypi tarball doesn't include tests, and the GitHub source isn't
+  # buildable until we bootstrap poetry, see
+  # https://github.com/NixOS/nixpkgs/pull/53599#discussion_r245855665
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/sdispater/cachy";
+    description = "Cachy provides a simple yet effective caching library";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jakewaksbaum ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cadquery/default.nix b/nixpkgs/pkgs/development/python-modules/cadquery/default.nix
new file mode 100644
index 000000000000..1eb8f73b7a77
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cadquery/default.nix
@@ -0,0 +1,99 @@
+{ lib
+, buildPythonPackage
+, toPythonModule
+, pythonOlder
+, pythonAtLeast
+, fetchFromGitHub
+, pyparsing
+, opencascade-occt
+, stdenv
+, python
+, cmake
+, swig
+, freetype
+, libGL
+, libGLU
+, libX11
+, six
+, pytest
+, makeFontsConf
+, freefont_ttf
+, Cocoa
+}:
+
+let
+  pythonocc-core-cadquery = toPythonModule (stdenv.mkDerivation {
+    pname = "pythonocc-core-cadquery";
+    version = "0.18.2";
+
+    src = fetchFromGitHub {
+      owner = "CadQuery";
+      repo = "pythonocc-core";
+      # no proper release to to use, this commit copied from the Anaconda receipe
+      rev = "701e924ae40701cbe6f9992bcbdc2ef22aa9b5ab";
+      sha256 = "07zmiiw74dyj4v0ar5vqkvk30wzcpjjzbi04nsdk5mnlzslmyi6c";
+    };
+
+    nativeBuildInputs = [
+      cmake
+      swig
+    ];
+
+    buildInputs = [
+      python
+      opencascade-occt
+      freetype
+      libGL
+      libGLU
+      libX11
+    ] ++ lib.optionals stdenv.isDarwin [ Cocoa ];
+
+    propagatedBuildInputs = [
+      six
+    ];
+
+    cmakeFlags = [
+      "-Wno-dev"
+      "-DPYTHONOCC_INSTALL_DIRECTORY=${placeholder "out"}/${python.sitePackages}/OCC"
+    ];
+  });
+
+in
+  buildPythonPackage rec {
+    pname = "cadquery";
+    version = "2.0";
+
+    src = fetchFromGitHub {
+      owner = "CadQuery";
+      repo = pname;
+      rev = version;
+      sha256 = "1n63b6cjjrdwdfmwq0zx1xabjnhndk9mgfkm4w7z9ardcfpvg84l";
+    };
+
+    buildInputs = [
+      opencascade-occt
+    ];
+
+    propagatedBuildInputs = [
+      pyparsing
+      pythonocc-core-cadquery
+    ];
+
+    FONTCONFIG_FILE = makeFontsConf {
+      fontDirectories = [ freefont_ttf ];
+    };
+
+    nativeCheckInputs = [
+      pytest
+    ];
+
+    disabled = pythonOlder "3.6" || pythonAtLeast "3.8";
+
+    meta = with lib; {
+      description = "Parametric scripting language for creating and traversing CAD models";
+      homepage = "https://github.com/CadQuery/cadquery";
+      license = licenses.asl20;
+      maintainers = with maintainers; [ marcus7070 ];
+      broken = true;
+    };
+  }
diff --git a/nixpkgs/pkgs/development/python-modules/caio/default.nix b/nixpkgs/pkgs/development/python-modules/caio/default.nix
new file mode 100644
index 000000000000..ee1bdc8dc62f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/caio/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, aiomisc
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "caio";
+  version = "0.9.13";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mosquito";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Q87NuL6yZ5uKImQqqdKTMWNyfUOb4NaZDEvNdqZbHDk=";
+  };
+
+  nativeCheckInputs = [
+    aiomisc
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "caio"
+  ];
+
+  meta = with lib; {
+    description = "File operations with asyncio support";
+    homepage = "https://github.com/mosquito/caio";
+    changelog = "https://github.com/mosquito/caio/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cairocffi/default.nix b/nixpkgs/pkgs/development/python-modules/cairocffi/default.nix
new file mode 100644
index 000000000000..fb0a81e202d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cairocffi/default.nix
@@ -0,0 +1,70 @@
+# FIXME: make gdk-pixbuf dependency optional
+{ stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, lib
+, substituteAll
+, makeFontsConf
+, freefont_ttf
+, pikepdf
+, pytestCheckHook
+, cairo
+, cffi
+, flit-core
+, numpy
+, withXcffib ? false
+, xcffib
+, glib
+, gdk-pixbuf
+}:
+
+buildPythonPackage rec {
+  pname = "cairocffi";
+  version = "1.6.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-eOa75HNXZAxFPQvpKfpJzQXM4uEobz0qHKnL2n79uLc=";
+  };
+
+  patches = [
+    # OSError: dlopen() failed to load a library: gdk-pixbuf-2.0 / gdk-pixbuf-2.0-0
+    (substituteAll {
+      src = ./dlopen-paths.patch;
+      ext = stdenv.hostPlatform.extensions.sharedLibrary;
+      cairo = cairo.out;
+      glib = glib.out;
+      gdk_pixbuf = gdk-pixbuf.out;
+    })
+    ./fix_test_scaled_font.patch
+  ];
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [ cairo cffi ]
+    ++ lib.optional withXcffib xcffib;
+
+  nativeCheckInputs = [
+    numpy
+    pikepdf
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "cairocffi"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/Kozea/cairocffi/blob/v${version}/NEWS.rst";
+    homepage = "https://github.com/SimonSapin/cairocffi";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+    description = "cffi-based cairo bindings for Python";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cairocffi/dlopen-paths.patch b/nixpkgs/pkgs/development/python-modules/cairocffi/dlopen-paths.patch
new file mode 100644
index 000000000000..6542b4367eb4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cairocffi/dlopen-paths.patch
@@ -0,0 +1,61 @@
+Patch dlopen() to allow direct paths to all required libs
+
+This is an update of the patch submitted in
+https://github.com/NixOS/nixpkgs/commit/b13e44e094989d3a902f8c73b22e8d3c0cc7acf4
+by Alexander V. Nikolaev <avn@avnik.info>
+
+---
+ cairocffi/__init__.py | 34 ++++++++++++++++------------------
+ 1 file changed, 16 insertions(+), 18 deletions(-)
+
+diff --git a/cairocffi/__init__.py b/cairocffi/__init__.py
+index 307d58c..43c29e3 100644
+--- a/cairocffi/__init__.py
++++ b/cairocffi/__init__.py
+@@ -21,28 +21,26 @@ VERSION = __version__ = (Path(__file__).parent / 'VERSION').read_text().strip()
+ version = '1.17.2'
+ version_info = (1, 17, 2)
+
++# Use hardcoded soname, because ctypes.util use gcc/objdump which shouldn't be
++# required for runtime
++_LIBS = {
++    'cairo': '@cairo@/lib/libcairo@ext@',
++    'glib-2.0': '@glib@/lib/libglib-2.0@ext@',
++    'gobject-2.0': '@glib@/lib/libgobject-2.0@ext@',
++    'gdk_pixbuf-2.0': '@gdk_pixbuf@/lib/libgdk_pixbuf-2.0@ext@',
++}
++
+
+ def dlopen(ffi, library_names, filenames):
+     """Try various names for the same library, for different platforms."""
+-    exceptions = []
+-
+     for library_name in library_names:
+-        library_filename = find_library(library_name)
+-        if library_filename:
+-            filenames = (library_filename,) + filenames
+-        else:
+-            exceptions.append(
+-                'no library called "{}" was found'.format(library_name))
+-
+-    for filename in filenames:
+-        try:
+-            return ffi.dlopen(filename)
+-        except OSError as exception:  # pragma: no cover
+-            exceptions.append(exception)
+-
+-    error_message = '\n'.join(  # pragma: no cover
+-        str(exception) for exception in exceptions)
+-    raise OSError(error_message)  # pragma: no cover
++        path = _LIBS.get(library_name, None)
++        if path:
++            lib = ffi.dlopen(path)
++            if lib:
++                return lib
++
++    raise OSError("dlopen() failed to load a library: %s as %s" % (library_name, path))
+
+
+ cairo = dlopen(
+--
+2.19.2
diff --git a/nixpkgs/pkgs/development/python-modules/cairocffi/fix_test_scaled_font.patch b/nixpkgs/pkgs/development/python-modules/cairocffi/fix_test_scaled_font.patch
new file mode 100644
index 000000000000..39ba63cc94d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cairocffi/fix_test_scaled_font.patch
@@ -0,0 +1,11 @@
+--- a/cairocffi/test_cairo.py	2016-09-01 07:52:33.303180302 +0200
++++ b/cairocffi/test_cairo.py	2016-09-01 09:06:19.595701944 +0200
+@@ -998,7 +998,7 @@
+ 
+     font = ScaledFont(ToyFontFace('monospace'))
+     _, _, _, _, x_advance_mono, y_advance = font.text_extents('i' * 10)
+-    assert x_advance_mono > x_advance
++    assert x_advance_mono >= x_advance
+     assert y_advance == 0
+     # Not much we can test:
+     # The toy font face was "materialized" into a specific backend.
diff --git a/nixpkgs/pkgs/development/python-modules/cairosvg/default.nix b/nixpkgs/pkgs/development/python-modules/cairosvg/default.nix
new file mode 100644
index 000000000000..46c556818ee1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cairosvg/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, cairocffi
+, cssselect2
+, defusedxml
+, pillow
+, tinycss2
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "CairoSVG";
+  version = "2.7.0";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rE3HwdOLOhVxfbJjOjo4MBLgvmZMcnyRFjfmr2pJKTw=";
+  };
+
+  propagatedBuildInputs = [ cairocffi cssselect2 defusedxml pillow tinycss2 ];
+
+  propagatedNativeBuildInputs = [ cairocffi ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "pytest-runner" "" \
+      --replace "pytest-flake8" "" \
+      --replace "pytest-isort" "" \
+      --replace "pytest-cov" "" \
+      --replace "--flake8" "" \
+      --replace "--isort" ""
+  '';
+
+  pytestFlagsArray = [
+    "cairosvg/test_api.py"
+  ];
+
+  pythonImportsCheck = [ "cairosvg" ];
+
+  meta = with lib; {
+    homepage = "https://cairosvg.org";
+    license = licenses.lgpl3Plus;
+    description = "SVG converter based on Cairo";
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/caldav/default.nix b/nixpkgs/pkgs/development/python-modules/caldav/default.nix
new file mode 100644
index 000000000000..15daa3b0697c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/caldav/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, icalendar
+, lxml
+, pytestCheckHook
+, pythonOlder
+, pytz
+, recurring-ical-events
+, requests
+, tzlocal
+, vobject
+}:
+
+buildPythonPackage rec {
+  pname = "caldav";
+  version = "1.3.6";
+
+  format = "setuptools";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "python-caldav";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-N3pY3UYxOZgZbXqqsvASej12dOtdpyEHOL10btOKm/w=";
+  };
+
+  propagatedBuildInputs = [
+    vobject
+    lxml
+    requests
+    icalendar
+    recurring-ical-events
+    pytz
+    tzlocal
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # xandikos and radicale are only optional test dependencies, not available for python3
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace xandikos "" \
+      --replace radicale ""
+  '';
+
+  pythonImportsCheck = [ "caldav" ];
+
+  meta = with lib; {
+    description = "CalDAV (RFC4791) client library";
+    homepage = "https://github.com/python-caldav/caldav";
+    changelog = "https://github.com/python-caldav/caldav/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ marenz dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/callee/default.nix b/nixpkgs/pkgs/development/python-modules/callee/default.nix
new file mode 100644
index 000000000000..d7fb37706a59
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/callee/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "callee";
+  version = "0.3.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Xion";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-dsXMY3bW/70CmTfCuy5KjxPa+NLCzxzWv5e1aV2NEWE=";
+  };
+
+  pythonImportsCheck = [
+    "callee"
+  ];
+
+  doCheck = false; # missing dependency
+
+  nativeCheckInputs = [
+    # taipan missing, unmaintained, not python3.10 compatible
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Argument matchers for unittest.mock";
+    homepage = "https://github.com/Xion/callee";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/calmjs-parse/default.nix b/nixpkgs/pkgs/development/python-modules/calmjs-parse/default.nix
new file mode 100644
index 000000000000..34a2c00ce33b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/calmjs-parse/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, ply
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "calmjs-parse";
+  version = "1.3.1";
+
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "calmjs";
+    repo = "calmjs.parse";
+    rev = version;
+    hash = "sha256-xph+NuTkWfW0t/1vxWBSgsjU7YHQMnsm/W/XdkAnl7I=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "env['PYTHONPATH'] = 'src'" "env['PYTHONPATH'] += ':src'"
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    setuptools
+    ply
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    ${python.interpreter} -m unittest calmjs.parse.tests.make_suite
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "calmjs.parse"
+    "calmjs.parse.asttypes"
+    "calmjs.parse.parsers"
+    "calmjs.parse.rules"
+    "calmjs.parse.sourcemap"
+    "calmjs.parse.unparsers.es5"
+    "calmjs.parse.walkers"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/calmjs/calmjs.parse/blob/${src.rev}/CHANGES.rst";
+    description = "Various parsers for ECMA standards";
+    homepage = "https://github.com/calmjs/calmjs.parse";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/calmjs-types/default.nix b/nixpkgs/pkgs/development/python-modules/calmjs-types/default.nix
new file mode 100644
index 000000000000..9f940e92c502
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/calmjs-types/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "calmjs-types";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    pname = "calmjs.types";
+    inherit version;
+    sha256 = "sha256-EGWYv9mx3RPqs9dnB5t3Bu3hiujL2y/XxyMP7JkjjAQ=";
+    extension = "zip";
+  };
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "calmjs.types" ];
+
+  meta = with lib; {
+    description = "Types for the calmjs framework";
+    homepage = "https://github.com/calmjs/calmjs.types";
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/calmjs/default.nix b/nixpkgs/pkgs/development/python-modules/calmjs/default.nix
new file mode 100644
index 000000000000..2f27dbc98523
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/calmjs/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, calmjs-types
+, calmjs-parse
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "calmjs";
+  version = "3.4.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-73NQiY1RMdBrMIlm/VTvHY4dCHL1pQoj6a48CWRos3o=";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [
+    calmjs-parse
+    calmjs-types
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  # ModuleNotFoundError: No module named 'calmjs.types'
+  # Not yet clear how to run these tests correctly
+  # https://github.com/calmjs/calmjs/issues/63
+  # https://github.com/NixOS/nixpkgs/pull/186298
+  disabledTestPaths = [
+    "src/calmjs/tests/test_dist.py"
+    "src/calmjs/tests/test_testing.py"
+    "src/calmjs/tests/test_artifact.py"
+    "src/calmjs/tests/test_interrogate.py"
+    "src/calmjs/tests/test_loaderplugin.py"
+    "src/calmjs/tests/test_npm.py"
+    "src/calmjs/tests/test_runtime.py"
+    "src/calmjs/tests/test_toolchain.py"
+    "src/calmjs/tests/test_vlqsm.py"
+    "src/calmjs/tests/test_yarn.py"
+    "src/calmjs/tests/test_command.py"
+  ];
+
+  pythonImportsCheck = [ "calmjs" ];
+
+  meta = with lib; {
+    description = "Framework for building toolchains and utilities for working with the Node.js ecosystem";
+    homepage = "https://github.com/calmjs/calmjs";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/calver/default.nix b/nixpkgs/pkgs/development/python-modules/calver/default.nix
new file mode 100644
index 000000000000..4b400f218739
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/calver/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pretend
+, pytestCheckHook
+}:
+
+let
+  self = buildPythonPackage rec {
+    pname = "calver";
+    version = "2022.06.26";
+    format = "setuptools";
+
+    disabled = pythonOlder "3.5";
+
+    src = fetchFromGitHub {
+      owner = "di";
+      repo = "calver";
+      rev = version;
+      hash = "sha256-YaXTkeUazwzghCX96Wfx39hGvukWKtHMLLeyF9OeiZI=";
+    };
+
+    postPatch = ''
+      substituteInPlace setup.py \
+        --replace "version=calver_version(True)" 'version="${version}"'
+    '';
+
+    doCheck = false; # avoid infinite recursion with hatchling
+
+    nativeCheckInputs = [
+      pretend
+      pytestCheckHook
+    ];
+
+    pythonImportsCheck = [ "calver" ];
+
+    passthru.tests.calver = self.overridePythonAttrs { doCheck = true; };
+
+    meta = {
+      description = "Setuptools extension for CalVer package versions";
+      homepage = "https://github.com/di/calver";
+      license = lib.licenses.asl20;
+      maintainers = with lib.maintainers; [ dotlambda ];
+    };
+  };
+in
+  self
diff --git a/nixpkgs/pkgs/development/python-modules/calysto-scheme/default.nix b/nixpkgs/pkgs/development/python-modules/calysto-scheme/default.nix
new file mode 100644
index 000000000000..1e0dc0cd102d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/calysto-scheme/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, metakernel
+, pytestCheckHook
+, yasi
+}:
+
+buildPythonPackage rec {
+  pname = "calysto-scheme";
+  version = "1.4.8";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Calysto";
+    repo = "calysto_scheme";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-gTBXdjm6Ry6DpjO9tP+acYxM+DQDh4dZQF+pyXrUCiI=";
+  };
+
+  propagatedBuildInputs = [
+    yasi
+    metakernel
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "calysto_scheme" ];
+
+  meta = with lib; {
+    description = "A Scheme kernel for Jupyter that can use Python libraries";
+    homepage = "https://github.com/Calysto/calysto_scheme";
+    changelog = "https://github.com/Calysto/calysto_scheme/blob/${src.rev}/ChangeLog.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ kranzes ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/calysto/default.nix b/nixpkgs/pkgs/development/python-modules/calysto/default.nix
new file mode 100644
index 000000000000..54f7eb044b7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/calysto/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, metakernel
+, svgwrite
+, ipywidgets
+, cairosvg
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "calysto";
+  version = "1.0.6";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Calysto";
+    repo = "calysto";
+    rev = "v${version}";
+    hash = "sha256-lr/cHFshpFs/PGMCsa3FKMRPTP+eE9ziH5XCpV+KzO8=";
+  };
+
+  propagatedBuildInputs = [
+    metakernel
+    svgwrite
+    ipywidgets
+    cairosvg
+    numpy
+  ];
+
+  # there are no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "calysto" ];
+
+  meta = with lib; {
+    description = "Tools for Jupyter and Python";
+    homepage = "https://github.com/Calysto/calysto";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ kranzes ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/camel-converter/default.nix b/nixpkgs/pkgs/development/python-modules/camel-converter/default.nix
new file mode 100644
index 000000000000..65703ad76bd0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/camel-converter/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pydantic
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "camel-converter";
+  version = "3.1.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "sanders41";
+    repo = "camel-converter";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-xrdk5Y3H8KlQaGtJYdJNHq16Qfos2p+93uIAfIl098c=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov=camel_converter --cov-report term-missing --no-cov-on-fail" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  passthru.optional-dependencies = {
+    pydantic = [
+      pydantic
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.pydantic;
+
+  pythonImportsCheck = [
+    "camel_converter"
+  ];
+
+  disabledTests = [
+    # AttributeError: 'Test' object has no attribute 'model_dump'
+    "test_camel_config"
+  ];
+
+  meta = with lib; {
+    description = "Client for the Meilisearch API";
+    homepage = "https://github.com/sanders41/camel-converter";
+    changelog = "https://github.com/sanders41/camel-converter/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/camelot/default.nix b/nixpkgs/pkgs/development/python-modules/camelot/default.nix
new file mode 100644
index 000000000000..392bdf9a7ec8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/camelot/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, chardet
+, openpyxl
+, charset-normalizer
+, fetchPypi
+, fetchpatch
+, pythonOlder
+, pandas
+, tabulate
+, click
+, pdfminer-six
+, pypdf
+, opencv4
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "camelot-py";
+  version = "0.11.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-l6fZBtaF5AWaSlSaY646UfCrcqPIJlV/hEPGWhGB3+Y=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  propagatedBuildInputs = [
+    charset-normalizer
+    chardet
+    pandas
+    tabulate
+    click
+    pdfminer-six
+    openpyxl
+    pypdf
+    opencv4
+  ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "camelot"
+  ];
+
+  meta = with lib; {
+    description = "A Python library to extract tabular data from PDFs";
+    homepage = "http://camelot-py.readthedocs.io";
+    changelog = "https://github.com/camelot-dev/camelot/blob/v${version}/HISTORY.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ _2gn ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/can/default.nix b/nixpkgs/pkgs/development/python-modules/can/default.nix
new file mode 100644
index 000000000000..4688c6507495
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/can/default.nix
@@ -0,0 +1,105 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, future
+, hypothesis
+, packaging
+, parameterized
+, msgpack
+, pyserial
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, typing-extensions
+, wrapt
+, uptime
+}:
+
+buildPythonPackage rec {
+  pname = "can";
+  version = "4.3.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "hardbyte";
+    repo = "python-can";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-JsYAh5Z6RIX6aWpSuW+VIzJRPf5MfNbBGg36v3CQiLU=";
+  };
+
+  postPatch = ''
+    substituteInPlace tox.ini \
+      --replace " --cov=can --cov-config=tox.ini --cov-report=lcov --cov-report=term" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    msgpack
+    packaging
+    typing-extensions
+    wrapt
+  ];
+
+  passthru.optional-dependencies = {
+    serial = [
+      pyserial
+    ];
+    seeedstudio = [
+      pyserial
+    ];
+    pcan = [
+      uptime
+    ];
+  };
+
+  nativeCheckInputs = [
+    future
+    hypothesis
+    parameterized
+    pytest-timeout
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.serial;
+
+  disabledTestPaths = [
+    # We don't support all interfaces
+    "test/test_interface_canalystii.py"
+  ];
+
+  disabledTests = [
+    # Tests require access socket
+    "BasicTestUdpMulticastBusIPv4"
+    "BasicTestUdpMulticastBusIPv6"
+    # pytest.approx is not supported in a boolean context (since pytest7)
+    "test_pack_unpack"
+    "test_receive"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # timing sensitive
+    "test_general"
+    "test_gap"
+  ];
+
+  preCheck = ''
+    export PATH="$PATH:$out/bin";
+    # skips timing senstive tests
+    export CI=1
+  '';
+
+  pythonImportsCheck = [
+    "can"
+  ];
+
+  meta = with lib; {
+    description = "CAN support for Python";
+    homepage = "https://python-can.readthedocs.io";
+    changelog = "https://github.com/hardbyte/python-can/releases/tag/v${version}";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ fab sorki ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/canals/default.nix b/nixpkgs/pkgs/development/python-modules/canals/default.nix
new file mode 100644
index 000000000000..8494d6dfbd5d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/canals/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, mkdocs-material
+, mkdocs-mermaid2-plugin
+, mkdocstrings
+, networkx
+, pytestCheckHook
+, pythonOlder
+, requests
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "canals";
+  version = "0.11.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "deepset-ai";
+    repo = "canals";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-xoJqj/zPBPPCheBxA+8EFRJqUnlP+4aWLEh42q1X1mM=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    networkx
+    requests
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = {
+    docs = [
+      mkdocs-material
+      mkdocs-mermaid2-plugin
+      mkdocstrings
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  disabledTestPaths = [
+    # Test requires internet connection to mermaid.ink
+    "test/pipeline/integration"
+  ];
+
+  disabledTests = [
+    # Path issue
+    "test_draw_pygraphviz"
+  ];
+
+  pythonImportsCheck = [
+    "canals"
+  ];
+
+  meta = with lib; {
+    description = "A component orchestration engine";
+    homepage = "https://github.com/deepset-ai/canals";
+    changelog = "https://github.com/deepset-ai/canals/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/canmatrix/default.nix b/nixpkgs/pkgs/development/python-modules/canmatrix/default.nix
new file mode 100644
index 000000000000..287d14e60d67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/canmatrix/default.nix
@@ -0,0 +1,99 @@
+{ lib
+, attrs
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, future
+, importlib-metadata
+, ldfparser
+, lxml
+, openpyxl
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, six
+, xlrd
+, xlwt
+}:
+
+buildPythonPackage rec {
+  pname = "canmatrix";
+  version = "1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ebroecker";
+    repo = "canmatrix";
+    rev = "refs/tags/${version}";
+    hash = "sha256-UUJnLVt+uOj8Eav162btprkUeTemItGrSnBBB9UhJJI=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "version = versioneer.get_version()" 'version = "${version}"'
+  '';
+
+  propagatedBuildInputs = [
+    attrs
+    click
+    future
+    six
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  passthru.optional-dependencies = {
+    arxml = [
+      lxml
+    ];
+    fibex = [
+      lxml
+    ];
+    kcd = [
+      lxml
+    ];
+    ldf = [
+      ldfparser
+    ];
+    odx = [
+      lxml
+    ];
+    xls = [
+      xlrd
+      xlwt
+    ];
+    xlsx = [
+      openpyxl
+    ];
+    yaml = [
+      pyyaml
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pytestFlagsArray = [
+    # long_envvar_name_imports requires stable key value pair ordering
+    "-s src/canmatrix"
+  ];
+
+  disabledTests = [
+    "long_envvar_name_imports"
+  ];
+
+  pythonImportsCheck = [
+    "canmatrix"
+  ];
+
+  meta = with lib; {
+    description = "Support and convert several CAN (Controller Area Network) database formats";
+    homepage = "https://github.com/ebroecker/canmatrix";
+    changelog = "https://github.com/ebroecker/canmatrix/releases/tag/${version}";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ sorki ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/canonicaljson/default.nix b/nixpkgs/pkgs/development/python-modules/canonicaljson/default.nix
new file mode 100644
index 000000000000..0dd7a02a4aba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/canonicaljson/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, frozendict
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, simplejson
+}:
+
+buildPythonPackage rec {
+  pname = "canonicaljson";
+  version = "2.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-4v2u8df63F2ctZvT0NQbBk3dppeAmsQyXc7XIdEvET8=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    simplejson
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "canonicaljson"
+  ];
+
+  meta = with lib; {
+    description = "Encodes objects and arrays as RFC 7159 JSON";
+    homepage = "https://github.com/matrix-org/python-canonicaljson";
+    changelog = "https://github.com/matrix-org/python-canonicaljson/blob/v${version}/CHANGES.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/canopen/default.nix b/nixpkgs/pkgs/development/python-modules/canopen/default.nix
new file mode 100644
index 000000000000..09a9f4366a0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/canopen/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, can
+, canmatrix
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "canopen";
+  version = "2.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XxhlG5325HabmILpafk0rnc+8kpFqrwzNLWGmCBI0Iw=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    can
+    canmatrix
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "canopen"
+  ];
+
+  meta = with lib; {
+    description = "CANopen stack implementation";
+    homepage = "https://github.com/christiansandberg/canopen/";
+    changelog = "https://github.com/christiansandberg/canopen/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sorki ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cantools/default.nix b/nixpkgs/pkgs/development/python-modules/cantools/default.nix
new file mode 100644
index 000000000000..cfe955ca9d96
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cantools/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, argparse-addons
+, bitstruct
+, buildPythonPackage
+, can
+, crccheck
+, diskcache
+, fetchPypi
+, matplotlib
+, parameterized
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+, textparser
+}:
+
+buildPythonPackage rec {
+  pname = "cantools";
+  version = "39.4.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-44zzlyOIQ2qo4Zq5hb+xnCy0ANm6iCpcBww0l2KWdMs=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "setuptools_scm>=8" "setuptools_scm"
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    argparse-addons
+    bitstruct
+    can
+    crccheck
+    diskcache
+    matplotlib
+    textparser
+  ];
+
+  nativeCheckInputs = [
+    parameterized
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "cantools"
+  ];
+
+  meta = with lib; {
+    description = "Tools to work with CAN bus";
+    homepage = "https://github.com/cantools/cantools";
+    changelog = "https://github.com/cantools/cantools/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gray-heron ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/capstone/default.nix b/nixpkgs/pkgs/development/python-modules/capstone/default.nix
new file mode 100644
index 000000000000..6846ed86f6f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/capstone/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, capstone
+, stdenv
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "capstone";
+  version = lib.getVersion capstone;
+
+  src = capstone.src;
+  sourceRoot = "${src.name}/bindings/python";
+
+  postPatch = ''
+    ln -s ${capstone}/lib/libcapstone${stdenv.targetPlatform.extensions.sharedLibrary} prebuilt/
+    ln -s ${capstone}/lib/libcapstone.a prebuilt/
+    substituteInPlace setup.py --replace manylinux1 manylinux2014
+  '';
+
+  # aarch64 only available from MacOS SDK 11 onwards, so fix the version tag.
+  # otherwise, bdist_wheel may detect "macosx_10_6_arm64" which doesn't make sense.
+  setupPyBuildFlags = lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [ "--plat-name" "macosx_11_0" ];
+
+  propagatedBuildInputs = [ setuptools ];
+
+  checkPhase = ''
+    mv capstone capstone.hidden
+    patchShebangs test_*
+    make check
+  '';
+
+  meta = with lib; {
+    homepage = "http://www.capstone-engine.org/";
+    license = licenses.bsdOriginal;
+    description = "Python bindings for Capstone disassembly engine";
+    maintainers = with maintainers; [ bennofs ris ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/captcha/default.nix b/nixpkgs/pkgs/development/python-modules/captcha/default.nix
new file mode 100644
index 000000000000..807272da5b1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/captcha/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, fetchFromGitHub
+, pythonOlder
+, buildPythonPackage
+, pillow
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "captcha";
+  version = "0.5.0";
+
+  disabled = pythonOlder "3.8";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "lepture";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-TPPuf0BRZPSHPSF0HuGxhjhoSyZQ7r86kSjkrztgZ5w=";
+  };
+
+  propagatedBuildInputs = [ pillow ];
+
+  pythonImportsCheck = [ "captcha" ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "A captcha library that generates audio and image CAPTCHAs";
+    homepage = "https://github.com/lepture/captcha";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ Flakebi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/capturer/default.nix b/nixpkgs/pkgs/development/python-modules/capturer/default.nix
new file mode 100644
index 000000000000..082c765b39dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/capturer/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, lib, buildPythonPackage, fetchFromGitHub, humanfriendly, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "capturer";
+  version = "3.0";
+
+  src = fetchFromGitHub {
+    owner = "xolox";
+    repo = "python-capturer";
+    rev = version;
+    sha256 = "0fwrxa049gzin5dck7fvwhdp1856jrn0d7mcjcjsd7ndqvhgvjj1";
+  };
+
+  propagatedBuildInputs = [ humanfriendly ];
+
+  # hangs on darwin
+  doCheck = !stdenv.isDarwin;
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Easily capture stdout/stderr of the current process and subprocesses";
+    homepage = "https://github.com/xolox/python-capturer";
+    license = licenses.mit;
+    maintainers = with maintainers; [ eyjhb ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/carbon/default.nix b/nixpkgs/pkgs/development/python-modules/carbon/default.nix
new file mode 100644
index 000000000000..438399837711
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/carbon/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, twisted, whisper, txamqp, cachetools, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "carbon";
+  version = "1.1.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wTtbqRHMWBcM2iFN95yzwCf/BQ+EK0vp5MXT4mKX3lw=";
+  };
+
+  # Carbon-s default installation is /opt/graphite. This env variable ensures
+  # carbon is installed as a regular python module.
+  GRAPHITE_NO_PREFIX="True";
+
+  propagatedBuildInputs = [ twisted whisper txamqp cachetools urllib3 ];
+
+  meta = with lib; {
+    homepage = "http://graphiteapp.org/";
+    description = "Backend data caching and persistence daemon for Graphite";
+    maintainers = with maintainers; [ offline basvandijk ];
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cart/default.nix b/nixpkgs/pkgs/development/python-modules/cart/default.nix
new file mode 100644
index 000000000000..a0541fc1467f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cart/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, pycryptodome
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cart";
+  version = "1.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "CybercentreCanada";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-0dHdXb4v92681xL21FsrIkNgNQ9R5ULV1lnSCITZzP8=";
+  };
+
+  propagatedBuildInputs = [
+    pycryptodome
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "unittests"
+  ];
+
+  pythonImportsCheck = [
+    "cart"
+  ];
+
+  meta = with lib; {
+    description = "Python module for the CaRT Neutering format";
+    homepage = "https://github.com/CybercentreCanada/cart";
+    changelog = "https://github.com/CybercentreCanada/cart/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cartopy/default.nix b/nixpkgs/pkgs/development/python-modules/cartopy/default.nix
new file mode 100644
index 000000000000..f1f52eb9c987
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cartopy/default.nix
@@ -0,0 +1,90 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, fetchpatch
+, cython
+, setuptools-scm
+, geos
+, proj
+, matplotlib
+, numpy
+, pyproj
+, pyshp
+, shapely
+, owslib
+, pillow
+, gdal
+, scipy
+, fontconfig
+, pytest-mpl
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cartopy";
+  version = "0.22.0";
+
+  disabled = pythonOlder "3.8";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "Cartopy";
+    hash = "sha256-swD5ASCTHUPxHvh8Bk6h2s7BtZpJQKp26/gs8JVIu0k=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    geos # for geos-config
+    proj
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    geos
+    proj
+  ];
+
+  propagatedBuildInputs = [
+    matplotlib
+    numpy
+    pyproj
+    pyshp
+    shapely
+  ];
+
+  passthru.optional-dependencies = {
+    ows = [ owslib pillow ];
+    plotting = [ gdal pillow scipy ];
+  };
+
+  nativeCheckInputs = [
+    pytest-mpl
+    pytestCheckHook
+  ] ++ lib.flatten (lib.attrValues passthru.optional-dependencies);
+
+  preCheck = ''
+    export FONTCONFIG_FILE=${fontconfig.out}/etc/fonts/fonts.conf
+    export HOME=$TMPDIR
+  '';
+
+  pytestFlagsArray = [
+    "--pyargs"
+    "cartopy"
+    "-m"
+    "'not network and not natural_earth'"
+  ];
+
+  disabledTests = [
+    "test_gridliner_labels_bbox_style"
+  ];
+
+  meta = with lib; {
+    description = "Process geospatial data to create maps and perform analyses";
+    license = licenses.lgpl3Plus;
+    homepage = "https://scitools.org.uk/cartopy/docs/latest/";
+    maintainers = with maintainers; [ mredaelli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/casa-formats-io/default.nix b/nixpkgs/pkgs/development/python-modules/casa-formats-io/default.nix
new file mode 100644
index 000000000000..4e4d10bd2731
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/casa-formats-io/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, astropy
+, dask
+, numpy
+, oldest-supported-numpy
+, setuptools-scm
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "casa-formats-io";
+  version = "0.2.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-EOX+tal9nrON2K7mHVYSTTxja6mu2k3Bag8bhL3JHJs=";
+  };
+
+  nativeBuildInputs = [
+    oldest-supported-numpy
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [ astropy dask numpy ];
+
+  # Tests require a large (800 Mb) dataset
+  doCheck = false;
+
+  pythonImportsCheck = [ "casa_formats_io" ];
+
+  meta = {
+    description = "Dask-based reader for CASA data";
+    homepage = "https://casa-formats-io.readthedocs.io/";
+    license = lib.licenses.lgpl2Only;
+    maintainers = with lib.maintainers; [ smaret ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/casbin/default.nix b/nixpkgs/pkgs/development/python-modules/casbin/default.nix
new file mode 100644
index 000000000000..3583f0e5544e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/casbin/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, simpleeval
+, wcmatch
+}:
+
+buildPythonPackage rec {
+  pname = "casbin";
+  version = "1.33.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "casbin";
+    repo = "pycasbin";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-/0yYU33zMtC6Pjm4yyQNavMDoI+5uC2zZci5IL/EY7Q=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    simpleeval
+    wcmatch
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "casbin"
+  ];
+
+  meta = with lib; {
+    description = "Authorization library that supports access control models like ACL, RBAC and ABAC";
+    homepage = "https://github.com/casbin/pycasbin";
+    changelog = "https://github.com/casbin/pycasbin/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/case/default.nix b/nixpkgs/pkgs/development/python-modules/case/default.nix
new file mode 100644
index 000000000000..36efc1aab3bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/case/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, pythonOlder
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "case";
+  version = "1.5.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "48432b01d91913451c3512c5b90e31b0f348f1074b166a3431085eb70d784fb1";
+  };
+
+  propagatedBuildInputs = [
+    nose
+    six
+  ];
+
+  # No real unittests, only coverage
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "case"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/celery/case";
+    description = "Utilities for unittests handling";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cassandra-driver/default.nix b/nixpkgs/pkgs/development/python-modules/cassandra-driver/default.nix
new file mode 100644
index 000000000000..e985ed544d3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cassandra-driver/default.nix
@@ -0,0 +1,127 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cryptography
+, cython
+, eventlet
+, fetchFromGitHub
+, geomet
+, gevent
+, gremlinpython
+, iana-etc
+, libev
+, libredirect
+, mock
+, nose
+, pytestCheckHook
+, pythonOlder
+, pytz
+, pyyaml
+, scales
+, six
+, sure
+, twisted
+}:
+
+buildPythonPackage rec {
+  pname = "cassandra-driver";
+  version = "3.28.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "datastax";
+    repo = "python-driver";
+    rev = "refs/tags/${version}";
+    hash = "sha256-5JRbzYl7ftgK6GuvXWdvo52ZlS1th9JyLAYu/UCcPVc=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'geomet>=0.1,<0.3' 'geomet'
+  '';
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  buildInputs = [
+    libev
+  ];
+
+  propagatedBuildInputs = [
+    six
+    geomet
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+    nose
+    pytz
+    pyyaml
+    sure
+  ] ++ lib.flatten (lib.attrValues passthru.optional-dependencies);
+
+  # Make /etc/protocols accessible to allow socket.getprotobyname('tcp') in sandbox,
+  # also /etc/resolv.conf is referenced by some tests
+  preCheck = (lib.optionalString stdenv.isLinux ''
+    echo "nameserver 127.0.0.1" > resolv.conf
+    export NIX_REDIRECTS=/etc/protocols=${iana-etc}/etc/protocols:/etc/resolv.conf=$(realpath resolv.conf)
+    export LD_PRELOAD=${libredirect}/lib/libredirect.so
+  '') + ''
+    # increase tolerance for time-based test
+    substituteInPlace tests/unit/io/utils.py --replace 'delta=.15' 'delta=.3'
+
+    export HOME=$(mktemp -d)
+    # cythonize this before we hide the source dir as it references
+    # one of its files
+    cythonize -i tests/unit/cython/types_testhelper.pyx
+
+    mv cassandra .cassandra.hidden
+  '';
+
+  pythonImportsCheck = [
+    "cassandra"
+  ];
+
+  postCheck = ''
+    unset NIX_REDIRECTS LD_PRELOAD
+  '';
+
+  pytestFlagsArray = [
+    "tests/unit"
+  ];
+
+  disabledTestPaths = [
+    # requires puresasl
+    "tests/unit/advanced/test_auth.py"
+  ];
+
+  disabledTests = [
+    # doesn't seem to be intended to be run directly
+    "_PoolTests"
+    # attempts to make connection to localhost
+    "test_connection_initialization"
+    # time-sensitive
+    "test_nts_token_performance"
+  ];
+
+  passthru.optional-dependencies = {
+    cle = [ cryptography ];
+    eventlet = [ eventlet ];
+    gevent = [ gevent ];
+    graph = [ gremlinpython ];
+    metrics = [ scales ];
+    twisted = [ twisted ];
+  };
+
+  meta = with lib; {
+    description = "A Python client driver for Apache Cassandra";
+    homepage = "http://datastax.github.io/python-driver";
+    changelog = "https://github.com/datastax/python-driver/blob/${version}/CHANGELOG.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ris ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/castepxbin/default.nix b/nixpkgs/pkgs/development/python-modules/castepxbin/default.nix
new file mode 100644
index 000000000000..007a9543d6f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/castepxbin/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, flit-core
+, numpy
+, scipy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "castepxbin";
+  version = "0.3.0";
+
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "zhubonan";
+    repo = "castepxbin";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-6kumVnm4PLRxuKO6Uz0iHzfYuu21hFC7EPRsc3S1kxE=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A collection of readers for CASTEP binary outputs";
+    homepage = "https://github.com/zhubonan/castepxbin";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/casttube/default.nix b/nixpkgs/pkgs/development/python-modules/casttube/default.nix
new file mode 100644
index 000000000000..9d29a0137436
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/casttube/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, requests }:
+
+buildPythonPackage rec {
+  pname = "casttube";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "10pw2sjy648pvp42lbbdmkkx79bqlkq1xcbzp1frraj9g66azljl";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Interact with the Youtube Chromecast api";
+    homepage = "https://github.com/ur1katz/casttube";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fpletz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/catalogue/default.nix b/nixpkgs/pkgs/development/python-modules/catalogue/default.nix
new file mode 100644
index 000000000000..e1c1fed3bfdd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/catalogue/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, typing-extensions
+, zipp
+}:
+
+buildPythonPackage rec {
+  pname = "catalogue";
+  version = "2.0.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-syXHdlkgi/tq8bDZOxoapBEuG7KaTFztgWdYpyLw44g=";
+  };
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+    zipp
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "catalogue"
+  ];
+
+  meta = with lib; {
+    description = "Tiny library for adding function or object registries";
+    homepage = "https://github.com/explosion/catalogue";
+    changelog = "https://github.com/explosion/catalogue/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/catboost/default.nix b/nixpkgs/pkgs/development/python-modules/catboost/default.nix
new file mode 100644
index 000000000000..840c01d876a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/catboost/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, catboost
+, python
+, graphviz
+, matplotlib
+, numpy
+, pandas
+, plotly
+, scipy
+, setuptools
+, six
+, wheel
+}:
+
+buildPythonPackage {
+  inherit (catboost) pname version src meta;
+  format = "pyproject";
+
+  sourceRoot = "source/catboost/python-package";
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    graphviz
+    matplotlib
+    numpy
+    pandas
+    plotly
+    scipy
+    six
+  ];
+
+  buildPhase = ''
+    runHook preBuild
+
+    # these arguments must set after bdist_wheel
+    ${python.pythonOnBuildForHost.interpreter} setup.py bdist_wheel --no-widget --prebuilt-extensions-build-root-dir=${lib.getDev catboost}
+
+    runHook postBuild
+  '';
+
+  # setup a test is difficult
+  doCheck = false;
+
+  pythonImportsCheck = [ "catboost" ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/catppuccin/default.nix b/nixpkgs/pkgs/development/python-modules/catppuccin/default.nix
new file mode 100644
index 000000000000..3c86e97f49f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/catppuccin/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, poetry-dynamic-versioning
+, pygments
+, rich
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "catppuccin";
+  version = "1.3.2";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "catppuccin";
+    repo = "python";
+    rev = "v${version}";
+    hash = "sha256-spPZdQ+x3isyeBXZ/J2QE6zNhyHRfyRQGiHreuXzzik=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    poetry-dynamic-versioning
+  ];
+
+  passthru.optional-dependencies = {
+    pygments = [ pygments ];
+    rich = [ rich ];
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  disabledTestPaths = [
+    "tests/test_flavour.py" # would download a json to check correctness of flavours
+  ];
+
+  pythonImportsCheck = [ "catppuccin" ];
+
+  meta = {
+    description = "Soothing pastel theme for Python";
+    homepage = "https://github.com/catppuccin/python";
+    maintainers = with lib.maintainers; [ fufexan tomasajt ];
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cattrs/default.nix b/nixpkgs/pkgs/development/python-modules/cattrs/default.nix
new file mode 100644
index 000000000000..b637f714d26d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cattrs/default.nix
@@ -0,0 +1,103 @@
+{ lib
+, attrs
+, buildPythonPackage
+, cbor2
+, fetchFromGitHub
+, exceptiongroup
+, hypothesis
+, immutables
+, motor
+, msgpack
+, orjson
+, poetry-core
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, tomlkit
+, typing-extensions
+, ujson
+}:
+
+buildPythonPackage rec {
+  pname = "cattrs";
+  version = "23.1.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "python-attrs";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-YO4Clbo5fmXbysxwwM2qCHJwO5KwDC05VctRVFruJcw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    exceptiongroup
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    cbor2
+    hypothesis
+    immutables
+    motor
+    msgpack
+    orjson
+    pytest-xdist
+    pytestCheckHook
+    pyyaml
+    tomlkit
+    typing-extensions
+    ujson
+  ];
+
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "-l --benchmark-sort=fullname --benchmark-warmup=true --benchmark-warmup-iterations=5  --benchmark-group-by=fullname" "" \
+      --replace 'orjson = "^3.5.2"' "" \
+      --replace "[tool.poetry.group.dev.dependencies]" "[tool.poetry.dev-dependencies]"
+    substituteInPlace tests/test_preconf.py \
+      --replace "from orjson import dumps as orjson_dumps" "" \
+      --replace "from orjson import loads as orjson_loads" ""
+  '';
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  disabledTestPaths = [
+    # Don't run benchmarking tests
+    "bench/test_attrs_collections.py"
+    "bench/test_attrs_nested.py"
+    "bench/test_attrs_primitives.py"
+    "bench/test_primitives.py"
+  ];
+
+  disabledTests = [
+    # orjson is not available as it requires Rust nightly features to compile its requirements
+    "test_orjson"
+    # tomlkit is pinned to an older version and newer versions raise InvalidControlChar exception
+    "test_tomlkit"
+  ];
+
+  pythonImportsCheck = [
+    "cattr"
+  ];
+
+  meta = with lib; {
+    description = "Python custom class converters for attrs";
+    homepage = "https://github.com/python-attrs/cattrs";
+    changelog = "https://github.com/python-attrs/cattrs/blob/${src.rev}/HISTORY.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cbor/default.nix b/nixpkgs/pkgs/development/python-modules/cbor/default.nix
new file mode 100644
index 000000000000..cc3d8914ad2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cbor/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "cbor";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1dmv163cnslyqccrybkxn0c9s1jk1mmafmgxv75iamnz5lk5l8hk";
+  };
+
+  # Tests are excluded from PyPI and four unit tests are also broken:
+  # https://github.com/brianolson/cbor_py/issues/6
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://bitbucket.org/bodhisnarkva/cbor";
+    description = "Concise Binary Object Representation (CBOR) library";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ oxzi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cbor2/default.nix b/nixpkgs/pkgs/development/python-modules/cbor2/default.nix
new file mode 100644
index 000000000000..fe320063362c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cbor2/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "cbor2";
+  version = "5.4.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uJNQDbD+Az5XDDrclWr27vxX4oACa9LYb9U9qfHllNc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov" ""
+  '';
+
+  # https://github.com/agronholm/cbor2/issues/99
+  disabledTests = lib.optionals stdenv.is32bit [
+    "test_huge_truncated_bytes"
+    "test_huge_truncated_string"
+  ];
+
+  pythonImportsCheck = [
+    "cbor2"
+  ];
+
+  meta = with lib; {
+    description = "Python CBOR (de)serializer with extensive tag support";
+    homepage = "https://github.com/agronholm/cbor2";
+    license = licenses.mit;
+    maintainers = with maintainers; [ taneb ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cccolutils/default.nix b/nixpkgs/pkgs/development/python-modules/cccolutils/default.nix
new file mode 100644
index 000000000000..86aa9f6c8593
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cccolutils/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, git
+, gitpython
+, krb5
+, mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cccolutils";
+  version = "1.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "CCColUtils";
+    inherit version;
+    hash = "sha256-YzKjG43biRbTZKtzSUHHhtzOfcZfzISHDFolqzrBjL8=";
+  };
+
+  buildInputs = [
+    krb5
+  ];
+
+  propagatedBuildInputs = [
+    git
+    gitpython
+    mock
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "cccolutils"
+  ];
+
+  meta = with lib; {
+    description = "Python Kerberos 5 Credential Cache Collection Utilities";
+    homepage = "https://pagure.io/cccolutils";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ disassembler ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cdcs/default.nix b/nixpkgs/pkgs/development/python-modules/cdcs/default.nix
new file mode 100644
index 000000000000..511a3975d97f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cdcs/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ipython
+, numpy
+, pandas
+, pytestCheckHook
+, pythonOlder
+, requests
+, responses
+, setuptools
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "cdcs";
+  version = "0.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "usnistgov";
+    repo = "pycdcs";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-WiNjMMcpp5K+Re44ryB7LNzr2LnnYzLZ5b0iT7u1ZiA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    ipython
+    numpy
+    pandas
+    requests
+    tqdm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "cdcs"
+  ];
+
+  meta = with lib; {
+    description = "Python client for performing REST calls to configurable data curation system (CDCS) databases";
+    homepage = "https://github.com/usnistgov/pycdcs";
+    changelog = "https://github.com/usnistgov/pycdcs/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/celery-redbeat/default.nix b/nixpkgs/pkgs/development/python-modules/celery-redbeat/default.nix
new file mode 100644
index 000000000000..a61eacfcb86c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/celery-redbeat/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, python-dateutil
+, celery
+, redis
+, tenacity
+, pytestCheckHook
+, pytz
+, fakeredis
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "celery-redbeat";
+  version = "2.1.0";
+
+  src = fetchFromGitHub {
+    owner = "sibson";
+    repo = "redbeat";
+    rev = "v${version}";
+    hash = "sha256-WW/OYa7TWEKkata1eULir29wHaCnavBJebn4GrBzmWY=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # celery 5.3.0 support
+      url = "https://github.com/sibson/redbeat/commit/4240e17172a4d9d2744d5c4da3cfca0e0a024e2e.patch";
+      hash = "sha256-quEfSFhv0sIpsKHX1CpFhbMC8LYXA8NASWYU8MMYPSk=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    celery
+    python-dateutil
+    redis
+    tenacity
+  ];
+
+  nativeCheckInputs = [
+    fakeredis
+    mock
+    pytestCheckHook
+    pytz
+  ];
+
+  pythonImportsCheck = [ "redbeat" ];
+
+  meta = with lib; {
+    description = "Database-backed Periodic Tasks";
+    homepage = "https://github.com/celery/django-celery-beat";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/celery-singleton/default.nix b/nixpkgs/pkgs/development/python-modules/celery-singleton/default.nix
new file mode 100644
index 000000000000..bb3ac446a600
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/celery-singleton/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchFromGitHub
+, poetry-core
+, celery
+, redis
+, pytestCheckHook
+, pytest-celery
+}:
+
+buildPythonPackage rec {
+  pname = "celery-singleton";
+  version = "0.3.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "steinitzu";
+    repo = "celery-singleton";
+    rev = version;
+    hash = "sha256-fHlakxxjYIADELZdxIj6rvsZ/+1QfnKvAg3w5cdzvDc=";
+  };
+
+  postPatch = ''
+    # Disable coverage reporting in tests
+    substituteInPlace setup.cfg \
+      --replace "--cov" "" \
+      --replace "--no-cov-on-fail" ""
+  '';
+
+  patches = [
+    # chore(poetry): use poetry-core
+    # https://github.com/steinitzu/celery-singleton/pull/54
+    (fetchpatch {
+      name = "use-poetry-core.patch";
+      url = "https://github.com/steinitzu/celery-singleton/pull/54/commits/634a001c92a1dff1fae513fc95d733ea9b87e4cf.patch";
+      hash = "sha256-lXN4khwyL96pWyBS+iuSkGEkegv4HxYtym+6JUcPa94=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    celery
+    redis
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-celery
+  ];
+
+  pytestFlagsArray = [ "tests" ];
+
+  # Tests require a running Redis backend
+  disabledTests = [
+    "TestLock"
+    "TestUnlock"
+    "TestClear"
+    "TestSimpleTask"
+    "TestRaiseOnDuplicateConfig"
+    "TestUniqueOn"
+  ];
+
+  pythonImportsCheck = [ "celery_singleton" ];
+
+  meta = with lib; {
+    description = "Seamlessly prevent duplicate executions of celery tasks";
+    homepage = "https://github.com/steinitzu/celery-singleton";
+    changelog = "https://github.com/steinitzu/celery-singleton/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/celery-types/default.nix b/nixpkgs/pkgs/development/python-modules/celery-types/default.nix
new file mode 100644
index 000000000000..cc77baff0444
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/celery-types/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, poetry-core
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "celery-types";
+  version = "0.20.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5cdiVVYF7QWSuu2dUZIwBGzo56EcZ6ghVVwIt87OGWA=";
+  };
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "PEP-484 stubs for Celery";
+    homepage = "https://github.com/sbdchd/celery-types";
+    license = licenses.mit;
+    maintainers = with maintainers; [ elohmeier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/celery/default.nix b/nixpkgs/pkgs/development/python-modules/celery/default.nix
new file mode 100644
index 000000000000..750e3908cd3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/celery/default.nix
@@ -0,0 +1,102 @@
+{ stdenv
+, lib
+, backports-zoneinfo
+, billiard
+, boto3
+, buildPythonPackage
+, case
+, click
+, click-didyoumean
+, click-plugins
+, click-repl
+, dnspython
+, fetchPypi
+, kombu
+, moto
+, pymongo
+, pytest-celery
+, pytest-click
+, pytest-subtests
+, pytest-timeout
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, tzdata
+, vine
+, nixosTests
+}:
+
+buildPythonPackage rec {
+  pname = "celery";
+  version = "5.3.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-kCPfaoli2nnrMMDITV9IY9l5OkZjVMyTHX9yQjmW3ig=";
+  };
+
+  propagatedBuildInputs = [
+    billiard
+    click
+    click-didyoumean
+    click-plugins
+    click-repl
+    kombu
+    python-dateutil
+    tzdata
+    vine
+  ]
+  ++ lib.optionals (pythonOlder "3.9") [
+    backports-zoneinfo
+  ];
+
+  nativeCheckInputs = [
+    boto3
+    case
+    dnspython
+    moto
+    pymongo
+    pytest-celery
+    pytest-click
+    pytest-subtests
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # test_eventlet touches network
+    "t/unit/concurrency/test_eventlet.py"
+    # test_multi tries to create directories under /var
+    "t/unit/bin/test_multi.py"
+    "t/unit/apps/test_multi.py"
+  ];
+
+  disabledTests = [
+    "msgpack"
+    "test_check_privileges_no_fchown"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # too many open files on hydra
+    "test_cleanup"
+    "test_with_autoscaler_file_descriptor_safety"
+    "test_with_file_descriptor_safety"
+  ];
+
+  pythonImportsCheck = [
+    "celery"
+  ];
+
+  passthru.tests = {
+    inherit (nixosTests) sourcehut;
+  };
+
+  meta = with lib; {
+    description = "Distributed task queue";
+    homepage = "https://github.com/celery/celery/";
+    changelog = "https://github.com/celery/celery/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cement/default.nix b/nixpkgs/pkgs/development/python-modules/cement/default.nix
new file mode 100644
index 000000000000..f8dc2c6a3ae0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cement/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cement";
+  version = "3.0.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rRGmlGZeKtKEV8VgSU9PjDaiX8WOUA1gip2R4E4dMJM=";
+  };
+
+  # Disable test tests since they depend on a memcached server running on
+  # 127.0.0.1:11211.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "cement"
+  ];
+
+  meta = with lib; {
+    description = "CLI Application Framework for Python";
+    homepage = "https://builtoncement.com/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ eqyiel ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cemm/default.nix b/nixpkgs/pkgs/development/python-modules/cemm/default.nix
new file mode 100644
index 000000000000..9f9ae3b16be5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cemm/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "cemm";
+  version = "0.5.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "klaasnicolaas";
+    repo = "python-cemm";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-BorgGHxoEeIGyJKqe9mFRDpcGHhi6/8IV7ubEI8yQE4=";
+  };
+
+  patches = [
+    # https://github.com/klaasnicolaas/python-cemm/pull/360
+    (fetchpatch {
+      name = "remove-setuptools-dependency.patch";
+      url = "https://github.com/klaasnicolaas/python-cemm/commit/1e373dac078f18563264e6733baf6a93962cac4b.patch";
+      hash = "sha256-DVNn4BZwi8yNpKFmzt7YSYhzzB4vaAyrd/My8TtYzj0=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"0.0.0"' '"${version}"' \
+      --replace 'addopts = "--cov"' ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "cemm"
+  ];
+
+  meta = with lib; {
+    description = "Module for interacting with CEMM devices";
+    homepage = "https://github.com/klaasnicolaas/python-cemm";
+    changelog = "https://github.com/klaasnicolaas/python-cemm/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/censys/default.nix b/nixpkgs/pkgs/development/python-modules/censys/default.nix
new file mode 100644
index 000000000000..9c24281e8d62
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/censys/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, argcomplete
+, backoff
+, buildPythonPackage
+, fetchFromGitHub
+, importlib-metadata
+, parameterized
+, poetry-core
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, requests
+, requests-mock
+, responses
+, rich
+}:
+
+buildPythonPackage rec {
+  pname = "censys";
+  version = "2.2.9";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "censys";
+    repo = "censys-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Q6Ii2fsJYNABhuaRK4nZ6bjjvNsoIcgNVFBXdBgTXIo=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    argcomplete
+    backoff
+    requests
+    rich
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    parameterized
+    pytest-mock
+    pytestCheckHook
+    requests-mock
+    responses
+  ];
+
+  pythonRelaxDeps = [
+    "backoff"
+    "requests"
+    "rich"
+  ];
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace "--cov" ""
+  '';
+
+  # The tests want to write a configuration file
+  preCheck = ''
+    export HOME=$(mktemp -d)
+    mkdir -p $HOME
+  '';
+
+  pythonImportsCheck = [
+    "censys"
+  ];
+
+  meta = with lib; {
+    description = "Python API wrapper for the Censys Search Engine (censys.io)";
+    homepage = "https://github.com/censys/censys-python";
+    changelog = "https://github.com/censys/censys-python/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cepa/default.nix b/nixpkgs/pkgs/development/python-modules/cepa/default.nix
new file mode 100644
index 000000000000..67c45a26665b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cepa/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, python
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "cepa";
+  version = "1.8.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-P7xwGsP8ic1/abxYptDXNbAU+kC2Hiwu/Tge0g21ipY=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "python-3.11-compatibility.patch";
+      url = "https://github.com/onionshare/cepa/commit/0bf9aee7151e65594c532826bb04636e1d80fb6f.patch";
+      hash = "sha256-roSt9N5OvnOOxKZUee86zGXt0AsZCcbBdV2cLz1MB2k=";
+    })
+  ];
+
+  postPatch = ''
+    rm test/unit/installation.py
+    sed -i "/test.unit.installation/d" test/settings.cfg
+    # https://github.com/torproject/stem/issues/56
+    sed -i '/MOCK_VERSION/d' run_tests.py
+  '';
+
+  nativeCheckInputs = [ mock ];
+
+  checkPhase = ''
+    touch .gitignore
+    ${python.interpreter} run_tests.py -u
+  '';
+
+  meta = with lib; {
+    description = "Controller library that allows applications to interact with Tor";
+    homepage = "https://github.com/onionshare/cepa";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ lourkeur ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cerberus/default.nix b/nixpkgs/pkgs/development/python-modules/cerberus/default.nix
new file mode 100644
index 000000000000..a60e80353599
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cerberus/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "cerberus";
+  version = "1.3.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "pyeve";
+    repo = "cerberus";
+    rev = "refs/tags/${version}";
+    hash = "sha256-4sVNM4zHc9nsrntmJVdE9nm47CSF0UOJPPI9z3Z2YDc=";
+  };
+
+  propagatedBuildInputs = [
+    poetry-core
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "cerberus"
+  ];
+
+  disabledTestPaths = [
+    # We don't care about benchmarks
+    "cerberus/benchmarks/"
+  ];
+
+  meta = with lib; {
+    description = "Schema and data validation tool for Python dictionaries";
+    homepage = "http://python-cerberus.org/";
+    changelog = "https://github.com/pyeve/cerberus/blob/${version}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cert-chain-resolver/default.nix b/nixpkgs/pkgs/development/python-modules/cert-chain-resolver/default.nix
new file mode 100644
index 000000000000..b1cbde96ab38
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cert-chain-resolver/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pytestCheckHook
+, pytest-mock
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "cert-chain-resolver";
+  version = "1.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rkoopmans";
+    repo = "python-certificate-chain-resolver";
+    rev = "refs/tags/${version}";
+    hash = "sha256-2itpu/Ap5GNnqAiw3Cp+8rndreWlwfPd+WwM99G7U2E=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+    six
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_cert_returns_completed_chain"
+    "test_display_flag_is_properly_formatted"
+  ];
+
+  pythonImportsCheck = [
+    "cert_chain_resolver"
+  ];
+
+  meta = with lib; {
+    description = "Resolve / obtain the certificate intermediates of a x509 certificate";
+    homepage = "https://github.com/rkoopmans/python-certificate-chain-resolver";
+    changelog = "https://github.com/rkoopmans/python-certificate-chain-resolver/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ veehaitch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/certauth/default.nix b/nixpkgs/pkgs/development/python-modules/certauth/default.nix
new file mode 100644
index 000000000000..04a4637bafc9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certauth/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyopenssl
+, tldextract
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "certauth";
+  version = "1.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ikreymer";
+    repo = "certauth";
+    # Repo has no git tags, https://github.com/ikreymer/certauth/issues/15
+    rev = "ad2bae5d40a9e45519fc1f2cd7678174bbc55b3d";
+    hash = "sha256-Rso5N0jb9k7bdorjPIUMNiZZPnzwbkxFNiTpsJ9pco0=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "--cov certauth " ""
+  '';
+
+  propagatedBuildInputs = [
+    pyopenssl
+    tldextract
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "certauth"
+  ];
+
+  disabledTests = [
+    # Tests want to download Public Suffix List
+    "test_file_wildcard"
+    "test_file_wildcard_subdomains"
+    "test_in_mem_parent_wildcard_cert"
+    "test_in_mem_parent_wildcard_cert_at_tld"
+    "test_in_mem_parent_wildcard_cert_2"
+  ];
+
+  meta = with lib; {
+    description = "Simple CertificateAuthority and host certificate creation, useful for man-in-the-middle HTTPS proxy";
+    homepage = "https://github.com/ikreymer/certauth";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Luflosi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/certbot-dns-cloudflare/default.nix b/nixpkgs/pkgs/development/python-modules/certbot-dns-cloudflare/default.nix
new file mode 100644
index 000000000000..69f2f890e359
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certbot-dns-cloudflare/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage
+, acme
+, certbot
+, cloudflare
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "certbot-dns-cloudflare";
+
+  inherit (certbot) src version;
+  disabled = pythonOlder "3.6";
+
+  sourceRoot = "${src.name}/certbot-dns-cloudflare";
+
+  propagatedBuildInputs = [
+    acme
+    certbot
+    cloudflare
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "-o cache_dir=$(mktemp -d)"
+
+    # Monitor https://github.com/certbot/certbot/issues/9606 for a solution
+    "-W 'ignore:pkg_resources is deprecated as an API:DeprecationWarning'"
+  ];
+
+  meta = certbot.meta // {
+    description = "Cloudflare DNS Authenticator plugin for Certbot";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/certbot-dns-google/default.nix b/nixpkgs/pkgs/development/python-modules/certbot-dns-google/default.nix
new file mode 100644
index 000000000000..e5910ff08571
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certbot-dns-google/default.nix
@@ -0,0 +1,39 @@
+{ buildPythonPackage
+, acme
+, certbot
+, google-api-python-client
+, oauth2client
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "certbot-dns-google";
+
+  inherit (certbot) src version;
+  disabled = pythonOlder "3.6";
+
+  sourceRoot = "${src.name}/certbot-dns-google";
+
+  propagatedBuildInputs = [
+    acme
+    certbot
+    google-api-python-client
+    oauth2client
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "-o cache_dir=$(mktemp -d)"
+
+    # Monitor https://github.com/certbot/certbot/issues/9606 for a solution
+    "-W 'ignore:pkg_resources is deprecated as an API:DeprecationWarning'"
+  ];
+
+  meta = certbot.meta // {
+    description = "Google Cloud DNS Authenticator plugin for Certbot";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/certbot-dns-inwx/default.nix b/nixpkgs/pkgs/development/python-modules/certbot-dns-inwx/default.nix
new file mode 100644
index 000000000000..2874e9419e39
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certbot-dns-inwx/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, acme
+, certbot
+}:
+
+buildPythonPackage rec {
+  pname = "certbot-dns-inwx";
+  version = "2.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-v03QBHsxhl6R8YcwWIKD+pf4APy9S2vFcQe3ZEc6AjI=";
+  };
+
+  propagatedBuildInputs = [
+    acme
+    certbot
+  ];
+
+  # Doesn't have any tests
+  doCheck = false;
+
+  pytestCheckHook = [ "certbot_dns_inwx" ];
+
+  meta = with lib; {
+    description = "INWX DNS Authenticator plugin for Certbot";
+    homepage = "https://github.com/oGGy990/certbot-dns-inwx";
+    license = with licenses; [ asl20 mit ];
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/certbot-dns-ovh/default.nix b/nixpkgs/pkgs/development/python-modules/certbot-dns-ovh/default.nix
new file mode 100644
index 000000000000..da0dd57cff87
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certbot-dns-ovh/default.nix
@@ -0,0 +1,39 @@
+{ buildPythonPackage
+, acme
+, certbot
+, dns-lexicon
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "certbot-dns-ovh";
+
+  inherit (certbot) src version;
+  disabled = pythonOlder "3.6";
+
+  sourceRoot = "${src.name}/certbot-dns-ovh";
+
+  propagatedBuildInputs = [
+    acme
+    certbot
+    dns-lexicon
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "-o cache_dir=$(mktemp -d)"
+
+    # Monitor https://github.com/certbot/certbot/issues/9606 for a solution
+    "-W 'ignore:pkg_resources is deprecated as an API:DeprecationWarning'"
+    "-W 'ignore:Package lexicon.providers is deprecated and will be removed in Lexicon 4>=.:DeprecationWarning'"
+    "-W 'ignore:Legacy configuration object has been used to load the ConfigResolver.:DeprecationWarning'"
+  ];
+
+  meta = certbot.meta // {
+    description = "OVH DNS Authenticator plugin for Certbot";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/certbot-dns-rfc2136/default.nix b/nixpkgs/pkgs/development/python-modules/certbot-dns-rfc2136/default.nix
new file mode 100644
index 000000000000..ec360f4b1e6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certbot-dns-rfc2136/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage
+, acme
+, certbot
+, dnspython
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "certbot-dns-rfc2136";
+
+  inherit (certbot) src version;
+  disabled = pythonOlder "3.6";
+
+  sourceRoot = "${src.name}/certbot-dns-rfc2136";
+
+  propagatedBuildInputs = [
+    acme
+    certbot
+    dnspython
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "-o cache_dir=$(mktemp -d)"
+
+    # Monitor https://github.com/certbot/certbot/issues/9606 for a solution
+    "-W 'ignore:pkg_resources is deprecated as an API:DeprecationWarning'"
+  ];
+
+  meta = certbot.meta // {
+    description = "RFC 2136 DNS Authenticator plugin for Certbot";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/certbot-dns-route53/default.nix b/nixpkgs/pkgs/development/python-modules/certbot-dns-route53/default.nix
new file mode 100644
index 000000000000..6ea6af0820f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certbot-dns-route53/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage
+, acme
+, boto3
+, certbot
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "certbot-dns-route53";
+
+  inherit (certbot) src version;
+  disabled = pythonOlder "3.6";
+
+  propagatedBuildInputs = [
+    acme
+    boto3
+    certbot
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "-o cache_dir=$(mktemp -d)"
+
+    # Monitor https://github.com/certbot/certbot/issues/9606 for a solution
+    "-W 'ignore:pkg_resources is deprecated as an API:DeprecationWarning'"
+  ];
+
+  sourceRoot = "${src.name}/certbot-dns-route53";
+
+  meta = certbot.meta // {
+    description = "Route53 DNS Authenticator plugin for Certbot";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/certbot/default.nix b/nixpkgs/pkgs/development/python-modules/certbot/default.nix
new file mode 100644
index 000000000000..6da3be8329b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certbot/default.nix
@@ -0,0 +1,100 @@
+{ lib
+, buildPythonPackage
+, python
+, runCommand
+, fetchFromGitHub
+, configargparse
+, acme
+, configobj
+, cryptography
+, distro
+, josepy
+, parsedatetime
+, pyRFC3339
+, pyopenssl
+, pytz
+, requests
+, six
+, zope-component
+, zope_interface
+, setuptools
+, dialog
+, gnureadline
+, pytest-xdist
+, pytestCheckHook
+, python-dateutil
+}:
+
+buildPythonPackage rec {
+  pname = "certbot";
+  version = "2.7.4";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-BZ7JqAciwbmkpbzR/qZHAraLJWWXNRN3Er4XvfU5kYs=";
+  };
+
+  sourceRoot = "${src.name}/${pname}";
+
+  propagatedBuildInputs = [
+    configargparse
+    acme
+    configobj
+    cryptography
+    distro
+    josepy
+    parsedatetime
+    pyRFC3339
+    pyopenssl
+    pytz
+    requests
+    six
+    zope-component
+    zope_interface
+    setuptools # for pkg_resources
+  ];
+
+  buildInputs = [ dialog gnureadline ];
+
+  nativeCheckInputs = [
+    python-dateutil
+    pytestCheckHook
+    pytest-xdist
+  ];
+
+  pytestFlagsArray = [
+    "-o cache_dir=$(mktemp -d)"
+    # See https://github.com/certbot/certbot/issues/8746
+    "-W ignore::ResourceWarning"
+    "-W ignore::DeprecationWarning"
+  ];
+
+  doCheck = true;
+
+  makeWrapperArgs = [ "--prefix PATH : ${dialog}/bin" ];
+
+  # certbot.withPlugins has a similar calling convention as python*.withPackages
+  # it gets invoked with a lambda, and invokes that lambda with the python package set matching certbot's:
+  # certbot.withPlugins (cp: [ cp.certbot-dns-foo ])
+  passthru.withPlugins = f:
+    let
+      pythonEnv = python.withPackages f;
+
+    in
+    runCommand "certbot-with-plugins"
+      { } ''
+      mkdir -p $out/bin
+      cd $out/bin
+      ln -s ${pythonEnv}/bin/certbot
+    '';
+
+  meta = with lib; {
+    homepage = src.meta.homepage;
+    description = "ACME client that can obtain certs and extensibly update server configurations";
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ domenkozar ];
+    license = with licenses; [ asl20 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/certifi/default.nix b/nixpkgs/pkgs/development/python-modules/certifi/default.nix
new file mode 100644
index 000000000000..8a2fd3bb88cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certifi/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, cacert
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "certifi";
+  version = "2023.07.22";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = "python-certifi";
+    rev = version;
+    hash = "sha256-V3bptJDNMGXlCMg6GHj792IrjfsG9+F/UpQKxeM0QOc=";
+  };
+
+  patches = [
+    # Add support for NIX_SSL_CERT_FILE
+    ./env.patch
+  ];
+
+  postPatch = ''
+    # Use our system-wide ca-bundle instead of the bundled one
+    rm -v "certifi/cacert.pem"
+    ln -snvf "${cacert}/etc/ssl/certs/ca-bundle.crt" "certifi/cacert.pem"
+  '';
+
+  propagatedNativeBuildInputs = [
+    # propagate cacerts setup-hook to set up `NIX_SSL_CERT_FILE`
+    cacert
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "certifi"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/certifi/python-certifi";
+    description = "Python package for providing Mozilla's CA Bundle";
+    license = licenses.isc;
+    maintainers = with maintainers; [ koral ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/certifi/env.patch b/nixpkgs/pkgs/development/python-modules/certifi/env.patch
new file mode 100644
index 000000000000..292f977ef2c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certifi/env.patch
@@ -0,0 +1,86 @@
+diff --git a/certifi/core.py b/certifi/core.py
+index de02898..c033d20 100644
+--- a/certifi/core.py
++++ b/certifi/core.py
+@@ -4,15 +4,25 @@ certifi.py
+ 
+ This module returns the installation location of cacert.pem or its contents.
+ """
++import os
+ import sys
+ 
+ 
++def get_cacert_path_from_environ():
++    path = os.environ.get("NIX_SSL_CERT_FILE", None)
++
++    if path == "/no-cert-file.crt":
++        return None
++
++    return path
++
++
+ if sys.version_info >= (3, 11):
+ 
+     from importlib.resources import as_file, files
+ 
+     _CACERT_CTX = None
+-    _CACERT_PATH = None
++    _CACERT_PATH = get_cacert_path_from_environ()
+ 
+     def where() -> str:
+         # This is slightly terrible, but we want to delay extracting the file
+@@ -39,14 +49,16 @@ if sys.version_info >= (3, 11):
+         return _CACERT_PATH
+ 
+     def contents() -> str:
+-        return files("certifi").joinpath("cacert.pem").read_text(encoding="ascii")
++        if _CACERT_PATH is not None:
++            return open(_CACERT_PATH, encoding="utf-8").read()
++        return files("certifi").joinpath("cacert.pem").read_text(encoding="utf-8")
+ 
+ elif sys.version_info >= (3, 7):
+ 
+     from importlib.resources import path as get_path, read_text
+ 
+     _CACERT_CTX = None
+-    _CACERT_PATH = None
++    _CACERT_PATH = get_cacert_path_from_environ()
+ 
+     def where() -> str:
+         # This is slightly terrible, but we want to delay extracting the
+@@ -74,7 +86,9 @@ elif sys.version_info >= (3, 7):
+         return _CACERT_PATH
+ 
+     def contents() -> str:
+-        return read_text("certifi", "cacert.pem", encoding="ascii")
++        if _CACERT_PATH is not None:
++            return open(_CACERT_PATH, encoding="utf-8").read()
++        return read_text("certifi", "cacert.pem", encoding="utf-8")
+ 
+ else:
+     import os
+@@ -84,6 +98,8 @@ else:
+     Package = Union[types.ModuleType, str]
+     Resource = Union[str, "os.PathLike"]
+ 
++    _CACERT_PATH = get_cacert_path_from_environ()
++
+     # This fallback will work for Python versions prior to 3.7 that lack the
+     # importlib.resources module but relies on the existing `where` function
+     # so won't address issues with environments like PyOxidizer that don't set
+@@ -102,7 +118,14 @@ else:
+     def where() -> str:
+         f = os.path.dirname(__file__)
+ 
++        if _CACERT_PATH is not None:
++            return _CACERT_PATH
++
+         return os.path.join(f, "cacert.pem")
+ 
+     def contents() -> str:
+-        return read_text("certifi", "cacert.pem", encoding="ascii")
++        if _CACERT_PATH is not None:
++            with open(_CACERT_PATH, encoding="utf-8") as data:
++                return data.read()
++
++        return read_text("certifi", "cacert.pem", encoding="utf-8")
diff --git a/nixpkgs/pkgs/development/python-modules/certipy-ad/default.nix b/nixpkgs/pkgs/development/python-modules/certipy-ad/default.nix
new file mode 100644
index 000000000000..ce55ab982925
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certipy-ad/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, asn1crypto
+, buildPythonPackage
+, cryptography
+, dnspython
+, dsinternals
+, fetchFromGitHub
+, impacket
+, ldap3
+, pyasn1
+, pycryptodome
+, pyopenssl
+, pythonOlder
+, requests
+, requests_ntlm
+, unicrypto
+}:
+
+buildPythonPackage rec {
+  pname = "certipy-ad";
+  version = "4.8.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ly4k";
+    repo = "Certipy";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Era5iNLJkZIRvN/p3BiD/eDiDQme24G65VSG97tuEOQ=";
+  };
+
+  postPatch = ''
+    # pin does not apply because our ldap3 contains a patch to fix pyasn1 compability
+    substituteInPlace setup.py \
+      --replace "pyasn1==0.4.8" "pyasn1"
+  '';
+
+  propagatedBuildInputs = [
+    asn1crypto
+    cryptography
+    dnspython
+    dsinternals
+    impacket
+    ldap3
+    pyasn1
+    pycryptodome
+    pyopenssl
+    requests
+    requests_ntlm
+    unicrypto
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "certipy"
+  ];
+
+  meta = with lib; {
+    description = "Library and CLI tool to enumerate and abuse misconfigurations in Active Directory Certificate Services";
+    homepage = "https://github.com/ly4k/Certipy";
+    changelog = "https://github.com/ly4k/Certipy/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/certipy/default.nix b/nixpkgs/pkgs/development/python-modules/certipy/default.nix
new file mode 100644
index 000000000000..a3cde807076f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certipy/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyopenssl
+}:
+
+buildPythonPackage rec {
+  pname = "certipy";
+  version = "0.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0n980gqpzh0fm58h3i4mi2i10wgj606lscm1r5sk60vbf6vh8mv9";
+  };
+
+  propagatedBuildInputs = [ pyopenssl ];
+
+  doCheck = false; #no tests were included
+
+  meta = with lib; {
+    homepage = "https://github.com/LLNL/certipy";
+    description = "wrapper for pyOpenSSL";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ isgy ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/certomancer/default.nix b/nixpkgs/pkgs/development/python-modules/certomancer/default.nix
new file mode 100644
index 000000000000..641941e7f38d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certomancer/default.nix
@@ -0,0 +1,99 @@
+{ lib
+, asn1crypto
+, buildPythonPackage
+, click
+, cryptography
+, fetchFromGitHub
+, freezegun
+, jinja2
+, oscrypto
+, pyhanko-certvalidator
+, pytest-aiohttp
+, pytestCheckHook
+, python-dateutil
+, python-pkcs11
+, pythonOlder
+, pytz
+, pyyaml
+, requests
+, requests-mock
+, setuptools
+, tzlocal
+, werkzeug
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "certomancer";
+  version = "0.11.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "MatthiasValvekens";
+    repo = "certomancer";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-UQV0Tk4C5b5iBZ34Je59gK2dLTaJusnpxdyNicIh2Q8=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace ' "pytest-runner",' "" \
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    asn1crypto
+    click
+    oscrypto
+    python-dateutil
+    pyyaml
+    tzlocal
+  ];
+
+  passthru.optional-dependencies = {
+    requests-mocker = [
+      requests-mock
+    ];
+    web-api = [
+      jinja2
+      werkzeug
+    ];
+    pkcs12 = [
+      cryptography
+    ];
+    pkcs11 = [
+      python-pkcs11
+    ];
+  };
+
+  nativeCheckInputs = [
+    freezegun
+    pyhanko-certvalidator
+    pytest-aiohttp
+    pytestCheckHook
+    pytz
+    requests
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  disabledTests = [
+    # pyhanko_certvalidator.errors.DisallowedAlgorithmError
+    "test_validate"
+  ];
+
+  pythonImportsCheck = [
+    "certomancer"
+  ];
+
+  meta = with lib; {
+    description = "Quickly construct, mock & deploy PKI test configurations using simple declarative configuration";
+    homepage = "https://github.com/MatthiasValvekens/certomancer";
+    license = licenses.mit;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/certvalidator/default.nix b/nixpkgs/pkgs/development/python-modules/certvalidator/default.nix
new file mode 100644
index 000000000000..ce30bea9f51b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/certvalidator/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, asn1crypto, oscrypto
+, cacert
+}:
+
+buildPythonPackage rec {
+  pname = "certvalidator";
+  version = "0.11.1";
+
+  src = fetchFromGitHub {
+    owner = "wbond";
+    repo = pname;
+    rev = version;
+    hash = "sha256-yVF7t4FuU3C9fDg67JeM7LWZZh/mv5F4EKmjlO4AuBY=";
+  };
+
+  propagatedBuildInputs = [ asn1crypto oscrypto ];
+
+  nativeCheckInputs = [ cacert ];
+  checkPhase = ''
+    # Tests are run with a custom executor/loader
+    # The regex to skip specific tests relies on negative lookahead of regular expressions
+    # We're skipping the few tests that rely on the network, fetching CRLs, OCSP or remote certificates
+    python -c 'import dev.tests; dev.tests.run("^(?!.*test_(basic_certificate_validator_tls|fetch|revocation|build_path)).*$")'
+  '';
+  pythonImportsCheck = [ "certvalidator" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/wbond/certvalidator";
+    description = "Validates X.509 certificates and paths";
+    license = licenses.mit;
+    maintainers = with maintainers; [ baloo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cexprtk/default.nix b/nixpkgs/pkgs/development/python-modules/cexprtk/default.nix
new file mode 100644
index 000000000000..53c906c613ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cexprtk/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cexprtk";
+  version = "0.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QhftIybufVPO/YbLFycR4qYEAtQMcRPP5jKS6o6dFZg=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "cexprtk" ];
+
+  meta = with lib; {
+    description = "Mathematical expression parser, cython wrapper";
+    homepage = "https://github.com/mjdrushton/cexprtk";
+    license = licenses.cpl10;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cf-xarray/default.nix b/nixpkgs/pkgs/development/python-modules/cf-xarray/default.nix
new file mode 100644
index 000000000000..fdbfe0ff71a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cf-xarray/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, buildPythonPackage
+, dask
+, fetchFromGitHub
+, matplotlib
+, pint
+, pooch
+, pytestCheckHook
+, pythonOlder
+, regex
+, rich
+, scipy
+, setuptools
+, setuptools-scm
+, shapely
+, wheel
+, xarray
+}:
+
+buildPythonPackage rec {
+  pname = "cf-xarray";
+  version = "0.8.6";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "xarray-contrib";
+    repo = "cf-xarray";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-qcoHz/yZoPVu0uBKKx4AV7MOokiuXSCaWPD/92VlRFk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+    xarray
+  ];
+
+  propagatedBuildInputs = [
+    xarray
+  ];
+
+  passthru.optional-dependencies = {
+    all = [
+      matplotlib
+      pint
+      pooch
+      regex
+      rich
+      shapely
+    ];
+  };
+
+  nativeCheckInputs = [
+    dask
+    pytestCheckHook
+    scipy
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "cf_xarray"
+  ];
+
+  disabledTestPaths = [
+    # Tests require network access
+    "cf_xarray/tests/test_accessor.py"
+    "cf_xarray/tests/test_helpers.py"
+  ];
+
+  meta = with lib; {
+    description = "An accessor for xarray objects that interprets CF attributes";
+    homepage = "https://github.com/xarray-contrib/cf-xarray";
+    changelog = "https://github.com/xarray-contrib/cf-xarray/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cffi/clang-pointer-substraction-warning.diff b/nixpkgs/pkgs/development/python-modules/cffi/clang-pointer-substraction-warning.diff
new file mode 100644
index 000000000000..75b2677e380e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cffi/clang-pointer-substraction-warning.diff
@@ -0,0 +1,11 @@
+diff -r c649a735cf82 testing/support.py
+--- a/testing/support.py	Thu Feb 23 05:42:01 2023 +0100
++++ b/testing/support.py	Sat May 20 21:46:56 2023 -0400
+@@ -112,6 +112,7 @@
+                               '-Wno-unreachable-code']
+         # special things for clang
+         extra_compile_args.append('-Qunused-arguments')
++        extra_compile_args.append('-Wno-null-pointer-subtraction')
+     else:
+         # assume a standard gcc
+         extra_compile_args = ['-Werror', '-Wall', '-Wextra', '-Wconversion',
diff --git a/nixpkgs/pkgs/development/python-modules/cffi/darwin-use-libffi-closures.diff b/nixpkgs/pkgs/development/python-modules/cffi/darwin-use-libffi-closures.diff
new file mode 100644
index 000000000000..fdbec4f6fe4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cffi/darwin-use-libffi-closures.diff
@@ -0,0 +1,22 @@
+diff --git a/src/c/_cffi_backend.c b/src/c/_cffi_backend.c
+index 537271f..9c3bf94 100644
+--- a/src/c/_cffi_backend.c
++++ b/src/c/_cffi_backend.c
+@@ -103,7 +103,7 @@
+ # define CFFI_CHECK_FFI_PREP_CIF_VAR 0
+ # define CFFI_CHECK_FFI_PREP_CIF_VAR_MAYBE 0
+ 
+-#elif defined(__APPLE__) && defined(FFI_AVAILABLE_APPLE)
++#elif defined(__APPLE__)
+ 
+ # define CFFI_CHECK_FFI_CLOSURE_ALLOC __builtin_available(macos 10.15, ios 13, watchos 6, tvos 13, *)
+ # define CFFI_CHECK_FFI_CLOSURE_ALLOC_MAYBE 1
+@@ -6422,7 +6422,7 @@ static PyObject *b_callback(PyObject *self, PyObject *args)
+     else
+ #endif
+     {
+-#if defined(__APPLE__) && defined(FFI_AVAILABLE_APPLE) && !FFI_LEGACY_CLOSURE_API
++#if defined(__APPLE__) && !FFI_LEGACY_CLOSURE_API
+         PyErr_Format(PyExc_SystemError, "ffi_prep_closure_loc() is missing");
+         goto error;
+ #else
diff --git a/nixpkgs/pkgs/development/python-modules/cffi/default.nix b/nixpkgs/pkgs/development/python-modules/cffi/default.nix
new file mode 100644
index 000000000000..7b2547afff1d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cffi/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, isPyPy
+, fetchPypi
+, setuptools
+, pytestCheckHook
+, libffi
+, pkg-config
+, pycparser
+, pythonAtLeast
+}:
+
+if isPyPy then null else buildPythonPackage rec {
+  pname = "cffi";
+  version = "1.16.0";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vLPvQ+WGZbvaL7GYaY/K5ndkg+DEpjGqVkeAbCXgLMA=";
+  };
+
+  patches = [
+    #
+    # Trusts the libffi library inside of nixpkgs on Apple devices.
+    #
+    # Based on some analysis I did:
+    #
+    #   https://groups.google.com/g/python-cffi/c/xU0Usa8dvhk
+    #
+    # I believe that libffi already contains the code from Apple's fork that is
+    # deemed safe to trust in cffi.
+    #
+    ./darwin-use-libffi-closures.diff
+  ] ++ lib.optionals (stdenv.cc.isClang && lib.versionAtLeast (lib.getVersion stdenv.cc) "13") [
+    # -Wnull-pointer-subtraction is enabled with -Wextra. Suppress it to allow the following tests
+    # to run and pass when cffi is built with newer versions of clang:
+    # - testing/cffi1/test_verify1.py::test_enum_usage
+    # - testing/cffi1/test_verify1.py::test_named_pointer_as_argument
+    ./clang-pointer-substraction-warning.diff
+  ];
+
+  postPatch = lib.optionalString stdenv.isDarwin ''
+    # Remove setup.py impurities
+    substituteInPlace setup.py \
+      --replace "'-iwithsysroot/usr/include/ffi'" "" \
+      --replace "'/usr/include/ffi'," "" \
+      --replace '/usr/include/libffi' '${lib.getDev libffi}/include'
+  '';
+
+  nativeBuildInputs = [
+    pkg-config
+    setuptools
+  ];
+
+  buildInputs = [
+    libffi
+  ];
+
+  propagatedBuildInputs = [
+    pycparser
+  ];
+
+  # The tests use -Werror but with python3.6 clang detects some unreachable code.
+  env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.cc.isClang
+    "-Wno-unused-command-line-argument -Wno-unreachable-code -Wno-c++11-narrowing";
+
+  doCheck = !stdenv.hostPlatform.isMusl;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/python-cffi/cffi/releases/tag/v${version}";
+    description = "Foreign Function Interface for Python calling C code";
+    downloadPage = "https://github.com/python-cffi/cffi";
+    homepage = "https://cffi.readthedocs.org/";
+    license = licenses.mit;
+    maintainers = teams.python.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cffsubr/default.nix b/nixpkgs/pkgs/development/python-modules/cffsubr/default.nix
new file mode 100644
index 000000000000..e86277cf2782
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cffsubr/default.nix
@@ -0,0 +1,53 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, fonttools
+, pytestCheckHook
+, setuptools-scm
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "cffsubr";
+  version = "0.2.9.post1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-azFBLc9JyPqEZkvahn4u3cVbb+b6aW/yU8TxOp/y/Fw=";
+  };
+
+  patches = [
+    # https://github.com/adobe-type-tools/cffsubr/pull/23
+    (fetchpatch {
+      name = "remove-setuptools-git-ls-files.patch";
+      url = "https://github.com/adobe-type-tools/cffsubr/commit/887a6a03b1e944b82fcb99b797fbc2f3a64298f0.patch";
+      hash = "sha256-LuyqBtDrKWwCeckr+YafZ5nfVw1XnELwFI6X8bGomhs=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    fonttools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "cffsubr" ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Standalone CFF subroutinizer based on AFDKO tx";
+    homepage = "https://github.com/adobe-type-tools/cffsubr";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cfgv/default.nix b/nixpkgs/pkgs/development/python-modules/cfgv/default.nix
new file mode 100644
index 000000000000..0975d649a167
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cfgv/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cfgv";
+  version = "3.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "asottile";
+    repo = "cfgv";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-P02j53dltwdrlUBG89AI+P2GkXYKTVrQNF15rZt58jw=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "cfgv"
+  ];
+
+  meta = with lib; {
+    description = "Validate configuration and produce human readable error messages";
+    homepage = "https://github.com/asottile/cfgv";
+    license = licenses.mit;
+    maintainers = with lib.maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cfn-flip/default.nix b/nixpkgs/pkgs/development/python-modules/cfn-flip/default.nix
new file mode 100644
index 000000000000..d1fa5de4793d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cfn-flip/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "cfn-flip";
+  version = "1.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "awslabs";
+    repo = "aws-cfn-template-flip";
+    rev = version;
+    hash = "sha256-lfhTR3+D1FvblhQGF83AB8+I8WDPBTmo+q22ksgDgt4=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    pyyaml
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    sed -i "/--cov/d" tox.ini
+  '';
+
+  disabledTests = [
+    # TypeError: load() missing 1 required positional argument: 'Loader'
+    "test_flip_to_yaml_with_longhand_functions"
+    "test_yaml_no_ordered_dict"
+  ];
+
+  pythonImportsCheck = [
+    "cfn_flip"
+  ];
+
+  meta = with lib; {
+    description = "Tool for converting AWS CloudFormation templates between JSON and YAML formats";
+    homepage = "https://github.com/awslabs/aws-cfn-template-flip";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ kamadorueda psyanticy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cfn-lint/default.nix b/nixpkgs/pkgs/development/python-modules/cfn-lint/default.nix
new file mode 100644
index 000000000000..f52bf2f667ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cfn-lint/default.nix
@@ -0,0 +1,90 @@
+{ lib
+, aws-sam-translator
+, buildPythonPackage
+, fetchFromGitHub
+, jschema-to-python
+, jsonpatch
+, jsonschema
+, junit-xml
+, mock
+, networkx
+, pydot
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, regex
+, sarif-om
+, setuptools
+, sympy
+}:
+
+buildPythonPackage rec {
+  pname = "cfn-lint";
+  version = "0.79.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aws-cloudformation";
+    repo = "cfn-python-lint";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-dVLKMoZzP2q3bejEIslgpQgkPJOJUeEsXyyk8HRP6h0=";
+  };
+
+  propagatedBuildInputs = [
+    aws-sam-translator
+    jschema-to-python
+    jsonpatch
+    jsonschema
+    junit-xml
+    networkx
+    networkx
+    pyyaml
+    regex
+    sarif-om
+    sympy
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pydot
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export PATH=$out/bin:$PATH
+  '';
+
+  disabledTests = [
+    # These tests depend on the current date, for example because of issues like this.
+    # This makes it possible for them to succeed on hydra and then begin to fail without
+    # any code changes.
+    # https://github.com/aws-cloudformation/cfn-python-lint/issues/1705
+    # See also: https://github.com/NixOS/nixpkgs/issues/108076
+    "TestQuickStartTemplates"
+    # Requires git directory
+    "test_update_docs"
+    # Tests depend on network access (fails in getaddrinfo)
+    "test_update_resource_specs_python_2"
+    "test_update_resource_specs_python_3"
+    "test_sarif_formatter"
+    # Some CLI tests fails
+    "test_bad_config"
+    "test_override_parameters"
+    "test_positional_template_parameters"
+    "test_template_config"
+  ];
+
+  pythonImportsCheck = [
+    "cfnlint"
+  ];
+
+  meta = with lib; {
+    description = "Checks cloudformation for practices and behaviour that could potentially be improved";
+    homepage = "https://github.com/aws-cloudformation/cfn-python-lint";
+    changelog = "https://github.com/aws-cloudformation/cfn-lint/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cfscrape/default.nix b/nixpkgs/pkgs/development/python-modules/cfscrape/default.nix
new file mode 100644
index 000000000000..f050217c3fb3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cfscrape/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "cfscrape";
+  version = "2.1.1";
+  src = fetchFromGitHub ({
+    owner = "Anorov";
+    repo = "cloudflare-scrape";
+    rev = "9692fe7ff3c17b76ddf0f4d50d3dba7d1791c9c6";
+    hash = "sha256-uO8lBZonjk+mlFYoNSaz+GIN/W9yf8VL9OQ7MKfsMgI=";
+  });
+
+  propagatedBuildInputs = [ requests ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/Anorov/cloudflare-scrape";
+    description = "A Python module to bypass Cloudflare's anti-bot page";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cftime/default.nix b/nixpkgs/pkgs/development/python-modules/cftime/default.nix
new file mode 100644
index 000000000000..b827c48531aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cftime/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchPypi
+, fetchpatch
+, numpy
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cftime";
+  version = "1.6.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-hhTAD7ilBG3jBP3Ybb0iT5lAgYXXskWsZijQJ2WW5tI=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # Fix test_num2date_precision by checking per platform precision
+      url = "https://github.com/Unidata/cftime/commit/221ff2195d588a43a7984597033b678f330fbc41.patch";
+      hash = "sha256-3XTJuET20g9QElM/8WGnNzJBFZ0oUN4ikhWKppwcyNM=";
+    })
+  ];
+
+  postPatch = ''
+    sed -i "/--cov/d" setup.cfg
+  '';
+
+
+  nativeBuildInputs = [
+    cython
+    numpy
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "cftime"
+  ];
+
+  meta = with lib; {
+    description = "Time-handling functionality from netcdf4-python";
+    homepage = "https://github.com/Unidata/cftime";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cgen/default.nix b/nixpkgs/pkgs/development/python-modules/cgen/default.nix
new file mode 100644
index 000000000000..f61e02878c54
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cgen/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytools
+, numpy
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "cgen";
+  version = "2020.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4ec99d0c832d9f95f5e51dd18a629ad50df0b5464ce557ef42c6e0cd9478bfcf";
+  };
+
+  nativeCheckInputs = [ pytest ];
+  propagatedBuildInputs = [
+    pytools
+    numpy
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "C/C++ source generation from an AST";
+    homepage = "https://github.com/inducer/cgen";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cgroup-utils/default.nix b/nixpkgs/pkgs/development/python-modules/cgroup-utils/default.nix
new file mode 100644
index 000000000000..8b3a6afa9b36
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cgroup-utils/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pep8, nose }:
+
+buildPythonPackage rec {
+  version = "0.8";
+  pname = "cgroup-utils";
+
+  buildInputs = [ pep8 nose ];
+  # Pep8 tests fail...
+  doCheck = false;
+
+  postPatch = ''
+    sed -i -e "/argparse/d" setup.py
+  '';
+
+  src = fetchFromGitHub {
+    owner = "peo3";
+    repo = "cgroup-utils";
+    rev = "v${version}";
+    sha256 = "0qnbn8cnq8m14s8s1hcv25xjd55dyb6yy54l5vc7sby5xzzp11fq";
+  };
+
+  meta = with lib; {
+    description = "Utility tools for control groups of Linux";
+    maintainers = with maintainers; [ layus ];
+    platforms = platforms.linux;
+    license = licenses.gpl2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/chacha20poly1305-reuseable/default.nix b/nixpkgs/pkgs/development/python-modules/chacha20poly1305-reuseable/default.nix
new file mode 100644
index 000000000000..1d1b21ceee57
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chacha20poly1305-reuseable/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build-system
+, cython_3
+, poetry-core
+, setuptools
+
+# propagates
+, cryptography
+
+# tests
+, pytestCheckHook
+}:
+
+let
+  pname = "chacha20poly1305-reuseable";
+  version = "0.11.0";
+in
+
+buildPythonPackage {
+  inherit pname version;
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-uRndA0NnSQtJTftALzBF3FWZtavRyMwBlnCBqoIXE5Q=";
+  };
+
+  nativeBuildInputs = [
+    cython_3
+    poetry-core
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  pythonImportsCheck = [
+    "chacha20poly1305_reuseable"
+  ];
+
+  preCheck = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov=chacha20poly1305_reuseable --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "ChaCha20Poly1305 that is reuseable for asyncio";
+    homepage = "https://github.com/bdraco/chacha20poly1305-reuseable";
+    changelog = "https://github.com/bdraco/chacha20poly1305-reuseable/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/chacha20poly1305/default.nix b/nixpkgs/pkgs/development/python-modules/chacha20poly1305/default.nix
new file mode 100644
index 000000000000..d4f88b0a7349
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chacha20poly1305/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "chacha20poly1305";
+  version = "0.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8vAFx89GOP+k/wbALHh0gGi2QpFnlcbRbHzF41XnDt8=";
+  };
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "chacha20poly1305"
+  ];
+
+  meta = with lib; {
+    description = "Module that implements ChaCha20Poly1305";
+    homepage = "https://github.com/ph4r05/py-chacha20poly1305";
+    license = licenses.mit;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/chai/default.nix b/nixpkgs/pkgs/development/python-modules/chai/default.nix
new file mode 100644
index 000000000000..9f9d48d90171
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chai/default.nix
@@ -0,0 +1,15 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "chai";
+  version = "1.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ff8d2b6855f660cd23cd5ec79bd10264d39f24f6235773331b48e7fcd637d6cc";
+  };
+
+  meta = with lib; {
+    description = "Mocking, stubbing and spying framework for python";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/chainer/default.nix b/nixpkgs/pkgs/development/python-modules/chainer/default.nix
new file mode 100644
index 000000000000..1f5be76e2d21
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chainer/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, config
+, cudaSupport ? config.cudaSupport
+, cupy
+, fetchFromGitHub
+, filelock
+, mock
+, numpy
+, protobuf
+, pytestCheckHook
+, pythonOlder
+, six
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "chainer";
+  version = "7.8.1.post1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "chainer";
+    repo = "chainer";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-epwnExmyCWmwaOz+mJnAl1peEeHLBdQGC62BlLfSTQQ=";
+  };
+
+  propagatedBuildInputs = [
+    filelock
+    numpy
+    protobuf
+    six
+    typing-extensions
+  ] ++ lib.optionals cudaSupport [
+    cupy
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests/chainer_tests/utils_tests"
+  ];
+
+  preCheck = ''
+    # cf. https://github.com/chainer/chainer/issues/8621
+    export CHAINER_WARN_VERSION_MISMATCH=0
+
+    # ignore pytest warnings not listed
+    rm setup.cfg
+  '';
+
+  disabledTests = [
+    "gpu"
+    "cupy"
+    "ideep"
+  ];
+
+  pythonImportsCheck = [
+    "chainer"
+  ];
+
+  meta = with lib; {
+    description = "A flexible framework of neural networks for deep learning";
+    homepage = "https://chainer.org/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hyphon81 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/chainmap/default.nix b/nixpkgs/pkgs/development/python-modules/chainmap/default.nix
new file mode 100644
index 000000000000..4619bff2b046
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chainmap/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "chainmap";
+  version = "1.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e42aaa4b3e2f66102a11bfd563069704bfbfd84fdcb517b564effd736bf53cd9";
+  };
+
+  # Requires tox
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Backport/clone of ChainMap";
+    homepage = "https://bitbucket.org/jeunice/chainmap";
+    license = licenses.psfl;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/chalice/default.nix b/nixpkgs/pkgs/development/python-modules/chalice/default.nix
new file mode 100644
index 000000000000..915e40544a82
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chalice/default.nix
@@ -0,0 +1,110 @@
+{ lib
+, attrs
+, botocore
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, hypothesis
+, inquirer
+, jmespath
+, mock
+, mypy-extensions
+, pip
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, requests
+, setuptools
+, six
+, typing-extensions
+, watchdog
+, websocket-client
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "chalice";
+  version = "1.28.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aws";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-m3pSD4fahBW6Yt/w07Co4fTZD7k6as5cPwoK5QSry6M=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "inquirer>=2.7.0,<3.0.0" "inquirer" \
+      --replace "pip>=9,<23.1" "pip" \
+  '';
+
+  propagatedBuildInputs = [
+    attrs
+    botocore
+    click
+    inquirer
+    jmespath
+    mypy-extensions
+    pip
+    pyyaml
+    setuptools
+    six
+    typing-extensions
+    wheel
+    watchdog
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    mock
+    pytestCheckHook
+    requests
+    websocket-client
+  ];
+
+  disabledTestPaths = [
+    # Don't check the templates and the sample app
+    "chalice/templates"
+    "docs/source/samples/todo-app/code/tests/test_db.py"
+    # Requires credentials
+    "tests/aws/test_features.py"
+    # Requires network access
+    "tests/aws/test_websockets.py"
+    "tests/integration/test_package.py"
+  ];
+
+  disabledTests = [
+    # Requires network access
+    "test_update_domain_name_failed"
+    "test_can_reload_server"
+    # Content for the tests is missing
+    "test_can_import_env_vars"
+    "test_stack_trace_printed_on_error"
+    # Don't build
+    "test_can_generate_pipeline_for_all"
+    "test_build_wheel"
+    # https://github.com/aws/chalice/issues/1850
+    "test_resolve_endpoint"
+    "test_endpoint_from_arn"
+    # Tests require dist
+    "test_setup_tar_gz_hyphens_in_name"
+    "test_both_tar_gz"
+    "test_both_tar_bz2"
+  ];
+
+  pythonImportsCheck = [
+    "chalice"
+  ];
+
+  meta = with lib; {
+    description = "Python Serverless Microframework for AWS";
+    homepage = "https://github.com/aws/chalice";
+    changelog = "https://github.com/aws/chalice/blob/${version}/CHANGELOG.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/chameleon/default.nix b/nixpkgs/pkgs/development/python-modules/chameleon/default.nix
new file mode 100644
index 000000000000..fccfec53512e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chameleon/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "Chameleon";
+  version = "3.8.1";
+
+  # tests not included in pypi tarball
+  src = fetchFromGitHub {
+    owner = "malthe";
+    repo = "chameleon";
+    rev = version;
+    sha256 = "0nf8x4w2vh1a31wdb86nnvlic9xmr23j3in1f6fq4z6mv2jkwa87";
+  };
+
+  pythonImportsCheck = [ "chameleon" ];
+
+  meta = with lib; {
+    homepage = "https://chameleon.readthedocs.io/";
+    description = "Fast HTML/XML Template Compiler";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/channels-redis/default.nix b/nixpkgs/pkgs/development/python-modules/channels-redis/default.nix
new file mode 100644
index 000000000000..a495b389603d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/channels-redis/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, aioredis
+, asgiref
+, buildPythonPackage
+, channels
+, cryptography
+, fetchFromGitHub
+, hiredis
+, msgpack
+, pythonOlder
+, redis
+}:
+
+buildPythonPackage rec {
+  pname = "channels-redis";
+  version = "4.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "django";
+    repo = "channels_redis";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Eid9aWlLNnqr3WAnsLe+Pz9gsugCsdDKi0+nFNF02CI=";
+  };
+
+  buildInputs = [
+    hiredis
+    redis
+  ];
+
+  propagatedBuildInputs = [
+    aioredis
+    asgiref
+    channels
+    msgpack
+  ];
+
+  passthru.optional-dependencies = {
+    cryptography = [
+      cryptography
+    ];
+  };
+
+  # Fails with : ConnectionRefusedError: [Errno 111] Connect call failed ('127.0.0.1', 6379)
+  # (even with a local Redis instance running)
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "channels_redis"
+  ];
+
+  meta = with lib; {
+    description = "Redis-backed ASGI channel layer implementation";
+    homepage = "https://github.com/django/channels_redis/";
+    changelog = "https://github.com/django/channels_redis/blob/${version}/CHANGELOG.txt";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ mmai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/channels/default.nix b/nixpkgs/pkgs/development/python-modules/channels/default.nix
new file mode 100644
index 000000000000..083a79284f24
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/channels/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, asgiref
+, buildPythonPackage
+, daphne
+, django
+, fetchFromGitHub
+, async-timeout
+, pytest-asyncio
+, pytest-django
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "channels";
+  version = "4.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "django";
+    repo = pname;
+    rev = version;
+    hash = "sha256-n88MxwYQ4O2kBy/W0Zvi3FtIlhZQQRCssB/lYrFNvps=";
+  };
+
+  propagatedBuildInputs = [
+    asgiref
+    django
+  ];
+
+  passthru.optional-dependencies = {
+    daphne = [
+      daphne
+    ];
+  };
+
+  nativeCheckInputs = [
+    async-timeout
+    pytest-asyncio
+    pytest-django
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.daphne;
+
+  pythonImportsCheck = [
+    "channels"
+  ];
+
+  meta = with lib; {
+    description = "Brings event-driven capabilities to Django with a channel system";
+    homepage = "https://github.com/django/channels";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/characteristic/default.nix b/nixpkgs/pkgs/development/python-modules/characteristic/default.nix
new file mode 100644
index 000000000000..ae86e1886515
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/characteristic/default.nix
@@ -0,0 +1,24 @@
+{ buildPythonPackage
+, fetchPypi
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "characteristic";
+  version = "14.3.0";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ded68d4e424115ed44e5c83c2a901a0b6157a959079d7591d92106ffd3ada380";
+  };
+
+  nativeCheckInputs = [ pytest ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg --replace "[pytest]" "[tool:pytest]"
+  '';
+
+  meta = {
+    description = "Python attributes without boilerplate";
+    homepage = "https://characteristic.readthedocs.org";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/chardet/default.nix b/nixpkgs/pkgs/development/python-modules/chardet/default.nix
new file mode 100644
index 000000000000..7c78de37d36d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chardet/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hypothesis
+, pythonOlder
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "chardet";
+  version = "5.2.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Gztv9HmoxBS8P6LAhSmVaVxKAm3NbQYzst0JLKOcHPc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # flaky; https://github.com/chardet/chardet/issues/256
+    "test_detect_all_and_detect_one_should_agree"
+  ];
+
+  pythonImportsCheck = [ "chardet" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/chardet/chardet/releases/tag/${version}";
+    description = "Universal encoding detector";
+    homepage = "https://github.com/chardet/chardet";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/charset-normalizer/default.nix b/nixpkgs/pkgs/development/python-modules/charset-normalizer/default.nix
new file mode 100644
index 000000000000..c2856a49060f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/charset-normalizer/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "charset-normalizer";
+  version = "3.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "Ousret";
+    repo = "charset_normalizer";
+    rev = "refs/tags/${version}";
+    hash = "sha256-CfL5rlrwJs9453z+1xPUzs1B3OyjFBaU6klzY7gJCzA=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --cov=charset_normalizer --cov-report=term-missing" ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "charset_normalizer"
+  ];
+
+  passthru.tests = { inherit aiohttp requests; };
+
+  meta = with lib; {
+    description = "Python module for encoding and language detection";
+    homepage = "https://charset-normalizer.readthedocs.io/";
+    changelog = "https://github.com/Ousret/charset_normalizer/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/chart-studio/default.nix b/nixpkgs/pkgs/development/python-modules/chart-studio/default.nix
new file mode 100644
index 000000000000..5f8117c6e586
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chart-studio/default.nix
@@ -0,0 +1,44 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, mock
+, nose
+, plotly
+, pytest
+, requests
+, retrying
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "chart-studio";
+  version = "5.17.0";
+
+  # chart-studio was split from plotly
+  src = fetchFromGitHub {
+    owner = "plotly";
+    repo = "plotly.py";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Vaa/MgauSoSpzNtRVXq3fQSVqMYzLTqDtIbiHBgrXQY=";
+  };
+
+  sourceRoot = "${src.name}/packages/python/chart-studio";
+
+  propagatedBuildInputs = [
+    plotly
+    requests
+    retrying
+    six
+  ];
+
+  nativeCheckInputs = [ mock nose pytest ];
+  # most tests talk to a service
+  checkPhase = ''
+    HOME=$TMPDIR pytest chart_studio/tests/test_core chart_studio/tests/test_plot_ly/test_api
+  '';
+
+  meta = with lib; {
+    description = "Utilities for interfacing with Plotly's Chart Studio service";
+    homepage = "https://github.com/plotly/plotly.py/tree/master/packages/python/chart-studio";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/chat-downloader/default.nix b/nixpkgs/pkgs/development/python-modules/chat-downloader/default.nix
new file mode 100644
index 000000000000..13434cc86d05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chat-downloader/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, isodate
+, docstring-parser
+, colorlog
+, websocket-client
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "chat-downloader";
+  version = "0.2.8";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit version pname;
+    hash = "sha256-WBasBhefgRkOdMdz2K/agvS+cY6m3/33wiu+Jl4d1Cg=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    isodate
+    docstring-parser
+    colorlog
+    websocket-client
+  ];
+
+  # Tests try to access the network.
+  doCheck = false;
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "chat_downloader" ];
+
+  meta = with lib; {
+    description = "A simple tool used to retrieve chat messages from livestreams, videos, clips and past broadcasts";
+    homepage = "https://github.com/xenova/chat-downloader";
+    changelog = "https://github.com/xenova/chat-downloader/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/check-manifest/default.nix b/nixpkgs/pkgs/development/python-modules/check-manifest/default.nix
new file mode 100644
index 000000000000..832cac1f7872
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/check-manifest/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, breezy
+, build
+, buildPythonPackage
+, fetchPypi
+, git
+, pep517
+, pytestCheckHook
+, tomli
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "check-manifest";
+  version = "0.49";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ZKZARFVCzyJpGWV8e3jQLZwcpbHCXX5m4OH/MlBg9BY=";
+  };
+
+  propagatedBuildInputs = [
+    build
+    pep517
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  nativeCheckInputs = [
+    git
+    pytestCheckHook
+  ];
+
+  checkInputs = [
+    breezy
+  ];
+
+  disabledTests = [
+    # Test wants to setup a venv
+    "test_build_sdist_pep517_isolated"
+  ];
+
+  pythonImportsCheck = [
+    "check_manifest"
+  ];
+
+  meta = with lib; {
+    description = "Check MANIFEST.in in a Python source package for completeness";
+    homepage = "https://github.com/mgedmin/check-manifest";
+    changelog = "https://github.com/mgedmin/check-manifest/blob/${version}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lewo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/checkdmarc/default.nix b/nixpkgs/pkgs/development/python-modules/checkdmarc/default.nix
new file mode 100644
index 000000000000..6c261cff35fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/checkdmarc/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, dnspython
+, expiringdict
+, fetchFromGitHub
+, hatchling
+, publicsuffixlist
+, pyleri
+, iana-etc
+, pytestCheckHook
+, pythonOlder
+, requests
+, timeout-decorator
+}:
+
+buildPythonPackage rec {
+  pname = "checkdmarc";
+  version = "4.8.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "domainaware";
+    repo = "checkdmarc";
+    rev = "refs/tags/${version}";
+    hash = "sha256-NNB5dYQzzdNapjP4mtpCW08BzfZ+FFRESUtpxCOzrdk=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    dnspython
+    expiringdict
+    publicsuffixlist
+    pyleri
+    requests
+    timeout-decorator
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "checkdmarc"
+  ];
+
+  pytestFlagsArray = [
+    "tests.py"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "testDMARCPctLessThan100Warning"
+    "testSPFMissingARecord"
+    "testSPFMissingMXRecord"
+    "testSplitSPFRecord"
+    "testTooManySPFDNSLookups"
+    "testTooManySPFVoidDNSLookups"
+  ];
+
+  meta = with lib; {
+    description = "A parser for SPF and DMARC DNS records";
+    homepage = "https://github.com/domainaware/checkdmarc";
+    changelog = "https://github.com/domainaware/checkdmarc/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/checksumdir/default.nix b/nixpkgs/pkgs/development/python-modules/checksumdir/default.nix
new file mode 100644
index 000000000000..78a24bb2950a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/checksumdir/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "checksumdir";
+  version = "1.2.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "to-mc";
+    repo = "checksumdir";
+    rev = version;
+    hash = "sha256-PO8sRGFQ1Dt/UYJuFH6Y3EaQVaS+4DJlOQtvF8ZmBWQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  doCheck = false; # Package does not contain tests
+  pythonImportsCheck = [ "checksumdir" ];
+
+  meta = with lib; {
+    description = "Simple package to compute a single deterministic hash of the file contents of a directory";
+    homepage = "https://github.com/to-mc/checksumdir";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cheetah3/default.nix b/nixpkgs/pkgs/development/python-modules/cheetah3/default.nix
new file mode 100644
index 000000000000..24e3194d80c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cheetah3/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cheetah3";
+  version = "3.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CheetahTemplate3";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-okQz1wM3k43okKcZDRgHAnn5ScL0Pe1OtUvDBScEamY=";
+  };
+
+  doCheck = false; # Circular dependency
+
+  pythonImportsCheck = [
+    "Cheetah"
+  ];
+
+  meta = with lib; {
+    description = "A template engine and code generation tool";
+    homepage = "http://www.cheetahtemplate.org/";
+    changelog = "https://github.com/CheetahTemplate3/cheetah3/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ pjjw ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cheroot/default.nix b/nixpkgs/pkgs/development/python-modules/cheroot/default.nix
new file mode 100644
index 000000000000..679c5464b8f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cheroot/default.nix
@@ -0,0 +1,95 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, jaraco-functools
+, jaraco-text
+, more-itertools
+, portend
+, pypytools
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-toolbelt
+, requests-unixsocket
+, setuptools-scm
+, setuptools-scm-git-archive
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "cheroot";
+  version = "10.0.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WcShh3/vmWmzw8CAyqrzd+J4CRlDeFP8DTKp30CzEfA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+    setuptools-scm-git-archive
+  ];
+
+  propagatedBuildInputs = [
+    jaraco-functools
+    more-itertools
+    six
+  ];
+
+  nativeCheckInputs = [
+    jaraco-text
+    portend
+    pypytools
+    pytest-mock
+    pytestCheckHook
+    requests
+    requests-toolbelt
+    requests-unixsocket
+  ];
+
+  # Disable doctest plugin because times out
+  # Disable xdist (-n arg) because it's incompatible with testmon
+  # Deselect test_bind_addr_unix on darwin because times out
+  # Deselect test_http_over_https_error on darwin because builtin cert fails
+  # Disable warnings-as-errors because of deprecation warnings from socks on python 3.7
+  # Disable pytest-testmon because it doesn't work
+  # adds many other pytest utilities which aren't necessary like linting
+  preCheck = ''
+    rm pytest.ini
+  '';
+
+  disabledTests = [
+    "tls" # touches network
+    "peercreds_unix_sock" # test urls no longer allowed
+  ] ++ lib.optionals stdenv.isDarwin [
+    "http_over_https_error"
+    "bind_addr_unix"
+    "test_ssl_env"
+  ];
+
+  disabledTestPaths = [
+    # avoid attempting to use 3 packages not available on nixpkgs
+    # (jaraco.apt, jaraco.context, yg.lockfile)
+    "cheroot/test/test_wsgi.py"
+    # requires pyopenssl
+    "cheroot/test/test_ssl.py"
+  ];
+
+  pythonImportsCheck = [
+    "cheroot"
+  ];
+
+  # Some of the tests use localhost networking.
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "High-performance, pure-Python HTTP";
+    homepage = "https://github.com/cherrypy/cheroot";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cherrypy/default.nix b/nixpkgs/pkgs/development/python-modules/cherrypy/default.nix
new file mode 100644
index 000000000000..8a61e6606611
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cherrypy/default.nix
@@ -0,0 +1,132 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cheroot
+, fetchPypi
+, jaraco-collections
+, more-itertools
+, objgraph
+, path
+, portend
+, pyopenssl
+, pytest-forked
+, pytest-services
+, pytestCheckHook
+, python-memcached
+, pythonAtLeast
+, pythonOlder
+, requests-toolbelt
+, routes
+, setuptools-scm
+, simplejson
+, zc_lockfile
+}:
+
+buildPythonPackage rec {
+  pname = "cherrypy";
+  version = "18.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "CherryPy";
+    inherit version;
+    hash = "sha256-m0jPuoovFtW2QZzGV+bVHbAFujXF44JORyi7A7vH75s=";
+  };
+
+  postPatch = ''
+    # Disable doctest plugin because times out
+    substituteInPlace pytest.ini \
+      --replace "--doctest-modules" "-vvv" \
+      --replace "-p pytest_cov" "" \
+      --replace "--no-cov-on-fail" ""
+    sed -i "/--cov/d" pytest.ini
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    cheroot
+    portend
+    more-itertools
+    zc_lockfile
+    jaraco-collections
+  ];
+
+  nativeCheckInputs = [
+    objgraph
+    path
+    pytest-forked
+    pytest-services
+    pytestCheckHook
+    requests-toolbelt
+  ];
+
+  preCheck = ''
+    export CI=true
+  '';
+
+  pytestFlagsArray = [
+    "-W"
+    "ignore::DeprecationWarning"
+  ];
+
+  disabledTests = [
+    # Keyboard interrupt ends test suite run
+    "KeyboardInterrupt"
+    # daemonize and autoreload tests have issue with sockets within sandbox
+    "daemonize"
+    "Autoreload"
+
+    "test_antistampede"
+    "test_file_stream"
+    "test_basic_request"
+    "test_3_Redirect"
+    "test_4_File_deletion"
+  ] ++ lib.optionals (pythonAtLeast "3.11") [
+    "testErrorHandling"
+    "testHookErrors"
+    "test_HTTP10_KeepAlive"
+    "test_No_Message_Body"
+    "test_HTTP11_Timeout"
+    "testGzip"
+    "test_malformed_header"
+    "test_no_content_length"
+    "test_post_filename_with_special_characters"
+    "test_post_multipart"
+    "test_iterator"
+    "test_1_Ram_Concurrency"
+    "test_2_File_Concurrency"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_block"
+  ];
+
+  disabledTestPaths = lib.optionals stdenv.isDarwin [
+    "cherrypy/test/test_config_server.py"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [
+    "cherrypy"
+  ];
+
+  passthru.optional-dependencies = {
+    json = [ simplejson ];
+    memcached_session = [ python-memcached ];
+    routes_dispatcher = [ routes ];
+    ssl = [ pyopenssl ];
+    # not packaged yet
+    xcgi = [ /* flup */ ];
+  };
+
+  meta = with lib; {
+    description = "Object-oriented HTTP framework";
+    homepage = "https://cherrypy.dev/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/chess/default.nix b/nixpkgs/pkgs/development/python-modules/chess/default.nix
new file mode 100644
index 000000000000..5e32d74b4379
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chess/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "chess";
+  version = "1.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "niklasf";
+    repo = "python-${pname}";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-jfPg1W9Qp0DlAbMXaFqZ6Ri2zMOW6EKUHwi7Azn/yl0=";
+  };
+
+  pythonImportsCheck = [
+    "chess"
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} ./test.py -v
+  '';
+
+  meta = with lib; {
+    description = "A chess library with move generation, move validation, and support for common formats";
+    homepage = "https://github.com/niklasf/python-chess";
+    changelog = "https://github.com/niklasf/python-chess/blob/v${version}/CHANGELOG.rst";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ smancill ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/chevron/default.nix b/nixpkgs/pkgs/development/python-modules/chevron/default.nix
new file mode 100644
index 000000000000..5f8cc3217508
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chevron/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+}:
+
+buildPythonPackage {
+  pname = "chevron";
+  version = "0.13.1";
+
+  # No tests available in the PyPI tarball
+  src = fetchFromGitHub {
+    owner = "noahmorrison";
+    repo = "chevron";
+    rev = "0.13.1";
+    sha256 = "0l1ik8dvi6bgyb3ym0w4ii9dh25nzy0x4yawf4zbcyvvcb6af470";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} test_spec.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/noahmorrison/chevron";
+    description = "A python implementation of the mustache templating language";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dhkl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/chex/default.nix b/nixpkgs/pkgs/development/python-modules/chex/default.nix
new file mode 100644
index 000000000000..559d047032c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chex/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, absl-py
+, cloudpickle
+, dm-tree
+, jax
+, jaxlib
+, numpy
+, pytestCheckHook
+, toolz
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "chex";
+  version = "0.1.85";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "deepmind";
+    repo = "chex";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-7k/+2dNNbPBXtbabuOEVpAI7T1SuM4JDf074dmTg/vs=";
+  };
+
+  propagatedBuildInputs = [
+    absl-py
+    jaxlib
+    jax
+    numpy
+    toolz
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [
+    "chex"
+  ];
+
+  nativeCheckInputs = [
+    cloudpickle
+    dm-tree
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Chex is a library of utilities for helping to write reliable JAX code.";
+    homepage = "https://github.com/deepmind/chex";
+    changelog = "https://github.com/google-deepmind/chex/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ndl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/chirpstack-api/default.nix b/nixpkgs/pkgs/development/python-modules/chirpstack-api/default.nix
new file mode 100644
index 000000000000..141a5f349b70
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chirpstack-api/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, google-api-core
+, grpcio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "chirpstack-api";
+  version = "3.12.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "brocaar";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-69encHMk0eXE2Av87ysKvxoiXog5o68qCUlOx/lgHFU=";
+  };
+
+  sourceRoot = "${src.name}/python/src";
+
+  propagatedBuildInputs = [
+    google-api-core
+    grpcio
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "chirpstack_api"
+  ];
+
+  meta = with lib; {
+    description = "ChirpStack gRPC API message and service wrappers for Python";
+    homepage = "https://github.com/brocaar/chirpstack-api";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/chispa/default.nix b/nixpkgs/pkgs/development/python-modules/chispa/default.nix
new file mode 100644
index 000000000000..e72c3990e367
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chispa/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "chispa";
+  version = "0.9.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "MrPowers";
+    repo = "chispa";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-VF7k0u7QpoG3PXvU5M7jrM9pht6xeRUpYH9znMdLOxk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  # Tests require a spark installation
+  doCheck = false;
+
+  # pythonImportsCheck needs spark installation
+
+  meta = with lib; {
+    description = "PySpark test helper methods with beautiful error messages";
+    homepage = "https://github.com/MrPowers/chispa";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ratsclub ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/chromaprint/default.nix b/nixpkgs/pkgs/development/python-modules/chromaprint/default.nix
new file mode 100644
index 000000000000..e4161064acce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/chromaprint/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, m2r
+}:
+
+buildPythonPackage rec {
+  pname = "chromaprint";
+  version = "0.5";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-d4M+ieNQpIXcnEH1WyIWnTYZe3P+Y58W0uz1uYPwLQE=";
+  };
+
+  buildInputs = [ m2r ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "chromaprint" ];
+
+  meta = with lib; {
+    description = "Facilitate effortless color terminal output";
+    homepage = "https://pypi.org/project/${pname}/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dschrempf peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ci-info/default.nix b/nixpkgs/pkgs/development/python-modules/ci-info/default.nix
new file mode 100644
index 000000000000..5034347fa1fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ci-info/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, isPy27, fetchPypi, pytest, pytestCheckHook }:
+
+buildPythonPackage rec {
+  version = "0.3.0";
+  pname = "ci-info";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-H9UMvUAfKa3/7rGLBIniMtFqwadFisa8MW3qtq5TX7A=";
+  };
+
+  nativeCheckInputs = [ pytest pytestCheckHook ];
+
+  doCheck = false;  # both tests access network
+
+  pythonImportsCheck = [ "ci_info" ];
+
+  meta = with lib; {
+    description = "Gather continuous integration information on the fly";
+    homepage = "https://github.com/mgxd/ci-info";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ci-py/default.nix b/nixpkgs/pkgs/development/python-modules/ci-py/default.nix
new file mode 100644
index 000000000000..b7e6c5ff8060
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ci-py/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ci-py";
+  version = "1.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-R/6bLsXOKGxiJDZUvvOuvLp3usEhfg698qvvgOwBXYk=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner', " ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ci"
+  ];
+
+  meta = with lib; {
+    description = "Library for working with Continuous Integration services";
+    homepage = "https://github.com/grantmcconnaughey/ci.py";
+    changelog = "https://github.com/grantmcconnaughey/ci.py/blob/master/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cinemagoer/default.nix b/nixpkgs/pkgs/development/python-modules/cinemagoer/default.nix
new file mode 100644
index 000000000000..33cff05b3850
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cinemagoer/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, lxml
+, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "cinemagoer";
+  version = "2023.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XOHXeuZUZwFhjxHlsVVqGdGO3srRttfZaXPsNJQbGPI=";
+  };
+
+  propagatedBuildInputs = [
+    lxml
+    sqlalchemy
+  ];
+
+  # Tests require networking, and https://github.com/cinemagoer/cinemagoer/issues/240
+  doCheck = false;
+
+  pythonImportsCheck = [ "imdb" ]; # Former "imdbpy", upstream is yet to rename here
+
+  meta = with lib; {
+    description = "A Python package for retrieving and managing the data of the IMDb movie database about movies and people";
+    downloadPage = "https://github.com/cinemagoer/cinemagoer/";
+    homepage = "https://cinemagoer.github.io/";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/circuit-webhook/default.nix b/nixpkgs/pkgs/development/python-modules/circuit-webhook/default.nix
new file mode 100644
index 000000000000..895c6803142e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/circuit-webhook/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "circuit-webhook";
+  version = "1.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NhePKBfzdkw7iVHmVrOxf8ZcQrb1Sq2xMIfu4P9+Ppw=";
+  };
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "circuit_webhook"
+  ];
+
+  meta = with lib; {
+    description = "Module for Unify Circuit API webhooks";
+    homepage = "https://github.com/braam/unify/tree/master/circuit-webhook-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/circuitbreaker/default.nix b/nixpkgs/pkgs/development/python-modules/circuitbreaker/default.nix
new file mode 100644
index 000000000000..9218d82847cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/circuitbreaker/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pytest-asyncio
+, pytest-mock
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "circuitbreaker";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "fabfuel";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-jaDCMGCZZu3STluYeHDNgdEPf2DNq7bXJ0LPV3JZdk0=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+    pytest-mock
+  ];
+
+  pythonImportsCheck = [
+    "circuitbreaker"
+  ];
+
+  meta = with lib; {
+    description = "Python Circuit Breaker implementation";
+    homepage = "https://github.com/fabfuel/circuitbreaker";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/circus/default.nix b/nixpkgs/pkgs/development/python-modules/circus/default.nix
new file mode 100644
index 000000000000..95d29a4401bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/circus/default.nix
@@ -0,0 +1,88 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, psutil
+, pytestCheckHook
+, pyyaml
+, pyzmq
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "circus";
+  version = "0.18.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GTzoIk4GjO1mckz0gxBvtmdLUaV1g6waDn7Xp+6Mcas=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    psutil
+    pyzmq
+    tornado
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pyyaml
+  ];
+
+  # On darwin: Too many open files
+  preCheck = lib.optionalString stdenv.isDarwin ''
+    ulimit -n 1024
+  '';
+
+  disabledTests = [
+    # these tests raise circus.tests.support.TimeoutException
+    "test_reload1"
+    "test_reload2"
+    "test_reload_sequential"
+    "test_reload_uppercase"
+    "test_reload_wid_1_worker"
+    "test_reload_wid_4_workers"
+    "test_add"
+    "test_add_start"
+    "test_command_already_running"
+    "test_launch_cli"
+    "test_handler"
+    "test_resource_watcher_max_cpu"
+    "test_resource_watcher_max_mem"
+    "test_resource_watcher_max_mem_abs"
+    "test_resource_watcher_min_cpu"
+    "test_resource_watcher_min_mem"
+    "test_resource_watcher_min_mem_abs"
+    "test_full_stats"
+    "test_watchdog_discovery_found"
+    "test_watchdog_discovery_not_found"
+    "test_dummy"
+    "test_handler"
+    "test_stdin_socket"
+    "test_stop_and_restart"
+    "test_stream"
+    "test_inherited"
+    "test_set_before_launch"
+    "test_set_by_arbiter"
+    "test_max_age"
+    "test_signal"
+    "test_exits_within_graceful_timeout"
+    "test_kills_after_graceful_timeout"
+    # this test requires socket communication
+    "test_plugins"
+  ];
+
+  pythonImportsCheck = [ "circus" ];
+
+  meta = with lib; {
+    description = "A process and socket manager";
+    homepage = "https://github.com/circus-tent/circus";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cirq-aqt/default.nix b/nixpkgs/pkgs/development/python-modules/cirq-aqt/default.nix
new file mode 100644
index 000000000000..f8e6fb4a2bf2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cirq-aqt/default.nix
@@ -0,0 +1,34 @@
+{ buildPythonPackage
+, cirq-core
+, requests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cirq-aqt";
+  inherit (cirq-core) version src meta;
+
+  sourceRoot = "${src.name}/${pname}";
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "requests~=2.18" "requests"
+  '';
+
+  propagatedBuildInputs = [
+    cirq-core
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # cirq's importlib hook doesn't work here
+  #pythonImportsCheck = [ "cirq_aqt" ];
+
+  disabledTestPaths = [
+    # No need to test the version number
+    "cirq_aqt/_version_test.py"
+  ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cirq-core/default.nix b/nixpkgs/pkgs/development/python-modules/cirq-core/default.nix
new file mode 100644
index 000000000000..fe6a04480f66
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cirq-core/default.nix
@@ -0,0 +1,108 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonAtLeast
+, pythonOlder
+, fetchFromGitHub
+, duet
+, matplotlib
+, networkx
+, numpy
+, pandas
+, requests
+, scipy
+, sortedcontainers
+, sympy
+, tqdm
+, typing-extensions
+  # Contrib requirements
+, withContribRequires ? false
+, autoray ? null
+, opt-einsum
+, ply
+, pylatex ? null
+, pyquil ? null
+, quimb ? null
+  # test inputs
+, pytestCheckHook
+, freezegun
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "cirq-core";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "quantumlib";
+    repo = "cirq";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-KEei5PJ0ammsduZVmMh2vaW3f58DYI4BCrFCl/SjUoo=";
+  };
+
+  sourceRoot = "${src.name}/${pname}";
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "matplotlib~=3.0" "matplotlib"
+   '';
+
+  propagatedBuildInputs = [
+    duet
+    matplotlib
+    networkx
+    numpy
+    pandas
+    requests
+    scipy
+    sortedcontainers
+    sympy
+    tqdm
+    typing-extensions
+  ] ++ lib.optionals withContribRequires [
+    autoray
+    opt-einsum
+    ply
+    pylatex
+    pyquil
+    quimb
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+    freezegun
+  ];
+
+  disabledTestPaths = lib.optionals (!withContribRequires) [
+    # Requires external (unpackaged) libraries, so untested
+    "cirq/contrib/"
+    # No need to test the version number
+    "cirq/_version_test.py"
+  ];
+
+  disabledTests = [
+    # Tries to import flynt, which isn't in Nixpkgs
+    "test_metadata_search_path"
+    # Fails due pandas MultiIndex. Maybe issue with pandas version in nix?
+    "test_benchmark_2q_xeb_fidelities"
+    # https://github.com/quantumlib/Cirq/pull/5991
+    "test_json_and_repr_data"
+    # Tests for some changed error handling behavior in SymPy 1.12
+    "test_custom_value_not_implemented"
+    # Calibration issue
+    "test_xeb_to_calibration_layer"
+  ];
+
+  meta = with lib; {
+    description = "Framework for creating, editing, and invoking Noisy Intermediate Scale Quantum (NISQ) circuits";
+    homepage = "https://github.com/quantumlib/cirq";
+    changelog = "https://github.com/quantumlib/Cirq/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ drewrisinger fab ];
+    broken = (stdenv.isLinux && stdenv.isAarch64);
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cirq-ft/default.nix b/nixpkgs/pkgs/development/python-modules/cirq-ft/default.nix
new file mode 100644
index 000000000000..83a8392b9520
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cirq-ft/default.nix
@@ -0,0 +1,36 @@
+{ attrs
+, buildPythonPackage
+, cachetools
+, cirq-core
+, ipython
+, ipywidgets
+, nbconvert
+, nbformat
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cirq-ft";
+  inherit (cirq-core) version src meta;
+
+  sourceRoot = "${src.name}/${pname}";
+
+  propagatedBuildInputs = [
+    attrs
+    cachetools
+    cirq-core
+    ipython
+    ipywidgets
+    nbconvert
+    nbformat
+  ];
+
+  nativeCheckInputs = [
+    ipython
+    pytestCheckHook
+  ];
+
+  # cirq's importlib hook doesn't work here
+  #pythonImportsCheck = [ "cirq_ft" ];
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cirq-google/default.nix b/nixpkgs/pkgs/development/python-modules/cirq-google/default.nix
new file mode 100644
index 000000000000..a49eebfce90d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cirq-google/default.nix
@@ -0,0 +1,52 @@
+{ buildPythonPackage
+, cirq-core
+, google-api-core
+, protobuf
+, pytestCheckHook
+, freezegun
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "cirq-google";
+  inherit (cirq-core) version src meta;
+
+  sourceRoot = "${src.name}/${pname}";
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "google-api-core[grpc] >= 1.14.0, < 2.0.0dev" "google-api-core[grpc] >= 1.14.0, < 3.0.0dev" \
+      --replace "protobuf >= 3.15.0, < 4" "protobuf >= 3.15.0"
+  '';
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    cirq-core
+    google-api-core
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    freezegun
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # No need to test the version number
+    "cirq_google/_version_test.py"
+    # Trace/BPT trap: 5
+    "cirq_google/engine/calibration_test.py"
+  ];
+
+  disabledTests = [
+    # unittest.mock.InvalidSpecError: Cannot autospec attr 'QuantumEngineServiceClient'
+    "test_get_engine_sampler_explicit_project_id"
+    "test_get_engine_sampler"
+    # Calibration issue
+    "test_xeb_to_calibration_layer"
+  ];
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cirq-ionq/default.nix b/nixpkgs/pkgs/development/python-modules/cirq-ionq/default.nix
new file mode 100644
index 000000000000..b1f66e25ced2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cirq-ionq/default.nix
@@ -0,0 +1,39 @@
+{ buildPythonPackage
+, cirq-core
+, requests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cirq-ionq";
+  inherit (cirq-core) version src meta;
+
+  sourceRoot = "${src.name}/${pname}";
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "requests~=2.18" "requests"
+  '';
+
+  propagatedBuildInputs = [
+    cirq-core
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # cirq's importlib hook doesn't work here
+  #pythonImportsCheck = [ "cirq_ionq" ];
+
+  disabledTestPaths = [
+    # No need to test the version number
+    "cirq_ionq/_version_test.py"
+  ];
+
+  disabledTests = [
+    # DeprecationWarning: decompose_to_device was used but is deprecated.
+    "test_decompose_operation_deprecated"
+  ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cirq-pasqal/default.nix b/nixpkgs/pkgs/development/python-modules/cirq-pasqal/default.nix
new file mode 100644
index 000000000000..4d755266180b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cirq-pasqal/default.nix
@@ -0,0 +1,34 @@
+{ buildPythonPackage
+, cirq-core
+, requests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cirq-pasqal";
+  inherit (cirq-core) version src meta;
+
+  sourceRoot = "${src.name}/${pname}";
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "requests~=2.18" "requests"
+  '';
+
+  propagatedBuildInputs = [
+    cirq-core
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # cirq's importlib hook doesn't work here
+  #pythonImportsCheck = [ "cirq_pasqal" ];
+
+  disabledTestPaths = [
+    # No need to test the version number
+    "cirq_pasqal/_version_test.py"
+  ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cirq-rigetti/default.nix b/nixpkgs/pkgs/development/python-modules/cirq-rigetti/default.nix
new file mode 100644
index 000000000000..be0ec040995b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cirq-rigetti/default.nix
@@ -0,0 +1,87 @@
+{ buildPythonPackage
+, cirq-core
+, requests
+, pytestCheckHook
+, attrs
+, certifi
+, h11
+, httpcore
+, idna
+, httpx
+, iso8601
+, pydantic
+, pyjwt
+, pyquil
+, python-dateutil
+, pythonOlder
+, qcs-api-client
+, retrying
+, rfc3339
+, rfc3986
+, six
+, sniffio
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "cirq-rigetti";
+  inherit (cirq-core) version src meta;
+
+  disabled = pythonOlder "3.7";
+
+  sourceRoot = "${src.name}/${pname}";
+
+  pythonRelaxDeps = [
+    "attrs"
+    "certifi"
+    "h11"
+    "httpcore"
+    "httpx"
+    "idna"
+    "iso8601"
+    "pydantic"
+    "pyjwt"
+    "pyquil"
+    "qcs-api-client"
+    "rfc3986"
+  ];
+
+  postPatch = ''
+    # Remove outdated test
+    rm cirq_rigetti/service_test.py
+  '';
+
+  propagatedBuildInputs = [
+    cirq-core
+    attrs
+    certifi
+    h11
+    httpcore
+    httpx
+    idna
+    iso8601
+    pydantic
+    pyjwt
+    pyquil
+    python-dateutil
+    qcs-api-client
+    retrying
+    rfc3339
+    rfc3986
+    six
+    sniffio
+    toml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # No need to test the version number
+    "cirq_rigetti/_version_test.py"
+  ];
+
+  # cirq's importlib hook doesn't work here
+  #pythonImportsCheck = [ "cirq_rigetti" ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cirq-web/default.nix b/nixpkgs/pkgs/development/python-modules/cirq-web/default.nix
new file mode 100644
index 000000000000..ca1c67ad1218
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cirq-web/default.nix
@@ -0,0 +1,27 @@
+{ buildPythonPackage
+, cirq-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cirq-web";
+  inherit (cirq-core) version src meta;
+
+  sourceRoot = "${src.name}/${pname}";
+
+  propagatedBuildInputs = [
+    cirq-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # cirq's importlib hook doesn't work here
+  #pythonImportsCheck = [ "cirq_web" ];
+
+  disabledTestPaths = [
+    # No need to test the version number
+    "cirq_web/_version_test.py"
+  ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cirq/default.nix b/nixpkgs/pkgs/development/python-modules/cirq/default.nix
new file mode 100644
index 000000000000..f53613065fb3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cirq/default.nix
@@ -0,0 +1,46 @@
+{ buildPythonPackage
+, cirq-aqt
+, cirq-core
+, cirq-ft
+, cirq-google
+, cirq-ionq
+, cirq-pasqal
+, cirq-rigetti
+, cirq-web
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cirq";
+  inherit (cirq-core) version src meta;
+
+  propagatedBuildInputs = [
+    cirq-aqt
+    cirq-core
+    cirq-ft
+    cirq-ionq
+    cirq-google
+    cirq-rigetti
+    cirq-pasqal
+    cirq-web
+  ];
+
+  # pythonImportsCheck = [ "cirq" "cirq.Circuit" ];  # cirq's importlib hook doesn't work here
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Don't run submodule or development tool tests
+  disabledTestPaths = [
+    "cirq-aqt"
+    "cirq-core"
+    "cirq-ft"
+    "cirq-google"
+    "cirq-ionq"
+    "cirq-pasqal"
+    "cirq-rigetti"
+    "cirq-web"
+    "dev_tools"
+  ];
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ciscoconfparse/default.nix b/nixpkgs/pkgs/development/python-modules/ciscoconfparse/default.nix
new file mode 100644
index 000000000000..33bd43c7043b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ciscoconfparse/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, buildPythonPackage
+, deprecat
+, dnspython
+, fetchFromGitHub
+, loguru
+, passlib
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "ciscoconfparse";
+  version = "1.7.24";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mpenning";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-vL/CQdYcOP356EyRToviWylP1EBtxmeov6qkhfQNZ2Y=";
+  };
+
+  pythonRelaxDeps = [
+    "loguru"
+  ];
+
+  postPatch = ''
+    # The line below is in the [build-system] section, which is invalid and
+    # rejected by PyPA's build tool. It belongs in [project] but upstream has
+    # had problems with putting that there (see comment in pyproject.toml).
+    sed -i '/requires-python/d' pyproject.toml
+
+    substituteInPlace pyproject.toml \
+      --replace '"poetry>=1.3.2",' ""
+
+    patchShebangs tests
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    passlib
+    deprecat
+    dnspython
+    loguru
+    toml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    "tests/parse_test.py"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_dns_lookup"
+    "test_reverse_dns_lookup"
+    # Path issues with configuration files
+    "testParse_valid_filepath"
+  ];
+
+  pythonImportsCheck = [
+    "ciscoconfparse"
+  ];
+
+  meta = with lib; {
+    description = "Module to parse, audit, query, build, and modify Cisco IOS-style configurations";
+    homepage = "https://github.com/mpenning/ciscoconfparse";
+    changelog = "https://github.com/mpenning/ciscoconfparse/blob/${version}/CHANGES.md";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ astro ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ciscomobilityexpress/default.nix b/nixpkgs/pkgs/development/python-modules/ciscomobilityexpress/default.nix
new file mode 100644
index 000000000000..d48ba03ad537
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ciscomobilityexpress/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "ciscomobilityexpress";
+  version = "1.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d8787245598e8371a83baa4db1df949d8a942c43f13454fa26ee3b09c3ccafc0";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # tests directory is set up, but has no tests
+  checkPhase = ''
+    ${python.interpreter} -m unittest
+  '';
+
+  pythonImportsCheck = [
+    "ciscomobilityexpress"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with Cisco Mobility Express APIs to fetch connected devices";
+    homepage = "https://github.com/fbradyirl/ciscomobilityexpress";
+    license = licenses.mit;
+    maintainers = with maintainers; [ uvnikita ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ciso8601/default.nix b/nixpkgs/pkgs/development/python-modules/ciso8601/default.nix
new file mode 100644
index 000000000000..e245e736ce28
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ciso8601/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pytestCheckHook
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "ciso8601";
+  version = "2.3.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "closeio";
+    repo = "ciso8601";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-KkMa1Rr3Z+5VnZfj25LDYpTfRyKqWA9u0vq6dZpwEy0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytz
+  ];
+
+  pytestFlagsArray = [
+    "tests/tests.py"
+  ];
+
+  pythonImportsCheck = [ "ciso8601" ];
+
+  meta = with lib; {
+    description = "Fast ISO8601 date time parser for Python written in C";
+    homepage = "https://github.com/closeio/ciso8601";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/citeproc-py/default.nix b/nixpkgs/pkgs/development/python-modules/citeproc-py/default.nix
new file mode 100644
index 000000000000..d0294a28ae12
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/citeproc-py/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, git
+, lxml
+, rnc2rng
+}:
+
+buildPythonPackage rec {
+  pname = "citeproc-py";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d9e3a224f936fe2e5033b5d9ffdacab769cedb61d96c4e0cf2f0b488f1d24b4e";
+  };
+
+  buildInputs = [ rnc2rng ];
+
+  propagatedBuildInputs = [ lxml ];
+
+  nativeCheckInputs = [ nose git ];
+  checkPhase = "nosetests tests";
+  doCheck = false;  # seems to want a Git repository, but fetchgit with leaveDotGit also fails
+  pythonImportsCheck = [ "citeproc" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/brechtm/citeproc-py";
+    description = "Citation Style Language (CSL) parser for Python";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cjkwrap/default.nix b/nixpkgs/pkgs/development/python-modules/cjkwrap/default.nix
new file mode 100644
index 000000000000..43e5909ec47b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cjkwrap/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "CJKwrap";
+  version = "2.2";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1b603sg6c2gv9vmlxwr6r1qvhadqk3qp6vifmijris504zjx5ix2";
+  };
+
+  pythonImportsCheck = [ "cjkwrap" ];
+
+  meta = with lib; {
+    description = "A library for wrapping and filling CJK text";
+    homepage = "https://f.gallai.re/cjkwrap";
+    license = licenses.lgpl3Plus;
+    maintainers = [ maintainers.kaction ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ckcc-protocol/default.nix b/nixpkgs/pkgs/development/python-modules/ckcc-protocol/default.nix
new file mode 100644
index 000000000000..e9654b0e67d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ckcc-protocol/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, click
+, ecdsa
+, hidapi
+, fetchPypi
+, pyaes
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ckcc-protocol";
+  version = "1.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zZPU0+MwjqRYCqa+W0YTqCZv2WsMwa9R5xaN7ye77OU=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    ecdsa
+    hidapi
+    pyaes
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ckcc"
+  ];
+
+  meta = with lib; {
+    description = "Communicate with your Coldcard using Python";
+    homepage = "https://github.com/Coldcard/ckcc-protocol";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hkjn ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clarifai-grpc/default.nix b/nixpkgs/pkgs/development/python-modules/clarifai-grpc/default.nix
new file mode 100644
index 000000000000..eb6e68f1359f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clarifai-grpc/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, googleapis-common-protos
+, grpcio
+, protobuf
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "clarifai-grpc";
+  version = "9.10.6";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Clarifai";
+    repo = "clarifai-python-grpc";
+    rev = "refs/tags/${version}";
+    hash = "sha256-OlSbeMBINN4gyFUklLh9zrQNv0VkRZxRwml4jbMjumE=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    googleapis-common-protos
+    grpcio
+    protobuf
+    requests
+  ];
+
+  # almost all tests require network access
+  doCheck = false;
+
+  pythonImportsCheck = [ "clarifai_grpc" ];
+
+  meta = with lib; {
+    description = "Clarifai gRPC API Client";
+    homepage = "https://github.com/Clarifai/clarifai-python-grpc";
+    changelog = "https://github.com/Clarifai/clarifai-python-grpc/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clarifai/default.nix b/nixpkgs/pkgs/development/python-modules/clarifai/default.nix
new file mode 100644
index 000000000000..1d541e3dab72
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clarifai/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, clarifai-grpc
+, numpy
+, opencv4
+, pillow
+, pyyaml
+, rich
+, schema
+, tqdm
+, tritonclient
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "clarifai";
+  version = "9.10.4";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Clarifai";
+    repo = "clarifai-python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-i/B4wtSqG/ZysAcidsXnqYPdcmu93Ufd6N9fxUmDJ2E=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    clarifai-grpc
+    numpy
+    tqdm
+    opencv4
+    tritonclient
+    rich
+    schema
+    pillow
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # require network access and API key
+    "test_export_workflow_general"
+  ];
+
+  disabledTestPaths = [
+    # require network access and API key
+    "tests/test_app.py"
+    "tests/test_data_upload.py"
+    "tests/test_model_predict.py"
+    "tests/test_model_train.py"
+    "tests/test_search.py"
+    "tests/workflow/test_create_delete.py"
+    "tests/workflow/test_predict.py"
+  ];
+
+  pythonImportsCheck = [ "clarifai" ];
+
+  meta = with lib; {
+    description = "Clarifai Python Utilities";
+    homepage = "https://github.com/Clarifai/clarifai-python";
+    changelog = "https://github.com/Clarifai/clarifai-python/releases/tag/${src.rev}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/claripy/default.nix b/nixpkgs/pkgs/development/python-modules/claripy/default.nix
new file mode 100644
index 000000000000..c343f7f3e872
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/claripy/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, setuptools
+, cachetools
+, decorator
+, fetchFromGitHub
+, future
+, pysmt
+, pythonOlder
+, pytestCheckHook
+, z3
+}:
+
+buildPythonPackage rec {
+  pname = "claripy";
+  version = "9.2.79";
+  pyproject = true;
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "angr";
+    repo = "claripy";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-N2w4djqJ9r2inLHwhyqNVUqjrlKVo75BblN5xURkMIc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    cachetools
+    decorator
+    future
+    pysmt
+    z3
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # Use upstream z3 implementation
+    substituteInPlace setup.cfg \
+      --replace "z3-solver==4.10.2.0" ""
+  '';
+
+  pythonImportsCheck = [
+    "claripy"
+  ];
+
+  meta = with lib; {
+    description = "Python abstraction layer for constraint solvers";
+    homepage = "https://github.com/angr/claripy";
+    license = with licenses; [ bsd2 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/class-doc/default.nix b/nixpkgs/pkgs/development/python-modules/class-doc/default.nix
new file mode 100644
index 000000000000..432df1f674ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/class-doc/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, more-itertools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "class-doc";
+  version = "0.2.6";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "danields761";
+    repo = pname;
+    rev = "9b122d85ce667d096ebee75a49350bbdbd48686d"; # no 0.2.6 version tag
+    hash = "sha256-4Sn/TuBvBpl1nvJBg327+sVrjGavkYKEYP32DwLWako=";
+  };
+
+  patches = [
+    # https://github.com/danields761/class-doc/pull/2
+    (fetchpatch {
+      name = "poetry-to-poetry-core.patch";
+      url = "https://github.com/danields761/class-doc/commit/03b224ad0a6190c30e4932fa2ccd4a7f0c5c4b5d.patch";
+      hash = "sha256-shWPRaZkvtJ1Ae17aCOm6eLs905jxwq84SWOrChEs7M=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    more-itertools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "class_doc"
+  ];
+
+  meta = with lib; {
+    description = "Extract attributes docstrings defined in various ways";
+    homepage = "https://github.com/danields761/class-doc";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/classify-imports/default.nix b/nixpkgs/pkgs/development/python-modules/classify-imports/default.nix
new file mode 100644
index 000000000000..694d4da42111
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/classify-imports/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "classify-imports";
+  version = "4.2.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "asottile";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-f5wZfisKz9WGdq6u0rd/zg2CfMwWvQeR8xZQNbD7KfU=";
+  };
+
+  pythonImportsCheck = [
+    "classify_imports"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Utilities for refactoring imports in python-like syntax";
+    homepage = "https://github.com/asottile/classify-imports";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cld2-cffi/default.nix b/nixpkgs/pkgs/development/python-modules/cld2-cffi/default.nix
new file mode 100644
index 000000000000..8ae90785669e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cld2-cffi/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, six, cffi, nose }:
+
+buildPythonPackage rec {
+  pname = "cld2-cffi";
+  version = "0.1.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0rvcdx4fdh5yk4d2nlddq1q1r2r0xqp86hpmbdn447pdcj1r8a9s";
+  };
+
+  propagatedBuildInputs = [ six cffi ];
+  nativeCheckInputs = [ nose ];
+
+  # gcc doesn't approve of this code, so disable -Werror
+  env.NIX_CFLAGS_COMPILE = "-w" + lib.optionalString stdenv.cc.isClang " -Wno-error=c++11-narrowing";
+
+  checkPhase = "nosetests -v";
+
+  meta = with lib; {
+    description = "CFFI bindings around Google Chromium's embedded compact language detection library (CLD2)";
+    homepage = "https://github.com/GregBowyer/cld2-cffi";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ rvl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cle/default.nix b/nixpkgs/pkgs/development/python-modules/cle/default.nix
new file mode 100644
index 000000000000..ffe235dc0b37
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cle/default.nix
@@ -0,0 +1,93 @@
+{ lib
+, buildPythonPackage
+, cffi
+, fetchFromGitHub
+, minidump
+, nose
+, pefile
+, pyelftools
+, pytestCheckHook
+, pythonOlder
+, pyvex
+, pyxbe
+, setuptools
+, sortedcontainers
+}:
+
+let
+  # The binaries are following the argr projects release cycle
+  version = "9.2.79";
+
+  # Binary files from https://github.com/angr/binaries (only used for testing and only here)
+  binaries = fetchFromGitHub {
+    owner = "angr";
+    repo = "binaries";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-HVCKw7L5Y/4TR26mWOZ8lKhWOcq0yQqo2LWKQjVSPX4=";
+  };
+
+in
+buildPythonPackage rec {
+  pname = "cle";
+  inherit version;
+  pyproject = true;
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "angr";
+    repo = "cle";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Zy62O3Mf9V7aGvQejsv4b6JVrHuDIrrqvTSs7/mVdtY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+    minidump
+    pefile
+    pyelftools
+    pyvex
+    pyxbe
+    sortedcontainers
+  ];
+
+  nativeCheckInputs = [
+    nose
+    pytestCheckHook
+  ];
+
+  # Place test binaries in the right location (location is hard-coded in the tests)
+  preCheck = ''
+    export HOME=$TMPDIR
+    cp -r ${binaries} $HOME/binaries
+  '';
+
+  disabledTests = [
+    # PPC tests seems to fails
+    "test_ppc_rel24_relocation"
+    "test_ppc_addr16_ha_relocation"
+    "test_ppc_addr16_lo_relocation"
+    "test_plt_full_relro"
+    # Test fails
+    "test_tls_pe_incorrect_tls_data_start"
+    "test_x86"
+    "test_x86_64"
+    # The required parts is not present on Nix
+    "test_remote_file_map"
+  ];
+
+  pythonImportsCheck = [
+    "cle"
+  ];
+
+  meta = with lib; {
+    description = "Python loader for many binary formats";
+    homepage = "https://github.com/angr/cle";
+    license = with licenses; [ bsd2 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clean-fid/default.nix b/nixpkgs/pkgs/development/python-modules/clean-fid/default.nix
new file mode 100644
index 000000000000..7a2f328185e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clean-fid/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# dependencies
+, numpy
+, pillow
+, requests
+, scipy
+, torch
+, torchvision
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "clean-fid";
+  version = "0.1.35";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "GaParmar";
+    repo = "clean-fid";
+    rev = "c8ffa420a3923e8fd87c1e75170de2cf59d2644b";
+    hash = "sha256-fqBU/TmCXDTPU3KTP0+VYQoP+HsT2UMcZeLzQHKD9hw=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    pillow
+    requests
+    scipy
+    torch
+    torchvision
+    tqdm
+  ];
+
+  pythonImportsCheck = [
+    "cleanfid"
+  ];
+
+  # no tests1
+  doCheck = false;
+
+  meta = with lib; {
+    description = "PyTorch - FID calculation with proper image resizing and quantization steps [CVPR 2022]";
+    homepage = "https://github.com/GaParmar/clean-fid";
+    license = licenses.mit;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cleanlab/default.nix b/nixpkgs/pkgs/development/python-modules/cleanlab/default.nix
new file mode 100644
index 000000000000..fdaf384262b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cleanlab/default.nix
@@ -0,0 +1,88 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, scikit-learn
+, termcolor
+, tqdm
+, pandas
+, setuptools
+# test dependencies
+, pytestCheckHook
+, pytest-lazy-fixture
+, tensorflow
+, torch
+, datasets
+, torchvision
+, keras
+, fasttext
+, hypothesis
+, wget
+, matplotlib
+, skorch
+}:
+
+buildPythonPackage rec {
+  pname = "cleanlab";
+  version = "2.5.0";
+  pyproject = true;
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "cleanlab";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-5XQQVrhjpvjwtFM79DqttObmw/GQLkMQVXb5jhiC8e0=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  propagatedBuildInputs = [
+    scikit-learn
+    termcolor
+    tqdm
+    pandas
+  ];
+
+  # This is ONLY turned off when we have testing enabled.
+  # The reason we do this is because of duplicate packages in the enclosure
+  # when using the packages in nativeCheckInputs.
+  # Affected packages: grpcio protobuf tensorboard tensorboard-plugin-profile
+  catchConflicts = (!doCheck);
+  doCheck = true;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-lazy-fixture
+    tensorflow
+    torch
+    datasets
+    torchvision
+    keras
+    fasttext
+    hypothesis
+    wget
+    matplotlib
+    skorch
+  ];
+
+  disabledTests = [
+    # Requires the datasets we prevent from downloading
+    "test_create_imagelab"
+  ];
+
+  disabledTestPaths = [
+    # Requires internet
+    "tests/test_dataset.py"
+    # Requires the datasets we just prevented from downloading
+    "tests/datalab/test_cleanvision_integration.py"
+  ];
+
+  meta = with lib; {
+    description = "The standard data-centric AI package for data quality and machine learning with messy, real-world data and labels.";
+    homepage = "https://github.com/cleanlab/cleanlab";
+    changelog = "https://github.com/cleanlab/cleanlab/releases/tag/v${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cleo/default.nix b/nixpkgs/pkgs/development/python-modules/cleo/default.nix
new file mode 100644
index 000000000000..caa812c63a84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cleo/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, crashtest
+, poetry-core
+, pytest-mock
+, pytestCheckHook
+, pythonRelaxDepsHook
+, rapidfuzz
+}:
+
+buildPythonPackage rec {
+  pname = "cleo";
+  version = "2.1.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "python-poetry";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-reo/7aPFU5uvZ1YPRTJDRmcMSMFru8e5ss5YmjSe3QU=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    "rapidfuzz"
+  ];
+
+  propagatedBuildInputs = [
+    crashtest
+    rapidfuzz
+  ];
+
+  pythonImportsCheck = [
+    "cleo"
+    "cleo.application"
+    "cleo.commands.command"
+    "cleo.helpers"
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/python-poetry/cleo";
+    changelog = "https://github.com/python-poetry/cleo/blob/${src.rev}/CHANGELOG.md";
+    description = "Allows you to create beautiful and testable command-line interfaces";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jakewaksbaum ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clevercsv/default.nix b/nixpkgs/pkgs/development/python-modules/clevercsv/default.nix
new file mode 100644
index 000000000000..6ad07d8ec62e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clevercsv/default.nix
@@ -0,0 +1,86 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# propagates
+, chardet
+, regex
+, packaging
+
+# optionals
+, faust-cchardet
+, pandas
+, tabview
+# TODO: , wilderness
+
+# tests
+, python
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "clevercsv";
+  version = "0.8.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "alan-turing-institute";
+    repo = "CleverCSV";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-yyPUNFDq9W5OW1muHtQ10QgAHhXI8w7CY77fsWhIy0k=";
+  };
+
+  propagatedBuildInputs = [
+    chardet
+    regex
+    packaging
+  ];
+
+  passthru.optional-dependencies = {
+    full = [
+      faust-cchardet
+      pandas
+      tabview
+      # TODO: wilderness
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.full;
+
+  pythonImportsCheck = [
+    "clevercsv"
+    "clevercsv.cparser"
+  ];
+
+  preCheck = ''
+    # by linking the installed version the tests also have access to compiled native libraries
+    rm -r clevercsv
+    ln -s $out/${python.sitePackages}/clevercsv/ clevercsv
+  '';
+
+  # their ci only runs unit tests, there are also integration and fuzzing tests
+  pytestFlagsArray = [
+    "./tests/test_unit"
+  ];
+
+  disabledTestPaths = [
+    # ModuleNotFoundError: No module named 'wilderness'
+    "tests/test_unit/test_console.py"
+  ];
+
+  meta = with lib; {
+    description = "CleverCSV is a Python package for handling messy CSV files";
+    longDescription = ''
+      CleverCSV is a Python package for handling messy CSV files. It provides
+      a drop-in replacement for the builtin CSV module with improved dialect
+      detection, and comes with a handy command line application for working
+      with CSV files.
+    '';
+    homepage = "https://github.com/alan-turing-institute/CleverCSV";
+    changelog = "https://github.com/alan-turing-institute/CleverCSV/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clf/default.nix b/nixpkgs/pkgs/development/python-modules/clf/default.nix
new file mode 100644
index 000000000000..978d08051f7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clf/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi
+, docopt, requests, pygments }:
+
+buildPythonPackage rec {
+  pname = "clf";
+  version = "0.5.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "abc919a1e99667f32fdde15dfb4bc527dbe22cf86a17acb78a449d7f2dfe937e";
+  };
+
+  patchPhase = ''
+    sed -i 's/==/>=/' requirements.txt
+  '';
+
+  propagatedBuildInputs = [ docopt requests pygments ];
+
+  # Error when running tests:
+  # No local packages or download links found for requests
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/ncrocfer/clf";
+    description = "Command line tool to search snippets on Commandlinefu.com";
+    license = licenses.mit;
+    maintainers = with maintainers; [ koral ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cli-helpers/default.nix b/nixpkgs/pkgs/development/python-modules/cli-helpers/default.nix
new file mode 100644
index 000000000000..faf20403e62b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cli-helpers/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, configobj
+, mock
+, pytestCheckHook
+, pygments
+, tabulate
+, terminaltables
+, wcwidth
+}:
+
+buildPythonPackage rec {
+  pname = "cli-helpers";
+  version = "2.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "cli_helpers";
+    inherit version;
+    hash = "sha256-5xdNADorWP0+Mac/u8RdWqUT3mLL1C1Df3i5ZYvV+Wc=";
+  };
+
+  propagatedBuildInputs = [
+    configobj
+    tabulate
+  ] ++ tabulate.optional-dependencies.widechars;
+
+  passthru.optional-dependencies = {
+    styles = [ pygments ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  meta = with lib; {
+    description = "Python helpers for common CLI tasks";
+    longDescription = ''
+      CLI Helpers is a Python package that makes it easy to perform common
+      tasks when building command-line apps. It's a helper library for
+      command-line interfaces.
+
+      Libraries like Click and Python Prompt Toolkit are amazing tools that
+      help you create quality apps. CLI Helpers complements these libraries by
+      wrapping up common tasks in simple interfaces.
+
+      CLI Helpers is not focused on your app's design pattern or framework --
+      you can use it on its own or in combination with other libraries. It's
+      lightweight and easy to extend.
+
+      What's included in CLI Helpers?
+
+      - Prettyprinting of tabular data with custom pre-processing
+      - [in progress] config file reading/writing
+
+      Read the documentation at http://cli-helpers.rtfd.io
+    '';
+    homepage = "https://cli-helpers.readthedocs.io/en/stable/";
+    license = licenses.bsd3 ;
+    maintainers = [ maintainers.kalbasit ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cliche/default.nix b/nixpkgs/pkgs/development/python-modules/cliche/default.nix
new file mode 100644
index 000000000000..e0657336a093
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cliche/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ipdb
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  pname = "cliche";
+  version = "0.10.108";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "kootenpv";
+    repo = "cliche";
+    rev = "80a9ae2e90f4493880b669d5db51f1d4038589df"; # no tags
+    sha256 = "sha256-7/icSneLQzwdkRL/mS4RjsgnKa6YIVvGCmdS6pB6r5Y=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "ipdb == 0.13.9" "ipdb"
+  '';
+
+  propagatedBuildInputs = [ ipdb ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "cliche" ];
+
+  meta = with lib; {
+    description = "Build a simple command-line interface from your functions :computer:";
+    homepage = "https://github.com/kootenpv/cliche";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/click-aliases/default.nix b/nixpkgs/pkgs/development/python-modules/click-aliases/default.nix
new file mode 100644
index 000000000000..18a97769b3d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-aliases/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, click
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "click-aliases";
+  version = "1.0.3";
+
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "click-contrib";
+    repo = "click-aliases";
+    rev = "v${version}";
+    hash = "sha256-HTjo6ID27W7D4MZjeAJMSy5yVd6oKg0Ed9/kDtQZ7Vw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "click_aliases" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/click-contrib/click-aliases";
+    description = "Enable aliases for click";
+    license = licenses.mit;
+    maintainers = with maintainers; [ panicgh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/click-command-tree/default.nix b/nixpkgs/pkgs/development/python-modules/click-command-tree/default.nix
new file mode 100644
index 000000000000..ccd7e74fc8dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-command-tree/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, click
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "click-command-tree";
+  version = "1.1.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "whwright";
+    repo = pname;
+    rev = version;
+    hash = "sha256-uBp7462LutL8aFRFix3pbVYbSf1af6k0nW0J0HhJa1U=";
+  };
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests.py"
+  ];
+
+  pythonImportsCheck = [ "click_command_tree" ];
+
+  meta = with lib; {
+    description = "click plugin to show the command tree of your CLI";
+    homepage = "https://github.com/whwright/click-command-tree";
+    license = licenses.mit;
+    maintainers = with maintainers; [ tjni ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/click-completion/default.nix b/nixpkgs/pkgs/development/python-modules/click-completion/default.nix
new file mode 100644
index 000000000000..dcfcab597b90
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-completion/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+
+# propagates
+, click
+, jinja2
+, shellingham
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "click-completion";
+  version = "0.5.2";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5bf816b81367e638a190b6e91b50779007d14301b3f9f3145d68e3cade7bce86";
+  };
+
+  propagatedBuildInputs = [
+    click
+    jinja2
+    shellingham
+    six
+  ];
+
+  pythonImportsCheck = [
+    "click_completion"
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Add or enhance bash, fish, zsh and powershell completion in Click";
+    homepage = "https://github.com/click-contrib/click-completion";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mbode ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/click-configfile/default.nix b/nixpkgs/pkgs/development/python-modules/click-configfile/default.nix
new file mode 100644
index 000000000000..c1b0a0f09234
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-configfile/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, click
+, six
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "click-configfile";
+  version = "0.2.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lb7sE77pUOmPQ8gdzavvT2RAkVWepmKY+drfWTUdkNE=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "install_requires=install_requires," 'install_requires=["click >= 6.6", "six >= 1.10"],'
+  '';
+
+  pythonImportsCheck = [
+    "click_configfile"
+  ];
+
+  disabledTests = [
+    "test_configfile__with_unbound_section"
+    "test_matches_section__with_bad_arg"
+  ];
+
+  meta = with lib; {
+    description = "Add support for commands that use configuration files to Click";
+    homepage = "https://github.com/click-contrib/click-configfile";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/click-datetime/default.nix b/nixpkgs/pkgs/development/python-modules/click-datetime/default.nix
new file mode 100644
index 000000000000..ba710d74355d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-datetime/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, click }:
+
+buildPythonPackage rec {
+  pname = "click-datetime";
+  version = "0.2.0";
+
+  src = fetchFromGitHub {
+    owner = "click-contrib";
+    repo = pname;
+    rev = version;
+    sha256 = "1yxagk4wd2h77nxml19bn2y26fv2xw2n9g981ls8mjy0g51ms3gh";
+  };
+
+  propagatedBuildInputs = [ click ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "click_datetime" ];
+
+  meta = with lib; {
+    description = "Datetime type support for click.";
+    homepage = "https://github.com/click-contrib/click-datetime";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/click-default-group/default.nix b/nixpkgs/pkgs/development/python-modules/click-default-group/default.nix
new file mode 100644
index 000000000000..8e5668f2b05a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-default-group/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, click
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "click-default-group";
+  version = "1.2.2";
+
+  # No tests in Pypi tarball
+  src = fetchFromGitHub {
+    owner = "click-contrib";
+    repo = "click-default-group";
+    rev = "v${version}";
+    sha256 = "0nk39lmkn208w8kvq6f4h3a6qzxrrvxixahpips6ik3zflbkss86";
+  };
+
+  patches = [
+    # make tests compatible with click 8
+    (fetchpatch {
+      url = "https://github.com/click-contrib/click-default-group/commit/9415c77d05cf7d16876e7d70a49a41a6189983b4.patch";
+      sha256 = "1czzma8nmwyxhwhnr8rfw5bjw6d46b3s5r5bfb8ly3sjwqjlwhw2";
+    })
+  ];
+
+  propagatedBuildInputs = [ click ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "click_default_group" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/click-contrib/click-default-group";
+    description = "Group to invoke a command without explicit subcommand name";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jakewaksbaum ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/click-didyoumean/default.nix b/nixpkgs/pkgs/development/python-modules/click-didyoumean/default.nix
new file mode 100644
index 000000000000..565663aee0cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-didyoumean/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi,
+  click
+}:
+
+buildPythonPackage rec {
+  pname = "click-didyoumean";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f184f0d851d96b6d29297354ed981b7dd71df7ff500d82fa6d11f0856bee8035";
+  };
+
+  propagatedBuildInputs = [ click ];
+
+  meta = with lib; {
+    description = "Enable git-like did-you-mean feature in click";
+    homepage = "https://github.com/click-contrib/click-didyoumean";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mbode ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/click-help-colors/default.nix b/nixpkgs/pkgs/development/python-modules/click-help-colors/default.nix
new file mode 100644
index 000000000000..9a2983aabe8f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-help-colors/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, click
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "click-help-colors";
+  version = "0.9.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-dWJF5ULSkia7O8BWv6WIhvISuiuC9OjPX8iEF2rJbXI=";
+  };
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "click_help_colors"
+  ];
+
+  meta = with lib; {
+    description = "Colorization of help messages in Click";
+    homepage = "https://github.com/click-contrib/click-help-colors";
+    changelog = "https://github.com/click-contrib/click-help-colors/blob/${version}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ freezeboy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/click-log/default.nix b/nixpkgs/pkgs/development/python-modules/click-log/default.nix
new file mode 100644
index 000000000000..7f091396dfc1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-log/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, click }:
+
+buildPythonPackage rec {
+  pname = "click-log";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-OXD4VwrFRJEje82z2KtePu9sBX3yn4w9EVGlGpwjuXU=";
+  };
+
+  propagatedBuildInputs = [ click ];
+
+  meta = with lib; {
+    homepage = "https://github.com/click-contrib/click-log/";
+    description = "Logging integration for Click";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/click-odoo-contrib/default.nix b/nixpkgs/pkgs/development/python-modules/click-odoo-contrib/default.nix
new file mode 100644
index 000000000000..275f6ccc77dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-odoo-contrib/default.nix
@@ -0,0 +1,43 @@
+{ buildPythonPackage
+, click-odoo
+, fetchPypi
+, importlib-resources
+, lib
+, manifestoo-core
+, nix-update-script
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "click-odoo-contrib";
+  version = "1.18.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3gusvy3d6kgmyBY+bmXB6lbWk7qxJIuHALZtug1WLzo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    click-odoo
+    manifestoo-core
+  ] ++ lib.optionals (pythonOlder "3.9") [ importlib-resources ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  passthru.updateScript = nix-update-script { };
+
+  pythonImportsCheck = [ "click_odoo_contrib" ];
+
+  meta = with lib; {
+    description = "Collection of community-maintained scripts for Odoo maintenance";
+    homepage = "https://github.com/acsone/click-odoo-contrib";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ yajo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/click-odoo/default.nix b/nixpkgs/pkgs/development/python-modules/click-odoo/default.nix
new file mode 100644
index 000000000000..a618359735f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-odoo/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage
+, click
+, fetchPypi
+, lib
+, nix-update-script
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "click-odoo";
+  version = "1.6.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zyfgsHzIoz4lnqANe63b2oqgD/oxBbTbJYEedfSHWQ8=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  passthru.updateScript = nix-update-script { };
+
+  meta = with lib; {
+    description = "Odoo scripting helper library";
+    homepage = "https://github.com/acsone/click-odoo";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ yajo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/click-option-group/default.nix b/nixpkgs/pkgs/development/python-modules/click-option-group/default.nix
new file mode 100644
index 000000000000..b1a2defe518f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-option-group/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, click
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "click-option-group";
+  version = "0.5.6";
+  format = "setuptools";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "click-contrib";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-uR5rIZPPT6pRk/jJEy2rZciOXrHWVWN6BfGroQ3znas=";
+  };
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "click_option_group"
+  ];
+
+  meta = with lib; {
+    description = "Option groups missing in Click";
+    longDescription = ''
+      Option groups are convenient mechanism for logical structuring
+      CLI, also it allows you to set the specific behavior and set the
+      relationship among grouped options (mutually exclusive options
+      for example). Moreover, argparse stdlib package contains this
+      functionality out of the box.
+    '';
+    homepage = "https://github.com/click-contrib/click-option-group";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/click-plugins/default.nix b/nixpkgs/pkgs/development/python-modules/click-plugins/default.nix
new file mode 100644
index 000000000000..a03456b17d81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-plugins/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi,
+  click, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "click-plugins";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b";
+  };
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  meta = with lib; {
+    description = "An extension module for click to enable registering CLI commands";
+    homepage = "https://github.com/click-contrib/click-plugins";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ knedlsepp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/click-repl/default.nix b/nixpkgs/pkgs/development/python-modules/click-repl/default.nix
new file mode 100644
index 000000000000..fd2a20867bdc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-repl/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, click
+, prompt-toolkit
+, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "click-repl";
+  version = "0.2.0";
+
+  src = fetchFromGitHub {
+    owner = "click-contrib";
+    repo = "click-repl";
+    rev = version;
+    hash = "sha256-kaTUKaIomJL0u3NX40bL0I54vkR+Utcdw1QKSbnVy5s=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    prompt-toolkit
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/click-contrib/click-repl";
+    description = "Subcommand REPL for click apps";
+    license = licenses.mit;
+    maintainers = with maintainers; [ twey ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/click-shell/default.nix b/nixpkgs/pkgs/development/python-modules/click-shell/default.nix
new file mode 100644
index 000000000000..1b9a5ecf6211
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-shell/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, click
+, pytestCheckHook
+, pytest-click
+}:
+
+buildPythonPackage rec {
+  pname = "click-shell";
+  version = "2.1";
+  format = "setuptools";
+
+  # PyPi release is missing tests
+  src = fetchFromGitHub {
+    owner = "clarkperkins";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-4QpQzg0yFuOFymGiTI+A8o6LyX78iTJMqr0ernYbilI=";
+  };
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  nativeCheckInputs = [
+    pytest-click
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "click_shell"
+  ];
+
+  preCheck = "export HOME=$(mktemp -d)";
+
+  meta = with lib; {
+    description = "An extension to click that easily turns your click app into a shell utility";
+    longDescription = ''
+      This is an extension to click that easily turns your click app into a
+      shell utility. It is built on top of the built in python cmd module,
+      with modifications to make it work with click. It adds a 'shell' mode
+      with command completion to any click app.
+    '';
+    homepage = "https://github.com/clarkperkins/click-shell";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ binsky ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/click-spinner/default.nix b/nixpkgs/pkgs/development/python-modules/click-spinner/default.nix
new file mode 100644
index 000000000000..2cdd1f4800cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-spinner/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, click
+, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "click-spinner";
+  version = "0.1.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "h+rPnXKYlzol12Fe9X1Hgq6/kTpTK7pLKKN+Nm6XXa8=";
+  };
+
+  nativeCheckInputs = [
+    click
+    six
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Add support for showwing that command line app is active to Click";
+    homepage = "https://github.com/click-contrib/click-spinner";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/click-threading/default.nix b/nixpkgs/pkgs/development/python-modules/click-threading/default.nix
new file mode 100644
index 000000000000..7fd47fcc8253
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click-threading/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, click
+, isPy3k
+, futures ? null
+}:
+
+buildPythonPackage rec {
+  pname = "click-threading";
+  version = "0.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rc/mI8AqWVwQfDFAcvZ6Inj+TrQLcsDRoskDzHivNDk=";
+  };
+
+  nativeCheckInputs = [ pytest ];
+  propagatedBuildInputs = [ click ] ++ lib.optional (!isPy3k) futures;
+
+  checkPhase = ''
+    py.test
+  '';
+
+  # Tests are broken on 3.x
+  doCheck = !isPy3k;
+
+  meta = {
+    homepage = "https://github.com/click-contrib/click-threading/";
+    description = "Multithreaded Click apps made easy";
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/click/default.nix b/nixpkgs/pkgs/development/python-modules/click/default.nix
new file mode 100644
index 000000000000..8569eede0bbb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/click/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, importlib-metadata
+, pytestCheckHook
+
+  # large-rebuild downstream dependencies and applications
+, flask
+, black
+, magic-wormhole
+, mitmproxy
+, typer
+}:
+
+buildPythonPackage rec {
+  pname = "click";
+  version = "8.1.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pallets";
+    repo = "click";
+    rev = "refs/tags/${version}";
+    hash = "sha256-8YqIKRyw5MegnRwAO7YTCZateEFQFTH2PHpE8gTPTow=";
+  };
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  passthru.tests = {
+    inherit black flask magic-wormhole mitmproxy typer;
+  };
+
+  meta = with lib; {
+    homepage = "https://click.palletsprojects.com/";
+    description = "Create beautiful command line interfaces in Python";
+    longDescription = ''
+      A Python package for creating beautiful command line interfaces in a
+      composable way, with as little code as necessary.
+    '';
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clickclick/default.nix b/nixpkgs/pkgs/development/python-modules/clickclick/default.nix
new file mode 100644
index 000000000000..4bb7603b9c21
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clickclick/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchFromGitHub, flake8, click, pyyaml, six, pytestCheckHook, pytest-cov }:
+
+buildPythonPackage rec {
+  pname = "clickclick";
+  version = "1.2.2";
+
+  src = fetchFromGitHub {
+    owner = "hjacobs";
+    repo = "python-clickclick";
+    rev = version;
+    sha256 = "1rij9ws9nhsmagiy1vclzliiqfkxi006rf65qvrw1k3sm2s8p5g0";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook pytest-cov ];
+  propagatedBuildInputs = [ flake8 click pyyaml six ];
+
+  # test_cli asserts on exact quoting style of output
+  disabledTests = [
+    "test_cli"
+  ];
+
+  meta = with lib; {
+    description = "Click command line utilities";
+    homepage = "https://github.com/hjacobs/python-clickclick/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ elohmeier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clickgen/default.nix b/nixpkgs/pkgs/development/python-modules/clickgen/default.nix
new file mode 100644
index 000000000000..e9296435e052
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clickgen/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pillow
+, toml
+, numpy
+, pyyaml
+, python
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "clickgen";
+  version = "2.1.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ful1e5";
+    repo = "clickgen";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-mSaltlX2eNRLJ09zN5Tim8mW8mnjPi10W4QIEpiBQvI=";
+  };
+
+  propagatedBuildInputs = [ pillow toml numpy pyyaml ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  postInstall = ''
+    # Copying scripts directory needed by clickgen script at $out/bin/
+    cp -R src/clickgen/scripts $out/${python.sitePackages}/clickgen/scripts
+  '';
+
+  pythonImportsCheck = [ "clickgen" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ful1e5/clickgen";
+    description = "The hassle-free cursor building toolbox";
+    longDescription = ''
+      clickgen is API for building X11 and Windows Cursors from
+      .png files. clickgen is using anicursorgen and xcursorgen under the hood.
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ AdsonCicilioti ];
+    # fails with:
+    # ld: unknown option: -zdefs
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clickhouse-cityhash/default.nix b/nixpkgs/pkgs/development/python-modules/clickhouse-cityhash/default.nix
new file mode 100644
index 000000000000..770d4e76fb72
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clickhouse-cityhash/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "clickhouse-cityhash";
+  version = "1.0.2.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ezEl19CqE8LMTnWDqWWmv7CqlqEhMUdbRCVSustV9Pg=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "clickhouse_cityhash"
+  ];
+
+  meta = with lib; {
+    description = "Python-bindings for CityHash, a fast non-cryptographic hash algorithm";
+    homepage = "https://github.com/xzkostyan/python-cityhash";
+    license = licenses.upl;
+    maintainers = with maintainers; [ breakds ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clickhouse-cli/default.nix b/nixpkgs/pkgs/development/python-modules/clickhouse-cli/default.nix
new file mode 100644
index 000000000000..3c807716e03d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clickhouse-cli/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, click
+, prompt-toolkit
+, pygments
+, requests
+, sqlparse
+}:
+
+buildPythonPackage rec {
+  pname = "clickhouse-cli";
+  version = "0.3.9";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gkgLAedUtzGv/4P+D56M2Pb5YecyqyVYp06ST62sjdY=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    prompt-toolkit
+    pygments
+    requests
+    sqlparse
+  ];
+
+  pythonImportsCheck = [ "clickhouse_cli" ];
+
+  meta = with lib; {
+    description = "A third-party client for the Clickhouse DBMS server";
+    homepage = "https://github.com/hatarist/clickhouse-cli";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ivan-babrou ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clickhouse-connect/default.nix b/nixpkgs/pkgs/development/python-modules/clickhouse-connect/default.nix
new file mode 100644
index 000000000000..35c3d7773bed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clickhouse-connect/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+  # build_requires
+, cython_3
+  # install_requires
+, certifi
+, importlib-metadata
+, urllib3
+, pytz
+, zstandard
+, lz4
+  # extras_require
+, sqlalchemy
+, numpy
+, pandas
+, pyarrow
+, orjson
+  # not in tests_require, but should be
+, pytest-dotenv
+}:
+buildPythonPackage rec {
+  pname = "clickhouse-connect";
+  version = "0.6.21";
+
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    repo = "clickhouse-connect";
+    owner = "ClickHouse";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-gPxJKNW4JiMmIAwn4WPrzqoRPhigjMEDyCX/7jSUv0c=";
+  };
+
+  nativeBuildInputs = [ cython_3 ];
+  setupPyBuildFlags = [ "--inplace" ];
+  enableParallelBuilding = true;
+
+  propagatedBuildInputs = [
+    certifi
+    importlib-metadata
+    urllib3
+    pytz
+    zstandard
+    lz4
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook pytest-dotenv ]
+    ++ passthru.optional-dependencies.sqlalchemy
+    ++ passthru.optional-dependencies.numpy;
+
+  # these tests require a running clickhouse instance
+  disabledTestPaths = [
+    "tests/integration_tests"
+    "tests/tls"
+  ];
+
+  pythonImportsCheck = [
+    "clickhouse_connect"
+    "clickhouse_connect.driverc.buffer"
+    "clickhouse_connect.driverc.dataconv"
+    "clickhouse_connect.driverc.npconv"
+  ];
+
+  passthru = {
+    optional-dependencies = {
+      sqlalchemy = [ sqlalchemy ];
+      numpy = [ numpy ];
+      pandas = [ pandas ];
+      arrow = [ pyarrow ];
+      orjson = [ orjson ];
+    };
+  };
+
+  meta = with lib; {
+    description = "ClickHouse Database Core Driver for Python, Pandas, and Superset";
+    homepage = "https://github.com/ClickHouse/clickhouse-connect";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clickhouse-driver/default.nix b/nixpkgs/pkgs/development/python-modules/clickhouse-driver/default.nix
new file mode 100644
index 000000000000..375fee87486c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clickhouse-driver/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pytz
+, tzlocal
+, clickhouse-cityhash
+, zstd
+, lz4
+, freezegun
+, mock
+, nose
+, pytestCheckHook
+, pytest-xdist
+}:
+
+buildPythonPackage rec {
+  pname = "clickhouse-driver";
+  version = "0.2.5";
+
+  # pypi source doesn't contain tests
+  src = fetchFromGitHub {
+    owner = "mymarilyn";
+    repo = "clickhouse-driver";
+    rev = version;
+    hash = "sha256-o5v37jPKmvUW4GFVD742nHSdO0g0z2FA4FkacbaRfNA=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+    pytz
+    tzlocal
+    clickhouse-cityhash
+    zstd
+    lz4
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    mock
+    nose
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "lz4<=3.0.1" "lz4<=4"
+  '';
+
+  # remove source to prevent pytest testing source instead of the build artifacts
+  # (the source doesn't contain the extension modules)
+  preCheck = ''
+    rm -rf clickhouse_driver
+  '';
+
+  # some test in test_buffered_reader.py doesn't seem to return
+  disabledTestPaths = [ "tests/test_buffered_reader.py" ];
+
+  # most tests require `clickhouse`
+  # TODO: enable tests after `clickhouse` unbroken
+  doCheck = false;
+
+  pythonImportsCheck = [ "clickhouse_driver" ];
+
+  meta = with lib; {
+    description = "Python driver with native interface for ClickHouse";
+    homepage = "https://github.com/mymarilyn/clickhouse-driver";
+    license = licenses.mit;
+    maintainers = with maintainers; [ breakds ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cliff/default.nix b/nixpkgs/pkgs/development/python-modules/cliff/default.nix
new file mode 100644
index 000000000000..978c1c3f62f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cliff/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, autopage
+, cmd2
+, importlib-metadata
+, installShellFiles
+, openstackdocstheme
+, pbr
+, prettytable
+, pyparsing
+, pyyaml
+, stevedore
+, sphinx
+, callPackage
+}:
+
+buildPythonPackage rec {
+  pname = "cliff";
+  version = "4.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/FtuvI+4FTMncLJIXuNsCXU5N8N8zk8yJ83U4Qsz6sw=";
+  };
+
+  postPatch = ''
+    # only a small portion of the listed packages are actually needed for running the tests
+    # so instead of removing them one by one remove everything
+    rm test-requirements.txt
+  '';
+
+  nativeBuildInputs = [
+    installShellFiles
+    openstackdocstheme
+    sphinx
+  ];
+
+  propagatedBuildInputs = [
+    autopage
+    cmd2
+    importlib-metadata
+    pbr
+    prettytable
+    pyparsing
+    pyyaml
+    stevedore
+  ];
+
+  postInstall = ''
+    sphinx-build -a -E -d doc/build/doctrees -b man doc/source doc/build/man
+    installManPage doc/build/man/cliff.1
+  '';
+
+  # check in passthru.tests.pytest to escape infinite recursion with stestr
+  doCheck = false;
+
+  pythonImportsCheck = [ "cliff" ];
+
+  passthru.tests = {
+    pytest = callPackage ./tests.nix { };
+  };
+
+  meta = with lib; {
+    description = "Command Line Interface Formulation Framework";
+    homepage = "https://github.com/openstack/cliff";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cliff/tests.nix b/nixpkgs/pkgs/development/python-modules/cliff/tests.nix
new file mode 100644
index 000000000000..a2738cc590e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cliff/tests.nix
@@ -0,0 +1,32 @@
+{ buildPythonPackage
+, cliff
+, docutils
+, stestr
+, testscenarios
+}:
+
+buildPythonPackage {
+  pname = "cliff";
+  inherit (cliff) version src;
+  format = "other";
+
+  postPatch = ''
+    # only a small portion of the listed packages are actually needed for running the tests
+    # so instead of removing them one by one remove everything
+    rm test-requirements.txt
+  '';
+
+  dontBuild = true;
+  dontInstall = true;
+
+  nativeCheckInputs = [
+    cliff
+    docutils
+    stestr
+    testscenarios
+  ];
+
+  checkPhase = ''
+    stestr run
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clifford/default.nix b/nixpkgs/pkgs/development/python-modules/clifford/default.nix
new file mode 100644
index 000000000000..645fdc43764f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clifford/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, h5py
+, ipython
+, numba
+, numpy
+, pytestCheckHook
+, scipy
+, sparse
+}:
+
+buildPythonPackage rec {
+  pname = "clifford";
+  version = "1.4.0";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-eVE8FrD0YHoRreY9CrNb8v4v4KrG83ZU0oFz+V+p+Q0=";
+  };
+
+  propagatedBuildInputs = [
+    h5py
+    numba
+    numpy
+    scipy
+    sparse
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    ipython
+  ];
+
+  # avoid collecting local files
+  preCheck = ''
+    cd clifford/test
+  '';
+
+  disabledTests = [
+    "veryslow"
+    "test_algebra_initialisation"
+    "test_cga"
+    "test_grade_projection"
+    "test_multiple_grade_projection"
+    "test_inverse"
+    "test_inv_g4"
+  ];
+
+  disabledTestPaths = [
+    # Disable failing tests
+    "test_g3c_tools.py"
+    "test_multivector_inverse.py"
+  ];
+
+  pythonImportsCheck = [ "clifford" ];
+
+  meta = with lib; {
+    description = "Numerical Geometric Algebra Module";
+    homepage = "https://clifford.readthedocs.io";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cligj/default.nix b/nixpkgs/pkgs/development/python-modules/cligj/default.nix
new file mode 100644
index 000000000000..521a7b31ef36
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cligj/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, click, pytest, glibcLocales
+}:
+
+buildPythonPackage rec {
+  pname = "cligj";
+  version = "0.7.2";
+
+  src = fetchFromGitHub {
+    owner = "mapbox";
+    repo = "cligj";
+    rev = version;
+    hash = "sha256-0f9+I6ozX93Vn0l7+WR0mpddDZymJQ3+Krovt6co22Y=";
+  };
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  nativeCheckInputs = [ pytest glibcLocales ];
+
+  checkPhase = ''
+    LC_ALL=en_US.utf-8 pytest tests
+  '';
+
+  meta = with lib; {
+    description = "Click params for command line interfaces to GeoJSON";
+    homepage = "https://github.com/mapbox/cligj";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ knedlsepp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clikit/default.nix b/nixpkgs/pkgs/development/python-modules/clikit/default.nix
new file mode 100644
index 000000000000..48ed42ffb8e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clikit/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, pythonAtLeast
+, poetry-core
+
+# propagates
+, pylev
+, pastel
+
+# python36+
+, crashtest
+
+# python2
+, typing
+, enum34
+
+# tests
+, pytest-mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "clikit";
+  version = "0.6.2";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "sdispater";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-xAsUNhVQBjtSFHyjjnicAKRC3+Tdn3AdGDUYhmOOIdA=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml --replace \
+      'crashtest = { version = "^0.3.0", python = "^3.6" }' \
+      'crashtest = { version = "*", python = "^3.6" }'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pylev
+    pastel
+  ]
+  ++ lib.optionals (pythonAtLeast "3.6") [ crashtest ]
+  ++ lib.optionals isPy27 [ typing enum34 ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "clikit"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/sdispater/clikit";
+    description = "A group of utilities to build beautiful and testable command line interfaces";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jakewaksbaum ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clint/default.nix b/nixpkgs/pkgs/development/python-modules/clint/default.nix
new file mode 100644
index 000000000000..6099c3c63591
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clint/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, mock
+, blessings
+, nose
+, pillow
+, args
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "clint";
+  version = "0.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1an5lkkqk1zha47198p42ji3m94xmzx1a03dn7866m87n4r4q8h5";
+  };
+
+  LC_ALL="en_US.UTF-8";
+
+  propagatedBuildInputs = [ pillow blessings args ];
+
+  # nose-progressive and clint are not actively maintained
+  # no longer compatible as behavior demand 2to3, which was removed
+  # in setuptools>=58
+  doCheck  = false;
+  nativeCheckInputs = [ mock nose pkgs.glibcLocales ];
+  checkPhase = ''
+    ${python.interpreter} test_clint.py
+  '';
+
+  pythonImportsCheck = [ "clint" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/kennethreitz/clint";
+    description = "Python Command Line Interface Tools";
+    license = licenses.isc;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clintermission/default.nix b/nixpkgs/pkgs/development/python-modules/clintermission/default.nix
new file mode 100644
index 000000000000..9b439fa16084
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clintermission/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, prompt-toolkit
+}:
+
+buildPythonPackage rec {
+  pname = "clintermission";
+  version = "0.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sebageek";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-e7C9IDr+mhVSfU8lMywjX1BYwFo/qegPNzabak7UPcY=";
+  };
+
+  propagatedBuildInputs = [
+    prompt-toolkit
+  ];
+
+  # repo contains no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "clintermission"
+  ];
+
+  meta = with lib; {
+    description = "Non-fullscreen command-line selection menu";
+    homepage = "https://github.com/sebageek/clintermission";
+    changelog = "https://github.com/sebageek/clintermission/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clip-anytorch/default.nix b/nixpkgs/pkgs/development/python-modules/clip-anytorch/default.nix
new file mode 100644
index 000000000000..b689d5708d5f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clip-anytorch/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# dependencies
+, ftfy
+, regex
+, tqdm
+, torch
+, torchvision
+
+# tests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "clip-anytorch";
+  version = "2.5.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "rom1504";
+    repo = "CLIP";
+    rev = version;
+    hash = "sha256-EqVkpMQHawoCFHNupf49NrvLdGCq35wnYBpdP81Ztd4=";
+  };
+
+  propagatedBuildInputs = [
+    ftfy
+    regex
+    tqdm
+    torch
+    torchvision
+  ];
+
+  pythonImportsCheck = [
+    "clip"
+  ];
+
+  # all tests require network access
+  doCheck = false;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  meta = with lib; {
+    description = "Contrastive Language-Image Pretraining";
+    homepage = "https://github.com/rom1504/CLIP";
+    license = licenses.mit;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clip/default.nix b/nixpkgs/pkgs/development/python-modules/clip/default.nix
new file mode 100644
index 000000000000..bf10f5be593f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clip/default.nix
@@ -0,0 +1,39 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, ftfy
+, lib
+, regex
+, torch
+, torchvision
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "clip";
+  version = "unstable-2022-11-17";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "openai";
+    repo = pname;
+    rev = "d50d76daa670286dd6cacf3bcd80b5e4823fc8e1";
+    hash = "sha256-GAitNBb5CzFVv2+Dky0VqSdrFIpKKtoAoyqeLoDaHO4=";
+  };
+
+  propagatedBuildInputs = [
+    ftfy
+    regex
+    torch
+    torchvision
+    tqdm
+  ];
+
+  pythonImportsCheck = [ "clip" ];
+
+  meta = with lib; {
+    description = "Contrastive Language-Image Pretraining";
+    homepage = "https://github.com/openai/CLIP";
+    license = licenses.mit;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clize/default.nix b/nixpkgs/pkgs/development/python-modules/clize/default.nix
new file mode 100644
index 000000000000..d708cd93a4ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clize/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, attrs
+, buildPythonPackage
+, docutils
+, fetchPypi
+, od
+, pygments
+, pytestCheckHook
+, pythonOlder
+, python-dateutil
+, repeated-test
+, setuptools-scm
+, sigtools
+}:
+
+buildPythonPackage rec {
+  pname = "clize";
+  version = "5.0.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BH9aRHNgJxirG4VnKn4VMDOHF41agcJ13EKd+sHstRA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    docutils
+    od
+    sigtools
+  ];
+
+  passthru.optional-dependencies = {
+    datetime = [
+      python-dateutil
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    python-dateutil
+    pygments
+    repeated-test
+  ];
+
+  pythonImportsCheck = [
+    "clize"
+  ];
+
+  meta = with lib; {
+    description = "Command-line argument parsing for Python";
+    homepage = "https://github.com/epsy/clize";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clldutils/default.nix b/nixpkgs/pkgs/development/python-modules/clldutils/default.nix
new file mode 100644
index 000000000000..83c0f5c5d684
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clldutils/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, attrs
+, buildPythonPackage
+, colorlog
+, csvw
+, fetchFromGitHub
+, git
+, isPy27
+, lxml
+, markdown
+, markupsafe
+, mock
+, postgresql
+, pylatexenc
+, pytest-mock
+, pytestCheckHook
+, python-dateutil
+, tabulate
+}:
+
+buildPythonPackage rec {
+  pname = "clldutils";
+  version = "3.19.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "clld";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-dva0lbbTxvETDPkACxpI3PPzWh5gz87Fv6W3lTjNv3Q=";
+  };
+
+  patchPhase = ''
+    substituteInPlace setup.cfg --replace "--cov" ""
+  '';
+
+  propagatedBuildInputs = [
+    attrs
+    colorlog
+    csvw
+    lxml
+    markdown
+    markupsafe
+    pylatexenc
+    python-dateutil
+    tabulate
+  ];
+
+  nativeCheckInputs = [
+    mock
+    postgresql
+    pytest-mock
+    pytestCheckHook
+    git
+  ];
+
+  disabledTests = [
+    # uses pytest.approx which is not supported in a boolean context in pytest7
+    "test_to_dec"
+    "test_roundtrip"
+  ];
+
+  meta = with lib; {
+    description = "Utilities for clld apps without the overhead of requiring pyramid, rdflib et al";
+    homepage = "https://github.com/clld/clldutils";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ melling ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cloudflare/default.nix b/nixpkgs/pkgs/development/python-modules/cloudflare/default.nix
new file mode 100644
index 000000000000..f7e1cb2cf073
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cloudflare/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, attrs
+, beautifulsoup4
+, requests
+, future
+, pyyaml
+, jsonlines
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cloudflare";
+  version = "2.12.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-UX8ROC6pL8WR82zJupUkPac+aDReUvIh8D1R1ujXhqU=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    beautifulsoup4
+    requests
+    future
+    pyyaml
+    jsonlines
+  ];
+
+  # no tests associated with package
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "CloudFlare"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for the Cloudflare v4 API";
+    homepage = "https://github.com/cloudflare/python-cloudflare";
+    changelog = "https://github.com/cloudflare/python-cloudflare/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cloudpathlib/default.nix b/nixpkgs/pkgs/development/python-modules/cloudpathlib/default.nix
new file mode 100644
index 000000000000..ae22d4bcafbf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cloudpathlib/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, flit-core
+, importlib-metadata
+, typing-extensions
+, cloudpathlib
+, azure-storage-blob
+, google-cloud-storage
+, boto3
+, psutil
+, pydantic
+, pytestCheckHook
+, pytest-cases
+, pytest-cov
+, pytest-xdist
+, python-dotenv
+, shortuuid
+}:
+
+buildPythonPackage rec {
+  pname = "cloudpathlib";
+  version = "0.16.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "drivendataorg";
+    repo = "cloudpathlib";
+    rev = "v${version}";
+    hash = "sha256-d4CbzPy3H5HQ4YmSRCRMEYaTpwB7F0Bznd26aKWiHTA=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    importlib-metadata
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = {
+    all = [
+      cloudpathlib
+    ];
+    azure = [
+      azure-storage-blob
+    ];
+    gs = [
+      google-cloud-storage
+    ];
+    s3 = [
+      boto3
+    ];
+  };
+
+  pythonImportsCheck = [ "cloudpathlib" ];
+
+  nativeCheckInputs = [
+    azure-storage-blob
+    boto3
+    google-cloud-storage
+    psutil
+    pydantic
+    pytestCheckHook
+    pytest-cases
+    pytest-cov
+    pytest-xdist
+    python-dotenv
+    shortuuid
+  ];
+
+  meta = with lib; {
+    description = "Python pathlib-style classes for cloud storage services such as Amazon S3, Azure Blob Storage, and Google Cloud Storage";
+    homepage = "https://github.com/drivendataorg/cloudpathlib";
+    license = licenses.mit;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cloudpickle/default.nix b/nixpkgs/pkgs/development/python-modules/cloudpickle/default.nix
new file mode 100644
index 000000000000..2acfe17327b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cloudpickle/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, psutil
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cloudpickle";
+  version = "2.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2JaEuN6eNKKkOzRg+8oH0J1uJc6FjfTVpEJAQDthePU=";
+  };
+
+  nativeCheckInputs = [
+    psutil
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "cloudpickle"
+  ];
+
+  disabledTestPaths = [
+    # ModuleNotFoundError: No module named '_cloudpickle_testpkg'
+    "tests/cloudpickle_test.py"
+  ];
+
+  disabledTests = [
+    # TypeError: cannot pickle 'EncodedFile' object
+    "test_pickling_special_file_handles"
+  ];
+
+  meta = with lib; {
+    description = "Extended pickling support for Python objects";
+    homepage = "https://github.com/cloudpipe/cloudpickle";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cloudscraper/default.nix b/nixpkgs/pkgs/development/python-modules/cloudscraper/default.nix
new file mode 100644
index 000000000000..b5cb302765c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cloudscraper/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, requests
+, requests-toolbelt
+, pyparsing
+}:
+
+buildPythonPackage rec {
+  pname = "cloudscraper";
+  version = "1.2.71";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QpxuiqaRbVutXIperFDz6lPJrCJhb2yyGxjcxxUX0NM=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    requests-toolbelt
+    pyparsing
+  ];
+
+  # The tests require several other dependencies, some of which aren't in
+  # nixpkgs yet, and also aren't included in the PyPI bundle.  TODO.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "cloudscraper"
+  ];
+
+  meta = with lib; {
+    description = "Python module to bypass Cloudflare's anti-bot page";
+    homepage = "https://github.com/venomous/cloudscraper";
+    changelog = "https://github.com/VeNoMouS/cloudscraper/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kini ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cloudsmith-api/default.nix b/nixpkgs/pkgs/development/python-modules/cloudsmith-api/default.nix
new file mode 100644
index 000000000000..5e6aac6ff13b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cloudsmith-api/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, certifi
+, fetchPypi
+, python-dateutil
+, pythonOlder
+, six
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "cloudsmith-api";
+  version = "2.0.7";
+  format = "wheel";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "cloudsmith_api";
+    inherit format version;
+    hash = "sha256-Vw5ifMJ+gwXecYjSe8QKkq+RtrBWxx3B/LdA80ZxuxU=";
+  };
+
+  propagatedBuildInputs = [
+    certifi
+    python-dateutil
+    six
+    urllib3
+  ];
+
+  # Wheels have no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "cloudsmith_api"
+  ];
+
+  meta = with lib; {
+    description = "Cloudsmith API Client";
+    homepage = "https://github.com/cloudsmith-io/cloudsmith-api";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cloudsplaining/default.nix b/nixpkgs/pkgs/development/python-modules/cloudsplaining/default.nix
new file mode 100644
index 000000000000..bb4340eec4c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cloudsplaining/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, boto3
+, botocore
+, buildPythonPackage
+, cached-property
+, click
+, click-option-group
+, fetchFromGitHub
+, jinja2
+, markdown
+, policy-sentry
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, schema
+}:
+
+buildPythonPackage rec {
+  pname = "cloudsplaining";
+  version = "0.6.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "salesforce";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-7aOPerqayuJTHItlpnVVSzOlSGNnqHvtIi5BdovNh3A=";
+  };
+
+  propagatedBuildInputs = [
+    boto3
+    botocore
+    cached-property
+    click
+    click-option-group
+    jinja2
+    markdown
+    policy-sentry
+    pyyaml
+    schema
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # Ignore pinned versions
+    sed -i "s/'\(.*\)\(==\|>=\).*'/'\1'/g" requirements.txt
+  '';
+
+  disabledTests = [
+    "test_policy_expansion"
+    "test_statement_details_for_allow_not_action"
+  ];
+
+  pythonImportsCheck = [
+    "cloudsplaining"
+  ];
+
+  meta = with lib; {
+    description = "Python module for AWS IAM security assessment";
+    homepage = "https://github.com/salesforce/cloudsplaining";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cloup/default.nix b/nixpkgs/pkgs/development/python-modules/cloup/default.nix
new file mode 100644
index 000000000000..091677c5faf4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cloup/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, click
+, setuptools-scm
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "cloup";
+  version = "3.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5b13idF8DelxOaxeuK+ML42Wotg2PoQRIk32JaaFjSE=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    click
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "cloup"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/janLuke/cloup";
+    description = "Click extended with option groups, constraints, aliases, help themes";
+    changelog = "https://github.com/janluke/cloup/releases/tag/v${version}";
+    longDescription = ''
+      Enriches Click with option groups, constraints, command aliases, help sections for subcommands, themes for --help and other stuff.
+    '';
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ friedelino ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clr-loader/default.nix b/nixpkgs/pkgs/development/python-modules/clr-loader/default.nix
new file mode 100644
index 000000000000..c0122a0d3d9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clr-loader/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pytestCheckHook
+, dotnetCorePackages
+, setuptools
+, setuptools-scm
+, wheel
+, buildDotnetModule
+, cffi
+}:
+
+let
+  pname = "clr-loader";
+  version = "0.2.6";
+  src = fetchPypi {
+    pname = "clr_loader";
+    inherit version;
+    hash = "sha256-AZNIrmtqg8ekBtFFN8J3zs96OlOyY+w0LIHe1YRaZ+4=";
+  };
+
+  # This buildDotnetModule is used only to get nuget sources, the actual
+  # build is done in `buildPythonPackage` below.
+  dotnet-build = buildDotnetModule {
+    inherit pname version src;
+    projectFile = [ "netfx_loader/ClrLoader.csproj" "example/example.csproj" ];
+    nugetDeps = ./deps.nix;
+  };
+in
+buildPythonPackage {
+  inherit pname version src;
+
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+    dotnetCorePackages.sdk_6_0
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # TODO: mono does not work due to https://github.com/NixOS/nixpkgs/issues/7307
+    "test_mono"
+    "test_mono_debug"
+    "test_mono_signal_chaining"
+    "test_mono_set_dir"
+  ];
+
+  # Perform dotnet restore based on the nuget-source
+  preConfigure = ''
+    dotnet restore "netfx_loader/ClrLoader.csproj" \
+      -p:ContinuousIntegrationBuild=true \
+      -p:Deterministic=true \
+      --source "${dotnet-build.nuget-source}"
+
+    dotnet restore "example/example.csproj" \
+      -p:ContinuousIntegrationBuild=true \
+      -p:Deterministic=true \
+      --source "${dotnet-build.nuget-source}"
+  '';
+
+  passthru.fetch-deps = dotnet-build.fetch-deps;
+
+  meta = with lib; {
+    description = "Generic pure Python loader for .NET runtimes";
+    homepage = "https://pythonnet.github.io/clr-loader/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mdarocha ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/clr-loader/deps.nix b/nixpkgs/pkgs/development/python-modules/clr-loader/deps.nix
new file mode 100644
index 000000000000..df303afaa791
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clr-loader/deps.nix
@@ -0,0 +1,11 @@
+# This file was automatically generated by passthru.fetch-deps.
+# Please dont edit it manually, your changes might get overwritten!
+
+{ fetchNuGet }: [
+  (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "1.1.0"; sha256 = "08vh1r12g6ykjygq5d3vq09zylgb84l63k49jc4v8faw9g93iqqm"; })
+  (fetchNuGet { pname = "Microsoft.NETFramework.ReferenceAssemblies"; version = "1.0.0"; sha256 = "0na724xhvqm63vq9y18fl9jw9q2v99bdwr353378s5fsi11qzxp9"; })
+  (fetchNuGet { pname = "Microsoft.NETFramework.ReferenceAssemblies.net461"; version = "1.0.0"; sha256 = "00vkn4c6i0rn1l9pv912y0wgb9h6ks76qah8hvk441nari8fqbm1"; })
+  (fetchNuGet { pname = "Microsoft.NETFramework.ReferenceAssemblies.net47"; version = "1.0.0"; sha256 = "00v56phfn01ahf4fq7zanz6hjyzpp00hkkk4a190l0dywrv387i6"; })
+  (fetchNuGet { pname = "NETStandard.Library"; version = "2.0.3"; sha256 = "1fn9fxppfcg4jgypp2pmrpr6awl3qz1xmnri0cygpkwvyx27df1y"; })
+  (fetchNuGet { pname = "NXPorts"; version = "1.0.0"; sha256 = "02zva596c3vsnlhi1b1391vbfl8a6142dvm61r8j1c70b07916lj"; })
+]
diff --git a/nixpkgs/pkgs/development/python-modules/clustershell/default.nix b/nixpkgs/pkgs/development/python-modules/clustershell/default.nix
new file mode 100644
index 000000000000..87fef1f934cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/clustershell/default.nix
@@ -0,0 +1,107 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, pyyaml
+, openssh
+, nose
+, bc
+, hostname
+, bash
+}:
+
+buildPythonPackage rec {
+  pname = "ClusterShell";
+  version = "1.9.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rsF/HG4GNBC+N49b+sDO2AyUI1G44wJNBUwQNPzShD0=";
+  };
+
+  postPatch = ''
+    substituteInPlace lib/ClusterShell/Worker/Ssh.py \
+      --replace '"ssh"' '"${openssh}/bin/ssh"' \
+      --replace '"scp"' '"${openssh}/bin/scp"'
+
+    substituteInPlace lib/ClusterShell/Worker/fastsubprocess.py \
+      --replace '"/bin/sh"' '"${bash}/bin/sh"'
+
+    for f in tests/*; do
+      substituteInPlace $f \
+        --replace '/bin/hostname'   '${hostname}/bin/hostname' \
+        --replace '/bin/sleep'      'sleep' \
+        --replace '/bin/echo'       'echo' \
+        --replace '/bin/uname'      'uname' \
+        --replace '/bin/false'      'false' \
+        --replace '/bin/true'       'true' \
+        --replace '/usr/bin/printf' 'printf'
+    done
+
+    # Fix warnings
+    substituteInPlace lib/ClusterShell/Task.py \
+      --replace "notifyAll" "notify_all"
+    substituteInPlace tests/TaskPortTest.py lib/ClusterShell/Task.py \
+      --replace "currentThread" "current_thread"
+  '';
+
+  propagatedBuildInputs = [ pyyaml ];
+
+  nativeCheckInputs = [
+    bc
+    hostname
+    nose
+  ];
+
+  pythonImportsCheck = [ "ClusterShell" ];
+
+  # Many tests want to open network connections
+  # https://github.com/cea-hpc/clustershell#test-suite
+  #
+  # Several tests fail on Darwin
+  checkPhase = ''
+    rm tests/CLIClushTest.py
+    rm tests/TreeWorkerTest.py
+    rm tests/TaskDistantMixin.py
+    rm tests/TaskDistantTest.py
+    rm tests/TaskDistantPdshMixin.py
+    rm tests/TaskDistantPdshTest.py
+    rm tests/TaskRLimitsTest.py
+
+    nosetests -v \
+      -e test_channel_ctl_shell_remote1 \
+      -e test_channel_ctl_shell_remote2 \
+      -e test_fromall_grouplist \
+      -e test_rank_placeholder \
+      -e test_engine_on_the_fly_launch \
+      -e test_ev_pickup_fanout \
+      -e test_ev_pickup_fanout_legacy \
+      -e test_timeout \
+      -e test_008_broken_pipe_on_write \
+      -e testLocalBufferRCGathering \
+      -e testLocalBuffers \
+      -e testLocalErrorBuffers \
+      -e testLocalFanout \
+      -e testLocalRetcodes \
+      -e testLocalRCBufferGathering \
+      -e testLocalSingleLineBuffers \
+      -e testLocalWorkerFanout \
+      -e testSimpleMultipleCommands \
+      -e testClushConfigSetRlimit  \
+      -e testTimerInvalidateInHandler \
+      -e testTimerSetNextFireInHandler \
+      -e test_channel_ctl_shell_mlocal1 \
+      -e test_channel_ctl_shell_mlocal2 \
+      -e test_channel_ctl_shell_mlocal3 \
+      -e test_node_placeholder \
+    tests/*.py
+  '';
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Scalable Python framework for cluster administration";
+    homepage = "https://cea-hpc.github.io/clustershell";
+    license = licenses.lgpl21;
+    maintainers = [ maintainers.alexvorobiev ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cma/default.nix b/nixpkgs/pkgs/development/python-modules/cma/default.nix
new file mode 100644
index 000000000000..82fdcf07153d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cma/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cma";
+  version = "3.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CMA-ES";
+    repo = "pycma";
+    rev = "refs/tags/r${version}";
+    hash = "sha256-+UJI3hDVbDMfRF4bkwHED3eJCHzxS2hO4YPUzJqcoQI=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  checkPhase = ''
+    # At least one doctest fails, thus only limited amount of files is tested
+    ${python.executable} -m cma.test interfaces.py purecma.py logger.py optimization_tools.py transformations.py
+  '';
+
+  pythonImportsCheck = [
+    "cma"
+  ];
+
+  meta = with lib; {
+    description = "Library for Covariance Matrix Adaptation Evolution Strategy for non-linear numerical optimization";
+    homepage = "https://github.com/CMA-ES/pycma";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cmaes/default.nix b/nixpkgs/pkgs/development/python-modules/cmaes/default.nix
new file mode 100644
index 000000000000..2e0afcf38162
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cmaes/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, hypothesis
+, numpy
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "cmaes";
+  version = "0.10.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CyberAgentAILab";
+    repo = "cmaes";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-1mXulG/yqNwKQKDFGBh8uxIYOPSsm8+PNp++CSswc50=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "cmaes"
+  ];
+
+  disabledTests = [
+    # Disable time-sensitive test
+    "test_cma_tell"
+  ];
+
+  meta = with lib; {
+    description = "Python library for CMA evolution strategy";
+    homepage = "https://github.com/CyberAgentAILab/cmaes";
+    changelog = "https://github.com/CyberAgentAILab/cmaes/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cmake/default.nix b/nixpkgs/pkgs/development/python-modules/cmake/default.nix
new file mode 100644
index 000000000000..c9ee7d11c8fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cmake/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, flit-core
+, cmake
+}:
+
+buildPythonPackage rec {
+  pname = "cmake";
+  inherit (cmake) version;
+  format = "pyproject";
+
+  src = ./stub;
+
+  postUnpack = ''
+    substituteInPlace "$sourceRoot/pyproject.toml" \
+      --subst-var version
+
+    substituteInPlace "$sourceRoot/cmake/__init__.py" \
+      --subst-var version \
+      --subst-var-by CMAKE_BIN_DIR "${cmake}/bin"
+  '';
+
+  inherit (cmake) setupHooks;
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  pythonImportsCheck = [
+    "cmake"
+  ];
+
+  meta = with lib; {
+    description = "CMake is an open-source, cross-platform family of tools designed to build, test and package software";
+    longDescription = ''
+      This is a stub of the cmake package on PyPI that uses the cmake program
+      provided by nixpkgs instead of downloading cmake from the web.
+    '';
+    homepage = "https://github.com/scikit-build/cmake-python-distributions";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ tjni ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cmake/stub/cmake/__init__.py b/nixpkgs/pkgs/development/python-modules/cmake/stub/cmake/__init__.py
new file mode 100644
index 000000000000..512a13f3d94a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cmake/stub/cmake/__init__.py
@@ -0,0 +1,19 @@
+import os
+import subprocess
+import sys
+
+__version__ = '@version@'
+
+CMAKE_BIN_DIR = '@CMAKE_BIN_DIR@'
+
+def _program(name, args):
+    return subprocess.call([os.path.join(CMAKE_BIN_DIR, name)] + args, close_fds=False)
+
+def cmake():
+    raise SystemExit(_program('cmake', sys.argv[1:]))
+
+def cpack():
+    raise SystemExit(_program('cpack', sys.argv[1:]))
+
+def ctest():
+    raise SystemExit(_program('ctest', sys.argv[1:]))
diff --git a/nixpkgs/pkgs/development/python-modules/cmake/stub/pyproject.toml b/nixpkgs/pkgs/development/python-modules/cmake/stub/pyproject.toml
new file mode 100644
index 000000000000..f5c0502a3b7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cmake/stub/pyproject.toml
@@ -0,0 +1,13 @@
+[build-system]
+requires = ["flit_core"]
+build-backend = "flit_core.buildapi"
+
+[project]
+name = "cmake"
+version = "@version@"
+description = "CMake is an open-source, cross-platform family oftools designed to build, test and package software"
+
+[project.scripts]
+cmake = "cmake:cmake"
+cpack = "cmake:cpack"
+ctest = "cmake:ctest"
diff --git a/nixpkgs/pkgs/development/python-modules/cmarkgfm/default.nix b/nixpkgs/pkgs/development/python-modules/cmarkgfm/default.nix
new file mode 100644
index 000000000000..aaa29b577eed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cmarkgfm/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, cffi
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cmarkgfm";
+  version = "2022.10.27";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-k9msdxbqkBygv9GK47aPH2v1HeCDDD8jPvc0/NUqB5k=";
+  };
+
+  propagatedNativeBuildInputs = [
+    cffi
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "cmarkgfm"
+  ];
+
+  meta = with lib; {
+    description = "Minimal bindings to GitHub's fork of cmark";
+    homepage = "https://github.com/jonparrott/cmarkgfm";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cmd2-ext-test/default.nix b/nixpkgs/pkgs/development/python-modules/cmd2-ext-test/default.nix
new file mode 100644
index 000000000000..4cdf9ccf8dcd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cmd2-ext-test/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, cmd2
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "cmd2-ext-test";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uTc+onurLilwQe0trESR3JGa5WFT1fCt3rRA7rhRpaY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    cmd2
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "cmd2_ext_test"
+  ];
+
+  meta = with lib; {
+    description = "Plugin supports testing of a cmd2 application";
+    homepage = "https://github.com/python-cmd2/cmd2/tree/master/plugins/ext_test";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cmd2/default.nix b/nixpkgs/pkgs/development/python-modules/cmd2/default.nix
new file mode 100644
index 000000000000..996c11955b92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cmd2/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, stdenv
+, attrs
+, buildPythonPackage
+, colorama
+, fetchPypi
+, glibcLocales
+, importlib-metadata
+, pyperclip
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, typing-extensions
+, wcwidth
+}:
+
+buildPythonPackage rec {
+  pname = "cmd2";
+  version = "2.4.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-cYc8Efcr0Z4rHbV4IUcW8NT3yPolAJPGASZamnF97lI=";
+  };
+
+  LC_ALL = "en_US.UTF-8";
+
+  buildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    colorama
+    pyperclip
+    wcwidth
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    glibcLocales
+    pytest-mock
+  ];
+
+  disabledTests = [
+    # Don't require vim for tests, it causes lots of rebuilds
+    "test_find_editor_not_specified"
+    "test_transcript"
+  ];
+
+  postPatch = ''
+    sed -i "/--cov/d" setup.cfg
+  '' + lib.optionalString stdenv.isDarwin ''
+    # Fake the impure dependencies pbpaste and pbcopy
+    mkdir bin
+    echo '#!${stdenv.shell}' > bin/pbpaste
+    echo '#!${stdenv.shell}' > bin/pbcopy
+    chmod +x bin/{pbcopy,pbpaste}
+    export PATH=$(realpath bin):$PATH
+  '';
+
+  doCheck = !stdenv.isDarwin;
+
+  pythonImportsCheck = [
+    "cmd2"
+  ];
+
+  meta = with lib; {
+    description = "Enhancements for standard library's cmd module";
+    homepage = "https://github.com/python-cmd2/cmd2";
+    changelog = "https://github.com/python-cmd2/cmd2/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ teto ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cmdline/default.nix b/nixpkgs/pkgs/development/python-modules/cmdline/default.nix
new file mode 100644
index 000000000000..71273ed1a226
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cmdline/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, pyyaml }:
+
+buildPythonPackage rec {
+  pname = "cmdline";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7cf6af53549892b2218c2f56a199dff54a733be5c5515c0fd626812070b0a86a";
+  };
+
+  # No tests, https://github.com/rca/cmdline/issues/1
+  doCheck = false;
+  propagatedBuildInputs = [ pyyaml ];
+
+  meta = with lib; {
+    description = "Utilities for consistent command line tools";
+    homepage = "https://github.com/rca/cmdline";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cmdstanpy/default.nix b/nixpkgs/pkgs/development/python-modules/cmdstanpy/default.nix
new file mode 100644
index 000000000000..d2c097743c75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cmdstanpy/default.nix
@@ -0,0 +1,84 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, substituteAll
+
+, cmdstan
+
+, pandas
+, numpy
+, tqdm
+, stanio
+, xarray
+
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cmdstanpy";
+  version = "1.2.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "stan-dev";
+    repo = "cmdstanpy";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-1/X5JDvCx21qLNamNQXpg+w3d3DdSRlB+liIv2fThs4=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./use-nix-cmdstan-path.patch;
+      cmdstan = "${cmdstan}/opt/cmdstan";
+    })
+  ];
+
+  postPatch = ''
+    # conftest.py would have used git to clean up, which is unnecessary here
+    rm test/conftest.py
+  '';
+
+  propagatedBuildInputs = [
+    pandas
+    numpy
+    tqdm
+    stanio
+  ];
+
+  passthru.optional-dependencies = {
+    all = [ xarray ];
+  };
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.all;
+
+  disabledTestPaths = [
+    # No need to test these when using Nix
+    "test/test_install_cmdstan.py"
+    "test/test_cxx_installation.py"
+  ];
+
+  disabledTests = [
+    "test_lp_good" # Fails for some reason
+    "test_serialization" # Pickle class mismatch errors
+    # These tests use the flag -DSTAN_THREADS which doesn't work in cmdstan (missing file)
+    "test_multi_proc_threads"
+    "test_compile_force"
+  ];
+
+  pythonImportsCheck = [ "cmdstanpy" ];
+
+  meta = {
+    homepage = "https://github.com/stan-dev/cmdstanpy";
+    description = "A lightweight interface to Stan for Python users";
+    changelog = "https://github.com/stan-dev/cmdstanpy/releases/tag/v${version}";
+    license = lib.licenses.bsd3;
+    platforms = lib.platforms.linux;
+    maintainers = with lib.maintainers; [ tomasajt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cmdstanpy/use-nix-cmdstan-path.patch b/nixpkgs/pkgs/development/python-modules/cmdstanpy/use-nix-cmdstan-path.patch
new file mode 100644
index 000000000000..5f8df43c799f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cmdstanpy/use-nix-cmdstan-path.patch
@@ -0,0 +1,25 @@
+diff --git a/cmdstanpy/utils/cmdstan.py b/cmdstanpy/utils/cmdstan.py
+index 227d97a..27c3ccc 100644
+--- a/cmdstanpy/utils/cmdstan.py
++++ b/cmdstanpy/utils/cmdstan.py
+@@ -163,19 +163,7 @@ def cmdstan_path() -> str:
+     if 'CMDSTAN' in os.environ and len(os.environ['CMDSTAN']) > 0:
+         cmdstan = os.environ['CMDSTAN']
+     else:
+-        cmdstan_dir = os.path.expanduser(os.path.join('~', _DOT_CMDSTAN))
+-        if not os.path.exists(cmdstan_dir):
+-            raise ValueError(
+-                'No CmdStan installation found, run command "install_cmdstan"'
+-                'or (re)activate your conda environment!'
+-            )
+-        latest_cmdstan = get_latest_cmdstan(cmdstan_dir)
+-        if latest_cmdstan is None:
+-            raise ValueError(
+-                'No CmdStan installation found, run command "install_cmdstan"'
+-                'or (re)activate your conda environment!'
+-            )
+-        cmdstan = os.path.join(cmdstan_dir, latest_cmdstan)
++        cmdstan = '@cmdstan@'
+         os.environ['CMDSTAN'] = cmdstan
+     validate_cmdstan_path(cmdstan)
+     return os.path.normpath(cmdstan)
diff --git a/nixpkgs/pkgs/development/python-modules/cmigemo/default.nix b/nixpkgs/pkgs/development/python-modules/cmigemo/default.nix
new file mode 100644
index 000000000000..fb381ec18598
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cmigemo/default.nix
@@ -0,0 +1,37 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, six, cmigemo, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "cmigemo";
+  version = "0.1.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "09j68kvcskav2cqb7pj12caksmj4wh2lhjp0csq00xpn0wqal4vk";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  preConfigure = ''
+    export LDFLAGS="-L${cmigemo}/lib"
+    export CPPFLAGS="-I${cmigemo}/include"
+    export LD_LIBRARY_PATH="${cmigemo}/lib"
+  '';
+
+  postPatch = ''
+    sed -i 's~dict_path_base = "/usr/share/cmigemo"~dict_path_base = "/${cmigemo}/share/migemo"~g' test/test_cmigemo.py
+  '';
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pytestFlagsArray = [ "test/" ];
+
+  pythonImportsCheck = [ "cmigemo" ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    homepage = "https://github.com/mooz/python-cmigemo";
+    description = "A pure python binding for C/Migemo";
+    license = licenses.mit;
+    maintainers = with maintainers; [ illustris ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cmsis-pack-manager/default.nix b/nixpkgs/pkgs/development/python-modules/cmsis-pack-manager/default.nix
new file mode 100644
index 000000000000..6043f1c15565
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cmsis-pack-manager/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, fetchFromGitHub
+, rustPlatform
+, cffi
+, libiconv
+, stdenv
+, darwin
+, buildPythonPackage
+, appdirs
+, pyyaml
+, hypothesis
+, jinja2
+, pytestCheckHook
+, unzip
+}:
+
+buildPythonPackage rec {
+  pname = "cmsis-pack-manager";
+  version = "0.5.2";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pyocd";
+    repo = "cmsis-pack-manager";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-PeyJf3TGUxv8/MKIQUgWrenrK4Hb+4cvtDA2h3r6kGg=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    hash = "sha256-dO4qw5Jx0exwb4RuOhu6qvGxQZ+LayHtXDHZKADLTEI=";
+  };
+
+  nativeBuildInputs = [ rustPlatform.cargoSetupHook rustPlatform.maturinBuildHook ];
+  propagatedNativeBuildInputs = [ cffi ];
+  buildInputs = [ libiconv ]
+    ++ lib.optional stdenv.isDarwin darwin.apple_sdk.frameworks.Security;
+  propagatedBuildInputs = [ appdirs pyyaml ];
+  nativeCheckInputs = [ hypothesis jinja2 pytestCheckHook unzip ];
+
+  # remove cmsis_pack_manager source directory so that binaries can be imported
+  # from the installed wheel instead
+  preCheck = ''
+    rm -r cmsis_pack_manager
+  '';
+
+  disabledTests = [
+    # All require DNS.
+    "test_pull_pdscs"
+    "test_install_pack"
+    "test_pull_pdscs_cli"
+    "test_dump_parts_cli"
+  ];
+
+  meta = with lib; {
+    description = "A Rust and Python module for handling CMSIS Pack files";
+    homepage = "https://github.com/pyocd/cmsis-pack-manager";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ frogamic sbruder ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cmsis-svd/default.nix b/nixpkgs/pkgs/development/python-modules/cmsis-svd/default.nix
new file mode 100644
index 000000000000..cdfdd05e5217
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cmsis-svd/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchFromGitHub, six }:
+
+buildPythonPackage rec {
+  pname = "cmsis-svd";
+  version = "0.4";
+
+  src = fetchFromGitHub {
+    owner = "posborne";
+    repo = pname;
+    rev = "python-${version}";
+    sha256 = "01f2z01gqgx0risqnbrlaqj49fmly30zbwsf7rr465ggnl2c04r0";
+  };
+
+  preConfigure = ''
+    cd python
+  '';
+
+  propagatedBuildInputs = [ six ];
+
+  pythonImportsCheck = [ "cmsis_svd" ];
+
+  meta = with lib; {
+    description = "CMSIS SVD parser";
+    homepage = "https://github.com/posborne/cmsis-svd";
+    maintainers = with maintainers; [ dump_stack ];
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cnvkit/default.nix b/nixpkgs/pkgs/development/python-modules/cnvkit/default.nix
new file mode 100644
index 000000000000..35195b1db529
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cnvkit/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, fetchFromGitHub
+, fetchpatch
+, rPackages
+, buildPythonPackage
+, biopython
+, numpy
+, scipy
+, scikit-learn
+, pandas
+, matplotlib
+, reportlab
+, pysam
+, future
+, pillow
+, pomegranate
+, pyfaidx
+, python
+, pythonOlder
+, R
+}:
+
+buildPythonPackage rec {
+  pname = "cnvkit";
+  version = "0.9.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "etal";
+    repo = "cnvkit";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-mCQXo3abwC06x/g51UBshqUk3dpqEVNUvx+cJ/EdYGQ=";
+  };
+
+  postPatch = ''
+    # see https://github.com/etal/cnvkit/issues/589
+    substituteInPlace setup.py \
+      --replace 'joblib < 1.0' 'joblib'
+    # see https://github.com/etal/cnvkit/issues/680
+    substituteInPlace test/test_io.py \
+      --replace 'test_read_vcf' 'dont_test_read_vcf'
+  '';
+
+  propagatedBuildInputs = [
+    biopython
+    numpy
+    scipy
+    scikit-learn
+    pandas
+    matplotlib
+    reportlab
+    pyfaidx
+    pysam
+    future
+    pillow
+    pomegranate
+    rPackages.DNAcopy
+  ];
+
+  nativeCheckInputs = [ R ];
+
+  checkPhase = ''
+    pushd test/
+    ${python.interpreter} test_io.py
+    ${python.interpreter} test_genome.py
+    ${python.interpreter} test_cnvlib.py
+    ${python.interpreter} test_commands.py
+    ${python.interpreter} test_r.py
+    popd # test/
+  '';
+
+  pythonImportsCheck = [
+    "cnvlib"
+  ];
+
+  meta = with lib; {
+    homepage = "https://cnvkit.readthedocs.io";
+    description = "A Python library and command-line software toolkit to infer and visualize copy number from high-throughput DNA sequencing data";
+    changelog = "https://github.com/etal/cnvkit/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = [ maintainers.jbedo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/co2signal/default.nix b/nixpkgs/pkgs/development/python-modules/co2signal/default.nix
new file mode 100644
index 000000000000..2c7aeb4ceaeb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/co2signal/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "co2signal";
+  version = "0.4.2";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "CO2Signal";
+    hash = "sha256-8YdYbknLICRrZloGUZuscv5e1LIDZBcCPKZs6EMaNuo=";
+  };
+
+  propagatedBuildInputs = [ requests ];
+  # Modules has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "CO2Signal" ];
+
+  meta = with lib; {
+    description = "A package to access the CO2 Signal API ";
+    homepage = "https://github.com/danielsjf/CO2Signal";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ plabadens ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/coapthon3/default.nix b/nixpkgs/pkgs/development/python-modules/coapthon3/default.nix
new file mode 100644
index 000000000000..aa2781a7fd86
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coapthon3/default.nix
@@ -0,0 +1,27 @@
+{ buildPythonPackage, cachetools, fetchFromGitHub, isPy27, lib }:
+
+buildPythonPackage rec {
+  pname = "CoAPthon3";
+  version = "1.0.2";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "Tanganelli";
+    repo = pname;
+    rev = version;
+    hash = "sha256-9QApoPUu3XFZY/lgjAsf5r2StFiRtUd1UXWDrzYUh6w=";
+  };
+
+  propagatedBuildInputs = [ cachetools ];
+
+  # tests take in the order of 10 minutes to execute and sometimes hang forever on tear-down
+  doCheck = false;
+  pythonImportsCheck = [ "coapthon" ];
+
+  meta = with lib; {
+    inherit (src.meta) homepage;
+    description = "Python3 library to the CoAP protocol compliant with the RFC.";
+    license = licenses.mit;
+    maintainers = with maintainers; [ urbas ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cobs/default.nix b/nixpkgs/pkgs/development/python-modules/cobs/default.nix
new file mode 100644
index 000000000000..e5ba04c960fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cobs/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cobs";
+  version = "1.2.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Kvf4eRzeGufGuTb10MNf4p/rEN4l95wVsK8NZyl4PMA=";
+  };
+
+  checkPhase = ''
+    runHook preCheck
+
+    python -m cobs.cobs.test
+    python -m cobs.cobsr.test
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "cobs"
+    "cobs.cobs"
+    "cobs.cobsr"
+  ];
+
+  meta = with lib; {
+    description = "Python functions for encoding and decoding COBS";
+    longDescription = ''
+      COBS is a method of encoding a packet of bytes into a form that contains no bytes with value zero (0x00). The input packet of bytes can contain bytes in the full range of 0x00 to 0xFF. The COBS encoded packet is guaranteed to generate packets with bytes only in the range 0x01 to 0xFF. Thus, in a communication protocol, packet boundaries can be reliably delimited with 0x00 bytes.
+    '';
+    homepage = "https://github.com/cmcqueen/cobs-python/";
+    license = licenses.mit;
+    maintainers = [ teams.ororatech ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cock/default.nix b/nixpkgs/pkgs/development/python-modules/cock/default.nix
new file mode 100644
index 000000000000..47e3364ea0b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cock/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi, click, sortedcontainers, pyyaml }:
+
+buildPythonPackage rec {
+  pname = "cock";
+  version = "0.11.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Hi8aFxATsYcEO6qNzZnF73V8WLTQjb6Dw2xF4VgT2o4=";
+  };
+
+  propagatedBuildInputs = [ click sortedcontainers pyyaml ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pohmelie/cock";
+    description = "Configuration file with click";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/coconut/default.nix b/nixpkgs/pkgs/development/python-modules/coconut/default.nix
new file mode 100644
index 000000000000..07e070d0493e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coconut/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cpyparsing
+, ipykernel
+, mypy
+, pexpect
+, pygments
+, pytestCheckHook
+, prompt-toolkit
+, tkinter
+, watchdog
+}:
+
+buildPythonPackage rec {
+  pname = "coconut";
+  version = "3.0.3";
+
+  src = fetchFromGitHub {
+    owner = "evhub";
+    repo = "coconut";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-u1tcIu0U1VZrUx2hVdtRDv1N4jVf176kQSw47/7lOXY=";
+  };
+
+  propagatedBuildInputs = [ cpyparsing ipykernel mypy pygments prompt-toolkit watchdog ];
+
+  nativeCheckInputs = [ pexpect pytestCheckHook tkinter ];
+
+  # Currently most tests have performance issues
+  pytestFlagsArray = [
+    "coconut/tests/constants_test.py"
+  ];
+
+  pythonImportsCheck = [ "coconut" ];
+
+  meta = with lib; {
+    homepage = "http://coconut-lang.org/";
+    description = "Simple, elegant, Pythonic functional programming";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fabianhjr ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cocotb-bus/default.nix b/nixpkgs/pkgs/development/python-modules/cocotb-bus/default.nix
new file mode 100644
index 000000000000..02b9d7184906
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cocotb-bus/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "cocotb-bus";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a197aa4b0e0ad28469c8877b41b3fb2ec0206da9f491b9276d1578ce6dd8aa8d";
+  };
+
+  postPatch = ''
+    # remove circular dependency cocotb from setup.py
+    substituteInPlace setup.py --replace '"cocotb>=1.5.0.dev,<2.0"' ""
+  '';
+
+  # tests require cocotb, disable for now to avoid circular dependency
+  doCheck = false;
+
+  # checkPhase = ''
+  #   export PATH=$out/bin:$PATH
+  #   make test
+  # '';
+
+  meta = with lib; {
+    description = "Pre-packaged testbenching tools and reusable bus interfaces for cocotb";
+    homepage = "https://github.com/cocotb/cocotb-bus";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cocotb/0001-Patch-LDCXXSHARED-for-macOS-along-with-LDSHARED.patch b/nixpkgs/pkgs/development/python-modules/cocotb/0001-Patch-LDCXXSHARED-for-macOS-along-with-LDSHARED.patch
new file mode 100644
index 000000000000..38ca864add3b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cocotb/0001-Patch-LDCXXSHARED-for-macOS-along-with-LDSHARED.patch
@@ -0,0 +1,26 @@
+From 94c4768cd69b026e498d92133dd6c7d8589cf911 Mon Sep 17 00:00:00 2001
+From: Jiajie Chen <c@jia.je>
+Date: Sat, 25 Jun 2022 10:19:44 +0800
+Subject: [PATCH] Patch LDCXXSHARED for macOS along with LDSHARED
+
+In Nixpkgs, we patched distutils to respect LDCXXSHARED environment, so
+the replacement should be taken on LDCXXSHARED as well.
+---
+ cocotb_build_libs.py | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/cocotb_build_libs.py b/cocotb_build_libs.py
+index 66097ec2..d5555b36 100755
+--- a/cocotb_build_libs.py
++++ b/cocotb_build_libs.py
+@@ -583,6 +583,7 @@ def get_ext():
+ 
+     if sys.platform == "darwin":
+         cfg_vars["LDSHARED"] = cfg_vars["LDSHARED"].replace("-bundle", "-dynamiclib")
++        cfg_vars["LDCXXSHARED"] = cfg_vars["LDCXXSHARED"].replace("-bundle", "-dynamiclib")
+ 
+     share_lib_dir = os.path.relpath(os.path.join(cocotb_share_dir, "lib"))
+     include_dir = os.path.relpath(os.path.join(cocotb_share_dir, "include"))
+-- 
+2.36.1
+
diff --git a/nixpkgs/pkgs/development/python-modules/cocotb/default.nix b/nixpkgs/pkgs/development/python-modules/cocotb/default.nix
new file mode 100644
index 000000000000..e8c78e1b91c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cocotb/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, cocotb-bus
+, find-libpython
+, pytestCheckHook
+, swig
+, verilog
+, ghdl
+}:
+
+buildPythonPackage rec {
+  pname = "cocotb";
+  version = "1.8.1";
+
+  # pypi source doesn't include tests
+  src = fetchFromGitHub {
+    owner = "cocotb";
+    repo = "cocotb";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-B7SePM8muEL3KFVOY7+OAgQVIRvTs6k29xASK9lgCB4=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  buildInputs = [ setuptools ];
+  propagatedBuildInputs = [ find-libpython ];
+
+  postPatch = ''
+    patchShebangs bin/*.py
+
+    # POSIX portability (TODO: upstream this)
+    for f in \
+      cocotb/share/makefiles/Makefile.* \
+      cocotb/share/makefiles/simulators/Makefile.*
+    do
+      substituteInPlace $f --replace 'shell which' 'shell command -v'
+    done
+
+    # remove circular dependency cocotb-bus from setup.py
+    substituteInPlace setup.py --replace "'cocotb-bus<1.0'" ""
+  '' + lib.optionalString stdenv.isDarwin ''
+    # disable lto on darwin
+    # https://github.com/NixOS/nixpkgs/issues/19098
+    substituteInPlace cocotb_build_libs.py --replace "-flto" ""
+  '';
+
+  patches = [
+    # Fix "can't link with bundle (MH_BUNDLE) only dylibs (MH_DYLIB) file" error
+    ./0001-Patch-LDCXXSHARED-for-macOS-along-with-LDSHARED.patch
+  ];
+
+  nativeCheckInputs = [ cocotb-bus pytestCheckHook swig verilog ghdl ];
+  preCheck = ''
+    export PATH=$out/bin:$PATH
+    mv cocotb cocotb.hidden
+  '';
+
+  pythonImportsCheck = [ "cocotb" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/cocotb/cocotb/releases/tag/v${version}";
+    description = "Coroutine based cosimulation library for writing VHDL and Verilog testbenches in Python";
+    homepage = "https://github.com/cocotb/cocotb";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ matthuszagh jleightcap ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/codecov/default.nix b/nixpkgs/pkgs/development/python-modules/codecov/default.nix
new file mode 100644
index 000000000000..4aaf0a403be0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/codecov/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, coverage
+, ddt
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "codecov";
+  version = "2.1.13";
+
+  src = fetchFromGitHub {
+    owner = "codecov";
+    repo = "codecov-python";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-cZEpAw8uv/XGiGzdBZ9MnabNaTP0did2GT+BkKMJM/E=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    coverage
+  ];
+
+  nativeCheckInputs = [
+    ddt
+    mock
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [ "tests/test.py" ];
+
+  disabledTests = [
+    # No git repo available and network
+    "test_bowerrc_none"
+    "test_prefix"
+    "test_send"
+  ];
+
+  pythonImportsCheck = [ "codecov" ];
+
+  meta = with lib; {
+    description = "Python report uploader for Codecov";
+    homepage = "https://codecov.io/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/codepy/default.nix b/nixpkgs/pkgs/development/python-modules/codepy/default.nix
new file mode 100644
index 000000000000..ccf1eeaad9ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/codepy/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytools
+, appdirs
+, six
+, cgen
+}:
+
+buildPythonPackage rec {
+  pname = "codepy";
+  version = "2019.1";
+
+  src = fetchFromGitHub {
+    owner = "inducer";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-viMfB/nDrvDA/IGRZEX+yXylxbbmqbh/fgdYXBzK0zM=";
+  };
+
+  buildInputs = [ pytools six cgen ];
+  propagatedBuildInputs = [ appdirs ];
+
+  pythonImportsCheck = [ "codepy" ];
+
+  # Tests are broken
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/inducer/codepy";
+    description = "Generate and execute native code at run time, from Python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ atila ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/coffea/default.nix b/nixpkgs/pkgs/development/python-modules/coffea/default.nix
new file mode 100644
index 000000000000..47f98327cb37
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coffea/default.nix
@@ -0,0 +1,98 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, hatch-vcs
+, awkward
+, uproot
+, dask
+, dask-awkward
+, dask-histogram
+, correctionlib
+, pyarrow
+, fsspec
+, matplotlib
+, numba
+, numpy
+, scipy
+, tqdm
+, lz4
+, cloudpickle
+, toml
+, mplhep
+, packaging
+, pandas
+, hist
+, cachetools
+, distributed
+, pyinstrument
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "coffea";
+  version = "2023.10.0.rc1";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "CoffeaTeam";
+    repo = "coffea";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-1mfTuZDfkD0NjcmSoXN3BLC5o+dWvw+r65ukZTZf8j4=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "numba>=0.58.0" "numba" \
+      --replace "numpy>=1.22.0,<1.26" "numpy"
+  '';
+
+  nativeBuildInputs = [
+    hatchling
+    hatch-vcs
+  ];
+
+  propagatedBuildInputs = [
+    awkward
+    uproot
+    dask
+    dask.optional-dependencies.array
+    dask-awkward
+    dask-histogram
+    correctionlib
+    pyarrow
+    fsspec
+    matplotlib
+    numba
+    numpy
+    scipy
+    tqdm
+    lz4
+    cloudpickle
+    toml
+    mplhep
+    packaging
+    pandas
+    hist
+    cachetools
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeCheckInputs = [
+    distributed
+    pyinstrument
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "coffea"
+  ];
+
+  meta = with lib; {
+    description = "Basic tools and wrappers for enabling not-too-alien syntax when running columnar Collider HEP analysis";
+    homepage = "https://github.com/CoffeaTeam/coffea";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cogapp/default.nix b/nixpkgs/pkgs/development/python-modules/cogapp/default.nix
new file mode 100644
index 000000000000..92dbe23cd916
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cogapp/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "cogapp";
+  version = "3.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1be95183f70282422d594fa42426be6923070a4bd8335621f6347f3aeee81db0";
+  };
+
+  # there are no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A code generator for executing Python snippets in source files";
+    homepage = "https://nedbatchelder.com/code/cog";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lovek323 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cohere/default.nix b/nixpkgs/pkgs/development/python-modules/cohere/default.nix
new file mode 100644
index 000000000000..36e7a2744685
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cohere/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, poetry-core
+, pythonOlder
+, aiohttp
+, backoff
+, fastavro
+, importlib-metadata
+, requests
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "cohere";
+  version = "4.32";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-OAd0e+mE8hHc6RHBM1vXE68qwrcPcpZ4OB5v9uRQ5oE=";
+  };
+
+  patches = [
+    # https://github.com/cohere-ai/cohere-python/pull/289
+    (fetchpatch {
+      name = "replace-poetry-with-poetry-core.patch";
+      url = "https://github.com/cohere-ai/cohere-python/commit/e86480336331c0cf6f67e26b0825467dfca5b277.patch";
+      hash = "sha256-P1Ioq5ypzT3tx6cxrI3ep34Fi4cUx88YkfJ5ErN3VHk=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    backoff
+    fastavro
+    importlib-metadata
+    requests
+    urllib3
+  ];
+
+  # tests require CO_API_KEY
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "cohere"
+  ];
+
+  meta = with lib; {
+    description = "Simplify interfacing with the Cohere API";
+    homepage = "https://docs.cohere.com/docs";
+    changelog = "https://github.com/cohere-ai/cohere-python/blob/main/CHANGELOG.md#${builtins.replaceStrings ["."] [""] version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/coincurve/default.nix b/nixpkgs/pkgs/development/python-modules/coincurve/default.nix
new file mode 100644
index 000000000000..1ad80f6d6694
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coincurve/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, asn1crypto
+, autoconf
+, automake
+, cffi
+, libtool
+, pkg-config
+, pytestCheckHook
+, python
+, pythonOlder
+, secp256k1
+}:
+
+buildPythonPackage rec {
+  pname = "coincurve";
+  version = "18.0.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ofek";
+    repo = "coincurve";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Z5g6ten8wNICoFu7+aZc6r8ET+RDmFeb93ONjsTzcbw=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace ", 'requests'" ""
+
+    # don't try to load .dll files
+    rm coincurve/_windows_libsecp256k1.py
+    cp -r --no-preserve=mode ${secp256k1.src} libsecp256k1
+    patchShebangs secp256k1/autogen.sh
+  '';
+
+  nativeBuildInputs = [
+    autoconf
+    automake
+    libtool
+    pkg-config
+  ];
+
+  propagatedBuildInputs = [
+    asn1crypto
+    cffi
+  ];
+
+  preCheck = ''
+    # https://github.com/ofek/coincurve/blob/master/tox.ini#L20-L22=
+    rm -rf coincurve
+
+    # don't run benchmark tests
+    rm tests/test_bench.py
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "coincurve"
+  ];
+
+  meta = with lib; {
+    description = "Cross-platform bindings for libsecp256k1";
+    homepage = "https://github.com/ofek/coincurve";
+    license = with licenses; [ asl20 mit ];
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/coinmetrics-api-client/default.nix b/nixpkgs/pkgs/development/python-modules/coinmetrics-api-client/default.nix
new file mode 100644
index 000000000000..443d24d3f695
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coinmetrics-api-client/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, orjson
+, pandas
+, poetry-core
+, pytest-mock
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pythonRelaxDepsHook
+, requests
+, tqdm
+, typer
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "coinmetrics-api-client";
+  version = "2023.11.27.17";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  __darwinAllowLocalNetworking = true;
+
+  src = fetchPypi {
+    inherit version;
+    pname = "coinmetrics_api_client";
+    hash = "sha256-UDcegRnDtz6LYAN9S8wiW/TCsIsQHr5sSX+chEkeFnw=";
+  };
+
+  pythonRelaxDeps = [
+    "typer"
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    orjson
+    python-dateutil
+    requests
+    typer
+    tqdm
+    websocket-client
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+  ] ++ passthru.optional-dependencies.pandas;
+
+  pythonImportsCheck = [
+    "coinmetrics.api_client"
+  ];
+
+  passthru = {
+    optional-dependencies = {
+      pandas = [
+        pandas
+      ];
+    };
+  };
+
+  meta = with lib; {
+    description = "Coin Metrics API v4 client library";
+    homepage = "https://coinmetrics.github.io/api-client-python/site/index.html";
+    license = licenses.mit;
+    maintainers = with maintainers; [ centromere ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/colander/default.nix b/nixpkgs/pkgs/development/python-modules/colander/default.nix
new file mode 100644
index 000000000000..27111e1b267b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colander/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, babel
+, translationstring
+, iso8601
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "colander";
+  version = "2.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QZzWgXjS7m7kyuXVyxgwclY0sKKECRcVbonrJZIjfvM=";
+  };
+
+  nativeBuildInputs = [
+    babel
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    translationstring
+    iso8601
+  ];
+
+  pythonImportsCheck = [
+    "colander"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A simple schema-based serialization and deserialization library";
+    homepage = "https://github.com/Pylons/colander";
+    license = licenses.free; # http://repoze.org/LICENSE.txt
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/colanderalchemy/default.nix b/nixpkgs/pkgs/development/python-modules/colanderalchemy/default.nix
new file mode 100644
index 000000000000..1c45b6b619e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colanderalchemy/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, colander
+, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "colanderclchemy";
+  version = "0.3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "006wcfch2skwvma9bq3l06dyjnz309pa75h1rviq7i4pd9g463bl";
+  };
+
+  propagatedBuildInputs = [ colander sqlalchemy ];
+
+  # Tests are not included in Pypi
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Autogenerate Colander schemas based on SQLAlchemy models";
+    homepage = "https://github.com/stefanofontanelli/ColanderAlchemy";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/collections-extended/default.nix b/nixpkgs/pkgs/development/python-modules/collections-extended/default.nix
new file mode 100644
index 000000000000..d1545d36b376
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/collections-extended/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hypothesis
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "collections-extended";
+  version = "2.0.2";
+  format = "pyproject";
+
+  # https://github.com/mlenzen/collections-extended/issues/198
+  disabled = pythonOlder "3.6" || pythonAtLeast "3.11";
+
+  src = fetchFromGitHub {
+    owner = "mlenzen";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-cK13+CQUELKSiLpG747+C+RB5b6luu0mWLLXTT+uGH4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "collections_extended"
+  ];
+
+  meta = with lib; {
+    description = "Extra Python Collections - bags (multisets), setlists (unique list/indexed set), RangeMap and IndexedDict";
+    homepage = "https://github.com/mlenzen/collections-extended";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ exarkun ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/colorama/default.nix b/nixpkgs/pkgs/development/python-modules/colorama/default.nix
new file mode 100644
index 000000000000..747823f2dd9e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colorama/default.nix
@@ -0,0 +1,26 @@
+{ lib, fetchPypi, buildPythonPackage, hatchling, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "colorama";
+  version = "0.4.6";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44";
+  };
+
+  nativeBuildInputs = [ hatchling ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "colorama" ];
+
+  meta = with lib; {
+    description = "Cross-platform colored terminal text";
+    homepage = "https://github.com/tartley/colorama";
+    changelog = "https://github.com/tartley/colorama/raw/${version}/CHANGELOG.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/colorcet/default.nix b/nixpkgs/pkgs/development/python-modules/colorcet/default.nix
new file mode 100644
index 000000000000..9167fd5a4f26
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colorcet/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, param
+, pyct
+, pytest-mpl
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "colorcet";
+  version = "3.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-UUVaIDU9EvrJH5U3cthAnyR05qDbGvP6T3AF9AWiSAs=";
+  };
+
+  propagatedBuildInputs = [
+    param
+    pyct
+  ];
+
+  nativeCheckInputs = [
+    pytest-mpl
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+    mkdir -p $HOME/.config/matplotlib
+    echo "backend: ps" > $HOME/.config/matplotlib/matplotlibrc
+    ln -s $HOME/.config/matplotlib $HOME/.matplotlib
+  '';
+
+  disabledTests = [
+    "matplotlib_default_colormap_plot"
+  ];
+
+  pythonImportsCheck = [
+    "colorcet"
+  ];
+
+  meta = with lib; {
+    description = "Collection of perceptually uniform colormaps";
+    homepage = "https://colorcet.pyviz.org";
+    license = licenses.cc-by-40;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/colorclass/default.nix b/nixpkgs/pkgs/development/python-modules/colorclass/default.nix
new file mode 100644
index 000000000000..f1a153ee1bc9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colorclass/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "colorclass";
+  version = "2.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6d4fe287766166a98ca7bc6f6312daf04a0481b1eda43e7173484051c0ab4366";
+  };
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/Robpol86/colorclass";
+    license = licenses.mit;
+    description = "Automatic support for console colors";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/colored-traceback/default.nix b/nixpkgs/pkgs/development/python-modules/colored-traceback/default.nix
new file mode 100644
index 000000000000..137b4d0157e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colored-traceback/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "colored-traceback";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bafOKx2oafa7VMkntBW5VyfEu22ahMRhXqd9mHKRGwU=";
+  };
+
+  buildInputs = [ pygments ];
+
+  # No setuptools tests for the package.
+  doCheck = false;
+
+  pythonImportsCheck = [ "colored_traceback" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/staticshock/colored-traceback.py";
+    description = "Automatically color Python's uncaught exception tracebacks";
+    license = licenses.isc;
+    maintainers = with maintainers; [ pamplemousse ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/colored/default.nix b/nixpkgs/pkgs/development/python-modules/colored/default.nix
new file mode 100644
index 000000000000..af696f384f15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colored/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitLab
+, flit-core
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "colored";
+  version = "2.2.3";
+  format = "pyproject";
+
+  src = fetchFromGitLab {
+    owner = "dslackw";
+    repo = "colored";
+    rev = "refs/tags/${version}";
+    hash = "sha256-4APFAIN+cmPPd6qbqVC9iU4YntNEjoPbJXZywG1hsBY=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  unittestFlagsArray = [
+    "unittests"
+  ];
+
+  pythonImportsCheck = [
+    "colored"
+  ];
+
+  meta = with lib; {
+    description = "Simple library for color and formatting to terminal";
+    homepage = "https://gitlab.com/dslackw/colored";
+    changelog = "https://gitlab.com/dslackw/colored/-/raw/${version}/CHANGES.md";
+    maintainers = with maintainers; [ ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/coloredlogs/default.nix b/nixpkgs/pkgs/development/python-modules/coloredlogs/default.nix
new file mode 100644
index 000000000000..44c47f569ebb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coloredlogs/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, humanfriendly
+, verboselogs
+, capturer
+, pytestCheckHook
+, mock
+, util-linux
+}:
+
+buildPythonPackage rec {
+  pname = "coloredlogs";
+  version = "15.0.1";
+
+  src = fetchFromGitHub {
+    owner = "xolox";
+    repo = "python-coloredlogs";
+    rev = version;
+    hash = "sha256-TodI2Wh8M0qMM2K5jzqlLmUKILa5+5qq4ByLttmAA7E=";
+  };
+
+  propagatedBuildInputs = [
+    humanfriendly
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+    util-linux
+    verboselogs
+    capturer
+  ];
+
+  # capturer is broken on darwin / py38, so we skip the test until a fix for
+  # https://github.com/xolox/python-capturer/issues/10 is released.
+  doCheck = !stdenv.isDarwin;
+
+  preCheck = ''
+    # Required for the CLI test
+    PATH=$PATH:$out/bin
+  '';
+
+  disabledTests = [
+    "test_plain_text_output_format"
+    "test_auto_install"
+  ];
+
+  pythonImportsCheck = [ "coloredlogs" ];
+
+  meta = with lib; {
+    description = "Colored stream handler for Python's logging module";
+    homepage = "https://github.com/xolox/python-coloredlogs";
+    license = licenses.mit;
+    maintainers = with maintainers; [ eyjhb ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/colorful/default.nix b/nixpkgs/pkgs/development/python-modules/colorful/default.nix
new file mode 100644
index 000000000000..d57be5da2b4c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colorful/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "colorful";
+  version = "0.5.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "timofurrer";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-fgxbj1WE9JcGt+oEcBguL0wQEWIn5toRTLWsvCFO3k8=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "colorful"
+  ];
+
+  meta = with lib; {
+    description = "Library for terminal string styling";
+    homepage = "https://github.com/timofurrer/colorful";
+    changelog = "https://github.com/timofurrer/colorful/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kalbasit ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/colorlog/default.nix b/nixpkgs/pkgs/development/python-modules/colorlog/default.nix
new file mode 100644
index 000000000000..833217bdb887
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colorlog/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "colorlog";
+  version = "6.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vZS9IcHhP6x70xU/S8On3A6wl0uLwv3xqYnkdPblguU=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "colorlog" ];
+
+  meta = with lib; {
+    description = "Log formatting with colors";
+    homepage = "https://github.com/borntyping/python-colorlog";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/colorlover/default.nix b/nixpkgs/pkgs/development/python-modules/colorlover/default.nix
new file mode 100644
index 000000000000..d255ff0992f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colorlover/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "colorlover";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b8fb7246ab46e1f5e6715649453c1762e245a515de5ff2d2b4aab7a6e67fa4e2";
+  };
+
+  # no tests included in distributed archive
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/jackparmer/colorlover";
+    description = "Color scales in Python for humans";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/colormath/default.nix b/nixpkgs/pkgs/development/python-modules/colormath/default.nix
new file mode 100644
index 000000000000..33f233443dd4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colormath/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, networkx
+, nose
+, numpy
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "colormath";
+  # Switch to unstable which fixes an deprecation issue with newer numpy
+  # versions, should be included in versions > 3.0
+  # https://github.com/gtaylor/python-colormath/issues/104
+  version = "unstable-2021-04-17";
+
+  src = fetchFromGitHub {
+    owner = "gtaylor";
+    repo = "python-colormath";
+    rev = "4a076831fd5136f685aa7143db81eba27b2cd19a";
+    hash = "sha256-eACVPIQFgiGiVmQ/PjUxP/UH/hBOsCywz5PlgpA4dk4=";
+  };
+
+  propagatedBuildInputs = [ networkx numpy ];
+
+  nativeCheckInputs = [ nose ];
+
+  checkPhase = "nosetests";
+
+  pythonImportsCheck = [ "colormath" ];
+
+  meta = with lib; {
+    description = "Color math and conversion library";
+    homepage = "https://github.com/gtaylor/python-colormath";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ jonathanreeve ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/colorspacious/default.nix b/nixpkgs/pkgs/development/python-modules/colorspacious/default.nix
new file mode 100644
index 000000000000..6f75d343066a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colorspacious/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "colorspacious";
+  version = "1.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "065n24zbm9ymy2gvf03vx5cggk1258vcjdaw8jn9v26arpl7542y";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  meta = {
+    homepage = "https://github.com/njsmith/colorspacious";
+    description = "A powerful, accurate, and easy-to-use Python library for doing colorspace conversions ";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ tbenst ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/colorthief/default.nix b/nixpkgs/pkgs/development/python-modules/colorthief/default.nix
new file mode 100644
index 000000000000..cdb37df3e392
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colorthief/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "colorthief";
+  version = "0.2.1";
+
+  src = fetchFromGitHub {
+    owner = "fengsp";
+    repo = "color-thief-py";
+    rev = version;
+    sha256 = "0lzpflal1iqbj4k7hayss5z024qf2sn8c3wxw03a0mgxg06ca2hm";
+  };
+
+  propagatedBuildInputs = [
+    pillow
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "colorthief" ];
+
+  meta = with lib; {
+    description = "Python module for grabbing the color palette from an image";
+    homepage = "https://github.com/fengsp/color-thief-py";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/colorzero/default.nix b/nixpkgs/pkgs/development/python-modules/colorzero/default.nix
new file mode 100644
index 000000000000..e2383dddf4de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colorzero/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pkginfo
+, pytestCheckHook
+}:
+
+
+buildPythonPackage rec {
+  pname = "colorzero";
+  version = "2.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "waveform80";
+    repo = pname;
+    rev = "refs/tags/release-${version}";
+    hash = "sha256-0NoQsy86OHQNLZsTEuF5s2MlRUoacF28jNeHgFKAH14=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov" ""
+  '';
+
+  nativeBuildInputs = [
+    pkginfo
+  ];
+
+  pythonImportsCheck = [
+    "colorzero"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Yet another Python color library";
+    homepage = "https://github.com/waveform80/colorzero";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/colour/default.nix b/nixpkgs/pkgs/development/python-modules/colour/default.nix
new file mode 100644
index 000000000000..2dd31a02bbe7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colour/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "colour";
+  version = "0.1.5";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ryASD+/Sr+3osAH77y6p2nCtfUn6/bZIkCXa6HRcOu4=";
+  };
+
+  patches = [
+    # https://github.com/vaab/colour/pull/66 (but does not merge cleanly)
+    ./remove-unmaintained-d2to1.diff
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--doctest-glob=\"*.rst\""
+    "--doctest-modules"
+  ];
+
+  pythonImportsCheck = [
+    "colour"
+  ];
+
+  meta = with lib; {
+    description = "Converts and manipulates common color representation (RGB, HSV, web, ...)";
+    homepage = "https://github.com/vaab/colour";
+    license = licenses.bsd2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/colour/remove-unmaintained-d2to1.diff b/nixpkgs/pkgs/development/python-modules/colour/remove-unmaintained-d2to1.diff
new file mode 100644
index 000000000000..2cac787bf501
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colour/remove-unmaintained-d2to1.diff
@@ -0,0 +1,65 @@
+diff --git a/setup.cfg b/setup.cfg
+index 41de928..1c18182 100644
+--- a/setup.cfg
++++ b/setup.cfg
+@@ -1,18 +1,14 @@
+ [metadata]
+ name = colour
+ version = 0.1.5
+-summary = converts and manipulates various color representation (HSL, RVB, web, X11, ...)
+-description-file = 
+-	README.rst
+-	CHANGELOG.rst
+-	TODO.rst
+-license_file = LICENSE
+-requires-dist = 
++description = converts and manipulates various color representation (HSL, RVB, web, X11, ...)
++long_description = file: README.rst, CHANGELOG.rst, TODO.rst
++license_files = LICENSE
+ author = Valentin LAB
+ author_email = valentin.lab@kalysto.org
+-home_page = http://github.com/vaab/colour
++url = http://github.com/vaab/colour
+ license = BSD 3-Clause License
+-classifier = 
++classifiers = 
+ 	Programming Language :: Python
+ 	Topic :: Software Development :: Libraries :: Python Modules
+ 	Development Status :: 3 - Alpha
+@@ -26,16 +22,8 @@ classifier =
+ 	Programming Language :: Python :: 3.5
+ 	Programming Language :: Python :: 3.6
+ 
+-[files]
+-modules = colour
+-extra_files = 
+-	README.rst
+-	CHANGELOG.rst
+-	TODO.rst
+-	setup.py
+-
+-[backwards_compat]
+-zip-safe = False
++[options]
++zip_safe = False
+ 
+ [bdist_wheel]
+ universal = 1
+diff --git a/setup.py b/setup.py
+index 47038f9..11a8d3a 100644
+--- a/setup.py
++++ b/setup.py
+@@ -54,12 +54,4 @@ if "%%short-version%%".startswith("%%"):
+     sys.exit(errlvl)
+ 
+ 
+-##
+-## Normal d2to1 setup
+-##
+-
+-setup(
+-    setup_requires=['d2to1'],
+-    extras_require={'test': ['nose', ]},
+-    d2to1=True
+-)
++setup(extras_require={'test': ['nose', ]})
diff --git a/nixpkgs/pkgs/development/python-modules/colout/default.nix b/nixpkgs/pkgs/development/python-modules/colout/default.nix
new file mode 100644
index 000000000000..0679270200d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/colout/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, babel
+, buildPythonPackage
+, fetchFromGitHub
+, pygments
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "colout";
+  version = "1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nojhan";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-7Dtf87erBElqVgqRx8BYHYOWv1uI84JJ0LHrcneczCI=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    babel
+    pygments
+  ];
+
+  pythonImportsCheck = [
+    "colout"
+  ];
+
+  # This project does not have a unit test
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Color Up Arbitrary Command Output";
+    homepage = "https://github.com/nojhan/colout";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ badele ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cometblue-lite/default.nix b/nixpkgs/pkgs/development/python-modules/cometblue-lite/default.nix
new file mode 100644
index 000000000000..89af6333ae90
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cometblue-lite/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, bleak
+, bleak-retry-connector
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cometblue-lite";
+  version = "0.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "neffs";
+    repo = "python-cometblue_lite";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Cjd7PdZ2/neRr1jStDY5iJaGMJ/srnFmCea8aLNan6g=";
+  };
+
+  propagatedBuildInputs = [
+    bleak
+    bleak-retry-connector
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "cometblue_lite"
+  ];
+
+  meta = with lib; {
+    description = "Module for Eurotronic Comet Blue thermostats";
+    homepage = "https://github.com/neffs/python-cometblue_lite";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/comicon/default.nix b/nixpkgs/pkgs/development/python-modules/comicon/default.nix
new file mode 100644
index 000000000000..8d69ae0fc744
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/comicon/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, ebooklib
+, lxml
+, pillow
+, pypdf
+}:
+
+buildPythonPackage rec {
+  pname = "comicon";
+  version = "1.0.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "potatoeggy";
+    repo = "comicon";
+    rev = "v${version}";
+    hash = "sha256-D6nK+GlcG/XqMTH7h7mJcbZCRG2xDHRsnooSTtphDNs=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    ebooklib
+    lxml
+    pillow
+    pypdf
+  ];
+
+  pythonImportsCheck = [ "comicon" ];
+
+  meta = with lib; {
+    description = "Lightweight comic converter library between CBZ, PDF, and EPUB";
+    homepage = "https://github.com/potatoeggy/comicon";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ Scrumplex ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/comm/default.nix b/nixpkgs/pkgs/development/python-modules/comm/default.nix
new file mode 100644
index 000000000000..627c1630489d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/comm/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, traitlets
+, pytestCheckHook
+}:
+
+let
+  pname = "comm";
+  version = "0.1.4";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "ipython";
+    repo = "comm";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-6GvAyiTm+zQ5sSynuJhAg50PaMTY9EFqVVsD3K2wTkY=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    traitlets
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc";
+    homepage = "https://github.com/ipython/comm";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/command_runner/default.nix b/nixpkgs/pkgs/development/python-modules/command_runner/default.nix
new file mode 100644
index 000000000000..f5f8586d1319
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/command_runner/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, psutil }:
+
+buildPythonPackage rec {
+  pname = "command_runner";
+  version = "1.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-UIDzLLIm69W53jvS9M2LVclM+OqRYmLtvuXVAv54ltg=";
+  };
+
+  propagatedBuildInputs = [ psutil ];
+
+  meta = with lib; {
+    homepage = "https://github.com/netinvent/command_runner";
+    description = ''
+      Platform agnostic command execution, timed background jobs with live
+      stdout/stderr output capture, and UAC/sudo elevation
+    '';
+    license = licenses.bsd3;
+    maintainers = teams.wdz.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/commandparse/default.nix b/nixpkgs/pkgs/development/python-modules/commandparse/default.nix
new file mode 100644
index 000000000000..e146649604f0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/commandparse/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "commandparse";
+  version = "1.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-S9e90BtS6qMjFtYUmgC0w4IKQP8q1iR2tGqq5l2+n6o=";
+  };
+
+  # tests only distributed upstream source, not PyPi
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "commandparse"
+  ];
+
+  meta = with lib; {
+    description = "Python module to parse command based CLI application";
+    homepage = "https://github.com/flgy/commandparse";
+    license = with licenses; [ mit ];
+    maintainers = [ maintainers.fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/commentjson/default.nix b/nixpkgs/pkgs/development/python-modules/commentjson/default.nix
new file mode 100644
index 000000000000..d40de1ad8c2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/commentjson/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchFromGitHub, six, lark, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "commentjson";
+  version = "0.9.0";
+
+  src = fetchFromGitHub {
+    owner = "vaidik";
+    repo = "commentjson";
+    rev = "v${version}";
+    hash = "sha256-dPnIcv7TIeyG7rU938w7FrDklmaGuPpXz34uw/JjOgY=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "lark-parser>=0.7.1,<0.8.0" "lark"
+
+    # NixOS is missing test.test_json module
+    rm -r commentjson/tests/test_json
+  '';
+
+  propagatedBuildInputs = [ lark six ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "commentjson" ];
+
+  meta = with lib; {
+    description = "Add JavaScript or Python style comments in JSON";
+    homepage = "https://github.com/vaidik/commentjson/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/commoncode/default.nix b/nixpkgs/pkgs/development/python-modules/commoncode/default.nix
new file mode 100644
index 000000000000..98c6492194c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/commoncode/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, stdenv
+, attrs
+, beautifulsoup4
+, buildPythonPackage
+, click
+, fetchPypi
+, pytest-xdist
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, requests
+, saneyaml
+, setuptools-scm
+, text-unidecode
+}:
+
+buildPythonPackage rec {
+  pname = "commoncode";
+  version = "31.0.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ura55/m/iesqN6kSYmdHB1sbthSHXaFWiQ76wVmyl0E=";
+  };
+
+  dontConfigure = true;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    beautifulsoup4
+    click
+    requests
+    saneyaml
+    text-unidecode
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-xdist
+  ];
+
+  disabledTests = [
+    # chinese character translates different into latin
+    "test_safe_path_posix_style_chinese_char"
+    # OSError: [Errno 84] Invalid or incomplete multibyte or wide character
+    "test_os_walk_can_walk_non_utf8_path_from_unicode_path"
+    "test_resource_iter_can_walk_non_utf8_path_from_unicode_path"
+    "test_walk_can_walk_non_utf8_path_from_unicode_path"
+    "test_resource_iter_can_walk_non_utf8_path_from_unicode_path_with_dirs"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # expected result is tailored towards the quirks of upstream's
+    # CI environment on darwin
+    "test_searchable_paths"
+  ];
+
+  disabledTestPaths = lib.optionals (pythonAtLeast "3.10") [
+    # https://github.com/nexB/commoncode/issues/36
+    "src/commoncode/fetch.py"
+  ];
+
+  pythonImportsCheck = [
+    "commoncode"
+  ];
+
+  meta = with lib; {
+    description = "A set of common utilities, originally split from ScanCode";
+    homepage = "https://github.com/nexB/commoncode";
+    changelog = "https://github.com/nexB/commoncode/blob/v${version}/CHANGELOG.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/commonmark/default.nix b/nixpkgs/pkgs/development/python-modules/commonmark/default.nix
new file mode 100644
index 000000000000..1efefa4bf030
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/commonmark/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, glibcLocales, future }:
+
+buildPythonPackage rec {
+  pname = "commonmark";
+  version = "0.9.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60";
+  };
+
+  preCheck = ''
+    export LC_ALL="en_US.UTF-8"
+  '';
+
+  # UnicodeEncodeError on Python 2
+  doCheck = isPy3k;
+
+  nativeCheckInputs = [  glibcLocales ];
+  propagatedBuildInputs = [ future ];
+
+  meta = with lib; {
+    description = "Python parser for the CommonMark Markdown spec";
+    homepage = "https://github.com/rolandshoemaker/CommonMark-py";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/compiledb/default.nix b/nixpkgs/pkgs/development/python-modules/compiledb/default.nix
new file mode 100644
index 000000000000..35a78b770421
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/compiledb/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, bashlex
+, click
+, shutilwhich
+, gcc
+, coreutils
+}:
+
+buildPythonPackage rec {
+  pname = "compiledb";
+  version = "0.10.1";
+
+  src = fetchFromGitHub {
+    owner = "nickdiego";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0qricdgqzry7j3rmgwyd43av3c2kxpzkh6f9zcqbzrjkn78qbpd4";
+  };
+
+  # fix the tests
+  patchPhase = ''
+    substituteInPlace tests/data/multiple_commands_oneline.txt \
+                      --replace /bin/echo ${coreutils}/bin/echo
+  '';
+
+  nativeCheckInputs = [ pytest gcc coreutils ];
+  propagatedBuildInputs = [ click bashlex shutilwhich ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Tool for generating Clang's JSON Compilation Database files";
+    license = licenses.gpl3;
+    homepage = "https://github.com/nickdiego/compiledb";
+    maintainers = with maintainers; [ multun ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/complycube/default.nix b/nixpkgs/pkgs/development/python-modules/complycube/default.nix
new file mode 100644
index 000000000000..ee99ae8d28bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/complycube/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyhumps
+, requests
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "complycube";
+  version = "1.1.6";
+  pyproject = true;
+
+  src = fetchPypi rec {
+    inherit version;
+    pname = "complycube";
+    hash = "sha256-hetcn5RX582CRVmtG5dAvr+NXD+7NKJjaqgOo8LlpqM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pyhumps
+    requests
+  ];
+
+  pythonImportsCheck = [
+    "complycube"
+  ];
+
+  meta = {
+    homepage = "https://complycube.com";
+    description = "Official Python client for the ComplyCube API";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ derdennisop ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/compreffor/default.nix b/nixpkgs/pkgs/development/python-modules/compreffor/default.nix
new file mode 100644
index 000000000000..f587a2963800
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/compreffor/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchpatch
+, fetchPypi
+, setuptools-scm
+, fonttools
+, pytestCheckHook
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "compreffor";
+  version = "0.5.5";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-9NMmIJC8Q4hRC/H2S7OrgoWSQ9SRIPHxHvZpPrPCvHo=";
+  };
+
+  patches = [
+    # https://github.com/googlefonts/compreffor/pull/153
+    (fetchpatch {
+      name = "remove-setuptools-git-ls-files.patch";
+      url = "https://github.com/googlefonts/compreffor/commit/10f563564390568febb3ed1d0f293371cbd86953.patch";
+      hash = "sha256-wNQMJFJXTFILGzAgzUXzz/rnK67/RU+exYP6MhEQAkA=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    cython
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    fonttools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Tests cannot seem to open the cpython module.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "compreffor"
+  ];
+
+  meta = with lib; {
+    description = "CFF table subroutinizer for FontTools";
+    homepage = "https://github.com/googlefonts/compreffor";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/compressai/default.nix b/nixpkgs/pkgs/development/python-modules/compressai/default.nix
new file mode 100644
index 000000000000..47487a6f633f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/compressai/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pybind11
+, setuptools
+, wheel
+, numpy
+, matplotlib
+, pytorch-msssim
+, scipy
+, torch
+, torchvision
+, ipywidgets
+, jupyter
+, plotly
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "compressai";
+  version = "1.2.4";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "InterDigitalInc";
+    repo = "CompressAI";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-nT2vd7t67agIWobJalORbRuns0UJGRGGbTX2/8vbTiY=";
+    fetchSubmodules = true;
+  };
+
+  nativeBuildInputs = [
+    pybind11
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    matplotlib
+    pytorch-msssim
+    scipy
+    torch
+    torchvision
+  ];
+
+  passthru.optional-dependencies = {
+    tutorials = [
+      ipywidgets
+      jupyter
+    ];
+  };
+
+  pythonImportsCheck = [
+    "compressai"
+    "compressai._CXX"
+  ];
+
+  preCheck = ''
+    # We have to delete the source because otherwise it is used intead the installed package.
+    rm -rf compressai
+
+    export HOME=$(mktemp -d)
+  '';
+
+  nativeCheckInputs = [
+    plotly
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Those tests require internet access to download some weights
+    "test_image_codec"
+    "test_update"
+    "test_eval_model_pretrained"
+    "test_cheng2020_anchor"
+    "test_pretrained"
+  ];
+
+  meta = with lib; {
+    description = "A PyTorch library and evaluation platform for end-to-end compression research";
+    homepage = "https://github.com/InterDigitalInc/CompressAI";
+    license = licenses.bsd3Clear;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/concurrent-log-handler/default.nix b/nixpkgs/pkgs/development/python-modules/concurrent-log-handler/default.nix
new file mode 100644
index 000000000000..bdf74940c950
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/concurrent-log-handler/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, portalocker
+}:
+
+buildPythonPackage rec {
+  pname = "concurrent-log-handler";
+  version = "0.9.24";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-APVkbG5fb8Y2VFNvO0Sqorm3SyMkXhT1JY7ZHOOdEuI=";
+  };
+
+  propagatedBuildInputs = [
+    portalocker
+  ];
+
+  pythonImportsCheck = [
+    "concurrent_log_handler"
+  ];
+
+  doCheck = false; # upstream has no tests
+
+  meta = with lib; {
+    description = "Python logging handler that allows multiple processes to safely write to the same log file concurrently";
+    homepage = "https://pypi.org/project/concurrent-log-handler";
+    license = licenses.asl20;
+    maintainers = [ maintainers.lourkeur ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/conda/default.nix b/nixpkgs/pkgs/development/python-modules/conda/default.nix
new file mode 100644
index 000000000000..5439bde10040
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/conda/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, pythonAtLeast
+, fetchPypi
+, pycosat
+, requests
+, ruamel-yaml
+, isPy3k
+, enum34
+}:
+
+# Note: this installs conda as a library. The application cannot be used.
+# This is likely therefore NOT what you're looking for.
+
+buildPythonPackage rec {
+  pname = "conda";
+  version = "4.3.16";
+
+  # this is a very outdated version of conda that isn't compatible with python 3.10+
+  disabled = pythonAtLeast "3.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a91ef821343dea3ba9670f3d10b36c1ace4f4c36d70c175d8fc8886e94285953";
+  };
+
+  propagatedBuildInputs = [ pycosat requests ruamel-yaml ] ++ lib.optional (!isPy3k) enum34;
+
+  # No tests
+  doCheck = false;
+
+  meta = {
+    description = "OS-agnostic, system-level binary package manager";
+    homepage = "https://github.com/conda/conda";
+    license = lib.licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/confection/default.nix b/nixpkgs/pkgs/development/python-modules/confection/default.nix
new file mode 100644
index 000000000000..2e7b035de425
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/confection/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pydantic
+, pytestCheckHook
+, pythonOlder
+, srsly
+}:
+
+buildPythonPackage rec {
+  pname = "confection";
+  version = "0.1.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "explosion";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-PWtxLcnPd7V4yeHfOl1kYPr5UeqkYCfzGE/DoL94tq0=";
+  };
+
+  propagatedBuildInputs = [
+    pydantic
+    srsly
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "confection"
+  ];
+
+  meta = with lib; {
+    description = "Library that offers a configuration system";
+    homepage = "https://github.com/explosion/confection";
+    changelog  = "https://github.com/explosion/confection/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/configargparse/default.nix b/nixpkgs/pkgs/development/python-modules/configargparse/default.nix
new file mode 100644
index 000000000000..489e6a34144c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/configargparse/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, pyyaml
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "configargparse";
+  version = "1.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bw2";
+    repo = "ConfigArgParse";
+    rev = "refs/tags/${version}";
+    hash = "sha256-m77MY0IZ1AJkd4/Y7ltApvdF9y17Lgn92WZPYTCU9tA=";
+  };
+
+  passthru.optional-dependencies = {
+    yaml = [
+      pyyaml
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "configargparse"
+  ];
+
+  meta = with lib; {
+    description = "A drop-in replacement for argparse";
+    homepage = "https://github.com/bw2/ConfigArgParse";
+    changelog = "https://github.com/bw2/ConfigArgParse/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ willibutz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/configclass/default.nix b/nixpkgs/pkgs/development/python-modules/configclass/default.nix
new file mode 100644
index 000000000000..c5138fb1fddc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/configclass/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, mergedict
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "configclass";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-aoDKBuDxJCeXbVwCXhse6FCbDDM30/Xa8p9qRvDkWBk=";
+  };
+
+  propagatedBuildInputs = [ mergedict ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "configclass" ];
+
+  meta = with lib; {
+    description = "A Python to class to hold configuration values";
+    homepage = "https://github.com/schettino72/configclass/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/confight/default.nix b/nixpkgs/pkgs/development/python-modules/confight/default.nix
new file mode 100644
index 000000000000..1c4b11d46d65
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/confight/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "confight";
+  version = "1.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-fJr7f9Y/zEpCedWYd04AMuhkOFqZLJOw4sDiz8SDQ/Y=";
+  };
+
+  propagatedBuildInputs = [
+    toml
+  ];
+
+  pythonImportsCheck = [ "confight" ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python context manager for managing pid files";
+    homepage = "https://github.com/avature/confight";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ mkg20001 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/configobj/default.nix b/nixpkgs/pkgs/development/python-modules/configobj/default.nix
new file mode 100644
index 000000000000..932e434d923d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/configobj/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "configobj";
+  version = "5.0.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "DiffSK";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-t3Q0FEBibkAM5PAG4fjXwNH/71RqSSDj/Mn27ri0iDU=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  checkInputs = [
+    mock
+  ];
+
+  pythonImportsCheck = [
+    "configobj"
+  ];
+
+  meta = with lib; {
+    description = "Config file reading, writing and validation";
+    homepage = "https://github.com/DiffSK/configobj";
+    changelog = "https://github.com/DiffSK/configobj/blob/v${version}/CHANGES.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/configparser/default.nix b/nixpkgs/pkgs/development/python-modules/configparser/default.nix
new file mode 100644
index 000000000000..9dc6d16097a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/configparser/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, pytestCheckHook, setuptools-scm }:
+
+buildPythonPackage rec {
+  pname = "configparser";
+  version = "6.0.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7JFKseVsZy3h9cNIOWTmj3GzTkV5BLe3bga5Iq7AZ6g=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  preConfigure = ''
+    export LC_ALL=${if stdenv.isDarwin then "en_US" else "C"}.UTF-8
+  '';
+
+  preCheck = ''
+    # avoid FileNotFoundError
+    # FileNotFoundError: [Errno 2] No such file or directory: 'cfgparser.3'
+    cd tests
+  '';
+
+  meta = with lib; {
+    description = "Updated configparser from Python 3.7 for Python 2.6+.";
+    homepage = "https://github.com/jaraco/configparser";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/configshell/default.nix b/nixpkgs/pkgs/development/python-modules/configshell/default.nix
new file mode 100644
index 000000000000..40ea4fd7be75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/configshell/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pyparsing
+, six
+, urwid
+}:
+
+buildPythonPackage rec {
+  pname = "configshell";
+  version = "1.1.30";
+
+  src = fetchFromGitHub {
+    owner = "open-iscsi";
+    repo = "${pname}-fb";
+    rev = "v${version}";
+    hash = "sha256-7iWmYVCodwncoPdpw85zrNsZSEq+ume412lyiiJqRPc=";
+  };
+
+  propagatedBuildInputs = [
+    pyparsing
+    six
+    urwid
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "configshell"
+  ];
+
+  meta = with lib; {
+    description = "Python library for building configuration shells";
+    homepage = "https://github.com/open-iscsi/configshell-fb";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/configupdater/default.nix b/nixpkgs/pkgs/development/python-modules/configupdater/default.nix
new file mode 100644
index 000000000000..2a502963c260
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/configupdater/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "configupdater";
+  version = "3.1.1";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "ConfigUpdater";
+    hash = "sha256-RvDHTXPvpyN3Z2S0PJc59oBSSV3T1zQxnB0OtYUR8Vs=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace '--cov configupdater --cov-report term-missing' ""
+  '';
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  pythonImportsCheck = [ "configupdater" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Parser like ConfigParser but for updating configuration files";
+    homepage = "https://configupdater.readthedocs.io/en/latest/";
+    license = with licenses; [ mit psfl ];
+    maintainers = with maintainers; [ ris ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/confluent-kafka/default.nix b/nixpkgs/pkgs/development/python-modules/confluent-kafka/default.nix
new file mode 100644
index 000000000000..33e3caf90cae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/confluent-kafka/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, avro
+, buildPythonPackage
+, fastavro
+, fetchFromGitHub
+, jsonschema
+, protobuf
+, pyflakes
+, pyrsistent
+, pytestCheckHook
+, pythonOlder
+, rdkafka
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "confluent-kafka";
+  version = "2.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "confluentinc";
+    repo = "confluent-kafka-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-6CdalNFKkgF7JUqCGtt4nB1/H3u4SVqt9xCAg5DR3T0=";
+  };
+
+  buildInputs = [
+    rdkafka
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  passthru.optional-dependencies = {
+    avro = [
+      avro
+      fastavro
+    ];
+    json = [
+      jsonschema
+      pyrsistent
+    ];
+    protobuf = [
+      protobuf
+    ];
+  };
+
+  nativeCheckInputs = [
+    pyflakes
+    pytestCheckHook
+    requests-mock
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "confluent_kafka"
+  ];
+
+  disabledTestPaths = [
+    "tests/integration/"
+    "tests/test_Admin.py"
+    "tests/test_misc.py"
+  ];
+
+  meta = with lib; {
+    description = "Confluent's Apache Kafka client for Python";
+    homepage = "https://github.com/confluentinc/confluent-kafka-python";
+    changelog = "https://github.com/confluentinc/confluent-kafka-python/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ mlieberman85 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/confuse/default.nix b/nixpkgs/pkgs/development/python-modules/confuse/default.nix
new file mode 100644
index 000000000000..a3a979f68f87
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/confuse/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, pyyaml
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "confuse";
+  version = "1.7.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "beetbox";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-zdH5DNXnuAfYTuaG9EIKiXL2EbLSfzYjPSkC3G06bU8=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "confuse"
+  ];
+
+  meta = with lib; {
+    description = "Python configuration library for Python that uses YAML";
+    homepage = "https://github.com/beetbox/confuse";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lovesegfault ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/connect_box/default.nix b/nixpkgs/pkgs/development/python-modules/connect_box/default.nix
new file mode 100644
index 000000000000..01d7c2b2feca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/connect_box/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+, attrs
+, defusedxml
+}:
+
+buildPythonPackage rec {
+  pname = "connect-box";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    pname = "connect_box";
+    inherit version;
+    hash = "sha256-d1KqVKaHlZDm2o1GJ7r8KoONwfd1lxXexJxavCvjfW8=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    attrs
+    defusedxml
+  ];
+
+  # no tests are present
+  doCheck = false;
+
+  pythonImportsCheck = [ "connect_box" ];
+
+  meta = with lib; {
+    description = "Interact with a Compal CH7465LG cable modem/router";
+    longDescription = ''
+      Python Client for interacting with the cable modem/router Compal
+      CH7465LG which is provided under different names by various ISP
+      in Europe, e.g., UPC Connect Box (CH), Irish Virgin Media Super
+      Hub 3.0 (IE), Ziggo Connectbox (NL) or Unitymedia Connect Box (DE).
+    '';
+    homepage = "https://github.com/home-assistant-ecosystem/python-connect-box";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/connection-pool/default.nix b/nixpkgs/pkgs/development/python-modules/connection-pool/default.nix
new file mode 100644
index 000000000000..26e958f095ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/connection-pool/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "connection-pool";
+  version = "0.0.3";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    pname = "connection_pool";
+    inherit version;
+    sha256 = "bf429e7aef65921c69b4ed48f3d48d3eac1383b05d2df91884705842d974d0dc";
+  };
+
+  doCheck = false; # no tests
+  pythonImportsCheck = [ "connection_pool" ];
+
+  meta = with lib; {
+    description = "Thread-safe connection pool";
+    homepage = "https://github.com/zhouyl/ConnectionPool";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/connexion/default.nix b/nixpkgs/pkgs/development/python-modules/connexion/default.nix
new file mode 100644
index 000000000000..d4eb668d73ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/connexion/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, aiohttp
+, aiohttp-jinja2
+, aiohttp-remotes
+, aiohttp-swagger
+, buildPythonPackage
+, clickclick
+, decorator
+, fetchFromGitHub
+, flask
+, inflection
+, jsonschema
+, openapi-spec-validator
+, packaging
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, requests
+, swagger-ui-bundle
+, testfixtures
+}:
+
+buildPythonPackage rec {
+  pname = "connexion";
+  version = "2.14.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "spec-first";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-1v1xCHY3ZnZG/Vu9wN/it7rLKC/StoDefoMNs+hMjIs=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    aiohttp-jinja2
+    aiohttp-swagger
+    clickclick
+    flask
+    inflection
+    jsonschema
+    openapi-spec-validator
+    packaging
+    pyyaml
+    requests
+    swagger-ui-bundle
+  ];
+
+  nativeCheckInputs = [
+    aiohttp-remotes
+    decorator
+    pytest-aiohttp
+    pytestCheckHook
+    testfixtures
+  ];
+
+  pythonImportsCheck = [
+    "connexion"
+  ];
+
+  disabledTests = [
+    # AssertionError
+    "test_headers"
+  ];
+
+  meta = with lib; {
+    description = "Swagger/OpenAPI First framework on top of Flask";
+    homepage = "https://github.com/spec-first/connexion";
+    changelog = "https://github.com/spec-first/connexion/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ elohmeier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/connio/default.nix b/nixpkgs/pkgs/development/python-modules/connio/default.nix
new file mode 100644
index 000000000000..14574ab9da33
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/connio/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, serialio
+, sockio
+}:
+
+buildPythonPackage rec {
+  pname = "connio";
+  version = "0.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tiagocoutinho";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-fPM7Ya69t0jpZhKM2MTk6BwjvoW3a8SV3k000LB9Ypo=";
+  };
+
+  propagatedBuildInputs = [
+    serialio
+    sockio
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "connio"
+  ];
+
+  meta = with lib; {
+    description = "Library for concurrency agnostic communication";
+    homepage = "https://github.com/tiagocoutinho/connio";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cons/default.nix b/nixpkgs/pkgs/development/python-modules/cons/default.nix
new file mode 100644
index 000000000000..d08f5deb3c96
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cons/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, logical-unification
+, py
+, pytestCheckHook
+, pytest-html
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cons";
+  version = "0.4.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pythological";
+    repo = "python-cons";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-XssERKiv4A8x7dZhLeFSciN6RCEfGs0or3PAQiYSPII=";
+  };
+
+  propagatedBuildInputs = [
+    logical-unification
+  ];
+
+  nativeCheckInputs = [
+    py
+    pytestCheckHook
+    pytest-html
+  ];
+
+  pytestFlagsArray = [
+    "--html=testing-report.html"
+    "--self-contained-html"
+  ];
+
+  pythonImportsCheck = [ "cons" ];
+
+  meta = with lib; {
+    description = "An implementation of Lisp/Scheme-like cons in Python";
+    homepage = "https://github.com/pythological/python-cons";
+    changelog = "https://github.com/pythological/python-cons/releases/tag/v${version}";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ Etjean ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/consonance/default.nix b/nixpkgs/pkgs/development/python-modules/consonance/default.nix
new file mode 100644
index 000000000000..b14d965e5629
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/consonance/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, dissononce
+, python-axolotl-curve25519
+, transitions
+, protobuf
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "consonance";
+  version = "0.1.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tgalal";
+    repo = "consonance";
+    rev = version;
+    hash = "sha256-BhgxLxjKZ4dSL7DqkaoS+wBPCd1SYZomRKrtDLdGmYQ=";
+  };
+
+  propagatedBuildInputs = [
+    dissononce
+    python-axolotl-curve25519
+    transitions
+    protobuf
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests/test_handshakes_offline.py"
+  ];
+
+  pythonImportsCheck = [
+    "consonance"
+  ];
+
+  meta = with lib; {
+    description = "WhatsApp's handshake implementation using Noise Protocol";
+    homepage = "https://github.com/tgalal/consonance";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/constantly/default.nix b/nixpkgs/pkgs/development/python-modules/constantly/default.nix
new file mode 100644
index 000000000000..92183fc1622c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/constantly/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchFromGitHub, twisted }:
+
+let
+  self = buildPythonPackage rec {
+    pname = "constantly";
+    version = "15.1.0";
+
+    src = fetchFromGitHub {
+      owner = "twisted";
+      repo = "constantly";
+      rev = version;
+      hash = "sha256-0RPK5Vy0b6V4ubvm+vfNOAua7Qpa6j+G+QNExFuHgUU=";
+    };
+
+    # would create dependency loop with twisted
+    doCheck = false;
+
+    nativeCheckInputs = [ twisted ];
+
+    checkPhase = ''
+      trial constantly
+    '';
+
+    pythonImportsCheck = [ "constantly" ];
+
+    passthru.tests.constantly = self.overridePythonAttrs { doCheck = true; };
+
+    meta = with lib; {
+      homepage = "https://github.com/twisted/constantly";
+      description = "symbolic constant support";
+      license = licenses.mit;
+      maintainers = [ ];
+    };
+  };
+in
+self
diff --git a/nixpkgs/pkgs/development/python-modules/construct-classes/default.nix b/nixpkgs/pkgs/development/python-modules/construct-classes/default.nix
new file mode 100644
index 000000000000..386c386ef42f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/construct-classes/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, construct
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname   = "construct-classes";
+  version = "0.1.2";
+  format = "pyproject";
+
+  # no tests in PyPI tarball
+  src = fetchFromGitHub {
+    owner  = "matejcik";
+    repo   = "construct-classes";
+    rev    = "v${version}";
+    hash = "sha256-l4sVacKTuQbhXCw2lVHCl1OzpCiKmEAm9nSQ8pxFuTo=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    construct
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "construct_classes" ];
+
+  meta = with lib; {
+    description = "Parse your binary data into dataclasses.";
+    homepage = "https://github.com/matejcik/construct-classes";
+    license = licenses.mit;
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/construct/default.nix b/nixpkgs/pkgs/development/python-modules/construct/default.nix
new file mode 100644
index 000000000000..f6c5bb50b59d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/construct/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, stdenv
+, arrow
+, buildPythonPackage
+, cloudpickle
+, cryptography
+, fetchFromGitHub
+, lz4
+, numpy
+, pytestCheckHook
+, pythonOlder
+, ruamel-yaml
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "construct";
+  version = "2.10.69";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "construct";
+    repo = "construct";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-v1ieZytX9I2BR6UBD6TztCBT4KWtqfFZVKNtXIRNEB0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    # Not an explicit dependency, but it's imported by an entrypoint
+    lz4
+  ];
+
+  passthru.optional-dependencies = {
+    extras = [
+      arrow
+      cloudpickle
+      cryptography
+      numpy
+      ruamel-yaml
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "construct"
+  ];
+
+  disabledTests = [
+    "test_benchmarks"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_multiprocessing"
+  ];
+
+  meta = with lib; {
+    description = "Powerful declarative parser (and builder) for binary data";
+    homepage = "https://construct.readthedocs.org/";
+    changelog = "https://github.com/construct/construct/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/consul/default.nix b/nixpkgs/pkgs/development/python-modules/consul/default.nix
new file mode 100644
index 000000000000..a3b92ee72554
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/consul/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi
+, requests, six, pytest }:
+
+buildPythonPackage rec {
+  pname = "python-consul";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "168f1fa53948047effe4f14d53fc1dab50192e2a2cf7855703f126f469ea11f4";
+  };
+
+  buildInputs = [ requests six pytest ];
+
+  # No tests distributed. https://github.com/cablehead/python-consul/issues/133
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python client for Consul (https://www.consul.io/)";
+    homepage = "https://github.com/cablehead/python-consul";
+    license = licenses.mit;
+    maintainers = with maintainers; [ desiderius ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/container-inspector/default.nix b/nixpkgs/pkgs/development/python-modules/container-inspector/default.nix
new file mode 100644
index 000000000000..12375681c58f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/container-inspector/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, attrs
+, buildPythonPackage
+, click
+, commoncode
+, dockerfile-parse
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "container-inspector";
+  version = "32.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "nexB";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-J9glnfs6l36/IQoIvE8a+Cw4B8x/6r5UeAU8+T/OiQg=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  dontConfigure = true;
+
+  postPatch = ''
+    # PEP440 support was removed in newer setuptools, https://github.com/nexB/container-inspector/pull/51
+    substituteInPlace setup.cfg \
+      --replace ">=3.7.*" ">=3.7"
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    click
+    dockerfile-parse
+    commoncode
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "container_inspector"
+  ];
+
+  meta = with lib; {
+    description = "Suite of analysis utilities and command line tools for container images";
+    homepage = "https://github.com/nexB/container-inspector";
+    changelog = "https://github.com/nexB/container-inspector/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/contexter/default.nix b/nixpkgs/pkgs/development/python-modules/contexter/default.nix
new file mode 100644
index 000000000000..9937d4b47526
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/contexter/default.nix
@@ -0,0 +1,14 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "contexter";
+  version = "0.1.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c730890b1a915051414a6350d8ea1cddca7d01d8f756badedb30b9bf305ea0a8";
+  };
+
+  meta = with lib; {
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/contextlib2/default.nix b/nixpkgs/pkgs/development/python-modules/contextlib2/default.nix
new file mode 100644
index 000000000000..19c26dbdd21c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/contextlib2/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, pythonAtLeast
+, pythonOlder
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "contextlib2";
+  version = "21.6.0";
+  format = "setuptools";
+
+  # Python 3.11 not currently supported
+  # https://github.com/jazzband/contextlib2/issues/43
+  disabled = pythonOlder "3.6" || pythonAtLeast "3.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-qx4r/h0B2Wjht+jZAjvFHvNQm7ohe7cwzuOCfh7oKGk=";
+  };
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  pythonImportsCheck = [
+    "contextlib2"
+  ];
+
+  meta = with lib; {
+    description = "Backports and enhancements for the contextlib module";
+    homepage = "https://contextlib2.readthedocs.org/";
+    license = licenses.psfl;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/contexttimer/default.nix b/nixpkgs/pkgs/development/python-modules/contexttimer/default.nix
new file mode 100644
index 000000000000..e61178daaaaf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/contexttimer/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, fetchpatch
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "contexttimer";
+  version = "unstable-2019-03-30";
+
+  src = fetchFromGitHub {
+    owner = "brouberol";
+    repo = "contexttimer";
+    rev = "a866f420ed4c10f29abf252c58b11f9db6706100";
+    hash = "sha256-Fc1vK1KSZWgBPtBf5dVydF6dLHEGAOslWMV0FLRdj8w=";
+  };
+
+  patches = [
+  # https://github.com/brouberol/contexttimer/pull/16
+    (fetchpatch {
+      url = "https://github.com/brouberol/contexttimer/commit/dd65871f3f25a523a47a74f2f5306c57048592b0.patch";
+      hash = "sha256-vNBuFXvuvb6hWPzg4W4iyKbd4N+vofhxsKydEkc25E4=";
+    })
+  ];
+
+  pythonImportsCheck = [ "contexttimer" ];
+
+  nativeCheckInputs = [ mock ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest tests/test_timer.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/brouberol/contexttimer";
+    description = "A timer as a context manager";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ atila ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/contourpy/default.nix b/nixpkgs/pkgs/development/python-modules/contourpy/default.nix
new file mode 100644
index 000000000000..f5af82e55ff3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/contourpy/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build
+, meson
+, meson-python
+, ninja
+, pybind11
+
+# propagates
+, numpy
+
+# optionals
+, bokeh
+, chromedriver
+, selenium
+
+# tests
+, matplotlib
+, pillow
+, pytestCheckHook
+}:
+
+let countourpy = buildPythonPackage rec {
+  pname = "contourpy";
+  version = "1.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "contourpy";
+    repo = "contourpy";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-7M+5HMDqQI4UgVfW/MXsVyz/yM6wjTcJEdw7vPvzuNY=";
+  };
+
+  nativeBuildInputs = [
+    meson
+    meson-python
+    ninja
+    pybind11
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  passthru.optional-depdendencies = {
+    bokeh = [ bokeh chromedriver selenium ];
+  };
+
+  doCheck = false; # infinite recursion with matplotlib, tests in passthru
+
+  nativeCheckInputs = [
+    matplotlib
+    pillow
+    pytestCheckHook
+  ];
+
+  passthru.tests = {
+    check = countourpy.overridePythonAttrs (_: { doCheck = true; });
+  };
+
+  pythonImportsCheck = [
+    "contourpy"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/contourpy/contourpy/releases/tag/v${version}";
+    description = "Python library for calculating contours in 2D quadrilateral grids";
+    homepage = "https://github.com/contourpy/contourpy";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+};
+in countourpy
diff --git a/nixpkgs/pkgs/development/python-modules/controku/default.nix b/nixpkgs/pkgs/development/python-modules/controku/default.nix
new file mode 100644
index 000000000000..4fd2e762b9c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/controku/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, python3Packages
+, fetchFromGitHub
+, setuptools
+, requests
+, ssdpy
+, appdirs
+, pygobject3
+, gobject-introspection
+, gtk3
+, wrapGAppsHook
+, buildApplication ? false
+}:
+
+python3Packages.buildPythonPackage rec {
+  pname = "controku";
+  version = "1.1.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "benthetechguy";
+    repo = "controku";
+    rev = version;
+    hash = "sha256-sye2GtL3a77pygllZc6ylaIP7faPb+NFbyKKyqJzIXw=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ] ++ lib.optionals buildApplication [
+    gobject-introspection
+    wrapGAppsHook
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    ssdpy
+  ] ++ lib.optionals buildApplication [
+    gtk3
+    appdirs
+    pygobject3
+  ];
+
+  pythonImportsCheck = [ "controku" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/benthetechguy/controku/releases/tag/${version}";
+    description = "Control Roku devices from the comfort of your own desktop";
+    homepage = "https://github.com/benthetechguy/controku";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ mjm ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/convertdate/default.nix b/nixpkgs/pkgs/development/python-modules/convertdate/default.nix
new file mode 100644
index 000000000000..601799ba24e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/convertdate/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pymeeus
+, pytz
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "convertdate";
+  version = "2.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fitnr";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-iOHK3UJulXJJR50nhiVgfk3bt+CAtG3BRySJ8DkBuJE=";
+  };
+
+  propagatedBuildInputs = [
+    pymeeus
+    pytz
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "convertdate"
+  ];
+
+  meta = with lib; {
+    description = "Utils for converting between date formats and calculating holidays";
+    homepage = "https://github.com/fitnr/convertdate";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cookiecutter/default.nix b/nixpkgs/pkgs/development/python-modules/cookiecutter/default.nix
new file mode 100644
index 000000000000..d7ae5934d6d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cookiecutter/default.nix
@@ -0,0 +1,54 @@
+{ lib, buildPythonPackage, fetchPypi, isPyPy
+, pytest, pytest-cov, pytest-mock, freezegun, safety, pre-commit
+, jinja2, future, binaryornot, click, jinja2-time, requests
+, python-slugify
+, pyyaml
+, arrow
+, rich
+}:
+
+buildPythonPackage rec {
+  pname = "cookiecutter";
+  version = "2.3.0";
+
+  # not sure why this is broken
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lCp5SYF0f21/Q51uSdOdyRqaZBKDYUFgyTxHTHLCliE=";
+  };
+
+  nativeCheckInputs = [
+    pytest
+    pytest-cov
+    pytest-mock
+    freezegun
+    safety
+    pre-commit
+  ];
+  propagatedBuildInputs = [
+    binaryornot
+    jinja2
+    click
+    pyyaml
+    jinja2-time
+    python-slugify
+    requests
+    arrow
+    rich
+  ];
+
+  # requires network access for cloning git repos
+  doCheck = false;
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/audreyr/cookiecutter";
+    description = "A command-line utility that creates projects from project templates";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ kragniz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cookies/default.nix b/nixpkgs/pkgs/development/python-modules/cookies/default.nix
new file mode 100644
index 000000000000..3f0d64c0c22d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cookies/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cookies";
+  version = "2.2.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-1raYeIyuTPpOYu+GQ6nKMyt5vZbLMUKUuGSujX6z7o4=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "fix-deprecations.patch";
+      url = "https://gitlab.com/sashahart/cookies/-/commit/22543d970568d577effe120c5a34636a38aa397b.patch";
+      hash = "sha256-8e3haOnbSXlL/ZY4uv6P4+ABBKrsCjbEpsLHaulbIUk=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # https://gitlab.com/sashahart/cookies/-/issues/6
+    "test_encoding_assumptions"
+  ];
+
+  meta = with lib; {
+    description = "Friendlier RFC 6265-compliant cookie parser/renderer";
+    homepage = "https://github.com/sashahart/cookies";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/coordinates/default.nix b/nixpkgs/pkgs/development/python-modules/coordinates/default.nix
new file mode 100644
index 000000000000..5c5e53e989f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coordinates/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "coordinates";
+  version = "0.4.0";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "clbarnes";
+    repo = "coordinates";
+    rev = "v${version}";
+    sha256 = "1zha594rshjg3qjq9mrai2hfldya282ihasp2i3km7b2j4gjdw2b";
+  };
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    runHook preCheck
+    pytest tests/
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Convenience class for doing maths with explicit coordinates";
+    homepage = "https://github.com/clbarnes/coordinates";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/coqpit/default.nix b/nixpkgs/pkgs/development/python-modules/coqpit/default.nix
new file mode 100644
index 000000000000..48954b7a9117
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coqpit/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonAtLeast
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "coqpit";
+  version = "0.0.17";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "coqui-ai";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-FY3PYd8dY5HFKkhD6kBzPt0k1eFugdqsO3yIN4oDk3E=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "coqpit"
+    "coqpit.coqpit"
+  ];
+
+  # https://github.com/coqui-ai/coqpit/issues/40
+  disabledTests = lib.optionals (pythonAtLeast "3.11")[
+    "test_init_argparse_list_and_nested"
+  ];
+
+  disabledTestPaths = lib.optionals (pythonAtLeast "3.11")[
+    "tests/test_nested_configs.py"
+  ];
+
+  meta = with lib; {
+    description = "Simple but maybe too simple config management through python data classes";
+    longDescription = ''
+      Simple, light-weight and no dependency config handling through python data classes with to/from JSON serialization/deserialization.
+    '';
+    homepage = "https://github.com/coqui-ai/coqpit";
+    license = licenses.mit;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/coreapi/default.nix b/nixpkgs/pkgs/development/python-modules/coreapi/default.nix
new file mode 100644
index 000000000000..3e8a54090402
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coreapi/default.nix
@@ -0,0 +1,44 @@
+{
+  lib,
+  fetchFromGitHub,
+  buildPythonPackage,
+  django,
+  coreschema,
+  itypes,
+  uritemplate,
+  requests,
+  pytest,
+}:
+
+buildPythonPackage rec {
+  pname = "coreapi";
+  version = "2.3.3";
+
+  src = fetchFromGitHub {
+    repo = "python-client";
+    owner = "core-api";
+    rev = version;
+    sha256 = "1c6chm3q3hyn8fmjv23qgc79ai1kr3xvrrkp4clbqkssn10k7mcw";
+  };
+
+  propagatedBuildInputs = [
+    django
+    coreschema
+    itypes
+    uritemplate
+    requests
+  ];
+
+  nativeCheckInputs = [ pytest ];
+  checkPhase = ''
+    cd ./tests
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Python client library for Core API";
+    homepage = "https://github.com/core-api/python-client";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/coredis/default.nix b/nixpkgs/pkgs/development/python-modules/coredis/default.nix
new file mode 100644
index 000000000000..79faced6c3c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coredis/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, deprecated
+, fetchFromGitHub
+, pympler
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, redis
+, wrapt
+}:
+
+buildPythonPackage rec {
+  pname = "coredis";
+  version = "4.16.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "alisaifee";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-7qpoNc5/z8/EKtGWULrPPwfH9swYe9TqqUL+zxrFQSk=";
+  };
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace "-K" ""
+  '';
+
+  propagatedBuildInputs = [
+    async-timeout
+    deprecated
+    pympler
+    wrapt
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    redis
+    pytest-asyncio
+  ];
+
+  pythonImportsCheck = [
+    "coredis"
+  ];
+
+  pytestFlagsArray = [
+    # All other tests require Docker
+    "tests/test_lru_cache.py"
+    "tests/test_parsers.py"
+    "tests/test_retry.py"
+    "tests/test_utils.py"
+  ];
+
+  meta = with lib; {
+    description = "An async redis client with support for redis server, cluster & sentinel";
+    homepage = "https://github.com/alisaifee/coredis";
+    changelog = "https://github.com/alisaifee/coredis/blob/${src.rev}/HISTORY.rst";
+    license = licenses.mit;
+    maintainers = teams.wdz.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/coreschema/default.nix b/nixpkgs/pkgs/development/python-modules/coreschema/default.nix
new file mode 100644
index 000000000000..a36a6838c8e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coreschema/default.nix
@@ -0,0 +1,34 @@
+{
+  lib,
+  fetchFromGitHub,
+  buildPythonPackage,
+  jinja2,
+  pytest,
+}:
+
+buildPythonPackage rec {
+  pname = "coreschema";
+  version = "0.0.4";
+
+  src = fetchFromGitHub {
+    repo = "python-coreschema";
+    owner = "core-api";
+    rev = version;
+    sha256 = "027pc753mkgbb3r1v1x7dsdaarq93drx0f79ppvw9pfkcjcq6wb1";
+  };
+
+  propagatedBuildInputs = [ jinja2 ];
+
+  nativeCheckInputs = [ pytest ];
+  checkPhase = ''
+    cd ./tests
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Python client library for Core Schema";
+    homepage = "https://github.com/ivegotasthma/python-coreschema";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cornice/default.nix b/nixpkgs/pkgs/development/python-modules/cornice/default.nix
new file mode 100644
index 000000000000..49825c7af2a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cornice/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyramid
+, simplejson
+, six
+, venusian
+}:
+
+buildPythonPackage rec {
+  pname = "cornice";
+  version = "6.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6edf6f206ff1c3d108d7a7b9ae640a2f4737cfc04f0914ccc4eefe511d3a8985";
+  };
+
+  propagatedBuildInputs = [ pyramid simplejson six venusian ];
+
+  # tests not packaged with pypi release
+  doCheck = false;
+  pythonImportsCheck = [ "cornice" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mozilla-services/cornice";
+    description = "Build Web Services with Pyramid";
+    license = licenses.mpl20;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/correctionlib/default.nix b/nixpkgs/pkgs/development/python-modules/correctionlib/default.nix
new file mode 100644
index 000000000000..7a79c3855478
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/correctionlib/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cmake
+, numpy
+, scikit-build
+, setuptools
+, setuptools-scm
+, wheel
+, pybind11
+, pydantic
+, rich
+, awkward
+, pytestCheckHook
+, scipy
+, zlib
+}:
+
+buildPythonPackage rec {
+  pname = "correctionlib";
+  version = "2.4.0";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bQKcS8vktvD62zvSeaBtoJw36TSpo0gEpKm0HI3AuXg=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    numpy
+    scikit-build
+    setuptools
+    setuptools-scm
+    wheel
+    pybind11
+  ];
+
+  buildInputs = [
+    zlib
+  ];
+
+  propagatedBuildInputs = [
+    pydantic
+    rich
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeCheckInputs = [
+    awkward
+    pytestCheckHook
+    scipy
+  ];
+
+  pythonImportsCheck = [
+    "correctionlib"
+  ];
+
+  meta = with lib; {
+    description = "Provides a well-structured JSON data format for a wide variety of ad-hoc correction factors encountered in a typical HEP analysis";
+    homepage = "https://cms-nanoaod.github.io/correctionlib/";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/corsair-scan/default.nix b/nixpkgs/pkgs/development/python-modules/corsair-scan/default.nix
new file mode 100644
index 000000000000..82ef32b2d7b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/corsair-scan/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, pythonOlder
+, requests
+, tldextract
+, urllib3
+, validators
+}:
+
+buildPythonPackage rec {
+  pname = "corsair-scan";
+  version = "0.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Santandersecurityresearch";
+    repo = "corsair_scan";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-s94ZiTL7tBrhUaeB/O3Eh8o8zqtfdt0z8LKep1bZWiY=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'," ""
+  '';
+
+  propagatedBuildInputs = [
+    validators
+    requests
+    urllib3
+    tldextract
+    click
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "corsair_scan"
+  ];
+
+  disabledTests = [
+    # Tests want to download Public Suffix List
+    "test_corsair_scan_401"
+    "test_corsair_scan_origin"
+  ];
+
+  meta = with lib; {
+    description = "Python module to check for Cross-Origin Resource Sharing (CORS) misconfigurations";
+    homepage = "https://github.com/Santandersecurityresearch/corsair_scan";
+    changelog = "https://github.com/Santandersecurityresearch/corsair_scan/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cose/default.nix b/nixpkgs/pkgs/development/python-modules/cose/default.nix
new file mode 100644
index 000000000000..c591677b5316
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cose/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+# Python deps
+, attrs
+, cbor2
+, certvalidator
+, cryptography
+, ecdsa
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "cose";
+  version = "1.0.1";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "TimothyClaeys";
+    repo = "pycose";
+    rev = "v${version}";
+    hash = "sha256-8d6HebWlSKgx7dmOnT7ZZ5mrMfg6mNWhz1hHPv75XF4=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    cbor2
+    certvalidator
+    cryptography
+    ecdsa
+    setuptools
+  ];
+
+  pythonImportsCheck = [ "pycose" ];
+
+  meta = with lib; {
+    description = "A Python implementation of the COSE specification";
+    homepage = "https://github.com/TimothyClaeys/pycose";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ t4ccer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cot/default.nix b/nixpkgs/pkgs/development/python-modules/cot/default.nix
new file mode 100644
index 000000000000..ed40735a2063
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cot/default.nix
@@ -0,0 +1,91 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, colorlog
+, pyvmomi
+, requests
+, verboselogs
+, pyopenssl
+, setuptools
+, mock
+, pytest-mock
+, pytestCheckHook
+, qemu
+}:
+
+buildPythonPackage rec {
+  pname = "cot";
+  version = "2.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-9LNVNBX5DarGVvidPoLnmz11F5Mjm7FzpoO0zAzrJjU=";
+  };
+
+  propagatedBuildInputs = [
+    colorlog
+    pyvmomi
+    requests
+    verboselogs
+    pyopenssl
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+    pytest-mock
+    qemu
+  ];
+
+  prePatch = ''
+    # argparse is part of the standardlib
+    substituteInPlace setup.py \
+      --replace "'argparse'," ""
+  '';
+
+  disabledTests = [
+    # Many tests require network access and/or ovftool (https://code.vmware.com/web/tool/ovf)
+    # try enabling these tests with ovftool once/if it is added to nixpkgs
+    "HelperGenericTest"
+    "TestCOTAddDisk"
+    "TestCOTAddFile"
+    "TestCOTEditHardware"
+    "TestCOTEditProduct"
+    "TestCOTEditProperties"
+    "TestCOTInjectConfig"
+    "TestISO"
+    "TestOVFAPI"
+    "TestQCOW2"
+    "TestRAW"
+    "TestVMDKConversion"
+    # CLI test fails with AssertionError
+    "test_help"
+    # Failing TestCOTDeployESXi tests
+    "test_serial_fixup_stubbed"
+    "test_serial_fixup_stubbed_create"
+    "test_serial_fixup_stubbed_vm_not_found"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_serial_fixup_invalid_host"
+  ];
+
+  pythonImportsCheck = [
+    "COT"
+  ];
+
+  meta = with lib; {
+    description = "Common OVF Tool";
+    longDescription = ''
+      COT (the Common OVF Tool) is a tool for editing Open Virtualization Format (.ovf, .ova) virtual appliances,
+      with a focus on virtualized network appliances such as the Cisco CSR 1000V and Cisco IOS XRv platforms.
+    '';
+    homepage = "https://github.com/glennmatthews/cot";
+    license = licenses.mit;
+    maintainers = with maintainers; [ evanjs ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cov-core/default.nix b/nixpkgs/pkgs/development/python-modules/cov-core/default.nix
new file mode 100644
index 000000000000..ce3b08fbc9f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cov-core/default.nix
@@ -0,0 +1,17 @@
+{ lib, buildPythonPackage, fetchPypi, coverage }:
+
+buildPythonPackage rec {
+  pname = "cov-core";
+  version = "1.15.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0k3np9ymh06yv1ib96sb6wfsxjkqhmik8qfsn119vnhga9ywc52a";
+  };
+
+  propagatedBuildInputs = [ coverage ];
+
+  meta = with lib; {
+    description = "Plugin core for use by pytest-cov, nose-cov and nose2-cov";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/coverage/default.nix b/nixpkgs/pkgs/development/python-modules/coverage/default.nix
new file mode 100644
index 000000000000..2bcfe6c34655
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coverage/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "coverage";
+  version = "7.3.1";
+  # uses f strings
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bLf+FYHetnt4LBUxNlQeIJAaoxLO7a8UZ9yzUlV4eVI=";
+  };
+
+  # No tests in archive
+  doCheck = false;
+  nativeCheckInputs = [ mock ];
+
+  meta = {
+    description = "Code coverage measurement for python";
+    homepage = "https://coverage.readthedocs.io/";
+    license = lib.licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/coveralls/default.nix b/nixpkgs/pkgs/development/python-modules/coveralls/default.nix
new file mode 100644
index 000000000000..7c68a33483a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/coveralls/default.nix
@@ -0,0 +1,63 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, isPy27
+, mock
+, pytest
+, pytest-runner
+, sh
+, coverage
+, docopt
+, requests
+, urllib3
+, git
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "coveralls";
+  version = "3.3.1";
+  disabled = isPy27;
+
+  # wanted by tests
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b32a8bb5d2df585207c119d6c01567b81fba690c9c10a753bfe27a335bfc43ea";
+  };
+
+  nativeCheckInputs = [
+    mock
+    sh
+    pytest
+    git
+  ];
+
+  buildInputs = [
+    pytest-runner
+  ];
+
+  postPatch = ''
+    sed -i "s/'coverage>=\([^,]\+\),.*',$/'coverage>=\1',/" setup.py
+  '';
+
+  # FIXME: tests requires .git directory to be present
+  doCheck = false;
+
+  checkPhase = ''
+    python setup.py test
+  '';
+
+  propagatedBuildInputs = [
+    coverage
+    docopt
+    requests
+  ] ++ lib.optional (!isPy3k) urllib3;
+
+  meta = {
+    description = "Show coverage stats online via coveralls.io";
+    homepage = "https://github.com/coveralls-clients/coveralls-python";
+    license = lib.licenses.mit;
+  };
+}
+
+
diff --git a/nixpkgs/pkgs/development/python-modules/cppe/default.nix b/nixpkgs/pkgs/development/python-modules/cppe/default.nix
new file mode 100644
index 000000000000..9fa87ab806ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cppe/default.nix
@@ -0,0 +1,54 @@
+{ buildPythonPackage
+, lib
+, stdenv
+, cmake
+, cppe
+, eigen
+, python
+, pybind11
+, numpy
+, h5py
+, numba
+, scipy
+, pandas
+, polarizationsolver
+, pytest
+, llvmPackages
+}:
+
+buildPythonPackage rec {
+  inherit (cppe) pname version src meta;
+
+  # The python interface requires eigen3, but builds from a checkout in tree.
+  # Using the nixpkgs version instead.
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "external/eigen3" "${eigen}/include/eigen3"
+  '';
+
+  nativeBuildInputs = [
+    cmake
+    eigen
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  buildInputs = [ pybind11 ]
+    ++ lib.optional stdenv.cc.isClang llvmPackages.openmp;
+
+  NIX_CFLAGS_LINK = lib.optional stdenv.cc.isClang "-lomp";
+
+  hardeningDisable = lib.optional stdenv.cc.isClang "strictoverflow";
+
+  nativeCheckInputs = [
+    pytest
+    h5py
+    numba
+    numpy
+    pandas
+    polarizationsolver
+    scipy
+  ];
+
+  pythonImportsCheck = [ "cppe" ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cppheaderparser/default.nix b/nixpkgs/pkgs/development/python-modules/cppheaderparser/default.nix
new file mode 100644
index 000000000000..bf2c696f2841
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cppheaderparser/default.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage
+, fetchPypi
+, ply
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "CppHeaderParser";
+  version = "2.7.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-OCswQW2VsKXoUCshSBDcrCpWQykX4mUUR9Or4lPjzEI=";
+  };
+
+  propagatedBuildInputs = [ ply ];
+
+  pythonImportsCheck = [ "CppHeaderParser" ];
+
+  meta = with lib; {
+    description = "Parse C++ header files using ply.lex to generate navigable class tree representing the class structure";
+    homepage = "https://sourceforge.net/projects/cppheaderparser/";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ pamplemousse ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cppy/default.nix b/nixpkgs/pkgs/development/python-modules/cppy/default.nix
new file mode 100644
index 000000000000..025da8968630
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cppy/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytestCheckHook
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "cppy";
+  version = "1.2.1";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-g7Q78XsQhawVxd69tCFU8Ti5KCNLIURzWJgfadDW/hs=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "cppy" ];
+
+  meta = {
+    description = "C++ headers for C extension development";
+    homepage = "https://github.com/nucleic/cppy";
+    license = lib.licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cpyparsing/default.nix b/nixpkgs/pkgs/development/python-modules/cpyparsing/default.nix
new file mode 100644
index 000000000000..1ee4fe165878
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cpyparsing/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, pexpect
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cpyparsing";
+  version = "2.4.7.2.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "evhub";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Y3EyX9Gjssez0DkD6dIaOpazNLy7rDYzjKO1u+lLGFI=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  nativeCheckInputs = [
+    pexpect
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} tests/cPyparsing_test.py
+  '';
+
+  pythonImportsCheck = [
+    "cPyparsing"
+  ];
+
+  meta = with lib; {
+    description = "Cython PyParsing implementation";
+    homepage = "https://github.com/evhub/cpyparsing";
+    changelog = "https://github.com/evhub/cpyparsing/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fabianhjr ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cram/default.nix b/nixpkgs/pkgs/development/python-modules/cram/default.nix
new file mode 100644
index 000000000000..c451288f0006
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cram/default.nix
@@ -0,0 +1,32 @@
+{stdenv, lib, buildPythonPackage, fetchPypi, bash, which}:
+
+buildPythonPackage rec {
+  version = "0.7";
+  pname = "cram";
+
+  nativeCheckInputs = [ which ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0bvz6fwdi55rkrz3f50zsy35gvvwhlppki2yml5bj5ffy9d499vx";
+  };
+
+  postPatch = ''
+    patchShebangs scripts/cram
+    substituteInPlace tests/test.t \
+      --replace "/bin/bash" "${bash}/bin/bash"
+  '';
+
+  checkPhase = ''
+    scripts/cram tests
+  '';
+
+  meta = {
+    description = "A simple testing framework for command line applications";
+    homepage = "https://bitheap.org/cram/";
+    license = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [ jluttine ];
+    # Tests fail on i686: https://hydra.nixos.org/build/52896671/nixlog/4
+    broken = stdenv.isi686;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cramjam/default.nix b/nixpkgs/pkgs/development/python-modules/cramjam/default.nix
new file mode 100644
index 000000000000..03d823812c15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cramjam/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, rustPlatform
+, stdenv
+, libiconv
+, brotli
+, hypothesis
+, lz4
+, memory-profiler
+, numpy
+, py
+, pytest-benchmark
+, pytestCheckHook
+, python-snappy
+, zstd
+}:
+
+buildPythonPackage rec {
+  pname = "cramjam";
+  version = "2.6.2.post1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "milesgranger";
+    repo = "pyrus-cramjam";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-KU1JVNEQJadXNiIWTvI33N2NSq994xoKxcAGGezFjaI=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    hash = "sha256-w1bEf+etLgR/YOyLmC3lFtO9fqAx8z2aul/XIKUQb5k=";
+  };
+
+  nativeBuildInputs = with rustPlatform; [
+    cargoSetupHook
+    maturinBuildHook
+  ];
+
+  buildInputs = lib.optional stdenv.isDarwin libiconv;
+
+  nativeCheckInputs = [
+    brotli
+    hypothesis
+    lz4
+    memory-profiler
+    numpy
+    py
+    pytest-benchmark
+    pytestCheckHook
+    python-snappy
+    zstd
+  ];
+
+  pytestFlagsArray = [
+    "--benchmark-disable"
+  ];
+
+  disabledTestPaths = [
+    "benchmarks/test_bench.py"
+  ];
+
+  pythonImportsCheck = [
+    "cramjam"
+  ];
+
+  meta = with lib; {
+    description = "Thin Python bindings to de/compression algorithms in Rust";
+    homepage = "https://github.com/milesgranger/pyrus-cramjam";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/crashtest/default.nix b/nixpkgs/pkgs/development/python-modules/crashtest/default.nix
new file mode 100644
index 000000000000..4b03e38b74f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crashtest/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, pythonAtLeast }:
+
+buildPythonPackage rec {
+  pname = "crashtest";
+  version = "0.4.1";
+  disabled = !(pythonAtLeast "3.6");
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gNex8xbr+9Qp9kgHbWJ1yHe6MLpIl53kGRcUp1Jm8M4=";
+  };
+
+  # has tests, but only on GitHub, however the pyproject build fails for me
+  pythonImportsCheck = [
+    "crashtest.frame"
+    "crashtest.inspector"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/sdispater/crashtest";
+    description = "Manage Python errors with ease";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/crate/default.nix b/nixpkgs/pkgs/development/python-modules/crate/default.nix
new file mode 100644
index 000000000000..fe60eceb93c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crate/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, dask
+, urllib3
+, geojson
+, pandas
+, pythonOlder
+, sqlalchemy
+, pytestCheckHook
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "crate";
+  version = "0.34.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-nEWrfCd2MQCcIM6dLkVYc/cWT5wcT/pvYaY2V3wfuto=";
+  };
+
+  propagatedBuildInputs = [
+    urllib3
+    sqlalchemy
+    geojson
+  ];
+
+  nativeCheckInputs = [
+    dask
+    pandas
+    pytestCheckHook
+    pytz
+  ];
+
+  disabledTests = [
+    # the following tests require network access
+    "test_layer_from_uri"
+    "test_additional_settings"
+    "test_basic"
+    "test_cluster"
+    "test_default_settings"
+    "test_dynamic_http_port"
+    "test_environment_variables"
+    "test_verbosity"
+  ];
+
+  disabledTestPaths = [
+    # imports setuptools.ssl_support, which doesn't exist anymore
+    "src/crate/client/test_http.py"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/crate/crate-python";
+    description = "A Python client library for CrateDB";
+    changelog = "https://github.com/crate/crate-python/blob/${version}/CHANGES.txt";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ doronbehar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/crayons/default.nix b/nixpkgs/pkgs/development/python-modules/crayons/default.nix
new file mode 100644
index 000000000000..53caec665964
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crayons/default.nix
@@ -0,0 +1,19 @@
+{ lib, fetchPypi, buildPythonPackage, colorama }:
+
+buildPythonPackage rec {
+  pname = "crayons";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bd33b7547800f2cfbd26b38431f9e64b487a7de74a947b0fafc89b45a601813f";
+  };
+
+  propagatedBuildInputs = [ colorama ];
+
+  meta = with lib; {
+    description = "TextUI colors for Python";
+    homepage = "https://github.com/kennethreitz/crayons";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/crc/default.nix b/nixpkgs/pkgs/development/python-modules/crc/default.nix
new file mode 100644
index 000000000000..47c2da0f8505
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crc/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "crc";
+  version = "5.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Nicoretti";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-+C4cUKXZCpAXil8X4gTK3AhqNVWDrBQYY2Kgkd3+gqc=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "crc"
+  ];
+
+  disabledTestPaths = [
+    "test/bench"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/Nicoretti/crc/releases/tag/${version}";
+    description = "Python module for calculating and verifying predefined & custom CRC's";
+    homepage = "https://nicoretti.github.io/crc/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ jleightcap ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/crc16/default.nix b/nixpkgs/pkgs/development/python-modules/crc16/default.nix
new file mode 100644
index 000000000000..ebf86a3571c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crc16/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "crc16";
+  version = "0.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "15nkx0pa4lskwin84flpk8fsw3jqg6wic6v3s83syjqg76h6my61";
+  };
+
+  meta = with lib; {
+    homepage = "https://code.google.com/archive/p/pycrc16/";
+    description = "Python library for calculating CRC16";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/crc32c/default.nix b/nixpkgs/pkgs/development/python-modules/crc32c/default.nix
new file mode 100644
index 000000000000..66d77756f780
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crc32c/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder, pytestCheckHook }:
+
+buildPythonPackage rec {
+  version = "2.3.post0";
+  pname = "crc32c";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "ICRAR";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-lPEojWeAhfWpGR+k+Tuo4n68iZOk7lUDxjWXj5vN4I0=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = {
+    description = "Python software implementation and hardware API of CRC32C checksum algorithm";
+    homepage = "https://github.com/ICRAR/crc32c";
+    license = lib.licenses.lgpl21;
+    maintainers = with lib.maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/crccheck/default.nix b/nixpkgs/pkgs/development/python-modules/crccheck/default.nix
new file mode 100644
index 000000000000..0a9302b8841d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crccheck/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, unittestCheckHook
+}:
+
+let
+  pname = "crccheck";
+  version = "1.3.0";
+in buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "MartinScharrer";
+    repo = "crccheck";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-nujt3RWupvCtk7gORejtSwqqVjW9VwztOVGXBHW9T+k=";
+  };
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Python library for CRCs and checksums";
+    homepage = "https://github.com/MartinScharrer/crccheck";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/crcmod/default.nix b/nixpkgs/pkgs/development/python-modules/crcmod/default.nix
new file mode 100644
index 000000000000..70053eb16713
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crcmod/default.nix
@@ -0,0 +1,17 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "crcmod";
+  version = "1.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "07k0hgr42vw2j92cln3klxka81f33knd7459cn3d8aszvfh52w6w";
+  };
+
+  meta = with lib; {
+    description = "Python module for generating objects that compute the Cyclic Redundancy Check (CRC)";
+    homepage = "https://crcmod.sourceforge.net/";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/credstash/default.nix b/nixpkgs/pkgs/development/python-modules/credstash/default.nix
new file mode 100644
index 000000000000..0267aee76100
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/credstash/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildPythonPackage, fetchPypi, cryptography, boto3, pyyaml, docutils, pytest, fetchpatch }:
+
+buildPythonPackage rec {
+  pname = "credstash";
+  version = "1.17.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6c04e8734ef556ab459018da142dd0b244093ef176b3be5583e582e9a797a120";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/fugue/credstash/commit/9c02ee43ed6e37596cafbca2fe80c532ec19d2d8.patch";
+      sha256 = "dlybrpfLK+PqwWWhH9iXgXHYysZGmcZAFGWNOwsG0xA=";
+    })
+  ];
+  # The install phase puts an executable and a copy of the library it imports in
+  # bin/credstash and bin/credstash.py, despite the fact that the library is also
+  # installed to lib/python<version>/site-packages/credstash.py.
+  # If we apply wrapPythonPrograms to bin/credstash.py then the executable will try
+  # to import the credstash module from the resulting shell script. Removing this
+  # file ensures that Python imports the module from site-packages library.
+  postInstall = "rm $out/bin/credstash.py";
+
+  nativeBuildInputs = [ pytest ];
+
+  propagatedBuildInputs = [ cryptography boto3 pyyaml docutils ];
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A utility for managing secrets in the cloud using AWS KMS and DynamoDB";
+    homepage = "https://github.com/LuminalOSS/credstash";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/criticality-score/default.nix b/nixpkgs/pkgs/development/python-modules/criticality-score/default.nix
new file mode 100644
index 000000000000..e1ff87549364
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/criticality-score/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, pygithub, python-gitlab }:
+
+buildPythonPackage rec {
+  pname = "criticality_score";
+  version = "1.0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5XkVT0blnLG158a01jDfQl1Rx9U1LMsqaMjTdN7Q4QQ=";
+  };
+
+  propagatedBuildInputs = [ pygithub python-gitlab ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [ "criticality_score" ];
+
+  meta = with lib; {
+    description = "Python tool for computing the Open Source Project Criticality Score.";
+    homepage = "https://github.com/ossf/criticality_score";
+    changelog = "https://github.com/ossf/criticality_score/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ wamserma ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cron-descriptor/default.nix b/nixpkgs/pkgs/development/python-modules/cron-descriptor/default.nix
new file mode 100644
index 000000000000..bb946780009e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cron-descriptor/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, python
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cron_descriptor";
+  version = "1.2.35";
+
+  src = fetchFromGitHub {
+    owner = "Salamek";
+    repo = "cron-descriptor";
+    rev = "refs/tags/${version}";
+    hash = "sha256-m+h91cddmEPHCeUWWNpTvb89mFwm8ty8tTnw3YDjCFo=";
+  };
+
+  # remove tests_require, as we don't do linting anyways
+  postPatch = ''
+    sed -i "/'pep8\|flake8\|pep8-naming',/d" setup.py
+  '';
+
+  checkInputs = [
+    mock
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} setup.py test
+  '';
+
+  pythonImportsCheck = [ "cron_descriptor" ];
+
+  meta = with lib; {
+    description = "Library that converts cron expressions into human readable strings";
+    homepage = "https://github.com/Salamek/cron-descriptor";
+    license = licenses.mit;
+    maintainers = with maintainers; [ phaer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/croniter/default.nix b/nixpkgs/pkgs/development/python-modules/croniter/default.nix
new file mode 100644
index 000000000000..12268dc72aee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/croniter/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pytz
+, tzlocal
+}:
+
+buildPythonPackage rec {
+  pname = "croniter";
+  version = "1.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Gm32DqzsO3oKpSqPLvJRrj3Sp8fIuYdOc+eRY21Vo2E=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytz
+    tzlocal
+  ];
+
+  pythonImportsCheck = [
+    "croniter"
+  ];
+
+  meta = with lib; {
+    description = "Library to iterate over datetime object with cron like format";
+    homepage = "https://github.com/kiorky/croniter";
+    changelog = "https://github.com/kiorky/croniter/blob/${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cronsim/default.nix b/nixpkgs/pkgs/development/python-modules/cronsim/default.nix
new file mode 100644
index 000000000000..098dbe711d9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cronsim/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cronsim";
+  version = "2.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "cuu508";
+    repo = "cronsim";
+    rev = "refs/tags/${version}";
+    hash = "sha256-TSVFkMCMmrMXaPJPPNjIML+z98i1iIYuKH7hHiZnJkg=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "cronsim"
+  ];
+
+  meta = with lib; {
+    description = "Cron expression parser and evaluator";
+    homepage = "https://github.com/cuu508/cronsim";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ phaer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/crossplane/default.nix b/nixpkgs/pkgs/development/python-modules/crossplane/default.nix
new file mode 100644
index 000000000000..20b4d4204f4c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crossplane/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, pytestCheckHook
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "crossplane";
+  version = "0.5.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nginxinc";
+    repo = "crossplane";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-DfIF+JvjIREi7zd5ZQ7Co/CIKC5iUeOgR/VLDPmrtTQ=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "crossplane"
+  ];
+
+  meta = with lib; {
+    description = "NGINX configuration file parser and builder";
+    homepage = "https://github.com/nginxinc/crossplane";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ kaction ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/crownstone-cloud/default.nix b/nixpkgs/pkgs/development/python-modules/crownstone-cloud/default.nix
new file mode 100644
index 000000000000..d8ee18a090d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crownstone-cloud/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, certifi
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "crownstone-cloud";
+  version = "1.4.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "crownstone";
+    repo = "crownstone-lib-python-cloud";
+    rev = "refs/tags/${version}";
+    hash = "sha256-CS1zeQiWPnsGCWixCsN9sz08mPORW5sVqIpSFPh0Qt0=";
+  };
+
+  patches = [
+    # Remove asynctest, https://github.com/crownstone/crownstone-lib-python-cloud/pull/4
+    (fetchpatch {
+      name = "remove-asynctest.patch";
+      url = "https://github.com/crownstone/crownstone-lib-python-cloud/commit/7f22c9b284bf8d7f6f43e205816787dd3bb37e78.patch";
+      hash = "sha256-LS1O9LVB14WyBXfuHf/bs1juJ59zWhJ8pL4aGtVrTG8=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    certifi
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    sed -i '/codecov/d' requirements.txt
+  '';
+
+  pythonImportsCheck = [
+    "crownstone_cloud"
+  ];
+
+  meta = with lib; {
+    description = "Python module for communicating with Crownstone Cloud and devices";
+    homepage = "https://github.com/crownstone/crownstone-lib-python-cloud";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/crownstone-core/default.nix b/nixpkgs/pkgs/development/python-modules/crownstone-core/default.nix
new file mode 100644
index 000000000000..b03f76f8f853
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crownstone-core/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyaes
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "crownstone-core";
+  version = "3.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "crownstone";
+    repo = "crownstone-lib-python-core";
+    rev = version;
+    hash = "sha256-zrlCzx7N3aUcTUNa64jSzDdWgQneX+Hc5n8TTTcZ4ck=";
+  };
+
+  propagatedBuildInputs = [
+    pyaes
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "crownstone_core"
+  ];
+
+  meta = with lib; {
+    description = "Python module with shared classes, util functions and definition of Crownstone";
+    homepage = "https://github.com/crownstone/crownstone-lib-python-core";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/crownstone-sse/default.nix b/nixpkgs/pkgs/development/python-modules/crownstone-sse/default.nix
new file mode 100644
index 000000000000..ca2cd4e0d154
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crownstone-sse/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, certifi
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "crownstone-sse";
+  version = "2.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "crownstone";
+    repo = "crownstone-lib-python-sse";
+    rev = version;
+    hash = "sha256-z/z8MmydHkHubwuX02gGbOcOEZ+FHX4i82vAK5gAl+c=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    certifi
+  ];
+
+  # Tests are only providing coverage
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "crownstone_sse"
+  ];
+
+  meta = with lib; {
+    description = "Python module for listening to Crownstone SSE events";
+    homepage = "https://github.com/crownstone/crownstone-lib-python-sse";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/crownstone-uart/default.nix b/nixpkgs/pkgs/development/python-modules/crownstone-uart/default.nix
new file mode 100644
index 000000000000..edfd9dff59e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crownstone-uart/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, crownstone-core
+, buildPythonPackage
+, pyserial
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "crownstone-uart";
+  version = "2.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "crownstone";
+    repo = "crownstone-lib-python-uart";
+    rev = version;
+    hash = "sha256-Sc6BCIRbf1+GraTScmV4EAgwtSE/JXNe0f2XhKyACIY=";
+  };
+
+  propagatedBuildInputs = [
+    crownstone-core
+    pyserial
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "crownstone_uart"
+  ];
+
+  meta = with lib; {
+    description = "Python module for communicating with Crownstone USB dongles";
+    homepage = "https://github.com/crownstone/crownstone-lib-python-uart";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cryptacular/default.nix b/nixpkgs/pkgs/development/python-modules/cryptacular/default.nix
new file mode 100644
index 000000000000..31c0ebace475
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cryptacular/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27, pythonAtLeast
+, coverage, nose, pbkdf2 }:
+
+buildPythonPackage rec {
+  pname = "cryptacular";
+  version = "1.6.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7b529cb2b8a3c7e5be77921bf1ebc653d4d3a8f791375cc6f971b20db2404176";
+  };
+
+  buildInputs = [ coverage nose ];
+  propagatedBuildInputs = [ pbkdf2 ];
+
+  # TODO: tests fail: TypeError: object of type 'NoneType' has no len()
+  doCheck = false;
+
+  # Python >=2.7.15, >=3.6.5 are incompatible:
+  # https://bitbucket.org/dholth/cryptacular/issues/11
+  disabled = isPy27 || pythonAtLeast "3.6";
+
+  meta = with lib; {
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cryptg/default.nix b/nixpkgs/pkgs/development/python-modules/cryptg/default.nix
new file mode 100644
index 000000000000..52fec2afc231
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cryptg/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, cargo
+, rustPlatform
+, rustc
+, setuptools-rust
+, libiconv
+}:
+
+buildPythonPackage rec {
+  pname = "cryptg";
+  version = "0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "cher-nov";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-2HP1mKGPr8wOL5B0APJks3EVBicX2iMFI7vLJGTa1PM=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    hash = "sha256-AqSVFOB9Lfvk9h3GtoYlEOXBEt7YZYLhCDNKM9upQ2U=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-rust
+    rustPlatform.cargoSetupHook
+    rustc
+    cargo
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    libiconv
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "cryptg" ];
+
+  meta = with lib; {
+    description = "Official Telethon extension to provide much faster cryptography for Telegram API requests";
+    homepage = "https://github.com/cher-nov/cryptg";
+    license = licenses.cc0;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cryptodatahub/default.nix b/nixpkgs/pkgs/development/python-modules/cryptodatahub/default.nix
new file mode 100644
index 000000000000..734569297796
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cryptodatahub/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitLab
+
+# build-system
+, setuptools
+
+# dependencies
+, asn1crypto
+, attrs
+, pathlib2
+, python-dateutil
+, six
+, urllib3
+
+# tests
+, beautifulsoup4
+, pyfakefs
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cryptodatahub";
+  version = "0.10.1";
+  format = "pyproject";
+
+  src = fetchFromGitLab {
+    owner = "coroner";
+    repo = "cryptodatahub";
+    rev = "v${version}";
+    hash = "sha256-eLdK5gFrLnbIBB1NTeQzpdCLPdATVjzPn5LhhUsDuwo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    asn1crypto
+    attrs
+    pathlib2
+    python-dateutil
+    six
+    urllib3
+  ];
+
+  pythonImportsCheck = [ "cryptodatahub" ];
+
+  nativeCheckInputs = [
+    beautifulsoup4
+    pyfakefs
+    unittestCheckHook
+  ];
+
+  preCheck = ''
+    # failing tests
+    rm test/updaters/test_common.py
+  '';
+
+  meta = with lib; {
+    description = "Repository of cryptography-related data";
+    homepage = "https://gitlab.com/coroner/cryptodatahub";
+    changelog = "https://gitlab.com/coroner/cryptodatahub/-/blob/${src.rev}/CHANGELOG.rst";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cryptography/default.nix b/nixpkgs/pkgs/development/python-modules/cryptography/default.nix
new file mode 100644
index 000000000000..aa762e315c13
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cryptography/default.nix
@@ -0,0 +1,115 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, callPackage
+, cargo
+, cffi
+, fetchPypi
+, hypothesis
+, iso8601
+, isPyPy
+, libiconv
+, libxcrypt
+, openssl
+, pkg-config
+, pretend
+, py
+, pytest-subtests
+, pytestCheckHook
+, pythonOlder
+, pytz
+, rustc
+, rustPlatform
+, Security
+, setuptoolsRustBuildHook
+}:
+
+let
+  cryptography-vectors = callPackage ./vectors.nix { };
+in
+buildPythonPackage rec {
+  pname = "cryptography";
+  version = "41.0.3"; # Also update the hash in vectors.nix
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bRknQRE+9eMNidy1uVbvThV48wRwhwG4tz044+FGHzQ=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    sourceRoot = "${pname}-${version}/${cargoRoot}";
+    name = "${pname}-${version}";
+    hash = "sha256-LQu7waympGUs+CZun2yDQd2gUUAgyisKBG5mddrfSo0=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--benchmark-disable" ""
+  '';
+
+  cargoRoot = "src/rust";
+
+  nativeBuildInputs = [
+    rustPlatform.cargoSetupHook
+    setuptoolsRustBuildHook
+    cargo
+    rustc
+    pkg-config
+  ] ++ lib.optionals (!isPyPy) [
+    cffi
+  ];
+
+  buildInputs = [
+    openssl
+  ] ++ lib.optionals stdenv.isDarwin [
+    Security
+    libiconv
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    libxcrypt
+  ];
+
+  propagatedBuildInputs = lib.optionals (!isPyPy) [
+    cffi
+  ];
+
+  nativeCheckInputs = [
+    cryptography-vectors
+    hypothesis
+    iso8601
+    pretend
+    py
+    pytestCheckHook
+    pytest-subtests
+    pytz
+  ];
+
+  pytestFlagsArray = [
+    "--disable-pytest-warnings"
+  ];
+
+  disabledTestPaths = [
+    # save compute time by not running benchmarks
+    "tests/bench"
+  ] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
+    # aarch64-darwin forbids W+X memory, but this tests depends on it:
+    # * https://cffi.readthedocs.io/en/latest/using.html#callbacks
+    "tests/hazmat/backends/test_openssl_memleak.py"
+  ];
+
+  meta = with lib; {
+    description = "A package which provides cryptographic recipes and primitives";
+    longDescription = ''
+      Cryptography includes both high level recipes and low level interfaces to
+      common cryptographic algorithms such as symmetric ciphers, message
+      digests, and key derivation functions.
+    '';
+    homepage = "https://github.com/pyca/cryptography";
+    changelog = "https://cryptography.io/en/latest/changelog/#v"
+      + replaceStrings [ "." ] [ "-" ] version;
+    license = with licenses; [ asl20 bsd3 psfl ];
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cryptography/vectors.nix b/nixpkgs/pkgs/development/python-modules/cryptography/vectors.nix
new file mode 100644
index 000000000000..ff8bfa05ed51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cryptography/vectors.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cryptography
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "cryptography-vectors";
+  # The test vectors must have the same version as the cryptography package
+  inherit (cryptography) version;
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "cryptography_vectors";
+    inherit version;
+    hash = "sha256-gN4EUsSzT1b1UY6B69dba5BfVyiq7VIdQuQfTryKQ/s=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  # No tests included
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "cryptography_vectors"
+  ];
+
+  meta = with lib; {
+    description = "Test vectors for the cryptography package";
+    homepage = "https://cryptography.io/en/latest/development/test-vectors/";
+    downloadPage = "https://github.com/pyca/cryptography/tree/master/vectors";
+    license = with licenses; [ asl20 bsd3 ];
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cryptolyzer/default.nix b/nixpkgs/pkgs/development/python-modules/cryptolyzer/default.nix
new file mode 100644
index 000000000000..ba89ff24621a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cryptolyzer/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, attrs
+, buildPythonPackage
+, certvalidator
+, cryptoparser
+, fetchPypi
+, pythonOlder
+, requests
+, six
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "cryptolyzer";
+  version = "0.12.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "CryptoLyzer";
+    inherit version;
+    hash = "sha256-XiMkZeIjTAv8F84eutZoezZl4bJ2xqh4uwroDU24jjg=";
+  };
+
+  propagatedBuildInputs = [
+    certvalidator
+    attrs
+    six
+    urllib3
+    cryptoparser
+    requests
+  ];
+
+  # Tests require networking
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "cryptolyzer"
+  ];
+
+  meta = with lib; {
+    description = "Cryptographic protocol analyzer";
+    homepage = "https://gitlab.com/coroner/cryptolyzer";
+    changelog = "https://gitlab.com/coroner/cryptolyzer/-/blob/v${version}/CHANGELOG.md";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ kranzes ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cryptoparser/default.nix b/nixpkgs/pkgs/development/python-modules/cryptoparser/default.nix
new file mode 100644
index 000000000000..54c5faf307d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cryptoparser/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, attrs
+, asn1crypto
+, cryptodatahub
+, python-dateutil
+, urllib3
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cryptoparser";
+  version = "0.12.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "CryptoParser";
+    inherit version;
+    hash = "sha256-E32fHcuICUMCH5NYT+oFYU7M73bvXb/g1UoJSChzOiA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    asn1crypto
+    attrs
+    cryptodatahub
+    python-dateutil
+    urllib3
+  ];
+
+  pythonImportsCheck = [
+    "cryptoparser"
+  ];
+
+  meta = with lib; {
+    description = "Security protocol parser and generator";
+    homepage = "https://gitlab.com/coroner/cryptoparser";
+    changelog = "https://gitlab.com/coroner/cryptoparser/-/blob/v${version}/CHANGELOG.md";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ kranzes ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/crysp/default.nix b/nixpkgs/pkgs/development/python-modules/crysp/default.nix
new file mode 100644
index 000000000000..dd8d43eac84b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crysp/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, grandalf
+, matplotlib
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "crysp";
+  version = "1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bdcht";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-51SKS6OOXIFT1L3YICR6a4QGSz/rbB8V+Z0u0jMO474=";
+  };
+
+  propagatedBuildInputs = [
+    grandalf
+    matplotlib
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'," ""
+  '';
+
+  pythonImportsCheck = [
+    "crysp"
+  ];
+
+  meta = with lib; {
+    description = "Module that provides crypto-related facilities";
+    homepage = "https://github.com/bdcht/crysp";
+    license = with licenses; [ gpl2Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/crytic-compile/default.nix b/nixpkgs/pkgs/development/python-modules/crytic-compile/default.nix
new file mode 100644
index 000000000000..26e7080c2139
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/crytic-compile/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, cbor2
+, fetchFromGitHub
+, pycryptodome
+, pythonOlder
+, setuptools
+, solc-select
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "crytic-compile";
+  version = "0.3.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "crytic";
+    repo = "crytic-compile";
+    rev = "refs/tags/${version}";
+    hash = "sha256-aO2K0lc3qjKK8CZAbu/lotI5QJ/R+8npSIRX4a6HdrI=";
+  };
+
+  propagatedBuildInputs = [
+    cbor2
+    pycryptodome
+    setuptools
+    solc-select
+    toml
+  ];
+
+  # Test require network access
+  doCheck = false;
+
+  # required for import check to work
+  # PermissionError: [Errno 13] Permission denied: '/homeless-shelter'
+  env.HOME = "/tmp";
+  pythonImportsCheck = [
+    "crytic_compile"
+  ];
+
+  meta = with lib; {
+    description = "Abstraction layer for smart contract build systems";
+    homepage = "https://github.com/crytic/crytic-compile";
+    changelog = "https://github.com/crytic/crytic-compile/releases/tag/${version}";
+    license = licenses.agpl3Plus;
+    maintainers = with maintainers; [ arturcygan hellwolf ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cson/default.nix b/nixpkgs/pkgs/development/python-modules/cson/default.nix
new file mode 100644
index 000000000000..4c1b63946ad2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cson/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, speg
+}:
+
+buildPythonPackage rec {
+  pname = "cson";
+  version = "0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7owBZvzR9ReJiHGX4+g1Sse++jlvwpcGvOta8l7cngE=";
+  };
+
+  propagatedBuildInputs = [ speg ];
+
+  pythonImportsCheck = [ "cson" ];
+
+  meta = with lib; {
+    description = "A python parser for the Coffeescript Object Notation (CSON)";
+    homepage = "https://github.com/avakar/pycson";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ xworld21 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/csrmesh/default.nix b/nixpkgs/pkgs/development/python-modules/csrmesh/default.nix
new file mode 100644
index 000000000000..142756341567
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/csrmesh/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, bluepy
+, buildPythonPackage
+, fetchPypi
+, pycryptodomex
+}:
+
+buildPythonPackage rec {
+  pname = "csrmesh";
+  version = "0.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "03lzam54ypcfvqvikh3gsrivvlidmz1ifdq15xv8c5i3n5b178ag";
+  };
+
+  propagatedBuildInputs = [
+    bluepy
+    pycryptodomex
+  ];
+
+  # Project has no test
+  doCheck = false;
+  pythonImportsCheck = [ "csrmesh" ];
+
+  meta = with lib; {
+    description = "Python implementation of the CSRMesh bridge protocol";
+    homepage = "https://github.com/nkaminski/csrmesh";
+    license = with licenses; [ lgpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/css-html-js-minify/default.nix b/nixpkgs/pkgs/development/python-modules/css-html-js-minify/default.nix
new file mode 100644
index 000000000000..d05941e1cfbe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/css-html-js-minify/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "css-html-js-minify";
+  version = "2.5.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "4a9f11f7e0496f5284d12111f3ba4ff5ff2023d12f15d195c9c48bd97013746c";
+  };
+
+  doCheck = false; # Tests are useless and broken
+
+  pythonImportsCheck = [ "css_html_js_minify" ];
+
+  meta = with lib; {
+    description = "StandAlone Async cross-platform Minifier for the Web";
+    homepage = "https://github.com/juancarlospaco/css-html-js-minify";
+    license = with licenses; [ gpl3Plus lgpl3Plus mit ];
+    maintainers = with maintainers; [ FlorianFranzen ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/css-inline/Cargo.lock b/nixpkgs/pkgs/development/python-modules/css-inline/Cargo.lock
new file mode 100644
index 000000000000..58bca2b6e0f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/css-inline/Cargo.lock
@@ -0,0 +1,1388 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "attohttpc"
+version = "0.25.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e57d6e7a84f33ff3316e97af3180fe7f86597a6a60161c0be70c0e45f382620"
+dependencies = [
+ "flate2",
+ "http",
+ "log",
+ "rustls",
+ "url",
+ "webpki",
+ "webpki-roots",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "built"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b99c4cdc7b2c2364182331055623bdf45254fcb679fea565c40c3c11c101889a"
+dependencies = [
+ "cargo-lock",
+ "chrono",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1"
+
+[[package]]
+name = "byteorder"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+
+[[package]]
+name = "bytes"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be"
+
+[[package]]
+name = "cargo-lock"
+version = "9.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e11c675378efb449ed3ce8de78d75d0d80542fc98487c26aba28eb3b82feac72"
+dependencies = [
+ "semver",
+ "serde",
+ "toml",
+ "url",
+]
+
+[[package]]
+name = "cc"
+version = "1.0.79"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "chrono"
+version = "0.4.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "num-traits",
+ "winapi",
+]
+
+[[package]]
+name = "convert_case"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
+
+[[package]]
+name = "crc32fast"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
+dependencies = [
+ "cfg-if",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7"
+dependencies = [
+ "autocfg",
+ "cfg-if",
+ "crossbeam-utils",
+ "memoffset",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "css-inline"
+version = "0.10.1"
+dependencies = [
+ "attohttpc",
+ "cssparser",
+ "html5ever",
+ "indexmap",
+ "memchr",
+ "selectors",
+ "smallvec",
+ "url",
+]
+
+[[package]]
+name = "css-inline-python"
+version = "0.10.1"
+dependencies = [
+ "built",
+ "css-inline",
+ "pyo3",
+ "pyo3-built",
+ "rayon",
+ "url",
+]
+
+[[package]]
+name = "cssparser"
+version = "0.29.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa"
+dependencies = [
+ "cssparser-macros",
+ "dtoa-short",
+ "itoa",
+ "matches",
+ "phf 0.10.1",
+ "proc-macro2",
+ "quote",
+ "smallvec",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "cssparser-macros"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
+dependencies = [
+ "quote",
+ "syn 2.0.18",
+]
+
+[[package]]
+name = "derive_more"
+version = "0.99.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321"
+dependencies = [
+ "convert_case",
+ "proc-macro2",
+ "quote",
+ "rustc_version",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "dtoa"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "65d09067bfacaa79114679b279d7f5885b53295b1e2cfb4e79c8e4bd3d633169"
+
+[[package]]
+name = "dtoa-short"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbaceec3c6e4211c79e7b1800fb9680527106beb2f9c51904a3210c03a448c74"
+dependencies = [
+ "dtoa",
+]
+
+[[package]]
+name = "either"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
+
+[[package]]
+name = "flate2"
+version = "1.0.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743"
+dependencies = [
+ "crc32fast",
+ "miniz_oxide",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "form_urlencoded"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652"
+dependencies = [
+ "percent-encoding",
+]
+
+[[package]]
+name = "futf"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843"
+dependencies = [
+ "mac",
+ "new_debug_unreachable",
+]
+
+[[package]]
+name = "fxhash"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
+dependencies = [
+ "byteorder",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi 0.9.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
+[[package]]
+name = "hermit-abi"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "html5ever"
+version = "0.26.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7"
+dependencies = [
+ "log",
+ "mac",
+ "markup5ever",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "http"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "iana-time-zone"
+version = "0.1.57"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "idna"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+dependencies = [
+ "autocfg",
+ "hashbrown",
+]
+
+[[package]]
+name = "indoc"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306"
+
+[[package]]
+name = "itoa"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
+
+[[package]]
+name = "js-sys"
+version = "0.3.64"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.146"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b"
+
+[[package]]
+name = "lock_api"
+version = "0.4.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4"
+
+[[package]]
+name = "mac"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
+
+[[package]]
+name = "markup5ever"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016"
+dependencies = [
+ "log",
+ "phf 0.10.1",
+ "phf_codegen 0.10.0",
+ "string_cache",
+ "string_cache_codegen",
+ "tendril",
+]
+
+[[package]]
+name = "matches"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "memoffset"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "miniz_oxide"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
+dependencies = [
+ "adler",
+]
+
+[[package]]
+name = "new_debug_unreachable"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
+
+[[package]]
+name = "nodrop"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb"
+
+[[package]]
+name = "num-traits"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+
+[[package]]
+name = "parking_lot"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-targets",
+]
+
+[[package]]
+name = "percent-encoding"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
+
+[[package]]
+name = "phf"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12"
+dependencies = [
+ "phf_shared 0.8.0",
+]
+
+[[package]]
+name = "phf"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259"
+dependencies = [
+ "phf_macros",
+ "phf_shared 0.10.0",
+ "proc-macro-hack",
+]
+
+[[package]]
+name = "phf_codegen"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815"
+dependencies = [
+ "phf_generator 0.8.0",
+ "phf_shared 0.8.0",
+]
+
+[[package]]
+name = "phf_codegen"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd"
+dependencies = [
+ "phf_generator 0.10.0",
+ "phf_shared 0.10.0",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526"
+dependencies = [
+ "phf_shared 0.8.0",
+ "rand 0.7.3",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6"
+dependencies = [
+ "phf_shared 0.10.0",
+ "rand 0.8.5",
+]
+
+[[package]]
+name = "phf_macros"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0"
+dependencies = [
+ "phf_generator 0.10.0",
+ "phf_shared 0.10.0",
+ "proc-macro-hack",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7"
+dependencies = [
+ "siphasher",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096"
+dependencies = [
+ "siphasher",
+]
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+
+[[package]]
+name = "precomputed-hash"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
+
+[[package]]
+name = "proc-macro-hack"
+version = "0.5.20+deprecated"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.60"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "pyo3"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cffef52f74ec3b1a1baf295d9b8fcc3070327aefc39a6d00656b13c1d0b8885c"
+dependencies = [
+ "cfg-if",
+ "indoc",
+ "libc",
+ "memoffset",
+ "parking_lot",
+ "pyo3-build-config",
+ "pyo3-ffi",
+ "pyo3-macros",
+ "unindent",
+]
+
+[[package]]
+name = "pyo3-build-config"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "713eccf888fb05f1a96eb78c0dbc51907fee42b3377272dc902eb38985f418d5"
+dependencies = [
+ "once_cell",
+ "target-lexicon",
+]
+
+[[package]]
+name = "pyo3-built"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be6d574e0f8cab2cdd1eeeb640cbf845c974519fa9e9b62fa9c08ecece0ca5de"
+
+[[package]]
+name = "pyo3-ffi"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b2ecbdcfb01cbbf56e179ce969a048fd7305a66d4cdf3303e0da09d69afe4c3"
+dependencies = [
+ "libc",
+ "pyo3-build-config",
+]
+
+[[package]]
+name = "pyo3-macros"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b78fdc0899f2ea781c463679b20cb08af9247febc8d052de941951024cd8aea0"
+dependencies = [
+ "proc-macro2",
+ "pyo3-macros-backend",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "pyo3-macros-backend"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60da7b84f1227c3e2fe7593505de274dcf4c8928b4e0a1c23d551a14e4e80a0f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
+dependencies = [
+ "getrandom 0.1.16",
+ "libc",
+ "rand_chacha 0.2.2",
+ "rand_core 0.5.1",
+ "rand_hc",
+ "rand_pcg",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha 0.3.1",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+dependencies = [
+ "getrandom 0.1.16",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom 0.2.10",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
+dependencies = [
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "rand_pcg"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429"
+dependencies = [
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "rayon"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b"
+dependencies = [
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d"
+dependencies = [
+ "crossbeam-channel",
+ "crossbeam-deque",
+ "crossbeam-utils",
+ "num_cpus",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "ring"
+version = "0.16.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"
+dependencies = [
+ "cc",
+ "libc",
+ "once_cell",
+ "spin",
+ "untrusted",
+ "web-sys",
+ "winapi",
+]
+
+[[package]]
+name = "rustc_version"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
+dependencies = [
+ "semver",
+]
+
+[[package]]
+name = "rustls"
+version = "0.21.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e32ca28af694bc1bbf399c33a516dbdf1c90090b8ab23c2bc24f834aa2247f5f"
+dependencies = [
+ "log",
+ "ring",
+ "rustls-webpki",
+ "sct",
+]
+
+[[package]]
+name = "rustls-webpki"
+version = "0.100.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "sct"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "selectors"
+version = "0.24.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416"
+dependencies = [
+ "bitflags",
+ "cssparser",
+ "derive_more",
+ "fxhash",
+ "log",
+ "phf 0.8.0",
+ "phf_codegen 0.8.0",
+ "precomputed-hash",
+ "servo_arc",
+ "smallvec",
+]
+
+[[package]]
+name = "semver"
+version = "1.0.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "serde"
+version = "1.0.164"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.164"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.18",
+]
+
+[[package]]
+name = "serde_spanned"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93107647184f6027e3b7dcb2e11034cf95ffa1e3a682c67951963ac69c1c007d"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "servo_arc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741"
+dependencies = [
+ "nodrop",
+ "stable_deref_trait",
+]
+
+[[package]]
+name = "siphasher"
+version = "0.3.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de"
+
+[[package]]
+name = "smallvec"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
+
+[[package]]
+name = "spin"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
+
+[[package]]
+name = "stable_deref_trait"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
+
+[[package]]
+name = "string_cache"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b"
+dependencies = [
+ "new_debug_unreachable",
+ "once_cell",
+ "parking_lot",
+ "phf_shared 0.10.0",
+ "precomputed-hash",
+ "serde",
+]
+
+[[package]]
+name = "string_cache_codegen"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988"
+dependencies = [
+ "phf_generator 0.10.0",
+ "phf_shared 0.10.0",
+ "proc-macro2",
+ "quote",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "target-lexicon"
+version = "0.12.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b1c7f239eb94671427157bd93b3694320f3668d4e1eff08c7285366fd777fac"
+
+[[package]]
+name = "tendril"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0"
+dependencies = [
+ "futf",
+ "mac",
+ "utf-8",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+
+[[package]]
+name = "toml"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6135d499e69981f9ff0ef2167955a5333c35e36f6937d382974566b3d5b94ec"
+dependencies = [
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "toml_edit",
+]
+
+[[package]]
+name = "toml_datetime"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a76a9312f5ba4c2dec6b9161fdf25d87ad8a09256ccea5a556fef03c706a10f"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.19.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2380d56e8670370eee6566b0bfd4265f65b3f432e8c6d85623f728d4fa31f739"
+dependencies = [
+ "indexmap",
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "winnow",
+]
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unindent"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1766d682d402817b5ac4490b3c3002d91dfa0d22812f341609f97b08757359c"
+
+[[package]]
+name = "untrusted"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
+
+[[package]]
+name = "url"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "percent-encoding",
+]
+
+[[package]]
+name = "utf-8"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
+
+[[package]]
+name = "wasi"
+version = "0.9.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.18",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.18",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1"
+
+[[package]]
+name = "web-sys"
+version = "0.3.64"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "webpki"
+version = "0.22.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "webpki-roots"
+version = "0.23.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b03058f88386e5ff5310d9111d53f48b17d732b401aeb83a8d5190f2ac459338"
+dependencies = [
+ "rustls-webpki",
+]
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "windows"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
+
+[[package]]
+name = "winnow"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca0ace3845f0d96209f0375e6d367e3eb87eb65d27d445bdc9f1843a26f39448"
+dependencies = [
+ "memchr",
+]
diff --git a/nixpkgs/pkgs/development/python-modules/css-inline/default.nix b/nixpkgs/pkgs/development/python-modules/css-inline/default.nix
new file mode 100644
index 000000000000..9eb36c8bd61b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/css-inline/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, rustPlatform
+
+# native darwin dependencies
+, libiconv
+, Security
+
+# tests
+, pytestCheckHook
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "css-inline";
+  version = "0.10.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "Stranger6667";
+    repo = "css-inline";
+    rev = "python-v${version}";
+    hash = "sha256-oBAJv/hAz/itT2WakIw/1X1NvOHX108NoeS6V7k+aG8=";
+  };
+
+  postPatch = ''
+    cd bindings/python
+    ln -s ${./Cargo.lock} Cargo.lock
+  '';
+
+  # call `cargo build --release` in bindings/python and copy the
+  # resulting lock file
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    postPatch = ''
+      cd bindings/python
+      ln -s ${./Cargo.lock} Cargo.lock
+    '';
+    name = "${pname}-${version}";
+    hash = "sha256-SFG1nsP4+I0zH8VeyL1eeaTx0tHNIvmx6M0cko0pqIA=";
+  };
+
+  nativeBuildInputs = [
+    rustPlatform.cargoSetupHook
+    rustPlatform.maturinBuildHook
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    libiconv
+    Security
+  ];
+
+  pythonImportsCheck = [
+    "css_inline"
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Inline CSS into style attributes";
+    homepage = "https://github.com/Stranger6667/css-inline";
+    changelog = "https://github.com/Stranger6667/css-inline/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/css-parser/default.nix b/nixpkgs/pkgs/development/python-modules/css-parser/default.nix
new file mode 100644
index 000000000000..bd2a3258d0b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/css-parser/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "css-parser";
+  version = "1.0.10";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vx6XKtMzROkyBpZPtM2QjZ3e+fzQwB+pPg1zRnU5Q2M=";
+  };
+
+  # Test suite not included in tarball yet
+  # See https://github.com/ebook-utils/css-parser/pull/2
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "css_parser"
+  ];
+
+  meta = with lib; {
+    description = "A CSS Cascading Style Sheets library for Python";
+    homepage = "https://github.com/ebook-utils/css-parser";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ jethro ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cssbeautifier/default.nix b/nixpkgs/pkgs/development/python-modules/cssbeautifier/default.nix
new file mode 100644
index 000000000000..3144c5114fc2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cssbeautifier/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, jsbeautifier
+}:
+
+buildPythonPackage rec {
+  pname = "cssbeautifier";
+  version = "1.14.11";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QFRMK2K7y2TKpefzegLflWVOXOG8rK2sTKHz3InDFRM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [ jsbeautifier ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "cssbeautifier" ];
+
+  meta = with lib; {
+    description = "CSS unobfuscator and beautifier";
+    homepage = "https://pypi.org/project/cssbeautifier/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ traxys ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/csscompressor/default.nix b/nixpkgs/pkgs/development/python-modules/csscompressor/default.nix
new file mode 100644
index 000000000000..b3d08c12e62f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/csscompressor/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "csscompressor";
+  version = "0.9.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "afa22badbcf3120a4f392e4d22f9fff485c044a1feda4a950ecc5eba9dd31a05";
+  };
+
+  doCheck = false; # No tests
+
+  meta = with lib; {
+    description = "A python port of YUI CSS Compressor";
+    homepage = "https://pypi.python.org/pypi/csscompressor";
+    license = licenses.bsd3;
+    maintainers = [];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cssmin/default.nix b/nixpkgs/pkgs/development/python-modules/cssmin/default.nix
new file mode 100644
index 000000000000..929640a7c1e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cssmin/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "cssmin";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1dk723nfm2yf8cp4pj785giqlwv42l0kj8rk40kczvq1hk6g04p0";
+  };
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A Python port of the YUI CSS compression algorithm";
+    homepage = "https://github.com/zacharyvoase/cssmin";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cssselect/default.nix b/nixpkgs/pkgs/development/python-modules/cssselect/default.nix
new file mode 100644
index 000000000000..0accd8c6cbae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cssselect/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, pytestCheckHook
+, lxml
+}:
+
+buildPythonPackage rec {
+  pname = "cssselect";
+  version = "1.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "666b19839cfaddb9ce9d36bfe4c969132c647b92fc9088c4e23f786b30f1b3dc";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    lxml
+  ];
+
+  pythonImportsCheck = [
+    "cssselect"
+  ];
+
+  meta = with lib; {
+    description = "CSS Selectors for Python";
+    homepage = "https://cssselect.readthedocs.io/";
+    changelog = "https://github.com/scrapy/cssselect/v${version}//CHANGES";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cssselect2/default.nix b/nixpkgs/pkgs/development/python-modules/cssselect2/default.nix
new file mode 100644
index 000000000000..9b58da4fdb21
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cssselect2/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, flit-core
+, pythonOlder
+, fetchPypi
+, tinycss2
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cssselect2";
+  version = "0.7.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-HM2YTauJ/GiVUEOspOGwPgzynK2YgPbijjunp0sUqlo=";
+  };
+
+  postPatch = ''
+    sed -i '/^addopts/d' pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [ tinycss2 ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "cssselect2" ];
+
+  meta = with lib; {
+    description = "CSS selectors for Python ElementTree";
+    homepage = "https://github.com/Kozea/cssselect2";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cssutils/default.nix b/nixpkgs/pkgs/development/python-modules/cssutils/default.nix
new file mode 100644
index 000000000000..ab8615b0fe9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cssutils/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, pythonAtLeast
+, pythonOlder
+, fetchpatch
+, fetchPypi
+, setuptools
+, setuptools-scm
+, cssselect
+, jaraco-test
+, lxml
+, mock
+, pytestCheckHook
+, importlib-resources
+}:
+
+buildPythonPackage rec {
+  pname = "cssutils";
+  version = "2.9.0";
+
+  disabled = pythonOlder "3.8";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-iUd7PRfXkOl7n7Te9wh2cGEFV5Wq5vfIKuMulnyb5M0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    cssselect
+    jaraco-test
+    lxml
+    mock
+    pytestCheckHook
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ];
+
+  disabledTests = [
+    # access network
+    "test_parseUrl"
+    "encutils"
+    "website.logging"
+  ];
+
+  pythonImportsCheck = [ "cssutils" ];
+
+  meta = with lib; {
+    description = "A CSS Cascading Style Sheets library for Python";
+    homepage = "https://github.com/jaraco/cssutils";
+    changelog = "https://github.com/jaraco/cssutils/blob/v${version}/CHANGES.rst";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cstruct/default.nix b/nixpkgs/pkgs/development/python-modules/cstruct/default.nix
new file mode 100644
index 000000000000..688fe787af2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cstruct/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "cstruct";
+  version = "5.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "andreax79";
+    repo = "python-cstruct";
+    rev = "v${version}";
+    hash = "sha256-Dwogf0mmxFyBV7tPsuKV6gMZLPSCm7YhzqgJNHpaPFA=";
+  };
+
+  pythonImportsCheck = [
+    "cstruct"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "C-style structs for Python";
+    homepage = "https://github.com/andreax79/python-cstruct";
+    changelog = "https://github.com/andreax79/python-cstruct/blob/v${version}/changelog.txt";
+    license = licenses.mit;
+    maintainers = with maintainers; [ tnias ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/csvw/default.nix b/nixpkgs/pkgs/development/python-modules/csvw/default.nix
new file mode 100644
index 000000000000..3a973db3baa8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/csvw/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonAtLeast
+, pythonOlder
+, attrs
+, isodate
+, python-dateutil
+, rfc3986
+, uritemplate
+, pytestCheckHook
+, pytest-mock
+}:
+
+buildPythonPackage rec {
+  pname = "csvw";
+  version = "1.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "cldf";
+    repo = "csvw";
+    rev = "v${version}";
+    sha256 = "1393xwqawaxsflbq62vks92vv4zch8p6dd1mdvdi7j4vvf0zljkg";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    isodate
+    python-dateutil
+    rfc3986
+    uritemplate
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+  ];
+
+  patchPhase = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov" ""
+  '';
+
+  disabledTests = [
+    # this test is flaky on darwin because it depends on the resolution of filesystem mtimes
+    # https://github.com/cldf/csvw/blob/45584ad63ff3002a9b3a8073607c1847c5cbac58/tests/test_db.py#L257
+    "test_write_file_exists"
+  ] ++ lib.optionals (pythonAtLeast "3.10") [
+    # https://github.com/cldf/csvw/issues/58
+    "test_roundtrip_escapechar"
+    "test_escapequote_escapecharquotechar_final"
+    "test_doubleQuote"
+  ];
+
+  pythonImportsCheck = [
+    "csvw"
+  ];
+
+  meta = with lib; {
+    description = "CSV on the Web";
+    homepage = "https://github.com/cldf/csvw";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ctap-keyring-device/default.nix b/nixpkgs/pkgs/development/python-modules/ctap-keyring-device/default.nix
new file mode 100644
index 000000000000..2c6597aeb7f0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ctap-keyring-device/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonRelaxDepsHook
+, setuptools-scm
+# install requirements
+, fido2
+, keyring
+, cryptography
+# test requirements
+, pytestCheckHook
+}:
+
+let
+  fido2_0 = fido2.overridePythonAttrs (oldAttrs: rec {
+    version = "0.9.3";
+    format = "setuptools";
+    src = fetchPypi {
+      inherit (oldAttrs) pname;
+      inherit version;
+      hash = "sha256-tF6JphCc/Lfxu1E3dqotZAjpXEgi+DolORi5RAg0Zuw=";
+    };
+  });
+in
+buildPythonPackage rec {
+  pname = "ctap-keyring-device";
+  version = "1.0.6";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "sha256-pEJkuz0wxKt2PkowmLE2YC+HPYa2ZiENK7FAW14Ec/Y=";
+  };
+
+  # removing optional dependency needing pyobjc
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace "--flake8 --black --cov" ""
+  '';
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    setuptools-scm
+  ];
+
+  pythonRemoveDeps = [
+    # This is a darwin requirement missing pyobjc
+    "pyobjc-framework-LocalAuthentication"
+  ];
+
+  propagatedBuildInputs = [
+    keyring
+    fido2_0
+    cryptography
+  ];
+
+  pythonImportsCheck = [ "ctap_keyring_device" ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  disabledTests = [
+    # Disabled tests that needs pyobjc or windows
+    "touch_id_ctap_user_verifier"
+    "windows_hello_ctap_user_verifier"
+  ];
+
+  meta = with lib; {
+    description = "CTAP (client-to-authenticator-protocol) device backed by python's keyring library";
+    homepage = "https://github.com/dany74q/ctap-keyring-device";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jbgosselin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ctranslate2/default.nix b/nixpkgs/pkgs/development/python-modules/ctranslate2/default.nix
new file mode 100644
index 000000000000..a86516856fd4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ctranslate2/default.nix
@@ -0,0 +1,84 @@
+{ lib
+, buildPythonPackage
+
+# build-system
+, pybind11
+, setuptools
+
+# dependencies
+, ctranslate2-cpp
+, numpy
+, pyyaml
+
+# tests
+, pytestCheckHook
+, tensorflow-bin
+, torch
+, transformers
+, wurlitzer
+}:
+
+buildPythonPackage rec {
+  inherit (ctranslate2-cpp) pname version src;
+  format = "setuptools";
+
+  # https://github.com/OpenNMT/CTranslate2/tree/master/python
+  sourceRoot = "${src.name}/python";
+
+  nativeBuildInputs = [
+    pybind11
+    setuptools
+  ];
+
+  buildInputs = [
+    ctranslate2-cpp
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    pyyaml
+  ];
+
+  pythonImportsCheck = [
+    # https://opennmt.net/CTranslate2/python/overview.html
+    "ctranslate2"
+    "ctranslate2.converters"
+    "ctranslate2.models"
+    "ctranslate2.specs"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    tensorflow-bin
+    torch
+    transformers
+    wurlitzer
+  ];
+
+  preCheck = ''
+    # run tests against build result, not sources
+    rm -rf ctranslate2
+
+    export HOME=$TMPDIR
+  '';
+
+  disabledTests = [
+    # AssertionError: assert 'int8' in {'float32'}
+    "test_get_supported_compute_types"
+  ];
+
+  disabledTestPaths = [
+    # TODO: ModuleNotFoundError: No module named 'opennmt'
+    "tests/test_opennmt_tf.py"
+    # OSError: We couldn't connect to 'https://huggingface.co' to load this file
+    "tests/test_transformers.py"
+  ];
+
+  meta = with lib; {
+    description = "Fast inference engine for Transformer models";
+    homepage = "https://github.com/OpenNMT/CTranslate2";
+    changelog = "https://github.com/OpenNMT/CTranslate2/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cu2qu/default.nix b/nixpkgs/pkgs/development/python-modules/cu2qu/default.nix
new file mode 100644
index 000000000000..ddad0b741b1e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cu2qu/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+
+# build
+, cython
+, setuptools-scm
+, setuptools
+
+# propagates
+, defcon
+, fonttools
+
+# tests
+, pytestCheckHook
+}:
+
+let
+  pname = "cu2qu";
+  version = "1.6.7.post2";
+in
+buildPythonPackage rec {
+  inherit pname version;
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-HfVi2ZvWBZImCI9ENwK/Uc/djMY2I/IxN0WaeNe/WAg=";
+    extension = "zip";
+  };
+
+  nativeBuildInputs = [
+    cython
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    defcon
+    fonttools
+  ] ++ fonttools.optional-dependencies.ufo;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/googlefonts/cu2qu/releases/tag/v${version}";
+    description = "Cubic-to-quadratic bezier curve conversion";
+    homepage = "https://github.com/googlefonts/cu2qu";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cucumber-tag-expressions/default.nix b/nixpkgs/pkgs/development/python-modules/cucumber-tag-expressions/default.nix
new file mode 100644
index 000000000000..b0cdc10735b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cucumber-tag-expressions/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, py
+, pytestCheckHook
+, pytest-html
+ }:
+
+buildPythonPackage rec {
+  pname = "cucumber-tag-expressions";
+  version = "4.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e314d5fed6eebb2f90380271f562248fb15e18636764faf40f4dde4b28b1f960";
+  };
+
+  nativeCheckInputs = [
+    py
+    pytestCheckHook
+    pytest-html
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/cucumber/tag-expressions";
+    description = "Provides tag-expression parser for cucumber/behave";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxxk ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cufflinks/default.nix b/nixpkgs/pkgs/development/python-modules/cufflinks/default.nix
new file mode 100644
index 000000000000..cc9f4ac69b4e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cufflinks/default.nix
@@ -0,0 +1,48 @@
+{ lib, buildPythonPackage, fetchPypi
+, chart-studio
+, colorlover
+, ipython
+, ipywidgets
+, pytest
+, nose
+, numpy
+, pandas
+, six
+, statsmodels
+}:
+
+buildPythonPackage rec {
+  pname = "cufflinks";
+  version = "0.17.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0i56062k54dlg5iz3qyl1ykww62mpkp8jr4n450h0c60dm0b7ha8";
+  };
+
+  propagatedBuildInputs = [
+    chart-studio
+    colorlover
+    ipython
+    ipywidgets
+    numpy
+    pandas
+    six
+    statsmodels
+  ];
+
+  nativeCheckInputs = [ pytest nose ];
+
+  # ignore tests which are incompatible with pandas>=1.0
+  # https://github.com/santosjorge/cufflinks/issues/236
+  checkPhase = ''
+    pytest tests.py -k 'not bar_row'
+  '';
+
+  meta = with lib; {
+    description = "Productivity Tools for Plotly + Pandas";
+    homepage = "https://github.com/santosjorge/cufflinks";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cupy/default.nix b/nixpkgs/pkgs/development/python-modules/cupy/default.nix
new file mode 100644
index 000000000000..e5de149fca14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cupy/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cython
+, fastrlock
+, numpy
+, wheel
+, pytestCheckHook
+, mock
+, setuptools
+, cudaPackages
+, addOpenGLRunpath
+, pythonOlder
+}:
+
+let
+  inherit (cudaPackages) cudatoolkit cudnn cutensor nccl;
+in buildPythonPackage rec {
+  pname = "cupy";
+  version = "12.2.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+V/9Cv6sthewSP4Cjt4HuX3J6VrKFhCgIrHz0gqaAn4=";
+  };
+
+  # See https://docs.cupy.dev/en/v10.2.0/reference/environment.html. Seting both
+  # CUPY_NUM_BUILD_JOBS and CUPY_NUM_NVCC_THREADS to NIX_BUILD_CORES results in
+  # a small amount of thrashing but it turns out there are a large number of
+  # very short builds and a few extremely long ones, so setting both ends up
+  # working nicely in practice.
+  preConfigure = ''
+    export CUDA_PATH=${cudatoolkit}
+    export CUPY_NUM_BUILD_JOBS="$NIX_BUILD_CORES"
+    export CUPY_NUM_NVCC_THREADS="$NIX_BUILD_CORES"
+  '';
+
+  nativeBuildInputs = [
+    addOpenGLRunpath
+    cython
+  ];
+
+  LDFLAGS = "-L${cudatoolkit}/lib/stubs";
+
+  propagatedBuildInputs = [
+    cudatoolkit
+    cudnn
+    cutensor
+    nccl
+    fastrlock
+    numpy
+    setuptools
+    wheel
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+  ];
+
+  # Won't work with the GPU, whose drivers won't be accessible from the build
+  # sandbox
+  doCheck = false;
+
+  postFixup = ''
+    find $out -type f \( -name '*.so' -or -name '*.so.*' \) | while read lib; do
+      addOpenGLRunpath "$lib"
+    done
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    description = "A NumPy-compatible matrix library accelerated by CUDA";
+    homepage = "https://cupy.chainer.org/";
+    changelog = "https://github.com/cupy/cupy/releases/tag/v${version}";
+    license = licenses.mit;
+    platforms = [ "x86_64-linux" ];
+    maintainers = with maintainers; [ hyphon81 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/curio/default.nix b/nixpkgs/pkgs/development/python-modules/curio/default.nix
new file mode 100644
index 000000000000..501cdd442ab9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/curio/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, pytestCheckHook
+, sphinx
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "curio";
+  version = "1.6";
+  format = "setuptools";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VipYbbICFrp9K+gmPeuesHnlYEj5uJBtEdX0WqgcUkc=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    sphinx
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  disabledTests = [
+    "test_aside_basic" # times out
+    "test_write_timeout" # flaky, does not always time out
+    "test_aside_cancel" # fails because modifies PYTHONPATH and cant find pytest
+    "test_ssl_outgoing" # touches network
+    "test_unix_echo" # socket bind error on hydra when built with other packages
+    "test_unix_ssl_server" # socket bind error on hydra when built with other packages
+  ] ++ lib.optionals stdenv.isDarwin [
+    # connects to python.org:1, expects an OsError, hangs in the darwin sandbox
+    "test_create_bad_connection"
+  ];
+
+  pythonImportsCheck = [ "curio" ];
+
+  meta = with lib; {
+    description = "Library for performing concurrent I/O with coroutines in Python";
+    homepage = "https://github.com/dabeaz/curio";
+    changelog = "https://github.com/dabeaz/curio/raw/${version}/CHANGES";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/curlify/default.nix b/nixpkgs/pkgs/development/python-modules/curlify/default.nix
new file mode 100644
index 000000000000..dbe335c71dec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/curlify/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchFromGitHub, requests }:
+
+buildPythonPackage {
+  pname = "curlify";
+  version = "2.2.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "ofw";
+    repo = "curlify";
+    rev = "b914625b12f9b05c39f305b47ebd0d1f061af24d";
+    hash = "sha256-yDHmH35TtQDJB0na1V98RtBuVHX5TmKC72hzzs1DQK8=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  meta = with lib; {
+    description = "Convert python requests request object to cURL command";
+    homepage = "https://github.com/ofw/curlify";
+    license = licenses.mit;
+    maintainers = with maintainers; [ chrpinedo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/curtsies/default.nix b/nixpkgs/pkgs/development/python-modules/curtsies/default.nix
new file mode 100644
index 000000000000..4a17769e18e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/curtsies/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, stdenv
+, backports-cached-property
+, blessed
+, buildPythonPackage
+, cwcwidth
+, fetchPypi
+, pyte
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "curtsies";
+  version = "0.4.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-br4zIVvXyShRpQYEnHIMykz1wZLBZlwdepigTEcCdg4=";
+  };
+
+  propagatedBuildInputs = [
+    blessed
+    cwcwidth
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    backports-cached-property
+  ];
+
+  nativeCheckInputs = [
+    pyte
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Curses-like terminal wrapper, with colored strings!";
+    homepage = "https://github.com/bpython/curtsies";
+    changelog = "https://github.com/bpython/curtsies/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ flokli ];
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/curve25519-donna/default.nix b/nixpkgs/pkgs/development/python-modules/curve25519-donna/default.nix
new file mode 100644
index 000000000000..ea96efb91843
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/curve25519-donna/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "curve25519-donna";
+  version = "1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1w0vkjyh4ki9n98lr2hg09f1lr1g3pz48kshrlic01ba6pasj60q";
+  };
+
+  meta = with lib; {
+    description = "Python wrapper for the portable curve25519-donna implementation";
+    homepage = "http://code.google.com/p/curve25519-donna/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cvelib/default.nix b/nixpkgs/pkgs/development/python-modules/cvelib/default.nix
new file mode 100644
index 000000000000..b44c51e4014c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cvelib/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, jsonschema
+, pytestCheckHook
+, pythonOlder
+, requests
+, testers
+, cve
+}:
+
+buildPythonPackage rec {
+  pname = "cvelib";
+  version = "1.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "RedHatProductSecurity";
+    repo = "cvelib";
+    rev = "tags/${version}";
+    hash = "sha256-hJPcxnc4iQzsYNNVJ9fw6yQl+5K7pdtjHT6oMmBx/Zs=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = "v${version}";
+
+  propagatedBuildInputs = [
+    click
+    jsonschema
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "cvelib"
+  ];
+
+  passthru.tests.version = testers.testVersion { package = cve; };
+
+  meta = with lib; {
+    description = "Library and a command line interface for the CVE Services API";
+    homepage = "https://github.com/RedHatProductSecurity/cvelib";
+    license = licenses.mit;
+    maintainers = with maintainers; [ raboof ];
+    mainProgram = "cve";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cvss/default.nix b/nixpkgs/pkgs/development/python-modules/cvss/default.nix
new file mode 100644
index 000000000000..140852cb98be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cvss/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, jsonschema
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cvss";
+  version = "2.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "RedHatProductSecurity";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-gD9MreJQPaxziy02Wt3BGFiIoQ/+pW3KqiNfNlTijJY=";
+  };
+
+  nativeCheckInputs = [
+    jsonschema
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "cvss"
+  ];
+
+  disabledTests = [
+    # Tests require additional data
+    "test_calculator"
+    "test_cvsslib"
+    "test_json_ordering"
+    "test_json_schema_repr"
+    "test_random"
+    "test_rh_vector"
+    "test_simple"
+    "test_simple_31"
+  ];
+
+  meta = with lib; {
+    description = "Library for CVSS2/3";
+    homepage = "https://github.com/RedHatProductSecurity/cvss";
+    changelog = "https://github.com/RedHatProductSecurity/cvss/releases/tag/v${version}";
+    license = with licenses; [ lgpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cvxopt/default.nix b/nixpkgs/pkgs/development/python-modules/cvxopt/default.nix
new file mode 100644
index 000000000000..3e94238709d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cvxopt/default.nix
@@ -0,0 +1,76 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, python
+, blas
+, lapack
+, suitesparse
+, unittestCheckHook
+, glpk ? null
+, gsl ? null
+, fftw ? null
+, withGlpk ? true
+, withGsl ? true
+, withFftw ? true
+}:
+
+assert (!blas.isILP64) && (!lapack.isILP64);
+
+buildPythonPackage rec {
+  pname = "cvxopt";
+  version = "1.3.2";
+
+  disabled = isPyPy; # hangs at [translation:info]
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NGH6QsGyJAuk2h2YXKc1A5FBV/xMd0FzJ+1tfYWs2+Y=";
+  };
+
+  buildInputs = [ blas lapack ];
+
+  # similar to Gsl, glpk, fftw there is also a dsdp interface
+  # but dsdp is not yet packaged in nixpkgs
+  env = {
+    CVXOPT_BLAS_LIB = "blas";
+    CVXOPT_LAPACK_LIB = "lapack";
+    CVXOPT_BUILD_DSDP = "0";
+    CVXOPT_SUITESPARSE_LIB_DIR = "${lib.getLib suitesparse}/lib";
+    CVXOPT_SUITESPARSE_INC_DIR = "${lib.getDev suitesparse}/include";
+  } // lib.optionalAttrs withGsl {
+    CVXOPT_BUILD_GSL = "1";
+    CVXOPT_GSL_LIB_DIR= "${lib.getLib gsl}/lib";
+    CVXOPT_GSL_INC_DIR= "${lib.getDev gsl}/include";
+  } // lib.optionalAttrs withGlpk {
+    CVXOPT_BUILD_GLPK = "1";
+    CVXOPT_GLPK_LIB_DIR = "${lib.getLib glpk}/lib";
+    CVXOPT_GLPK_INC_DIR = "${lib.getDev glpk}/include";
+  } // lib.optionalAttrs withFftw {
+    CVXOPT_BUILD_FFTW = "1";
+    CVXOPT_FFTW_LIB_DIR = "${lib.getLib fftw}/lib";
+    CVXOPT_FFTW_INC_DIR = "${lib.getDev fftw}/include";
+  };
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  unittestFlagsArray = [ "-s" "tests" ];
+
+  meta = with lib; {
+    homepage = "https://cvxopt.org/";
+    description = "Python Software for Convex Optimization";
+    longDescription = ''
+      CVXOPT is a free software package for convex optimization based on the
+      Python programming language. It can be used with the interactive
+      Python interpreter, on the command line by executing Python scripts,
+      or integrated in other software via Python extension modules. Its main
+      purpose is to make the development of software for convex optimization
+      applications straightforward by building on Python's extensive
+      standard library and on the strengths of Python as a high-level
+      programming language.
+    '';
+    maintainers = with maintainers; [ edwtjo ];
+    license = licenses.gpl3Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cvxpy/default.nix b/nixpkgs/pkgs/development/python-modules/cvxpy/default.nix
new file mode 100644
index 000000000000..3d34b6edda8a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cvxpy/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cvxopt
+, ecos
+, fetchPypi
+, numpy
+, osqp
+, pytestCheckHook
+, pythonOlder
+, scipy
+, scs
+, setuptools
+, wheel
+, pybind11
+, useOpenmp ? (!stdenv.isDarwin)
+}:
+
+buildPythonPackage rec {
+  pname = "cvxpy";
+  version = "1.4.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ep7zTjxX/4yETYbwo4NPtVda8ZIzlHY53guld8YSLj4=";
+  };
+
+  # we need to patch out numpy version caps from upstream
+  postPatch = ''
+    sed -i 's/\(numpy>=[0-9.]*\),<[0-9.]*;/\1;/g' pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+    pybind11
+  ];
+
+  propagatedBuildInputs = [
+    cvxopt
+    ecos
+    numpy
+    osqp
+    scipy
+    scs
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Required flags from https://github.com/cvxpy/cvxpy/releases/tag/v1.1.11
+  preBuild = lib.optionalString useOpenmp ''
+    export CFLAGS="-fopenmp"
+    export LDFLAGS="-lgomp"
+  '';
+
+  pytestFlagsArray = [
+    "cvxpy"
+  ];
+
+  disabledTests = [
+   # Disable the slowest benchmarking tests, cuts test time in half
+    "test_tv_inpainting"
+    "test_diffcp_sdp_example"
+    "test_huber"
+    "test_partial_problem"
+    # https://github.com/cvxpy/cvxpy/issues/2174
+    "test_scipy_mi_time_limit_reached"
+  ] ++ lib.optionals stdenv.isAarch64 [
+    "test_ecos_bb_mi_lp_2" # https://github.com/cvxpy/cvxpy/issues/1241#issuecomment-780912155
+  ];
+
+  pythonImportsCheck = [
+    "cvxpy"
+  ];
+
+  meta = with lib; {
+    description = "A domain-specific language for modeling convex optimization problems in Python";
+    homepage = "https://www.cvxpy.org/";
+    downloadPage = "https://github.com/cvxpy/cvxpy//releases";
+    changelog = "https://github.com/cvxpy/cvxpy/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cwcwidth/default.nix b/nixpkgs/pkgs/development/python-modules/cwcwidth/default.nix
new file mode 100644
index 000000000000..85d20fc6f464
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cwcwidth/default.nix
@@ -0,0 +1,39 @@
+{ lib, buildPythonPackage, fetchPypi, cython, pytestCheckHook, setuptools }:
+
+buildPythonPackage rec {
+  pname = "cwcwidth";
+  version = "0.1.9";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8Z0RoBSNSoys0GTJbpO8qM40FaGGroIEA49F4Qjbdrg=";
+  };
+
+  nativeBuildInputs = [ cython setuptools ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  preCheck = ''
+    # Hack needed to make pytest + cython work
+    # https://github.com/NixOS/nixpkgs/pull/82410#issuecomment-827186298
+    export HOME=$(mktemp -d)
+    cp -r $TMP/$sourceRoot/tests $HOME
+    pushd $HOME
+
+    # locale settings used by upstream, has the effect of skipping
+    # otherwise-failing tests on darwin
+    export LC_ALL='C.UTF-8'
+    export LANG='C.UTF-8'
+  '';
+  postCheck = "popd";
+
+  pythonImportsCheck = [ "cwcwidth" ];
+
+  meta = with lib; {
+    description = "Python bindings for wc(s)width";
+    homepage = "https://github.com/sebastinas/cwcwidth";
+    changelog = "https://github.com/sebastinas/cwcwidth/blob/main/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cwl-upgrader/default.nix b/nixpkgs/pkgs/development/python-modules/cwl-upgrader/default.nix
new file mode 100644
index 000000000000..97f2ff499c3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cwl-upgrader/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mypy-extensions
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, ruamel-yaml
+, schema-salad
+}:
+
+buildPythonPackage rec {
+  pname = "cwl-upgrader";
+  version = "1.2.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "common-workflow-language";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-yvgGMGo4QK+PRDzqlOH4rP49fnJUlbYB9B5AnlX+LF8=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "ruamel.yaml >= 0.15, < 0.17.22" "ruamel.yaml" \
+      --replace "setup_requires=PYTEST_RUNNER," ""
+    sed -i "/ruamel.yaml/d" setup.py
+  '';
+
+  propagatedBuildInputs = [
+    mypy-extensions
+    ruamel-yaml
+    schema-salad
+  ];
+
+  nativeCheckInputs = [
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "cwlupgrader"
+  ];
+
+  meta = with lib; {
+    description = "Library to interface with Yolink";
+    homepage = "https://github.com/common-workflow-language/cwl-utils";
+    changelog = "https://github.com/common-workflow-language/cwl-utils/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cwl-utils/default.nix b/nixpkgs/pkgs/development/python-modules/cwl-utils/default.nix
new file mode 100644
index 000000000000..77f81963eefc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cwl-utils/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, cwl-upgrader
+, cwlformat
+, fetchFromGitHub
+, packaging
+, pytest-mock
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, rdflib
+, requests
+, ruamel-yaml
+, schema-salad
+}:
+
+buildPythonPackage rec {
+  pname = "cwl-utils";
+  version = "0.29";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "common-workflow-language";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-XxfeBikJcRcUCIVDAmPTtcrrgvZYrRKpjs5bmMokeeI=";
+  };
+
+  propagatedBuildInputs = [
+    cwl-upgrader
+    packaging
+    rdflib
+    requests
+    ruamel-yaml
+    schema-salad
+  ];
+
+  nativeCheckInputs = [
+    cwlformat
+    pytest-mock
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "cwl_utils"
+  ];
+
+  disabledTests = [
+    # Don't run tests which require Node.js
+    "test_context_multiple_regex"
+    "test_value_from_two_concatenated_expressions"
+    "test_graph_split"
+    "test_caches_js_processes"
+    "test_load_document_with_remote_uri"
+    # Don't run tests which require network access
+    "test_remote_packing"
+    "test_remote_packing_github_soft_links"
+  ];
+
+  meta = with lib; {
+    description = "Utilities for CWL";
+    homepage = "https://github.com/common-workflow-language/cwl-utils";
+    changelog = "https://github.com/common-workflow-language/cwl-utils/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cwlformat/default.nix b/nixpkgs/pkgs/development/python-modules/cwlformat/default.nix
new file mode 100644
index 000000000000..0703175d0275
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cwlformat/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+, pythonOlder
+, ruamel-yaml
+}:
+
+buildPythonPackage rec {
+  pname = "cwlformat";
+  version = "2022.02.18";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "rabix";
+    repo = "cwl-format";
+    rev = "refs/tags/${version}";
+    hash = "sha256-FI8hUgb/KglTkubZ+StzptoSsYal71ITyyFNg7j48yk=";
+  };
+
+  patches = [
+    # https://github.com/rabix/cwl-format/pull/21
+    (fetchpatch {
+      name = "fix-for-ruamel-yaml-0.17.23.patch";
+      url = "https://github.com/rabix/cwl-format/commit/9d54330c73c454d2ccacd55e2d51a4145f282041.patch";
+      hash = "sha256-TZGK7T2gzxMvreCLtl3nkuPrqL2KzgrO3yCNmd5lY3g=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    ruamel-yaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "cwlformat"
+  ];
+
+  meta = with lib; {
+    description = "Code formatter for CWL";
+    homepage = "https://github.com/rabix/cwl-format";
+    changelog = "https://github.com/rabix/cwl-format/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cx-freeze/default.nix b/nixpkgs/pkgs/development/python-modules/cx-freeze/default.nix
new file mode 100644
index 000000000000..e8b27794ae46
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cx-freeze/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, ncurses
+, importlib-metadata
+, setuptools
+, wheel
+, patchelf
+}:
+
+buildPythonPackage rec {
+  pname = "cx-freeze";
+  version = "6.15.10";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "cx_Freeze";
+    inherit version;
+    hash = "sha256-Bc0md1lpL1EYYdIoYNNeKgW/v3OPliwVdhi7jHcdIyA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    importlib-metadata # upstream has this for 3.8 as well
+    ncurses
+    setuptools
+  ];
+
+  postPatch = ''
+    # timestamp need to come after 1980 for zipfiles and nix store is set to epoch
+    substituteInPlace cx_Freeze/freezer.py --replace "st.st_mtime" "time.time()"
+
+    sed -i /patchelf/d pyproject.toml
+    substituteInPlace pyproject.toml \
+      --replace 'setuptools>=61.2,<67' setuptools
+  '';
+
+  makeWrapperArgs = [
+    "--prefix"
+    "PATH"
+    ":"
+    (lib.makeBinPath [ patchelf ])
+  ];
+
+  # fails to find Console even though it exists on python 3.x
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A set of scripts and modules for freezing Python scripts into executables";
+    homepage = "https://marcelotduarte.github.io/cx_Freeze/";
+    changelog = "https://github.com/marcelotduarte/cx_Freeze/releases/tag/${version}";
+    license = licenses.psfl;
+    maintainers = with maintainers; [ ];
+    mainProgram = "cxfreeze";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cx_oracle/default.nix b/nixpkgs/pkgs/development/python-modules/cx_oracle/default.nix
new file mode 100644
index 000000000000..3b7d701f1114
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cx_oracle/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, odpic }:
+
+buildPythonPackage rec {
+  pname = "cx_Oracle";
+  version = "8.3.0";
+
+  buildInputs = [ odpic ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3b2d215af4441463c97ea469b9cc307460739f89fdfa8ea222ea3518f1a424d9";
+  };
+
+  preConfigure = ''
+    export ODPIC_INC_DIR="${odpic}/include"
+    export ODPIC_LIB_DIR="${odpic}/lib"
+  '';
+
+  # Check need an Oracle database to run
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python interface to Oracle";
+    homepage = "https://oracle.github.io/python-cx_Oracle";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ y0no ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cxxfilt/default.nix b/nixpkgs/pkgs/development/python-modules/cxxfilt/default.nix
new file mode 100644
index 000000000000..8b9c8f979c21
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cxxfilt/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, gcc-unwrapped
+}:
+buildPythonPackage rec {
+  pname = "cxxfilt";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7df6464ba5e8efbf0d8974c0b2c78b32546676f06059a83515dbdfa559b34214";
+  };
+
+  postPatch = let
+    libstdcpp = "${lib.getLib gcc-unwrapped}/lib/libstdc++${stdenv.hostPlatform.extensions.sharedLibrary}";
+  in ''
+    substituteInPlace cxxfilt/__init__.py \
+      --replace "find_any_library('stdc++', 'c++')" '"${libstdcpp}"'
+  '';
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "cxxfilt"
+  ];
+
+  meta = with lib; {
+    description = "Demangling C++ symbols in Python / interface to abi::__cxa_demangle ";
+    homepage = "https://github.com/afq984/python-cxxfilt";
+    license = licenses.bsd2;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cycler/default.nix b/nixpkgs/pkgs/development/python-modules/cycler/default.nix
new file mode 100644
index 000000000000..9df059251241
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cycler/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, coverage
+, nose
+, six
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "cycler";
+  version = "0.11.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f";
+  };
+
+  nativeCheckInputs = [ coverage nose ];
+  propagatedBuildInputs = [ six ];
+
+  checkPhase = ''
+    ${python.interpreter} run_tests.py
+  '';
+
+  # Tests were not included in release.
+  # https://github.com/matplotlib/cycler/issues/31
+  doCheck = false;
+
+  meta = {
+    description = "Composable style cycles";
+    homepage = "https://github.com/matplotlib/cycler";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cyclonedx-python-lib/default.nix b/nixpkgs/pkgs/development/python-modules/cyclonedx-python-lib/default.nix
new file mode 100644
index 000000000000..9abc6abced01
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cyclonedx-python-lib/default.nix
@@ -0,0 +1,100 @@
+{ lib
+, buildPythonPackage
+, ddt
+, fetchFromGitHub
+, importlib-metadata
+, jsonschema
+, license-expression
+, lxml
+, packageurl-python
+, py-serializable
+, pythonRelaxDepsHook
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, requirements-parser
+, sortedcontainers
+, setuptools
+, toml
+, types-setuptools
+, types-toml
+, xmldiff
+}:
+
+buildPythonPackage rec {
+  pname = "cyclonedx-python-lib";
+  version = "5.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "CycloneDX";
+    repo = "cyclonedx-python-lib";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-M3aR3lCNtPIve1o16QLSnxrULhtXkuOXNYtOv2FmPMQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    importlib-metadata
+    license-expression
+    packageurl-python
+    requirements-parser
+    setuptools
+    sortedcontainers
+    toml
+    py-serializable
+    types-setuptools
+    types-toml
+  ];
+
+  nativeCheckInputs = [
+    ddt
+    jsonschema
+    lxml
+    pytestCheckHook
+    xmldiff
+  ];
+
+  pythonImportsCheck = [
+    "cyclonedx"
+  ];
+
+  pythonRelaxDeps = [
+    "py-serializable"
+  ];
+
+  preCheck = ''
+    export PYTHONPATH=tests''${PYTHONPATH+:$PYTHONPATH}
+  '';
+
+  pytestFlagsArray = [
+    "tests/"
+  ];
+
+  disabledTests = [
+    # These tests require network access
+    "test_bom_v1_3_with_metadata_component"
+    "test_bom_v1_4_with_metadata_component"
+    # AssertionError: <ValidationError: "{'algorithm': 'ES256', ...
+    "TestJson"
+  ];
+
+  disabledTestPaths = [
+    # Test failures seem py-serializable related
+    "tests/test_output_xml.py"
+  ];
+
+  meta = with lib; {
+    description = "Python library for generating CycloneDX SBOMs";
+    homepage = "https://github.com/CycloneDX/cyclonedx-python-lib";
+    changelog = "https://github.com/CycloneDX/cyclonedx-python-lib/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cymem/default.nix b/nixpkgs/pkgs/development/python-modules/cymem/default.nix
new file mode 100644
index 000000000000..f168ea39a371
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cymem/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "cymem";
+  version = "2.0.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "explosion";
+    repo = "cymem";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-e4lgV39lwC2Goqmd8Jjra+znuCpxsv2IsRXfFbQkGN8=";
+  };
+
+  propagatedBuildInputs = [
+    cython
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    TEMPDIR=$(mktemp -d)
+    cp -R cymem/tests $TEMPDIR/
+    pushd $TEMPDIR
+  '';
+
+  postCheck = ''
+    popd
+  '';
+
+  pythonImportsCheck = [
+    "cymem"
+  ];
+
+  meta = with lib; {
+    description = "Cython memory pool for RAII-style memory management";
+    homepage = "https://github.com/explosion/cymem";
+    changelog = "https://github.com/explosion/cymem/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cypari2/default.nix b/nixpkgs/pkgs/development/python-modules/cypari2/default.nix
new file mode 100644
index 000000000000..c2bdca1bfe69
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cypari2/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, python
+, fetchpatch
+, fetchPypi
+, pari
+, gmp
+, cython
+, cysignals
+}:
+
+buildPythonPackage rec {
+  pname = "cypari2";
+  # upgrade may break sage, please test the sage build or ping @timokau on upgrade
+  version = "2.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "17beb467d3cb39fffec3227c468f0dd8db8a09129faeb95a6bb4c84b2b6c6683";
+  };
+
+  patches = [
+    # patch to avoid some segfaults in sage's totallyreal.pyx test.
+    # (https://trac.sagemath.org/ticket/27267). depends on Cython patch.
+    (fetchpatch {
+      name = "use-trashcan-for-gen.patch";
+      url = "https://raw.githubusercontent.com/sagemath/sage/b6ea17ef8e4d652de0a85047bac8d41e90b25555/build/pkgs/cypari/patches/trashcan.patch";
+      hash = "sha256-w4kktWb9/aR9z4CjrUvAMOxEwRN2WkubaKzQttN8rU8=";
+    })
+  ];
+
+  # This differs slightly from the default python installPhase in that it pip-installs
+  # "." instead of "*.whl".
+  # That is because while the default install phase succeeds to build the package,
+  # it fails to generate the file "auto_paridecl.pxd".
+  installPhase = ''
+    export PYTHONPATH="$out/${python.sitePackages}:$PYTHONPATH"
+
+    # install "." instead of "*.whl"
+    pip install . --no-index --no-warn-script-location --prefix="$out" --no-cache
+  '';
+
+  nativeBuildInputs = [
+    pari
+    python.pythonOnBuildForHost.pkgs.pip
+  ];
+
+  buildInputs = [
+    gmp
+  ];
+
+  propagatedBuildInputs = [
+    cysignals
+    cython
+  ];
+
+  checkPhase = ''
+    make check
+  '';
+
+  meta = with lib; {
+    description = "Cython bindings for PARI";
+    license = licenses.gpl2Plus;
+    maintainers = teams.sage.members;
+    homepage = "https://github.com/defeo/cypari2";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cypherpunkpay/default.nix b/nixpkgs/pkgs/development/python-modules/cypherpunkpay/default.nix
new file mode 100644
index 000000000000..9bf5e8fcd85d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cypherpunkpay/default.nix
@@ -0,0 +1,116 @@
+{ lib
+, stdenv
+, apscheduler
+, bitstring
+, buildPythonPackage
+, cffi
+, ecdsa
+, fetchFromGitHub
+, monero
+, poetry-core
+, pypng
+, pyqrcode
+, pyramid
+, pyramid-jinja2
+, pysocks
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, requests
+, tzlocal
+, waitress
+, webtest
+, yoyo-migrations
+}:
+
+buildPythonPackage rec {
+  pname = "cypherpunkpay";
+  version = "1.0.16";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CypherpunkPay";
+    repo = "CypherpunkPay";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-X0DB0PVwR0gRnt3jixFzglWAOPKBMvqTOG6pK6OJ03w=";
+  };
+
+  pythonRelaxDeps = [
+    "bitstring"
+    "cffi"
+    "ecdsa"
+    "pypng"
+    "tzlocal"
+    "yoyo-migrations"
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    apscheduler
+    bitstring
+    cffi
+    ecdsa
+    monero
+    pypng
+    pyqrcode
+    pyramid
+    pyramid-jinja2
+    pysocks
+    requests
+    tzlocal
+    waitress
+    yoyo-migrations
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    webtest
+  ];
+
+  pytestFlagsArray = [
+    "-W"
+    "ignore::DeprecationWarning"
+  ];
+
+  disabledTestPaths = [
+    # performance test
+    "tests/unit/tools/pbkdf2_test.py"
+    # tests require network connection
+    "tests/network/explorers/bitcoin"
+    "tests/network/monero/monero_address_transactions_db_test.py"
+    "tests/network/net/http_client"
+    "tests/network/prices"
+    # tests require bitcoind running
+    "tests/network/full_node_clients"
+    # tests require lnd running
+    "tests/network/ln"
+    # tests require tor running
+    "tests/network/monero/monero_test.py"
+    "tests/network/net/tor_client"
+    "tests/network/usecases/calc_monero_address_credits_uc_test.py"
+    "tests/network/usecases/fetch_monero_txs_from_open_node_uc_test.py"
+    # tests require the full environment running
+    "tests/acceptance/views"
+    "tests/acceptance/views_admin"
+    "tests/acceptance/views_donations"
+    "tests/acceptance/views_dummystore"
+  ];
+
+  pythonImportsCheck = [
+    "cypherpunkpay"
+  ];
+
+  meta = with lib; {
+    description = "Modern self-hosted software for accepting Bitcoin";
+    homepage = "https://github.com/CypherpunkPay/CypherpunkPay";
+    changelog = "https://github.com/CypherpunkPay/CypherpunkPay/releases/tag/v${version}";
+    license = with licenses; [ mit /* or */ unlicense ];
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cysignals/default.nix b/nixpkgs/pkgs/development/python-modules/cysignals/default.nix
new file mode 100644
index 000000000000..d03e3ba501ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cysignals/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, autoreconfHook
+, fetchPypi
+, buildPythonPackage
+, cython
+, pariSupport ? true, pari # for interfacing with the PARI/GP signal handler
+}:
+
+assert pariSupport -> pari != null;
+
+buildPythonPackage rec {
+  pname = "cysignals";
+  version = "1.11.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5858b1760fbe21848121b826b2463a67ac5a45caf3d73105497a68618c5a6fa6";
+  };
+
+  # explicit check:
+  # build/src/cysignals/implementation.c:27:2: error: #error "cysignals must be compiled without _FORTIFY_SOURCE"
+  hardeningDisable = [
+    "fortify"
+  ];
+
+  # known failure: https://github.com/sagemath/cysignals/blob/582dbf6a7b0f9ade0abe7a7b8720b7fb32435c3c/testgdb.py#L5
+  doCheck = false;
+  checkTarget = "check-install";
+
+  preCheck = ''
+    # Make sure cysignals-CSI is in PATH
+    export PATH="$out/bin:$PATH"
+  '';
+
+  propagatedBuildInputs = [
+    cython
+  ] ++ lib.optionals pariSupport [
+    # When cysignals is built with pari, including cysignals into the
+    # buildInputs of another python package will cause cython to link against
+    # pari.
+    pari
+  ];
+
+  nativeBuildInputs = [ autoreconfHook ];
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    description = "Interrupt and signal handling for Cython";
+    homepage = "https://github.com/sagemath/cysignals/";
+    maintainers = teams.sage.members;
+    license = licenses.lgpl3Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cython-test-exception-raiser/default.nix b/nixpkgs/pkgs/development/python-modules/cython-test-exception-raiser/default.nix
new file mode 100644
index 000000000000..e6f3f8b451b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cython-test-exception-raiser/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "cython-test-exception-raiser";
+  version = "1.0.2";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "twisted";
+    repo = "cython-test-exception-raiser";
+    rev = "v${version}";
+    hash = "sha256-fwMq0pOrFUJnPndH/a6ghoo6mlcVSxtsWazqE9mCx3M=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    setuptools
+    wheel
+  ];
+
+  pythonImportsCheck = [
+    "cython_test_exception_raiser"
+  ];
+
+  meta = with lib; {
+    description = "Testing only. A cython simple extension which is used as helper for twisted/twisted Failure tests";
+    homepage = "https://github.com/twisted/cython-test-exception-raiser";
+    changelog = "https://github.com/twisted/cython-test-exception-raiser/blob/${src.rev}/CHANGELOG.rst";
+    license = with licenses; [ publicDomain mit ];
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/cytoolz/default.nix b/nixpkgs/pkgs/development/python-modules/cytoolz/default.nix
new file mode 100644
index 000000000000..fafc31d65882
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/cytoolz/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, pytestCheckHook
+, cython
+, toolz
+, python
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "cytoolz";
+  version = "0.12.2";
+  disabled = isPy27 || isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MdSwRV1y2RRkX4A9kX2vTzFNEVxw3gV404IN64sQH2Y=";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  propagatedBuildInputs = [ toolz ];
+
+  # tests are located in cytoolz/tests, however we can't import cytoolz
+  # from $PWD, as it will break relative imports
+  preCheck = ''
+    cd cytoolz
+    export PYTHONPATH=$out/${python.sitePackages}:$PYTHONPATH
+  '';
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pytoolz/cytoolz/";
+    description = "Cython implementation of Toolz: High performance functional utilities";
+    license = licenses.bsd3;
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dacite/default.nix b/nixpkgs/pkgs/development/python-modules/dacite/default.nix
new file mode 100644
index 000000000000..fca71b11a0e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dacite/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "dacite";
+  version = "1.8.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "konradhalas";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-lvObQ+jyBH2s4GOwyDXEAYmG7ZGQN9WDqL8ftNItPCQ=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--benchmark-autosave --benchmark-json=benchmark.json" ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dacite"
+  ];
+
+  disabledTestPaths = [
+    "tests/performance"
+  ];
+
+  meta = with lib; {
+    description = "Python helper to create data classes from dictionaries";
+    homepage = "https://github.com/konradhalas/dacite";
+    changelog = "https://github.com/konradhalas/dacite/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/daemonize/default.nix b/nixpkgs/pkgs/development/python-modules/daemonize/default.nix
new file mode 100644
index 000000000000..26f23b7156dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/daemonize/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "daemonize";
+  version = "2.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1hwbl3gf9fdds9sc14zgjyjisjvxidrvqc11xlbb0b6jz17nw0nx";
+  };
+
+  meta = with lib; {
+    description = "Library to enable your code run as a daemon process on Unix-like systems";
+    homepage = "https://github.com/thesharp/daemonize";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/daemonocle/default.nix b/nixpkgs/pkgs/development/python-modules/daemonocle/default.nix
new file mode 100644
index 000000000000..e673dd1adf5d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/daemonocle/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, click
+, psutil
+, pytestCheckHook
+, lsof
+}:
+
+buildPythonPackage rec {
+  pname = "daemonocle";
+  version = "1.2.3";
+
+  src = fetchFromGitHub {
+    owner = "jnrbsn";
+    repo = "daemonocle";
+    rev = "v${version}";
+    hash = "sha256-K+IqpEQ4yhfSguPPm2Ult3kGNO/9H56B+kD5ntaCZdk=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    psutil
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    lsof
+  ];
+
+  # One third of the tests fail on the sandbox with
+  # "psutil.NoSuchProcess: no process found with pid 0".
+  disabledTests = [
+    "sudo"
+    "test_chrootdir_without_permission"
+    "test_uid_and_gid_without_permission"
+    "test_multi_daemon"
+    "test_multi_daemon_action_worker_id"
+    "test_exec_worker"
+  ];
+
+  pythonImportsCheck = [
+    "daemonocle"
+  ];
+
+  meta = with lib; {
+    description = "A Python library for creating super fancy Unix daemons";
+    longDescription = ''
+      daemonocle is a library for creating your own Unix-style daemons
+      written in Python.  It solves many problems that other daemon
+      libraries have and provides some really useful features you don't
+      often see in other daemons.
+    '';
+    homepage = "https://github.com/jnrbsn/daemonocle";
+    license = licenses.mit;
+    maintainers = with maintainers; [ AluisioASG ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/daiquiri/default.nix b/nixpkgs/pkgs/development/python-modules/daiquiri/default.nix
new file mode 100644
index 000000000000..9c5a0abdbd1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/daiquiri/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, python-json-logger
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "daiquiri";
+  version = "3.2.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QIxNKOyPDqI+llN0R5gpvSI2TQwI15HL63u6JFlj4P0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    python-json-logger
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "daiquiri" ];
+
+  meta = with lib; {
+    description = "Library to configure Python logging easily";
+    homepage = "https://github.com/Mergifyio/daiquiri";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dalle-mini/default.nix b/nixpkgs/pkgs/development/python-modules/dalle-mini/default.nix
new file mode 100644
index 000000000000..0c768ba5dbe1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dalle-mini/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, einops
+, emoji
+, flax
+, ftfy
+, jax
+, jaxlib
+, pillow
+, transformers
+, unidecode
+, wandb
+}:
+
+buildPythonPackage rec {
+  pname = "dalle-mini";
+  version = "0.1.5";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-k4XILjNNz0FPcAzwPEeqe5Lj24S2Y139uc9o/1IUS1c=";
+  };
+
+  # Fix incompatibility with the latest JAX versions
+  # See https://github.com/borisdayma/dalle-mini/pull/338
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/borisdayma/dalle-mini/pull/338/commits/22ffccf03f3e207731a481e3e42bdb564ceebb69.patch";
+      hash = "sha256-LIOyfeq/oVYukG+1rfy5PjjsJcjADCjn18x/hVmLkPY=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    einops
+    emoji
+    flax
+    ftfy
+    jax
+    jaxlib
+    pillow
+    transformers
+    unidecode
+    wandb
+  ];
+
+  doCheck = false; # no upstream tests
+
+  pythonImportsCheck = [ "dalle_mini" ];
+
+  meta = with lib; {
+    description = "Generate images from a text prompt";
+    homepage = "https://github.com/borisdayma/dalle-mini";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ r-burns ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/daphne/default.nix b/nixpkgs/pkgs/development/python-modules/daphne/default.nix
new file mode 100644
index 000000000000..70150799f5f0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/daphne/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, stdenv
+, asgiref
+, autobahn
+, buildPythonPackage
+, django
+, fetchFromGitHub
+, hypothesis
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, twisted
+}:
+
+buildPythonPackage rec {
+  pname = "daphne";
+  version = "4.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "django";
+    repo = pname;
+    rev = version;
+    hash = "sha256-vPMrmC2B0Pcvk8Y1FsJ4PXnzIMtPod7lL2u0IYNVUxc=";
+  };
+
+  propagatedBuildInputs = [
+    asgiref
+    autobahn
+    twisted
+  ] ++ twisted.optional-dependencies.tls;
+
+  nativeCheckInputs = [
+    django
+    hypothesis
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest-runner" ""
+  '';
+
+  # Most tests fail on darwin
+  doCheck = !stdenv.isDarwin;
+
+  pythonImportsCheck = [
+    "daphne"
+  ];
+
+  meta = with lib; {
+    description = "Django ASGI (HTTP/WebSocket) server";
+    homepage = "https://github.com/django/daphne";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/daqp/default.nix b/nixpkgs/pkgs/development/python-modules/daqp/default.nix
new file mode 100644
index 000000000000..9ef1d3eee877
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/daqp/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, unittestCheckHook
+, cython
+, setuptools
+, wheel
+, numpy
+}:
+buildPythonPackage {
+  pname = "daqp";
+  version = "0.5.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "darnstrom";
+    repo = "daqp";
+    rev = "5a15a3d16731d3d50f867218c1b281567db556fd";
+    hash = "sha256-in7Ci/wM7i0csJ4XVfo1lboWOyfuuU+8E+TzGmMV3x0=";
+  };
+
+  sourceRoot = "source/interfaces/daqp-python";
+
+  postPatch = ''
+    sed -i 's|../../../daqp|../..|' setup.py
+    sed -i 's|if src_path and os.path.exists(src_path):|if False:|' setup.py
+  '';
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  unittestFlagsArray = [ "-s" "test" "-p" "'*.py'" "-v" ];
+
+  nativeBuildInputs = [
+    cython
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  pythonImportsCheck = [ "daqp" ];
+
+  meta = with lib; {
+    description = "A dual active-set algorithm for convex quadratic programming";
+    homepage = "https://github.com/darnstrom/daqp";
+    license = licenses.mit;
+    maintainers = with maintainers; [ renesat ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/darkdetect/default.nix b/nixpkgs/pkgs/development/python-modules/darkdetect/default.nix
new file mode 100644
index 000000000000..534d9a0573ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/darkdetect/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, stdenv
+
+, glib
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "darkdetect";
+  version = "0.8.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "albertosottile";
+    repo = "darkdetect";
+    rev = "v${version}";
+    hash = "sha256-OOINgrgjSLr3L07E9zf1+mlTPr+7ZlgN3CfkWE8+LoE=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  pythonImportsCheck = [
+    "darkdetect"
+  ];
+
+  postPatch = lib.optionalString (stdenv.isLinux) ''
+    substituteInPlace darkdetect/_linux_detect.py \
+      --replace "'gsettings'" "'${glib.bin}/bin/gsettings'"
+  '';
+
+  meta = with lib; {
+    description = "Detect OS Dark Mode from Python";
+    homepage = "https://github.com/albertosottile/darkdetect";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ paveloom ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dasbus/default.nix b/nixpkgs/pkgs/development/python-modules/dasbus/default.nix
new file mode 100644
index 000000000000..dceb2e74ca86
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dasbus/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pygobject3, dbus, hatchling, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "dasbus";
+  version = "unstable-11-10-2022";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "rhinstaller";
+    repo = pname;
+    rev = "64b6b4d9e37cd7e0cbf4a7bf75faa7cdbd01086d";
+    hash = "sha256-TmhhDrfpP+nUErAd7dUb+RtGBRtWwn3bYOoIqa0VRoc=";
+  };
+
+  nativeBuildInputs = [ hatchling ];
+  propagatedBuildInputs = [ pygobject3 ];
+  nativeCheckInputs = [ dbus pytestCheckHook ];
+
+  meta = with lib; {
+    homepage = "https://github.com/rhinstaller/dasbus";
+    description = "DBus library in Python3";
+    license = licenses.lgpl21Only;
+    maintainers = with maintainers; [ moni ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dash-core-components/default.nix b/nixpkgs/pkgs/development/python-modules/dash-core-components/default.nix
new file mode 100644
index 000000000000..c6103d5e5ee7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dash-core-components/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "dash-core-components";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    pname = "dash_core_components";
+    inherit version;
+    hash = "sha256-xnM4dK+XXlUvlaE5ihbC7n3xTOQ/pguzcYo8bgtj/+4=";
+  };
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A dash component starter pack";
+    homepage = "https://dash.plot.ly/dash-core-components";
+    license = licenses.mit;
+    maintainers = [ maintainers.antoinerg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dash-html-components/default.nix b/nixpkgs/pkgs/development/python-modules/dash-html-components/default.nix
new file mode 100644
index 000000000000..ae5496ec5043
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dash-html-components/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "dash-html-components";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    pname = "dash_html_components";
+    inherit version;
+    sha256 = "8703a601080f02619a6390998e0b3da4a5daabe97a1fd7a9cebc09d015f26e50";
+  };
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "HTML components for Dash";
+    homepage = "https://dash.plot.ly/dash-html-components";
+    license = licenses.mit;
+    maintainers = [ maintainers.antoinerg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dash-renderer/default.nix b/nixpkgs/pkgs/development/python-modules/dash-renderer/default.nix
new file mode 100644
index 000000000000..bc489ff8f96c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dash-renderer/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "dash_renderer";
+  version = "1.9.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "73a69e3d145880e68e42723ad10182251d92b44f3efe92b8763145cfd2158e7e";
+  };
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Renderer for the Dash framework";
+    homepage = "https://dash.plot.ly/";
+    license = licenses.mit;
+    maintainers = [ maintainers.antoinerg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dash-table/default.nix b/nixpkgs/pkgs/development/python-modules/dash-table/default.nix
new file mode 100644
index 000000000000..2463e50fb32c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dash-table/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "dash-table";
+  version = "5.0.0";
+
+  src = fetchPypi {
+    pname = "dash_table";
+    inherit version;
+    hash = "sha256-GGJNaT1MjvLd7Jmm8WdZNDen6gvxU6og8xjBcMW8cwg=";
+  };
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A First-Class Interactive DataTable for Dash";
+    homepage = "https://dash.plot.ly/datatable";
+    license = licenses.mit;
+    maintainers = [ maintainers.antoinerg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dash/default.nix b/nixpkgs/pkgs/development/python-modules/dash/default.nix
new file mode 100644
index 000000000000..890a6e08d7db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dash/default.nix
@@ -0,0 +1,134 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+
+, nodejs
+, yarn
+, prefetch-yarn-deps
+, fetchYarnDeps
+
+, setuptools
+, flask
+, werkzeug
+, plotly
+, dash-html-components
+, dash-core-components
+, dash-table
+, importlib-metadata
+, typing-extensions
+, requests
+, retrying
+, ansi2html
+, nest-asyncio
+
+, celery
+, redis
+, diskcache
+, multiprocess
+, psutil
+, flask-compress
+
+, pytestCheckHook
+, pytest-mock
+, mock
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "dash";
+  version = "2.14.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "plotly";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-vQOfX9RCIbr5lfUyT2knwrO374/vm7jH+/1+BeqmRjI=";
+  };
+
+  nativeBuildInputs = [
+    nodejs
+    yarn
+    prefetch-yarn-deps
+  ];
+
+  yarnDeps = fetchYarnDeps {
+    yarnLock = src + "/@plotly/dash-jupyterlab/yarn.lock";
+    hash = "sha256-mkiyrA0jGiP0zbabSjgHFLEUX3f+LZdJ8eARI5QA8CU=";
+  };
+
+  preBuild = ''
+    pushd @plotly/dash-jupyterlab
+
+    export HOME=$(mktemp -d)
+
+    yarn config --offline set yarn-offline-mirror ${yarnDeps}
+    fixup-yarn-lock yarn.lock
+
+    substituteInPlace package.json --replace jlpm yarn
+    yarn install --offline --frozen-lockfile --ignore-engines --ignore-scripts
+    patchShebangs .
+
+    # Generates the jupyterlab extension files
+    yarn run build:pack
+
+    popd
+  '';
+
+  propagatedBuildInputs = [
+    setuptools # for importing pkg_resources
+    flask
+    werkzeug
+    plotly
+    dash-html-components
+    dash-core-components
+    dash-table
+    importlib-metadata
+    typing-extensions
+    requests
+    retrying
+    ansi2html
+    nest-asyncio
+  ];
+
+  passthru.optional-dependencies = {
+    celery = [
+      celery
+      redis
+    ];
+    diskcache = [
+      diskcache
+      multiprocess
+      psutil
+    ];
+    compress = [
+      flask-compress
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+    mock
+    pyyaml
+  ];
+
+  disabledTestPaths = [
+    "tests/unit/test_browser.py"
+    "tests/unit/test_app_runners.py" # Uses selenium
+    "tests/integration"
+  ];
+
+  pythonImportsCheck = [ "dash" ];
+
+  meta = {
+    description = "Python framework for building analytical web applications";
+    homepage = "https://dash.plot.ly/";
+    changelog = "https://github.com/plotly/dash/blob/${src.rev}/CHANGELOG.md";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ antoinerg tomasajt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dashing/default.nix b/nixpkgs/pkgs/development/python-modules/dashing/default.nix
new file mode 100644
index 000000000000..9caa56a87649
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dashing/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, blessed
+}:
+
+buildPythonPackage rec {
+  pname = "dashing";
+  version = "0.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JRRgjg8pp3Xb0bERFWEhnOg9U8+kuqL+QQH6uE/Vbxs=";
+  };
+
+  propagatedBuildInputs = [
+    blessed
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/FedericoCeratto/dashing";
+    description = "Terminal dashboards for Python";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ juliusrickert ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dask-awkward/default.nix b/nixpkgs/pkgs/development/python-modules/dask-awkward/default.nix
new file mode 100644
index 000000000000..39ae8e5ddcad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-awkward/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, awkward
+, buildPythonPackage
+, dask
+, fetchFromGitHub
+, hatch-vcs
+, hatchling
+, pyarrow
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "dask-awkward";
+  version = "2023.11.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "dask-contrib";
+    repo = "dask-awkward";
+    rev = "refs/tags/${version}";
+    hash = "sha256-yx0B31x+BMS4alHro+hAPeVB6YK9B7Tg+3sSCMCYjKs=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  pythonRelaxDeps = [
+    "awkward"
+  ];
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    awkward
+    dask
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pyarrow
+  ];
+
+  pythonImportsCheck = [
+    "dask_awkward"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_remote_double"
+    "test_remote_single"
+    "test_from_text"
+  ];
+
+  meta = with lib; {
+    description = "Native Dask collection for awkward arrays, and the library to use it";
+    homepage = "https://github.com/dask-contrib/dask-awkward";
+    changelog = "https://github.com/dask-contrib/dask-awkward/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dask-gateway-server/default.nix b/nixpkgs/pkgs/development/python-modules/dask-gateway-server/default.nix
new file mode 100644
index 000000000000..98e955894f2c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-gateway-server/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, colorlog
+, cryptography
+, fetchFromGitHub
+, go
+, pykerberos
+, pythonOlder
+, skein
+, sqlalchemy
+, traitlets
+}:
+
+buildPythonPackage rec {
+  pname = "dask-gateway-server";
+  version = "2023.9.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "dask";
+    repo = "dask-gateway";
+    rev = version;
+    hash = "sha256-hwNLcuFN6ItH5KhC2gDUsaZT7qTC48fPR/Qx6u8B1+M=";
+  };
+
+  sourceRoot = "${src.name}/${pname}";
+
+  nativeBuildInputs = [
+    go
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    colorlog
+    cryptography
+    traitlets
+  ];
+
+  passthru.optional-dependencies = {
+    kerberos = [
+      pykerberos
+    ];
+    jobqueue = [
+      sqlalchemy
+    ];
+    local = [
+      sqlalchemy
+    ];
+    yarn = [
+      skein
+      sqlalchemy
+    ];
+  };
+
+  preBuild = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  # Tests requires cluster for testing
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dask_gateway_server"
+  ];
+
+  meta = with lib; {
+    description = "A multi-tenant server for securely deploying and managing multiple Dask clusters";
+    homepage = "https://gateway.dask.org/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dask-gateway/default.nix b/nixpkgs/pkgs/development/python-modules/dask-gateway/default.nix
new file mode 100644
index 000000000000..270999b55070
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-gateway/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, dask
+, distributed
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "dask-gateway";
+  # update dask-gateway lock step with dask-gateway-server
+  version = "2023.1.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "dask";
+    repo = "dask-gateway";
+    rev = "refs/tags/${version}";
+    hash = "sha256-+YCHIfNq8E2rXO8b91Q1D21dVzNWnJZIKZeY4AETa7s=";
+  };
+
+  sourceRoot = "${src.name}/dask-gateway";
+
+  nativeBuildInputs = [ setuptools ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    dask
+    distributed
+  ];
+
+  # tests requires cluster for testing
+  doCheck = false;
+
+  pythonImportsCheck = [ "dask_gateway" ];
+
+  meta = with lib; {
+    description = "A client library for interacting with a dask-gateway server";
+    homepage = "https://gateway.dask.org/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dask-glm/default.nix b/nixpkgs/pkgs/development/python-modules/dask-glm/default.nix
new file mode 100644
index 000000000000..4e0357ddd823
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-glm/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, cloudpickle
+, dask
+, distributed
+, fetchPypi
+, multipledispatch
+, pytestCheckHook
+, pythonOlder
+, scikit-learn
+, scipy
+, setuptools-scm
+, sparse
+}:
+
+buildPythonPackage rec {
+  pname = "dask-glm";
+  version = "0.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ddaYNBUlvsMzrku7fKrlozRmjshVbQ9yrYIlaRBQCp4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    cloudpickle
+    distributed
+    multipledispatch
+    scikit-learn
+    scipy
+    sparse
+  ] ++ dask.optional-dependencies.array;
+
+  nativeCheckInputs = [
+    sparse
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dask_glm"
+  ];
+
+  disabledTestPaths = [
+    # Circular dependency with dask-ml
+    "dask_glm/tests/test_estimators.py"
+    # Test tries to imort an obsolete method
+    "dask_glm/tests/test_utils.py"
+  ];
+
+  disabledTests = [
+    # missing fixture with distributed>=2022.8.0
+    "test_determinism_distributed"
+  ];
+
+  meta = with lib; {
+    description = "Generalized Linear Models with Dask";
+    homepage = "https://github.com/dask/dask-glm/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dask-histogram/default.nix b/nixpkgs/pkgs/development/python-modules/dask-histogram/default.nix
new file mode 100644
index 000000000000..5bdcb2458e45
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-histogram/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, boost-histogram
+, dask
+, hatchling
+, hatch-vcs
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "dask-histogram";
+  version = "2023.10.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "dask-contrib";
+    repo = "dask-histogram";
+    rev = "refs/tags/${version}";
+    hash = "sha256-ugAqNdvCROCCXURwsGLpnl/lBEAremvTI7MVa/TWt6c=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+    hatch-vcs
+  ];
+
+  propagatedBuildInputs = [
+    boost-histogram
+    dask
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dask_histogram"
+  ];
+
+  meta = with lib; {
+    description = "Histograms with task scheduling";
+    homepage = "https://dask-histogram.readthedocs.io/";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dask-image/default.nix b/nixpkgs/pkgs/development/python-modules/dask-image/default.nix
new file mode 100644
index 000000000000..92c0e9074603
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-image/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, dask
+, fetchPypi
+, numpy
+, pims
+, pytestCheckHook
+, pythonOlder
+, scikit-image
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "dask-image";
+  version = "2023.8.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XpqJhbBSehtZQsan50Tg5X0mTiIscFjwW664HDdNBLY=";
+  };
+
+  propagatedBuildInputs = [
+    dask
+    numpy
+    scipy
+    pims
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    scikit-image
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--flake8" ""
+  '';
+
+  pythonImportsCheck = [
+    "dask_image"
+  ];
+
+  meta = with lib; {
+    description = "Distributed image processing";
+    homepage = "https://github.com/dask/dask-image";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dask-jobqueue/default.nix b/nixpkgs/pkgs/development/python-modules/dask-jobqueue/default.nix
new file mode 100644
index 000000000000..e403545839fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-jobqueue/default.nix
@@ -0,0 +1,87 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, cryptography
+, dask
+, distributed
+, docrep
+, fetchPypi
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dask-jobqueue";
+  version = "0.8.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-01QHoFoFNDR8XZWK50m5+FNb7FKYV9ATtuVknN5DkUo=";
+  };
+
+  propagatedBuildInputs = [
+    dask
+    distributed
+    docrep
+  ];
+
+  nativeCheckInputs = [
+    cryptography
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests have additional requirements (e.g., sge, etc.)
+    "test_adapt_parameters"
+    "test_adapt"
+    "test_adaptive_cores_mem"
+    "test_adaptive_grouped"
+    "test_adaptive"
+    "test_basic"
+    "test_basic_scale_edge_cases"
+    "test_cluster_error_scheduler_arguments_should_use_scheduler_options"
+    "test_cluster_has_cores_and_memory"
+    "test_cluster"
+    "test_command_template"
+    "test_complex_cancel_command"
+    "test_config"
+    "test_dashboard_link"
+    "test_default_number_of_worker_processes"
+    "test_deprecation_env_extra"
+    "test_deprecation_extra"
+    "test_deprecation_job_extra"
+    "test_different_interfaces_on_scheduler_and_workers"
+    "test_docstring_cluster"
+    "test_extra_args_broken_cancel"
+    "test_forward_ip"
+    "test_import_scheduler_options_from_config"
+    "test_job"
+    "test_log_directory"
+    "test_scale_cores_memory"
+    "test_scale_grouped"
+    "test_scheduler_options_interface"
+    "test_scheduler_options"
+    "test_security"
+    "test_shebang_settings"
+    "test_use_stdin"
+    "test_worker_name_uses_cluster_name"
+    "test_wrong_parameter_error"
+  ];
+
+  pythonImportsCheck = [
+    "dask_jobqueue"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Deploy Dask on job schedulers like PBS, SLURM, and SGE";
+    homepage = "https://github.com/dask/dask-jobqueue";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dask-ml/default.nix b/nixpkgs/pkgs/development/python-modules/dask-ml/default.nix
new file mode 100644
index 000000000000..3cb7ed9618b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-ml/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, dask
+, dask-glm
+, distributed
+, fetchPypi
+, multipledispatch
+, numba
+, numpy
+, packaging
+, pandas
+, pythonOlder
+, scikit-learn
+, scipy
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "dask-ml";
+  version = "2023.3.24";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lsCQ220yg2U24/Ccpk3rWZ6GRYeqjj1NLGtK9YhzMwc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dask-glm
+    distributed
+    multipledispatch
+    numba
+    numpy
+    packaging
+    pandas
+    scikit-learn
+    scipy
+  ] ++ dask.optional-dependencies.array
+    ++ dask.optional-dependencies.dataframe;
+
+  # has non-standard build from source, and pypi doesn't include tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dask_ml"
+    "dask_ml.naive_bayes"
+    "dask_ml.wrappers"
+    "dask_ml.utils"
+  ];
+
+  meta = with lib; {
+    description = "Scalable Machine Learn with Dask";
+    homepage = "https://github.com/dask/dask-ml";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dask-mpi/default.nix b/nixpkgs/pkgs/development/python-modules/dask-mpi/default.nix
new file mode 100644
index 000000000000..ed3215595c2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-mpi/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, dask
+, distributed
+, mpi4py
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dask-mpi";
+  version = "2022.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-CgTx19NaBs3/UGWTMw1EFOokLJFySYzhkfV0LqxJnhc=";
+  };
+
+  propagatedBuildInputs = [
+    dask
+    distributed
+    mpi4py
+  ];
+
+  # Hardcoded mpirun path in tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dask_mpi"
+  ];
+
+  meta = with lib; {
+    description = "Deploy Dask using mpi4py";
+    homepage = "https://github.com/dask/dask-mpi";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dask-yarn/default.nix b/nixpkgs/pkgs/development/python-modules/dask-yarn/default.nix
new file mode 100644
index 000000000000..b9204f0eb839
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask-yarn/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, dask
+, distributed
+, fetchFromGitHub
+, grpcio
+, pytestCheckHook
+, pythonOlder
+, skein
+}:
+
+buildPythonPackage rec {
+  pname = "dask-yarn";
+  version = "0.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dask";
+    repo = pname;
+    rev = version;
+    hash = "sha256-/BTsxQSiVQrihrCa9DE7pueyg3aPAdjd/Dt4dpUwdtM=";
+  };
+
+  propagatedBuildInputs = [
+    distributed
+    dask
+    grpcio
+    skein
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  pythonImportsCheck = [
+    "dask_yarn"
+  ];
+
+  disabledTests = [
+    # skein.exceptions.DriverError: Failed to start java process
+    "test_basic"
+    "test_adapt"
+    "test_from_specification"
+    "test_from_application_id"
+    "test_from_current"
+    "test_basic_async"
+    "test_widget_and_html_reprs"
+  ];
+
+  meta = with lib; {
+    description = "Deploy dask on YARN clusters";
+    longDescription = ''Dask-Yarn deploys Dask on YARN clusters,
+      such as are found in traditional Hadoop installations.
+      Dask-Yarn provides an easy interface to quickly start,
+      stop, and scale Dask clusters natively from Python.
+    '';
+    homepage = "https://yarn.dask.org/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ illustris ];
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dask/default.nix b/nixpkgs/pkgs/development/python-modules/dask/default.nix
new file mode 100644
index 000000000000..63a13d779913
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dask/default.nix
@@ -0,0 +1,175 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, setuptools
+, wheel
+
+# dependencies
+, click
+, cloudpickle
+, fsspec
+, importlib-metadata
+, packaging
+, partd
+, pyyaml
+, toolz
+
+# optional-dependencies
+, numpy
+, pyarrow
+, lz4
+, pandas
+, distributed
+, bokeh
+, jinja2
+
+# tests
+, arrow-cpp
+, hypothesis
+, pytest-asyncio
+, pytest-rerunfailures
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dask";
+  version = "2023.10.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "dask";
+    repo = "dask";
+    rev = "refs/tags/${version}";
+    hash = "sha256-asD5oLd7XcZ8ZFSrsSCAKgZ3Gsqs6T77nb1qesamgUI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    click
+    cloudpickle
+    fsspec
+    packaging
+    partd
+    pyyaml
+    importlib-metadata
+    toolz
+  ];
+
+  passthru.optional-dependencies = lib.fix (self: {
+    array = [
+      numpy
+    ];
+    complete = [
+      pyarrow
+      lz4
+    ]
+    ++ self.array
+    ++ self.dataframe
+    ++ self.distributed
+    ++ self.diagnostics;
+    dataframe = [
+      numpy
+      pandas
+    ];
+    distributed = [
+      distributed
+    ];
+    diagnostics = [
+      bokeh
+      jinja2
+    ];
+  });
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-rerunfailures
+    pytest-xdist
+    # from panda[test]
+    hypothesis
+    pytest-asyncio
+  ] ++ lib.optionals (!arrow-cpp.meta.broken) [ # support is sparse on aarch64
+    pyarrow
+  ];
+
+  dontUseSetuptoolsCheck = true;
+
+  postPatch = ''
+    # versioneer hack to set version of GitHub package
+    echo "def get_versions(): return {'dirty': False, 'error': None, 'full-revisionid': None, 'version': '${version}'}" > dask/_version.py
+
+    substituteInPlace setup.py \
+      --replace "import versioneer" "" \
+      --replace "version=versioneer.get_version()," "version='${version}'," \
+      --replace "cmdclass=versioneer.get_cmdclass()," ""
+
+    substituteInPlace pyproject.toml \
+      --replace ', "versioneer[toml]==0.29"' "" \
+      --replace " --durations=10" "" \
+      --replace " --cov-config=pyproject.toml" "" \
+      --replace "\"-v" "\" "
+  '';
+
+  pytestFlagsArray = [
+    # Rerun failed tests up to three times
+    "--reruns 3"
+    # Don't run tests that require network access
+    "-m 'not network'"
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # Test requires features of python3Packages.psutil that are
+    # blocked in sandboxed-builds
+    "test_auto_blocksize_csv"
+    # AttributeError: 'str' object has no attribute 'decode'
+    "test_read_dir_nometa"
+  ] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
+    # concurrent.futures.process.BrokenProcessPool: A process in the process pool terminated abpruptly...
+    "test_foldby_tree_reduction"
+    "test_to_bag"
+  ] ++ [
+    # https://github.com/dask/dask/issues/10347#issuecomment-1589683941
+    "test_concat_categorical"
+    # AttributeError: 'ArrowStringArray' object has no attribute 'tobytes'. Did you mean: 'nbytes'?
+    "test_dot"
+    "test_dot_nan"
+    "test_merge_column_with_nulls"
+    # FileNotFoundError: [Errno 2] No such file or directory: '/build/tmp301jryv_/createme/0.part'
+    "test_to_csv_nodir"
+    "test_to_json_results"
+    # FutureWarning: Those tests should be working fine when pandas will have been upgraded to 2.1.1
+    "test_apply"
+    "test_apply_infer_columns"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [
+    "dask"
+    "dask.array"
+    "dask.bag"
+    "dask.bytes"
+    "dask.dataframe"
+    "dask.dataframe.io"
+    "dask.dataframe.tseries"
+    "dask.diagnostics"
+  ];
+
+  meta = with lib; {
+    description = "Minimal task scheduling abstraction";
+    homepage = "https://dask.org/";
+    changelog = "https://docs.dask.org/en/latest/changelog.html";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/databases/default.nix b/nixpkgs/pkgs/development/python-modules/databases/default.nix
new file mode 100644
index 000000000000..bbd16ffb126d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/databases/default.nix
@@ -0,0 +1,84 @@
+{ lib
+, aiomysql
+, aiopg
+, aiosqlite
+, asyncmy
+, asyncpg
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "databases";
+  version = "0.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "encode";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-e3iMZBPdldZFuS7FyhbGj9SufnH5hBBt8MEUjixXfqA=";
+  };
+
+  propagatedBuildInputs = [
+    sqlalchemy
+  ];
+
+  passthru.optional-dependencies = {
+    postgresql = [
+      asyncpg
+    ];
+    asyncpg = [
+      asyncpg
+    ];
+    aiopg = [
+      aiopg
+    ];
+    mysql = [
+      aiomysql
+    ];
+    aiomysql = [
+      aiomysql
+    ];
+    asyncmy = [
+      asyncmy
+    ];
+    sqlite = [
+      aiosqlite
+    ];
+    aiosqlite = [
+      aiosqlite
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # circular dependency on starlette
+    "tests/test_integration.py"
+    # TEST_DATABASE_URLS is not set.
+    "tests/test_databases.py"
+    "tests/test_connection_options.py"
+  ];
+
+  pythonImportsCheck = [
+    "databases"
+  ];
+
+  meta = with lib; {
+    description = "Async database support for Python";
+    homepage = "https://github.com/encode/databases";
+    changelog = "https://github.com/encode/databases/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+    # https://github.com/encode/databases/issues/530
+    broken = lib.versionAtLeast sqlalchemy.version "2.0.0";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/databricks-cli/default.nix b/nixpkgs/pkgs/development/python-modules/databricks-cli/default.nix
new file mode 100644
index 000000000000..d088850fc58e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/databricks-cli/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, click
+, configparser
+, decorator
+, fetchFromGitHub
+, mock
+, oauthlib
+, pyjwt
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+, six
+, tabulate
+}:
+
+buildPythonPackage rec {
+  pname = "databricks-cli";
+  version = "0.17.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "databricks";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Eg6qpoEvWlbOJbMIkbJiHfHVrglVfVNq/TCOhQxukl0=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    configparser
+    oauthlib
+    pyjwt
+    requests
+    requests-mock
+    six
+    tabulate
+  ];
+
+  nativeCheckInputs = [
+    decorator
+    mock
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Disabled due to option parsing which we don't have
+    "integration/dbfs/test_integration.py"
+    "integration/workspace/test_integration.py"
+  ];
+
+  pythonImportsCheck = [
+    "databricks_cli"
+  ];
+
+  meta = with lib; {
+    description = "Command line interface for Databricks";
+    homepage = "https://github.com/databricks/databricks-cli";
+    changelog = "https://github.com/databricks/databricks-cli/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ tbenst ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/databricks-connect/default.nix b/nixpkgs/pkgs/development/python-modules/databricks-connect/default.nix
new file mode 100644
index 000000000000..7deca5f47152
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/databricks-connect/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, jdk8
+, buildPythonPackage
+, fetchPypi
+, six
+, py4j
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "databricks-connect";
+  version = "11.3.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-kAUBA9V1st5UxXihrXQjyk+1ahsum/VEcNfDK1he/Pc=";
+  };
+
+  sourceRoot = ".";
+
+  propagatedBuildInputs = [ py4j six jdk8 ];
+
+  # requires network access
+  doCheck = false;
+
+  prePatch = ''
+    substituteInPlace setup.py \
+      --replace "py4j==0.10.9" "py4j"
+  '';
+
+  preFixup = ''
+    substituteInPlace "$out/bin/find-spark-home" \
+      --replace find_spark_home.py .find_spark_home.py-wrapped
+  '';
+
+  pythonImportsCheck = [ "pyspark" "six" "py4j" ];
+
+  meta = with lib; {
+    description = "Client for connecting to remote Databricks clusters";
+    homepage = "https://pypi.org/project/databricks-connect";
+    sourceProvenance = with sourceTypes; [ binaryBytecode ];
+    license = licenses.databricks;
+    maintainers = with maintainers; [ kfollesdal ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/databricks-sql-connector/default.nix b/nixpkgs/pkgs/development/python-modules/databricks-sql-connector/default.nix
new file mode 100644
index 000000000000..f47949a6198e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/databricks-sql-connector/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, alembic
+, lz4
+, numpy
+, oauthlib
+, openpyxl
+, pandas
+, poetry-core
+, pyarrow
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, sqlalchemy
+, thrift
+}:
+
+buildPythonPackage rec {
+  pname = "databricks-sql-connector";
+  version = "2.9.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "databricks";
+    repo = "databricks-sql-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-y4Pmkgq3hv6mVu0zBsoiqNOcsHM0mxTNiJOCCZ+rwA8=";
+  };
+
+  pythonRelaxDeps = [
+    "numpy"
+    "thrift"
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    alembic
+    lz4
+    numpy
+    oauthlib
+    openpyxl
+    pandas
+    pyarrow
+    sqlalchemy
+    thrift
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests/unit"
+  ];
+
+  pythonImportsCheck = [
+    "databricks"
+  ];
+
+  meta = with lib; {
+    description = "Databricks SQL Connector for Python";
+    homepage = "https://docs.databricks.com/dev-tools/python-sql-connector.html";
+    changelog = "https://github.com/databricks/databricks-sql-python/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ harvidsen ];
+    # No SQLAlchemy 2.0 support
+    # https://github.com/databricks/databricks-sql-python/issues/91
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dataclass-factory/default.nix b/nixpkgs/pkgs/development/python-modules/dataclass-factory/default.nix
new file mode 100644
index 000000000000..b6ce77a51f00
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dataclass-factory/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose2
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "dataclass-factory";
+  version = "2.16";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "reagento";
+    repo = "dataclass-factory";
+    rev = version;
+    hash = "sha256-0BIWgyAV1hJzFX4xYFqswvQi5F1Ce+V9FKSmNYuJfZM=";
+  };
+
+  nativeCheckInputs = [
+    nose2
+  ];
+
+  checkInputs = [
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [ "dataclass_factory" ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    nose2 -v tests
+
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Modern way to convert python dataclasses or other objects to and from more common types like dicts or json-like structures";
+    homepage = "https://github.com/reagento/dataclass-factory";
+    changelog = "https://github.com/reagento/dataclass-factory/releases/tag/${src.rev}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dataclass-wizard/default.nix b/nixpkgs/pkgs/development/python-modules/dataclass-wizard/default.nix
new file mode 100644
index 000000000000..603fd25e9b2a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dataclass-wizard/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, pythonAtLeast
+, pytimeparse
+, pyyaml
+, pytestCheckHook
+, pytest-mock
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "dataclass-wizard";
+  version = "0.22.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "rnag";
+    repo = "dataclass-wizard";
+    rev = "v${version}";
+    hash = "sha256-Ufi4lZc+UkM6NZr4bS2OibpOmMjyiBEoVKxmrqauW50=";
+  };
+
+  propagatedBuildInputs = [
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = {
+    timedelta = [
+      pytimeparse
+    ];
+    yaml = [
+      pyyaml
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+  ] ++ passthru.optional-dependencies.timedelta
+  ++ passthru.optional-dependencies.yaml;
+
+  disabledTests = [
+  ] ++ lib.optionals (pythonAtLeast "3.11") [
+    # Any/None internal changes, tests need adjusting upstream
+    "without_type_hinting"
+    "default_dict"
+    "test_frozenset"
+    "test_set"
+    "date_times_with_custom_pattern"
+    "from_dict_handles_identical_cased_json_keys"
+  ];
+
+  pythonImportsCheck = [ "dataclass_wizard" ];
+
+  meta = with lib; {
+    description = "A set of simple, yet elegant wizarding tools for interacting with the Python dataclasses module";
+    homepage = "https://github.com/rnag/dataclass-wizard";
+    changelog = "https://github.com/rnag/dataclass-wizard/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ codifryed ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dataclasses-json/default.nix b/nixpkgs/pkgs/development/python-modules/dataclasses-json/default.nix
new file mode 100644
index 000000000000..77a14c44b7cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dataclasses-json/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hypothesis
+, marshmallow-enum
+, poetry-core
+, poetry-dynamic-versioning
+, pytestCheckHook
+, pythonOlder
+, typing-inspect
+}:
+
+buildPythonPackage rec {
+  pname = "dataclasses-json";
+  version = "0.6.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "lidatong";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-pZohueZvEIGgY6isci2mGGBewfi9SwnHHy8OwyJGR0w=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'version = "0.0.0"' 'version = "${version}"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+    poetry-dynamic-versioning
+  ];
+
+  propagatedBuildInputs = [
+    typing-inspect
+    marshmallow-enum
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # fails with the following error and avoid dependency on mypy
+    # mypy_main(None, text_io, text_io, [__file__], clean_exit=True)
+    # TypeError: main() takes at most 4 arguments (5 given)
+    "tests/test_annotations.py"
+  ];
+
+  pythonImportsCheck = [
+    "dataclasses_json"
+  ];
+
+  meta = with lib; {
+    description = "Simple API for encoding and decoding dataclasses to and from JSON";
+    homepage = "https://github.com/lidatong/dataclasses-json";
+    changelog = "https://github.com/lidatong/dataclasses-json/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ albakham ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dataclasses-serialization/default.nix b/nixpkgs/pkgs/development/python-modules/dataclasses-serialization/default.nix
new file mode 100644
index 000000000000..a52135ddaf6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dataclasses-serialization/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, more-properties
+, typing-inspect
+, toolz
+, toposort
+, bson
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "dataclasses-serialization";
+  version = "1.3.1";
+
+  # upstream requires >= 3.6 but only 3.7 includes dataclasses
+  disabled = pythonOlder "3.7";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "madman-bob";
+    repo = "python-dataclasses-serialization";
+    rev = version;
+    hash = "sha256-jLMR2D01KgzHHRP0zduMBJt8xgBmIquWLCjZYLo2/AA=";
+  };
+
+  postPatch = ''
+    mv pypi_upload/setup.py .
+    substituteInPlace setup.py \
+      --replace "project_root = Path(__file__).parents[1]" "project_root = Path(__file__).parents[0]"
+
+    # dataclasses is included in Python 3.7
+    substituteInPlace requirements.txt \
+      --replace dataclasses ""
+
+    # https://github.com/madman-bob/python-dataclasses-serialization/issues/16
+    sed -i '/(\(Dict\|List\)/d' tests/test_json.py tests/test_bson.py
+  '';
+
+  propagatedBuildInputs = [
+    more-properties
+    typing-inspect
+    toolz
+    toposort
+  ];
+
+  nativeCheckInputs = [
+    bson
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dataclasses_serialization.bson"
+    "dataclasses_serialization.json"
+    "dataclasses_serialization.serializer_base"
+  ];
+
+  meta = {
+    description = "Serialize/deserialize Python dataclasses to various other data formats";
+    homepage = "https://github.com/madman-bob/python-dataclasses-serialization";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/datadiff/default.nix b/nixpkgs/pkgs/development/python-modules/datadiff/default.nix
new file mode 100644
index 000000000000..a971509ca823
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datadiff/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "datadiff";
+  version = "2.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-fOcN/uqMM/HYjbRrDv/ukFzDa023Ofa7BwqC3omB0ws=";
+  };
+
+  # Tests are not part of the PyPI releases
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "datadiff"
+  ];
+
+  meta = with lib; {
+    description = "Library to provide human-readable diffs of Python data structures";
+    homepage = "https://sourceforge.net/projects/datadiff/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/datadog/default.nix b/nixpkgs/pkgs/development/python-modules/datadog/default.nix
new file mode 100644
index 000000000000..311e4a0090b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datadog/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchPypi
+, freezegun
+, hatchling
+, mock
+, pytest-vcr
+, pytestCheckHook
+, python-dateutil
+, pythonAtLeast
+, pythonOlder
+, requests
+, vcrpy
+}:
+
+buildPythonPackage rec {
+  pname = "datadog";
+  version = "0.47.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-R747LD1wmn9bcJ6xJu1P5sx5d9YY/lwVjdicKp99mRY=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    click
+    freezegun
+    mock
+    pytestCheckHook
+    pytest-vcr
+    python-dateutil
+    vcrpy
+  ];
+
+  disabledTestPaths = [
+    "tests/performance"
+  ];
+
+  disabledTests = [
+    "test_default_settings_set"
+  ] ++ lib.optionals (pythonAtLeast "3.11") [
+    # https://github.com/DataDog/datadogpy/issues/746
+    "TestDogshell"
+  ];
+
+  pythonImportsCheck = [
+    "datadog"
+  ];
+
+  meta = with lib; {
+    broken = true; # https://github.com/DataDog/datadogpy/issues/800
+    description = "The Datadog Python library";
+    homepage = "https://github.com/DataDog/datadogpy";
+    changelog = "https://github.com/DataDog/datadogpy/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/datafusion/default.nix b/nixpkgs/pkgs/development/python-modules/datafusion/default.nix
new file mode 100644
index 000000000000..ed25c032881b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datafusion/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, rustPlatform
+, pytestCheckHook
+, libiconv
+, numpy
+, protobuf
+, pyarrow
+, Security
+}:
+
+let
+  arrow-testing = fetchFromGitHub {
+    name = "arrow-testing";
+    owner = "apache";
+    repo = "arrow-testing";
+    rev = "5bab2f264a23f5af68f69ea93d24ef1e8e77fc88";
+    hash = "sha256-Pxx8ohUpXb5u1995IvXmxQMqWiDJ+7LAll/AjQP7ph8=";
+  };
+
+  parquet-testing = fetchFromGitHub {
+    name = "parquet-testing";
+    owner = "apache";
+    repo = "parquet-testing";
+    rev = "e13af117de7c4f0a4d9908ae3827b3ab119868f3";
+    hash = "sha256-rVI9zyk9IRDlKv4u8BeMb0HRdWLfCpqOlYCeUdA7BB8=";
+  };
+in
+
+buildPythonPackage rec {
+  pname = "datafusion";
+  version = "25.0.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    name = "datafusion-source";
+    owner = "apache";
+    repo = "arrow-datafusion-python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-oC+fp41a9rsdobpvShZ7sDdtYPJQQ7JLg6MFL+4Pksg=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    name = "datafusion-cargo-deps";
+    inherit src pname version;
+    hash = "sha256-0e0ZRgwcS/46mi4c2loAnBA2bsaD+/RiMh7oNg3EvHY=";
+  };
+
+  nativeBuildInputs = with rustPlatform; [
+    cargoSetupHook
+    maturinBuildHook
+  ];
+
+  buildInputs = [ protobuf ] ++ lib.optionals stdenv.isDarwin [ libiconv Security ];
+
+  propagatedBuildInputs = [ pyarrow ];
+
+  nativeCheckInputs = [ pytestCheckHook numpy ];
+  pythonImportsCheck = [ "datafusion" ];
+  pytestFlagsArray = [ "--pyargs" pname ];
+
+  preCheck = ''
+    pushd $TMPDIR
+    ln -s ${arrow-testing} ./testing
+    ln -s ${parquet-testing} ./parquet
+  '';
+
+  postCheck = ''
+    popd
+  '';
+
+  meta = with lib; {
+    description = "Extensible query execution framework";
+    longDescription = ''
+      DataFusion is an extensible query execution framework, written in Rust,
+      that uses Apache Arrow as its in-memory format.
+    '';
+    homepage = "https://arrow.apache.org/datafusion/";
+    changelog = "https://github.com/apache/arrow-datafusion-python/blob/${version}/CHANGELOG.md";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/datamodeldict/default.nix b/nixpkgs/pkgs/development/python-modules/datamodeldict/default.nix
new file mode 100644
index 000000000000..380429809836
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datamodeldict/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "datamodeldict";
+  version = "0.9.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "DataModelDict";
+    inherit version;
+    hash = "sha256-DadBRsc8qEu9PWgMNllGS2ESKL7kgBLDhg4yDr87WRk=";
+  };
+
+  propagatedBuildInputs = [
+    xmltodict
+  ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "DataModelDict"
+  ];
+
+  meta = with lib; {
+    description = "Class allowing for data models equivalently represented as Python dictionaries, JSON, and XML";
+    homepage = "https://github.com/usnistgov/DataModelDict/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/datapoint/default.nix b/nixpkgs/pkgs/development/python-modules/datapoint/default.nix
new file mode 100644
index 000000000000..4b68fe24b427
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datapoint/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, appdirs
+, pytz
+, requests
+, pytestCheckHook
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "datapoint";
+  version = "0.9.8";
+
+  src = fetchFromGitHub {
+    owner = "ejep";
+    repo = "datapoint-python";
+    rev = "v${version}";
+    hash = "sha256-YC8KFTv6lnCqMfDw1LSova7XBgmKbR3TpPDAAbH9imw=";
+  };
+
+  propagatedBuildInputs = [
+    appdirs
+    pytz
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pytestFlagsArray = [ "tests/unit" ];
+
+  pythonImportsCheck = [ "datapoint" ];
+
+  meta = {
+    description = "Python interface to the Met Office's Datapoint API";
+    homepage = "https://github.com/ejep/datapoint-python";
+    license = lib.licenses.gpl3Only;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dataprep-ml/default.nix b/nixpkgs/pkgs/development/python-modules/dataprep-ml/default.nix
new file mode 100644
index 000000000000..3eeac2e85b9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dataprep-ml/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, poetry-core
+, numpy
+, pandas
+, pydateinfer
+, python-dateutil
+, scipy
+, type-infer
+, dataclasses-json
+, colorlog
+, pydantic
+, nltk-data
+, symlinkJoin
+}:
+let
+  testNltkData = symlinkJoin {
+    name = "nltk-test-data";
+    paths = [ nltk-data.punkt nltk-data.stopwords ];
+  };
+in
+buildPythonPackage rec {
+  pname = "dataprep-ml";
+  version = "0.0.18";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  # using PyPI as github repo does not contain tags or release branches
+  src = fetchPypi {
+    pname = "dataprep_ml";
+    inherit version;
+    hash = "sha256-nIqyRwv62j8x5Fy7ILMLWxw6yJmkkNRE1zyUlfvRYTI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    pandas
+    pydateinfer
+    python-dateutil
+    scipy
+    type-infer
+    dataclasses-json
+    colorlog
+    pydantic
+  ];
+
+  # PyPI tarball has no tests
+  doCheck = false;
+
+  # Package import requires NLTK data to be downloaded
+  # It is the only way to set NLTK_DATA environment variable,
+  # so that it is available in pythonImportsCheck
+  env.NLTK_DATA = testNltkData;
+  pythonImportsCheck = [
+    "dataprep_ml"
+    "dataprep_ml.cleaners"
+    "dataprep_ml.helpers"
+    "dataprep_ml.imputers"
+    "dataprep_ml.insights"
+    "dataprep_ml.recommenders"
+    "dataprep_ml.splitters"
+  ];
+
+  meta = with lib; {
+    description = "Data utilities for Machine Learning pipelines";
+    homepage = "https://github.com/mindsdb/dataprep_ml";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dataproperty/default.nix b/nixpkgs/pkgs/development/python-modules/dataproperty/default.nix
new file mode 100644
index 000000000000..539c3324204e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dataproperty/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, loguru
+, mbstrdecoder
+, pytestCheckHook
+, pythonOlder
+, tcolorpy
+, termcolor
+, typepy
+}:
+
+buildPythonPackage rec {
+  pname = "dataproperty";
+  version = "1.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "thombashi";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-adUxUU9eASkC9n5ppZYNN0MP19u4xcL8XziBWSCp2L8=";
+  };
+
+  propagatedBuildInputs = [
+    mbstrdecoder
+    typepy
+    tcolorpy
+  ] ++ typepy.optional-dependencies.datetime;
+
+  passthru.optional-dependencies = {
+    logging = [
+      loguru
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    termcolor
+  ];
+
+  pythonImportsCheck = [
+    "dataproperty"
+  ];
+
+  meta = with lib; {
+    description = "Library for extracting properties from data";
+    homepage = "https://github.com/thombashi/dataproperty";
+    changelog = "https://github.com/thombashi/DataProperty/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ genericnerdyusername ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dataset/default.nix b/nixpkgs/pkgs/development/python-modules/dataset/default.nix
new file mode 100644
index 000000000000..9446920d0b05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dataset/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, alembic
+, banal
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "dataset";
+  version = "1.6.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-d9NiEY9nqMu0hI29MKs2K5+nz+vb+vQmycUAyziWmpk=";
+  };
+
+  propagatedBuildInputs = [
+    alembic
+    banal
+    sqlalchemy
+  ];
+
+  # checks attempt to import nonexistent module 'test.test' and fail
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dataset"
+  ];
+
+  meta = with lib; {
+    description = "Toolkit for Python-based database access";
+    homepage = "https://dataset.readthedocs.io";
+    license = licenses.mit;
+    maintainers = with maintainers; [ xfnw ];
+    # SQLAlchemy >= 2.0.0 is unsupported
+    # https://github.com/pudo/dataset/issues/411
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/datasets/default.nix b/nixpkgs/pkgs/development/python-modules/datasets/default.nix
new file mode 100644
index 000000000000..0802ae5cf6f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datasets/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, dill
+, fetchFromGitHub
+, fetchpatch
+, fsspec
+, huggingface-hub
+, importlib-metadata
+, multiprocess
+, numpy
+, packaging
+, pandas
+, pyarrow
+, pythonOlder
+, requests
+, responses
+, tqdm
+, xxhash
+}:
+
+buildPythonPackage rec {
+  pname = "datasets";
+  version = "2.14.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "huggingface";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-oLB6laY/Si071mBKoWlZpd1fqr/wNtAnhRvBKLjeEuE=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    dill
+    fsspec
+    huggingface-hub
+    multiprocess
+    numpy
+    packaging
+    pandas
+    pyarrow
+    requests
+    responses
+    tqdm
+    xxhash
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  # Tests require pervasive internet access
+  doCheck = false;
+
+  # Module import will attempt to create a cache directory
+  postFixup = "export HF_MODULES_CACHE=$TMPDIR";
+
+  pythonImportsCheck = [
+    "datasets"
+  ];
+
+  meta = with lib; {
+    description = "Open-access datasets and evaluation metrics for natural language processing";
+    homepage = "https://github.com/huggingface/datasets";
+    changelog = "https://github.com/huggingface/datasets/releases/tag/${version}";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/datasette-publish-fly/default.nix b/nixpkgs/pkgs/development/python-modules/datasette-publish-fly/default.nix
new file mode 100644
index 000000000000..a9c04618ee31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datasette-publish-fly/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, cogapp
+, datasette
+, fetchFromGitHub
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "datasette-publish-fly";
+  version = "1.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "simonw";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-diaxr+fNNgkJvLGkLo+lK0ThTsXYDePFsvTetMbDRMk=";
+  };
+
+  propagatedBuildInputs = [
+    datasette
+  ];
+
+  nativeCheckInputs = [
+    cogapp
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "datasette_publish_fly"
+  ];
+
+  meta = with lib; {
+    description = "Datasette plugin for publishing data using Fly";
+    homepage = "https://datasette.io/plugins/datasette-publish-fly";
+    changelog = "https://github.com/simonw/datasette-publish-fly/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/datasette-template-sql/default.nix b/nixpkgs/pkgs/development/python-modules/datasette-template-sql/default.nix
new file mode 100644
index 000000000000..a4ba47add5cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datasette-template-sql/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, datasette
+, fetchFromGitHub
+, pytest-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "datasette-template-sql";
+  version = "1.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "simonw";
+    repo = pname;
+    rev = version;
+    hash = "sha256-VmdIEDk3iCBFrTPMm6ud00Z5CWqO0Wk707IQ4oVx5ak=";
+  };
+
+  propagatedBuildInputs = [
+    datasette
+  ];
+
+  # Tests require a running datasette instance
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "datasette_template_sql"
+  ];
+
+  meta = with lib; {
+    description = "Datasette plugin for executing SQL queries from templates";
+    homepage = "https://datasette.io/plugins/datasette-template-sql";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ MostAwesomeDude ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/datasette/default.nix b/nixpkgs/pkgs/development/python-modules/datasette/default.nix
new file mode 100644
index 000000000000..e5d169b6d3cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datasette/default.nix
@@ -0,0 +1,107 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiofiles
+, asgi-csrf
+, click
+, click-default-group
+, itsdangerous
+, janus
+, jinja2
+, hupper
+, mergedeep
+, pint
+, pluggy
+, python-baseconv
+, pyyaml
+, uvicorn
+, httpx
+, pytestCheckHook
+, pytest-asyncio
+, pytest-timeout
+, aiohttp
+, beautifulsoup4
+, asgiref
+, setuptools
+, trustme
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "datasette";
+  version = "0.64.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "simonw";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-cCzvltq3DFbfRp0gO8RQxGUwBtYJcJoeYHIz06FA7vM=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner"' ""
+  '';
+
+  propagatedBuildInputs = [
+    aiofiles
+    asgi-csrf
+    asgiref
+    click
+    click-default-group
+    httpx
+    hupper
+    itsdangerous
+    janus
+    jinja2
+    mergedeep
+    pint
+    pluggy
+    python-baseconv
+    pyyaml
+    setuptools
+    uvicorn
+  ];
+
+  nativeCheckInputs = [
+    aiohttp
+    beautifulsoup4
+    pytest-asyncio
+    pytest-timeout
+    pytestCheckHook
+    trustme
+  ];
+
+  # takes 30-180 mins to run entire test suite, not worth the CPU resources, slows down reviews
+  # with pytest-xdist, it still takes around 10 mins with 32 cores
+  # just run the csv tests, as this should give some indictation of correctness
+  pytestFlagsArray = [
+    "tests/test_csv.py"
+  ];
+
+  disabledTests = [
+    "facet"
+    "_invalid_database" # checks error message when connecting to invalid database
+  ];
+
+  pythonImportsCheck = [
+    "datasette"
+    "datasette.cli"
+    "datasette.app"
+    "datasette.database"
+    "datasette.renderer"
+    "datasette.tracer"
+    "datasette.plugins"
+  ];
+
+  meta = with lib; {
+    description = "Multi-tool for exploring and publishing data";
+    homepage = "https://datasette.io/";
+    changelog = "https://github.com/simonw/datasette/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/datashader/default.nix b/nixpkgs/pkgs/development/python-modules/datashader/default.nix
new file mode 100644
index 000000000000..b110ba702daf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datashader/default.nix
@@ -0,0 +1,103 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, dask
+, bokeh
+, toolz
+, datashape
+, numba
+, numpy
+, pandas
+, pillow
+, xarray
+, colorcet
+, param
+, pyct
+, scipy
+, pytestCheckHook
+, pythonOlder
+, nbsmoke
+, fastparquet
+, nbconvert
+, pytest-xdist
+, netcdf4
+}:
+
+buildPythonPackage rec {
+  pname = "datashader";
+  version = "0.15.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lTlSk3kofWnBDpq04LKQDhoWAE1v8G3g2EqmLEgzsbs=";
+  };
+
+  propagatedBuildInputs = [
+    dask
+    bokeh
+    toolz
+    datashape
+    numba
+    numpy
+    pandas
+    pillow
+    xarray
+    colorcet
+    param
+    pyct
+    scipy
+  ] ++ dask.optional-dependencies.complete;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-xdist
+    nbsmoke
+    fastparquet
+    nbconvert
+    netcdf4
+  ];
+
+  # The complete extra is for usage with conda, which we
+  # don't care about
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "dask[complete]" "dask" \
+      --replace "xarray >=0.9.6" "xarray"
+  '';
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  pytestFlagsArray = [
+    "datashader"
+  ];
+
+  disabledTests = [
+    # Not compatible with current version of bokeh
+    # see: https://github.com/holoviz/datashader/issues/1031
+    "test_interactive_image_update"
+    # Latest dask broken array marshalling
+    # see: https://github.com/holoviz/datashader/issues/1032
+    "test_raster_quadmesh_autorange_reversed"
+  ];
+
+  disabledTestPaths = [
+    # 31/50 tests fail with TypeErrors
+    "datashader/tests/test_datatypes.py"
+  ];
+
+  pythonImportsCheck = [
+    "datashader"
+  ];
+
+  meta = with lib;{
+    description = "Data visualization toolchain based on aggregating into a grid";
+    homepage = "https://datashader.org";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/datashape/default.nix b/nixpkgs/pkgs/development/python-modules/datashape/default.nix
new file mode 100644
index 000000000000..a7964914d079
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datashape/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, mock
+, numpy
+, multipledispatch
+, python-dateutil
+}:
+
+let
+  # Fetcher function looks similar to fetchPypi.
+  # Allows for easier overriding, without having to know
+  # how the source is actually fetched.
+  fetcher = {pname, version, sha256}: fetchFromGitHub {
+    owner = "blaze";
+    repo = pname;
+    rev = version;
+    inherit sha256;
+  };
+
+in buildPythonPackage rec {
+  pname = "datashape";
+  version = "0.5.4";
+
+  src = fetcher {
+    inherit pname version;
+    sha256 = "0rhlj2kjj1vx5m73wnc5518rd6cs1zsbgpsvzk893n516k69shcf";
+  };
+
+  nativeCheckInputs = [ pytest mock ];
+  propagatedBuildInputs = [ numpy multipledispatch python-dateutil ];
+
+  # Disable several tests
+  # https://github.com/blaze/datashape/issues/232
+  checkPhase = ''
+    pytest --ignore datashape/tests/test_str.py \
+           --ignore datashape/tests/test_user.py
+  '';
+
+  # https://github.com/blaze/datashape/issues/238
+  PYTEST_ADDOPTS = "-k 'not test_record and not test_tuple'";
+
+  meta = {
+    homepage = "https://github.com/ContinuumIO/datashape";
+    description = "A data description language";
+    license = lib.licenses.bsd2;
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/datatable/default.nix b/nixpkgs/pkgs/development/python-modules/datatable/default.nix
new file mode 100644
index 000000000000..599d2e6cec72
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datatable/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pipInstallHook
+, writeText
+, blessed
+, docutils
+, libcxx
+, llvm
+, pytestCheckHook
+, typesentry
+}:
+
+buildPythonPackage rec {
+  pname = "datatable";
+  # python 3.10+ support is not in the 1.0.0 release
+  version = "unstable-2022-12-15";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "h2oai";
+    repo = pname;
+    rev = "9522f0833d3e965656396de4fffebd882d39c25d";
+    hash = "sha256-lEXQwhx2msnJkkRrTkAwYttlYTISyH/Z7dSalqRrOhI=";
+  };
+
+  postPatch = ''
+    # tarball doesn't appear to have been shipped totally ready-to-build
+    substituteInPlace ci/ext.py \
+      --replace \
+        'shell_cmd(["git"' \
+        '"0000000000000000000000000000000000000000" or shell_cmd(["git"'
+    # TODO revert back to use ${version} when bumping to the next stable release
+    echo '1.0' > VERSION.txt
+
+    # don't make assumptions about architecture
+    sed -i '/-m64/d' ci/ext.py
+  '';
+  DT_RELEASE = "1";
+
+  propagatedBuildInputs = [ typesentry blessed ];
+  buildInputs = [ llvm pipInstallHook ];
+  nativeCheckInputs = [ docutils pytestCheckHook ];
+
+  LLVM = llvm;
+  env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.isDarwin "-isystem ${lib.getDev libcxx}/include/c++/v1";
+
+  # test suite is very cpu intensive, only run small subset to ensure package is working as expected
+  pytestFlagsArray = [ "tests/test-sets.py" ];
+
+  disabledTests = [
+    # skip tests which are irrelevant to our installation or use way too much memory
+    "test_xfunction_paths"
+    "test_fread_from_cmd2"
+    "test_cast_huge_to_str"
+    "test_create_large_string_column"
+  ];
+  pythonImportsCheck = [ "datatable" ];
+
+  meta = with lib; {
+    description = "data.table for Python";
+    homepage = "https://github.com/h2oai/datatable";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/datauri/default.nix b/nixpkgs/pkgs/development/python-modules/datauri/default.nix
new file mode 100644
index 000000000000..d5ed9bf0525e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datauri/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pydantic
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "datauri";
+  version = "2.0.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "fcurella";
+    repo = "python-datauri";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-k4tlWRasGa2oQykCD9QJl65UAoZQMJVdyCfqlUBBgqY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  pythonImportsCheck = [
+    "datauri"
+  ];
+
+  nativeCheckInputs = [
+    pydantic
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_pydantic" # incompatible with pydantic v2
+  ];
+
+  meta = with lib; {
+    description = "Data URI manipulation made easy.";
+    homepage = "https://github.com/fcurella/python-datauri";
+    license = licenses.unlicense;
+    maintainers = with maintainers; [ yuu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/datefinder/default.nix b/nixpkgs/pkgs/development/python-modules/datefinder/default.nix
new file mode 100644
index 000000000000..938f25ee1d70
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datefinder/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, python-dateutil
+, pytz
+, regex
+}:
+
+buildPythonPackage rec {
+  pname = "datefinder";
+  version = "0.7.3";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "akoumjian";
+    repo = "datefinder";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-uOSwS+mHgbvEL+rTfs4Ax9NvJnhYemxFVqqDssy2i7g=";
+  };
+
+  propagatedBuildInputs = [
+    regex
+    pytz
+    python-dateutil
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "datefinder" ];
+
+  meta = {
+    description = "Extract datetime objects from strings";
+    homepage = "https://github.com/akoumjian/datefinder";
+    license = lib.licenses.mit;
+    maintainers = lib.teams.deshaw.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dateparser/default.nix b/nixpkgs/pkgs/development/python-modules/dateparser/default.nix
new file mode 100644
index 000000000000..b97dabbc2d91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dateparser/default.nix
@@ -0,0 +1,86 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, python-dateutil
+, pytz
+, regex
+, tzlocal
+, hijri-converter
+, convertdate
+, fasttext
+, langdetect
+, parameterized
+, pytestCheckHook
+, gitpython
+, parsel
+, requests
+, ruamel-yaml
+}:
+
+buildPythonPackage rec {
+  pname = "dateparser";
+  version = "1.2.0";
+
+  disabled = pythonOlder "3.7";
+
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "scrapinghub";
+    repo = "dateparser";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-mnL44hojebOwP6qtEBHs5QM4uRmLuGlVNr+sM3jZEKE=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    python-dateutil
+    pytz
+    regex
+    tzlocal
+  ];
+
+  passthru.optional-dependencies = {
+    calendars = [ hijri-converter convertdate ];
+    fasttext = [ fasttext ];
+    langdetect = [ langdetect ];
+  };
+
+  nativeCheckInputs = [
+    parameterized
+    pytestCheckHook
+    gitpython
+    parsel
+    requests
+    ruamel-yaml
+  ] ++ lib.flatten (lib.attrValues passthru.optional-dependencies);
+
+  preCheck = ''
+    export HOME="$TEMPDIR"
+  '';
+
+  # Upstream only runs the tests in tests/ in CI, others use git clone
+  pytestFlagsArray = [ "tests" ];
+
+  disabledTests = [
+    # access network
+    "test_custom_language_detect_fast_text_0"
+    "test_custom_language_detect_fast_text_1"
+  ];
+
+  pythonImportsCheck = [ "dateparser" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/scrapinghub/dateparser/blob/${src.rev}/HISTORY.rst";
+    description = "Date parsing library designed to parse dates from HTML pages";
+    homepage = "https://github.com/scrapinghub/dateparser";
+    license = licenses.bsd3;
+    mainProgram = "dateparser-download";
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/datetime/default.nix b/nixpkgs/pkgs/development/python-modules/datetime/default.nix
new file mode 100644
index 000000000000..173431c924da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datetime/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytz
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "datetime";
+  version = "5.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "zopefoundation";
+    repo = "datetime";
+    rev = "refs/tags/${version}";
+    hash = "sha256-J96IjyPyJaUC5mECK3g/cgxBh1OoVfj62XocBatYgOw=";
+  };
+
+  propagatedBuildInputs = [
+    pytz
+    zope_interface
+  ];
+
+  pythonImportsCheck = [
+    "DateTime"
+  ];
+
+  meta = with lib; {
+    description = "DateTime data type, as known from Zope";
+    homepage = "https://github.com/zopefoundation/DateTime";
+    changelog = "https://github.com/zopefoundation/DateTime/blob/${version}/CHANGES.rst";
+    license = licenses.zpl21;
+    maintainers = with maintainers; [ icyrockcom ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/dateutil/default.nix b/nixpkgs/pkgs/development/python-modules/dateutil/default.nix
new file mode 100644
index 000000000000..d1dcac893a46
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dateutil/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "python-dateutil";
+  version = "2.8.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ASPKzBYnrhnd88J6XeW9Z+5FhvvdZEDZdI+Ku0g9PoY=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ six ];
+
+  # cyclic dependency: tests need freezegun, which depends on python-dateutil
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dateutil.easter"
+    "dateutil.parser"
+    "dateutil.relativedelta"
+    "dateutil.rrule"
+    "dateutil.tz"
+    "dateutil.utils"
+    "dateutil.zoneinfo"
+  ];
+
+  meta = with lib; {
+    description = "Powerful extensions to the standard datetime module";
+    homepage = "https://github.com/dateutil/dateutil/";
+    license = with licenses; [ asl20 bsd3 ];
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dateutils/default.nix b/nixpkgs/pkgs/development/python-modules/dateutils/default.nix
new file mode 100644
index 000000000000..ba9996bbed73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dateutils/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, python-dateutil, pytz }:
+
+buildPythonPackage rec {
+  pname = "dateutils";
+  version = "0.6.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-A92QvLIVQb1OtLATY35PG1+USIHEbMbktnpgWeNw4/E=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    pytz
+  ];
+
+  pythonImportsCheck = [ "dateutils" ];
+
+  meta = with lib; {
+    description = "Utilities for working with datetime objects.";
+    homepage = "https://github.com/jmcantrell/python-dateutils";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/datrie/default.nix b/nixpkgs/pkgs/development/python-modules/datrie/default.nix
new file mode 100644
index 000000000000..73f4764d742d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/datrie/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, wheel
+, cython
+, pytestCheckHook
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "datrie";
+  version = "0.8.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-UlsI9jjVz2EV32zNgY5aASmM0jCy2skcj/LmSZ0Ydl0=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner", ' ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+    cython
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "datrie" ];
+
+  meta = with lib; {
+    description = "Super-fast, efficiently stored Trie for Python";
+    homepage = "https://github.com/kmike/datrie";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ lewo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dawg-python/default.nix b/nixpkgs/pkgs/development/python-modules/dawg-python/default.nix
new file mode 100644
index 000000000000..f8da613d98bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dawg-python/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+}:
+
+buildPythonPackage rec {
+  pname = "dawg-python";
+  version = "0.7.2";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "DAWG-Python";
+    hash = "sha256-Sl4yhuYmHMoC8gXP1VFqerEBkPowxRwo00WAj1leNCE=";
+  };
+
+  pythonImportsCheck = [ "dawg_python" ];
+
+  meta = with lib; {
+    description = "Pure Python reader for DAWGs created by dawgdic C++ library or DAWG Python extension";
+    homepage = "https://github.com/pytries/DAWG-Python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/db-dtypes/default.nix b/nixpkgs/pkgs/development/python-modules/db-dtypes/default.nix
new file mode 100644
index 000000000000..a7fbfd1b3783
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/db-dtypes/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, numpy
+, packaging
+, pandas
+, pyarrow
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "db-dtypes";
+  version = "1.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "googleapis";
+    repo = "python-db-dtypes-pandas";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-OAVHx/a4uupVGXSWN2/3uem9/4i+TUkzTX4kp0uLY44=";
+  };
+
+  patches = [
+    # on master branch, to be released as 1.1.2
+    (fetchpatch {
+      name = "xfail-tests-that-are-known-to-fail.patch";
+      url = "https://github.com/googleapis/python-db-dtypes-pandas/commit/4a56b766b0ccba900a555167863f1081a76c4c0d.patch";
+      hash = "sha256-ra1d8Vewvwhkr7PBHc3KM6IUCWsHxE+B7UP2duTgjew=";
+    })
+    # on master branch, to be released as 1.1.2
+    (fetchpatch {
+      name = "add-import-and-object-reference-due-to-upstream-changes.patch";
+      url = "https://github.com/googleapis/python-db-dtypes-pandas/commit/8a7b25f3e708df5cd32afcb702fe16130846b165.patch";
+      hash = "sha256-JVbhiOIr5gKMSQpIQ+DgIRqq8V5x5ClQhkQzAmIYqEU=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    packaging
+    pandas
+    pyarrow
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "db_dtypes"
+  ];
+
+  meta = with lib; {
+    description = "Pandas Data Types for SQL systems (BigQuery, Spanner)";
+    homepage = "https://github.com/googleapis/python-db-dtypes-pandas";
+    changelog = "https://github.com/googleapis/python-db-dtypes-pandas/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dbf/default.nix b/nixpkgs/pkgs/development/python-modules/dbf/default.nix
new file mode 100644
index 000000000000..10cf43f4f648
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbf/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, aenum
+, pythonOlder
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "dbf";
+  version = "0.99.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lAJypyrCfRah22mq/vggaEASzDVT/+mHXVzS46nLadw=";
+  };
+
+  propagatedBuildInputs = [
+    aenum
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} dbf/test.py
+  '';
+
+  pythonImportsCheck = [
+    "dbf"
+  ];
+
+  meta = with lib; {
+    description = "Module for reading/writing dBase, FoxPro, and Visual FoxPro .dbf files";
+    homepage = "https://github.com/ethanfurman/dbf";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ vrthra ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dbfread/default.nix b/nixpkgs/pkgs/development/python-modules/dbfread/default.nix
new file mode 100644
index 000000000000..1708a75fc10e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbfread/default.nix
@@ -0,0 +1,18 @@
+{ lib, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+    pname = "dbfread";
+    version = "2.0.7";
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "07c8a9af06ffad3f6f03e8fe91ad7d2733e31a26d2b72c4dd4cfbae07ee3b73d";
+    };
+
+    meta = with lib; {
+      description = "Read DBF Files with Python";
+      homepage    = "https://dbfread.readthedocs.org/";
+      license     = with licenses; [ mit ];
+      maintainers = with maintainers; [ vrthra ];
+    };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dbt-bigquery/default.nix b/nixpkgs/pkgs/development/python-modules/dbt-bigquery/default.nix
new file mode 100644
index 000000000000..5b1e9aeeb946
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbt-bigquery/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, agate
+, dbt-core
+, google-cloud-bigquery
+, google-cloud-storage
+, google-cloud-dataproc
+, pytestCheckHook
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "dbt-bigquery";
+  version = "1.6.4";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "dbt-labs";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-m458gg5TQ7jznhA9QNi8KQ+ICxdQn58mS0jvyZ88Fmg=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    "agate"
+  ];
+
+  propagatedBuildInputs = [
+    agate
+    dbt-core
+    google-cloud-bigquery
+    google-cloud-storage
+    google-cloud-dataproc
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests/unit"
+  ];
+
+  pythonImportsCheck = [
+    "dbt.adapters.bigquery"
+  ];
+
+  meta = with lib; {
+    description = "Plugin enabling dbt to operate on a BigQuery database";
+    homepage = "https://github.com/dbt-labs/dbt-bigquery";
+    changelog = "https://github.com/dbt-labs/dbt-bigquery/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ tjni ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dbt-core/default.nix b/nixpkgs/pkgs/development/python-modules/dbt-core/default.nix
new file mode 100644
index 000000000000..93c738314fbc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbt-core/default.nix
@@ -0,0 +1,116 @@
+{ lib
+, python3
+, buildPythonPackage
+, fetchFromGitHub
+, agate
+, cffi
+, click
+, colorama
+, dbt-extractor
+, dbt-semantic-interfaces
+, hologram
+, idna
+, isodate
+, jinja2
+, logbook
+, mashumaro
+, minimal-snowplow-tracker
+, networkx
+, packaging
+, pathspec
+, protobuf
+, pythonRelaxDepsHook
+, pytz
+, pyyaml
+, requests
+, sqlparse
+, typing-extensions
+, urllib3
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "dbt-core";
+  version = "1.6.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "dbt-labs";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-zmZdFOB0jQHamRJ7Zuzr/augP6Y2smAdUvqSXDZDuwo=";
+  };
+
+  sourceRoot = "${src.name}/core";
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    "agate"
+    "click"
+    "mashumaro"
+    "networkx"
+    "logbook"
+  ];
+
+  propagatedBuildInputs = [
+    agate
+    cffi
+    click
+    colorama
+    dbt-extractor
+    dbt-semantic-interfaces
+    hologram
+    idna
+    isodate
+    jinja2
+    logbook
+    mashumaro
+    minimal-snowplow-tracker
+    networkx
+    packaging
+    pathspec
+    protobuf
+    pytz
+    pyyaml
+    requests
+    sqlparse
+    typing-extensions
+    urllib3
+    werkzeug
+  ] ++ mashumaro.optional-dependencies.msgpack;
+
+  # tests exist for the dbt tool but not for this package specifically
+  doCheck = false;
+
+  passthru = {
+    withAdapters = python3.pkgs.callPackage ./with-adapters.nix { };
+  };
+
+  meta = with lib; {
+    description = "Enables data analysts and engineers to transform their data using the same practices that software engineers use to build applications";
+    longDescription = ''
+      The dbt tool needs adapters to data sources in order to work. The available
+      adapters are:
+
+        dbt-bigquery
+        dbt-postgres
+        dbt-redshift
+        dbt-snowflake
+
+      An example of building this package with a few adapters:
+
+        dbt.withAdapters (adapters: [
+          adapters.dbt-bigquery
+          adapters.dbt-postgres
+        ])
+    '';
+    homepage = "https://github.com/dbt-labs/dbt-core";
+    changelog = "https://github.com/dbt-labs/dbt-core/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ mausch tjni ];
+    mainProgram = "dbt";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dbt-core/with-adapters.nix b/nixpkgs/pkgs/development/python-modules/dbt-core/with-adapters.nix
new file mode 100644
index 000000000000..006f4a96b853
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbt-core/with-adapters.nix
@@ -0,0 +1,18 @@
+{ python3
+, dbt-bigquery
+, dbt-core
+, dbt-postgres
+, dbt-redshift
+, dbt-snowflake
+}:
+let
+  adapters = {
+    inherit dbt-bigquery dbt-postgres dbt-redshift dbt-snowflake;
+  };
+in
+adapterFun: (python3.buildEnv.override {
+  extraLibs = [ dbt-core ] ++ (adapterFun adapters);
+  ignoreCollisions = true;
+}).overrideAttrs {
+  meta.mainProgram = dbt-core.meta.mainProgram;
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dbt-extractor/Cargo.lock b/nixpkgs/pkgs/development/python-modules/dbt-extractor/Cargo.lock
new file mode 100644
index 000000000000..8b297123703a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbt-extractor/Cargo.lock
@@ -0,0 +1,531 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "aho-corasick"
+version = "0.7.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "cc"
+version = "1.0.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e70cc2f62c6ce1868963827bd677764c62d07c3d9a3e1fb1177ee1a9ab199eb2"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e"
+dependencies = [
+ "cfg-if",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+ "lazy_static",
+ "memoffset",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db"
+dependencies = [
+ "cfg-if",
+ "lazy_static",
+]
+
+[[package]]
+name = "dbt-extractor"
+version = "0.4.1"
+dependencies = [
+ "pyo3",
+ "quickcheck",
+ "quickcheck_macros",
+ "rayon",
+ "thiserror",
+ "tree-sitter",
+ "tree-sitter-jinja2",
+]
+
+[[package]]
+name = "either"
+version = "1.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
+
+[[package]]
+name = "env_logger"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3"
+dependencies = [
+ "log",
+ "regex",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "indoc"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "47741a8bc60fb26eb8d6e0238bbb26d8575ff623fdc97b1a2c00c050b9684ed8"
+dependencies = [
+ "indoc-impl",
+ "proc-macro-hack",
+]
+
+[[package]]
+name = "indoc-impl"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce046d161f000fffde5f432a0d034d0341dc152643b2598ed5bfce44c4f3a8f0"
+dependencies = [
+ "proc-macro-hack",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "unindent",
+]
+
+[[package]]
+name = "instant"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bee0328b1209d157ef001c94dd85b4f8f64139adb0eac2659f4b08382b2f474d"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "libc"
+version = "0.2.101"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3cb00336871be5ed2c8ed44b60ae9959dc5b9f08539422ed43f09e34ecaeba21"
+
+[[package]]
+name = "lock_api"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0382880606dff6d15c9476c416d18690b72742aa7b605bb6dd6ec9030fbf07eb"
+dependencies = [
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "memchr"
+version = "2.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a"
+
+[[package]]
+name = "memoffset"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5"
+
+[[package]]
+name = "parking_lot"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb"
+dependencies = [
+ "instant",
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018"
+dependencies = [
+ "cfg-if",
+ "instant",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "winapi",
+]
+
+[[package]]
+name = "paste"
+version = "0.1.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "45ca20c77d80be666aef2b45486da86238fabe33e38306bd3118fe4af33fa880"
+dependencies = [
+ "paste-impl",
+ "proc-macro-hack",
+]
+
+[[package]]
+name = "paste-impl"
+version = "0.1.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d95a7db200b97ef370c8e6de0088252f7e0dfff7d047a28528e47456c0fc98b6"
+dependencies = [
+ "proc-macro-hack",
+]
+
+[[package]]
+name = "proc-macro-hack"
+version = "0.5.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612"
+dependencies = [
+ "unicode-xid",
+]
+
+[[package]]
+name = "pyo3"
+version = "0.15.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7cf01dbf1c05af0a14c7779ed6f3aa9deac9c3419606ac9de537a2d649005720"
+dependencies = [
+ "cfg-if",
+ "indoc",
+ "libc",
+ "parking_lot",
+ "paste",
+ "pyo3-build-config",
+ "pyo3-macros",
+ "unindent",
+]
+
+[[package]]
+name = "pyo3-build-config"
+version = "0.15.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbf9e4d128bfbddc898ad3409900080d8d5095c379632fbbfbb9c8cfb1fb852b"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "pyo3-macros"
+version = "0.15.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67701eb32b1f9a9722b4bc54b548ff9d7ebfded011c12daece7b9063be1fd755"
+dependencies = [
+ "pyo3-macros-backend",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "pyo3-macros-backend"
+version = "0.15.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f44f09e825ee49a105f2c7b23ebee50886a9aee0746f4dd5a704138a64b0218a"
+dependencies = [
+ "proc-macro2",
+ "pyo3-build-config",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "quickcheck"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "588f6378e4dd99458b60ec275b4477add41ce4fa9f64dcba6f15adccb19b50d6"
+dependencies = [
+ "env_logger",
+ "log",
+ "rand",
+]
+
+[[package]]
+name = "quickcheck_macros"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b22a693222d716a9587786f37ac3f6b4faedb5b80c23914e7303ff5a1d8016e9"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8"
+dependencies = [
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "rayon"
+version = "1.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90"
+dependencies = [
+ "autocfg",
+ "crossbeam-deque",
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e"
+dependencies = [
+ "crossbeam-channel",
+ "crossbeam-deque",
+ "crossbeam-utils",
+ "lazy_static",
+ "num_cpus",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "regex"
+version = "1.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "smallvec"
+version = "1.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e"
+
+[[package]]
+name = "syn"
+version = "1.0.75"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7f58f7e8eaa0009c5fec437aabf511bd9933e4b2d7407bd05273c01a8906ea7"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-xid",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tree-sitter"
+version = "0.19.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad726ec26496bf4c083fff0f43d4eb3a2ad1bba305323af5ff91383c0b6ecac0"
+dependencies = [
+ "cc",
+ "regex",
+]
+
+[[package]]
+name = "tree-sitter-jinja2"
+version = "0.1.0"
+source = "git+https://github.com/dbt-labs/tree-sitter-jinja2?tag=v0.1.0#52da7b0b1480b23381ea84cf5ea3bf058dd6d8c4"
+dependencies = [
+ "cc",
+ "tree-sitter",
+]
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
+
+[[package]]
+name = "unindent"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f14ee04d9415b52b3aeab06258a3f07093182b88ba0f9b8d203f211a7a7d41c7"
+
+[[package]]
+name = "wasi"
+version = "0.10.2+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
diff --git a/nixpkgs/pkgs/development/python-modules/dbt-extractor/default.nix b/nixpkgs/pkgs/development/python-modules/dbt-extractor/default.nix
new file mode 100644
index 000000000000..2656be91086d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbt-extractor/default.nix
@@ -0,0 +1,49 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, rustPlatform
+, libiconv
+}:
+
+buildPythonPackage rec {
+  pname = "dbt-extractor";
+  version = "0.4.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "dbt_extractor";
+    inherit version;
+    hash = "sha256-dbHGZWmewPH/zhuj13b3386AIVbyLnCnucjwtNfoD0I=";
+  };
+
+  cargoDeps = rustPlatform.importCargoLock {
+    lockFile = ./Cargo.lock;
+    outputHashes = {
+      "tree-sitter-jinja2-0.1.0" = "sha256-lzA2iq4AK0iNwkLvbIt7Jm5WGFbMPFDi6i4AFDm0FOU=";
+    };
+  };
+
+  nativeBuildInputs = [
+    rustPlatform.cargoSetupHook
+    rustPlatform.maturinBuildHook
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    libiconv
+  ];
+
+  # no python tests exist
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dbt_extractor"
+  ];
+
+  meta = with lib; {
+    description = "A tool that processes the most common jinja value templates in dbt model files";
+    homepage = "https://github.com/dbt-labs/dbt-extractor";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ mausch tjni ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dbt-postgres/default.nix b/nixpkgs/pkgs/development/python-modules/dbt-postgres/default.nix
new file mode 100644
index 000000000000..0478e748f1c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbt-postgres/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, agate
+, dbt-core
+, psycopg2
+}:
+
+buildPythonPackage {
+  pname = "dbt-postgres";
+  format = "setuptools";
+
+  inherit (dbt-core) version src;
+
+  sourceRoot = "${dbt-core.src.name}/plugins/postgres";
+
+  env.DBT_PSYCOPG2_NAME = "psycopg2";
+
+  propagatedBuildInputs = [
+    agate
+    dbt-core
+    psycopg2
+  ];
+
+  # tests exist for the dbt tool but not for this package specifically
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dbt.adapters.postgres"
+  ];
+
+  meta = with lib; {
+    description = "Plugin enabling dbt to work with a Postgres database";
+    homepage = "https://github.com/dbt-labs/dbt-core";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ tjni ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dbt-redshift/default.nix b/nixpkgs/pkgs/development/python-modules/dbt-redshift/default.nix
new file mode 100644
index 000000000000..46f62dcafd7e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbt-redshift/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, agate
+, boto3
+, dbt-core
+, dbt-postgres
+, pytestCheckHook
+, pythonRelaxDepsHook
+, redshift-connector
+}:
+
+buildPythonPackage rec {
+  pname = "dbt-redshift";
+  version = "1.6.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "dbt-labs";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-5sgge55BwvC00Gj3UvLS/uzCgNSi4j4YdVlg/LuJI+s=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    "boto3"
+    "redshift-connector"
+  ];
+
+  propagatedBuildInputs = [
+    agate
+    boto3
+    dbt-core
+    dbt-postgres
+    redshift-connector
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests/unit"
+  ];
+
+  pythonImportsCheck = [
+    "dbt.adapters.redshift"
+  ];
+
+  meta = with lib; {
+    description = "Plugin enabling dbt to work with Amazon Redshift";
+    homepage = "https://github.com/dbt-labs/dbt-redshift";
+    changelog = "https://github.com/dbt-labs/dbt-redshift/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ tjni ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dbt-semantic-interfaces/default.nix b/nixpkgs/pkgs/development/python-modules/dbt-semantic-interfaces/default.nix
new file mode 100644
index 000000000000..694b2c7f7372
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbt-semantic-interfaces/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, click
+, dateutils
+, hatchling
+, importlib-metadata
+, jinja2
+, jsonschema
+, more-itertools
+, pydantic
+, pyyaml
+, typing-extensions
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "dbt-semantic-interfaces";
+  version = "0.2.2";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "dbt-labs";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-pnhmfj349uMjSsmdr53dY1Xur6huRKHiXWI7DXYK1gE=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    dateutils
+    importlib-metadata
+    jinja2
+    jsonschema
+    more-itertools
+    pydantic
+    pyyaml
+    typing-extensions
+  ];
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    hypothesis
+  ];
+
+  pythonImportsCheck = [
+    "dbt_semantic_interfaces"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/dbt-labs/dbt-semantic-interfaces/releases/tag/v${version}";
+    description = "shared interfaces used by dbt-core and MetricFlow projects";
+    homepage = "https://github.com/dbt-labs/dbt-semantic-interfaces";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ pbsds ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dbt-snowflake/default.nix b/nixpkgs/pkgs/development/python-modules/dbt-snowflake/default.nix
new file mode 100644
index 000000000000..dccf0ed7f989
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbt-snowflake/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, dbt-core
+, pytestCheckHook
+, snowflake-connector-python
+}:
+
+buildPythonPackage rec {
+  pname = "dbt-snowflake";
+  version = "1.6.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "dbt-labs";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-AOO3VbU1R3/snH7U7K9XXokBGXtf9Udpv7eR5HCBxss=";
+  };
+
+  propagatedBuildInputs = [
+    dbt-core
+    snowflake-connector-python
+  ] ++ snowflake-connector-python.optional-dependencies.secure-local-storage;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests/unit"
+  ];
+
+  pythonImportsCheck = [
+    "dbt.adapters.snowflake"
+  ];
+
+  meta = with lib; {
+    description = "Plugin enabling dbt to work with Snowflake";
+    homepage = "https://github.com/dbt-labs/dbt-snowflake";
+    changelog = "https://github.com/dbt-labs/dbt-snowflake/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ tjni ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dbus-client-gen/default.nix b/nixpkgs/pkgs/development/python-modules/dbus-client-gen/default.nix
new file mode 100644
index 000000000000..811ec6e0d3db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbus-client-gen/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "dbus-client-gen";
+  version = "0.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vRXo72aWoreH/VwzdEAOgoGSRzRf7vy8Z/IA+lnLoWw=";
+  };
+
+  meta = with lib; {
+    description = "A Python Library for Generating D-Bus Client Code";
+    homepage = "https://github.com/stratis-storage/dbus-client-gen";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dbus-deviation/default.nix b/nixpkgs/pkgs/development/python-modules/dbus-deviation/default.nix
new file mode 100644
index 000000000000..164c543a5ed7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbus-deviation/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, lxml
+, setuptools-git
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "dbus-deviation";
+  version = "0.6.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-4GuI7+IjiF0nJd9Rz3ybe0Y9HG8E6knUaQh0MY0Ot6M=";
+  };
+
+  postPatch = ''
+    sed -i "/'sphinx',/d" setup.py
+  '';
+
+  nativeBuildInputs = [
+    setuptools-git
+    sphinx
+  ];
+
+  propagatedBuildInputs = [
+    lxml
+  ];
+
+  pythonImportsCheck = [ "dbusdeviation" ];
+
+  meta = with lib; {
+    homepage = "https://tecnocode.co.uk/dbus-deviation/";
+    description = "A project for parsing D-Bus introspection XML and processing it in various ways";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ lilyinstarlight ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dbus-fast/default.nix b/nixpkgs/pkgs/development/python-modules/dbus-fast/default.nix
new file mode 100644
index 000000000000..233067fbbce3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbus-fast/default.nix
@@ -0,0 +1,108 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, cython_3
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "dbus-fast";
+  version = "2.15.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-TgkOE6gOFbrbHsllpAZuNNQm3EqCrWW5WSMKqW8bOuI=";
+  };
+
+  # The project can build both an optimized cython version and an unoptimized
+  # python version. This ensures we fail if we build the wrong one.
+  env.REQUIRE_CYTHON = 1;
+
+  nativeBuildInputs = [
+    cython_3
+    poetry-core
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    async-timeout
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=dbus_fast --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "dbus_fast"
+    "dbus_fast.aio"
+    "dbus_fast.service"
+    "dbus_fast.message"
+  ];
+
+  disabledTests = [
+    # Test require a running Dbus instance
+    "test_aio_big_message"
+    "test_aio_properties"
+    "test_aio_proxy_object"
+    "test_bus_disconnect_before_reply"
+    "test_export_alias"
+    "test_export_introspection"
+    "test_export_unexport"
+    "test_fast_disconnect"
+    "test_glib_big_message"
+    "test_high_level_service_fd_passing"
+    "test_interface_add_remove_signal"
+    "test_introspectable_interface"
+    "test_methods"
+    "test_multiple_flags_in_message"
+    "test_name_requests"
+    "test_object_manager"
+    "test_peer_interface"
+    "test_property_changed_signal"
+    "test_property_changed_signal"
+    "test_property_methods"
+    "test_sending_file_descriptor_low_level"
+    "test_sending_file_descriptor_with_proxy"
+    "test_sending_messages_between_buses"
+    "test_sending_signals_between_buses"
+    "test_signals"
+    "test_standard_interface_properties"
+    "test_standard_interfaces"
+    "test_tcp_connection_with_forwarding"
+    "test_unexpected_disconnect"
+    # NameError: name '_cast_uint32_native' is not defined
+    "test_unmarshall_bluez_interfaces_added_message"
+    "test_unmarshall_bluez_interfaces_removed_message"
+    "test_unmarshall_bluez_message"
+    "test_unmarshall_bluez_properties_changed_with_service_data"
+    "test_unmarshall_can_resume"
+    "test_unmarshalling_with_table"
+    "test_ay_buffer"
+  ];
+
+  meta = with lib; {
+    description = "Faster version of dbus-next";
+    homepage = "https://github.com/bluetooth-devices/dbus-fast";
+    changelog = "https://github.com/Bluetooth-Devices/dbus-fast/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dbus-next/default.nix b/nixpkgs/pkgs/development/python-modules/dbus-next/default.nix
new file mode 100644
index 000000000000..f1b32b6a3bc0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbus-next/default.nix
@@ -0,0 +1,45 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, dbus, pytest, pytest-cov, pytest-asyncio, pytest-timeout
+}:
+
+buildPythonPackage rec {
+  pname = "dbus-next";
+  version = "0.2.3";
+
+  src = fetchFromGitHub {
+    owner = "altdesktop";
+    repo = "python-dbus-next";
+    rev = "v${version}";
+    hash = "sha256-EKEQZFRUe+E65Z6DNCJFL5uCI5kbXrN7Tzd4O0X5Cqo=";
+  };
+
+  nativeCheckInputs = [
+    dbus
+    pytest
+    pytest-cov
+    pytest-asyncio
+    pytest-timeout
+  ];
+
+  # test_peer_interface hits a timeout
+  # test_tcp_connection_with_forwarding fails due to dbus
+  # creating unix socket anyway on v1.14.4
+  checkPhase = ''
+    dbus-run-session --config-file=${dbus}/share/dbus-1/session.conf \
+      ${python.interpreter} -m pytest -sv --cov=dbus_next \
+      -k "not test_peer_interface and not test_tcp_connection_with_forwarding"
+  '';
+
+  meta = with lib; {
+    description = "A zero-dependency DBus library for Python with asyncio support";
+    homepage = "https://github.com/altdesktop/python-dbus-next";
+    changelog = "https://github.com/altdesktop/python-dbus-next/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sfrijters ];
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dbus-python-client-gen/default.nix b/nixpkgs/pkgs/development/python-modules/dbus-python-client-gen/default.nix
new file mode 100644
index 000000000000..15b696f62bdb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbus-python-client-gen/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, into-dbus-python
+, dbus-python
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dbus-python-client-gen";
+  version = "0.8.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "stratis-storage";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-4Y4cL254ZlZKF6d6cStIOya3J4ZfypuumwKOdDNzuNc=";
+  };
+
+  propagatedBuildInputs = [
+    into-dbus-python
+    dbus-python
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "dbus_python_client_gen" ];
+
+  meta = with lib; {
+    description = "A Python library for generating dbus-python client code";
+    homepage = "https://github.com/stratis-storage/dbus-python-client-gen";
+    changelog = "https://github.com/stratis-storage/dbus-python-client-gen/blob/v${version}/CHANGES.txt";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dbus-signature-pyparsing/default.nix b/nixpkgs/pkgs/development/python-modules/dbus-signature-pyparsing/default.nix
new file mode 100644
index 000000000000..2b00b34be19c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbus-signature-pyparsing/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyparsing
+, pytestCheckHook
+, hypothesis
+, hs-dbus-signature
+}:
+
+buildPythonPackage rec {
+  pname = "dbus-signature-pyparsing";
+  version = "0.4.1";
+
+  src = fetchFromGitHub {
+    owner = "stratis-storage";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-+jY8kg3jBDpZr5doih3DiyUEcSskq7TgubmW3qdBoZM=";
+  };
+
+  propagatedBuildInputs = [ pyparsing ];
+  nativeCheckInputs = [
+    pytestCheckHook
+    hypothesis
+    hs-dbus-signature
+  ];
+
+  pythonImportsCheck = [ "dbus_signature_pyparsing" ];
+
+  meta = with lib; {
+    description = "A Parser for a D-Bus Signature";
+    homepage = "https://github.com/stratis-storage/dbus-signature-pyparsing";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dbus/default.nix b/nixpkgs/pkgs/development/python-modules/dbus/default.nix
new file mode 100644
index 000000000000..f929f58de1c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbus/default.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, python, pkg-config, dbus, dbus-glib, isPyPy
+, ncurses, pygobject3, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "dbus-python";
+  version = "1.2.18";
+
+  disabled = isPyPy;
+  format = "other";
+  outputs = [ "out" "dev" ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0q3jrw515z98mqdk9x822nd95rky455zz9876f1nqna5igkd3gcj";
+  };
+
+  patches = [
+    ./fix-includedir.patch
+  ];
+
+  preConfigure = lib.optionalString (lib.versionAtLeast stdenv.hostPlatform.darwinMinVersion "11" && stdenv.isDarwin) ''
+    MACOSX_DEPLOYMENT_TARGET=10.16
+  '';
+
+  configureFlags = [
+    "PYTHON=${python.pythonOnBuildForHost.interpreter}"
+  ];
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ dbus dbus-glib ]
+    # My guess why it's sometimes trying to -lncurses.
+    # It seems not to retain the dependency anyway.
+    ++ lib.optional (! python ? modules) ncurses;
+
+  doCheck = isPy3k;
+  nativeCheckInputs = [ dbus.out pygobject3 ];
+
+  postInstall = ''
+    cp -r dbus_python.egg-info $out/${python.sitePackages}/
+  '';
+
+  meta = with lib; {
+    description = "Python DBus bindings";
+    license = licenses.mit;
+    platforms = dbus.meta.platforms;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dbus/fix-includedir.patch b/nixpkgs/pkgs/development/python-modules/dbus/fix-includedir.patch
new file mode 100644
index 000000000000..e3bb0682b5c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbus/fix-includedir.patch
@@ -0,0 +1,8 @@
+--- a/dbus-python.pc.in
++++ b/dbus-python.pc.in
+@@ -9,4 +9,4 @@
+ Description: Python bindings for D-Bus
+ Requires: dbus-1 >= 1.0
+ Version: @VERSION@
+-Cflags: -I${includedir}
++Cflags: -I${includedir}/dbus-1.0
diff --git a/nixpkgs/pkgs/development/python-modules/dbutils/default.nix b/nixpkgs/pkgs/development/python-modules/dbutils/default.nix
new file mode 100644
index 000000000000..570f770e7777
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dbutils/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dbutils";
+  version = "3.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "DBUtils";
+    hash = "sha256-jkhWWxKtK0sfIU3gKU3utLKFePWyq7QNaMKSS2TX4Ac=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dbutils"
+  ];
+
+  meta = with lib; {
+    description = "Database connections for multi-threaded environments";
+    homepage = "https://webwareforpython.github.io/DBUtils/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dcmstack/default.nix b/nixpkgs/pkgs/development/python-modules/dcmstack/default.nix
new file mode 100644
index 000000000000..08dcbb796acb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dcmstack/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, nibabel
+, pydicom
+, pylibjpeg-libjpeg
+}:
+
+buildPythonPackage rec {
+  pname = "dcmstack";
+  version = "0.9";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "moloney";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-GVzih9H2m2ZGSuZMRuaDG78b95PI3j0WQw5M3l4KNCs=";
+  };
+
+  propagatedBuildInputs = [
+    nibabel
+    pydicom
+    pylibjpeg-libjpeg
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    homepage = "https://github.com/moloney/dcmstack";
+    description = "DICOM to Nifti conversion preserving metadata";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dctorch/default.nix b/nixpkgs/pkgs/development/python-modules/dctorch/default.nix
new file mode 100644
index 000000000000..d44d00629cff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dctorch/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, poetry-core
+, numpy
+, scipy
+, torch
+}:
+
+buildPythonPackage rec {
+  pname = "dctorch";
+  version = "0.1.2";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-TmfLAkiofrQNWYBhIlY4zafbZPgFftISCGloO/rlEG4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    torch
+  ];
+
+  pythonImportsCheck = [
+    "dctorch"
+  ];
+
+  doCheck = false; # no tests
+
+  meta = with lib; {
+    description = "Fast discrete cosine transforms for pytorch";
+    homepage = "https://pypi.org/project/dctorch/";
+    license = licenses.mit;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ddt/default.nix b/nixpkgs/pkgs/development/python-modules/ddt/default.nix
new file mode 100644
index 000000000000..4c0d90575c69
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ddt/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six, pyyaml, mock
+, pytestCheckHook
+, enum34
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "ddt";
+  version = "1.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-9xs0hzG4x4wxAL/72VGnafvUOQiNH9uzhB7uAZr4Cs0=";
+  };
+
+  propagatedBuildInputs = lib.optionals (!isPy3k) [
+    enum34
+  ];
+
+  nativeCheckInputs = [ six pyyaml mock pytestCheckHook ];
+
+  preCheck = ''
+    # pytest can't import one file even with PYTHONPATH set
+    rm test/test_named_data.py
+  '';
+
+  meta = with lib; {
+    description = "Data-Driven/Decorated Tests, a library to multiply test cases";
+    homepage = "https://github.com/txels/ddt";
+    maintainers = with maintainers; [ ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deal-solver/default.nix b/nixpkgs/pkgs/development/python-modules/deal-solver/default.nix
new file mode 100644
index 000000000000..5c91d6d92559
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deal-solver/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, flit-core
+, z3
+, astroid
+, pytestCheckHook
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "deal-solver";
+  version = "0.1.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "life4";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-DAOeQLFR/JED32uJSW7W9+Xx5f1Et05W8Fp+Vm7sfZo=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  postPatch = ''
+    # Use upstream z3 implementation
+    substituteInPlace pyproject.toml \
+      --replace "\"z3-solver\"," "" \
+      --replace "\"--cov=deal_solver\"," "" \
+      --replace "\"--cov-report=html\"," "" \
+      --replace "\"--cov-report=xml\"," "" \
+      --replace "\"--cov-report=term-missing:skip-covered\"," "" \
+      --replace "\"--cov-fail-under=100\"," ""
+  '';
+
+  propagatedBuildInputs = [
+    z3
+    astroid
+  ] ++ z3.requiredPythonModules;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    hypothesis
+  ];
+
+  pythonImportsCheck = [ "deal_solver" ];
+
+  meta = with lib; {
+    description = "Z3-powered solver (theorem prover) for deal";
+    homepage = "https://github.com/life4/deal-solver";
+    changelog = "https://github.com/life4/deal-solver/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deal/default.nix b/nixpkgs/pkgs/development/python-modules/deal/default.nix
new file mode 100644
index 000000000000..13704b20939a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deal/default.nix
@@ -0,0 +1,105 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, flit-core
+, astroid
+, pytestCheckHook
+, docstring-parser
+, marshmallow
+, sphinx
+, hypothesis
+, vaa
+, deal-solver
+, pygments
+, typeguard
+, urllib3
+, flake8
+}:
+
+buildPythonPackage rec {
+  pname = "deal";
+  version = "4.24.2";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "life4";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-bdIoKOOC7qSer9Cp9A55HG960xunKXT2WiXp0UC6tsI=";
+  };
+
+  postPatch = ''
+    # don't do coverage
+    substituteInPlace pyproject.toml \
+      --replace "\"--cov-fail-under=100\"," "" \
+      --replace "\"--cov=deal\"," "" \
+      --replace "\"--cov-report=html\"," "" \
+      --replace "\"--cov-report=term-missing:skip-covered\"," ""
+  '';
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    astroid
+    deal-solver
+    pygments
+    typeguard
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+
+    docstring-parser
+    marshmallow
+    sphinx
+    hypothesis
+    vaa
+    urllib3
+    flake8
+  ];
+
+  disabledTests = [
+    # needs internet access
+    "test_smoke_has"
+    "test_pure_offline"
+    "test_raises_doesnt_override_another_contract"
+    "test_raises_doesnt_override_another_contract_async"
+    "test_raises_generator"
+    # AttributeError: module 'vaa' has no attribute 'Error'
+    "test_source_vaa_scheme"
+    "test_vaa_scheme_and_custom_exception"
+    "test_scheme_string_validation_args_correct"
+    "test_method_chain_decorator_with_scheme_is_fulfilled"
+    "test_scheme_contract_is_satisfied_when_setting_arg"
+    "test_scheme_contract_is_satisfied_within_chain"
+    "test_scheme_errors_rewrite_message"
+    # assert errors
+    "test_doctest"
+    "test_no_violations"
+  ];
+
+  disabledTestPaths = [
+    # needs internet access
+    "tests/test_runtime/test_offline.py"
+    # depends on typeguard <4.0.0 for tests, but >=4.0.0 seems fine for runtime
+    # https://github.com/life4/deal/blob/9be70fa1c5a0635880619b2cea83a9f6631eb236/pyproject.toml#L40
+    "tests/test_testing.py"
+  ];
+
+  pythonImportsCheck = [ "deal" ];
+
+  meta = with lib; {
+    description = "Library for design by contract (DbC) and checking values, exceptions, and side-effects";
+    longDescription = ''
+      In a nutshell, deal empowers you to write bug-free code.
+      By adding a few decorators to your code, you get for free tests, static analysis, formal verification, and much more
+    '';
+    homepage = "https://github.com/life4/deal";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deap/default.nix b/nixpkgs/pkgs/development/python-modules/deap/default.nix
new file mode 100644
index 000000000000..ad69642a4f7b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deap/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, matplotlib
+, numpy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "deap";
+  version = "1.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zAHemJLfp9G8mAPasoiS/q0XfwGCyB20c2CiQOrXeP8=";
+  };
+
+  propagatedBuildInputs = [ matplotlib numpy ];
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "A novel evolutionary computation framework for rapid prototyping and testing of ideas";
+    homepage = "https://github.com/DEAP/deap";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ getpsyched psyanticy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/debian-inspector/default.nix b/nixpkgs/pkgs/development/python-modules/debian-inspector/default.nix
new file mode 100644
index 000000000000..cc6a4fffc422
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/debian-inspector/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, chardet
+, attrs
+, commoncode
+, pytestCheckHook
+, setuptools-scm
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "debian-inspector";
+  version = "31.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "debian_inspector";
+    inherit version;
+    hash = "sha256-RglPlTRksmm7CYVere7jySy2tIegv6JuulN7Usw9a0c=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  dontConfigure = true;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    chardet
+    attrs
+    commoncode
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "debian_inspector"
+  ];
+
+  meta = with lib; {
+    description = "Utilities to parse Debian package, copyright and control files";
+    homepage = "https://github.com/nexB/debian-inspector";
+    license = with licenses; [ asl20 bsd3 mit ];
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/debian/default.nix b/nixpkgs/pkgs/development/python-modules/debian/default.nix
new file mode 100644
index 000000000000..70b33cfa7a3b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/debian/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, chardet
+}:
+
+buildPythonPackage rec {
+  pname = "python-debian";
+  version = "0.1.49";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jPZ3ow28tL56mVNsF+ETCKgnpNIgKNxZpn9sbdPw9Yw=";
+  };
+
+  propagatedBuildInputs = [
+    chardet
+  ];
+
+  # No tests in archive
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "debian"
+  ];
+
+  meta = with lib; {
+    description = "Debian package related modules";
+    homepage = "https://salsa.debian.org/python-debian-team/python-debian";
+    changelog = "https://salsa.debian.org/python-debian-team/python-debian/-/blob/master/debian/changelog";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/debianbts/default.nix b/nixpkgs/pkgs/development/python-modules/debianbts/default.nix
new file mode 100644
index 000000000000..67b43fdff3fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/debianbts/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pysimplesoap
+, pytestCheckHook
+, pytest-xdist
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "python-debianbts";
+  version = "4.0.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JbPb0lZND96XLZNU97wMuT9iGNXVN2KTsZC2St6FfuU=";
+  };
+
+  postPatch = ''
+    sed -i "/--cov/d" pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pysimplesoap
+  ];
+
+  # Most tests require network access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "debianbts"
+  ];
+
+  meta = with lib; {
+    description = "Python interface to Debian's Bug Tracking System";
+    homepage = "https://github.com/venthur/python-debianbts";
+    downloadPage = "https://pypi.org/project/python-debianbts/";
+    changelog = "https://github.com/venthur/python-debianbts/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nicoo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/debtcollector/default.nix b/nixpkgs/pkgs/development/python-modules/debtcollector/default.nix
new file mode 100644
index 000000000000..b7617af15ff1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/debtcollector/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, pbr, six, wrapt, callPackage }:
+
+buildPythonPackage rec {
+  pname = "debtcollector";
+  version = "2.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3J0a0/dFxD9LvtvKMPn/6JBajAKMmSbmEHeEfV6iV6s=";
+  };
+
+  nativeBuildInputs = [ pbr ];
+
+  propagatedBuildInputs = [ six wrapt ];
+
+  # check in passthru.tests.pytest to escape infinite recursion with other oslo components
+  doCheck = false;
+
+  passthru.tests = {
+    tests = callPackage ./tests.nix { };
+  };
+
+  pythonImportsCheck = [ "debtcollector" ];
+
+  meta = with lib; {
+    description = "A collection of Python deprecation patterns and strategies that help you collect your technical debt in a non-destructive manner";
+    homepage = "https://github.com/openstack/debtcollector";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/debtcollector/tests.nix b/nixpkgs/pkgs/development/python-modules/debtcollector/tests.nix
new file mode 100644
index 000000000000..19386cdb53b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/debtcollector/tests.nix
@@ -0,0 +1,28 @@
+{ buildPythonPackage
+, debtcollector
+, stestr
+}:
+
+buildPythonPackage {
+  pname = "debtcollector-tests";
+  inherit (debtcollector) version src;
+  format = "other";
+
+  postPatch = ''
+    # only a small portion of the listed packages are actually needed for running the tests
+    # so instead of removing them one by one remove everything
+    rm test-requirements.txt
+  '';
+
+  dontBuild = true;
+  dontInstall = true;
+
+  nativeCheckInputs = [
+    debtcollector
+    stestr
+  ];
+
+  checkPhase = ''
+    stestr run
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/debts/default.nix b/nixpkgs/pkgs/development/python-modules/debts/default.nix
new file mode 100644
index 000000000000..7055a3736b22
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/debts/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, python
+, buildPythonPackage
+, fetchFromGitLab
+, isPy27
+, jinja2
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "debts";
+  version = "0.5";
+
+  # pypi does not ship tests
+  src = fetchFromGitLab {
+    domain = "framagit.org";
+    owner = "almet";
+    repo = "debts";
+    rev = "d887bd8b340172d1c9bbcca6426529b8d1c2a241"; # no tags
+    sha256 = "1d66nka81mv9c07mki78lp5hdajqv4cq6aq2k7bh3mhkc5hwnwlg";
+  };
+
+  disabled = isPy27;
+
+  propagatedBuildInputs = [ jinja2 ];
+
+  nativeCheckInputs = [ pytest ];
+
+  # for some reason tests only work if the module is properly installed
+  checkPhase = ''
+    rm -r debts
+    export PYTHONPATH=$out/${python.sitePackages}:$PYTHONPATH
+    py.test tests
+  '';
+
+  meta = with lib; {
+    inherit (src.meta) homepage;
+    description = "A simple library and cli-tool to help you solve some debts settlement scenarios";
+    license = licenses.beerware;
+    maintainers = [ maintainers.symphorien ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/debuglater/default.nix b/nixpkgs/pkgs/development/python-modules/debuglater/default.nix
new file mode 100644
index 000000000000..8eabbacf7c86
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/debuglater/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, colorama
+, dill
+, fetchFromGitHub
+, numpy
+, pandas
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "debuglater";
+  version = "1.4.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ploomber";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-o9IAk3EN8ghEft7Y7Xx+sEjWMNgoyiZ0eiBqnCyXkm8=";
+  };
+
+  propagatedBuildInputs = [
+    colorama
+  ];
+
+  passthru.optional-dependencies = {
+    all = [
+      dill
+    ];
+  };
+
+  nativeCheckInputs = [
+    numpy
+    pandas
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.all;
+
+  pythonImportsCheck = [
+    "debuglater"
+  ];
+
+  meta = with lib; {
+    description = "Module for post-mortem debugging of Python programs";
+    homepage = "https://github.com/ploomber/debuglater";
+    changelog = "https://github.com/ploomber/debuglater/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/debugpy/default.nix b/nixpkgs/pkgs/development/python-modules/debugpy/default.nix
new file mode 100644
index 000000000000..85389fba2fb2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/debugpy/default.nix
@@ -0,0 +1,127 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, substituteAll
+, gdb
+, django
+, flask
+, gevent
+, psutil
+, pytest-timeout
+, pytest-xdist
+, pytestCheckHook
+, requests
+, llvmPackages
+}:
+
+buildPythonPackage rec {
+  pname = "debugpy";
+  version = "1.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "microsoft";
+    repo = "debugpy";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-FW1RDmj4sDBS0q08C82ErUd16ofxJxgVaxfykn/wVBA=";
+  };
+
+  patches = [
+    # Use nixpkgs version instead of versioneer
+    (substituteAll {
+      src = ./hardcode-version.patch;
+      inherit version;
+    })
+
+    # Fix importing debugpy in:
+    # - test_nodebug[module-launch(externalTerminal)]
+    # - test_nodebug[module-launch(integratedTerminal)]
+    #
+    # NOTE: The import failures seen in these tests without the patch
+    # will be seen if a user "installs" debugpy by adding it to PYTHONPATH.
+    # To avoid this issue, debugpy should be installed using python.withPackages:
+    # python.withPackages (ps: with ps; [ debugpy ])
+    ./fix-test-pythonpath.patch
+  ] ++ lib.optionals stdenv.isLinux [
+    # Hard code GDB path (used to attach to process)
+    (substituteAll {
+      src = ./hardcode-gdb.patch;
+      inherit gdb;
+    })
+  ] ++ lib.optionals stdenv.isDarwin [
+    # Hard code LLDB path (used to attach to process)
+    (substituteAll {
+      src = ./hardcode-lldb.patch;
+      inherit (llvmPackages) lldb;
+    })
+  ];
+
+  # Remove pre-compiled "attach" libraries and recompile for host platform
+  # Compile flags taken from linux_and_mac/compile_linux.sh & linux_and_mac/compile_mac.sh
+  preBuild = ''(
+    set -x
+    cd src/debugpy/_vendored/pydevd/pydevd_attach_to_process
+    rm *.so *.dylib *.dll *.exe *.pdb
+    ${stdenv.cc}/bin/c++ linux_and_mac/attach.cpp -Ilinux_and_mac -fPIC -nostartfiles ${{
+      "x86_64-linux"   = "-shared -o attach_linux_amd64.so";
+      "i686-linux"     = "-shared -o attach_linux_x86.so";
+      "aarch64-linux"  = "-shared -o attach_linux_arm64.so";
+      "x86_64-darwin"  = "-std=c++11 -lc -D_REENTRANT -dynamiclib -o attach_x86_64.dylib";
+      "i686-darwin"    = "-std=c++11 -lc -D_REENTRANT -dynamiclib -o attach_x86.dylib";
+      "aarch64-darwin" = "-std=c++11 -lc -D_REENTRANT -dynamiclib -o attach_arm64.dylib";
+    }.${stdenv.hostPlatform.system} or (throw "Unsupported system: ${stdenv.hostPlatform.system}")}
+  )'';
+
+  nativeCheckInputs = [
+    django
+    flask
+    gevent
+    psutil
+    pytest-timeout
+    pytest-xdist
+    pytestCheckHook
+    requests
+  ];
+
+  preCheck = ''
+    export DEBUGPY_PROCESS_SPAWN_TIMEOUT=0
+    export DEBUGPY_PROCESS_EXIT_TIMEOUT=0
+  '' + lib.optionalString (stdenv.isDarwin && stdenv.isAarch64) ''
+    # https://github.com/python/cpython/issues/74570#issuecomment-1093748531
+    export no_proxy='*';
+  '';
+
+  postCheck = lib.optionalString (stdenv.isDarwin && stdenv.isAarch64) ''
+    unset no_proxy
+  '';
+
+  # Override default arguments in pytest.ini
+  pytestFlagsArray = [
+    "--timeout=0"
+  ];
+
+  # Fixes hanging tests on Darwin
+  __darwinAllowLocalNetworking = true;
+
+  disabledTests = [
+    # testsuite gets stuck at this one
+    "test_attach_pid_client"
+  ];
+
+  pythonImportsCheck = [
+    "debugpy"
+  ];
+
+  meta = with lib; {
+    description = "An implementation of the Debug Adapter Protocol for Python";
+    homepage = "https://github.com/microsoft/debugpy";
+    changelog = "https://github.com/microsoft/debugpy/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kira-bruneau ];
+    platforms = [ "x86_64-linux" "i686-linux" "aarch64-linux" "x86_64-darwin" "i686-darwin" "aarch64-darwin" ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/debugpy/fix-test-pythonpath.patch b/nixpkgs/pkgs/development/python-modules/debugpy/fix-test-pythonpath.patch
new file mode 100644
index 000000000000..7cfb1a49ec38
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/debugpy/fix-test-pythonpath.patch
@@ -0,0 +1,12 @@
+diff --git a/tests/debug/session.py b/tests/debug/session.py
+index 7dacc1f9..f303e20a 100644
+--- a/tests/debug/session.py
++++ b/tests/debug/session.py
+@@ -631,6 +631,7 @@ class Session(object):
+         if "PYTHONPATH" in self.config.env:
+             # If specified, launcher will use it in lieu of PYTHONPATH it inherited
+             # from the adapter when spawning debuggee, so we need to adjust again.
++            self.config.env.prepend_to("PYTHONPATH", os.environ["PYTHONPATH"])
+             self.config.env.prepend_to("PYTHONPATH", DEBUGGEE_PYTHONPATH.strpath)
+         return self._request_start("launch")
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/debugpy/hardcode-gdb.patch b/nixpkgs/pkgs/development/python-modules/debugpy/hardcode-gdb.patch
new file mode 100644
index 000000000000..2fe09a70151a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/debugpy/hardcode-gdb.patch
@@ -0,0 +1,13 @@
+diff --git a/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/add_code_to_python_process.py b/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/add_code_to_python_process.py
+index ed43e370..d3d6669a 100644
+--- a/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/add_code_to_python_process.py
++++ b/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/add_code_to_python_process.py
+@@ -404,7 +404,7 @@ def run_python_code_linux(pid, python_code, connect_debugger_tracing=False, show
+     is_debug = 0
+     # Note that the space in the beginning of each line in the multi-line is important!
+     cmd = [
+-        'gdb',
++        '@gdb@/bin/gdb',
+         '--nw',  # no gui interface
+         '--nh',  # no ~/.gdbinit
+         '--nx',  # no .gdbinit
diff --git a/nixpkgs/pkgs/development/python-modules/debugpy/hardcode-lldb.patch b/nixpkgs/pkgs/development/python-modules/debugpy/hardcode-lldb.patch
new file mode 100644
index 000000000000..3a1013187351
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/debugpy/hardcode-lldb.patch
@@ -0,0 +1,13 @@
+diff --git a/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/add_code_to_python_process.py b/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/add_code_to_python_process.py
+index d3d6669a..2ded8d9c 100644
+--- a/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/add_code_to_python_process.py
++++ b/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/add_code_to_python_process.py
+@@ -494,7 +494,7 @@ def run_python_code_mac(pid, python_code, connect_debugger_tracing=False, show_d
+     is_debug = 0
+     # Note that the space in the beginning of each line in the multi-line is important!
+     cmd = [
+-        'lldb',
++        '@lldb@/bin/lldb',
+         '--no-lldbinit',  # Do not automatically parse any '.lldbinit' files.
+         # '--attach-pid',
+         # str(pid),
diff --git a/nixpkgs/pkgs/development/python-modules/debugpy/hardcode-version.patch b/nixpkgs/pkgs/development/python-modules/debugpy/hardcode-version.patch
new file mode 100644
index 000000000000..11d565b98060
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/debugpy/hardcode-version.patch
@@ -0,0 +1,47 @@
+diff --git a/setup.py b/setup.py
+index 3abc811b..91354604 100644
+--- a/setup.py
++++ b/setup.py
+@@ -12,7 +12,6 @@ import sys
+ 
+ 
+ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
+-import versioneer  # noqa
+ 
+ del sys.path[0]
+ 
+@@ -145,13 +144,13 @@ if __name__ == "__main__":
+     if platforms is not None:
+         extras["platforms"] = platforms
+ 
+-    cmds = versioneer.get_cmdclass()
++    cmds = {}
+     override_build(cmds)
+     override_build_py(cmds)
+ 
+     setuptools.setup(
+         name="debugpy",
+-        version=versioneer.get_version(),
++        version="@version@",
+         description="An implementation of the Debug Adapter Protocol for Python",  # noqa
+         long_description=long_description,
+         long_description_content_type="text/markdown",
+diff --git a/src/debugpy/public_api.py b/src/debugpy/public_api.py
+index 9d0f705a..ee0b26ca 100644
+--- a/src/debugpy/public_api.py
++++ b/src/debugpy/public_api.py
+@@ -7,8 +7,6 @@ from __future__ import annotations
+ import functools
+ import typing
+ 
+-from debugpy import _version
+-
+ 
+ # Expose debugpy.server API from subpackage, but do not actually import it unless
+ # and until a member is invoked - we don't want the server package loaded in the
+@@ -191,4 +189,4 @@ def trace_this_thread(__should_trace: bool):
+     """
+ 
+ 
+-__version__: str = _version.get_versions()["version"]
++__version__: str = "@version@"
diff --git a/nixpkgs/pkgs/development/python-modules/decli/default.nix b/nixpkgs/pkgs/development/python-modules/decli/default.nix
new file mode 100644
index 000000000000..a1d6e0db2ead
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/decli/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "decli";
+  version = "0.6.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "woile";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-FZYKNKkQExx/YBn5y/W0+0aMlenuwEctYTL7LAXMZGE=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "decli"
+  ];
+
+  meta = with lib; {
+    description = "Minimal, easy to use, declarative command line interface tool";
+    homepage = "https://github.com/Woile/decli";
+    changelog = "https://github.com/woile/decli/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lovesegfault ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/decopatch/default.nix b/nixpkgs/pkgs/development/python-modules/decopatch/default.nix
new file mode 100644
index 000000000000..71e302a8b538
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/decopatch/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, makefun
+, setuptools-scm
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "decopatch";
+  version = "1.4.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lX9JyT9BUBgsI/j7UdE7syE+DxenngnIzKcFdZi1VyA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    makefun
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "pytest-runner" ""
+  '';
+
+  pythonImportsCheck = [
+    "decopatch"
+  ];
+
+  # Tests would introduce multiple cirucular dependencies
+  # Affected: makefun, pytest-cases
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python helper for decorators";
+    homepage = "https://github.com/smarie/python-decopatch";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/decorator/default.nix b/nixpkgs/pkgs/development/python-modules/decorator/default.nix
new file mode 100644
index 000000000000..c86721f9c736
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/decorator/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "decorator";
+  version = "5.1.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Y3mWIRA2tjhe+RQ15PriKYlHL51XH6uoknuoJTrLwzA=";
+  };
+
+  pythonImportsCheck = [
+    "decorator"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "src/tests/test.py"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/micheles/decorator";
+    description = "Better living through Python with decorators";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deemix/default.nix b/nixpkgs/pkgs/development/python-modules/deemix/default.nix
new file mode 100644
index 000000000000..ac0e0a9d469b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deemix/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, spotipy
+, click
+, pycryptodomex
+, mutagen
+, requests
+, deezer-py
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "deemix";
+  version = "3.6.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xEahzA1PIrGPfnnOcuXQLVQpSVOUFk6/0v9ViLgWCwk=";
+  };
+
+  propagatedBuildInputs = [
+    spotipy
+    click
+    pycryptodomex
+    mutagen
+    requests
+    deezer-py
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "deezer"
+  ];
+
+  meta = with lib; {
+    description = "Deezer downloader built from the ashes of Deezloader Remix";
+    homepage = "https://git.freezerapp.xyz/RemixDev/deemix-py";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ natto1784 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deep-chainmap/default.nix b/nixpkgs/pkgs/development/python-modules/deep-chainmap/default.nix
new file mode 100644
index 000000000000..9a9bada8c2a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deep-chainmap/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "deep-chainmap";
+  version = "0.1.1";
+
+  src = fetchPypi {
+    pname = "deep_chainmap";
+    inherit version;
+    hash = "sha256-6K7dyB5iQzzw3lXLcU10SVsiHZ+SAXhz9DSCkYnPQAA=";
+  };
+
+  # Tests are not published to pypi
+  doCheck = false;
+
+  pythonImportsCheck = [ "deep_chainmap" ];
+
+  # See the guide for more information: https://nixos.org/nixpkgs/manual/#chap-meta
+  meta = with lib; {
+    description = "A recursive subclass of ChainMap";
+    homepage = "https://github.com/neutrinoceros/deep-chainmap";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rehno-lindeque ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deep-translator/default.nix b/nixpkgs/pkgs/development/python-modules/deep-translator/default.nix
new file mode 100644
index 000000000000..614affcc3fcb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deep-translator/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, beautifulsoup4
+, requests
+, click
+, pythonOlder
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "deep-translator";
+  version = "1.11.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "deep_translator";
+    inherit version;
+    hash = "sha256-gBJgxpIxE4cH6oiglV5ITbfUDiEMngrg93Ny/9pfS/U=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    requests
+    click
+  ];
+
+  # Initializing it during build won't work as it needs connection with
+  # APIs and the build environment is isolated (#148572 for details).
+  # After built, it works as intended.
+  #pythonImportsCheck = [ "deep_translator" ];
+
+  # Again, initializing an instance needs network connection.
+  # Tests will fail.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python tool to translate between different languages by using multiple translators";
+    homepage = "https://deep-translator.readthedocs.io";
+    changelog = "https://github.com/nidhaloff/deep-translator/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deepdiff/default.nix b/nixpkgs/pkgs/development/python-modules/deepdiff/default.nix
new file mode 100644
index 000000000000..93deb8c10b81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deepdiff/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, click
+, ordered-set
+, orjson
+, clevercsv
+, jsonpickle
+, numpy
+, pytestCheckHook
+, python-dateutil
+, pyyaml
+, toml
+, tomli-w
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "deepdiff";
+  version = "6.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "seperman";
+    repo = "deepdiff";
+    rev = "refs/tags/${version}";
+    hash = "sha256-oO5+ZCDgqonxaHR95tSrPkZDar/fzr1FXtl6J2W3PeU=";
+  };
+
+  postPatch = ''
+    substituteInPlace tests/test_command.py \
+      --replace '/tmp/' "$TMPDIR/"
+  '';
+
+  propagatedBuildInputs = [
+    ordered-set
+    orjson
+  ];
+
+  passthru.optional-dependencies = {
+    cli = [
+      clevercsv
+      click
+      pyyaml
+      toml
+    ];
+  };
+
+  nativeCheckInputs = [
+    jsonpickle
+    numpy
+    pytestCheckHook
+    python-dateutil
+    tomli-w
+  ] ++ passthru.optional-dependencies.cli;
+
+  disabledTests = [
+    # not compatible with pydantic 2.x
+    "test_pydantic1"
+    "test_pydantic2"
+  ];
+
+  pythonImportsCheck = [
+    "deepdiff"
+  ];
+
+  meta = with lib; {
+    description = "Deep Difference and Search of any Python object/data";
+    homepage = "https://github.com/seperman/deepdiff";
+    changelog = "https://github.com/seperman/deepdiff/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deepdish/default.nix b/nixpkgs/pkgs/development/python-modules/deepdish/default.nix
new file mode 100644
index 000000000000..0b04c2cc4418
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deepdish/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, numpy
+, scipy
+, tables
+}:
+
+buildPythonPackage rec {
+  pname = "deepdish";
+  version = "0.3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1wqzwh3y0mjdyba5kfbvlamn561d3afz50zi712c7klkysz3mzva";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    tables
+  ];
+
+  pythonImportsCheck = [
+    "deepdish"
+  ];
+
+  # nativeCheckInputs = [
+  #   pandas
+  # ];
+
+  # The tests are broken: `ModuleNotFoundError: No module named 'deepdish.six.conf'`
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Flexible HDF5 saving/loading and other data science tools from the University of Chicago.";
+    homepage = "https://github.com/uchicago-cs/deepdish";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ndl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deepl/default.nix b/nixpkgs/pkgs/development/python-modules/deepl/default.nix
new file mode 100644
index 000000000000..ab0e1f01ffdc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deepl/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, poetry-core
+, keyring
+}:
+
+buildPythonPackage rec {
+  pname = "deepl";
+  version = "1.16.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-s01KhkTJ5ip6nCSs/oCgdxe9Cjsr53tjOhDV1P50jc0=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    keyring
+  ];
+
+  # Requires internet access and an API key
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "deepl"
+  ];
+
+  meta = with lib; {
+    description = "A language translation API that allows other computer programs to send texts and documents to DeepL's servers and receive high-quality translations";
+    homepage = "https://github.com/DeepLcom/deepl-python";
+    changelog = "https://github.com/DeepLcom/deepl-python/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ MaskedBelgian ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deepmerge/default.nix b/nixpkgs/pkgs/development/python-modules/deepmerge/default.nix
new file mode 100644
index 000000000000..2ef1e6aa5182
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deepmerge/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, setuptools-scm
+, vcver
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "deepmerge";
+  version = "1.1.0";
+  disabled = isPy27;
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-TCeg213iheGnzqx9vBUx3qpVa2J96kkAyCRFgezf6i0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "deepmerge" ];
+
+  meta = with lib; {
+    description = "A toolset to deeply merge python dictionaries.";
+    homepage = "http://deepmerge.readthedocs.io/en/latest/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deeptoolsintervals/default.nix b/nixpkgs/pkgs/development/python-modules/deeptoolsintervals/default.nix
new file mode 100644
index 000000000000..89cebb91ab39
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deeptoolsintervals/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, zlib
+, xz
+}:
+
+buildPythonPackage rec {
+  pname = "deeptoolsintervals";
+  version = "0.1.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1xnl80nblysj6dylj4683wgrfa425rkx4dp5k65hvwdns9pw753x";
+  };
+
+  buildInputs = [ zlib xz ];
+
+  nativeCheckInputs = [ pytest ];
+
+  meta = with lib; {
+    homepage = "https://deeptools.readthedocs.io/en/develop";
+    description = "Helper library for deeptools";
+    license = licenses.mit;
+    maintainers = with maintainers; [ scalavision ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deepwave/default.nix b/nixpkgs/pkgs/development/python-modules/deepwave/default.nix
new file mode 100644
index 000000000000..6f3018aba432
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deepwave/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, torch
+, ninja
+, scipy
+, which
+, pybind11
+, pytest-xdist
+, pytestCheckHook
+}:
+
+let
+  linePatch = ''
+    import os
+    os.environ['PATH'] = os.environ['PATH'] + ':${ninja}/bin'
+  '';
+in
+buildPythonPackage rec {
+  pname = "deepwave";
+  version = "0.0.18";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "ar4";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-DOOy+B12jgwJzQ90qzX50OFxYLPRcVdVYSE5gi3pqDM=";
+  };
+
+  # unable to find ninja although it is available, most likely because it looks for its pip version
+  postPatch = ''
+    substituteInPlace setup.cfg --replace "ninja" ""
+
+    # Adding ninja to the path forcibly
+    mv src/deepwave/__init__.py tmp
+    echo "${linePatch}" > src/deepwave/__init__.py
+    cat tmp >> src/deepwave/__init__.py
+    rm tmp
+  '';
+
+  # The source files are compiled at runtime and cached at the
+  # $HOME/.cache folder, so for the check phase it is needed to
+  # have a temporary home. This is also the reason ninja is not
+  # needed at the nativeBuildInputs, since it will only be used
+  # at runtime.
+  preBuild = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  propagatedBuildInputs = [ torch pybind11 ];
+
+  nativeCheckInputs = [
+    which
+    scipy
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "deepwave" ];
+
+  meta = with lib; {
+    description = "Wave propagation modules for PyTorch";
+    homepage = "https://github.com/ar4/deepwave";
+    license = licenses.mit;
+    platforms = intersectLists platforms.x86_64 platforms.linux;
+    maintainers = with maintainers; [ atila ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deezer-py/default.nix b/nixpkgs/pkgs/development/python-modules/deezer-py/default.nix
new file mode 100644
index 000000000000..f06c9b0d2944
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deezer-py/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "deezer-py";
+  version = "1.3.7";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-saMy+IeAy6H9SgS8XHnZ9klFerGyr+vQqhuCtimgbEo=";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "requests" ];
+
+  meta = with lib; {
+    homepage = "https://gitlab.com/RemixDev/deezer-py";
+    description = "A wrapper for all Deezer's APIs";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ natto1784 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deezer-python/default.nix b/nixpkgs/pkgs/development/python-modules/deezer-python/default.nix
new file mode 100644
index 000000000000..dd9505625af0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deezer-python/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, environs
+, fetchFromGitHub
+, poetry-core
+, pytest-mock
+, pytest-vcr
+, pytestCheckHook
+, pythonOlder
+, requests
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "deezer-python";
+  version = "6.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "browniebroke";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-pzEXiWKMP2Wqme/pqfTMHxWH/4YcCS6u865wslHrUqI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    environs
+    pytest-mock
+    pytest-vcr
+    pytestCheckHook
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    tornado
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=deezer" ""
+  '';
+
+  pythonImportsCheck = [
+    "deezer"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper around the Deezer API";
+    homepage = "https://github.com/browniebroke/deezer-python";
+    changelog = "https://github.com/browniebroke/deezer-python/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ synthetica ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/defcon/default.nix b/nixpkgs/pkgs/development/python-modules/defcon/default.nix
new file mode 100644
index 000000000000..3203f0bb973e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/defcon/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, setuptools-scm
+, fonttools
+, fontpens
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "defcon";
+  version = "0.10.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Vt4m18dfFk7qA+KLwRtMdpxo1wX6GG38rrVsJ/mkzAw=";
+    extension = "zip";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    fonttools
+  ]
+  ++ fonttools.optional-dependencies.ufo
+  ++ fonttools.optional-dependencies.unicode;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "defcon"
+  ];
+
+  passthru.optional-dependencies = {
+    pens = [ fontpens ];
+    lxml = [ fonttools ] ++ fonttools.optional-dependencies.lxml;
+  };
+
+  meta = with lib; {
+    description = "A set of UFO based objects for use in font editing applications";
+    homepage = "https://github.com/robotools/defcon";
+    changelog = "https://github.com/robotools/defcon/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sternenseemann ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deform/default.nix b/nixpkgs/pkgs/development/python-modules/deform/default.nix
new file mode 100644
index 000000000000..3e5ad6939e9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deform/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildPythonPackage, fetchPypi
+, chameleon, colander, iso8601, peppercorn, translationstring, zope-deprecation
+, nose, coverage, beautifulsoup4, flaky, pyramid, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "deform";
+  version = "2.0.15";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1e912937650c1dbb830079dd9c039950762a230223a567740fbf1b23f1090367";
+  };
+
+  propagatedBuildInputs = [
+    chameleon
+    colander
+    iso8601
+    peppercorn
+    translationstring
+    zope-deprecation
+  ];
+
+  nativeCheckInputs = [
+    nose
+    coverage
+    beautifulsoup4
+    flaky
+    pyramid
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Form library with advanced features like nested forms";
+    homepage = "https://docs.pylonsproject.org/projects/deform/en/latest/";
+    license = licenses.free; # http://www.repoze.org/LICENSE.txt
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/defusedcsv/default.nix b/nixpkgs/pkgs/development/python-modules/defusedcsv/default.nix
new file mode 100644
index 000000000000..5e44ce731748
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/defusedcsv/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# tests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "defusedcsv";
+  version =  "2.0.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "raphaelm";
+    repo = "defusedcsv";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-y8qLVfdkxRrDjtrTOLK5Zvi/1Vyv8eOnCueUkaRp4sQ=";
+  };
+
+  pythonImportsCheck = [
+    "defusedcsv.csv"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Python library to protect your users from Excel injections in CSV-format exports, drop-in replacement for standard library's csv module";
+    homepage = "https://github.com/raphaelm/defusedcsv";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/defusedxml/default.nix b/nixpkgs/pkgs/development/python-modules/defusedxml/default.nix
new file mode 100644
index 000000000000..6ac1bab0845e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/defusedxml/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "defusedxml";
+  version = "0.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} tests.py
+  '';
+
+  pythonImportsCheck = [ "defusedxml" ];
+
+  meta = with lib; {
+    description = "Python module to defuse XML issues";
+    homepage = "https://github.com/tiran/defusedxml";
+    license = licenses.psfl;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deid/default.nix b/nixpkgs/pkgs/development/python-modules/deid/default.nix
new file mode 100644
index 000000000000..6927d656a9f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deid/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, matplotlib
+, pydicom
+, python-dateutil
+, setuptools
+}:
+
+let
+  deid-data = buildPythonPackage rec {
+    pname = "deid-data";
+    version = "unstable-2022-12-06";
+    format = "pyproject";
+    disabled = pythonOlder "3.7";
+
+    nativeBuildInputs = [ setuptools ];
+    propagatedBuildInputs = [ pydicom ];
+
+    src = fetchFromGitHub {
+      owner = "pydicom";
+      repo = "deid-data";
+      rev = "5750d25a5048fba429b857c16bf48b0139759644";
+      hash = "sha256-c8NBAN53NyF9dPB7txqYtM0ac0Y+Ch06fMA1LrIUkbc=";
+    };
+
+    meta = {
+      description = "Supplementary data for deid package";
+      homepage = "https://github.com/pydicom/deid-data";
+      license = lib.licenses.mit;
+      maintainers = [ lib.maintainers.bcdarwin ];
+    };
+  };
+in
+buildPythonPackage rec {
+  pname = "deid";
+  version = "0.3.22";
+
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  # Pypi version has no tests
+  src = fetchFromGitHub {
+    owner = "pydicom";
+    repo = pname;
+    # the github repo does not contain Pypi version tags:
+    rev = "40dc96125daeb65856d643e12c3d6dfec756be0d";
+    hash = "sha256-OtxQPF29eqt8I1Q12ga8a1IjBVO+VBk6y0DQmRtCNoU=";
+  };
+
+  propagatedBuildInputs = [
+    matplotlib
+    pydicom
+    python-dateutil
+  ];
+
+  nativeCheckInputs = [
+    deid-data
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "deid"
+  ];
+
+  meta = with lib; {
+    description = "Best-effort anonymization for medical images";
+    homepage = "https://pydicom.github.io/deid";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/delegator-py/default.nix b/nixpkgs/pkgs/development/python-modules/delegator-py/default.nix
new file mode 100644
index 000000000000..89cbd991a663
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/delegator-py/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage
+, lib
+, fetchFromGitHub
+, pexpect
+}:
+
+buildPythonPackage rec {
+  version = "0.1.1";
+  pname = "delegator.py";
+
+  src = fetchFromGitHub {
+    owner = "amitt001";
+    repo = "delegator.py";
+    rev = "v${version}";
+    sha256 = "17n9h3xzjsfxmwclh33vc4yg3c9yzh9hfhaj12kv5ah3fy8rklwb";
+  };
+
+  propagatedBuildInputs = [ pexpect ];
+
+  # no tests in github or pypi
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Subprocesses for Humans 2.0";
+    homepage = "https://github.com/amitt001/delegator.py";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/delorean/default.nix b/nixpkgs/pkgs/development/python-modules/delorean/default.nix
new file mode 100644
index 000000000000..8573dc7095f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/delorean/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, babel
+, humanize
+, python-dateutil
+, pytz
+, tzlocal
+}:
+
+buildPythonPackage rec {
+  pname = "Delorean";
+  version = "1.0.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/md4bhIzhSOEi+xViKZYxNQl4S1T61HP74cL7I9XYTQ=";
+  };
+
+  propagatedBuildInputs = [
+    babel
+    humanize
+    python-dateutil
+    pytz
+    tzlocal
+  ];
+
+  pythonImportsCheck = [
+    "delorean"
+  ];
+
+  # test data not included
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Delorean: Time Travel Made Easy";
+    homepage = "https://github.com/myusuf3/delorean";
+    license = licenses.mit;
+    maintainers = with maintainers; [ globin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deltachat/default.nix b/nixpkgs/pkgs/development/python-modules/deltachat/default.nix
new file mode 100644
index 000000000000..034be82d7e39
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deltachat/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, pkg-config
+, pkgconfig
+, setuptools-scm
+, wheel
+, libdeltachat
+, cffi
+, imap-tools
+, requests
+, pluggy
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "deltachat";
+  inherit (libdeltachat) version src;
+  sourceRoot = "${src.name}/python";
+
+  disabled = pythonOlder "3.7";
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    cffi
+    pkg-config
+    pkgconfig
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  buildInputs = [
+    libdeltachat
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+    imap-tools
+    pluggy
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "deltachat"
+    "deltachat.account"
+    "deltachat.contact"
+    "deltachat.chat"
+    "deltachat.message"
+  ];
+
+  meta = libdeltachat.meta // {
+    description = "Python bindings for the Delta Chat Core library";
+    homepage = "https://github.com/deltachat/deltachat-core-rust/tree/master/python";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deluge-client/default.nix b/nixpkgs/pkgs/development/python-modules/deluge-client/default.nix
new file mode 100644
index 000000000000..4426fe65bf5e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deluge-client/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "deluge-client";
+  version = "1.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0d2f12108a147d44590c8df63997fcb32f8b2fbc18f8cbb221f0136e2e372b85";
+  };
+
+  # it will try to connect to a running instance
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Lightweight pure-python rpc client for deluge";
+    homepage = "https://github.com/JohnDoee/deluge-client";
+    license = licenses.mit;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/demes/default.nix b/nixpkgs/pkgs/development/python-modules/demes/default.nix
new file mode 100644
index 000000000000..986bb7f9ac9f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/demes/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, ruamel-yaml
+, attrs
+, pythonOlder
+, pytestCheckHook
+, pytest-xdist
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "demes";
+  version = "0.2.3";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-nmE7ZbR126J3vKdR3h83qJ/V602Fa6J3M6IJnIqCNhc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    ruamel-yaml
+    attrs
+  ];
+
+  postPatch = ''
+    # remove coverage arguments to pytest
+    sed -i '/--cov/d' setup.cfg
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-xdist
+    numpy
+  ];
+
+  disabledTestPaths = [
+    "tests/test_spec.py"
+  ];
+
+  pythonImportsCheck = [
+    "demes"
+  ];
+
+  meta = with lib; {
+    description = "Tools for describing and manipulating demographic models";
+    homepage = "https://github.com/popsim-consortium/demes-python";
+    license = licenses.isc;
+    maintainers = with maintainers; [ alxsimon ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/demesdraw/default.nix b/nixpkgs/pkgs/development/python-modules/demesdraw/default.nix
new file mode 100644
index 000000000000..42e9fdc4c5f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/demesdraw/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, demes
+, matplotlib
+, numpy
+, scipy
+, pythonOlder
+, pytestCheckHook
+, pytest-xdist
+, mpmath
+}:
+
+buildPythonPackage rec {
+  pname = "demesdraw";
+  version = "0.4.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-n7dz+kYf2yyr66TBx452W6z4qT6bT81u0J4aMAYuGCc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    demes
+    matplotlib
+    numpy
+    scipy
+  ];
+
+  postPatch = ''
+    # remove coverage arguments to pytest
+    sed -i '/--cov/d' setup.cfg
+  '';
+
+  # This variable is needed to suppress the "Trace/BPT trap: 5" error in Darwin's checkPhase.
+  # Not sure of the details, but we can avoid it by changing the matplotlib backend during testing.
+  env.MPLBACKEND = lib.optionalString stdenv.isDarwin "Agg";
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-xdist
+    mpmath
+  ];
+
+  pythonImportsCheck = [
+    "demesdraw"
+  ];
+
+  meta = with lib; {
+    description = "Drawing functions for Demes demographic models";
+    homepage = "https://github.com/grahamgower/demesdraw";
+    license = licenses.isc;
+    maintainers = with maintainers; [ alxsimon ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/demetriek/default.nix b/nixpkgs/pkgs/development/python-modules/demetriek/default.nix
new file mode 100644
index 000000000000..b553a1b0837a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/demetriek/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, aiohttp
+, awesomeversion
+, backoff
+, buildPythonPackage
+, pydantic
+, fetchFromGitHub
+, poetry-core
+, yarl
+, aresponses
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "demetriek";
+  version = "0.4.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-demetriek";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-LCHHBcZgO9gw5jyaJiiS4lKyb0ut+PJvKTylIvIKHhc=";
+  };
+
+  postPatch = ''
+    # Upstream doesn't set a version for the pyproject.toml
+    substituteInPlace pyproject.toml \
+      --replace "0.0.0" "${version}" \
+      --replace "--cov" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    awesomeversion
+    backoff
+    pydantic
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "demetriek"
+  ];
+
+  meta = with lib; {
+    description = "Python client for LaMetric TIME devices";
+    homepage = "https://github.com/frenck/python-demetriek";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/demjson3/default.nix b/nixpkgs/pkgs/development/python-modules/demjson3/default.nix
new file mode 100644
index 000000000000..50668ec38834
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/demjson3/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "demjson3";
+  version = "3.0.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-N8g7DG6wjSXe/IjfCipIddWKeAmpZQvW7uev2AU826w=";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} test/test_demjson3.py
+  '';
+
+  pythonImportsCheck = [
+    "demjson3"
+  ];
+
+  meta = with lib; {
+    description = "Encoder/decoder and lint/validator for JSON (JavaScript Object Notation)";
+    homepage = "https://github.com/nielstron/demjson3/";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dendropy/default.nix b/nixpkgs/pkgs/development/python-modules/dendropy/default.nix
new file mode 100644
index 000000000000..d37d188a257a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dendropy/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dendropy";
+  version = "4.5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jeetsukumaran";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-FP0+fJkkFtSysPxoHXjyMgF8pPin7aRyzmHe9bH8LlM=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # FileNotFoundError: [Errno 2] No such file or directory: 'paup'
+    "test_basic_split_count_with_incorrect_rootings_raises_error"
+    "test_basic_split_count_with_incorrect_weight_treatment_raises_error"
+    "test_basic_split_counting_under_different_rootings"
+    "test_group1"
+    # AssertionError: 6 != 5
+    "test_by_num_lineages"
+    # AttributeError: module 'collections' has no attribute 'Iterable'
+    "test_findall_multiple"
+  ];
+
+  pythonImportsCheck = [
+    "dendropy"
+  ];
+
+  meta = with lib; {
+    description = "Python library for phylogenetic computing";
+    homepage = "https://dendropy.org/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ unode ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/denonavr/default.nix b/nixpkgs/pkgs/development/python-modules/denonavr/default.nix
new file mode 100644
index 000000000000..acfa4dc0eb5c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/denonavr/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, async-timeout
+, asyncstdlib
+, attrs
+, buildPythonPackage
+, defusedxml
+, fetchFromGitHub
+, httpx
+, netifaces
+, pytest-asyncio
+, pytestCheckHook
+, pytest-httpx
+, pytest-timeout
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "denonavr";
+  version = "0.11.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ol-iver";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-0+BjakGGnCbmiSHSipRifPkasfP1vvAWGvzyRufpsOk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    asyncstdlib
+    attrs
+    defusedxml
+    httpx
+    netifaces
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    async-timeout
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    pytest-httpx
+    pytest-timeout
+  ];
+
+  pythonImportsCheck = [
+    "denonavr"
+  ];
+
+  meta = with lib; {
+    description = "Automation Library for Denon AVR receivers";
+    homepage = "https://github.com/ol-iver/denonavr";
+    changelog = "https://github.com/ol-iver/denonavr/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ colemickens ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dependency-injector/default.nix b/nixpkgs/pkgs/development/python-modules/dependency-injector/default.nix
new file mode 100644
index 000000000000..ff00a9fd200a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dependency-injector/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fastapi
+, fetchFromGitHub
+, flask
+, httpx
+, mypy-boto3-s3
+, numpy
+, pydantic
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, scipy
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "dependency-injector";
+  version = "4.41.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ets-labs";
+    repo = "python-dependency-injector";
+    rev = version;
+    hash = "sha256-U3U/L8UuYrfpm4KwVNmViTbam7QdZd2vp1p+ENtOJlw=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  passthru.optional-dependencies = {
+    aiohttp = [
+      aiohttp
+    ];
+    pydantic = [
+      pydantic
+    ];
+    flask = [
+      flask
+    ];
+    yaml = [
+      pyyaml
+    ];
+  };
+
+  nativeCheckInputs = [
+    fastapi
+    httpx
+    mypy-boto3-s3
+    numpy
+    pytest-asyncio
+    pytestCheckHook
+    scipy
+  ] ++ passthru.optional-dependencies.aiohttp
+  ++ passthru.optional-dependencies.pydantic
+  ++ passthru.optional-dependencies.yaml
+  ++ passthru.optional-dependencies.flask;
+
+  pythonImportsCheck = [
+    "dependency_injector"
+  ];
+
+  disabledTestPaths = [
+    # Exclude tests for EOL Python releases
+    "tests/unit/ext/test_aiohttp_py35.py"
+    "tests/unit/wiring/test_*_py36.py"
+  ];
+
+  meta = with lib; {
+    description = "Dependency injection microframework for Python";
+    homepage = "https://github.com/ets-labs/python-dependency-injector";
+    changelog = "https://github.com/ets-labs/python-dependency-injector/blob/${version}/docs/main/changelog.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ gerschtli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deploykit/default.nix b/nixpkgs/pkgs/development/python-modules/deploykit/default.nix
new file mode 100644
index 000000000000..9668ec25c359
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deploykit/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, bash
+, openssh
+, pytestCheckHook
+, pythonOlder
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "deploykit";
+  version = "1.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "numtide";
+    repo = pname;
+    rev = version;
+    hash = "sha256-7PiXq1bQJ1jswLHNqCDSYZabgfp8HRuRt5YPGzd5Ej0=";
+  };
+
+  buildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    bash
+    openssh
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [ "test_ssh" ];
+
+  # don't swallow stdout/stderr
+  pytestFlagsArray = [ "-s" ];
+
+  pythonImportsCheck = [
+    "deploykit"
+  ];
+
+  meta = with lib; {
+    description = "Execute commands remote via ssh and locally in parallel with python";
+    homepage = "https://github.com/numtide/deploykit";
+    changelog = "https://github.com/numtide/deploykit/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mic92 zowoq ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deprecat/default.nix b/nixpkgs/pkgs/development/python-modules/deprecat/default.nix
new file mode 100644
index 000000000000..da81c63cca86
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deprecat/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, wrapt
+}:
+
+buildPythonPackage rec {
+  pname = "deprecat";
+  version = "2.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mjhajharia";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-3Xl/IC+ImFUxxLry15MIIVRf6aR+gA9K5S2IQomkv+o=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    wrapt
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "deprecat"
+  ];
+
+  meta = with lib; {
+    description = "Decorator to deprecate old python classes, functions or methods";
+    homepage = "https://github.com/mjhajharia/deprecat";
+    changelog = "https://github.com/mjhajharia/deprecat/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deprecated/default.nix b/nixpkgs/pkgs/development/python-modules/deprecated/default.nix
new file mode 100644
index 000000000000..ed2cf8a01171
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deprecated/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, wrapt
+, pytestCheckHook
+, sphinxHook
+}:
+
+buildPythonPackage rec {
+  pname = "deprecated";
+  version = "1.2.14";
+  outputs = [ "out" "doc" ];
+
+  src = fetchFromGitHub {
+    owner = "tantale";
+    repo = "deprecated";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-H5Gp2F/ChMeEH4fSYXIB34syDIzDymfN949ksJnS0k4=";
+  };
+
+  nativeBuildInputs = [
+    sphinxHook
+  ];
+
+  propagatedBuildInputs = [
+    wrapt
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "deprecated" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/tantale/deprecated";
+    description = "Python @deprecated decorator to deprecate old python classes, functions or methods";
+    license = licenses.mit;
+    maintainers = with maintainers; [ tilpner ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/deprecation/default.nix b/nixpkgs/pkgs/development/python-modules/deprecation/default.nix
new file mode 100644
index 000000000000..9ea6e5c2c6dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/deprecation/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, packaging
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "deprecation";
+  version = "2.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1zqqjlgmhgkpzg9ss5ki8wamxl83xn51fs6gn2a8cxsx9vkbvcvj";
+  };
+
+  patches = [
+    # fixes for python 3.10 test suite
+    (fetchpatch {
+      url = "https://github.com/briancurtin/deprecation/pull/57/commits/e13e23068cb8d653a02a434a159e8b0b7226ffd6.patch";
+      hash = "sha256-/5zr2V1s5ULUZnbLXsgyHxZH4m7/a27QYuqQt2Savc8=";
+      includes = [ "tests/test_deprecation.py" ];
+    })
+  ];
+
+  propagatedBuildInputs = [ packaging ];
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  meta = with lib; {
+    description = "A library to handle automated deprecations";
+    homepage = "https://deprecation.readthedocs.io/";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/derpconf/default.nix b/nixpkgs/pkgs/development/python-modules/derpconf/default.nix
new file mode 100644
index 000000000000..b3a4dd9d35d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/derpconf/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "derpconf";
+  version = "0.8.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-66MOqcWIiqJrORJDgAH5iUblHyqJvuf9DIBN56XjKwU=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  pythonImportsCheck = [
+    "derpconf"
+  ];
+
+  meta = with lib; {
+    description = "Module to abstract loading configuration files for your app";
+    homepage = "https://github.com/globocom/derpconf";
+    changelog = "https://github.com/globocom/derpconf/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/desktop-entry-lib/default.nix b/nixpkgs/pkgs/development/python-modules/desktop-entry-lib/default.nix
new file mode 100644
index 000000000000..5a6d3c00e7f0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/desktop-entry-lib/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, pytestCheckHook
+, fetchFromGitea
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "desktop-entry-lib";
+  version = "3.1";
+  pyproject = true;
+  disabled = pythonOlder "3.9";
+
+  # We could use fetchPypi, but then the tests won't run
+  src = fetchFromGitea {
+    domain = "codeberg.org";
+    owner = "JakobDev";
+    repo = pname;
+    rev = version;
+    hash = "sha256-+c+FuLv88wc4yVw3iyFFtfbocnWzTCIe2DS0SWoj+VI=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+  nativeCheckInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [ "desktop_entry_lib" ];
+
+  meta = with lib; {
+    description = "Allows reading and writing .desktop files according to the Desktop Entry Specification";
+    homepage = "https://codeberg.org/JakobDev/desktop-entry-lib";
+    changelog = "https://codeberg.org/JakobDev/desktop-entry-lib/releases/tag/${version}";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ Madouura ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/desktop-notifier/default.nix b/nixpkgs/pkgs/development/python-modules/desktop-notifier/default.nix
new file mode 100644
index 000000000000..b56a6b0849d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/desktop-notifier/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, stdenv
+, packaging
+, setuptools
+, dbus-next
+}:
+
+buildPythonPackage rec {
+  pname = "desktop-notifier";
+  version = "3.5.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "SamSchott";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-txUWRCWLQ6jWrdEJ/D5+CsflNad5Onr/wLycENri1z8=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+  ] ++ lib.optionals stdenv.isLinux [
+    dbus-next
+  ];
+
+  # no tests available, do the imports check instead
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "desktop_notifier"
+  ];
+
+  meta = with lib; {
+    description = "Python library for cross-platform desktop notifications";
+    homepage = "https://github.com/samschott/desktop-notifier";
+    changelog = "https://github.com/samschott/desktop-notifier/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sfrijters ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/detect-secrets/default.nix b/nixpkgs/pkgs/development/python-modules/detect-secrets/default.nix
new file mode 100644
index 000000000000..d14b3d523b6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/detect-secrets/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, gibberish-detector
+, mock
+, pkgs
+, pyahocorasick
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, requests
+, responses
+, unidiff
+}:
+
+buildPythonPackage rec {
+  pname = "detect-secrets";
+  version = "1.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Yelp";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-6EmL6XPySqcA3EA+FFkfw7Dkxl5LvyBorIw0hesV5eU=";
+    leaveDotGit = true;
+  };
+
+  propagatedBuildInputs = [
+    gibberish-detector
+    pyyaml
+    pyahocorasick
+    requests
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+    responses
+    unidiff
+    pkgs.gitMinimal
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  disabledTests = [
+    # Tests are failing for various reasons. Needs to be adjusted with the next update
+    "test_basic"
+    "test_handles_each_path_separately"
+    "test_handles_multiple_directories"
+    "test_load_and_output"
+    "test_make_decisions"
+    "test_restores_line_numbers"
+    "test_saves_to_baseline"
+    "test_scan_all_files"
+    "test_start_halfway"
+  ];
+
+  pythonImportsCheck = [
+    "detect_secrets"
+  ];
+
+  meta = with lib; {
+    description = "An enterprise friendly way of detecting and preventing secrets in code";
+    homepage = "https://github.com/Yelp/detect-secrets";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/detectron2/default.nix b/nixpkgs/pkgs/development/python-modules/detectron2/default.nix
new file mode 100644
index 000000000000..badf5bb08771
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/detectron2/default.nix
@@ -0,0 +1,182 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonRelaxDepsHook
+, ninja
+, which
+# build inputs
+, pillow
+, matplotlib
+, pycocotools
+, termcolor
+, yacs
+, tabulate
+, cloudpickle
+, tqdm
+, tensorboard
+, fvcore
+, iopath
+, omegaconf
+, hydra-core
+, packaging
+, torch
+, pydot
+, black
+# optional dependencies
+, fairscale
+, timm
+, scipy
+, shapely
+, pygments
+, psutil
+# check inputs
+, pytestCheckHook
+, torchvision
+, av
+, opencv4
+, pytest-mock
+, pybind11
+}:
+
+let
+  pname = "detectron2";
+  version = "0.6";
+  optional-dependencies = {
+    all = [
+      fairscale
+      timm
+      scipy
+      shapely
+      pygments
+      psutil
+    ];
+  };
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "facebookresearch";
+    repo = "detectron2";
+    rev = "refs/tags/v${version}";
+    sha256 = "1w6cgvc8r2lwr72yxicls650jr46nriv1csivp2va9k1km8jx2sf";
+  };
+
+  postPatch = ''
+    # https://github.com/facebookresearch/detectron2/issues/5010
+    substituteInPlace detectron2/data/transforms/transform.py \
+      --replace "interp=Image.LINEAR" "interp=Image.BILINEAR"
+  '';
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    ninja
+    which
+  ];
+
+  buildInputs = [ pybind11 ];
+
+  pythonRelaxDeps = [
+    "black"
+  ];
+
+  propagatedBuildInputs = [
+    pillow
+    matplotlib
+    pycocotools
+    termcolor
+    yacs
+    tabulate
+    cloudpickle
+    tqdm
+    tensorboard
+    fvcore
+    iopath
+    omegaconf
+    hydra-core
+    packaging
+    black
+    torch # not explicitly declared in setup.py because they expect you to install it yourself
+    pydot # no idea why this is not in their setup.py
+  ];
+
+  passthru.optional-dependencies = optional-dependencies;
+
+  nativeCheckInputs = [
+    av
+    opencv4
+    pytest-mock
+    pytestCheckHook
+    torchvision
+  ];
+
+  preCheck = ''
+    # prevent import errors for C extension modules
+    rm -r detectron2
+  '';
+
+  pytestFlagsArray = [
+    # prevent include $sourceRoot/projects/*/tests
+    "tests"
+  ];
+
+  disabledTestPaths = [
+    # try import caffe2
+    "tests/test_export_torchscript.py"
+    "tests/test_model_analysis.py"
+    "tests/modeling/test_backbone.py"
+    "tests/modeling/test_roi_heads.py"
+    "tests/modeling/test_rpn.py"
+    "tests/structures/test_instances.py"
+    # hangs for some reason
+    "tests/modeling/test_model_e2e.py"
+    # KeyError: 'precision'
+    "tests/data/test_coco_evaluation.py"
+  ];
+
+  disabledTests = [
+    # fails for some reason
+    "test_checkpoint_resume"
+    "test_map_style"
+    # requires shapely
+    "test_resize_and_crop"
+    # require caffe2
+    "test_predict_boxes_tracing"
+    "test_predict_probs_tracing"
+    "testMaskRCNN"
+    "testRetinaNet"
+    # require coco dataset
+    "test_default_trainer"
+    "test_unknown_category"
+    "test_build_dataloader_train"
+    "test_build_iterable_dataloader_train"
+    # require network access
+    "test_opencv_exif_orientation"
+    "test_read_exif_orientation"
+    # use deprecated api, numpy.bool
+    "test_BWmode_nomask"
+    "test_draw_binary_mask"
+    "test_draw_empty_mask_predictions"
+    "test_draw_instance_predictions"
+    "test_draw_no_metadata"
+    "test_overlay_instances"
+    "test_overlay_instances_no_boxes"
+    "test_get_bounding_box"
+  ] ++ lib.optionals (stdenv.isLinux && stdenv.isAarch64) [
+    "test_build_batch_dataloader_inference"
+    "test_build_dataloader_inference"
+    "test_build_iterable_dataloader_inference"
+    "test_to_iterable"
+  ];
+
+  pythonImportsCheck = [ "detectron2" ];
+
+  meta = with lib; {
+    description = "Facebooks's next-generation platform for object detection, segmentation and other visual recognition tasks";
+    homepage = "https://github.com/facebookresearch/detectron2";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/devito/default.nix b/nixpkgs/pkgs/development/python-modules/devito/default.nix
new file mode 100644
index 000000000000..064899b8e78e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/devito/default.nix
@@ -0,0 +1,125 @@
+{ lib
+, stdenv
+, anytree
+, buildPythonPackage
+, cached-property
+, cgen
+, click
+, codepy
+, distributed
+, fetchFromGitHub
+, gcc
+, llvmPackages
+, matplotlib
+, multidict
+, nbval
+, psutil
+, py-cpuinfo
+, pyrevolve
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, scipy
+, sympy
+}:
+
+buildPythonPackage rec {
+  pname = "devito";
+  version = "4.8.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "devitocodes";
+    repo = "devito";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-g9rRJF1JrZ6+s3tj4RZHuGOjt5LJjtK9I5CJmq4CJL4=";
+  };
+
+  pythonRemoveDeps = [
+    "codecov"
+    "flake8"
+    "pytest-runner"
+    "pytest-cov"
+  ];
+
+  pythonRelaxDeps = true;
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    anytree
+    cached-property
+    cgen
+    click
+    codepy
+    distributed
+    nbval
+    multidict
+    psutil
+    py-cpuinfo
+    pyrevolve
+    scipy
+    sympy
+  ] ++ lib.optionals stdenv.cc.isClang [
+    llvmPackages.openmp
+  ];
+
+  nativeCheckInputs = [
+    gcc
+    matplotlib
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [ "-x" ];
+
+  # I've had to disable the following tests since they fail while using nix-build, but they do pass
+  # outside the build. They mostly related to the usage of MPI in a sandboxed environment.
+  disabledTests = [
+    "test_assign_parallel"
+    "test_cache_blocking_structure_distributed"
+    "test_codegen_quality0"
+    "test_coefficients_w_xreplace"
+    "test_docstrings"
+    "test_docstrings[finite_differences.coefficients]"
+    "test_gs_parallel"
+    "test_if_halo_mpi"
+    "test_if_parallel"
+    "test_init_omp_env_w_mpi"
+    "test_loop_bounds_forward"
+    "test_mpi_nocomms"
+    "test_mpi"
+    "test_index_derivative"
+    "test_new_distributor"
+    "test_setupWOverQ"
+    "test_shortcuts"
+    "test_subdomainset_mpi"
+  ];
+
+  disabledTestPaths = [
+    "tests/test_pickle.py"
+    "tests/test_benchmark.py"
+    "tests/test_mpi.py"
+    "tests/test_autotuner.py"
+    "tests/test_data.py"
+    "tests/test_dse.py"
+    "tests/test_gradient.py"
+  ];
+
+  pythonImportsCheck = [
+    "devito"
+  ];
+
+  meta = with lib; {
+    description = "Code generation framework for automated finite difference computation";
+    homepage = "https://www.devitoproject.org/";
+    changelog = "https://github.com/devitocodes/devito/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ atila ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/devolo-home-control-api/default.nix b/nixpkgs/pkgs/development/python-modules/devolo-home-control-api/default.nix
new file mode 100644
index 000000000000..2782789e957a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/devolo-home-control-api/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, requests
+, setuptools-scm
+, websocket-client
+, zeroconf
+}:
+
+buildPythonPackage rec {
+  pname = "devolo-home-control-api";
+  version = "0.18.3";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "2Fake";
+    repo = "devolo_home_control_api";
+    rev = "v${version}";
+    hash = "sha256-4AyC1DDYtKl8SwJf75BbzoOAhbZXmBZ05ma9YmLzksM=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    zeroconf
+    websocket-client
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+  ];
+
+  # Disable test that requires network access
+  disabledTests = [
+    "test__on_pong"
+    "TestMprm"
+  ];
+
+  pythonImportsCheck = [ "devolo_home_control_api" ];
+
+  meta = with lib; {
+    description = "Python library to work with devolo Home Control";
+    homepage = "https://github.com/2Fake/devolo_home_control_api";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/devolo-plc-api/default.nix b/nixpkgs/pkgs/development/python-modules/devolo-plc-api/default.nix
new file mode 100644
index 000000000000..5fac8fd6aa0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/devolo-plc-api/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, protobuf
+, pytest-asyncio
+, pytest-httpx
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, segno
+, setuptools-scm
+, syrupy
+, zeroconf
+}:
+
+buildPythonPackage rec {
+  pname = "devolo-plc-api";
+  version = "1.4.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "2Fake";
+    repo = "devolo_plc_api";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-EP99AswHmLO+8ZQAPjJyw/P9QqfDawy3AqyJR870Qms=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "protobuf>=4.22.0" "protobuf"
+  '';
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+    protobuf
+    segno
+    zeroconf
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-httpx
+    pytest-mock
+    pytestCheckHook
+    syrupy
+  ];
+
+  pythonImportsCheck = [
+    "devolo_plc_api"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with Devolo PLC devices";
+    homepage = "https://github.com/2Fake/devolo_plc_api";
+    changelog = "https://github.com/2Fake/devolo_plc_api/releases/tag/v${version}";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/devpi-common/default.nix b/nixpkgs/pkgs/development/python-modules/devpi-common/default.nix
new file mode 100644
index 000000000000..d726dbe9831d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/devpi-common/default.nix
@@ -0,0 +1,47 @@
+{ lib, buildPythonPackage, fetchPypi
+, pythonOlder
+, setuptools
+, setuptools-changelog-shortener
+, requests
+, pytestCheckHook
+, lazy
+}:
+
+buildPythonPackage rec {
+  pname = "devpi-common";
+  version = "4.0.3";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+OAbT23wgPYihMzljFuxzh6GmwwjSqx60TVgl0X8Fz0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-changelog-shortener
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    lazy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "devpi_common"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/devpi/devpi";
+    description = "Utilities jointly used by devpi-server and devpi-client";
+    changelog = "https://github.com/devpi/devpi/blob/common-${version}/common/CHANGELOG";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lewo makefu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/devtools/default.nix b/nixpkgs/pkgs/development/python-modules/devtools/default.nix
new file mode 100644
index 000000000000..08a5f2e7f50c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/devtools/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, asttokens
+, buildPythonPackage
+, executing
+, hatchling
+, fetchFromGitHub
+, pygments
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "devtools";
+  version = "0.12.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "samuelcolvin";
+    repo = "python-${pname}";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-1HFbNswdKa/9cQX0Gf6lLW1V5Kt/N4X6/5kQDdzp1Wo=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    asttokens
+    executing
+    pygments
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+  ];
+
+  pytestFlagsArray = [
+    # pytest.PytestRemovedIn8Warning: Passing None has been deprecated.
+    "-W ignore::pytest.PytestRemovedIn8Warning"
+  ];
+
+  disabledTests = [
+    # Test for Windows32
+    "test_print_subprocess"
+    # Sensitive to timing
+    "test_multiple_not_verbose"
+    # Sensitive to interpreter output
+    "test_simple"
+  ];
+
+  disabledTestPaths = [
+    # pytester_pretty is not available in Nixpkgs
+    "tests/test_insert_assert.py"
+  ];
+
+  pythonImportsCheck = [
+    "devtools"
+  ];
+
+  meta = with lib; {
+    description = "Python's missing debug print command and other development tools";
+    homepage = "https://python-devtools.helpmanual.io/";
+    changelog = "https://github.com/samuelcolvin/python-devtools/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jdahm ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/diagrams/build_poetry.patch b/nixpkgs/pkgs/development/python-modules/diagrams/build_poetry.patch
new file mode 100644
index 000000000000..b2e3d39dae11
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/diagrams/build_poetry.patch
@@ -0,0 +1,12 @@
+diff --git a/pyproject.toml b/pyproject.toml
+index 2c93a39..6c800e2 100644
+--- a/pyproject.toml
++++ b/pyproject.toml
+@@ -24,3 +24,7 @@ isort = "^4.3"
+ 
+ [tool.black]
+ line-length = 120
++
++[build-system]
++requires = ["poetry_core>=1.0.0"]
++build-backend = "poetry.core.masonry.api"
diff --git a/nixpkgs/pkgs/development/python-modules/diagrams/default.nix b/nixpkgs/pkgs/development/python-modules/diagrams/default.nix
new file mode 100644
index 000000000000..963161e7c77e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/diagrams/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, jinja2
+, poetry-core
+, round
+, graphviz
+, inkscape
+, imagemagick
+, pytestCheckHook
+, typed-ast
+}:
+
+buildPythonPackage rec {
+  pname = "diagrams";
+  version = "0.23.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mingrammer";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-2jRWN2glGEr51fzny8nkqa5c2EdJG5aZPG2eTD7AISY=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'graphviz = ">=0.13.2,<0.20.0"' 'graphviz = "*"'
+  '';
+
+  preConfigure = ''
+    patchShebangs autogen.sh
+    ./autogen.sh
+  '';
+
+  patches = [
+    # The build-system section is missing
+    ./build_poetry.patch
+    ./remove-black-requirement.patch
+  ];
+
+  # Despite living in 'tool.poetry.dependencies',
+  # these are only used at build time to process the image resource files
+  nativeBuildInputs = [
+    inkscape imagemagick
+    jinja2
+    poetry-core
+    round
+  ];
+
+  propagatedBuildInputs = [
+    graphviz
+    typed-ast
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "diagrams"
+  ];
+
+  meta = with lib; {
+    description = "Diagram as Code";
+    homepage = "https://diagrams.mingrammer.com/";
+    changelog = "https://github.com/mingrammer/diagrams/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ addict3d ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/diagrams/remove-black-requirement.patch b/nixpkgs/pkgs/development/python-modules/diagrams/remove-black-requirement.patch
new file mode 100644
index 000000000000..d6c9b4227091
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/diagrams/remove-black-requirement.patch
@@ -0,0 +1,33 @@
+From bf081e60a7f604d2e71cf5c315dd90c48dd96808 Mon Sep 17 00:00:00 2001
+From: Fabian Affolter <mail@fabian-affolter.ch>
+Date: Thu, 26 Jan 2023 15:35:47 +0100
+Subject: [PATCH] Update autogen.sh
+
+---
+ autogen.sh | 9 ---------
+ 1 file changed, 9 deletions(-)
+
+diff --git a/autogen.sh b/autogen.sh
+index f5e065b35..b6cef5bf9 100755
+--- a/autogen.sh
++++ b/autogen.sh
+@@ -37,11 +37,6 @@ if ! [ -x "$(command -v convert)" ]; then
+   exit 1
+ fi
+ 
+-if ! [ -x "$(command -v black)" ]; then
+-  echo 'black is not installed'
+-  exit 1
+-fi
+-
+ # preprocess the resources
+ for pvd in "${providers[@]}"; do
+   # convert the svg to png for azure provider
+@@ -75,7 +70,3 @@ python -m scripts.generate "custom"
+ # copy icons across to website
+ echo "copying icons to website static folder"
+ cp -r resources website/static/img/
+-
+-# run black
+-echo "linting the all the diagram modules"
+-black "$app_root_dir"/**/*.py
diff --git a/nixpkgs/pkgs/development/python-modules/diceware/default.nix b/nixpkgs/pkgs/development/python-modules/diceware/default.nix
new file mode 100644
index 000000000000..ed6c77c6abc6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/diceware/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "diceware";
+  version = "0.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-srTMm1n1aNLvUb/fn34a+UHSX7j1wl8XAZHburzpZWk=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest_runner'," ""
+  '';
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    # see https://github.com/ulif/diceware/commit/a7d844df76cd4b95a717f21ef5aa6167477b6733
+    "-m 'not packaging'"
+  ];
+
+  pythonImportsCheck = [
+    "diceware"
+  ];
+
+  meta = with lib; {
+    description = "Generates passphrases by concatenating words randomly picked from wordlists";
+    homepage = "https://github.com/ulif/diceware";
+    changelog = "https://github.com/ulif/diceware/blob/v${version}/CHANGES.rst";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ asymmetric ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dicom-numpy/default.nix b/nixpkgs/pkgs/development/python-modules/dicom-numpy/default.nix
new file mode 100644
index 000000000000..84ec407606b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dicom-numpy/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, numpy
+, pydicom
+}:
+
+buildPythonPackage rec {
+  pname = "dicom-numpy";
+  version = "0.6.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "innolitics";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-pgmREQlstr0GY2ThIWt4hbcSWmaNWgkr2gO4PSgGHqE=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    pydicom
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dicom_numpy"
+  ];
+
+  meta = with lib; {
+    description = "Read DICOM files into Numpy arrays";
+    homepage = "https://github.com/innolitics/dicom-numpy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dicom2nifti/default.nix b/nixpkgs/pkgs/development/python-modules/dicom2nifti/default.nix
new file mode 100644
index 000000000000..dd683b4d1bfd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dicom2nifti/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, gdcm
+, nibabel
+, numpy
+, pydicom
+, scipy
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "dicom2nifti";
+  version = "2.4.8";
+  disabled = pythonOlder "3.6";
+
+  # no tests in PyPI dist
+  src = fetchFromGitHub {
+    owner = "icometrix";
+    repo = pname;
+    rev = version;
+    hash = "sha256-2Pspxdeu3pHwXpbjS6bQQnvdeMuITRwYarPuLlmNcv8";
+  };
+
+  propagatedBuildInputs = [ gdcm nibabel numpy pydicom scipy setuptools ];
+
+  # python-gdcm just builds the python interface provided by the "gdcm" package, so
+  # we should be able to replace "python-gdcm" with "gdcm" but this doesn't work
+  # (similar to https://github.com/NixOS/nixpkgs/issues/84774)
+  postPatch = ''
+    substituteInPlace setup.py --replace "python-gdcm" ""
+    substituteInPlace tests/test_generic.py --replace "from common" "from dicom2nifti.common"
+  '';
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "dicom2nifti" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/icometrix/dicom2nifti";
+    description = "Library for converting dicom files to nifti";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dicomweb-client/default.nix b/nixpkgs/pkgs/development/python-modules/dicomweb-client/default.nix
new file mode 100644
index 000000000000..1a4f528ec11e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dicomweb-client/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, pytest-localserver
+, numpy
+, pillow
+, pydicom
+, requests
+, retrying
+}:
+
+buildPythonPackage rec {
+  pname = "dicomweb-client";
+  version = "0.59.1";
+  disabled = pythonOlder "3.6";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "ImagingDataCommons";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-h9gFCBmutTGNJ3wP2AGPfiUtA49yywUlNKiSh/x9kFE=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    pillow
+    pydicom
+    requests
+    retrying
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-localserver
+  ];
+
+  pythonImportsCheck = [
+    "dicomweb_client"
+  ];
+
+  meta = with lib; {
+    description = "Python client for DICOMweb RESTful services";
+    homepage = "https://dicomweb-client.readthedocs.io";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+    mainProgram = "dicomweb_client";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dict2xml/default.nix b/nixpkgs/pkgs/development/python-modules/dict2xml/default.nix
new file mode 100644
index 000000000000..c032eef5f4e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dict2xml/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, hatchling
+}:
+
+buildPythonPackage rec {
+  pname = "dict2xml";
+  version = "1.7.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "delfick";
+    repo = "python-dict2xml";
+    rev = "refs/tags/release-${version}";
+    hash = "sha256-0Ahc+8pb1gHvcpnYhKAJYLIaQ5Wbp7Q8clzMVcnVdYs=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  # Tests are inplemented in a custom DSL (RSpec)
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dict2xml"
+  ];
+
+  meta = with lib; {
+    description = "Library to convert a Python dictionary into an XML string";
+    homepage = "https://github.com/delfick/python-dict2xml";
+    changelog = "https://github.com/delfick/python-dict2xml/releases/tag/release-${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ johnazoidberg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dictdiffer/default.nix b/nixpkgs/pkgs/development/python-modules/dictdiffer/default.nix
new file mode 100644
index 000000000000..2bb16eb097b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dictdiffer/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "dictdiffer";
+  version = "0.9.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "inveniosoftware";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-lQyPs3lQWtsvNPuvvwJUTDzrFaOX5uwGuRHe3yWUheU=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner>=2.7'," ""
+    substituteInPlace pytest.ini \
+      --replace ' --isort --pydocstyle --pycodestyle --doctest-glob="*.rst" --doctest-modules --cov=dictdiffer --cov-report=term-missing' ""
+  '';
+
+  pythonImportsCheck = [
+    "dictdiffer"
+  ];
+
+  meta = with lib; {
+    description = "Module to diff and patch dictionaries";
+    homepage = "https://github.com/inveniosoftware/dictdiffer";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dictionaries/default.nix b/nixpkgs/pkgs/development/python-modules/dictionaries/default.nix
new file mode 100644
index 000000000000..2a3e752c2062
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dictionaries/default.nix
@@ -0,0 +1,19 @@
+{ buildPythonPackage, fetchPypi, lib, six }:
+
+buildPythonPackage rec {
+  pname = "dictionaries";
+  version = "0.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8fa92745eb7c707b8588888875234f2f0a61b67936d8deb91b2b7b4c32366112";
+  };
+
+  buildInputs = [ six ];
+
+  meta = {
+    description = "Dict implementations with attribute access";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.MostAwesomeDude ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dicttoxml/default.nix b/nixpkgs/pkgs/development/python-modules/dicttoxml/default.nix
new file mode 100644
index 000000000000..c96f37c177c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dicttoxml/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "dicttoxml";
+  version = "1.7.16";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bzbOZEiB21zYlAvum3yz8/a3sye6imfYPT4sqgU4v50=";
+  };
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = {
+    description = "Converts a Python dictionary or other native data type into a valid XML string";
+    homepage = "https://github.com/quandyfactory/dicttoxml";
+    license = lib.licenses.gpl2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dicttoxml2/default.nix b/nixpkgs/pkgs/development/python-modules/dicttoxml2/default.nix
new file mode 100644
index 000000000000..873063498535
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dicttoxml2/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dicttoxml2";
+  version = "2.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Z8tynzN911KAjAIbcMjfijT4S54RGl26o34ADur01GI=";
+  };
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dicttoxml2"
+  ];
+
+  meta = with lib;{
+    description = "Converts a Python dictionary or other native data type into a valid XML string";
+    homepage = "https://pypi.org/project/dicttoxml2/";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/diff-cover/default.nix b/nixpkgs/pkgs/development/python-modules/diff-cover/default.nix
new file mode 100644
index 000000000000..bab6cd3f6c7b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/diff-cover/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, chardet
+, fetchPypi
+, jinja2
+, jinja2-pluralize
+, pluggy
+, pycodestyle
+, pyflakes
+, pygments
+, pylint
+, pytest-datadir
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, tomli
+}:
+
+buildPythonPackage rec {
+  pname = "diff-cover";
+  version = "7.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "diff_cover";
+    inherit version;
+    hash = "sha256-YGFM9+ciz3+xveSXr6wLUUKU4eJlNESWItrE2ilhI/s=";
+  };
+
+  propagatedBuildInputs = [
+    chardet
+    jinja2
+    jinja2-pluralize
+    pluggy
+    pygments
+    tomli
+  ];
+
+  nativeCheckInputs = [
+    pycodestyle
+    pyflakes
+    pylint
+    pytest-datadir
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests check for flake8
+    "file_does_not_exist"
+    # Comparing console output doesn't work reliable
+    "console"
+  ];
+
+  pythonImportsCheck = [
+    "diff_cover"
+  ];
+
+  meta = with lib; {
+    description = "Automatically find diff lines that need test coverage";
+    homepage = "https://github.com/Bachmann1234/diff-cover";
+    changelog = "https://github.com/Bachmann1234/diff_cover/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dzabraev ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/diff-match-patch/default.nix b/nixpkgs/pkgs/development/python-modules/diff-match-patch/default.nix
new file mode 100644
index 000000000000..93d9e3288dda
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/diff-match-patch/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "diff-match-patch";
+  version = "20230430";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lTAZzbnJ0snke1sSvP889HRvxFmOtAYHb6H8J+ah8Vw=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/diff-match-patch-python/diff-match-patch";
+    description = "Diff, Match and Patch libraries for Plain Text";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/diffimg/default.nix b/nixpkgs/pkgs/development/python-modules/diffimg/default.nix
new file mode 100644
index 000000000000..e5afcdf8cdf1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/diffimg/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pillow
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "diffimg";
+  version = "0.3.0"; # github recognized 0.1.3, there's a v0.1.5 tag and setup.py says 0.3.0
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "nicolashahn";
+    repo = "diffimg";
+    rev = "b82f0bb416f100f9105ccccf1995872b29302461";
+    hash = "sha256-H/UQsqyfdnlESBe7yRu6nK/0dakQkAfeFaZNwjCMvdM=";
+  };
+
+  # it imports the wrong diff,
+  # fix offered to upstream https://github.com/nicolashahn/diffimg/pull/6
+  postPatch = ''
+    substituteInPlace diffimg/test.py \
+      --replace "from diff import diff" "from diffimg.diff import diff"
+  '';
+
+  propagatedBuildInputs = [
+    pillow
+  ];
+
+  pythonImportsCheck = [ "diffimg" ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Differentiate images in python - get a ratio or percentage difference, and generate a diff image";
+    homepage = "https://github.com/nicolashahn/diffimg";
+    license = licenses.mit;
+    maintainers = with maintainers; [ evils ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/diffsync/default.nix b/nixpkgs/pkgs/development/python-modules/diffsync/default.nix
new file mode 100644
index 000000000000..8d4a71e89098
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/diffsync/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, colorama
+, fetchFromGitHub
+, packaging
+, poetry-core
+, pydantic
+, redis
+, structlog
+}:
+
+buildPythonPackage rec {
+  pname = "diffsync";
+  version = "1.10.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "networktocode";
+    repo = "diffsync";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-p7aML6dTDkF4hx67bwI29nhEHi7LIEZ5RlHPgtyQMbo=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    colorama
+    packaging
+    pydantic
+    redis
+    structlog
+  ];
+
+  pythonImportsCheck = [
+    "diffsync"
+  ];
+
+  meta = with lib; {
+    description = "Utility library for comparing and synchronizing different datasets";
+    homepage = "https://github.com/networktocode/diffsync";
+    changelog = "https://github.com/networktocode/diffsync/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ clerie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/digi-xbee/default.nix b/nixpkgs/pkgs/development/python-modules/digi-xbee/default.nix
new file mode 100644
index 000000000000..52bfaee7911b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/digi-xbee/default.nix
@@ -0,0 +1,42 @@
+{ buildPythonPackage, fetchPypi, isPy27, pyserial, srp, lib }:
+
+buildPythonPackage rec {
+  pname = "digi-xbee";
+  version = "1.4.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3b10e749431f406d80c189d872f4673b8d3cd510f7b411f817780a0e72499cd2";
+  };
+
+  propagatedBuildInputs = [ pyserial srp ];
+
+  # Upstream doesn't contain unit tests, only functional tests which require specific hardware
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "digi.xbee.models"
+    "digi.xbee.packets"
+    "digi.xbee.util"
+    "digi.xbee.comm_interface"
+    "digi.xbee.devices"
+    "digi.xbee.exception"
+    "digi.xbee.filesystem"
+    "digi.xbee.firmware"
+    "digi.xbee.io"
+    "digi.xbee.profile"
+    "digi.xbee.reader"
+    "digi.xbee.recovery"
+    "digi.xbee.sender"
+    "digi.xbee.serial"
+    "digi.xbee.xsocket"
+  ];
+
+  meta = with lib; {
+    description = "Python library to interact with Digi International's XBee radio frequency modules";
+    homepage = "https://github.com/digidotcom/xbee-python";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ jefflabonte ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/digitalocean/default.nix b/nixpkgs/pkgs/development/python-modules/digitalocean/default.nix
new file mode 100644
index 000000000000..3d756312deda
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/digitalocean/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, jsonpickle
+, mock
+, pytest
+, pytestCheckHook
+, requests
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "python-digitalocean";
+  version = "1.17.0";
+
+  src = fetchFromGitHub {
+    owner = "koalalorenzo";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1c50ka4y712rr551gq3kdfw7fgfxr4w837sww6yy683yz7m1d1h8";
+  };
+
+  propagatedBuildInputs = [
+    jsonpickle
+    requests
+  ];
+
+  dontUseSetuptoolsCheck = true;
+
+  nativeCheckInputs = [
+    pytest
+    pytestCheckHook
+    responses
+  ] ++ lib.optionals (!isPy3k) [
+    mock
+  ];
+
+  preCheck = ''
+    cd digitalocean
+  '';
+
+  # Test tries to access the network
+  disabledTests = ["TestFirewall"];
+
+  pythonImportsCheck = [ "digitalocean" ];
+
+  meta = with lib; {
+    description = "Python API to manage Digital Ocean Droplets and Images";
+    homepage = "https://github.com/koalalorenzo/python-digitalocean";
+    license = with licenses; [ lgpl3Only ];
+    maintainers = with maintainers; [ kiwi teh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dill/default.nix b/nixpkgs/pkgs/development/python-modules/dill/default.nix
new file mode 100644
index 000000000000..d6fdd2b97d2d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dill/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, pythonOlder
+, setuptools
+
+# passthru tests
+, apache-beam
+, datasets
+}:
+
+buildPythonPackage rec {
+  pname = "dill";
+  version = "0.3.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "uqfoundation";
+    repo = pname;
+    rev = "refs/tags/dill-${version}";
+    hash = "sha256-1cRGA5RuNjlpc3jq9SAsUYgmPauIV8zRF9SxOmveljI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} dill/tests/__main__.py
+    runHook postCheck
+  '';
+
+  passthru.tests = {
+    inherit apache-beam datasets;
+  };
+
+  pythonImportsCheck = [ "dill" ];
+
+  meta = with lib; {
+    description = "Serialize all of python (almost)";
+    homepage = "https://github.com/uqfoundation/dill/";
+    changelog = "https://github.com/uqfoundation/dill/releases/tag/dill-${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ tjni ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dinghy/default.nix b/nixpkgs/pkgs/development/python-modules/dinghy/default.nix
new file mode 100644
index 000000000000..20d855bf0d26
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dinghy/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, aiofiles
+, aiohttp
+, backports-datetime-fromisoformat
+, click
+, click-log
+, emoji
+, glom
+, jinja2
+, pyyaml
+, freezegun
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "dinghy";
+  version = "1.3.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "nedbat";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-0U08QHQuNm7qaxhU8sNxeN0fZ4S8N0RYRsWjFUqhZSU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiofiles
+    aiohttp
+    backports-datetime-fromisoformat
+    click
+    click-log
+    emoji
+    glom
+    jinja2
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dinghy.cli"
+  ];
+
+  meta = with lib; {
+    description = "A GitHub activity digest tool";
+    homepage = "https://github.com/nedbat/dinghy";
+    changelog = "https://github.com/nedbat/dinghy/blob/${version}/CHANGELOG.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ trundle veehaitch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dingz/default.nix b/nixpkgs/pkgs/development/python-modules/dingz/default.nix
new file mode 100644
index 000000000000..6ad22e7f4ced
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dingz/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dingz";
+  version = "0.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-ecosystem";
+    repo = "python-dingz";
+    rev = version;
+    hash = "sha256-bCytQwLWw8D1UkKb/3LQ301eDCkVR4alD6NHjTs6I+4=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    click
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dingz"
+  ];
+
+  meta = with lib; {
+    description = "Python API for interacting with Dingz devices";
+    homepage = "https://github.com/home-assistant-ecosystem/python-dingz";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/diofant/default.nix b/nixpkgs/pkgs/development/python-modules/diofant/default.nix
new file mode 100644
index 000000000000..303d00bbff29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/diofant/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchpatch
+, fetchPypi
+, gmpy2
+, mpmath
+, numpy
+, pythonOlder
+, scipy
+, setuptools-scm
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "diofant";
+  version = "0.14.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.10";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "Diofant";
+    hash = "sha256-c886y37xR+4TxZw9+3tb7nkTGxWcS+Ag/ruUUdpf7S4=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "remove-pip-from-build-dependencies.patch";
+      url = "https://github.com/diofant/diofant/commit/117e441808faa7c785ccb81bf211772d60ebdec3.patch";
+      hash = "sha256-MYk1Ku4F3hAv7+jJQLWhXd8qyKRX+QYuBzPfYWT0VbU=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    mpmath
+  ];
+
+  passthru.optional-dependencies = {
+    exports = [
+      cython
+      numpy
+      scipy
+    ];
+    gmpy = [
+      gmpy2
+    ];
+  };
+
+  # tests take ~1h
+  doCheck = false;
+
+  pythonImportsCheck = [ "diofant" ];
+
+  meta = with lib; {
+    description = "A Python CAS library";
+    homepage = "https://diofant.readthedocs.io/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ suhr ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dipy/default.nix b/nixpkgs/pkgs/development/python-modules/dipy/default.nix
new file mode 100644
index 000000000000..22290b692240
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dipy/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, packaging
+, cython
+, numpy
+, scipy
+, h5py
+, nibabel
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "dipy";
+  version = "1.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "dipy";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-sfqCK2r9Io1gDDHL9s9R37J0h9KcOQML3B2zJx2+QuA=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    packaging
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    h5py
+    nibabel
+    tqdm
+  ];
+
+  # disable tests for now due to:
+  #   - some tests require data download (see dipy/dipy/issues/2092);
+  #   - running the tests manually causes a multiprocessing hang;
+  #   - import weirdness when running the tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dipy"
+    "dipy.core"
+    "dipy.direction"
+    "dipy.tracking"
+    "dipy.reconst"
+    "dipy.io"
+    "dipy.viz"
+    "dipy.boots"
+    "dipy.data"
+    "dipy.utils"
+    "dipy.segment"
+    "dipy.sims"
+    "dipy.stats"
+    "dipy.denoise"
+    "dipy.workflows"
+    "dipy.nn"
+  ];
+
+  meta = with lib; {
+    homepage = "https://dipy.org/";
+    description = "Diffusion imaging toolkit for Python";
+    changelog = "https://github.com/dipy/dipy/blob/${version}/Changelog";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/directv/default.nix b/nixpkgs/pkgs/development/python-modules/directv/default.nix
new file mode 100644
index 000000000000..34202a4b1c54
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/directv/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, yarl
+, aresponses
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "directv";
+  version = "0.4.0";
+
+  src = fetchFromGitHub {
+    owner = "ctalkington";
+    repo = "python-directv";
+    rev = version;
+    sha256 = "19jckf6qvl8fwi8yff1qy8c44xdz3zpi1ip1md6zl2c503qc91mk";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "directv" ];
+
+  meta = with lib; {
+    description = "Asynchronous Python client for DirecTV (SHEF)";
+    homepage = "https://github.com/ctalkington/python-directv";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dirty-equals/default.nix b/nixpkgs/pkgs/development/python-modules/dirty-equals/default.nix
new file mode 100644
index 000000000000..9f40226e6bb3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dirty-equals/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, pydantic
+, pytest-examples
+, pytestCheckHook
+, pythonOlder
+, pytz
+}:
+
+let
+  dirty-equals = buildPythonPackage rec {
+    pname = "dirty-equals";
+    version = "0.7.0";
+    format = "pyproject";
+
+    disabled = pythonOlder "3.8";
+
+    src = fetchFromGitHub {
+      owner = "samuelcolvin";
+      repo = pname;
+      rev = "refs/tags/v${version}";
+      hash = "sha256-ShbkPGj1whOQ11bFLUSTfvVEVlvc3JUzRDICbBohgMM=";
+    };
+
+    nativeBuildInputs = [
+      hatchling
+    ];
+
+    propagatedBuildInputs = [
+      pytz
+    ];
+
+    doCheck = false;
+    passthru.tests.pytest = dirty-equals.overrideAttrs { doCheck = true; };
+
+    nativeCheckInputs = [
+      pydantic
+      pytest-examples
+      pytestCheckHook
+    ];
+
+    pythonImportsCheck = [
+      "dirty_equals"
+    ];
+
+    meta = with lib; {
+      description = "Module for doing dirty (but extremely useful) things with equals";
+      homepage = "https://github.com/samuelcolvin/dirty-equals";
+      changelog = "https://github.com/samuelcolvin/dirty-equals/releases/tag/v${version}";
+      license = with licenses; [ mit ];
+      maintainers = with maintainers; [ fab ];
+    };
+  };
+in dirty-equals
diff --git a/nixpkgs/pkgs/development/python-modules/discid/default.nix b/nixpkgs/pkgs/development/python-modules/discid/default.nix
new file mode 100644
index 000000000000..1c24402926f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/discid/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, libdiscid, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "discid";
+  version = "1.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1fc6kvnqwaz9lrs2qgsp8wh0nabf49010r0r53wnsmpmafy315nd";
+  };
+
+  patchPhase =
+    let extension = stdenv.hostPlatform.extensions.sharedLibrary; in
+    ''
+      substituteInPlace discid/libdiscid.py \
+        --replace "_open_library(_LIB_NAME)" \
+                  "_open_library('${libdiscid}/lib/libdiscid${extension}')"
+    '';
+
+  meta = with lib; {
+    description = "Python binding of libdiscid";
+    homepage    = "https://python-discid.readthedocs.org/";
+    license     = licenses.lgpl3Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/discogs-client/default.nix b/nixpkgs/pkgs/development/python-modules/discogs-client/default.nix
new file mode 100644
index 000000000000..ad4268b8f712
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/discogs-client/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, oauthlib
+, python-dateutil
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "discogs-client";
+  version = "2.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "joalla";
+    repo = "discogs_client";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-sTzYhUKPqaCE553FqWR4qdtDDtymhuybHWiDOUwgglA=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    oauthlib
+    python-dateutil
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "discogs_client"
+  ];
+
+  meta = with lib; {
+    description = "Unofficial Python API client for Discogs";
+    homepage = "https://github.com/joalla/discogs_client";
+    changelog = "https://github.com/joalla/discogs_client/releases/tag/v${version}";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/discordpy/default.nix b/nixpkgs/pkgs/development/python-modules/discordpy/default.nix
new file mode 100644
index 000000000000..a13eba26b7e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/discordpy/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, stdenv
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, libopus
+, pynacl
+, pythonOlder
+, withVoice ? true
+, ffmpeg
+}:
+
+buildPythonPackage rec {
+  pname = "discord.py";
+  version = "2.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Rapptz";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-bZoYdDpk34x+Vw1pAZ3EcTFp2JJ/Ow0Jfof/XjqeRmY=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ] ++ lib.optionals withVoice [
+    libopus
+    pynacl
+    ffmpeg
+  ];
+
+  patchPhase = ''
+    substituteInPlace "discord/opus.py" \
+      --replace "ctypes.util.find_library('opus')" "'${libopus}/lib/libopus${stdenv.hostPlatform.extensions.sharedLibrary}'"
+  '' + lib.optionalString withVoice ''
+    substituteInPlace "discord/player.py" \
+      --replace "executable='ffmpeg'" "executable='${ffmpeg}/bin/ffmpeg'"
+  '';
+
+  # Only have integration tests with discord
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "discord"
+    "discord.file"
+    "discord.member"
+    "discord.user"
+    "discord.state"
+    "discord.guild"
+    "discord.webhook"
+    "discord.ext.commands.bot"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for the Discord API";
+    homepage = "https://discordpy.rtfd.org/";
+    changelog = "https://github.com/Rapptz/discord.py/blob/v${version}/docs/whats_new.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ivar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/discovery30303/default.nix b/nixpkgs/pkgs/development/python-modules/discovery30303/default.nix
new file mode 100644
index 000000000000..fb3904046b8b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/discovery30303/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "discovery30303";
+  version = "0.2.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = pname;
+    # Commit points to 0.2.1, https://github.com/bdraco/discovery30303/issues/1
+    rev = "0d0b0fdca1a98662dd2e6174d25853703bd6bf07";
+    hash = "sha256-WSVMhiJxASxAkxs6RGuAVvEFS8TPxDKE9M99Rp8HKGM=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=auto"
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=discovery30303" ""
+  '';
+
+  pythonImportsCheck = [
+    "discovery30303"
+  ];
+
+  meta = with lib; {
+    description = "Module to discover devices that respond on port 30303";
+    homepage = "https://github.com/bdraco/discovery30303";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/diskcache/default.nix b/nixpkgs/pkgs/development/python-modules/diskcache/default.nix
new file mode 100644
index 000000000000..6f275a01fa70
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/diskcache/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-django
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "diskcache";
+  version = "5.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "grantjenks";
+    repo = "python-diskcache";
+    rev = "v${version}";
+    hash = "sha256-c/k8mx/T4RkseDobJ2gtcuom0A6Ewyw4aP2Bk9pxV+o=";
+  };
+
+  nativeCheckInputs = [
+    pytest-django
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    sed -i "/--cov/d" tox.ini
+  '';
+
+  # Darwin sandbox causes most tests to fail
+  doCheck = !stdenv.isDarwin;
+
+  disabledTests = [
+    # Very time sensitive, can fail on over subscribed machines
+    "test_incr_update_keyerror"
+    # AssertionError: 'default' is not None
+    "test_decr_version"
+    "test_incr_version"
+    "test_get_or_set"
+    "test_get_many"
+    # see https://github.com/grantjenks/python-diskcache/issues/260
+    "test_cache_write_unpicklable_object"
+  ];
+
+  pythonImportsCheck = [
+    "diskcache"
+  ];
+
+  meta = with lib; {
+    description = "Disk and file backed persistent cache";
+    homepage = "http://www.grantjenks.com/docs/diskcache/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-cim/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-cim/default.nix
new file mode 100644
index 000000000000..37de761ca567
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-cim/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, dissect-cstruct
+, dissect-util
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-cim";
+  version = "3.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.cim";
+    rev = "refs/tags/${version}";
+    hash = "sha256-+HHjDUSepAEebMD5ckjXbfgA4AKlNMBYHwxDq+jdhxw=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dissect-cstruct
+    dissect-util
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dissect.cim"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module implementing a parser for the Windows Common Information Model (CIM) database";
+    homepage = "https://github.com/fox-it/dissect.cim";
+    changelog = "https://github.com/fox-it/dissect.cim/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-clfs/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-clfs/default.nix
new file mode 100644
index 000000000000..8dc3c9e20c12
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-clfs/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, dissect-cstruct
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-clfs";
+  version = "1.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.clfs";
+    rev = "refs/tags/${version}";
+    hash = "sha256-JdfO9KVuK1TsDyqEQkuHPJtSHDCym63imvLSHsVwQ3k=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dissect-cstruct
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dissect.clfs"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module implementing a parser for the CLFS (Common Log File System) file system";
+    homepage = "https://github.com/fox-it/dissect.clfs";
+    changelog = "https://github.com/fox-it/dissect.clfs/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-cobaltstrike/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-cobaltstrike/default.nix
new file mode 100644
index 000000000000..c232bdb0bf4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-cobaltstrike/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, buildPythonPackage
+, dissect-cstruct
+, dissect-util
+, fetchFromGitHub
+, flow-record
+, httpx
+, lark
+, pycryptodome
+, pyshark
+, pytest-httpserver
+, pytestCheckHook
+, pythonOlder
+, rich
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-cobaltstrike";
+  version = "1.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.cobaltstrike";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-CS50c3r7sdxp3CRS6XJ4QUmUFtmhFg6rSdKfYzJSOV4=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dissect-cstruct
+    dissect-util
+    lark
+  ];
+
+  passthru.optional-dependencies = {
+    c2 = [
+      flow-record
+      httpx
+      pycryptodome
+    ];
+    pcap = [
+      flow-record
+      httpx
+      pycryptodome
+      pyshark
+    ];
+    full = [
+      flow-record
+      httpx
+      pycryptodome
+      pyshark
+      rich
+    ];
+  };
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytest-httpserver
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "dissect.cobaltstrike"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module implementing a parser for Cobalt Strike related data";
+    homepage = "https://github.com/fox-it/dissect.cobaltstrike";
+    changelog = "https://github.com/fox-it/dissect.cobaltstrike/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-cstruct/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-cstruct/default.nix
new file mode 100644
index 000000000000..a40b806ab01d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-cstruct/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-cstruct";
+  version = "3.10";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.cstruct";
+    rev = "refs/tags/${version}";
+    hash = "sha256-cdBojvFI0cN6mEZ98xLa3XldvIoR+Jv1c0/hvVkKVoQ=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dissect.cstruct"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module implementing a parser for C-like structures";
+    homepage = "https://github.com/fox-it/dissect.cstruct";
+    changelog = "https://github.com/fox-it/dissect.cstruct/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-esedb/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-esedb/default.nix
new file mode 100644
index 000000000000..8c9767f6c066
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-esedb/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, dissect-cstruct
+, dissect-util
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-esedb";
+  version = "3.9";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.esedb";
+    rev = "refs/tags/${version}";
+    hash = "sha256-MdEKAArdbOG/FnTSksuJCt8o8161NY3vL0KGnUHJEdQ=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dissect-cstruct
+    dissect-util
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dissect.esedb"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module implementing a parser for Microsofts Extensible Storage Engine Database (ESEDB)";
+    homepage = "https://github.com/fox-it/dissect.esedb";
+    changelog = "https://github.com/fox-it/dissect.esedb/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-etl/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-etl/default.nix
new file mode 100644
index 000000000000..de6a49ba9e26
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-etl/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, dissect-cstruct
+, dissect-util
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-etl";
+  version = "3.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.etl";
+    rev = "refs/tags/${version}";
+    hash = "sha256-z6P7XpA+j9JIJJsp/Z4uewFw9OAPSZV+57eJu7rd17I=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dissect-cstruct
+    dissect-util
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dissect.etl"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module implementing a parser for Event Trace Log (ETL) files";
+    homepage = "https://github.com/fox-it/dissect.etl";
+    changelog = "https://github.com/fox-it/dissect.etl/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-eventlog/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-eventlog/default.nix
new file mode 100644
index 000000000000..9c11a3ee8778
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-eventlog/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, dissect-cstruct
+, dissect-util
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-eventlog";
+  version = "3.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.eventlog";
+    rev = "refs/tags/${version}";
+    hash = "sha256-h1LrBt8f9YFkc1uAAb4WwY3LjPuvsdVFvxji3QxKF0A=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dissect-cstruct
+    dissect-util
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dissect.eventlog"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module implementing parsers for the Windows EVT, EVTX and WEVT log file formats";
+    homepage = "https://github.com/fox-it/dissect.eventlog";
+    changelog = "https://github.com/fox-it/dissect.eventlog/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-evidence/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-evidence/default.nix
new file mode 100644
index 000000000000..b1d8bb2b1b84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-evidence/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, dissect-cstruct
+, dissect-util
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-evidence";
+  version = "3.7";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.evidence";
+    rev = "refs/tags/${version}";
+    hash = "sha256-b7Ls3Xfd0scMe/gccjvRfuADITnz5QpJNLUaIgmZtpI=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dissect-cstruct
+    dissect-util
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dissect.evidence"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module implementing a parsers for various forensic evidence file containers";
+    homepage = "https://github.com/fox-it/dissect.evidence";
+    changelog = "https://github.com/fox-it/dissect.evidence/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-executable/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-executable/default.nix
new file mode 100644
index 000000000000..d8f3e6cb08c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-executable/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, dissect-cstruct
+, dissect-util
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-executable";
+  version = "1.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.executable";
+    rev = "refs/tags/${version}";
+    hash = "sha256-h9eOTWJR0Bd3DY8WDYWqLCl1jYJcqP6cRTgWubf/rKI=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dissect-cstruct
+    dissect-util
+  ];
+
+  pythonImportsCheck = [
+    "dissect.executable"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module implementing a parser for various executable formats such as PE, ELF and Macho-O";
+    homepage = "https://github.com/fox-it/dissect.executable";
+    changelog = "https://github.com/fox-it/dissect.executable/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-extfs/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-extfs/default.nix
new file mode 100644
index 000000000000..dd93579fa022
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-extfs/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, dissect-cstruct
+, dissect-util
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-extfs";
+  version = "3.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.extfs";
+    rev = "refs/tags/${version}";
+    hash = "sha256-jCra6ZvILzFgIlBDAKfYhH4mxnJ2B8+Smjs9Hf7nhQo=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dissect-cstruct
+    dissect-util
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dissect.extfs"
+  ];
+
+  # Archive files seems to be corrupt
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Dissect module implementing a parser for the ExtFS file system";
+    homepage = "https://github.com/fox-it/dissect.extfs";
+    changelog = "https://github.com/fox-it/dissect.extfs/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-fat/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-fat/default.nix
new file mode 100644
index 000000000000..0a22c7b8b7ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-fat/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, dissect-cstruct
+, dissect-util
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-fat";
+  version = "3.7";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.fat";
+    rev = "refs/tags/${version}";
+    hash = "sha256-YfWshytfj4p2MqLpzE3b1/RtrL1/+Xd/5+RNbrH/Jfc=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dissect-cstruct
+    dissect-util
+  ];
+
+  # dissect.fat.exceptions.InvalidBPB: Invalid BS_jmpBoot
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dissect.fat"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module implementing a parser for the FAT file system";
+    homepage = "https://github.com/fox-it/dissect.fat";
+    changelog = "https://github.com/fox-it/dissect.fat/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-ffs/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-ffs/default.nix
new file mode 100644
index 000000000000..8e5dbaac0445
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-ffs/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, dissect-cstruct
+, dissect-util
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-ffs";
+  version = "3.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.ffs";
+    rev = "refs/tags/${version}";
+    hash = "sha256-eyqqsOKcRmzOY+fj1FYudh9FUanD0Z59zZPtsNz6I0s=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dissect-cstruct
+    dissect-util
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dissect.ffs"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module implementing a parser for the FFS file system";
+    homepage = "https://github.com/fox-it/dissect.ffs";
+    changelog = "https://github.com/fox-it/dissect.ffs/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-hypervisor/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-hypervisor/default.nix
new file mode 100644
index 000000000000..e7f17cb0286c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-hypervisor/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, defusedxml
+, dissect-cstruct
+, dissect-util
+, fetchFromGitHub
+, pycryptodome
+, pytestCheckHook
+, pythonOlder
+, rich
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-hypervisor";
+  version = "3.10";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.hypervisor";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Ml5U7yc4iqqilL6Y9qF3VU+pa0AXnYVQjVas90TpG30=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    defusedxml
+    dissect-cstruct
+    dissect-util
+  ];
+
+  passthru.optional-dependencies = {
+    full = [
+      pycryptodome
+      rich
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dissect.hypervisor"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module implementing parsers for various hypervisor disk, backup and configuration files";
+    homepage = "https://github.com/fox-it/dissect.hypervisor";
+    changelog = "https://github.com/fox-it/dissect.hypervisor/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-ntfs/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-ntfs/default.nix
new file mode 100644
index 000000000000..96b3cb3a6745
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-ntfs/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, dissect-cstruct
+, dissect-util
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-ntfs";
+  version = "3.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.ntfs";
+    rev = "refs/tags/${version}";
+    hash = "sha256-bnFimn5ektIKiX73NZ+1Iz3Uoew138a0nFJgypffC4o=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dissect-cstruct
+    dissect-util
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dissect.ntfs"
+  ];
+
+  disabledTestPaths = [
+    # Test is very time consuming
+    "tests/test_index.py"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module implementing a parser for the NTFS file system";
+    homepage = "https://github.com/fox-it/dissect.ntfs";
+    changelog = "https://github.com/fox-it/dissect.ntfs/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-ole/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-ole/default.nix
new file mode 100644
index 000000000000..d76e11cb3f53
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-ole/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, dissect-cstruct
+, dissect-util
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-ole";
+  version = "3.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.ole";
+    rev = "refs/tags/${version}";
+    hash = "sha256-4shxYKR6IrrMj2BIb5yFD7+C0SNyqsGOoBkWpad1EbI=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dissect-cstruct
+    dissect-util
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dissect.ole"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module implementing a parser for the Object Linking & Embedding (OLE) format";
+    homepage = "https://github.com/fox-it/dissect.ole";
+    changelog = "https://github.com/fox-it/dissect.ole/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-regf/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-regf/default.nix
new file mode 100644
index 000000000000..94881ca3ca42
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-regf/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, dissect-cstruct
+, dissect-util
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-regf";
+  version = "3.8";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.regf";
+    rev = "refs/tags/${version}";
+    hash = "sha256-4tKu7oPkpNcWr2XJvZg94yZZcbTeeXBphPCLoZYzg6U=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dissect-cstruct
+    dissect-util
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dissect.regf"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module implementing a parser for Windows registry file format";
+    homepage = "https://github.com/fox-it/dissect.regf";
+    changelog = "https://github.com/fox-it/dissect.regf/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-shellitem/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-shellitem/default.nix
new file mode 100644
index 000000000000..ad2fb1ed7a75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-shellitem/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, dissect-cstruct
+, dissect-util
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-shellitem";
+  version = "3.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.shellitem";
+    rev = "refs/tags/${version}";
+    hash = "sha256-g8o6W5MZ7E8AKYs5QGQGw3IQhZehrOcY6wJrt9TJf4s=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dissect-cstruct
+    dissect-util
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dissect.shellitem"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module implementing a parser for the Shellitem structures";
+    homepage = "https://github.com/fox-it/dissect.shellitem";
+    changelog = "https://github.com/fox-it/dissect.shellitem/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-sql/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-sql/default.nix
new file mode 100644
index 000000000000..173170396f72
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-sql/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, dissect-cstruct
+, dissect-util
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-sql";
+  version = "3.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.sql";
+    rev = "refs/tags/${version}";
+    hash = "sha256-BHwm88IPtfg/bi5veFGnciQeH4s0asVnxiMVsIi8vV8=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dissect-cstruct
+    dissect-util
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dissect.sql"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module implementing a parsers for the SQLite database file format";
+    homepage = "https://github.com/fox-it/dissect.sql";
+    changelog = "https://github.com/fox-it/dissect.sql/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-squashfs/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-squashfs/default.nix
new file mode 100644
index 000000000000..cc1f4999d858
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-squashfs/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, dissect-cstruct
+, dissect-util
+, fetchFromGitHub
+, lz4
+, python-lzo
+, pythonOlder
+, setuptools
+, setuptools-scm
+, zstandard
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-squashfs";
+  version = "1.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.squashfs";
+    rev = "refs/tags/${version}";
+    hash = "sha256-MJKC05/8NnJFdyBB5YPbqe8mp1zlIoS2FglKEPSSYd8=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dissect-cstruct
+    dissect-util
+  ];
+
+  passthru.optional-dependencies = {
+    full = [
+      lz4
+      python-lzo
+      zstandard
+    ];
+  };
+
+  pythonImportsCheck = [
+    "dissect.squashfs"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module implementing a parser for the SquashFS file system";
+    homepage = "https://github.com/fox-it/dissect.squashfs";
+    changelog = "https://github.com/fox-it/dissect.squashfs/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-target/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-target/default.nix
new file mode 100644
index 000000000000..dfb7f7867534
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-target/default.nix
@@ -0,0 +1,136 @@
+{ lib
+, stdenv
+, asn1crypto
+, buildPythonPackage
+, defusedxml
+, dissect-cim
+, dissect-clfs
+, dissect-cstruct
+, dissect-esedb
+, dissect-etl
+, dissect-eventlog
+, dissect-evidence
+, dissect-extfs
+, dissect-fat
+, dissect-ffs
+, dissect-hypervisor
+, dissect-ntfs
+, dissect-regf
+, dissect-sql
+, dissect-shellitem
+, dissect-thumbcache
+, dissect-util
+, dissect-volume
+, dissect-xfs
+, fetchFromGitHub
+, flow-record
+, fusepy
+, ipython
+, pycryptodome
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, setuptools
+, setuptools-scm
+, structlog
+, yara-python
+, zstandard
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-target";
+  version = "3.13";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.target";
+    rev = "refs/tags/${version}";
+    hash = "sha256-4dtKAFhxaS8PRoeLY6ZYrE/4P1pbcii1gWQ9RRVOBzs=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    defusedxml
+    dissect-cstruct
+    dissect-eventlog
+    dissect-evidence
+    dissect-hypervisor
+    dissect-ntfs
+    dissect-regf
+    dissect-util
+    dissect-volume
+    flow-record
+    structlog
+  ];
+
+  passthru.optional-dependencies = {
+    full = [
+      asn1crypto
+      dissect-cim
+      dissect-clfs
+      dissect-esedb
+      dissect-etl
+      dissect-extfs
+      dissect-fat
+      dissect-ffs
+      dissect-shellitem
+      dissect-sql
+      dissect-thumbcache
+      dissect-xfs
+      fusepy
+      ipython
+      pycryptodome
+      pyyaml
+      yara-python
+      zstandard
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.full;
+
+  pythonImportsCheck = [
+    "dissect.target"
+  ];
+
+  disabledTests = [
+    # Test requires rdump
+    "test_exec_target_command"
+    # Issue with tar file
+    "test_tar_sensitive_drive_letter"
+    "test_dpapi_decrypt_blob"
+    "test_notifications_appdb"
+    "test_md"
+    "test_notifications_wpndatabase"
+    "test_nested_md_lvm"
+    # Tests compare dates and times
+    "yum"
+    # Filesystem access, windows defender tests
+    "test_defender_quarantine_recovery"
+  ] ++
+  # test is broken on Darwin
+  lib.optional stdenv.hostPlatform.isDarwin "test_fs_attrs_no_os_listxattr";
+
+  disabledTestPaths = [
+    # Tests are using Windows paths
+    "tests/test_plugins_browsers.py"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module that provides a programming API and command line tools";
+    homepage = "https://github.com/fox-it/dissect.target";
+    changelog = "https://github.com/fox-it/dissect.target/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-thumbcache/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-thumbcache/default.nix
new file mode 100644
index 000000000000..e63e7bb4ac91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-thumbcache/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, dissect-cstruct
+, dissect-util
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-thumbcache";
+  version = "1.6";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.thumbcache";
+    rev = "refs/tags/${version}";
+    hash = "sha256-q35VL3BUZrxNBB5mHegqVObG76BYG4FAk/KIAvdm6B8=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dissect-cstruct
+    dissect-util
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dissect.thumbcache"
+  ];
+
+  disabledTests = [
+    # Don't run Windows related tests
+    "windows"
+    "test_index_type"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module implementing a parser for the Windows thumbcache";
+    homepage = "https://github.com/fox-it/dissect.thumbcache";
+    changelog = "https://github.com/fox-it/dissect.thumbcache/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-util/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-util/default.nix
new file mode 100644
index 000000000000..bfbc76b73c92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-util/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-util";
+  version = "3.12";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.util";
+    rev = "refs/tags/${version}";
+    hash = "sha256-rso6TIw8cQnkb58KtGKOfzIzpqJLW05L9sRWIGX3teA=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dissect.util"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module implementing various utility functions for the other Dissect modules";
+    homepage = "https://github.com/fox-it/dissect.util";
+    changelog = "https://github.com/fox-it/dissect.util/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-vmfs/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-vmfs/default.nix
new file mode 100644
index 000000000000..d3efbcdf6420
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-vmfs/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, dissect-cstruct
+, dissect-util
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-vmfs";
+  version = "3.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.vmfs";
+    rev = "refs/tags/${version}";
+    hash = "sha256-FDxB87TeAMUp0hP9YS/nrqNx71+ZlHf3Bsaqvuwx36U=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dissect-cstruct
+    dissect-util
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dissect.vmfs"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module implementing a parser for the VMFS file system";
+    homepage = "https://github.com/fox-it/dissect.vmfs";
+    changelog = "https://github.com/fox-it/dissect.vmfs/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-volume/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-volume/default.nix
new file mode 100644
index 000000000000..1ef6ffb44998
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-volume/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, dissect-cstruct
+, dissect-util
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-volume";
+  version = "3.7";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.volume";
+    rev = "refs/tags/${version}";
+    hash = "sha256-5ZO++l6BWA085U5IkghjCT46YhKc85SB7sNU2h4Fpec=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dissect-cstruct
+    dissect-util
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dissect.volume"
+  ];
+
+  disabledTests = [
+    # gzip.BadGzipFile: Not a gzipped file
+    "test_ddf_read"
+    "test_dm_thin"
+    "test_lvm_mirro"
+    "test_lvm_thin"
+    "test_md_raid0_zones"
+    "test_md_read"
+  ];
+
+  meta = with lib; {
+    description = "Dissect module implementing various utility functions for the other Dissect modules";
+    homepage = "https://github.com/fox-it/dissect.volume";
+    changelog = "https://github.com/fox-it/dissect.volume/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect-xfs/default.nix b/nixpkgs/pkgs/development/python-modules/dissect-xfs/default.nix
new file mode 100644
index 000000000000..d4f36cbc04d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect-xfs/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, dissect-cstruct
+, dissect-util
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dissect-xfs";
+  version = "3.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect.xfs";
+    rev = "refs/tags/${version}";
+    hash = "sha256-unrkmhLvjWWKHiqJWCEVEVcUjxWXMznjOytRbDwAxKw=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dissect-cstruct
+    dissect-util
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dissect.xfs"
+  ];
+
+  # Archive files seems to be corrupt
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Dissect module implementing a parser for the XFS file system";
+    homepage = "https://github.com/fox-it/dissect.xfs";
+    changelog = "https://github.com/fox-it/dissect.xfs/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissect/default.nix b/nixpkgs/pkgs/development/python-modules/dissect/default.nix
new file mode 100644
index 000000000000..6ff492588420
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissect/default.nix
@@ -0,0 +1,95 @@
+{ lib
+, buildPythonPackage
+, dissect-cim
+, dissect-clfs
+, dissect-cobaltstrike
+, dissect-cstruct
+, dissect-esedb
+, dissect-etl
+, dissect-eventlog
+, dissect-evidence
+, dissect-extfs
+, dissect-fat
+, dissect-ffs
+, dissect-executable
+, dissect-hypervisor
+, dissect-ntfs
+, dissect-ole
+, dissect-regf
+, dissect-shellitem
+, dissect-sql
+, dissect-squashfs
+, dissect-target
+, dissect-util
+, dissect-vmfs
+, dissect-volume
+, dissect-xfs
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "dissect";
+  version = "3.10";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "dissect";
+    rev = "refs/tags/${version}";
+    hash = "sha256-AgmBU2sC3/okC7LKQC6yMEJ3u69WwAMAANILMASBIjw=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dissect-cim
+    dissect-clfs
+    dissect-cobaltstrike
+    dissect-cstruct
+    dissect-esedb
+    dissect-etl
+    dissect-eventlog
+    dissect-evidence
+    dissect-executable
+    dissect-extfs
+    dissect-fat
+    dissect-ffs
+    dissect-hypervisor
+    dissect-ntfs
+    dissect-ole
+    dissect-regf
+    dissect-shellitem
+    dissect-sql
+    dissect-squashfs
+    dissect-target
+    dissect-util
+    dissect-vmfs
+    dissect-volume
+    dissect-xfs
+  ] ++ dissect-target.optional-dependencies.full;
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dissect"
+  ];
+
+  meta = with lib; {
+    description = "Dissect meta module";
+    homepage = "https://github.com/fox-it/dissect";
+    changelog = "https://github.com/fox-it/dissect/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dissononce/default.nix b/nixpkgs/pkgs/development/python-modules/dissononce/default.nix
new file mode 100644
index 000000000000..f3d903f91c99
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dissononce/default.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage, fetchFromGitHub, lib, pytest, cryptography, transitions }:
+
+buildPythonPackage rec {
+  pname = "dissononce";
+  version = "0.34.3";
+
+  src = fetchFromGitHub {
+    owner = "tgalal";
+    repo = "dissononce";
+    rev = version;
+    sha256 = "0hn64qfr0d5npmza6rjyxwwp12k2z2y1ma40zpl104ghac6g3mbs";
+  };
+
+  nativeCheckInputs = [ pytest ];
+  checkPhase = ''
+    HOME=$(mktemp -d) py.test tests/
+  '';
+
+  propagatedBuildInputs = [ cryptography transitions ];
+
+  meta = with lib; {
+    homepage = "https://pypi.org/project/dissononce/";
+    license = licenses.mit;
+    description = "A python implementation for Noise Protocol Framework";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/distlib/default.nix b/nixpkgs/pkgs/development/python-modules/distlib/default.nix
new file mode 100644
index 000000000000..cf31574e6fdb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/distlib/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "distlib";
+  version = "0.3.7";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-na/lSzSgKOr9lQOdXl1IUaE3NFQPEzEGDTHJkW5xR6g=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  postFixup = lib.optionalString (!stdenv.hostPlatform.isWindows) ''
+    find $out -name '*.exe' -delete
+  '';
+
+  pythonImportsCheck = [
+    "distlib"
+    "distlib.database"
+    "distlib.locators"
+    "distlib.index"
+    "distlib.markers"
+    "distlib.metadata"
+    "distlib.util"
+    "distlib.resources"
+  ];
+
+  # Tests use pypi.org.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Low-level components of distutils2/packaging";
+    homepage = "https://distlib.readthedocs.io";
+    license = licenses.psfl;
+    maintainers = with maintainers; [ lnl7 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/distorm3/default.nix b/nixpkgs/pkgs/development/python-modules/distorm3/default.nix
new file mode 100644
index 000000000000..5748effd390d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/distorm3/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, yasm
+}:
+
+buildPythonPackage rec {
+  pname = "distorm3";
+  version = "3.5.2";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "gdabah";
+    repo = "distorm";
+    rev = version;
+    sha256 = "012bh1l2w7i9q8rcnznj3x0lra09d5yxd3r42cbrqdwl1mmg26qn";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    yasm
+  ];
+
+  disabledTests = [
+    # TypeError: __init__() missing 3 required positional...
+    "test_dummy"
+  ];
+
+  pythonImportsCheck = [ "distorm3" ];
+
+  meta = with lib; {
+    description = "Disassembler library for x86/AMD64";
+    homepage = "https://github.com/gdabah/distorm";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/distrax/default.nix b/nixpkgs/pkgs/development/python-modules/distrax/default.nix
new file mode 100644
index 000000000000..616dbae7a4fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/distrax/default.nix
@@ -0,0 +1,84 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, chex
+, jaxlib
+, numpy
+, tensorflow-probability
+, dm-haiku
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "distrax";
+  version = "0.1.5";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "google-deepmind";
+    repo = "distrax";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-A1aCL/I89Blg9sNmIWQru4QJteUTN6+bhgrEJPmCrM0=";
+  };
+
+  buildInputs = [
+    chex
+    jaxlib
+    numpy
+    tensorflow-probability
+  ];
+
+  nativeCheckInputs = [
+    dm-haiku
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "distrax"
+  ];
+
+  disabledTests = [
+    # AssertionError on numerical values
+    # Reported upstream in https://github.com/google-deepmind/distrax/issues/267
+    "test_method_with_input_unnormalized_probs__with_device"
+    "test_method_with_input_unnormalized_probs__with_jit"
+    "test_method_with_input_unnormalized_probs__without_device"
+    "test_method_with_input_unnormalized_probs__without_jit"
+    "test_method_with_value_1d"
+    "test_nested_distributions__with_device"
+    "test_nested_distributions__without_device"
+    "test_nested_distributions__with_jit"
+    "test_nested_distributions__without_jit"
+    "test_stability__with_device"
+    "test_stability__with_jit"
+    "test_stability__without_device"
+    "test_stability__without_jit"
+    "test_von_mises_sample_gradient"
+    "test_von_mises_sample_moments"
+  ];
+
+  disabledTestPaths = [
+    # TypeErrors
+    "distrax/_src/bijectors/tfp_compatible_bijector_test.py"
+    "distrax/_src/distributions/distribution_from_tfp_test.py"
+    "distrax/_src/distributions/laplace_test.py"
+    "distrax/_src/distributions/multinomial_test.py"
+    "distrax/_src/distributions/mvn_diag_plus_low_rank_test.py"
+    "distrax/_src/distributions/mvn_kl_test.py"
+    "distrax/_src/distributions/straight_through_test.py"
+    "distrax/_src/distributions/tfp_compatible_distribution_test.py"
+    "distrax/_src/distributions/transformed_test.py"
+    "distrax/_src/distributions/uniform_test.py"
+    "distrax/_src/utils/transformations_test.py"
+  ];
+
+  meta = with lib; {
+    description = "Probability distributions in JAX";
+    homepage = "https://github.com/deepmind/distrax";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/distributed/default.nix b/nixpkgs/pkgs/development/python-modules/distributed/default.nix
new file mode 100644
index 000000000000..55d5dabdd009
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/distributed/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, buildPythonPackage
+, click
+, cloudpickle
+, dask
+, fetchFromGitHub
+, jinja2
+, locket
+, msgpack
+, packaging
+, psutil
+, pythonOlder
+, pyyaml
+, setuptools
+, setuptools-scm
+, sortedcontainers
+, tblib
+, toolz
+, tornado
+, urllib3
+, versioneer
+, zict
+}:
+
+buildPythonPackage rec {
+  pname = "distributed";
+  version = "2023.10.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "dask";
+    repo = "distributed";
+    rev = "refs/tags/${version}";
+    hash = "sha256-V0L1qY9xtJgKxNEZ69z8CQuXsUs30cqu6xFrsjKWkbY=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "versioneer[toml]==" "versioneer[toml]>=" \
+      --replace 'dynamic = ["version"]' 'version = "${version}"'
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    versioneer
+  ] ++ versioneer.optional-dependencies.toml;
+
+  propagatedBuildInputs = [
+    click
+    cloudpickle
+    dask
+    jinja2
+    locket
+    msgpack
+    packaging
+    psutil
+    pyyaml
+    sortedcontainers
+    tblib
+    toolz
+    tornado
+    urllib3
+    zict
+  ];
+
+  # When tested random tests would fail and not repeatably
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "distributed"
+  ];
+
+  meta = with lib; {
+    description = "Distributed computation in Python";
+    homepage = "https://distributed.readthedocs.io/";
+    changelog = "https://github.com/dask/distributed/blob/${version}/docs/source/changelog.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ teh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/distro/default.nix b/nixpkgs/pkgs/development/python-modules/distro/default.nix
new file mode 100644
index 000000000000..73ded7625dca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/distro/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "distro";
+  version = "1.8.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-AuER0dxqUKu47ta/McPkjtiwgw0eoqG3jGF2XCUT/dg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  # tests are very targeted at individual linux distributions
+  doCheck = false;
+
+  pythonImportsCheck = [ "distro" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/nir0s/distro";
+    description = "Linux Distribution - a Linux OS platform information API.";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/distutils-cfg/default.nix b/nixpkgs/pkgs/development/python-modules/distutils-cfg/default.nix
new file mode 100644
index 000000000000..cbf12c17582a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/distutils-cfg/default.nix
@@ -0,0 +1,32 @@
+# global distutils configuration, see http://docs.python.org/2/install/index.html#distutils-configuration-files
+
+{ stdenv, python, writeText, extraCfg ? "", overrideCfg ? "" }:
+
+
+let
+  distutilsCfg = writeText "distutils.cfg" (
+  if overrideCfg != "" then overrideCfg else ''
+    [easy_install]
+
+    # don't allow network connections during build to ensure purity
+    allow-hosts = None
+
+    # make sure we always unzip installed packages otherwise setup hooks won't work
+    zip_ok = 0
+
+    ${extraCfg}
+  '');
+in stdenv.mkDerivation {
+  name = "${python.libPrefix}-distutils.cfg";
+
+  buildInputs = [ python ];
+
+  dontUnpack = true;
+
+  installPhase = ''
+    dest="$out/lib/${python.libPrefix}/site-packages/distutils"
+    mkdir -p $dest
+    ln -s ${python}/lib/${python.libPrefix}/distutils/* $dest
+    ln -s ${distutilsCfg} $dest/distutils.cfg
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/distutils-extra/default.nix b/nixpkgs/pkgs/development/python-modules/distutils-extra/default.nix
new file mode 100644
index 000000000000..37ef77947b3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/distutils-extra/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+}:
+
+buildPythonPackage rec {
+  pname = "distutils-extra";
+  version = "2.50";
+  format = "setuptools";
+
+  src = fetchurl {
+    url = "https://salsa.debian.org/python-team/modules/python-distutils-extra/-/archive/${version}/python-${pname}-${version}.tar.bz2";
+    hash = "sha256-aq5+JjlzD3fS4+CPxZNjyz2QNfqsChC0w6KRVgbTGwI=";
+  };
+
+  # Tests are out-dated as the last upstream release is from 2016
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "DistUtilsExtra"
+  ];
+
+  meta = with lib; {
+    description = "Enhancements to Python's distutils";
+    homepage = "https://launchpad.net/python-distutils-extra";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dj-database-url/default.nix b/nixpkgs/pkgs/development/python-modules/dj-database-url/default.nix
new file mode 100644
index 000000000000..6ac924227f1a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dj-database-url/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, django
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dj-database-url";
+  version = "2.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8gQs7+EIblOcnaOfrVrX9hFzv3lmXmm/fk3lX6iLE18=";
+  };
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  # Tests access a DB via network
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dj_database_url"
+  ];
+
+  meta = with lib; {
+    description = "Use Database URLs in your Django Application";
+    homepage = "https://github.com/jazzband/dj-database-url";
+    changelog = "https://github.com/jazzband/dj-database-url/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dj-email-url/default.nix b/nixpkgs/pkgs/development/python-modules/dj-email-url/default.nix
new file mode 100644
index 000000000000..5f043f008e16
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dj-email-url/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dj-email-url";
+  version = "1.0.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Vf/jMp5I9U+Kdao27OCPNl4J1h+KIJdz7wmh1HYOaZo=";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} test_dj_email_url.py
+  '';
+
+  # tests not included with pypi release
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Use an URL to configure email backend settings in your Django Application";
+    homepage = "https://github.com/migonzalvar/dj-email-url";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dj-rest-auth/default.nix b/nixpkgs/pkgs/development/python-modules/dj-rest-auth/default.nix
new file mode 100644
index 000000000000..116e3085d908
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dj-rest-auth/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, django
+, django-allauth
+, djangorestframework
+, djangorestframework-simplejwt
+, responses
+, unittest-xml-reporting
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "dj-rest-auth";
+  version = "5.0.1";
+
+  src = fetchFromGitHub {
+    owner = "iMerica";
+    repo = "dj-rest-auth";
+    rev = "refs/tags/${version}";
+    hash = "sha256-PTFUZ54vKlufKCQyJb+QB/+hI15r+Z0auTjnc38yMLg=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # https://github.com/iMerica/dj-rest-auth/pull/561
+      url = "https://github.com/iMerica/dj-rest-auth/commit/be0cf53d94582183320b0994082f0a312c1066d9.patch";
+      hash = "sha256-BhZ7BWW8m609cVn1WCyPfpZq/706YVZAesrkcMKTD3A=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "coveralls>=1.11.1" "" \
+      --replace "==" ">="
+  '';
+
+  buildInputs = [
+    django
+  ];
+
+  propagatedBuildInputs = [
+    djangorestframework
+  ];
+
+  passthru.optional-dependencies.with_social = [
+    django-allauth
+  ];
+
+  nativeCheckInputs = [
+    djangorestframework-simplejwt
+    responses
+    unittest-xml-reporting
+  ] ++ passthru.optional-dependencies.with_social;
+
+  preCheck = ''
+    # connects to graph.facebook.com
+    substituteInPlace dj_rest_auth/tests/test_serializers.py \
+      --replace "def test_http_error" "def dont_test_http_error"
+  '';
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} runtests.py
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "dj_rest_auth" ];
+
+  meta = with lib; {
+    description = "Authentication for Django Rest Framework";
+    homepage = "https://github.com/iMerica/dj-rest-auth";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dj-search-url/default.nix b/nixpkgs/pkgs/development/python-modules/dj-search-url/default.nix
new file mode 100644
index 000000000000..410ed08d9478
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dj-search-url/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  version = "0.1";
+  pname = "dj-search-url";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "424d1a5852500b3c118abfdd0e30b3e0016fe68e7ed27b8553a67afa20d4fb40";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/dstufft/dj-search-url";
+    description = "Use Search URLs in your Django Haystack Application";
+    license = licenses.bsd0;
+    maintainers = [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dj-static/default.nix b/nixpkgs/pkgs/development/python-modules/dj-static/default.nix
new file mode 100644
index 000000000000..167fbf88bd51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dj-static/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, static3
+}:
+
+buildPythonPackage rec {
+  pname = "dj-static";
+  version = "0.0.6";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "heroku-python";
+    repo = "dj-static";
+    rev = "v${version}";
+    hash = "sha256-B6TydlezbDkmfFgJjdFniZIYo/JjzPvFj43co+HYCdc=";
+  };
+
+  buildInputs = [
+    django
+  ];
+
+  propagatedBuildInputs = [
+    static3
+  ];
+
+  pythonImportsCheck = [
+    "dj_static"
+  ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Serve production static files with Django";
+    homepage = "https://github.com/heroku-python/dj-static";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-admin-datta/default.nix b/nixpkgs/pkgs/development/python-modules/django-admin-datta/default.nix
new file mode 100644
index 000000000000..44be722da51a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-admin-datta/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, django
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "django-admin-datta";
+  version = "1.0.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VV7mb3501aZVuXUqzVqQYUttvkYa4pAECYWn7HksOmI=";
+  };
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "admin_datta"
+  ];
+
+  meta = with lib; {
+    description = "Modern template for Django that covers Admin Section";
+    homepage = "https://appseed.us/product/datta-able/django";
+    changelog = "https://github.com/app-generator/django-admin-datta/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ derdennisop ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-admin-sortable2/default.nix b/nixpkgs/pkgs/development/python-modules/django-admin-sortable2/default.nix
new file mode 100644
index 000000000000..d9987f5b5dec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-admin-sortable2/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, django_4
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "django-admin-sortable2";
+  version = "2.1.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit version pname;
+    hash = "sha256-N1awLH0JxbN+/mV3GNWq4rdfRv0Bu/4cOdTmBlEBnXk=";
+  };
+
+  propagatedBuildInputs = [
+    django_4
+  ];
+
+  pythonImportsCheck = [
+    "adminsortable2"
+  ];
+
+  # Tests are very slow (end-to-end with playwright)
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Generic drag-and-drop ordering for objects in the Django admin interface";
+    homepage = "https://github.com/jrief/django-admin-sortable2";
+    changelog = "https://github.com/jrief/django-admin-sortable2/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sephi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-allauth-2fa/default.nix b/nixpkgs/pkgs/development/python-modules/django-allauth-2fa/default.nix
new file mode 100644
index 000000000000..60a2d61bac27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-allauth-2fa/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, django
+, django-allauth
+, django-otp
+, fetchFromGitHub
+, pythonOlder
+, qrcode
+, hatchling
+}:
+
+buildPythonPackage rec {
+  pname = "django-allauth-2fa";
+  version = "0.11.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "valohai";
+    repo = "django-allauth-2fa";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-bm2RwhvX2nfhYs74MM0iZl9U2gHgm0lLlh2tuRRcGso=";
+  };
+
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    django
+    django-allauth
+    django-otp
+    qrcode
+  ];
+
+  pythonImportsCheck = [
+    "allauth_2fa"
+  ];
+
+  meta = with lib; {
+    description = "django-allauth-2fa adds two-factor authentication to django-allauth";
+    homepage = "https://github.com/valohai/django-allauth-2fa";
+    changelog = "https://github.com/valohai/django-allauth-2fa/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ derdennisop ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-allauth/default.nix b/nixpkgs/pkgs/development/python-modules/django-allauth/default.nix
new file mode 100644
index 000000000000..49864b0b9bbb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-allauth/default.nix
@@ -0,0 +1,88 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build-system
+, setuptools
+
+# dependencies
+, django
+, python3-openid
+, requests
+, requests-oauthlib
+, pyjwt
+
+# optional-dependencies
+, python3-saml
+, qrcode
+
+# tests
+, pillow
+, pytestCheckHook
+, pytest-django
+
+# passthru tests
+, dj-rest-auth
+}:
+
+buildPythonPackage rec {
+  pname = "django-allauth";
+  version = "0.57.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pennersr";
+    repo = pname;
+    rev = version;
+    hash = "sha256-zhKqvm43rw28UKNFdfJ2C1dIeZfPqmchb1rJykm1lx4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    django
+    python3-openid
+    pyjwt
+    requests
+    requests-oauthlib
+  ]
+  ++ pyjwt.optional-dependencies.crypto;
+
+  passthru.optional-dependencies = {
+    saml = [
+      python3-saml
+    ];
+    mfa = [
+      qrcode
+    ];
+  };
+
+  pythonImportsCheck = [
+    "allauth"
+  ];
+
+  nativeCheckInputs = [
+    pillow
+    pytestCheckHook
+    pytest-django
+  ]
+  ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  passthru.tests = {
+    inherit dj-rest-auth;
+  };
+
+  meta = with lib; {
+    changelog = "https://github.com/pennersr/django-allauth/blob/${version}/ChangeLog.rst";
+    description = "Integrated set of Django applications addressing authentication, registration, account management as well as 3rd party (social) account authentication";
+    downloadPage = "https://github.com/pennersr/django-allauth";
+    homepage = "https://www.intenct.nl/projects/django-allauth";
+    license = licenses.mit;
+    maintainers = with maintainers; [ derdennisop ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-annoying/default.nix b/nixpkgs/pkgs/development/python-modules/django-annoying/default.nix
new file mode 100644
index 000000000000..9772df000bca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-annoying/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, django
+, six
+, pytest-django
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "django-annoying";
+  version = "0.10.6";
+
+  src = fetchFromGitHub {
+    owner = "skorokithakis";
+    repo = "django-annoying";
+    rev = "v${version}";
+    hash = "sha256-M1zOLr1Vjf2U0xlW66Mpno+S+b4IKLklN+kYxRaj6cA=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "django-4-compatibility.patch";
+      url = "https://github.com/skorokithakis/django-annoying/pull/101/commits/51b5bd7bc8bb7a410400667e00d0813603df32bd.patch";
+      hash = "sha256-gLRlAtIHHJ85I88af3C3y+ZT+nXrj2KrV7QgOuEqspk=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    django
+    six
+  ];
+
+  DJANGO_SETTINGS_MODULE = "tests.settings";
+
+  nativeCheckInputs = [
+    pytest-django
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A django application that tries to eliminate annoying things in the Django framework";
+    homepage = "https://skorokithakis.github.io/django-annoying/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ambroisie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-anymail/default.nix b/nixpkgs/pkgs/development/python-modules/django-anymail/default.nix
new file mode 100644
index 000000000000..50b86d7fb90a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-anymail/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, six
+, requests
+, django
+, boto3
+, python
+, mock
+, pytestCheckHook
+, pytest-django
+}:
+
+buildPythonPackage rec {
+  pname = "django-anymail";
+  version = "10.1";
+
+  src = fetchFromGitHub {
+    owner = "anymail";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-unmbYQFLeqfqE1uFLMPLUad1UqA+sgbTzwRfpRhM3ik=";
+  };
+
+  propagatedBuildInputs = [
+    six
+    requests
+    django
+    boto3
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-django
+    mock
+  ];
+
+  disabledTests = [
+    # Require networking
+    "test_debug_logging"
+    "test_no_debug_logging"
+  ];
+
+  pythonImportsCheck = [ "anymail" ];
+
+  DJANGO_SETTINGS_MODULE = "tests.test_settings.settings_3_2";
+
+  meta = with lib; {
+    description = "Django email backends and webhooks for Mailgun";
+    homepage = "https://github.com/anymail/django-anymail";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-appconf/default.nix b/nixpkgs/pkgs/development/python-modules/django-appconf/default.nix
new file mode 100644
index 000000000000..66eef9d47288
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-appconf/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, django
+, six
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "django-appconf";
+  version = "1.0.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "django-compressor";
+    repo = "django-appconf";
+    rev = "v${version}";
+    hash = "sha256-nS4Hwp/NYg1XGvZO1tiE9mzJA7WFifyvgAjyp3YpqS4=";
+  };
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  preCheck = ''
+    # prove we're running tests against installed package, not build dir
+    rm -r appconf
+  '';
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m django test --settings=tests.test_settings
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "A helper class for handling configuration defaults of packaged apps gracefully";
+    homepage = "https://django-appconf.readthedocs.org/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ desiderius ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-auditlog/default.nix b/nixpkgs/pkgs/development/python-modules/django-auditlog/default.nix
new file mode 100644
index 000000000000..fa52f1b3d59c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-auditlog/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, django
+, python-dateutil
+, freezegun
+, psycopg2
+, postgresql
+, postgresqlTestHook
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "django-auditlog";
+  version = "2.2.2";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "jazzband";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-QHSGqtpkOgltAg+RlG/Ik3DfEjtSWt45sqlD+Zw4Bh0=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    django
+    python-dateutil
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    psycopg2
+    postgresql
+    postgresqlTestHook
+  ];
+
+  postgresqlTestUserOptions = "LOGIN SUPERUSER";
+
+  checkPhase = ''
+    runHook preCheck
+
+    TEST_DB_USER=$PGUSER \
+    TEST_DB_HOST=$PGHOST \
+    ${python.interpreter} runtests.py
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "auditlog" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/jazzband/django-auditlog/blob/v${version}/CHANGELOG.md";
+    description = "A Django app that keeps a log of changes made to an object";
+    downloadPage = "https://github.com/jazzband/django-auditlog";
+    license = licenses.mit;
+    maintainers = with maintainers; [ leona ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-auth-ldap/default.nix b/nixpkgs/pkgs/development/python-modules/django-auth-ldap/default.nix
new file mode 100644
index 000000000000..3fa84658b6d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-auth-ldap/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+
+# buildtime
+, setuptools-scm
+
+# runtime
+, django
+, python-ldap
+
+# tests
+, python
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "django-auth-ldap";
+  version = "4.6.0";
+  format = "pyproject";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-muK/h/m2Nnts/ZSgRRiWy8co5UAO2By/vVjOdDwJCaI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    django
+    python-ldap
+  ];
+
+  # ValueError: SCHEMADIR is None, ldap schemas are missing.
+  doCheck = false;
+
+  checkPhase = ''
+    runHook preCheck
+    export PATH=${pkgs.openldap}/bin:${pkgs.openldap}/libexec:$PATH
+    ${python.interpreter} -m django test --settings tests.settings
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "django_auth_ldap" ];
+
+  meta = with lib; {
+    description = "Django authentication backend that authenticates against an LDAP service";
+    homepage = "https://github.com/django-auth-ldap/django-auth-ldap";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ mmai ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-autocomplete-light/default.nix b/nixpkgs/pkgs/development/python-modules/django-autocomplete-light/default.nix
new file mode 100644
index 000000000000..774bcda4ba83
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-autocomplete-light/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, six
+, pytestCheckHook
+, django-debug-toolbar
+, django-extensions
+, django-taggit
+, django-tagging
+, mock
+, pytest-django
+, selenium
+, splinter
+, sqlparse
+, tenacity
+, whitenoise
+}:
+
+buildPythonPackage rec {
+  pname = "django-autocomplete-light";
+  version = "3.9.4";
+
+  src = fetchFromGitHub {
+    owner = "yourlabs";
+    repo = "django-autocomplete-light";
+    rev = version;
+    hash = "sha256-YUiGN6q7ARM/rg7d+ykeDEYZDYjB+DHxMCmdme6QccU=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    six
+  ];
+
+  # Too many un-packaged dependencies
+  doCheck = false;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    django-debug-toolbar
+    django-extensions
+    django-taggit
+    django-tagging
+    mock
+    pytest-django
+    selenium
+    splinter
+    sqlparse
+    tenacity
+    whitenoise
+
+    # FIXME: not packaged
+    # django-generic-m2m
+    # django-gm2m
+    # django-querysetsequence
+    # pytest-splinter
+    # dango-nested-admin
+    # djhacker
+  ];
+
+  # Taken from tox.ini
+  preCheck = "cd test_project";
+
+  pythonImportsCheck = [ "dal" ];
+
+  meta = with lib; {
+    description = "A fresh approach to autocomplete implementations, specially for Django";
+    homepage = "https://django-autocomplete-light.readthedocs.io";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ambroisie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-bootstrap3/default.nix b/nixpkgs/pkgs/development/python-modules/django-bootstrap3/default.nix
new file mode 100644
index 000000000000..ccb1ffd3c1a7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-bootstrap3/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, hatchling
+
+# non-propagates
+, django
+
+# tests
+, pytest-django
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "django-bootstrap3";
+  version = "23.4";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "zostera";
+    repo = "django-bootstrap3";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-1/JQ17GjBHH0JbY4EnHOS2B3KhEJdG2yL6O2nc1HNNc=";
+  };
+
+  postPatch = ''
+    sed -i '/beautifulsoup4/d' pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  buildInputs = [
+    django
+  ];
+
+  pythonImportsCheck = [
+    "bootstrap3"
+  ];
+
+  nativeCheckInputs = [
+    pytest-django
+    pytestCheckHook
+  ];
+
+  env.DJANGO_SETTINGS_MODULE = "tests.app.settings";
+
+  meta = with lib; {
+    description = "Bootstrap 3 integration for Django";
+    homepage = "https://github.com/zostera/django-bootstrap3";
+    changelog = "https://github.com/zostera/django-bootstrap3/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
+
+
diff --git a/nixpkgs/pkgs/development/python-modules/django-bootstrap4/default.nix b/nixpkgs/pkgs/development/python-modules/django-bootstrap4/default.nix
new file mode 100644
index 000000000000..568ce0df3048
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-bootstrap4/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, hatchling
+
+# non-propagates
+, django
+
+# dependencies
+, beautifulsoup4
+
+# tests
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "django-bootstrap4";
+  version = "23.2";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "zostera";
+    repo = "django-bootstrap4";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-RYGwi+hRfTqPAikrv33w27v1/WLwRvXexSusJKdr2o8=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+  ];
+
+  pythonImportsCheck = [
+    "bootstrap4"
+  ];
+
+  nativeCheckInputs = [
+    (django.override { withGdal = true; })
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} manage.py test -v1 --noinput
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Bootstrap 4 integration with Django";
+    homepage = "https://github.com/zostera/django-bootstrap4";
+    changelog = "https://github.com/zostera/django-bootstrap4/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-bootstrap5/default.nix b/nixpkgs/pkgs/development/python-modules/django-bootstrap5/default.nix
new file mode 100644
index 000000000000..76405e9e5cd6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-bootstrap5/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build-system
+, hatchling
+
+# dependencies
+, beautifulsoup4
+, pillow
+, django
+}:
+
+buildPythonPackage rec {
+  pname = "django-bootstrap5";
+  version = "23.3";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "zostera";
+    repo = "django-bootstrap5";
+    rev = "v${version}";
+    hash = "sha256-FIwDyZ5I/FSaEiQKRfanzAGij86u8y85Wal0B4TrI7c=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    django
+    beautifulsoup4
+    pillow
+  ];
+
+  pythonImportsCheck = [
+    "django_bootstrap5"
+  ];
+
+  meta = with lib; {
+    description = "Bootstrap 5 integration with Django";
+    homepage = "https://github.com/zostera/django-bootstrap5";
+    changelog = "https://github.com/zostera/django-bootstrap5/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ netali ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-cachalot/default.nix b/nixpkgs/pkgs/development/python-modules/django-cachalot/default.nix
new file mode 100644
index 000000000000..33d9e484f114
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-cachalot/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, django-debug-toolbar
+, psycopg2
+, beautifulsoup4
+, python
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "django-cachalot";
+  version = "2.6.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "noripyt";
+    repo = "django-cachalot";
+    rev = "v${version}";
+    hash = "sha256-bCiIZkh02+7xL6aSWE9by+4dFDsanr0iXuO9QKpLOjw=";
+  };
+
+  patches = [
+    # Disable tests for unsupported caching and database types which would
+    # require additional running backends
+    ./disable-unsupported-tests.patch
+  ];
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  checkInputs = [
+    beautifulsoup4
+    django-debug-toolbar
+    psycopg2
+    pytz
+  ];
+
+  pythonImportsCheck = [ "cachalot" ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} runtests.py
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "No effort, no worry, maximum performance";
+    homepage = "https://github.com/noripyt/django-cachalot";
+    changelog = "https://github.com/noripyt/django-cachalot/blob/${src.rev}/CHANGELOG.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-cachalot/disable-unsupported-tests.patch b/nixpkgs/pkgs/development/python-modules/django-cachalot/disable-unsupported-tests.patch
new file mode 100644
index 000000000000..8683fffbb146
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-cachalot/disable-unsupported-tests.patch
@@ -0,0 +1,65 @@
+diff --git a/cachalot/tests/models.py b/cachalot/tests/models.py
+index 8c48640..817602c 100644
+--- a/cachalot/tests/models.py
++++ b/cachalot/tests/models.py
+@@ -77,11 +77,6 @@ class PostgresModel(Model):
+     date_range = DateRangeField(null=True, blank=True)
+     datetime_range = DateTimeRangeField(null=True, blank=True)
+ 
+-    class Meta:
+-        # Tests schema name in table name.
+-        db_table = '"public"."cachalot_postgresmodel"'
+-
+-
+ class UnmanagedModel(Model):
+     name = CharField(max_length=50)
+ 
+diff --git a/settings.py b/settings.py
+index 19d7560..7095367 100644
+--- a/settings.py
++++ b/settings.py
+@@ -8,18 +8,9 @@ DATABASES = {
+         'ENGINE': 'django.db.backends.sqlite3',
+         'NAME': 'cachalot.sqlite3',
+     },
+-    'postgresql': {
+-        'ENGINE': 'django.db.backends.postgresql',
+-        'NAME': 'cachalot',
+-        'USER': 'cachalot',
+-        'PASSWORD': 'password',
+-        'HOST': '127.0.0.1',
+-    },
+-    'mysql': {
+-        'ENGINE': 'django.db.backends.mysql',
+-        'NAME': 'cachalot',
+-        'USER': 'root',
+-        'HOST': '127.0.0.1',
++    'test': {
++        'ENGINE': 'django.db.backends.sqlite3',
++        'NAME': ':memory:',
+     },
+ }
+ if 'MYSQL_PASSWORD' in os.environ:
+@@ -36,22 +27,6 @@ DEFAULT_AUTO_FIELD = "django.db.models.AutoField"
+ DATABASE_ROUTERS = ['cachalot.tests.db_router.PostgresRouter']
+ 
+ CACHES = {
+-    'redis': {
+-        'BACKEND': 'django_redis.cache.RedisCache',
+-        'LOCATION': 'redis://127.0.0.1:6379/0',
+-        'OPTIONS': {
+-            # Since we are using both Python 2 & 3 in tests, we need to use
+-            # a compatible pickle version to avoid unpickling errors when
+-            # running a Python 2 test after a Python 3 test.
+-            'PICKLE_VERSION': 2,
+-        },
+-    },
+-    'memcached': {
+-        'BACKEND': 'django.core.cache.backends.memcached.'
+-                   + ('PyMemcacheCache' if __DJ_V[0] > 2
+-                      and (__DJ_V[1] > 1 or __DJ_V[0] > 3) else 'MemcachedCache'),
+-        'LOCATION': '127.0.0.1:11211',
+-    },
+     'locmem': {
+         'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
+         'OPTIONS': {
diff --git a/nixpkgs/pkgs/development/python-modules/django-cache-url/default.nix b/nixpkgs/pkgs/development/python-modules/django-cache-url/default.nix
new file mode 100644
index 000000000000..01cccaf8c50d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-cache-url/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  version = "3.2.2";
+  pname = "django-cache-url";
+
+  src = fetchFromGitHub {
+    owner = "epicserve";
+    repo = "django-cache-url";
+    rev = "v${version}";
+    sha256 = "0fxma2w6zl3cfl6wnynmlmp8snks67ffz4jcq4qmdc65xv1l204l";
+  };
+
+  postPatch = ''
+    # disable coverage tests
+    sed -i '/--cov/d' setup.cfg
+  '';
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    homepage = "https://github.com/epicserve/django-cache-url";
+    description = "Use Cache URLs in your Django application";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-cacheops/default.nix b/nixpkgs/pkgs/development/python-modules/django-cacheops/default.nix
new file mode 100644
index 000000000000..5416cf359f35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-cacheops/default.nix
@@ -0,0 +1,80 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, pythonRelaxDepsHook
+, django
+, funcy
+, redis
+, six
+, pytestCheckHook
+, pytest-django
+, mock
+, dill
+, jinja2
+, before-after
+, pythonOlder
+, nettools
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "django-cacheops";
+  version = "7.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-d6N8c9f6z8cpk2XtZqEr56SH3XRd2GwdM8ouv9OzKHg=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+  pythonRelaxDeps = [ "funcy" ];
+
+  propagatedBuildInputs = [
+    django
+    funcy
+    redis
+    six
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-django
+    mock
+    dill
+    jinja2
+    before-after
+    nettools
+    pkgs.redis
+  ];
+
+  preCheck = ''
+    redis-server &
+    REDIS_PID=$!
+    while ! redis-cli --scan ; do
+      echo waiting for redis to be ready
+      sleep 1
+    done
+  '';
+
+  postCheck = ''
+    kill $REDIS_PID
+  '';
+
+  DJANGO_SETTINGS_MODULE = "tests.settings";
+
+  meta = with lib; {
+    description = "A slick ORM cache with automatic granular event-driven invalidation for Django";
+    homepage = "https://github.com/Suor/django-cacheops";
+    changelog = "https://github.com/Suor/django-cacheops/blob/${version}/CHANGELOG";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-celery-beat/default.nix b/nixpkgs/pkgs/development/python-modules/django-celery-beat/default.nix
new file mode 100644
index 000000000000..f8126f7ed3ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-celery-beat/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, python-crontab
+, celery
+, cron-descriptor
+, django-timezone-field
+, tzdata
+, ephem
+, pytest-timeout
+, pytest-django
+, case
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "django-celery-beat";
+  version = "2.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zQpH9ZWEAvUawMcVvJQq4z17ULTkjLqRvD8nEr5QXfE=";
+  };
+
+  propagatedBuildInputs = [
+    cron-descriptor
+    python-crontab
+    celery
+    django-timezone-field
+    tzdata
+  ];
+
+  nativeCheckInputs = [
+    ephem
+    pytest-timeout
+    pytest-django
+    case
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Connection error
+    "t/unit/test_schedulers.py"
+  ];
+
+  pythonImportsCheck = [
+    "django_celery_beat"
+  ];
+
+  meta = with lib; {
+    description = "Celery Periodic Tasks backed by the Django ORM";
+    homepage = "https://github.com/celery/django-celery-beat";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-celery-email/default.nix b/nixpkgs/pkgs/development/python-modules/django-celery-email/default.nix
new file mode 100644
index 000000000000..d94760baf635
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-celery-email/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, django-appconf
+, celery
+, pytest-django
+, pytestCheckHook
+, python }:
+
+buildPythonPackage rec {
+  pname = "django-celery-email";
+  version = "3.0.0";
+
+  src = fetchFromGitHub {
+    owner = "pmclanahan";
+    repo = pname;
+    rev = version;
+    hash = "sha256-LBavz5Nh2ObmIwLCem8nHvsuKgPwkzbS/OzFPmSje/M=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    django-appconf
+    celery
+  ];
+
+  DJANGO_SETTINGS_MODULE = "tests.settings";
+
+  nativeCheckInputs = [
+    pytest-django
+    pytestCheckHook
+  ];
+
+  checkPhase = ''
+    ${python.executable} runtests.py
+  '';
+
+  pythonImportsCheck = [ "djcelery_email" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pmclanahan/django-celery-email";
+    description = "Django email backend that uses a celery task for sending the email";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-celery-results/default.nix b/nixpkgs/pkgs/development/python-modules/django-celery-results/default.nix
new file mode 100644
index 000000000000..080d63b75bff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-celery-results/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, celery
+, django
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "django-celery-results";
+  version = "2.5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "django_celery_results";
+    inherit version;
+    hash = "sha256-PstxR/dz800DgbrGJGM3zkz4ii6nuCd07UjlGLZ7uP0=";
+  };
+
+  postPatch = ''
+    # Drop malformatted tests_require specification
+    sed -i '/tests_require=/d' setup.py
+  '';
+
+  propagatedBuildInputs = [
+    celery
+    django
+  ];
+
+  # Tests need access to a database.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Celery result back end with django";
+    homepage = "https://github.com/celery/django-celery-results";
+    changelog = "https://github.com/celery/django-celery-results/blob/v{version}/Changelog";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ babariviere ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-ckeditor/default.nix b/nixpkgs/pkgs/development/python-modules/django-ckeditor/default.nix
new file mode 100644
index 000000000000..b0df11aefd0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-ckeditor/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, django
+, django-extensions
+, django-js-asset
+, fetchFromGitHub
+, pillow
+, python
+, pythonOlder
+, selenium
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "django-ckeditor";
+  version = "6.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "django-ckeditor";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-mZQ5s3YbumYmT0zRWPFIvzt2TbtDLvVcJjZVAwn31E8=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    django
+    django-js-asset
+    pillow
+  ];
+
+  DJANGO_SETTINGS_MODULE = "ckeditor_demo.settings";
+
+  checkInputs = [
+    django-extensions
+    selenium
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m django test
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "ckeditor"
+  ];
+
+  meta = with lib; {
+    description = " Django admin CKEditor integration";
+    homepage = "https://github.com/django-ckeditor/django-ckeditor";
+    changelog = "https://github.com/django-ckeditor/django-ckeditor/blob/${version}/CHANGELOG.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-classy-tags/default.nix b/nixpkgs/pkgs/development/python-modules/django-classy-tags/default.nix
new file mode 100644
index 000000000000..a4d363f8bc57
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-classy-tags/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, django
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "django-classy-tags";
+  version = "4.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-yNnRqi+m5xxNhm303RHSOmm40lu7dQskkKF7Fhd07lk=";
+  };
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  # pypi version doesn't include runtest.py, needed to run tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "classytags"
+  ];
+
+  meta = with lib; {
+    description = "Class based template tags for Django";
+    homepage = "https://github.com/divio/django-classy-tags";
+    changelog = "https://github.com/django-cms/django-classy-tags/blob/${version}/CHANGELOG.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-cleanup/default.nix b/nixpkgs/pkgs/development/python-modules/django-cleanup/default.nix
new file mode 100644
index 000000000000..acc94865c02b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-cleanup/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, django
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "django-cleanup";
+  version = "8.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xzmgVUTh5I3ISIcchw2/FZX4Uz0kUjvGc2DkNWLtrw0=";
+  };
+
+  nativeCheckInputs = [
+    django
+  ];
+
+  meta = with lib; {
+    description = "Automatically deletes old file for FileField and ImageField. It also deletes files on models instance deletion";
+    homepage = "https://github.com/un1t/django-cleanup";
+    changelog = "https://github.com/un1t/django-cleanup/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mmai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-colorful/default.nix b/nixpkgs/pkgs/development/python-modules/django-colorful/default.nix
new file mode 100644
index 000000000000..5de127a97221
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-colorful/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, django
+}:
+
+buildPythonPackage rec {
+  pname = "django-colorful";
+  version = "1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fd246f2fb297ed074dc4349966d33a1c82d0308b7fb0d6ef6e2e76b90cefffb7";
+  };
+
+  # Tests aren't run
+  doCheck = false;
+
+  # Requires Django >= 1.8
+  buildInputs = [ django ];
+
+  meta = with lib; {
+    description = "Django extension that provides database and form color fields";
+    homepage = "https://github.com/charettes/django-colorful";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-compression-middleware/default.nix b/nixpkgs/pkgs/development/python-modules/django-compression-middleware/default.nix
new file mode 100644
index 000000000000..c26ee8434dd8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-compression-middleware/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, django
+, zstandard
+, brotli
+}:
+
+buildPythonPackage rec {
+  pname = "django-compression-middleware";
+  version = "0.5.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-DfUPEtd0ZZq8i7yI5MeU8nhajxHzC1uyZ8MUuF2UG3M=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    zstandard
+    brotli
+  ];
+
+  meta = with lib; {
+    description = "Django middleware to compress responses using several algorithms";
+    homepage = "https://github.com/friedelwolff/django-compression-middleware";
+    changelog = "https://github.com/friedelwolff/django-compression-middleware/releases/tag/v${version}";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ e1mo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-compressor/default.nix b/nixpkgs/pkgs/development/python-modules/django-compressor/default.nix
new file mode 100644
index 000000000000..a8d367e854af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-compressor/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, rcssmin
+, rjsmin
+, django-appconf
+, beautifulsoup4
+, brotli
+, pytestCheckHook
+, django-sekizai
+, pytest-django
+, csscompressor
+, calmjs
+, jinja2
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "django-compressor";
+  version = "4.4";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "django_compressor";
+    inherit version;
+    hash = "sha256-GwrMnPup9pvDjnxB2psNcKILyVWHtkP/75YJz0YGT2c=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    calmjs
+    django-appconf
+    jinja2
+    rcssmin
+    rjsmin
+  ];
+
+  checkInputs = [
+    beautifulsoup4
+    brotli
+    csscompressor
+    django-sekizai
+    pytestCheckHook
+    pytest-django
+  ];
+
+  # Getting error: compressor.exceptions.OfflineGenerationError: You have
+  # offline compression enabled but key "..." is missing from offline manifest.
+  # You may need to run "python manage.py compress"
+  disabledTestPaths = [
+    "compressor/tests/test_offline.py"
+  ];
+
+  pythonImportsCheck = [ "compressor" ];
+
+  DJANGO_SETTINGS_MODULE = "compressor.test_settings";
+
+  meta = with lib; {
+    description = "Compresses linked and inline JavaScript or CSS into single cached files";
+    homepage = "https://django-compressor.readthedocs.org/";
+    changelog = "https://github.com/django-compressor/django-compressor/blob/${version}/docs/changelog.txt";
+    license = licenses.mit;
+    maintainers = with maintainers; [ desiderius ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-configurations/default.nix b/nixpkgs/pkgs/development/python-modules/django-configurations/default.nix
new file mode 100644
index 000000000000..ba32b7576403
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-configurations/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, dj-database-url
+, dj-email-url
+, dj-search-url
+, django
+, django-cache-url
+, fetchPypi
+, importlib-metadata
+, mock
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "django-configurations";
+  version = "2.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Y/olLEDciOoXuLkPX0oxonJuWGrLH/Dtx0wijGHxnl0=";
+  };
+
+  buildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    django
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    mock
+    dj-database-url
+    dj-email-url
+    dj-search-url
+    django-cache-url
+  ];
+
+  checkPhase = ''
+    export PYTHONPATH=.:$PYTHONPATH
+    export DJANGO_SETTINGS_MODULE="tests.settings.main"
+    export DJANGO_CONFIGURATION="Test"
+    ${django}/bin/django-admin.py test
+  '';
+
+  # django.core.exceptions.ImproperlyConfigured: django-configurations settings importer wasn't correctly installed
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "configurations"
+  ];
+
+  meta = with lib; {
+    description = "A helper for organizing Django settings";
+    homepage = "https://django-configurations.readthedocs.io/";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-context-decorator/default.nix b/nixpkgs/pkgs/development/python-modules/django-context-decorator/default.nix
new file mode 100644
index 000000000000..a23f5c874a76
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-context-decorator/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "django-context-decorator";
+  version = "1.6.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "rixx";
+    repo = "django-context-decorator";
+    rev = "v${version}";
+    hash = "sha256-/FDGWGC1Pdu+RLyazDNZv+CMf5vscXprLdN8ELjUFNo=";
+  };
+
+  pythonImportsCheck = [
+    "django_context_decorator"
+  ];
+
+  nativeCheckInputs = [
+    django
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Django @context decorator";
+    homepage = "https://github.com/rixx/django-context-decorator";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-contrib-comments/default.nix b/nixpkgs/pkgs/development/python-modules/django-contrib-comments/default.nix
new file mode 100644
index 000000000000..66189a88d0d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-contrib-comments/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, django
+}:
+
+buildPythonPackage rec {
+  pname = "django-contrib-comments";
+  version = "2.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-SN4A8VZ34BaiFq7/IF1uAOQ5HJpXAhNsZBGcRytzVto=";
+  };
+
+  propagatedBuildInputs = [ django ];
+
+  meta = with lib; {
+    homepage = "https://github.com/django/django-contrib-comments";
+    description = "The code formerly known as django.contrib.comments";
+    license = licenses.bsd0;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-cors-headers/default.nix b/nixpkgs/pkgs/development/python-modules/django-cors-headers/default.nix
new file mode 100644
index 000000000000..0c13c0b02100
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-cors-headers/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, django
+, pytest-django
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "django-cors-headers";
+  version = "3.13.0";
+
+  src = fetchFromGitHub {
+    owner = "adamchainz";
+    repo = "django-cors-headers";
+    rev = version;
+    hash = "sha256-pIyf4poW8/slxj4PVvmXpuYp//v5w00yU0Vz6Jiy2yM=";
+  };
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  nativeCheckInputs = [
+    pytest-django
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Django app for handling server Cross-Origin Resource Sharing (CORS) headers";
+    homepage = "https://github.com/OttoYiu/django-cors-headers";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-countries/default.nix b/nixpkgs/pkgs/development/python-modules/django-countries/default.nix
new file mode 100644
index 000000000000..95da90866e65
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-countries/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build
+, setuptools
+
+# propagates
+, asgiref
+, typing-extensions
+
+# tests
+, django
+, djangorestframework
+, graphene-django
+, pytestCheckHook
+, pytest-django
+}:
+
+buildPythonPackage rec {
+  pname = "django-countries";
+  version = "7.5.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "SmileyChris";
+    repo = "django-countries";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-se6s0sgIfMLW0sIMp/3vK4KdDPQ5ahg6OQCDAs4my4M=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    asgiref
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    django
+    djangorestframework
+    graphene-django
+    pytestCheckHook
+    pytest-django
+  ];
+
+  meta = with lib; {
+    description = "Provides a country field for Django models";
+    longDescription = ''
+      A Django application that provides country choices for use with
+      forms, flag icons static files, and a country field for models.
+    '';
+    homepage = "https://github.com/SmileyChris/django-countries";
+    changelog = "https://github.com/SmileyChris/django-countries/blob/v${version}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-crispy-bootstrap4/default.nix b/nixpkgs/pkgs/development/python-modules/django-crispy-bootstrap4/default.nix
new file mode 100644
index 000000000000..d8bb73ccdef8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-crispy-bootstrap4/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, setuptools
+, pytestCheckHook
+, pytest-django
+, django-crispy-forms
+}:
+
+buildPythonPackage rec {
+  pname = "django-crispy-bootstrap4";
+  version = "2023.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "django-crispy-forms";
+    repo = "crispy-bootstrap4";
+    rev = "refs/tags/${version}";
+    hash = "sha256-4p6dlyQYZGyfBntTuzCjikL8ZG/4xDnTiQ1rCVt0Hbk=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytest-django
+    pytestCheckHook
+    django-crispy-forms
+  ];
+
+  pythonImportsCheck = [ "crispy_bootstrap4" ];
+
+  meta = with lib; {
+    description = "Bootstrap 4 template pack for django-crispy-forms";
+    homepage = "https://github.com/django-crispy-forms/crispy-bootstrap4";
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-crispy-forms/default.nix b/nixpkgs/pkgs/development/python-modules/django-crispy-forms/default.nix
new file mode 100644
index 000000000000..81aecd208ae8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-crispy-forms/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, setuptools
+, pytestCheckHook
+, pytest-django
+}:
+
+buildPythonPackage rec {
+  pname = "django-crispy-forms";
+  version = "2.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "django-crispy-forms";
+    repo = "django-crispy-forms";
+    rev = "refs/tags/${version}";
+    hash = "sha256-UQ5m0JWir20TdLgS+DVVLcMBlIEIfmzv8pkMJtaC0LA=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    setuptools
+  ];
+
+  # FIXME: RuntimeError: Model class source.crispy_forms.tests.forms.CrispyTestModel doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
+  doCheck = false;
+
+  nativeCheckInputs = [
+    pytest-django
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--ds=crispy_forms.tests.test_settings"
+    "crispy_forms/tests/"
+  ];
+
+  pythonImportsCheck = [ "crispy_forms" ];
+
+  meta = with lib; {
+    description = "The best way to have DRY Django forms.";
+    homepage = "https://django-crispy-forms.readthedocs.io/en/latest/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ambroisie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-crontab/default.nix b/nixpkgs/pkgs/development/python-modules/django-crontab/default.nix
new file mode 100644
index 000000000000..27ecce4a1ddb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-crontab/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, setuptools
+, pytestCheckHook
+, pytest-django
+, mock
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "django-crontab";
+  version = "0.7.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "kraiz";
+    repo = "django-crontab";
+    rev = "refs/tags/${version}";
+    hash = "sha256-qX+N3SMUyhMWoWluRCeOPGYKCMBnjg61P281HXHkfJk=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    django
+    mock
+    nose
+    pytestCheckHook
+    pytest-django
+  ];
+
+  # Tests currently fail with: RuntimeError: setup_test_environment() was
+  # already called and can't be called again without first calling
+  # teardown_test_environment()
+  doCheck = false;
+
+  DJANGO_SETTINGS_MODULE = "tests.settings";
+
+  pythonImportsCheck = [ "django_crontab" ];
+
+  meta = with lib; {
+    description = "Simple crontab powered job scheduling for Django";
+    homepage = "https://github.com/kraiz/django-crontab";
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-cryptography/default.nix b/nixpkgs/pkgs/development/python-modules/django-cryptography/default.nix
new file mode 100644
index 000000000000..a49a51939403
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-cryptography/default.nix
@@ -0,0 +1,55 @@
+{ buildPythonPackage
+, cryptography
+, django
+, django-appconf
+, fetchFromGitHub
+, fetchpatch
+, lib
+, python
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "django-cryptography";
+  version = "1.1";
+  disabled = pythonOlder "3.7";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "georgemarshall";
+    repo = "django-cryptography";
+    rev = "refs/tags/${version}";
+    hash = "sha256-C3E2iT9JdLvF+1g+xhZ8dPDjjh25JUxLAtTMnalIxPk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    django
+    django-appconf
+  ];
+
+  patches = [
+    # See: https://github.com/georgemarshall/django-cryptography/pull/88
+    ./fix-setup-cfg.patch
+  ];
+
+  pythonImportsCheck = [ "django_cryptography" ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} ./runtests.py
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/georgemarshall/django-cryptography";
+    description = "A set of primitives for performing cryptography in Django";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ centromere ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-cryptography/fix-setup-cfg.patch b/nixpkgs/pkgs/development/python-modules/django-cryptography/fix-setup-cfg.patch
new file mode 100644
index 000000000000..0cb7b9dba2aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-cryptography/fix-setup-cfg.patch
@@ -0,0 +1,16 @@
+diff --git a/setup.cfg b/setup.cfg
+index 865b4c3..577d917 100644
+--- a/setup.cfg
++++ b/setup.cfg
+@@ -35,7 +35,10 @@ project_urls =
+     Documentation = https://django-cryptography.readthedocs.io
+ 
+ [options]
+-packages = django_cryptography
++packages =
++    django_cryptography
++    django_cryptography.core
++    django_cryptography.utils
+ python_requires = >=3.6
+ include_package_data = True
+ install_requires =
diff --git a/nixpkgs/pkgs/development/python-modules/django-csp/default.nix b/nixpkgs/pkgs/development/python-modules/django-csp/default.nix
new file mode 100644
index 000000000000..c54583447671
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-csp/default.nix
@@ -0,0 +1,23 @@
+{ lib, fetchPypi, buildPythonPackage, django }:
+
+buildPythonPackage rec {
+  pname = "django-csp";
+  version = "3.7";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "django_csp";
+    sha256 = "01eda02ad3f10261c74131cdc0b5a6a62b7c7ad4fd017fbefb7a14776e0a9727";
+  };
+
+  # too complicated to setup - needs a running django instance
+  doCheck = false;
+
+  propagatedBuildInputs = [ django ];
+
+  meta = with lib; {
+    description = "Adds Content-Security-Policy headers to Django";
+    homepage = "https://github.com/mozilla/django-csp";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-debug-toolbar/default.nix b/nixpkgs/pkgs/development/python-modules/django-debug-toolbar/default.nix
new file mode 100644
index 000000000000..a301a2494063
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-debug-toolbar/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, fetchFromGitHub
+, pythonOlder
+, buildPythonPackage
+, python
+, hatchling
+, django
+, jinja2
+, sqlparse
+, html5lib
+}:
+
+buildPythonPackage rec {
+  pname = "django-debug-toolbar";
+  version = "4.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "jazzband";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-hPO2q3V69kpyahav4cgUHz/3WLxXnZYCyWGetyNS+2Q=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    django
+    jinja2
+    sqlparse
+  ];
+
+  DB_BACKEND = "sqlite3";
+  DB_NAME = ":memory:";
+  TEST_ARGS = "tests";
+  DJANGO_SETTINGS_MODULE = "tests.settings";
+
+  nativeCheckInputs = [
+    html5lib
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m django test ${TEST_ARGS}
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "debug_toolbar"
+  ];
+
+  meta = with lib; {
+    description = "Configurable set of panels that display debug information about the current request/response";
+    homepage = "https://github.com/jazzband/django-debug-toolbar";
+    changelog = "https://django-debug-toolbar.readthedocs.io/en/latest/changes.html";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ yuu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-dynamic-preferences/default.nix b/nixpkgs/pkgs/development/python-modules/django-dynamic-preferences/default.nix
new file mode 100644
index 000000000000..bdb6c1d8229c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-dynamic-preferences/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# dependencies
+, django
+, persisting-theory
+, six
+
+# tests
+, djangorestframework
+, pytest-django
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "django-dynamic-preferences";
+  version = "1.15.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "agateblue";
+    repo = "django-dynamic-preferences";
+    rev = "refs/tags/${version}";
+    hash = "sha256-S0PAlSrMOQ68mX548pZzARfau/lytXWC4S5uVO1rUmo=";
+  };
+
+  buildInputs = [
+    django
+  ];
+
+  propagatedBuildInputs = [
+    six
+    persisting-theory
+  ];
+
+  nativeCheckInputs = [
+    djangorestframework
+    pytestCheckHook
+    pytest-django
+  ];
+
+  env.DJANGO_SETTINGS = "tests.settings";
+
+  meta = with lib; {
+    changelog = "https://github.com/agateblue/django-dynamic-preferences/blob/${version}/HISTORY.rst";
+    homepage = "https://github.com/EliotBerriot/django-dynamic-preferences";
+    description = "Dynamic global and instance settings for your django project";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ mmai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-encrypted-model-fields/default.nix b/nixpkgs/pkgs/development/python-modules/django-encrypted-model-fields/default.nix
new file mode 100644
index 000000000000..242d173db68a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-encrypted-model-fields/default.nix
@@ -0,0 +1,36 @@
+{ buildPythonPackage
+, cryptography
+, django
+, fetchPypi
+, lib
+, poetry-core
+, pythonOlder }:
+buildPythonPackage rec {
+  pname = "django-encrypted-model-fields";
+  version = "0.6.5";
+  disabled = pythonOlder "3.6";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-i9IcVWXA1k7E29N1rTT+potNotuHHew/px/nteQiHJk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    django
+  ];
+
+  pythonImportsCheck = [ "encrypted_model_fields" ];
+
+  meta = with lib; {
+    description = "A set of fields that wrap standard Django fields with encryption provided by the python cryptography library";
+    homepage = "https://gitlab.com/lansharkconsulting/django/django-encrypted-model-fields";
+    license = licenses.mit;
+    maintainers = with maintainers; [ centromere ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-environ/default.nix b/nixpkgs/pkgs/development/python-modules/django-environ/default.nix
new file mode 100644
index 000000000000..b0e3f6eb0c40
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-environ/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, django
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "django-environ";
+  version = "0.11.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8yqHqgiZiUwn1OF3b6a0d+gWTtf2s+QQpiptcsqvZL4=";
+  };
+
+  # The testsuite fails to modify the base environment
+  doCheck = false;
+  propagatedBuildInputs = [ django six ];
+
+  meta = with lib; {
+    description = "Utilize environment variables to configure your Django application";
+    homepage = "https://github.com/joke2k/django-environ/";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-extensions/default.nix b/nixpkgs/pkgs/development/python-modules/django-extensions/default.nix
new file mode 100644
index 000000000000..eb46b6b86920
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-extensions/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, factory-boy
+, mock
+, pip
+, pygments
+, pytest-django
+, pytestCheckHook
+, shortuuid
+, vobject
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "django-extensions";
+  version = "3.2.3";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-A2+5FBv0IhTJPkwgd7je+B9Ac64UHJEa3HRBbWr2FxM=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=django_extensions --cov-report html --cov-report term" ""
+  '';
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    factory-boy
+    mock
+    pip
+    pygments # not explicitly declared in setup.py, but some tests require it
+    pytest-django
+    pytestCheckHook
+    shortuuid
+    vobject
+    werkzeug
+  ];
+
+  disabledTestPaths = [
+    # requires network access
+    "tests/management/commands/test_pipchecker.py"
+  ];
+
+  meta = with lib; {
+    description = "A collection of custom extensions for the Django Framework";
+    homepage = "https://github.com/django-extensions/django-extensions";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-filter/default.nix b/nixpkgs/pkgs/development/python-modules/django-filter/default.nix
new file mode 100644
index 000000000000..9cfb6493e577
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-filter/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, django
+, djangorestframework
+, pytestCheckHook
+, pytest-django
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "django-filter";
+  version = "23.4";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vtBws4NZ3OfS2+BXsWXVl3MFeYY1bLgJ3tmDs2x3qXY=";
+  };
+
+  nativeBuildInputs = [ flit-core ];
+
+  propagatedBuildInputs = [ django ];
+
+  pythonImportsCheck = [
+    "django_filters"
+  ];
+
+  nativeCheckInputs = [
+    djangorestframework
+    pytestCheckHook
+    pytest-django
+  ];
+
+  env.DJANGO_SETTINGS_MODULE = "tests.settings";
+
+  meta = with lib; {
+    description = "Reusable Django application for allowing users to filter querysets dynamically";
+    homepage = "https://github.com/carltongibson/django-filter";
+    changelog = "https://github.com/carltongibson/django-filter/blob/v${version}/CHANGES.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ mmai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-formset-js-improved/default.nix b/nixpkgs/pkgs/development/python-modules/django-formset-js-improved/default.nix
new file mode 100644
index 000000000000..b14306f06f78
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-formset-js-improved/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, django-jquery-js
+}:
+
+buildPythonPackage rec {
+  pname = "django-formset-js-improved";
+  version = "0.5.0.3";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "pretix";
+    repo = "django-formset-js";
+    rev = "refs/tags/${version}";
+    hash = "sha256-bOM24ldXk9WeV0jl6LIJB3BJ5hVWLA1PJTBBnJBoprU=";
+  };
+
+  buildInputs = [
+    django
+  ];
+
+  propagatedBuildInputs = [
+    django-jquery-js
+  ];
+
+  pythonImportsCheck = [
+    "djangoformsetjs"
+  ];
+
+  doCheck = false; # no tests
+
+  meta = with lib; {
+    description = "A wrapper for a JavaScript formset helper";
+    homepage = "https://github.com/pretix/django-formset-js";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-formtools/default.nix b/nixpkgs/pkgs/development/python-modules/django-formtools/default.nix
new file mode 100644
index 000000000000..975085c8f3ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-formtools/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, django
+, fetchPypi
+, python
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "django-formtools";
+  version = "2.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-IfjV2sc38eY2+ooKEJacHDL1JabfonwpWSgnunDZZDo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m django test --settings=tests.settings
+  '';
+
+  pythonImportsCheck = [
+    "formtools"
+  ];
+
+  meta = with lib; {
+    description = "A set of high-level abstractions for Django forms";
+    homepage = "https://github.com/jazzband/django-formtools";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ greizgh schmittlauch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-google-analytics-app/default.nix b/nixpkgs/pkgs/development/python-modules/django-google-analytics-app/default.nix
new file mode 100644
index 000000000000..ad9262f844a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-google-analytics-app/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, celery
+, django
+, fetchFromGitHub
+, importlib-metadata
+, python
+, pythonOlder
+, requests
+, structlog
+}:
+
+buildPythonPackage rec {
+  pname = "django-google-analytics-app";
+  version = "6.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "praekeltfoundation";
+    repo = "django-google-analytics";
+    rev = "refs/tags/${version}";
+    hash = "sha256-0KLfGZY8qq5JGb+LJXpQRS76+qXtrf/hv6QLenm+BhQ=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    celery
+    django
+    importlib-metadata
+    requests
+    structlog
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m django check --settings=test_settings
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "google_analytics"
+  ];
+
+  meta = with lib; {
+    description = "Django Google Analytics brings the power of server side/non-js Google Analytics to your Django projects";
+    homepage = "https://github.com/praekeltfoundation/django-google-analytics/";
+    changelog = "https://github.com/praekeltfoundation/django-google-analytics/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ derdennisop ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-graphiql-debug-toolbar/default.nix b/nixpkgs/pkgs/development/python-modules/django-graphiql-debug-toolbar/default.nix
new file mode 100644
index 000000000000..26a82254a7a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-graphiql-debug-toolbar/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, django
+, django-debug-toolbar
+, graphene-django
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "django-graphiql-debug-toolbar";
+  version = "0.2.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "flavors";
+    repo = pname;
+    rev = version;
+    sha256 = "0fikr7xl786jqfkjdifymqpqnxy4qj8g3nlkgfm24wwq0za719dw";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    django
+    django-debug-toolbar
+    graphene-django
+  ];
+
+  pythonImportsCheck = [
+    "graphiql_debug_toolbar"
+  ];
+
+  DB_BACKEND = "sqlite";
+  DB_NAME = ":memory:";
+  DJANGO_SETTINGS_MODULE = "tests.settings";
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m django test tests
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Django Debug Toolbar for GraphiQL IDE";
+    homepage = "https://github.com/flavors/django-graphiql-debug-toolbar";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-gravatar2/default.nix b/nixpkgs/pkgs/development/python-modules/django-gravatar2/default.nix
new file mode 100644
index 000000000000..458723601dd7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-gravatar2/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "django-gravatar2";
+  version = "1.4.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1vn921fb6jjx7rf5dzhy66rkb71nwmh9ydd0xs9ys72icw4jh4y8";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Essential Gravatar support for Django";
+    homepage = "https://github.com/twaddington/django-gravatar";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-guardian/default.nix b/nixpkgs/pkgs/development/python-modules/django-guardian/default.nix
new file mode 100644
index 000000000000..0ae0eac3ecb8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-guardian/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, django-environ
+, mock
+, django
+, pytestCheckHook
+, pytest-django
+}:
+
+buildPythonPackage rec {
+  pname = "django-guardian";
+  version = "2.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c58a68ae76922d33e6bdc0e69af1892097838de56e93e78a8361090bcd9f89a0";
+  };
+
+  propagatedBuildInputs = [ django ];
+
+  nativeCheckInputs = [
+    django-environ
+    mock
+    pytestCheckHook
+    pytest-django
+  ];
+
+  pythonImportsCheck = [ "guardian" ];
+
+  meta = with lib; {
+    description = "Per object permissions for Django";
+    homepage = "https://github.com/django-guardian/django-guardian";
+    license = with licenses; [ mit bsd2 ];
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-haystack/default.nix b/nixpkgs/pkgs/development/python-modules/django-haystack/default.nix
new file mode 100644
index 000000000000..d9d6fb8ecd6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-haystack/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+
+# build dependencies
+, setuptools
+, setuptools-scm
+
+# dependencies
+, django
+
+# tests
+, elasticsearch
+, geopy
+, nose
+, pysolr
+, python-dateutil
+, requests
+, whoosh
+}:
+
+buildPythonPackage rec {
+  pname = "django-haystack";
+  version = "3.2.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-l+MZeu/CJf5AW28XYAolNL+CfLTWdDEwwgvBoG9yk6Q=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "geopy==" "geopy>="
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    django
+  ];
+
+  passthru.optional-dependencies = {
+    elasticsearch = [
+      elasticsearch
+    ];
+  };
+
+  doCheck = lib.versionOlder django.version "4";
+
+  nativeCheckInputs = [
+    geopy
+    nose
+    pysolr
+    python-dateutil
+    requests
+    whoosh
+  ]
+  ++ passthru.optional-dependencies.elasticsearch;
+
+  checkPhase = ''
+    runHook preCheck
+    python test_haystack/run_tests.py
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Pluggable search for Django";
+    homepage = "http://haystacksearch.org/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-hcaptcha/default.nix b/nixpkgs/pkgs/development/python-modules/django-hcaptcha/default.nix
new file mode 100644
index 000000000000..52cf7ffb7ea5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-hcaptcha/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, django
+}:
+
+buildPythonPackage rec {
+  pname = "django-hcaptcha";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "django-hCaptcha";
+    hash = "sha256-slGerwzJeGWscvglMBEixc9h4eSFLWiVmUFgIirLbBo=";
+  };
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  # No tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "hcaptcha" ];
+
+  meta = with lib; {
+    description = "Django hCaptcha provides a simple way to protect your django forms using hCaptcha";
+    homepage = "https://github.com/AndrejZbin/django-hcaptcha";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ambroisie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-health-check/default.nix b/nixpkgs/pkgs/development/python-modules/django-health-check/default.nix
new file mode 100644
index 000000000000..f4bb2db23c17
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-health-check/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, sphinx
+, setuptools-scm
+, django
+, redis
+, celery
+, pytest-django
+, pytestCheckHook
+, mock
+, gitMinimal }:
+
+buildPythonPackage rec {
+  pname = "django-health-check";
+  version = "3.17.0";
+
+  src = fetchFromGitHub {
+    owner = "KristianOellegaard";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-f87dgB2pDc+A0h41FX13qTj6Zzw5I4QwsDoC6yPkvAE=";
+    leaveDotGit = true;
+  };
+
+  buildInputs = [
+    sphinx
+    django
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+    gitMinimal
+  ];
+
+  nativeCheckInputs = [
+    pytest-django
+    pytestCheckHook
+    mock
+    celery
+    redis
+  ];
+
+  postPatch = ''
+    # We don't want to generate coverage
+    substituteInPlace setup.cfg \
+      --replace "pytest-runner" "" \
+      --replace "--cov=health_check" "" \
+      --replace "--cov-report=term" "" \
+      --replace "--cov-report=xml" ""
+  '';
+
+  pythonImportsCheck = [ "health_check" ];
+
+  meta = with lib; {
+    description = "Pluggable app that runs a full check on the deployment";
+    homepage = "https://github.com/KristianOellegaard/django-health-check";
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-hierarkey/default.nix b/nixpkgs/pkgs/development/python-modules/django-hierarkey/default.nix
new file mode 100644
index 000000000000..77f33f0b526c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-hierarkey/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# propagates
+, python-dateutil
+
+# tests
+, django-extensions
+, pytest-django
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "django-hierarkey";
+  version = "1.1.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "raphaelm";
+    repo = "django-hierarkey";
+    # https://github.com/raphaelm/django-hierarkey/commit/c81ace02ca404a8756e2931bb6faf55b6365e140
+    rev = "c81ace02ca404a8756e2931bb6faf55b6365e140";
+    hash = "sha256-sCARyTjuuAUptlOsFmApnsQpcksP+uYnq0lukXDMcuk=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+  ];
+
+  pythonImportsCheck = [
+    "hierarkey"
+  ];
+
+  nativeCheckInputs = [
+    django-extensions
+    pytest-django
+    pytestCheckHook
+  ];
+
+  DJANGO_SETTINGS_MODULE = "tests.settings";
+
+  pytestFlagsArray = [
+    "tests"
+  ];
+
+  meta = with lib; {
+    description = "Flexible and powerful hierarchical key-value store for your Django models";
+    homepage = "https://github.com/raphaelm/django-hierarkey";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-hijack/default.nix b/nixpkgs/pkgs/development/python-modules/django-hijack/default.nix
new file mode 100644
index 000000000000..5832d9a06933
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-hijack/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, fetchFromGitHub
+, fetchNpmDeps
+, buildPythonPackage
+, nix-update-script
+
+# build-system
+, gettext
+, nodejs
+, npmHooks
+, setuptools-scm
+
+# dependencies
+, django
+
+# tests
+, pytest-django
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "django-hijack";
+  version = "3.4.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "django-hijack";
+    repo = "django-hijack";
+    rev = "refs/tags/${version}";
+    hash = "sha256-E5gM/5MIB65gdyv/I+Kuw8rbjPvtUnbCPXpasaIDzyo=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'cmd = ["npm", "ci"]' 'cmd = ["true"]' \
+      --replace 'f"{self.build_lib}/{name}.mo"' 'f"{name}.mo"'
+
+    sed -i "/addopts/d" setup.cfg
+  '';
+
+  npmDeps = fetchNpmDeps {
+    inherit src;
+    hash = "sha256-4ZVb+V/oYfflIZdme6hbpoSBFVV7lk5wLfEzzBqZv/Y=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    gettext
+    nodejs
+    npmHooks.npmConfigHook
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-django
+  ];
+
+  env.DJANGO_SETTINGS_MODULE = "hijack.tests.test_app.settings";
+
+  pytestFlagsArray = [
+    "--pyargs" "hijack"
+    "-W" "ignore::DeprecationWarning"
+  ];
+
+  # needed for npmDeps update
+  passthru.updateScript = nix-update-script { };
+
+  meta = with lib; {
+    description = "Allows superusers to hijack (=login as) and work on behalf of another user";
+    homepage = "https://github.com/arteria/django-hijack";
+    changelog = "https://github.com/django-hijack/django-hijack/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ris ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-i18nfield/default.nix b/nixpkgs/pkgs/development/python-modules/django-i18nfield/default.nix
new file mode 100644
index 000000000000..62d0770a693a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-i18nfield/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# tests
+, djangorestframework
+, html5lib
+, lxml
+, pytest-django
+, pytestCheckHook
+, pyyaml
+}:
+
+buildPythonPackage {
+  pname = "django-i18nfield";
+  version = "1.9.4";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "raphaelm";
+    repo = "django-i18nfield";
+    rev = "10488eb6c673be50e50387c76085a7c8d84e9157";
+    hash = "sha256-FF980LTw7RFuG9QgxA96yJsSczCNNMq9WsbacQqIReE=";
+  };
+
+  env.DJANGO_SETTINGS_MODULE = "tests.settings";
+
+  nativeCheckInputs = [
+    djangorestframework
+    html5lib
+    lxml
+    pytest-django
+    pytestCheckHook
+    pyyaml
+  ];
+
+  meta = with lib; {
+    description = "Store internationalized strings in Django models";
+    homepage = "https://github.com/raphaelm/django-i18nfield";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-import-export/default.nix b/nixpkgs/pkgs/development/python-modules/django-import-export/default.nix
new file mode 100644
index 000000000000..33e74e3c70f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-import-export/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, chardet
+, diff-match-patch
+, django
+, fetchFromGitHub
+, psycopg2
+, python
+, pythonOlder
+, pytz
+, tablib
+}:
+
+buildPythonPackage rec {
+  pname = "django-import-export";
+  version = "3.3.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "django-import-export";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-pV8esZBK1ne2Cl0NBejEi2wLu7HbqTnKG16MU/gl4Ig=";
+  };
+
+  propagatedBuildInputs = [
+    diff-match-patch
+    django
+    tablib
+  ] ++ (with tablib.optional-dependencies; html ++ ods ++ xls ++ xlsx ++ yaml);
+
+  nativeCheckInputs = [
+    chardet
+    psycopg2
+    pytz
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} tests/manage.py test core --settings=settings
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "import_export"
+  ];
+
+  meta = with lib; {
+    description = "Django application and library for importing and exporting data with admin integration";
+    homepage = "https://github.com/django-import-export/django-import-export";
+    changelog = "https://github.com/django-import-export/django-import-export/blob/${version}/docs/changelog.rst";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ sephi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-ipware/default.nix b/nixpkgs/pkgs/development/python-modules/django-ipware/default.nix
new file mode 100644
index 000000000000..799409f61966
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-ipware/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, django
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "django-ipware";
+  version = "6.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-AjM0Ht3MGd5E9GPdPlPIfvncxRn8dKmZEc6+m1gZdUk=";
+  };
+
+  propagatedBuildInputs = [ django ];
+
+  # django.core.exceptions.ImproperlyConfigured: Requested setting IPWARE_TRUSTED_PROXY_LIST, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
+  doCheck = false;
+
+  # pythonImportsCheck fails with:
+  # django.core.exceptions.ImproperlyConfigured: Requested setting IPWARE_META_PRECEDENCE_ORDER, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
+
+  meta = with lib; {
+    description = "A Django application to retrieve user's IP address";
+    homepage = "https://github.com/un33k/django-ipware";
+    changelog = "https://github.com/un33k/django-ipware/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-jinja2/default.nix b/nixpkgs/pkgs/development/python-modules/django-jinja2/default.nix
new file mode 100644
index 000000000000..77d50b65ce6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-jinja2/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, django
+, jinja2
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "django-jinja";
+  version = "2.11.0";
+
+  disabled = pythonOlder "3.8";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "niwinz";
+    repo = "django-jinja";
+    rev = "refs/tags/${version}";
+    hash = "sha256-0gkv9xinHux8TRiNBLl/JgcimXU3CzysxzGR2jn7OZ4=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    jinja2
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    ${python.interpreter} testing/runtests.py
+
+    runHook postCheck
+  '';
+
+  meta = {
+    description = "Simple and nonobstructive jinja2 integration with Django";
+    homepage = "https://github.com/niwinz/django-jinja";
+    changelog = "https://github.com/niwinz/django-jinja/blob/${src.rev}/CHANGES.adoc";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-jquery-js/default.nix b/nixpkgs/pkgs/development/python-modules/django-jquery-js/default.nix
new file mode 100644
index 000000000000..2487dc61e0fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-jquery-js/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromBitbucket
+, django
+}:
+
+buildPythonPackage rec {
+  pname = "django-jquery-js";
+  version = "3.1.1";
+  format = "setuptools";
+
+  src = fetchFromBitbucket {
+    owner = "tim_heap";
+    repo = "django-jquery";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-TzMo31jFhcvlrmq2TJgQyds9n8eATaChnyhnQ7bwdzs=";
+  };
+
+  buildInputs = [
+    django
+  ];
+
+  pythonImportsCheck = [
+    "jquery"
+  ];
+
+  doCheck = false; # no tests
+
+  meta = with lib; {
+    description = "jQuery, bundled up so apps can depend upon it";
+    homepage = "https://bitbucket.org/tim_heap/django-jquery";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-js-asset/default.nix b/nixpkgs/pkgs/development/python-modules/django-js-asset/default.nix
new file mode 100644
index 000000000000..f579a31dc3e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-js-asset/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, django
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "django-js-asset";
+  version = "2.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "matthiask";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-rxJ9TgVBiJByiFSLTg/dtAR31Fs14D4sh2axyBcKGTU=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  pythonImportsCheck = [
+    "js_asset"
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} tests/manage.py test testapp
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Script tag with additional attributes for django.forms.Media";
+    homepage = "https://github.com/matthiask/django-js-asset";
+    maintainers = with maintainers; [ hexa ];
+    license = with licenses; [ bsd3 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-js-reverse/default.nix b/nixpkgs/pkgs/development/python-modules/django-js-reverse/default.nix
new file mode 100644
index 000000000000..a6f31a05c8f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-js-reverse/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, pythonAtLeast
+, fetchpatch
+, fetchFromGitHub
+, python
+, django
+, packaging
+, nodejs
+, js2py
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "django-js-reverse";
+  version = "0.10.1-b1";
+
+  src = fetchFromGitHub {
+    owner = "BITSOLVER";
+    repo = "django-js-reverse";
+    rev = version;
+    hash = "sha256-i78UsxVwxyDAc8LrOVEXLG0tdidoQhvUx7GvPDaH0KY=";
+  };
+
+  propagatedBuildInputs = [
+    django
+  ] ++ lib.optionals (pythonAtLeast "3.7") [
+    packaging
+  ];
+
+  nativeCheckInputs = [
+    nodejs
+    js2py
+    six
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} django_js_reverse/tests/unit_tests.py
+  '';
+
+  pythonImportsCheck = [ "django_js_reverse" ];
+
+  meta = with lib; {
+    description = "Javascript url handling for Django that doesn't hurt";
+    homepage = "https://django-js-reverse.readthedocs.io/en/latest/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ambroisie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-leaflet/default.nix b/nixpkgs/pkgs/development/python-modules/django-leaflet/default.nix
new file mode 100644
index 000000000000..7ea1ba4a58d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-leaflet/default.nix
@@ -0,0 +1,39 @@
+{ pkgs
+, buildPythonPackage
+, django
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "django-leaflet";
+  version = "0.29.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-L23Ixxh/0i5itvK3tC7thpIPgb7DEqplSYHr5byOCGY=";
+  };
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  # The tests seem to be impure.
+  # They are throwing a error about unset configs:
+  # > django.core.exceptions.ImproperlyConfigured: Requested setting LEAFLET_CONFIG, but settings are not configured.
+  doCheck = false;
+
+  # This dosn't work either because of the same exception as above
+  # pythonImportsCheck = [ "leaflet" ];
+
+  meta = with pkgs.lib; {
+    description = "Allows you to use Leaflet in your Django projects";
+    homepage = "https://github.com/makinacorpus/django-leaflet";
+    changelog = "https://github.com/makinacorpus/django-leaflet/blob/${version}/CHANGES";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ janik ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-libsass/default.nix b/nixpkgs/pkgs/development/python-modules/django-libsass/default.nix
new file mode 100644
index 000000000000..181abfafd148
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-libsass/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# dependencies
+, django-compressor
+, libsass
+
+# tests
+, django
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "django-libsass";
+  version = "0.9";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "torchbox";
+    repo = "django-libsass";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-54AlRVmit0rtG1jx7O+XyA1vXLHCfoNPjHkHCQaaybA=";
+  };
+
+  propagatedBuildInputs = [
+    django-compressor
+    libsass
+  ];
+
+  nativeCheckInputs = [
+    django
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} ./runtests.py
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "A django-compressor filter to compile SASS files using libsass";
+    homepage = "https://github.com/torchbox/django-libsass";
+    changelog = "https://github.com/torchbox/django-libsass/blob/${src.rev}/CHANGELOG.txt";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-localflavor/default.nix b/nixpkgs/pkgs/development/python-modules/django-localflavor/default.nix
new file mode 100644
index 000000000000..5f63532ad96e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-localflavor/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# bring your own
+, django
+
+# propagates
+, python-stdnum
+
+# tests
+, pytest-django
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "django-localflavor";
+  version = "4.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "django";
+    repo = "django-localflavor";
+    rev = "refs/tags/${version}";
+    hash = "sha256-UWp3ei1VlEsEfjbJIE+MpffSzYF4X1HEQw+z+5kZoP0=";
+  };
+
+  buildInputs = [
+    django
+  ];
+
+  propagatedBuildInputs = [
+    python-stdnum
+  ];
+
+  pythonImportsCheck = [
+    # samples
+    "localflavor.ar"
+    "localflavor.de"
+    "localflavor.fr"
+    "localflavor.my"
+    "localflavor.nl"
+    "localflavor.us"
+    "localflavor.za"
+  ];
+
+  checkInputs = [
+    pytest-django
+    pytestCheckHook
+  ];
+
+  DJANGO_SETTINGS_MODULE = "tests.settings";
+
+  meta = with lib; {
+    description = "Country-specific Django helpers";
+    homepage = "https://github.com/django/django-localflavor";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-logentry-admin/default.nix b/nixpkgs/pkgs/development/python-modules/django-logentry-admin/default.nix
new file mode 100644
index 000000000000..b3287b6f5223
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-logentry-admin/default.nix
@@ -0,0 +1,29 @@
+{ lib, fetchFromGitHub, buildPythonPackage, django, pytest, pytest-django }:
+
+buildPythonPackage rec {
+  pname = "django-logentry-admin";
+  version = "1.1.0";
+
+  src = fetchFromGitHub {
+    owner = "yprez";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1bndxgvisw8kk52zfdifvly6dl4833wqilxf77pg473172yaf5gq";
+  };
+
+  nativeCheckInputs = [ pytest pytest-django ];
+  checkPhase = ''
+    rm -r logentry_admin __init__.py
+    pytest
+  '';
+
+  propagatedBuildInputs = [ django ];
+
+  meta = with lib; {
+    description = "Show all LogEntry objects in the Django admin site";
+    homepage = "https://github.com/yprez/django-logentry-admin";
+    license = licenses.isc;
+    maintainers = with maintainers; [ mrmebelman ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/django-login-required-middleware/default.nix b/nixpkgs/pkgs/development/python-modules/django-login-required-middleware/default.nix
new file mode 100644
index 000000000000..6c69ef7ef27a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-login-required-middleware/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, django
+, djangorestframework
+, fetchFromGitHub
+, python
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "django-login-required-middleware";
+  version = "0.9.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "CleitonDeLima";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-WFQ/JvKh6gkUxPV27QBd2TzwFS8hfQGmcTInTnmh6iA=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  checkInputs = [
+    djangorestframework
+  ];
+
+  pythonImportsCheck = [
+    "login_required"
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m django test --settings tests.settings
+  '';
+
+  meta = with lib; {
+    description = "Requires login to all requests through middleware in Django";
+    homepage = "https://github.com/CleitonDeLima/django-login-required-middleware";
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-mailman3/default.nix b/nixpkgs/pkgs/development/python-modules/django-mailman3/default.nix
new file mode 100644
index 000000000000..f5942b9b9bf4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-mailman3/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+
+# propagates
+, django-gravatar2
+, django-allauth
+, mailmanclient
+, pytz
+
+# tests
+, django
+, pytest-django
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "django-mailman3";
+  version = "1.3.9";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GpI1W0O9aJpLF/mcS23ktJDZsP69S2zQy7drOiWBnTM=";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://gitlab.com/mailman/django-mailman3/-/commit/840d0d531a0813de9a30e72427e202aea21b40fe.patch";
+      hash = "sha256-vltvsIP/SWpQZeXDUB+GWlTu+ghFMUqIT8i6CrYcmGo=";
+    })
+    (fetchpatch {
+      url = "https://gitlab.com/mailman/django-mailman3/-/commit/25c55e31d28f2fa8eb23f0e83c12f9b0a05bfbf0.patch";
+      hash = "sha256-ug5tBmnVfJTn5ufDDVg/cEtsZM59jQYJpQZV51T3qIc=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'django>=3.2,<4.2' 'django>=3.2,<4.3'
+  '';
+
+  propagatedBuildInputs = [
+    django-allauth
+    django-gravatar2
+    mailmanclient
+    pytz
+  ];
+
+  nativeCheckInputs = [
+    django
+    pytest-django
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "django_mailman3"
+  ];
+
+  meta = with lib; {
+    description = "Django library for Mailman UIs";
+    homepage = "https://gitlab.com/mailman/django-mailman3";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ qyliss ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-maintenance-mode/default.nix b/nixpkgs/pkgs/development/python-modules/django-maintenance-mode/default.nix
new file mode 100644
index 000000000000..8dd2ad71b242
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-maintenance-mode/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, fetchFromGitHub
+, fetchpatch
+, buildPythonPackage
+, django
+, python-fsutil
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "django-maintenance-mode";
+  version = "0.18.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fabiocaccamo";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Mcj8O20hCINGf5T3PCG9jq0onSrm4R+Ke5CLMqMDmuU=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "fix-broken-test.patch";
+      url = "https://github.com/fabiocaccamo/django-maintenance-mode/commit/68cde8d9ceef00eeaa2068f420698c1c562fa9fc.patch";
+      hash = "sha256-K/zYYkcnmWGc7Knz4l9PgvUtT0IccPRXc3UFriC1ldc=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    django
+    python-fsutil
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    ${python.interpreter} runtests.py
+
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Shows a 503 error page when maintenance-mode is on";
+    homepage = "https://github.com/fabiocaccamo/django-maintenance-mode";
+    changelog = "https://github.com/fabiocaccamo/django-maintenance-mode/releases/tag/${version}";
+    maintainers = with maintainers; [ mrmebelman ];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-markup/default.nix b/nixpkgs/pkgs/development/python-modules/django-markup/default.nix
new file mode 100644
index 000000000000..ed33d0937236
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-markup/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, django
+
+# optionals
+, bleach
+, docutils
+, markdown
+, pygments
+, python-creole
+, smartypants
+, textile
+
+# tests
+, pytest-django
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "django-markup";
+  version = "1.8.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bartTC";
+    repo = "django-markup";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Hhcp4wVJEcYV1lEZ2jWf7nOlt5m4lVAfC6VmKIdxf4c=";
+  };
+
+  postPatch = ''
+    sed -i "/--cov/d" pyproject.toml
+  '';
+
+  buildInputs = [
+    django
+  ];
+
+  passthru.optional-dependencies = {
+    all_filter_dependencies = [
+      bleach
+      docutils
+      markdown
+      pygments
+      python-creole
+      smartypants
+      textile
+    ];
+  };
+
+  pythonImportsCheck = [
+    "django_markup"
+  ];
+
+  nativeCheckInputs = [
+    pytest-django
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.all_filter_dependencies;
+
+  env.DJANGO_SETTINGS_MODULE = "django_markup.tests";
+
+  meta = with lib; {
+    description = "Generic Django application to convert text with specific markup to html.";
+    homepage = "https://github.com/bartTC/django-markup";
+    changelog = "https://github.com/bartTC/django-markup/blob/v${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-model-utils/default.nix b/nixpkgs/pkgs/development/python-modules/django-model-utils/default.nix
new file mode 100644
index 000000000000..648634b0f32c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-model-utils/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, freezegun
+, psycopg2
+, pytest-django
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "django-model-utils";
+  version = "4.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "jazzband";
+    repo = "django-model-utils";
+    rev = "refs/tags/${version}";
+    hash = "sha256-p3/JO6wNwZPYX7MIgMj/0caHt5s+uL51Sxa28/VITxo=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  # requires postgres database
+  doCheck = false;
+
+  nativeCheckInputs = [
+    freezegun
+    psycopg2
+    pytest-django
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "model_utils" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jazzband/django-model-utils";
+    description = "Django model mixins and utilities";
+    changelog = "https://github.com/jazzband/django-model-utils/blob/${version}/CHANGES.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-modelcluster/default.nix b/nixpkgs/pkgs/development/python-modules/django-modelcluster/default.nix
new file mode 100644
index 000000000000..5ad43dfc9b1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-modelcluster/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# dependencies
+, django
+, pytz
+
+# optionals
+, django-taggit
+
+# tests
+, pytest-django
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "django-modelcluster";
+  version = "6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "wagtail";
+    repo = "modelcluster";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-p6hvOkPWRVJYLHvwyn9nS05wblikRFmlSYZuLiCcuqc=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    pytz
+  ];
+
+  passthru.optional-dependencies.taggit = [
+    django-taggit
+  ];
+
+  env.DJANGO_SETTINGS_MODULE = "tests.settings";
+
+  nativeCheckInputs = [
+    pytest-django
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.taggit;
+
+  # https://github.com/wagtail/django-modelcluster/issues/173
+  disabledTests = lib.optionals (lib.versionAtLeast django.version "4.2") [
+    "test_formfield_callback"
+  ];
+
+  meta = with lib; {
+    description = "Django extension to allow working with 'clusters' of models as a single unit, independently of the database";
+    homepage = "https://github.com/torchbox/django-modelcluster/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ desiderius ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-mptt/default.nix b/nixpkgs/pkgs/development/python-modules/django-mptt/default.nix
new file mode 100644
index 000000000000..53dac2a781f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-mptt/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, django-js-asset
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "django-mptt";
+  version = "0.13.4";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    sha256 = "12y3chxhqxk2yxin055f0f45nabj0s8hil12hw0lwzlbax6k9ss6";
+  };
+
+  propagatedBuildInputs = [
+    django
+    django-js-asset
+  ];
+
+  pythonImportsCheck = [
+    "mptt"
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} tests/manage.py test
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Utilities for implementing a modified pre-order traversal tree in Django";
+    homepage = "https://github.com/django-mptt/django-mptt";
+    maintainers = with maintainers; [ hexa ];
+    license = with licenses; [ mit ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-multiselectfield/default.nix b/nixpkgs/pkgs/development/python-modules/django-multiselectfield/default.nix
new file mode 100644
index 000000000000..046c60989a74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-multiselectfield/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, django
+}:
+
+buildPythonPackage rec {
+  pname = "django-multiselectfield";
+  version = "0.1.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ygra8s394d1szgj7yawlca17q08hygsrzvq2k3k48zvd0awg96h";
+  };
+
+  propagatedBuildInputs = [ django ];
+
+  # No tests
+  doCheck = false;
+
+  meta = {
+    description = "django-multiselectfield";
+    homepage = "https://github.com/goinnn/django-multiselectfield";
+    license = lib.licenses.lgpl3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-mysql/default.nix b/nixpkgs/pkgs/development/python-modules/django-mysql/default.nix
new file mode 100644
index 000000000000..9db6be33ed0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-mysql/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, setuptools
+
+# dependencies
+, django
+, mysqlclient
+
+# tests
+, pytest-django
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "django-mysql";
+  version = "4.12.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "adamchainz";
+    repo = "django-mysql";
+    rev = "refs/tags/${version}";
+    hash = "sha256-AieI6zUPFXQsrvoms5bu/Bb3J+DvfLA4rCCsjhYBEZQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  buildInputs = [
+    django
+    mysqlclient
+  ];
+
+  doCheck = false; # requires mysql/mariadb server
+
+  env.DJANGO_SETTINGS_MODULE = "tests.settings";
+
+  nativeCheckInputs = [
+    pytest-django
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/adamchainz/django-mysql/blob/${version}/docs/changelog.rst";
+    description = "Extensions to Django for use with MySQL/MariaD";
+    homepage = "https://github.com/adamchainz/django-mysql";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-ninja/default.nix b/nixpkgs/pkgs/development/python-modules/django-ninja/default.nix
new file mode 100644
index 000000000000..620960797ea0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-ninja/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, django
+, fetchFromGitHub
+, flit-core
+, psycopg2
+, pydantic
+, pytest-asyncio
+, pytest-django
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "django-ninja";
+  version = "0.22.2";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "vitalik";
+    repo = "django-ninja";
+    rev = "v${version}";
+    hash = "sha256-oeisurp9seSn3X/5jFF9DMm9nU6uDYIU1b6/J3o2be0=";
+  };
+
+  propagatedBuildInputs = [ django pydantic ];
+
+  nativeBuildInputs = [ flit-core ];
+
+  nativeCheckInputs = [
+    psycopg2
+    pytest-asyncio
+    pytest-django
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/vitalik/django-ninja/releases/tag/v${version}";
+    description = "Web framework for building APIs with Django and Python type hints";
+    homepage = "https://django-ninja.rest-framework.com/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ elohmeier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-nose/default.nix b/nixpkgs/pkgs/development/python-modules/django-nose/default.nix
new file mode 100644
index 000000000000..2506f6aba44a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-nose/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, django
+}:
+
+buildPythonPackage rec {
+  pname = "django-nose";
+  version = "1.4.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a4885cd002d65fd2de96e2bb2563ef477c3fbe207009360c015fca5c3b5561b7";
+  };
+
+  # vast dependency list
+  doCheck = false;
+
+  propagatedBuildInputs = [ django nose ];
+
+  meta = with lib; {
+    description = "Provides all the goodness of nose in your Django tests";
+    homepage = "https://github.com/django-nose/django-nose";
+    license = licenses.bsd3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-oauth-toolkit/default.nix b/nixpkgs/pkgs/development/python-modules/django-oauth-toolkit/default.nix
new file mode 100644
index 000000000000..ce03a1330f5f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-oauth-toolkit/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonRelaxDepsHook
+
+# propagates
+, django
+, jwcrypto
+, requests
+, oauthlib
+
+# tests
+, djangorestframework
+, pytest-django
+, pytest-xdist
+, pytest-mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "django-oauth-toolkit";
+  version = "2.3.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "jazzband";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-oGg5MD9p4PSUVkt5pGLwjAF4SHHf4Aqr+/3FsuFaybY=";
+  };
+
+  postPatch = ''
+    sed -i '/cov/d' tox.ini
+  '';
+
+  propagatedBuildInputs = [
+    django
+    jwcrypto
+    oauthlib
+    requests
+  ];
+
+  nativeBuildInputs = [ pythonRelaxDepsHook ];
+  pythonRelaxDeps = [
+    "django"
+  ];
+
+  DJANGO_SETTINGS_MODULE = "tests.settings";
+
+  # xdist is disabled right now because it can cause race conditions on high core machines
+  # https://github.com/jazzband/django-oauth-toolkit/issues/1300
+  nativeCheckInputs = [
+    djangorestframework
+    pytest-django
+    # pytest-xdist
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Failed to get a valid response from authentication server. Status code: 404, Reason: Not Found.
+    "test_response_when_auth_server_response_return_404"
+  ];
+
+  meta = with lib; {
+    description = "OAuth2 goodies for the Djangonauts";
+    homepage = "https://github.com/jazzband/django-oauth-toolkit";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ mmai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-otp/default.nix b/nixpkgs/pkgs/development/python-modules/django-otp/default.nix
new file mode 100644
index 000000000000..b2417303133b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-otp/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, freezegun
+, pythonOlder
+, qrcode
+}:
+
+buildPythonPackage rec {
+  pname = "django-otp";
+  version = "1.1.3";
+  disabled = pythonOlder "3";
+
+  src = fetchFromGitHub {
+    owner = "django-otp";
+    repo = "django-otp";
+    rev = "v${version}";
+    hash = "sha256-Ac9p7q9yaUr3WTTGxCY16Yo/Z8i1RtnD2g0Aj2pqSXY=";
+  };
+
+  postPatch = ''
+    patchShebangs manage.py
+  '';
+
+  propagatedBuildInputs = [
+    django
+    qrcode
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+  ];
+
+  checkPhase = ''
+    ./manage.py test django_otp
+  '';
+
+  pythonImportsCheck = [ "django_otp" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jazzband/django-model-utils";
+    description = "Pluggable framework for adding two-factor authentication to Django using one-time passwords";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-paintstore/default.nix b/nixpkgs/pkgs/development/python-modules/django-paintstore/default.nix
new file mode 100644
index 000000000000..28a773a5c01b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-paintstore/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "django-paintstore";
+  version = "0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "12wxgwv1qbkfq7w5i7bm7aidv655c2sxp0ym73qf8606dxbjcwwg";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Django app that integrates jQuery ColorPicker with the Django admin";
+    homepage = "https://github.com/gsiegman/django-paintstore";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-parler/default.nix b/nixpkgs/pkgs/development/python-modules/django-parler/default.nix
new file mode 100644
index 000000000000..3afaa8ae262c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-parler/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, django
+, fetchFromGitHub
+, pytest
+, pytest-django
+, pythonOlder
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "django-parler";
+  version = "2.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "django-parler";
+    repo = "django-parler";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-tRGifFPCXF3aa3PQWKw3tl1H1TY+lgcChUP1VdwG1cE=";
+  };
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} runtests.py
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Simple Django model translations without nasty hacks";
+    homepage = "https://github.com/django-parler/django-parler";
+    changelog = "https://github.com/django-parler/django-parler/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ derdennisop ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-pattern-library/default.nix b/nixpkgs/pkgs/development/python-modules/django-pattern-library/default.nix
new file mode 100644
index 000000000000..76d376d11c09
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-pattern-library/default.nix
@@ -0,0 +1,67 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, lib
+
+# build-system
+, poetry-core
+
+# dependencies
+, django
+, markdown
+, pyyaml
+
+# tests
+, beautifulsoup4
+, pytestCheckHook
+, pytest-django
+}:
+
+buildPythonPackage rec {
+  pname = "django-pattern-library";
+  version = "1.0.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "torchbox";
+    repo = "django-pattern-library";
+    rev = "v${version}";
+    hash = "sha256-Q8rv7RDlstTSlwmbmHV0vrnCV/lwz6VJf27BUllA34Y=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # https://github.com/torchbox/django-pattern-library/pull/232
+      url = "https://github.com/torchbox/django-pattern-library/commit/e7a9a8928a885941391fb584eba81578a292ee7d.patch";
+      hash = "sha256-3uUoxdVYEiF+to88qZRhOkh1++RfmsqCzO9JNMDqz6g=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    django
+    pyyaml
+    markdown
+  ];
+
+  nativeCheckInputs = [
+    beautifulsoup4
+    pytestCheckHook
+    pytest-django
+  ];
+
+  env.DJANGO_SETTINGS_MODULE = "tests.settings.dev";
+
+  pythonImportsCheck = [ "pattern_library" ];
+
+  meta = with lib; {
+    description = "UI pattern libraries for Django templates";
+    homepage = "https://github.com/torchbox/django-pattern-library/";
+    changelog = "https://github.com/torchbox/django-pattern-library/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ sephi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-payments/default.nix b/nixpkgs/pkgs/development/python-modules/django-payments/default.nix
new file mode 100644
index 000000000000..577a2ca5132e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-payments/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, braintree
+, cryptography
+, django
+, django-phonenumber-field
+, fetchFromGitHub
+, mercadopago
+, pythonOlder
+, requests
+, setuptools-scm
+, sphinx-rtd-theme
+, stripe
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "django-payments";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jazzband";
+    repo = "django-payments";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-6WPV08CV+rko/tRnsT5GyTGYaJbiIKTvpisfRwizBIo=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "django-phonenumber-field[phonenumberslite]" "django-phonenumber-field"
+  '';
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    django
+    django-phonenumber-field
+    requests
+  ] ++ django-phonenumber-field.optional-dependencies.phonenumbers;
+
+  # require internet connection
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "payments"
+  ];
+
+  passthru.optional-dependencies = {
+    all = [ braintree /* suds-community */ mercadopago cryptography xmltodict stripe ];
+    braintree = [ braintree ];
+    cybersource = [ /* suds-community */ ];
+    docs = [ sphinx-rtd-theme ];
+    mercadopago = [ mercadopago ];
+    sagepay = [ cryptography ];
+    sofort = [ xmltodict ];
+    stripe = [ stripe ];
+  };
+
+  meta = with lib; {
+    description = "Universal payment handling for Django.";
+    homepage = "https://github.com/jazzband/django-payments/";
+    changelog = "https://github.com/jazzband/django-payments/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ derdennisop ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-pglocks/default.nix b/nixpkgs/pkgs/development/python-modules/django-pglocks/default.nix
new file mode 100644
index 000000000000..a84850a1fda9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-pglocks/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, django, six }:
+
+buildPythonPackage rec {
+  pname = "django-pglocks";
+  version = "1.0.4";
+
+  meta = {
+    description = "PostgreSQL locking context managers and functions for Django.";
+    homepage = "https://github.com/Xof/django-pglocks";
+    license = lib.licenses.mit;
+  };
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3c47c66fbfbd268ef46269673a0516a039539b0972b8ed2ec9cfee44c4b65523";
+  };
+
+  buildInputs = [ django ];
+  propagatedBuildInputs = [ django six ];
+
+  # tests need a postgres database
+  doCheck = false;
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-phonenumber-field/default.nix b/nixpkgs/pkgs/development/python-modules/django-phonenumber-field/default.nix
new file mode 100644
index 000000000000..41b3dee76f42
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-phonenumber-field/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, babel
+, buildPythonPackage
+, django
+, djangorestframework
+, fetchFromGitHub
+, phonenumbers
+, python
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "django-phonenumber-field";
+  version = "7.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "stefanfoulis";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-QEmwCdSiaae7mhmCPcV5F01f1GRxmIur3tyhv0XK7I4=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    django
+  ] ++ passthru.optional-dependencies.phonenumbers;
+
+  nativeCheckInputs = [
+    babel
+    djangorestframework
+  ];
+
+  pythonImportsCheck = [
+    "phonenumber_field"
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m django test --settings tests.settings
+  '';
+
+  passthru.optional-dependencies = {
+    phonenumbers = [ phonenumbers ];
+  };
+
+  meta = with lib; {
+    description = "A django model and form field for normalised phone numbers using python-phonenumbers";
+    homepage = "https://github.com/stefanfoulis/django-phonenumber-field/";
+    changelog = "https://github.com/stefanfoulis/django-phonenumber-field/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sephi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-picklefield/default.nix b/nixpkgs/pkgs/development/python-modules/django-picklefield/default.nix
new file mode 100644
index 000000000000..b1dab2e73c91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-picklefield/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchFromGitHub, django, pytest, pytest-django, python }:
+
+buildPythonPackage rec {
+  pname = "django-picklefield";
+  version = "3.0.1";
+  format = "setuptools";
+
+  # The PyPi source doesn't contain tests
+  src = fetchFromGitHub {
+    owner = "gintas";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0ni7bc86k0ra4pc8zv451pzlpkhs1nyil1sq9jdb4m2mib87b5fk";
+  };
+
+  propagatedBuildInputs = [ django ];
+
+  # Tests are failing with Django 3.2
+  # https://github.com/gintas/django-picklefield/issues/58
+  doCheck = false;
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m django test --settings=tests.settings
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "A pickled object field for Django";
+    homepage = "https://github.com/gintas/django-picklefield";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-polymorphic/default.nix b/nixpkgs/pkgs/development/python-modules/django-polymorphic/default.nix
new file mode 100644
index 000000000000..6db31decd287
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-polymorphic/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchFromGitHub, python, django, dj-database-url }:
+
+buildPythonPackage rec {
+  pname = "django-polymorphic";
+  version = "3.1";
+
+  src = fetchFromGitHub {
+    owner = "django-polymorphic";
+    repo = "django-polymorphic";
+    rev = "v${version}";
+    hash = "sha256-JJY+FoMPSnWuSsNIas2JedGJpdm6RfPE3E1VIjGuXIc=";
+  };
+
+  propagatedBuildInputs = [ django ];
+
+  nativeCheckInputs = [ dj-database-url ];
+
+  checkPhase = ''
+    ${python.interpreter} runtests.py
+  '';
+
+  pythonImportsCheck = [ "polymorphic" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/django-polymorphic/django-polymorphic";
+    description = "Improved Django model inheritance with automatic downcasting";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-postgresql-netfields/default.nix b/nixpkgs/pkgs/development/python-modules/django-postgresql-netfields/default.nix
new file mode 100644
index 000000000000..1f0600b68a84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-postgresql-netfields/default.nix
@@ -0,0 +1,59 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, django
+, netaddr
+, six
+, fetchFromGitHub
+, pythonOlder
+, djangorestframework
+# required for tests
+, postgresql
+, postgresqlTestHook
+, psycopg2
+, pytestCheckHook
+, pytest-django
+}:
+
+buildPythonPackage rec {
+  pname = "django-postgresql-netfields";
+  version = "1.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jimfunk";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-76vGvxxfNZQBCCsTkkSgQZ8PpFspWxJQDj/xq9iOSTU=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    netaddr
+    six
+  ];
+
+  doCheck = !stdenv.isDarwin; # could not create shared memory segment: Operation not permitted
+
+  nativeCheckInputs = [
+    djangorestframework
+    postgresql
+    postgresqlTestHook
+    psycopg2
+    pytestCheckHook
+    pytest-django
+  ];
+
+  postgresqlTestUserOptions = "LOGIN SUPERUSER";
+  env.DJANGO_SETTINGS_MODULE = "testsettings";
+
+  meta = with lib; {
+    description = "Django PostgreSQL netfields implementation";
+    homepage = "https://github.com/jimfunk/django-postgresql-netfields";
+    changelog = "https://github.com/jimfunk/django-postgresql-netfields/blob/v${version}/CHANGELOG";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-prometheus/default.nix b/nixpkgs/pkgs/development/python-modules/django-prometheus/default.nix
new file mode 100644
index 000000000000..40bdf4e57ff7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-prometheus/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, prometheus-client
+, pytest-django
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "django-prometheus";
+  version = "2.3.1";
+  format = "setuptools";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "korfuri";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-JiLH+4mmNdb9BN81J5YFiMPna/3gaKUK6ARjmCa3fE8=";
+  };
+
+  patches = [
+    ./drop-untestable-database-backends.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner"' ""
+  '';
+
+  propagatedBuildInputs = [
+    prometheus-client
+  ];
+
+  pythonImportsCheck = [
+    "django_prometheus"
+  ];
+
+  nativeCheckInputs = [
+    pytest-django
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/korfuri/django-prometheus/releases/tag/v${version}";
+    description = "Django middlewares to monitor your application with Prometheus.io";
+    homepage = "https://github.com/korfuri/django-prometheus";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-prometheus/drop-untestable-database-backends.patch b/nixpkgs/pkgs/development/python-modules/django-prometheus/drop-untestable-database-backends.patch
new file mode 100644
index 000000000000..41f1229c5e59
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-prometheus/drop-untestable-database-backends.patch
@@ -0,0 +1,38 @@
+diff --git a/django_prometheus/tests/end2end/testapp/settings.py b/django_prometheus/tests/end2end/testapp/settings.py
+index cdd167f..5c6073b 100644
+--- a/django_prometheus/tests/end2end/testapp/settings.py
++++ b/django_prometheus/tests/end2end/testapp/settings.py
+@@ -53,33 +53,6 @@ DATABASES = {
+         "ENGINE": "django_prometheus.db.backends.sqlite3",
+         "NAME": "db.sqlite3",
+     },
+-    # Comment this to not test django_prometheus.db.backends.postgres.
+-    "postgresql": {
+-        "ENGINE": "django_prometheus.db.backends.postgresql",
+-        "NAME": "postgres",
+-        "USER": "postgres",
+-        "PASSWORD": "",
+-        "HOST": "localhost",
+-        "PORT": "5432",
+-    },
+-    # Comment this to not test django_prometheus.db.backends.postgis.
+-    "postgis": {
+-        "ENGINE": "django_prometheus.db.backends.postgis",
+-        "NAME": "postgis",
+-        "USER": "postgres",
+-        "PASSWORD": "",
+-        "HOST": "localhost",
+-        "PORT": "5432",
+-    },
+-    # Comment this to not test django_prometheus.db.backends.mysql.
+-    "mysql": {
+-        "ENGINE": "django_prometheus.db.backends.mysql",
+-        "NAME": "django_prometheus_1",
+-        "USER": "root",
+-        "PASSWORD": "",
+-        "HOST": "127.0.0.1",
+-        "PORT": "3306",
+-    },
+     # The following databases are used by test_db.py only
+     "test_db_1": {
+         "ENGINE": "django_prometheus.db.backends.sqlite3",
diff --git a/nixpkgs/pkgs/development/python-modules/django-pwa/default.nix b/nixpkgs/pkgs/development/python-modules/django-pwa/default.nix
new file mode 100644
index 000000000000..91a216f0ac5c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-pwa/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, django
+, fetchFromGitHub
+, python
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "django-pwa";
+  version = "1.1.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "silviolleite";
+    repo = "django-pwa";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-tP1+Jm9hdvN/ZliuVHN8tqy24/tOK1LUUiJv1xUqRrY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  pyImportCheck = [
+    "pwa"
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} runtests.py
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "A Django app to include a manifest.json and Service Worker instance to enable progressive web app behavoir";
+    homepage = "https://github.com/silviolleite/django-pwa";
+    changelog = "https://github.com/silviolleite/django-pwa/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ derdennisop ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-q/default.nix b/nixpkgs/pkgs/development/python-modules/django-q/default.nix
new file mode 100644
index 000000000000..c6f9ec3bb53c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-q/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, stdenv
+, arrow
+, blessed
+, buildPythonPackage
+, croniter
+, django
+, django-picklefield
+, django-redis
+, fetchFromGitHub
+, future
+, pkgs
+, poetry-core
+, pytest-django
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, redis
+}:
+
+buildPythonPackage rec {
+  pname = "django-q";
+  version = "1.3.9";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Koed00";
+    repo = "django-q";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-gFSrAl3QGoJEJfvTTvLQgViPPjeJ6BfvgEwgLLo+uAA=";
+  };
+
+  # fixes empty version string
+  # analog to https://github.com/NixOS/nixpkgs/pull/171200
+  patches = [
+    ./pep-621.patch
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    django-picklefield
+    arrow
+    blessed
+    django
+    future
+  ];
+
+  nativeCheckInputs = [
+    croniter
+    django-redis
+    pytest-django
+    pytest-mock
+    pytestCheckHook
+  ] ++ django-redis.optional-dependencies.hiredis;
+
+  pythonImportsCheck = [
+    "django_q"
+  ];
+
+  preCheck = ''
+    ${pkgs.redis}/bin/redis-server &
+    REDIS_PID=$!
+  '';
+
+  postCheck = ''
+    kill $REDIS_PID
+  '';
+
+  # don't bother with two more servers to test
+  disabledTests = [
+    "test_disque"
+    "test_mongo"
+  ];
+
+  doCheck = !stdenv.isDarwin;
+
+  meta = with lib; {
+    description = "A multiprocessing distributed task queue for Django";
+    homepage = "https://django-q.readthedocs.org";
+    changelog = "https://github.com/Koed00/django-q/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gador ];
+    # django-q is unmaintained at the moment
+    # https://github.com/Koed00/django-q/issues/733
+    broken = lib.versionAtLeast redis.version "5";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-q/pep-621.patch b/nixpkgs/pkgs/development/python-modules/django-q/pep-621.patch
new file mode 100644
index 000000000000..e0a1568f4825
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-q/pep-621.patch
@@ -0,0 +1,32 @@
+diff --git a/pyproject.toml b/pyproject.toml
+index 9a83e90..0cdffaf 100644
+--- a/pyproject.toml
++++ b/pyproject.toml
+@@ -1,16 +1,12 @@
+-[tool.poetry]
++[project]
+ name = "django-q"
+ version = "1.3.9"
+ description = "A multiprocessing distributed task queue for Django"
+-authors = ["Ilan Steemers <koed00@gmail.com>"]
+-maintainers = ["Ilan Steemers <koed00@gmail.com>"]
+-license = "MIT"
++authors = [ { name = "Ilan Steemers", email = "koed00@gmail.com"} ]
++maintainers = [ { name = "Ilan Steemers", email = "koed00@gmail.com"} ]
++license.text = "MIT"
+ readme = 'README.rst'
+
+-repository = "https://github.com/koed00/django-q"
+-homepage = "https://django-q.readthedocs.org"
+-documentation = "https://django-q.readthedocs.org"
+-
+ keywords = ["django", "distributed", "multiprocessing", "queue", "scheduler"]
+
+ classifiers = [
+@@ -31,7 +27,6 @@ classifiers = [
+     'Topic :: System :: Distributed Computing',
+     'Topic :: Software Development :: Libraries :: Python Modules',
+ ]
+-include = ['CHANGELOG.md']
+
+ [tool.poetry.plugins] # Optional super table
diff --git a/nixpkgs/pkgs/development/python-modules/django-ranged-response/default.nix b/nixpkgs/pkgs/development/python-modules/django-ranged-response/default.nix
new file mode 100644
index 000000000000..5fb0545f1fee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-ranged-response/default.nix
@@ -0,0 +1,23 @@
+{ lib, fetchPypi, buildPythonPackage, django }:
+
+buildPythonPackage rec {
+  pname = "django-ranged-response";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "11gr3jpmb5rvg3scv026kjwwkmnxwivgq5ypxadnnc9p58szy7zp";
+  };
+
+  # tests not included in PyPi package, github source is not up to date with 0.2.0
+  doCheck = false;
+
+  propagatedBuildInputs = [ django ];
+
+  meta = with lib; {
+    description = "A modified FileResponse that returns `Content-Range` headers with the HTTP response, so browsers (read Safari 9+) that request the file, can stream the response properly";
+    homepage = "https://github.com/wearespindle/django-ranged-fileresponse";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mrmebelman ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-raster/default.nix b/nixpkgs/pkgs/development/python-modules/django-raster/default.nix
new file mode 100644
index 000000000000..673a86797266
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-raster/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k,
+  numpy, django-colorful, pillow, psycopg2,
+  pyparsing, django, celery, boto3, importlib-metadata
+}:
+
+buildPythonPackage rec {
+  version = "0.8.1";
+  pname = "django-raster";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "213758fe96d74be502f69f2620f7666961a85caa0551d14573637315035a9745";
+  };
+
+  # Tests require a postgresql + postgis server
+  doCheck = false;
+
+  propagatedBuildInputs = [ numpy django-colorful pillow psycopg2
+                            pyparsing django celery boto3 importlib-metadata ];
+
+  meta = with lib; {
+    description = "Basic raster data integration for Django";
+    homepage = "https://github.com/geodesign/django-raster";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-redis/default.nix b/nixpkgs/pkgs/development/python-modules/django-redis/default.nix
new file mode 100644
index 000000000000..eeb845d09563
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-redis/default.nix
@@ -0,0 +1,101 @@
+{ lib
+, fetchFromGitHub
+, pythonOlder
+, buildPythonPackage
+, setuptools
+
+# propagated
+, django
+, hiredis
+, lz4
+, msgpack
+, redis
+
+# testing
+, pkgs
+, pytest-django
+, pytest-mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "django-redis";
+  version = "5.4.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "jazzband";
+    repo = "django-redis";
+    rev = "refs/tags/${version}";
+    hash = "sha256-m7z3c7My24vrSSnyfDQ/LlWhy7pV4U0L8LATMvkfczc=";
+  };
+
+  postPatch = ''
+    sed -i '/-cov/d' setup.cfg
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    django
+    lz4
+    msgpack
+    redis
+  ];
+
+  passthru.optional-dependencies = {
+    hiredis = [
+      redis
+    ] ++ redis.optional-dependencies.hiredis;
+  };
+
+  pythonImportsCheck = [
+    "django_redis"
+  ];
+
+  DJANGO_SETTINGS_MODULE = "tests.settings.sqlite";
+
+  preCheck = ''
+    ${pkgs.redis}/bin/redis-server &
+    REDIS_PID=$!
+  '';
+
+  postCheck = ''
+    kill $REDIS_PID
+  '';
+
+  nativeCheckInputs = [
+    pytest-django
+    pytest-mock
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pytestFlagsArray = [
+    "-W"
+    "ignore::DeprecationWarning"
+  ];
+
+  disabledTests = [
+    # ModuleNotFoundError: No module named 'test_cache_options'
+    "test_custom_key_function"
+    # ModuleNotFoundError: No module named 'test_client'
+    "test_delete_pattern_calls_delete_for_given_keys"
+    "test_delete_pattern_calls_get_client_given_no_client"
+    "test_delete_pattern_calls_make_pattern"
+    "test_delete_pattern_calls_pipeline_delete_and_execute"
+    "test_delete_pattern_calls_scan_iter"
+    "test_delete_pattern_calls_scan_iter_with_count_if_itersize_given"
+  ];
+
+  meta = with lib; {
+    description = "Full featured redis cache backend for Django";
+    homepage = "https://github.com/jazzband/django-redis";
+    changelog = "https://github.com/jazzband/django-redis/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-rest-auth/default.nix b/nixpkgs/pkgs/development/python-modules/django-rest-auth/default.nix
new file mode 100644
index 000000000000..5b8937fb048c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-rest-auth/default.nix
@@ -0,0 +1,51 @@
+{ lib
+ , buildPythonPackage
+, fetchFromGitHub
+, django
+, django-allauth
+, djangorestframework
+, drf-jwt
+, responses
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "django-rest-auth";
+  version = "0.9.5";
+
+  src = fetchFromGitHub {
+    owner = "Tivix";
+    repo = "django-rest-auth";
+    rev = version;
+    hash = "sha256-rCChUHv8sTEFErDCZnPN5b5XVtMJ7JNVZwBYF3d99mY=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "djangorestframework-jwt" "drf-jwt"
+  '';
+
+  propagatedBuildInputs = [
+    django
+    djangorestframework
+    six
+  ];
+
+  nativeCheckInputs = [
+    django-allauth
+    drf-jwt
+    responses
+  ];
+
+  # tests are icnompatible with current django version
+  doCheck = false;
+
+  pythonImportsCheck = [ "rest_auth" ];
+
+  meta = with lib; {
+    description = "Django app that makes registration and authentication easy";
+    homepage = "https://github.com/Tivix/django-rest-auth";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-rest-polymorphic/default.nix b/nixpkgs/pkgs/development/python-modules/django-rest-polymorphic/default.nix
new file mode 100644
index 000000000000..730d05d445ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-rest-polymorphic/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, django-polymorphic
+, djangorestframework
+, pytest-django
+, pytest-mock
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "django-rest-polymorphic";
+  version = "0.1.10";
+
+  src = fetchFromGitHub {
+    owner = "apirobot";
+    repo = "django-rest-polymorphic";
+     # https://github.com/denisorehovsky/django-rest-polymorphic/issues/42
+    rev = "9d920eb91ef13144094426f9ebc0ca80247c0fe3";
+    hash = "sha256-k7Cl2QYkaGOZaTo8v5Wg9Wqh8x0WC5i9Sggqj8eeECY=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    django-polymorphic
+    djangorestframework
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytest-django
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "rest_polymorphic" ];
+
+  meta = with lib; {
+    description = "Polymorphic serializers for Django REST Framework";
+    homepage = "https://github.com/apirobot/django-rest-polymorphic";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-rest-registration/default.nix b/nixpkgs/pkgs/development/python-modules/django-rest-registration/default.nix
new file mode 100644
index 000000000000..898904fb92df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-rest-registration/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, django
+, djangorestframework
+, fetchFromGitHub
+, pytest-django
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "django-rest-registration";
+  version = "0.8.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "apragacz";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-kGZ88Z5nV3HChImmPurHoewobsjotZQ4q9RngBYGe5g=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    djangorestframework
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-django
+  ];
+
+  pythonImportsCheck = [
+    "rest_registration"
+  ];
+
+  disabledTests = [
+    # This test fails on Python 3.10
+    "test_convert_html_to_text_fails"
+    # This test is broken and was removed after 0.7.3. Remove this line once version > 0.7.3
+    "test_coreapi_autoschema_success"
+  ];
+
+  meta = with lib; {
+    description = "User-related REST API based on the awesome Django REST Framework";
+    homepage = "https://github.com/apragacz/django-rest-registration/";
+    changelog = "https://github.com/apragacz/django-rest-registration/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sephi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-reversion/default.nix b/nixpkgs/pkgs/development/python-modules/django-reversion/default.nix
new file mode 100644
index 000000000000..2559cc1fbf5c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-reversion/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, django
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "django-reversion";
+  version = "5.0.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-buJalwcN2hTz4IK4uZm/vstKnwgv8fhR40TQVqGMk0w=";
+  };
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  # Tests assume the availability of a mysql/postgresql database
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "reversion"
+  ];
+
+  meta = with lib; {
+    description = "An extension to the Django web framework that provides comprehensive version control facilities";
+    homepage = "https://github.com/etianen/django-reversion";
+    changelog = "https://github.com/etianen/django-reversion/blob/v${version}/CHANGELOG.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-rosetta/default.nix b/nixpkgs/pkgs/development/python-modules/django-rosetta/default.nix
new file mode 100644
index 000000000000..d9337081ba3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-rosetta/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, django
+, fetchFromGitHub
+, polib
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "django-rosetta";
+  version = "0.9.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mbi";
+    repo = "django-rosetta";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-OuKgqGYBlzQNKKAJYFhNi+LnONB/mxINMj4VBAVWjqI=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    polib
+    requests
+  ];
+
+  # require internet connection
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "rosetta"
+  ];
+
+  meta = with lib; {
+    description = "Rosetta is a Django application that facilitates the translation process of your Django projects";
+    homepage = "https://github.com/mbi/django-rosetta";
+    changelog = "https://github.com/mbi/django-rosetta/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ derdennisop ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/django-rq/default.nix b/nixpkgs/pkgs/development/python-modules/django-rq/default.nix
new file mode 100644
index 000000000000..0be46cc32a5c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-rq/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitHub
+, django
+, redis
+, rq
+, sentry-sdk
+}:
+
+buildPythonPackage rec {
+  pname = "django-rq";
+  version = "2.9.0";
+  format = "setuptools";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "rq";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-qrAEBAMbw96TCS6J50RG/2fV9K2WhuXyAQevL4RSQhk=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    redis
+    rq
+    sentry-sdk
+  ];
+
+  pythonImportsCheck = [
+    "django_rq"
+  ];
+
+  doCheck = false; # require redis-server
+
+  meta = with lib; {
+    description = "Simple app that provides django integration for RQ (Redis Queue)";
+    homepage = "https://github.com/rq/django-rq";
+    changelog = "https://github.com/rq/django-rq/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-scheduler/default.nix b/nixpkgs/pkgs/development/python-modules/django-scheduler/default.nix
new file mode 100644
index 000000000000..d8db8c596173
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-scheduler/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, django
+, fetchFromGitHub
+, icalendar
+, pytest
+, pytest-django
+, python
+, python-dateutil
+, pythonOlder
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "django-scheduler";
+  version = "0.10.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "llazzaro";
+    repo = "django-scheduler";
+    rev = "refs/tags/${version}";
+    hash = "sha256-dY2TPo15RRWrv7LheUNJSQl4d/HeptSMM/wQirRSI5w=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    python-dateutil
+    pytz
+    icalendar
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m django check --settings=tests.settings
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "schedule"
+  ];
+
+  meta = with lib; {
+    description = "A calendar app for Django";
+    homepage = "https://github.com/llazzaro/django-scheduler";
+    changelog = "https://github.com/llazzaro/django-scheduler/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ derdennisop ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-scim2/default.nix b/nixpkgs/pkgs/development/python-modules/django-scim2/default.nix
new file mode 100644
index 000000000000..d4eab102d719
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-scim2/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, poetry-core
+
+# propagates
+, django
+, scim2-filter-parser
+
+# tests
+, mock
+, pytest-django
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "django-scim2";
+  version = "0.19.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "15five";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-larDh4f9/xVr11/n/WfkJ2Tx45DMQqyK3ZzkWAvzeig=";
+  };
+
+  # remove this when upstream releases a new version > 0.19.0
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "poetry>=0.12" "poetry-core>=1.5.2" \
+      --replace "poetry.masonry.api" "poetry.core.masonry.api"
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    django
+    scim2-filter-parser
+  ];
+
+  pythonImportsCheck = [
+    "django_scim"
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytest-django
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/15five/django-scim2/blob/${src.rev}/CHANGES.txt";
+    description = "A SCIM 2.0 Service Provider Implementation (for Django)";
+    homepage = "https://github.com/15five/django-scim2";
+    license = licenses.mit;
+    maintainers = with maintainers; [ s1341 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-scopes/default.nix b/nixpkgs/pkgs/development/python-modules/django-scopes/default.nix
new file mode 100644
index 000000000000..5f3fdecc64ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-scopes/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, pytestCheckHook
+, pytest-django
+}:
+
+buildPythonPackage rec {
+  pname = "django-scopes";
+  version = "2.0.0";
+
+  src = fetchFromGitHub {
+    owner = "raphaelm";
+    repo = "django-scopes";
+    rev = "refs/tags/${version}";
+    hash = "sha256-CtToztLVvSb91pMpPNL8RysQJzlRkeXuQbpvbkX3jfM=";
+  };
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  nativeCheckInputs = [
+    pytest-django
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "django_scopes" ];
+
+  meta = with lib; {
+    description = "Safely separate multiple tenants in a Django database";
+    homepage = "https://github.com/raphaelm/django-scopes";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ambroisie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-sekizai/default.nix b/nixpkgs/pkgs/development/python-modules/django-sekizai/default.nix
new file mode 100644
index 000000000000..0c28ee283a1d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-sekizai/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, django-classy-tags
+, pytestCheckHook
+, pytest-django
+}:
+
+buildPythonPackage rec {
+  pname = "django-sekizai";
+  version = "4.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Kso2y64LXAzv7ZVlQW7EQjNXZ/sxRb/xHlhiL8ZTza0=";
+  };
+
+  propagatedBuildInputs = [
+    django-classy-tags
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-django
+  ];
+
+  pythonImportsCheck = [ "sekizai" ];
+
+  DJANGO_SETTINGS_MODULE = "tests.settings";
+
+  meta = with lib; {
+    description = "Define placeholders where your blocks get rendered and append to those blocks";
+    homepage = "https://github.com/django-cms/django-sekizai";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-sesame/default.nix b/nixpkgs/pkgs/development/python-modules/django-sesame/default.nix
new file mode 100644
index 000000000000..b0671d789510
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-sesame/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, django
+, fetchFromGitHub
+, poetry-core
+, python
+, pythonOlder
+, ua-parser
+}:
+
+buildPythonPackage rec {
+  pname = "django-sesame";
+  version = "3.2.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "aaugustin";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-R7ySuop7E1lkxtRSVNFfzyb3Ba1mW0o6PDiTxTztK/Y=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    django
+    ua-parser
+  ];
+
+  pythonImportsCheck = [
+    "sesame"
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    ${python.interpreter} -m django test --settings=tests.settings
+
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "URLs with authentication tokens for automatic login";
+    homepage = "https://github.com/aaugustin/django-sesame";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ elohmeier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-shortuuidfield/default.nix b/nixpkgs/pkgs/development/python-modules/django-shortuuidfield/default.nix
new file mode 100644
index 000000000000..dd999963a115
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-shortuuidfield/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, django
+, fetchPypi
+, shortuuid
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "django-shortuuidfield";
+  version = "0.1.3";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-opLA/lU4q+lHsTHiuRTt2axEr8xqQOrscUSOYjGj7wA=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    shortuuid
+    six
+  ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "shortuuidfield"
+  ];
+
+  meta = with lib; {
+    description = "Short UUIDField for Django. Good for use in urls & file names";
+    homepage = "https://github.com/benrobster/django-shortuuidfield";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ derdennisop ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-silk/default.nix b/nixpkgs/pkgs/development/python-modules/django-silk/default.nix
new file mode 100644
index 000000000000..9f91aee935ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-silk/default.nix
@@ -0,0 +1,100 @@
+{ lib
+, autopep8
+, buildPythonPackage
+, django
+, factory-boy
+, fetchFromGitHub
+, fetchpatch
+, freezegun
+, gprof2dot
+, jinja2
+, mock
+, networkx
+, pillow
+, pydot
+, pygments
+, python
+, python-dateutil
+, pythonOlder
+, pytz
+, requests
+, setuptools-scm
+, simplejson
+, sqlparse
+}:
+
+buildPythonPackage rec {
+  pname = "django-silk";
+  version = "5.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jazzband";
+    repo = "django-silk";
+    rev = "refs/tags/${version}";
+    hash = "sha256-91FcOqAYZK7/RCKgXjbQEPUQ2cZRFi7NzVLQF+MMDRI=";
+  };
+
+  # "test_time_taken" tests aren't suitable for reproducible execution, but Django's
+  # test runner doesn't have an easy way to ignore tests - so instead prevent it from picking
+  # them up as tests
+  postPatch = ''
+    substituteInPlace project/tests/test_silky_profiler.py \
+      --replace "def test_time_taken" "def _test_time_taken"
+    substituteInPlace setup.py \
+      --replace 'use_scm_version=True' 'version="${version}"'
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    mock
+  ];
+
+  propagatedBuildInputs = [
+    autopep8
+    django
+    gprof2dot
+    jinja2
+    pillow
+    pygments
+    python-dateutil
+    pytz
+    requests
+    simplejson
+    sqlparse
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    networkx
+    pydot
+    factory-boy
+  ];
+
+  pythonImportsCheck = [
+    "silk"
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    pushd project
+    DB_ENGINE=sqlite3 DB_NAME=':memory:' ${python.interpreter} manage.py test
+    popd # project
+
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Silky smooth profiling for the Django Framework";
+    homepage = "https://github.com/jazzband/django-silk";
+    changelog = "https://github.com/jazzband/django-silk/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ris ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-simple-captcha/default.nix b/nixpkgs/pkgs/development/python-modules/django-simple-captcha/default.nix
new file mode 100644
index 000000000000..4b61d523a5ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-simple-captcha/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, testfixtures
+, django
+, django-ranged-response
+, pillow
+, withTTS ? true
+, flite
+}:
+
+buildPythonPackage rec {
+  pname = "django-simple-captcha";
+  version = "0.5.20";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ICcwCae+tEKX6fbHpr0hraPS+pPDFNL2v145TO62opc=";
+  };
+
+  nativeCheckInputs = [
+    testfixtures
+  ];
+
+  checkPhase = ''
+    cd testproject
+    ${python.interpreter} manage.py test captcha
+  '';
+
+  propagatedBuildInputs = [
+    django
+    django-ranged-response
+    pillow
+  ] ++ lib.optional withTTS flite;
+
+  meta = with lib; {
+    description = "Customizable Django application to add captcha images to any Django form";
+    homepage = "https://github.com/mbi/django-simple-captcha";
+    changelog = "https://github.com/mbi/django-simple-captcha/blob/v${version}/CHANGES";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mrmebelman schmittlauch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-simple-history/default.nix b/nixpkgs/pkgs/development/python-modules/django-simple-history/default.nix
new file mode 100644
index 000000000000..5ed17c5f6425
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-simple-history/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, django
+, fetchFromGitHub
+, pytest-django
+, python
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "django-simple-history";
+  version = "3.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "jazzband";
+    repo = "django-simple-history";
+    rev = "refs/tags/${version}";
+    hash = "sha256-XY6YNajwX5z3AXkYYGFtrURDqxub9EQwu52jQ7CZwrI=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} runtests.py
+  '';
+
+  pythonImportsCheck = [
+    "simple_history"
+  ];
+
+  meta = with lib; {
+    description = "django-simple-history stores Django model state on every create/update/delete";
+    homepage = "https://github.com/jazzband/django-simple-history/";
+    changelog = "https://github.com/jazzband/django-simple-history/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ derdennisop ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-sites/default.nix b/nixpkgs/pkgs/development/python-modules/django-sites/default.nix
new file mode 100644
index 000000000000..3a9255daecdf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-sites/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, django-jinja
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "django-sites";
+  version = "0.11";
+
+  src = fetchFromGitHub {
+    owner = "niwinz";
+    repo = "django-sites";
+    rev = version;
+    hash = "sha256-MQtQC+9DyS1ICXXovbqPpkKIQ5wpuJDgq3Lcd/1kORU=";
+  };
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  nativeCheckInputs = [
+    django-jinja
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    ${python.interpreter} runtests.py
+
+    runHook postCheck
+  '';
+
+  meta = {
+    description = "Alternative implementation of django sites framework";
+    homepage = "https://github.com/niwinz/django-sites";
+    license = lib.licenses.bsd3;
+    # has not been updated for django>=4.0
+    broken = lib.versionAtLeast django.version "4";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-sr/default.nix b/nixpkgs/pkgs/development/python-modules/django-sr/default.nix
new file mode 100644
index 000000000000..39b3832185d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-sr/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, django, nose }:
+
+buildPythonPackage rec {
+  pname = "django-sr";
+  version = "0.0.4";
+
+  meta = {
+    description = "Django settings resolver";
+    homepage = "https://github.com/jespino/django-sr";
+    license = lib.licenses.bsd3;
+  };
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0d3yqppi1q3crcn9nxx58wzm4yw61d5m7435g6rb9wcamr9bi1im";
+  };
+
+  buildInputs = [ django nose ];
+  propagatedBuildInputs = [ django ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-statici18n/default.nix b/nixpkgs/pkgs/development/python-modules/django-statici18n/default.nix
new file mode 100644
index 000000000000..9fc04339c226
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-statici18n/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, django-appconf
+, pytest-django
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "django-statici18n";
+  version = "2.3.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "zyegfryed";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-2fFJJNdF0jspS7djDL8sToPTetzNR6pfNp5ohCNa30I=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    django-appconf
+  ];
+
+  pythonImportsCheck = [
+    "statici18n"
+  ];
+
+  DJANGO_SETTINGS_MODULE = "tests.test_project.project.settings";
+
+  nativeCheckInputs = [
+    pytest-django
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Helper for generating Javascript catalog to static files";
+    homepage = "https://github.com/zyegfryed/django-statici18n";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ greizgh schmittlauch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-storages/default.nix b/nixpkgs/pkgs/development/python-modules/django-storages/default.nix
new file mode 100644
index 000000000000..1bce8c0d751e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-storages/default.nix
@@ -0,0 +1,91 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, setuptools
+
+# dependencies
+, django
+
+# optional-dependencies
+, azure-storage-blob
+, boto3
+, dropbox
+, google-cloud-storage
+, libcloud
+, paramiko
+
+# tests
+, cryptography
+, moto
+, pytestCheckHook
+, rsa
+}:
+
+buildPythonPackage rec {
+  pname = "django-storages";
+  version = "1.14";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "jschneier";
+    repo = "django-storages";
+    rev = "refs/tags/${version}";
+    hash = "sha256-q+vQm1T5/ueGPfwzuUOmSI/nESchqJc4XizJieBsLWc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  passthru.optional-dependencies = {
+    azure = [
+      azure-storage-blob
+    ];
+    boto3 = [
+      boto3
+    ];
+    dropbox = [
+      dropbox
+    ];
+    google = [
+      google-cloud-storage
+    ];
+    libcloud = [
+      libcloud
+    ];
+    s3 = [
+      boto3
+    ];
+    sftp = [
+      paramiko
+    ];
+  };
+
+  pythonImportsCheck = [
+    "storages"
+  ];
+
+  env.DJANGO_SETTINGS_MODULE = "tests.settings";
+
+  nativeCheckInputs = [
+    cryptography
+    moto
+    pytestCheckHook
+    rsa
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  meta = with lib; {
+    changelog = "https://github.com/jschneier/django-storages/blob/${version}/CHANGELOG.rst";
+    description = "Collection of custom storage backends for Django";
+    downloadPage = "https://github.com/jschneier/django-storages/";
+    homepage = "https://django-storages.readthedocs.io";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ mmai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-stubs-ext/default.nix b/nixpkgs/pkgs/development/python-modules/django-stubs-ext/default.nix
new file mode 100644
index 000000000000..a3bbfd91b0d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-stubs-ext/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, django
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "django-stubs-ext";
+  version = "4.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xp0cxG8cTDt4lLaFpQIsKbKjbHz7UuI3YurzV+v8LJg=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "django_stubs_ext"
+  ];
+
+  meta = with lib; {
+    description = "Extensions and monkey-patching for django-stubs";
+    homepage = "https://github.com/typeddjango/django-stubs";
+    license = licenses.mit;
+    maintainers = with maintainers; [ elohmeier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-stubs/default.nix b/nixpkgs/pkgs/development/python-modules/django-stubs/default.nix
new file mode 100644
index 000000000000..6dcc875884e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-stubs/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, django
+, django-stubs-ext
+, fetchPypi
+, mypy
+, pytestCheckHook
+, pythonOlder
+, tomli
+, types-pytz
+, types-pyyaml
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "django-stubs";
+  version = "4.2.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-fUoTLDgVGYFehlwnqJ7KQby9BgVoMlByJIFqQ9dcYBw=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    django-stubs-ext
+    mypy
+    types-pytz
+    types-pyyaml
+    typing-extensions
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "PEP-484 stubs for Django";
+    homepage = "https://github.com/typeddjango/django-stubs";
+    changelog = "https://github.com/typeddjango/django-stubs/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ elohmeier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-tables2/default.nix b/nixpkgs/pkgs/development/python-modules/django-tables2/default.nix
new file mode 100644
index 000000000000..96811351269d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-tables2/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, django
+, tablib
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "django-tables2";
+  version = "2.6.0";
+  format = "setuptools";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "jieter";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-n8qvsm/i+2VclFc00jQGO0Z4l6Ke8qZ03EYuEQcPuVQ=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    tablib
+  ];
+
+  pythonImportsCheck = [
+    # Requested setting DJANGO_TABLES2_TEMPLATE, but settings are not configured.
+  ];
+
+  doCheck = false; # needs django-boostrap{3,4} packages
+
+  # Leave this in! Discovering how to run tests is annoying in Django apps
+  checkPhase = ''
+    ${python.interpreter} example/manage.py test
+  '';
+
+  meta = with lib; {
+    description = "Django app for creating HTML tables";
+    homepage = "https://github.com/jieter/django-tables2";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-tagging/default.nix b/nixpkgs/pkgs/development/python-modules/django-tagging/default.nix
new file mode 100644
index 000000000000..4bcaa549a12f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-tagging/default.nix
@@ -0,0 +1,21 @@
+{ buildPythonPackage, fetchPypi, django }:
+
+buildPythonPackage rec {
+  pname = "django-tagging";
+  version = "0.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "28d68fa4831705e51ad7d1e845ed6dd9e354f9b6f8a5f63b655a430646ef4e8d";
+  };
+
+  # error: invalid command 'test'
+  doCheck = false;
+
+  propagatedBuildInputs = [ django ];
+
+  meta = {
+    description = "A generic tagging application for Django projects";
+    homepage = "https://github.com/Fantomas42/django-tagging";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-taggit/default.nix b/nixpkgs/pkgs/development/python-modules/django-taggit/default.nix
new file mode 100644
index 000000000000..81326d195a2d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-taggit/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, django
+, djangorestframework
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "django-taggit";
+  version = "4.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-TVLenTckWpufmMDscf3M8dIoPjjohm1Ap65qO2eHoWE=";
+  };
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  pythonImportsCheck = [
+    "taggit"
+  ];
+
+  nativeCheckInputs = [
+    djangorestframework
+  ];
+
+  checkPhase = ''
+    # prove we're running tests against installed package, not build dir
+    rm -r taggit
+    # Replace directory of locale
+    substituteInPlace ./tests/test_utils.py \
+      --replace 'os.path.dirname(__file__), ".."' "\"$out/lib/python${lib.versions.majorMinor python.version}/site-packages/\""
+    ${python.interpreter} -m django test --settings=tests.settings
+  '';
+
+  meta = with lib; {
+    description = "Simple tagging for django";
+    homepage = "https://github.com/jazzband/django-taggit";
+    changelog = "https://github.com/jazzband/django-taggit/blob/${version}/CHANGELOG.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ desiderius ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-tastypie/default.nix b/nixpkgs/pkgs/development/python-modules/django-tastypie/default.nix
new file mode 100644
index 000000000000..004773037e88
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-tastypie/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python-dateutil
+, python-mimeparse
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "django-tastypie";
+  version = "0.14.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "django-tastypie";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-emZVcycGLa8Z2yMv/NWZi1b5fPk50u841cFfFF3Ke/s=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    python-mimeparse
+  ];
+
+  # Tests requires a Django instance
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "tastypie"
+  ];
+
+  meta = with lib; {
+    description = "Utilities and helpers for writing Pylint plugins";
+    homepage = "https://github.com/django-tastypie/django-tastypie";
+    changelog = "https://github.com/django-tastypie/django-tastypie/releases/tag/v${version}";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-timezone-field/default.nix b/nixpkgs/pkgs/development/python-modules/django-timezone-field/default.nix
new file mode 100644
index 000000000000..cfca863be096
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-timezone-field/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, django
+, djangorestframework
+, pytz
+, pytest
+, pytest-lazy-fixture
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "django-timezone-field";
+  version = "5.1";
+  disabled = pythonOlder "3.5";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "mfogel";
+    repo = pname;
+    rev = version;
+    hash = "sha256-FAYO8OEE/h4rsbC4Oc57ylWV7TqQ6DOd6/2M+mb/AsM=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    django
+    djangorestframework
+    pytz
+  ];
+
+  pythonImportsCheck = [
+    "timezone_field"
+  ];
+
+  # Uses pytest.lazy_fixture directly which is broken in pytest-lazy-fixture
+  # https://github.com/TvoroG/pytest-lazy-fixture/issues/22
+  doCheck = false;
+
+  DJANGO_SETTINGS_MODULE = "tests.settings";
+
+  nativeCheckInputs = [
+    pytest
+    pytest-lazy-fixture
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m django test
+  '';
+
+  meta = with lib; {
+    description = "Django app providing database, form and serializer fields for pytz timezone objects";
+    homepage = "https://github.com/mfogel/django-timezone-field";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-treebeard/default.nix b/nixpkgs/pkgs/development/python-modules/django-treebeard/default.nix
new file mode 100644
index 000000000000..ec05953eae6e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-treebeard/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, django
+, fetchPypi
+, pytest-django
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "django-treebeard";
+  version = "4.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-x1Gj+SQVjCiP6omvwlpxUZefrwG/Ef3HvjuFgJnfpW0=";
+  };
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  nativeCheckInputs = [
+    pytest-django
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "treebeard"
+  ];
+
+  meta = with lib; {
+    description = "Efficient tree implementations for Django";
+    homepage = "https://tabo.pe/projects/django-treebeard/";
+    changelog = "https://github.com/django-treebeard/django-treebeard/blob/${version}/CHANGES.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ desiderius ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-two-factor-auth/default.nix b/nixpkgs/pkgs/development/python-modules/django-two-factor-auth/default.nix
new file mode 100644
index 000000000000..7ca684149800
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-two-factor-auth/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, buildPythonPackage
+, django
+, django-formtools
+, django-otp
+, django-phonenumber-field
+, fetchFromGitHub
+, phonenumbers
+, pydantic
+, pythonOlder
+, pythonRelaxDepsHook
+, qrcode
+, setuptools-scm
+, twilio
+, webauthn
+}:
+
+buildPythonPackage rec {
+  pname = "django-two-factor-auth";
+  version = "1.15.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jazzband";
+    repo = "django-two-factor-auth";
+    rev = "refs/tags/${version}";
+    hash = "sha256-+E6kSD00ChPiRLT2i43dNlVkbvuR1vKkbSZfD1Bf3qc=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    setuptools-scm
+  ];
+
+  pythonRelaxDeps = [
+    "django-phonenumber-field"
+  ];
+
+  propagatedBuildInputs = [
+    django
+    django-formtools
+    django-otp
+    django-phonenumber-field
+    qrcode
+  ];
+
+  passthru.optional-dependencies = {
+    call = [
+      twilio
+    ];
+    sms = [
+      twilio
+    ];
+    webauthn = [
+      pydantic
+      webauthn
+    ];
+    # yubikey = [
+    #   django-otp-yubikey
+    # ];
+    phonenumbers = [
+      phonenumbers
+    ];
+    # phonenumberslite = [
+    #   phonenumberslite
+    # ];
+  };
+
+  # Tests require internet connection
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "two_factor"
+  ];
+
+  meta = with lib; {
+    description = "Complete Two-Factor Authentication for Django";
+    homepage = "https://github.com/jazzband/django-two-factor-auth";
+    changelog = "https://github.com/jazzband/django-two-factor-auth/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ derdennisop ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-types/default.nix b/nixpkgs/pkgs/development/python-modules/django-types/default.nix
new file mode 100644
index 000000000000..5c16312538ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-types/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "django-types";
+  version = "0.18.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uOIzTIEIZNer8RzTzbHaOyAVtn5/EnAAfjN3f/G9hlQ=";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+
+  meta = with lib; {
+    description = "Type stubs for Django";
+    homepage = "https://pypi.org/project/django-types";
+    license = licenses.mit;
+    maintainers = with maintainers; [ thubrecht ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-versatileimagefield/default.nix b/nixpkgs/pkgs/development/python-modules/django-versatileimagefield/default.nix
new file mode 100644
index 000000000000..a03a8a282d9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-versatileimagefield/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, django
+, pillow
+, python-magic
+}:
+
+buildPythonPackage rec {
+  pname = "django-versatileimagefield";
+  version = "3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-FlHbLtNthDz7F4jyYBRyopPZuoZyk2m29uVZERI1esc=";
+  };
+  propagatedBuildInputs = [ pillow python-magic ];
+
+  nativeCheckInputs = [ django ];
+
+  # tests not included with pypi release
+  doCheck = false;
+
+  pythonImportsCheck = [ "versatileimagefield" ];
+
+  meta = with lib; {
+    description = "Replaces django's ImageField with a more flexible interface";
+    homepage = "https://github.com/respondcreate/django-versatileimagefield/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mmai ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/django-vite/default.nix b/nixpkgs/pkgs/development/python-modules/django-vite/default.nix
new file mode 100644
index 000000000000..88dc763aa15f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-vite/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, django
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "django-vite";
+  version = "2.1.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "MrBin99";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-HrcQt0Mdko+/XJd0srQTBYMtHaLZyImMuQn39HIwDfY=";
+  };
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  # Package doesn’t have any tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "django_vite"
+  ];
+
+  meta = with lib; {
+    description = "Integration of ViteJS in a Django project";
+    homepage = "https://github.com/MrBin99/django-vite";
+    changelog = "https://github.com/MrBin99/django-vite/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ sephi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-webpack-loader/default.nix b/nixpkgs/pkgs/development/python-modules/django-webpack-loader/default.nix
new file mode 100644
index 000000000000..1e9f0202bd70
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-webpack-loader/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, django
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "django-webpack-loader";
+  version = "2.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Do37L82znb/QG+dgPAYBMqRmT0g4Ec48dfLTwNOat2I=";
+  };
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  # django.core.exceptions.ImproperlyConfigured (path issue with DJANGO_SETTINGS_MODULE?)
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "webpack_loader"
+  ];
+
+  meta = with lib; {
+    description = "Use webpack to generate your static bundles";
+    homepage = "https://github.com/owais/django-webpack-loader";
+    changelog = "https://github.com/django-webpack/django-webpack-loader/blob/${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ peterromfeldhk ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-webpush/default.nix b/nixpkgs/pkgs/development/python-modules/django-webpush/default.nix
new file mode 100644
index 000000000000..44d670dfeede
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-webpush/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, django
+, fetchFromGitHub
+, pythonOlder
+, pythonRelaxDepsHook
+, pywebpush
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "django-webpush";
+  version = "0.3.4";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "safwanrahman";
+    repo = "django-webpush";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Mwp53apdPpBcn7VfDbyDlvLAVAG65UUBhT0w9OKjKbU=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    django
+    pywebpush
+  ];
+
+  # nothing to test
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "webpush"
+  ];
+
+  meta = with lib; {
+    description = "A Package made for integrating and sending Web Push Notification in Django Application";
+    homepage = "https://github.com/safwanrahman/django-webpush/";
+    changelog = "https://github.com/safwanrahman/django-webpush/releases/tag/${src.rev}";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ derdennisop ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django-widget-tweaks/default.nix b/nixpkgs/pkgs/development/python-modules/django-widget-tweaks/default.nix
new file mode 100644
index 000000000000..b77af5e47491
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django-widget-tweaks/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, django
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "django-widget-tweaks";
+  version = "1.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "jazzband";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-/3UIsg75X3R9YGv9cEcoPw3IN2vkhUb+HCy68813d2E=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m django test --settings=tests.settings
+  '';
+
+  meta = with lib; {
+    description = "Tweak the form field rendering in templates, not in python-level form definitions";
+    homepage = "https://github.com/jazzband/django-widget-tweaks";
+    changelog = "https://github.com/jazzband/django-widget-tweaks/blob/${version}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxxk ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django/3.nix b/nixpkgs/pkgs/development/python-modules/django/3.nix
new file mode 100644
index 000000000000..077ea73bd8b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django/3.nix
@@ -0,0 +1,58 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, substituteAll
+, geos39
+, gdal
+, asgiref
+, pytz
+, sqlparse
+, tzdata
+, pythonOlder
+, withGdal ? false
+}:
+
+buildPythonPackage rec {
+  pname = "django";
+  version = "3.2.23";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Django";
+    inherit version;
+    hash = "sha256-gpaPNkDinvSnc68sKESPX3oI0AHGrAWzLQKu7mUJUIs=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./django_3_set_zoneinfo_dir.patch;
+      zoneinfo = tzdata + "/share/zoneinfo";
+    })
+  ] ++ lib.optional withGdal
+    (substituteAll {
+      src = ./django_3_set_geos_gdal_lib.patch;
+      inherit geos39;
+      inherit gdal;
+      extension = stdenv.hostPlatform.extensions.sharedLibrary;
+    });
+
+  propagatedBuildInputs = [
+    asgiref
+    pytz
+    sqlparse
+  ];
+
+  # too complicated to setup
+  doCheck = false;
+
+  pythonImportsCheck = [ "django" ];
+
+  meta = with lib; {
+    description = "A high-level Python Web framework";
+    homepage = "https://www.djangoproject.com/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ georgewhewell ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django/4.nix b/nixpkgs/pkgs/development/python-modules/django/4.nix
new file mode 100644
index 000000000000..69c438739f23
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django/4.nix
@@ -0,0 +1,143 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, substituteAll
+
+# build
+, setuptools
+
+# patched in
+, geos
+, gdal
+, withGdal ? false
+
+# propagates
+, asgiref
+, sqlparse
+
+# extras
+, argon2-cffi
+, bcrypt
+
+# tests
+, aiosmtpd
+, docutils
+, geoip2
+, jinja2
+, numpy
+, pillow
+, pylibmc
+, pymemcache
+, python
+, pywatchman
+, pyyaml
+, pytz
+, redis
+, selenium
+, tblib
+, tzdata
+}:
+
+buildPythonPackage rec {
+  pname = "Django";
+  version = "4.2.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jg8cLCeGtcDjn+GvziTJJgQPrUfI6orTCq8RiN8p/EE=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./django_4_set_zoneinfo_dir.patch;
+      zoneinfo = tzdata + "/share/zoneinfo";
+    })
+    # make sure the tests don't remove packages from our pythonpath
+    # and disable failing tests
+    ./django_4_tests.patch
+  ] ++ lib.optionals withGdal [
+    (substituteAll {
+      src = ./django_4_set_geos_gdal_lib.patch;
+      geos = geos;
+      gdal = gdal;
+      extension = stdenv.hostPlatform.extensions.sharedLibrary;
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace tests/utils_tests/test_autoreload.py \
+      --replace "/usr/bin/python" "${python.interpreter}"
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    asgiref
+    sqlparse
+  ];
+
+  passthru.optional-dependencies = {
+    argon2 = [
+      argon2-cffi
+    ];
+    bcrypt = [
+      bcrypt
+    ];
+  };
+
+  nativeCheckInputs = [
+    # tests/requirements/py3.txt
+    aiosmtpd
+    docutils
+    geoip2
+    jinja2
+    numpy
+    pillow
+    pylibmc
+    pymemcache
+    pywatchman
+    pyyaml
+    pytz
+    redis
+    selenium
+    tblib
+    tzdata
+  ] ++ lib.flatten (lib.attrValues passthru.optional-dependencies);
+
+  doCheck = !stdenv.isDarwin;
+
+  preCheck = ''
+    # make sure the installed library gets imported
+    rm -rf django
+
+    # provide timezone data, works only on linux
+    export TZDIR=${tzdata}/${python.sitePackages}/tzdata/zoneinfo
+  '';
+
+  checkPhase = ''
+    runHook preCheck
+
+    pushd tests
+    ${python.interpreter} runtests.py --settings=test_sqlite
+    popd
+
+    runHook postCheck
+  '';
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    changelog = "https://docs.djangoproject.com/en/${lib.versions.majorMinor version}/releases/${version}/";
+    description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design.";
+    homepage = "https://www.djangoproject.com";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django/5.nix b/nixpkgs/pkgs/development/python-modules/django/5.nix
new file mode 100644
index 000000000000..0ea8de9a4c7c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django/5.nix
@@ -0,0 +1,144 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, substituteAll
+
+# build
+, setuptools
+
+# patched in
+, geos
+, gdal
+, withGdal ? false
+
+# propagates
+, asgiref
+, sqlparse
+
+# extras
+, argon2-cffi
+, bcrypt
+
+# tests
+, aiosmtpd
+, docutils
+, geoip2
+, jinja2
+, numpy
+, pillow
+, pylibmc
+, pymemcache
+, python
+, pywatchman
+, pyyaml
+, pytz
+, redis
+, selenium
+, tblib
+, tzdata
+}:
+
+buildPythonPackage rec {
+  pname = "Django";
+  version = "5.0b1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-yIY15zPwoO9GwhljXiHI9ZeOsqFMORgiRlRUG8XVcDA=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./django_5_set_zoneinfo_dir.patch;
+      zoneinfo = tzdata + "/share/zoneinfo";
+    })
+    # prevent tests from messing with our pythonpath
+    ./django_5_tests_pythonpath.patch
+    # disable test that excpects timezone issues
+    ./django_5_disable_failing_tests.patch
+  ] ++ lib.optionals withGdal [
+    (substituteAll {
+      src = ./django_5_set_geos_gdal_lib.patch;
+      geos = geos;
+      gdal = gdal;
+      extension = stdenv.hostPlatform.extensions.sharedLibrary;
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace tests/utils_tests/test_autoreload.py \
+      --replace "/usr/bin/python" "${python.interpreter}"
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    asgiref
+    sqlparse
+  ];
+
+  passthru.optional-dependencies = {
+    argon2 = [
+      argon2-cffi
+    ];
+    bcrypt = [
+      bcrypt
+    ];
+  };
+
+  nativeCheckInputs = [
+    # tests/requirements/py3.txt
+    aiosmtpd
+    docutils
+    geoip2
+    jinja2
+    numpy
+    pillow
+    pylibmc
+    pymemcache
+    pywatchman
+    pyyaml
+    pytz
+    redis
+    selenium
+    tblib
+    tzdata
+  ] ++ lib.flatten (lib.attrValues passthru.optional-dependencies);
+
+  doCheck = !stdenv.isDarwin;
+
+  preCheck = ''
+    # make sure the installed library gets imported
+    rm -rf django
+
+    # provide timezone data, works only on linux
+    export TZDIR=${tzdata}/${python.sitePackages}/tzdata/zoneinfo
+  '';
+
+  checkPhase = ''
+    runHook preCheck
+
+    pushd tests
+    ${python.interpreter} runtests.py --settings=test_sqlite
+    popd
+
+    runHook postCheck
+  '';
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    changelog = "https://docs.djangoproject.com/en/${lib.versions.majorMinor version}/releases/${version}/";
+    description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design.";
+    homepage = "https://www.djangoproject.com";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/django/django_3_set_geos_gdal_lib.patch b/nixpkgs/pkgs/development/python-modules/django/django_3_set_geos_gdal_lib.patch
new file mode 100644
index 000000000000..15f0773dcf4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django/django_3_set_geos_gdal_lib.patch
@@ -0,0 +1,24 @@
+diff -Nur a/django/contrib/gis/gdal/libgdal.py b/django/contrib/gis/gdal/libgdal.py
+--- a/django/contrib/gis/gdal/libgdal.py	2020-07-09 22:34:05.330568948 +0100
++++ b/django/contrib/gis/gdal/libgdal.py	2020-07-09 22:35:08.679095615 +0100
+@@ -14,7 +14,7 @@
+     from django.conf import settings
+     lib_path = settings.GDAL_LIBRARY_PATH
+ except (AttributeError, ImportError, ImproperlyConfigured, OSError):
+-    lib_path = None
++    lib_path = "@gdal@/lib/libgdal@extension@"
+
+ if lib_path:
+     lib_names = None
+diff -Nur a/django/contrib/gis/geos/libgeos.py b/django/contrib/gis/geos/libgeos.py
+--- a/django/contrib/gis/geos/libgeos.py	2020-07-09 22:34:05.331568941 +0100
++++ b/django/contrib/gis/geos/libgeos.py	2020-07-09 22:36:24.863526276 +0100
+@@ -24,7 +24,7 @@
+         from django.conf import settings
+         lib_path = settings.GEOS_LIBRARY_PATH
+     except (AttributeError, ImportError, ImproperlyConfigured, OSError):
+-        lib_path = None
++        lib_path = "@geos39@/lib/libgeos_c@extension@"
+
+     # Setting the appropriate names for the GEOS-C library.
+     if lib_path:
diff --git a/nixpkgs/pkgs/development/python-modules/django/django_3_set_zoneinfo_dir.patch b/nixpkgs/pkgs/development/python-modules/django/django_3_set_zoneinfo_dir.patch
new file mode 100644
index 000000000000..69ad1c85d80c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django/django_3_set_zoneinfo_dir.patch
@@ -0,0 +1,13 @@
+diff --git a/django/conf/__init__.py b/django/conf/__init__.py
+index 28302440c7..278cfa5e62 100644
+--- a/django/conf/__init__.py
++++ b/django/conf/__init__.py
+@@ -200,7 +200,7 @@ class Settings:
+         if hasattr(time, 'tzset') and self.TIME_ZONE:
+             # When we can, attempt to validate the timezone. If we can't find
+             # this file, no check happens and it's harmless.
+-            zoneinfo_root = Path('/usr/share/zoneinfo')
++            zoneinfo_root = Path('@zoneinfo@')
+             zone_info_file = zoneinfo_root.joinpath(*self.TIME_ZONE.split('/'))
+             if zoneinfo_root.exists() and not zone_info_file.exists():
+                 raise ValueError("Incorrect timezone setting: %s" % self.TIME_ZONE)
diff --git a/nixpkgs/pkgs/development/python-modules/django/django_4_set_geos_gdal_lib.patch b/nixpkgs/pkgs/development/python-modules/django/django_4_set_geos_gdal_lib.patch
new file mode 100644
index 000000000000..b3da31f1e109
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django/django_4_set_geos_gdal_lib.patch
@@ -0,0 +1,26 @@
+diff --git a/django/contrib/gis/gdal/libgdal.py b/django/contrib/gis/gdal/libgdal.py
+index 05b5732..91fafee 100644
+--- a/django/contrib/gis/gdal/libgdal.py
++++ b/django/contrib/gis/gdal/libgdal.py
+@@ -14,7 +14,7 @@ try:
+     from django.conf import settings
+     lib_path = settings.GDAL_LIBRARY_PATH
+ except (AttributeError, ImportError, ImproperlyConfigured, OSError):
+-    lib_path = None
++    lib_path = "@gdal@/lib/libgdal@extension@"
+ 
+ if lib_path:
+     lib_names = None
+diff --git a/django/contrib/gis/geos/libgeos.py b/django/contrib/gis/geos/libgeos.py
+index 2cdb5d3..fac2d04 100644
+--- a/django/contrib/gis/geos/libgeos.py
++++ b/django/contrib/gis/geos/libgeos.py
+@@ -24,7 +24,7 @@ def load_geos():
+         from django.conf import settings
+         lib_path = settings.GEOS_LIBRARY_PATH
+     except (AttributeError, ImportError, ImproperlyConfigured, OSError):
+-        lib_path = None
++        lib_path = "@geos@/lib/libgeos_c@extension@"
+ 
+     # Setting the appropriate names for the GEOS-C library.
+     if lib_path:
diff --git a/nixpkgs/pkgs/development/python-modules/django/django_4_set_zoneinfo_dir.patch b/nixpkgs/pkgs/development/python-modules/django/django_4_set_zoneinfo_dir.patch
new file mode 100644
index 000000000000..d9848772b85a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django/django_4_set_zoneinfo_dir.patch
@@ -0,0 +1,13 @@
+diff --git a/django/conf/__init__.py b/django/conf/__init__.py
+index cb70a71791..5156f7dd73 100644
+--- a/django/conf/__init__.py
++++ b/django/conf/__init__.py
+@@ -227,7 +227,7 @@ class Settings:
+         if hasattr(time, "tzset") and self.TIME_ZONE:
+             # When we can, attempt to validate the timezone. If we can't find
+             # this file, no check happens and it's harmless.
+-            zoneinfo_root = Path("/usr/share/zoneinfo")
++            zoneinfo_root = Path("@zoneinfo@")
+             zone_info_file = zoneinfo_root.joinpath(*self.TIME_ZONE.split("/"))
+             if zoneinfo_root.exists() and not zone_info_file.exists():
+                 raise ValueError("Incorrect timezone setting: %s" % self.TIME_ZONE)
diff --git a/nixpkgs/pkgs/development/python-modules/django/django_4_tests.patch b/nixpkgs/pkgs/development/python-modules/django/django_4_tests.patch
new file mode 100644
index 000000000000..689e1ed652a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django/django_4_tests.patch
@@ -0,0 +1,51 @@
+diff --git a/tests/admin_scripts/tests.py b/tests/admin_scripts/tests.py
+index 6d67c2931a..0c1f407f88 100644
+--- a/tests/admin_scripts/tests.py
++++ b/tests/admin_scripts/tests.py
+@@ -127,6 +127,7 @@ class AdminScriptTestCase(SimpleTestCase):
+             del test_environ["DJANGO_SETTINGS_MODULE"]
+         python_path = [base_dir, django_dir, tests_dir]
+         python_path.extend(ext_backend_base_dirs)
++        python_path.extend(sys.path)
+         test_environ["PYTHONPATH"] = os.pathsep.join(python_path)
+         test_environ["PYTHONWARNINGS"] = ""
+ 
+diff --git a/tests/auth_tests/test_hashers.py b/tests/auth_tests/test_hashers.py
+index 36f22d5f09..6cc6888980 100644
+--- a/tests/auth_tests/test_hashers.py
++++ b/tests/auth_tests/test_hashers.py
+@@ -1,4 +1,4 @@
+-from unittest import mock, skipUnless
++from unittest import mock, skipUnless, skip
+ 
+ from django.conf.global_settings import PASSWORD_HASHERS
+ from django.contrib.auth.hashers import (
+@@ -241,6 +241,7 @@ class TestUtilsHashPass(SimpleTestCase):
+ 
+     @ignore_warnings(category=RemovedInDjango50Warning)
+     @skipUnless(crypt, "no crypt module to generate password.")
++    @skip("Legacy crypt algorithms are unsupported in nixpkgs")
+     @override_settings(
+         PASSWORD_HASHERS=["django.contrib.auth.hashers.CryptPasswordHasher"]
+     )
+diff --git a/tests/settings_tests/tests.py b/tests/settings_tests/tests.py
+index 62cbffbee9..2f0ec718f8 100644
+--- a/tests/settings_tests/tests.py
++++ b/tests/settings_tests/tests.py
+@@ -2,7 +2,7 @@ import os
+ import sys
+ import unittest
+ from types import ModuleType, SimpleNamespace
+-from unittest import mock
++from unittest import mock, skip
+ 
+ from django.conf import (
+     ENVIRONMENT_VARIABLE,
+@@ -342,6 +342,7 @@ class SettingsTests(SimpleTestCase):
+             getattr(s, "foo")
+ 
+     @requires_tz_support
++    @skip("Assertion fails, exception does not get raised")
+     @mock.patch("django.conf.global_settings.TIME_ZONE", "test")
+     def test_incorrect_timezone(self):
+         with self.assertRaisesMessage(ValueError, "Incorrect timezone setting: test"):
diff --git a/nixpkgs/pkgs/development/python-modules/django/django_5_disable_failing_tests.patch b/nixpkgs/pkgs/development/python-modules/django/django_5_disable_failing_tests.patch
new file mode 100644
index 000000000000..dd4b3f6ac72a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django/django_5_disable_failing_tests.patch
@@ -0,0 +1,21 @@
+diff --git a/tests/settings_tests/tests.py b/tests/settings_tests/tests.py
+index b204487..243f060 100644
+--- a/tests/settings_tests/tests.py
++++ b/tests/settings_tests/tests.py
+@@ -2,7 +2,7 @@ import os
+ import sys
+ import unittest
+ from types import ModuleType, SimpleNamespace
+-from unittest import mock
++from unittest import mock, skip
+ 
+ from django.conf import ENVIRONMENT_VARIABLE, LazySettings, Settings, settings
+ from django.core.exceptions import ImproperlyConfigured
+@@ -335,6 +335,7 @@ class SettingsTests(SimpleTestCase):
+             getattr(s, "foo")
+ 
+     @requires_tz_support
++    @skip("Assertion fails, exception does not get raised")
+     @mock.patch("django.conf.global_settings.TIME_ZONE", "test")
+     def test_incorrect_timezone(self):
+         with self.assertRaisesMessage(ValueError, "Incorrect timezone setting: test"):
diff --git a/nixpkgs/pkgs/development/python-modules/django/django_5_set_geos_gdal_lib.patch b/nixpkgs/pkgs/development/python-modules/django/django_5_set_geos_gdal_lib.patch
new file mode 100644
index 000000000000..c1fdcdc4e92e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django/django_5_set_geos_gdal_lib.patch
@@ -0,0 +1,26 @@
+diff --git a/django/contrib/gis/gdal/libgdal.py b/django/contrib/gis/gdal/libgdal.py
+index 30cba0f..5afc031 100644
+--- a/django/contrib/gis/gdal/libgdal.py
++++ b/django/contrib/gis/gdal/libgdal.py
+@@ -15,7 +15,7 @@ try:
+ 
+     lib_path = settings.GDAL_LIBRARY_PATH
+ except (AttributeError, ImportError, ImproperlyConfigured, OSError):
+-    lib_path = None
++    lib_path = "@gdal@/lib/libgdal@extension@"
+ 
+ if lib_path:
+     lib_names = None
+diff --git a/django/contrib/gis/geos/libgeos.py b/django/contrib/gis/geos/libgeos.py
+index 1121b4f..f14ea2f 100644
+--- a/django/contrib/gis/geos/libgeos.py
++++ b/django/contrib/gis/geos/libgeos.py
+@@ -25,7 +25,7 @@ def load_geos():
+ 
+         lib_path = settings.GEOS_LIBRARY_PATH
+     except (AttributeError, ImportError, ImproperlyConfigured, OSError):
+-        lib_path = None
++        lib_path = "@geos@/lib/libgeos_c@extension@"
+ 
+     # Setting the appropriate names for the GEOS-C library.
+     if lib_path:
diff --git a/nixpkgs/pkgs/development/python-modules/django/django_5_set_zoneinfo_dir.patch b/nixpkgs/pkgs/development/python-modules/django/django_5_set_zoneinfo_dir.patch
new file mode 100644
index 000000000000..166cc56281cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django/django_5_set_zoneinfo_dir.patch
@@ -0,0 +1,13 @@
+diff --git a/django/conf/__init__.py b/django/conf/__init__.py
+index 22f1eab..3a752d1 100644
+--- a/django/conf/__init__.py
++++ b/django/conf/__init__.py
+@@ -208,7 +208,7 @@ class Settings:
+         if hasattr(time, "tzset") and self.TIME_ZONE:
+             # When we can, attempt to validate the timezone. If we can't find
+             # this file, no check happens and it's harmless.
+-            zoneinfo_root = Path("/usr/share/zoneinfo")
++            zoneinfo_root = Path("@zoneinfo@")
+             zone_info_file = zoneinfo_root.joinpath(*self.TIME_ZONE.split("/"))
+             if zoneinfo_root.exists() and not zone_info_file.exists():
+                 raise ValueError("Incorrect timezone setting: %s" % self.TIME_ZONE)
diff --git a/nixpkgs/pkgs/development/python-modules/django/django_5_tests_pythonpath.patch b/nixpkgs/pkgs/development/python-modules/django/django_5_tests_pythonpath.patch
new file mode 100644
index 000000000000..8355d267a73f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/django/django_5_tests_pythonpath.patch
@@ -0,0 +1,12 @@
+diff --git a/tests/admin_scripts/tests.py b/tests/admin_scripts/tests.py
+index 7f39d7f..b5b0ae7 100644
+--- a/tests/admin_scripts/tests.py
++++ b/tests/admin_scripts/tests.py
+@@ -126,6 +126,7 @@ class AdminScriptTestCase(SimpleTestCase):
+             del test_environ["DJANGO_SETTINGS_MODULE"]
+         python_path = [base_dir, django_dir, tests_dir]
+         python_path.extend(ext_backend_base_dirs)
++        python_path.extend(sys.path)
+         test_environ["PYTHONPATH"] = os.pathsep.join(python_path)
+         test_environ["PYTHONWARNINGS"] = ""
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/djangoql/default.nix b/nixpkgs/pkgs/development/python-modules/djangoql/default.nix
new file mode 100644
index 000000000000..55da45f46370
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/djangoql/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, python
+, django, ply }:
+
+buildPythonPackage rec {
+  pname = "djangoql";
+  version = "0.17.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-TwU9ASjij0EpJuLakCc19L3Lq1wI1Dvk3+/XR/yi6W4=";
+  };
+
+  propagatedBuildInputs = [ ply ];
+
+  nativeCheckInputs = [ django ];
+
+  checkPhase = ''
+    export PYTHONPATH=test_project:$PYTHONPATH
+    ${python.executable} test_project/manage.py test core.tests
+  '';
+
+  meta = with lib; {
+    description = "Advanced search language for Django";
+    homepage = "https://github.com/ivelum/djangoql";
+    license = licenses.mit;
+    maintainers = with maintainers; [ erikarvstedt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/djangorestframework-camel-case/default.nix b/nixpkgs/pkgs/development/python-modules/djangorestframework-camel-case/default.nix
new file mode 100644
index 000000000000..d5b388f5f5e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/djangorestframework-camel-case/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, djangorestframework
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "djangorestframework-camel-case";
+  version = "1.4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-za51hGZIq7ZYXHRwY5odL7Bk3EX46LYqqlC+fxp6YfQ=";
+  };
+
+  propagatedBuildInputs = [
+    djangorestframework
+  ];
+
+  nativeCheckInputs = [
+    six
+  ];
+
+  # tests are only on GitHub but there are no tags
+  # https://github.com/vbabiy/djangorestframework-camel-case/issues/116
+  doCheck = false;
+
+  pythonImportsCheck = [ "djangorestframework_camel_case" ];
+
+  meta = with lib; {
+    description = "Camel case JSON support for Django REST framework";
+    homepage = "https://github.com/vbabiy/djangorestframework-camel-case";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/djangorestframework-dataclasses/default.nix b/nixpkgs/pkgs/development/python-modules/djangorestframework-dataclasses/default.nix
new file mode 100644
index 000000000000..69dc84e0c199
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/djangorestframework-dataclasses/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, djangorestframework
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "djangorestframework-dataclasses";
+  version = "1.3.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "oxan";
+    repo = "djangorestframework-dataclasses";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-12EdSaGpsX0qDXgJ2QWYj6qAUbsrITQjWowk+gJFwwY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  postPatch = ''
+    patchShebangs manage.py
+  '';
+
+  propagatedBuildInputs = [
+    djangorestframework
+  ];
+
+  checkPhase = ''
+   ./manage.py test
+  '';
+
+  pythonImportsCheck = [ "rest_framework_dataclasses" ];
+
+  meta = with lib; {
+    description = " Dataclasses serializer for Django REST framework";
+    homepage = "https://github.com/oxan/djangorestframework-dataclasses";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/djangorestframework-guardian/default.nix b/nixpkgs/pkgs/development/python-modules/djangorestframework-guardian/default.nix
new file mode 100644
index 000000000000..4358a61b3452
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/djangorestframework-guardian/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, django-guardian
+, djangorestframework
+}:
+
+buildPythonPackage rec {
+  pname = "djangorestframework-guardian";
+  version = "0.3.0";
+
+  src = fetchFromGitHub {
+    owner = "rpkilby";
+    repo = "django-rest-framework-guardian";
+    rev = version;
+    hash = "sha256-jl/VEl1pUHU8J1d5ZQSGJweNJayIGw1iVAmwID85fqw=";
+  };
+
+  postPatch = ''
+    chmod +x manage.py
+    patchShebangs manage.py
+  '';
+
+  propagatedBuildInputs = [
+    django-guardian
+    djangorestframework
+  ];
+
+  checkPhase = ''
+    ./manage.py test
+  '';
+
+  pythonImportsCheck = [ "rest_framework_guardian" ];
+
+  meta = with lib; {
+    description = "Django-guardian support for Django REST Framework";
+    homepage = "https://github.com/rpkilby/django-rest-framework-guardian";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+    # unmaintained, last compatible version is 3.x, use djangorestframework-guardian2 instead
+    broken = lib.versionAtLeast django.version "4";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/djangorestframework-guardian2/default.nix b/nixpkgs/pkgs/development/python-modules/djangorestframework-guardian2/default.nix
new file mode 100644
index 000000000000..786a401d80b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/djangorestframework-guardian2/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django-guardian
+, djangorestframework
+}:
+
+buildPythonPackage rec {
+  pname = "djangorestframework-guardian2";
+  version = "0.5.0";
+
+  src = fetchFromGitHub {
+    owner = "johnthagen";
+    repo = "django-rest-framework-guardian2";
+    rev = "v${version}";
+    hash = "sha256-aW20xEmVTAgwayWMJsabmyKNW65NftJyQANtT6JV74U=";
+  };
+
+  postPatch = ''
+    chmod +x manage.py
+    patchShebangs manage.py
+  '';
+
+  propagatedBuildInputs = [
+    django-guardian
+    djangorestframework
+  ];
+
+  checkPhase = ''
+    ./manage.py test
+  '';
+
+  pythonImportsCheck = [ "rest_framework_guardian" ];
+
+  meta = with lib; {
+    description = "Django-guardian support for Django REST Framework";
+    homepage = "https://github.com/johnthagen/django-rest-framework-guardian2/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ e1mo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/djangorestframework-recursive/default.nix b/nixpkgs/pkgs/development/python-modules/djangorestframework-recursive/default.nix
new file mode 100644
index 000000000000..d4a96d679522
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/djangorestframework-recursive/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, django
+, djangorestframework
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "djangorestframework-recursive";
+  version = "0.1.2";
+
+  src = fetchFromGitHub {
+    owner = "heywbj";
+    repo = "django-rest-framework-recursive";
+    rev = version;
+    hash = "sha256-Q/6yxpz3c402sMZudAeFIht9+5GmTRlzM51AMAx5muY=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    djangorestframework
+  ];
+
+  # incompatible with newer django versions
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "rest_framework_recursive"
+  ];
+
+  meta = with lib; {
+    description = " Recursive Serialization for Django REST framework ";
+    homepage = "https://github.com/heywbj/django-rest-framework-recursive";
+    license = licenses.isc;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/djangorestframework-simplejwt/default.nix b/nixpkgs/pkgs/development/python-modules/djangorestframework-simplejwt/default.nix
new file mode 100644
index 000000000000..cb5c3478d910
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/djangorestframework-simplejwt/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, django
+, djangorestframework
+, fetchPypi
+, pyjwt
+, python-jose
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "djangorestframework-simplejwt";
+  version = "5.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "djangorestframework_simplejwt";
+    inherit version;
+    hash = "sha256-jkxd/KjRHAuKZt/YpOP8HGqn6hiNEJB/+RyUL0tS7WY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    django
+    djangorestframework
+    pyjwt
+  ];
+
+  passthru.optional-dependencies = {
+    python-jose = [
+      python-jose
+    ];
+    crypto = [
+      cryptography
+    ];
+  };
+
+  # Test raises django.core.exceptions.ImproperlyConfigured
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "rest_framework_simplejwt"
+  ];
+
+  meta = with lib; {
+    description = "JSON Web Token authentication plugin for Django REST Framework";
+    homepage = "https://github.com/davesque/django-rest-framework-simplejwt";
+    changelog = "https://github.com/jazzband/djangorestframework-simplejwt/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ arnoldfarkas ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/djangorestframework-stubs/default.nix b/nixpkgs/pkgs/development/python-modules/djangorestframework-stubs/default.nix
new file mode 100644
index 000000000000..1d1d76ed3b68
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/djangorestframework-stubs/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, django-stubs
+, fetchFromGitHub
+, mypy
+, py
+, pytest-mypy-plugins
+, pytestCheckHook
+, pythonOlder
+, requests
+, types-pyyaml
+, types-requests
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "djangorestframework-stubs";
+  version = "3.14.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "typeddjango";
+    repo = "djangorestframework-stubs";
+    rev = version;
+    hash = "sha256-T357ocJvDC+vt0I4VyAu0Q9YzY9cSK7shgp9fQ1qHyY=";
+  };
+
+  propagatedBuildInputs = [
+    django-stubs
+    mypy
+    requests
+    types-pyyaml
+    types-requests
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    mypy
+    py
+    pytest-mypy-plugins
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "PEP-484 stubs for Django REST Framework";
+    homepage = "https://github.com/typeddjango/djangorestframework-stubs";
+    changelog = "https://github.com/typeddjango/djangorestframework-stubs/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ elohmeier ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/djangorestframework/default.nix b/nixpkgs/pkgs/development/python-modules/djangorestframework/default.nix
new file mode 100644
index 000000000000..ced22d54803a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/djangorestframework/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, coreapi
+, django
+, django-guardian
+, pythonOlder
+, pytest-django
+, pytestCheckHook
+, pytz
+, pyyaml
+, uritemplate
+}:
+
+buildPythonPackage rec {
+  pname = "djangorestframework";
+  version = "3.14.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "encode";
+    repo = "django-rest-framework";
+    rev = version;
+    hash = "sha256-Fnj0n3NS3SetOlwSmGkLE979vNJnYE6i6xwVBslpNz4=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    pytz
+  ];
+
+  nativeCheckInputs = [
+    pytest-django
+    pytestCheckHook
+
+    # optional tests
+    coreapi
+    django-guardian
+    pyyaml
+    uritemplate
+  ];
+
+  pythonImportsCheck = [ "rest_framework" ];
+
+  meta = with lib; {
+    description = "Web APIs for Django, made easy";
+    homepage = "https://www.django-rest-framework.org/";
+    maintainers = with maintainers; [ desiderius ];
+    license = licenses.bsd2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/djmail/default.nix b/nixpkgs/pkgs/development/python-modules/djmail/default.nix
new file mode 100644
index 000000000000..8efb9788e127
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/djmail/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi
+, glibcLocales
+, celery, django, psycopg2
+}:
+
+buildPythonPackage rec {
+  pname = "djmail";
+  version = "2.0.0";
+
+  meta = {
+    description = "Simple, powerfull and nonobstructive django email middleware";
+    homepage = "https://github.com/bameda/djmail";
+    license = lib.licenses.bsd3;
+  };
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cf3ce7626305d218a8bf2b6a219266ef8061aceeefc1c70a54170f4105465202";
+  };
+
+  nativeBuildInputs = [ glibcLocales ];
+
+  LC_ALL = "en_US.UTF-8";
+
+  propagatedBuildInputs = [ celery django psycopg2 ];
+
+  # django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
+  doCheck = false;
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dkimpy/default.nix b/nixpkgs/pkgs/development/python-modules/dkimpy/default.nix
new file mode 100644
index 000000000000..aa3e06bd9257
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dkimpy/default.nix
@@ -0,0 +1,38 @@
+{ lib, fetchPypi, openssl, buildPythonPackage
+, pytest, dnspython, pynacl, authres, python }:
+
+buildPythonPackage rec {
+  pname = "dkimpy";
+  version = "1.1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-mmZ/hmS3Lrn4qhJQsHV8w5gqto9wxIrzkxe1jPYvLXU=";
+};
+
+  nativeCheckInputs = [ pytest ];
+  propagatedBuildInputs =  [ openssl dnspython pynacl authres ];
+
+  patchPhase = ''
+    substituteInPlace dkim/dknewkey.py --replace \
+      /usr/bin/openssl ${openssl}/bin/openssl
+  '';
+
+  checkPhase = ''
+    ${python.interpreter} ./test.py
+  '';
+
+  meta = with lib; {
+    description = "DKIM + ARC email signing/verification tools + Python module";
+    longDescription = ''
+      Python module that implements DKIM (DomainKeys Identified Mail) email
+      signing and verification. It also provides a number of convєnient tools
+      for command line signing and verification, as well as generating new DKIM
+      records. This version also supports the experimental Authenticated
+      Received Chain (ARC) protocol.
+    '';
+    homepage = "https://launchpad.net/dkimpy";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ leenaars ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dlib/build-cores.patch b/nixpkgs/pkgs/development/python-modules/dlib/build-cores.patch
new file mode 100644
index 000000000000..eebc69a330fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dlib/build-cores.patch
@@ -0,0 +1,27 @@
+diff --git a/setup.py b/setup.py
+index 0c8d8f16..565ef8ef 100644
+--- a/setup.py
++++ b/setup.py
+@@ -172,21 +172,7 @@ class CMakeBuild(build_ext):
+         subprocess.check_call(cmake_build, cwd=build_folder)
+ 
+ def num_available_cpu_cores(ram_per_build_process_in_gb):
+-    if 'TRAVIS' in os.environ and os.environ['TRAVIS']=='true':
+-        # When building on travis-ci, just use 2 cores since travis-ci limits
+-        # you to that regardless of what the hardware might suggest.
+-        return 2 
+-    try:
+-        mem_bytes = os.sysconf('SC_PAGE_SIZE') * os.sysconf('SC_PHYS_PAGES')  
+-        mem_gib = mem_bytes/(1024.**3)
+-        num_cores = multiprocessing.cpu_count() 
+-        # make sure we have enough ram for each build process.
+-        mem_cores = int(floor(mem_gib/float(ram_per_build_process_in_gb)+0.5));
+-        # We are limited either by RAM or CPU cores.  So pick the limiting amount
+-        # and return that.
+-        return max(min(num_cores, mem_cores), 1)
+-    except ValueError:
+-        return 2 # just assume 2 if we can't get the os to tell us the right answer.
++    return os.getenv("NIX_BUILD_CORES", 1)
+ 
+ 
+ from setuptools.command.test import test as TestCommand
diff --git a/nixpkgs/pkgs/development/python-modules/dlib/default.nix b/nixpkgs/pkgs/development/python-modules/dlib/default.nix
new file mode 100644
index 000000000000..0a52d78c824f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dlib/default.nix
@@ -0,0 +1,34 @@
+{ stdenv, buildPythonPackage, dlib, python, pytest, more-itertools
+, sse4Support ? stdenv.hostPlatform.sse4_1Support
+, avxSupport ? stdenv.hostPlatform.avxSupport
+}:
+
+buildPythonPackage {
+  inherit (dlib) pname version src nativeBuildInputs buildInputs meta;
+
+  patches = [
+    ./build-cores.patch
+  ];
+
+  nativeCheckInputs = [ pytest more-itertools ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "more-itertools<6.0.0" "more-itertools" \
+      --replace "pytest==3.8" "pytest"
+  '';
+
+  # although AVX can be enabled, we never test with it. Some Hydra machines
+  # fail because of this, however their build results are probably used on hardware
+  # with AVX support.
+  checkPhase = ''
+    ${python.interpreter} nix_run_setup test --no USE_AVX_INSTRUCTIONS
+  '';
+
+  setupPyBuildFlags = [
+    "--set USE_SSE4_INSTRUCTIONS=${if sse4Support then "yes" else "no"}"
+    "--set USE_AVX_INSTRUCTIONS=${if avxSupport then "yes" else "no"}"
+  ];
+
+  dontUseCmakeConfigure = true;
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dlinfo/default.nix b/nixpkgs/pkgs/development/python-modules/dlinfo/default.nix
new file mode 100644
index 000000000000..b51c71913f5f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dlinfo/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "dlinfo";
+  version = "1.2.1";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5f6f43b47f3aa5fe12bd347cf536dc8fca6068c61a0a260e408bec7f6eb4bd38";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "dlinfo" ];
+
+  meta = {
+    description = "Python wrapper for libc's dlinfo and dyld_find on Mac";
+    homepage = "https://github.com/cloudflightio/python-dlinfo";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dllogger/default.nix b/nixpkgs/pkgs/development/python-modules/dllogger/default.nix
new file mode 100644
index 000000000000..2ae7bd683e01
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dllogger/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "dllogger";
+  version = "1.0.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "NVIDIA";
+    repo = "dllogger";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Hpr4yeRl+Dyaz6lRyH/5P6UQT184JEHPqgVlf4qHvOg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  # use examples as smoke tests since upstream has no tests
+  checkPhase = ''
+    runHook preCheck
+
+    python examples/dllogger_example.py
+    python examples/dllogger_singleton_example.py
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "dllogger" ];
+
+  meta = with lib; {
+    description = "A logging tool for deep learning";
+    homepage = "https://github.com/NVIDIA/dllogger";
+    changelog = "https://github.com/NVIDIA/dllogger/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dlms-cosem/default.nix b/nixpkgs/pkgs/development/python-modules/dlms-cosem/default.nix
new file mode 100644
index 000000000000..d106d1295595
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dlms-cosem/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, asn1crypto
+, attrs
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pyserial
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "dlms-cosem";
+  version = "21.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pwitab";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-BrLanP+SIRRof15yzqwcDOxw92phbW7m9CfORz0xo7I=";
+  };
+
+  propagatedBuildInputs = [
+    asn1crypto
+    attrs
+    cryptography
+    pyserial
+    python-dateutil
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dlms_cosem"
+  ];
+
+  meta = with lib; {
+    description = "Python module to parse DLMS/COSEM";
+    homepage = "https://github.com/pwitab/dlms-cosem";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dlx/default.nix b/nixpkgs/pkgs/development/python-modules/dlx/default.nix
new file mode 100644
index 000000000000..81ae3deda624
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dlx/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "dlx";
+  version = "1.0.4";
+
+  # untagged releases
+  src = fetchFromGitHub {
+    owner = "sraaphorst";
+    repo = "dlx_python";
+    rev = "02d1ed534df60513095633da07e67a6593b9e9b4";
+    sha256 = "0c6dblbypwmx6yrk9qxp157m3cd7lq3j411ifr3shscv1igxv5hk";
+  };
+
+  # No test suite, so just run an example
+  pythonImportsCheck = [ "dlx" ];
+  # ./examples/design.py requires pyncomb, not in tree
+  checkPhase = ''
+    # example sudoku board from ./examples/sudoku.py
+    ${python.interpreter} ./examples/sudoku.py 3 "070285010008903500000000000500010008010000090900040003000000000002408600090632080"
+  '';
+
+  meta = with lib; {
+    description = "Implementation of Donald Knuth's Dancing Links algorithm";
+    homepage = "https://github.com/sraaphorst/dlx_python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dm-env/default.nix b/nixpkgs/pkgs/development/python-modules/dm-env/default.nix
new file mode 100644
index 000000000000..a11d35495575
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dm-env/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, dm-tree
+, numpy
+, absl-py
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "dm-env";
+  version = "1.6";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-pDbrHGVMOeDJhqUWzuIYvqcUC1EPzv9j+X60/P89k94=";
+  };
+
+  buildInputs = [
+    absl-py
+    dm-tree
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dm_env"
+  ];
+
+  meta = with lib; {
+    description = "Pure Python client for Apache Kafka";
+    homepage = "https://github.com/dpkp/kafka-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dm-haiku/default.nix b/nixpkgs/pkgs/development/python-modules/dm-haiku/default.nix
new file mode 100644
index 000000000000..7e2a3b3573cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dm-haiku/default.nix
@@ -0,0 +1,70 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, callPackage
+, lib
+, jmp
+, tabulate
+, jaxlib
+}:
+
+buildPythonPackage rec {
+  pname = "dm-haiku";
+  version = "0.0.10";
+
+  src = fetchFromGitHub {
+    owner = "deepmind";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-EZx3o6PgTeFjTwI9Ko9H39EqPSE0yLWWpsdqX6ALlo4=";
+  };
+
+  patches = [
+    # https://github.com/deepmind/dm-haiku/issues/717
+    (fetchpatch {
+      name = "remove-typing-extensions.patch";
+      url = "https://github.com/deepmind/dm-haiku/commit/c22867db1a3314a382bd2ce36511e2b756dc32a8.patch";
+      hash = "sha256-SxJc8FrImwMqTJ5OuJ1f4T+HfHgW/sGqXeIqlxEatlE=";
+    })
+    # https://github.com/deepmind/dm-haiku/pull/672
+    (fetchpatch {
+      name = "fix-find-namespace-packages.patch";
+      url = "https://github.com/deepmind/dm-haiku/commit/728031721f77d9aaa260bba0eddd9200d107ba5d.patch";
+      hash = "sha256-qV94TdJnphlnpbq+B0G3KTx5CFGPno+8FvHyu/aZeQE=";
+    })
+  ];
+
+  outputs = [
+    "out"
+    "testsout"
+  ];
+
+  propagatedBuildInputs = [
+    jaxlib
+    jmp
+    tabulate
+  ];
+
+  pythonImportsCheck = [
+    "haiku"
+  ];
+
+  postInstall = ''
+    mkdir $testsout
+    cp -R examples $testsout/examples
+  '';
+
+  # check in passthru.tests.pytest to escape infinite recursion with bsuite
+  doCheck = false;
+
+  passthru.tests = {
+    pytest = callPackage ./tests.nix { };
+  };
+
+  meta = with lib; {
+    description = "Haiku is a simple neural network library for JAX developed by some of the authors of Sonnet.";
+    homepage = "https://github.com/deepmind/dm-haiku";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ndl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dm-haiku/tests.nix b/nixpkgs/pkgs/development/python-modules/dm-haiku/tests.nix
new file mode 100644
index 000000000000..dec909729dcf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dm-haiku/tests.nix
@@ -0,0 +1,68 @@
+{ buildPythonPackage
+, dm-haiku
+, chex
+, cloudpickle
+, dill
+, dm-tree
+, jaxlib
+, pytest-xdist
+, pytestCheckHook
+, tensorflow
+, bsuite
+, frozendict
+, dm-env
+, scikit-image
+, rlax
+, distrax
+, tensorflow-probability
+, optax
+}:
+
+buildPythonPackage {
+  pname = "dm-haiku-tests";
+  inherit (dm-haiku) version;
+
+  src = dm-haiku.testsout;
+
+  dontBuild = true;
+  dontInstall = true;
+
+  nativeCheckInputs = [
+    bsuite
+    chex
+    cloudpickle
+    dill
+    distrax
+    dm-env
+    dm-haiku
+    dm-tree
+    frozendict
+    jaxlib
+    pytest-xdist
+    pytestCheckHook
+    optax
+    rlax
+    scikit-image
+    tensorflow
+    tensorflow-probability
+  ];
+
+  disabledTests = [
+    # See https://github.com/deepmind/dm-haiku/issues/366.
+    "test_jit_Recurrent"
+    # Assertion errors
+    "test_connect_conv_padding_function_same0"
+    "test_connect_conv_padding_function_valid0"
+    "test_connect_conv_padding_function_same1"
+    "test_connect_conv_padding_function_same2"
+    "test_connect_conv_padding_function_valid1"
+    "test_connect_conv_padding_function_valid2"
+    "test_invalid_axis_ListString"
+    "test_invalid_axis_String"
+    "test_simple_case"
+    "test_simple_case_with_scale"
+    "test_slice_axis"
+    "test_zero_inputs"
+  ];
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dm-sonnet/default.nix b/nixpkgs/pkgs/development/python-modules/dm-sonnet/default.nix
new file mode 100644
index 000000000000..1947a07b835a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dm-sonnet/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, click
+, dm-tree
+, docutils
+, etils
+, fetchFromGitHub
+, fetchpatch
+, numpy
+, pythonOlder
+, tabulate
+, tensorflow
+, tensorflow-datasets
+, wrapt
+}:
+
+buildPythonPackage rec {
+  pname = "dm-sonnet";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "deepmind";
+    repo = "sonnet";
+    rev = "v${version}";
+    hash = "sha256-YSMeH5ZTfP1OdLBepsxXAVczBG/ghSjCWjoz/I+TFl8=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "replace-np-bool-with-np-bool_.patch";
+      url = "https://github.com/deepmind/sonnet/commit/df5d099d4557a9a81a0eb969e5a81ed917bcd612.patch";
+      hash = "sha256-s7abl83osD4wa0ZhqgDyjqQ3gagwGYCdQifwFqhNp34=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    dm-tree
+    etils
+    numpy
+    tabulate
+    wrapt
+  ] ++ etils.optional-dependencies.epath;
+
+  passthru.optional-dependencies = {
+    tensorflow = [
+      tensorflow
+    ];
+  };
+
+  nativeCheckInputs = [
+    click
+    docutils
+    tensorflow
+    tensorflow-datasets
+  ];
+
+  pythonImportsCheck = [
+    "sonnet"
+  ];
+
+  meta = with lib; {
+    description = "Library for building neural networks in TensorFlow";
+    homepage = "https://github.com/deepmind/sonnet";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dm-tree/cmake.patch b/nixpkgs/pkgs/development/python-modules/dm-tree/cmake.patch
new file mode 100644
index 000000000000..28f201a30f71
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dm-tree/cmake.patch
@@ -0,0 +1,141 @@
+diff --git a/tree/CMakeLists.txt b/tree/CMakeLists.txt
+index 4fd1b1a..f0d072b 100644
+--- a/tree/CMakeLists.txt
++++ b/tree/CMakeLists.txt
+@@ -50,70 +50,79 @@ if(APPLE)
+   set (CMAKE_FIND_FRAMEWORK LAST)
+ endif()
+ 
+-# Fetch pybind to be able to use pybind11_add_module symbol.
+-set(PYBIND_VER v2.10.1)
+-include(FetchContent)
+-FetchContent_Declare(
+-  pybind11
+-  GIT_REPOSITORY https://github.com/pybind/pybind11
+-  GIT_TAG        ${PYBIND_VER}
+-)
+-if(NOT pybind11_POPULATED)
+-    FetchContent_Populate(pybind11)
+-    add_subdirectory(${pybind11_SOURCE_DIR} ${pybind11_BINARY_DIR})
+-    include_directories(${pybind11_INCLUDE_DIR})
+-endif()
+-
+-# Needed to disable Abseil tests.
+-set (BUILD_TESTING OFF)
+-
+-# Include abseil-cpp.
+-set(ABSEIL_VER 20210324.2)
+-include(ExternalProject)
+-set(ABSEIL_CMAKE_ARGS
+-    "-DCMAKE_INSTALL_PREFIX=${CMAKE_SOURCE_DIR}/abseil-cpp"
+-    "-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}"
+-    "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
+-    "-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}"
+-    "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
+-    "-DCMAKE_POSITION_INDEPENDENT_CODE=${CMAKE_POSITION_INDEPENDENT_CODE}"
+-    "-DLIBRARY_OUTPUT_PATH=${CMAKE_SOURCE_DIR}/abseil-cpp/lib")
+-if(DEFINED CMAKE_OSX_ARCHITECTURES)
+-    set(ABSEIL_CMAKE_ARGS
+-        ${ABSEIL_CMAKE_ARGS}
+-        "-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}")
++find_package(pybind11 CONFIG)
++
++if (NOT pybind11_FOUND)
++  # Fetch pybind to be able to use pybind11_add_module symbol.
++  set(PYBIND_VER v2.10.1)
++  include(FetchContent)
++  FetchContent_Declare(
++    pybind11
++    GIT_REPOSITORY https://github.com/pybind/pybind11
++    GIT_TAG        ${PYBIND_VER}
++  )
++  if(NOT pybind11_POPULATED)
++      FetchContent_Populate(pybind11)
++      add_subdirectory(${pybind11_SOURCE_DIR} ${pybind11_BINARY_DIR})
++      include_directories(${pybind11_INCLUDE_DIR})
++  endif()
+ endif()
+-ExternalProject_Add(abseil-cpp
+-  GIT_REPOSITORY    https://github.com/abseil/abseil-cpp.git
+-  GIT_TAG           ${ABSEIL_VER}
+-  PREFIX            ${CMAKE_SOURCE_DIR}/abseil-cpp
+-  CMAKE_ARGS        ${ABSEIL_CMAKE_ARGS}
+-)
+-ExternalProject_Get_Property(abseil-cpp install_dir)
+-set(abseil_install_dir ${install_dir})
+-include_directories (${abseil_install_dir}/include)
+-
+ 
+ # Define pybind11 tree module.
+ pybind11_add_module(_tree tree.h tree.cc)
+-add_dependencies(_tree abseil-cpp)
+-
++find_package(absl)
++
++if (NOT absl_FOUND)
++  # Needed to disable Abseil tests.
++  set (BUILD_TESTING OFF)
++
++  # Include abseil-cpp.
++  set(ABSEIL_VER 20210324.2)
++  include(ExternalProject)
++  set(ABSEIL_CMAKE_ARGS
++      "-DCMAKE_INSTALL_PREFIX=${CMAKE_SOURCE_DIR}/abseil-cpp"
++      "-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}"
++      "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
++      "-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}"
++      "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
++      "-DCMAKE_POSITION_INDEPENDENT_CODE=${CMAKE_POSITION_INDEPENDENT_CODE}"
++      "-DLIBRARY_OUTPUT_PATH=${CMAKE_SOURCE_DIR}/abseil-cpp/lib")
++  if(DEFINED CMAKE_OSX_ARCHITECTURES)
++      set(ABSEIL_CMAKE_ARGS
++          ${ABSEIL_CMAKE_ARGS}
++          "-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}")
++  endif()
++  ExternalProject_Add(abseil-cpp
++    GIT_REPOSITORY    https://github.com/abseil/abseil-cpp.git
++    GIT_TAG           ${ABSEIL_VER}
++    PREFIX            ${CMAKE_SOURCE_DIR}/abseil-cpp
++    CMAKE_ARGS        ${ABSEIL_CMAKE_ARGS}
++  )
++  ExternalProject_Get_Property(abseil-cpp install_dir)
++  set(abseil_install_dir ${install_dir})
++  include_directories (${abseil_install_dir}/include)
++
++  add_dependencies(_tree abseil-cpp)
++
++  if (WIN32 OR MSVC)
++      set(ABSEIL_LIB_PREF "absl")
++      set(LIB_SUFF "lib")
++  else()
++      set(ABSEIL_LIB_PREF "libabsl")
++      set(LIB_SUFF "a")
++  endif()
++
+-if (WIN32 OR MSVC)
+-    set(ABSEIL_LIB_PREF "absl")
+-    set(LIB_SUFF "lib")
++  # Link abseil static libs.
++  # We don't use find_library here to force cmake to build abseil before linking.
++  set(ABSEIL_LIBS int128 raw_hash_set raw_logging_internal strings throw_delegate)
++  foreach(ABSEIL_LIB IN LISTS ABSEIL_LIBS)
++    target_link_libraries(_tree PRIVATE
++        "${abseil_install_dir}/lib/${ABSEIL_LIB_PREF}_${ABSEIL_LIB}.${LIB_SUFF}")
++  endforeach()
+ else()
+-    set(ABSEIL_LIB_PREF "libabsl")
+-    set(LIB_SUFF "a")
++  target_link_libraries(_tree PRIVATE absl::int128 absl::raw_hash_set absl::raw_logging_internal absl::strings absl::throw_delegate)
+ endif()
+ 
+-# Link abseil static libs.
+-# We don't use find_library here to force cmake to build abseil before linking.
+-set(ABSEIL_LIBS int128 raw_hash_set raw_logging_internal strings throw_delegate)
+-foreach(ABSEIL_LIB IN LISTS ABSEIL_LIBS)
+-  target_link_libraries(_tree PRIVATE
+-      "${abseil_install_dir}/lib/${ABSEIL_LIB_PREF}_${ABSEIL_LIB}.${LIB_SUFF}")
+-endforeach()
+-
+ # Make the module private to tree package.
+ set_target_properties(_tree PROPERTIES OUTPUT_NAME tree/_tree)
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/dm-tree/default.nix b/nixpkgs/pkgs/development/python-modules/dm-tree/default.nix
new file mode 100644
index 000000000000..de1a5f664648
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dm-tree/default.nix
@@ -0,0 +1,57 @@
+{ stdenv
+, abseil-cpp
+, absl-py
+, attrs
+, buildPythonPackage
+, cmake
+, fetchFromGitHub
+, lib
+, numpy
+, pybind11
+, wrapt
+}:
+
+buildPythonPackage rec {
+  pname = "dm-tree";
+  version = "0.1.8";
+
+  src = fetchFromGitHub {
+    owner = "deepmind";
+    repo = "tree";
+    rev = "refs/tags/${version}";
+    hash = "sha256-VvSJTuEYjIz/4TTibSLkbg65YmcYqHImTHOomeorMJc=";
+  };
+
+  patches = [
+    ./cmake.patch
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  nativeBuildInputs = [
+    cmake
+    pybind11
+  ];
+
+  buildInputs = [
+    abseil-cpp
+    pybind11
+  ];
+
+  nativeCheckInputs = [
+    absl-py
+    attrs
+    numpy
+    wrapt
+  ];
+
+  pythonImportsCheck = [ "tree" ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Tree is a library for working with nested data structures.";
+    homepage = "https://github.com/deepmind/tree";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ samuela ndl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dmenu/default.nix b/nixpkgs/pkgs/development/python-modules/dmenu/default.nix
new file mode 100644
index 000000000000..130110173eed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dmenu/default.nix
@@ -0,0 +1,24 @@
+{ buildPythonPackage, lib, fetchPypi, dmenu }:
+
+buildPythonPackage rec {
+  pname = "dmenu-python";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "dmenu";
+    sha256 = "06v2fq0ciallbib7sbk4kncj0n3gdqp1kz8n5k2669x49wyh34wm";
+  };
+
+  propagatedBuildInputs = [ dmenu ];
+
+  # No tests existing
+  doCheck = false;
+
+  meta = {
+    description = "A Python wrapper for dmenu";
+    homepage = "https://dmenu.readthedocs.io";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.nico202 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dnachisel/default.nix b/nixpkgs/pkgs/development/python-modules/dnachisel/default.nix
new file mode 100644
index 000000000000..5a70ae1c16df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dnachisel/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, biopython
+, docopt
+, flametree
+, numpy
+, proglog
+, pytestCheckHook
+, pythonOlder
+, python-codon-tables
+, primer3
+, genome-collector
+, matplotlib
+}:
+
+buildPythonPackage rec {
+  pname = "dnachisel";
+  version = "3.2.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Edinburgh-Genome-Foundry";
+    repo = "DnaChisel";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-rcZq/HhU1xIyQ1jM8+gO9ONDLBAxiUIByoWk2nMwuGA=";
+  };
+
+  propagatedBuildInputs = [
+    biopython
+    docopt
+    flametree
+    numpy
+    proglog
+    python-codon-tables
+  ];
+
+  nativeCheckInputs = [
+    primer3
+    genome-collector
+    matplotlib
+    pytestCheckHook
+  ];
+
+  # Disable tests which requires network access
+  disabledTests = [
+    "test_circular_sequence_optimize_with_report"
+    "test_constraints_reports"
+    "test_optimize_with_report"
+    "test_optimize_with_report_no_solution"
+    "test_avoid_blast_matches_with_list"
+    "test_avoid_phage_blast_matches"
+    "test_avoid_matches_with_list"
+    "test_avoid_matches_with_phage"
+  ];
+
+  pythonImportsCheck = [
+    "dnachisel"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Edinburgh-Genome-Foundry/DnaChisel";
+    description = "Optimize DNA sequences under constraints";
+    changelog = "https://github.com/Edinburgh-Genome-Foundry/DnaChisel/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dnfile/default.nix b/nixpkgs/pkgs/development/python-modules/dnfile/default.nix
new file mode 100644
index 000000000000..232927aace70
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dnfile/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pefile
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "dnfile";
+  version = "0.14.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "malwarefrank";
+    repo = "dnfile";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-5xkoG7c9Piwrv+9qour7MZ+rabdngtd05b0T+AU8tSo=";
+    fetchSubmodules = true;
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pefile
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dnfile"
+  ];
+
+  meta = with lib; {
+    description = "Module to parse .NET executable files";
+    homepage = "hhttps://github.com/malwarefrank/dnfile";
+    changelog = "https://github.com/malwarefrank/dnfile/blob/v${version}/HISTORY.rst";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dns-lexicon/default.nix b/nixpkgs/pkgs/development/python-modules/dns-lexicon/default.nix
new file mode 100644
index 000000000000..6cc982c5df53
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dns-lexicon/default.nix
@@ -0,0 +1,118 @@
+{ lib
+, beautifulsoup4
+, boto3
+, buildPythonPackage
+, cryptography
+, dnspython
+, fetchFromGitHub
+, importlib-metadata
+, localzone
+, oci
+, poetry-core
+, pyotp
+, pytest-vcr
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, requests
+, softlayer
+, tldextract
+, zeep
+}:
+
+buildPythonPackage rec {
+  pname = "dns_lexicon";
+  version = "3.16.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Analogj";
+    repo = "lexicon";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-79/zz0TOCpx26TEo6gi9JDBQeVW2azWnxAjWr/FGRLA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    cryptography
+    pyotp
+    pyyaml
+    requests
+    tldextract
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    importlib-metadata
+  ];
+
+  passthru.optional-dependencies = {
+    route53 = [
+      boto3
+    ];
+    localzone = [
+      localzone
+    ];
+    softlayer = [
+      softlayer
+    ];
+    ddns = [
+      dnspython
+    ];
+    duckdns = [
+      dnspython
+    ];
+    oci = [
+      oci
+    ];
+    full = [
+      boto3
+      dnspython
+      localzone
+      oci
+      softlayer
+      zeep
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-vcr
+  ] ++ passthru.optional-dependencies.full;
+
+  pytestFlagsArray = [
+    "tests/"
+  ];
+
+  disabledTestPaths = [
+    # Needs network access
+    "tests/providers/test_auto.py"
+    # Needs network access (and an API token)
+    "tests/providers/test_namecheap.py"
+  ];
+
+  disabledTests = [
+    # Tests want to download Public Suffix List
+    "test_client_legacy_init"
+    "test_client_basic_init"
+    "test_client_init"
+    "test_client_parse_env"
+    "test_missing"
+    "action_is_correctly"
+  ];
+
+  pythonImportsCheck = [
+    "lexicon"
+  ];
+
+  meta = with lib; {
+    description = "Manipulate DNS records on various DNS providers in a standardized way";
+    homepage = "https://github.com/AnalogJ/lexicon";
+    changelog = "https://github.com/AnalogJ/lexicon/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ aviallon ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dnslib/default.nix b/nixpkgs/pkgs/development/python-modules/dnslib/default.nix
new file mode 100644
index 000000000000..26be9f9301ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dnslib/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, python
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dnslib";
+  version = "0.9.23";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MQGW0+OM4gUbYe670vHQj8yTT6M2DyIDGGTRbv6Lync=";
+  };
+
+  checkPhase = ''
+    VERSIONS=${python.interpreter} ./run_tests.sh
+  '';
+
+  pythonImportsCheck = [
+    "dnslib"
+  ];
+
+  meta = with lib; {
+    description = "Simple library to encode/decode DNS wire-format packets";
+    homepage = "https://github.com/paulc/dnslib";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ delroth ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dnspython/default.nix b/nixpkgs/pkgs/development/python-modules/dnspython/default.nix
new file mode 100644
index 000000000000..5bf9981170b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dnspython/default.nix
@@ -0,0 +1,95 @@
+{ lib
+, stdenv
+, aioquic
+, buildPythonPackage
+, cacert
+, cryptography
+, curio
+, fetchPypi
+, h2
+, httpx
+, idna
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-toolbelt
+, sniffio
+, trio
+}:
+
+buildPythonPackage rec {
+  pname = "dnspython";
+  version = "2.4.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jc+ujHRgovhLQHLibxyfQQHKIMBxZJy3w06LapPViYQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  passthru.optional-dependencies = {
+    DOH = [
+      httpx
+      h2
+      requests
+      requests-toolbelt
+    ];
+    IDNA = [
+      idna
+    ];
+    DNSSEC = [
+      cryptography
+    ];
+    trio = [
+      trio
+    ];
+    curio = [
+      curio
+      sniffio
+    ];
+    DOQ = [
+      aioquic
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  checkInputs = [
+    cacert
+  ] ++ passthru.optional-dependencies.DNSSEC;
+
+  disabledTests = [
+    # dns.exception.SyntaxError: protocol not found
+    "test_misc_good_WKS_text"
+    # fails if IPv6 isn't available
+    "test_resolver_override"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # Tests that run inconsistently on darwin systems
+    # 9 tests fail with: BlockingIOError: [Errno 35] Resource temporarily unavailable
+    "testQueryUDP"
+    # 6 tests fail with: dns.resolver.LifetimeTimeout: The resolution lifetime expired after ...
+    "testResolveCacheHit"
+    "testResolveTCP"
+  ];
+
+  pythonImportsCheck = [
+    "dns"
+  ];
+
+  meta = with lib; {
+    description = "A DNS toolkit for Python";
+    homepage = "https://www.dnspython.org";
+    changelog = "https://github.com/rthalley/dnspython/blob/v${version}/doc/whatsnew.rst";
+    license = with licenses; [ isc ];
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/doc8/default.nix b/nixpkgs/pkgs/development/python-modules/doc8/default.nix
new file mode 100644
index 000000000000..915918bc54b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/doc8/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, chardet
+, docutils
+, fetchpatch
+, fetchPypi
+, pbr
+, pygments
+, pytestCheckHook
+, pythonOlder
+, restructuredtext-lint
+, setuptools-scm
+, stevedore
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "doc8";
+  version = "1.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2XqT6PWi78RxOggEZX3trYN0XMpM0diN6Rhvd/l3YAQ=";
+  };
+
+  patches = [
+    # https://github.com/PyCQA/doc8/pull/146
+    (fetchpatch {
+      name = "remove-setuptools-scm-git-archive.patch";
+      url = "https://github.com/PyCQA/doc8/commit/06416e95041db92e4295b13ab596351618f6b32e.patch";
+      hash = "sha256-IIE3cDNOx+6RLjidGrokyazaX7MOVbMKUb7yQIM5sI0=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+    wheel
+  ];
+
+  buildInputs = [
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    docutils
+    chardet
+    stevedore
+    restructuredtext-lint
+    pygments
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "doc8"
+  ];
+
+  meta = with lib; {
+    description = "Style checker for Sphinx (or other) RST documentation";
+    homepage = "https://github.com/pycqa/doc8";
+    changelog = "https://github.com/PyCQA/doc8/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/docformatter/default.nix b/nixpkgs/pkgs/development/python-modules/docformatter/default.nix
new file mode 100644
index 000000000000..5e0240034413
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docformatter/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, charset-normalizer
+, tomli
+, untokenize
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "docformatter";
+  version = "1.7.5";
+
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "PyCQA";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-QUjeG84KwI5Y3MU1wrmjHBXU2tEJ0CuiR3Y/S+dX7Gs=";
+  };
+
+  patches = [
+    ./test-path.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'charset_normalizer = "^2.0.0"' 'charset_normalizer = ">=2.0.0"'
+    substituteInPlace tests/conftest.py \
+      --subst-var-by docformatter $out/bin/docformatter
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    charset-normalizer
+    tomli
+    untokenize
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "docformatter" ];
+
+  meta = {
+    changelog = "https://github.com/PyCQA/docformatter/blob/${src.rev}/CHANGELOG.md";
+    description = "Formats docstrings to follow PEP 257";
+    homepage = "https://github.com/myint/docformatter";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/docformatter/test-path.patch b/nixpkgs/pkgs/development/python-modules/docformatter/test-path.patch
new file mode 100644
index 000000000000..2959d84704e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docformatter/test-path.patch
@@ -0,0 +1,29 @@
+diff --git a/tests/conftest.py b/tests/conftest.py
+index 762d246..7f86763 100644
+--- a/tests/conftest.py
++++ b/tests/conftest.py
+@@ -101,21 +101,9 @@ def run_docformatter(arguments, temporary_file):
+ 
+     Return subprocess object.
+     """
+-    if "DOCFORMATTER_COVERAGE" in os.environ and int(
+-        os.environ["DOCFORMATTER_COVERAGE"]
+-    ):
+-        DOCFORMATTER_COMMAND = [
+-            "coverage",
+-            "run",
+-            "--branch",
+-            "--parallel",
+-            "--omit=*/site-packages/*",
+-            os.environ["VIRTUAL_ENV"] + "/bin/docformatter",
+-        ]
+-    else:
+-        DOCFORMATTER_COMMAND = [
+-            os.environ["VIRTUAL_ENV"] + "/bin/docformatter",
+-        ]  # pragma: no cover
++    DOCFORMATTER_COMMAND = [
++        "@docformatter@"
++    ]
+ 
+     if "-" not in arguments:
+         arguments.append(temporary_file)
diff --git a/nixpkgs/pkgs/development/python-modules/docker-py/default.nix b/nixpkgs/pkgs/development/python-modules/docker-py/default.nix
new file mode 100644
index 000000000000..2d88f64d36a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docker-py/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, six, requests, websocket-client, docker_pycreds }:
+
+buildPythonPackage rec {
+  version = "1.10.6";
+  pname = "docker-py";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "05f49f6hnl7npmi7kigg0ibqk8s3fhzx1ivvz1kqvlv4ay3paajc";
+  };
+
+  # The tests access the network.
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    six
+    requests
+    websocket-client
+    docker_pycreds
+  ];
+
+  meta = {
+    description = "Python library for the Docker Remote API";
+    homepage = "https://github.com/docker/docker-py/";
+    license = lib.licenses.asl20;
+    maintainers = [ lib.maintainers.pmiddend ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/docker-pycreds/default.nix b/nixpkgs/pkgs/development/python-modules/docker-pycreds/default.nix
new file mode 100644
index 000000000000..c022d62bfa84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docker-pycreds/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, six }:
+
+buildPythonPackage rec {
+  pname = "docker-pycreds";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6ce3270bcaf404cc4c3e27e4b6c70d3521deae82fb508767870fdbf772d584d4";
+  };
+
+  # require docker-credential-helpers binaries
+  doCheck = false;
+
+  propagatedBuildInputs = [ six ];
+
+  meta = with lib; {
+    description = "Python bindings for the docker credentials store API.";
+    homepage = "https://github.com/shin-/dockerpy-creds";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/docker/default.nix b/nixpkgs/pkgs/development/python-modules/docker/default.nix
new file mode 100644
index 000000000000..80c73f2fe0a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docker/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, packaging
+, paramiko
+, pytestCheckHook
+, requests
+, setuptools-scm
+, urllib3
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "docker";
+  version = "6.1.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-qm0XgwBFul7wFo1eqjTTe+6xE5SMQTr/4dWZH8EfmiA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+    requests
+    urllib3
+    websocket-client
+  ];
+
+  passthru.optional-dependencies.ssh = [
+    paramiko
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pytestFlagsArray = [
+    "tests/unit"
+  ];
+
+  # Deselect socket tests on Darwin because it hits the path length limit for a Unix domain socket
+  disabledTests = lib.optionals stdenv.isDarwin [
+    "api_test" "stream_response" "socket_file"
+  ];
+
+  dontUseSetuptoolsCheck = true;
+
+  pythonImportsCheck = [
+    "docker"
+  ];
+
+  meta = with lib; {
+    description = "An API client for docker written in Python";
+    homepage = "https://github.com/docker/docker-py";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dockerfile-parse/default.nix b/nixpkgs/pkgs/development/python-modules/dockerfile-parse/default.nix
new file mode 100644
index 000000000000..88a568ed258b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dockerfile-parse/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dockerfile-parse";
+  version = "2.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MYTM3FEyIZg+UDrADhqlBKKqj4Tl3mc8RrC27umex7w=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dockerfile_parse"
+  ];
+
+  disabledTests = [
+    # python-dockerfile-parse.spec is not present
+    "test_all_versions_match"
+  ];
+
+  meta = with lib; {
+    description = "Library for parsing Dockerfile files";
+    homepage = "https://github.com/DBuildService/dockerfile-parse";
+    changelog = "https://github.com/containerbuildsystem/dockerfile-parse/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ leenaars ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dockerpty/default.nix b/nixpkgs/pkgs/development/python-modules/dockerpty/default.nix
new file mode 100644
index 000000000000..775767e6fecf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dockerpty/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi, six }:
+
+buildPythonPackage rec {
+  pname = "dockerpty";
+  version = "0.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1kjn64wx23jmr8dcc6g7bwlmrhfmxr77gh6iphqsl39sayfxdab9";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  meta = with lib; {
+    description = "Functionality needed to operate the pseudo-tty (PTY) allocated to a docker container";
+    homepage = "https://github.com/d11wtq/dockerpty";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dockerspawner/default.nix b/nixpkgs/pkgs/development/python-modules/dockerspawner/default.nix
new file mode 100644
index 000000000000..bd8af6391a43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dockerspawner/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jupyterhub
+, escapism
+, docker
+}:
+
+buildPythonPackage rec {
+  pname = "dockerspawner";
+  version = "12.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3894ed8a9157f8ac8f42e0130f43932490ac5d1e89e6f295b1252f08c00ba36b";
+  };
+
+  propagatedBuildInputs = [
+    jupyterhub
+    escapism
+    docker
+  ];
+
+  # tests require docker
+  doCheck = false;
+
+  pythonImportsCheck = [ "dockerspawner" ];
+
+  meta = with lib; {
+    description = "Dockerspawner: A custom spawner for Jupyterhub";
+    homepage = "https://jupyter.org";
+    license = licenses.bsd3;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/docloud/default.nix b/nixpkgs/pkgs/development/python-modules/docloud/default.nix
new file mode 100644
index 000000000000..2c92b32c748c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docloud/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "docloud";
+  version = "1.0.375";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "996d55407498fd01e6c6c480f367048f92255e9ca9db0e9ea19aaef91328a441";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    six
+  ];
+
+  # Pypi's tarball doesn't contain tests. Source not available.
+  doCheck = false;
+  pythonImportsCheck = [ "docloud" ];
+
+  meta = with lib; {
+    description = "The IBM Decision Optimization on Cloud Python client";
+    homepage = "https://onboarding-oaas.docloud.ibmcloud.com/software/analytics/docloud/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/docopt-ng/default.nix b/nixpkgs/pkgs/development/python-modules/docopt-ng/default.nix
new file mode 100644
index 000000000000..cdeda778e0dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docopt-ng/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pdm-backend
+}:
+
+buildPythonPackage rec {
+  pname = "docopt-ng";
+  version = "0.9.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "docopt_ng";
+    inherit version;
+    hash = "sha256-kcbaELW7by6eJTRYKfuCeMeK8Bn2/ECIetSbBgSDsdc=";
+  };
+
+  nativeBuildInputs = [
+    pdm-backend
+  ];
+
+  pythonImportsCheck = [ "docopt" ];
+  doCheck = false; # no tests in the package
+
+  meta = with lib; {
+    description = "More-magic command line arguments parser. Now with more maintenance!";
+    homepage = "https://github.com/bazaar-projects/docopt-ng";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fgaz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/docopt/default.nix b/nixpkgs/pkgs/development/python-modules/docopt/default.nix
new file mode 100644
index 000000000000..68df40a3cbf2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docopt/default.nix
@@ -0,0 +1,17 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "docopt";
+  version = "0.6.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "14f4hn6d1j4b99svwbaji8n2zj58qicyz19mm0x6pmhb50jsics9";
+  };
+
+  meta = with lib; {
+    description = "Pythonic argument parser, that will make you smile";
+    homepage = "http://docopt.org/";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/docplex/default.nix b/nixpkgs/pkgs/development/python-modules/docplex/default.nix
new file mode 100644
index 000000000000..46018acec3b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docplex/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, futures ? null
+, docloud
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "docplex";
+  version = "2.25.236";
+
+  # No source available from official repo
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JWkUtMAROk4cePMuogx9dtyO/ihv6JAnDnXPrVD+UQ8=";
+  };
+
+  propagatedBuildInputs = [
+    docloud
+    requests
+  ] ++ lib.optional isPy27 futures;
+
+  doCheck = false;
+  pythonImportsCheck = [ "docplex" ];
+
+  meta = with lib; {
+    description = "IBM Decision Optimization CPLEX Modeling for Python";
+    homepage = "https://onboarding-oaas.docloud.ibmcloud.com/software/analytics/docloud/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/docrep/default.nix b/nixpkgs/pkgs/development/python-modules/docrep/default.nix
new file mode 100644
index 000000000000..78bbba8a790b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docrep/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "docrep";
+  version = "0.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ed8a17e201abd829ef8da78a0b6f4d51fb99a4cbd0554adbed3309297f964314";
+  };
+
+  nativeCheckInputs = [ pytest ];
+  propagatedBuildInputs = [ six ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  # tests not packaged with PyPi download
+  doCheck = false;
+
+  meta = {
+    description = "Python package for docstring repetition";
+    homepage = "https://github.com/Chilipp/docrep";
+    license = lib.licenses.gpl2;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/docstring-parser/default.nix b/nixpkgs/pkgs/development/python-modules/docstring-parser/default.nix
new file mode 100644
index 000000000000..e3e47d1c9079
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docstring-parser/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "docstring-parser";
+  version = "0.15";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rr-";
+    repo = "docstring_parser";
+    rev = "refs/tags/${version}";
+    hash = "sha256-rnDitZn/xI0I9KMQv6gxzVYevWUymDgyFETjAnRlEHw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "docstring_parser"
+  ];
+
+  meta = with lib; {
+    description = "Parse Python docstrings in various flavors";
+    homepage = "https://github.com/rr-/docstring_parser";
+    changelog = "https://github.com/rr-/docstring_parser/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SomeoneSerge ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/docstring-to-markdown/default.nix b/nixpkgs/pkgs/development/python-modules/docstring-to-markdown/default.nix
new file mode 100644
index 000000000000..2832228394c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docstring-to-markdown/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "docstring-to-markdown";
+  version = "0.12";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "python-lsp";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-c0gk1s/+25+pWUpi8geDQZ0f9JBeuvvFQ9MFskRnY6U=";
+  };
+
+  patches = [
+    # So pytest-flake8 and pytest-cov won't be needed
+    ./remove-coverage-tests.patch
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "docstring_to_markdown"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/python-lsp/docstring-to-markdown";
+    description = "On the fly conversion of Python docstrings to markdown";
+    changelog = "https://github.com/python-lsp/docstring-to-markdown/releases/tag/v${version}";
+    license = licenses.lgpl2Plus;
+    maintainers = with maintainers; [ doronbehar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/docstring-to-markdown/remove-coverage-tests.patch b/nixpkgs/pkgs/development/python-modules/docstring-to-markdown/remove-coverage-tests.patch
new file mode 100644
index 000000000000..68bc626ced91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docstring-to-markdown/remove-coverage-tests.patch
@@ -0,0 +1,16 @@
+diff --git i/setup.cfg w/setup.cfg
+index e880e74..e77133e 100644
+--- i/setup.cfg
++++ w/setup.cfg
+@@ -34,11 +34,7 @@ docstring-to-markdown = py.typed
+ [tool:pytest]
+ addopts =
+     --pyargs tests
+-    --cov docstring_to_markdown
+-    --cov-fail-under=98
+-    --cov-report term-missing:skip-covered
+     -p no:warnings
+-    --flake8
+     -vv
+ 
+ [flake8]
diff --git a/nixpkgs/pkgs/development/python-modules/doctest-ignore-unicode/default.nix b/nixpkgs/pkgs/development/python-modules/doctest-ignore-unicode/default.nix
new file mode 100644
index 000000000000..533dbed29b34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/doctest-ignore-unicode/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi, nose }:
+
+buildPythonPackage rec {
+  pname = "doctest-ignore-unicode";
+  version = "0.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1m9aa4qnyj21lbq4sbvmv1vcz7zksss4rz37ddf2hxv4hk8b547w";
+  };
+
+  propagatedBuildInputs = [ nose ];
+
+  meta = with lib; {
+    description = "Add flag to ignore unicode literal prefixes in doctests";
+    license = with licenses; [ asl20 ];
+    homepage = "https://github.com/gnublade/doctest-ignore-unicode";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/docutils/default.nix b/nixpkgs/pkgs/development/python-modules/docutils/default.nix
new file mode 100644
index 000000000000..136f679fcf6e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docutils/default.nix
@@ -0,0 +1,41 @@
+{ stdenv
+, lib
+, fetchPypi
+, buildPythonPackage
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "docutils";
+  version = "0.20.1";
+
+  disabled = pythonOlder "3.7";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8IpOJ2w6FYOobc4+NKuj/gTQK7ot1R7RYQYkToqSPjs=";
+  };
+
+  # Only Darwin needs LANG, but we could set it in general.
+  # It's done here conditionally to prevent mass-rebuilds.
+  checkPhase = lib.optionalString stdenv.isDarwin ''LANG="en_US.UTF-8" LC_ALL="en_US.UTF-8" '' + ''
+    ${python.interpreter} test/alltests.py
+  '';
+
+  # Create symlinks lacking a ".py" suffix, many programs depend on these names
+  postFixup = ''
+    for f in $out/bin/*.py; do
+      ln -s $(basename $f) $out/bin/$(basename $f .py)
+    done
+  '';
+
+  meta = with lib; {
+    description = "Python Documentation Utilities";
+    homepage = "http://docutils.sourceforge.net/";
+    license = with licenses; [ publicDomain bsd2 psfl gpl3Plus ];
+    maintainers = with maintainers; [ AndersonTorres ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/docx2python/default.nix b/nixpkgs/pkgs/development/python-modules/docx2python/default.nix
new file mode 100644
index 000000000000..f65f4f7c9075
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docx2python/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, poetry-core
+, lxml
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "docx2python";
+  version = "2.11.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ShayHill";
+    repo = "docx2python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-SavRYnNbESRQh9Elk8qCt/qdI2x+sYZJFMYy+Gojg2k=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    lxml
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "docx2python" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ShayHill/docx2python";
+    description = "Extract docx headers, footers, (formatted) text, footnotes, endnotes, properties, and images";
+    changelog = "https://github.com/ShayHill/docx2python/blob/${src.rev}/CHANGELOG.md";
+    maintainers = [ maintainers.ivar ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/docx2txt/default.nix b/nixpkgs/pkgs/development/python-modules/docx2txt/default.nix
new file mode 100644
index 000000000000..6b3c2777d78c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/docx2txt/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "docx2txt";
+  version = "0.8";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-LAbZjXz+LTlH5XYKV9kk4/8HdFs3nIc3cjki5wCSNuU=";
+  };
+
+  pythonImportsCheck = [
+    "docx2txt"
+  ];
+
+  meta = with lib; {
+    description = "A pure python-based utility to extract text and images from docx files";
+    homepage = "https://github.com/ankushshah89/python-docx2txt";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ilkecan ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dodgy/default.nix b/nixpkgs/pkgs/development/python-modules/dodgy/default.nix
new file mode 100644
index 000000000000..4437beb760ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dodgy/default.nix
@@ -0,0 +1,40 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, lib
+
+# pythonPackages
+, mock
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "dodgy";
+  version = "0.2.1";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "landscapeio";
+    repo = pname;
+    rev = version;
+    sha256 = "0ywwjpz0p6ls3hp1lndjr9ql6s5lkj7dgpll1h87w04kwan70j0x";
+  };
+
+  nativeCheckInputs = [
+    mock
+    nose
+  ];
+
+  checkPhase = ''
+    nosetests tests/test_checks.py
+  '';
+
+  meta = with lib; {
+    description = "Looks at Python code to search for things which look \"dodgy\" such as passwords or diffs";
+    homepage = "https://github.com/landscapeio/dodgy";
+    license = licenses.mit;
+    maintainers = with maintainers; [
+      kamadorueda
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dogpile-cache/default.nix b/nixpkgs/pkgs/development/python-modules/dogpile-cache/default.nix
new file mode 100644
index 000000000000..069d08f4d551
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dogpile-cache/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, pytestCheckHook
+, mako
+, decorator
+, stevedore
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "dogpile-cache";
+  version = "1.2.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "dogpile.cache";
+    inherit version;
+    hash = "sha256-/ZAiwNnLra3yCUI5GpWtrylr6AtC2qjiAvjeHCHxmLI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    decorator
+    stevedore
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mako
+  ];
+
+  meta = with lib; {
+    description = "A caching front-end based on the Dogpile lock";
+    homepage = "https://github.com/sqlalchemy/dogpile.cache";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dogtag-pki/default.nix b/nixpkgs/pkgs/development/python-modules/dogtag-pki/default.nix
new file mode 100644
index 000000000000..db41cf80847b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dogtag-pki/default.nix
@@ -0,0 +1,23 @@
+{ stdenv, lib, fetchPypi, buildPythonPackage, cryptography,
+python-ldap, requests, six }:
+
+buildPythonPackage rec {
+  pname = "dogtag-pki";
+  version = "11.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-rQSnQPNYr5SyeNbKoFAbnGb2X/8utrfWLa8gu93hy2w=";
+  };
+
+  buildInputs = [ cryptography python-ldap ];
+  pythonImportsCheck = [ "pki" ];
+  propagatedBuildInputs = [ requests six ];
+
+  meta = with lib; {
+    description = "An enterprise-class Certificate Authority";
+    homepage    = "https://github.com/dogtagpki/pki";
+    license     = licenses.gpl2;
+    maintainers = with maintainers; [ s1341 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dogtail/default.nix b/nixpkgs/pkgs/development/python-modules/dogtail/default.nix
new file mode 100644
index 000000000000..e25bc5d23ae7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dogtail/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, python
+, pygobject3
+, pyatspi
+, pycairo
+, at-spi2-core
+, gobject-introspection
+, gtk3
+, gsettings-desktop-schemas
+, fetchurl
+, dbus
+, xvfb-run
+, wrapGAppsHook
+# , fetchPypi
+}:
+
+buildPythonPackage {
+  pname = "dogtail";
+  version = "0.9.11";
+
+  outputs = [ "out" "dev" ];
+
+  # https://gitlab.com/dogtail/dogtail/issues/1
+  # src = fetchPypi {
+  #   inherit pname version;
+  #   sha256 = "0p5wfssvzr9w0bvhllzbbd8fnp4cca2qxcpcsc33dchrmh5n552x";
+  # };
+  src = fetchurl {
+    url = "https://gitlab.com/dogtail/dogtail/raw/released/dogtail-0.9.10.tar.gz";
+    sha256 = "EGyxYopupfXPYtTL9mm9ujZorvh8AGaNXVKBPWsGy3c=";
+  };
+
+  patches = [
+    ./nix-support.patch
+  ];
+
+  nativeBuildInputs = [ gobject-introspection dbus xvfb-run wrapGAppsHook ]; # for setup hooks
+  propagatedBuildInputs = [ at-spi2-core gtk3 pygobject3 pyatspi pycairo ];
+
+  checkPhase = ''
+    runHook preCheck
+    export XDG_DATA_DIRS=${gsettings-desktop-schemas}/share/gsettings-schemas/${gsettings-desktop-schemas.name}:$XDG_DATA_DIRS
+    # export NO_AT_BRIDGE=1
+    gsettings set org.gnome.desktop.interface toolkit-accessibility true
+    xvfb-run -s '-screen 0 800x600x24' dbus-run-session \
+      --config-file=${dbus}/share/dbus-1/session.conf \
+      ${python.interpreter} nix_run_setup test
+    runHook postCheck
+  '';
+
+  dontWrapGApps = true;
+
+  preFixup = ''
+    makeWrapperArgs+=("''${gappsWrapperArgs[@]}")
+  '';
+
+  # TODO: Tests require accessibility
+  doCheck = false;
+
+  meta = {
+    description = "GUI test tool and automation framework that uses Accessibility technologies to communicate with desktop applications";
+    homepage = "https://gitlab.com/dogtail/dogtail";
+    license = lib.licenses.gpl2Only;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dogtail/nix-support.patch b/nixpkgs/pkgs/development/python-modules/dogtail/nix-support.patch
new file mode 100644
index 000000000000..e8a65bbc87be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dogtail/nix-support.patch
@@ -0,0 +1,35 @@
+--- a/dogtail/distro.py
++++ b/dogtail/distro.py
+@@ -233,6 +233,11 @@
+         PackageDb.__init__(self)
+ 
+ 
++class _NixPackageDb(PackageDb):  # pragma: no cover
++    def __init__(self):
++        PackageDb.__init__(self)
++
++
+ class JhBuildPackageDb(PackageDb):  # pragma: no cover
+     def __init__(self):
+         PackageDb.__init__(self)
+@@ -324,6 +329,11 @@
+         self.packageDb = _SolarisPackageDb()
+ 
+ 
++class Nix(Distro):  # pragma: no cover
++    def __init__(self):
++        self.packageDb = _NixPackageDb()
++
++
+ class JHBuild(Distro):  # pragma: no cover
+     def __init__(self):
+         self.packageDb = JhBuildPackageDb()
+@@ -358,6 +368,8 @@
+     elif os.path.exists("/etc/release") and \
+             re.match(".*Solaris", open("/etc/release").readline()):  # pragma: no cover
+         distro = Solaris()  # pragma: no cover
++    elif os.path.exists("/nix/store"):  # pragma: no cover
++        distro = Nix()  # pragma: no cover
+     elif os.path.exists("/etc/os-release") and \
+             re.match(".*GNOME-Continuous", open("/etc/os-release").readline()):  # pragma: no cover
+         distro = GnomeContinuous()  # pragma: no cover
diff --git a/nixpkgs/pkgs/development/python-modules/doit-py/default.nix b/nixpkgs/pkgs/development/python-modules/doit-py/default.nix
new file mode 100644
index 000000000000..ed8666a03490
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/doit-py/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, doit
+, configclass
+, mergedict
+, pytestCheckHook
+, hunspell
+, hunspellDicts
+}:
+
+buildPythonPackage rec {
+  pname = "doit-py";
+  version = "0.5.0";
+
+  src = fetchFromGitHub {
+    owner = "pydoit";
+    repo = pname;
+    rev = version;
+    hash = "sha256-DBl6/no04ZGRHHmN9gkEtBmAMgmyZWcfPCcFz0uxAv4=";
+  };
+
+  propagatedBuildInputs = [
+    configclass
+    doit
+    mergedict
+  ];
+
+  nativeCheckInputs = [
+    hunspell
+    hunspellDicts.en_US
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Disable linting checks
+    "tests/test_pyflakes.py"
+  ];
+
+  pythonImportsCheck = [ "doitpy" ];
+
+  meta = with lib; {
+    description = "doit tasks for python stuff";
+    homepage = "http://pythonhosted.org/doit-py";
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/doit/default.nix b/nixpkgs/pkgs/development/python-modules/doit/default.nix
new file mode 100644
index 000000000000..d3cc29c775ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/doit/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, stdenv
+, fetchPypi
+, buildPythonPackage
+, importlib-metadata
+, isPy3k
+, mock
+, pytestCheckHook
+, cloudpickle
+, pyinotify
+, macfsevents
+, toml
+, doit-py
+, pyflakes
+, configclass
+, mergedict
+}:
+
+let doit = buildPythonPackage rec {
+  pname = "doit";
+  version = "0.36.0";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-cdB8zJUUyyL+WdmJmVd2ZeqrV+FvZE0EM2rgtLriNLw=";
+  };
+
+  propagatedBuildInputs = [
+    cloudpickle
+    importlib-metadata
+    toml
+  ] ++ lib.optional stdenv.isLinux pyinotify
+    ++ lib.optional stdenv.isDarwin macfsevents;
+
+  nativeCheckInputs = [
+    configclass
+    doit-py
+    mergedict
+    mock
+    pyflakes
+    pytestCheckHook
+  ];
+
+  # escape infinite recursion with doit-py
+  doCheck = false;
+
+  passthru.tests = {
+    # hangs on darwin
+    check = doit.overridePythonAttrs (_: { doCheck = !stdenv.isDarwin; });
+  };
+
+  pythonImportsCheck = [ "doit" ];
+
+  meta = with lib; {
+    homepage = "https://pydoit.org/";
+    description = "A task management & automation tool";
+    license = licenses.mit;
+    longDescription = ''
+      doit is a modern open-source build-tool written in python
+      designed to be simple to use and flexible to deal with complex
+      work-flows. It is specially suitable for building and managing
+      custom work-flows where there is no out-of-the-box solution
+      available.
+    '';
+    maintainers = with maintainers; [ pSub ];
+  };
+
+}; in doit
diff --git a/nixpkgs/pkgs/development/python-modules/dokuwiki/default.nix b/nixpkgs/pkgs/development/python-modules/dokuwiki/default.nix
new file mode 100644
index 000000000000..0d221c3b73b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dokuwiki/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+}:
+
+buildPythonPackage rec {
+  pname = "dokuwiki";
+  version = "1.3.3";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gtTyO6jmjQT0ZwmxvH+RAe1v5aruNStfP1qz1+AqYXs=";
+  };
+
+  pythonImportsCheck = [
+    "dokuwiki"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/fmenabe/python-dokuwiki";
+    description = "A python module that aims to manage DokuWiki wikis by using the provided XML-RPC API";
+    license = licenses.mit;
+    maintainers = with maintainers; [ netali ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/domeneshop/default.nix b/nixpkgs/pkgs/development/python-modules/domeneshop/default.nix
new file mode 100644
index 000000000000..b266412219b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/domeneshop/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, urllib3
+, pyopenssl
+, cryptography
+, idna
+, certifi
+}:
+
+buildPythonPackage rec {
+  pname = "domeneshop";
+  version = "0.4.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-kL0X1mEsmVWqnq5NgsMBxeAu48zjmi3muhZYryTCOMo=";
+  };
+
+  propagatedBuildInputs = [
+    certifi
+    urllib3
+  ];
+
+  # There are none
+  doCheck = false;
+
+  pythonImportsCheck = [ "domeneshop" ];
+
+  meta = with lib; {
+    description = "Python library for working with the Domeneshop API";
+    homepage = "https://api.domeneshop.no/docs/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ pbsds ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dominate/default.nix b/nixpkgs/pkgs/development/python-modules/dominate/default.nix
new file mode 100644
index 000000000000..38aaccf4b15a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dominate/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dominate";
+  version = "2.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-TJDDvvr4jmErcfSzmve8vviXes+oVc7JVyJaj79QQAc=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dominate"
+  ];
+
+  meta = with lib; {
+    description = "Library for creating and manipulating HTML documents using an elegant DOM API";
+    homepage = "https://github.com/Knio/dominate/";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/doorbirdpy/default.nix b/nixpkgs/pkgs/development/python-modules/doorbirdpy/default.nix
new file mode 100644
index 000000000000..c06ab09a4d6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/doorbirdpy/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitLab
+, requests
+, pytestCheckHook
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "doorbirdpy";
+  version = "2.2.2";
+  format = "setuptools";
+
+  src = fetchFromGitLab {
+    owner = "klikini";
+    repo = "doorbirdpy";
+    rev = version;
+    hash = "sha256-pgL4JegD1gANefp7jLYb74N9wgpkDgQc/Fe+NyLBrkA=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pythonImportsCheck = [
+    "doorbirdpy"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for the DoorBird LAN API";
+    homepage = "https://gitlab.com/klikini/doorbirdpy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dopy/default.nix b/nixpkgs/pkgs/development/python-modules/dopy/default.nix
new file mode 100644
index 000000000000..9bd32d1ba4a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dopy/default.nix
@@ -0,0 +1,30 @@
+{ pkgs
+, buildPythonPackage
+, requests
+, six
+}:
+
+buildPythonPackage {
+  pname = "dopy";
+  version = "2016-01-04";
+
+  src = pkgs.fetchFromGitHub {
+    owner = "Wiredcraft";
+    repo = "dopy";
+    rev = "cb443214166a4e91b17c925f40009ac883336dc3";
+    sha256 = "0ams289qcgna96aak96jbz6wybs6qb95h2gn8lb4lmx2p5sq4q56";
+  };
+
+  propagatedBuildInputs = [ requests six ];
+
+  # contains no tests
+  doCheck = false;
+  pythonImportsCheck = [ "dopy" ];
+
+  meta = with pkgs.lib; {
+    description = "Digital Ocean API python wrapper";
+    homepage = "https://github.com/Wiredcraft/dopy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lihop ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dot2tex/default.nix b/nixpkgs/pkgs/development/python-modules/dot2tex/default.nix
new file mode 100644
index 000000000000..f722c80bdad7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dot2tex/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, substituteAll
+, pyparsing
+, graphviz
+, pytestCheckHook
+, texliveSmall
+}:
+
+buildPythonPackage rec {
+  pname = "dot2tex";
+  version = "2.11.3";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-KZoq8FruW74CV6VipQapPieSk9XDjyjQirissyM/584=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./path.patch;
+      inherit graphviz;
+    })
+    ./test.patch # https://github.com/kjellmf/dot2tex/issues/5
+
+    # https://github.com/xyz2tex/dot2tex/pull/104 does not merge cleanly
+    ./remove-duplicate-script.patch
+  ];
+
+  propagatedBuildInputs = [
+    pyparsing
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    (texliveSmall.withPackages (ps: with ps; [ preview pstricks ]))
+  ];
+
+  meta = with lib; {
+    description = "Convert graphs generated by Graphviz to LaTeX friendly formats";
+    homepage = "https://github.com/kjellmf/dot2tex";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dot2tex/path.patch b/nixpkgs/pkgs/development/python-modules/dot2tex/path.patch
new file mode 100644
index 000000000000..4e05b7a8dff3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dot2tex/path.patch
@@ -0,0 +1,104 @@
+diff --git a/dot2tex/dotparsing.py b/dot2tex/dotparsing.py
+index 391b5dc..6dc77a3 100644
+--- a/dot2tex/dotparsing.py
++++ b/dot2tex/dotparsing.py
+@@ -180,18 +180,8 @@ def __find_executables(path):
+ def find_graphviz():
+     """Locate Graphviz's executables in the system.
+ 
+-    Tries three methods:
+-
+-    First: Windows Registry (Windows only)
+-    This requires Mark Hammond's pywin32 is installed.
+-
+-    Secondly: Search the path
+-    It will look for 'dot', 'twopi' and 'neato' in all the directories
+-    specified in the PATH environment variable.
+-
+-    Thirdly: Default install location (Windows only)
+-    It will look for 'dot', 'twopi' and 'neato' in the default install
+-    location under the "Program Files" directory.
++    It will look for 'dot', 'twopi' and 'neato' in
++    @graphviz@/bin.
+ 
+     It will return a dictionary containing the program names as keys
+     and their paths as values.
+@@ -199,75 +189,9 @@ def find_graphviz():
+     If this fails, it returns None.
+     """
+ 
+-    # Method 1 (Windows only)
+-    #
+-    if os.sys.platform == 'win32':
+-        try:
+-            import win32api, win32con
+-
+-            # Get the GraphViz install path from the registry
+-            #
+-            hkey = win32api.RegOpenKeyEx(win32con.HKEY_LOCAL_MACHINE,
+-                                         "SOFTWARE\AT&T Research Labs\Graphviz", 0, win32con.KEY_QUERY_VALUE)
+-
+-            path = win32api.RegQueryValueEx(hkey, "InstallPath")[0]
+-            win32api.RegCloseKey(hkey)
+-
+-            # Now append the "bin" subdirectory:
+-            #
+-            path = os.path.join(path, "bin")
+-            progs = __find_executables(path)
+-            if progs is not None:
+-                # print("Used Windows registry")
+-                return progs
+-
+-        except ImportError:
+-            # Print a messaged suggesting they install these?
+-            #
+-            log.debug('The win32api is not installed')
+-            pass
+-        except:
+-            log.debug('Failed to access the registry key')
+-
+-    # Method 2 (Linux, Windows etc)
+-    #
+-    if 'PATH' in os.environ:
+-        for path in os.environ['PATH'].split(os.pathsep):
+-            progs = __find_executables(path)
+-            if progs is not None:
+-                return progs
+-
+-    # Method 3 (Windows only)
+-    #
+-    if os.sys.platform == 'win32':
+-        # Try and work out the equivalent of "C:\Program Files" on this
+-        # machine (might be on drive D:, or in a different language)
+-        #
+-        if 'PROGRAMFILES' in os.environ:
+-            # Note, we could also use the win32api to get this
+-            # information, but win32api may not be installed.
+-
+-            path = os.path.join(os.environ['PROGRAMFILES'], 'ATT', 'GraphViz', 'bin')
+-
+-        else:
+-            # Just in case, try the default...
+-            path = r"C:\Program Files\att\Graphviz\bin"
+-
+-        progs = __find_executables(path)
+-
+-        if progs is not None:
+-            # print("Used default install location")
+-            return progs
+-
+-    for path in (
+-            '/usr/bin', '/usr/local/bin',
+-            '/opt/local/bin',
+-            '/opt/bin', '/sw/bin', '/usr/share',
+-            '/Applications/Graphviz.app/Contents/MacOS/'):
+-        progs = __find_executables(path)
+-        if progs is not None:
+-            # print("Used path")
+-            return progs
++    progs = __find_executables('@graphviz@/bin')
++    if progs is not None:
++        return progs
+ 
+     # Failed to find GraphViz
+     #
diff --git a/nixpkgs/pkgs/development/python-modules/dot2tex/remove-duplicate-script.patch b/nixpkgs/pkgs/development/python-modules/dot2tex/remove-duplicate-script.patch
new file mode 100644
index 000000000000..c67ad62224b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dot2tex/remove-duplicate-script.patch
@@ -0,0 +1,34 @@
+From 98a0fbd0c4e13df98b8fb69c241665ab774fda2e Mon Sep 17 00:00:00 2001
+From: Theodore Ni <3806110+tjni@users.noreply.github.com>
+Date: Fri, 11 Aug 2023 21:58:14 -0700
+Subject: [PATCH] Remove script with same name as entry point
+
+---
+ dot2tex/dot2tex | 5 -----
+ setup.py        | 1 -
+ 2 files changed, 6 deletions(-)
+ delete mode 100644 dot2tex/dot2tex
+
+diff --git a/dot2tex/dot2tex b/dot2tex/dot2tex
+deleted file mode 100644
+index 278c0b3..0000000
+--- a/dot2tex/dot2tex
++++ /dev/null
+@@ -1,5 +0,0 @@
+-#!/usr/bin/env python
+-from .dot2tex import main
+-
+-if __name__ == '__main__':
+-    main()
+diff --git a/setup.py b/setup.py
+index d05db37..67a3ee8 100644
+--- a/setup.py
++++ b/setup.py
+@@ -21,7 +21,6 @@
+       author_email='kjellmf@gmail.com',
+       url="https://github.com/kjellmf/dot2tex",
+       py_modules=['dot2tex.dot2tex', 'dot2tex.dotparsing'],
+-      scripts=['dot2tex/dot2tex'],
+       classifiers=[
+           'Development Status :: 4 - Beta',
+           'Environment :: Console',
\ No newline at end of file
diff --git a/nixpkgs/pkgs/development/python-modules/dot2tex/test.patch b/nixpkgs/pkgs/development/python-modules/dot2tex/test.patch
new file mode 100644
index 000000000000..9ead8ac5ee5c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dot2tex/test.patch
@@ -0,0 +1,12 @@
+diff --git a/tests/test_dot2tex.py b/tests/test_dot2tex.py
+index 74b01ed..7be9aba 100644
+--- a/tests/test_dot2tex.py
++++ b/tests/test_dot2tex.py
+@@ -147,6 +147,7 @@ class NeedsQuotesTests(unittest.TestCase):
+ 
+ class MultipleStatements(unittest.TestCase):
+     # https://github.com/kjellmf/dot2tex/issues/5
++    @unittest.skip('fails upstream')
+     def test_semicolon(self):
+         """Test for issue 5"""
+         testgraph1 = """
diff --git a/nixpkgs/pkgs/development/python-modules/dotmap/default.nix b/nixpkgs/pkgs/development/python-modules/dotmap/default.nix
new file mode 100644
index 000000000000..2300ac013a24
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dotmap/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dotmap";
+  version = "1.3.30";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WCGnkz8HX7R1Y0F8DpLgt8AxFYtMmmp+VhY0ebZYs2g=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "dotmap/test.py"
+  ];
+
+  pythonImportsCheck = [
+    "dotmap"
+  ];
+
+  meta = with lib; {
+    description = "Python for dot-access dictionaries";
+    homepage = "https://github.com/drgrib/dotmap";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dotty-dict/default.nix b/nixpkgs/pkgs/development/python-modules/dotty-dict/default.nix
new file mode 100644
index 000000000000..69da618a5a49
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dotty-dict/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "dotty_dict";
+  version = "1.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-SwFuA7iuJlU5dXpT66JLm/2lBvuU+84L7oQ8bwVUGhU=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Dictionary wrapper for quick access to deeply nested keys";
+    homepage = "https://dotty-dict.readthedocs.io";
+    license = licenses.mit;
+    maintainers = with maintainers; [ AndersonTorres ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dotwiz/default.nix b/nixpkgs/pkgs/development/python-modules/dotwiz/default.nix
new file mode 100644
index 000000000000..f7fcd7847b76
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dotwiz/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyheck
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dotwiz";
+  version = "0.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rnag";
+    repo = "dotwiz";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ABmkwpJ40JceNJieW5bhg0gqWNrR6Wxj84nLCjKU11A=";
+  };
+
+  propagatedBuildInputs = [
+    pyheck
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dotwiz"
+  ];
+
+  pytestFlagsArray = [
+    "--ignore=benchmarks"
+    "--ignore-glob=*integration*"
+  ];
+
+  meta = with lib; {
+    description = "Dict subclass that supports dot access notation";
+    homepage = "https://github.com/rnag/dotwiz";
+    changelog = "https://github.com/rnag/dotwiz/blob/v${version}/HISTORY.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/downloader-cli/default.nix b/nixpkgs/pkgs/development/python-modules/downloader-cli/default.nix
new file mode 100644
index 000000000000..40cfd888a5d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/downloader-cli/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, urllib3
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "downloader-cli";
+  version = "0.3.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "deepjyoti30";
+    repo = pname;
+    rev = version;
+    hash = "sha256-Dl5XIvdZInz+edL9uQv7V6Kc6FB+7hFAGe/nybnqvQU=";
+  };
+
+  propagatedBuildInputs = [
+    urllib3
+  ];
+
+  # Disable checks due to networking (Errno 101)
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "downloader_cli"
+  ];
+
+  meta = with lib; {
+    description = "Downloader with an awesome customizable progressbar";
+    homepage = "https://github.com/deepjyoti30/downloader-cli";
+    license = licenses.mit;
+    maintainers = with maintainers; [ j0hax ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dparse/default.nix b/nixpkgs/pkgs/development/python-modules/dparse/default.nix
new file mode 100644
index 000000000000..3c8b56a2c406
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dparse/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, toml
+, pyyaml
+, packaging
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "dparse";
+  version = "0.6.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-J7uLS8rv7DmXaXuj9uBrJEcgC6JzwLCFw9ASoEVxtSg=";
+  };
+
+  propagatedBuildInputs = [
+    toml
+    pyyaml
+    packaging
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dparse"
+  ];
+
+  disabledTests = [
+    # requires unpackaged dependency pipenv
+    "test_update_pipfile"
+  ];
+
+  meta = with lib; {
+    description = "A parser for Python dependency files";
+    homepage = "https://github.com/pyupio/dparse";
+    changelog = "https://github.com/pyupio/dparse/blob/${version}/HISTORY.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ thomasdesr ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dparse2/default.nix b/nixpkgs/pkgs/development/python-modules/dparse2/default.nix
new file mode 100644
index 000000000000..9d6cb9b085f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dparse2/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, toml
+, pyyaml
+, packvers
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "dparse2";
+  version = "0.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nexB";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-JUTL+SVf1RRIXQqwFR7MnExsgGseSiO0a5YzzcqdXHw=";
+  };
+
+  propagatedBuildInputs = [
+    toml
+    pyyaml
+    packvers
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Requries pipenv
+    "tests/test_parse.py"
+  ];
+
+  pythonImportsCheck = [
+    "dparse2"
+  ];
+
+  meta = with lib; {
+    description = "Module to parse Python dependency files";
+    homepage = "https://github.com/nexB/dparse2";
+    changelog = "https://github.com/nexB/dparse2/blob/${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dpath/default.nix b/nixpkgs/pkgs/development/python-modules/dpath/default.nix
new file mode 100644
index 000000000000..7ef15b2379c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dpath/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hypothesis
+, pythonOlder
+, mock
+, nose2
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "dpath";
+  version = "2.1.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8eB8cuhgXGqegLZLyPQnFN4Ip4nH3kF+ScP4ehlpLkc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    mock
+    nose2
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dpath"
+  ];
+
+  meta = with lib; {
+    description = "Python library for accessing and searching dictionaries via /slashed/paths ala xpath";
+    homepage = "https://github.com/akesterson/dpath-python";
+    changelog = "https://github.com/dpath-maintainers/dpath-python/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ mmlb ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dpcontracts/default.nix b/nixpkgs/pkgs/development/python-modules/dpcontracts/default.nix
new file mode 100644
index 000000000000..5a6491b7ee09
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dpcontracts/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "dpcontracts";
+  version = "unstable-2018-11-20";
+  format = "setuptools";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "deadpixi";
+    repo = "contracts";
+    rev = "45cb8542272c2ebe095c6efb97aa9407ddc8bf3c";
+    hash = "sha256-FygJPXo7lZ9tlfqY6KmPJ3PLIilMGLBr3013uj9hCEs=";
+  };
+
+  # package does not have any tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "dpcontracts" ];
+
+  meta = with lib; {
+    description = "Provides a collection of decorators that makes it easy to write software using contracts";
+    homepage = "https://github.com/deadpixi/contracts";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dpkt/default.nix b/nixpkgs/pkgs/development/python-modules/dpkt/default.nix
new file mode 100644
index 000000000000..f2046d106b91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dpkt/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+}:
+
+buildPythonPackage rec {
+  pname = "dpkt";
+  version = "1.9.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Q/hobkVdpQUoNf0e2iaJ1R3jZwqsl5mxsAz9IDkn7kU=";
+  };
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "dpkt" ];
+
+  meta = with lib; {
+    description = "Fast, simple packet creation / parsing, with definitions for the basic TCP/IP protocols";
+    homepage = "https://github.com/kbandla/dpkt";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bjornfor ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/draftjs-exporter/default.nix b/nixpkgs/pkgs/development/python-modules/draftjs-exporter/default.nix
new file mode 100644
index 000000000000..ef94901e9aac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/draftjs-exporter/default.nix
@@ -0,0 +1,45 @@
+{ beautifulsoup4
+, buildPythonPackage
+, fetchFromGitHub
+, html5lib
+, lib
+, lxml
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "draftjs-exporter";
+  version = "5.0.0";
+
+  src = fetchFromGitHub {
+    repo = "draftjs_exporter";
+    owner = "springload";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-4MmCVRx350p6N9XqTZSo8ROI/OJ0s4aKSYH9+Oxgvf4=";
+  };
+
+  passthru.optional-dependencies = {
+    lxml = [ lxml ];
+    html5lib = [ beautifulsoup4 html5lib ];
+  };
+
+  checkInputs = passthru.optional-dependencies.lxml ++ passthru.optional-dependencies.html5lib;
+
+  checkPhase = ''
+    # 2 tests in this file randomly fail because they depend on the order of
+    # HTML attributes
+    rm tests/test_exports.py
+
+    ${python.interpreter} -m unittest discover
+  '';
+
+  pythonImportsCheck = [ "draftjs_exporter" ];
+
+  meta = with lib; {
+    description = "Library to convert Draft.js ContentState to HTML";
+    homepage = "https://github.com/springload/draftjs_exporter";
+    changelog = "https://github.com/springload/draftjs_exporter/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sephi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dragonfly/default.nix b/nixpkgs/pkgs/development/python-modules/dragonfly/default.nix
new file mode 100644
index 000000000000..d4c96ba3b5cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dragonfly/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, decorator
+, packaging
+, pynput
+, regex
+, lark
+, enum34
+, pyperclip
+, six
+, requests
+, psutil
+, json-rpc
+, werkzeug
+, kaldi-active-grammar
+, sounddevice
+, webrtcvad
+, setuptools
+, xdotool
+, wmctrl
+, xorg
+}:
+
+buildPythonPackage rec {
+  pname = "dragonfly";
+  version = "0.35.0";
+
+  src = fetchFromGitHub {
+    owner = "dictation-toolbox";
+    repo = pname;
+    rev = version;
+    hash = "sha256-sqEEEr5/KG3cn4rmOGJt9zMNAjeLO6h3NJgg0EyewrM=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace 'lark-parser == 0.8.*' 'lark'
+    substituteInPlace dragonfly/actions/keyboard/_x11_xdotool.py \
+      --replace 'xdotool = "xdotool"'${" "}'xdotool = "${xdotool}/bin/xdotool"'
+    substituteInPlace dragonfly/windows/x11_window.py \
+      --replace 'xdotool = "xdotool"'${" "}'xdotool = "${xdotool}/bin/xdotool"' \
+      --replace 'xprop = "xprop"'${" "}'xprop = "${xorg.xprop}/bin/xprop"' \
+      --replace 'wmctrl = "wmctrl"'${" "}'wmctrl = "${wmctrl}/bin/wmctrl"'
+  '';
+
+  propagatedBuildInputs = [
+    decorator
+    packaging
+    pynput
+    regex
+    lark
+    enum34
+    pyperclip
+    six
+    requests
+    psutil
+    json-rpc
+    werkzeug
+    kaldi-active-grammar # for the Kaldi engine
+    sounddevice
+    webrtcvad
+    setuptools # needs pkg_resources at runtime
+  ];
+
+  # Too many tests fail because of the unusual environment or
+  # because of the missing dependencies for some of the engines.
+  doCheck = false;
+
+  pythonImportsCheck = [ "dragonfly" ];
+
+  meta = with lib; {
+    description = "Speech recognition framework allowing powerful Python-based scripting";
+    homepage = "https://github.com/dictation-toolbox/dragonfly";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ ckie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dramatiq/default.nix b/nixpkgs/pkgs/development/python-modules/dramatiq/default.nix
new file mode 100644
index 000000000000..84da4beadd79
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dramatiq/default.nix
@@ -0,0 +1,106 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, gevent
+, pika
+, prometheus-client
+, pylibmc
+, pytestCheckHook
+, redis
+, watchdog
+, watchdog-gevent
+}:
+
+buildPythonPackage rec {
+  pname = "dramatiq";
+  version = "1.15.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Bogdanp";
+    repo = "dramatiq";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-uhradhLIyfHf1meAr7ChuGnvm62mX/lkQQ2Pe7hBWtY=";
+  };
+
+  propagatedBuildInputs = [
+    prometheus-client
+  ];
+
+  passthru.optional-dependencies = {
+    all = [
+      gevent
+      pika
+      pylibmc
+      redis
+      watchdog
+      watchdog-gevent
+    ];
+    gevent = [
+      gevent
+    ];
+    memcached = [
+      pylibmc
+    ];
+    rabbitmq = [
+      pika
+    ];
+    redis = [
+      redis
+    ];
+    watch = [
+      watchdog
+      watchdog-gevent
+    ];
+  };
+
+  nativeCheckInputs = [ pytestCheckHook pika redis pylibmc ];
+
+  postPatch = ''
+    sed -i ./setup.cfg \
+      -e 's:--cov dramatiq::' \
+      -e 's:--cov-report html::' \
+      -e 's:--benchmark-autosave::' \
+      -e 's:--benchmark-compare::' \
+  '';
+
+  disabledTests = [
+    # Requires a running redis
+    "test_after_process_boot_call_has_no_blocked_signals"
+    "test_cli_can_be_reloaded_on_sighup"
+    "test_cli_can_watch_for_source_code_changes"
+    "test_cli_fork_functions_have_no_blocked_signals"
+    "test_consumer_threads_have_no_blocked_signals"
+    "test_middleware_fork_functions_have_no_blocked_signals"
+    "test_redis_broker_can_connect_via_client"
+    "test_redis_broker_can_connect_via_url"
+    "test_redis_process_100k_messages_with_cli"
+    "test_redis_process_10k_fib_with_cli"
+    "test_redis_process_1k_latency_with_cli"
+    "test_worker_threads_have_no_blocked_signals"
+    # Requires a running rabbitmq
+    "test_rabbitmq_broker_can_be_passed_a_list_of_parameters_for_failover"
+    "test_rabbitmq_broker_can_be_passed_a_list_of_uri_for_failover"
+    "test_rabbitmq_broker_can_be_passed_a_semicolon_separated_list_of_uris"
+    "test_rabbitmq_broker_connections_are_lazy"
+    "test_rabbitmq_process_100k_messages_with_cli"
+    "test_rabbitmq_process_10k_fib_with_cli"
+    "test_rabbitmq_process_1k_latency_with_cli"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # Takes too long for darwin ofborg
+    "test_retry_exceptions_can_specify_a_delay"
+  ];
+
+  pythonImportsCheck = [ "dramatiq" ];
+
+  meta = with lib; {
+    description = "Background Processing for Python 3";
+    homepage = "https://github.com/Bogdanp/dramatiq";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ traxys ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/drawille/default.nix b/nixpkgs/pkgs/development/python-modules/drawille/default.nix
new file mode 100644
index 000000000000..a00b0b16892b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/drawille/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "drawille";
+  version = "0.1.0";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-t4nS8TWbEGKHibIbLfZZycPQxTiEzuJ7DYsa6Twi+8s=";
+  };
+
+  doCheck = false; # pypi package has no tests, git has no tags
+
+  pythonImportsCheck = [
+    "drawille"
+  ];
+
+  meta = with lib; {
+    description = "Drawing in terminal with unicode braille characters";
+    homepage = "https://github.com/asciimoo/drawille";
+    license = licenses.agpl3Plus;
+    maintainers = with maintainers; [ nobbz ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/drawilleplot/default.nix b/nixpkgs/pkgs/development/python-modules/drawilleplot/default.nix
new file mode 100644
index 000000000000..1ed452c1d109
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/drawilleplot/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, drawille
+, matplotlib
+}:
+
+buildPythonPackage rec {
+  pname = "drawilleplot";
+  version = "0.1.0";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ZEDroo7KkI2VxdESb2QDX+dPY4UahuuK9L0EddrxJjQ=";
+  };
+
+  doCheck = false; # does not have any tests at all
+
+  propagatedBuildInputs = [
+    drawille
+    matplotlib
+  ];
+
+  pythonImportsCheck = [
+    "drawilleplot"
+  ];
+
+  meta = with lib; {
+    description = "matplotlib backend for graph output in unicode terminals using drawille";
+    homepage = "https://github.com/gooofy/drawilleplot";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ nobbz ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dremel3dpy/default.nix b/nixpkgs/pkgs/development/python-modules/dremel3dpy/default.nix
new file mode 100644
index 000000000000..628b76576860
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dremel3dpy/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, decorator
+, fetchPypi
+, imageio
+, imutils
+, pythonOlder
+, requests
+, urllib3
+, tqdm
+, validators
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "dremel3dpy";
+  version = "2.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ioZwvbdPhO2kY10TqGR427mRUJBUZ5bmpiWVOV92OkI=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+    decorator
+    imageio
+    imutils
+    requests
+    tqdm
+    urllib3
+    validators
+    yarl
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dremel3dpy"
+  ];
+
+  meta = with lib; {
+    description = "Module for interacting with Dremel 3D printers";
+    homepage = "https://github.com/godely/dremel3dpy";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/drf-jwt/default.nix b/nixpkgs/pkgs/development/python-modules/drf-jwt/default.nix
new file mode 100644
index 000000000000..6ae583c98e06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/drf-jwt/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyjwt
+, djangorestframework
+}:
+
+buildPythonPackage rec {
+  pname = "drf-jwt";
+  version = "1.19.2";
+
+  src = fetchFromGitHub {
+    owner = "Styria-Digital";
+    repo = "django-rest-framework-jwt";
+    rev = version;
+    hash = "sha256-bbkk78uYTG+JTzY3AyOmEVtVSgout/TETfr5N5fUto4=";
+  };
+
+  propagatedBuildInputs = [
+    pyjwt
+    djangorestframework
+  ]
+  ++ pyjwt.optional-dependencies.crypto;
+
+  # requires setting up a django instance
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "rest_framework_jwt"
+    "rest_framework_jwt.blacklist"
+    # require setting DJANGO_SETTINGS_MODULE
+    # "rest_framework_jwt.authentication"
+    # "rest_framework_jwt.blacklist.views"
+    # "rest_framework_jwt.settings"
+    # "rest_framework_jwt.utils"
+    # "rest_framework_jwt.views"
+  ];
+
+  meta = with lib; {
+    description = "JSON Web Token based authentication for Django REST framework";
+    homepage = "https://github.com/Styria-Digital/django-rest-framework-jwt";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/drf-nested-routers/default.nix b/nixpkgs/pkgs/development/python-modules/drf-nested-routers/default.nix
new file mode 100644
index 000000000000..849fe8bb130c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/drf-nested-routers/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, django
+, djangorestframework
+, pytestCheckHook
+, pytest-django
+, ipdb
+}:
+
+buildPythonPackage rec {
+  pname = "drf-nested-routers";
+  version = "0.93.4";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "alanjds";
+    repo = "drf-nested-routers";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-qlXNDydoQJ9FZB6G7yV/pNmx3BEo+lvRqsfjrvlbdNY=";
+  };
+
+  patches = [
+    # django4 compatibility
+    (fetchpatch {
+      url = "https://github.com/alanjds/drf-nested-routers/commit/59764cc356f7f593422b26845a9dfac0ad196120.patch";
+      hash = "sha256-mq3vLHzQlGl2EReJ5mVVQMMcYgGIVt/T+qi1STtQ0aI=";
+    })
+    (fetchpatch {
+      url = "https://github.com/alanjds/drf-nested-routers/commit/723a5729dd2ffcb66fe315f229789ca454986fa4.patch";
+      hash = "sha256-UCbBjwlidqsJ9vEEWlGzfqqMOr0xuB2TAaUxHsLzFfU=";
+    })
+    (fetchpatch {
+      url = "https://github.com/alanjds/drf-nested-routers/commit/38e49eb73759bc7dcaaa9166169590f5315e1278.patch";
+      hash = "sha256-IW4BLhHHhXDUZqHaXg46qWoQ89pMXv0ZxKjOCTnDcI0=";
+    })
+  ];
+
+  buildInputs = [
+    django
+  ];
+
+  propagatedBuildInputs = [
+    djangorestframework
+  ];
+
+  nativeCheckInputs = [
+    ipdb
+    pytestCheckHook
+    pytest-django
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/alanjds/drf-nested-routers";
+    description = "Provides routers and fields to create nested resources in the Django Rest Framework";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ felschr ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/drf-spectacular-sidecar/default.nix b/nixpkgs/pkgs/development/python-modules/drf-spectacular-sidecar/default.nix
new file mode 100644
index 000000000000..2ce7b3e92074
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/drf-spectacular-sidecar/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+}:
+
+buildPythonPackage rec {
+  pname = "drf-spectacular-sidecar";
+  version = "2023.9.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "tfranzel";
+    repo = "drf-spectacular-sidecar";
+    rev = version;
+    hash = "sha256-EoQKbxzXEuKC50/W1/tBB2wASJZmNNwg9r1qhIB4Ws8=";
+  };
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "drf_spectacular_sidecar" ];
+
+  meta = with lib; {
+    description = "Serve self-contained distribution builds of Swagger UI and Redoc with Django";
+    homepage = "https://github.com/tfranzel/drf-spectacular-sidecar";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/drf-spectacular/default.nix b/nixpkgs/pkgs/development/python-modules/drf-spectacular/default.nix
new file mode 100644
index 000000000000..253604370cbc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/drf-spectacular/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, dj-rest-auth
+, django
+, django-allauth
+, django-filter
+, django-oauth-toolkit
+, django-polymorphic
+, django-rest-auth
+, django-rest-polymorphic
+, djangorestframework
+, djangorestframework-camel-case
+, djangorestframework-dataclasses
+, djangorestframework-recursive
+, djangorestframework-simplejwt
+, drf-jwt
+, drf-nested-routers
+, drf-spectacular-sidecar
+, inflection
+, jsonschema
+, psycopg2
+, pytest-django
+, pytestCheckHook
+, pyyaml
+, uritemplate
+}:
+
+buildPythonPackage rec {
+  pname = "drf-spectacular";
+  version = "0.26.5";
+
+  src = fetchFromGitHub {
+    owner = "tfranzel";
+    repo = "drf-spectacular";
+    rev = "refs/tags/${version}";
+    hash = "sha256-sK+upLh0mi8eHKh1Wt9FoLRjqlHitTSX0Zl54S4Ce6E=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # https://github.com/tfranzel/drf-spectacular/pull/1090
+      url = "https://github.com/tfranzel/drf-spectacular/commit/8db4c2458f8403c53db0db352dd94057d285814b.patch";
+      hash = "sha256-Ue5y7IB4ie+9CEineMBgMMCLGiF4zqmn60TJvKsV1h0=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    django
+    djangorestframework
+    inflection
+    jsonschema
+    pyyaml
+    uritemplate
+  ];
+
+  nativeCheckInputs = [
+    dj-rest-auth
+    django-allauth
+    django-filter
+    django-oauth-toolkit
+    django-polymorphic
+    django-rest-auth
+    django-rest-polymorphic
+    djangorestframework-camel-case
+    djangorestframework-dataclasses
+    djangorestframework-recursive
+    djangorestframework-simplejwt
+    drf-jwt
+    drf-nested-routers
+    drf-spectacular-sidecar
+    psycopg2
+    pytest-django
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # requires django with gdal
+    "test_rest_framework_gis"
+  ];
+
+  pythonImportsCheck = [ "drf_spectacular" ];
+
+  meta = with lib; {
+    description = "Sane and flexible OpenAPI 3 schema generation for Django REST framework";
+    homepage = "https://github.com/tfranzel/drf-spectacular";
+    changelog = "https://github.com/tfranzel/drf-spectacular/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/drf-ujson2/default.nix b/nixpkgs/pkgs/development/python-modules/drf-ujson2/default.nix
new file mode 100644
index 000000000000..58277fca7ed6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/drf-ujson2/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# dependencies
+, django
+, djangorestframework
+, ujson
+
+# tests
+, pytest-django
+, pytest-mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "drf-ujson2";
+  version = "1.7.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Amertz08";
+    repo = "drf_ujson2";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-kbpZN1zOXHvRPcn+Sjbelq74cWgvCUeMXZy1eFSa6rA=";
+  };
+
+  postPatch = ''
+    sed -i '/--cov/d' setup.cfg
+  '';
+
+  buildInputs = [
+    django
+  ];
+
+  propagatedBuildInputs = [
+    djangorestframework
+    ujson
+  ];
+
+  env.DJANGO_SETTINGS_MODULE = "tests.settings";
+
+  nativeCheckInputs = [
+    pytest-django
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/Amertz08/drf_ujson2/releases/tag/v${version}";
+    description = "JSON parser and renderer using ujson for Django Rest Framework";
+    homepage = "https://github.com/Amertz08/drf_ujson2";
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/drf-writable-nested/default.nix b/nixpkgs/pkgs/development/python-modules/drf-writable-nested/default.nix
new file mode 100644
index 000000000000..603f94426bc5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/drf-writable-nested/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, django
+, djangorestframework
+, pytestCheckHook
+, pytest-django
+}:
+
+buildPythonPackage rec {
+  pname = "drf-writable-nested";
+  version = "0.7.0";
+
+  src = fetchFromGitHub {
+    owner = "beda-software";
+    repo = "drf-writable-nested";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-/7MZAw0clzzlBdYchUVKldWT7WqtwdSe+016QAP0hqk=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    djangorestframework
+  ];
+
+  nativeCheckInputs = [
+    pytest-django
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Writable nested model serializer for Django REST Framework";
+    homepage = "https://github.com/beda-software/drf-writable-nested";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ambroisie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/drf-yasg/default.nix b/nixpkgs/pkgs/development/python-modules/drf-yasg/default.nix
new file mode 100644
index 000000000000..8c6692d7c8f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/drf-yasg/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, inflection
+, ruamel-yaml
+, setuptools-scm
+, six
+, coreapi
+, djangorestframework
+, pytestCheckHook
+, pytest-django
+, datadiff
+}:
+
+buildPythonPackage rec {
+  pname = "drf-yasg";
+  version = "1.21.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-TDuTBos9/KaWmrERFV5N1vey1oC5h3jej9Rgt4N72w0=";
+  };
+
+  postPatch = ''
+    # https://github.com/axnsan12/drf-yasg/pull/710
+    sed -i "/packaging/d" requirements/base.txt
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    six
+    inflection
+    ruamel-yaml
+    coreapi
+    djangorestframework
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-django
+    datadiff
+  ];
+
+  # ImportError: No module named 'testproj.settings'
+  doCheck = false;
+
+  pythonImportsCheck = [ "drf_yasg" ];
+
+  meta = with lib; {
+    description = "Generation of Swagger/OpenAPI schemas for Django REST Framework";
+    homepage = "https://github.com/axnsan12/drf-yasg";
+    maintainers = with maintainers; [ ];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/drivelib/default.nix b/nixpkgs/pkgs/development/python-modules/drivelib/default.nix
new file mode 100644
index 000000000000..7b0a629e8a89
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/drivelib/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, expiringdict
+, google-auth-httplib2
+, google-auth-oauthlib
+, google-api-python-client
+}:
+
+buildPythonPackage rec {
+  pname = "drivelib";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1bz3dn6wm9mlm2w8czwjmhvf3ws3iggr57hvd8z8acl1qafr2g4m";
+  };
+
+  propagatedBuildInputs = [
+    google-api-python-client
+    google-auth-oauthlib
+    google-auth-httplib2
+    expiringdict
+  ];
+
+  # tests depend on a google auth token
+  doCheck = false;
+
+  pythonImportsCheck = [ "drivelib" ];
+
+  meta = with lib; {
+    description = "Easy access to the most common Google Drive API calls";
+    homepage = "https://pypi.org/project/drivelib/";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ gravndal ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/drms/default.nix b/nixpkgs/pkgs/development/python-modules/drms/default.nix
new file mode 100644
index 000000000000..cf51ddb6b376
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/drms/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pandas
+, six
+, astropy
+, oldest-supported-numpy
+, pytestCheckHook
+, pytest-doctestplus
+, pythonOlder
+, setuptools-scm
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "drms";
+  version = "0.7.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BHWoyjYYxblw5I3ADqXTUzAdntLU28uk/Qv3Zm0arGo=";
+  };
+
+  nativeBuildInputs = [
+    numpy
+    oldest-supported-numpy
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    pandas
+    six
+  ];
+
+  nativeCheckInputs = [
+    astropy
+    pytestCheckHook
+    pytest-doctestplus
+  ];
+
+  disabledTests = [
+    "test_query_hexadecimal_strings"
+  ];
+
+  disabledTestPaths = [
+    "docs/tutorial.rst"
+  ];
+
+  pythonImportsCheck = [ "drms" ];
+
+  meta = with lib; {
+    description = "Access HMI, AIA and MDI data with Python";
+    homepage = "https://github.com/sunpy/drms";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dronecan/default.nix b/nixpkgs/pkgs/development/python-modules/dronecan/default.nix
new file mode 100644
index 000000000000..51e7265725a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dronecan/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "dronecan";
+  version = "1.0.25";
+  format = "setuptools";
+  disabled = pythonOlder "3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-0WKmVZwE6OgBckWWvPcn5BYqXMEt6Mr1P68UMHfRp4I=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dronecan"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of the DroneCAN v1 protocol stack";
+    longDescription = ''
+      DroneCAN is a lightweight protocol designed for reliable communication in aerospace and robotic applications via CAN bus.
+    '';
+    homepage = "https://dronecan.github.io/";
+    license = licenses.mit;
+    maintainers = [ teams.ororatech ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dropbox/default.nix b/nixpkgs/pkgs/development/python-modules/dropbox/default.nix
new file mode 100644
index 000000000000..762b9b7ff8cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dropbox/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, requests
+, setuptools
+, six
+, stone
+, mock
+, pytest-mock
+, pytestCheckHook
+, sphinxHook
+}:
+
+buildPythonPackage rec {
+  pname = "dropbox";
+  version = "11.36.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+  outputs = ["out" "doc"];
+
+  src = fetchFromGitHub {
+    owner = "dropbox";
+    repo = "dropbox-sdk-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-d++lxsbwPxnz1JPguWkImHXB+GQpMa9Uo3JNIxIe2ok=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    setuptools
+    six
+    stone
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner == 5.2.0'," ""
+  '';
+
+  doCheck = true;
+
+  pythonImportsCheck = [
+    "dropbox"
+  ];
+
+  nativeBuildInputs = [ sphinxHook ];
+
+  # Set SCOPED_USER_DROPBOX_TOKEN environment variable to a valid value.
+  disabledTests = [
+    "test_default_oauth2_urls"
+    "test_bad_auth"
+    "test_multi_auth"
+    "test_refresh"
+    "test_app_auth"
+    "test_downscope"
+    "test_rpc"
+    "test_upload_download"
+    "test_bad_upload_types"
+    "test_clone_when_user_linked"
+    "test_with_path_root_constructor"
+    "test_path_root"
+    "test_path_root_err"
+    "test_versioned_route"
+    "test_team"
+    "test_as_user"
+    "test_as_admin"
+    "test_clone_when_team_linked"
+  ];
+
+  meta = with lib; {
+    description = "Python library for Dropbox's HTTP-based Core and Datastore APIs";
+    homepage = "https://github.com/dropbox/dropbox-sdk-python";
+    changelog = "https://github.com/dropbox/dropbox-sdk-python/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sfrijters ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ds-store/default.nix b/nixpkgs/pkgs/development/python-modules/ds-store/default.nix
new file mode 100644
index 000000000000..47d58964f475
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ds-store/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mac_alias
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "ds-store";
+  version = "1.3.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "al45tair";
+    repo = "ds_store";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-45lmkE61uXVCBUMyVVzowTJoALY1m9JI68s7Yb0vCks=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    mac_alias
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ds_store"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/al45tair/ds_store";
+    description = "Manipulate Finder .DS_Store files from Python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ds4drv/default.nix b/nixpkgs/pkgs/development/python-modules/ds4drv/default.nix
new file mode 100644
index 000000000000..05f54c2f9064
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ds4drv/default.nix
@@ -0,0 +1,27 @@
+{ lib, fetchFromGitHub, buildPythonPackage
+, evdev, pyudev
+, bluez
+}:
+
+buildPythonPackage rec {
+  pname = "ds4drv";
+  version = "0.5.1";
+
+  # PyPi only carries py3 wheel
+  src = fetchFromGitHub {
+    owner = "chrippa";
+    repo = "ds4drv";
+    rev = "v${version}";
+    sha256 = "0vinpla0apizzykcyfis79mrm1i6fhns83nkzw85svypdhkx2g8v";
+  };
+
+  propagatedBuildInputs = [ evdev pyudev ];
+
+  buildInputs = [ bluez ];
+
+  meta = {
+    description = "Userspace driver for the DualShock 4 controller";
+    homepage = "https://github.com/chrippa/ds4drv";
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dsinternals/default.nix b/nixpkgs/pkgs/development/python-modules/dsinternals/default.nix
new file mode 100644
index 000000000000..93b600c04484
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dsinternals/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pycryptodomex
+, pyopenssl
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dsinternals";
+  version = "1.2.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "p0dalirius";
+    repo = "pydsinternals";
+    rev = version;
+    hash = "sha256-C1ar9c4F4WI5ICX7PJe8FzVwK8bxZds+kMBpttEp9Ko=";
+  };
+
+  propagatedBuildInputs = [
+    pyopenssl
+    pycryptodomex
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dsinternals"
+  ];
+
+  pytestFlagsArray = [
+    "tests/*.py"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with Windows Active Directory";
+    homepage = "https://github.com/p0dalirius/pydsinternals";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dsmr-parser/default.nix b/nixpkgs/pkgs/development/python-modules/dsmr-parser/default.nix
new file mode 100644
index 000000000000..c4c94d330d81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dsmr-parser/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, dlms-cosem
+, fetchFromGitHub
+, pyserial
+, pyserial-asyncio
+, pytestCheckHook
+, pythonOlder
+, pytz
+, tailer
+}:
+
+buildPythonPackage rec {
+  pname = "dsmr-parser";
+  version = "1.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ndokter";
+    repo = "dsmr_parser";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-PULrKRHrCuDFZcR+5ha0PjkN438QFgf2CrpYhKIqYTs=";
+  };
+
+  propagatedBuildInputs = [
+    dlms-cosem
+    pyserial
+    pyserial-asyncio
+    pytz
+    tailer
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dsmr_parser"
+  ];
+
+  meta = with lib; {
+    description = "Python module to parse Dutch Smart Meter Requirements (DSMR)";
+    homepage = "https://github.com/ndokter/dsmr_parser";
+    changelog = "https://github.com/ndokter/dsmr_parser/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dsnap/default.nix b/nixpkgs/pkgs/development/python-modules/dsnap/default.nix
new file mode 100644
index 000000000000..0525f4d86119
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dsnap/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, aws-sam-cli
+, boto3
+, buildPythonPackage
+, cfn-lint
+, fetchFromGitHub
+, mock
+, moto
+, mypy-boto3-ebs
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, typer
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "dsnap";
+  version = "1.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "RhinoSecurityLabs";
+    repo = "dsnap";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-yKch+tKjFhvZfzloazMH378dkERF8gnZEX1Som+d670=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    boto3
+    urllib3
+  ];
+
+  passthru.optional-dependencies = {
+    cli = [
+      typer
+    ];
+    scannerd = [
+      aws-sam-cli
+      cfn-lint
+    ];
+  };
+
+  nativeCheckInputs = [
+    mock
+    moto
+    mypy-boto3-ebs
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "dsnap"
+  ];
+
+  meta = with lib; {
+    description = "Utility for downloading and mounting EBS snapshots using the EBS Direct API's";
+    homepage = "https://github.com/RhinoSecurityLabs/dsnap";
+    changelog = "https://github.com/RhinoSecurityLabs/dsnap/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/dtlssocket/default.nix b/nixpkgs/pkgs/development/python-modules/dtlssocket/default.nix
new file mode 100644
index 000000000000..80831ea0eb50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dtlssocket/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, autoconf
+, cython
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "dtlssocket";
+  version = "0.1.16";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "DTLSSocket";
+    inherit version;
+    hash = "sha256-MLEIrkX84cAz4+9sLd1+dBgGKuN0Io46f6lpslQ2ajk=";
+  };
+
+  nativeBuildInputs = [
+    autoconf
+    cython
+    setuptools
+  ];
+
+  # no tests on PyPI, no tags on GitLab
+  doCheck = false;
+
+  pythonImportsCheck = [ "DTLSSocket" ];
+
+  meta = with lib; {
+    description = "Cython wrapper for tinydtls with a Socket like interface";
+    homepage = "https://git.fslab.de/jkonra2m/tinydtls-cython";
+    license = licenses.epl10;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dtschema/default.nix b/nixpkgs/pkgs/development/python-modules/dtschema/default.nix
new file mode 100644
index 000000000000..1e890aba3309
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dtschema/default.nix
@@ -0,0 +1,68 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, jsonschema
+, pythonOlder
+, rfc3987
+, ruamel-yaml
+, setuptools-scm
+, libfdt
+}:
+
+buildPythonPackage rec {
+  pname = "dtschema";
+  version = "2023.04";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "devicetree-org";
+    repo = "dt-schema";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-w9TsRdiDTdExft7rdb2hYcvxP6hxOFZKI3hITiNSwgw=";
+  };
+
+  patches = [
+    # Change name of pylibfdt to libfdt
+    ./fix_libfdt_name.patch
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    jsonschema
+    rfc3987
+    ruamel-yaml
+    libfdt
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dtschema"
+  ];
+
+  meta = with lib; {
+    description = "Tooling for devicetree validation using YAML and jsonschema";
+    homepage = "https://github.com/devicetree-org/dt-schema/";
+    changelog = "https://github.com/devicetree-org/dt-schema/releases/tag/v${version}";
+    license = with licenses; [ bsd2 /* or */ gpl2Only ];
+    maintainers = with maintainers; [ sorki ];
+
+    broken = (
+      # Library not loaded: @rpath/libfdt.1.dylib
+      stdenv.isDarwin ||
+
+      # see https://github.com/devicetree-org/dt-schema/issues/108
+      versionAtLeast jsonschema.version "4.18"
+    );
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/dtschema/fix_libfdt_name.patch b/nixpkgs/pkgs/development/python-modules/dtschema/fix_libfdt_name.patch
new file mode 100644
index 000000000000..eb1ec34a95d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dtschema/fix_libfdt_name.patch
@@ -0,0 +1,13 @@
+diff --git a/setup.py b/setup.py
+index 62db8af..4a980c1 100755
+--- a/setup.py
++++ b/setup.py
+@@ -52,7 +52,7 @@ setuptools.setup(
+         'ruamel.yaml>0.15.69',
+         'jsonschema>=4.1.2',
+         'rfc3987',
+-        'pylibfdt',
++        'libfdt',
+     ],
+ 
+     classifiers=[
diff --git a/nixpkgs/pkgs/development/python-modules/dtw-python/default.nix b/nixpkgs/pkgs/development/python-modules/dtw-python/default.nix
new file mode 100644
index 000000000000..6af3dd1186b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dtw-python/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, oldest-supported-numpy
+, setuptools
+, wheel
+, scipy
+, numpy
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dtw-python";
+  version = "1.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "DynamicTimeWarping";
+    repo = "dtw-python";
+    rev = "v${version}";
+    hash = "sha256-7hQuo7dES9f08YZhCf+kxUkMlrr+bg1P7HHRCMv3bLk=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    oldest-supported-numpy
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    scipy
+    numpy
+  ];
+
+  # We need to run tests on real built package: https://github.com/NixOS/nixpkgs/issues/255262
+  preCheck = "cd $out";
+  nativeCheckInputs = [ pytestCheckHook ];
+  # tests/ are not included to output package, so we have to set path explicitly
+  pytestFlagsArray = [
+    "$src/tests"
+  ];
+
+  pythonImportsCheck = [ "dtw" ];
+
+  meta = with lib; {
+    description = "Python port of R's Comprehensive Dynamic Time Warp algorithms package";
+    homepage = "https://github.com/DynamicTimeWarping/dtw-python";
+    changelog = "https://github.com/DynamicTimeWarping/dtw-python/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ducc0/default.nix b/nixpkgs/pkgs/development/python-modules/ducc0/default.nix
new file mode 100644
index 000000000000..f75d32688738
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ducc0/default.nix
@@ -0,0 +1,31 @@
+{ stdenv, lib, buildPythonPackage, fetchFromGitLab, pythonOlder, pytestCheckHook, pybind11, numpy }:
+
+buildPythonPackage rec {
+  pname = "ducc0";
+  version = "0.32.0";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitLab {
+    domain = "gitlab.mpcdf.mpg.de";
+    owner = "mtr";
+    repo = "ducc";
+    rev = "ducc0_${lib.replaceStrings ["."] ["_"] version}";
+    hash = "sha256-D+Gt5RrzljZQHBijaPuCuNsK08VxxJoWhqxSDu4bjH0=";
+  };
+
+  buildInputs = [ pybind11 ];
+  propagatedBuildInputs = [ numpy ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  pytestFlagsArray = [ "python/test" ];
+  pythonImportsCheck = [ "ducc0" ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    homepage = "https://gitlab.mpcdf.mpg.de/mtr/ducc";
+    description = "Efficient algorithms for Fast Fourier transforms and more";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ parras ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/duckdb-engine/default.nix b/nixpkgs/pkgs/development/python-modules/duckdb-engine/default.nix
new file mode 100644
index 000000000000..ab82edb0893b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/duckdb-engine/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, duckdb
+, hypothesis
+, ipython-sql
+, poetry-core
+, snapshottest
+, sqlalchemy
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "duckdb-engine";
+  version = "0.9.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    repo = "duckdb_engine";
+    owner = "Mause";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-T02nGF+YlughRQPinb0I3NC6xsarh4+qRhG8YfhTvhI=";
+  };
+
+  patches = [ ./remote_data.patch ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    duckdb
+    sqlalchemy
+  ];
+
+  preCheck = ''
+    export HOME="$(mktemp -d)"
+  '';
+
+  disabledTests = [
+    # this test tries to download the httpfs extension
+    "test_preload_extension"
+    "test_motherduck"
+    # test should be skipped based on sqlalchemy version but isn't and fails
+    "test_commit"
+    # rowcount no longer generates an attribute error.
+    "test_rowcount"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    hypothesis
+    ipython-sql
+    # TODO(cpcloud): include pandas here when it supports sqlalchemy 2.0
+    snapshottest
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [
+    "duckdb_engine"
+  ];
+
+  meta = with lib; {
+    description = "SQLAlchemy driver for duckdb";
+    homepage = "https://github.com/Mause/duckdb_engine";
+    changelog = "https://github.com/Mause/duckdb_engine/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/duckdb-engine/remote_data.patch b/nixpkgs/pkgs/development/python-modules/duckdb-engine/remote_data.patch
new file mode 100644
index 000000000000..1c887acf6cae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/duckdb-engine/remote_data.patch
@@ -0,0 +1,24 @@
+diff --git a/duckdb_engine/tests/test_basic.py b/duckdb_engine/tests/test_basic.py
+index 302636f..ed20f12 100644
+--- a/duckdb_engine/tests/test_basic.py
++++ b/duckdb_engine/tests/test_basic.py
+@@ -183,7 +183,6 @@ def test_get_views(engine: Engine) -> None:
+ 
+ 
+ @mark.skipif(os.uname().machine == "aarch64", reason="not supported on aarch64")
+-@mark.remote_data
+ def test_preload_extension() -> None:
+     duckdb.default_connection.execute("INSTALL httpfs")
+     engine = create_engine(
+diff --git a/duckdb_engine/tests/test_integration.py b/duckdb_engine/tests/test_integration.py
+index 349c976..bf3dbaa 100644
+--- a/duckdb_engine/tests/test_integration.py
++++ b/duckdb_engine/tests/test_integration.py
+@@ -24,7 +24,6 @@ def test_integration(engine: Engine) -> None:
+         conn.execute(text("select * from test_df"))
+ 
+ 
+-@mark.remote_data
+ @mark.skipif(
+     "dev" in duckdb.__version__, reason="md extension not available for dev builds"  # type: ignore[attr-defined]
+ )
diff --git a/nixpkgs/pkgs/development/python-modules/duckdb/default.nix b/nixpkgs/pkgs/development/python-modules/duckdb/default.nix
new file mode 100644
index 000000000000..5ff995684992
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/duckdb/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, buildPythonPackage
+, duckdb
+, fsspec
+, google-cloud-storage
+, numpy
+, openssl
+, pandas
+, psutil
+, pybind11
+, setuptools-scm
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  inherit (duckdb) pname version src;
+  format = "setuptools";
+
+  # 1. let nix control build cores
+  # 2. default to extension autoload & autoinstall disabled
+  # 3. unconstrain setuptools_scm version
+  patches = (duckdb.patches or []) ++ [ ./setup.patch ];
+
+  postPatch = (duckdb.postPatch or "") + ''
+    # we can't use sourceRoot otherwise patches don't apply, because the patches apply to the C++ library
+    cd tools/pythonpkg
+
+    substituteInPlace setup.py --subst-var NIX_BUILD_CORES
+
+    # avoid dependency on mypy
+    rm tests/stubs/test_stubs.py
+  '';
+
+  BUILD_HTTPFS = 1;
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    pybind11
+    setuptools-scm
+  ];
+
+  buildInputs = [ openssl ];
+
+  propagatedBuildInputs = [
+    numpy
+    pandas
+  ];
+
+  nativeCheckInputs = [
+    fsspec
+    google-cloud-storage
+    psutil
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # tries to make http request
+    "test_install_non_existent_extension"
+    # test is racy and interrupt can be delivered before or after target point
+    "test_connection_interrupt"
+  ];
+
+  preCheck = ''
+    export HOME="$(mktemp -d)"
+  '';
+
+  setupPyBuildFlags = [
+    "--inplace"
+  ];
+
+  pythonImportsCheck = [
+    "duckdb"
+  ];
+
+  meta = with lib; {
+    description = "Python binding for DuckDB";
+    homepage = "https://duckdb.org/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/duckdb/setup.patch b/nixpkgs/pkgs/development/python-modules/duckdb/setup.patch
new file mode 100644
index 000000000000..8c8f790a66a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/duckdb/setup.patch
@@ -0,0 +1,30 @@
+diff --git a/tools/pythonpkg/setup.py b/tools/pythonpkg/setup.py
+index 30f1e1ccdd..6784169fcb 100644
+--- a/tools/pythonpkg/setup.py
++++ b/tools/pythonpkg/setup.py
+@@ -96,7 +96,7 @@ def parallel_cpp_compile(
+             return
+         self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
+ 
+-    list(multiprocessing.pool.ThreadPool(multiprocessing.cpu_count()).imap(_single_compile, objects))
++    list(multiprocessing.pool.ThreadPool(@NIX_BUILD_CORES@).imap(_single_compile, objects))
+     return objects
+ 
+ 
+@@ -163,7 +163,6 @@ if 'BUILD_HTTPFS' in os.environ:
+ for ext in extensions:
+     toolchain_args.extend(['-DDUCKDB_EXTENSION_{}_LINKED'.format(ext.upper())])
+ 
+-toolchain_args.extend(['-DDUCKDB_EXTENSION_AUTOLOAD_DEFAULT=1', '-DDUCKDB_EXTENSION_AUTOINSTALL_DEFAULT=1'])
+ 
+ 
+ class get_pybind_include(object):
+@@ -348,7 +347,7 @@ setup(
+     packages=packages,
+     include_package_data=True,
+     python_requires='>=3.7.0',
+-    setup_requires=setup_requires + ["setuptools_scm<7.0.0", 'pybind11>=2.6.0'],
++    setup_requires=setup_requires + ["setuptools_scm", 'pybind11>=2.6.0'],
+     use_scm_version=setuptools_scm_conf,
+     tests_require=['google-cloud-storage', 'mypy', 'pytest'],
+     classifiers=[
diff --git a/nixpkgs/pkgs/development/python-modules/duckduckgo-search/default.nix b/nixpkgs/pkgs/development/python-modules/duckduckgo-search/default.nix
new file mode 100644
index 000000000000..2e084fe774fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/duckduckgo-search/default.nix
@@ -0,0 +1,49 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, setuptools
+, aiofiles
+, click
+, h2
+, httpx
+, lxml
+, requests
+, socksio
+}:
+
+buildPythonPackage rec {
+  pname = "duckduckgo-search";
+  version = "3.9.4";
+
+  src = fetchFromGitHub {
+    owner = "deedy5";
+    repo = "duckduckgo_search";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-R96ezs0INIZAXTcD1eWXuj4MSJvCbtbgzgC3ls7wYyI=";
+  };
+
+  format = "pyproject";
+
+  nativeBuildInputs = [ setuptools ];
+
+  propagatedBuildInputs = [
+    aiofiles
+    click
+    h2
+    httpx
+    lxml
+    requests
+    socksio
+  ] ++ httpx.optional-dependencies.brotli
+    ++ httpx.optional-dependencies.http2
+    ++ httpx.optional-dependencies.socks;
+
+  pythonImportsCheck = [ "duckduckgo_search" ];
+
+  meta = {
+    description = "A python CLI and library for searching for words, documents, images, videos, news, maps and text translation using the DuckDuckGo.com search engine";
+    homepage = "https://github.com/deedy5/duckduckgo_search";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/duct-py/default.nix b/nixpkgs/pkgs/development/python-modules/duct-py/default.nix
new file mode 100644
index 000000000000..6a79305e90b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/duct-py/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "duct-py";
+  version = "0.6.4";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "oconnor663";
+    repo = "duct.py";
+    rev = version;
+    hash = "sha256-4ja/SQ9R/SbKlf3NqKxLi+Fl/4JI0Fl/zG9EmTZjWZc=";
+  };
+
+  pythonImportsCheck = [ "duct" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # This test completely empties the environment then tries to run a Python command.
+    # The test then fails because it can't find the `python` executable. It's unclear
+    # how this test even passes _outside_ of Nix.
+    "test_full_env"
+  ];
+
+  meta = with lib; {
+    description = "A Python library for running child processes";
+    homepage = "https://github.com/oconnor663/duct.py";
+    license = licenses.mit;
+    maintainers = with maintainers; [ zmitchell ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/duecredit/default.nix b/nixpkgs/pkgs/development/python-modules/duecredit/default.nix
new file mode 100644
index 000000000000..053fd6504e41
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/duecredit/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, pytestCheckHook
+, vcrpy
+, citeproc-py
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "duecredit";
+  version = "0.9.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Dg/Yfp5GzmyUMI6feAwgP+g22JYoQE+L9a+Wp0V77Rw=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+  propagatedBuildInputs = [ citeproc-py requests six ];
+
+  nativeCheckInputs = [ pytestCheckHook vcrpy ];
+  disabledTests = [ "test_import_doi" ];  # tries to access network
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  pythonImportsCheck = [ "duecredit" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/duecredit/duecredit";
+    description = "Simple framework to embed references in code";
+    changelog = "https://github.com/duecredit/duecredit/releases/tag/${version}";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/duet/default.nix b/nixpkgs/pkgs/development/python-modules/duet/default.nix
new file mode 100644
index 000000000000..4741414ca541
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/duet/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "duet";
+  version = "0.2.7";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = "duet";
+    rev = "v${version}";
+    hash = "sha256-9CTAupAxZI1twoLpgr7VfECw70QunE6pk+SskiT3JDw=";
+  };
+
+  propagatedBuildInputs = [ typing-extensions ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "A simple future-based async library for python";
+    homepage = "https://github.com/google/duet";
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dufte/default.nix b/nixpkgs/pkgs/development/python-modules/dufte/default.nix
new file mode 100644
index 000000000000..b112e481a9cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dufte/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, importlib-metadata
+, matplotlib
+, numpy
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "dufte";
+  version = "0.2.29";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "nschloe";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256:0ccsmpj160xj6w503a948aw8icj55mw9414xnmijmmjvlwhm0p48";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    matplotlib
+    numpy
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+    mkdir -p $HOME/.config/matplotlib
+    echo "backend: ps" > $HOME/.config/matplotlib/matplotlibrc
+    ln -s $HOME/.config/matplotlib $HOME/.matplotlib
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "dufte" ];
+
+  meta = with lib; {
+    description = "Clean matplotlib plots";
+    homepage = "https://github.com/nschloe/dufte";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ ris ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dugong/default.nix b/nixpkgs/pkgs/development/python-modules/dugong/default.nix
new file mode 100644
index 000000000000..6c87d50ccfd4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dugong/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pythonAtLeast
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "dugong";
+  version = "3.8.1";
+  disabled = pythonOlder "3.3";
+
+  src = fetchFromGitHub {
+    owner = "python-dugong";
+    repo = "python-dugong";
+    rev = "release-${version}";
+    sha256 = "1063c1779idc5nrjzfv5w1xqvyy3crapb2a2xll9y6xphxclnkjc";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Lots of tests hang during teardown with:
+  #   ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:2396)
+  doCheck = pythonOlder "3.10";
+
+  pythonImportsCheck = [ "dugong" ];
+
+  meta = with lib; {
+    description = "HTTP 1.1 client designed for REST-ful APIs";
+    homepage = "https://github.com/python-dugong/python-dugong/";
+    license = with licenses; [ psfl asl20 ];
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dulwich/default.nix b/nixpkgs/pkgs/development/python-modules/dulwich/default.nix
new file mode 100644
index 000000000000..2e1c93f89c04
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dulwich/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, certifi
+, fastimport
+, fetchPypi
+, gevent
+, geventhttpclient
+, git
+, glibcLocales
+, gnupg
+, gpgme
+, paramiko
+, pytestCheckHook
+, pythonOlder
+, urllib3
+}:
+
+buildPythonPackage rec {
+  version = "0.21.6";
+  pname = "dulwich";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MPvofotR84E8Ex4oQchtAHQ00WC9FttYa0DUfzHdBbA=";
+  };
+
+  LC_ALL = "en_US.UTF-8";
+
+  propagatedBuildInputs = [
+    certifi
+    urllib3
+  ];
+
+  passthru.optional-dependencies = {
+    fastimport = [
+      fastimport
+    ];
+    pgp = [
+      gpgme
+      gnupg
+    ];
+    paramiko = [
+      paramiko
+    ];
+  };
+
+  nativeCheckInputs = [
+    gevent
+    geventhttpclient
+    git
+    glibcLocales
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.fastimport
+  ++ passthru.optional-dependencies.pgp
+  ++ passthru.optional-dependencies.paramiko;
+
+  doCheck = !stdenv.isDarwin;
+
+  disabledTests = [
+    # OSError: [Errno 84] Invalid or incomplete multibyte or wide character: b'/build/tmpsqwlbpd1/\xc0'
+    "test_no_decode_encode"
+    # OSError: [Errno 84] Invalid or incomplete multibyte or wide character: b'/build/tmpwmtfyvo2/refs.git/refs/heads/\xcd\xee\xe2\xe0\xff\xe2\xe5\xf2\xea\xe01'
+    "test_cyrillic"
+    # OSError: [Errno 84] Invalid or incomplete multibyte or wide character: b'/build/tmpfseetobk/test/\xc0'
+    "test_commit_no_encode_decode"
+  ];
+
+  disabledTestPaths = [
+    # missing test inputs
+    "dulwich/contrib/test_swift_smoke.py"
+  ];
+
+  pythonImportsCheck = [
+    "dulwich"
+  ];
+
+  meta = with lib; {
+    description = "Implementation of the Git file formats and protocols";
+    longDescription = ''
+      Dulwich is a Python implementation of the Git file formats and protocols, which
+      does not depend on Git itself. All functionality is available in pure Python.
+    '';
+    homepage = "https://www.dulwich.io/";
+    changelog = "https://github.com/dulwich/dulwich/blob/dulwich-${version}/NEWS";
+    license = with licenses; [ asl20 gpl2Plus ];
+    maintainers = with maintainers; [ koral ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dunamai/default.nix b/nixpkgs/pkgs/development/python-modules/dunamai/default.nix
new file mode 100644
index 000000000000..46e2361d9db9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dunamai/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, poetry-core
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, importlib-metadata
+, packaging
+, pytestCheckHook
+, git
+}:
+
+buildPythonPackage rec {
+  pname = "dunamai";
+  version = "1.18.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mtkennerly";
+    repo = "dunamai";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-QKXEFwOAa5nIQZA6DHNqnWyshnN+/6qovdqjCd9WF4k=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  # needs to be able to run dunami from PATH
+  preCheck = ''
+    export PATH=$PATH:$out/bin
+    export HOME=$(mktemp -d)
+
+    git config --global user.email "nobody@example.com"
+    git config --global user.name "Nobody"
+  '';
+
+  nativeCheckInputs = [
+    git
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # clones from github.com
+    "test__version__from_git__shallow"
+  ];
+
+  pythonImportsCheck = [
+    "dunamai"
+  ];
+
+  meta = with lib; {
+    description = "Dynamic version generation";
+    homepage = "https://github.com/mtkennerly/dunamai";
+    changelog = "https://github.com/mtkennerly/dunamai/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jmgilman ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dungeon-eos/default.nix b/nixpkgs/pkgs/development/python-modules/dungeon-eos/default.nix
new file mode 100644
index 000000000000..c8525c3fcb99
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dungeon-eos/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchFromGitHub }:
+
+buildPythonPackage rec {
+  pname = "dungeon-eos";
+  version = "0.0.5";
+
+  src = fetchFromGitHub {
+    owner = "SkyTemple";
+    repo = pname;
+    rev = version;
+    hash = "sha256-Z1fGtslXP8zcZmVeWjRrbcM2ZJsfbrWjpLWZ49uSCRY=";
+  };
+
+  doCheck = false; # there are no tests
+  pythonImportsCheck = [ "dungeon_eos" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/SkyTemple/dungeon-eos";
+    description = "A package that simulates PMD EoS dungeon generation";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ marius851000 xfix ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/duo-client/default.nix b/nixpkgs/pkgs/development/python-modules/duo-client/default.nix
new file mode 100644
index 000000000000..129ec14cd0a7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/duo-client/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, freezegun
+, mock
+, pytestCheckHook
+, pythonOlder
+, pytz
+, setuptools
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "duo-client";
+  version = "5.0.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "duosecurity";
+    repo = "duo_client_python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-G0XLZZaQTPD64WXN34wq2z+YtzECgtC2nJXzDxAlgyg=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements-dev.txt \
+      --replace "dlint" "" \
+      --replace "flake8" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    mock
+    pytestCheckHook
+    pytz
+  ];
+
+  pythonImportsCheck = [
+    "duo_client"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_server_hostname"
+    "test_server_hostname_with_port"
+  ];
+
+  meta = with lib; {
+    description = "Python library for interacting with the Duo Auth, Admin, and Accounts APIs";
+    homepage = "https://github.com/duosecurity/duo_client_python";
+    changelog = "https://github.com/duosecurity/duo_client_python/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/durus/default.nix b/nixpkgs/pkgs/development/python-modules/durus/default.nix
new file mode 100644
index 000000000000..456ae010d63c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/durus/default.nix
@@ -0,0 +1,28 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "Durus";
+  version = "4.2";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "sha256:1gzxg43zawwgqjrfixvcrilwpikb1ix9b7710rsl5ffk7q50yi3c";
+  };
+
+  # Checks disabled due to missing python unittest framework 'sancho' in nixpkgs
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "durus.connection"
+    "durus.file_storage"
+    "durus.client_storage"
+    "durus.sqlite_storage"
+  ];
+
+  meta = with lib; {
+    description = "Object persistence layer";
+    homepage = "https://github.com/nascheme/durus";
+    license = licenses.mit;
+    maintainers = with maintainers; [ grindhold ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dvc-azure/default.nix b/nixpkgs/pkgs/development/python-modules/dvc-azure/default.nix
new file mode 100644
index 000000000000..fee36f66d886
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dvc-azure/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, adlfs
+, azure-identity
+, buildPythonPackage
+, dvc-objects
+, fetchPypi
+, knack
+, pythonRelaxDepsHook
+, setuptools-scm }:
+
+buildPythonPackage rec {
+  pname = "dvc-azure";
+  version = "2.22.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-v3VRCN1OoST5RlfUOP9Dpfmf3o9C/ckusmh91Ya2Cik=";
+  };
+
+  # Prevent circular dependency
+  pythonRemoveDeps = [ "dvc" ];
+
+  nativeBuildInputs = [ setuptools-scm pythonRelaxDepsHook ];
+
+  propagatedBuildInputs = [
+    adlfs azure-identity dvc-objects knack
+  ];
+
+  # Network access is needed for tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "dvc_azure" ];
+
+  meta = with lib; {
+    description = "azure plugin for dvc";
+    homepage = "https://pypi.org/project/dvc-azure/${version}";
+    changelog = "https://github.com/iterative/dvc-azure/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ melling ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dvc-data/default.nix b/nixpkgs/pkgs/development/python-modules/dvc-data/default.nix
new file mode 100644
index 000000000000..3c054f1ccb0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dvc-data/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, dictdiffer
+, diskcache
+, dvc-objects
+, fetchFromGitHub
+, funcy
+, pygtrie
+, pythonOlder
+, setuptools-scm
+, shortuuid
+, sqltrie
+}:
+
+buildPythonPackage rec {
+  pname = "dvc-data";
+  version = "2.22.3";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "iterative";
+    repo = "dvc-data";
+    rev = "refs/tags/${version}";
+    hash = "sha256-5x+I6Ds7x3JqaZ1oyddrsaX0kbMM8pO+rF3ckpRdcgc=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dictdiffer
+    diskcache
+    dvc-objects
+    funcy
+    pygtrie
+    shortuuid
+    sqltrie
+  ];
+
+  # Tests depend on upath which is unmaintained and only available as wheel
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dvc_data"
+  ];
+
+  meta = with lib; {
+    description = "DVC's data management subsystem";
+    homepage = "https://github.com/iterative/dvc-data";
+    changelog = "https://github.com/iterative/dvc-data/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dvc-gs/default.nix b/nixpkgs/pkgs/development/python-modules/dvc-gs/default.nix
new file mode 100644
index 000000000000..e36ec61a88c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dvc-gs/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, dvc-objects
+, fetchPypi
+, gcsfs
+, pythonRelaxDepsHook
+, setuptools-scm }:
+
+buildPythonPackage rec {
+  pname = "dvc-gs";
+  version = "2.22.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-IKDwdSfolZwv8TvHHicVV42PYeULhskv8csbkiJzLbk=";
+  };
+
+  # Prevent circular dependency
+  pythonRemoveDeps = [ "dvc" ];
+
+  nativeBuildInputs = [ setuptools-scm pythonRelaxDepsHook ];
+
+  propagatedBuildInputs = [ gcsfs dvc-objects ];
+
+  # Network access is needed for tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "dvc_gs" ];
+
+  meta = with lib; {
+    description = "gs plugin for dvc";
+    homepage = "https://pypi.org/project/dvc-gs/version";
+    changelog = "https://github.com/iterative/dvc-gs/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ melling ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dvc-http/default.nix b/nixpkgs/pkgs/development/python-modules/dvc-http/default.nix
new file mode 100644
index 000000000000..cb812d850c16
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dvc-http/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, aiohttp-retry
+, buildPythonPackage
+, fetchFromGitHub
+, dvc-objects
+, fsspec
+, pythonOlder
+, pythonRelaxDepsHook
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "dvc-http";
+  version = "2.30.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "iterative";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-IlgJEnS+rHSg5cw7SCc3vVtG1mJA5voGViya7nkpL2M=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dvc-objects
+    fsspec
+    aiohttp-retry
+  ];
+
+  # Currently it's not possible to run the tests
+  # ModuleNotFoundError: No module named 'dvc.testing'
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dvc_http"
+  ];
+
+  meta = with lib; {
+    description = "HTTP plugin for dvc";
+    homepage = "https://github.com/iterative/dvc-http";
+    changelog = "https://github.com/iterative/dvc-http/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dvc-objects/default.nix b/nixpkgs/pkgs/development/python-modules/dvc-objects/default.nix
new file mode 100644
index 000000000000..217782a34e6c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dvc-objects/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flatten-dict
+, fsspec
+, funcy
+, pygtrie
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, shortuuid
+, tqdm
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "dvc-objects";
+  version = "1.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "iterative";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-kTp0CowXtnLXetcnoCeqlXoadgaQhL5mTYTfq9QLIl8=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    flatten-dict
+    fsspec
+    funcy
+    pygtrie
+    shortuuid
+    tqdm
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dvc_objects"
+  ];
+
+  meta = with lib; {
+    description = "Library for DVC objects";
+    homepage = "https://github.com/iterative/dvc-objects";
+    changelog = "https://github.com/iterative/dvc-objects/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dvc-render/default.nix b/nixpkgs/pkgs/development/python-modules/dvc-render/default.nix
new file mode 100644
index 000000000000..c0ab18a4d17c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dvc-render/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, flatten-dict
+, funcy
+, matplotlib
+, tabulate
+, pytestCheckHook
+, pytest-mock
+, pytest-test-utils
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "dvc-render";
+  version = "0.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "iterative";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-seL96aOJ554pD7lgzXZFDCXqY/3TAQugWMA7MtqKoAE=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  passthru.optional-dependencies = {
+    table = [
+      flatten-dict
+      tabulate
+    ];
+    markdown = [
+      tabulate
+      matplotlib
+    ];
+  };
+
+  nativeCheckInputs = [
+    funcy
+    pytestCheckHook
+    pytest-mock
+    pytest-test-utils
+  ]
+  ++ passthru.optional-dependencies.table
+  ++ passthru.optional-dependencies.markdown;
+
+  disabledTestPaths = lib.optionals stdenv.isDarwin [
+    "tests/test_vega.py"
+  ];
+
+  pythonImportsCheck = [
+    "dvc_render"
+  ];
+
+  meta = with lib; {
+    description = "Library for rendering DVC plots";
+    homepage = "https://github.com/iterative/dvc-render";
+    changelog = "https://github.com/iterative/dvc-render/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dvc-s3/default.nix b/nixpkgs/pkgs/development/python-modules/dvc-s3/default.nix
new file mode 100644
index 000000000000..ca4fe5a810d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dvc-s3/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, aiobotocore
+, boto3
+, buildPythonPackage
+, dvc-objects
+, fetchPypi
+, flatten-dict
+, pythonRelaxDepsHook
+, s3fs
+, setuptools-scm }:
+
+buildPythonPackage rec {
+  pname = "dvc-s3";
+  version = "2.23.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-HyhZj1sN70o1CTNCiroGKjaMk7tBGqPG2PRsrnm1uVc=";
+  };
+
+  # Prevent circular dependency
+  pythonRemoveDeps = [ "dvc" ];
+
+  # dvc-s3 uses boto3 directly, we add in propagatedBuildInputs
+  postPatch = ''
+    substituteInPlace setup.cfg --replace 'aiobotocore[boto3]' 'aiobotocore'
+  '';
+
+  nativeBuildInputs = [ setuptools-scm pythonRelaxDepsHook ];
+
+  propagatedBuildInputs = [
+    aiobotocore boto3 dvc-objects flatten-dict s3fs
+  ];
+
+  # Network access is needed for tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "dvc_s3" ];
+
+  meta = with lib; {
+    description = "s3 plugin for dvc";
+    homepage = "https://pypi.org/project/dvc-s3/${version}";
+    changelog = "https://github.com/iterative/dvc-s3/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ melling ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dvc-ssh/default.nix b/nixpkgs/pkgs/development/python-modules/dvc-ssh/default.nix
new file mode 100644
index 000000000000..3da0a15dc93d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dvc-ssh/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, bcrypt
+, buildPythonPackage
+, dvc-objects
+, fetchPypi
+, pythonRelaxDepsHook
+, setuptools-scm
+, sshfs
+}:
+
+buildPythonPackage rec {
+  pname = "dvc-ssh";
+  version = "2.22.2";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-eJwNCZvdBqYKEbX4On3pGm2bzCvH9G7rdsgeN7XPJB0=";
+  };
+
+  # Prevent circular dependency
+  pythonRemoveDeps = [ "dvc" ];
+
+  nativeBuildInputs = [ setuptools-scm pythonRelaxDepsHook ];
+
+  propagatedBuildInputs = [ bcrypt dvc-objects sshfs ];
+
+  # bcrypt is enabled for sshfs in nixpkgs
+  postPatch = ''
+    substituteInPlace setup.cfg --replace "sshfs[bcrypt]" "sshfs"
+  '';
+
+  # Network access is needed for tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "dvc_ssh" ];
+
+  meta = with lib; {
+    description = "ssh plugin for dvc";
+    homepage = "https://pypi.org/project/dvc-ssh/${version}";
+    changelog = "https://github.com/iterative/dvc-ssh/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ melling ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dvc-studio-client/default.nix b/nixpkgs/pkgs/development/python-modules/dvc-studio-client/default.nix
new file mode 100644
index 000000000000..b2ad5f1dac0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dvc-studio-client/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, dulwich
+, fetchFromGitHub
+, gitpython
+, pythonOlder
+, requests
+, setuptools-scm
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "dvc-studio-client";
+  version = "0.17.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "iterative";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-cC/OcQglVIzj4PZFhzq3cXA/4dYkY1gW9b8Ub6opZJU=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dulwich
+    gitpython
+    requests
+    voluptuous
+  ];
+
+  pythonImportsCheck = [
+    "dvc_studio_client"
+  ];
+
+  # Tests try to access network
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Library to post data from DVC/DVCLive to Iterative Studio";
+    homepage = "https://github.com/iterative/dvc-studio-client";
+    changelog = "https://github.com/iterative/dvc-studio-client/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ melling ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dvc-task/default.nix b/nixpkgs/pkgs/development/python-modules/dvc-task/default.nix
new file mode 100644
index 000000000000..6cec59e72ac1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dvc-task/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools-scm
+, kombu
+, shortuuid
+, celery
+, funcy
+, pytest-celery
+, pytest-mock
+, pytest-test-utils
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "dvc-task";
+  version = "0.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "iterative";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-nrE8PdvzhH7lO0flvNkGC61NOVT4aj2E2gKEDRkp+b4=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    kombu
+    shortuuid
+    celery
+    funcy
+  ];
+
+  nativeCheckInputs = [
+    pytest-celery
+    pytest-mock
+    pytest-test-utils
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "dvc_task"
+  ];
+
+  meta = with lib; {
+    description = "Celery task queue used in DVC";
+    homepage = "https://github.com/iterative/dvc-task";
+    changelog = "https://github.com/iterative/dvc-task/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dvc/default.nix b/nixpkgs/pkgs/development/python-modules/dvc/default.nix
new file mode 100644
index 000000000000..f7ee2eccd3df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dvc/default.nix
@@ -0,0 +1,151 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pythonOlder
+, pythonRelaxDepsHook
+, setuptools-scm
+, appdirs
+, colorama
+, configobj
+, distro
+, dpath
+, dvc-azure
+, dvc-data
+, dvc-gs
+, dvc-http
+, dvc-render
+, dvc-s3
+, dvc-ssh
+, dvc-studio-client
+, dvc-task
+, flatten-dict
+, flufl_lock
+, funcy
+, grandalf
+, hydra-core
+, importlib-metadata
+, importlib-resources
+, iterative-telemetry
+, networkx
+, packaging
+, pathspec
+, platformdirs
+, psutil
+, pydot
+, pygtrie
+, pyparsing
+, requests
+, rich
+, ruamel-yaml
+, scmrepo
+, shortuuid
+, shtab
+, tabulate
+, tomlkit
+, tqdm
+, typing-extensions
+, voluptuous
+, zc_lockfile
+, enableGoogle ? false
+, enableAWS ? false
+, enableAzure ? false
+, enableSSH ? false
+}:
+
+buildPythonPackage rec {
+  pname = "dvc";
+  version = "3.30.3";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "iterative";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-efj2p5Tj3VWJC7o8/nLpNrkM0eZodLMsFZRcZQpLFws=";
+  };
+
+  pythonRelaxDeps = [
+    "dvc-data"
+    "platformdirs"
+  ];
+
+  postPatch = ''
+    substituteInPlace dvc/analytics.py --replace 'enabled = not os.getenv(DVC_NO_ANALYTICS)' 'enabled = False'
+    substituteInPlace dvc/daemon.py \
+      --subst-var-by dvc "$out/bin/dcv"
+  '';
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    appdirs
+    colorama
+    configobj
+    distro
+    dpath
+    dvc-data
+    dvc-http
+    dvc-render
+    dvc-studio-client
+    dvc-task
+    flatten-dict
+    flufl_lock
+    funcy
+    grandalf
+    hydra-core
+    iterative-telemetry
+    networkx
+    packaging
+    pathspec
+    platformdirs
+    psutil
+    pydot
+    pygtrie
+    pyparsing
+    requests
+    rich
+    ruamel-yaml
+    scmrepo
+    shortuuid
+    shtab
+    tabulate
+    tomlkit
+    tqdm
+    typing-extensions
+    voluptuous
+    zc_lockfile
+  ]
+  ++ lib.optionals enableGoogle passthru.optional-dependencies.gs
+  ++ lib.optionals enableAWS passthru.optional-dependencies.s3
+  ++ lib.optionals enableAzure passthru.optional-dependencies.azure
+  ++ lib.optionals enableSSH passthru.optional-dependencies.ssh
+  ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ];
+
+  passthru.optional-dependencies = {
+    azure = [ dvc-azure ];
+    gs = [ dvc-gs ];
+    s3 = [ dvc-s3 ];
+    ssh = [ dvc-ssh ];
+  };
+
+  # Tests require access to real cloud services
+  doCheck = false;
+
+  pythonImportsCheck = [ "dvc" "dvc.api" ];
+
+  meta = with lib; {
+    description = "Version Control System for Machine Learning Projects";
+    homepage = "https://dvc.org";
+    changelog = "https://github.com/iterative/dvc/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ cmcdragonkai fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dvc/dvc-daemon.patch b/nixpkgs/pkgs/development/python-modules/dvc/dvc-daemon.patch
new file mode 100644
index 000000000000..65ba630f3b80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dvc/dvc-daemon.patch
@@ -0,0 +1,18 @@
+diff --git a/dvc/daemon.py b/dvc/daemon.py
+index 9854a0e1..fefdd613 100644
+--- a/dvc/daemon.py
++++ b/dvc/daemon.py
+@@ -103,11 +103,8 @@ def daemon(args):
+         logger.debug("skipping launching a new daemon.")
+         return
+ 
+-    cmd = ["daemon", "-q"] + args
+-
+-    env = fix_env()
+-    file_path = os.path.abspath(inspect.stack()[0][1])
+-    env["PYTHONPATH"] = os.path.dirname(os.path.dirname(file_path))
++    cmd = [ "@dvc@" , "daemon", "-q"] + args
++    env = os.environ.copy()
+     env[DVC_DAEMON] = "1"
+ 
+     _spawn(cmd, env)
diff --git a/nixpkgs/pkgs/development/python-modules/dvclive/default.nix b/nixpkgs/pkgs/development/python-modules/dvclive/default.nix
new file mode 100644
index 000000000000..628afaaac4dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dvclive/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, dvc
+, dvc-studio-client
+, fetchFromGitHub
+, funcy
+, pytestCheckHook
+, pythonOlder
+, ruamel-yaml
+, scmrepo
+, setuptools-scm
+, tabulate
+}:
+
+buildPythonPackage rec {
+  pname = "dvclive";
+  version = "3.3.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "iterative";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-esvDCAsGoaB4t4hiTmoQa69Sgg5crqJyiom/iXxpZow=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dvc
+    dvc-studio-client
+    funcy
+    ruamel-yaml
+    scmrepo
+  ];
+
+  # Circular dependency with dvc
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dvclive"
+  ];
+
+  meta = with lib; {
+    description = "Library for logging machine learning metrics and other metadata in simple file formats";
+    homepage = "https://github.com/iterative/dvclive";
+    changelog = "https://github.com/iterative/dvclive/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dwdwfsapi/default.nix b/nixpkgs/pkgs/development/python-modules/dwdwfsapi/default.nix
new file mode 100644
index 000000000000..58b62032e33b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dwdwfsapi/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, ciso8601
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dwdwfsapi";
+  version = "1.0.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7le1F+581JwrBX/C1aaqsDaSpIt0yNsNKiGnJtHUg5s=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    ciso8601
+  ];
+
+  # All tests require network access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dwdwfsapi"
+  ];
+
+  meta = with lib; {
+    description = "Python client to retrieve data provided by DWD via their geoserver WFS API";
+    homepage = "https://github.com/stephan192/dwdwfsapi";
+    changelog = "https://github.com/stephan192/dwdwfsapi/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ elohmeier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dyn/default.nix b/nixpkgs/pkgs/development/python-modules/dyn/default.nix
new file mode 100644
index 000000000000..39e6ff6ed760
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dyn/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi, pytest, pytest-cov, mock
+, pytest-xdist, covCore, glibcLocales }:
+
+buildPythonPackage rec {
+  pname = "dyn";
+  version = "1.8.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-933etYrKRgSqJfOMIuIDL4Uv4/RdSEFMNWFtW5qiPpA=";
+  };
+
+  buildInputs = [ glibcLocales ];
+
+  nativeCheckInputs = [
+    pytest
+    pytest-cov
+    mock
+    pytest-xdist
+    covCore
+  ];
+  # Disable checks because they are not stateless and require internet access.
+  doCheck = false;
+
+  LC_ALL="en_US.UTF-8";
+
+  meta = with lib; {
+    description = "Dynect dns lib";
+    homepage = "https://dyn.readthedocs.org/en/latest/intro.html";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dynalite-devices/default.nix b/nixpkgs/pkgs/development/python-modules/dynalite-devices/default.nix
new file mode 100644
index 000000000000..7066271182ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dynalite-devices/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "dynalite-devices";
+  version = "0.47";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ziv1234";
+    repo = "python-dynalite-devices";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-kJo4e5vhgWzijLUhQd9VBVk1URpg9SXhOA60dJYashM=";
+  };
+
+  postPatch = ''
+    sed -i '/^addopts/d' setup.cfg
+  '';
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=auto"
+  ];
+
+  pythonImportsCheck = [
+    "dynalite_devices_lib"
+  ];
+
+  meta = with lib; {
+    description = "An unofficial Dynalite DyNET interface creating devices";
+    homepage = "https://github.com/ziv1234/python-dynalite-devices";
+    changelog = "https://github.com/ziv1234/python-dynalite-devices/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/dynd/default.nix b/nixpkgs/pkgs/development/python-modules/dynd/default.nix
new file mode 100644
index 000000000000..61c29fbff49b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/dynd/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, cython
+, numpy
+, libdynd
+, fetchpatch
+, cmake
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  version = "0.7.2";
+  pname = "dynd";
+
+  src = fetchFromGitHub {
+    owner = "libdynd";
+    repo = "dynd-python";
+    rev = "v${version}";
+    sha256 = "19igd6ibf9araqhq9bxmzbzdz05vp089zxvddkiik3b5gb7l17nh";
+  };
+
+  patches = [
+    # Fix numpy compatibility
+    # https://github.com/libdynd/dynd-python/issues/746
+    (fetchpatch {
+      url = "https://aur.archlinux.org/cgit/aur.git/plain/numpy-compatibility.patch?h=python-dynd&id=e626acabd041069861311f314ac3dbe9e6fd24b7";
+      sha256 = "sha256-oA/3G8CGeDhiYXbNX+G6o3QSb7rkKItuCDCbnK3Rt10=";
+      name = "numpy-compatibility.patch";
+    })
+  ];
+
+  # setup.py invokes git on build but we're fetching a tarball, so
+  # can't retrieve git version. We hardcode:
+  preConfigure = ''
+    substituteInPlace setup.py --replace "ver = check_output(['git', 'describe', '--dirty'," "ver = '${version}'"
+    substituteInPlace setup.py --replace "'--always', '--match', 'v*']).decode('ascii').strip('\n')" ""
+  '';
+
+  dontUseCmakeConfigure = true;
+
+  nativeBuildInputs = [ cmake ];
+
+  buildInputs = [
+    cython
+    libdynd.dev
+  ];
+
+  propagatedBuildInputs = [
+    libdynd
+    numpy
+  ];
+
+  #  ModuleNotFoundError: No module named 'dynd.config'
+  doCheck = false;
+
+  pythonImportsCheck = [ "dynd" ];
+
+  meta = with lib; {
+    homepage = "http://libdynd.org";
+    license = licenses.bsd2;
+    description = "Python exposure of dynd";
+    maintainers = with maintainers; [ teh ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/e3-core/0001-use-distro-over-ld.patch b/nixpkgs/pkgs/development/python-modules/e3-core/0001-use-distro-over-ld.patch
new file mode 100644
index 000000000000..15548b7aec1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/e3-core/0001-use-distro-over-ld.patch
@@ -0,0 +1,42 @@
+From 189681bbfb703a7026ca7bbb3b21ef554807b144 Mon Sep 17 00:00:00 2001
+From: tali auster <taliauster@gmail.com>
+Date: Wed, 15 Nov 2023 12:15:34 -0700
+Subject: [PATCH] use distro over ld
+
+The `ld` module (linux distribution) was renamed to `distro`, presumably
+so as not to subsume binutils name.
+
+---
+ setup.py              | 2 +-
+ src/e3/os/platform.py | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/setup.py b/setup.py
+index c32f46f..de1ada6 100644
+--- a/setup.py
++++ b/setup.py
+@@ -25,7 +25,7 @@ for p in ("darwin", "linux", "linux2", "win32"):
+     platform_string = ":sys_platform=='%s'" % p
+     extras_require[platform_string] = ["psutil"]
+     if p in ("linux", "linux2"):
+-        extras_require[platform_string].append("ld")
++        extras_require[platform_string].append("distro")
+ 
+ # Get e3 version from the VERSION file.
+ version_file = os.path.join(os.path.dirname(__file__), "VERSION")
+diff --git a/src/e3/os/platform.py b/src/e3/os/platform.py
+index 2d4e174..a9d12d3 100644
+--- a/src/e3/os/platform.py
++++ b/src/e3/os/platform.py
+@@ -78,7 +78,7 @@ class SystemInfo:
+ 
+         # Fetch linux distribution info on linux OS
+         if cls.uname.system == "Linux":  # linux-only
+-            import ld
++            import distro as ld
+ 
+             cls.ld_info = {
+                 "name": ld.name(),
+-- 
+2.40.1
+
diff --git a/nixpkgs/pkgs/development/python-modules/e3-core/default.nix b/nixpkgs/pkgs/development/python-modules/e3-core/default.nix
new file mode 100644
index 000000000000..95759b6a096c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/e3-core/default.nix
@@ -0,0 +1,65 @@
+{ buildPythonPackage
+, colorama
+, coverage
+, distro
+, fetchFromGitHub
+, httpretty
+, lib
+, mock
+, psutil
+, pytest
+, pytest-socket
+, python-dateutil
+, pyyaml
+, requests
+, requests-toolbelt
+, stdenv
+, setuptools
+, stevedore
+, tomlkit
+, tox
+, tqdm
+, typeguard
+}:
+
+buildPythonPackage rec {
+  pname = "e3-core";
+  version = "22.3.1";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "AdaCore";
+    repo = "e3-core";
+    rev = "v${version}";
+    hash = "sha256-4StHOJldfeqApdF6D14Euzg9HvZ2e7G4/OQ0UrEbEIw=";
+  };
+
+  patches = [ ./0001-use-distro-over-ld.patch ];
+
+  nativeBuildInputs = [ setuptools ];
+
+  propagatedBuildInputs = [
+    colorama pyyaml python-dateutil requests requests-toolbelt tqdm stevedore
+  ] ++ lib.optional stdenv.isLinux [
+    # See setup.py:24. These are required only on Linux. Darwin has its own set
+    # of requirements.
+    psutil distro
+  ];
+
+  pythonImportsCheck = [ "e3" ];
+
+  # e3-core is tested with tox; it's hard to test without internet.
+  doCheck = false;
+
+  meta = with lib; {
+    changelog = "https://github.com/AdaCore/e3-core/releases/tag/${src.rev}";
+    homepage = "https://github.com/AdaCore/e3-core/";
+    description = "Core framework for developing portable automated build systems";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ atalii ];
+    mainProgram = "e3";
+    # See the comment regarding distro and psutil. Other platforms are supported
+    # upstream, but not by this package.
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/eagle100/default.nix b/nixpkgs/pkgs/development/python-modules/eagle100/default.nix
new file mode 100644
index 000000000000..9d5e5d795028
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eagle100/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "eagle100";
+  version = "0.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-eyYY1x8IjIfUx5OiaOomiWunsO1++seFwXlI/iKDDLw=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "eagle100"
+  ];
+
+  meta = with lib; {
+    description = "Python library for interacting with Rainforest EAGLE devices";
+    homepage = "https://github.com/hastarin/eagle100";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/easy-thumbnails/default.nix b/nixpkgs/pkgs/development/python-modules/easy-thumbnails/default.nix
new file mode 100644
index 000000000000..97afb19058f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/easy-thumbnails/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, django
+, fetchPypi
+, pillow
+, pytestCheckHook
+, pythonOlder
+, reportlab
+, svglib
+}:
+
+buildPythonPackage rec {
+  pname = "easy-thumbnails";
+  version = "2.8.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-fk6RJgn8m2Czof72VX7BXd+cT5RiZ6kuaSDf1N12XjU=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    pillow
+    svglib
+    reportlab
+  ];
+
+  # Tests require a Django instance which is setup
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "easy_thumbnails"
+  ];
+
+  meta = with lib; {
+    description = "Easy thumbnails for Django";
+    homepage = "https://github.com/SmileyChris/easy-thumbnails";
+    changelog = "https://github.com/SmileyChris/easy-thumbnails/blob/${version}/CHANGES.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/easydict/default.nix b/nixpkgs/pkgs/development/python-modules/easydict/default.nix
new file mode 100644
index 000000000000..2a06fe02d133
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/easydict/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "easydict";
+  version = "1.11";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3LHS7SjrMAyORs03E0A3Orxi98FNbep0/fxvEGkGHHg=";
+  };
+
+  doCheck = false; # No tests in archive
+
+  pythonImportsCheck = [
+    "easydict"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/makinacorpus/easydict";
+    license = licenses.lgpl3;
+    description = "Access dict values as attributes (works recursively)";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/easyenergy/default.nix b/nixpkgs/pkgs/development/python-modules/easyenergy/default.nix
new file mode 100644
index 000000000000..8b6092e13c40
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/easyenergy/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytest-freezer
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "easyenergy";
+  version = "1.0.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "klaasnicolaas";
+    repo = "python-easyenergy";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-HdCrbEk1b+FZzDoMoLcNaPFEHQfDoQsePKmESM9Qhds=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"0.0.0"' '"${version}"' \
+      --replace 'addopts = "--cov"' ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytest-freezer
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "easyenergy"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_json_request"
+    "test_internal_session"
+    "test_electricity_model_usage"
+    "test_electricity_model_return"
+    "test_electricity_none_data"
+    "test_no_electricity_data"
+    "test_gas_morning_model"
+    "test_gas_model"
+    "test_gas_none_data"
+    "test_no_gas_data"
+    "test_electricity_midnight"
+  ];
+
+  meta = with lib; {
+    description = "Module for getting energy/gas prices from easyEnergy";
+    homepage = "https://github.com/klaasnicolaas/python-easyenergy";
+    changelog = "https://github.com/klaasnicolaas/python-easyenergy/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/easygui/default.nix b/nixpkgs/pkgs/development/python-modules/easygui/default.nix
new file mode 100644
index 000000000000..cfcd2ed77ad7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/easygui/default.nix
@@ -0,0 +1,26 @@
+{ lib, fetchPypi, buildPythonPackage, tkinter }:
+
+buildPythonPackage rec {
+  pname = "easygui";
+  version = "0.98.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-1lP/ee4fQvY7WgkPL5jOAjNdhq2JY7POJmGAXK/pmgQ=";
+  };
+
+  propagatedBuildInputs = [
+    tkinter
+  ];
+
+  doCheck = false; # No tests available
+
+  pythonImportsCheck = [ "easygui" ];
+
+  meta = with lib; {
+    description = "Very simple, very easy GUI programming in Python";
+    homepage = "https://github.com/robertlugg/easygui";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/easyocr/default.nix b/nixpkgs/pkgs/development/python-modules/easyocr/default.nix
new file mode 100644
index 000000000000..1199f75c450d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/easyocr/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hdf5
+, numpy
+, onnx
+, opencv4
+, pillow
+, pyaml
+, pyclipper
+, python-bidi
+, pythonOlder
+, scikit-image
+, scipy
+, shapely
+, torch
+, torchvision
+}:
+
+buildPythonPackage rec {
+  pname = "easyocr";
+  version = "1.7.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "JaidedAI";
+    repo = "EasyOCR";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-EiiJ2LJ3uYIvgPd2y25MraV5kTa47JalDR7SLbkM9UI=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "opencv-python-headless" "" \
+      --replace "ninja" ""
+  '';
+
+  propagatedBuildInputs = [
+    hdf5
+    numpy
+    opencv4
+    pillow
+    pyaml
+    pyclipper
+    python-bidi
+    scikit-image
+    scipy
+    shapely
+    torch
+    torchvision
+  ];
+
+  nativeCheckInputs = [
+    onnx
+  ];
+
+  pythonImportsCheck = [
+    "easyocr"
+  ];
+
+  meta = with lib; {
+    description = "Ready-to-use OCR with 80+ supported languages and all popular writing scripts";
+    homepage = "https://github.com/JaidedAI/EasyOCR";
+    changelog = "https://github.com/JaidedAI/EasyOCR/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dit7ya ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/easyprocess/default.nix b/nixpkgs/pkgs/development/python-modules/easyprocess/default.nix
new file mode 100644
index 000000000000..b1818665f879
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/easyprocess/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "easyprocess";
+  version = "1.1";
+
+  src = fetchPypi {
+    pname = "EasyProcess";
+    inherit version;
+    hash = "sha256-iFiYMCpXqrlIlz6LXTKkIpOSufstmGqx1P/VkOW6kOw=";
+  };
+
+  # No tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Easy to use python subprocess interface";
+    homepage = "https://github.com/ponty/EasyProcess";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ layus ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/easywatch/default.nix b/nixpkgs/pkgs/development/python-modules/easywatch/default.nix
new file mode 100644
index 000000000000..36f3ea0de6ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/easywatch/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, watchdog
+}:
+
+buildPythonPackage rec {
+  pname = "easywatch";
+  version = "0.0.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1b40cjigv7s9qj8hxxy6yhwv0320z7qywrigwgkasgh80q0xgphc";
+  };
+
+  propagatedBuildInputs = [ watchdog ];
+
+  # There are no tests
+  doCheck = false;
+  pythonImportsCheck = [ "easywatch" ];
+
+  meta = with lib; {
+    description = "Dead-simple way to watch a directory";
+    homepage = "https://github.com/Ceasar/easywatch";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fgaz ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/ebaysdk/default.nix b/nixpkgs/pkgs/development/python-modules/ebaysdk/default.nix
new file mode 100644
index 000000000000..bd4b736b720b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ebaysdk/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, lxml
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "ebaysdk";
+  version = "2.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Lrh11wa0gfWcqN0wdFON9+UZaBT5zhLQ74RpA0Opx/M=";
+  };
+
+  propagatedBuildInputs = [
+    lxml
+    requests
+  ];
+
+  # requires network
+  doCheck = false;
+
+  meta = with lib; {
+    description = "eBay SDK for Python";
+    homepage = "https://github.com/timotheus/ebaysdk-python";
+    license = licenses.cddl;
+    maintainers = [ maintainers.mkg20001 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ebooklib/default.nix b/nixpkgs/pkgs/development/python-modules/ebooklib/default.nix
new file mode 100644
index 000000000000..63ea0b4d06d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ebooklib/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, lxml
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "ebooklib";
+  version = "0.18";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "aerkalov";
+    repo = "ebooklib";
+    rev = "v${version}";
+    hash = "sha256-Ciks/eeRpkqkWnyLgyHC+x/dSOcj/ZT45KUElKqv1F8=";
+  };
+
+  propagatedBuildInputs = [
+    lxml
+    six
+  ];
+
+  pythonImportsCheck = [ "ebooklib" ];
+
+  meta = with lib; {
+    description = "Python E-book library for handling books in EPUB2/EPUB3  format";
+    homepage = "https://github.com/aerkalov/ebooklib";
+    changelog = "https://github.com/aerkalov/ebooklib/blob/${src.rev}/CHANGES.txt";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ Scrumplex ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ecdsa/default.nix b/nixpkgs/pkgs/development/python-modules/ecdsa/default.nix
new file mode 100644
index 000000000000..ba5fa836c21b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ecdsa/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pkgs
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "ecdsa";
+  version = "0.18.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GQNIBBVZ4hsiodZc7khSgsoRpvgdUD/duE1QF+ntHkk=";
+  };
+
+  propagatedBuildInputs = [ six ];
+  # Only needed for tests
+  nativeCheckInputs = [ pkgs.openssl ];
+
+  meta = with lib; {
+    description = "ECDSA cryptographic signature library";
+    homepage = "https://github.com/warner/python-ecdsa";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/echo/default.nix b/nixpkgs/pkgs/development/python-modules/echo/default.nix
new file mode 100644
index 000000000000..af3a3d43a6d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/echo/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, setuptools-scm
+, libxcrypt
+, numpy
+, qt6
+, qtpy
+, pyqt6
+, pytestCheckHook
+, pytest-cov
+}:
+
+buildPythonPackage rec {
+  pname = "echo";
+  version = "0.8.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "glue-viz";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-0FmUA7kOFSRZXwbj8d7asujBPOjE2pFhu6TDNSGD4r0=";
+  };
+
+  nativeBuildInputs = [ setuptools setuptools-scm qt6.wrapQtAppsHook ];
+
+  buildInputs = lib.optionals (pythonOlder "3.9") [
+    libxcrypt
+  ];
+
+  propagatedBuildInputs = [
+    qt6.qtconnectivity
+    qt6.qtbase
+    qt6.qttools
+    pyqt6
+    numpy
+    qtpy
+  ];
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  # collecting ... qt.qpa.xcb: could not connect to display
+  # qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
+  doCheck = false;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-cov
+  ];
+
+  pythonImportsCheck = [ "echo" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/glue-viz/echo";
+    description = "Callback Properties in Python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ifurther ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ecoaliface/default.nix b/nixpkgs/pkgs/development/python-modules/ecoaliface/default.nix
new file mode 100644
index 000000000000..f37a85da7d01
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ecoaliface/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "ecoaliface";
+  version = "0.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f17b3452cfd31bb8c3509d59b846889c81db5fb85082c061c32703162cbe9083";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "ecoaliface" ];
+
+  meta = with lib; {
+    description = "Python library for interacting with eCoal water boiler controllers";
+    homepage = "https://github.com/matkor/ecoaliface";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ecos/default.nix b/nixpkgs/pkgs/development/python-modules/ecos/default.nix
new file mode 100644
index 000000000000..0327845506b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ecos/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, numpy
+, pythonOlder
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "ecos";
+  version = "2.0.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "embotech";
+    repo = "ecos-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-jflmXR7fuGRSyI6NoQrHFvkKqF/D4iq47StNSCdLbqQ=";
+    fetchSubmodules = true;
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+  ];
+
+  nativeCheckInputs = [
+    nose
+  ];
+
+  checkPhase = ''
+    cd ./src
+    nosetests test_interface.py test_interface_bb.py
+  '';
+
+  pythonImportsCheck = [
+    "ecos"
+  ];
+
+  meta = with lib; {
+    description = "Python interface for ECOS";
+    homepage = "https://github.com/embotech/ecos-python";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ecpy/default.nix b/nixpkgs/pkgs/development/python-modules/ecpy/default.nix
new file mode 100644
index 000000000000..37bbb183ff40
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ecpy/default.nix
@@ -0,0 +1,28 @@
+{ lib, fetchPypi, buildPythonPackage, isPy3k, future }:
+
+buildPythonPackage rec {
+  pname = "ECPy";
+  version = "1.2.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9635cffb9b6ecf7fd7f72aea1665829ac74a1d272006d0057d45a621aae20228";
+  };
+
+  prePatch = ''
+    sed -i "s|reqs.append('future')|pass|" setup.py
+  '';
+
+  propagatedBuildInputs = lib.optional (!isPy3k) future;
+
+  # No tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "ecpy" ];
+
+  meta = with lib; {
+    description = "Pure Pyhton Elliptic Curve Library";
+    homepage = "https://github.com/ubinity/ECPy";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ecs-logging/default.nix b/nixpkgs/pkgs/development/python-modules/ecs-logging/default.nix
new file mode 100644
index 000000000000..cd55d1c4c2b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ecs-logging/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ecs-logging";
+  version = "2.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "elastic";
+    repo = "ecs-logging-python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Gf44bT3/gmHy+yaQ1+bhCFB33ym2G14tzNqTQyC3BJU=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  # Circular dependency elastic-apm
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ecs_logging"
+  ];
+
+  meta = with lib; {
+    description = "Logging formatters for the Elastic Common Schema (ECS) in Python";
+    homepage = "https://github.com/elastic/ecs-logging-python";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ed25519-blake2b/default.nix b/nixpkgs/pkgs/development/python-modules/ed25519-blake2b/default.nix
new file mode 100644
index 000000000000..64061551e2da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ed25519-blake2b/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, fetchPypi
+, pythonOlder
+, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "ed25519-blake2b";
+  version = "1.4";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-0aHLkDLsMHzpW0HGGUQP1NP87MGPIkA1zH1tx6fY70A=";
+  };
+
+  pythonImportsCheck = [
+    "ed25519_blake2b"
+  ];
+
+  meta = with lib; {
+    description = "Ed25519 public-key signatures (BLAKE2b fork)";
+    homepage = "https://github.com/Matoking/python-ed25519-blake2b";
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny stargate01 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ed25519/default.nix b/nixpkgs/pkgs/development/python-modules/ed25519/default.nix
new file mode 100644
index 000000000000..47692075d3bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ed25519/default.nix
@@ -0,0 +1,18 @@
+{ lib, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "ed25519";
+  version = "1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0n1k83ww0pr4q6z0h7p8hvy21hcgb96jvgllfbwhvvyf37h3w182";
+  };
+
+  meta = with lib; {
+    description = "Ed25519 public-key signatures";
+    homepage = "https://github.com/warner/python-ed25519";
+    license = licenses.mit;
+    maintainers = with maintainers; [ np ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/edalize/default.nix b/nixpkgs/pkgs/development/python-modules/edalize/default.nix
new file mode 100644
index 000000000000..0005a4cb2e63
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/edalize/default.nix
@@ -0,0 +1,104 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, coreutils
+, jinja2
+, pandas
+, pyparsing
+, pytestCheckHook
+, pythonOlder
+, which
+, yosys
+}:
+
+buildPythonPackage rec {
+  pname = "edalize";
+  version = "0.5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "olofk";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-foq1CwIe86d+s7PlhLlGpnJCwrpOyr+uf5/RMLASSJU=";
+  };
+
+  postPatch = ''
+    substituteInPlace tests/test_edam.py \
+      --replace /usr/bin/touch ${coreutils}/bin/touch
+    patchShebangs tests/mock_commands/vsim
+  '';
+
+  propagatedBuildInputs = [
+    jinja2
+  ];
+
+  passthru.optional-dependencies = {
+    reporting = [
+      pandas
+      pyparsing
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    which
+    yosys
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "edalize"
+  ];
+
+  disabledTests = [
+    # disable failures related to pandas 2.1.0 apply(...,errors="ignore")
+    # behavior change. upstream pins pandas to 2.0.3 as of 2023-10-10
+    # https://github.com/olofk/edalize/commit/2a3db6658752f97c61048664b478ebfe65a909f8
+    "test_picorv32_artix7_summary"
+    "test_picorv32_artix7_resources"
+    "test_picorv32_artix7_timing"
+    "test_picorv32_kusp_summary"
+    "test_picorv32_kusp_resources"
+    "test_picorv32_kusp_timing"
+    "test_linux_on_litex_vexriscv_arty_a7_summary"
+    "test_linux_on_litex_vexriscv_arty_a7_resources"
+    "test_linux_on_litex_vexriscv_arty_a7_timing"
+  ];
+
+  disabledTestPaths = [
+    "tests/test_questa_formal.py"
+    "tests/test_slang.py"
+    "tests/test_apicula.py"
+    "tests/test_ascentlint.py"
+    "tests/test_diamond.py"
+    "tests/test_gatemate.py"
+    "tests/test_ghdl.py"
+    "tests/test_icarus.py"
+    "tests/test_icestorm.py"
+    "tests/test_ise.py"
+    "tests/test_mistral.py"
+    "tests/test_openlane.py"
+    "tests/test_oxide.py"
+    "tests/test_quartus.py"
+    "tests/test_radiant.py"
+    "tests/test_spyglass.py"
+    "tests/test_symbiyosys.py"
+    "tests/test_trellis.py"
+    "tests/test_vcs.py"
+    "tests/test_veribleformat.py"
+    "tests/test_veriblelint.py"
+    "tests/test_vivado.py"
+    "tests/test_xcelium.py"
+    "tests/test_xsim.py"
+  ];
+
+  meta = with lib; {
+    description = "Abstraction library for interfacing EDA tools";
+    homepage = "https://github.com/olofk/edalize";
+    changelog = "https://github.com/olofk/edalize/releases/tag/v${version}";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ astro ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/editables/default.nix b/nixpkgs/pkgs/development/python-modules/editables/default.nix
new file mode 100644
index 000000000000..f3db3a96d26f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/editables/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "editables";
+  version = "0.5";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MJYn2bXErcDmaNjG+nusG6fIxdQVwtJ/YPCB+OgNHeI=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Tests not included in archive.
+  doCheck = false;
+
+  pythonImportsCheck = [ "editables" ];
+
+  meta = with lib; {
+    description = "Editable installations";
+    maintainers = with maintainers; [ ];
+    homepage = "https://github.com/pfmoore/editables";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/editdistance-s/default.nix b/nixpkgs/pkgs/development/python-modules/editdistance-s/default.nix
new file mode 100644
index 000000000000..6dd37739302f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/editdistance-s/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, cffi
+}:
+
+buildPythonPackage rec {
+  pname = "editdistance-s";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "asottile";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0w2qd5b6a3c3ahd0xy9ykq4wzqk0byqwdqrr26dyn8j2425j46lg";
+  };
+
+  propagatedNativeBuildInputs = [ cffi ];
+
+  propagatedBuildInputs = [ cffi ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "editdistance_s" ];
+
+  meta = with lib; {
+    description = "Fast implementation of the edit distance (Levenshtein distance)";
+    homepage = "https://github.com/asottile/editdistance-s";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ austinbutler ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/editdistance/default.nix b/nixpkgs/pkgs/development/python-modules/editdistance/default.nix
new file mode 100644
index 000000000000..822eacc0843f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/editdistance/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, cython
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "editdistance";
+  version = "0.6.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "roy-ht";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-42PEK2KhR7rZLfNX9T45V6on+5CoINfKvntz/YQBJco=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  preBuild = ''
+    cythonize --inplace editdistance/bycython.pyx
+  '';
+
+  nativeCheckInputs = [
+   pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "editdistance"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of the edit distance (Levenshtein distance)";
+    homepage = "https://github.com/roy-ht/editdistance";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/editorconfig/default.nix b/nixpkgs/pkgs/development/python-modules/editorconfig/default.nix
new file mode 100644
index 000000000000..4796ab99623a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/editorconfig/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cmake
+}:
+
+let
+  tests = fetchFromGitHub {
+    owner = "editorconfig";
+    repo = "editorconfig-core-test";
+    rev = "e407c1592df0f8e91664835324dea85146f20189";
+    hash = "sha256-9WSEkMJOewPqJjB6f7J6Ir0L+U712hkaN+GszjnGw7c=";
+  };
+in
+buildPythonPackage rec {
+  pname = "editorconfig";
+  version = "0.12.3";
+
+  src = fetchFromGitHub {
+    owner = "editorconfig";
+    repo = "editorconfig-core-py";
+    rev = "v${version}";
+    hash = "sha256-ZwoTMgk18+BpPNtXKQUMXGcl2Lp+1RQVyPHgk6gHWh8=";
+    # workaround until https://github.com/editorconfig/editorconfig-core-py/pull/40 is merged
+    # fetchSubmodules = true;
+  };
+
+  postUnpack = ''
+    cp -r ${tests}/* source/tests
+    chmod +w -R source/tests
+  '';
+
+  nativeCheckInputs = [
+    cmake
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  checkPhase = ''
+    cmake .
+    # utf_8_char fails with Python 3
+    ctest -E "utf_8_char" .
+  '';
+
+  pythonImportsCheck = [ "editorconfig" ];
+
+  meta = with lib; {
+    description = "EditorConfig File Locator and Interpreter for Python";
+    homepage = "https://github.com/editorconfig/editorconfig-core-py";
+    license = licenses.psfl;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/edk2-pytool-library/default.nix b/nixpkgs/pkgs/development/python-modules/edk2-pytool-library/default.nix
new file mode 100644
index 000000000000..39ad36b70439
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/edk2-pytool-library/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, pythonRelaxDepsHook
+, pyasn1
+, pyasn1-modules
+, cryptography
+, joblib
+, gitpython
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "edk2-pytool-library";
+  version = "0.19.6";
+  pyproject = true;
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "tianocore";
+    repo = "edk2-pytool-library";
+    rev = "v${version}";
+    hash = "sha256-T4DVidz4Xu4M+G7CzrUxRQPotg8ciwCQfa95e0IgpkM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    "tinydb"
+    "joblib"
+  ];
+
+  propagatedBuildInputs = [
+    pyasn1
+    pyasn1-modules
+    cryptography
+    joblib
+    gitpython
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # requires network access
+    "test_basic_parse"
+  ];
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  pythonImportsCheck = [ "edk2toollib" ];
+
+  meta = with lib; {
+    description = "Python library package that supports UEFI development";
+    homepage = "https://github.com/tianocore/edk2-pytool-library";
+    changelog = "https://github.com/tianocore/edk2-pytool-library/releases/tag/v${version}";
+    license = licenses.bsd2Patent;
+    maintainers = with maintainers; [ nickcao ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/edlib/default.nix b/nixpkgs/pkgs/development/python-modules/edlib/default.nix
new file mode 100644
index 000000000000..357db8d2b8e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/edlib/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, edlib
+, cython
+, python
+}:
+
+buildPythonPackage {
+  inherit (edlib) pname src meta;
+  version = "1.3.9";
+
+  disabled = pythonOlder "3.6";
+
+  sourceRoot = "${edlib.src.name}/bindings/python";
+
+  preBuild = ''
+    ln -s ${edlib.src}/edlib .
+  '';
+
+  EDLIB_OMIT_README_RST = 1;
+  EDLIB_USE_CYTHON = 1;
+
+  nativeBuildInputs = [ cython ];
+  buildInputs = [ edlib ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} test.py
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "edlib" ];
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/edward/default.nix b/nixpkgs/pkgs/development/python-modules/edward/default.nix
new file mode 100644
index 000000000000..05171c22d18e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/edward/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27, pythonAtLeast
+, keras, numpy, scipy, six, tensorflow }:
+
+buildPythonPackage rec {
+  pname = "edward";
+  version = "1.3.5";
+
+  disabled = !(isPy27 || pythonAtLeast "3.4");
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3818b39e77c26fc1a37767a74fdd5e7d02877d75ed901ead2f40bd03baaa109f";
+  };
+
+  # disabled for now due to Tensorflow trying to create files in $HOME:
+  doCheck = false;
+
+  propagatedBuildInputs = [ keras numpy scipy six tensorflow ];
+
+  meta = with lib; {
+    description = "Probabilistic programming language using Tensorflow";
+    homepage = "https://github.com/blei-lab/edward";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/effdet/default.nix b/nixpkgs/pkgs/development/python-modules/effdet/default.nix
new file mode 100644
index 000000000000..e6a7945ae0be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/effdet/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+# build inputs
+, torch
+, torchvision
+, timm
+, pycocotools
+, omegaconf
+}:
+let
+  pname = "effdet";
+  version = "0.4.1";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rFWJ/TBKVlDCAZhrLvX44QwREJOnGxxJ+muIF3EIErU=";
+  };
+
+  propagatedBuildInputs = [
+    torch
+    torchvision
+    timm
+    pycocotools
+    omegaconf
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "effdet" ];
+
+  meta = {
+    description = "A PyTorch implementation of EfficientDet";
+    homepage = "https://pypi.org/project/effdet";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/effect/default.nix b/nixpkgs/pkgs/development/python-modules/effect/default.nix
new file mode 100644
index 000000000000..b9c49e30a560
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/effect/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, six
+, testtools
+}:
+
+buildPythonPackage rec {
+  pname = "effect";
+  version = "1.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ev+2A3B8ZIsHsReB67eTpLmu6KzxrFdkw+0hEq3wyeo=";
+  };
+
+  postPatch = ''
+    substituteInPlace effect/test_do.py \
+      --replace "py.test" "pytest"
+  '';
+
+  propagatedBuildInputs = [
+    attrs
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  checkInputs = [
+    testtools
+  ];
+
+  pythonImportsCheck = [
+    "effect"
+  ];
+
+  meta = with lib; {
+    description = "Pure effects for Python";
+    homepage = "https://effect.readthedocs.io/";
+    changelog = "https://github.com/python-effect/effect/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/eggdeps/default.nix b/nixpkgs/pkgs/development/python-modules/eggdeps/default.nix
new file mode 100644
index 000000000000..9f17306b7bdc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eggdeps/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zope_interface
+, zope_testing
+}:
+
+buildPythonPackage rec {
+  pname = "tl-eggdeps";
+  version = "1.0";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "tl.eggdeps";
+    sha256 = "a094ed7961a3dd38fcaaa69cf7a58670038acdff186360166d9e3d964b7a7323";
+  };
+
+  propagatedBuildInputs = [ zope_interface zope_testing ];
+
+  # tests fail, see https://hydra.nixos.org/build/4316603/log/raw
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A tool which computes a dependency graph between active Python eggs";
+    homepage = "http://thomas-lotze.de/en/software/eggdeps/";
+    license = licenses.zpl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/eigenpy/default.nix b/nixpkgs/pkgs/development/python-modules/eigenpy/default.nix
new file mode 100644
index 000000000000..ad2e3116bfc4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eigenpy/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, boost
+, eigen
+, numpy
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "eigenpy";
+  version = "3.1.4";
+
+  src = fetchFromGitHub {
+    owner = "stack-of-tasks";
+    repo = finalAttrs.pname;
+    rev = "v${finalAttrs.version}";
+    fetchSubmodules = true;
+    hash = "sha256-+1qjyWRE6a9KOopZln/7DyTTAQchAUoqd9HT83+zVuI=";
+  };
+
+  strictDeps = true;
+
+  nativeBuildInputs = [
+    cmake
+  ];
+
+  buildInputs = [
+    boost
+  ];
+
+  propagatedBuildInputs = [
+    eigen
+    numpy
+  ];
+
+  doCheck = true;
+  pythonImportsCheck = [
+    "eigenpy"
+  ];
+
+  meta = with lib; {
+    description = "Bindings between Numpy and Eigen using Boost.Python";
+    homepage = "https://github.com/stack-of-tasks/eigenpy";
+    changelog = "https://github.com/stack-of-tasks/eigenpy/releases/tag/v${version}";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ nim65s wegank ];
+    platforms = platforms.unix;
+  };
+})
diff --git a/nixpkgs/pkgs/development/python-modules/einops/default.nix b/nixpkgs/pkgs/development/python-modules/einops/default.nix
new file mode 100644
index 000000000000..9cc5de24e0a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/einops/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, chainer
+, fetchFromGitHub
+, hatchling
+, jupyter
+, nbconvert
+, numpy
+, parameterized
+, pillow
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "einops";
+  version = "0.7.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "arogozhnikov";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-wCs3rMnYCk07kJ3iPItxwCQATflKBYHk6tfBCjiF+bc=";
+  };
+
+  nativeBuildInputs = [ hatchling ];
+
+  nativeCheckInputs = [
+    chainer
+    jupyter
+    nbconvert
+    numpy
+    parameterized
+    pillow
+    pytestCheckHook
+  ];
+
+  env.EINOPS_TEST_BACKENDS = "numpy,chainer";
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  pythonImportsCheck = [
+    "einops"
+  ];
+
+  disabledTests = [
+    # Tests are failing as mxnet is not pulled-in
+    # https://github.com/NixOS/nixpkgs/issues/174872
+    "test_all_notebooks"
+    "test_dl_notebook_with_all_backends"
+    "test_backends_installed"
+  ];
+
+  disabledTestPaths = [
+    "tests/test_layers.py"
+  ];
+
+  meta = with lib; {
+    description = "Flexible and powerful tensor operations for readable and reliable code";
+    homepage = "https://github.com/arogozhnikov/einops";
+    license = licenses.mit;
+    maintainers = with maintainers; [ yl3dy ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/eiswarnung/default.nix b/nixpkgs/pkgs/development/python-modules/eiswarnung/default.nix
new file mode 100644
index 000000000000..ccd2b849570c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eiswarnung/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, pytz
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "eiswarnung";
+  version = "1.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "klaasnicolaas";
+    repo = "python-eiswarnung";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-PVFAy34+UfNQNdzVdfvNiySrCTaKGuepnTINZYkOsuo=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"0.0.0"' '"${version}"' \
+      --replace 'addopts = "--cov"' "" \
+      --replace 'pytz = "^2022.7.1"' 'pytz = "*"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pytz
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "eiswarnung"
+  ];
+
+  meta = with lib; {
+    description = "Module for getting Eiswarning API forecasts";
+    homepage = "https://github.com/klaasnicolaas/python-eiswarnung";
+    changelog = "https://github.com/klaasnicolaas/python-eiswarnung/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/elastic-apm/default.nix b/nixpkgs/pkgs/development/python-modules/elastic-apm/default.nix
new file mode 100644
index 000000000000..e00e188492fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/elastic-apm/default.nix
@@ -0,0 +1,98 @@
+{ lib
+, stdenv
+, aiohttp
+, blinker
+, buildPythonPackage
+, certifi
+, ecs-logging
+, fetchFromGitHub
+, httpx
+, jinja2
+, jsonschema
+, logbook
+, mock
+, pytest-asyncio
+, pytest-bdd
+, pytest-localserver
+, pytest-mock
+, pytest-random-order
+, pytestCheckHook
+, pythonOlder
+, sanic
+, sanic-testing
+, starlette
+, structlog
+, tornado
+, urllib3
+, webob
+, wrapt
+}:
+
+buildPythonPackage rec {
+  pname = "elastic-apm";
+  version = "6.19.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "elastic";
+    repo = "apm-agent-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-XwAKydZuvNMOIT4GkfID8YW019OfatRekXmGrssZfMw=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    blinker
+    certifi
+    sanic
+    starlette
+    tornado
+    urllib3
+    wrapt
+  ];
+
+  nativeCheckInputs = [
+    ecs-logging
+    httpx
+    jinja2
+    jsonschema
+    logbook
+    mock
+    pytest-asyncio
+    pytest-bdd
+    pytest-localserver
+    pytest-mock
+    pytest-random-order
+    pytestCheckHook
+    sanic-testing
+    structlog
+    webob
+  ];
+
+  disabledTests = [
+    "elasticapm_client"
+  ];
+
+  disabledTestPaths = [
+    # Exclude tornado tests
+    "tests/contrib/asyncio/tornado/tornado_tests.py"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # Flaky tests on Darwin
+    "tests/utils/threading_tests.py"
+  ];
+
+  pythonImportsCheck = [
+    "elasticapm"
+  ];
+
+  meta = with lib; {
+    description = "Python agent for the Elastic APM";
+    homepage = "https://github.com/elastic/apm-agent-python";
+    changelog = "https://github.com/elastic/apm-agent-python/releases/tag/v${version}";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+    mainProgram = "elasticapm-run";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/elastic-transport/default.nix b/nixpkgs/pkgs/development/python-modules/elastic-transport/default.nix
new file mode 100644
index 000000000000..f8645e795629
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/elastic-transport/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, certifi
+, fetchFromGitHub
+, mock
+, pytest-asyncio
+, pytest-httpserver
+, pytestCheckHook
+, pythonOlder
+, requests
+, trustme
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "elastic-transport";
+  version = "8.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "elastic";
+    repo = "elastic-transport-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-4W9p9niHf2EMY+sS1RCdqWndzvpz8pKrIlLo3NxJ8mk=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --cov-report=term-missing --cov=elastic_transport" ""
+  '';
+
+  propagatedBuildInputs = [
+    urllib3
+    certifi
+  ];
+
+  nativeCheckInputs = [
+    aiohttp
+    mock
+    pytest-asyncio
+    pytest-httpserver
+    pytestCheckHook
+    requests
+    trustme
+  ];
+
+  pythonImportsCheck = [
+    "elastic_transport"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "fingerprint"
+    "ssl"
+    "test_custom_headers"
+    "test_custom_user_agent"
+    "test_default_headers"
+    "test_head"
+    "tls"
+    "test_simple_request"
+    "test_node"
+    "test_debug_logging"
+    "test_debug_logging_uncompressed_body"
+    "test_debug_logging_no_body"
+    "test_httpbin"
+    "test_sniffed_nodes_added_to_pool"
+  ];
+
+  meta = with lib; {
+    description = "Transport classes and utilities shared among Python Elastic client libraries";
+    homepage = "https://github.com/elasticsearch/elastic-transport-python";
+    changelog = "https://github.com/elastic/elastic-transport-python/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/elasticsearch-dsl/default.nix b/nixpkgs/pkgs/development/python-modules/elasticsearch-dsl/default.nix
new file mode 100644
index 000000000000..e5bdc6571cc9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/elasticsearch-dsl/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, elasticsearch
+, python-dateutil
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "elasticsearch-dsl";
+  version = "8.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-ZkEK34gfArigMuilsqPuCT/e7eS4FPvwTA9s4EmbdHI=";
+  };
+
+  propagatedBuildInputs = [ elasticsearch python-dateutil six ];
+
+  # ImportError: No module named test_elasticsearch_dsl
+  # Tests require a local instance of elasticsearch
+  doCheck = false;
+
+  meta = with lib; {
+    description = "High level Python client for Elasticsearch";
+    longDescription = ''
+      Elasticsearch DSL is a high-level library whose aim is to help with
+      writing and running queries against Elasticsearch. It is built on top of
+      the official low-level client (elasticsearch-py).
+    '';
+    homepage = "https://github.com/elasticsearch/elasticsearch-dsl-py";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ desiderius ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/elasticsearch/default.nix b/nixpkgs/pkgs/development/python-modules/elasticsearch/default.nix
new file mode 100644
index 000000000000..a07ba8c6d188
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/elasticsearch/default.nix
@@ -0,0 +1,30 @@
+{ buildPythonPackage
+, fetchPypi
+, urllib3, requests
+, nosexcover, mock
+, lib
+}:
+
+buildPythonPackage (rec {
+  pname = "elasticsearch";
+  version = "8.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-0zZ/wBPgT8eq00mm3p+tHuBPttYnsOeJaqUFwS/eXgQ=";
+  };
+
+  # Check is disabled because running them destroy the content of the local cluster!
+  # https://github.com/elasticsearch/elasticsearch-py/tree/master/test_elasticsearch
+  doCheck = false;
+  propagatedBuildInputs = [ urllib3 requests ];
+  buildInputs = [ nosexcover mock ];
+
+  meta = with lib; {
+    description = "Official low-level client for Elasticsearch";
+    homepage = "https://github.com/elasticsearch/elasticsearch-py";
+    changelog = "https://github.com/elastic/elasticsearch-py/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ desiderius ];
+  };
+})
diff --git a/nixpkgs/pkgs/development/python-modules/elasticsearch8/default.nix b/nixpkgs/pkgs/development/python-modules/elasticsearch8/default.nix
new file mode 100644
index 000000000000..b3c06adb539e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/elasticsearch8/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, elastic-transport
+, fetchPypi
+, pythonOlder
+, requests
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "elasticsearch8";
+  version = "8.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+y9U5fscYLAfP6IhLxzUUOENaNC4i8NAPEFtVP5+HG4=";
+  };
+
+  nativeBuildInputs = [
+    elastic-transport
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  passthru.optional-dependencies = {
+    async = [
+      aiohttp
+    ];
+  };
+
+  # Check is disabled because running them destroy the content of the local cluster!
+  # https://github.com/elasticsearch/elasticsearch-py/tree/main/test_elasticsearch
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "elasticsearch8"
+  ];
+
+  meta = with lib; {
+    description = "Official low-level client for Elasticsearch";
+    homepage = "https://github.com/elasticsearch/elasticsearch-py";
+    changelog = "https://github.com/elastic/elasticsearch-py/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/elegy/default.nix b/nixpkgs/pkgs/development/python-modules/elegy/default.nix
new file mode 100644
index 000000000000..14b87970537c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/elegy/default.nix
@@ -0,0 +1,105 @@
+{ lib
+, buildPythonPackage
+, cloudpickle
+, deepdish
+, deepmerge
+, dm-haiku
+, fetchFromGitHub
+, fetchpatch
+, jaxlib
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, sh
+, tables
+, tabulate
+, tensorboardx
+, tensorflow
+, toolz
+, torch
+, treex
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "elegy";
+  version = "0.8.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "poets-ai";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-FZmLriYhsX+zyQKCtCjbOy6MH+AvjzHRNUyaDSXGlLI=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "use-poetry-core.patch";
+      url = "https://github.com/poets-ai/elegy/commit/0ed472882f470ed9eb7a63b8a537ffabe7e19aa7.patch";
+      hash = "sha256-nO/imHo7tEsiZh+64CF/M4eXQ1so3IunVhv8CvYP1ks=";
+    })
+  ];
+
+  # The cloudpickle constraint is too strict. wandb is marked as an optional
+  # dependency but `buildPythonPackage` doesn't seem to respect that setting.
+  # Python constraint: https://github.com/poets-ai/elegy/issues/244
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'python = ">=3.7,<3.10"' 'python = ">=3.7"' \
+      --replace 'cloudpickle = "^1.5.0"' 'cloudpickle = "*"' \
+      --replace 'wandb = { version = "^0.12.10", optional = true }' ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  buildInputs = [
+    jaxlib
+  ];
+
+  propagatedBuildInputs = [
+    cloudpickle
+    deepdish
+    deepmerge
+    dm-haiku
+    pyyaml
+    tables
+    tabulate
+    tensorboardx
+    toolz
+    treex
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [
+    "elegy"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    sh
+    tensorflow
+    torch
+  ];
+
+  disabledTests = [
+    # Fails with `Could not find compiler for platform Host: NOT_FOUND: could not find registered compiler for platform Host -- check target linkage`.
+    # Runs fine in docker with Ubuntu 22.04. I suspect the issue is the sandboxing in `nixpkgs` but not sure.
+    "test_saved_model_poly"
+    # AttributeError: module 'jax' has no attribute 'tree_multimap'
+    "DataLoaderTestCase"
+  ];
+
+  meta = with lib; {
+    description = "Neural Networks framework based on Jax inspired by Keras and Haiku";
+    homepage = "https://github.com/poets-ai/elegy";
+    changelog = "https://github.com/poets-ai/elegy/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ndl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/elementpath/default.nix b/nixpkgs/pkgs/development/python-modules/elementpath/default.nix
new file mode 100644
index 000000000000..b9efe304226f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/elementpath/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "elementpath";
+  version = "4.1.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sissaschool";
+    repo = "elementpath";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-5K2xcnTo3/A6/pCxQn5qZqni7C64p/yNAWWJlhQeKe4=";
+  };
+
+  # avoid circular dependency with xmlschema which directly depends on this
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "elementpath"
+  ];
+
+  meta = with lib; {
+    description = "XPath 1.0/2.0 parsers and selectors for ElementTree and lxml";
+    homepage = "https://github.com/sissaschool/elementpath";
+    changelog = "https://github.com/sissaschool/elementpath/blob/v${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/elevate/default.nix b/nixpkgs/pkgs/development/python-modules/elevate/default.nix
new file mode 100644
index 000000000000..cfb1dbf068dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/elevate/default.nix
@@ -0,0 +1,35 @@
+{ lib, fetchPypi, buildPythonPackage, fetchpatch, setuptools-scm }:
+
+buildPythonPackage rec {
+  pname = "elevate";
+  version = "0.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "53ad19fa1de301fb1de3f8768fb3a5894215716fd96a475690c4d0ff3b1de209";
+  };
+
+  patches = [
+    (fetchpatch {
+    # This is for not calling shell wrappers through Python, which fails.
+    url = "https://github.com/rkitover/elevate/commit/148b2bf698203ea39c9fe5d635ecd03cd94051af.patch";
+    sha256 = "1ky3z1jxl1g28wbwbx8qq8jgx8sa8pr8s3fdcpdhdx1blw28cv61";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  # No tests included
+  doCheck = false;
+
+  pythonImportsCheck = [ "elevate" ];
+
+  meta = with lib; {
+    description = "Python module for re-launching the current process as super-user";
+    homepage = "https://github.com/barneygale/elevate";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rkitover ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/elgato/default.nix b/nixpkgs/pkgs/development/python-modules/elgato/default.nix
new file mode 100644
index 000000000000..3aeab819b76a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/elgato/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pydantic
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "elgato";
+  version = "5.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-elgato";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-TI5wu2FYVUMvgDkbktcwPLnTSD8XUSy8qwOCdrsiopk=";
+  };
+
+  postPatch = ''
+    # Upstream doesn't set a version for the pyproject.toml
+    substituteInPlace pyproject.toml \
+      --replace "0.0.0" "${version}" \
+      --replace "--cov" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pydantic
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "elgato"
+  ];
+
+  meta = with lib; {
+    description = "Python client for Elgato Key Lights";
+    homepage = "https://github.com/frenck/python-elgato";
+    changelog = "https://github.com/frenck/python-elgato/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/eliot/default.nix b/nixpkgs/pkgs/development/python-modules/eliot/default.nix
new file mode 100644
index 000000000000..1ddae0409fbb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eliot/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, aiocontextvars
+, boltons
+, hypothesis
+, pyrsistent
+, pytestCheckHook
+, setuptools
+, six
+, testtools
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "eliot";
+  version = "1.14.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wvCZo+jV7PwidFdm58xmSkjbZLa4nZht/ycEkdhoMUk=";
+  };
+
+  propagatedBuildInputs = [
+    aiocontextvars
+    boltons
+    pyrsistent
+    setuptools
+    six
+    zope_interface
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+    testtools
+  ];
+
+  pythonImportsCheck = [
+    "eliot"
+  ];
+
+  # Tests run eliot-prettyprint in out/bin.
+  preCheck = ''
+    export PATH=$out/bin:$PATH
+  '';
+
+  disabledTests = [
+    "test_parse_stream"
+    # AttributeError: module 'inspect' has no attribute 'getargspec'
+    "test_default"
+  ];
+
+  meta = with lib; {
+    homepage = "https://eliot.readthedocs.io";
+    description = "Logging library that tells you why it happened";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dpausp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/eliqonline/default.nix b/nixpkgs/pkgs/development/python-modules/eliqonline/default.nix
new file mode 100644
index 000000000000..b972d6addd25
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eliqonline/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, docopt
+, fetchPypi
+, pythonOlder
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "eliqonline";
+  version = "1.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "hOUN4cA4pKVioIrfJM02GOnZdDRc7xbNtvHfoD3//bM=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    docopt
+    pyyaml
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "eliqonline"
+  ];
+
+  meta = with lib; {
+    description = "Python client to the Eliq Online API";
+    homepage = "https://github.com/molobrakos/eliqonline";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/elkm1-lib/default.nix b/nixpkgs/pkgs/development/python-modules/elkm1-lib/default.nix
new file mode 100644
index 000000000000..f64cbda4885b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/elkm1-lib/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pyserial-asyncio
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "elkm1-lib";
+  version = "2.2.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "gwww";
+    repo = "elkm1";
+    rev = "refs/tags/${version}";
+    hash = "sha256-5Jmn/ywyg6fmp0ZxPf79ET+JWPF4VjDJMwj/qU6ckS0=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    async-timeout
+    pyserial-asyncio
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "elkm1_lib"
+  ];
+
+  meta = with lib; {
+    description = "Python module for interacting with ElkM1 alarm/automation panel";
+    homepage = "https://github.com/gwww/elkm1";
+    changelog = "https://github.com/gwww/elkm1/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/elmax-api/default.nix b/nixpkgs/pkgs/development/python-modules/elmax-api/default.nix
new file mode 100644
index 000000000000..b3e94cca5f02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/elmax-api/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, pyjwt
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "elmax-api";
+  version = "0.0.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "albertogeniola";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-57pmmH7f893H71CMhdnahvbN/5F2yfrVZ6MFpYQ4+mQ=";
+  };
+
+  propagatedBuildInputs = [
+    httpx
+    pyjwt
+    yarl
+  ];
+
+  # Test require network access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "elmax_api"
+  ];
+
+  meta = with lib; {
+    description = "Python library for interacting with the Elmax cloud";
+    homepage = "https://github.com/albertogeniola/elmax-api";
+    changelog = "https://github.com/albertogeniola/elmax-api/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/elmax/default.nix b/nixpkgs/pkgs/development/python-modules/elmax/default.nix
new file mode 100644
index 000000000000..6391e86a5670
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/elmax/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, poetry-core
+, pythonOlder
+, pytest-asyncio
+, pytest-httpx
+, pytestCheckHook
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "elmax";
+  version = "0.1.5";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-ecosystem";
+    repo = "python-elmax";
+    rev = version;
+    hash = "sha256-EcYEpYv+EwwEfW8Sy7aQjFAPpmsA6qVbmlwrPdxdnEw=";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [
+    httpx
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-httpx
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "elmax" ];
+
+  meta = with lib; {
+    description = "Python API client for the Elmax Cloud services";
+    homepage = "https://github.com/home-assistant-ecosystem/python-elmax";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/email-validator/default.nix b/nixpkgs/pkgs/development/python-modules/email-validator/default.nix
new file mode 100644
index 000000000000..99ae071f4ae3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/email-validator/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, dnspython
+, fetchFromGitHub
+, idna
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "email-validator";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "JoshData";
+    repo = "python-${pname}";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-o7UREa+IBiFjmqx0p+4XJCcoHQ/R6r2RtoezEcWvgbg=";
+  };
+
+  propagatedBuildInputs = [
+    dnspython
+    idna
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # dns.resolver.NoResolverConfiguration: cannot open /etc/resolv.conf
+    "tests/test_deliverability.py"
+    "tests/test_main.py"
+  ];
+
+  pythonImportsCheck = [
+    "email_validator"
+  ];
+
+  meta = with lib; {
+    description = "Email syntax and deliverability validation library";
+    homepage = "https://github.com/JoshData/python-email-validator";
+    changelog = "https://github.com/JoshData/python-email-validator/releases/tag/v${version}";
+    license = licenses.cc0;
+    maintainers = with maintainers; [ siddharthist ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/emailthreads/default.nix b/nixpkgs/pkgs/development/python-modules/emailthreads/default.nix
new file mode 100644
index 000000000000..0f13e877e596
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/emailthreads/default.nix
@@ -0,0 +1,27 @@
+{ lib, fetchFromGitHub, buildPythonPackage
+, python, isPy3k, unittestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "emailthreads";
+  version = "0.1.3";
+  disabled = !isPy3k;
+
+  # pypi is missing files for tests
+  src = fetchFromGitHub {
+    owner = "emersion";
+    repo = "python-emailthreads";
+    rev = "v${version}";
+    hash = "sha256-7BhYS1DQCW9QpG31asPCq5qPyJy+WW2onZpvEHhwQCs=";
+  };
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  PKGVER = version;
+
+  meta = with lib; {
+    homepage = "https://github.com/emersion/python-emailthreads";
+    description = "Python library to parse and format email threads";
+    license = licenses.mit;
+    maintainers = with maintainers; [ eadwu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/embedding-reader/default.nix b/nixpkgs/pkgs/development/python-modules/embedding-reader/default.nix
new file mode 100644
index 000000000000..59015f3fa4ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/embedding-reader/default.nix
@@ -0,0 +1,39 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, fsspec
+, lib
+, numpy
+, pandas
+, pyarrow
+, pytestCheckHook
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "embedding-reader";
+  version = "1.5.1";
+
+  src = fetchFromGitHub {
+    owner = "rom1504";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-isb7i+RfZvbtQWySiPatuvOTxNXyPhLhoZTQMZjdC24=";
+  };
+
+  nativeBuildInputs = [ pythonRelaxDepsHook ];
+
+  pythonRelaxDeps = [ "pyarrow" ];
+
+  propagatedBuildInputs = [ fsspec numpy pandas pyarrow ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "embedding_reader" ];
+
+  meta = with lib; {
+    description = "Efficiently read embedding in streaming from any filesystem";
+    homepage = "https://github.com/rom1504/embedding-reader";
+    license = licenses.mit;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/emborg/default.nix b/nixpkgs/pkgs/development/python-modules/emborg/default.nix
new file mode 100644
index 000000000000..b4b0b9b2106a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/emborg/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, flit-core
+, pytestCheckHook
+, pythonOlder
+, borgbackup
+, appdirs
+, arrow
+, docopt
+, inform
+, nestedtext
+, parametrize-from-file
+, quantiphy
+, requests
+, shlib
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "emborg";
+  version = "1.37";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "KenKundert";
+    repo = "emborg";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-bHYs+vlNku/T5Hb9u77Xml9/FNj5vgqPeXSzcilsS+I=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    appdirs
+    arrow
+    docopt
+    inform
+    quantiphy
+    requests
+  ];
+
+  nativeCheckInputs = [
+    nestedtext
+    parametrize-from-file
+    pytestCheckHook
+    shlib
+    voluptuous
+    borgbackup
+  ];
+
+  # this disables testing fuse mounts
+  MISSING_DEPENDENCIES = "fuse";
+
+  postPatch = ''
+    patchShebangs .
+  '';
+
+  # this patch fixes a whitespace issue in the message that a test is expecting, https://github.com/KenKundert/emborg/pull/67
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/KenKundert/emborg/commit/afac6d1ddcecdb4bddbec87b6c8eed4cfbf4ebf9.diff";
+      sha256 = "3xg2z03FLKH4ckmiBZqE1FDjpgjgdO8OZL1ewrJlQ4o=";
+    })
+  ];
+
+  pythonImportsCheck = [
+    "emborg"
+  ];
+
+  meta = with lib; {
+    description = "Interactive command line interface to Borg Backup";
+    homepage = "https://github.com/KenKundert/emborg";
+    changelog = "https://github.com/KenKundert/emborg/releases/tag/v${version}";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ jpetrucciani ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/embrace/default.nix b/nixpkgs/pkgs/development/python-modules/embrace/default.nix
new file mode 100644
index 000000000000..3c51a01ca816
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/embrace/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromSourcehut
+, pytestCheckHook
+, pythonOlder
+, sqlparse
+, wrapt
+}:
+
+buildPythonPackage rec {
+  pname = "embrace";
+  version = "4.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromSourcehut {
+    vc = "hg";
+    owner = "~olly";
+    repo = "embrace-sql";
+    rev = "v${version}-release";
+    hash = "sha256-B/xW5EfaQWW603fjKYcf+RHQJVZrnFoqVnIl6xSwS0E=";
+  };
+
+  propagatedBuildInputs = [
+    sqlparse
+    wrapt
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "embrace"
+  ];
+
+  # Some test for hot-reload fails on Darwin, but the rest of the library
+  # should remain usable. (https://todo.sr.ht/~olly/embrace-sql/4)
+  doCheck = !stdenv.isDarwin;
+
+  meta = with lib; {
+    description = "Embrace SQL keeps your SQL queries in SQL files";
+    homepage = "https://pypi.org/project/embrace/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ pacien ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/emcee/default.nix b/nixpkgs/pkgs/development/python-modules/emcee/default.nix
new file mode 100644
index 000000000000..3dbf9c9b6546
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/emcee/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, pytestCheckHook
+, setuptools-scm
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "emcee";
+  version = "3.1.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dfm";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-K2cPSbR7jnl9Vzf2sEiPZqk2vTwgChNWAf6CAerhZCg=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "emcee"
+  ];
+
+  meta = with lib; {
+    description = "Kick ass affine-invariant ensemble MCMC sampling";
+    homepage = "https://emcee.readthedocs.io/";
+    changelog = "https://github.com/dfm/emcee/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/emoji/default.nix b/nixpkgs/pkgs/development/python-modules/emoji/default.nix
new file mode 100644
index 000000000000..3820b7a8eaf7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/emoji/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "emoji";
+  version = "2.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "carpedm20";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-fnVY4KwiqvSVYijlDckLq6qDrBJj/rJGMwaQ1mMygek=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_emojize_name_only"
+  ];
+
+  pythonImportsCheck = [
+    "emoji"
+  ];
+
+  meta = with lib; {
+    description = "Emoji for Python";
+    homepage = "https://github.com/carpedm20/emoji/";
+    changelog = "https://github.com/carpedm20/emoji/blob/v${version}/CHANGES.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ joachifm ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/empty-files/default.nix b/nixpkgs/pkgs/development/python-modules/empty-files/default.nix
new file mode 100644
index 000000000000..1028b3f567c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/empty-files/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "empty-files";
+  version = "0.0.9";
+
+  src = fetchFromGitHub {
+    owner = "approvals";
+    repo = "EmptyFiles.Python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-P/woyAN9cYdxryX1iM36C53c9dL6lo4eoTzBWT2cd3A=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # cyclic dependency with approvaltests
+  doCheck = false;
+
+  pythonImportsCheck = [ "empty_files" ];
+
+  meta = with lib; {
+    description = "Null Object pattern for files";
+    homepage = "https://github.com/approvals/EmptyFiles.Python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/empy/default.nix b/nixpkgs/pkgs/development/python-modules/empy/default.nix
new file mode 100644
index 000000000000..544506efb0d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/empy/default.nix
@@ -0,0 +1,17 @@
+{ lib, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "empy";
+  version = "3.3.4";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c6xJeFtgFHnfTqGKfHm8EwSop8NMArlHLPEgauiPAbM=";
+  };
+  pythonImportsCheck = [ "em" ];
+  meta = with lib; {
+    homepage = "http://www.alcyone.com/software/empy/";
+    description = "A templating system for Python.";
+    maintainers = with maintainers; [ nkalupahana ];
+    license = licenses.lgpl21Only;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/emulated-roku/default.nix b/nixpkgs/pkgs/development/python-modules/emulated-roku/default.nix
new file mode 100644
index 000000000000..3a9da2ba8e37
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/emulated-roku/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+}:
+
+buildPythonPackage rec {
+  pname = "emulated-roku";
+  version = "0.2.1";
+
+  src = fetchFromGitHub {
+    owner = "mindigmarton";
+    repo = "emulated_roku";
+    rev = version;
+    sha256 = "02cbg5wrph19p6x44jlw6cn3jli0kwbgfh6klb3c4k5jfrkhgghw";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "emulated_roku" ];
+
+  meta = with lib; {
+    description = "Library to emulate a roku server to serve as a proxy for remotes such as Harmony";
+    homepage = "https://github.com/mindigmarton/emulated_roku";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/emv/default.nix b/nixpkgs/pkgs/development/python-modules/emv/default.nix
new file mode 100644
index 000000000000..a06cb2b3f44a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/emv/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, click
+, pyscard
+, pycountry
+, terminaltables
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "emv";
+  version = "1.0.14";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.4";
+
+  src = fetchFromGitHub {
+    owner = "russss";
+    repo = "python-emv";
+    rev = "v${version}";
+    hash = "sha256-MnaeQZ0rA3i0CoUA6HgJQpwk5yo4rm9e+pc5XzRd1eg=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    pyscard
+    pycountry
+    terminaltables
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"enum-compat==0.0.3",' "" \
+      --replace '"argparse==1.4.0",' "" \
+      --replace "click==7.1.2" "click" \
+      --replace "pyscard==2.0.0" "pyscard" \
+      --replace "pycountry==20.7.3" "pycountry" \
+      --replace "terminaltables==3.1.0" "terminaltables"
+  '';
+
+  pythonImportsCheck = [
+    "emv"
+  ];
+
+  meta = with lib; {
+    description = "Implementation of the EMV chip-and-pin smartcard protocol";
+    homepage = "https://github.com/russss/python-emv";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lukegb ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/enaml/default.nix b/nixpkgs/pkgs/development/python-modules/enaml/default.nix
new file mode 100644
index 000000000000..fb192e100c5a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/enaml/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, atom
+, buildPythonPackage
+, bytecode
+, cppy
+, fetchFromGitHub
+, kiwisolver
+, pegen
+, ply
+, qtpy
+, setuptools
+, setuptools-scm
+, pythonOlder
+, sip
+}:
+
+buildPythonPackage rec {
+  pname = "enaml";
+  version = "0.17.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "nucleic";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-DYLDQ9QwdK/a8eY0bFX31UNgxm8FUOaeNAnisFcyFNI=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    atom
+    bytecode
+    cppy
+    kiwisolver
+    pegen
+    ply
+    qtpy
+    sip
+  ];
+
+  # qt bindings cannot be found during tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "enaml"
+    "enaml.applib"
+    "enaml.core"
+    "enaml.core.parser"
+    "enaml.layout"
+    # qt bindings cannot be found during checking
+    #"enaml.qt"
+    #"enaml.qt.docking"
+    "enaml.scintilla"
+    "enaml.stdlib"
+    "enaml.widgets"
+    "enaml.workbench"
+  ];
+
+  meta = with lib; {
+    description = "Declarative User Interfaces for Python";
+    homepage = "https://github.com/nucleic/enaml";
+    changelog = "https://github.com/nucleic/enaml/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ raboof ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/enamlx/default.nix b/nixpkgs/pkgs/development/python-modules/enamlx/default.nix
new file mode 100644
index 000000000000..82ddd9726dd0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/enamlx/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, enaml
+, pyqtgraph
+, pythonocc-core
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "enamlx";
+  version = "0.6.2";
+
+  src = fetchFromGitHub {
+    owner = "frmdstryr";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-LHqOZ1uLWFbUeQAGKoMH9GljhRq1K4RTVWzgV/pt3g8=";
+  };
+
+  propagatedBuildInputs = [
+    enaml
+    # Until https://github.com/inkcut/inkcut/issues/105 perhaps
+    pyqtgraph
+    pythonocc-core
+    typing-extensions
+  ];
+
+  # qt_occ_viewer test requires enaml.qt.QtOpenGL which got dropped somewhere
+  # between enaml 0.9.0 and 0.10.0
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "enamlx.core"
+    "enamlx.qt"
+    "enamlx.widgets"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/frmdstryr/enamlx";
+    description = "Additional Qt Widgets for Enaml";
+    license = licenses.mit;
+    maintainers = with maintainers; [ raboof ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/enamlx/replace-unicode-with-str.patch b/nixpkgs/pkgs/development/python-modules/enamlx/replace-unicode-with-str.patch
new file mode 100644
index 000000000000..52df6e9a50e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/enamlx/replace-unicode-with-str.patch
@@ -0,0 +1,274 @@
+From 16df11227b8cee724624541d274e481802ea67e3 Mon Sep 17 00:00:00 2001
+From: frmdstryr <frmdstryr@protonmail.com>
+Date: Tue, 3 Nov 2020 21:41:52 -0500
+Subject: [PATCH] Replace Unicode with Str
+
+---
+ enamlx/widgets/abstract_item.py      |  4 ++--
+ enamlx/widgets/console.py            |  4 ++--
+ enamlx/widgets/graphics_view.py      |  8 ++++----
+ enamlx/widgets/plot_area.py          | 14 +++++++-------
+ examples/occ_viewer/advanced.enaml   | 12 ++++++------
+ examples/occ_viewer/occ/part.py      |  6 +++---
+ examples/plot_area/plot_area.enaml   |  2 +-
+ examples/table_view/table_view.enaml |  6 +++---
+ examples/tree_view/tree_view.enaml   |  6 +++---
+ setup.py                             |  2 +-
+ 10 files changed, 32 insertions(+), 32 deletions(-)
+
+diff --git a/enamlx/widgets/abstract_item.py b/enamlx/widgets/abstract_item.py
+index 29a3d87..67a5c6e 100644
+--- a/enamlx/widgets/abstract_item.py
++++ b/enamlx/widgets/abstract_item.py
+@@ -6,7 +6,7 @@
+ Created on Aug 24, 2015
+ """
+ from atom.api import (
+-    Int, Enum, Bool, Unicode, Typed, 
++    Int, Enum, Bool, Str, Typed, 
+     Coerced, Event, Property, ForwardInstance, observe
+ )
+ from enaml.icon import Icon
+@@ -96,7 +96,7 @@ class AbstractWidgetItem(AbstractWidgetItemGroup):
+     column = d_(Int(), writable=False)
+     
+     #: Text to display within the cell
+-    text = d_(Unicode())
++    text = d_(Str())
+     
+     #: Text alignment within the cell
+     text_alignment = d_(Enum(*[(h, v)
+diff --git a/enamlx/widgets/console.py b/enamlx/widgets/console.py
+index bc61e90..2f1e981 100644
+--- a/enamlx/widgets/console.py
++++ b/enamlx/widgets/console.py
+@@ -7,7 +7,7 @@
+ """
+ 
+ from atom.api import (
+-    Instance, Coerced, Int, Enum, Unicode, Dict, Bool,
++    Instance, Coerced, Int, Enum, Str, Dict, Bool,
+     Typed, ForwardTyped, observe
+ )
+ from enaml.core.api import d_
+@@ -47,7 +47,7 @@ class Console(Container):
+     proxy = Typed(ProxyConsole)
+     
+     #: Font family, leave blank for default
+-    font_family = d_(Unicode())
++    font_family = d_(Str())
+     
+     #: Font size, leave 0 for default
+     font_size = d_(Int(0))
+diff --git a/enamlx/widgets/graphics_view.py b/enamlx/widgets/graphics_view.py
+index f7e3e47..e672c63 100644
+--- a/enamlx/widgets/graphics_view.py
++++ b/enamlx/widgets/graphics_view.py
+@@ -7,7 +7,7 @@
+ import sys
+ from atom.api import (
+     Atom, Float, Int, Typed, Bool, Coerced, ForwardTyped, Enum, List, IntEnum,
+-    Instance, Unicode, Value, Event, Property, observe, set_default
++    Instance, Str, Value, Event, Property, observe, set_default
+ )
+ from enaml.colors import ColorMember
+ from enaml.core.declarative import d_, d_func
+@@ -419,10 +419,10 @@ class GraphicsItem(ToolkitObject, ConstrainableMixin):
+     visible = d_(Bool(True))
+     
+     #: Tool tip
+-    tool_tip = d_(Unicode())
++    tool_tip = d_(Str())
+     
+     #: Status tip
+-    status_tip = d_(Unicode())
++    status_tip = d_(Str())
+     
+     # --------------------------------------------------------------------------
+     # Item interaction
+@@ -919,7 +919,7 @@ class GraphicsTextItem(AbstractGraphicsShapeItem):
+     proxy = Typed(ProxyGraphicsTextItem)
+     
+     #: Text
+-    text = d_(Unicode())
++    text = d_(Str())
+     
+     #: Font
+     font = d_(FontMember())
+diff --git a/enamlx/widgets/plot_area.py b/enamlx/widgets/plot_area.py
+index 5136693..383957b 100644
+--- a/enamlx/widgets/plot_area.py
++++ b/enamlx/widgets/plot_area.py
+@@ -8,7 +8,7 @@
+ import sys
+ from atom.atom import set_default
+ from atom.api import (Callable, Int, Tuple, Instance, Enum, Float,
+-                      ContainerList, Bool, FloatRange, Unicode, Dict, Typed,
++                      ContainerList, Bool, FloatRange, Str, Dict, Typed,
+                       ForwardTyped, observe)
+ from enaml.core.declarative import d_
+ from enaml.widgets.api import Container
+@@ -41,10 +41,10 @@ class PlotArea(Container):
+ 
+ class PlotItem(Control):
+     #: Title of data series
+-    title = d_(Unicode())
++    title = d_(Str())
+ 
+     #: Name
+-    name = d_(Unicode())
++    name = d_(Str())
+ 
+     #: Row in plot area
+     row = d_(Int(0))
+@@ -89,10 +89,10 @@ class PlotItem(Control):
+     #: Show legend
+     show_legend = d_(Bool(False))
+ 
+-    label_left = d_(Unicode())
+-    label_right = d_(Unicode())
+-    label_top = d_(Unicode())
+-    label_bottom = d_(Unicode())
++    label_left = d_(Str())
++    label_right = d_(Str())
++    label_top = d_(Str())
++    label_bottom = d_(Str())
+ 
+     # H, V
+     grid = d_(Tuple(bool, default=(False, False)))
+diff --git a/examples/occ_viewer/advanced.enaml b/examples/occ_viewer/advanced.enaml
+index 872d44d..f1c48d5 100644
+--- a/examples/occ_viewer/advanced.enaml
++++ b/examples/occ_viewer/advanced.enaml
+@@ -15,7 +15,7 @@ is then used to unroll a list of these controls into the body of a form.
+ 
+ << autodoc-me >>
+ """
+-from atom.api import Atom, Bool, Enum, Event, Float, Int, Str, Unicode
++from atom.api import Atom, Bool, Enum, Event, Float, Int, Str, Str
+ 
+ from enaml.core.api import DynamicTemplate
+ from enaml.stdlib.fields import FloatField
+@@ -73,8 +73,8 @@ template FormControl(Attr, MemberType: Str):
+         text :: setattr(model, Attr, str(text))
+ 
+ 
+-template FormControl(Attr, MemberType: Unicode):
+-    """ A form control template specialization for Unicode members.
++template FormControl(Attr, MemberType: Str):
++    """ A form control template specialization for Str members.
+ 
+     This control uses a Field to represent the value.
+ 
+@@ -174,7 +174,7 @@ def form_spec(obtype, model):
+     
+     typemap = {int:Int,
+                float:Float,
+-               unicode:Unicode,
++               unicode:Str,
+                str:Str}
+     for name, member in obtype.members().iteritems():
+         if (not name.startswith('_') 
+@@ -263,14 +263,14 @@ class FooModel(Atom):
+     ham = Int(42)
+     first = Str('first')
+     last = Str('last')
+-    owner = Unicode('owner')
++    owner = Str('owner')
+     time = Float(42.56)
+     click = Bool()
+     clack = Bool()
+ 
+ 
+ class BarModel(Atom):
+-    name = Unicode('name')
++    name = Str('name')
+     trigger = Event()
+     choices = Enum('first', 'second', 'third')
+     def _observe_trigger(self, change):
+diff --git a/examples/occ_viewer/occ/part.py b/examples/occ_viewer/occ/part.py
+index 1fe2b85..144354f 100644
+--- a/examples/occ_viewer/occ/part.py
++++ b/examples/occ_viewer/occ/part.py
+@@ -5,7 +5,7 @@
+ '''
+ 
+ from atom.api import (
+-    Typed, ForwardTyped, Unicode
++    Typed, ForwardTyped, Str
+ )
+ from enaml.core.declarative import d_
+ 
+@@ -26,10 +26,10 @@ class Part(ToolkitObject):
+     proxy = Typed(ProxyPart)
+     
+     #: Optional name of the part
+-    name = d_(Unicode())
++    name = d_(Str())
+     
+     #: Optional description of the part
+-    description = d_(Unicode())
++    description = d_(Str())
+     
+     @property
+     def shapes(self):
+diff --git a/examples/plot_area/plot_area.enaml b/examples/plot_area/plot_area.enaml
+index 2085c8f..b5cd3c4 100644
+--- a/examples/plot_area/plot_area.enaml
++++ b/examples/plot_area/plot_area.enaml
+@@ -2,7 +2,7 @@
+ Demonstrating the examples from pyqtgraph
+ """
+ 
+-from atom.api import (Atom, Unicode, Range, List, Bool)
++from atom.api import (Atom, Str, Range, List, Bool)
+ 
+ from enaml.widgets.api import (
+     Window, Container, DockArea,DockItem,PushButton, CheckBox, RadioButton
+diff --git a/examples/table_view/table_view.enaml b/examples/table_view/table_view.enaml
+index 6d7a35e..6fef544 100644
+--- a/examples/table_view/table_view.enaml
++++ b/examples/table_view/table_view.enaml
+@@ -2,7 +2,7 @@ import os
+ import time
+ import random
+ from threading import Thread
+-from atom.api import (Atom, Unicode, Range, ContainerList, Bool)
++from atom.api import (Atom, Str, Range, ContainerList, Bool)
+ 
+ from enamlx.widgets.table_view import (
+     TableView, TableViewRow, TableViewItem
+@@ -38,9 +38,9 @@ class Person(Atom):
+     """ A simple class representing a person object.
+ 
+     """
+-    last_name = Unicode()
++    last_name = Str()
+ 
+-    first_name = Unicode()
++    first_name = Str()
+ 
+     age = Range(low=0)
+ 
+diff --git a/examples/tree_view/tree_view.enaml b/examples/tree_view/tree_view.enaml
+index 37f991f..e88e1fd 100644
+--- a/examples/tree_view/tree_view.enaml
++++ b/examples/tree_view/tree_view.enaml
+@@ -1,5 +1,5 @@
+ import os
+-from atom.api import (Atom, Unicode, Range, List, Bool, ForwardInstance)
++from atom.api import (Atom, Str, Range, List, Bool, ForwardInstance)
+ 
+ from enamlx.widgets.api import (
+     TreeView, TreeViewItem, TreeViewColumn, 
+@@ -33,9 +33,9 @@ class Person(Atom):
+     """ A simple class representing a person object.
+ 
+     """
+-    last_name = Unicode()
++    last_name = Str()
+ 
+-    first_name = Unicode()
++    first_name = Str()
+     
+     children = List(ForwardInstance(lambda:Person))
diff --git a/nixpkgs/pkgs/development/python-modules/encodec/default.nix b/nixpkgs/pkgs/development/python-modules/encodec/default.nix
new file mode 100644
index 000000000000..930878782f60
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/encodec/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# dependencies
+, einops
+, numpy
+, torch-bin
+, torchaudio-bin
+}:
+
+buildPythonPackage rec {
+  pname = "encodec";
+  version = "0.1.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "facebookresearch";
+    repo = "encodec";
+    rev = "v${version}";
+    hash = "sha256-+iJZkX1HoyuNFu9VRxMO6aAzNQybkH9lrQJ5Ao9+/CY=";
+  };
+
+  propagatedBuildInputs = [
+    einops
+    numpy
+    torch-bin
+    torchaudio-bin
+  ];
+
+  pythonImportsCheck = [ "encodec" ];
+
+  # requires model data from the internet
+  doCheck = false;
+
+  meta = with lib; {
+    description = "State-of-the-art deep learning based audio codec supporting both mono 24 kHz audio and stereo 48 kHz audio";
+    homepage = "https://github.com/facebookresearch/encodec";
+    changelog = "https://github.com/facebookresearch/encodec/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/energyflip-client/default.nix b/nixpkgs/pkgs/development/python-modules/energyflip-client/default.nix
new file mode 100644
index 000000000000..50cb9e1884e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/energyflip-client/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "energyflip-client";
+  version = "0.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dennisschroer";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-neuZ6pZWW/Rgexu/iCEymjnxi5l/IuLKPFn6S9U4DgU=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "energyflip"
+  ];
+
+  meta = with lib; {
+    description = "Library to communicate with the API behind EnergyFlip";
+    homepage = "https://github.com/dennisschroer/energyflip-client";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/energyflow/default.nix b/nixpkgs/pkgs/development/python-modules/energyflow/default.nix
new file mode 100644
index 000000000000..5f89337f0de2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/energyflow/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, h5py
+, numpy
+, six
+, wasserstein
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "EnergyFlow";
+  version = "1.3.2";
+
+  src = fetchFromGitHub {
+    owner = "pkomiske";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-fjT8c0ZTjdufP334upPzRVdTJDIBs84I7PkFu4CMcQw=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "setup_requires=" "" \
+      --replace "pytest-runner" ""
+  '';
+
+  propagatedBuildInputs = [
+    h5py
+    numpy
+    six
+    wasserstein
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+  pytestFlagsArray = [
+    "energyflow/tests"
+  ];
+  disabledTestPaths = [
+    "energyflow/tests/test_archs.py" # requires tensorflow
+    "energyflow/tests/test_emd.py" # requires "ot"
+  ];
+
+  pythonImportsCheck = [ "energyflow" ];
+
+  meta = with lib; {
+    description = "Python package for the EnergyFlow suite of tools";
+    homepage = "https://energyflow.network/";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/energyzero/default.nix b/nixpkgs/pkgs/development/python-modules/energyzero/default.nix
new file mode 100644
index 000000000000..0b0acc5dab06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/energyzero/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytest-freezer
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "energyzero";
+  version = "1.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "klaasnicolaas";
+    repo = "python-energyzero";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-EsZYEc4Hf99PoP5X9LEgcGftI7597P4l1LTepTabGqU=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"0.0.0"' '"${version}"' \
+      --replace 'addopts = "--cov"' ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytest-freezer
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "energyzero"
+  ];
+
+  meta = with lib; {
+    description = "Module for getting the dynamic prices from EnergyZero";
+    homepage = "https://github.com/klaasnicolaas/python-energyzero";
+    changelog = "https://github.com/klaasnicolaas/python-energyzero/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/enlighten/default.nix b/nixpkgs/pkgs/development/python-modules/enlighten/default.nix
new file mode 100644
index 000000000000..af24162ada3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/enlighten/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, blessed
+, prefixed
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "enlighten";
+  version = "1.12.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jAn2VxEZdGzuZ3bL9OfASkjoiPTMrm2zd6WHZ0HwiZ8=";
+  };
+
+  propagatedBuildInputs = [
+    blessed
+    prefixed
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "enlighten"
+  ];
+
+  disabledTests = [
+    # AssertionError: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'> is not...
+    "test_init"
+    # AssertionError: Invalid format specifier (deprecated since prefixed 0.4.0)
+    "test_floats_prefixed"
+    "test_subcounter_prefixed"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # https://github.com/Rockhopper-Technologies/enlighten/issues/44
+    "test_autorefresh"
+  ];
+
+  meta = with lib; {
+    description = "Enlighten Progress Bar for Python Console Apps";
+    homepage = "https://github.com/Rockhopper-Technologies/enlighten";
+    changelog = "https://github.com/Rockhopper-Technologies/enlighten/releases/tag/${version}";
+    license = with licenses; [ mpl20 ];
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/enocean/default.nix b/nixpkgs/pkgs/development/python-modules/enocean/default.nix
new file mode 100644
index 000000000000..162e39aebffe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/enocean/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, beautifulsoup4
+, enum-compat
+, pyserial
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "enocean";
+  version = "0.60.1";
+
+  src = fetchFromGitHub {
+    owner = "kipe";
+    repo = "enocean";
+    rev = version;
+    sha256 = "0cbcvvy3qaqv8925z608qmkc1l914crzw79krwrz2vpm2fyribab";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    enum-compat
+    pyserial
+  ];
+
+  nativeCheckInputs = [
+    nose
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    nosetests
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "enocean.communicators"
+    "enocean.protocol.packet"
+    "enocean.utils"
+  ];
+
+  meta = with lib; {
+    description = "EnOcean serial protocol implementation";
+    homepage = "https://github.com/kipe/enocean";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/enochecker-core/default.nix b/nixpkgs/pkgs/development/python-modules/enochecker-core/default.nix
new file mode 100644
index 000000000000..806bd4a14e9f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/enochecker-core/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "enochecker-core";
+  version = "0.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "enochecker_core";
+    hash = "sha256-N41p2XRCp55rcPXLpA4rPIARsva/dQzK8qafjzXtavI=";
+  };
+
+
+  pythonImportsCheck = [
+    "enochecker_core"
+  ];
+
+  # no tests upstream
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Base library for enochecker libs";
+    homepage = "https://github.com/enowars/enochecker_core";
+    changelog = "https://github.com/enowars/enochecker_core/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fwc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/enrich/default.nix b/nixpkgs/pkgs/development/python-modules/enrich/default.nix
new file mode 100644
index 000000000000..abaa47ec07dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/enrich/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, pytestCheckHook, setuptools-scm, rich, pytest-mock }:
+
+buildPythonPackage rec {
+  pname = "enrich";
+  version = "1.2.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0a2ab0d2931dff8947012602d1234d2a3ee002d9a355b5d70be6bf5466008893";
+  };
+
+  buildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ rich ];
+
+  nativeCheckInputs = [ pytestCheckHook pytest-mock ];
+
+  disabledTests = [
+    # console output order is racy
+    "test_rich_console_ex"
+  ];
+
+  pythonImportsCheck = [ "enrich" ];
+
+  meta = with lib; {
+    description = "Enrich adds few missing features to the wonderful rich library";
+    homepage = "https://github.com/pycontribs/enrich";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/entrance/default.nix b/nixpkgs/pkgs/development/python-modules/entrance/default.nix
new file mode 100644
index 000000000000..97ac60fa5083
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/entrance/default.nix
@@ -0,0 +1,45 @@
+{ lib, fetchPypi, buildPythonPackage, pythonOlder, routerFeatures
+, janus, ncclient, paramiko, pyyaml, sanic }:
+
+let
+  # The `routerFeatures` flag optionally brings in some somewhat heavy
+  # dependencies, in order to enable interacting with routers
+  opts = if routerFeatures then {
+      prePatch = ''
+        substituteInPlace ./setup.py --replace "extra_deps = []" "extra_deps = router_feature_deps"
+      '';
+      extraBuildInputs = [ janus ncclient paramiko ];
+    } else {
+      prePatch = "";
+      extraBuildInputs = [];
+    };
+
+in
+
+buildPythonPackage rec {
+  pname = "entrance";
+  version = "1.1.20";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-PvsP6HXCllW102h3o7abz9uC2AZTwvg5qIqP+rdkk6Y=";
+  };
+
+  # The versions of `sanic` and `websockets` in nixpkgs only support 3.6 or later
+  disabled = pythonOlder "3.6";
+
+  # No useful tests
+  doCheck = false;
+
+  propagatedBuildInputs = [ pyyaml sanic ] ++ opts.extraBuildInputs;
+
+  prePatch = opts.prePatch;
+
+  meta = with lib; {
+    description = "A server framework for web apps with an Elm frontend";
+    homepage = "https://github.com/ensoft/entrance";
+    license = licenses.mit;
+    maintainers = with maintainers; [ simonchatts ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/entry-points-txt/default.nix b/nixpkgs/pkgs/development/python-modules/entry-points-txt/default.nix
new file mode 100644
index 000000000000..cac8c41f16f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/entry-points-txt/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "entry-points-txt";
+  version = "0.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "jwodder";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-klFSt3Od7xYgenpMP4DBFoZeQanGrmtJxDm5qeZ1Psc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace tox.ini \
+      --replace " --cov=entry_points_txt --no-cov-on-fail" ""
+  '';
+
+  pythonImportsCheck = [
+    "entry_points_txt"
+  ];
+
+  meta = with lib; {
+    description = "Read & write entry_points.txt files";
+    homepage = "https://github.com/jwodder/entry-points-txt";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ ayazhafiz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/entrypoint2/default.nix b/nixpkgs/pkgs/development/python-modules/entrypoint2/default.nix
new file mode 100644
index 000000000000..6e81b70f5991
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/entrypoint2/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, easyprocess
+, path
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "entrypoint2";
+  version = "1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/At/57IazatHpYWrlAfKflxPlstoiFddtrDOuR8OEFo=";
+  };
+
+  nativeCheckInputs = [
+    easyprocess
+    path
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "entrypoint2"
+  ];
+
+  meta = with lib; {
+    description = "Easy to use command-line interface for python modules";
+    homepage = "https://github.com/ponty/entrypoint2/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ austinbutler ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/entrypoints/default.nix b/nixpkgs/pkgs/development/python-modules/entrypoints/default.nix
new file mode 100644
index 000000000000..fe83e797d97a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/entrypoints/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, flit-core
+, configparser
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "entrypoints";
+  version = "0.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-twbt2qkhihnrzWe1aBjwW7J1ibHKno15e3Sv+tTMrNQ=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Discover and load entry points from installed packages";
+    homepage = "https://github.com/takluyver/entrypoints";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/enturclient/default.nix b/nixpkgs/pkgs/development/python-modules/enturclient/default.nix
new file mode 100644
index 000000000000..7140ded8bc4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/enturclient/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "enturclient";
+  version = "0.2.4";
+  disabled = pythonOlder "3.8";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "hfurubotten";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Y2sBPikCAxumylP1LUy8XgjBRCWaNryn5XHSrRjJIIo=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'async_timeout = "^3.0.1"' 'async_timeout = ">=3.0.1"'
+  '';
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "enturclient"
+  ];
+
+  meta = with lib; {
+    description = "Python library for interacting with the Entur.org API";
+    homepage = "https://github.com/hfurubotten/enturclient";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/enum-compat/default.nix b/nixpkgs/pkgs/development/python-modules/enum-compat/default.nix
new file mode 100644
index 000000000000..42a4b63479ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/enum-compat/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, enum34 }:
+
+buildPythonPackage rec {
+  pname = "enum-compat";
+  version = "0.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3677daabed56a6f724451d585662253d8fb4e5569845aafa8bb0da36b1a8751e";
+  };
+
+  propagatedBuildInputs = [ enum34 ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jstasiak/enum-compat";
+    description = "enum/enum34 compatibility package";
+    license = licenses.mit;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/enum34/default.nix b/nixpkgs/pkgs/development/python-modules/enum34/default.nix
new file mode 100644
index 000000000000..8ec22fc1cd73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/enum34/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonAtLeast
+, unittestCheckHook
+}:
+
+if pythonAtLeast "3.4" then null else buildPythonPackage rec {
+  pname = "enum34";
+  version = "1.1.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cce6a7477ed816bd2542d03d53db9f0db935dd013b70f336a95c73979289f248";
+  };
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/enum34";
+    description = "Python 3.4 Enum backported to 3.3, 3.2, 3.1, 2.7, 2.6, 2.5, and 2.4";
+    license = licenses.bsd0;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/env-canada/default.nix b/nixpkgs/pkgs/development/python-modules/env-canada/default.nix
new file mode 100644
index 000000000000..9906725b63c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/env-canada/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, geopy
+, imageio
+, lxml
+, pandas
+, pillow
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "env-canada";
+  version = "0.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "michaeldavie";
+    repo = "env_canada";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-YIU0fboXw2CHkAeC47pcXlZT2KPO0R1UolBVILlLoPg=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    geopy
+    imageio
+    lxml
+    pandas
+    pillow
+    python-dateutil
+    voluptuous
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_get_aqhi_regions"
+    "test_update"
+    "test_get_hydro_sites"
+    "test_echydro"
+    "test_get_dimensions"
+    "test_get_latest_frame"
+    "test_get_loop"
+    "test_get_ec_sites"
+    "test_ecradar"
+  ];
+
+  pythonImportsCheck = [
+    "env_canada"
+  ];
+
+  meta = with lib; {
+    description = "Python library to get Environment Canada weather data";
+    homepage = "https://github.com/michaeldavie/env_canada";
+    changelog = "https://github.com/michaeldavie/env_canada/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/environmental-override/default.nix b/nixpkgs/pkgs/development/python-modules/environmental-override/default.nix
new file mode 100644
index 000000000000..235401153136
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/environmental-override/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "environmental-override";
+  version = "0.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1vhd37i6f8xh6kd61yxc2ynzgcln7v2p7fyzjmhbkdnws6gwfs6s";
+  };
+
+  # No tests have been written for this library.
+  doCheck = false;
+
+  pythonImportsCheck = [ "environmental_override" ];
+
+  meta = {
+    description = "Easily configure apps using simple environmental overrides";
+    homepage = "https://github.com/coddingtonbear/environmental-override";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ nathanruiz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/environs/default.nix b/nixpkgs/pkgs/development/python-modules/environs/default.nix
new file mode 100644
index 000000000000..5591d74d38a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/environs/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, dj-database-url
+, dj-email-url
+, django-cache-url
+, fetchFromGitHub
+, marshmallow
+, pytestCheckHook
+, python-dotenv
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "environs";
+  version = "9.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "sloria";
+    repo = pname;
+    rev = version;
+    hash = "sha256-hucApIn7ul7+MC2W811VTxZNO8Pqb6HDXz9VRcEdmIc=";
+  };
+
+  propagatedBuildInputs = [
+    marshmallow
+    python-dotenv
+  ];
+
+  nativeCheckInputs = [
+    dj-database-url
+    dj-email-url
+    django-cache-url
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "environs"
+  ];
+
+  meta = with lib; {
+    description = "Python modle for environment variable parsing";
+    homepage = "https://github.com/sloria/environs";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/envisage/default.nix b/nixpkgs/pkgs/development/python-modules/envisage/default.nix
new file mode 100644
index 000000000000..74f70ee4979b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/envisage/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, apptools
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, ipython
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, setuptools
+, traits
+}:
+
+buildPythonPackage rec {
+  pname = "envisage";
+  version = "7.0.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-97GviL86j/8qmsbja7SN6pkp4/YSIEz+lK7WKwMWyeM=";
+  };
+
+  # for the optional dependency ipykernel, only versions < 6 are
+  # supported, so it's not included in the tests, and not propagated
+  propagatedBuildInputs = [
+    traits
+    apptools
+    setuptools
+  ];
+
+  preCheck = ''
+    export HOME=$PWD/HOME
+  '';
+
+  nativeCheckInputs = [
+    ipython
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = lib.optionals (pythonAtLeast "3.10") [
+    # https://github.com/enthought/envisage/issues/455
+    "envisage/tests/test_egg_basket_plugin_manager.py"
+    "envisage/tests/test_egg_plugin_manager.py"
+  ];
+
+  pythonImportsCheck = [
+    "envisage"
+  ];
+
+  meta = with lib; {
+    description = "Framework for building applications whose functionalities can be extended by adding plug-ins";
+    homepage = "https://github.com/enthought/envisage";
+    license = licenses.bsdOriginal;
+    maintainers = with lib.maintainers; [ knedlsepp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/envoy-reader/default.nix b/nixpkgs/pkgs/development/python-modules/envoy-reader/default.nix
new file mode 100644
index 000000000000..15603b59d23d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/envoy-reader/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, envoy-utils
+, fetchFromGitHub
+, fetchpatch
+, httpx
+, pyjwt
+, pytest-asyncio
+, pytestCheckHook
+, pytest-raises
+, pythonOlder
+, respx
+}:
+
+buildPythonPackage rec {
+  pname = "envoy-reader";
+  version = "0.21.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jesserizzo";
+    repo = "envoy_reader";
+    rev = version;
+    hash = "sha256-aIpZ4ln4L57HwK8H0FqsyNnXosnAp3ingrJI6/MPS90=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    envoy-utils
+    httpx
+    pyjwt
+  ];
+
+  nativeCheckInputs = [
+    pytest-raises
+    pytest-asyncio
+    pytestCheckHook
+    respx
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest-runner>=5.2" "" \
+      --replace "pyjwt==2.1.0" "pyjwt>=2.1.0"
+  '';
+
+  pythonImportsCheck = [
+    "envoy_reader"
+  ];
+
+  meta = with lib; {
+    description = "Python module to read from Enphase Envoy units";
+    homepage = "https://github.com/jesserizzo/envoy_reader";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/envoy-utils/default.nix b/nixpkgs/pkgs/development/python-modules/envoy-utils/default.nix
new file mode 100644
index 000000000000..6f04704a8b5f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/envoy-utils/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, zeroconf
+}:
+
+buildPythonPackage rec {
+  pname = "envoy-utils";
+  version = "0.0.1";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "envoy_utils";
+    inherit version;
+    sha256 = "13zn0d6k2a4nls9vp8cs0w07bgg4138vz18cadjadhm8p6r3bi0c";
+  };
+
+  propagatedBuildInputs = [
+    zeroconf
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "envoy_utils" ];
+
+  meta = with lib; {
+    description = "Python utilities for the Enphase Envoy";
+    homepage = "https://pypi.org/project/envoy-utils/";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/envs/default.nix b/nixpkgs/pkgs/development/python-modules/envs/default.nix
new file mode 100644
index 000000000000..307c7dfaa614
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/envs/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchPypi
+, jinja2
+, mock
+, nose
+, poetry-core
+, pythonOlder
+, terminaltables
+}:
+
+buildPythonPackage rec {
+  pname = "envs";
+  version = "1.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-nYQ1xphdHN1oKZ4ExY4r24rmz2ayWWqAeeb5qT8qA5g=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    click
+    jinja2
+    terminaltables
+  ];
+
+  nativeCheckInputs = [
+    mock
+    nose
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    nosetests --with-isolation
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "envs"
+  ];
+
+  meta = with lib; {
+    description = "Easy access to environment variables from Python";
+    homepage = "https://github.com/capless/envs";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/enzyme/default.nix b/nixpkgs/pkgs/development/python-modules/enzyme/default.nix
new file mode 100644
index 000000000000..ee547ad9b7bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/enzyme/default.nix
@@ -0,0 +1,20 @@
+{ lib, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "enzyme";
+  version = "0.4.1";
+
+  # Tests rely on files obtained over the network
+  doCheck = false;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1fv2kh2v4lwj0hhrhj9pib1pdjh01yr4xgyljhx11l94gjlpy5pj";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/Diaoul/enzyme";
+    license = licenses.asl20;
+    description = "Python video metadata parser";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/epc/default.nix b/nixpkgs/pkgs/development/python-modules/epc/default.nix
new file mode 100644
index 000000000000..3950afa578e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/epc/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sexpdata
+}:
+
+buildPythonPackage rec {
+  pname = "epc";
+  version = "0.0.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a14d2ea74817955a20eb00812e3a4630a132897eb4d976420240f1152c0d7d25";
+  };
+
+  propagatedBuildInputs = [ sexpdata ];
+  doCheck = false;
+
+  meta = with lib; {
+    description = "EPC (RPC stack for Emacs Lisp) implementation in Python";
+    homepage = "https://github.com/tkf/python-epc";
+    license = licenses.gpl3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ephem/default.nix b/nixpkgs/pkgs/development/python-modules/ephem/default.nix
new file mode 100644
index 000000000000..3b9f4fba9f50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ephem/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, glibcLocales
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "ephem";
+  version = "4.1.5";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-DGSoqkAVdMdZQgRbmvcNFlbhTFNmFRwMu0AMvu3CNio=";
+  };
+
+  nativeCheckInputs = [
+    glibcLocales
+    pytest
+  ];
+
+  # JPLTest uses assets not distributed in package
+  checkPhase = ''
+    LC_ALL="en_US.UTF-8" pytest --pyargs ephem.tests -k "not JPLTest"
+  '';
+
+  pythonImportsCheck = [
+    "ephem"
+  ];
+
+  meta = with lib; {
+    description = "Compute positions of the planets and stars";
+    homepage = "https://github.com/brandon-rhodes/pyephem";
+    license = licenses.mit;
+    maintainers = with maintainers; [ chrisrosset ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ephemeral-port-reserve/default.nix b/nixpkgs/pkgs/development/python-modules/ephemeral-port-reserve/default.nix
new file mode 100644
index 000000000000..76d14e191cac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ephemeral-port-reserve/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+let
+  pname = "ephemeral-port-reserve";
+  version = "1.1.4";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Yelp";
+    repo = "ephemeral-port-reserve";
+    rev = "v${version}";
+    hash = "sha256-R6NRpfaT05PO/cTWgCakiGfCuCyucjVOXbAezn5x1cU=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # can't find hostname in our darwin build environment
+    "test_fqdn"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [
+    "ephemeral_port_reserve"
+  ];
+
+  meta = with lib; {
+    description = "Find an unused port, reliably";
+    homepage = "https://github.com/Yelp/ephemeral-port-reserve/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/epson-projector/default.nix b/nixpkgs/pkgs/development/python-modules/epson-projector/default.nix
new file mode 100644
index 000000000000..66fb7964e53e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/epson-projector/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+, async-timeout
+, pyserial-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "epson-projector";
+  version = "0.5.1";
+
+  src = fetchPypi {
+    pname = "epson_projector";
+    inherit version;
+    hash = "sha256-LwsdMuwvLifIP1PRNhfLi4TTZRp/cw9Bcf57vrsNrbI=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    pyserial-asyncio
+  ];
+
+  # tests need real device
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "epson_projector"
+    "epson_projector.const"
+    "epson_projector.projector_http"
+    "epson_projector.projector_serial"
+    "epson_projector.projector_tcp"
+  ];
+
+  meta = with lib; {
+    description = "Epson projector support for Python";
+    homepage = "https://github.com/pszafer/epson_projector";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/equinox/default.nix b/nixpkgs/pkgs/development/python-modules/equinox/default.nix
new file mode 100644
index 000000000000..974bb21392be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/equinox/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, jax
+, jaxlib
+, jaxtyping
+, typing-extensions
+, beartype
+, optax
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "equinox";
+  version = "0.11.2";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "patrick-kidger";
+    repo = "equinox";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-qFTKiY/t2LCCWJBOSfaX0hYQInrpXgfhTc+J4iuyVbM=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    jax
+    jaxlib
+    jaxtyping
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    beartype
+    optax
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "equinox" ];
+
+  meta = with lib; {
+    description = "A JAX library based around a simple idea: represent parameterised functions (such as neural networks) as PyTrees";
+    homepage = "https://github.com/patrick-kidger/equinox";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/eradicate/default.nix b/nixpkgs/pkgs/development/python-modules/eradicate/default.nix
new file mode 100644
index 000000000000..511f8d17ecbe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eradicate/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "eradicate";
+  version = "2.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "wemake-services";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-ikiqNe1a+OeRraNBbtAx6v3LsTajWlgxm4wR2Tcbmjk=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "eradicate"
+  ];
+
+  pytestFlagsArray = [
+    "test_eradicate.py"
+  ];
+
+  meta = with lib; {
+    description = "Library to remove commented-out code from Python files";
+    homepage = "https://github.com/myint/eradicate";
+    changelog = "https://github.com/wemake-services/eradicate/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ mmlb ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/es-client/default.nix b/nixpkgs/pkgs/development/python-modules/es-client/default.nix
new file mode 100644
index 000000000000..e0a88d607c5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/es-client/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, buildPythonPackage
+, certifi
+, click
+, elastic-transport
+, elasticsearch8
+, fetchFromGitHub
+, hatchling
+, mock
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, pyyaml
+, requests
+, six
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "es-client";
+  version = "8.10.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "untergeek";
+    repo = "es_client";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-EvE40HLNKYl38PZ2bShAhFCsX3DMYsMmusUTcAql9b4=";
+  };
+
+  pythonRelaxDeps = true;
+
+  nativeBuildInputs = [
+    hatchling
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    certifi
+    click
+    elastic-transport
+    elasticsearch8
+    pyyaml
+    six
+    voluptuous
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+    requests
+  ];
+
+  pythonImportsCheck = [
+    "es_client"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_bad_version_raises"
+    "test_client_info"
+    "test_multiple_hosts_raises"
+    "test_non_dict_passed"
+    "test_skip_version_check"
+  ];
+
+  meta = with lib; {
+    description = "Module for building Elasticsearch client objects";
+    homepage = "https://github.com/untergeek/es_client";
+    changelog = "https://github.com/untergeek/es_client/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/escapism/default.nix b/nixpkgs/pkgs/development/python-modules/escapism/default.nix
new file mode 100644
index 000000000000..6093e16d4b50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/escapism/default.nix
@@ -0,0 +1,24 @@
+{ pkgs
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "escapism";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "73256bdfb4f22230f0428fc6efecee61cdc4fad531b6f98b849cb9c80711e4ec";
+  };
+
+  # No tests distributed
+  doCheck = false;
+
+  meta = with pkgs.lib; {
+    description = "Simple, generic API for escaping strings";
+    homepage = "https://github.com/minrk/escapism";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bzizou ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/esig/default.nix b/nixpkgs/pkgs/development/python-modules/esig/default.nix
new file mode 100644
index 000000000000..f0183917c2c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/esig/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cmake
+, ninja
+, oldest-supported-numpy
+, scikit-build
+, setuptools
+, numpy
+, iisignature
+, boost
+}:
+
+buildPythonPackage rec {
+  pname = "esig";
+  version = "0.9.8.3";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BGZaJSrpNSwZMHBYFDmDVPZOtgam/EVyh5Y5FAB8e1o=";
+  };
+
+  buildInputs = [
+    boost
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  nativeBuildInputs = [
+    cmake
+    ninja
+    oldest-supported-numpy
+    scikit-build
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  passthru.optional-dependencies = {
+    iisignature = [
+      iisignature
+    ];
+  };
+
+  # PyPI tarball has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "esig" ];
+
+  meta = with lib; {
+    description = "This package provides \"rough path\" tools for analysing vector time series";
+    homepage = "https://github.com/datasig-ac-uk/esig";
+    changelog = "https://github.com/datasig-ac-uk/esig/blob/release/CHANGELOG";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/espeak-phonemizer/cdll.patch b/nixpkgs/pkgs/development/python-modules/espeak-phonemizer/cdll.patch
new file mode 100644
index 000000000000..48207c3f95d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/espeak-phonemizer/cdll.patch
@@ -0,0 +1,17 @@
+diff --git a/espeak_phonemizer/__init__.py b/espeak_phonemizer/__init__.py
+index 44cd943..adeaeba 100644
+--- a/espeak_phonemizer/__init__.py
++++ b/espeak_phonemizer/__init__.py
+@@ -150,11 +150,7 @@ class Phonemizer:
+             # Already initialized
+             return
+ 
+-        try:
+-            self.lib_espeak = ctypes.cdll.LoadLibrary("libespeak-ng.so")
+-        except OSError:
+-            # Try .so.1
+-            self.lib_espeak = ctypes.cdll.LoadLibrary("libespeak-ng.so.1")
++        self.lib_espeak = ctypes.cdll.LoadLibrary("@libespeak_ng@")
+ 
+         sample_rate = self.lib_espeak.espeak_Initialize(
+             Phonemizer.AUDIO_OUTPUT_SYNCHRONOUS, 0, None, 0
diff --git a/nixpkgs/pkgs/development/python-modules/espeak-phonemizer/default.nix b/nixpkgs/pkgs/development/python-modules/espeak-phonemizer/default.nix
new file mode 100644
index 000000000000..42eb17326921
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/espeak-phonemizer/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, substituteAll
+, espeak-ng
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "espeak-phonemizer";
+  version = "1.3.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "rhasspy";
+    repo = "espeak-phonemizer";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-K0s24mzXUqG0Au40jjGbpKNAznBkMHQzfh2/CDBN0F8=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./cdll.patch;
+      libespeak_ng = "${lib.getLib espeak-ng}/lib/libespeak-ng.so";
+    })
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/rhasspy/espeak-phonemizer/releases/tag/v${version}";
+    description = "Uses ctypes and libespeak-ng to transform test into IPA phonemes";
+    homepage = "https://github.com/rhasspy/espeak-phonemizer";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/esphome-dashboard-api/default.nix b/nixpkgs/pkgs/development/python-modules/esphome-dashboard-api/default.nix
new file mode 100644
index 000000000000..0cb49cd6486e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/esphome-dashboard-api/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, wheel
+, aiohttp
+}:
+
+buildPythonPackage rec {
+  pname = "esphome-dashboard-api";
+  version = "1.2.3";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "esphome";
+    repo = "dashboard-api";
+    rev = "refs/tags/${version}";
+    hash = "sha256-RFfS0xzRXoM6ETXmviiMPxffPzspjTqpkvHOlTJXN9g=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "setuptools~=65.6" "setuptools" \
+      --replace "wheel~=0.37.1" "wheel"
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  doCheck = false; # no tests
+
+  pythonImportsCheck = [
+    "esphome_dashboard_api"
+  ];
+
+  meta = with lib; {
+    description = "API to interact with ESPHome Dashboard";
+    homepage = "https://github.com/esphome/dashboard-api";
+    changelog = "https://github.com/esphome/dashboard-api/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/esprima/default.nix b/nixpkgs/pkgs/development/python-modules/esprima/default.nix
new file mode 100644
index 000000000000..9f03e8a1e877
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/esprima/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "esprima";
+  version = "4.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Kronuz";
+    repo = "esprima-python";
+    rev = "v${version}";
+    sha256 = "WtkPCReXhxyr6pOzE9gsdIeBlLk+nSnbxkS3OowEaHo=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "test/__main__.py::TestEsprima"
+  ];
+
+  pythonImportsCheck = [
+    "esprima"
+  ];
+
+  meta = with lib; {
+    description = "Python parser for standard-compliant ECMAScript";
+    homepage = "https://github.com/Kronuz/esprima-python";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/et-xmlfile/default.nix b/nixpkgs/pkgs/development/python-modules/et-xmlfile/default.nix
new file mode 100644
index 000000000000..b744d2a693dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/et-xmlfile/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitLab
+, lxml
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "et-xmlfile";
+  version = "1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitLab {
+    domain = "foss.heptapod.net";
+    owner = "openpyxl";
+    repo = "et_xmlfile";
+    rev = version;
+    hash = "sha256-MJimcnYKujOL3FedGreNpuw1Jpg48ataDmFd1qwTS5A=";
+  };
+
+  nativeCheckInputs = [
+    lxml
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "et_xmlfile"
+  ];
+
+  meta = with lib; {
+    description = "An implementation of lxml.xmlfile for the standard library";
+    longDescription = ''
+      et_xmlfile is a low memory library for creating large XML files.
+
+      It is based upon the xmlfile module from lxml with the aim of
+      allowing code to be developed that will work with both
+      libraries. It was developed initially for the openpyxl project
+      but is now a standalone module.
+    '';
+    homepage = "https://foss.heptapod.net/openpyxl/et_xmlfile";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/etcd/default.nix b/nixpkgs/pkgs/development/python-modules/etcd/default.nix
new file mode 100644
index 000000000000..d4931696916a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/etcd/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, simplejson
+, pytz
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "etcd";
+  version = "2.0.8";
+
+  # PyPI package is incomplete
+  src = fetchFromGitHub {
+    owner = "dsoprea";
+    repo = "PythonEtcdClient";
+    rev = version;
+    hash = "sha256-h+jYIRSNdrGkW3tBV1ifIDEXU46EQGyeJoz/Mxym4pI=";
+  };
+
+  postPatch = ''
+    sed -i -e '13,14d;37d' setup.py
+  '';
+
+  propagatedBuildInputs = [ simplejson pytz requests ];
+
+  # No proper tests are available
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A Python etcd client that just works";
+    homepage = "https://github.com/dsoprea/PythonEtcdClient";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/etcd3/default.nix b/nixpkgs/pkgs/development/python-modules/etcd3/default.nix
new file mode 100644
index 000000000000..494f70ddf4da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/etcd3/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, etcd
+, fetchFromGitHub
+, grpcio
+, hypothesis
+, mock
+, pifpaf
+, protobuf
+, pytestCheckHook
+, six
+, tenacity
+}:
+
+buildPythonPackage rec {
+  pname = "etcd3";
+  version = "0.12.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "kragniz";
+    repo = "python-etcd3";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-YM72+fkCDYXl6DORJa/O0sqXqHDWQcFLv2ifQ9kEHBo=";
+  };
+
+  propagatedBuildInputs = [
+    grpcio
+    protobuf
+    six
+    tenacity
+  ];
+
+  # various failures and incompatible with newer hypothesis versions
+  doCheck = false;
+
+  nativeCheckInputs = [
+    etcd
+    hypothesis
+    mock
+    pifpaf
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    pifpaf -e PYTHON run etcd --cluster
+  '';
+
+  pythonImportsCheck = [
+    "etcd3"
+  ];
+
+  meta = with lib; {
+    description = "Python client for the etcd API v3";
+    homepage = "https://github.com/kragniz/python-etcd3";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ete3/default.nix b/nixpkgs/pkgs/development/python-modules/ete3/default.nix
new file mode 100644
index 000000000000..48ec3ca62386
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ete3/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, numpy
+, six
+, withTreeVisualization ? false
+, lxml
+, withXmlSupport ? false
+, pyqt5
+}:
+
+buildPythonPackage rec {
+  pname = "ete3";
+  version = "3.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-BqO3+o7ZAYewdqjbvlsbYqzulCAdPG6CL1X0SWAe9vI=";
+  };
+
+
+  doCheck = false; # Tests are (i) not 3.x compatible, (ii) broken under 2.7
+  pythonImportsCheck = [ "ete3" ];
+
+  propagatedBuildInputs = [ six numpy ]
+    ++ lib.optional withTreeVisualization pyqt5
+    ++ lib.optional withXmlSupport lxml;
+
+  meta = with lib; {
+    description = "A Python framework for the analysis and visualization of trees";
+    homepage = "http://etetoolkit.org/";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ delehef ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/etebase/default.nix b/nixpkgs/pkgs/development/python-modules/etebase/default.nix
new file mode 100644
index 000000000000..15815f33ee4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/etebase/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, rustPlatform
+, cargo
+, pkg-config
+, rustc
+, rustfmt
+, setuptools-rust
+, openssl
+, Security
+, msgpack
+}:
+
+buildPythonPackage rec {
+  pname = "etebase";
+  version = "0.31.6";
+
+  src = fetchFromGitHub {
+    owner = "etesync";
+    repo = "etebase-py";
+    rev = "v${version}";
+    hash = "sha256-T61nPW3wjBRjmJ81w59T1b/Kxrwwqvyj3gILE9OF/5Q=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-wrMNtcaLAsWBVeJbYbYo+Xmobl01lnUbR9NUqqUzUgU=";
+  };
+
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    pkg-config
+    rustfmt
+    setuptools-rust
+    rustPlatform.cargoSetupHook
+    cargo
+    rustc
+  ];
+
+  buildInputs = [ openssl ] ++ lib.optionals stdenv.isDarwin [ Security ];
+
+  propagatedBuildInputs = [
+    msgpack
+  ];
+
+  postPatch = ''
+    # Use system OpenSSL, which gets security updates.
+    substituteInPlace Cargo.toml \
+      --replace ', features = ["vendored"]' ""
+  '';
+
+  pythonImportsCheck = [ "etebase" ];
+
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    homepage = "https://www.etebase.com/";
+    description = "A Python client library for Etebase";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ _3699n ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/etelemetry/default.nix b/nixpkgs/pkgs/development/python-modules/etelemetry/default.nix
new file mode 100644
index 000000000000..ed093f182e32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/etelemetry/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27, ci-info, ci-py, requests }:
+
+buildPythonPackage rec {
+  version = "0.2.1";
+  pname = "etelemetry";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1rw8im09ppnb7z7p7rx658rp5ib8zca8byxg1kiflqwgx5c8zddz";
+  };
+
+  propagatedBuildInputs = [ ci-info ci-py requests ];
+
+  # all 2 of the tests both try to pull down from a url
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "etelemetry"
+    "etelemetry.client"
+    "etelemetry.config"
+  ];
+
+  meta = with lib; {
+    description = "Lightweight python client to communicate with the etelemetry server";
+    homepage = "https://github.com/mgxd/etelemetry-client";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/eternalegypt/default.nix b/nixpkgs/pkgs/development/python-modules/eternalegypt/default.nix
new file mode 100644
index 000000000000..2065d603fae1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eternalegypt/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, aiohttp
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "eternalegypt";
+  version = "0.0.16";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "amelchio";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ubKepd3yBaoYrIUe5WCt1zd4CjvU7SeftOR+2cBaEf0=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    attrs
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "eternalegypt"
+  ];
+
+  meta = with lib; {
+    description = "Python API for Netgear LTE modems";
+    homepage = "https://github.com/amelchio/eternalegypt";
+    changelog = "https://github.com/amelchio/eternalegypt/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/etesync/default.nix b/nixpkgs/pkgs/development/python-modules/etesync/default.nix
new file mode 100644
index 000000000000..a50f8e7c093a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/etesync/default.nix
@@ -0,0 +1,55 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27,
+  appdirs, asn1crypto, cffi, cryptography, furl, idna, orderedmultidict,
+  packaging, peewee, py, pyasn1, pycparser, pyparsing, pyscrypt,
+  python-dateutil, pytz, requests, six, vobject,
+  pytest
+}:
+
+buildPythonPackage rec {
+  pname = "etesync";
+  version = "0.12.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f20f7e9922ee789c4b71379676ebfe656b675913fe524f2ee722e1b9ef4e5197";
+  };
+
+  propagatedBuildInputs = [
+    appdirs
+    asn1crypto
+    cffi
+    cryptography
+    furl
+    idna
+    orderedmultidict
+    packaging
+    peewee
+    py
+    pyasn1
+    pycparser
+    pyparsing
+    pyscrypt
+    python-dateutil
+    pytz
+    requests
+    six
+    vobject
+  ];
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest tests/test_collections.py
+    pytest tests/test_crypto.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://www.etesync.com/";
+    description = "A python API to interact with an EteSync server.";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ valodim ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/eth-abi/default.nix b/nixpkgs/pkgs/development/python-modules/eth-abi/default.nix
new file mode 100644
index 000000000000..3a7d12b410d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eth-abi/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, eth-hash
+, eth-typing
+, eth-utils
+, hypothesis
+, parsimonious
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "eth-abi";
+  version = "4.1.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ethereum";
+    repo = "eth-abi";
+    rev = "v${version}";
+    hash = "sha256-CGAfu3Ovz2WPJOD+4W2+cOAz+wYvuIyFL333Jw66ozA=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "parsimonious>=0.9.0,<0.10.0" "parsimonious"
+  '';
+
+  propagatedBuildInputs = [
+    eth-typing
+    eth-utils
+    parsimonious
+  ];
+
+  # lots of: TypeError: isinstance() arg 2 must be a type or tuple of types
+  doCheck = false;
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ] ++ eth-hash.optional-dependencies.pycryptodome;
+
+  disabledTests = [
+    # boolean list representation changed
+    "test_get_abi_strategy_returns_certain_strategies_for_known_type_strings"
+    # hypothesis.errors.Flaky
+    "test_base_equals_has_expected_behavior_for_parsable_types"
+    "test_has_arrlist_has_expected_behavior_for_parsable_types"
+    "test_is_base_tuple_has_expected_behavior_for_parsable_types"
+  ];
+
+  pythonImportsCheck = [ "eth_abi" ];
+
+  meta = with lib; {
+    description = "Ethereum ABI utilities";
+    homepage = "https://github.com/ethereum/eth-abi";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/eth-account/default.nix b/nixpkgs/pkgs/development/python-modules/eth-account/default.nix
new file mode 100644
index 000000000000..319db8701115
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eth-account/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, bitarray
+, eth-abi
+, eth-keyfile
+, eth-keys
+, eth-rlp
+, eth-utils
+, websockets
+, hexbytes
+, pythonOlder
+, rlp
+}:
+
+buildPythonPackage rec {
+  pname = "eth-account";
+  version = "0.9.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ethereum";
+    repo = "eth-account";
+    rev = "v${version}";
+    hash = "sha256-Ps/vzJv0W1+wy1mSJaqRNNU6CoCMchReHIocB9kPrGs=";
+  };
+
+  propagatedBuildInputs = [
+    bitarray
+    eth-abi
+    eth-keyfile
+    eth-keys
+    eth-rlp
+    eth-utils
+    hexbytes
+    rlp
+    websockets
+  ];
+
+  # require buildinga npm project
+  doCheck = false;
+
+  pythonImportsCheck = [ "eth_account" ];
+
+  meta = with lib; {
+    description = "Account abstraction library for web3.py";
+    homepage = "https://github.com/ethereum/eth-account";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/eth-hash/default.nix b/nixpkgs/pkgs/development/python-modules/eth-hash/default.nix
new file mode 100644
index 000000000000..c26914f36006
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eth-hash/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonAtLeast
+, pythonOlder
+, pytest
+, safe-pysha3
+, pycryptodome
+}:
+
+buildPythonPackage rec {
+  pname = "eth-hash";
+  version = "0.5.2";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "ethereum";
+    repo = "eth-hash";
+    rev = "v${version}";
+    hash = "sha256-6UN+kvLjjAtkmLgUaovjZC/6n3FZtXCwyXZH7ijQObU=";
+  };
+
+  nativeCheckInputs = [
+    pytest
+  ] ++ passthru.optional-dependencies.pycryptodome
+  # eth-hash can use either safe-pysha3 or pycryptodome;
+  # safe-pysha3 requires Python 3.9+ while pycryptodome does not.
+  # https://github.com/ethereum/eth-hash/issues/46#issuecomment-1314029211
+  ++ lib.optional (pythonAtLeast "3.9") passthru.optional-dependencies.pysha3;
+
+  checkPhase = ''
+    pytest tests/backends/pycryptodome/
+  '' + lib.optionalString (pythonAtLeast "3.9") ''
+    pytest tests/backends/pysha3/
+  '';
+
+  passthru.optional-dependencies = {
+    pycryptodome = [ pycryptodome ];
+    pysha3 = [ safe-pysha3 ];
+  };
+
+  meta = with lib; {
+    description = "The Ethereum hashing function keccak256";
+    homepage = "https://github.com/ethereum/eth-hash";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/eth-keyfile/default.nix b/nixpkgs/pkgs/development/python-modules/eth-keyfile/default.nix
new file mode 100644
index 000000000000..e4320e8e035c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eth-keyfile/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, eth-keys
+, eth-utils
+, pycryptodome
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "eth-keyfile";
+  version = "0.6.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ethereum";
+    repo = "eth-keyfile";
+    rev = "v${version}";
+    fetchSubmodules = true;
+    hash = "sha256-JD4bRoD9L0JXcd+bTZrq/BkWw5QGzOi1RvoyLJC77kk=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'setuptools-markdown'" ""
+  '';
+
+  propagatedBuildInputs = [
+    eth-keys
+    eth-utils
+    pycryptodome
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "eth_keyfile" ];
+
+  meta = with lib; {
+    description = "Tools for handling the encrypted keyfile format used to store private keys";
+    homepage = "https://github.com/ethereum/eth-keyfile";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/eth-keys/default.nix b/nixpkgs/pkgs/development/python-modules/eth-keys/default.nix
new file mode 100644
index 000000000000..8cc904bb4029
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eth-keys/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, asn1tools
+, coincurve
+, eth-hash
+, eth-typing
+, eth-utils
+, factory-boy
+, hypothesis
+, isPyPy
+, pyasn1
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "eth-keys";
+  version = "0.4.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ethereum";
+    repo = "eth-keys";
+    rev = "v${version}";
+    hash = "sha256-jG/jJPM4t3z6UQIdc8L6y0DxZiGx5pVuGL8XwbIt60o=";
+  };
+
+  propagatedBuildInputs = [
+    eth-typing
+    eth-utils
+  ];
+
+  nativeCheckInputs = [
+    asn1tools
+    factory-boy
+    hypothesis
+    pyasn1
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.coincurve
+  ++ lib.optional (!isPyPy) eth-hash.optional-dependencies.pysha3
+  ++ lib.optional isPyPy eth-hash.optional-dependencies.pycryptodome;
+
+  disabledTests = [
+    # tests are broken
+    "test_compress_decompress_inversion"
+    "test_public_key_generation_is_equal"
+    "test_signing_is_equal"
+    "test_native_to_coincurve_recover"
+    "test_public_key_compression_is_equal"
+    "test_public_key_decompression_is_equal"
+    "test_signatures_with_high_s"
+    # timing sensitive
+    "test_encode_decode_pairings"
+  ];
+
+  pythonImportsCheck = [ "eth_keys" ];
+
+  passthru.optional-dependencies = {
+    coincurve = [ coincurve ];
+  };
+
+  meta = with lib; {
+    description = "Common API for Ethereum key operations";
+    homepage = "https://github.com/ethereum/eth-keys";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/eth-rlp/default.nix b/nixpkgs/pkgs/development/python-modules/eth-rlp/default.nix
new file mode 100644
index 000000000000..0b2e9468c2aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eth-rlp/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, eth-hash
+, eth-utils
+, hexbytes
+, pytestCheckHook
+, pythonOlder
+, rlp
+}:
+
+buildPythonPackage rec {
+  pname = "eth-rlp";
+  version = "0.3.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ethereum";
+    repo = "eth-rlp";
+    rev = "v${version}";
+    hash = "sha256-wfmRjHFu6H3J6hNin8ZA2454xXrLgcUdeR8iGXFomRE=";
+  };
+
+  propagatedBuildInputs = [
+    hexbytes
+    eth-utils
+    rlp
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ eth-hash.optional-dependencies.pycryptodome;
+
+  pythonImportsCheck = [ "eth_rlp" ];
+
+  meta = with lib; {
+    description = "RLP definitions for common Ethereum objects";
+    homepage = "https://github.com/ethereum/eth-rlp";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/eth-typing/default.nix b/nixpkgs/pkgs/development/python-modules/eth-typing/default.nix
new file mode 100644
index 000000000000..434fc6d8c10d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eth-typing/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "eth-typing";
+  version = "3.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ethereum";
+    repo = "eth-typing";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-klN38pIQ9ZOFV7dzXNvylPGfifR8pXRLTJ3VE579AY0=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "eth_typing"
+  ];
+
+  meta = with lib; {
+    description = "Common type annotations for Ethereum Python packages";
+    homepage = "https://github.com/ethereum/eth-typing";
+    changelog = "https://github.com/ethereum/eth-typing/blob/v${version}/docs/release_notes.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/eth-utils/default.nix b/nixpkgs/pkgs/development/python-modules/eth-utils/default.nix
new file mode 100644
index 000000000000..73a287b49aa5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eth-utils/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, eth-hash
+, eth-typing
+, cytoolz
+, hypothesis
+, isPyPy
+, pytestCheckHook
+, pythonOlder
+, toolz
+}:
+
+buildPythonPackage rec {
+  pname = "eth-utils";
+  version = "2.1.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ethereum";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Ogp4o99smw5qVwDec6zd/xVqqKMyNk41iBfRNzrwuvE=";
+  };
+
+  propagatedBuildInputs = [
+    eth-hash
+    eth-typing
+  ] ++ lib.optional (!isPyPy) cytoolz
+  ++ lib.optional isPyPy toolz;
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ] ++ eth-hash.optional-dependencies.pycryptodome;
+
+  # Removing a poorly written test case from test suite.
+  # TODO work with the upstream
+  disabledTestPaths = [
+    "tests/functional-utils/test_type_inference.py"
+  ];
+
+  pythonImportsCheck = [ "eth_utils" ];
+
+  meta = {
+    description = "Common utility functions for codebases which interact with ethereum";
+    homepage = "https://github.com/ethereum/eth-utils";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/etils/default.nix b/nixpkgs/pkgs/development/python-modules/etils/default.nix
new file mode 100644
index 000000000000..b6a3eed265df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/etils/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, flit-core
+
+  # tests
+, chex
+, jaxlib
+, pytest-subtests
+, pytest-xdist
+, pytestCheckHook
+, yapf
+
+  # optional
+, jupyter
+, mediapy
+, numpy
+, importlib-resources
+, typing-extensions
+, zipp
+, absl-py
+, tqdm
+, dm-tree
+, jax
+, tensorflow
+}:
+
+buildPythonPackage rec {
+  pname = "etils";
+  version = "1.5.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-tTDA0bLtG42hrzZ9S5eJHmgKakZY1BkBgyELu7jPH7k=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  passthru.optional-dependencies = rec {
+    array-types = enp;
+    eapp = [ absl-py /* FIXME package simple-parsing */ ] ++ epy;
+    ecolab = [ jupyter numpy mediapy ] ++ enp ++ epy;
+    edc = epy;
+    enp = [ numpy ] ++ epy;
+    epath = [ importlib-resources typing-extensions zipp ] ++ epy;
+    epy = [ typing-extensions ];
+    etqdm = [ absl-py tqdm ] ++ epy;
+    etree = array-types ++ epy ++ enp ++ etqdm;
+    etree-dm = [ dm-tree ] ++ etree;
+    etree-jax = [ jax ] ++ etree;
+    etree-tf = [ tensorflow ] ++ etree;
+    all = array-types ++ eapp ++ ecolab ++ edc ++ enp ++ epath ++ epy ++ etqdm
+      ++ etree ++ etree-dm ++ etree-jax ++ etree-tf;
+  };
+
+  pythonImportsCheck = [
+    "etils"
+  ];
+
+  nativeCheckInputs = [
+    chex
+    jaxlib
+    pytest-subtests
+    pytest-xdist
+    pytestCheckHook
+    yapf
+  ]
+  ++ passthru.optional-dependencies.all;
+
+  disabledTests = [
+    "test_public_access" # requires network access
+  ];
+
+  doCheck = false; # error: infinite recursion encountered
+
+  meta = with lib; {
+    changelog = "https://github.com/google/etils/blob/v${version}/CHANGELOG.md";
+    description = "Collection of eclectic utils for python";
+    homepage = "https://github.com/google/etils";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ mcwitt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/etuples/default.nix b/nixpkgs/pkgs/development/python-modules/etuples/default.nix
new file mode 100644
index 000000000000..a78cb3dc9897
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/etuples/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cons
+, multipledispatch
+, py
+, pytestCheckHook
+, pytest-html
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "etuples";
+  version = "0.3.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pythological";
+    repo = "etuples";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-dl+exar98PnqEiCNX+Ydllp7aohsAYrFtxb2Q1Lxx6Y=";
+  };
+
+  propagatedBuildInputs = [
+    cons
+    multipledispatch
+  ];
+
+  nativeCheckInputs = [
+    py
+    pytestCheckHook
+    pytest-html
+  ];
+
+  pytestFlagsArray = [
+    "--html=testing-report.html"
+    "--self-contained-html"
+  ];
+
+  pythonImportsCheck = [
+    "etuples"
+  ];
+
+  meta = with lib; {
+    description = "Python S-expression emulation using tuple-like objects";
+    homepage = "https://github.com/pythological/etuples";
+    changelog = "https://github.com/pythological/etuples/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ Etjean ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/euclid3/default.nix b/nixpkgs/pkgs/development/python-modules/euclid3/default.nix
new file mode 100644
index 000000000000..3d723eca5658
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/euclid3/default.nix
@@ -0,0 +1,25 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+}:
+buildPythonPackage rec {
+  pname = "euclid3";
+  version = "0.01";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JbgnpXrb/Zo/qGJeQ6vD6Qf2HeYiND5+U4SC75tG/Qs=";
+  };
+
+  pythonImportsCheck = [
+    "euclid3"
+  ];
+
+  meta = with lib; {
+    description = "2D and 3D vector, matrix, quaternion and geometry module.";
+    homepage = "http://code.google.com/p/pyeuclid/";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ jfly matusf ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/eufylife-ble-client/default.nix b/nixpkgs/pkgs/development/python-modules/eufylife-ble-client/default.nix
new file mode 100644
index 000000000000..d6216634232a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eufylife-ble-client/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, bleak
+, bleak-retry-connector
+, buildPythonPackage
+, cryptography
+, fetchPypi
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "eufylife-ble-client";
+  version = "0.1.8";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    pname = "eufylife_ble_client";
+    inherit version;
+    hash = "sha256-1pnT5B+m2/IDqHqOIZdDx8WwBdZpJe1Bj/HaxY+VW1Y=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bleak
+    bleak-retry-connector
+    cryptography
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "eufylife_ble_client"
+  ];
+
+  meta = with lib; {
+    description = "Module for parsing data from Eufy smart scales";
+    homepage = "https://github.com/bdr99/eufylife-ble-client";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/evaluate/default.nix b/nixpkgs/pkgs/development/python-modules/evaluate/default.nix
new file mode 100644
index 000000000000..2e3ca084e1f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/evaluate/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pythonRelaxDepsHook
+, pytestCheckHook
+, cookiecutter
+, datasets
+, dill
+, fsspec
+, huggingface-hub
+, importlib-metadata
+, multiprocess
+, numpy
+, packaging
+, pandas
+, pyarrow
+, requests
+, responses
+, tqdm
+, xxhash
+}:
+
+buildPythonPackage rec {
+  pname = "evaluate";
+  version = "0.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "huggingface";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-axcJg0ZalEd4FOySCiFReKL7wmTCtLaw71YqyLHq8fc=";
+  };
+
+  nativeBuildInputs = [ pythonRelaxDepsHook ];
+  pythonRelaxDeps = [ "responses" ];
+
+  propagatedBuildInputs = [
+    cookiecutter
+    datasets
+    numpy
+    dill
+    pandas
+    requests
+    tqdm
+    xxhash
+    multiprocess
+    fsspec
+    huggingface-hub
+    packaging
+    pyarrow
+    responses
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  # most tests require internet access.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "evaluate"
+  ];
+
+  meta = with lib; {
+    homepage = "https://huggingface.co/docs/evaluate/index";
+    description = "Easily evaluate machine learning models and datasets";
+    changelog = "https://github.com/huggingface/evaluate/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ bcdarwin ];
+    mainProgram = "evaluate-cli";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/evdev/default.nix b/nixpkgs/pkgs/development/python-modules/evdev/default.nix
new file mode 100644
index 000000000000..659a2314d6dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/evdev/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, linuxHeaders
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "evdev";
+  version = "1.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-KZ24YozHOyN/wcxX08KUj6oHVuKli2GUtb+B3CCB8eM=";
+  };
+
+  buildInputs = [
+    linuxHeaders
+  ];
+
+  patchPhase = ''
+    substituteInPlace setup.py \
+      --replace /usr/include/linux ${linuxHeaders}/include/linux
+  '';
+
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "evdev"
+  ];
+
+  meta = with lib; {
+    description = "Provides bindings to the generic input event interface in Linux";
+    homepage = "https://python-evdev.readthedocs.io/";
+    changelog = "https://github.com/gvalkov/python-evdev/blob/v${version}/docs/changelog.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ goibhniu ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/eve/default.nix b/nixpkgs/pkgs/development/python-modules/eve/default.nix
new file mode 100644
index 000000000000..9a9dc6897b95
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eve/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, flask
+, events
+, pymongo
+, simplejson
+, cerberus
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "eve";
+  version = "2.1.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "Eve";
+    hash = "sha256-NobIzu+7+NI7M4NRQKjrhye3v6YGMeGnbDRB39b3Dy8=";
+  };
+
+  disabled = pythonOlder "3.7";
+
+  propagatedBuildInputs = [
+    cerberus
+    events
+    flask
+    pymongo
+    simplejson
+    setuptools
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "events>=0.3,<0.4" "events>=0.3"
+  '';
+
+  pythonImportsCheck = [
+    "eve"
+  ];
+
+  # tests call a running mongodb instance
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://python-eve.org/";
+    description = "Open source Python REST API framework designed for human beings";
+    changelog = "https://github.com/pyeve/eve/blob/v${version}/CHANGES.rst";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/eventlet/default.nix b/nixpkgs/pkgs/development/python-modules/eventlet/default.nix
new file mode 100644
index 000000000000..35c702ea06d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eventlet/default.nix
@@ -0,0 +1,103 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, dnspython
+, greenlet
+, isPyPy
+, monotonic
+, six
+, nose3
+, iana-etc
+, pytestCheckHook
+, libredirect
+}:
+
+buildPythonPackage rec {
+  pname = "eventlet";
+  version = "0.33.3";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "eventlet";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-iSSEZgPkK7RrZfU11z7hUk+JbFsCPH/SD16e+/f6TFU=";
+  };
+
+  propagatedBuildInputs = [
+    dnspython
+    greenlet
+    six
+  ] ++ lib.optionals (pythonOlder "3.5") [
+    monotonic
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    nose3
+  ];
+
+  # libredirect is not available on darwin
+  # tests hang on pypy indefinitely
+  doCheck = !stdenv.isDarwin && !isPyPy;
+
+  preCheck = lib.optionalString doCheck ''
+    echo "nameserver 127.0.0.1" > resolv.conf
+    export NIX_REDIRECTS=/etc/protocols=${iana-etc}/etc/protocols:/etc/resolv.conf=$(realpath resolv.conf)
+    export LD_PRELOAD=${libredirect}/lib/libredirect.so
+
+    export EVENTLET_IMPORT_VERSION_ONLY=0
+  '';
+
+  disabledTests = [
+    # Tests requires network access
+    "test_017_ssl_zeroreturnerror"
+    "test_018b_http_10_keepalive_framing"
+    "test_getaddrinfo"
+    "test_hosts_no_network"
+    "test_leakage_from_tracebacks"
+    "test_patcher_existing_locks_locked"
+    # broken with pyopenssl 22.0.0
+    "test_sendall_timeout"
+    # broken on aarch64 and when using march in gcc
+    "test_fork_after_monkey_patch"
+  ];
+
+  disabledTestPaths = [
+    # Tests are out-dated
+    "tests/stdlib/test_asynchat.py"
+    "tests/stdlib/test_asyncore.py"
+    "tests/stdlib/test_ftplib.py"
+    "tests/stdlib/test_httplib.py"
+    "tests/stdlib/test_httpservers.py"
+    "tests/stdlib/test_os.py"
+    "tests/stdlib/test_queue.py"
+    "tests/stdlib/test_select.py"
+    "tests/stdlib/test_SimpleHTTPServer.py"
+    "tests/stdlib/test_socket_ssl.py"
+    "tests/stdlib/test_socket.py"
+    "tests/stdlib/test_socketserver.py"
+    "tests/stdlib/test_ssl.py"
+    "tests/stdlib/test_subprocess.py"
+    "tests/stdlib/test_thread__boundedsem.py"
+    "tests/stdlib/test_thread.py"
+    "tests/stdlib/test_threading_local.py"
+    "tests/stdlib/test_threading.py"
+    "tests/stdlib/test_timeout.py"
+    "tests/stdlib/test_urllib.py"
+    "tests/stdlib/test_urllib2_localnet.py"
+    "tests/stdlib/test_urllib2.py"
+  ];
+
+  # unfortunately, it needs /etc/protocol to be present to not fail
+  # pythonImportsCheck = [ "eventlet" ];
+
+  meta = with lib; {
+    description = "A concurrent networking library for Python";
+    homepage = "https://github.com/eventlet/eventlet/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/events/default.nix b/nixpkgs/pkgs/development/python-modules/events/default.nix
new file mode 100644
index 000000000000..f4e9dcd250f0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/events/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "events";
+  version = "0.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pyeve";
+    repo = "events";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-GGhIKHbJ31IN0Uoe689X9V/MZvtseE47qx2CmM4MYUs=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "events"
+  ];
+
+  pytestFlagsArray = [
+    "events/tests/tests.py"
+  ];
+
+  meta = with lib; {
+    description = "Bringing the elegance of C# EventHanlder to Python";
+    homepage = "https://events.readthedocs.org";
+    changelog = "https://github.com/pyeve/events/blob/v0.5/CHANGES";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/evernote/default.nix b/nixpkgs/pkgs/development/python-modules/evernote/default.nix
new file mode 100644
index 000000000000..8c6e4b6c7c27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/evernote/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, oauth2
+}:
+
+buildPythonPackage rec {
+  pname = "evernote";
+  version = "1.25.3";
+  disabled = ! isPy27; #some dependencies do not work with py3
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "796847e0b7517e729041c5187fa1665c3f6fc0491cb4d71fb95a62c4f22e64eb";
+  };
+
+   propagatedBuildInputs = [ oauth2 ];
+
+   meta = with lib; {
+    description = "Evernote SDK for Python";
+    homepage = "https://dev.evernote.com";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hbunke ];
+   };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/evohome-async/default.nix b/nixpkgs/pkgs/development/python-modules/evohome-async/default.nix
new file mode 100644
index 000000000000..17d4a688130b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/evohome-async/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, hatchling
+, pythonOlder
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "evohome-async";
+  version = "0.4.11";
+  pyproject = true;
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "zxdavb";
+    repo = "evohome-async";
+    rev = "refs/tags/${version}";
+    hash = "sha256-mx4nBEgXeBxcN1pYZfTKPGbNhvSz8l38MyRRpL82lf0=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    click
+    voluptuous
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "evohomeasync2"
+  ];
+
+  meta = with lib; {
+    description = "Python client for connecting to Honeywell's TCC RESTful API";
+    homepage = "https://github.com/zxdavb/evohome-async";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/evtx/default.nix b/nixpkgs/pkgs/development/python-modules/evtx/default.nix
new file mode 100644
index 000000000000..b949864dc7aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/evtx/default.nix
@@ -0,0 +1,55 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, rustPlatform
+, libiconv
+}:
+
+buildPythonPackage rec {
+  pname = "evtx";
+  version = "0.8.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "omerbenamram";
+    repo = "pyevtx-rs";
+    rev = "refs/tags/${version}";
+    hash = "sha256-t//oNvD+7wnv5KkriKBX4xgGS8pQpZgCsKxAEXsj0X8=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-DPEL36cYNV5v4iW3+Fg1eEeuBuK9S7Qe78xOzZs8aJw=";
+  };
+
+  nativeBuildInputs = with rustPlatform; [
+    cargoSetupHook
+    maturinBuildHook
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    libiconv
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "evtx"
+  ];
+
+  meta = with lib; {
+    description = "Bindings for evtx";
+    homepage = "https://github.com/omerbenamram/pyevtx-rs";
+    changelog = "https://github.com/omerbenamram/pyevtx-rs/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ewmh/default.nix b/nixpkgs/pkgs/development/python-modules/ewmh/default.nix
new file mode 100644
index 000000000000..c9ac68ae74d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ewmh/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, xlib }:
+
+buildPythonPackage rec {
+  pname = "ewmh";
+  version = "0.1.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0g9l14my3v8zlgq1yd8wh5gpara0qcapsfmvg7lq2lapglzhjsy5";
+  };
+
+  propagatedBuildInputs = [ xlib ];
+
+  # No tests included
+  doCheck = false;
+
+  meta = {
+    homepage = "https://github.com/parkouss/pyewmh";
+    description = "An implementation of EWMH (Extended Window Manager Hints), based on Xlib";
+    license = lib.licenses.lgpl3Plus;
+    maintainers = with lib.maintainers; [ bandresen ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/exceptiongroup/default.nix b/nixpkgs/pkgs/development/python-modules/exceptiongroup/default.nix
new file mode 100644
index 000000000000..61eef0a05abe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/exceptiongroup/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-scm
+, pytestCheckHook
+, pythonOlder
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "exceptiongroup";
+  version = "1.1.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "agronholm";
+    repo = "exceptiongroup";
+    rev = version;
+    hash = "sha256-19taP6adzmO4zH2As1OTXeYNFj6KwjhxBr09X+SrZRk=";
+  };
+
+  nativeBuildInputs = [
+    flit-scm
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  doCheck = pythonAtLeast "3.11"; # infinite recursion with pytest
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "exceptiongroup"
+  ];
+
+  meta = with lib; {
+    description = "Backport of PEP 654 (exception groups)";
+    homepage = "https://github.com/agronholm/exceptiongroup";
+    changelog = "https://github.com/agronholm/exceptiongroup/blob/${version}/CHANGES.rst";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/exchangelib/default.nix b/nixpkgs/pkgs/development/python-modules/exchangelib/default.nix
new file mode 100644
index 000000000000..b7d4cda7df7c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/exchangelib/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, backports-zoneinfo
+, buildPythonPackage
+, cached-property
+, defusedxml
+, dnspython
+, fetchFromGitHub
+, fetchpatch
+, flake8
+, isodate
+, lxml
+, oauthlib
+, psutil
+, pygments
+, python-dateutil
+, pythonOlder
+, pytz
+, pyyaml
+, requests
+, requests_ntlm
+, requests-oauthlib
+, requests-kerberos
+, requests-mock
+, tzdata
+, tzlocal
+}:
+
+buildPythonPackage rec {
+  pname = "exchangelib";
+  version = "5.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ecederstrand";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-WKQgfmEbil55WO3tWVq4n9wiJNw0Op/jbI7xt5vtKpA=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "tests-timezones-2.patch";
+      url = "https://github.com/ecederstrand/exchangelib/commit/419eafcd9261bfd0617823ee437204d5556a8271.diff";
+      excludes = [ "tests/test_ewsdatetime.py" ];
+      hash = "sha256-dSp6NkNT5dHOg8XgDi8sR3t3hq46sNtPjUXva2YfFSU=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    cached-property
+    defusedxml
+    dnspython
+    isodate
+    lxml
+    oauthlib
+    pygments
+    requests
+    requests_ntlm
+    requests-oauthlib
+    requests-kerberos
+    tzdata
+    tzlocal
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    backports-zoneinfo
+  ];
+
+  nativeCheckInputs = [
+    flake8
+    psutil
+    python-dateutil
+    pytz
+    pyyaml
+    requests-mock
+  ];
+
+  pythonImportsCheck = [
+    "exchangelib"
+  ];
+
+  meta = with lib; {
+    description = "Client for Microsoft Exchange Web Services (EWS)";
+    homepage = "https://github.com/ecederstrand/exchangelib";
+    changelog = "https://github.com/ecederstrand/exchangelib/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ catern ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/exdown/default.nix b/nixpkgs/pkgs/development/python-modules/exdown/default.nix
new file mode 100644
index 000000000000..937e90250a86
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/exdown/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchPypi
+, pythonOlder
+, setuptools
+, importlib-metadata
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "exdown";
+  version = "0.9.0";
+  format = "pyproject";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-r0SCigkUpOiba4MDf80+dLjOjjruVNILh/raWfvjXA0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [ importlib-metadata ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "exdown" ];
+
+  meta = with lib; {
+    description = "Extract code blocks from markdown";
+    homepage = "https://github.com/nschloe/exdown";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/execnb/default.nix b/nixpkgs/pkgs/development/python-modules/execnb/default.nix
new file mode 100644
index 000000000000..ef915d912a91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/execnb/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fastcore
+, traitlets
+, ipython
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "execnb";
+  version = "0.1.5";
+  format = "setuptools";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-nuAp4OMAfA3u3DJyORjFw7y7ZLsLCKEfxSFIXqNh+k0=";
+  };
+
+  propagatedBuildInputs = [ fastcore traitlets ipython ];
+
+  # no real tests
+  doCheck = false;
+  pythonImportsCheck = [ "execnb" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/fastai/execnb";
+    description = "Execute a jupyter notebook, fast, without needing jupyter";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ rxiao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/execnet/default.nix b/nixpkgs/pkgs/development/python-modules/execnet/default.nix
new file mode 100644
index 000000000000..eb184c180d5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/execnet/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, isPyPy
+, fetchPypi
+, hatchling
+, hatch-vcs
+, gevent
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "execnet";
+  version = "2.0.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zFm8RCN0L9ca0icSLrDdRNtR77PcQJW0WsmgjHcAlq8=";
+  };
+
+  postPatch = ''
+    # remove vbox tests
+    rm testing/test_termination.py
+    rm testing/test_channel.py
+    rm testing/test_xspec.py
+    rm testing/test_gateway.py
+  '' + lib.optionalString isPyPy ''
+    rm testing/test_multi.py
+  '';
+
+  nativeBuildInputs = [
+    hatchling
+    hatch-vcs
+  ];
+
+  # sometimes crashes with: OSError: [Errno 9] Bad file descriptor
+  doCheck = !isPyPy;
+
+  nativeCheckInputs = [
+    gevent
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # gets stuck
+    "test_popen_io"
+    # OSError: [Errno 9] Bad file descriptor
+    "test_stdouterrin_setnull"
+  ];
+
+  pytestFlagsArray = [ "-vvv" ];
+
+  pythonImportsCheck = [
+    "execnet"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    changelog = "https://github.com/pytest-dev/execnet/blob/v${version}/CHANGELOG.rst";
+    description = "Distributed Python deployment and communication";
+    homepage = "https://execnet.readthedocs.io/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/executing/default.nix b/nixpkgs/pkgs/development/python-modules/executing/default.nix
new file mode 100644
index 000000000000..484f5690054a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/executing/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, asttokens
+, buildPythonPackage
+, fetchFromGitHub
+, littleutils
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, rich
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "executing";
+  version = "1.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "alexmojaki";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-3M3uSJ5xQ5Ciy8Lz21u9zjju/7SBSFHobCqSiJ6AP8M=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    asttokens
+    littleutils
+    pytestCheckHook
+  ] ++ lib.optionals (pythonAtLeast "3.11") [
+    rich
+  ];
+
+  pythonImportsCheck = [
+    "executing"
+  ];
+
+  meta = with lib; {
+    description = "Get information about what a frame is currently doing, particularly the AST node being executed";
+    homepage = "https://github.com/alexmojaki/executing";
+    license = licenses.mit;
+    maintainers = with maintainers; [ renatoGarcia ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/executor/default.nix b/nixpkgs/pkgs/development/python-modules/executor/default.nix
new file mode 100644
index 000000000000..c9500d6f278b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/executor/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, coloredlogs
+, humanfriendly
+, property-manager
+, fasteners
+, six
+, pytestCheckHook
+, mock
+, virtualenv
+}:
+
+buildPythonPackage rec {
+  pname = "executor";
+  version = "23.2";
+  format = "setuptools";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "xolox";
+    repo = "python-executor";
+    rev = version;
+    sha256 = "1mr0662c5l5zx0wjapcprp8p2xawfd0im3616df5sgv79fqzwfqs";
+  };
+
+  propagatedBuildInputs = [
+    coloredlogs
+    humanfriendly
+    property-manager
+    fasteners
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+    virtualenv
+  ];
+
+  # ignore impure tests
+  disabledTests = [
+    "option"
+    "retry"
+    "remote"
+    "ssh"
+    "foreach"
+    "local_context"
+    "release"  # meant to be ran on ubuntu to succeed
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/xolox/python-executor/blob/${version}/CHANGELOG.rst";
+    description = "Programmer friendly subprocess wrapper";
+    homepage = "https://github.com/xolox/python-executor";
+    license = licenses.mit;
+    maintainers = with maintainers; [ eyjhb ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/exif/default.nix b/nixpkgs/pkgs/development/python-modules/exif/default.nix
new file mode 100644
index 000000000000..c1619436477a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/exif/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitLab
+, pythonOlder
+, plum-py
+, pytestCheckHook
+, baseline
+}:
+
+buildPythonPackage rec {
+  pname = "exif";
+  version = "1.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitLab {
+    owner = "TNThieding";
+    repo = "exif";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-uiHL3m0C6+YnAHRLwzMCSzffrQsSyVcuem6FBtTLxek=";
+  };
+
+  propagatedBuildInputs = [
+    plum-py
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    baseline
+  ];
+
+  pythonImportsCheck = [
+    "exif"
+  ];
+
+  meta = with lib; {
+    description = "Read and modify image EXIF metadata using Python";
+    homepage = "https://gitlab.com/TNThieding/exif";
+    changelog = "https://gitlab.com/TNThieding/exif/-/blob/v${version}/docs/release_notes.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dnr ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/exifread/default.nix b/nixpkgs/pkgs/development/python-modules/exifread/default.nix
new file mode 100644
index 000000000000..ab8fde6f8cc3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/exifread/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "ExifRead";
+  version = "3.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-CsWjZBadvfK9YvlPXAc5cKtmlKMWYXf15EixDJQ+LKQ=";
+  };
+
+  meta = with lib; {
+    description = "Easy to use Python module to extract Exif metadata from tiff and jpeg files";
+    homepage    = "https://github.com/ianare/exif-py";
+    license     = licenses.bsd0;
+    maintainers = with maintainers; [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/exitcode/default.nix b/nixpkgs/pkgs/development/python-modules/exitcode/default.nix
new file mode 100644
index 000000000000..e3d91f53de87
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/exitcode/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "exitcode";
+  version = "0.1.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "rumpelsepp";
+    repo = "exitcode";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-MZeLwU1gODqH752y/nc9WkUArl48pyq9Vun7tX620No=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "exitcode"
+  ];
+
+  meta = with lib; {
+    description = "Preferred system exit codes as defined by sysexits.h";
+    homepage = "https://github.com/rumpelsepp/exitcode";
+    changelog = "https://github.com/rumpelsepp/exitcode/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/expandvars/default.nix b/nixpkgs/pkgs/development/python-modules/expandvars/default.nix
new file mode 100644
index 000000000000..60055c6547ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/expandvars/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "expandvars";
+  version = "0.11.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Q7Qn9dMnqzYAY98mFR+Y0qbwj+GPKJWjKn9fDxF7W1I=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  # The PyPi package does not supply any tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "expandvars"
+  ];
+
+  meta = with lib; {
+    description = "Expand system variables Unix style";
+    homepage = "https://github.com/sayanarijit/expandvars";
+    license = licenses.mit;
+    maintainers = with maintainers; [ geluk ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/expects/default.nix b/nixpkgs/pkgs/development/python-modules/expects/default.nix
new file mode 100644
index 000000000000..093bdc27bf84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/expects/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "expects";
+  version = "0.9.0";
+
+  src = fetchFromGitHub {
+    owner = "jaimegildesagredo";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0mk1mhh8n9ly820krkhazn1w96f10vmgh21y2wr44sn8vwr4ngyy";
+  };
+
+  # mamba is used as test runner. Not available and should not be used as
+  # it's just another unmaintained test runner.
+  doCheck = false;
+  pythonImportsCheck = [ "expects" ];
+
+  meta = with lib; {
+    description = "Expressive and extensible TDD/BDD assertion library for Python";
+    homepage = "https://expects.readthedocs.io/";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/expecttest/default.nix b/nixpkgs/pkgs/development/python-modules/expecttest/default.nix
new file mode 100644
index 000000000000..5c1a27751e07
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/expecttest/default.nix
@@ -0,0 +1,34 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, hypothesis
+, lib
+, poetry-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "expecttest";
+  version = "0.1.4";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "ezyang";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-BFM0jFWXfH72n9XuFtU9URW8LWGPVJncXniBV5547W4=";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+
+  nativeCheckInputs = [ hypothesis pytestCheckHook ];
+
+  pythonImportsCheck = [ "expecttest" ];
+
+  meta = {
+    maintainers = [ lib.maintainers.SomeoneSerge ];
+    license = lib.licenses.mit;
+    description = ''EZ Yang "golden" tests (testing against a reference implementation)'';
+    homepage = "https://github.com/ezyang/expecttest";
+    platforms = lib.platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/experiment-utilities/default.nix b/nixpkgs/pkgs/development/python-modules/experiment-utilities/default.nix
new file mode 100644
index 000000000000..a236a2405918
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/experiment-utilities/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, cloudpickle
+, dill
+, fasteners
+, fetchFromGitLab
+, qgrid
+, ipynbname
+, ipywidgets
+, odfpy
+, scipy
+, plotly
+, pytestCheckHook
+, pyyaml
+, tabulate
+, tensorboard
+, torch
+}:
+
+buildPythonPackage rec {
+  pname = "experiment-utilities";
+  version = "0.3.6";
+
+  src = fetchFromGitLab {
+    owner = "creinke";
+    repo = "exputils";
+    domain = "gitlab.inria.fr";
+    rev = "refs/tags/version_${version}";
+    hash = "sha256-jo0CBSpUc/F1lJ2vagocngDM1Lopw5/AJnt1QwCunA8=";
+  };
+
+  # This dependency constraint (<=7.6.5) was due to a bug in qgrid that has been patched in its
+  # owned derivation
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "ipywidgets >= 7.5.1,<= 7.6.5" "ipywidgets >= 7.5.1"
+  '';
+
+  propagatedBuildInputs = [
+    cloudpickle
+    dill
+    fasteners
+    ipynbname
+    ipywidgets
+    odfpy
+    plotly
+    pyyaml
+    qgrid
+    scipy
+    tabulate
+    tensorboard
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    torch
+  ];
+
+  disabledTests = [
+    "test_experimentstarter"
+  ];
+
+  pythonImportsCheck = [ "exputils" ];
+
+  meta = with lib; {
+    description = "Various tools to run scientific computer experiments.";
+    homepage = "https://gitlab.inria.fr/creinke/exputils";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/expiring-dict/default.nix b/nixpkgs/pkgs/development/python-modules/expiring-dict/default.nix
new file mode 100644
index 000000000000..cd3d92508848
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/expiring-dict/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sortedcontainers
+}:
+
+buildPythonPackage rec {
+  pname = "expiring-dict";
+  version = "1.1.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-PEBK2x5DaUaMt+Ub+8nEcNfi6GPv4qHHXU7XBtDc4aY=";
+  };
+
+  propagatedBuildInputs = [
+    sortedcontainers
+  ];
+
+  pythonImportsCheck = [
+    "expiring_dict"
+  ];
+
+  meta = with lib; {
+    description = "Python dict with TTL support for auto-expiring caches";
+    homepage = "https://github.com/dparker2/py-expiring-dict";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ajs124 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/expiringdict/default.nix b/nixpkgs/pkgs/development/python-modules/expiringdict/default.nix
new file mode 100644
index 000000000000..e4e6dd8b7824
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/expiringdict/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, dill
+, coverage
+, coveralls
+, mock
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "expiringdict";
+  version = "1.2.2";
+  format = "setuptools";
+
+  # use fetchFromGitHub instead of fetchPypi because the test suite of
+  # the package is not included into the PyPI tarball
+  src = fetchFromGitHub {
+    owner = "mailgun";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-vRhJSHIqc51I+s/wndtfANM44CKW3QS1iajqyoSBf0I=";
+  };
+
+  nativeCheckInputs = [
+    dill
+    coverage
+    coveralls
+    mock
+    nose
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    nosetests -v --with-coverage --cover-package=expiringdict
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "expiringdict"
+  ];
+
+  meta = with lib; {
+    description = "Dictionary with auto-expiring values for caching purposes";
+    homepage = "https://github.com/mailgun/expiringdict";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ gravndal ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/explorerscript/default.nix b/nixpkgs/pkgs/development/python-modules/explorerscript/default.nix
new file mode 100644
index 000000000000..476c0cc433fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/explorerscript/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, antlr4
+, antlr4-python3-runtime
+, igraph
+, pygments
+, pytestCheckHook
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "explorerscript";
+  version = "0.1.4";
+
+  src = fetchFromGitHub {
+    owner = "SkyTemple";
+    repo = pname;
+    rev = version;
+    hash = "sha256-oa9q5k3OREGn6pQiyLy22MNJTiY6Pm+xrwA4DBUhxp0=";
+  };
+
+  nativeBuildInputs = [
+    antlr4
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    # antlr output is rebuilt in postPatch step.
+    "antlr4-python3-runtime"
+    # igraph > 0.10.4 was marked as incompatible by upstream
+    # due to a breaking change introduced in 0.10.5. Later versions reverted
+    # this change, and introduced a deprecation warning instead.
+    #
+    # https://github.com/igraph/python-igraph/issues/693
+    "igraph"
+  ];
+
+  postPatch = ''
+    antlr -Dlanguage=Python3 -visitor explorerscript/antlr/{ExplorerScript,SsbScript}.g4
+  '';
+
+  propagatedBuildInputs = [
+    antlr4-python3-runtime
+    igraph
+  ];
+
+  passthru.optional-dependencies.pygments = [
+    pygments
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.pygments;
+
+  pythonImportsCheck = [
+    "explorerscript"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/SkyTemple/explorerscript";
+    description = "A programming language + compiler/decompiler for creating scripts for Pokémon Mystery Dungeon Explorers of Sky";
+    license = licenses.mit;
+    maintainers = with maintainers; [ marius851000 xfix ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/exrex/default.nix b/nixpkgs/pkgs/development/python-modules/exrex/default.nix
new file mode 100644
index 000000000000..2ef58acc9093
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/exrex/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "exrex";
+  version = "0.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "asciimoo";
+    repo = "exrex";
+    # https://github.com/asciimoo/exrex/issues/68
+    rev = "239e4da37ff3a66d8b4b398d189299ae295594c3";
+    hash = "sha256-Tn/XIIy2wnob+1FmP9bdD9+gHLQZDofF2c1FqOijKWA=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "version=about['__version__']," "version='${version}',"
+  '';
+
+  # Projec thas no released tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "exrex"
+  ];
+
+  meta = with lib; {
+    description = "Irregular methods on regular expressions";
+    homepage = "https://github.com/asciimoo/exrex";
+    license = with licenses; [ agpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/extractcode/7z.nix b/nixpkgs/pkgs/development/python-modules/extractcode/7z.nix
new file mode 100644
index 000000000000..89a0bd110d4b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/extractcode/7z.nix
@@ -0,0 +1,49 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, plugincode
+, p7zip
+}:
+
+buildPythonPackage rec {
+  pname = "extractcode-7z";
+  version = "21.5.31";
+
+  src = fetchFromGitHub {
+    owner = "nexB";
+    repo = "scancode-plugins";
+    rev = "v${version}";
+    sha256 = "02qinla281fc6pmg5xzsrmqnf9js76f2qcbf98zq7m2dkn70as4w";
+  };
+
+  sourceRoot = "${src.name}/builtins/extractcode_7z-linux";
+
+  propagatedBuildInputs = [
+    plugincode
+  ];
+
+  preBuild = ''
+    pushd src/extractcode_7z/bin
+
+    rm 7z 7z.so
+    ln -s ${p7zip}/bin/7z 7z
+    ln -s ${lib.getLib p7zip}/lib/p7zip/7z.so 7z.so
+
+    popd
+  '';
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "extractcode_7z"
+  ];
+
+  meta = with lib; {
+    description = "A ScanCode Toolkit plugin to provide pre-built binary libraries and utilities and their locations";
+    homepage = "https://github.com/nexB/scancode-plugins/tree/main/builtins/extractcode_7z-linux";
+    license = with licenses; [ asl20 lgpl21 ];
+    maintainers = [ ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/extractcode/default.nix b/nixpkgs/pkgs/development/python-modules/extractcode/default.nix
new file mode 100644
index 000000000000..612ee8b84375
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/extractcode/default.nix
@@ -0,0 +1,84 @@
+{ lib
+, buildPythonPackage
+, extractcode-7z
+, extractcode-libarchive
+, fetchPypi
+, patch
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, six
+, typecode
+}:
+
+buildPythonPackage rec {
+  pname = "extractcode";
+  version = "31.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gIGTkum8+BKfdNiQT+ipjA3+0ngjVoQnNygsAoMRPYg=";
+  };
+
+  postPatch = ''
+    # PEP440 support was removed in newer setuptools, https://github.com/nexB/extractcode/pull/46
+    substituteInPlace setup.cfg \
+      --replace ">=3.6.*" ">=3.6"
+  '';
+
+  dontConfigure = true;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    typecode
+    patch
+    extractcode-libarchive
+    extractcode-7z
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-xdist
+  ];
+
+  disabledTestPaths = [
+    # CLI test tests the CLI which we can't do until after install
+    "tests/test_extractcode_cli.py"
+  ];
+
+  disabledTests = [
+    # test_uncompress_* wants to use a binary to extract instead of the provided library
+    "test_uncompress_lz4_basic"
+    "test_extract_tarlz4_basic"
+    "test_extract_rar_with_trailing_data"
+    # Tries to parse /boot/vmlinuz-*, which is not available in the nix sandbox
+    "test_can_extract_qcow2_vm_image_as_tarball"
+    "test_can_extract_qcow2_vm_image_not_as_tarball"
+    "test_can_listfs_from_qcow2_image"
+    "test_get_extractor_qcow2"
+    # WARNING  patch:patch.py:450 inconsistent line ends in patch hunks
+    "test_patch_info_patch_patches_windows_plugin_explorer_patch"
+    # AssertionError: assert [['linux-2.6...._end;', ...]]] == [['linux-2.6...._end;', ...]]]
+    "test_patch_info_patch_patches_misc_linux_st710x_patches_motorola_rootdisk_c_patch"
+  ];
+
+  pythonImportsCheck = [
+    "extractcode"
+  ];
+
+  meta = with lib; {
+    description = "Universal archive extractor using z7zip, libarchive, other libraries and the Python standard library";
+    homepage = "https://github.com/nexB/extractcode";
+    changelog = "https://github.com/nexB/extractcode/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/extractcode/libarchive.nix b/nixpkgs/pkgs/development/python-modules/extractcode/libarchive.nix
new file mode 100644
index 000000000000..0031c7a27941
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/extractcode/libarchive.nix
@@ -0,0 +1,62 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, libarchive
+, libb2
+, bzip2
+, expat
+, lz4
+, xz
+, zlib
+, zstd
+, plugincode
+}:
+
+buildPythonPackage rec {
+  pname = "extractcode-libarchive";
+  version = "21.5.31";
+
+  src = fetchFromGitHub {
+    owner = "nexB";
+    repo = "scancode-plugins";
+    rev = "v${version}";
+    sha256 = "02qinla281fc6pmg5xzsrmqnf9js76f2qcbf98zq7m2dkn70as4w";
+  };
+
+  sourceRoot = "${src.name}/builtins/extractcode_libarchive-linux";
+
+  preBuild = ''
+    pushd src/extractcode_libarchive/lib
+
+    rm *.so *.so.*
+    ln -s ${lib.getLib libarchive}/lib/libarchive.so libarchive.so
+    ln -s ${lib.getLib libb2}/lib/libb2.so libb2-la3511.so.1
+    ln -s ${lib.getLib bzip2}/lib/libbz2.so libbz2-la3511.so.1.0
+    ln -s ${lib.getLib expat}/lib/libexpat.so libexpat-la3511.so.1
+    ln -s ${lib.getLib lz4}/lib/liblz4.so liblz4-la3511.so.1
+    ln -s ${lib.getLib xz}/lib/liblzma.so liblzma-la3511.so.5
+    ln -s ${lib.getLib zlib}/lib/libz.so libz-la3511.so.1
+    ln -s ${lib.getLib zstd}/lib/libzstd.so libzstd-la3511.so.1
+
+    popd
+  '';
+
+  propagatedBuildInputs = [
+    plugincode
+  ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "extractcode_libarchive"
+  ];
+
+  meta = with lib; {
+    description = "A ScanCode Toolkit plugin to provide pre-built binary libraries and utilities and their locations";
+    homepage = "https://github.com/nexB/scancode-plugins/tree/main/builtins/extractcode_libarchive-linux";
+    license = with licenses; [ asl20 bsd2 ];
+    maintainers = [ ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/extras/default.nix b/nixpkgs/pkgs/development/python-modules/extras/default.nix
new file mode 100644
index 000000000000..ff8432ab2d27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/extras/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "extras";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "132e36de10b9c91d5d4cc620160a476e0468a88f16c9431817a6729611a81b4e";
+  };
+
+  # error: invalid command 'test'
+  doCheck = false;
+
+  meta = {
+    description = "Useful extra bits for Python - things that should be in the standard library";
+    homepage = "https://github.com/testing-cabal/extras";
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/extruct/default.nix b/nixpkgs/pkgs/development/python-modules/extruct/default.nix
new file mode 100644
index 000000000000..7752421236c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/extruct/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonRelaxDepsHook
+, html-text
+, jstyleson
+, lxml
+, mf2py
+, pyrdfa3
+, rdflib
+, six
+, w3lib
+, pytestCheckHook
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "extruct";
+  version = "0.13.0";
+
+  src = fetchFromGitHub {
+    owner = "scrapinghub";
+    repo = "extruct";
+    rev = "v${version}";
+    hash = "sha256-hf6b/tZLggHzgFmZ6aldZIBd17Ni7vCTIIzhNlyjvxw=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  # rdflib-jsonld functionality is part of rdblib from version 6 onwards
+  pythonRemoveDeps = [
+    "rdflib-jsonld"
+  ];
+
+  propagatedBuildInputs = [
+    html-text
+    jstyleson
+    lxml
+    mf2py
+    pyrdfa3
+    rdflib
+    six
+    w3lib
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "extruct" ];
+
+  meta = with lib; {
+    description = "Extract embedded metadata from HTML markup";
+    homepage = "https://github.com/scrapinghub/extruct";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ambroisie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/eyed3/default.nix b/nixpkgs/pkgs/development/python-modules/eyed3/default.nix
new file mode 100644
index 000000000000..9c29db7fa837
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/eyed3/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, isPyPy
+, six
+, filetype
+, deprecation
+}:
+
+buildPythonPackage rec {
+  version = "0.9.7";
+  pname    = "eyeD3";
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-k7GOk5M3akURT5QJ18yhGftvT5o31LaXtQCvSLTFzw8=";
+  };
+
+  # requires special test data:
+  # https://github.com/nicfit/eyeD3/blob/103198e265e3279384f35304e8218be6717c2976/Makefile#L97
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    deprecation
+    filetype
+    six
+  ];
+
+  postInstall = ''
+    for prog in "$out/bin/"*; do
+      wrapProgram "$prog" --prefix PYTHONPATH : "$PYTHONPATH" \
+                          --prefix PATH : ${python}/bin
+    done
+  '';
+
+  meta = with lib; {
+    description = "A Python module and command line program for processing ID3 tags";
+    homepage    = "https://eyed3.nicfit.net/";
+    license     = licenses.gpl2;
+    maintainers = with maintainers; [ lovek323 ];
+    platforms   = platforms.unix;
+    longDescription = ''
+      eyeD3 is a Python module and command line program for processing ID3
+      tags. Information about mp3 files (i.e bit rate, sample frequency, play
+      time, etc.) is also provided. The formats supported are ID3 v1.0/v1.1
+      and v2.3/v2.4.
+    '';
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ezdxf/default.nix b/nixpkgs/pkgs/development/python-modules/ezdxf/default.nix
new file mode 100644
index 000000000000..e0c7b76d1e61
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ezdxf/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pyparsing
+, typing-extensions
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  version = "0.18.1";
+  pname = "ezdxf";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "mozman";
+    repo = "ezdxf";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-x1p9dWrbDtDreXdBuzOA4Za+ZC40y4xdEU7MGb9uUec=";
+  };
+
+  propagatedBuildInputs = [
+    pyparsing
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # requires geomdl dependency
+    "TestNurbsPythonCorrectness"
+    "test_rational_spline_curve_points_by_nurbs_python"
+    "test_rational_spline_derivatives_by_nurbs_python"
+    "test_from_nurbs_python_curve_to_ezdxf_bspline"
+    "test_from_ezdxf_bspline_to_nurbs_python_curve_non_rational"
+    "test_from_ezdxf_bspline_to_nurbs_python_curve_rational"
+    # AssertionError: assert 44.99999999999999 == 45
+    "test_dimension_transform_interface"
+  ];
+
+  pythonImportsCheck = [
+    "ezdxf"
+    "ezdxf.addons"
+  ];
+
+  meta = with lib; {
+    description = "Python package to read and write DXF drawings (interface to the DXF file format)";
+    homepage = "https://github.com/mozman/ezdxf/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hodapp ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ezyrb/default.nix b/nixpkgs/pkgs/development/python-modules/ezyrb/default.nix
new file mode 100644
index 000000000000..c1bee4d060df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ezyrb/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, future
+, numpy
+, scipy
+, matplotlib
+, scikit-learn
+, torch
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ezyrb";
+  version = "1.3.0.post2312";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mathLab";
+    repo = "EZyRB";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-uS0/Y4luCzJ2zJ0dQ84n4AsQXGWxUv/m5/xiJGPTGDI=";
+  };
+
+  propagatedBuildInputs = [
+    future
+    numpy
+    scipy
+    matplotlib
+    scikit-learn
+    torch
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ezyrb"
+  ];
+
+  disabledTestPaths = [
+    # Exclude long tests
+    "tests/test_podae.py"
+  ];
+
+  meta = with lib; {
+    description = "Easy Reduced Basis method";
+    homepage = "https://mathlab.github.io/EZyRB/";
+    downloadPage = "https://github.com/mathLab/EZyRB/releases";
+    license = licenses.mit;
+    maintainers = with maintainers; [ yl3dy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/f5-icontrol-rest/default.nix b/nixpkgs/pkgs/development/python-modules/f5-icontrol-rest/default.nix
new file mode 100644
index 000000000000..080c3f5f0d73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/f5-icontrol-rest/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "f5-icontrol-rest";
+  version = "1.3.15";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "F5Networks";
+    repo = "f5-icontrol-rest-python";
+    rev = "v${version}";
+    sha256 = "sha256-ScudlJTQfa0BsEVI+mIndYWF8OcARdxwFwTAOEJxA8w=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    six
+  ];
+
+  # needs to be updated to newer pytest version and requires physical device
+  doCheck = false;
+
+  pytestFlags = [
+    "icontrol/test"
+  ];
+
+  pythonImportsCheck = [ "icontrol" ];
+
+  meta = with lib; {
+    description = "F5 BIG-IP iControl REST API client";
+    homepage = "https://github.com/F5Networks/f5-icontrol-rest-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/f5-sdk/default.nix b/nixpkgs/pkgs/development/python-modules/f5-sdk/default.nix
new file mode 100644
index 000000000000..b73afcec0fab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/f5-sdk/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, f5-icontrol-rest
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "f5-sdk";
+  version = "3.0.21";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-IokMj9mCMsFMVFYO4CpZUB2i32cOamhS5u2mNkNjljo=";
+  };
+
+  propagatedBuildInputs = [
+    f5-icontrol-rest
+    six
+  ];
+
+  # needs to be updated to newer pytest version and requires physical device
+  doCheck = false;
+
+  pythonImportsCheck = [ "f5" ];
+
+  meta = with lib; {
+    description = "F5 Networks Python SDK";
+    homepage = "https://github.com/F5Networks/f5-common-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/f90nml/default.nix b/nixpkgs/pkgs/development/python-modules/f90nml/default.nix
new file mode 100644
index 000000000000..de9d56e75edc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/f90nml/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchFromGitHub, python, setuptools-scm }:
+
+buildPythonPackage rec {
+  pname = "f90nml";
+  version = "1.4.1";
+
+  src = fetchFromGitHub {
+    owner = "marshallward";
+    repo = pname;
+    rev = "v" + version;
+    hash = "sha256-nSpVBAS2VvXIQwYK/qVVzEc13bicAQ+ScXpO4Rn2O+8=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  checkPhase = ''
+    ${python.interpreter} setup.py test
+  '';
+
+  pythonImportsCheck = [ "f90nml" ];
+
+  meta = with lib; {
+    description = "Python module for working with Fortran Namelists";
+    homepage = "https://f90nml.readthedocs.io";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ loicreynier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/faadelays/default.nix b/nixpkgs/pkgs/development/python-modules/faadelays/default.nix
new file mode 100644
index 000000000000..e19b3192e350
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/faadelays/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "faadelays";
+  version = "2023.9.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ngMFd+BE3hKeaeGEX4xHpzDIrtGFDsSwxBbrc4ZMFas=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "faadelays"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/ntilley905/faadelays/releases/tag/v${version}";
+    description = "Python package to retrieve FAA airport status";
+    homepage = "https://github.com/ntilley905/faadelays";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fabric/default.nix b/nixpkgs/pkgs/development/python-modules/fabric/default.nix
new file mode 100644
index 000000000000..e3da62493454
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fabric/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cryptography
+, decorator
+, invoke
+, mock
+, paramiko
+, pytestCheckHook
+, pytest-relaxed
+}:
+
+buildPythonPackage rec {
+  pname = "fabric";
+  version = "3.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-h4PKQuOwB28IsmkBqsa52bHxnEEAdOesz6uQLBhP9KM=";
+  };
+
+  # only relevant to python < 3.4
+  postPatch = ''
+    substituteInPlace setup.py \
+        --replace ', "pathlib2"' ' '
+  '';
+
+  propagatedBuildInputs = [ invoke paramiko cryptography decorator ];
+
+  nativeCheckInputs = [ pytestCheckHook pytest-relaxed mock ];
+
+  # ==================================== ERRORS ====================================
+  # ________________________ ERROR collecting test session _________________________
+  # Direct construction of SpecModule has been deprecated, please use SpecModule.from_parent
+  # See https://docs.pytest.org/en/stable/deprecations.html#node-construction-changed-to-node-from-parent for more details.
+  doCheck = false;
+
+  pythonImportsCheck = [ "fabric" ];
+
+  meta = with lib; {
+    description = "Pythonic remote execution";
+    homepage = "https://www.fabfile.org/";
+    license = licenses.bsd2;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fabulous/default.nix b/nixpkgs/pkgs/development/python-modules/fabulous/default.nix
new file mode 100644
index 000000000000..26329cc73b83
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fabulous/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pillow
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "fabulous";
+  version = "0.4.0";
+
+  src = fetchFromGitHub {
+    owner = "jart";
+    repo = pname;
+    rev = version;
+    hash = "sha256-hchlxuB5QP+VxCx+QZ2739/mR5SQmYyE+9kXLKJ2ij4=";
+  };
+
+  patches = [
+    ./relative_import.patch
+  ];
+
+  propagatedBuildInputs = [
+    pillow
+  ];
+
+  checkPhase = ''
+    for i in tests/*.py; do
+      ${python.interpreter} $i
+    done
+  '';
+
+  meta = with lib; {
+    description = "Make the output of terminal applications look fabulous";
+    homepage = "https://jart.github.io/fabulous";
+    license = licenses.asl20;
+    maintainers = [ maintainers.symphorien ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fabulous/relative_import.patch b/nixpkgs/pkgs/development/python-modules/fabulous/relative_import.patch
new file mode 100644
index 000000000000..b12e3d9a7863
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fabulous/relative_import.patch
@@ -0,0 +1,27 @@
+diff --git a/fabulous/prompt.py b/fabulous/prompt.py
+index 531176f..e395ab4 100644
+--- a/fabulous/prompt.py
++++ b/fabulous/prompt.py
+@@ -18,8 +18,7 @@
+ import sys
+ import os
+ import os.path
+-import term
+-from term import stdout, stderr, display
++from .term import stdout, stderr, display
+ 
+ __all__ = ["input_object","query","file_chooser"]
+ 
+diff --git a/fabulous/widget.py b/fabulous/widget.py
+index 31a2547..7ad889a 100644
+--- a/fabulous/widget.py
++++ b/fabulous/widget.py
+@@ -24,7 +24,7 @@ import os
+ import math
+ from datetime import datetime
+ # import textwrap
+-from term import stdout, display
++from .term import stdout, display
+ 
+ class ProgressBar(object):
+     """A 3-line progress bar, which looks like::
diff --git a/nixpkgs/pkgs/development/python-modules/face-recognition/default.nix b/nixpkgs/pkgs/development/python-modules/face-recognition/default.nix
new file mode 100644
index 000000000000..8b06c83cf5aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/face-recognition/default.nix
@@ -0,0 +1,45 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+
+# propagates
+, click
+, dlib
+, face-recognition-models
+, numpy
+, pillow
+
+# tests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "face-recognition";
+  version = "1.3.0";
+  format = "setuptools";
+
+  src = fetchPypi  {
+    pname = "face_recognition";
+    inherit version;
+    hash = "sha256-Xl790WhqpWavDTzBMTsTHksZdleo/9A2aebT+tknBew=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    dlib
+    face-recognition-models
+    numpy
+    pillow
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    license = licenses.mit;
+    homepage = "https://github.com/ageitgey/face_recognition";
+    maintainers = with maintainers; [ ];
+    description = "The world's simplest facial recognition api for Python and the command line";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/face-recognition/models.nix b/nixpkgs/pkgs/development/python-modules/face-recognition/models.nix
new file mode 100644
index 000000000000..9df1ac060589
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/face-recognition/models.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "face-recognition-models";
+  version = "0.3.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "face_recognition_models";
+    inherit version;
+    hash = "sha256-t5vSAKiMh8mp1EbJkK5xxaYm0fNzAXTm1XAVf/HYls8=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "face_recognition_models"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ageitgey/face_recognition_models";
+    license = licenses.cc0;
+    maintainers = with maintainers; [ ];
+    description = "Trained models for the face_recognition python library";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/face/default.nix b/nixpkgs/pkgs/development/python-modules/face/default.nix
new file mode 100644
index 000000000000..cd024c1fb22b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/face/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, boltons
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "face";
+  version = "22.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-1daS+QvI9Zh7Y25H42OEubvaSZqvCneqCwu+g0x2kj0=";
+  };
+
+  propagatedBuildInputs = [
+    boltons
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "face"
+  ];
+
+  disabledTests = [
+    # Assertion error as we take the Python release into account
+    "test_search_prs_basic"
+  ];
+
+  meta = with lib; {
+    description = "A command-line interface parser and framework";
+    longDescription = ''
+      A command-line interface parser and framework, friendly for
+      users, full-featured for developers.
+    '';
+    homepage = "https://github.com/mahmoud/face";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ twey ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/facebook-sdk/default.nix b/nixpkgs/pkgs/development/python-modules/facebook-sdk/default.nix
new file mode 100644
index 000000000000..6ab228baf547
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/facebook-sdk/default.nix
@@ -0,0 +1,32 @@
+{ pkgs
+, buildPythonPackage
+, fetchPypi
+, requests
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "facebook-sdk";
+  version = "3.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "138grz0n6plzdqgi4h6hhszf58bsvx9v76cwj51g1nd3kvkd5g6a";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # checks require network
+  doCheck = false;
+
+  checkPhase = ''
+    ${python.interpreter} test/test_facebook.py
+  '';
+
+  meta = with pkgs.lib; {
+    description = "Client library that supports the Facebook Graph API and the official Facebook JavaScript SDK";
+    homepage = "https://github.com/pythonforfacebook/facebook-sdk";
+    license = licenses.asl20 ;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/facedancer/default.nix b/nixpkgs/pkgs/development/python-modules/facedancer/default.nix
new file mode 100644
index 000000000000..0aabe704f040
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/facedancer/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, pyusb, pyserial }:
+
+buildPythonPackage rec {
+  pname = "facedancer";
+  version = "2019.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1zhwnlfksblgp54njd9gjsrr5ibg12cx1x9xxcqkcdfhn3m2kmm0";
+  };
+
+  disabled = !isPy3k;
+
+  propagatedBuildInputs = [ pyusb pyserial ];
+
+  preBuild = ''
+    echo "$version" > VERSION
+  '';
+
+  meta = with lib; {
+    description = "library for emulating usb devices";
+    homepage = "https://greatscottgadgets.com/greatfet/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ mog ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/factory-boy/default.nix b/nixpkgs/pkgs/development/python-modules/factory-boy/default.nix
new file mode 100644
index 000000000000..2269445282bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/factory-boy/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, django
+, faker
+, fetchPypi
+, flask
+, flask-sqlalchemy
+, mongoengine
+, pytestCheckHook
+, pythonOlder
+, sqlalchemy
+, sqlalchemy-utils
+}:
+
+buildPythonPackage rec {
+  pname = "factory-boy";
+  version = "3.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "factory_boy";
+    inherit version;
+    hash = "sha256-vHbZfRplu9mEKm1yKIIJjrVJ7I7hCB+fsuj/KfDDAPE=";
+  };
+
+  postPatch = ''
+    substituteInPlace tests/test_version.py \
+      --replace '"3.2.1.dev0")' '"${version}")'
+  '';
+
+  propagatedBuildInputs = [
+    faker
+  ];
+
+  nativeCheckInputs = [
+    django
+    flask
+    flask-sqlalchemy
+    mongoengine
+    pytestCheckHook
+    sqlalchemy
+    sqlalchemy-utils
+  ];
+
+  # Checks for MongoDB requires an a running DB
+  disabledTests = [
+    "MongoEngineTestCase"
+  ];
+
+  disabledTestPaths = [
+    # incompatible with latest flask-sqlalchemy
+    "examples/flask_alchemy/test_demoapp.py"
+  ];
+
+  pythonImportsCheck = [
+    "factory"
+  ];
+
+  meta = with lib; {
+    description = "Python package to create factories for complex objects";
+    homepage = "https://github.com/rbarrois/factory_boy";
+    changelog = "https://github.com/FactoryBoy/factory_boy/blob/${version}/docs/changelog.rst";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fairscale/default.nix b/nixpkgs/pkgs/development/python-modules/fairscale/default.nix
new file mode 100644
index 000000000000..42a7da74f9bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fairscale/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+# build inputs
+, torch
+, numpy
+, ninja
+# check inputs
+, pytestCheckHook
+, parameterized
+, pytest-cov
+, pytest-timeout
+, remote-pdb
+}:
+let
+  pname = "fairscale";
+  version = "0.4.13";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "facebookresearch";
+    repo = "fairscale";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-L2Rl/qL6l0OLAofygzJBGQdp/2ZrgDFarwZRjyAR3dw=";
+  };
+
+  # setup.py depends on ninja python dependency, but we have the binary in nixpkgs
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'setup_requires=["ninja"]' 'setup_requires=[]'
+  '';
+
+  nativeBuildInputs = [
+    ninja
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    torch
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    parameterized
+    pytest-cov
+    pytest-timeout
+    remote-pdb
+  ];
+
+  # Some tests try to build distributed models, which doesn't work in the sandbox.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "fairscale"
+  ];
+
+  meta = with lib; {
+    description = "PyTorch extensions for high performance and large scale training";
+    homepage = "https://github.com/facebookresearch/fairscale";
+    changelog = "https://github.com/facebookresearch/fairscale/releases/tag/v${version}";
+    license = with licenses; [ mit asl20 bsd3 ];
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fairseq/default.nix b/nixpkgs/pkgs/development/python-modules/fairseq/default.nix
new file mode 100644
index 000000000000..35275c32780a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fairseq/default.nix
@@ -0,0 +1,122 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, fetchpatch
+
+# Native build inputs
+, cython
+, pythonRelaxDepsHook
+, which
+
+# Propagated build inputs
+, cffi
+, hydra-core
+, omegaconf
+, sacrebleu
+, numpy
+, regex
+, torch
+, tqdm
+, bitarray
+, torchaudio
+, scikit-learn
+, packaging
+
+# Check inputs
+, expecttest
+, hypothesis
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "fairseq";
+  version = "0.12.3";
+  pyproject = true;
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pytorch";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-XX/grU5ljQCwx33miGoFc/7Uj9fZDtmhm4Fz7L4U+Bc=";
+  };
+
+  patches = [
+    # https://github.com/facebookresearch/fairseq/pull/5359
+    (fetchpatch {
+      url = "https://github.com/facebookresearch/fairseq/commit/2fa0768c2115b0a4c207cfa3e1b3e4ff3ad9a00c.patch";
+      hash = "sha256-aYYP/knQX6q6vhyA6q9uOOYfRhDAuJCo9QJWfFEDuuA=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    cython
+    pythonRelaxDepsHook
+    which
+  ];
+
+  pythonRelaxDeps = [
+    "hydra-core"
+    "omegaconf"
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+    hydra-core
+    omegaconf
+    sacrebleu
+    numpy
+    regex
+    torch
+    tqdm
+    bitarray
+    torchaudio
+    scikit-learn
+    packaging
+  ];
+
+  nativeCheckInputs = [
+    expecttest
+    hypothesis
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "fairseq" ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+    cd tests
+  '';
+
+  pytestFlagsArray = [
+    "--import-mode append"
+  ];
+
+  disabledTests = [
+    # this test requires xformers
+    "test_xformers_single_forward_parity"
+    # this test requires iopath
+    "test_file_io_async"
+    # these tests require network access
+    "test_s2s_transformer_checkpoint"
+    "test_librispeech_s2t_transformer_s_checkpoint"
+    "test_s2s_transformer_checkpoint"
+    "test_waitk_checkpoint"
+    "test_sotasty_es_en_600m_checkpoint"
+    "test_librispeech_s2t_conformer_s_checkpoint"
+  ];
+
+  disabledTestPaths = [
+    # ValueError: mutable default ... for field bar is not allowed: use default_factory
+    "test_dataclass_utils.py"
+  ];
+
+  meta = with lib; {
+    description = "Facebook AI Research Sequence-to-Sequence Toolkit";
+    homepage = "https://github.com/pytorch/fairseq";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fake-useragent/default.nix b/nixpkgs/pkgs/development/python-modules/fake-useragent/default.nix
new file mode 100644
index 000000000000..50c4f5e96837
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fake-useragent/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, importlib-metadata
+, importlib-resources
+, setuptools
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "fake-useragent";
+  version = "1.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fake-useragent";
+    repo = "fake-useragent";
+    rev = "refs/tags/${version}";
+    hash = "sha256-erGX52ipM0scn3snICf6ipjgVbV8/H5xT4GP3AtvOwo=";
+  };
+
+  postPatch = ''
+    sed -i '/addopts/d' pytest.ini
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    importlib-resources
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Up to date simple useragent faker with real world database";
+    homepage = "https://github.com/hellysmile/fake-useragent";
+    changelog = "https://github.com/fake-useragent/fake-useragent/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ evanjs ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/faker/default.nix b/nixpkgs/pkgs/development/python-modules/faker/default.nix
new file mode 100644
index 000000000000..4f0a1e701352
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/faker/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, freezegun
+, pillow
+, pytestCheckHook
+, python-dateutil
+, text-unidecode
+, ukpostcodeparser
+, validators
+}:
+
+buildPythonPackage rec {
+  pname = "faker";
+  version = "19.6.1";
+
+  src = fetchPypi {
+    pname = "Faker";
+    inherit version;
+    hash = "sha256-XWt4gLO+pwgHXd+Rk4QkRT8HBTpZ+PoEU8GHDfb/MpI=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    text-unidecode
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    pillow
+    pytestCheckHook
+    ukpostcodeparser
+    validators
+  ];
+
+  # avoid tests which import random2, an abandoned library
+  pytestFlagsArray = [
+    "--ignore=tests/providers/test_ssn.py"
+  ];
+  pythonImportsCheck = [ "faker" ];
+
+  meta = with lib; {
+    description = "Python library for generating fake user data";
+    homepage = "http://faker.rtfd.org";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lovek323 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fakeredis/default.nix b/nixpkgs/pkgs/development/python-modules/fakeredis/default.nix
new file mode 100644
index 000000000000..b1b1080d20b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fakeredis/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, aioredis
+, buildPythonPackage
+, fetchFromGitHub
+, hypothesis
+, lupa
+, poetry-core
+, pybloom-live
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, redis
+, six
+, sortedcontainers
+}:
+
+buildPythonPackage rec {
+  pname = "fakeredis";
+  version = "2.20.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dsoftwareinc";
+    repo = "fakeredis-py";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-pRvUgK4OXVP2GR+Iu4ddqwApw0gYN4FkKjTpwbC1oWM=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    redis
+    six
+    sortedcontainers
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  passthru.optional-dependencies = {
+    lua = [
+      lupa
+    ];
+    aioredis = [
+      aioredis
+    ];
+    bf = [
+      pybloom-live
+    ];
+  };
+
+  pythonImportsCheck = [
+    "fakeredis"
+  ];
+
+  meta = with lib; {
+    description = "Fake implementation of Redis API";
+    homepage = "https://github.com/dsoftwareinc/fakeredis-py";
+    changelog = "https://github.com/cunla/fakeredis-py/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/falcon/default.nix b/nixpkgs/pkgs/development/python-modules/falcon/default.nix
new file mode 100644
index 000000000000..b0880c384dba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/falcon/default.nix
@@ -0,0 +1,100 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, isPyPy
+, fetchFromGitHub
+
+# build
+, cython
+, setuptools
+
+# tests
+, aiofiles
+, cbor2
+, httpx
+, msgpack
+, mujson
+, orjson
+, pytest-asyncio
+, pytestCheckHook
+, pyyaml
+, rapidjson
+, requests
+, testtools
+, ujson
+, uvicorn
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "falcon";
+  version = "3.1.1";
+  format = "pyproject";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "falconry";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-5Lhz4qI/x7yK9tqQg4CvYNug+fp9l6ErNGH1pVybZ6c=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ] ++ lib.optionals (!isPyPy) [
+    cython
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  preCheck = ''
+    export HOME=$TMPDIR
+    cp -R tests examples $TMPDIR
+    pushd $TMPDIR
+  '';
+
+  postCheck = ''
+    popd
+  '';
+
+  nativeCheckInputs = [
+    # https://github.com/falconry/falcon/blob/master/requirements/tests
+    pytestCheckHook
+    pyyaml
+    requests
+    rapidjson
+    orjson
+
+    # ASGI specific
+    pytest-asyncio
+    aiofiles
+    httpx
+    uvicorn
+    websockets
+
+    # handler specific
+    cbor2
+    msgpack
+    mujson
+    ujson
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    testtools
+  ];
+
+  pytestFlagsArray = [
+    "tests"
+  ];
+
+  disabledTestPaths = [
+    # needs a running server
+    "tests/asgi/test_asgi_servers.py"
+  ];
+
+  meta = with lib; {
+    description = "An unladen web framework for building APIs and app backends";
+    homepage = "https://falconframework.org/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ desiderius ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/faraday-agent-parameters-types/default.nix b/nixpkgs/pkgs/development/python-modules/faraday-agent-parameters-types/default.nix
new file mode 100644
index 000000000000..7e7624020d5f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/faraday-agent-parameters-types/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, marshmallow
+, packaging
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "faraday-agent-parameters-types";
+  version = "1.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "faraday_agent_parameters_types";
+    inherit version;
+    hash = "sha256-yWDZPa9+DZh2Bj9IIeIVFpAt9nhQOk2tTZh02difsCs=";
+  };
+
+  propagatedBuildInputs = [
+    marshmallow
+    packaging
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner",' ""
+  '';
+
+  pythonImportsCheck = [
+    "faraday_agent_parameters_types"
+    "faraday_agent_parameters_types.utils"
+  ];
+
+  disabledTests = [
+    # assert 'Version requested not valid' in "Invalid version: 'hola'"
+    "test_incorrect_version_requested"
+  ];
+
+  meta = with lib; {
+    description = "Collection of Faraday agent parameters types";
+    homepage = "https://github.com/infobyte/faraday_agent_parameters_types";
+    changelog = "https://github.com/infobyte/faraday_agent_parameters_types/blob/${version}/CHANGELOG.md";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/faraday-plugins/default.nix b/nixpkgs/pkgs/development/python-modules/faraday-plugins/default.nix
new file mode 100644
index 000000000000..fb2bcf88fa7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/faraday-plugins/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, click
+, colorama
+, fetchFromGitHub
+, html2text
+, lxml
+, markdown
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pytz
+, requests
+, simplejson
+, tabulate
+}:
+
+buildPythonPackage rec {
+  pname = "faraday-plugins";
+  version = "1.14.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "infobyte";
+    repo = "faraday_plugins";
+    rev = "refs/tags/${version}";
+    hash = "sha256-qFA0AVebHd/Ny8x+rUkueLZhYB/PwL7o/qpUnZCRsEA=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "version=version," "version='${version}',"
+  '';
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    click
+    colorama
+    html2text
+    lxml
+    markdown
+    python-dateutil
+    pytz
+    requests
+    simplejson
+    tabulate
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # faraday itself is currently not available
+    "tests/test_report_collection.py"
+  ];
+
+  disabledTests = [
+    # Fail because of missing faraday
+    "test_detect_report"
+    "test_process_report_summary"
+    # JSON parsing issue
+    "test_process_report_ignore_info"
+    "test_process_report_tags"
+  ];
+
+  pythonImportsCheck = [
+    "faraday_plugins"
+  ];
+
+  meta = with lib; {
+    description = "Security tools report parsers for Faraday";
+    homepage = "https://github.com/infobyte/faraday_plugins";
+    changelog = "https://github.com/infobyte/faraday_plugins/releases/tag/${version}";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/farama-notifications/default.nix b/nixpkgs/pkgs/development/python-modules/farama-notifications/default.nix
new file mode 100644
index 000000000000..eb449b53c1c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/farama-notifications/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "farama-notifications";
+  version = "0.0.4";
+
+  src = fetchFromGitHub {
+    owner = "Farama-Foundation";
+    repo = pname;
+    rev = version;
+    hash = "sha256-UUrJ/5t5x54xs1gweNUhwqrMJQXiyrUPn1bBfTsiPcw=";
+  };
+
+  format = "pyproject";
+
+  nativeBuildInputs = [ setuptools ];
+
+  pythonImportsCheck = [ "farama_notifications" ];
+
+  meta = with lib; {
+    description = "Allows for providing notifications on import to all Farama Packages";
+    homepage = "https://github.com/Farama-Foundation/Farama-Notifications";
+    license = licenses.mit;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/farm-haystack/default.nix b/nixpkgs/pkgs/development/python-modules/farm-haystack/default.nix
new file mode 100644
index 000000000000..afee9c60f894
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/farm-haystack/default.nix
@@ -0,0 +1,290 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonRelaxDepsHook
+, hatchling
+, boilerpy3
+, events
+, httpx
+, jsonschema
+, lazy-imports
+, more-itertools
+, networkx
+, pandas
+, pillow
+, platformdirs
+, posthog
+, prompthub-py
+, pydantic
+, quantulum3
+, rank-bm25
+, requests
+, requests-cache
+, scikit-learn
+, sseclient-py
+, tenacity
+, tiktoken
+, tqdm
+, transformers
+, openai-whisper
+, boto3
+, botocore
+# , beir
+, selenium
+, coverage
+, dulwich
+# , jupytercontrib
+, mkdocs
+, mypy
+, pre-commit
+, psutil
+# , pydoc-markdown
+, pylint
+, pytest
+, pytest-asyncio
+, pytest-cov
+# , pytest-custom-exit-code
+, python-multipart
+, reno
+, responses
+, toml
+, tox
+, watchdog
+, elastic-transport
+, elasticsearch
+# , azure-ai-formrecognizer
+, beautifulsoup4
+, markdown
+, python-docx
+, python-frontmatter
+, python-magic
+, tika
+, black
+, huggingface-hub
+, sentence-transformers
+, mlflow
+, rapidfuzz
+, scipy
+, seqeval
+, pdf2image
+, pytesseract
+, faiss
+# , faiss-gpu
+, pinecone-client
+, onnxruntime
+, onnxruntime-tools
+# , onnxruntime-gpu
+, opensearch-py
+, pymupdf
+, langdetect
+, nltk
+, canals
+, jinja2
+, openai
+, aiorwlock
+, ray
+, psycopg2
+, sqlalchemy
+, sqlalchemy-utils
+, weaviate-client
+}:
+
+buildPythonPackage rec {
+  pname = "farm-haystack";
+  version = "1.22.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "deepset-ai";
+    repo = "haystack";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-0tRgZqySM9vPhs5lar89Gz/G7/YgRuFZosgTdKuGBH0=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+    pythonRelaxDepsHook
+  ];
+
+  pythonRemoveDeps = [
+    # We call it faiss, not faiss-cpu.
+    "faiss-cpu"
+  ];
+
+  propagatedBuildInputs = [
+    boilerpy3
+    events
+    httpx
+    jsonschema
+    lazy-imports
+    more-itertools
+    networkx
+    pandas
+    pillow
+    platformdirs
+    posthog
+    prompthub-py
+    pydantic
+    quantulum3
+    rank-bm25
+    requests
+    requests-cache
+    scikit-learn
+    sseclient-py
+    tenacity
+    tiktoken
+    tqdm
+    transformers
+  ];
+
+  env.HOME = "$(mktemp -d)";
+
+  passthru.optional-dependencies = {
+    # all = [
+    #   farm-haystack
+    # ];
+    # all-gpu = [
+    #   farm-haystack
+    # ];
+    audio = [
+      openai-whisper
+    ];
+    aws = [
+      boto3
+      botocore
+    ];
+    # beir = [
+    #   beir
+    # ];
+    colab = [
+      pillow
+    ];
+    crawler = [
+      selenium
+    ];
+    dev = [
+      coverage
+      dulwich
+      # jupytercontrib
+      mkdocs
+      mypy
+      pre-commit
+      psutil
+      # pydoc-markdown
+      pylint
+      pytest
+      pytest-asyncio
+      pytest-cov
+      # pytest-custom-exit-code
+      python-multipart
+      reno
+      responses
+      toml
+      tox
+      watchdog
+    ];
+    elasticsearch7 = [
+      elastic-transport
+      elasticsearch
+    ];
+    elasticsearch8 = [
+      elastic-transport
+      elasticsearch
+    ];
+    file-conversion = [
+      # azure-ai-formrecognizer
+      beautifulsoup4
+      markdown
+      python-docx
+      python-frontmatter
+      python-magic
+      # python-magic-bin
+      tika
+    ];
+    formatting = [
+      black
+    ];
+    inference = [
+      huggingface-hub
+      sentence-transformers
+      transformers
+    ];
+    metrics = [
+      mlflow
+      rapidfuzz
+      scipy
+      seqeval
+    ];
+    ocr = [
+      pdf2image
+      pytesseract
+    ];
+    only-faiss = [
+      faiss
+    ];
+    # only-faiss-gpu = [
+    #   faiss-gpu
+    # ];
+    only-pinecone = [
+      pinecone-client
+    ];
+    onnx = [
+      onnxruntime
+      onnxruntime-tools
+    ];
+    # onnx-gpu = [
+    #   onnxruntime-gpu
+    #   onnxruntime-tools
+    # ];
+    opensearch = [
+      opensearch-py
+    ];
+    pdf = [
+      pymupdf
+    ];
+    preprocessing = [
+      langdetect
+      nltk
+    ];
+    preview = [
+      canals
+      jinja2
+      lazy-imports
+      openai
+      pandas
+      rank-bm25
+      requests
+      tenacity
+      tqdm
+    ];
+    ray = [
+      aiorwlock
+      ray
+    ];
+    sql = [
+      psycopg2
+      sqlalchemy
+      sqlalchemy-utils
+    ];
+    weaviate = [
+      weaviate-client
+    ];
+  };
+
+  # the setup for test is intensive, hopefully can be done at some point
+  doCheck = false;
+
+
+  pythonImportsCheck = [ "haystack" ];
+
+  meta = with lib; {
+    description = "LLM orchestration framework to build customizable, production-ready LLM applications";
+    longDescription = ''
+    LLM orchestration framework to build customizable, production-ready LLM applications. Connect components (models, vector DBs, file converters) to pipelines or agents that can interact with your data. With advanced retrieval methods, it's best suited for building RAG, question answering, semantic search or conversational agent chatbots
+    '';
+    changelog = "https://github.com/deepset-ai/haystack/releases/tag/${src.rev}";
+    homepage = "https://github.com/deepset-ai/haystack";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fast-histogram/default.nix b/nixpkgs/pkgs/development/python-modules/fast-histogram/default.nix
new file mode 100644
index 000000000000..fd00ff5df8e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fast-histogram/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, pytestCheckHook
+, fetchFromGitHub
+, python
+, pythonOlder
+, setuptools
+, setuptools-scm
+, numpy
+, wheel
+, hypothesis
+, pytest-cov
+}:
+
+buildPythonPackage rec {
+  pname = "fast-histogram";
+  version = "0.12";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "astrofrog";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-Cz4BgbtxbUPxL2NSzvZYjbYIN4KUuliUV0bXRRtyvfM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [ numpy ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    hypothesis
+    pytest-cov
+  ];
+
+  pytestFlagsArray = [ "${builtins.placeholder "out"}/${python.sitePackages}" ];
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  pythonImportsCheck = [ "fast_histogram" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/astrofrog/fast-histogram";
+    description = "Fast 1D and 2D histogram functions in Python";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ifurther ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fastai/default.nix b/nixpkgs/pkgs/development/python-modules/fastai/default.nix
new file mode 100644
index 000000000000..cb2ee2cc2692
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastai/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fastprogress
+, fastcore
+, fastdownload
+, torch
+, torchvision
+, matplotlib
+, pillow
+, scikit-learn
+, scipy
+, spacy
+, pandas
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fastai";
+  version = "2.7.13";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-q1KBBAAKrTzq6USRwBjvT23mXpjQT2gjBsxuZ4w54rY=";
+  };
+
+  propagatedBuildInputs = [
+    fastprogress
+    fastcore
+    fastdownload
+    torchvision
+    matplotlib
+    pillow
+    scikit-learn
+    scipy
+    spacy
+    pandas
+    requests
+  ];
+
+  doCheck = false;
+  pythonImportsCheck = [ "fastai" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/fastai/fastai";
+    description = "The fastai deep learning library";
+    changelog = "https://github.com/fastai/fastai/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ rxiao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fastapi-mail/default.nix b/nixpkgs/pkgs/development/python-modules/fastapi-mail/default.nix
new file mode 100644
index 000000000000..52d3c4435724
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastapi-mail/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, aioredis
+, aiosmtplib
+, blinker
+, buildPythonPackage
+, email-validator
+, fakeredis
+, fastapi
+, fetchFromGitHub
+, httpx
+, jinja2
+, poetry-core
+, pydantic
+, pytest-asyncio
+, pytestCheckHook
+, python-multipart
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fastapi-mail";
+  version = "1.3.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "sabuhish";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-m8d4y75+mSh9A+YVaV/yZhN3ckOe2mV1jdtfeNFtU/w=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'version = "1.2.5"' 'version = "${version}"' \
+      --replace 'aiosmtplib = "^2.0"' 'aiosmtplib = "*"' \
+      --replace 'pydantic = "^1.8"' 'pydantic = "*"' \
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aioredis
+    aiosmtplib
+    blinker
+    email-validator
+    fakeredis
+    fastapi
+    httpx
+    jinja2
+    pydantic
+    python-multipart
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests require access to /etc/resolv.conf
+    "test_default_checker"
+    "test_redis_checker"
+  ];
+
+  pythonImportsCheck = [
+    "fastapi_mail"
+  ];
+
+  meta = with lib; {
+    description = "Module for sending emails and attachments";
+    homepage = "https://github.com/sabuhish/fastapi-mail";
+    changelog = "https://github.com/sabuhish/fastapi-mail/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fastapi/default.nix b/nixpkgs/pkgs/development/python-modules/fastapi/default.nix
new file mode 100644
index 000000000000..428cf9f8d91d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastapi/default.nix
@@ -0,0 +1,127 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build-system
+, hatchling
+
+# dependencies
+, starlette
+, pydantic
+, typing-extensions
+
+# tests
+, dirty-equals
+, flask
+, passlib
+, pytest-asyncio
+, pytestCheckHook
+, python-jose
+, sqlalchemy
+, trio
+
+# optional-dependencies
+, httpx
+, jinja2
+, python-multipart
+, itsdangerous
+, pyyaml
+, ujson
+, orjson
+, email-validator
+, uvicorn
+}:
+
+buildPythonPackage rec {
+  pname = "fastapi";
+  version = "0.103.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tiangolo";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-2J8c3S4Ca+c5bI0tyjMJArJKux9qPmu+ohqve5PhSGI=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    starlette
+    pydantic
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies.all = [
+    httpx
+    jinja2
+    python-multipart
+    itsdangerous
+    pyyaml
+    ujson
+    orjson
+    email-validator
+    uvicorn
+    # pydantic-settings
+    # pydantic-extra-types
+  ] ++ uvicorn.optional-dependencies.standard;
+
+  nativeCheckInputs = [
+    dirty-equals
+    flask
+    passlib
+    pytestCheckHook
+    pytest-asyncio
+    python-jose
+    trio
+    sqlalchemy
+  ] ++ passthru.optional-dependencies.all
+  ++ python-jose.optional-dependencies.cryptography;
+
+  pytestFlagsArray = [
+    # ignoring deprecation warnings to avoid test failure from
+    # tests/test_tutorial/test_testing/test_tutorial001.py
+    "-W ignore::DeprecationWarning"
+  ];
+
+  disabledTestPaths = [
+    # Disabled tests require orjson which requires rust nightly
+    "tests/test_default_response_class.py"
+    # Don't test docs and examples
+    "docs_src"
+    # databases is incompatible with SQLAlchemy 2.0
+    "tests/test_tutorial/test_async_sql_databases"
+    "tests/test_tutorial/test_sql_databases"
+  ];
+
+  disabledTests = [
+    "test_get_custom_response"
+    # Failed: DID NOT RAISE <class 'starlette.websockets.WebSocketDisconnect'>
+    "test_websocket_invalid_data"
+    "test_websocket_no_credentials"
+    # TypeError: __init__() missing 1...starlette-releated
+    "test_head"
+    "test_options"
+    "test_trace"
+    # Unexpected number of warnings caught
+    "test_warn_duplicate_operation_id"
+    # assert state["except"] is True
+    "test_dependency_gets_exception"
+  ];
+
+  pythonImportsCheck = [
+    "fastapi"
+  ];
+
+  meta = with lib; {
+    description = "Web framework for building APIs";
+    homepage = "https://github.com/tiangolo/fastapi";
+    license = licenses.mit;
+    maintainers = with maintainers; [ wd15 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fastavro/default.nix b/nixpkgs/pkgs/development/python-modules/fastavro/default.nix
new file mode 100644
index 000000000000..54a475c08b01
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastavro/default.nix
@@ -0,0 +1,76 @@
+{ buildPythonPackage
+, cython
+, fetchFromGitHub
+, isPy38
+, lib
+, lz4
+, numpy
+, pandas
+, pytestCheckHook
+, python-dateutil
+, python-snappy
+, pythonOlder
+, zstandard
+}:
+
+buildPythonPackage rec {
+  pname = "fastavro";
+  version = "1.8.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-W+fFZAQU7W6gDqB6LOrG8se6mBATFZWmepTt1HSphbE=";
+  };
+
+  preBuild = ''
+    export FASTAVRO_USE_CYTHON=1
+  '';
+
+  nativeBuildInputs = [ cython ];
+
+  passthru.optional-dependencies = {
+    codecs = [
+      lz4
+      python-snappy
+      zstandard
+    ];
+    snappy = [
+      python-snappy
+    ];
+    zstandard = [
+      zstandard
+    ];
+    lz4 = [
+      lz4
+    ];
+  };
+
+  nativeCheckInputs = [
+    numpy
+    pandas
+    pytestCheckHook
+    python-dateutil
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  # Fails with "AttributeError: module 'fastavro._read_py' has no attribute
+  # 'CYTHON_MODULE'." Doesn't appear to be serious. See https://github.com/fastavro/fastavro/issues/112#issuecomment-387638676.
+  disabledTests = [ "test_cython_python" ];
+
+  # CLI tests are broken on Python 3.8. See https://github.com/fastavro/fastavro/issues/558.
+  disabledTestPaths = lib.optionals isPy38 [ "tests/test_main_cli.py" ];
+
+  pythonImportsCheck = [ "fastavro" ];
+
+  meta = with lib; {
+    description = "Fast read/write of AVRO files";
+    homepage = "https://github.com/fastavro/fastavro";
+    changelog = "https://github.com/fastavro/fastavro/blob/${version}/ChangeLog";
+    license = licenses.mit;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fastbencode/default.nix b/nixpkgs/pkgs/development/python-modules/fastbencode/default.nix
new file mode 100644
index 000000000000..82522db24ae2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastbencode/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, pythonOlder
+, cython
+}:
+
+buildPythonPackage rec {
+  pname = "fastbencode";
+  version = "0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-V465xHANZwXXH7yNfVe8os2Yfsos7B2ed7ngcC2x5W8=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  pythonImportsCheck = [
+    "fastbencode"
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest fastbencode.tests.test_suite
+  '';
+
+  meta = with lib; {
+    description = "Fast implementation of bencode";
+    homepage = "https://github.com/breezy-team/fastbencode";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fastcache/default.nix b/nixpkgs/pkgs/development/python-modules/fastcache/default.nix
new file mode 100644
index 000000000000..37a8b1f1a67e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastcache/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, pytest }:
+
+buildPythonPackage rec {
+  pname = "fastcache";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0avqpswfmw5b08xx3ib6zchc5bis390fn1v74vg7nnrkf1pb3qbd";
+  };
+
+  nativeCheckInputs = [ pytest ];
+
+  meta = with lib; {
+    description = "C implementation of Python3 lru_cache for Python 2 and 3";
+    homepage = "https://github.com/pbrady/fastcache";
+    license = licenses.mit;
+    maintainers = [ maintainers.bhipple ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fastcore/default.nix b/nixpkgs/pkgs/development/python-modules/fastcore/default.nix
new file mode 100644
index 000000000000..544bb26936d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastcore/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, packaging
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fastcore";
+  version = "1.5.29";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "fastai";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-yCPOF150TdkPHfLl8Jo2oow+91IzRKgnXo3eQMn5wK0=";
+  };
+
+  propagatedBuildInputs = [
+    packaging
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "fastcore"
+  ];
+
+  meta = with lib; {
+    description = "Python module for Fast AI";
+    homepage = "https://github.com/fastai/fastcore";
+    changelog = "https://github.com/fastai/fastcore/blob/${version}/CHANGELOG.md";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fastdiff/default.nix b/nixpkgs/pkgs/development/python-modules/fastdiff/default.nix
new file mode 100644
index 000000000000..a2b4b9c76be0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastdiff/default.nix
@@ -0,0 +1,55 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, wasmer
+, wasmer-compiler-cranelift
+, py
+, pytestCheckHook
+, pytest-benchmark
+}:
+
+buildPythonPackage rec {
+  pname = "fastdiff";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4dfa09c47832a8c040acda3f1f55fc0ab4d666f0e14e6951e6da78d59acd945a";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'pytest-runner' ""
+    substituteInPlace setup.cfg \
+      --replace "collect_ignore = ['setup.py']" ""
+  '';
+
+  propagatedBuildInputs = [
+    wasmer
+    wasmer-compiler-cranelift
+  ];
+
+  nativeCheckInputs = [
+    py
+    pytestCheckHook
+    pytest-benchmark
+  ];
+
+  pytestFlagsArray = [
+    "--benchmark-skip"
+  ];
+
+  pythonImportsCheck = [
+    "fastdiff"
+  ];
+
+  meta = with lib; {
+    description = "A fast native implementation of diff algorithm with a pure Python fallback";
+    homepage = "https://github.com/syrusakbary/fastdiff";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+    # resulting compiled object panics at import
+    broken = stdenv.is32bit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fastdownload/default.nix b/nixpkgs/pkgs/development/python-modules/fastdownload/default.nix
new file mode 100644
index 000000000000..934ce6861ad6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastdownload/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fastprogress
+, fastcore
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fastdownload";
+  version = "0.0.7";
+  format = "setuptools";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-IFB+246JQGofvXd15uKj2BpN1jPdUGsOnPDhYT6DHWo=";
+  };
+
+  propagatedBuildInputs = [ fastprogress fastcore ];
+
+  # no real tests
+  doCheck = false;
+  pythonImportsCheck = [ "fastdownload" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/fastai/fastdownload";
+    description = "Easily download, verify, and extract archives";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ rxiao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fastdtw/default.nix b/nixpkgs/pkgs/development/python-modules/fastdtw/default.nix
new file mode 100644
index 000000000000..1ceaf3b875a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastdtw/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, cython
+, numpy
+  # Check Inputs
+, pytestCheckHook
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "fastdtw";
+  version = "0.3.4";
+
+  src = fetchFromGitHub {
+    owner = "slaypni";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0irc5x4ahfp7f7q4ic97qa898s2awi0vdjznahxrfjirn8b157dw";
+  };
+
+  patches = [
+    # Removes outdated cythonized C++ file, which doesn't match CPython. Will be auto-used if left.
+    # Remove when PR 40 merged
+    (fetchpatch {
+      url = "https://patch-diff.githubusercontent.com/raw/slaypni/fastdtw/pull/40.patch";
+      sha256 = "0xjma0h84bk1n32wgk99rwfc85scp187a7fykhnylmcc73ppal9q";
+    })
+  ];
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  pythonImportsCheck = [ "fastdtw.fastdtw" ];
+  nativeCheckInputs = [ pytestCheckHook ];
+  dontUseSetuptoolsCheck = true;  # looks for pytest-runner
+  preCheck = ''
+    echo "Temporarily moving tests to $OUT to find cython modules"
+    export PACKAGEDIR=$out/${python.sitePackages}
+    cp -r $TMP/source/tests $PACKAGEDIR
+    pushd $PACKAGEDIR
+  '';
+  postCheck = ''
+    rm -rf tests
+    popd
+  '';
+
+
+  meta = with lib; {
+    description = "Python implementation of FastDTW (Dynamic Time Warping)";
+    longDescription = ''
+      FastDTW is an approximate Dynamic Time Warping (DTW) algorithm that provides
+      optimal or near-optimal alignments with an O(N) time and memory complexity.
+    '';
+    homepage = "https://github.com/slaypni/fastdtw";
+    license = licenses.mit;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fastecdsa/default.nix b/nixpkgs/pkgs/development/python-modules/fastecdsa/default.nix
new file mode 100644
index 000000000000..bd1a8c673e42
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastecdsa/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, gmp
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fastecdsa";
+  version = "2.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8ZjORPaUbKuwKYip9J0U78QQ26XiEemDIbqdhzeyP/g=";
+  };
+
+  buildInputs = [
+    gmp
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # skip tests which require being online to download test vectors
+    "fastecdsa/tests/test_wycheproof_vectors.py"
+    "fastecdsa/tests/test_rfc6979_ecdsa.py"
+  ];
+
+  # skip tests for now, they fail with
+  # ImportError: cannot import name '_ecdsa' from 'fastecdsa'
+  # but the installed package works just fine
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "fastecdsa"
+  ];
+
+  meta = with lib; {
+    description = "Fast elliptic curve digital signatures";
+    homepage = "https://github.com/AntonKueltz/fastecdsa";
+    changelog = "https://github.com/AntonKueltz/fastecdsa/blob/v${version}/CHANGELOG.md";
+    license = licenses.unlicense;
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fastembed/default.nix b/nixpkgs/pkgs/development/python-modules/fastembed/default.nix
new file mode 100644
index 000000000000..f9b3f71e1ce7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastembed/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, poetry-core
+, onnxruntime
+, requests
+, tokenizers
+, tqdm
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "fastembed";
+  version = "0.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "qdrant";
+    repo = "fastembed";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-d7Zb0IL0NOPEPsCHe/ZMNELnSCG4+y8JmGAXnCRUd50=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    onnxruntime
+    requests
+    tokenizers
+    tqdm
+  ];
+
+  pythonImportsCheck = [ "fastembed" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # there is one test and it requires network
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Fast, Accurate, Lightweight Python library to make State of the Art Embedding";
+    homepage = "https://github.com/qdrant/fastembed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fasteners/default.nix b/nixpkgs/pkgs/development/python-modules/fasteners/default.nix
new file mode 100644
index 000000000000..38d09c47705c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fasteners/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, diskcache
+, eventlet
+, fetchFromGitHub
+, more-itertools
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "fasteners";
+  version = "0.18";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "harlowja";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-FGcGGRfObOqXuURyEuNt/KDn51POpdNPUJJKtMcLJNI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    diskcache
+    eventlet
+    more-itertools
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "fasteners"
+  ];
+
+  pytestFlagsArray = [
+    "tests/"
+  ];
+
+  meta = with lib; {
+    description = "Module that provides useful locks";
+    homepage = "https://github.com/harlowja/fasteners";
+    changelog = "https://github.com/harlowja/fasteners/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fastentrypoints/default.nix b/nixpkgs/pkgs/development/python-modules/fastentrypoints/default.nix
new file mode 100644
index 000000000000..7671feb359f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastentrypoints/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "fastentrypoints";
+  version = "0.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "02s1j8i2dzbpbwgq2a3fiqwm3cnmhii2qzc0k42l0rdxd4a4ya7z";
+  };
+
+  meta = with lib; {
+    description = "Makes entry_points specified in setup.py load more quickly";
+    homepage = "https://github.com/ninjaaron/fast-entry_points";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ nixy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/faster-fifo/default.nix b/nixpkgs/pkgs/development/python-modules/faster-fifo/default.nix
new file mode 100644
index 000000000000..1d77707b6aa5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/faster-fifo/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, cython
+, setuptools
+
+# tests
+, numpy
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "faster-fifo";
+  version = "1.4.5";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "alex-petrenko";
+    repo = "faster-fifo";
+    rev = "v${version}";
+    hash = "sha256-35kD+RWXwUXHG5leTVj4wY6hJAjDka69YczgSTIbCeg=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    setuptools
+  ];
+
+  pythonImportsCheck = [
+    "faster_fifo"
+  ];
+
+  nativeCheckInputs = [
+    numpy
+    unittestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Faster alternative to Python's multiprocessing.Queue (IPC FIFO queue";
+    homepage = "https://github.com/alex-petrenko/faster-fifo";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/faster-whisper/default.nix b/nixpkgs/pkgs/development/python-modules/faster-whisper/default.nix
new file mode 100644
index 000000000000..30f2174ff7da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/faster-whisper/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# dependencies
+, av
+, ctranslate2
+, huggingface-hub
+, onnxruntime
+, tokenizers
+
+# tests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "faster-whisper";
+  version = "0.9.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "guillaumekln";
+    repo = "faster-whisper";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-kHXX5Z4r7+lFRBtTCsPy9DILwsk3T1mcBzmJnCrKTdk=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "onnxruntime>=1.14,<2" "onnxruntime"
+  '';
+
+  propagatedBuildInputs = [
+    av
+    ctranslate2
+    huggingface-hub
+    onnxruntime
+    tokenizers
+  ];
+
+  pythonImportsCheck = [
+    "faster_whisper"
+  ];
+
+  # all tests require downloads
+  doCheck = false;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  meta = with lib; {
+    changelog = "https://github.com/guillaumekln/faster-whisper/releases/tag/v${version}";
+    description = "Faster Whisper transcription with CTranslate2";
+    homepage = "https://github.com/guillaumekln/faster-whisper";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fastimport/default.nix b/nixpkgs/pkgs/development/python-modules/fastimport/default.nix
new file mode 100644
index 000000000000..9f7219925a7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastimport/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchPypi
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "fastimport";
+  version = "0.9.14";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6ac99dda4e7b0b3ae831507b6d0094802e6dd95891feafde8cc5c405b6c149ca";
+  };
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  pythonImportsCheck = [ "fastimport" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jelmer/python-fastimport";
+    description = "VCS fastimport/fastexport parser";
+    maintainers = with maintainers; [ koral ];
+    license = licenses.gpl2Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fastjsonschema/default.nix b/nixpkgs/pkgs/development/python-modules/fastjsonschema/default.nix
new file mode 100644
index 000000000000..8c1be492ec15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastjsonschema/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fastjsonschema";
+  version = "2.16.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "horejsek";
+    repo = "python-fastjsonschema";
+    rev = "v${version}";
+    fetchSubmodules = true;
+    hash = "sha256-Gojayel/xQ5gRI0nbwsroeSMdRndjb+8EniX1Qs4nbg=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  dontUseSetuptoolsCheck = true;
+
+  disabledTests = [
+    "benchmark"
+    # these tests require network access
+    "remote ref"
+    "definitions"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_compile_to_code_custom_format"  # cannot import temporary module created during test
+  ];
+
+  pythonImportsCheck = [
+    "fastjsonschema"
+  ];
+
+  meta = with lib; {
+    description = "JSON schema validator for Python";
+    homepage = "https://horejsek.github.io/python-fastjsonschema/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fastnumbers/default.nix b/nixpkgs/pkgs/development/python-modules/fastnumbers/default.nix
new file mode 100644
index 000000000000..7be3e25698ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastnumbers/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, hypothesis
+, numpy
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "fastnumbers";
+  version = "5.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "SethMMorton";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-y9QnFh44zHC+CSlYtKPmkhLSFBUquYZv4qP/pQxu9e0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  # Tests fail due to numeric precision differences on ARM
+  # See https://github.com/SethMMorton/fastnumbers/issues/28
+  doCheck = !stdenv.hostPlatform.isAarch;
+
+  nativeCheckInputs = [
+    hypothesis
+    numpy
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--hypothesis-profile=standard"
+  ];
+
+  pythonImportsCheck = [
+    "fastnumbers"
+  ];
+
+  meta = with lib; {
+    description = "Python module for number conversion";
+    homepage = "https://github.com/SethMMorton/fastnumbers";
+    changelog = "https://github.com/SethMMorton/fastnumbers/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fastpair/default.nix b/nixpkgs/pkgs/development/python-modules/fastpair/default.nix
new file mode 100644
index 000000000000..57be00cb91bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastpair/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, scipy
+, pythonOlder
+}:
+
+buildPythonPackage {
+  pname = "fastpair";
+  version = "unstable-2021-05-19";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "carsonfarmer";
+    repo = "fastpair";
+    rev = "d3170fd7e4d6e95312e7e1cb02e84077a3f06379";
+    hash = "sha256-vSb6o0XvHlzev2+uQKUI66wM39ZNqDsppEc8rlB+H9E=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner",' ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  propagatedBuildInputs = [
+    scipy
+  ];
+
+  meta = with lib; {
+    description = "Data-structure for the dynamic closest-pair problem";
+    homepage = "https://github.com/carsonfarmer/fastpair";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cmcdragonkai rakesh4g ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fastparquet/default.nix b/nixpkgs/pkgs/development/python-modules/fastparquet/default.nix
new file mode 100644
index 000000000000..05cb76f1dd48
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastparquet/default.nix
@@ -0,0 +1,95 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, cython
+, oldest-supported-numpy
+, setuptools
+, setuptools-scm
+, numpy
+, pandas
+, cramjam
+, fsspec
+, thrift
+, python-lzo
+, pytestCheckHook
+, pythonOlder
+, packaging
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "fastparquet";
+  version = "2023.7.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dask";
+    repo = pname;
+    rev = version;
+    hash = "sha256-pJ0zK0upEV7TyuNMIcozugkwBlYpK/Dg6BdB0kBpn9k=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    cython
+    oldest-supported-numpy
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"pytest-runner"' ""
+
+    sed -i \
+      -e "/pytest-runner/d" \
+      -e '/"git", "status"/d' setup.py
+  '';
+
+  propagatedBuildInputs = [
+    cramjam
+    fsspec
+    numpy
+    pandas
+    thrift
+    packaging
+  ];
+
+  passthru.optional-dependencies = {
+    lzo = [
+      python-lzo
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Workaround https://github.com/NixOS/nixpkgs/issues/123561
+  preCheck = ''
+    mv fastparquet/test .
+    rm -r fastparquet
+    fastparquet_test="$out"/${python.sitePackages}/fastparquet/test
+    ln -s `pwd`/test "$fastparquet_test"
+  '';
+
+  postCheck = ''
+    rm "$fastparquet_test"
+  '';
+
+  pythonImportsCheck = [
+    "fastparquet"
+  ];
+
+  meta = with lib; {
+    description = "A python implementation of the parquet format";
+    homepage = "https://github.com/dask/fastparquet";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fastpbkdf2/default.nix b/nixpkgs/pkgs/development/python-modules/fastpbkdf2/default.nix
new file mode 100644
index 000000000000..ef6e0462c353
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastpbkdf2/default.nix
@@ -0,0 +1,27 @@
+{ lib, fetchFromGitHub, buildPythonPackage
+, openssl, pytest, cffi, six }:
+
+buildPythonPackage rec {
+  pname = "fastpbkdf2";
+  version = "0.2";
+
+  # Fetching from GitHub as tests are missing in PyPI
+  src = fetchFromGitHub {
+    owner  = "Ayrx";
+    repo   = "python-fastpbkdf2";
+    rev    = "v${version}";
+    sha256 = "1hvvlk3j28i6nswb6gy3mq7278nq0mgfnpxh1rv6jvi7xhd7qmlc";
+  };
+
+  buildInputs = [ openssl ];
+  nativeCheckInputs = [ pytest ];
+  propagatedBuildInputs = [ cffi six ];
+  propagatedNativeBuildInputs = [ cffi ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Ayrx/python-fastpbkdf2";
+    description = "Python bindings for fastpbkdf2";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jqueiroz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fastprogress/default.nix b/nixpkgs/pkgs/development/python-modules/fastprogress/default.nix
new file mode 100644
index 000000000000..6ea456bac53a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastprogress/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fastprogress";
+  version = "1.0.3";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ehfStDiJD4OMBI7vzjLE3tRxl+zI6gQs7MM9PeuAIvU=";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  # no real tests
+  doCheck = false;
+  pythonImportsCheck = [ "fastprogress" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/fastai/fastprogress";
+    description = "Simple and flexible progress bar for Jupyter Notebook and console";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ris ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fastrlock/default.nix b/nixpkgs/pkgs/development/python-modules/fastrlock/default.nix
new file mode 100644
index 000000000000..26da544933d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fastrlock/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fastrlock";
+  version = "0.8.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "scoder";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-2h+rhP/EVMG3IkJVkE74p4GeBTwV3BS7fUkKpwedr2k=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  # Todo: Check why the tests have an import error
+  doCheck = false;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "fastrlock"
+  ];
+
+  meta = with lib; {
+    description = "RLock implementation for CPython";
+    homepage = "https://github.com/scoder/fastrlock";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hyphon81 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fasttext-predict/default.nix b/nixpkgs/pkgs/development/python-modules/fasttext-predict/default.nix
new file mode 100644
index 000000000000..f1d56ef7185f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fasttext-predict/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pybind11
+}:
+
+buildPythonPackage rec {
+  pname = "fasttext-predict";
+  version = "0.9.2.2";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rMbf09pCHvVYI9g/aq74+PcsuU2LezpmDz4b/w9vRyc=";
+  };
+
+  nativeBuildInputs = [
+    pybind11
+  ];
+
+  # tests are removed from fork
+  doCheck = false;
+
+  pythonImportsCheck = [ "fasttext" ];
+
+  meta = with lib; {
+    description = "fasttext with wheels and no external dependency, but only the predict method (<1MB)";
+    homepage = "https://github.com/searxng/fasttext-predict/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+    # ImportError: dynamic module does not define module export function (PyInit_fasttext_pybind)
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fasttext/default.nix b/nixpkgs/pkgs/development/python-modules/fasttext/default.nix
new file mode 100644
index 000000000000..c360c364d8b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fasttext/default.nix
@@ -0,0 +1,22 @@
+{lib, buildPythonPackage, numpy, pkgs, pybind11 }:
+
+buildPythonPackage rec {
+  inherit (pkgs.fasttext) pname version src;
+
+  buildInputs = [ pybind11 ];
+
+  pythonImportsCheck = [ "fasttext" ];
+
+  propagatedBuildInputs = [ numpy ];
+
+  preBuild = ''
+    HOME=$TMPDIR
+  '';
+
+  meta = with lib; {
+    description = "Python module for text classification and representation learning";
+    homepage = "https://fasttext.cc/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/faulthandler/disable-env-test.patch b/nixpkgs/pkgs/development/python-modules/faulthandler/disable-env-test.patch
new file mode 100644
index 000000000000..5824652f6175
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/faulthandler/disable-env-test.patch
@@ -0,0 +1,13 @@
+diff --git a/tests.py b/tests.py
+index e5a2811..16e7a0f 100644
+--- a/tests.py
++++ b/tests.py
+@@ -394,7 +394,7 @@ class FaultHandlerTests(unittest.TestCase):
+             print(faulthandler.is_enabled())
+             """,
+             env=dict(os.environ, PYTHONFAULTHANDLER='x'))
+-        self.assertEqual(output, ["True"])
++        #self.assertEqual(output, ["True"])
+         self.assertEqual(exitcode, 0)
+ 
+         output, exitcode = self.get_output("""
diff --git a/nixpkgs/pkgs/development/python-modules/faust-cchardet/default.nix b/nixpkgs/pkgs/development/python-modules/faust-cchardet/default.nix
new file mode 100644
index 000000000000..6ee8b07137ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/faust-cchardet/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, pkgconfig
+, setuptools
+, wheel
+, pytestCheckHook
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "faust-cchardet";
+  version = "2.1.19";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "faust-streaming";
+    repo = "cChardet";
+    rev = "refs/tags/v${version}";
+    fetchSubmodules = true;
+    hash = "sha256-yY6YEhXC4S47rxnkKAta4m16IVGn7gkHSt056bYOYJ4=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    pkgconfig
+    setuptools
+    wheel
+  ];
+
+  postFixup = ''
+    # fake cchardet distinfo, so packages that depend on cchardet
+    # accept it as a drop-in replacement
+    ln -s $out/${python.sitePackages}/{faust_,}cchardet-${version}.dist-info
+  '';
+
+  pythonImportsCheck = [
+    "cchardet"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = {
+    changelog = "https://github.com/faust-streaming/cChardet/blob/${src.rev}/CHANGES.rst";
+    description = "High-speed universal character encoding detector";
+    homepage = "https://github.com/faust-streaming/cChardet";
+    license = lib.licenses.mpl11;
+    maintainers = with lib.maintainers; [ dotlambda ivan ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/favicon/default.nix b/nixpkgs/pkgs/development/python-modules/favicon/default.nix
new file mode 100644
index 000000000000..1b42710b16fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/favicon/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "favicon";
+  version = "0.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bWtaeN4qDQCEWJ9ofzhLLs1qZScJP+xWRAOxowYF16g=";
+  };
+
+  postPatch = ''
+    sed -i "/pytest-runner/d" setup.py
+  '';
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pythonImportsCheck = [
+    "favicon"
+  ];
+
+  meta = with lib; {
+    description = "Find a website's favicon";
+    homepage = "https://github.com/scottwernervt/favicon";
+    changelog = "https://github.com/scottwernervt/favicon/blob/${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ elohmeier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fb-re2/default.nix b/nixpkgs/pkgs/development/python-modules/fb-re2/default.nix
new file mode 100644
index 000000000000..df494068c444
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fb-re2/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, re2
+}:
+
+buildPythonPackage rec {
+  pname = "fb-re2";
+  version = "1.0.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "83b2c2cd58d3874e6e3a784cf4cf2f1a57ce1969e50180f92b010eea24ef26cf";
+  };
+
+  patches = [
+    # Bump stdlib to c++17 to fix build with recent re2
+    # https://github.com/facebook/pyre2/issues/24
+    # https://github.com/facebook/pyre2/pull/25
+    (fetchpatch {
+      url = "https://github.com/facebook/pyre2/pull/25/commits/08fb06ec3ccd412ca69483d27234684a04cb91a0.patch";
+      hash = "sha256-kzxE2AxpE1tJJK0dJgoFfVka9zy2u0HEqiHoS7DQDQ0=";
+    })
+  ];
+
+  buildInputs = [ re2 ];
+
+  # no tests in PyPI tarball
+  doCheck = false;
+
+  meta = {
+    description = "Python wrapper for Google's RE2";
+    homepage = "https://github.com/facebook/pyre2";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ ivan ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fe25519/default.nix b/nixpkgs/pkgs/development/python-modules/fe25519/default.nix
new file mode 100644
index 000000000000..819c7cc34df6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fe25519/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, bitlist
+, buildPythonPackage
+, fetchPypi
+, fountains
+, parts
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "fe25519";
+  version = "1.5.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-la+17tPHjceMTe7Wk8DGVaSptk8XJa+l7GTeqLIFDvs=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    bitlist
+    fountains
+    parts
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--doctest-modules --ignore=docs --cov=fe25519 --cov-report term-missing" ""
+  '';
+
+  pythonImportsCheck = [
+    "fe25519"
+  ];
+
+  meta = with lib; {
+    description = "Python field operations for Curve25519's prime";
+    homepage = "https://github.com/BjoernMHaase/fe25519";
+    license = with licenses; [ cc0 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/feedgen/default.nix b/nixpkgs/pkgs/development/python-modules/feedgen/default.nix
new file mode 100644
index 000000000000..9ca3627e74ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/feedgen/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, python-dateutil, lxml }:
+
+buildPythonPackage rec {
+  pname = "feedgen";
+  version = "0.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0jl0b87l7v6c0f1nx6k81skjhdj5i11kmchdjls00mynpvdip0cf";
+  };
+
+  propagatedBuildInputs = [ python-dateutil lxml ];
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python module to generate ATOM feeds, RSS feeds and Podcasts.";
+    downloadPage = "https://github.com/lkiesow/python-feedgen/releases";
+    homepage = "https://github.com/lkiesow/python-feedgen";
+    license = with licenses; [ bsd2 lgpl3 ];
+    maintainers = with maintainers; [ casey ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/feedgenerator/default.nix b/nixpkgs/pkgs/development/python-modules/feedgenerator/default.nix
new file mode 100644
index 000000000000..550e82cb8ccc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/feedgenerator/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, glibcLocales
+, pytestCheckHook
+, pythonOlder
+, pytz
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "feedgenerator";
+  version = "2.1.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-8HXyPyj9In8JfDayEhYcbPAS4cbKr3/1PV1rsCzUK50=";
+  };
+
+  postPatch = ''
+    sed -i '/cov/d' setup.cfg
+  '';
+
+  buildInputs = [
+    glibcLocales
+  ];
+
+  LC_ALL = "en_US.UTF-8";
+
+  propagatedBuildInputs = [
+    pytz
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "feedgenerator" ];
+
+  meta = with lib; {
+    description = "Standalone version of Django's feedgenerator module";
+    homepage = "https://github.com/getpelican/feedgenerator";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/feedparser/default.nix b/nixpkgs/pkgs/development/python-modules/feedparser/default.nix
new file mode 100644
index 000000000000..7eaf65b371df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/feedparser/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, sgmllib3k
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "feedparser";
+  version = "6.0.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-J9pIX0Y3znFjzeqxOoAxK5O30MG3db70pHYpoxELylE=";
+  };
+
+  propagatedBuildInputs = [
+    sgmllib3k
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  checkPhase = ''
+    # Tests are failing
+    # AssertionError: unexpected '~' char in declaration
+    rm tests/wellformed/sanitize/xml_declaration_unexpected_character.xml
+    ${python.interpreter} -Wd tests/runtests.py
+  '';
+
+  pythonImportsCheck = [
+    "feedparser"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/kurtmckee/feedparser";
+    description = "Universal feed parser";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fenics/default.nix b/nixpkgs/pkgs/development/python-modules/fenics/default.nix
new file mode 100644
index 000000000000..e9aa27bd9e21
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fenics/default.nix
@@ -0,0 +1,280 @@
+{ lib, stdenv
+, fetchurl
+, fetchpatch
+, blas
+, boost
+, cmake
+, doxygen
+, eigen
+, gtest
+, hdf5
+, lapack
+, mpi
+, mpi4py
+, numpy
+, pkg-config
+, ply
+, pybind11
+, pytest
+, python
+, pythonPackages
+, scotch
+, setuptools
+, six
+, sphinx
+, suitesparse
+, swig
+, sympy
+, zlib
+, nixosTests
+}:
+
+let
+  version = "2019.1.0";
+
+  dijitso = pythonPackages.buildPythonPackage {
+    pname = "dijitso";
+    inherit version;
+    src = fetchurl {
+      url = "https://bitbucket.org/fenics-project/dijitso/downloads/dijitso-${version}.tar.gz";
+      sha256 = "1ncgbr0bn5cvv16f13g722a0ipw6p9y6p4iasxjziwsp8kn5x97a";
+    };
+    propagatedBuildInputs = [ numpy six ];
+    nativeCheckInputs = [ pytest ];
+    preCheck = ''
+      export HOME=$PWD
+    '';
+    checkPhase = ''
+      runHook preCheck
+      py.test test/
+      runHook postCheck
+    '';
+    meta = {
+      description = "Distributed just-in-time shared library building";
+      homepage = "https://fenicsproject.org/";
+      platforms = lib.platforms.all;
+      license = lib.licenses.lgpl3;
+    };
+  };
+
+  fiat = pythonPackages.buildPythonPackage {
+    pname = "fiat";
+    inherit version;
+    src = fetchurl {
+      url = "https://bitbucket.org/fenics-project/fiat/downloads/fiat-${version}.tar.gz";
+      sha256 = "1sbi0fbr7w9g9ajr565g3njxrc3qydqjy3334vmz5xg0rd3106il";
+    };
+    propagatedBuildInputs = [ numpy six sympy ];
+    nativeCheckInputs = [ pytest ];
+
+    preCheck = ''
+      # Workaround pytest 4.6.3 issue.
+      # See: https://bitbucket.org/fenics-project/fiat/pull-requests/59
+      rm test/unit/test_quadrature.py
+      rm test/unit/test_reference_element.py
+      rm test/unit/test_fiat.py
+
+      # Fix `np.float` deprecation in Numpy 1.20
+      grep -lr 'np.float(' test/ | while read -r fn; do
+        substituteInPlace "$fn" \
+          --replace "np.float(" "np.float64("
+      done
+    '';
+    checkPhase = ''
+      runHook preCheck
+      py.test test/unit/
+      runHook postCheck
+    '';
+    meta = {
+      description = "Automatic generation of finite element basis functions";
+      homepage = "https://fenicsproject.org/";
+      platforms = lib.platforms.all;
+      license = lib.licenses.lgpl3;
+    };
+  };
+
+  ufl = pythonPackages.buildPythonPackage {
+    pname = "ufl";
+    inherit version;
+    src = fetchurl {
+      url = "https://bitbucket.org/fenics-project/ufl/downloads/ufl-${version}.tar.gz";
+      sha256 = "04daxwg4y9c51sdgvwgmlc82nn0fjw7i2vzs15ckdc7dlazmcfi1";
+    };
+    propagatedBuildInputs = [ numpy six ];
+    nativeCheckInputs = [ pytest ];
+    checkPhase = ''
+      runHook preCheck
+      py.test test/
+      runHook postCheck
+    '';
+    meta = {
+      description = "A domain-specific language for finite element variational forms";
+      homepage = "https://fenicsproject.org/";
+      platforms = lib.platforms.all;
+      license = lib.licenses.lgpl3;
+    };
+  };
+
+  ffc = pythonPackages.buildPythonPackage {
+    pname = "ffc";
+    inherit version;
+    src = fetchurl {
+      url = "https://bitbucket.org/fenics-project/ffc/downloads/ffc-${version}.tar.gz";
+      sha256 = "1zdg6pziss4va74pd7jjl8sc3ya2gmhpypccmyd8p7c66ji23y2g";
+    };
+    nativeBuildInputs = [
+      pybind11
+    ];
+    propagatedBuildInputs = [
+      dijitso
+      fiat
+      numpy
+      six
+      sympy
+      ufl
+      setuptools
+    ];
+    nativeCheckInputs = [ pytest ];
+    preCheck = ''
+      export HOME=$PWD
+      rm test/unit/ufc/finite_element/test_evaluate.py
+    '';
+    checkPhase = ''
+      runHook preCheck
+      py.test test/unit/
+      runHook postCheck
+    '';
+    meta = {
+      description = "A compiler for finite element variational forms";
+      homepage = "https://fenicsproject.org/";
+      platforms = lib.platforms.all;
+      license = lib.licenses.lgpl3;
+    };
+  };
+  dolfin = stdenv.mkDerivation {
+    pname = "dolfin";
+    inherit version;
+    src = fetchurl {
+      url = "https://bitbucket.org/fenics-project/dolfin/downloads/dolfin-${version}.tar.gz";
+      sha256 = "0kbyi4x5f6j4zpasch0swh0ch81w2h92rqm1nfp3ydi4a93vky33";
+    };
+    patches = [
+      (fetchpatch {
+        name = "fix-double-prefix.patch";
+        url = "https://bitbucket.org/josef_kemetmueller/dolfin/commits/328e94acd426ebaf2243c072b806be3379fd4340/raw";
+        sha256 = "1zj7k3y7vsx0hz3gwwlxhq6gdqamqpcw90d4ishwx5ps5ckcsb9r";
+      })
+      (fetchpatch {
+        url = "https://bitbucket.org/fenics-project/dolfin/issues/attachments/1116/fenics-project/dolfin/1602778118.04/1116/0001-Use-__BYTE_ORDER__-instead-of-removed-Boost-endian.h.patch";
+        hash = "sha256-wPaDmPU+jaD3ce3nNEbvM5p8e3zBdLozamLTJ/0ai2c=";
+      })
+    ];
+    # https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=dolfin&id=a965ad934f7b3d49a5e77fa6fb5e3c710ec2163e
+    postPatch = ''
+      sed -i '20 a #include <algorithm>' dolfin/geometry/IntersectionConstruction.cpp
+      sed -i '26 a #include <algorithm>' dolfin/mesh/MeshFunction.h
+      sed -i '25 a #include <cstdint>' dolfin/mesh/MeshConnectivity.h
+    '';
+    propagatedBuildInputs = [
+      dijitso
+      fiat
+      numpy
+      six
+      ufl
+    ];
+    nativeBuildInputs = [
+      cmake
+      doxygen
+      pkg-config
+    ];
+    buildInputs = [
+      boost
+      dijitso
+      eigen
+      ffc
+      fiat
+      hdf5
+      mpi
+      numpy
+      blas
+      lapack
+      ply
+      python
+      scotch
+      six
+      sphinx
+      suitesparse
+      swig
+      sympy
+      ufl
+      zlib
+    ];
+    cmakeFlags = [
+      "-DDOLFIN_CXX_FLAGS=-std=c++11"
+      "-DDOLFIN_AUTO_DETECT_MPI=ON"
+      "-DDOLFIN_ENABLE_CHOLMOD=ON"
+      "-DDOLFIN_ENABLE_DOCS=ON"
+      "-DDOLFIN_ENABLE_HDF5=ON"
+      "-DDOLFIN_ENABLE_MPI=ON"
+      "-DDOLFIN_ENABLE_SCOTCH=ON"
+      "-DDOLFIN_ENABLE_UMFPACK=ON"
+      "-DDOLFIN_ENABLE_ZLIB=ON"
+      "-DDOLFIN_SKIP_BUILD_TESTS=ON" # Otherwise SCOTCH is not found
+      # TODO: Enable the following features
+      "-DDOLFIN_ENABLE_PARMETIS=OFF"
+      "-DDOLFIN_ENABLE_PETSC=OFF"
+      "-DDOLFIN_ENABLE_SLEPC=OFF"
+      "-DDOLFIN_ENABLE_TRILINOS=OFF"
+    ];
+    installCheckPhase = ''
+      source $out/share/dolfin/dolfin.conf
+      make runtests
+    '';
+    meta = {
+      description = "The FEniCS Problem Solving Environment in Python and C++";
+      homepage = "https://fenicsproject.org/";
+      license = lib.licenses.lgpl3;
+    };
+  };
+  python-dolfin = pythonPackages.buildPythonPackage rec {
+    pname = "dolfin";
+    inherit version;
+    disabled = pythonPackages.isPy27;
+    src = dolfin.src;
+    sourceRoot = "${pname}-${version}/python";
+    nativeBuildInputs = [
+      pybind11
+      cmake
+    ];
+    dontUseCmakeConfigure = true;
+    preConfigure = ''
+      export CMAKE_PREFIX_PATH=${pybind11}/share/cmake/pybind11:$CMAKE_PREFIX_PATH
+      substituteInPlace setup.py --replace "pybind11==2.2.4" "pybind11"
+      substituteInPlace dolfin/jit/jit.py \
+        --replace 'pkgconfig.exists("dolfin")' 'pkgconfig.exists("${dolfin}/lib/pkgconfig/dolfin.pc")' \
+        --replace 'pkgconfig.parse("dolfin")' 'pkgconfig.parse("${dolfin}/lib/pkgconfig/dolfin.pc")'
+    '';
+    buildInputs = [
+      dolfin
+      boost
+    ];
+
+    propagatedBuildInputs = [
+      dijitso
+      ffc
+      mpi4py
+      numpy
+      ufl
+      pythonPackages.pkgconfig
+      pythonPackages.pybind11
+    ];
+    doCheck = false; # Tries to orte_ess_init and call ssh to localhost
+    passthru.tests = { inherit (nixosTests) fenics; };
+    meta = {
+      description = "Python bindings for the DOLFIN FEM compiler";
+      homepage = "https://fenicsproject.org/";
+      platforms = lib.platforms.all;
+      license = lib.licenses.lgpl3;
+    };
+  };
+in python-dolfin
diff --git a/nixpkgs/pkgs/development/python-modules/ffcv/default.nix b/nixpkgs/pkgs/development/python-modules/ffcv/default.nix
new file mode 100644
index 000000000000..861f2d020190
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ffcv/default.nix
@@ -0,0 +1,53 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, libjpeg
+, numba
+, opencv4
+, pandas
+, pkg-config
+, pytorch-pfn-extras
+, terminaltables
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "ffcv";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "libffcv";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-L2mwGFivq/gtAw+1D6U2jbW6VxYgetHX7OUrjwyybqE=";
+  };
+
+  # See https://github.com/libffcv/ffcv/issues/159.
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'assertpy'," "" \
+      --replace "'fastargs'," "" \
+      --replace "'imgcat'," "" \
+      --replace "'matplotlib'," "" \
+      --replace "'psutil'," "" \
+      --replace "'sklearn'," "" \
+      --replace "'webdataset'," ""
+  '';
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ libjpeg ];
+  propagatedBuildInputs = [ opencv4 numba pandas pytorch-pfn-extras terminaltables tqdm ];
+
+  # `ffcv._libffcv*.so` cannot be loaded in the nix build environment for some
+  # reason. See https://github.com/NixOS/nixpkgs/pull/160441#issuecomment-1045204722.
+  doCheck = false;
+
+  pythonImportsCheck = [ "ffcv" ];
+
+  meta = with lib; {
+    description = "FFCV: Fast Forward Computer Vision";
+    homepage = "https://ffcv.io";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ffmpeg-progress-yield/default.nix b/nixpkgs/pkgs/development/python-modules/ffmpeg-progress-yield/default.nix
new file mode 100644
index 000000000000..6d0f35e27887
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ffmpeg-progress-yield/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, colorama
+, tqdm
+, pytestCheckHook
+, pythonOlder
+, ffmpeg
+, procps
+}:
+
+buildPythonPackage rec {
+  pname = "ffmpeg-progress-yield";
+  version = "0.7.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-muauX4Mq58ew9lGPE0H+bu4bqPydNADLocujjy6qRh4=";
+  };
+
+  propagatedBuildInputs = [ colorama tqdm ];
+
+  nativeCheckInputs = [ pytestCheckHook ffmpeg procps ];
+
+  disabledTests = [
+    "test_quit"
+    "test_quit_gracefully"
+  ];
+
+  pytestFlagsArray = [ "test/test.py" ];
+
+  pythonImportsCheck = [ "ffmpeg_progress_yield" ];
+
+  meta = with lib; {
+    description = "Run an ffmpeg command with progress";
+    homepage = "https://github.com/slhck/ffmpeg-progress-yield";
+    changelog = "https://github.com/slhck/ffmpeg-progress-yield/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ffmpeg-python/default.nix b/nixpkgs/pkgs/development/python-modules/ffmpeg-python/default.nix
new file mode 100644
index 000000000000..0fb0c68d4cba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ffmpeg-python/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ffmpeg_4
+, future
+, pytest-mock
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, substituteAll
+}:
+
+buildPythonPackage rec {
+  pname = "ffmpeg-python";
+  version = "0.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "kkroening";
+    repo = "ffmpeg-python";
+    rev = version;
+    hash = "sha256-Dk3nHuYVlIiFF6nORZ5TVFkBXdoZUxLfoiz68V1tvlY=";
+  };
+
+  propagatedBuildInputs = [
+    future
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./ffmpeg-location.patch;
+      ffmpeg = ffmpeg_4;
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'" ""
+  '';
+
+  pythonImportsCheck = [
+    "ffmpeg"
+  ];
+
+  disabledTests = lib.optionals (pythonAtLeast "3.10") [
+    "test__output__video_size"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for FFmpeg - with complex filtering support";
+    homepage = "https://github.com/kkroening/ffmpeg-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ AluisioASG ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ffmpeg-python/ffmpeg-location.patch b/nixpkgs/pkgs/development/python-modules/ffmpeg-python/ffmpeg-location.patch
new file mode 100644
index 000000000000..a192504e1267
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ffmpeg-python/ffmpeg-location.patch
@@ -0,0 +1,84 @@
+diff --git i/ffmpeg/_probe.py w/ffmpeg/_probe.py
+index 41e8168..eb83b54 100644
+--- i/ffmpeg/_probe.py
++++ w/ffmpeg/_probe.py
+@@ -4,7 +4,7 @@ from ._run import Error
+ from ._utils import convert_kwargs_to_cmd_line_args
+ 
+ 
+-def probe(filename, cmd='ffprobe', **kwargs):
++def probe(filename, cmd='@ffmpeg@/bin/ffprobe', **kwargs):
+     """Run ffprobe on the specified file and return a JSON representation of the output.
+ 
+     Raises:
+diff --git i/ffmpeg/_run.py w/ffmpeg/_run.py
+index afc504d..9445cca 100644
+--- i/ffmpeg/_run.py
++++ w/ffmpeg/_run.py
+@@ -172,7 +172,7 @@ def get_args(stream_spec, overwrite_output=False):
+ 
+ 
+ @output_operator()
+-def compile(stream_spec, cmd='ffmpeg', overwrite_output=False):
++def compile(stream_spec, cmd='@ffmpeg@/bin/ffmpeg', overwrite_output=False):
+     """Build command-line for invoking ffmpeg.
+ 
+     The :meth:`run` function uses this to build the commnad line
+@@ -193,7 +193,7 @@ def compile(stream_spec, cmd='ffmpeg', overwrite_output=False):
+ @output_operator()
+ def run_async(
+     stream_spec,
+-    cmd='ffmpeg',
++    cmd='@ffmpeg@/bin/ffmpeg',
+     pipe_stdin=False,
+     pipe_stdout=False,
+     pipe_stderr=False,
+@@ -289,7 +289,7 @@ def run_async(
+ @output_operator()
+ def run(
+     stream_spec,
+-    cmd='ffmpeg',
++    cmd='@ffmpeg@/bin/ffmpeg',
+     capture_stdout=False,
+     capture_stderr=False,
+     input=None,
+diff --git i/ffmpeg/tests/test_ffmpeg.py w/ffmpeg/tests/test_ffmpeg.py
+index 279a323..8d3b35c 100644
+--- i/ffmpeg/tests/test_ffmpeg.py
++++ w/ffmpeg/tests/test_ffmpeg.py
+@@ -24,7 +24,7 @@ TEST_OUTPUT_FILE2 = os.path.join(SAMPLE_DATA_DIR, 'out2.mp4')
+ BOGUS_INPUT_FILE = os.path.join(SAMPLE_DATA_DIR, 'bogus')
+ 
+ 
+-subprocess.check_call(['ffmpeg', '-version'])
++subprocess.check_call(['@ffmpeg@/bin/ffmpeg', '-version'])
+ 
+ 
+ def test_escape_chars():
+@@ -423,7 +423,7 @@ def test_filter_text_arg_str_escape():
+ 
+ def test__compile():
+     out_file = ffmpeg.input('dummy.mp4').output('dummy2.mp4')
+-    assert out_file.compile() == ['ffmpeg', '-i', 'dummy.mp4', 'dummy2.mp4']
++    assert out_file.compile() == ['@ffmpeg@/bin/ffmpeg', '-i', 'dummy.mp4', 'dummy2.mp4']
+     assert out_file.compile(cmd='ffmpeg.old') == [
+         'ffmpeg.old',
+         '-i',
+@@ -490,7 +490,7 @@ def test__run__input_output(mocker):
+ @pytest.mark.parametrize('capture_stdout', [True, False])
+ @pytest.mark.parametrize('capture_stderr', [True, False])
+ def test__run__error(mocker, capture_stdout, capture_stderr):
+-    mocker.patch.object(ffmpeg._run, 'compile', return_value=['ffmpeg'])
++    mocker.patch.object(ffmpeg._run, 'compile', return_value=['@ffmpeg@/bin/ffmpeg'])
+     stream = _get_complex_filter_example()
+     with pytest.raises(ffmpeg.Error) as excinfo:
+         out, err = ffmpeg.run(
+@@ -684,7 +684,7 @@ def test_pipe():
+         'pipe:1',
+     ]
+ 
+-    cmd = ['ffmpeg'] + args
++    cmd = ['@ffmpeg@/bin/ffmpeg'] + args
+     p = subprocess.Popen(
+         cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE
+     )
diff --git a/nixpkgs/pkgs/development/python-modules/ffmpy/default.nix b/nixpkgs/pkgs/development/python-modules/ffmpy/default.nix
new file mode 100644
index 000000000000..c3b0c6078f42
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ffmpy/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, go
+, ffmpeg-headless
+}:
+
+buildPythonPackage rec {
+  pname = "ffmpy";
+  version = "0.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Ch00k";
+    repo = "ffmpy";
+    rev = "refs/tags/${version}";
+    hash = "sha256-kuLhmCG80BmXdqpW67UanBnuYiL2Oh1jKt7IgmVNEAM=";
+  };
+
+  postPatch = ''
+    # default to store ffmpeg
+    substituteInPlace ffmpy.py \
+      --replace 'executable="ffmpeg",' 'executable="${ffmpeg-headless}/bin/ffmpeg",'
+
+    #  The tests test a mock that does not behave like ffmpeg. If we default to the nix-store ffmpeg they fail.
+    for fname in tests/*.py; do
+      echo 'FFmpeg.__init__.__defaults__ = ("ffmpeg", *FFmpeg.__init__.__defaults__[1:])' >>"$fname"
+    done
+  '';
+
+  pythonImportsCheck = [ "ffmpy" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    go
+  ];
+
+  # the vendored ffmpeg mock binary assumes FHS
+  preCheck = ''
+    rm -v tests/ffmpeg/ffmpeg
+    HOME=$(mktemp -d) go build -o ffmpeg tests/ffmpeg/ffmpeg.go
+    export PATH=".:$PATH"
+  '';
+
+  meta = with lib; {
+    description = "A simple python interface for FFmpeg/FFprobe";
+    homepage = "https://github.com/Ch00k/ffmpy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ pbsds ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fiblary3-fork/default.nix b/nixpkgs/pkgs/development/python-modules/fiblary3-fork/default.nix
new file mode 100644
index 000000000000..eeab77847c91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fiblary3-fork/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, fetchPypi
+, fixtures
+, jsonpatch
+, netaddr
+, prettytable
+, python-dateutil
+, pytestCheckHook
+, requests
+, requests-mock
+, six
+, sphinx
+, testtools
+}:
+
+buildPythonPackage rec {
+  pname = "fiblary3-fork";
+  version = "0.1.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "001wqh7gx2dv3sf7a5xsbppz9r88f5qwrp05jzjsjcm6cbcvmsz0";
+  };
+
+  propagatedBuildInputs = [
+    jsonpatch
+    netaddr
+    prettytable
+    python-dateutil
+    requests
+    six
+  ];
+
+  nativeCheckInputs = [
+    fixtures
+    pytestCheckHook
+    requests-mock
+    testtools
+  ];
+
+  pythonImportsCheck = [ "fiblary3" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/graham33/fiblary";
+    description = "Fibaro Home Center API Python Library";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ graham33 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fido2/default.nix b/nixpkgs/pkgs/development/python-modules/fido2/default.nix
new file mode 100644
index 000000000000..7cd11eefcbcc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fido2/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchPypi
+, mock
+, poetry-core
+, pyfakefs
+, pythonOlder
+, six
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "fido2";
+  version = "1.1.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-YRDZExBvdhmSAbMtJisoV1YsxGuh0LnFH7zjDck2xXM=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    six
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+    mock
+    pyfakefs
+  ];
+
+  unittestFlagsArray = [
+    "-v"
+  ];
+
+  pythonImportsCheck = [
+    "fido2"
+  ];
+
+  meta = with lib; {
+    description = "Provides library functionality for FIDO 2.0, including communication with a device over USB";
+    homepage = "https://github.com/Yubico/python-fido2";
+    changelog = "https://github.com/Yubico/python-fido2/releases/tag/${version}";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fields/default.nix b/nixpkgs/pkgs/development/python-modules/fields/default.nix
new file mode 100644
index 000000000000..25b567c9c875
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fields/default.nix
@@ -0,0 +1,20 @@
+{ buildPythonPackage, lib, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "fields";
+  version = "5.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MdSqA9jUTjXfE8Qx3jUTaZfwR6kkpZfYT3vCCeG+Vyc=";
+  };
+
+  pythonImportsCheck = [ "fields" ];
+
+  meta = with lib; {
+    description = "Container class boilerplate killer";
+    homepage = "https://github.com/ionelmc/python-fields";
+    license = licenses.bsd2;
+    maintainers = [ maintainers.sheepforce ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/file-read-backwards/default.nix b/nixpkgs/pkgs/development/python-modules/file-read-backwards/default.nix
new file mode 100644
index 000000000000..f83963e1e5ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/file-read-backwards/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, mock }:
+
+buildPythonPackage rec {
+  pname = "file-read-backwards";
+  version = "3.0.0";
+
+  src = fetchPypi {
+    pname = "file_read_backwards";
+    inherit version;
+    sha256 = "sha256-USw+U0BDUnqPrioLcVGqJV8towPnf9QPfc9CoeCRzCY=";
+  };
+
+  nativeCheckInputs = [ mock ];
+  pythonImportsCheck = [ "file_read_backwards" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/RobinNil/file_read_backwards";
+    description = "Memory efficient way of reading files line-by-line from the end of file";
+    license = licenses.mit;
+    maintainers = with maintainers; [ j0hax ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/filebrowser_safe/default.nix b/nixpkgs/pkgs/development/python-modules/filebrowser_safe/default.nix
new file mode 100644
index 000000000000..28798dd838e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/filebrowser_safe/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, django
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "filebrowser-safe";
+  version = "1.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "filebrowser_safe";
+    inherit version;
+    sha256 = "499c5dbd9e112dfc436cae7713b2fb664a59015021f6c9d131e3b7980aeb5c94";
+  };
+
+  buildInputs = [
+    django
+  ];
+
+  # There is no test embedded
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A snapshot of django-filebrowser for the Mezzanine CMS";
+    longDescription = ''
+      filebrowser_safe was created to provide a snapshot of the
+      FileBrowser asset manager for Django, to be referenced as a
+      dependency for the Mezzanine CMS for Django.
+    '';
+    homepage = "https://github.com/stephenmcd/filebrowser-safe";
+    downloadPage = "https://pypi.python.org/pypi/filebrowser_safe/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ prikhi ];
+    platforms = platforms.unix;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/filebytes/default.nix b/nixpkgs/pkgs/development/python-modules/filebytes/default.nix
new file mode 100644
index 000000000000..5b6d6284ced5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/filebytes/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "filebytes";
+  version = "0.10.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0h97i6h525hg401dvvaa5krxi184qpvldbdn0izmirvr9pvh4hkn";
+  };
+
+  meta = with lib; {
+    homepage = "https://scoding.de/filebytes-introduction";
+    license = licenses.gpl2;
+    description = "Scripts to parse ELF, PE, Mach-O and OAT (Android Runtime)";
+    maintainers = with maintainers; [ bennofs ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/filecheck/default.nix b/nixpkgs/pkgs/development/python-modules/filecheck/default.nix
new file mode 100644
index 000000000000..b7b9c2948ae2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/filecheck/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "filecheck";
+  version = "0.0.23";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "mull-project";
+    repo = "FileCheck.py";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-R+e4Z1EX6Nk7INLar3gtkUpk+30xIJO7yiZbUvrhN74=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "poetry>=0.12" "poetry-core" \
+      --replace "poetry.masonry.api" "poetry.core.masonry.api"
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "filecheck"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mull-project/FileCheck.py";
+    license = licenses.asl20;
+    description = "Python port of LLVM's FileCheck, flexible pattern matching file verifier";
+    maintainers = with maintainers; [ yorickvp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/filedepot/default.nix b/nixpkgs/pkgs/development/python-modules/filedepot/default.nix
new file mode 100644
index 000000000000..b347a1a6bd19
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/filedepot/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, anyascii
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, flaky
+, google-cloud-storage
+, mock
+, pillow
+, pymongo
+, pytestCheckHook
+, pythonOlder
+, requests
+, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "filedepot";
+  version = "0.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "amol-";
+    repo = "depot";
+    rev = "refs/tags/${version}";
+    hash = "sha256-vPceky5cvmy3MooWz7dRdy68VoAHN7i3a7egBs4dPE8=";
+  };
+
+  patches = [
+    # Add support for Pillow 10, https://github.com/amol-/depot/pull/84
+    (fetchpatch {
+      name = "support-pillow-10.patch";
+      url = "https://github.com/amol-/depot/commit/bdb73d1b3898279068b421bc061ecc18c5108fa4.patch";
+      hash = "sha256-7+VGrdJstkiy0bYAqA9FjF1NftZiurgyPd8Wlz6GUy8=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    anyascii
+    google-cloud-storage
+  ];
+
+  nativeCheckInputs = [
+    flaky
+    mock
+    pillow
+    pymongo
+    pytestCheckHook
+    requests
+    sqlalchemy
+  ];
+
+  disabledTestPaths = [
+    # ModuleNotFoundError: No module named 'depot._pillow_compat'
+    "tests/test_fields_sqlalchemy.py"
+    # The examples have tests
+    "examples"
+    # Missing dependencies (TurboGears2 and ming)
+    "tests/test_fields_ming.py"
+    "tests/test_wsgi_middleware.py"
+  ];
+
+  pythonImportsCheck = [
+    "depot"
+  ];
+
+  meta = with lib; {
+    description = "Toolkit for storing files and attachments in web applications";
+    homepage = "https://github.com/amol-/depot";
+    changelog = "https://github.com/amol-/depot/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/filelock/default.nix b/nixpkgs/pkgs/development/python-modules/filelock/default.nix
new file mode 100644
index 000000000000..74cd6e727dbd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/filelock/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hatch-vcs
+, hatchling
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "filelock";
+  version = "3.12.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Lm8knx82VCkWBuBGsJ8f1erDmzYGZMJ/Wq0HIBL4vL0=";
+  };
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/tox-dev/py-filelock/releases/tag/${version}";
+    description = "A platform independent file lock for Python";
+    homepage = "https://github.com/benediktschmitt/py-filelock";
+    license = licenses.unlicense;
+    maintainers = with maintainers; [ hyphon81 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/filetype/default.nix b/nixpkgs/pkgs/development/python-modules/filetype/default.nix
new file mode 100644
index 000000000000..f0d1caa25d27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/filetype/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "filetype";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ZrVs1kdL9B2MVGYDR9N6/MP30ZcGSN42XBAu93VIqts=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "filetype"
+  ];
+
+  disabledTests = [
+    # https://github.com/h2non/filetype.py/issues/119
+    "test_guess_memoryview"
+    "test_guess_extension_memoryview"
+    "test_guess_mime_memoryview"
+    # https://github.com/h2non/filetype.py/issues/128
+    "test_guess_zstd"
+  ];
+
+  disabledTestPaths = [
+    # We don't care about benchmarks
+    "tests/test_benchmark.py"
+  ];
+
+  meta = with lib; {
+    description = "Infer file type and MIME type of any file/buffer";
+    homepage = "https://github.com/h2non/filetype.py";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/filterpy/default.nix b/nixpkgs/pkgs/development/python-modules/filterpy/default.nix
new file mode 100644
index 000000000000..7d45d7f979b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/filterpy/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, scipy
+, matplotlib
+, pytestCheckHook
+, isPy3k
+}:
+
+buildPythonPackage {
+  pname = "filterpy";
+  version = "unstable-2022-08-23";
+  format = "setuptools";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "rlabbe";
+    repo = "filterpy";
+    rev = "3b51149ebcff0401ff1e10bf08ffca7b6bbc4a33";
+    hash = "sha256-KuuVu0tqrmQuNKYmDmdy+TU6BnnhDxh4G8n9BGzjGag=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    matplotlib
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/rlabbe/filterpy";
+    description = "Kalman filtering and optimal estimation library";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/finalfusion/default.nix b/nixpkgs/pkgs/development/python-modules/finalfusion/default.nix
new file mode 100644
index 000000000000..f079dbe77bc8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/finalfusion/default.nix
@@ -0,0 +1,60 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, isPy3k
+, cython
+, numpy
+, toml
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "finalfusion";
+  version = "0.7.1";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "finalfusion";
+    repo = "finalfusion-python";
+    rev = version;
+    sha256 = "0pwzflamxqvpl1wcz0zbhhd6aa4xn18rmza6rggaic3ckidhyrh4";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    toml
+  ];
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  postPatch = ''
+    patchShebangs tests/integration
+
+    # `np.float` was a deprecated alias of the builtin `float`
+    substituteInPlace tests/test_storage.py \
+      --replace 'dtype=np.float)' 'dtype=float)'
+  '';
+
+  checkPhase = ''
+    # Regular unit tests.
+    pytest
+
+    # Integration tests for command-line utilities.
+    PATH=$PATH:$out/bin tests/integration/all.sh
+  '';
+
+  meta = with lib; {
+    description = "Python module for using finalfusion, word2vec, and fastText word embeddings";
+    homepage = "https://github.com/finalfusion/finalfusion-python/";
+    maintainers = with maintainers; [ ];
+    platforms = platforms.all;
+    license = licenses.blueOak100;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/find-libpython/default.nix b/nixpkgs/pkgs/development/python-modules/find-libpython/default.nix
new file mode 100644
index 000000000000..21ce69e071d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/find-libpython/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "find-libpython";
+  version = "0.3.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "find_libpython";
+    sha256 = "sha256-bn/l2a9/rW3AZstVFaDpyQpx8f6yuy+OTNu0+DJ26eU=";
+  };
+
+  disabled = pythonOlder "3.7";
+
+  pythonImportsCheck = [ "find_libpython" ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Finds the libpython associated with your environment, wherever it may be hiding";
+    changelog = "https://github.com/ktbarrett/find_libpython/releases/tag/${version}";
+    homepage = "https://github.com/ktbarrett/find_libpython";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jleightcap ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/findimports/default.nix b/nixpkgs/pkgs/development/python-modules/findimports/default.nix
new file mode 100644
index 000000000000..ff6c6579d738
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/findimports/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "findimports";
+  version = "2.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "mgedmin";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-yA1foeGhgOXZArc/nZfS1tbGyONXJZ9lW+Zcx7hCedM=";
+  };
+
+  pythonImportsCheck = [
+    "findimports"
+  ];
+
+  checkPhase = ''
+    # Tests fails
+    rm tests/cmdline.txt
+
+    runHook preCheck
+    ${python.interpreter} testsuite.py
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Module for the analysis of Python import statements";
+    homepage = "https://github.com/mgedmin/findimports";
+    changelog = "https://github.com/mgedmin/findimports/blob/${version}/CHANGES.rst";
+    license = with licenses; [ gpl2Only /* or */ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/findpython/default.nix b/nixpkgs/pkgs/development/python-modules/findpython/default.nix
new file mode 100644
index 000000000000..9a9bd93fc745
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/findpython/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+# build time
+, pdm-backend
+
+# runtime
+, packaging
+
+# tests
+, pytestCheckHook
+}:
+
+let
+  pname = "findpython";
+  version = "0.4.0";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GLFNEVZ42hiuku4i1wAcwwkV6lMQU/dwEO4Fo5aA9Dg=";
+  };
+
+  nativeBuildInputs = [
+    pdm-backend
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "findpython"
+  ];
+
+  meta = with lib; {
+    description = "A utility to find python versions on your system";
+    homepage = "https://github.com/frostming/findpython";
+    changelog = "https://github.com/frostming/findpython/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fingerprints/default.nix b/nixpkgs/pkgs/development/python-modules/fingerprints/default.nix
new file mode 100644
index 000000000000..ecda4d7959b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fingerprints/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, normality
+, pytestCheckHook
+}:
+buildPythonPackage rec {
+  pname = "fingerprints";
+  version = "1.1.0";
+
+  src = fetchFromGitHub {
+    owner = "alephdata";
+    repo = "fingerprints";
+    rev = version;
+    hash = "sha256-rptBM08dvivfglPvl3PZd9V/7u2SHbJ/BxfVHNGMt3A=";
+  };
+
+  propagatedBuildInputs = [
+    normality
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "fingerprints"
+  ];
+
+  meta = with lib; {
+    description = "A library to generate entity fingerprints";
+    homepage = "https://github.com/alephdata/fingerprints";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/finitude/default.nix b/nixpkgs/pkgs/development/python-modules/finitude/default.nix
new file mode 100644
index 000000000000..d7f1af78750f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/finitude/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, prometheus-client
+, pyserial
+, pythonOlder
+, pyyaml
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "finitude";
+  version = "0.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dulitz";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-yCI5UCRDhw+dJoTKyjmHbAGBm3by2AyxHKlqCywnLcs=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pyserial
+    prometheus-client
+    pyyaml
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "finitude"
+  ];
+
+  meta = with lib; {
+    description = "Python module to get data from ABCD bus (RS-485) used by Carrier Infinity and Bryant Evolution HVAC systems";
+    homepage = "https://github.com/dulitz/finitude";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fints/default.nix b/nixpkgs/pkgs/development/python-modules/fints/default.nix
new file mode 100644
index 000000000000..5cb94f04c61f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fints/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, bleach
+, mt-940
+, requests
+, sepaxml
+, pytestCheckHook
+, pytest-mock
+}:
+
+buildPythonPackage rec {
+  version = "4.0.0";
+  pname = "fints";
+  disabled = pythonOlder "3.6";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "raphaelm";
+    repo = "python-fints";
+    rev = "v${version}";
+    hash = "sha256-SREprcrIdeKVpL22IViexwiKmFfbT2UbKEmxtVm6iu0=";
+  };
+
+  propagatedBuildInputs = [ requests mt-940 sepaxml bleach ];
+
+  nativeCheckInputs = [ pytestCheckHook pytest-mock ];
+
+  meta = with lib; {
+    homepage = "https://github.com/raphaelm/python-fints/";
+    description = "Pure-python FinTS (formerly known as HBCI) implementation";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ elohmeier dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/finvizfinance/default.nix b/nixpkgs/pkgs/development/python-modules/finvizfinance/default.nix
new file mode 100644
index 000000000000..a953795b8663
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/finvizfinance/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, beautifulsoup4
+, datetime
+, lxml
+, pandas
+, pytest-mock
+, pytestCheckHook
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "finvizfinance";
+  version = "0.14.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "lit26";
+    repo = "finvizfinance";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ht1bez04MAgugsQqa47q2ED7z8xpiXmzkOYBR7/PZHU=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "bs4" "beautifulsoup4"
+  '';
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    datetime
+    lxml
+    pandas
+    requests
+  ];
+
+  pythonImportsCheck = [
+    "finvizfinance"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_finvizfinance_calendar"
+    "test_finvizfinance_crypto"
+    "test_forex_performance_percentage"
+    "test_group_overview"
+    "test_finvizfinance_insider"
+    "test_finvizfinance_news"
+    "test_finvizfinance_finvizfinance"
+    "test_statements"
+    "test_screener_overview"
+  ];
+
+  meta = with lib; {
+    description = "Finviz Finance information downloader";
+    homepage = "https://github.com/lit26/finvizfinance";
+    changelog = "https://github.com/lit26/finvizfinance/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ icyrockcom ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/fiona/default.nix b/nixpkgs/pkgs/development/python-modules/fiona/default.nix
new file mode 100644
index 000000000000..8513c723bf00
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fiona/default.nix
@@ -0,0 +1,100 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, cython_3
+, gdal
+, oldest-supported-numpy
+, setuptools
+, wheel
+, attrs
+, certifi
+, click
+, click-plugins
+, cligj
+, munch
+, shapely
+, boto3
+, pytestCheckHook
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "fiona";
+  version = "1.9.5";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Toblerity";
+    repo = "Fiona";
+    rev = "refs/tags/${version}";
+    hash = "sha256-fq/BuyzuK4iOxdpE4h+KRH0CxOEk/wdmbb9KgCfJ1cw=";
+  };
+
+  nativeBuildInputs = [
+    cython_3
+    gdal # for gdal-config
+    oldest-supported-numpy
+    setuptools
+    wheel
+  ];
+
+  buildInputs = [
+    gdal
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    certifi
+    click
+    cligj
+    click-plugins
+    munch
+  ];
+
+  passthru.optional-dependencies = {
+    calc = [ shapely ];
+    s3 = [ boto3 ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytz
+  ] ++ passthru.optional-dependencies.s3;
+
+  preCheck = ''
+    rm -r fiona # prevent importing local fiona
+  '';
+
+  pytestFlagsArray = [
+    # Tests with gdal marker do not test the functionality of Fiona,
+    # but they are used to check GDAL driver capabilities.
+    "-m 'not gdal'"
+  ];
+
+  disabledTests = [
+    # Some tests access network, others test packaging
+    "http"
+    "https"
+    "wheel"
+
+    # see: https://github.com/Toblerity/Fiona/issues/1273
+    "test_append_memoryfile_drivers"
+  ];
+
+  pythonImportsCheck = [
+    "fiona"
+  ];
+
+  doInstallCheck = true;
+
+  meta = with lib; {
+    changelog = "https://github.com/Toblerity/Fiona/blob/${src.rev}/CHANGES.txt";
+    description = "OGR's neat, nimble, no-nonsense API for Python";
+    homepage = "https://fiona.readthedocs.io/";
+    license = licenses.bsd3;
+    maintainers = teams.geospatial.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fipy/default.nix b/nixpkgs/pkgs/development/python-modules/fipy/default.nix
new file mode 100644
index 000000000000..d8f7c808a9af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fipy/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, numpy
+, scipy
+, pyamg
+, future
+, matplotlib
+, tkinter
+, mpi4py
+, scikit-fmm
+, gmsh
+, python
+, stdenv
+, openssh
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fipy";
+  version = "3.4.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "usnistgov";
+    repo = "fipy";
+    rev = "refs/tags/${version}";
+    hash = "sha256-XZpm+gzysR2OXBcxWUEjP1PlaLuOL2NpmeKMCH+OEb4=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    pyamg
+    matplotlib
+    tkinter
+    mpi4py
+    future
+    scikit-fmm
+    openssh
+  ] ++ lib.optionals (!stdenv.isDarwin) [
+    gmsh
+  ];
+
+  nativeCheckInputs = lib.optionals (!stdenv.isDarwin) [
+    gmsh
+  ];
+
+  checkPhase = ''
+    export OMPI_MCA_plm_rsh_agent=${openssh}/bin/ssh
+    ${python.interpreter} setup.py test --modules
+  '';
+
+  pythonImportsCheck = [
+    "fipy"
+  ];
+
+  meta = with lib; {
+    homepage = "https://www.ctcms.nist.gov/fipy/";
+    description = "A Finite Volume PDE Solver Using Python";
+    changelog = "https://github.com/usnistgov/fipy/blob/${version}/CHANGELOG.rst";
+    license = licenses.free;
+    maintainers = with maintainers; [ wd15 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fire/default.nix b/nixpkgs/pkgs/development/python-modules/fire/default.nix
new file mode 100644
index 000000000000..1055bada787e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fire/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, six
+, hypothesis
+, mock
+, levenshtein
+, pytestCheckHook
+, termcolor
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fire";
+  version = "0.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = "python-fire";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-cwY1RRNtpAn6LnBASQLTNf4XXSPnfhOa1WgglGEM2/s=";
+  };
+
+  patches = [
+    # https://github.com/google/python-fire/pull/440
+    (fetchpatch {
+      name = "remove-asyncio-coroutine.patch";
+      url = "https://github.com/google/python-fire/pull/440/commits/30b775a7b36ce7fbc04656c7eec4809f99d3e178.patch";
+      hash = "sha256-GDAAlvZKbJl3OhajsEO0SZvWIXcPDi3eNKKVgbwSNKk=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    six
+    termcolor
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    mock
+    levenshtein
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "fire"
+  ];
+
+  meta = with lib; {
+    description = "A library for automatically generating command line interfaces";
+    longDescription = ''
+      Python Fire is a library for automatically generating command line
+      interfaces (CLIs) from absolutely any Python object.
+
+      * Python Fire is a simple way to create a CLI in Python.
+
+      * Python Fire is a helpful tool for developing and debugging
+        Python code.
+
+      * Python Fire helps with exploring existing code or turning other
+        people's code into a CLI.
+
+      * Python Fire makes transitioning between Bash and Python easier.
+
+      * Python Fire makes using a Python REPL easier by setting up the
+        REPL with the modules and variables you'll need already imported
+        and created.
+    '';
+    homepage = "https://github.com/google/python-fire";
+    changelog = "https://github.com/google/python-fire/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ leenaars ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fireflyalgorithm/default.nix b/nixpkgs/pkgs/development/python-modules/fireflyalgorithm/default.nix
new file mode 100644
index 000000000000..cabee97bed9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fireflyalgorithm/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "FireflyAlgorithm";
+  version = "0.3.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "firefly-cpp";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-rJOcPQU/oz/qP787OpZsfbjSsT2dWvhJLTs4N5TriWc=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "fireflyalgorithm"
+  ];
+
+  meta = with lib; {
+    description = "An implementation of the stochastic nature-inspired algorithm for optimization";
+    homepage = "https://github.com/firefly-cpp/FireflyAlgorithm";
+    changelog = "https://github.com/firefly-cpp/FireflyAlgorithm/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ firefly-cpp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/firetv/default.nix b/nixpkgs/pkgs/development/python-modules/firetv/default.nix
new file mode 100644
index 000000000000..8cbcc354c834
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/firetv/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, adb-homeassistant
+, flask
+, pure-python-adb-homeassistant
+, pycryptodome
+, pyyaml
+, rsa
+}:
+buildPythonPackage rec {
+  pname = "firetv";
+  version = "1.0.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "602de77411c2caffb322e4ff63fa6cc4eeb9a50c5f4b14e13930ed7cd87cf513";
+  };
+
+  propagatedBuildInputs = [
+    adb-homeassistant
+    flask
+    pure-python-adb-homeassistant
+    pycryptodome
+    pyyaml
+    rsa
+  ];
+
+  # No Tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Communicate with an Amazon Fire TV device via ADB over a network";
+    homepage = "https://github.com/happyleavesaoc/python-firetv/";
+    license = licenses.mit;
+    maintainers = [ maintainers.makefu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/first/default.nix b/nixpkgs/pkgs/development/python-modules/first/default.nix
new file mode 100644
index 000000000000..0e75f61a9f70
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/first/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "first";
+  version = "2.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/yhbCMVfjJfOTqcBJ0OvJJXJ8SkXhfFjcivTb2r2078=";
+  };
+
+  doCheck = false; # no tests
+
+  pythonImportsCheck = [
+    "first"
+  ];
+
+  meta = with lib; {
+    description = "The function you always missed in Python";
+    homepage = "https://github.com/hynek/first/";
+    changelog = "https://github.com/hynek/first/blob/${version}/HISTORY.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ zimbatm ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fitbit/default.nix b/nixpkgs/pkgs/development/python-modules/fitbit/default.nix
new file mode 100644
index 000000000000..df89eef07bfb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fitbit/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, freezegun
+, mock
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, requests-mock
+, requests-oauthlib
+}:
+
+buildPythonPackage rec {
+  pname = "fitbit";
+  version = "0.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "orcasgit";
+    repo = "python-fitbit";
+    rev = version;
+    hash = "sha256-1u3h47lRBrJ7EUWBl5+RLGW4KHHqXqqrXbboZdy7VPA=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    requests-oauthlib
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    mock
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pythonImportsCheck = [
+    "fitbit"
+  ];
+
+  meta = with lib; {
+    description = "Fitbit API Python Client Implementation";
+    homepage = "https://github.com/orcasgit/python-fitbit";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ delroth ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fivem-api/default.nix b/nixpkgs/pkgs/development/python-modules/fivem-api/default.nix
new file mode 100644
index 000000000000..aef6fc342129
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fivem-api/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "fivem-api";
+  version = "0.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6llrMGWbDRmysEw+B6B115hLS5xlktQEXiSHzPLbV5s=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "fivem"
+  ];
+
+  meta = with lib; {
+    description = "Module for interacting with FiveM servers";
+    homepage = "https://github.com/Sander0542/fivem-api";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fixerio/default.nix b/nixpkgs/pkgs/development/python-modules/fixerio/default.nix
new file mode 100644
index 000000000000..eacd4f472aff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fixerio/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, pytestCheckHook
+, httpretty
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "fixerio";
+  version = "1.0.0-alpha";
+
+  src = fetchFromGitHub {
+    owner = "amatellanes";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "009h1mys175xdyznn5bl980vly40544s4ph1zcgqwg2i2ic93gvb";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    httpretty
+    pytestCheckHook
+    responses
+  ];
+
+  disabledTests = [
+    # tests require network access
+    "test_returns_historical_rates_for_symbols_passed_if_both"
+    "test_returns_historical_rates_for_symbols_passed_in_constructor"
+    "test_returns_historical_rates_for_symbols_passed_in_method"
+    "test_returns_latest_rates_for_symbols_passed_in_constructor"
+    "test_returns_latest_rates_for_symbols_passed_in_method"
+    "test_returns_latest_rates_for_symbols_passed_in_method_if_both"
+  ];
+
+  pythonImportsCheck = [ "fixerio" ];
+
+  meta = with lib; {
+    description = "Python client for Fixer.io";
+    longDescription = ''
+      Fixer.io is a free JSON API for current and historical foreign
+      exchange rates published by the European Central Bank.
+    '';
+    homepage = "https://github.com/amatellanes/fixerio";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fixtures/default.nix b/nixpkgs/pkgs/development/python-modules/fixtures/default.nix
new file mode 100644
index 000000000000..2570b1a274b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fixtures/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pbr
+, setuptools
+, testtools
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "fixtures";
+  version = "4.1.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-grHF5p9hVSbvbAZxiKHmxgZ99/iDMlCcmfi4/buXdvM=";
+  };
+
+  nativeBuildInputs = [
+    pbr
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pbr
+  ];
+
+  passthru.optional-dependencies = {
+    streams = [
+      testtools
+    ];
+  };
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.streams;
+
+  meta = {
+    description = "Reusable state for writing clean tests and more";
+    homepage = "https://pypi.org/project/fixtures/";
+    changelog = "https://github.com/testing-cabal/fixtures/blob/${version}/NEWS";
+    license = lib.licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fjaraskupan/default.nix b/nixpkgs/pkgs/development/python-modules/fjaraskupan/default.nix
new file mode 100644
index 000000000000..3068d6542ed7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fjaraskupan/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, bleak
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fjaraskupan";
+  version = "2.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "elupus";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-0tNLwYckWF9GjhniEkiO+A+xDsUriUsMFZxG/FmUfps=";
+  };
+
+  propagatedBuildInputs = [
+    bleak
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "fjaraskupan"
+  ];
+
+  meta = with lib; {
+    description = "Module for controlling Fjäråskupan kitchen fans";
+    homepage = "https://github.com/elupus/fjaraskupan";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flake8-blind-except/default.nix b/nixpkgs/pkgs/development/python-modules/flake8-blind-except/default.nix
new file mode 100644
index 000000000000..c25985e16819
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8-blind-except/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pycodestyle
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "flake8-blind-except";
+  version = "0.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8lpXWp3LPus8dgv5wi22C4taIxICJO0fqppD913X3RY=";
+  };
+
+  propagatedBuildInputs = [
+    pycodestyle
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "flake8_blind_except"
+  ];
+
+  meta = with lib; {
+    description = "A flake8 extension that checks for blind except: statements";
+    homepage = "https://github.com/elijahandrews/flake8-blind-except";
+    license = licenses.mit;
+    maintainers = with maintainers; [ johbo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flake8-bugbear/default.nix b/nixpkgs/pkgs/development/python-modules/flake8-bugbear/default.nix
new file mode 100644
index 000000000000..f2455cf2161f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8-bugbear/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, attrs
+, flake8
+, pytestCheckHook
+, pythonOlder
+, hypothesis
+, hypothesmith
+}:
+
+buildPythonPackage rec {
+  pname = "flake8-bugbear";
+  version = "23.9.16";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "PyCQA";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-fGrefEoyEgJE3danv9hG+Os79ixPzurEzLc3Dnj2M3k=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    flake8
+  ];
+
+  nativeCheckInputs = [
+    flake8
+    pytestCheckHook
+    hypothesis
+    hypothesmith
+  ];
+
+  meta = with lib; {
+    description = "Plugin for Flake8 to find bugs and design problems";
+    homepage = "https://github.com/PyCQA/flake8-bugbear";
+    changelog = "https://github.com/PyCQA/flake8-bugbear/blob/${version}/README.rst#change-log";
+    longDescription = ''
+      A plugin for flake8 finding likely bugs and design problems in your
+      program.
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ newam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flake8-debugger/default.nix b/nixpkgs/pkgs/development/python-modules/flake8-debugger/default.nix
new file mode 100644
index 000000000000..32885570ba76
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8-debugger/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flake8
+, pycodestyle
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "flake8-debugger";
+  version = "4.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-UrACVglB422b+Ab8olI9x/uFYKKV1fGm4VrC3tenOEA=";
+  };
+
+  propagatedBuildInputs = [
+    flake8
+    pycodestyle
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "flake8_debugger"
+  ];
+
+  meta = with lib; {
+    description = "ipdb/pdb statement checker plugin for flake8";
+    homepage = "https://github.com/jbkahn/flake8-debugger";
+    license = licenses.mit;
+    maintainers = with maintainers; [ johbo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flake8-docstrings/default.nix b/nixpkgs/pkgs/development/python-modules/flake8-docstrings/default.nix
new file mode 100644
index 000000000000..c3a08f931557
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8-docstrings/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flake8
+, pydocstyle
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "flake8-docstrings";
+  version = "1.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "PyCQA";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-EafLWySeHB81HRcXiDs56lbUZzGvnT87WVqln0PoLCk=";
+  };
+
+  propagatedBuildInputs = [
+    flake8
+    pydocstyle
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "flake8_docstrings"
+  ];
+
+  meta = with lib; {
+    description = "Extension for flake8 which uses pydocstyle to check docstrings";
+    homepage = "https://github.com/pycqa/flake8-docstrings";
+    changelog = "https://github.com/PyCQA/flake8-docstrings/blob/${version}/HISTORY.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ smaret ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flake8-future-import/default.nix b/nixpkgs/pkgs/development/python-modules/flake8-future-import/default.nix
new file mode 100644
index 000000000000..017dd74fcede
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8-future-import/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, isPy38
+, isPy39
+, pythonAtLeast
+, flake8
+, six
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "flake8-future-import";
+  version = "0.4.7";
+
+  # PyPI tarball doesn't include the test suite
+  src = fetchFromGitHub {
+    owner = "xZise";
+    repo = "flake8-future-import";
+    rev = "refs/tags/${version}";
+    hash = "sha256-2EcCOx3+PCk9LYpQjHCFNpQVI2Pdi+lWL8R6bNadFe0=";
+  };
+
+  patches = lib.optionals (pythonAtLeast "3.10") [
+    ./fix-annotations-version-11.patch
+  ] ++ lib.optionals (isPy38 || isPy39) [
+    ./fix-annotations-version-10.patch
+  ] ++ lib.optionals isPy27 [
+    # Upstream disables this test case naturally on python 3, but it also fails
+    # inside NixPkgs for python 2. Since it's going to be deleted, we just skip it
+    # on py2 as well.
+    ./skip-test.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace "test_flake8_future_import.py" \
+      --replace "'flake8'" "'${lib.getExe flake8}'"
+  '';
+
+  propagatedBuildInputs = [ flake8 ];
+
+  nativeCheckInputs = [ six ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    ${python.interpreter} -m test_flake8_future_import
+
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "A flake8 extension to check for the imported __future__ modules to make it easier to have a consistent code base";
+    homepage = "https://github.com/xZise/flake8-future-import";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flake8-future-import/fix-annotations-version-10.patch b/nixpkgs/pkgs/development/python-modules/flake8-future-import/fix-annotations-version-10.patch
new file mode 100644
index 000000000000..2e3062c8ac43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8-future-import/fix-annotations-version-10.patch
@@ -0,0 +1,13 @@
+diff --git a/flake8_future_import.py b/flake8_future_import.py
+index 92c3fda..27a1a66 100755
+--- a/flake8_future_import.py
++++ b/flake8_future_import.py
+@@ -76,7 +76,7 @@ UNICODE_LITERALS = Feature(4, 'unicode_literals', (2, 6, 0), (3, 0, 0))
+ GENERATOR_STOP = Feature(5, 'generator_stop', (3, 5, 0), (3, 7, 0))
+ NESTED_SCOPES = Feature(6, 'nested_scopes', (2, 1, 0), (2, 2, 0))
+ GENERATORS = Feature(7, 'generators', (2, 2, 0), (2, 3, 0))
+-ANNOTATIONS = Feature(8, 'annotations', (3, 7, 0), (4, 0, 0))
++ANNOTATIONS = Feature(8, 'annotations', (3, 7, 0), (3, 10, 0))
+ 
+ 
+ # Order important as it defines the error code
diff --git a/nixpkgs/pkgs/development/python-modules/flake8-future-import/fix-annotations-version-11.patch b/nixpkgs/pkgs/development/python-modules/flake8-future-import/fix-annotations-version-11.patch
new file mode 100644
index 000000000000..7cbb5e562c33
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8-future-import/fix-annotations-version-11.patch
@@ -0,0 +1,13 @@
+diff --git a/flake8_future_import.py b/flake8_future_import.py
+index 92c3fda..27a1a66 100755
+--- a/flake8_future_import.py
++++ b/flake8_future_import.py
+@@ -76,7 +76,7 @@ UNICODE_LITERALS = Feature(4, 'unicode_literals', (2, 6, 0), (3, 0, 0))
+ GENERATOR_STOP = Feature(5, 'generator_stop', (3, 5, 0), (3, 7, 0))
+ NESTED_SCOPES = Feature(6, 'nested_scopes', (2, 1, 0), (2, 2, 0))
+ GENERATORS = Feature(7, 'generators', (2, 2, 0), (2, 3, 0))
+-ANNOTATIONS = Feature(8, 'annotations', (3, 7, 0), (4, 0, 0))
++ANNOTATIONS = Feature(8, 'annotations', (3, 7, 0), (3, 11, 0))
+ 
+ 
+ # Order important as it defines the error code
diff --git a/nixpkgs/pkgs/development/python-modules/flake8-future-import/skip-test.patch b/nixpkgs/pkgs/development/python-modules/flake8-future-import/skip-test.patch
new file mode 100644
index 000000000000..300358f9158b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8-future-import/skip-test.patch
@@ -0,0 +1,13 @@
+diff --git a/test_flake8_future_import.py b/test_flake8_future_import.py
+index 84fde59..345f23f 100644
+--- a/test_flake8_future_import.py
++++ b/test_flake8_future_import.py
+@@ -230,7 +230,7 @@ class TestBadSyntax(TestCaseBase):
+     """Test using various bad syntax examples from Python's library."""
+ 
+ 
+-@unittest.skipIf(sys.version_info[:2] >= (3, 7), 'flake8 supports up to 3.6')
++@unittest.skip("Has issue with installed path for flake8 in python2")
+ class Flake8TestCase(TestCaseBase):
+ 
+     """
diff --git a/nixpkgs/pkgs/development/python-modules/flake8-import-order/default.nix b/nixpkgs/pkgs/development/python-modules/flake8-import-order/default.nix
new file mode 100644
index 000000000000..51c9b9eb569e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8-import-order/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flake8
+, pycodestyle
+, pylama
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "flake8-import-order";
+  version = "0.18.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-4jlB+JLaPgwJ1xG6u7DHO8c1JC6bIWtyZhZ1ipINkA4=";
+  };
+
+  propagatedBuildInputs = [
+    pycodestyle
+  ];
+
+  nativeCheckInputs = [
+    flake8
+    pycodestyle
+    pylama
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "flake8_import_order"
+  ];
+
+  meta = with lib; {
+    description = "Flake8 and pylama plugin that checks the ordering of import statements";
+    homepage = "https://github.com/PyCQA/flake8-import-order";
+    changelog = "https://github.com/PyCQA/flake8-import-order/blob/${version}/CHANGELOG.rst";
+    license = with licenses; [ lgpl3 mit ];
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flake8-length/default.nix b/nixpkgs/pkgs/development/python-modules/flake8-length/default.nix
new file mode 100644
index 000000000000..9214a92ce517
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8-length/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flake8
+, flit-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "flake8-length";
+  version = "0.3.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Dr1hTCU2G1STczXJsUPMGFYs1NpIAk1I95vxXsRTtRA=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    flake8
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "flake8_length"
+  ];
+
+  pytestFlagsArray = [
+    "tests/"
+  ];
+
+  meta = with lib; {
+    description = "Flake8 plugin for a smart line length validation";
+    homepage = "https://github.com/orsinium-labs/flake8-length";
+    changelog = "https://github.com/orsinium-labs/flake8-length/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sauyon ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flake8-polyfill/default.nix b/nixpkgs/pkgs/development/python-modules/flake8-polyfill/default.nix
new file mode 100644
index 000000000000..1db143882736
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8-polyfill/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, flake8
+, mock
+, pep8
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "flake8-polyfill";
+  version = "1.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1nlf1mkqw856vi6782qcglqhaacb23khk9wkcgn55npnjxshhjz4";
+  };
+
+  propagatedBuildInputs = [
+    flake8
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pep8
+    pytestCheckHook
+  ];
+
+  patches = [
+    # Skip unnecessary tests on Flake8, https://github.com/PyCQA/pep8-naming/pull/181
+    (fetchpatch {
+      name = "skip-tests.patch";
+      url = "https://github.com/PyCQA/flake8-polyfill/commit/3cf414350e82ceb835ca2edbd5d5967d33e9ff35.patch";
+      sha256 = "mElZafodq8dF3wLO/LOqwFb7eLMsPLlEjNSu5AWqets=";
+    })
+  ];
+
+  postPatch = ''
+    # Failed: [pytest] section in setup.cfg files is no longer supported, change to [tool:pytest] instead.
+    substituteInPlace setup.cfg \
+      --replace pytest 'tool:pytest'
+  '';
+
+  pythonImportsCheck = [
+    "flake8_polyfill"
+  ];
+
+  meta = with lib; {
+    homepage = "https://gitlab.com/pycqa/flake8-polyfill";
+    description = "Polyfill package for Flake8 plugins";
+    license = licenses.mit;
+    maintainers = with maintainers; [ eadwu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flake8/default.nix b/nixpkgs/pkgs/development/python-modules/flake8/default.nix
new file mode 100644
index 000000000000..7a3bd82a5145
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flake8/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, mccabe
+, pycodestyle
+, pyflakes
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "flake8";
+  version = "6.1.0";
+
+  disabled = pythonOlder "3.8";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "PyCQA";
+    repo = "flake8";
+    rev = version;
+    hash = "sha256-N8bufkn1CUREHusVc2mQ1YlNr7lrESEZGmlN68bhgbE=";
+  };
+
+  propagatedBuildInputs = [
+    mccabe
+    pycodestyle
+    pyflakes
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Flake8 is a wrapper around pyflakes, pycodestyle and mccabe.";
+    homepage = "https://github.com/pycqa/flake8";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+    mainProgram = "flake8";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flaky/default.nix b/nixpkgs/pkgs/development/python-modules/flaky/default.nix
new file mode 100644
index 000000000000..43b3288f94b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flaky/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "flaky";
+  version = "3.7.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-OtEAeAchoZEfV6FlgJt+omWnhjMFrLZnCCIIIMr4qg0=";
+  };
+
+  nativeCheckInputs = [
+    mock
+    pytest
+  ];
+
+  checkPhase = ''
+    # based on tox.ini
+    pytest -k 'example and not options' --doctest-modules test/test_pytest/
+    pytest -k 'example and not options' test/test_pytest/
+    pytest -p no:flaky test/test_pytest/test_flaky_pytest_plugin.py
+    pytest --force-flaky --max-runs 2  test/test_pytest/test_pytest_options_example.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/box/flaky";
+    description = "Plugin for nose or py.test that automatically reruns flaky tests";
+    license = licenses.asl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flametree/default.nix b/nixpkgs/pkgs/development/python-modules/flametree/default.nix
new file mode 100644
index 000000000000..a6d3ebbd0c4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flametree/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fontconfig
+, matplotlib
+, pandas
+, pytestCheckHook
+, weasyprint
+}:
+
+buildPythonPackage rec {
+  pname = "flametree";
+  version = "0.1.12";
+
+  src = fetchFromGitHub {
+    owner = "Edinburgh-Genome-Foundry";
+    repo = "Flametree";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-oyiuhsYouGDKRssKc0aYIoG32H7GS6Bn4RtI7/9N158=";
+  };
+
+  nativeCheckInputs = [
+    matplotlib
+    pandas
+    pytestCheckHook
+    weasyprint
+  ];
+
+  preCheck = ''
+    export FONTCONFIG_FILE=${fontconfig.out}/etc/fonts/fonts.conf
+  '';
+
+  disabledTests = [
+    # AssertionError, https://github.com/Edinburgh-Genome-Foundry/Flametree/issues/9
+    "test_weasyprint"
+  ];
+
+  pythonImportsCheck = [ "flametree" ];
+
+  meta = with lib; {
+    description = "Python file and zip operations made easy";
+    homepage = "https://github.com/Edinburgh-Genome-Foundry/Flametree";
+    license = licenses.mit;
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flammkuchen/default.nix b/nixpkgs/pkgs/development/python-modules/flammkuchen/default.nix
new file mode 100644
index 000000000000..61758ae482b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flammkuchen/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pandas
+, pytestCheckHook
+, scipy
+, setuptools
+, tables
+}:
+
+buildPythonPackage rec {
+  pname = "flammkuchen";
+  version = "1.0.3";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-z68HBsU9J6oe8+YL4OOQiMYQRs3TZUDM+e2ssqo6BFI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    tables
+  ];
+
+  nativeCheckInputs = [
+    pandas
+    pytestCheckHook
+  ];
+
+  meta = {
+    homepage = "https://github.com/portugueslab/flammkuchen";
+    description = "Flexible HDF5 saving/loading library forked from deepdish (University of Chicago) and maintained by the Portugues lab";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ tbenst ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flasgger/default.nix b/nixpkgs/pkgs/development/python-modules/flasgger/default.nix
new file mode 100644
index 000000000000..4bb5e9fe30d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flasgger/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+
+# dependencies
+, flask
+, jsonschema
+, mistune
+, pyyaml
+, six
+, werkzeug
+
+# tests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "flasgger";
+  version = "0.9.5";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "flasgger";
+    repo = "flasgger";
+    rev = version;
+    hash = "sha256-cYFMKZxpi69gVWqyZUltCL0ZwcfIABNsJKqAhN2TTSg=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # flask 2.3 compat
+      url = "https://github.com/flasgger/flasgger/commit/ab77be7c6de1d4b361f0eacfa37290239963f890.patch";
+      hash = "sha256-ZbE5pPUP23nZAP/qcdeWkwzrZgqJSRES7oFta8U1uVQ=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    flask
+    jsonschema
+    mistune
+    pyyaml
+    six
+    werkzeug
+  ];
+
+  pythonImportsCheck = [
+    "flasgger"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  doCheck = false; # missing flex dependency
+
+  meta = with lib; {
+    description = "Easy OpenAPI specs and Swagger UI for your Flask API";
+    homepage = "https://github.com/flasgger/flasgger/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flashtext/default.nix b/nixpkgs/pkgs/development/python-modules/flashtext/default.nix
new file mode 100644
index 000000000000..b0623bd18d59
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flashtext/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "flashtext";
+  version = "2.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1kq5idfp9skqkjdcld40igxn2yqjly8jpmxawkp0skwxw29jpgm1";
+  };
+
+  # json files that tests look for don't exist in the pypi dist
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/vi3k6i5/flashtext";
+    description = "Python package to replace keywords in sentences or extract keywords from sentences";
+    maintainers = with maintainers; [ aanderse ];
+    license = with licenses; [ mit ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-admin/default.nix b/nixpkgs/pkgs/development/python-modules/flask-admin/default.nix
new file mode 100644
index 000000000000..c4d686c01478
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-admin/default.nix
@@ -0,0 +1,125 @@
+{ lib
+, arrow
+, azure-storage-blob
+, boto
+, buildPythonPackage
+, colour
+, email-validator
+, enum34
+, fetchpatch
+, fetchPypi
+, flask
+, flask-babelex
+, flask-mongoengine
+, flask-sqlalchemy
+, geoalchemy2
+, mongoengine
+, pillow
+, psycopg2
+, pymongo
+, pytestCheckHook
+, pythonOlder
+, shapely
+, sqlalchemy
+, sqlalchemy-citext
+, sqlalchemy-utils
+, wtf-peewee
+, wtforms
+}:
+
+buildPythonPackage rec {
+  pname = "flask-admin";
+  version = "1.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "Flask-Admin";
+    inherit version;
+    hash = "sha256-JMrir4MramEaAdfcNfQtJmwdbHWkJrhp2MskG3gjM2k=";
+  };
+
+  patches = [
+    # https://github.com/flask-admin/flask-admin/pull/2374
+    (fetchpatch {
+      name = "pillow-10-compatibility.patch";
+      url = "https://github.com/flask-admin/flask-admin/commit/96b92deef8b087e86a9dc3e84381d254ea5c0342.patch";
+      hash = "sha256-iR5kxyeZaEyved5InZuPmcglTD77zW18/eSHGwOuW40=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    flask
+    wtforms
+  ];
+
+  passthru.optional-dependencies = {
+    aws = [
+      boto
+    ];
+    azure = [
+      azure-storage-blob
+    ];
+  };
+
+  nativeCheckInputs = [
+    arrow
+    colour
+    email-validator
+    flask-babelex
+    flask-mongoengine
+    flask-sqlalchemy
+    geoalchemy2
+    mongoengine
+    pillow
+    psycopg2
+    pymongo
+    pytestCheckHook
+    shapely
+    sqlalchemy
+    sqlalchemy-citext
+    sqlalchemy-utils
+    wtf-peewee
+  ];
+
+  disabledTests = [
+    # Incompatible with werkzeug 2.1
+    "test_mockview"
+    # Tests are outdated and don't work with peewee
+    "test_nested_flask_views"
+    "test_export_csv"
+    "test_list_row_actions"
+    "test_column_editable_list"
+    "test_column_filters"
+    "test_export_csv"
+  ];
+
+  disabledTestPaths = [
+    # Tests have additional requirements
+    "flask_admin/tests/geoa/test_basic.py"
+    "flask_admin/tests/mongoengine/test_basic.py"
+    "flask_admin/tests/pymongo/test_basic.py"
+    "flask_admin/tests/sqla/test_basic.py"
+    "flask_admin/tests/sqla/test_form_rules.py"
+    "flask_admin/tests/sqla/test_inlineform.py"
+    "flask_admin/tests/sqla/test_postgres.py"
+    "flask_admin/tests/sqla/test_translation.py"
+    # RuntimeError: Working outside of application context.
+    "flask_admin/tests/sqla/test_multi_pk.py"
+    # Broken test
+    "flask_admin/tests/fileadmin/test_fileadmin.py"
+  ];
+
+  pythonImportsCheck = [
+    "flask_admin"
+  ];
+
+  meta = with lib; {
+    description = "Admin interface framework for Flask";
+    homepage = "https://github.com/flask-admin/flask-admin/";
+    changelog = "https://github.com/flask-admin/flask-admin/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-api/default.nix b/nixpkgs/pkgs/development/python-modules/flask-api/default.nix
new file mode 100644
index 000000000000..9b4a398f7f79
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-api/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, flask
+, markdown
+}:
+
+buildPythonPackage rec {
+  pname = "Flask-API";
+  version = "3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "flask-api";
+    repo = "flask-api";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-nHgeI5FLKkDp4uWO+0eaT4YSOMkeQ0wE3ffyJF+WzTM=";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    markdown
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/flask-api/flask-api";
+    changelog = "https://github.com/flask-api/flask-api/releases/tag/v${version}";
+    description = "Browsable web APIs for Flask";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-appbuilder/default.nix b/nixpkgs/pkgs/development/python-modules/flask-appbuilder/default.nix
new file mode 100644
index 000000000000..6309e0ddd2c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-appbuilder/default.nix
@@ -0,0 +1,90 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, apispec
+, colorama
+, click
+, email-validator
+, flask
+, flask-babel
+, flask-limiter
+, flask-login
+, flask-openid
+, flask-sqlalchemy
+, flask-wtf
+, flask-jwt-extended
+, jsonschema
+, marshmallow
+, marshmallow-enum
+, marshmallow-sqlalchemy
+, python-dateutil
+, pythonOlder
+, prison
+, pyjwt
+, pyyaml
+, sqlalchemy-utils
+}:
+
+buildPythonPackage rec {
+  pname = "flask-appbuilder";
+  version = "4.3.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Flask-AppBuilder";
+    inherit version;
+    hash = "sha256-jKlxD6fScEdH0ZXhG0h9RaVx9AVZ2DmdnV36QuofPHg=";
+  };
+
+  propagatedBuildInputs = [
+    apispec
+    colorama
+    click
+    email-validator
+    flask
+    flask-babel
+    flask-limiter
+    flask-login
+    flask-openid
+    flask-sqlalchemy
+    flask-wtf
+    flask-jwt-extended
+    jsonschema
+    marshmallow
+    marshmallow-enum
+    marshmallow-sqlalchemy
+    python-dateutil
+    prison
+    pyjwt
+    pyyaml
+    sqlalchemy-utils
+  ] ++ apispec.optional-dependencies.yaml;
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "apispec[yaml]>=3.3, <6" "apispec[yaml]" \
+      --replace "Flask-SQLAlchemy>=2.4, <3" "Flask-SQLAlchemy" \
+      --replace "Flask-Babel>=1, <3" "Flask-Babel" \
+      --replace "marshmallow-sqlalchemy>=0.22.0, <0.27.0" "marshmallow-sqlalchemy" \
+      --replace "prison>=0.2.1, <1.0.0" "prison"
+  '';
+
+  # Majority of tests require network access or mongo
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "flask_appbuilder"
+  ];
+
+  meta = with lib; {
+    description = "Application development framework, built on top of Flask";
+    homepage = "https://github.com/dpgaspar/flask-appbuilder/";
+    changelog = "https://github.com/dpgaspar/Flask-AppBuilder/blob/v${version}/CHANGELOG.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+    # Support for flask-sqlalchemy >= 3.0 is missing, https://github.com/dpgaspar/Flask-AppBuilder/pull/1940
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-appbuilder/upgrade-to-flask_jwt_extended-4.patch b/nixpkgs/pkgs/development/python-modules/flask-appbuilder/upgrade-to-flask_jwt_extended-4.patch
new file mode 100644
index 000000000000..f2bf072b7f0a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-appbuilder/upgrade-to-flask_jwt_extended-4.patch
@@ -0,0 +1,45 @@
+diff --git a/flask_appbuilder/security/api.py b/flask_appbuilder/security/api.py
+index 2e2dfd612..df1bd5a25 100644
+--- a/flask_appbuilder/security/api.py
++++ b/flask_appbuilder/security/api.py
+@@ -3,7 +3,7 @@
+     create_access_token,
+     create_refresh_token,
+     get_jwt_identity,
+-    jwt_refresh_token_required,
++    jwt_required,
+ )
+ 
+ from ..api import BaseApi, safe
+@@ -118,7 +118,7 @@ def login(self):
+         return self.response(200, **resp)
+ 
+     @expose("/refresh", methods=["POST"])
+-    @jwt_refresh_token_required
++    @jwt_required(refresh=True)
+     @safe
+     def refresh(self):
+         """
+diff --git a/flask_appbuilder/security/manager.py b/flask_appbuilder/security/manager.py
+index fe7697007..3b22ab255 100644
+--- a/flask_appbuilder/security/manager.py
++++ b/flask_appbuilder/security/manager.py
+@@ -297,7 +297,7 @@ def create_jwt_manager(self, app) -> JWTManager:
+         """
+         jwt_manager = JWTManager()
+         jwt_manager.init_app(app)
+-        jwt_manager.user_loader_callback_loader(self.load_user_jwt)
++        jwt_manager.user_lookup_loader(self.load_user_jwt)
+         return jwt_manager
+ 
+     def create_builtin_roles(self):
+@@ -1944,7 +1944,8 @@ def del_permission_role(self, role, perm_view):
+     def load_user(self, pk):
+         return self.get_user_by_id(int(pk))
+ 
+-    def load_user_jwt(self, pk):
++    def load_user_jwt(self, _jwt_header, jwt_data):
++        pk = jwt_data["sub"]
+         user = self.load_user(pk)
+         # Set flask g.user to JWT user, we can't do it on before request
+         g.user = user
diff --git a/nixpkgs/pkgs/development/python-modules/flask-assets/default.nix b/nixpkgs/pkgs/development/python-modules/flask-assets/default.nix
new file mode 100644
index 000000000000..07c384d1c6ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-assets/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, flask, webassets, flask-script, nose }:
+
+buildPythonPackage rec {
+  pname = "flask-assets";
+  version = "2.0";
+
+  src = fetchPypi {
+    pname = "Flask-Assets";
+    inherit version;
+    hash = "sha256-Hf3qNeQHRNRqracoMfdhPWe/OOiyDMqqnpH9w3qjuMI=";
+  };
+
+  patchPhase = ''
+    substituteInPlace tests/test_integration.py --replace 'static_path=' 'static_url_path='
+    substituteInPlace tests/test_integration.py --replace "static_folder = '/'" "static_folder = '/x'"
+    substituteInPlace tests/test_integration.py --replace "'/foo'" "'/x/foo'"
+  '';
+
+  propagatedBuildInputs = [ flask webassets flask-script nose ];
+
+  meta = with lib; {
+    homepage = "https://github.com/miracle2k/flask-assets";
+    description = "Asset management for Flask, to compress and merge CSS and Javascript files";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-autoindex/default.nix b/nixpkgs/pkgs/development/python-modules/flask-autoindex/default.nix
new file mode 100644
index 000000000000..c8e14eaf35e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-autoindex/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flask
+, flask-silk
+, future
+, pythonOlder
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "flask-autoindex";
+  version = "0.6.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Flask-AutoIndex";
+    inherit version;
+    sha256 = "ea319f7ccadf68ddf98d940002066278c779323644f9944b300066d50e2effc7";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    flask-silk
+    future
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "flask_autoindex"
+  ];
+
+  meta = with lib; {
+    description = "The mod_autoindex for Flask";
+    longDescription = ''
+      Flask-AutoIndex generates an index page for your Flask application automatically.
+      The result is just like mod_autoindex, but the look is more awesome!
+    '';
+    homepage = "https://flask-autoindex.readthedocs.io/";
+    changelog = "https://github.com/general03/flask-autoindex/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd2;
+    maintainers = teams.sage.members;
+    # https://github.com/general03/flask-autoindex/issues/67
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-babel/default.nix b/nixpkgs/pkgs/development/python-modules/flask-babel/default.nix
new file mode 100644
index 000000000000..f8a6d3b31000
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-babel/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+
+# build-system
+, poetry-core
+
+# docs
+, furo
+, sphinxHook
+
+# runtime
+, babel
+, flask
+, jinja2
+, pytz
+
+# tests
+, pytest-mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "flask-babel";
+  version = "4.0.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "python-babel";
+    repo = "flask-babel";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-BAT+oupy4MCSjeZ4hFtSKMkGU9xZtc7Phnz1mIsb2Kc=";
+  };
+
+  outputs = [
+    "out"
+    "doc"
+  ];
+
+  nativeBuildInputs = [
+    furo
+    poetry-core
+    sphinxHook
+  ];
+
+  propagatedBuildInputs = [
+    babel
+    flask
+    jinja2
+    pytz
+  ];
+
+  pythonImportsCheck = [
+    "flask_babel"
+  ];
+
+  checkInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/python-babel/flask-babel/releases/tag/v${version}";
+    description = "Adds i18n/l10n support to Flask applications";
+    longDescription = ''
+      Implements i18n and l10n support for Flask.
+      This is based on the Python babel module as well as pytz both of which are
+      installed automatically for you if you install this library.
+    '';
+    license = licenses.bsd2;
+    maintainers = teams.sage.members ++ (with maintainers; [ matejc ]);
+    homepage = "https://github.com/python-babel/flask-babel";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-babelex/default.nix b/nixpkgs/pkgs/development/python-modules/flask-babelex/default.nix
new file mode 100644
index 000000000000..7d3679e8f588
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-babelex/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flask
+, babel
+, speaklater
+, jinja2
+, pytestCheckHook
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "flask-babelex";
+  version = "0.9.4";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "Flask-BabelEx";
+    sha256 = "09yfr8hlwvpgvq8kp1y7qbnnl0q28hi0348bv199ssiqx779r99r";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    babel
+    speaklater
+    jinja2
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytz
+  ];
+
+  pytestFlagsArray = [
+    "tests/tests.py"
+  ];
+
+  disabledTests = [
+    # Disabled 3 tests failing due to string representations of dates:
+    # Like "12. April 2010 um 15:46:00 MESZ" != 12. "April 2010 15:46:00 MESZ"
+    "test_init_app"
+    "test_custom_locale_selector"
+    "test_basics"
+    "test_non_initialized"
+    "test_refreshing"
+  ];
+
+  meta = with lib; {
+    description = "Adds i18n/l10n support to Flask applications";
+    homepage = "https://github.com/mrjoes/flask-babelex";
+    license = licenses.bsd3;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-basicauth/default.nix b/nixpkgs/pkgs/development/python-modules/flask-basicauth/default.nix
new file mode 100644
index 000000000000..51fe449bc90b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-basicauth/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, flask
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "flask-basicauth";
+  version = "0.2.0";
+
+  src = fetchFromGitHub {
+    owner = "jpvanhal";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-han0OjMI1XmuWKHGVpk+xZB+/+cpV1I+659zOG3hcPY=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # The unit tests fail due to an invalid import:
+      #   from flask.ext.basicauth import BasicAuth
+      #
+      # This patch replaces it with the correct import:
+      #   from flask_basicauth import BasicAuth
+      #
+      # The patch uses the changes from this pull request,
+      # and therefore can be removed once this pull request
+      # has been merged:
+      #   https://github.com/jpvanhal/flask-basicauth/pull/29
+      name = "fix-test-flask-ext-imports.patch";
+      url = "https://github.com/jpvanhal/flask-basicauth/commit/23f57dc1c3d85ea6fc7f468e8d8c6f19348a0a81.patch";
+      hash = "sha256-njUYjO0TRe3vr5D0XjIfCNcsFlShbGxtFV/DJerAKDE=";
+    })
+  ];
+
+  propagatedBuildInputs = [ flask ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m unittest discover
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "flask_basicauth" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jpvanhal/flask-basicauth";
+    description = "HTTP basic access authentication for Flask";
+    license = licenses.mit;
+    maintainers = with maintainers; [ wesnel ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-bcrypt/default.nix b/nixpkgs/pkgs/development/python-modules/flask-bcrypt/default.nix
new file mode 100644
index 000000000000..856c7f010bb0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-bcrypt/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, bcrypt
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "flask-bcrypt";
+  version = "1.0.1";
+
+  src = fetchFromGitHub {
+    owner = "maxcountryman";
+    repo = pname;
+    rev = version;
+    hash = "sha256-WlIholi/nzq6Ikc0LS6FhG0Q5Kz0kvvAlA2YJ7EksZ4=";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    bcrypt
+  ];
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  pythonImportsCheck = [
+    "flask_bcrypt"
+  ];
+
+  meta = with lib; {
+    description = "Brcrypt hashing for Flask";
+    homepage = "https://github.com/maxcountryman/flask-bcrypt";
+    license = licenses.bsd3;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-bootstrap/default.nix b/nixpkgs/pkgs/development/python-modules/flask-bootstrap/default.nix
new file mode 100644
index 000000000000..797be78bc563
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-bootstrap/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, flask, visitor, dominate }:
+
+buildPythonPackage rec {
+  pname = "Flask-Bootstrap";
+  version = "3.3.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1j1s2bplaifsnmr8vfxa3czca4rz78xyhrg4chx39xl306afs26b";
+  };
+
+  propagatedBuildInputs = [ flask visitor dominate ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mbr/flask-bootstrap";
+    description = "Ready-to-use Twitter-bootstrap for use in Flask.";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-caching/default.nix b/nixpkgs/pkgs/development/python-modules/flask-caching/default.nix
new file mode 100644
index 000000000000..08ff5d808f06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-caching/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, cachelib
+, flask
+, asgiref
+, pytest-asyncio
+, pytest-xprocess
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "Flask-Caching";
+  version = "2.0.2";
+  format = "setuptools";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JLYMVS1ZqWBcwbakLFbNs5qCoo2rRTK77bkiKuVOy04=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "cachelib >= 0.9.0, < 0.10.0" "cachelib"
+  '';
+
+  propagatedBuildInputs = [
+    cachelib
+    flask
+  ];
+
+  nativeCheckInputs = [
+    asgiref
+    pytest-asyncio
+    pytest-xprocess
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # backend_cache relies on pytest-cache, which is a stale package from 2013
+    "backend_cache"
+    # optional backends
+    "Redis"
+    "Memcache"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # ignore flaky test
+    "test_cached_view_class"
+  ];
+
+  meta = with lib; {
+    description = "A caching extension for Flask";
+    homepage = "https://github.com/pallets-eco/flask-caching";
+    changelog = "https://github.com/pallets-eco/flask-caching/blob/v${version}/CHANGES.rst";
+    maintainers = with maintainers; [ ];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-common/default.nix b/nixpkgs/pkgs/development/python-modules/flask-common/default.nix
new file mode 100644
index 000000000000..cba8e9e8efd4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-common/default.nix
@@ -0,0 +1,20 @@
+{ lib, fetchPypi, buildPythonPackage
+, crayons, flask, flask-caching, gunicorn, maya, meinheld, whitenoise }:
+
+buildPythonPackage rec {
+  pname = "Flask-Common";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "13d99f2dbc0a332b8bc4b2cc394d3e48f89672c266868e372cd9d7b433d921a9";
+  };
+
+  propagatedBuildInputs = [ crayons flask flask-caching gunicorn maya meinheld whitenoise ];
+
+  meta = with lib; {
+    description = "Flask extension with lots of common time-savers";
+    homepage = "https://github.com/kennethreitz/flask-common";
+    license = licenses.asl20; # XXX: setup.py lists BSD but git repo has Apache 2.0 LICENSE
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-compress/default.nix b/nixpkgs/pkgs/development/python-modules/flask-compress/default.nix
new file mode 100644
index 000000000000..fe2371149523
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-compress/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, isPyPy
+, setuptools
+, setuptools-scm
+, flask
+, brotli
+, brotlicffi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  version = "1.14";
+  pname = "Flask-Compress";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "colour-science";
+    repo = "flask-compress";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-eP6i4h+O4vkjlhfy3kyB+PY7iHVzOnRBRD8lj5yHehU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    flask
+  ] ++ lib.optionals (!isPyPy) [
+    brotli
+  ] ++ lib.optionals isPyPy [
+    brotlicffi
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "flask_compress"
+  ];
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  meta = with lib; {
+    description = "Compress responses in your Flask app with gzip, deflate or brotli";
+    homepage = "https://github.com/colour-science/flask-compress";
+    changelog = "https://github.com/colour-science/flask-compress/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-cors/default.nix b/nixpkgs/pkgs/development/python-modules/flask-cors/default.nix
new file mode 100644
index 000000000000..abc90cdbb0e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-cors/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, flask
+, packaging
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "flask-cors";
+  version = "4.0.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "corydolphin";
+    repo = "flask-cors";
+    rev = "refs/tags/${version}";
+    hash = "sha256-o//ulROKKBv/CBJIGPBFP/+T0TpMHUVjr23Y5g1V05g=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    flask
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    packaging
+  ];
+
+  meta = with lib; {
+    description = "A Flask extension adding a decorator for CORS support";
+    homepage = "https://github.com/corydolphin/flask-cors";
+    changelog = "https://github.com/corydolphin/flask-cors/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-dramatiq/default.nix b/nixpkgs/pkgs/development/python-modules/flask-dramatiq/default.nix
new file mode 100644
index 000000000000..6f8884516f49
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-dramatiq/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitLab
+, poetry-core
+, dramatiq
+, flask
+, requests
+, pytestCheckHook
+, flask-migrate
+, periodiq
+, postgresql
+, postgresqlTestHook
+, psycopg2
+}:
+
+buildPythonPackage {
+  pname = "flask-dramatiq";
+  version = "0.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitLab {
+    owner = "bersace";
+    repo = "flask-dramatiq";
+    rev = "840209e9bf582b4dda468e8bba515f248f3f8534";
+    hash = "sha256-qjV1zyVzHPXMt+oUeGBdP9XVlbcSz2MF9Zygj543T4w=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'poetry>=0.12' 'poetry-core' \
+      --replace 'poetry.masonry.api' 'poetry.core.masonry.api'
+
+    patchShebangs --build ./example.py
+
+    sed -i ./tests/unit/pytest.ini \
+      -e 's:--cov=flask_dramatiq::' \
+      -e 's:--cov-report=term-missing::'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    dramatiq
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    flask
+    requests
+    flask-migrate
+    periodiq
+    postgresql
+    postgresqlTestHook
+    psycopg2
+  ] ++ dramatiq.optional-dependencies.rabbitmq;
+
+  postgresqlTestSetupPost = ''
+    substituteInPlace config.py \
+      --replace 'SQLALCHEMY_DATABASE_URI = f"postgresql://{PGUSER}:{PGPASSWORD}@{PGHOST}/{PGDATABASE}"' \
+        "SQLALCHEMY_DATABASE_URI = \"postgresql://$PGUSER/$PGDATABASE?host=$PGHOST\""
+    python3 ./example.py db upgrade
+  '';
+
+  pytestFlagsArray = [ "-x" "tests/func/" "tests/unit"];
+
+  pythonImportsCheck = [ "flask_dramatiq" ];
+
+  # Does HTTP requests to localhost
+  disabledTests = [
+    "test_fast"
+    "test_other"
+  ];
+
+  meta = with lib; {
+    description = "Adds Dramatiq support to your Flask application";
+    homepage = "https://gitlab.com/bersace/flask-dramatiq";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ traxys ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-elastic/default.nix b/nixpkgs/pkgs/development/python-modules/flask-elastic/default.nix
new file mode 100644
index 000000000000..c3ea512f803a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-elastic/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi
+, flask, elasticsearch }:
+
+buildPythonPackage rec {
+  pname = "flask-elastic";
+  version = "0.2";
+
+  src = fetchPypi {
+    pname = "Flask-Elastic";
+    inherit version;
+    hash = "sha256-XwGm/FQbXSV2qbAlHyAbT4DLcQnIseDm1Qqdb5zjE0M=";
+  };
+
+  propagatedBuildInputs = [ flask elasticsearch ];
+  doCheck = false; # no tests
+
+  meta = with lib; {
+    description = "Integrates official client for Elasticsearch into Flask";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.mic92 ];
+    homepage = "https://github.com/marceltschoppch/flask-elastic";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-expects-json/default.nix b/nixpkgs/pkgs/development/python-modules/flask-expects-json/default.nix
new file mode 100644
index 000000000000..fd608b504451
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-expects-json/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, jsonschema
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "flask-expects-json";
+  version = "1.7.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Fischerfredl";
+    repo = pname;
+    rev = version;
+    hash = "sha256-CUxuwqjjAb9Fy6xWtX1WtSANYaYr5//vY8k89KghYoQ=";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    jsonschema
+  ] ++ flask.optional-dependencies.async;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "flask_expects_json"
+  ];
+
+  disabledTests = [
+    # https://github.com/Fischerfredl/flask-expects-json/issues/26
+    "test_check_mimetype"
+    "test_default_behaviour"
+    "test_default_gets_validated"
+    "test_format_validation_rejection"
+    "test_ignore_multiple"
+    "test_ignore_one"
+    "test_valid_decorator_no_schema_async"
+    "test_valid_decorator"
+    "test_validation_invalid"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/fischerfredl/flask-expects-json";
+    description = "Decorator for REST endpoints in flask. Validate JSON request data.";
+    license = licenses.mit;
+    maintainers = [];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-gravatar/default.nix b/nixpkgs/pkgs/development/python-modules/flask-gravatar/default.nix
new file mode 100644
index 000000000000..f96390211c1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-gravatar/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flask
+, pytestCheckHook
+, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "flask-gravatar";
+  version = "0.5.0";
+
+  src = fetchPypi {
+    pname = "Flask-Gravatar";
+    inherit version;
+    sha256 = "YGZfMcLGEokdto/4Aek+06CIHGyOw0arxk0qmSP1YuE=";
+  };
+
+  postPatch = ''
+    sed -i setup.py \
+     -e "s|tests_require=tests_require,||g" \
+     -e "s|extras_require=extras_require,||g" \
+     -e "s|setup_requires=setup_requires,||g"
+    # pep8 is deprecated and cov not needed
+    substituteInPlace pytest.ini \
+     --replace "--pep8" "" \
+     --replace "--cov=flask_gravatar --cov-report=term-missing" ""
+  '';
+
+  propagatedBuildInputs = [
+    flask
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pygments
+  ];
+
+  pythonImportsCheck = [ "flask_gravatar" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/zzzsochi/Flask-Gravatar";
+    description = "Small and simple integration of gravatar into flask";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-httpauth/default.nix b/nixpkgs/pkgs/development/python-modules/flask-httpauth/default.nix
new file mode 100644
index 000000000000..71e5d2bcfc6a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-httpauth/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, setuptools
+, flask
+, pythonOlder
+ }:
+
+buildPythonPackage rec {
+  pname = "flask-httpauth";
+  version = "4.8.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Flask-HTTPAuth";
+    version = version;
+    hash = "sha256-ZlaKBbxzlCxl8eIgGudGKVgW3ACe3YS0gsRMdY11CXo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    flask
+  ];
+
+  pythonImportsCheck = [
+    "flask_httpauth"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ flask.optional-dependencies.async;
+
+  meta = with lib; {
+    description = "Extension that provides HTTP authentication for Flask routes";
+    homepage = "https://github.com/miguelgrinberg/Flask-HTTPAuth";
+    changelog = "https://github.com/miguelgrinberg/Flask-HTTPAuth/blob/v${version}/CHANGES.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ oxzi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-jwt-extended/default.nix b/nixpkgs/pkgs/development/python-modules/flask-jwt-extended/default.nix
new file mode 100644
index 000000000000..2d5537b5df69
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-jwt-extended/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cryptography
+, flask
+, pyjwt
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "flask-jwt-extended";
+  version = "4.5.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Flask-JWT-Extended";
+    inherit version;
+    hash = "sha256-Bh7z0l7VdDur5JZKs4822HDm0v2KEmurXXfd74oBkys=";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    pyjwt
+    python-dateutil
+    werkzeug
+  ];
+
+  passthru.optional-dependencies.asymmetric_crypto = [
+    cryptography
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ]
+  ++ lib.flatten (lib.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "flask_jwt_extended"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/vimalloc/flask-jwt-extended/releases/tag/${version}";
+    description = "JWT extension for Flask";
+    homepage = "https://flask-jwt-extended.readthedocs.io/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gerschtli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-limiter/default.nix b/nixpkgs/pkgs/development/python-modules/flask-limiter/default.nix
new file mode 100644
index 000000000000..ff532ffd12d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-limiter/default.nix
@@ -0,0 +1,94 @@
+{ lib
+, asgiref
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, hiro
+, limits
+, ordered-set
+, pymemcache
+, pymongo
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, redis
+, rich
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "flask-limiter";
+  version = "3.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "alisaifee";
+    repo = "flask-limiter";
+    rev = "refs/tags/${version}";
+    hash = "sha256-ZaHw8+l1sBCeNj0tYdUw1f4BUvEj6plOSoH0GUzNg+0=";
+  };
+
+  postPatch = ''
+    sed -i "/--cov/d" pytest.ini
+
+    # flask-restful is unmaintained and breaks regularly, don't depend on it
+    sed -i "/import flask_restful/d" tests/test_views.py
+  '';
+
+  propagatedBuildInputs = [
+    flask
+    limits
+    ordered-set
+    rich
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    asgiref
+    pytest-mock
+    pytestCheckHook
+    hiro
+    redis
+    pymemcache
+    pymongo
+  ];
+
+  disabledTests = [
+    # flask-restful is unmaintained and breaks regularly
+    "test_flask_restful_resource"
+
+    # Requires running a docker instance
+    "test_clear_limits"
+    "test_constructor_arguments_over_config"
+    "test_custom_key_prefix"
+    "test_custom_key_prefix_with_headers"
+    "test_fallback_to_memory_backoff_check"
+    "test_fallback_to_memory_config"
+    "test_fallback_to_memory_with_global_override"
+    "test_redis_request_slower_than_fixed_window"
+    "test_redis_request_slower_than_moving_window"
+    "test_reset_unsupported"
+
+    # Requires redis
+    "test_fallback_to_memory"
+  ];
+
+  disabledTestPaths = [
+    # requires running redis/memcached/mongodb
+    "tests/test_storage.py"
+  ];
+
+  pythonImportsCheck = [
+    "flask_limiter"
+  ];
+
+  meta = with lib; {
+    description = "Rate limiting for flask applications";
+    homepage = "https://flask-limiter.readthedocs.org/";
+    changelog = "https://github.com/alisaifee/flask-limiter/blob/${version}/HISTORY.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-login/default.nix b/nixpkgs/pkgs/development/python-modules/flask-login/default.nix
new file mode 100644
index 000000000000..134dc8f2e44b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-login/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+# build-system
+, setuptools
+
+# dependencies
+, flask
+, werkzeug
+
+# tests
+, asgiref
+, blinker
+, pytestCheckHook
+, semantic-version
+}:
+
+buildPythonPackage rec {
+  pname = "flask-login";
+  version = "0.6.3";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Flask-Login";
+    inherit version;
+    hash = "sha256-XiPRSmB+8SgGxplZC4nQ8ODWe67sWZ11lHv5wUczAzM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    flask
+    werkzeug
+  ];
+
+  pythonImportsCheck = [
+    "flask_login"
+  ];
+
+  nativeCheckInputs = [
+    asgiref
+    blinker
+    pytestCheckHook
+    semantic-version
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/maxcountryman/flask-login/blob/${version}/CHANGES.md";
+    description = "User session management for Flask";
+    homepage = "https://github.com/maxcountryman/flask-login";
+    license = licenses.mit;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-mail/default.nix b/nixpkgs/pkgs/development/python-modules/flask-mail/default.nix
new file mode 100644
index 000000000000..8e4c58db75c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-mail/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi,
+  blinker, flask, mock, nose, speaklater
+}:
+
+buildPythonPackage rec {
+  pname = "flask-mail";
+  version = "0.9.1";
+
+  meta = {
+    description = "Flask-Mail is a Flask extension providing simple email sending capabilities.";
+    homepage = "https://pypi.python.org/pypi/Flask-Mail";
+    license = lib.licenses.bsd3;
+  };
+
+  src = fetchPypi {
+    pname = "Flask-Mail";
+    inherit version;
+    hash = "sha256-IuXrmpQL9Ae88wQQ7MNwjzxWzESynDThcm/oUAaTX0E=";
+  };
+
+  propagatedBuildInputs = [ blinker flask ];
+  buildInputs = [ blinker mock nose speaklater ];
+
+  doCheck = false;
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-mailman/default.nix b/nixpkgs/pkgs/development/python-modules/flask-mailman/default.nix
new file mode 100644
index 000000000000..f0cd2e5e147b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-mailman/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, mkdocs-material-extensions
+, flask
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "flask-mailman";
+  version = "0.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "waynerv";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-cfLtif+48M6fqOkBbi4PJRFpf9FRXCPesktFQky34eU=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    flask
+    mkdocs-material-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "flask_mailman" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/waynerv/flask-mailman";
+    description = "Flask extension providing simple email sending capabilities.";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-marshmallow/default.nix b/nixpkgs/pkgs/development/python-modules/flask-marshmallow/default.nix
new file mode 100644
index 000000000000..8f23f51fe979
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-marshmallow/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, flask
+, marshmallow
+, packaging
+, pytestCheckHook
+, flask-sqlalchemy
+, marshmallow-sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "flask-marshmallow";
+  version = "0.15.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "marshmallow-code";
+    repo = "flask-marshmallow";
+    rev = "refs/tags/${version}";
+    hash = "sha256-N21M/MzcvOaDh5BgbbZtNcpRAULtWGLTMberCfOUoEM=";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    marshmallow
+    packaging
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.sqlalchemy;
+
+  pythonImportsCheck = [
+    "flask_marshmallow"
+  ];
+
+  passthru.optional-dependencies = {
+    sqlalchemy = [
+      flask-sqlalchemy
+      marshmallow-sqlalchemy
+    ];
+  };
+
+  meta = {
+    description = "Flask + marshmallow for beautiful APIs";
+    homepage = "https://github.com/marshmallow-code/flask-marshmallow";
+    changelog = "https://github.com/marshmallow-code/flask-marshmallow/releases/tag/${version}";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-migrate/default.nix b/nixpkgs/pkgs/development/python-modules/flask-migrate/default.nix
new file mode 100644
index 000000000000..a7a5da621630
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-migrate/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, alembic
+, flask
+, flask-script
+, flask-sqlalchemy
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "flask-migrate";
+  version = "4.0.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "miguelgrinberg";
+    repo = "Flask-Migrate";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-fdnoX7ypTpH2mQ+7Xuhzdh706Of7PIVhHQGVbe0jv1s=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    alembic
+    flask
+    flask-sqlalchemy
+  ];
+
+  pythonImportsCheck = [
+    "flask_migrate"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    flask-script
+  ];
+
+  meta = with lib; {
+    description = "SQLAlchemy database migrations for Flask applications using Alembic";
+    homepage = "https://github.com/miguelgrinberg/Flask-Migrate";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-mongoengine/default.nix b/nixpkgs/pkgs/development/python-modules/flask-mongoengine/default.nix
new file mode 100644
index 000000000000..dad4b6ddb871
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-mongoengine/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, email-validator
+, fetchFromGitHub
+, flask
+, flask-wtf
+, markupsafe
+, mongoengine
+, pythonOlder
+, setuptools
+, setuptools-scm
+, typing-extensions
+, wtforms
+}:
+
+buildPythonPackage rec {
+  pname = "flask-mongoengine";
+  version = "1.0.0-unstable-2022-08-16";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "MongoEngine";
+    repo = pname;
+    rev = "d4526139cb1e2e94111ab7de96bb629d574c1690";
+    hash = "sha256-oMQU9Z8boc0q+0KzIQAZ8qSyxiITDY0M9FCg75S9MEY=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = "1.0.0";
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    email-validator
+    flask
+    flask-wtf
+    mongoengine
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = {
+    wtf = [
+      flask-wtf
+      wtforms
+    ] ++ wtforms.optional-dependencies.email;
+    # toolbar = [
+    #   flask-debugtoolbar
+    # ];
+    legacy = [
+      markupsafe
+    ];
+  };
+
+  # Tests require working mongodb connection
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "flask_mongoengine"
+  ];
+
+  meta = with lib; {
+    description = "Flask extension that provides integration with MongoEngine and WTF model forms";
+    homepage = "https://github.com/mongoengine/flask-mongoengine";
+    changelog = "https://github.com/MongoEngine/flask-mongoengine/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-mysqldb/default.nix b/nixpkgs/pkgs/development/python-modules/flask-mysqldb/default.nix
new file mode 100644
index 000000000000..f0b7d59206fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-mysqldb/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, flask
+, mysqlclient
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "flask-mysqldb";
+  version = "2.0.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "alexferl";
+    repo = "flask-mysqldb";
+    rev = "v${version}";
+    hash = "sha256-RHAB9WGRzojH6eAOG61QguwF+4LssO9EcFjbWxoOtF4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    flask
+    mysqlclient
+  ];
+
+  pythonImportsCheck = [
+    "flask_mysqldb"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "MySQL connection support for Flask";
+    homepage = "https://github.com/alexferl/flask-mysqldb";
+    changelog = "https://github.com/alexferl/flask-mysqldb/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ netali ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-openid/default.nix b/nixpkgs/pkgs/development/python-modules/flask-openid/default.nix
new file mode 100644
index 000000000000..748e2fbe2bd9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-openid/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flask
+, python3-openid
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "flask-openid";
+  version = "1.3.0";
+
+  src = fetchPypi {
+    pname = "Flask-OpenID";
+    inherit version;
+    sha256 = "539289ed2d19af61ae38d8fe46aec9e4de2b56f9f8b46da0b98c0d387f1d975a";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    python3-openid
+  ];
+
+  # no tests for repo...
+  doCheck = false;
+
+  meta = with lib; {
+    description = "OpenID support for Flask";
+    homepage = "https://pythonhosted.org/Flask-OpenID/";
+    license = licenses.bsd3;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-paginate/default.nix b/nixpkgs/pkgs/development/python-modules/flask-paginate/default.nix
new file mode 100644
index 000000000000..f28579e04a46
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-paginate/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "flask-paginate";
+  version = "2023.10.24";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "lixxu";
+    repo = "flask-paginate";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-9633YLHMF9S1DLK7ZS4qmCOzslXdHLSgpKoJFNvkXlA=";
+  };
+
+  propagatedBuildInputs = [
+    flask
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "flask_paginate"
+  ];
+
+  pytestFlagsArray = [
+    "tests/tests.py"
+  ];
+
+  meta = with lib; {
+    description = "Pagination support for Flask";
+    homepage = "https://github.com/lixxu/flask-paginate";
+    changelog = "https://github.com/lixxu/flask-paginate/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-paranoid/default.nix b/nixpkgs/pkgs/development/python-modules/flask-paranoid/default.nix
new file mode 100644
index 000000000000..77949730c690
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-paranoid/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "flask-paranoid";
+  version = "0.3.0";
+
+  src = fetchFromGitHub {
+    owner = "miguelgrinberg";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-tikD8efc3Q3xIQnaC3SSBaCRQxMI1HzXxeupvYeNnE4=";
+  };
+
+  postPatch = ''
+    # tests have a typo in one of the assertions
+    substituteInPlace tests/test_paranoid.py --replace "01-Jan-1970" "01 Jan 1970"
+  '';
+
+  propagatedBuildInputs = [
+    flask
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "flask_paranoid" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/miguelgrinberg/flask-paranoid/";
+    description = "Simple user session protection";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-principal/default.nix b/nixpkgs/pkgs/development/python-modules/flask-principal/default.nix
new file mode 100644
index 000000000000..8bf06c87d356
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-principal/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, flask, blinker, nose }:
+
+buildPythonPackage rec {
+  pname = "flask-principal";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    pname = "Flask-Principal";
+    inherit version;
+    hash = "sha256-9dYTS1yuv9u4bzLVbRjuRLCAh2onJpVgqW6jX3XJlFM=";
+  };
+
+  propagatedBuildInputs = [ flask blinker ];
+
+  nativeCheckInputs = [ nose ];
+
+  meta = with lib; {
+    homepage = "http://packages.python.org/Flask-Principal/";
+    description = "Identity management for flask";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-restful/default.nix b/nixpkgs/pkgs/development/python-modules/flask-restful/default.nix
new file mode 100644
index 000000000000..68072b7ddde9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-restful/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, aniso8601
+, blinker
+, buildPythonPackage
+, fetchPypi
+, flask
+, mock
+, nose
+, pytestCheckHook
+, pythonOlder
+, pytz
+, six
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "flask-restful";
+  version = "0.3.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Flask-RESTful";
+    inherit version;
+    hash = "sha256-/kry7wAn34+bT3l6uiDFVmgBtq3plaxjtYir8aWc7Dc=";
+  };
+
+  # conditional so that overrides are easier for web applications
+  patches = lib.optionals (lib.versionAtLeast werkzeug.version "2.1.0") [
+    ./werkzeug-2.1.0-compat.patch
+  ];
+
+  propagatedBuildInputs = [
+    aniso8601
+    flask
+    pytz
+    six
+  ];
+
+  nativeCheckInputs = [
+    blinker
+    mock
+    nose
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Broke in flask 2.2 upgrade
+    "test_exception_header_forwarded"
+    # Broke in werkzeug 2.3 upgrade
+    "test_media_types_method"
+    "test_media_types_q"
+  ];
+
+  pythonImportsCheck = [
+    "flask_restful"
+  ];
+
+  meta = with lib; {
+    description = "Framework for creating REST APIs";
+    homepage = "https://flask-restful.readthedocs.io";
+    longDescription = ''
+      Flask-RESTful provides the building blocks for creating a great
+      REST API.
+    '';
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-restful/werkzeug-2.1.0-compat.patch b/nixpkgs/pkgs/development/python-modules/flask-restful/werkzeug-2.1.0-compat.patch
new file mode 100644
index 000000000000..c8707b239435
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-restful/werkzeug-2.1.0-compat.patch
@@ -0,0 +1,114 @@
+Fixes compatibility with Werkzeug 2.1.0 ported over from flask-restx#423.
+
+https://github.com/python-restx/flask-restx/pull/423
+
+diff --git a/flask_restful/reqparse.py b/flask_restful/reqparse.py
+index 9bb3099..5c59594 100644
+--- a/flask_restful/reqparse.py
++++ b/flask_restful/reqparse.py
+@@ -114,7 +114,10 @@ class Argument(object):
+         :param request: The flask request object to parse arguments from
+         """
+         if isinstance(self.location, six.string_types):
+-            value = getattr(request, self.location, MultiDict())
++            if self.location in {"json", "get_json"}:
++                value = request.get_json(silent=True)
++            else:
++                value = getattr(request, self.location, MultiDict())
+             if callable(value):
+                 value = value()
+             if value is not None:
+@@ -122,7 +125,10 @@ class Argument(object):
+         else:
+             values = MultiDict()
+             for l in self.location:
+-                value = getattr(request, l, None)
++                if l in {"json", "get_json"}:
++                    value = request.get_json(silent=True)
++                else:
++                    value = getattr(request, l, None)
+                 if callable(value):
+                     value = value()
+                 if value is not None:
+diff --git a/tests/test_api.py b/tests/test_api.py
+index 15f12eb..9a9cceb 100644
+--- a/tests/test_api.py
++++ b/tests/test_api.py
+@@ -936,7 +936,7 @@ class APITestCase(unittest.TestCase):
+         app = app.test_client()
+         resp = app.get('/api')
+         self.assertEqual(resp.status_code, 302)
+-        self.assertEqual(resp.headers['Location'], 'http://localhost/')
++        self.assertEqual(resp.headers['Location'], '/')
+ 
+     def test_json_float_marshalled(self):
+         app = Flask(__name__)
+diff --git a/tests/test_reqparse.py b/tests/test_reqparse.py
+index 1d75e40..e5c586b 100644
+--- a/tests/test_reqparse.py
++++ b/tests/test_reqparse.py
+@@ -23,8 +23,9 @@ class ReqParseTestCase(unittest.TestCase):
+         with app.app_context():
+             parser = RequestParser()
+             parser.add_argument('foo', choices=('one', 'two'), help='Bad choice: {error_msg}')
+-            req = Mock(['values'])
++            req = Mock(["values", "get_json"])
+             req.values = MultiDict([('foo', 'three')])
++            req.get_json.return_value = None
+             parser.parse_args(req)
+             expected = {'foo': 'Bad choice: three is not a valid choice'}
+             abort.assert_called_with(400, message=expected)
+@@ -35,8 +36,9 @@ class ReqParseTestCase(unittest.TestCase):
+         with app.app_context():
+             parser = RequestParser()
+             parser.add_argument('foo', choices=('one', 'two'), help=u'Bad choice: {error_msg}')
+-            req = Mock(['values'])
++            req = Mock(["values", "get_json"])
+             req.values = MultiDict([('foo', u'\xf0\x9f\x8d\x95')])
++            req.get_json.return_value = None
+             parser.parse_args(req)
+             expected = {'foo': u'Bad choice: \xf0\x9f\x8d\x95 is not a valid choice'}
+             abort.assert_called_with(400, message=expected)
+@@ -47,8 +49,9 @@ class ReqParseTestCase(unittest.TestCase):
+         with app.app_context():
+             parser = RequestParser()
+             parser.add_argument('foo', choices=['one', 'two'], help='Please select a valid choice')
+-            req = Mock(['values'])
++            req = Mock(["values", "get_json"])
+             req.values = MultiDict([('foo', 'three')])
++            req.get_json.return_value = None
+             parser.parse_args(req)
+             expected = {'foo': 'Please select a valid choice'}
+             abort.assert_called_with(400, message=expected)
+@@ -58,8 +61,9 @@ class ReqParseTestCase(unittest.TestCase):
+         def bad_choice():
+             parser = RequestParser()
+             parser.add_argument('foo', choices=['one', 'two'])
+-            req = Mock(['values'])
++            req = Mock(["values", "get_json"])
+             req.values = MultiDict([('foo', 'three')])
++            req.get_json.return_value = None
+             parser.parse_args(req)
+             abort.assert_called_with(400, message='three is not a valid choice')
+         app = Flask(__name__)
+@@ -190,7 +194,8 @@ class ReqParseTestCase(unittest.TestCase):
+         self.assertTrue(len(arg.source(req)) == 0)  # yes, basically you don't find it
+ 
+     def test_source_default_location(self):
+-        req = Mock(['values'])
++        req = Mock(['values', 'get_json'])
++        req.get_json.return_value = None
+         req._get_child_mock = lambda **kwargs: MultiDict()
+         arg = Argument('foo')
+         self.assertEqual(arg.source(req), req.values)
+@@ -215,8 +220,9 @@ class ReqParseTestCase(unittest.TestCase):
+         args = parser.parse_args(req)
+         self.assertEqual(args['foo'], "bar")
+ 
+-        req = Mock()
++        req = Mock(['get_json'])
+         req.values = ()
++        req.get_json.return_value = None
+         req.json = None
+         req.view_args = {"foo": "bar"}
+         parser = RequestParser()
diff --git a/nixpkgs/pkgs/development/python-modules/flask-restx/default.nix b/nixpkgs/pkgs/development/python-modules/flask-restx/default.nix
new file mode 100644
index 000000000000..6fd8b6b7330b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-restx/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, aniso8601
+, jsonschema
+, flask
+, importlib-resources
+, werkzeug
+, pytz
+, faker
+, mock
+, blinker
+, py
+, pytest-flask
+, pytest-mock
+, pytest-benchmark
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "flask-restx";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  # Tests not included in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "python-restx";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-9o0lgDtjsZta9fVJnD02In6wvxNwPA667WeIkpRv8Z4=";
+  };
+
+  propagatedBuildInputs = [
+    aniso8601
+    flask
+    importlib-resources
+    jsonschema
+    pytz
+    werkzeug
+  ];
+
+  nativeCheckInputs = [
+    blinker
+    faker
+    mock
+    py
+    pytest-benchmark
+    pytest-flask
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--benchmark-disable"
+    "--deselect=tests/test_inputs.py::URLTest::test_check"
+    "--deselect=tests/test_inputs.py::EmailTest::test_valid_value_check"
+    "--deselect=tests/test_logging.py::LoggingTest::test_override_app_level"
+  ];
+
+  disabledTests = [
+    # broken in werkzeug 2.3 upgrade
+    "test_media_types_method"
+    "test_media_types_q"
+  ];
+
+  pythonImportsCheck = [
+    "flask_restx"
+  ];
+
+  meta = with lib; {
+    description = "Fully featured framework for fast, easy and documented API development with Flask";
+    homepage = "https://github.com/python-restx/flask-restx";
+    changelog = "https://github.com/python-restx/flask-restx/blob/${version}/CHANGELOG.rst";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-reverse-proxy-fix/default.nix b/nixpkgs/pkgs/development/python-modules/flask-reverse-proxy-fix/default.nix
new file mode 100644
index 000000000000..6d079b66f149
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-reverse-proxy-fix/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "flask-reverse-proxy-fix";
+  version = "0.2.1";
+  format = "setuptools";
+
+  # master fixes flask import syntax and has no major changes
+  # new release requested: https://github.com/sublee/flask-silk/pull/6
+  src = fetchFromGitHub {
+    owner = "antarctica";
+    repo = "flask-reverse-proxy-fix";
+    rev = "v${version}";
+    hash = "sha256-ZRZI1psr1dnY2FbuLZXOQvLMJd4TF7BfBNZnW9kxeck=";
+  };
+
+  postPatch = ''
+    sed -i 's@werkzeug.contrib.fixers@werkzeug.middleware.proxy_fix@g' flask_reverse_proxy_fix/middleware/__init__.py
+  '';
+
+  # This is needed so that setup.py does not add "devNone" to the version,
+  # after which setuptools throws an error for an invalid version.
+  env.CI_COMMIT_TAG = "v${version}";
+
+  propagatedBuildInputs = [
+    flask
+    werkzeug
+  ];
+
+  meta = with lib; {
+    description = "Python Flask middleware for applications running under a reverse proxy";
+    maintainers = with maintainers; [ matthiasbeyer ];
+    homepage = "https://github.com/antarctica/flask-reverse-proxy-fix";
+
+    license = {
+      fullName = "Open Government Licence";
+      url = "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/";
+    };
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-script/default.nix b/nixpkgs/pkgs/development/python-modules/flask-script/default.nix
new file mode 100644
index 000000000000..cd7122813227
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-script/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, flask, pytest }:
+
+buildPythonPackage rec {
+  pname = "flask-script";
+  version = "2.0.6";
+
+  src = fetchPypi {
+    pname = "Flask-Script";
+    inherit version;
+    hash = "sha256-ZCWWPZEFTPzBhYBxQccxSpxa1GMlkRvSTctIm9AWHGU=";
+  };
+
+  propagatedBuildInputs = [ flask ];
+  nativeCheckInputs = [ pytest ];
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/smurfix/flask-script";
+    description = "Scripting support for Flask";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-seasurf/default.nix b/nixpkgs/pkgs/development/python-modules/flask-seasurf/default.nix
new file mode 100644
index 000000000000..79d024f5b34f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-seasurf/default.nix
@@ -0,0 +1,30 @@
+{ lib, fetchFromGitHub, buildPythonPackage, isPy3k, flask, mock, unittestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "Flask-SeaSurf";
+  version = "1.1.1";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "maxcountryman";
+    repo = "flask-seasurf";
+    rev = version;
+    hash = "sha256-L/ZUEqqHmsyXG5eShcITII36ttwQlZN5GBngo+GcCdw=";
+  };
+
+  propagatedBuildInputs = [ flask ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+    mock
+  ];
+
+  pythonImportsCheck = [ "flask_seasurf" ];
+
+  meta = with lib; {
+    description = "A Flask extension for preventing cross-site request forgery";
+    homepage = "https://github.com/maxcountryman/flask-seasurf";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ zhaofengli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-security-too/default.nix b/nixpkgs/pkgs/development/python-modules/flask-security-too/default.nix
new file mode 100644
index 000000000000..81abf369a8a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-security-too/default.nix
@@ -0,0 +1,131 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+
+# extras: babel
+, babel
+, flask-babel
+
+# extras: common
+, bcrypt
+, bleach
+, flask-mailman
+
+# extras: fsqla
+, flask-sqlalchemy
+, sqlalchemy
+, sqlalchemy-utils
+
+# extras: mfa
+, cryptography
+, phonenumbers
+, webauthn
+, qrcode
+
+# propagates
+, email-validator
+, flask
+, flask-login
+, flask-principal
+, flask-wtf
+, passlib
+, importlib-resources
+, wtforms
+
+# tests
+, argon2-cffi
+, mongoengine
+, mongomock
+, peewee
+, pony
+, pytestCheckHook
+, python-dateutil
+, zxcvbn
+}:
+
+buildPythonPackage rec {
+  pname = "flask-security-too";
+  version = "5.3.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Flask-Security-Too";
+    inherit version;
+    hash = "sha256-wLUHXfDWSp7zWwTIjTH79AWlkkNzb21tChpLSEWr8+U=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    email-validator
+    flask
+    flask-login
+    flask-principal
+    flask-wtf
+    passlib
+    importlib-resources
+    wtforms
+  ];
+
+  passthru.optional-dependencies = {
+    babel = [
+      babel
+      flask-babel
+    ];
+    common = [
+      bcrypt
+      bleach
+      flask-mailman
+    ];
+    fsqla = [
+      flask-sqlalchemy
+      sqlalchemy
+      sqlalchemy-utils
+    ];
+    mfa = [
+      cryptography
+      phonenumbers
+      webauthn
+      qrcode
+    ];
+  };
+
+  nativeCheckInputs = [
+    argon2-cffi
+    mongoengine
+    mongomock
+    peewee
+    pony
+    pytestCheckHook
+    python-dateutil
+    zxcvbn
+  ]
+  ++ passthru.optional-dependencies.babel
+  ++ passthru.optional-dependencies.common
+  ++ passthru.optional-dependencies.fsqla
+  ++ passthru.optional-dependencies.mfa;
+
+
+  disabledTests = [
+    # needs /etc/resolv.conf
+    "test_login_email_whatever"
+  ];
+
+  pythonImportsCheck = [
+    "flask_security"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/Flask-Middleware/flask-security/blob/${version}/CHANGES.rst";
+    homepage = "https://github.com/Flask-Middleware/flask-security";
+    description = "Simple security for Flask apps (fork)";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-session-captcha/default.nix b/nixpkgs/pkgs/development/python-modules/flask-session-captcha/default.nix
new file mode 100644
index 000000000000..a720d2a4b555
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-session-captcha/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, flask
+, flask-sessionstore
+, flask-sqlalchemy
+, captcha
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "flask-session-captcha";
+  version = "1.3.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Tethik";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-V0f3mXCfqwH2l3OtJKOHGdrlKAFxs2ynqXvNve7Amkc=";
+  };
+
+  propagatedBuildInputs = [ flask flask-sessionstore captcha ];
+
+  pythonImportsCheck = [ "flask_session_captcha" ];
+
+  nativeCheckInputs = [ flask-sqlalchemy pytestCheckHook ];
+
+  # RuntimeError: Working outside of application context.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A captcha implemention for flask";
+    homepage = "https://github.com/Tethik/flask-session-captcha";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Flakebi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-session/default.nix b/nixpkgs/pkgs/development/python-modules/flask-session/default.nix
new file mode 100644
index 000000000000..a777bf0920ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-session/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, flit-core
+, flask
+, cachelib
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "Flask-Session";
+  version = "0.5.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pallets-eco";
+    repo = "flask-session";
+    rev = "refs/tags/${version}";
+    hash = "sha256-t8w6ZS4gBDpnnKvL3DLtn+rRLQNJbrT2Hxm4f3+a3Xc=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    flask
+    cachelib
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # The rest of the tests require database servers and optional db connector dependencies
+  pytestFlagsArray = [
+    "-k"
+    "'null_session or filesystem_session'"
+  ];
+
+  pythonImportsCheck = [
+    "flask_session"
+  ];
+
+  meta = with lib; {
+    description = "A Flask extension that adds support for server-side sessions";
+    homepage = "https://github.com/pallets-eco/flask-session";
+    changelog = "https://github.com/pallets-eco/flask-session/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ zhaofengli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-sessionstore/default.nix b/nixpkgs/pkgs/development/python-modules/flask-sessionstore/default.nix
new file mode 100644
index 000000000000..12f3ff51b425
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-sessionstore/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, flask
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "flask-sessionstore";
+  version = "0.4.5";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "Flask-Sessionstore";
+    inherit version;
+    hash = "sha256-AQ3jWrnw2UI8L3nFEx4AhDwGP4R8Tr7iBMsDS5jLQPQ=";
+  };
+
+  propagatedBuildInputs = [ flask ];
+
+  pythonImportsCheck = [ "flask_sessionstore" ];
+
+  nativeCheckInputs = [ nose ];
+
+  checkPhase = ''
+    nosetests -s
+  '';
+
+  meta = with lib; {
+    description = "Session Storage Backends for Flask";
+    homepage = "https://github.com/mcrowson/flask-sessionstore";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ Flakebi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-silk/default.nix b/nixpkgs/pkgs/development/python-modules/flask-silk/default.nix
new file mode 100644
index 000000000000..8a40b6d4b56f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-silk/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+}:
+
+buildPythonPackage {
+  pname = "Flask-Silk";
+  version = "unstable-2018-06-28";
+
+  # master fixes flask import syntax and has no major changes
+  # new release requested: https://github.com/sublee/flask-silk/pull/6
+  src = fetchFromGitHub {
+    owner = "sublee";
+    repo = "flask-silk";
+    rev = "3a8166550f9a0ec52edae7bf31d9818c4c15c531";
+    sha256 = "0mplziqw52jfspas6vsm210lmxqqzgj0dxm8y0i3gpbyyykwcmh0";
+  };
+
+  propagatedBuildInputs = [
+    flask
+  ];
+
+  meta = with lib; {
+    description = "Adds silk icons to your Flask application or module, or extension";
+    license = licenses.bsd3;
+    maintainers = teams.sage.members;
+    homepage = "https://github.com/sublee/flask-silk";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-sock/default.nix b/nixpkgs/pkgs/development/python-modules/flask-sock/default.nix
new file mode 100644
index 000000000000..36ef8a093e1e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-sock/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, pytestCheckHook
+, pythonOlder
+, fetchFromGitHub
+, flask
+, setuptools
+, simple-websocket
+}:
+
+buildPythonPackage rec {
+  pname = "flask-sock";
+  version = "0.7.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "miguelgrinberg";
+    repo = "flask-sock";
+    rev = "v${version}";
+    hash = "sha256-GKfOVdeLPag2IKGCWrMjQp4NTL1/9GiyLhXhf9jQKhQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    flask
+    simple-websocket
+  ];
+
+  pytestFlagsArray = [
+    "tests/test_flask_sock.py"
+  ];
+
+  pythonImportsCheck = [ "flask_sock" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "WebSocket support for Flask";
+    homepage = "https://github.com/miguelgrinberg/flask-sock/";
+    changelog = "https://github.com/miguelgrinberg/flask-sock/blob/main/CHANGES.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fmhoeger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-socketio/default.nix b/nixpkgs/pkgs/development/python-modules/flask-socketio/default.nix
new file mode 100644
index 000000000000..53a793c75f5a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-socketio/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, flask
+, pytestCheckHook
+, python-socketio
+, pythonOlder
+, redis
+}:
+
+buildPythonPackage rec {
+  pname = "Flask-SocketIO";
+  version = "5.3.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "miguelgrinberg";
+    repo = "Flask-SocketIO";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-YjCe34Mvt7tvp3w5yH52lrq4bWi7aIYAUssNqxlQ8CA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    flask
+    python-socketio
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    redis
+  ];
+
+  pytestFlagsArray = [
+    "test_socketio.py"
+  ];
+
+  pythonImportsCheck = [
+    "flask_socketio"
+  ];
+
+  meta = with lib; {
+    description = "Socket.IO integration for Flask applications";
+    homepage = "https://github.com/miguelgrinberg/Flask-SocketIO/";
+    changelog = "https://github.com/miguelgrinberg/Flask-SocketIO/blob/v${version}/CHANGES.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-sockets/default.nix b/nixpkgs/pkgs/development/python-modules/flask-sockets/default.nix
new file mode 100644
index 000000000000..aa29fd4fbc94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-sockets/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flask
+, gevent
+, gevent-websocket
+}:
+
+buildPythonPackage rec {
+  pname = "Flask-Sockets";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "072927da8edca0e81e024f5787e643c87d80b351b714de95d723becb30e0643b";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    gevent
+    gevent-websocket
+  ];
+
+  # upstream doesn't have any tests, single file
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "flask_sockets"
+  ];
+
+  meta = with lib; {
+    description = "Elegant WebSockets for your Flask apps";
+    homepage = "https://github.com/heroku-python/flask-sockets";
+    license = licenses.mit;
+    maintainers = [ maintainers.prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-sqlalchemy/default.nix b/nixpkgs/pkgs/development/python-modules/flask-sqlalchemy/default.nix
new file mode 100644
index 000000000000..7146c38e5a30
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-sqlalchemy/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flask
+, mock
+, flit-core
+, pytestCheckHook
+, pythonOlder
+, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "flask-sqlalchemy";
+  version = "3.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    pname = "flask_sqlalchemy";
+    inherit version;
+    hash = "sha256-5LaLuIGALdoafYeLL8hMBtHuV/tAuHTT3Jfav6NrgxI=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    flask
+    sqlalchemy
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # flaky
+    "test_session_scoping_changing"
+    # https://github.com/pallets-eco/flask-sqlalchemy/issues/1084
+    "test_persist_selectable"
+  ];
+
+  pythonImportsCheck = [
+    "flask_sqlalchemy"
+  ];
+
+  meta = with lib; {
+    description = "SQLAlchemy extension for Flask";
+    homepage = "http://flask-sqlalchemy.pocoo.org/";
+    changelog = "https://github.com/pallets-eco/flask-sqlalchemy/blob/${version}/CHANGES.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ gerschtli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-sslify/default.nix b/nixpkgs/pkgs/development/python-modules/flask-sslify/default.nix
new file mode 100644
index 000000000000..ad4bc4dc0523
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-sslify/default.nix
@@ -0,0 +1,23 @@
+{ lib, fetchPypi, buildPythonPackage, flask }:
+
+buildPythonPackage rec {
+  pname = "Flask-SSLify";
+  version = "0.1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0gjl1m828z5dm3c5dpc2qjgi4llf84cp72mafr0ib5fd14y1sgnk";
+  };
+
+  propagatedBuildInputs = [ flask ];
+
+  doCheck = false;
+  pythonImportsCheck = [ "flask_sslify" ];
+
+  meta = with lib; {
+    description = "A Flask extension that redirects all incoming requests to HTTPS";
+    homepage = "https://github.com/kennethreitz42/flask-sslify";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ zhaofengli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-swagger-ui/default.nix b/nixpkgs/pkgs/development/python-modules/flask-swagger-ui/default.nix
new file mode 100644
index 000000000000..f7c045432af2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-swagger-ui/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, flask }:
+
+buildPythonPackage rec {
+  pname = "flask-swagger-ui";
+  version = "4.11.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-o3AZmngNZ4sy448b4Q1Nge+g7mPp/i+3Zv8aS2w32sg=";
+  };
+
+  doCheck = false;  # there are no tests
+
+  propagatedBuildInputs = [
+    flask
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/sveint/flask-swagger-ui";
+    license = licenses.mit;
+    description = "Swagger UI blueprint for Flask";
+    maintainers = with maintainers; [ vanschelven ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-swagger/default.nix b/nixpkgs/pkgs/development/python-modules/flask-swagger/default.nix
new file mode 100644
index 000000000000..66c45b855223
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-swagger/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi
+, flask, pyyaml }:
+
+buildPythonPackage rec {
+  version = "0.2.14";
+  pname = "flask-swagger";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b4085f5bc36df4c20b6548cd1413adc9cf35719b0f0695367cd542065145294d";
+  };
+
+  # No Tests
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    flask
+    pyyaml
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/gangverk/flask-swagger";
+    license = licenses.mit;
+    description = "Extract swagger specs from your flask project";
+    maintainers = with maintainers; [ vanschelven ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-talisman/default.nix b/nixpkgs/pkgs/development/python-modules/flask-talisman/default.nix
new file mode 100644
index 000000000000..a719e453daba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-talisman/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flask
+, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "flask-talisman";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xfSG9fVEIHKfhLPDhQzWP5bosDOpYpvuZsUk6jY3l/8=";
+  };
+
+  buildInputs = [
+    flask
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeBuildInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "HTTP security headers for Flask";
+    homepage = "https://github.com/wntrblm/flask-talisman";
+    license = licenses.asl20;
+    maintainers = [ lib.maintainers.symphorien ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-testing/default.nix b/nixpkgs/pkgs/development/python-modules/flask-testing/default.nix
new file mode 100644
index 000000000000..cb1c3cf79bd1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-testing/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, stdenv
+, blinker
+, pytestCheckHook
+, buildPythonPackage
+, fetchPypi
+, flask
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "flask-testing";
+  version = "0.8.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Flask-Testing";
+    inherit version;
+    hash = "sha256-CnNNe2jmOpQQtBPNex+WRW+ahYvQmmIi1GVlDMeC6wE=";
+  };
+
+  propagatedBuildInputs = [
+    flask
+  ];
+
+  nativeCheckInputs = [
+    blinker
+    pytestCheckHook
+  ];
+
+  # Some of the tests use localhost networking on darwin
+  doCheck = !stdenv.isDarwin;
+
+  disabledTests = [
+    # RuntimeError and NotImplementedError
+    "test_assert_redirects"
+    "test_server_listening"
+    "test_server_process_is_spawned"
+    # change in repr(template) in recent flask
+    "test_assert_template_rendered_signal_sent"
+  ];
+
+  disabledTestPaths = [
+    # twill is only used by Python 2 according setup.py
+    "tests/test_twill.py"
+  ];
+
+  pythonImportsCheck = [
+    "flask_testing"
+  ];
+
+  meta = with lib; {
+    description = "Extension provides unit testing utilities for Flask";
+    homepage = "https://pythonhosted.org/Flask-Testing/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-themes2/default.nix b/nixpkgs/pkgs/development/python-modules/flask-themes2/default.nix
new file mode 100644
index 000000000000..56c03ca39e0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-themes2/default.nix
@@ -0,0 +1,25 @@
+{ lib, fetchPypi, buildPythonPackage, flask, pythonOlder, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "flask-themes2";
+  version = "1.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "Flask-Themes2";
+    inherit version;
+    hash = "sha256-0U0cSdBddb9+IG3CU6zUPlxaJhQlxOV6OLgxnNDChy8=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  propagatedBuildInputs = [ flask ];
+
+  meta = with lib; {
+    description = "Easily theme your Flask app";
+    homepage = "https://github.com/sysr-q/flask-themes2";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ruby0b ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask-versioned/default.nix b/nixpkgs/pkgs/development/python-modules/flask-versioned/default.nix
new file mode 100644
index 000000000000..fd915fdc18f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-versioned/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchFromGitHub, flask }:
+
+buildPythonPackage rec {
+  pname = "Flask-Versioned";
+  version = "0.9.4-20101221";
+
+  src = fetchFromGitHub {
+    owner = "pilt";
+    repo = "flask-versioned";
+    rev = "38046fb53a09060de437c90a5f7370a6b94ffc31"; # no tags
+    sha256 = "1wim9hvx7lxzfg35c0nc7p34j4vw9mzisgijlz4ibgykah4g1y37";
+  };
+
+  propagatedBuildInputs = [ flask ];
+
+  meta = with lib; {
+    description = "Flask plugin to rewrite file paths to add version info";
+    homepage = "https://github.com/pilt/flask-versioned";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/flask-wtf/default.nix b/nixpkgs/pkgs/development/python-modules/flask-wtf/default.nix
new file mode 100644
index 000000000000..a106945df060
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask-wtf/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, hatchling
+, flask
+, itsdangerous
+, wtforms
+, email-validator
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "flask-wtf";
+  version = "1.2.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "flask_wtf";
+    inherit version;
+    hash = "sha256-i7Jp65u0a4fnyCM9fn3r3x+LdL+QzBeJmIwps3qXtpU=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    flask
+    itsdangerous
+    wtforms
+  ];
+
+  passthru.optional-dependencies = {
+    email = [ email-validator ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "-W" "ignore::DeprecationWarning"
+  ];
+
+  meta = with lib; {
+    description = "Simple integration of Flask and WTForms.";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ mic92 anthonyroussel ];
+    homepage = "https://github.com/lepture/flask-wtf/";
+    changelog = "https://github.com/wtforms/flask-wtf/releases/tag/v${version}";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flask/default.nix b/nixpkgs/pkgs/development/python-modules/flask/default.nix
new file mode 100644
index 000000000000..154625f6c52a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flask/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, asgiref
+, blinker
+, click
+, flit-core
+, importlib-metadata
+, itsdangerous
+, jinja2
+, python-dotenv
+, werkzeug
+, pytestCheckHook
+, pythonOlder
+  # used in passthru.tests
+, flask-limiter
+, flask-restful
+, flask-restx
+, moto
+}:
+
+buildPythonPackage rec {
+  pname = "flask";
+  version = "2.3.3";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-CcNHqSqn/0qOfzIGeV8w2CZlS684uHPQdEzVccpgnvw=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    click
+    blinker
+    itsdangerous
+    jinja2
+    werkzeug
+  ] ++ lib.optional (pythonOlder "3.10") importlib-metadata;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  passthru.tests = {
+    inherit flask-limiter flask-restful flask-restx moto;
+  };
+  passthru.optional-dependencies = {
+    dotenv = [ python-dotenv ];
+    async = [ asgiref ];
+  };
+
+  meta = with lib; {
+    homepage = "https://flask.palletsprojects.com/";
+    description = "The Python micro framework for building web applications";
+    longDescription = ''
+      Flask is a lightweight WSGI web application framework. It is
+      designed to make getting started quick and easy, with the ability
+      to scale up to complex applications. It began as a simple wrapper
+      around Werkzeug and Jinja and has become one of the most popular
+      Python web application frameworks.
+    '';
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flatbuffers/default.nix b/nixpkgs/pkgs/development/python-modules/flatbuffers/default.nix
new file mode 100644
index 000000000000..ae5c7e309cd1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flatbuffers/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, flatbuffers
+}:
+
+buildPythonPackage rec {
+  inherit (flatbuffers) pname version src;
+
+  sourceRoot = "${src.name}/python";
+
+  # flatbuffers needs VERSION environment variable for setting the correct
+  # version, otherwise it uses the current date.
+  VERSION = version;
+
+  pythonImportsCheck = [ "flatbuffers" ];
+
+  meta = flatbuffers.meta // {
+    description = "Python runtime library for use with the Flatbuffers serialization format";
+    maintainers = with lib.maintainers; [ wulfsta ];
+    mainProgram = "flatc";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flatdict/default.nix b/nixpkgs/pkgs/development/python-modules/flatdict/default.nix
new file mode 100644
index 000000000000..bed9647af844
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flatdict/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "flatdict";
+  version = "4.0.1";
+
+  src = fetchFromGitHub {
+    owner = "gmr";
+    repo = pname;
+    rev = version;
+    hash = "sha256-CWsTiCNdIKSQtjpQC07lhZoU1hXT/MGpXdj649x2GlU=";
+  };
+
+  pythonImportsCheck = [
+    "flatdict"
+  ];
+
+  meta = with lib; {
+    description = "Python module for interacting with nested dicts as a single level dict with delimited keys";
+    homepage = "https://github.com/gmr/flatdict";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ lovesegfault ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flatten-dict/default.nix b/nixpkgs/pkgs/development/python-modules/flatten-dict/default.nix
new file mode 100644
index 000000000000..41929f9f671f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flatten-dict/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "flatten-dict";
+  version = "0.4.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ianlini";
+    repo = pname;
+    rev = version;
+    hash = "sha256-uHenKoD4eLm9sMREVuV0BB/oUgh4NMiuj+IWd0hlxNQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "flatten_dict"
+  ];
+
+  meta = with lib; {
+    description = "Module for flattening and unflattening dict-like objects";
+    homepage = "https://github.com/ianlini/flatten-dict";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flax/default.nix b/nixpkgs/pkgs/development/python-modules/flax/default.nix
new file mode 100644
index 000000000000..fa0f053f86de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flax/default.nix
@@ -0,0 +1,101 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, jaxlib
+, pythonRelaxDepsHook
+, setuptools-scm
+, jax
+, msgpack
+, numpy
+, optax
+, pyyaml
+, rich
+, tensorstore
+, typing-extensions
+, matplotlib
+, cloudpickle
+, einops
+, keras
+, pytest-xdist
+, pytestCheckHook
+, tensorflow
+}:
+
+buildPythonPackage rec {
+  pname = "flax";
+  version = "0.7.5";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = "flax";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-NDah0ayQbiO1/sTU1DDf/crPq5oLTnSuosV7cFHlTM8=";
+  };
+
+  nativeBuildInputs = [
+    jaxlib
+    pythonRelaxDepsHook
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    jax
+    msgpack
+    numpy
+    optax
+    pyyaml
+    rich
+    tensorstore
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = {
+    all = [ matplotlib ];
+  };
+
+  pythonImportsCheck = [
+    "flax"
+  ];
+
+  nativeCheckInputs = [
+    cloudpickle
+    einops
+    keras
+    pytest-xdist
+    pytestCheckHook
+    tensorflow
+  ];
+
+  pytestFlagsArray = [
+    "-W ignore::FutureWarning"
+    "-W ignore::DeprecationWarning"
+  ];
+
+  disabledTestPaths = [
+    # Docs test, needs extra deps + we're not interested in it.
+    "docs/_ext/codediff_test.py"
+
+    # The tests in `examples` are not designed to be executed from a single test
+    # session and thus either have the modules that conflict with each other or
+    # wrong import paths, depending on how they're invoked. Many tests also have
+    # dependencies that are not packaged in `nixpkgs` (`clu`, `jgraph`,
+    # `tensorflow_datasets`, `vocabulary`) so the benefits of trying to run them
+    # would be limited anyway.
+    "examples/*"
+
+    # See https://github.com/google/flax/issues/3232.
+    "tests/jax_utils_test.py"
+
+    # Requires orbax which is not packaged as of 2023-07-27.
+    "tests/checkpoints_test.py"
+  ];
+
+  meta = with lib; {
+    description = "Neural network library for JAX";
+    homepage = "https://github.com/google/flax";
+    changelog = "https://github.com/google/flax/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ndl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fleep/0001-Fixing-paths-on-tests.patch b/nixpkgs/pkgs/development/python-modules/fleep/0001-Fixing-paths-on-tests.patch
new file mode 100644
index 000000000000..234bf0cb379b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fleep/0001-Fixing-paths-on-tests.patch
@@ -0,0 +1,48 @@
+From 716fcfa3203bc881b543916bdb9a17460951cd26 Mon Sep 17 00:00:00 2001
+From: "P. R. d. O" <d.ol.rod@protonmail.com>
+Date: Fri, 26 Nov 2021 07:13:32 -0600
+Subject: [PATCH] Fixing paths on tests
+
+---
+ tests/maintest.py  | 7 ++++++-
+ tests/speedtest.py | 7 ++++++-
+ 2 files changed, 12 insertions(+), 2 deletions(-)
+
+diff --git a/tests/maintest.py b/tests/maintest.py
+index 0e24ca4..3484437 100644
+--- a/tests/maintest.py
++++ b/tests/maintest.py
+@@ -1,6 +1,11 @@
+ import fleep
++import os
+ 
+-with open("testfile", "rb") as file:
++current_dir = os.path.realpath(os.path.join(os.getcwd(),
++                                            os.path.dirname(__file__)))
++
++with open(os.path.join(current_dir, "./testfile"),
++          "rb") as file:
+     info = fleep.get(file.read(128))
+ 
+ assert info.type == ["raster-image"]
+diff --git a/tests/speedtest.py b/tests/speedtest.py
+index 89338ab..829d563 100644
+--- a/tests/speedtest.py
++++ b/tests/speedtest.py
+@@ -1,7 +1,12 @@
+ import time
+ import fleep
++import os
+ 
+-with open("testfile", "rb") as file:
++current_dir = os.path.realpath(os.path.join(os.getcwd(),
++                                            os.path.dirname(__file__)))
++
++with open(os.path.join(current_dir, "./testfile"),
++          "rb") as file:
+     stream = file.read(128)
+ 
+ times = []
+-- 
+2.33.1
+
diff --git a/nixpkgs/pkgs/development/python-modules/fleep/default.nix b/nixpkgs/pkgs/development/python-modules/fleep/default.nix
new file mode 100644
index 000000000000..ae8522955ce5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fleep/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "fleep";
+  version = "1.0.1";
+
+  # Pypi version does not have tests
+  src = fetchFromGitHub {
+    owner = "floyernick";
+    repo = "fleep-py";
+    rev = "994bc2c274482d80ab13d89d8f7343eb316d3e44";
+    hash = "sha256-TaU7njx98nxkhZawGMFqWj4g+yCtIX9aPWQHoamzfMY=";
+  };
+
+  patches = [
+    ./0001-Fixing-paths-on-tests.patch
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} tests/maintest.py
+    ${python.interpreter} tests/speedtest.py
+  '';
+
+  pythonImportsCheck = [ "fleep" ];
+
+  meta = with lib; {
+    description = "File format determination library";
+    homepage = "https://github.com/floyernick/fleep-py";
+    license = licenses.mit;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flet-core/default.nix b/nixpkgs/pkgs/development/python-modules/flet-core/default.nix
new file mode 100644
index 000000000000..bf1e8b2d693a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flet-core/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+
+# build-system
+, poetry-core
+
+# propagates
+, typing-extensions
+, repath
+}:
+
+buildPythonPackage rec {
+  pname = "flet-core";
+  version = "0.10.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "flet_core";
+    inherit version;
+    hash = "sha256-YLtHnKBlXkUJJkQzxnDkfl6+gSGm05GXYPGEU3XO/jI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    repath
+    typing-extensions
+  ];
+
+  doCheck = false;
+
+  meta = {
+    description = "The library is the foundation of Flet framework and is not intended to be used directly";
+    homepage = "https://flet.dev/";
+    license = lib.licenses.asl20;
+    maintainers = [ lib.maintainers.heyimnova ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flet/default.nix b/nixpkgs/pkgs/development/python-modules/flet/default.nix
new file mode 100644
index 000000000000..c6541372d66b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flet/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+
+# build-system
+, poetry-core
+
+# propagates
+, flet-core
+, httpx
+, oauthlib
+, packaging
+, typing-extensions
+, watchdog
+, websocket-client
+, websockets
+
+}:
+
+buildPythonPackage rec {
+  pname = "flet";
+  version = "0.10.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Ogy4F9/beSb3GCpwPsN+8hsVroRoHTSojqg+5eXwcRI=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'httpx = "^0.23' 'httpx = ">=0.23' \
+      --replace 'watchdog = "^2' 'watchdog = ">=2'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    flet-core
+    typing-extensions
+    websocket-client
+    watchdog
+    oauthlib
+    websockets
+    httpx
+    packaging
+  ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "flet"
+  ];
+
+  meta = {
+    description = "A framework that enables you to easily build realtime web, mobile, and desktop apps in Python";
+    homepage = "https://flet.dev/";
+    changelog = "https://github.com/flet-dev/flet/releases/tag/v${version}";
+    license = lib.licenses.asl20;
+    maintainers = [ lib.maintainers.heyimnova ];
+    mainProgram = "flet";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flexmock/default.nix b/nixpkgs/pkgs/development/python-modules/flexmock/default.nix
new file mode 100644
index 000000000000..437868b70c82
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flexmock/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, teamcity-messages
+, testtools
+}:
+
+buildPythonPackage rec {
+  pname = "flexmock";
+  version = "0.11.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sf419qXzJUe1zTGhXAYNmrhj3Aiv8BjNc9x40bZR7dQ=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    teamcity-messages
+    testtools
+  ];
+
+  disabledTests = [
+    "test_failed_test_case"
+  ];
+
+  pythonImportsCheck = [
+    "flexmock"
+  ];
+
+  meta = with lib; {
+    description = "Testing library that makes it easy to create mocks,stubs and fakes";
+    homepage = "https://flexmock.readthedocs.org";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flickrapi/default.nix b/nixpkgs/pkgs/development/python-modules/flickrapi/default.nix
new file mode 100644
index 000000000000..ca04c9110eef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flickrapi/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, requests-toolbelt
+, requests-oauthlib
+, six
+, pytestCheckHook
+, responses
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "flickrapi";
+  version = "2.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sybrenstuvel";
+    repo = pname;
+    rev = "version-${version}";
+    hash = "sha256-vRZrlXKI0UDdmDevh3XUngH4X8G3VlOCSP0z/rxhIgw=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    requests-toolbelt
+    requests-oauthlib
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  disabledTests = [
+    # Tests require network access
+    "test_default_format"
+    "test_etree_default_format"
+    "test_etree_format_error"
+    "test_etree_format_happy"
+    "test_explicit_format"
+    "test_json_callback_format"
+    "test_json_format"
+    "test_parsed_json_format"
+    "test_walk"
+    "test_xmlnode_format"
+    "test_xmlnode_format_error"
+  ];
+
+  pythonImportsCheck = [
+    "flickrapi"
+  ];
+
+  meta = with lib; {
+    description = "A Python interface to the Flickr API";
+    homepage = "https://stuvel.eu/flickrapi";
+    license = licenses.psfl;
+    maintainers = with maintainers; [ obadz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flipr-api/default.nix b/nixpkgs/pkgs/development/python-modules/flipr-api/default.nix
new file mode 100644
index 000000000000..1f23aaa2481e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flipr-api/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, requests-mock
+, pythonOlder
+, pytest-asyncio
+, pytestCheckHook
+, python-dateutil
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "flipr-api";
+  version = "1.5.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "cnico";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-IAxB3i/HkwO5sjDh2aBCtijOcG0VIbatQjTWIh0inoM=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    python-dateutil
+    requests
+  ];
+
+  nativeCheckInputs = [
+    requests-mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "flipr_api"
+  ];
+
+  meta = with lib; {
+    description = "Python client for Flipr API";
+    homepage = "https://github.com/cnico/flipr-api";
+    changelog = "https://github.com/cnico/flipr-api/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flit-core/default.nix b/nixpkgs/pkgs/development/python-modules/flit-core/default.nix
new file mode 100644
index 000000000000..fc4d6479caee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flit-core/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, flit
+}:
+
+buildPythonPackage rec {
+  pname = "flit-core";
+  inherit (flit) version;
+  format = "pyproject";
+
+  inherit (flit) src patches;
+
+  sourceRoot = "source/flit_core";
+
+  # Tests are run in the "flit" package.
+  doCheck = false;
+
+  passthru.tests = {
+    inherit flit;
+  };
+
+  meta = with lib; {
+    description = "Distribution-building parts of Flit. See flit package for more information";
+    homepage = "https://github.com/pypa/flit";
+    changelog = "https://github.com/pypa/flit/blob/${src.rev}/doc/history.rst";
+    license = licenses.bsd3;
+    maintainers = teams.python.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flit-scm/default.nix b/nixpkgs/pkgs/development/python-modules/flit-scm/default.nix
new file mode 100644
index 000000000000..6b7c57100017
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flit-scm/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitLab
+, pythonOlder
+, flit-core
+, setuptools-scm
+, tomli
+}:
+
+buildPythonPackage rec {
+  pname = "flit-scm";
+  version = "1.7.0";
+  format = "pyproject";
+
+  src = fetchFromGitLab {
+    owner = "WillDaSilva";
+    repo = "flit_scm";
+    rev = "refs/tags/${version}";
+    hash = "sha256-2nx9kWq/2TzauOW+c67g9a3JZ2dhBM4QzKyK/sqWOPo=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    flit-core
+    setuptools-scm
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  propagatedBuildInputs = [
+    flit-core
+    setuptools-scm
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  pythonImportsCheck = [
+    "flit_scm"
+  ];
+
+
+  doCheck = false; # no tests
+
+  meta = with lib; {
+    description = "A PEP 518 build backend that uses setuptools_scm to generate a version file from your version control system, then flit to build the package.";
+    homepage = "https://gitlab.com/WillDaSilva/flit_scm";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flit/default.nix b/nixpkgs/pkgs/development/python-modules/flit/default.nix
new file mode 100644
index 000000000000..a1be6821b2f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flit/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, docutils
+, requests
+, pytestCheckHook
+, testpath
+, responses
+, flit-core
+, tomli-w
+}:
+
+# Flit is actually an application to build universal wheels.
+# It requires Python 3 and should eventually be moved outside of
+# python-packages.nix. When it will be used to build wheels,
+# care should be taken that there is no mingling of PYTHONPATH.
+
+buildPythonPackage rec {
+  pname = "flit";
+  version = "3.9.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "takluyver";
+    repo = "flit";
+    rev = version;
+    hash = "sha256-yl2+PcKr7xRW4oIBWl+gzh/nKhSNu5GH9fWKRGgaNHU=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    docutils
+    requests
+    flit-core
+    tomli-w
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook testpath responses ];
+
+  disabledTests = [
+    # needs some ini file.
+    "test_invalid_classifier"
+    # calls pip directly. disabled for PEP 668
+    "test_install_data_dir"
+    "test_install_module_pep621"
+    "test_symlink_data_dir"
+    "test_symlink_module_pep621"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/pypa/flit/blob/${version}/doc/history.rst";
+    description = "A simple packaging tool for simple packages";
+    homepage = "https://github.com/pypa/flit";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/floret/default.nix b/nixpkgs/pkgs/development/python-modules/floret/default.nix
new file mode 100644
index 000000000000..72248cf8dbaa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/floret/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pybind11
+, setuptools
+, wheel
+, numpy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "floret";
+  version = "0.10.5";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "explosion";
+    repo = "floret";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-7vkw6H0ZQoHEwNusY6QWh/vPbSCdP1ZaaqABHsZH6hQ=";
+  };
+
+  nativeBuildInputs = [
+    pybind11
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    pybind11
+  ];
+
+  pythonImportsCheck = [ "floret" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "FastText + Bloom embeddings for compact, full-coverage vectors with spaCy";
+    homepage = "https://github.com/explosion/floret";
+    license = licenses.mit;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flow-record/default.nix b/nixpkgs/pkgs/development/python-modules/flow-record/default.nix
new file mode 100644
index 000000000000..2c8de577dc27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flow-record/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, buildPythonPackage
+, elasticsearch
+, fastavro
+, fetchFromGitHub
+, lz4
+, msgpack
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+, wheel
+, zstandard
+}:
+
+buildPythonPackage rec {
+  pname = "flow-record";
+  version = "3.13";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "fox-it";
+    repo = "flow.record";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Yg42nA0dRjHormpmpbOuZYuvBpNz9XEpf84XI2iJpYY=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    msgpack
+  ];
+
+  passthru.optional-dependencies = {
+    compression = [
+      lz4
+      zstandard
+    ];
+    elastic = [
+      elasticsearch
+    ];
+    avro = [
+      fastavro
+    ] ++ fastavro.optional-dependencies.snappy;
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "flow.record"
+  ];
+
+  disabledTestPaths = [
+    # Test requires rdump
+    "tests/test_rdump.py"
+  ];
+
+  disabledTests = [
+    "test_rdump_fieldtype_path_json"
+  ];
+
+  meta = with lib; {
+    description = "Library for defining and creating structured data";
+    homepage = "https://github.com/fox-it/flow.record";
+    changelog = "https://github.com/fox-it/flow.record/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flower/default.nix b/nixpkgs/pkgs/development/python-modules/flower/default.nix
new file mode 100644
index 000000000000..a7d69d06fd78
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flower/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, celery
+, humanize
+, pytz
+, tornado
+, prometheus-client
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "flower";
+  version = "2.0.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-WrcXuXlTB3DBavtItQ0qmNI8Pp/jmFHc9rxNAYRaAqA=";
+  };
+
+  postPatch = ''
+    # rely on using example programs (flowers/examples/tasks.py) which
+    # are not part of the distribution
+    rm tests/load.py
+  '';
+
+  propagatedBuildInputs = [
+    celery
+    humanize
+    prometheus-client
+    pytz
+    tornado
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "flower"
+  ];
+
+  meta = with lib; {
+    description = "Real-time monitor and web admin for Celery distributed task queue";
+    homepage = "https://github.com/mher/flower";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ arnoldfarkas ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flowlogs_reader/default.nix b/nixpkgs/pkgs/development/python-modules/flowlogs_reader/default.nix
new file mode 100644
index 000000000000..50bcdc78e14f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flowlogs_reader/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, boto3
+, botocore
+, buildPythonPackage
+, fetchFromGitHub
+, parquet
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "flowlogs-reader";
+  version = "5.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "obsrvbl";
+    repo = pname;
+    # https://github.com/obsrvbl/flowlogs-reader/issues/57
+    rev = "refs/tags/v${version}";
+    hash = "sha256-XHRibTSzFzWPz50elz+KdbCwTrd1DKfVMSg6UamNbzc=";
+  };
+
+  propagatedBuildInputs = [
+    botocore
+    boto3
+    parquet
+    python-dateutil
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "flowlogs_reader"
+  ];
+
+  meta = with lib; {
+    description = "Python library to make retrieving Amazon VPC Flow Logs from CloudWatch Logs a bit easier";
+    homepage = "https://github.com/obsrvbl/flowlogs-reader";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ cransom ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fluent-logger/default.nix b/nixpkgs/pkgs/development/python-modules/fluent-logger/default.nix
new file mode 100644
index 000000000000..00cc8bf58a3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fluent-logger/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi, msgpack }:
+
+buildPythonPackage rec {
+  pname = "fluent-logger";
+  version = "0.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "678bda90c513ff0393964b64544ce41ef25669d2089ce6c3b63d9a18554b9bfa";
+  };
+
+  prePatch = ''
+    substituteInPlace setup.py \
+      --replace "msgpack<1.0.0" "msgpack"
+  '';
+
+  propagatedBuildInputs = [ msgpack ];
+
+  # Tests fail because absent in package
+  doCheck = false;
+  pythonImportsCheck = [
+    "fluent"
+    "fluent.event"
+    "fluent.handler"
+    "fluent.sender"
+  ];
+
+  meta = with lib; {
+    description = "A structured logger for Fluentd (Python)";
+    homepage = "https://github.com/fluent/fluent-logger-python";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flufl/bounce.nix b/nixpkgs/pkgs/development/python-modules/flufl/bounce.nix
new file mode 100644
index 000000000000..c4b98c649084
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flufl/bounce.nix
@@ -0,0 +1,14 @@
+{ buildPythonPackage, fetchPypi, atpublic, zope_interface, nose2 }:
+
+buildPythonPackage rec {
+  pname = "flufl.bounce";
+  version = "4.0";
+
+  buildInputs = [ nose2 ];
+  propagatedBuildInputs = [ atpublic zope_interface ];
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JVBK65duwP5aGc1sQTo0EMtRT9zb3Kn5tdjTQ6hgODE=";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flufl/i18n.nix b/nixpkgs/pkgs/development/python-modules/flufl/i18n.nix
new file mode 100644
index 000000000000..57a33e233cf6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flufl/i18n.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, atpublic
+, pdm-pep517
+}:
+
+buildPythonPackage rec {
+  pname = "flufl.i18n";
+  version = "4.1.1";
+  format = "pyproject";
+
+  nativeBuildInputs = [ pdm-pep517 ];
+  propagatedBuildInputs = [ atpublic ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [ "flufl.i18n" ];
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wKz6aggkJ9YBJ+o75XjC4Ddnn+Zi9hlYDnliwTc7DNs=";
+  };
+
+  meta = with lib; {
+    description = "A high level API for internationalizing Python libraries and applications";
+    homepage = "https://gitlab.com/warsaw/flufl.i18n";
+    changelog = "https://gitlab.com/warsaw/flufl.i18n/-/raw/${version}/docs/NEWS.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flufl/lock.nix b/nixpkgs/pkgs/development/python-modules/flufl/lock.nix
new file mode 100644
index 000000000000..1b4a575e760a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flufl/lock.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi, pytestCheckHook
+, atpublic, psutil, pytest-cov, sybil
+, pdm-pep517
+}:
+
+buildPythonPackage rec {
+  pname = "flufl.lock";
+  version = "7.1.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rxQXKzW7xYaHvQa3DRaT/Y1Iy/D/3n5RphjBSK4kBC0=";
+  };
+
+  nativeBuildInputs = [ pdm-pep517 ];
+  propagatedBuildInputs = [ atpublic psutil ];
+  nativeCheckInputs = [ pytestCheckHook pytest-cov sybil ];
+
+  # disable code coverage checks for all OS. Upstream does not enforce these
+  # checks on Darwin, and code coverage cannot be improved downstream nor is it
+  # relevant to the user.
+  pytestFlagsArray = [ "--no-cov" ];
+
+  meta = with lib; {
+    homepage = "https://flufllock.readthedocs.io/";
+    description = "NFS-safe file locking with timeouts for POSIX and Windows";
+    maintainers = with maintainers; [ qyliss ];
+    license = licenses.asl20;
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flux-led/default.nix b/nixpkgs/pkgs/development/python-modules/flux-led/default.nix
new file mode 100644
index 000000000000..252c602f9371
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flux-led/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, webcolors
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "flux-led";
+  version = "1.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "flux_led";
+    rev = "refs/tags/${version}";
+    hash = "sha256-enYo2hZ1C8jqO+8xZhSmIOJQAyrtVUJ9S/e2Bxzhv0I=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+    webcolors
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner>=5.2",' ""
+  '';
+
+  pytestFlagsArray = [
+    "tests.py"
+  ];
+
+  pythonImportsCheck = [
+    "flux_led"
+  ];
+
+  meta = with lib; {
+    description = "Python library to communicate with the flux_led smart bulbs";
+    homepage = "https://github.com/Danielhiversen/flux_led";
+    changelog = "https://github.com/Danielhiversen/flux_led/releases/tag/${version}";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ colemickens ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flyingsquid/default.nix b/nixpkgs/pkgs/development/python-modules/flyingsquid/default.nix
new file mode 100644
index 000000000000..dcaf664e4acf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flyingsquid/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pgmpy
+, torch
+}:
+let
+  pname = "flyingsquid";
+  version = "0.0.0a0";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "HazyResearch";
+    repo = pname;
+    rev = "28a713a9ac501b7597c2489468ae189943d00685";
+    hash = "sha256-DPHTSxDD4EW3nrNk2fk0pKJI/8+pQ7Awywd8nxhBruo=";
+  };
+
+  propagatedBuildInputs = [
+    pgmpy
+    torch
+  ];
+
+  pythonImportsCheck = [ "flyingsquid" ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "More interactive weak supervision with FlyingSquid";
+    homepage = "https://github.com/HazyResearch/flyingsquid";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/flynt/default.nix b/nixpkgs/pkgs/development/python-modules/flynt/default.nix
new file mode 100644
index 000000000000..75465b4a9288
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/flynt/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, astor
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "flynt";
+  version = "0.66";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ikamensh";
+    repo = "flynt";
+    rev = version;
+    hash = "sha256-DV433wqLjF5k4g8J7rj5gZfaw+Y4/TDOoFKo3eKDjZ4=";
+  };
+
+  propagatedBuildInputs = [ astor ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "command line tool to automatically convert a project's Python code from old format style strings into Python 3.6+'s f-strings";
+    homepage = "https://github.com/ikamensh/flynt";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fn/default.nix b/nixpkgs/pkgs/development/python-modules/fn/default.nix
new file mode 100644
index 000000000000..e7a0d4c0416d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fn/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "fn";
+  version = "0.4.3";
+
+  # Python 3.11 changed the API of the `inspect` module and fn was never
+  # updated to adapt; last commit was in 2014.
+  disabled = pythonAtLeast "3.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1nmsjmn8jb4gp22ksx0j0hhdf4y0zm8rjykyy2i6flzimg6q1kgq";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/kachayev/fn.py/commit/a54fc0bd8aeae277de2db726131d249ce607c0c2.patch";
+      hash = "sha256-I0ZISOgVibsc1k7gwSfeW6qV9PspQqdaHlRLr/IusQ8=";
+      excludes = [
+        "fn/monad.py"
+      ];
+    })
+  ];
+
+  meta = with lib; {
+    description = ''
+      Functional programming in Python: implementation of missing
+      features to enjoy FP
+    '';
+    homepage = "https://github.com/kachayev/fn.py";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fnv-hash-fast/default.nix b/nixpkgs/pkgs/development/python-modules/fnv-hash-fast/default.nix
new file mode 100644
index 000000000000..01e57845d3bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fnv-hash-fast/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, poetry-core
+, setuptools
+, wheel
+, fnvhash
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "fnv-hash-fast";
+  version = "0.5.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = "fnv-hash-fast";
+    rev = "v${version}";
+    hash = "sha256-gAHCssJC6sTR6ftkQHrtF/5Nf9dXE4ykRhVusb0Gu3I=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov=fnv_hash_fast --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeBuildInputs = [
+    cython
+    poetry-core
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    fnvhash
+  ];
+
+  pythonImportsCheck = [
+    "fnv_hash_fast"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A fast version of fnv1a";
+    homepage = "https://github.com/bdraco/fnv-hash-fast";
+    changelog = "https://github.com/bdraco/fnv-hash-fast/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fnvhash/default.nix b/nixpkgs/pkgs/development/python-modules/fnvhash/default.nix
new file mode 100644
index 000000000000..e54b49ddc8ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fnvhash/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "fnvhash";
+  version = "0.1.0";
+
+  src = fetchFromGitHub {
+    owner = "znerol";
+    repo = "py-fnvhash";
+    rev = "v${version}";
+    sha256 = "00h8i70qd3dpsyf2dp7fkcb9m2prd6m3l33qv3wf6idpnqgjz6fq";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "fnvhash" ];
+
+  meta = with lib; {
+    description = "Python FNV hash implementation";
+    homepage = "https://github.com/znerol/py-fnvhash";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/folium/default.nix b/nixpkgs/pkgs/development/python-modules/folium/default.nix
new file mode 100644
index 000000000000..8b29b61fe698
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/folium/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, branca
+, buildPythonPackage
+, fetchFromGitHub
+, geopandas
+, jinja2
+, nbconvert
+, numpy
+, pandas
+, pillow
+, pytestCheckHook
+, pythonOlder
+, requests
+, selenium
+, setuptools-scm
+, xyzservices
+}:
+
+buildPythonPackage rec {
+  pname = "folium";
+  version = "0.15.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "python-visualization";
+    repo = "folium";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-xaz9oelkyS8lWECCmKs8P3mHB3Usv0KMUoh/K7rBnAs=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    branca
+    jinja2
+    numpy
+    requests
+  ];
+
+  nativeCheckInputs = [
+    geopandas
+    nbconvert
+    pandas
+    pillow
+    pytestCheckHook
+    selenium
+    xyzservices
+  ];
+
+  disabledTests = [
+    # Tests require internet connection
+    "test__repr_png_is_bytes"
+    "test_geojson"
+    "test_heat_map_with_weights"
+    "test_json_request"
+    "test_notebook"
+    "test_valid_png_size"
+    "test_valid_png"
+  ];
+
+  pythonImportsCheck = [
+    "folium"
+  ];
+
+  meta = {
+    description = "Make beautiful maps with Leaflet.js & Python";
+    homepage = "https://github.com/python-visualization/folium";
+    changelog = "https://github.com/python-visualization/folium/blob/v${version}/CHANGES.txt";
+    license = with lib.licenses; [ mit ];
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fontawesomefree/default.nix b/nixpkgs/pkgs/development/python-modules/fontawesomefree/default.nix
new file mode 100644
index 000000000000..437259ff6d3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fontawesomefree/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "fontawesomefree";
+  version = "6.4.2";
+  format = "wheel";
+
+  # they only provide a wheel
+  src = fetchPypi {
+    inherit pname version format;
+    dist = "py3";
+    python = "py3";
+    hash = "sha256-zq/378T8Odrf88P/cpinoQlUAxENNz8iRWuxw0q22wI=";
+  };
+
+  pythonImportsCheck = [
+    "fontawesomefree"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/FortAwesome/Font-Awesome";
+    description = "Icon library and toolkit";
+    license = with licenses; [ ofl cc-by-40 ];
+    maintainers = with maintainers; [ netali ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fontmake/default.nix b/nixpkgs/pkgs/development/python-modules/fontmake/default.nix
new file mode 100644
index 000000000000..a6bd37c0153e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fontmake/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, glyphslib
+, setuptools-scm
+, ufo2ft
+, fonttools
+, fontmath
+, lxml
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "fontmake";
+  version = "3.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Nb09/BRPR0H3rHrbDIhcrgOyJp55KCIdPvUr/vh2Z0U=";
+    extension = "zip";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [
+    glyphslib
+    ufo2ft
+    fonttools
+    fontmath
+    lxml
+    setuptools
+  ];
+
+  pythonImportsCheck = [ "fontmake" ];
+
+  meta = {
+    description = "Compiles fonts from various sources (.glyphs, .ufo, designspace) into binaries formats (.otf, .ttf)";
+    homepage = "https://github.com/googlefonts/fontmake";
+    license = lib.licenses.asl20;
+    maintainers = [ lib.maintainers.BarinovMaxim ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fontmath/default.nix b/nixpkgs/pkgs/development/python-modules/fontmath/default.nix
new file mode 100644
index 000000000000..81e70c51fee3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fontmath/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fonttools
+, setuptools-scm
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fontmath";
+  version = "0.9.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "fontMath";
+    inherit version;
+    hash = "sha256-alOHy3/rEFlY2y9c7tyHhRPMNb83FeJiCQ8FV74MGxw=";
+    extension = "zip";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    fonttools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A collection of objects that implement fast font, glyph, etc. math";
+    homepage = "https://github.com/robotools/fontMath/";
+    changelog = "https://github.com/robotools/fontMath/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sternenseemann ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fontparts/default.nix b/nixpkgs/pkgs/development/python-modules/fontparts/default.nix
new file mode 100644
index 000000000000..e3113b8d1fb4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fontparts/default.nix
@@ -0,0 +1,46 @@
+{ lib, buildPythonPackage, fetchPypi, python, pythonOlder
+, fonttools, lxml, fs, unicodedata2
+, defcon, fontpens, fontmath, booleanoperations
+, pytest, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "fontParts";
+  version = "0.11.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-He3BAIWxwDIM80ixmYjyAHlwDK9bBe/qS8P4+TVEkEg=";
+    extension = "zip";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [
+    booleanoperations
+    fonttools
+    unicodedata2  # fonttools[unicode] extra
+    lxml          # fonttools[lxml] extra
+    fs            # fonttools[ufo] extra
+    defcon
+    fontpens      # defcon[pens] extra
+    fontmath
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} Lib/fontParts/fontshell/test.py
+    runHook postCheck
+  '';
+  nativeCheckInputs = [ pytest ];
+
+  meta = with lib; {
+    description = "An API for interacting with the parts of fonts during the font development process.";
+    homepage = "https://github.com/robotools/fontParts";
+    changelog = "https://github.com/robotools/fontParts/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = [ maintainers.sternenseemann ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fontpens/default.nix b/nixpkgs/pkgs/development/python-modules/fontpens/default.nix
new file mode 100644
index 000000000000..02adb3b06426
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fontpens/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildPythonPackage, fetchPypi, fonttools }:
+
+buildPythonPackage rec {
+  pname = "fontPens";
+  version = "0.2.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1za15dzsnymq6d9x7xdfqwgw4a3003wj75fn2crhyidkfd2s3nd6";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [ fonttools ];
+
+  # can't run normal tests due to circular dependency with fontParts
+  doCheck = false;
+  pythonImportsCheck = [ "fontPens" ] ++ (builtins.map (s: "fontPens." + s) [
+    "angledMarginPen"
+    "digestPointPen"
+    "flattenPen"
+    "guessSmoothPointPen"
+    "marginPen"
+    "penTools"
+    "printPen"
+    "printPointPen"
+    "recordingPointPen"
+    "thresholdPen"
+    "thresholdPointPen"
+    "transformPointPen"
+  ]);
+
+  meta = with lib; {
+    description = "A collection of classes implementing the pen protocol for manipulating glyphs";
+    homepage = "https://github.com/robotools/fontPens";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.sternenseemann ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fonttools/default.nix b/nixpkgs/pkgs/development/python-modules/fonttools/default.nix
new file mode 100644
index 000000000000..3c167debba37
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fonttools/default.nix
@@ -0,0 +1,100 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, isPyPy
+, fetchFromGitHub
+, setuptools-scm
+, fs
+, lxml
+, brotli
+, brotlicffi
+, zopfli
+, unicodedata2
+, lz4
+, scipy
+, munkres
+, matplotlib
+, sympy
+, xattr
+, skia-pathops
+, uharfbuzz
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "fonttools";
+  version = "4.42.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner  = pname;
+    repo   = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-fcFFJi9Hr0m74LwFIhhhm/bMfxepAvg4/ymU53MmsPg=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  passthru.optional-dependencies = let
+    extras = {
+      ufo = [ fs ];
+      lxml = [ lxml ];
+      woff = [ (if isPyPy then brotlicffi else brotli) zopfli ];
+      unicode = lib.optional (pythonOlder "3.11") unicodedata2;
+      graphite = [ lz4 ];
+      interpolatable = [ (if isPyPy then munkres else scipy) ];
+      plot = [ matplotlib ];
+      symfont = [ sympy ];
+      type1 = lib.optional stdenv.isDarwin xattr;
+      pathops = [ skia-pathops ];
+      repacker = [ uharfbuzz ];
+    };
+  in extras // {
+    all = lib.concatLists (lib.attrValues extras);
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.concatLists (lib.attrVals ([
+    "woff"
+    "interpolatable"
+    "ufo"
+  ] ++ lib.optionals (!skia-pathops.meta.broken) [
+    "pathops" # broken
+  ] ++ [
+    "repacker"
+  ]) passthru.optional-dependencies);
+
+  pythonImportsCheck = [ "fontTools" ];
+
+  preCheck = ''
+    # tests want to execute the "fonttools" executable from $PATH
+    export PATH="$out/bin:$PATH"
+  '';
+
+  # Timestamp tests have timing issues probably related
+  # to our file timestamp normalization
+  disabledTests = [
+    "test_recalc_timestamp_ttf"
+    "test_recalc_timestamp_otf"
+    "test_ttcompile_timestamp_calcs"
+  ];
+
+  disabledTestPaths = [
+    # avoid test which depend on fs and matplotlib
+    # fs and matplotlib were removed to prevent strong cyclic dependencies
+    "Tests/misc/plistlib_test.py"
+    "Tests/pens"
+    "Tests/ufoLib"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/fonttools/fonttools";
+    description = "A library to manipulate font files from Python";
+    license = licenses.mit;
+    maintainers = [ maintainers.sternenseemann ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/foobot-async/default.nix b/nixpkgs/pkgs/development/python-modules/foobot-async/default.nix
new file mode 100644
index 000000000000..bf011e0ccf73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/foobot-async/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, aiohttp
+, async-timeout
+, aioresponses
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "foobot-async";
+  version = "1.0.0";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    pname = "foobot_async";
+    inherit version;
+    sha256 = "fa557a22de925139cb4a21034ffdbcd01d28bf166c0e680eaf84a99206327f40";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "foobot_async" ];
+
+  meta = with lib; {
+    description = "API Client for Foobot Air Quality Monitoring devices";
+    homepage = "https://github.com/reefab/foobot_async";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/foolscap/default.nix b/nixpkgs/pkgs/development/python-modules/foolscap/default.nix
new file mode 100644
index 000000000000..2da82762195b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/foolscap/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, pyopenssl
+, pytestCheckHook
+, pythonOlder
+, service-identity
+, six
+, twisted
+, txi2p-tahoe
+, txtorcon
+}:
+
+buildPythonPackage rec {
+  pname = "foolscap";
+  version = "23.3.0";
+
+  disabled = pythonOlder "3.7";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Vu7oXC1brsgBwr2q59TAgx8j1AFRbi5mjRNIWZTbkUU=";
+  };
+
+  propagatedBuildInputs = [
+    six
+    twisted
+    pyopenssl
+  ] ++ twisted.optional-dependencies.tls;
+
+  passthru.optional-dependencies = {
+    i2p = [ txi2p-tahoe ];
+    tor = [ txtorcon ];
+  };
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ] ++ lib.flatten (lib.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [ "foolscap" ];
+
+  meta = with lib; {
+    description = "RPC protocol for Python that follows the distributed object-capability model";
+    longDescription = ''
+      "Foolscap" is the name for the next-generation RPC protocol, intended to
+      replace Perspective Broker (part of Twisted). Foolscap is a protocol to
+      implement a distributed object-capabilities model in Python.
+    '';
+    homepage = "https://github.com/warner/foolscap";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/forbiddenfruit/default.nix b/nixpkgs/pkgs/development/python-modules/forbiddenfruit/default.nix
new file mode 100644
index 000000000000..519d5a14028a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/forbiddenfruit/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+}:
+
+buildPythonPackage rec {
+  version = "0.1.4";
+  pname = "forbiddenfruit";
+
+  src = fetchFromGitHub {
+    owner = "clarete";
+    repo = "forbiddenfruit";
+    rev = version;
+    sha256 = "16chhrxbbmg6lfbzm532fq0v00z8qihcsj0kg2b5jlgnb6qijwn8";
+  };
+
+  nativeCheckInputs = [ nose ];
+
+  preBuild = ''
+    export FFRUIT_EXTENSION="true";
+  '';
+
+  # https://github.com/clarete/forbiddenfruit/pull/47 required to switch to pytest
+  checkPhase = ''
+    find ./build -name '*.so' -exec mv {} tests/unit \;
+    nosetests
+  '';
+
+  meta = with lib; {
+    description = "Patch python built-in objects";
+    homepage = "https://github.com/clarete/forbiddenfruit";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fordpass/default.nix b/nixpkgs/pkgs/development/python-modules/fordpass/default.nix
new file mode 100644
index 000000000000..d3120e7bb6fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fordpass/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, requests
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fordpass";
+  version = "0.0.4";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "clarkd";
+    repo = "fordpass-python";
+    rev = version;
+    sha256 = "0i1dlswxc2bv1smc5d4r1adbxbl7sgr1swh2cjfajp73vs43xa0m";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "fordpass" ];
+
+  meta = with lib; {
+    description = "Python module for the FordPass API";
+    homepage = "https://github.com/clarkd/fordpass-python";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/forecast-solar/default.nix b/nixpkgs/pkgs/development/python-modules/forecast-solar/default.nix
new file mode 100644
index 000000000000..9f4b199c5671
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/forecast-solar/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, aiodns
+, aiohttp
+, backports-zoneinfo
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "forecast-solar";
+  version = "3.0.0";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = "forecast_solar";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Go0DF2qyVyGVYEeoEEuxsSR9Ge8Pg4S77zM1HL83ELc=";
+  };
+
+  PACKAGE_VERSION = version;
+
+  propagatedBuildInputs = [
+    aiodns
+    aiohttp
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    backports-zoneinfo
+  ];
+
+  pythonImportsCheck = [ "forecast_solar" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Asynchronous Python client for getting forecast solar information";
+    homepage = "https://github.com/home-assistant-libs/forecast_solar";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/formbox/default.nix b/nixpkgs/pkgs/development/python-modules/formbox/default.nix
new file mode 100644
index 000000000000..418cd3d958cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/formbox/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, pythonOlder, fetchzip, flit-core, mistune, nh3 }:
+
+buildPythonPackage rec {
+  pname = "formbox";
+  version = "0.4.3";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchzip {
+    url = "https://trong.loang.net/~cnx/formbox/snapshot/formbox-${version}.tar.gz";
+    hash = "sha256-sRu0otyeYpxot/Fyiz3wyQJsJvl8nsgIVitzT8frxLE=";
+  };
+
+  nativeBuildInputs = [ flit-core ];
+  propagatedBuildInputs = [ mistune nh3 ];
+  doCheck = false; # there's no test
+  pythonImportsCheck = [ "formbox" ];
+
+  meta = with lib; {
+    description = "A script to format mbox as HTML/XML";
+    homepage = "https://trong.loang.net/~cnx/formbox";
+    license = licenses.agpl3Plus;
+    maintainers = [ maintainers.McSinyx ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/formencode/default.nix b/nixpkgs/pkgs/development/python-modules/formencode/default.nix
new file mode 100644
index 000000000000..1b7dd1fc2ef0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/formencode/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchPypi
+, setuptools-scm
+, six
+, dnspython
+, pycountry
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "formencode";
+  version = "2.1.0";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    pname = "FormEncode";
+    inherit version;
+    sha256 = "sha256-63TSIweKKM8BX6iJZsbjTy0Y11EnMY1lwUS+2a/EJj8=";
+  };
+
+  postPatch = ''
+    sed -i '/setuptools_scm_git_archive/d' setup.py
+  '';
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ six ];
+
+  nativeCheckInputs = [
+    dnspython
+    pycountry
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # requires network for DNS resolution
+    "test_doctests"
+    "test_unicode_ascii_subgroup"
+  ];
+
+  meta = with lib; {
+    description = "FormEncode validates and converts nested structures";
+    homepage = "http://formencode.org";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/formulae/default.nix b/nixpkgs/pkgs/development/python-modules/formulae/default.nix
new file mode 100644
index 000000000000..d8b6088124d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/formulae/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, pytestCheckHook
+, numpy
+, pandas
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "formulae";
+  version = "0.5.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bambinos";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-nmqGdXqsesRhR06FDS5t64C6+Bz1B97W+PkHrfV7Qmg=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  propagatedBuildInputs = [
+    numpy
+    pandas
+    scipy
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  # use assertions of form `assert pytest.approx(...)`, which is now disallowed:
+  disabledTests = [ "test_basic" "test_degree" ];
+  pythonImportsCheck = [
+    "formulae"
+    "formulae.matrices"
+  ];
+
+  meta = with lib; {
+    homepage = "https://bambinos.github.io/formulae";
+    description = "Formulas for mixed-effects models in Python";
+    changelog = "https://github.com/bambinos/formulae/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/formulaic/default.nix b/nixpkgs/pkgs/development/python-modules/formulaic/default.nix
new file mode 100644
index 000000000000..e119eb9f3b4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/formulaic/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, hatchling
+, hatch-vcs
+, git
+, astor
+, interface-meta
+, numpy
+, pandas
+, scipy
+, sympy
+, wrapt
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "formulaic";
+  version = "0.6.6";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "matthewwardrop";
+    repo = "formulaic";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-82+j3JAkjltXuzRhdvO4hoesSTWlNCY6w2mn6TsZqGM=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    hatchling
+    hatch-vcs
+  ];
+
+  propagatedBuildInputs = [
+    astor
+    numpy
+    pandas
+    scipy
+    wrapt
+    typing-extensions
+    interface-meta
+    sympy
+  ];
+
+  pythonImportsCheck = [ "formulaic" ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  disabledTestPaths = [
+    "tests/transforms/test_poly.py"
+  ];
+
+  meta = {
+    homepage = "https://matthewwardrop.github.io/formulaic/";
+    description = "High-performance implementation of Wilkinson formulas for";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ swflint ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fortiosapi/default.nix b/nixpkgs/pkgs/development/python-modules/fortiosapi/default.nix
new file mode 100644
index 000000000000..5b6bce687ea3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fortiosapi/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, oyaml
+, packaging
+, paramiko
+, pexpect
+, pythonOlder
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "fortiosapi";
+  version = "1.0.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fortinet-solutions-cse";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-M71vleEhRYnlf+RSGT1GbCy5NEZaG0hWmJo01n9s6Rg=";
+  };
+
+  propagatedBuildInputs = [
+    pexpect
+    requests
+    paramiko
+    packaging
+    oyaml
+    six
+  ];
+
+  # Tests require a local VM
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "fortiosapi"
+  ];
+
+  meta = with lib; {
+    description = "Python module to work with Fortigate/Fortios devices";
+    homepage = "https://github.com/fortinet-solutions-cse/fortiosapi";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fountains/default.nix b/nixpkgs/pkgs/development/python-modules/fountains/default.nix
new file mode 100644
index 000000000000..d6efde228fbd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fountains/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, wheel
+, bitlist
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fountains";
+  version = "2.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MhOQ4pemxmjfp7Uy5hLA8i8BBI5QbvD4EjEcKMM/u3I=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    bitlist
+  ];
+
+  # Module has no test
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "fountains"
+  ];
+
+  meta = with lib; {
+    description = "Python library for generating and embedding data for unit testing";
+    homepage = "https://github.com/reity/fountains";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/foxdot/default.nix b/nixpkgs/pkgs/development/python-modules/foxdot/default.nix
new file mode 100644
index 000000000000..4b606f277249
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/foxdot/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, tkinter
+, supercollider
+}:
+
+buildPythonPackage rec {
+  pname = "FoxDot";
+  version = "0.8.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "528999da55ad630e540a39c0eaeacd19c58c36f49d65d24ea9704d0781e18c90";
+  };
+
+  propagatedBuildInputs = [ tkinter ]
+    # we currently build SuperCollider only on Linux
+    # but FoxDot is totally usable on macOS with the official SuperCollider binary
+    ++ lib.optionals stdenv.isLinux [ supercollider ];
+
+  # Requires a running SuperCollider instance
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Live coding music with SuperCollider";
+    homepage = "https://foxdot.org/";
+    license = licenses.cc-by-sa-40;
+    maintainers = with maintainers; [ mrmebelman ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fpdf/default.nix b/nixpkgs/pkgs/development/python-modules/fpdf/default.nix
new file mode 100644
index 000000000000..ca05660feb34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fpdf/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "fpdf";
+  version = "1.7.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0yb73c2clv581sgak5jvlvkj4wy3jav6ms5ia8jx3rw969w40n0j";
+  };
+
+  # No tests available
+  doCheck = false;
+
+  meta = {
+    homepage = "https://github.com/reingart/pyfpdf";
+    description = "Simple PDF generation for Python";
+    license = lib.licenses.lgpl3;
+    maintainers = with lib.maintainers; [ oxzi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fpylll/default.nix b/nixpkgs/pkgs/development/python-modules/fpylll/default.nix
new file mode 100644
index 000000000000..230f83a8e4b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fpylll/default.nix
@@ -0,0 +1,63 @@
+{ stdenv
+, lib
+, fetchFromGitHub
+, buildPythonPackage
+, pkgconfig
+, gmp
+, pari
+, mpfr
+, fplll
+, cython
+, cysignals
+, numpy
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "fpylll";
+  version = "0.5.9";
+
+  src = fetchFromGitHub {
+    owner = "fplll";
+    repo = "fpylll";
+    rev = version;
+    hash = "sha256-T6l6hKzRDevlLyLu5H+bnEdl0OhsPer1coCDiftbPAk=";
+  };
+
+  buildInputs = [
+    gmp
+    pari
+    mpfr
+    fplll
+  ];
+
+  propagatedBuildInputs = [
+    cython
+    cysignals
+    numpy
+  ];
+
+  nativeBuildInputs = [
+    pkgconfig
+  ];
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    # Since upstream introduced --doctest-modules in
+    # https://github.com/fplll/fpylll/commit/9732fdb40cf1bd43ad1f60762ec0a8401743fc79,
+    # it is necessary to ignore import mismatches. Not sure why, but the files
+    # should be identical anyway.
+    PY_IGNORE_IMPORTMISMATCH=1 pytest
+  '';
+
+  meta = with lib; {
+    description = "A Python interface for fplll";
+    changelog = "https://github.com/fplll/fpylll/releases/tag/${version}";
+    homepage = "https://github.com/fplll/fpylll";
+    maintainers = teams.sage.members;
+    license = licenses.gpl2Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fpyutils/default.nix b/nixpkgs/pkgs/development/python-modules/fpyutils/default.nix
new file mode 100644
index 000000000000..3ad71f9a2617
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fpyutils/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, atomicwrites
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "fpyutils";
+  version = "3.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "frnmst";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-cmCD8uKPX/7Ak6jAqzCvDqR1FgH09GaLfLTZdBQB+bs=";
+  };
+
+  propagatedBuildInputs = [
+    atomicwrites
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "fpyutils/tests/*.py"
+  ];
+
+  disabledTests = [
+    # Don't run test which requires bash
+    "test_execute_command_live_output"
+  ];
+
+  pythonImportsCheck = [
+    "fpyutils"
+  ];
+
+  meta = with lib; {
+    description = "Collection of useful non-standard Python functions";
+    homepage = "https://github.com/frnmst/fpyutils";
+    changelog = "https://blog.franco.net.eu.org/software/fpyutils-${version}/release.html";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fqdn/default.nix b/nixpkgs/pkgs/development/python-modules/fqdn/default.nix
new file mode 100644
index 000000000000..2b7182569b29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fqdn/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fqdn";
+  version = "1.5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ypcrts";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-T0CdWWr8p3JVhp3nol5hyxsrD3951JE2EDpFt+m+3bE=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "fqdn"
+  ];
+
+  meta = with lib; {
+    description = "RFC-compliant FQDN validation and manipulation";
+    homepage = "https://github.com/ypcrts/fqdn";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/freebox-api/default.nix b/nixpkgs/pkgs/development/python-modules/freebox-api/default.nix
new file mode 100644
index 000000000000..950b2d4caee4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/freebox-api/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "freebox-api";
+  version = "1.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "hacf-fr";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-3i9I2RRRxLgyfzegnqjO4g+ad1v4phx6xa8HpWP1cck=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    urllib3
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "freebox_api"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interact with the Freebox OS API";
+    homepage = "https://github.com/hacf-fr/freebox-api";
+    changelog = "https://github.com/hacf-fr/freebox-api/releases/tag/v${version}";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/freetype-py/default.nix b/nixpkgs/pkgs/development/python-modules/freetype-py/default.nix
new file mode 100644
index 000000000000..ccc048c1fccb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/freetype-py/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, substituteAll
+, setuptools-scm
+, freetype
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "freetype-py";
+  version = "2.1.0.post1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1k62fx53qrv9nb73mpqi2r11wzbx41qfv5qppvh6rylywnrknf3n";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./library-paths.patch;
+      freetype = "${freetype.out}/lib/libfreetype${stdenv.hostPlatform.extensions.sharedLibrary}";
+    })
+  ];
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ freetype ];
+
+  preCheck = ''
+    cd tests
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck =  [ "freetype" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/rougier/freetype-py";
+    description = "FreeType (high-level Python API)";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ goertzenator ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/freetype-py/library-paths.patch b/nixpkgs/pkgs/development/python-modules/freetype-py/library-paths.patch
new file mode 100644
index 000000000000..a30c7e7355fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/freetype-py/library-paths.patch
@@ -0,0 +1,37 @@
+diff --git a/freetype/raw.py b/freetype/raw.py
+index ff3bea3..78c68ab 100644
+--- a/freetype/raw.py
++++ b/freetype/raw.py
+@@ -19,31 +19,7 @@ from freetype.ft_enums import *
+ from freetype.ft_errors import *
+ from freetype.ft_structs import *
+ 
+-# First, look for a bundled FreeType shared object on the top-level of the
+-# installed freetype-py module.
+-system = platform.system()
+-if system == 'Windows':
+-    library_name = 'libfreetype.dll'
+-elif system == 'Darwin':
+-    library_name = 'libfreetype.dylib'
+-else:
+-    library_name = 'libfreetype.so'
+-
+-filename = os.path.join(os.path.dirname(freetype.__file__), library_name)
+-
+-# If no bundled shared object is found, look for a system-wide installed one.
+-if not os.path.exists(filename):
+-    # on windows all ctypes does when checking for the library
+-    # is to append .dll to the end and look for an exact match
+-    # within any entry in PATH.
+-    filename = ctypes.util.find_library('freetype')
+-
+-    if filename is None:
+-        if platform.system() == 'Windows':
+-            # Check current working directory for dll as ctypes fails to do so
+-            filename = os.path.join(os.path.realpath('.'), "freetype.dll")
+-        else:
+-            filename = library_name
++filename = "@freetype@"
+ 
+ try:
+     _lib = ctypes.CDLL(filename)
diff --git a/nixpkgs/pkgs/development/python-modules/freezegun/default.nix b/nixpkgs/pkgs/development/python-modules/freezegun/default.nix
new file mode 100644
index 000000000000..112b5210173b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/freezegun/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, pytestCheckHook
+, python-dateutil
+, pythonAtLeast
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "freezegun";
+  version = "1.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zSLRugaUE4RBDNln2KmdWuJEL1ffr+/y/aXejcXAVEY=";
+  };
+
+  patches = lib.optionals (pythonAtLeast "3.10") [
+    # Staticmethods in 3.10+ are now callable, prevent freezegun to attempt to decorate them
+    (fetchpatch {
+      url = "https://github.com/spulec/freezegun/pull/397/commits/e63874ce75a74a1159390914045fe8e7955b24c4.patch";
+      hash = "sha256-FNABqVN5DFqVUR88lYzwbfsZj3xcB9/MvQtm+I2VjnI=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    python-dateutil
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "freezegun"
+  ];
+
+  meta = with lib; {
+    description = "Library that allows your Python tests to travel through time";
+    homepage = "https://github.com/spulec/freezegun";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/frida-python/default.nix b/nixpkgs/pkgs/development/python-modules/frida-python/default.nix
new file mode 100644
index 000000000000..11be528b4055
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/frida-python/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv, fetchurl, fetchPypi, buildPythonPackage, typing-extensions }:
+let
+  version = "16.0.19";
+  devkit = fetchurl {
+    url = "https://github.com/frida/frida/releases/download/${version}/frida-core-devkit-${version}-linux-x86_64.tar.xz";
+    hash = "sha256-yNXNqv8eCbpdQKFShpAh6rUCEuItrOSNNLOjESimPdk=";
+  };
+in buildPythonPackage rec {
+  pname = "frida-python";
+  inherit version;
+
+  src = fetchPypi {
+    pname = "frida";
+    inherit version;
+    hash = "sha256-rikIjjn9wA8VL/St/2JJTcueimn+q/URbt9lw/+nalY=";
+  };
+
+  postPatch = ''
+    mkdir assets
+    pushd assets
+    tar xvf ${devkit}
+    export FRIDA_CORE_DEVKIT=$PWD
+    popd
+  '';
+
+  propagatedBuildInputs = [ typing-extensions ];
+
+  pythonImportsCheck = [ "frida" ];
+
+  passthru = { inherit devkit; };
+
+  meta = {
+    description = "Dynamic instrumentation toolkit for developers, reverse-engineers, and security researchers (Python bindings)";
+    homepage = "https://www.frida.re";
+    license = lib.licenses.wxWindows;
+    maintainers = with lib.maintainers; [ s1341 ];
+    platforms = [ "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/frigidaire/default.nix b/nixpkgs/pkgs/development/python-modules/frigidaire/default.nix
new file mode 100644
index 000000000000..1519347b8ba2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/frigidaire/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, certifi
+, chardet
+, fetchFromGitHub
+, idna
+, pythonOlder
+, requests
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "frigidaire";
+  version = "0.18.13";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bm1549";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-FikBV4KjutQfupGPXcVT1h+BfQ099WRrmbrEJOaVCQI=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'version = "SNAPSHOT"' 'version = "${version}"'
+  '';
+
+  propagatedBuildInputs = [
+    certifi
+    chardet
+    idna
+    requests
+    urllib3
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "frigidaire"
+  ];
+
+  meta = with lib; {
+    description = "Python API for the Frigidaire devices";
+    homepage = "https://github.com/bm1549/frigidaire";
+    changelog = "https://github.com/bm1549/frigidaire/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/frilouz/default.nix b/nixpkgs/pkgs/development/python-modules/frilouz/default.nix
new file mode 100644
index 000000000000..b19687f5fe03
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/frilouz/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, astunparse
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "frilouz";
+  version = "0.0.2";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "QuantStack";
+    repo = "frilouz";
+    rev = version;
+    sha256 = "0w2qzi4zb10r9iw64151ay01vf0yzyhh0bsjkx1apxp8fs15cdiw";
+  };
+
+  nativeCheckInputs = [ astunparse ];
+
+  preCheck = "cd test";
+
+  checkPhase = ''
+    runHook preCheck
+    python -m unittest
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "frilouz" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/QuantStack/frilouz";
+    description = "Python AST parser adapter with partial error recovery";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fritzconnection/default.nix b/nixpkgs/pkgs/development/python-modules/fritzconnection/default.nix
new file mode 100644
index 000000000000..36d4dbd5b192
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fritzconnection/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+, requests
+, segno
+}:
+
+buildPythonPackage rec {
+  pname = "fritzconnection";
+  version = "1.13.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "kbr";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-nWXtXhF2pUBxHdrivi4DA7+bFiZPyxb2nqsiN3j4HdI=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  passthru.optional-dependencies = {
+    qr = [
+      segno
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TEMP
+  '';
+
+  pythonImportsCheck = [
+    "fritzconnection"
+  ];
+
+  disabledTestPaths = [
+    # Functional tests require network access
+    "fritzconnection/tests/test_functional.py"
+  ];
+
+  meta = with lib; {
+    description = "Python module to communicate with the AVM Fritz!Box";
+    homepage = "https://github.com/kbr/fritzconnection";
+    changelog = "https://fritzconnection.readthedocs.io/en/${version}/sources/version_history.html";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda valodim ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fritzprofiles/default.nix b/nixpkgs/pkgs/development/python-modules/fritzprofiles/default.nix
new file mode 100644
index 000000000000..fe0cfb6727dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fritzprofiles/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, lxml
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "fritzprofiles";
+  version = "0.7.3";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VoKgLJWF9x8dW8A6CNwLtK+AmehtgZP41nUGQO819es=";
+  };
+
+  propagatedBuildInputs = [
+    lxml
+    requests
+  ];
+
+  pythonImportsCheck = [
+    "fritzprofiles"
+  ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Tool to switch the online time of profiles in the AVM Fritz!Box";
+    homepage = "https://github.com/AaronDavidSchneider/fritzprofiles";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/frozendict/default.nix b/nixpkgs/pkgs/development/python-modules/frozendict/default.nix
new file mode 100644
index 000000000000..6bd1622fa44d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/frozendict/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "frozendict";
+  version = "2.3.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Marco-Sulla";
+    repo = "python-frozendict";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-wVsTsUK6TES6YLGZGcHcGufrdVQrODyXrqczae8iTJ0=";
+  };
+
+  # build C version if it exists
+  preBuild = ''
+    version_str=$(python -c 'import sys; print("_".join(map(str, sys.version_info[:2])))')
+    if test -f src/frozendict/c_src/$version_str/frozendictobject.c; then
+      export CIBUILDWHEEL=1
+      export FROZENDICT_PURE_PY=0
+    else
+      export CIBUILDWHEEL=0
+      export FROZENDICT_PURE_PY=1
+    fi
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "frozendict"
+  ];
+
+  meta = with lib; {
+    description = "Module for immutable dictionary";
+    homepage = "https://github.com/Marco-Sulla/python-frozendict";
+    changelog = "https://github.com/Marco-Sulla/python-frozendict/releases/tag/v${version}";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ pbsds ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/frozenlist/default.nix b/nixpkgs/pkgs/development/python-modules/frozenlist/default.nix
new file mode 100644
index 000000000000..06ff0d1c7dcc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/frozenlist/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "frozenlist";
+  version = "1.4.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-sI6jnrTxDbW0sNVodpCjBnA31VAAmunwMp9s8GkoHGI=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    setuptools
+    wheel
+  ];
+
+  postPatch = ''
+    sed -i "/addopts =/d" pytest.ini
+  '';
+
+  preBuild = ''
+    cython frozenlist/_frozenlist.pyx
+  '';
+
+  pythonImportsCheck = [
+    "frozenlist"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Python module for list-like structure";
+    homepage = "https://github.com/aio-libs/frozenlist";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fs-s3fs/default.nix b/nixpkgs/pkgs/development/python-modules/fs-s3fs/default.nix
new file mode 100644
index 000000000000..8c05c9e73f8d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fs-s3fs/default.nix
@@ -0,0 +1,23 @@
+{ buildPythonPackage, fetchPypi, lib, fs, six, boto3 }:
+
+buildPythonPackage rec {
+  pname = "fs-s3fs";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b57f8c7664460ff7b451b4b44ca2ea9623a374d74e1284c2d5e6df499dc7976c";
+  };
+
+  propagatedBuildInputs = [ fs six boto3 ];
+
+  # tests try to integrate an s3 bucket which can't be tested properly in an isolated environment.
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://pypi.org/project/fs-s3fs/";
+    license = licenses.mit;
+    description = "Amazon S3 filesystem for PyFilesystem2";
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fs/default.nix b/nixpkgs/pkgs/development/python-modules/fs/default.nix
new file mode 100644
index 000000000000..0b2d80e70d41
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fs/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, glibcLocales
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, six
+, appdirs
+, scandir ? null
+, backports_os ? null
+, typing ? null
+, pytz
+, enum34
+, pyftpdlib
+, psutil
+, mock
+, pythonAtLeast
+, isPy3k
+, pytestCheckHook
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "fs";
+  version = "2.4.16";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rpfH1RIT9LcLapWCklMCiQkN46fhWEHhCPvhRPBp0xM=";
+  };
+
+  buildInputs = [ glibcLocales ];
+
+  # strong cycle with parameterized
+  doCheck = false;
+  nativeCheckInputs = [ pyftpdlib mock psutil pytestCheckHook ];
+  propagatedBuildInputs = [ six appdirs pytz setuptools ]
+    ++ lib.optionals (!isPy3k) [ backports_os ]
+    ++ lib.optionals (!pythonAtLeast "3.6") [ typing ]
+    ++ lib.optionals (!pythonAtLeast "3.5") [ scandir ]
+    ++ lib.optionals (!pythonAtLeast "3.5") [ enum34 ];
+
+  LC_ALL="en_US.utf-8";
+
+  preCheck = ''
+    HOME=$(mktemp -d)
+  '';
+
+  pytestFlagsArray = [ "--ignore=tests/test_opener.py" ];
+
+  disabledTests = [
+    "user_data_repr"
+  ] ++ lib.optionals (stdenv.isDarwin) [ # remove if https://github.com/PyFilesystem/pyfilesystem2/issues/430#issue-707878112 resolved
+    "test_ftpfs"
+  ] ++ lib.optionals (pythonAtLeast "3.9") [
+    # update friend version of this commit: https://github.com/PyFilesystem/pyfilesystem2/commit/3e02968ce7da7099dd19167815c5628293e00040
+    # merged into master, able to be removed after >2.4.1
+    "test_copy_sendfile"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Filesystem abstraction";
+    homepage    = "https://github.com/PyFilesystem/pyfilesystem2";
+    license     = licenses.bsd3;
+    maintainers = with maintainers; [ lovek323 ];
+    platforms   = platforms.unix;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fschat/default.nix b/nixpkgs/pkgs/development/python-modules/fschat/default.nix
new file mode 100644
index 000000000000..573009b2a5ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fschat/default.nix
@@ -0,0 +1,102 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, aiohttp
+, fastapi
+, httpx
+, markdown2
+, nh3
+, numpy
+, prompt-toolkit
+, pydantic
+, requests
+, rich
+, shortuuid
+, tiktoken
+, uvicorn
+, anthropic
+, openai
+, ray
+, wandb
+, einops
+, gradio
+, accelerate
+, peft
+, sentencepiece
+, torch
+, transformers
+, protobuf
+}:
+let
+  version = "0.2.32";
+in
+buildPythonPackage {
+  pname = "fschat";
+  inherit version;
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "lm-sys";
+    repo = "FastChat";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-3IJcqVULOK0Nf72sgv80q9U8QZ3pNHLYaNwCQohdBB8=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    fastapi
+    httpx
+    markdown2
+    nh3
+    numpy
+    prompt-toolkit
+    pydantic
+    requests
+    rich
+    shortuuid
+    tiktoken
+    uvicorn
+  # ] ++ markdown2.optional-dependencies.all;
+  ];
+
+  passthru.optional-dependencies = {
+    llm_judge = [
+      anthropic
+      openai
+      ray
+    ];
+    train = [
+      # flash-attn
+      wandb
+      einops
+    ];
+    webui = [
+      gradio
+    ];
+    model_worker = [
+      accelerate
+      peft
+      sentencepiece
+      torch
+      transformers
+      protobuf
+    ];
+  };
+
+  pythonImportsCheck = [ "fastchat" ];
+
+  # tests require networking
+  doCheck = false;
+
+  meta = with lib; {
+    description = "An open platform for training, serving, and evaluating large language models. Release repo for Vicuna and Chatbot Arena";
+    homepage = "https://github.com/lm-sys/FastChat";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fsspec/default.nix b/nixpkgs/pkgs/development/python-modules/fsspec/default.nix
new file mode 100644
index 000000000000..a90fe66a48cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fsspec/default.nix
@@ -0,0 +1,165 @@
+{ lib
+, stdenv
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, paramiko
+, pytest-asyncio
+, pytest-mock
+, pytest-vcr
+, pytestCheckHook
+, pythonOlder
+, requests
+, smbprotocol
+, tqdm
+, adlfs
+, dask
+, distributed
+, dropbox
+, fusepy
+, gcsfs
+, libarchive-c
+, ocifs
+, panel
+, pyarrow
+, pygit2
+, s3fs
+}:
+
+buildPythonPackage rec {
+  pname = "fsspec";
+  version = "2023.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "fsspec";
+    repo = "filesystem_spec";
+    rev = "refs/tags/${version}";
+    hash = "sha256-cLkCQQbb/AakDSz1NTrVlHh8LdgoqtjX8OPT+Nb1NA4=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    paramiko
+    requests
+    smbprotocol
+    tqdm
+  ];
+
+  passthru.optional-dependencies = {
+    entrypoints = [
+    ];
+    abfs = [
+      adlfs
+    ];
+    adl = [
+      adlfs
+    ];
+    dask = [
+      dask
+      distributed
+    ];
+    dropbox = [
+      # missing dropboxdrivefs
+      requests
+      dropbox
+    ];
+    gcs = [
+      gcsfs
+    ];
+    git = [
+      pygit2
+    ];
+    github = [
+      requests
+    ];
+    gs = [
+      gcsfs
+    ];
+    hdfs = [
+      pyarrow
+    ];
+    arrow = [
+      pyarrow
+    ];
+    http = [
+      aiohttp
+      requests
+    ];
+    sftp = [
+      paramiko
+    ];
+    s3 = [
+      s3fs
+    ];
+    oci = [
+      ocifs
+    ];
+    smb = [
+      smbprotocol
+    ];
+    ssh = [
+      paramiko
+    ];
+    fuse = [
+      fusepy
+    ];
+    libarchive = [
+      libarchive-c
+    ];
+    gui = [
+      panel
+    ];
+    tqdm = [
+      tqdm
+    ];
+  };
+
+  nativeCheckInputs = [
+    numpy
+    pytest-asyncio
+    pytest-mock
+    pytest-vcr
+    pytestCheckHook
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  disabledTests = [
+    # Test assumes user name is part of $HOME
+    # AssertionError: assert 'nixbld' in '/homeless-shelter/foo/bar'
+    "test_strip_protocol_expanduser"
+    # test accesses this remote ftp server:
+    # https://ftp.fau.de/debian-cd/current/amd64/log/success
+    "test_find"
+    # Tests want to access S3
+    "test_urlpath_inference_errors"
+    "test_mismatch"
+  ] ++ lib.optionals (stdenv.isDarwin) [
+    # works locally on APFS, fails on hydra with AssertionError comparing timestamps
+    # darwin hydra builder uses HFS+ and has only one second timestamp resolution
+    # this two tests however, assume nanosecond resolution
+    "test_modified"
+    "test_touch"
+  ];
+
+  disabledTestPaths = [
+    # JSON decoding issues
+    "fsspec/implementations/tests/test_dbfs.py"
+  ];
+
+  pythonImportsCheck = [
+    "fsspec"
+  ];
+
+  meta = with lib; {
+    description = "A specification that Python filesystems should adhere to";
+    homepage = "https://github.com/fsspec/filesystem_spec";
+    changelog = "https://github.com/fsspec/filesystem_spec/raw/${version}/docs/source/changelog.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fst-pso/default.nix b/nixpkgs/pkgs/development/python-modules/fst-pso/default.nix
new file mode 100644
index 000000000000..00bcf551b5b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fst-pso/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, miniful
+, numpy
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fst-pso";
+  version = "1.8.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-s9FuwnsLTTazWzBq9AwAzQs05eCp4wpx7QJJDolUomo=";
+  };
+
+  propagatedBuildInputs = [
+    miniful
+    numpy
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "fstpso"
+  ];
+
+  meta = with lib; {
+    description = "Fuzzy Self-Tuning PSO global optimization library";
+    homepage = "https://github.com/aresio/fst-pso";
+    license = with licenses; [ lgpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ftfy/default.nix b/nixpkgs/pkgs/development/python-modules/ftfy/default.nix
new file mode 100644
index 000000000000..058eca560051
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ftfy/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, fetchPypi
+, wcwidth
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ftfy";
+  version = "6.1.1";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-v8IBn4T82FFBkVIyCmN1YEoPFFnCgbWxmbLNDS5yf48=";
+  };
+
+  propagatedBuildInputs = [
+    wcwidth
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export PATH=$out/bin:$PATH
+  '';
+
+  disabledTestPaths = [
+    # Calls poetry and fails to match output exactly
+    "tests/test_cli.py"
+  ];
+
+
+  meta = with lib; {
+    description = "Given Unicode text, make its representation consistent and possibly less broken";
+    homepage = "https://github.com/LuminosoInsight/python-ftfy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ aborsu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ftputil/default.nix b/nixpkgs/pkgs/development/python-modules/ftputil/default.nix
new file mode 100644
index 000000000000..186cb45c941c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ftputil/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, freezegun
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ftputil";
+  version = "5.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-aInbhkndINm21ApsXw+EzPNAp9rB4L/A8AJAkPwq+zM=";
+  };
+
+  nativeCheckInputs = [
+    freezegun
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_public_servers"
+    "test_real_ftp"
+    "test_set_parser"
+    "test_upload"
+  ];
+
+  pythonImportsCheck = [
+    "ftputil"
+  ];
+
+  meta = with lib; {
+    description = "High-level FTP client library (virtual file system and more)";
+    homepage = "https://ftputil.sschwarzer.net/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fugashi/default.nix b/nixpkgs/pkgs/development/python-modules/fugashi/default.nix
new file mode 100644
index 000000000000..264771ed5a4b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fugashi/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, buildPythonPackage
+, cython
+, mecab
+, setuptools-scm
+, ipadic
+, unidic
+, unidic-lite
+}:
+
+buildPythonPackage rec {
+  pname = "fugashi";
+  version = "1.3.0";
+  format = "setuptools";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "polm";
+    repo = "fugashi";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-4i7Q+TtXTQNSJ1EIcS8KHrVPdCJAgZh86Y6lB8772XU=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [ cython mecab setuptools-scm ];
+
+  nativeCheckInputs = [ ipadic pytestCheckHook ]
+    ++ passthru.optional-dependencies.unidic-lite;
+
+  passthru.optional-dependencies = {
+    unidic-lite = [ unidic-lite ];
+    unidic = [ unidic ];
+  };
+
+  preCheck = ''
+    cd fugashi
+  '';
+
+  pythonImportsCheck = [ "fugashi" ];
+
+  meta = with lib; {
+    description = "A Cython MeCab wrapper for fast, pythonic Japanese tokenization and morphological analysis";
+    homepage = "https://github.com/polm/fugashi";
+    changelog = "https://github.com/polm/fugashi/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ laurent-f1z1 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/func-timeout/default.nix b/nixpkgs/pkgs/development/python-modules/func-timeout/default.nix
new file mode 100644
index 000000000000..61204104a96a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/func-timeout/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "func-timeout";
+  version = "4.3.5";
+
+  src = fetchPypi {
+    pname = "func_timeout";
+    inherit version;
+    sha256 = "74cd3c428ec94f4edfba81f9b2f14904846d5ffccc27c92433b8b5939b5575dd";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "func_timeout" ];
+
+  meta = with lib; {
+    description = "Allows you to specify timeouts when calling any existing function. Also provides support for stoppable-threads";
+    homepage = "https://github.com/kata198/func_timeout";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/funcparserlib/default.nix b/nixpkgs/pkgs/development/python-modules/funcparserlib/default.nix
new file mode 100644
index 000000000000..e8f5f10b4533
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/funcparserlib/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, python
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "funcparserlib";
+  version = "1.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "vlasovskikh";
+    repo = pname;
+    rev = version;
+    hash = "sha256-LE9ItCaEzEGeahpM3M3sSnDBXEr6uX5ogEkO5x2Jgzc=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    six
+  ];
+
+  pythonImportsCheck = [
+    "funcparserlib"
+  ];
+
+  meta = with lib; {
+    description = "Recursive descent parsing library based on functional combinators";
+    homepage = "https://github.com/vlasovskikh/funcparserlib";
+    license = licenses.mit;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/funcsigs/default.nix b/nixpkgs/pkgs/development/python-modules/funcsigs/default.nix
new file mode 100644
index 000000000000..a59b6f33b5f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/funcsigs/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi
+, isPyPy, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "funcsigs";
+  version = "1.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0l4g5818ffyfmfs1a924811azhjj8ax9xd1cffr1mzd3ycn0zfx7";
+  };
+
+  # https://github.com/testing-cabal/funcsigs/issues/10
+  patches = lib.optionals (isPyPy && isPy3k) [ ./fix-pypy3-tests.patch ];
+
+  # requires, unittest2 and package hasn't been maintained since 2013
+  doCheck = false;
+
+  pythonImportsCheck = [ "funcsigs" ];
+
+  meta = with lib; {
+    description = "Python function signatures from PEP362 for Python 2.6, 2.7 and 3.2+";
+    homepage = "https://github.com/aliles/funcsigs";
+    maintainers = with maintainers; [ ];
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/funcsigs/fix-pypy3-tests.patch b/nixpkgs/pkgs/development/python-modules/funcsigs/fix-pypy3-tests.patch
new file mode 100644
index 000000000000..f4ecec3b6137
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/funcsigs/fix-pypy3-tests.patch
@@ -0,0 +1,94 @@
+diff --git a/tests/test_inspect.py b/tests/test_inspect.py
+index 98d6592..3a2a1f2 100644
+--- a/tests/test_inspect.py
++++ b/tests/test_inspect.py
+@@ -8,6 +8,7 @@ import unittest2 as unittest
+ 
+ import funcsigs as inspect
+ 
++import platform
+ 
+ class TestSignatureObject(unittest.TestCase):
+     @staticmethod
+@@ -409,7 +410,7 @@ def test_signature_on_decorated(self):
+                       Ellipsis))
+ """)
+ 
+-    if sys.version_info[0] > 2:
++    if sys.version_info[0] > 2 and platform.python_implementation() != "PyPy":
+         exec("""
+ def test_signature_on_class(self):
+     class C:
+@@ -493,41 +494,44 @@ def test_signature_on_class(self):
+                       Ellipsis))
+ """)
+ 
+-    def test_signature_on_callable_objects(self):
+-        class Foo(object):
+-            def __call__(self, a):
+-                pass
++    if platform.python_implementation() != "PyPy":
++        exec("""
++def test_signature_on_callable_objects(self):
++    class Foo(object):
++        def __call__(self, a):
++            pass
+ 
+-        self.assertEqual(self.signature(Foo()),
+-                         ((('a', Ellipsis, Ellipsis, "positional_or_keyword"),),
+-                          Ellipsis))
++    self.assertEqual(self.signature(Foo()),
++                     ((('a', Ellipsis, Ellipsis, "positional_or_keyword"),),
++                      Ellipsis))
+ 
+-        class Spam(object):
+-            pass
+-        with self.assertRaisesRegex(TypeError, "is not a callable object"):
+-            inspect.signature(Spam())
++    class Spam(object):
++        pass
++    with self.assertRaisesRegex(TypeError, "is not a callable object"):
++        inspect.signature(Spam())
+ 
+-        class Bar(Spam, Foo):
+-            pass
++    class Bar(Spam, Foo):
++        pass
+ 
+-        self.assertEqual(self.signature(Bar()),
+-                         ((('a', Ellipsis, Ellipsis, "positional_or_keyword"),),
+-                          Ellipsis))
++    self.assertEqual(self.signature(Bar()),
++                     ((('a', Ellipsis, Ellipsis, "positional_or_keyword"),),
++                      Ellipsis))
+ 
+-        class ToFail(object):
+-            __call__ = type
+-        with self.assertRaisesRegex(ValueError, "not supported by signature"):
+-            inspect.signature(ToFail())
++    class ToFail(object):
++        __call__ = type
++    with self.assertRaisesRegex(ValueError, "not supported by signature"):
++        inspect.signature(ToFail())
+ 
+-        if sys.version_info[0] < 3:
+-            return
++    if sys.version_info[0] < 3:
++        return
+ 
+-        class Wrapped(object):
+-            pass
+-        Wrapped.__wrapped__ = lambda a: None
+-        self.assertEqual(self.signature(Wrapped),
+-                         ((('a', Ellipsis, Ellipsis, "positional_or_keyword"),),
+-                          Ellipsis))
++    class Wrapped(object):
++        pass
++    Wrapped.__wrapped__ = lambda a: None
++    self.assertEqual(self.signature(Wrapped),
++                     ((('a', Ellipsis, Ellipsis, "positional_or_keyword"),),
++                      Ellipsis))
++""")
+ 
+     def test_signature_on_lambdas(self):
+         self.assertEqual(self.signature((lambda a=10: a)),
diff --git a/nixpkgs/pkgs/development/python-modules/functiontrace/default.nix b/nixpkgs/pkgs/development/python-modules/functiontrace/default.nix
new file mode 100644
index 000000000000..0b34da111b36
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/functiontrace/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "functiontrace";
+  version = "0.3.7";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3bnxZFq1/D9ntwfv7O2YU6MnKEDWWIG4zX0e3cgCleg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    toml
+  ];
+
+  pythonImportsCheck = [ "functiontrace" ];
+
+  meta = with lib; {
+    homepage = "https://functiontrace.com";
+    description = "The Python module for Functiontrace";
+    license = licenses.prosperity30;
+    maintainers = with maintainers; [ mathiassven ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/functools32/default.nix b/nixpkgs/pkgs/development/python-modules/functools32/default.nix
new file mode 100644
index 000000000000..be907e963c10
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/functools32/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+if isPy3k then null else buildPythonPackage rec {
+  pname = "functools32";
+  version = "3.2.3-2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0v8ya0b58x47wp216n1zamimv4iw57cxz3xxhzix52jkw3xks9gn";
+  };
+
+  meta = with lib; {
+    description = "This is a backport of the functools standard library module from";
+    homepage = "https://github.com/MiCHiLU/python-functools32";
+    license = licenses.psfl;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/funcy/default.nix b/nixpkgs/pkgs/development/python-modules/funcy/default.nix
new file mode 100644
index 000000000000..bafaf0fdb1f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/funcy/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "funcy";
+  version = "2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-OWMxXVnUHG8wwEvJEOEKtQo6xKIlhov6lv7tEz3wdcs=";
+  };
+
+  # No tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Collection of fancy functional tools focused on practicality";
+    homepage = "https://funcy.readthedocs.org/";
+    changelog = "https://github.com/Suor/funcy/blob/2.0/CHANGELOG";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/funsor/default.nix b/nixpkgs/pkgs/development/python-modules/funsor/default.nix
new file mode 100644
index 000000000000..a08e2a6e4ebc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/funsor/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, makefun
+, multipledispatch
+, numpy
+, opt-einsum
+, typing-extensions
+, pyro-ppl
+, torch
+, pandas
+, pillow
+, pyro-api
+, pytest
+, pytest-xdist
+, requests
+, scipy
+, torchvision
+}:
+
+buildPythonPackage rec {
+  pname = "funsor";
+  version = "0.4.6";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pyro-ppl";
+    repo = "funsor";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Prj1saT0yoPAP8rDE0ipBEpR3QMk4PS12VSJlxc22p8=";
+  };
+
+  # Disable the tests that rely on downloading assets from the internet as well as the linting checks.
+  patches = [
+    ./patch-makefile-for-tests.patch
+  ];
+
+  propagatedBuildInputs = [
+    makefun
+    multipledispatch
+    numpy
+    opt-einsum
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    # Backend
+    pyro-ppl
+    torch
+
+    pandas
+    pillow
+    pyro-api
+    pytest
+    pytest-xdist
+    requests
+    scipy
+    torchvision
+  ];
+
+  # Use the included Makefile to run the tests.
+  checkPhase = ''
+    export FUNSOR_BACKEND=torch
+    make test
+  '';
+
+  pythonImportsCheck = [ "funsor" ];
+
+  meta = with lib; {
+    description = "Functional tensors for probabilistic programming";
+    homepage = "https://funsor.pyro.ai";
+    changelog = "https://github.com/pyro-ppl/funsor/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/funsor/patch-makefile-for-tests.patch b/nixpkgs/pkgs/development/python-modules/funsor/patch-makefile-for-tests.patch
new file mode 100644
index 000000000000..ca59bf75bb7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/funsor/patch-makefile-for-tests.patch
@@ -0,0 +1,27 @@
+diff --git a/Makefile b/Makefile
+index d4b862c..755dfe3 100644
+--- a/Makefile
++++ b/Makefile
+@@ -23,7 +23,7 @@ format: license FORCE
+ 	black .
+ 	isort .
+ 
+-test: lint FORCE
++test: FORCE
+ ifeq (${FUNSOR_BACKEND}, torch)
+ 	pytest -v -n auto test/
+ 	FUNSOR_DEBUG=1 pytest -v test/test_gaussian.py
+@@ -45,10 +45,10 @@ ifeq (${FUNSOR_BACKEND}, torch)
+ 	python examples/slds.py -n 2 -t 50
+ 	python examples/pcfg.py --size 3
+ 	python examples/talbot.py -n 2
+-	python examples/vae.py --smoke-test
++	# python examples/vae.py --smoke-test
+ 	python examples/eeg_slds.py --num-steps 2 --fon --test
+-	python examples/mixed_hmm/experiment.py -d seal -i discrete -g discrete -zi --smoke
+-	python examples/mixed_hmm/experiment.py -d seal -i discrete -g discrete -zi --parallel --smoke
++	# python examples/mixed_hmm/experiment.py -d seal -i discrete -g discrete -zi --smoke
++	# python examples/mixed_hmm/experiment.py -d seal -i discrete -g discrete -zi --parallel --smoke
+ 	python examples/sensor.py --seed=0 --num-frames=2 -n 1
+ 	python examples/adam.py --num-steps=21
+ 	@echo PASS
diff --git a/nixpkgs/pkgs/development/python-modules/furl/default.nix b/nixpkgs/pkgs/development/python-modules/furl/default.nix
new file mode 100644
index 000000000000..3c9592c37d0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/furl/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flake8
+, orderedmultidict
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "furl";
+  version = "2.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5a6188fe2666c484a12159c18be97a1977a71d632ef5bb867ef15f54af39cc4e";
+  };
+
+  # With python 3.11.4, invalid IPv6 address does throw ValueError
+  # https://github.com/gruns/furl/issues/164#issuecomment-1595637359
+  postPatch = ''
+    substituteInPlace tests/test_furl.py \
+      --replace '[0:0:0:0:0:0:0:1:1:1:1:1:1:1:1:9999999999999]' '[2001:db8::9999]'
+  '';
+
+  propagatedBuildInputs = [
+    orderedmultidict
+    six
+  ];
+
+  nativeCheckInputs = [
+    flake8
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "furl" ];
+
+  meta = with lib; {
+    description = "Python library that makes parsing and manipulating URLs easy";
+    homepage = "https://github.com/gruns/furl";
+    license = licenses.unlicense;
+    maintainers = with maintainers; [ vanzef ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/furo/default.nix b/nixpkgs/pkgs/development/python-modules/furo/default.nix
new file mode 100644
index 000000000000..ff74cbd6c9b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/furo/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, pythonRelaxDepsHook
+, sphinx
+, beautifulsoup4
+, sphinx-basic-ng
+}:
+
+buildPythonPackage rec {
+  pname = "furo";
+  version = "2023.9.10";
+  format = "wheel";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version format;
+    dist = "py3";
+    python = "py3";
+    hash = "sha256-UTCSU4U33FxZZpHaBuPDcHFOyZvEOGgO3B3r/7c+W/w=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    "sphinx"
+  ];
+
+  propagatedBuildInputs = [
+    sphinx
+    beautifulsoup4
+    sphinx-basic-ng
+  ];
+
+  installCheckPhase = ''
+    # furo was built incorrectly if this directory is empty
+    # Ignore the hidden file .gitignore
+    cd "$out/lib/python"*
+    if [ "$(ls 'site-packages/furo/theme/furo/static/' | wc -l)" -le 0 ]; then
+      echo 'static directory must not be empty'
+      exit 1
+    fi
+    cd -
+  '';
+
+  pythonImportsCheck = [
+    "furo"
+  ];
+
+  meta = with lib; {
+    description = "A clean customizable documentation theme for Sphinx";
+    homepage = "https://github.com/pradyunsg/furo";
+    changelog = "https://github.com/pradyunsg/furo/blob/${version}/docs/changelog.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Luflosi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fuse-python/default.nix b/nixpkgs/pkgs/development/python-modules/fuse-python/default.nix
new file mode 100644
index 000000000000..4003b54af608
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fuse-python/default.nix
@@ -0,0 +1,27 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, pkg-config, fuse }:
+
+buildPythonPackage rec {
+  pname = "fuse-python";
+  version = "1.0.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-dOX/szaCu6mlrypaBI9Ht+e0ZOv4QpG/WiWL+60Do6o=";
+  };
+
+  buildInputs = [ fuse ];
+  nativeBuildInputs = [ pkg-config ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "fuse" ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Python bindings for FUSE";
+    homepage = "https://github.com/libfuse/python-fuse";
+    license = licenses.lgpl21;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fusepy/default.nix b/nixpkgs/pkgs/development/python-modules/fusepy/default.nix
new file mode 100644
index 000000000000..03a5248e8e1a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fusepy/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "fusepy";
+  version = "3.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1gg69qfi9pjcic3g98l8ya64rw2vc1bp8gsf76my6gglq8z7izvj";
+  };
+
+  propagatedBuildInputs = [ pkgs.fuse ];
+
+  # No tests included
+  doCheck = false;
+
+  # On macOS, users are expected to install macFUSE. This means fusepy should
+  # be able to find libfuse in /usr/local/lib.
+  patchPhase = lib.optionalString (!stdenv.isDarwin) ''
+    substituteInPlace fuse.py --replace \
+      "find_library('fuse')" "'${pkgs.fuse}/lib/libfuse.so'"
+  '';
+
+  meta = with lib; {
+    description = "Simple ctypes bindings for FUSE";
+    longDescription = ''
+      Python module that provides a simple interface to FUSE and MacFUSE.
+      It's just one file and is implemented using ctypes.
+    '';
+    homepage = "https://github.com/terencehonles/fusepy";
+    license = licenses.isc;
+    platforms = platforms.unix;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/future-fstrings/default.nix b/nixpkgs/pkgs/development/python-modules/future-fstrings/default.nix
new file mode 100644
index 000000000000..c4ef6adaf455
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/future-fstrings/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "future-fstrings";
+  version = "1.2.0";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "future_fstrings";
+    sha256 = "6cf41cbe97c398ab5a81168ce0dbb8ad95862d3caf23c21e4430627b90844089";
+  };
+
+  # No tests included in Pypi archive
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/asottile/future-fstrings";
+    description = "A backport of fstrings to python<3.6";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nyanloutre ];
+    broken = pythonOlder "3.6"; # dependency tokenize-rt not packaged
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/future-typing/default.nix b/nixpkgs/pkgs/development/python-modules/future-typing/default.nix
new file mode 100644
index 000000000000..61a87e02253d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/future-typing/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "future-typing";
+  version = "0.4.1";
+
+  src = fetchPypi {
+    pname = "future_typing";
+    inherit version;
+    sha256 = "65fdc5034a95db212790fee5e977fb0a2df8deb60dccf3bac17d6d2b1a9bbacd";
+  };
+
+  doCheck = false; # No tests in pypi source. Did not get tests from GitHub source to work.
+
+  pythonImportsCheck = [ "future_typing" ];
+
+  meta = with lib; {
+    description = "Use generic type hints and new union syntax `|` with python 3.6+";
+    homepage = "https://github.com/PrettyWood/future-typing";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kfollesdal ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/future/default.nix b/nixpkgs/pkgs/development/python-modules/future/default.nix
new file mode 100644
index 000000000000..7c4a5507b540
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/future/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "future";
+  version = "0.18.3";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NKF0Nu0elml6hvnePRWjsL4B2LyN6cHf/Vn7gjTtUwc=";
+  };
+
+  pythonImportsCheck = [
+    "future.builtins"
+    "future.moves"
+    "future.standard_library"
+    "past.builtins"
+    "past.translation"
+  ];
+
+  doCheck = false;
+
+  meta = {
+    changelog = "https://github.com/PythonCharmers/python-future/blob/v${version}/docs/whatsnew.rst";
+    description = "Clean single-source support for Python 3 and 2";
+    longDescription = ''
+      python-future is the missing compatibility layer between Python 2 and
+      Python 3. It allows you to use a single, clean Python 3.x-compatible
+      codebase to support both Python 2 and Python 3 with minimal overhead.
+
+      It provides future and past packages with backports and forward ports
+      of features from Python 3 and 2. It also comes with futurize and
+      pasteurize, customized 2to3-based scripts that helps you to convert
+      either Py2 or Py3 code easily to support both Python 2 and 3 in a
+      single clean Py3-style codebase, module by module.
+    '';
+    homepage = "https://python-future.org";
+    downloadPage = "https://github.com/PythonCharmers/python-future/releases";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ prikhi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fuzzyfinder/default.nix b/nixpkgs/pkgs/development/python-modules/fuzzyfinder/default.nix
new file mode 100644
index 000000000000..2107dd7b2d62
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fuzzyfinder/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "fuzzyfinder";
+  version = "2.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c56d86f110866becad6690c7518f7036c20831c0f82fc87eba8fdb943132f04b";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "fuzzyfinder" ];
+
+  meta = with lib; {
+    description = "Fuzzy Finder implemented in Python";
+    homepage = "https://github.com/amjith/fuzzyfinder";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fuzzytm/default.nix b/nixpkgs/pkgs/development/python-modules/fuzzytm/default.nix
new file mode 100644
index 000000000000..e7dae0d02ee1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fuzzytm/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, gensim
+, numpy
+, pandas
+, pyfume
+, scipy
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "fuzzytm";
+  version = "2.0.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "FuzzyTM";
+    inherit version;
+    hash = "sha256-IELkjd3/yc2lBYsLP6mms9LEcXOfVtNNooEKCMf9BtU=";
+  };
+
+  propagatedBuildInputs = [
+    gensim
+    numpy
+    pandas
+    pyfume
+    scipy
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "FuzzyTM"
+  ];
+
+  meta = with lib; {
+    description = "Library for Fuzzy Topic Models";
+    homepage = "https://github.com/ERijck/FuzzyTM";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fuzzywuzzy/default.nix b/nixpkgs/pkgs/development/python-modules/fuzzywuzzy/default.nix
new file mode 100644
index 000000000000..fd0473b99824
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fuzzywuzzy/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, levenshtein, pycodestyle, hypothesis, pytest }:
+
+buildPythonPackage rec {
+  pname = "fuzzywuzzy";
+  version = "0.18.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1s00zn75y2dkxgnbw8kl8dw4p1mc77cv78fwfa4yb0274s96w0a5";
+  };
+
+  propagatedBuildInputs = [ levenshtein ];
+  nativeCheckInputs = [ pycodestyle hypothesis pytest ];
+
+  meta = with lib; {
+    description = "Fuzzy string matching for Python";
+    homepage = "https://github.com/seatgeek/fuzzywuzzy";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ erikarvstedt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fvcore/default.nix b/nixpkgs/pkgs/development/python-modules/fvcore/default.nix
new file mode 100644
index 000000000000..884f50a0cb4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fvcore/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+# build inputs
+, numpy
+, yacs
+, pyyaml
+, tqdm
+, termcolor
+, pillow
+, tabulate
+, iopath
+, shapely
+# check inputs
+, torch
+}:
+let
+  pname = "fvcore";
+  version = "0.1.5.post20221221";
+  optional-dependencies = {
+    all = [ shapely ];
+  };
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8vsLuQVyrmUcEceOIEk+0ZsiQFUKfku7LW3oe90DeGA=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    yacs
+    pyyaml
+    tqdm
+    termcolor
+    pillow
+    tabulate
+    iopath
+  ];
+
+  nativeCheckInputs = [
+    torch
+  ];
+
+  # TypeError: flop_count() missing 2 required positional arguments: 'model' and 'inputs'
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "fvcore"
+  ];
+
+  passthru.optional-dependencies = optional-dependencies;
+
+   meta = with lib; {
+    description = "Collection of common code that's shared among different research projects in FAIR computer vision team";
+    homepage = "https://github.com/facebookresearch/fvcore";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fvs/default.nix b/nixpkgs/pkgs/development/python-modules/fvs/default.nix
new file mode 100644
index 000000000000..6183c18b5031
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fvs/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, orjson}:
+
+buildPythonPackage rec {
+  pname = "fvs";
+  version = "0.3.4";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "FVS";
+    extension = "tar.gz";
+    hash = "sha256-yYd0HzdwbqB9kexJjBRRYmdsoWtZtcjCNRz0ZJVM5CI=";
+  };
+
+  propagatedBuildInputs = [
+    orjson
+  ];
+
+  # no tests in src
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "fvs"
+  ];
+
+  meta = with lib; {
+    description = "File Versioning System with hash comparison and data storage to create unlinked states that can be deleted";
+    homepage = "https://github.com/mirkobrombin/FVS";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bryanasdev000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fx2/default.nix b/nixpkgs/pkgs/development/python-modules/fx2/default.nix
new file mode 100644
index 000000000000..a691f3723d5a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fx2/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, python
+, fetchFromGitHub
+, sdcc
+, libusb1
+, crcmod
+}:
+
+buildPythonPackage rec {
+  pname = "fx2";
+  version = "unstable-2023-09-20";
+
+  src = fetchFromGitHub {
+    owner = "whitequark";
+    repo = "libfx2";
+    rev = "73fa811818d56a86b82c12e07327946aeddd2b3e";
+    hash = "sha256-AGQPOVTdaUCUeVVNQTBmoNvz5CGxcBOK7+oL+X8AcIw=";
+  };
+
+  nativeBuildInputs = [ sdcc ];
+
+  propagatedBuildInputs = [ libusb1 crcmod ];
+
+  preBuild = ''
+    make -C firmware
+    cd software
+  '';
+
+  preInstall = ''
+    mkdir -p $out/share/libfx2
+    cp -R ../firmware/library/{.stamp,lib,include,fx2{rules,conf}.mk} \
+      $out/share/libfx2
+  '';
+
+  # installCheckPhase tries to run build_ext again and there are no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Chip support package for Cypress EZ-USB FX2 series microcontrollers";
+    homepage = "https://github.com/whitequark/libfx2";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ emily ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/fypp/default.nix b/nixpkgs/pkgs/development/python-modules/fypp/default.nix
new file mode 100644
index 000000000000..a75e141361a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/fypp/default.nix
@@ -0,0 +1,20 @@
+{ lib, stdenv, fetchFromGitHub, buildPythonApplication }:
+
+buildPythonApplication rec {
+  pname = "fypp";
+  version = "3.2";
+
+  src = fetchFromGitHub {
+    owner = "aradi";
+    repo = pname;
+    rev = version;
+    hash = "sha256-MgGVlOqOIrIVoDfBMVpFLT26mhYndxans2hfo/+jdoA=";
+  };
+
+  meta = with lib; {
+    description = "Python powered Fortran preprocessor";
+    homepage = "https://github.com/aradi/fypp";
+    license = licenses.gpl3Only;
+    maintainers = [ maintainers.sheepforce ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/g2pkk/default.nix b/nixpkgs/pkgs/development/python-modules/g2pkk/default.nix
new file mode 100644
index 000000000000..98e03806d2ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/g2pkk/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jamo
+, nltk
+}:
+
+buildPythonPackage rec {
+  pname = "g2pkk";
+  version = "0.1.2";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-YarV1Btn1x3Sm4Vw/JDSyJy3ZJMXAQHZJJJklSG0R+Q=";
+  };
+
+  propagatedBuildInputs = [
+    jamo
+    nltk
+  ];
+
+  pythonImportsCheck = [
+    "g2pkk"
+  ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Cross-platform g2p for Korean";
+    homepage = "https://github.com/harmlessman/g2pkk";
+    license = licenses.asl20;
+    maintainers = teams.tts.members;
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/galois/default.nix b/nixpkgs/pkgs/development/python-modules/galois/default.nix
new file mode 100644
index 000000000000..e6a12ba415df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/galois/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, setuptools-scm
+, pythonOlder
+, pythonRelaxDepsHook
+, fetchFromGitHub
+, pytestCheckHook
+, pytest-xdist
+, numpy
+, numba
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "galois";
+  version = "0.3.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mhostetter";
+    repo = "galois";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Lt55HUTBmrg0IX9oWUdh5zyxccViKq0X+9bhDEgUZjQ=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    numba
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-xdist
+  ];
+
+  pythonRelaxDeps = [ "numpy" "numba" ];
+
+  pythonImportsCheck = [ "galois" ];
+
+  meta = with lib; {
+    description = "Python package that extends NumPy arrays to operate over finite fields";
+    homepage = "https://github.com/mhostetter/galois";
+    changelog = "https://github.com/mhostetter/galois/releases/tag/v${version}";
+    downloadPage = "https://github.com/mhostetter/galois/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ chrispattison ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gamble/default.nix b/nixpkgs/pkgs/development/python-modules/gamble/default.nix
new file mode 100644
index 000000000000..6cdfc4410b34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gamble/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gamble";
+  version = "0.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zsEBqhKidgO1e0lpKhw+LY75I2Df+IefNLaSkBBFKFU=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "gamble"
+  ];
+
+  meta = with lib; {
+    description = "Collection of gambling classes/tools";
+    homepage = "https://github.com/jpetrucciani/gamble";
+    changelog = "https://github.com/jpetrucciani/gamble/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jpetrucciani ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gaphas/default.nix b/nixpkgs/pkgs/development/python-modules/gaphas/default.nix
new file mode 100644
index 000000000000..52428bc3c4eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gaphas/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, poetry-core
+, gobject-introspection
+, gtk3
+, pycairo
+, pygobject3
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "gaphas";
+  version = "3.11.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NpmNIwZqvWAJDkUEb6+GpfQaRCVtjQk4odkaOd2D2ok=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    gobject-introspection
+  ];
+
+  buildInputs = [
+    gtk3
+  ];
+
+  propagatedBuildInputs = [
+    pycairo
+    pygobject3
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [
+    "gaphas"
+  ];
+
+  meta = with lib; {
+    description = "GTK+ based diagramming widget";
+    homepage = "https://github.com/gaphor/gaphas";
+    changelog = "https://github.com/gaphor/gaphas/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/garminconnect-aio/default.nix b/nixpkgs/pkgs/development/python-modules/garminconnect-aio/default.nix
new file mode 100644
index 000000000000..abdd1f9f2f26
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/garminconnect-aio/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, aiohttp
+, brotlipy
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "garminconnect-aio";
+  version = "0.1.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "cyberjunky";
+    repo = "python-garminconnect-aio";
+    rev = version;
+    hash = "sha256-GWY2kTG2D+wOJqM/22pNV5rLvWjAd4jxVGlHBou/T2g=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    brotlipy
+    yarl
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "garminconnect_aio"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interact with Garmin Connect";
+    homepage = "https://github.com/cyberjunky/python-garminconnect-aio";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/garminconnect/default.nix b/nixpkgs/pkgs/development/python-modules/garminconnect/default.nix
new file mode 100644
index 000000000000..423cfd34a70f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/garminconnect/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, garth
+, pdm-backend
+, pythonOlder
+, requests
+, withings-sync
+}:
+
+buildPythonPackage rec {
+  pname = "garminconnect";
+  version = "0.2.9";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "cyberjunky";
+    repo = "python-garminconnect";
+    rev = "refs/tags/${version}";
+    hash = "sha256-wQWOksI0nfzIMdxgZehMmNytuXWD22GLUNoI7Ki0C3s=";
+  };
+
+  nativeBuildInputs = [
+    pdm-backend
+  ];
+
+  propagatedBuildInputs = [
+    garth
+    requests
+    withings-sync
+  ];
+
+  # Tests require a token
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "garminconnect"
+  ];
+
+  meta = with lib; {
+    description = "Garmin Connect Python API wrapper";
+    homepage = "https://github.com/cyberjunky/python-garminconnect";
+    changelog = "https://github.com/cyberjunky/python-garminconnect/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/garth/default.nix b/nixpkgs/pkgs/development/python-modules/garth/default.nix
new file mode 100644
index 000000000000..20c26da372b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/garth/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pdm-backend
+, pydantic
+, pytest-vcr
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-oauthlib
+}:
+
+buildPythonPackage rec {
+  pname = "garth";
+  version = "0.4.41";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-1CnRgPJTG7cpfa/SyhBwVw0Lj6ENI/YY/q2yNeve9c0=";
+  };
+
+  nativeBuildInputs = [
+    pdm-backend
+  ];
+
+  propagatedBuildInputs = [
+    pydantic
+    requests
+    requests-oauthlib
+  ];
+
+  nativeCheckInputs = [
+    pytest-vcr
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "garth"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_client_request"
+    "test_connectapi"
+    "test_daily"
+    "test_download"
+    "test_exchange"
+    "test_hrv_data_get"
+    "test_login"
+    "test_refresh_oauth2_token"
+    "test_sleep_data"
+    "test_username"
+    "test_weekly"
+  ];
+
+  meta = with lib; {
+    description = "Garmin SSO auth and connect client";
+    homepage = "https://github.com/matin/garth";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gassist-text/default.nix b/nixpkgs/pkgs/development/python-modules/gassist-text/default.nix
new file mode 100644
index 000000000000..b413c19d4093
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gassist-text/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, fetchFromGitHub
+, google-auth
+, grpcio
+, protobuf
+, pytestCheckHook
+, pythonOlder
+, requests
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "gassist-text";
+  version = "0.0.10";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tronikos";
+    repo = "gassist_text";
+    rev = "refs/tags/${version}";
+    hash = "sha256-BSMflCSYNAaQVTOqKWyr9U9Q70ley1jjF6ndOVum+GA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    google-auth
+    grpcio
+    protobuf
+    requests
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "gassist_text"
+  ];
+
+  meta = with lib; {
+    description = "Module for interacting with Google Assistant API via text";
+    homepage = "https://github.com/tronikos/gassist_text";
+    changelog = "https://github.com/tronikos/gassist_text/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gast/default.nix b/nixpkgs/pkgs/development/python-modules/gast/default.nix
new file mode 100644
index 000000000000..32e4df0ae197
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gast/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, astunparse
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gast";
+  version = "0.5.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "serge-sans-paille";
+    repo = pname;
+    rev = version;
+    hash = "sha256-0y2bHT7YEfTvDxTm6yLl3GmnPUYEieoGEnwkzfA6mOg=";
+  };
+
+  nativeCheckInputs = [
+    astunparse
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "gast"
+  ];
+
+  meta = with lib; {
+    description = "Compatibility layer between the AST of various Python versions";
+    homepage = "https://github.com/serge-sans-paille/gast/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jyp cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gatt/default.nix b/nixpkgs/pkgs/development/python-modules/gatt/default.nix
new file mode 100644
index 000000000000..3adaf2d70b82
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gatt/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, dbus-python
+, pygobject3
+}:
+
+buildPythonPackage rec {
+  pname = "gatt";
+  version = "0.2.6";
+
+  src = fetchFromGitHub {
+    owner = "getsenic";
+    repo = "gatt-python";
+    rev = version;
+    hash = "sha256-GMLqQ9ojQ649hbbJB+KiQoOhiTWweOgv6zaCDzhIB5A=";
+  };
+
+  propagatedBuildInputs = [
+    dbus-python
+    pygobject3
+  ];
+
+  pythonImportsCheck = [ "gatt" ];
+
+  meta = with lib; {
+    description = "Bluetooth (Generic Attribute Profile) GATT SDK for Python";
+    homepage = "https://github.com/getsenic/gatt-python/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gattlib/default.nix b/nixpkgs/pkgs/development/python-modules/gattlib/default.nix
new file mode 100644
index 000000000000..c7450d6b6b5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gattlib/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, substituteAll
+
+# build
+, pkg-config
+, glibc
+, python
+
+# runtime
+, bluez
+, boost
+, glib
+
+}:
+
+let
+  pname = "gattlib";
+  version = "unstable-2021-06-16";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+
+  src = fetchFromGitHub {
+    owner = "oscaracena";
+    repo = "pygattlib";
+    rev = "7bdb229124fe7d9f4a2cc090277b0fdef82e2a56";
+    hash = "sha256-PS5DIH1JuH2HweyebLLM+UNFGY/XsjKIrsD9x7g7yMI=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./setup.patch;
+      boost_version = let
+        pythonVersion = with lib.versions; "${major python.version}${minor python.version}";
+      in
+        "boost_python${pythonVersion}";
+    })
+  ];
+
+  nativeBuildInputs = [
+    pkg-config
+    glibc
+  ];
+
+  buildInputs = [
+    bluez
+    boost
+    glib
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "gattlib"
+  ];
+
+  meta = with lib; {
+    description = "Python library to use the GATT Protocol for Bluetooth LE devices";
+    homepage = "https://github.com/oscaracena/pygattlib";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gattlib/setup.patch b/nixpkgs/pkgs/development/python-modules/gattlib/setup.patch
new file mode 100644
index 000000000000..32c3b1be496d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gattlib/setup.patch
@@ -0,0 +1,18 @@
+diff --git a/setup.py b/setup.py
+index 0825241..389a59e 100755
+--- a/setup.py
++++ b/setup.py
+@@ -11,12 +11,7 @@ extension_modules = []
+ 
+ 
+ def get_boost_version(out=None):
+-    if out is None:
+-        out = subprocess.check_output(
+-            r"ldconfig -p | grep -E 'libboost_python.*\.so '", shell=True)
+-
+-    ver = os.path.splitext(out.split()[0][3:])[0].decode()
+-    return ver
++    return "@boost_version@"
+ 
+ def tests():
+     # case: python3-py3x.so
diff --git a/nixpkgs/pkgs/development/python-modules/gb-io/default.nix b/nixpkgs/pkgs/development/python-modules/gb-io/default.nix
new file mode 100644
index 000000000000..46c98cfc78c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gb-io/default.nix
@@ -0,0 +1,49 @@
+{ stdenv
+, lib
+, fetchFromGitHub
+, buildPythonPackage
+, rustPlatform
+, cargo
+, rustc
+, setuptools-rust
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "gb-io";
+  version = "0.2.1";
+
+  src = fetchFromGitHub {
+    owner = "althonos";
+    repo = "gb-io.py";
+    rev = "v${version}";
+    hash = "sha256-1B7BUJ8H+pTtmDtazfPfYtlXzL/x4rAHtRIFAAsSoWs=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src sourceRoot;
+    name = "${pname}-${version}";
+    hash = "sha256-lPnOFbEJgcaPPl9bTngugubhW//AUFp9RAjyiFHxC70=";
+  };
+
+  sourceRoot = src.name;
+
+  nativeBuildInputs = [
+    setuptools-rust
+    rustPlatform.cargoSetupHook
+    cargo
+    rustc
+  ];
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  pythonImportsCheck = [ "gb_io" ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    homepage = "https://github.com/althonos/gb-io.py";
+    description = "A Python interface to gb-io, a fast GenBank parser written in Rust";
+    license = licenses.mit;
+    maintainers = with lib.maintainers; [ dlesl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gbinder-python/default.nix b/nixpkgs/pkgs/development/python-modules/gbinder-python/default.nix
new file mode 100644
index 000000000000..c481c2be6de4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gbinder-python/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, cython
+, pkg-config
+, libgbinder
+}:
+
+buildPythonPackage rec {
+  pname = "gbinder-python";
+  version = "1.1.1";
+
+  src = fetchFromGitHub {
+    owner = "erfanoabdi";
+    repo = pname;
+    rev = version;
+    sha256 = "1X9gAux9w/mCEVmE3Yqvvq3kU7hu4iAFaZWNZZZxt3E=";
+  };
+
+  buildInputs = [
+    libgbinder
+  ];
+
+  nativeBuildInputs = [
+    cython
+    pkg-config
+  ];
+
+  postPatch = ''
+    # Fix pkg-config name for cross-compilation
+    substituteInPlace setup.py --replace "pkg-config" "$PKG_CONFIG"
+  '';
+
+  setupPyGlobalFlags = [ "--cython" ];
+
+  meta = {
+    description = "Python bindings for libgbinder";
+    homepage = "https://github.com/erfanoabdi/gbinder-python";
+    license = lib.licenses.gpl3;
+    platforms = lib.platforms.linux;
+    maintainers = with lib.maintainers; [ mcaju ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gbulb/default.nix b/nixpkgs/pkgs/development/python-modules/gbulb/default.nix
new file mode 100644
index 000000000000..2aa73d10db46
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gbulb/default.nix
@@ -0,0 +1,45 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, pygobject3
+, pytestCheckHook
+, gtk3
+, gobject-introspection
+}:
+
+buildPythonPackage rec {
+  pname = "gbulb";
+  version = "0.6.4";
+
+  src = fetchFromGitHub {
+    owner = "beeware";
+    repo = "gbulb";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-AdZSvxix0cpoFQSrslGl+hB/s6Nh0EsWMQmXZAJVJOg=";
+  };
+
+  propagatedBuildInputs = [
+    pygobject3
+    gtk3
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    gobject-introspection
+  ];
+
+  disabledTests = [
+    "test_glib_events.TestBaseGLibEventLoop" # Somtimes fail due to imprecise timing
+  ];
+
+  pythonImportsCheck = [ "gbulb" ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "GLib implementation of PEP 3156";
+    homepage = "https://github.com/beeware/gbulb";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ marius851000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gcal-sync/default.nix b/nixpkgs/pkgs/development/python-modules/gcal-sync/default.nix
new file mode 100644
index 000000000000..22426d8e97b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gcal-sync/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, freezegun
+, ical
+, pydantic
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "gcal-sync";
+  version = "6.0.3";
+  pyproject = true;
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "allenporter";
+    repo = "gcal_sync";
+    rev = "refs/tags/${version}";
+    hash = "sha256-i5K4kJcieugPkXIuDje8tk5TEX6EwDywUB6MByLmukA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    ical
+    pydantic
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    freezegun
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "gcal_sync"
+  ];
+
+  meta = with lib; {
+    description = "Library for syncing Google Calendar to local storage";
+    homepage = "https://github.com/allenporter/gcal_sync";
+    changelog = "https://github.com/allenporter/gcal_sync/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gcodepy/default.nix b/nixpkgs/pkgs/development/python-modules/gcodepy/default.nix
new file mode 100644
index 000000000000..51f32d202241
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gcodepy/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "gcodepy";
+  version = "0.1.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "rmeno12";
+    repo = "gcodepy";
+    rev = "v${version}";
+    hash = "sha256-+amBkwwISPyes8ABdqgCw50Zg5ioDa46WZgQsZZgl+8=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  pythonImportsCheck = [
+    "gcodepy"
+  ];
+
+  meta = with lib; {
+    description = "G-code generator for 3D printers that use Marlin Firmware";
+    homepage = "https://github.com/rmeno12/gcodepy";
+    changelog = "https://github.com/rmeno12/gcodepy/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ n00b0ss ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gcovr/default.nix b/nixpkgs/pkgs/development/python-modules/gcovr/default.nix
new file mode 100644
index 000000000000..81fe8ae04295
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gcovr/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jinja2
+, lxml
+, pygments
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gcovr";
+  version = "6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-hjjV9E3vEOOOMWbIozvvZkPsIEaH4Kx9NFzkGpjFdQs=";
+  };
+
+  propagatedBuildInputs = [
+    jinja2
+    lxml
+    pygments
+  ];
+
+  # There are no unit tests in the pypi tarball. Most of the unit tests on the
+  # github repository currently only work with gcc5, so we just disable them.
+  # See also: https://github.com/gcovr/gcovr/issues/206
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "gcovr"
+    "gcovr.workers"
+    "gcovr.configuration"
+  ];
+
+  meta = with lib; {
+    description = "Python script for summarizing gcov data";
+    homepage = "https://www.gcovr.com/";
+    changelog = "https://github.com/gcovr/gcovr/blob/${version}/CHANGELOG.rst";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gcs-oauth2-boto-plugin/default.nix b/nixpkgs/pkgs/development/python-modules/gcs-oauth2-boto-plugin/default.nix
new file mode 100644
index 000000000000..cb298fa2bab1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gcs-oauth2-boto-plugin/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, boto
+, buildPythonPackage
+, fasteners
+, fetchFromGitHub
+, freezegun
+, google-reauth
+, httplib2
+, oauth2client
+, pyopenssl
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, retry_decorator
+, rsa
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "gcs-oauth2-boto-plugin";
+  version = "3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "GoogleCloudPlatform";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-slTxh2j9VhLiSyiTmJIFFakzpzH/+mgilDRxx0VqqKQ=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "rsa==4.7.2" "rsa" \
+      --replace "version='2.7'" "version='${version}'"
+  '';
+
+  propagatedBuildInputs = [
+    boto
+    freezegun
+    google-reauth
+    httplib2
+    oauth2client
+    pyopenssl
+    retry_decorator
+    rsa
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "gcs_oauth2_boto_plugin"
+  ];
+
+  meta = with lib; {
+    description = "Auth plugin allowing use the use of OAuth 2.0 credentials for Google Cloud Storage";
+    homepage = "https://github.com/GoogleCloudPlatform/gcs-oauth2-boto-plugin";
+    changelog = "https://github.com/GoogleCloudPlatform/gcs-oauth2-boto-plugin/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gcsa/default.nix b/nixpkgs/pkgs/development/python-modules/gcsa/default.nix
new file mode 100644
index 000000000000..c4ffcabeb94d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gcsa/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, pyfakefs
+, tzlocal
+, google-api-python-client
+, google-auth-httplib2
+, google-auth-oauthlib
+, python-dateutil
+, beautiful-date
+}:
+
+buildPythonPackage rec {
+  pname = "gcsa";
+  version = "2.1.0";
+  format = "setuptools";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "kuzmoyev";
+    repo = "google-calendar-simple-api";
+    rev = "v${version}";
+    hash = "sha256-Ye8mQSzgaEZx0vUpt5xiMrJTFh2AmSB7ZZlKaEj/YpM=";
+  };
+
+  propagatedBuildInputs = [
+    tzlocal
+    google-api-python-client
+    google-auth-httplib2
+    google-auth-oauthlib
+    python-dateutil
+    beautiful-date
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook pyfakefs ];
+  pythonImportsCheck = [ "gcsa" ];
+
+  meta = with lib; {
+    description = "Pythonic wrapper for the Google Calendar API";
+    homepage = "https://github.com/kuzmoyev/google-calendar-simple-api";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gcsfs/default.nix b/nixpkgs/pkgs/development/python-modules/gcsfs/default.nix
new file mode 100644
index 000000000000..04af8e58ef79
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gcsfs/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, google-auth
+, google-auth-oauthlib
+, google-cloud-storage
+, requests
+, decorator
+, fsspec
+, ujson
+, aiohttp
+, crcmod
+, pytest-timeout
+, pytest-vcr
+, vcrpy
+}:
+
+buildPythonPackage rec {
+  pname = "gcsfs";
+  version = "2023.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fsspec";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-FHS+g0SuYH9OPiE/+p2SHrsWfzBQ82GM6hTph8koh+o=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    crcmod
+    decorator
+    fsspec
+    google-auth
+    google-auth-oauthlib
+    google-cloud-storage
+    requests
+    ujson
+  ];
+
+  nativeCheckInputs = [
+    pytest-vcr
+    pytest-timeout
+    pytestCheckHook
+    vcrpy
+  ];
+
+  disabledTestPaths = [
+    # Tests require a running Docker instance
+    "gcsfs/tests/test_core.py"
+    "gcsfs/tests/test_mapping.py"
+    "gcsfs/tests/test_retry.py"
+  ];
+
+  pytestFlagsArray = [
+    "-x"
+  ];
+
+  pythonImportsCheck = [
+    "gcsfs"
+  ];
+
+  meta = with lib; {
+    description = "Convenient Filesystem interface over GCS";
+    homepage = "https://github.com/fsspec/gcsfs";
+    changelog = "https://github.com/fsspec/gcsfs/raw/${version}/docs/source/changelog.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ nbren12 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gdata/default.nix b/nixpkgs/pkgs/development/python-modules/gdata/default.nix
new file mode 100644
index 000000000000..94430d0d9411
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gdata/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+}:
+
+buildPythonPackage rec {
+  pname = "gdata";
+  version = "2.0.18";
+
+  src = fetchurl {
+    url = "https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/gdata-python-client/${pname}-${version}.tar.gz";
+    sha256 = "1dpxl5hwyyqd71avpm5vkvw8fhlvf9liizmhrq9jphhrx0nx5rsn";
+  };
+
+  # Fails with "error: invalid command 'test'"
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/google/gdata-python-client";
+    description = "Python client library for Google data APIs";
+    license = licenses.asl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gdown/default.nix b/nixpkgs/pkgs/development/python-modules/gdown/default.nix
new file mode 100644
index 000000000000..363fe2b33397
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gdown/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, fetchPypi
+, filelock
+, requests
+, tqdm
+, setuptools
+, six
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gdown";
+  version = "4.7.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NH8jdpZ5qvfvpz5WVScPzajKVr5l64Skoh0UOYlUEEU=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    filelock
+    requests
+    tqdm
+    setuptools
+    six
+  ] ++ requests.optional-dependencies.socks;
+
+  checkPhase = ''
+    $out/bin/gdown --help > /dev/null
+  '';
+
+  pythonImportsCheck = [
+    "gdown"
+  ];
+
+  meta = with lib; {
+    description = "A CLI tool for downloading large files from Google Drive";
+    homepage = "https://github.com/wkentaro/gdown";
+    changelog = "https://github.com/wkentaro/gdown/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ breakds ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ge25519/default.nix b/nixpkgs/pkgs/development/python-modules/ge25519/default.nix
new file mode 100644
index 000000000000..60bc2b5dbba1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ge25519/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, bitlist
+, buildPythonPackage
+, fe25519
+, fetchPypi
+, fountains
+, parts
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "ge25519";
+  version = "1.5.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VKDPiSdufWwrNcZSRTByFU4YGoJrm48TDm1nt4VyclA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    fe25519
+    parts
+    bitlist
+    fountains
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--doctest-modules --ignore=docs --cov=ge25519 --cov-report term-missing" ""
+  '';
+
+  pythonImportsCheck = [
+    "ge25519"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of Ed25519 group elements and operations";
+    homepage = "https://github.com/nthparty/ge25519";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/geeknote/default.nix b/nixpkgs/pkgs/development/python-modules/geeknote/default.nix
new file mode 100644
index 000000000000..813adfb0dbf3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geeknote/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, thrift
+, beautifulsoup4
+, markdown2
+, sqlalchemy
+, html2text
+, evernote
+}:
+
+buildPythonPackage {
+  version = "2015-05-11";
+  pname = "geeknote";
+  disabled = ! isPy27;
+
+  src = fetchFromGitHub {
+    owner = "VitaliyRodnenko";
+    repo = "geeknote";
+    rev = "8489a87d044e164edb321ba9acca8d4631de3dca";
+    sha256 = "0l16v4xnyqnsf84b1pma0jmdyxvmfwcv3sm8slrv3zv7zpmcm3lf";
+  };
+
+  /* build with tests fails with "Can not create application dirictory :
+   /homeless-shelter/.geeknotebuilder". */
+  doCheck = false;
+
+  propagatedBuildInputs = [ thrift beautifulsoup4 markdown2 sqlalchemy html2text evernote ];
+
+  meta = with lib; {
+    description = "Work with Evernote from command line";
+    homepage = "http://www.geeknote.me";
+    license = licenses.gpl1Only;
+    maintainers = with maintainers; [ hbunke ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gehomesdk/default.nix b/nixpkgs/pkgs/development/python-modules/gehomesdk/default.nix
new file mode 100644
index 000000000000..7e1d88cde508
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gehomesdk/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aiohttp
+, bidict
+, buildPythonPackage
+, fetchPypi
+, humanize
+, lxml
+, pythonOlder
+, requests
+, slixmpp
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "gehomesdk";
+  version = "0.5.23";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6Xk7wAF0bZrHriSyDMnPfaPRBiVinHawj3nEqpwbUmo=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    bidict
+    humanize
+    lxml
+    requests
+    slixmpp
+    websockets
+  ];
+
+  # Tests are not shipped and source is not tagged
+  # https://github.com/simbaja/gehome/issues/32
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "gehomesdk"
+  ];
+
+  meta = with lib; {
+    description = "Python SDK for GE smart appliances";
+    homepage = "https://github.com/simbaja/gehome";
+    changelog = "https://github.com/simbaja/gehome/blob/master/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gekitchen/default.nix b/nixpkgs/pkgs/development/python-modules/gekitchen/default.nix
new file mode 100644
index 000000000000..a06dada36dc7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gekitchen/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, aiohttp
+, bidict
+, buildPythonPackage
+, fetchFromGitHub
+, humanize
+, lxml
+, pytestCheckHook
+, pythonOlder
+, requests
+, slixmpp
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "gekitchen";
+  version = "0.2.19";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ajmarks";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-eKGundh7j9LqFd71bx86rNBVu2iAcgLN25JfFa39+VA=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    bidict
+    humanize
+    lxml
+    requests
+    slixmpp
+    websockets
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "gekitchen"
+  ];
+
+  meta = with lib; {
+    description = "Python SDK for GE smart appliances";
+    homepage = "https://github.com/ajmarks/gekitchen";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gekko/default.nix b/nixpkgs/pkgs/development/python-modules/gekko/default.nix
new file mode 100644
index 000000000000..a623a21eb8c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gekko/default.nix
@@ -0,0 +1,36 @@
+{ fetchPypi
+, lib
+, buildPythonPackage
+, setuptools
+, numpy
+, wheel
+,
+}:
+buildPythonPackage rec {
+  pname = "gekko";
+  version = "1.0.6";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WNyEdJXBXfhrD1LywBBJ3Ehk+CnUS8VYbJFK8mpKV20=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  pythonImportsCheck = [ "gekko" ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/BYU-PRISM/GEKKO";
+    description = "A Python package for machine learning and optimization";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ayes-web ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gemfileparser/default.nix b/nixpkgs/pkgs/development/python-modules/gemfileparser/default.nix
new file mode 100644
index 000000000000..a87073e82a91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gemfileparser/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pytestCheckHook
+}:
+buildPythonPackage rec {
+  pname = "gemfileparser";
+  version = "0.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "839592e49ea3fd985cec003ef58f8e77009a69ed7644a0c0acc94cf6dd9b8d6e";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "gemfileparser"
+  ];
+
+  meta = with lib; {
+    description = "A library to parse Ruby Gemfile, .gemspec and Cocoapod .podspec file using Python";
+    homepage = "https://github.com/gemfileparser/gemfileparser";
+    license = with licenses; [ gpl3Plus /* or */ mit ];
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gemfileparser2/default.nix b/nixpkgs/pkgs/development/python-modules/gemfileparser2/default.nix
new file mode 100644
index 000000000000..4a24fb07d7b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gemfileparser2/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "gemfileparser2";
+  version = "0.9.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BFKJZOf0W2b0YNbKIwnrmoKGvtP8A6R9PrUt7kYC/Dk=";
+  };
+
+  dontConfigure = true;
+
+  postPatch = ''
+    # https://github.com/nexB/gemfileparser2/pull/8
+    substituteInPlace setup.cfg \
+      --replace ">=3.6.*" ">=3.6"
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "gemfileparser2"
+  ];
+
+  meta = with lib; {
+    description = "Library to parse Rubygem gemspec and Gemfile files";
+    homepage = "https://github.com/nexB/gemfileparser2";
+    changelog = "https://github.com/nexB/gemfileparser2/blob/v${version}/CHANGELOG.rst";
+    license = with licenses; [ mit /* or */ gpl3Plus ];
+    maintainers = with maintainers; [ harvidsen ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/genanki/default.nix b/nixpkgs/pkgs/development/python-modules/genanki/default.nix
new file mode 100644
index 000000000000..64159dd7b755
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/genanki/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, cached-property
+, chevron
+, fetchPypi
+, frozendict
+, pystache
+, pythonOlder
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "genanki";
+  version = "0.13.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-hNCQQjqIeVIEZb/peECD7ay4014rpRH6Whve8B2Pce0=";
+  };
+
+  propagatedBuildInputs = [
+    cached-property
+    chevron
+    frozendict
+    pystache
+    pyyaml
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'," ""
+  '';
+
+  # relies on upstream anki
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "genanki"
+  ];
+
+  meta = with lib; {
+    description = "Generate Anki decks programmatically";
+    homepage = "https://github.com/kerrickstaley/genanki";
+    license = licenses.mit;
+    maintainers = with maintainers; [ teto ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/generic/default.nix b/nixpkgs/pkgs/development/python-modules/generic/default.nix
new file mode 100644
index 000000000000..77952b5046b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/generic/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, exceptiongroup
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "generic";
+  version = "1.1.2";
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NfUvmkUIAdm+UZqmBWh0MZTViLJSkeRonPNSnVd+RbA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    exceptiongroup
+  ];
+
+  pythonImportsCheck = [ "generic" ];
+
+  meta = with lib; {
+    description = "Generic programming (Multiple dispatch) library for Python";
+    maintainers = with maintainers; [ wolfangaukang ];
+    homepage = "https://github.com/gaphor/generic";
+    changelog = "https://github.com/gaphor/generic/releases/tag/${version}";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/geniushub-client/default.nix b/nixpkgs/pkgs/development/python-modules/geniushub-client/default.nix
new file mode 100644
index 000000000000..54b36c7de608
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geniushub-client/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "geniushub-client";
+  version = "0.7.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "manzanotti";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Gq2scYos7E8me1a4x7NanHRq2eYWuU2uSUwM+O1TPb8=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'VERSION = os.environ["GITHUB_REF_NAME"]' "" \
+      --replace "version=VERSION," 'version="${version}",'
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "geniushubclient"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with Genius Hub systems";
+    homepage = "https://github.com/manzanotti/geniushub-client";
+    changelog = "https://github.com/manzanotti/geniushub-client/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/genome-collector/default.nix b/nixpkgs/pkgs/development/python-modules/genome-collector/default.nix
new file mode 100644
index 000000000000..70589912520a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/genome-collector/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, appdirs
+, biopython
+, fetchPypi
+, proglog
+}:
+
+buildPythonPackage rec {
+  pname = "genome_collector";
+  version = "0.1.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0023ihrz0waxbhq28xh1ymvk51ih882y9psg4glm6s9d1zmqvdph";
+  };
+
+  propagatedBuildInputs = [
+    appdirs
+    biopython
+    proglog
+  ];
+
+  # Project hasn't released the tests yet
+  doCheck = false;
+  pythonImportsCheck = [ "genome_collector" ];
+
+  meta = with lib; {
+    description = "Genomes and build BLAST/Bowtie indexes in Python";
+    homepage = "https://github.com/Edinburgh-Genome-Foundry/genome_collector";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/genpy/default.nix b/nixpkgs/pkgs/development/python-modules/genpy/default.nix
new file mode 100644
index 000000000000..7bb7458b0ccc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/genpy/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytools
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "genpy";
+  version = "2022.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-FGZbQlUgbJjnuiDaKS/vVlraMVmFF1cAQk7S3aPWXx4=";
+  };
+
+  propagatedBuildInputs = [
+    pytools
+    numpy
+  ];
+
+  meta = with lib; {
+    description = "C/C++ source generation from an AST";
+    homepage = "https://github.com/inducer/genpy";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/genshi/default.nix b/nixpkgs/pkgs/development/python-modules/genshi/default.nix
new file mode 100644
index 000000000000..090807f2495a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/genshi/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "Genshi";
+  version = "0.7.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wQBSCGLNaQhdEO4ah+kSief1n2s9m9Yiv1iygE5rmqs=";
+  };
+
+  # FAIL: test_sanitize_remove_script_elem (genshi.filters.tests.html.HTMLSanitizerTestCase)
+  # FAIL: test_sanitize_remove_src_javascript (genshi.filters.tests.html.HTMLSanitizerTestCase)
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    setuptools six
+  ];
+
+  meta = with lib; {
+    description = "Python components for parsing HTML, XML and other textual content";
+    longDescription = ''
+      Python library that provides an integrated set of components for
+      parsing, generating, and processing HTML, XML or other textual
+      content for output generation on the web.
+    '';
+    homepage = "https://genshi.edgewall.org/";
+    license = licenses.bsd0;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gensim/default.nix b/nixpkgs/pkgs/development/python-modules/gensim/default.nix
new file mode 100644
index 000000000000..f43bfb518cfb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gensim/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchPypi
+, mock
+, numpy
+, scipy
+, smart-open
+, testfixtures
+, pyemd
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gensim";
+  version = "4.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-maxq9v/UBoLnAVXtn5Lsv0OE1Z+1CvEg00PqXuGzCKs=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    smart-open
+    numpy
+    scipy
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pyemd
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "gensim"
+  ];
+
+  # Test setup takes several minutes
+  doCheck = false;
+
+  pytestFlagsArray = [
+    "gensim/test"
+  ];
+
+  meta = with lib; {
+    description = "Topic-modelling library";
+    homepage = "https://radimrehurek.com/gensim/";
+    changelog = "https://github.com/RaRe-Technologies/gensim/blob/${version}/CHANGELOG.md";
+    license = licenses.lgpl21Only;
+    maintainers = with maintainers; [ jyp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gentools/default.nix b/nixpkgs/pkgs/development/python-modules/gentools/default.nix
new file mode 100644
index 000000000000..6d2ae215eafa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gentools/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, importlib-metadata
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gentools";
+  version = "1.2.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ariebovenberg";
+    repo = "gentools";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-RBUIji3FOIRjfp4t7zBAVSeiWaYufz4ID8nTWmhDkf8=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportCheck = [
+    "gentools"
+  ];
+
+  meta = with lib; {
+    description = "Tools for generators, generator functions, and generator-based coroutines";
+    homepage = "https://gentools.readthedocs.io/";
+    changelog = "https://github.com/ariebovenberg/gentools/blob/v${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mredaelli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/genzshcomp/default.nix b/nixpkgs/pkgs/development/python-modules/genzshcomp/default.nix
new file mode 100644
index 000000000000..a848eff41a65
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/genzshcomp/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "genzshcomp";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b582910d36f9ad0992756d7e9ccbe3e5cf811934b1002b51f25b99d3dda9d573";
+  };
+
+  buildInputs = [ setuptools ];
+
+  meta = with lib; {
+    description = "Automatically generated zsh completion function for Python's option parser modules";
+    homepage = "https://bitbucket.org/hhatto/genzshcomp/";
+    license = licenses.bsd0;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/geoalchemy2/default.nix b/nixpkgs/pkgs/development/python-modules/geoalchemy2/default.nix
new file mode 100644
index 000000000000..53e1544ed018
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geoalchemy2/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, packaging
+, setuptools
+, setuptools-scm
+, shapely
+, sqlalchemy
+, alembic
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "geoalchemy2";
+  version = "0.14.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "geoalchemy";
+    repo = "geoalchemy2";
+    rev = "refs/tags/${version}";
+    hash = "sha256-C/F1hpL2DnzC4UPAGGFntlQlULCx5Ufzkw7EIrzRV7I=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    sqlalchemy
+    packaging
+  ];
+
+  nativeCheckInputs = [
+    alembic
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.shapely;
+
+  env = {
+    SETUPTOOLS_SCM_PRETEND_VERSION = version;
+  };
+
+  disabledTestPaths = [
+    # tests require live databases
+    "tests/gallery/test_decipher_raster.py"
+    "tests/gallery/test_length_at_insert.py"
+    "tests/gallery/test_insert_raster.py"
+    "tests/gallery/test_orm_mapped_v2.py"
+    "tests/gallery/test_specific_compilation.py"
+    "tests/gallery/test_summarystatsagg.py"
+    "tests/gallery/test_type_decorator.py"
+    "tests/test_functional.py"
+    "tests/test_functional_postgresql.py"
+    "tests/test_functional_mysql.py"
+    "tests/test_alembic_migrations.py"
+    "tests/test_pickle.py"
+  ];
+
+  pythonImportsCheck = [
+    "geoalchemy2"
+  ];
+
+  passthru.optional-dependencies = {
+    shapely = [ shapely ];
+  };
+
+  meta = with lib; {
+    description = "Toolkit for working with spatial databases";
+    homepage = "https://geoalchemy-2.readthedocs.io/";
+    changelog = "https://github.com/geoalchemy/geoalchemy2/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/geocachingapi/default.nix b/nixpkgs/pkgs/development/python-modules/geocachingapi/default.nix
new file mode 100644
index 000000000000..61e2a1f7a80a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geocachingapi/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, aiohttp
+, backoff
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools-scm
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "geocachingapi";
+  version = "0.2.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Sholofly";
+    repo = "geocachingapi-python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-C4nj4KFEwsY5V5f0Q1x+9sD8Ihz5m7b3jg2pOyB/pDg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  propagatedBuildInputs = [
+    aiohttp
+    backoff
+    yarl
+  ];
+
+  # Tests require a token and network access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "geocachingapi"
+  ];
+
+  meta = with lib; {
+    description = "Python API to control the Geocaching API";
+    homepage = "https://github.com/Sholofly/geocachingapi-python";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/geographiclib/default.nix b/nixpkgs/pkgs/development/python-modules/geographiclib/default.nix
new file mode 100644
index 000000000000..fcdf7a015e7a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geographiclib/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "geographiclib";
+  version = "2.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-9/Qchdw+HC09k17IZmDcOyyEjIPhf5qeUbqdUUahWFk=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "geographiclib" ];
+
+  meta = with lib; {
+    homepage = "https://geographiclib.sourceforge.io";
+    description = "Algorithms for geodesics (Karney, 2013) for solving the direct and inverse problems for an ellipsoid of revolution";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/geoip/default.nix b/nixpkgs/pkgs/development/python-modules/geoip/default.nix
new file mode 100644
index 000000000000..0db8cb1e4a98
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geoip/default.nix
@@ -0,0 +1,29 @@
+{lib, buildPythonPackage, fetchPypi
+, libgeoip, nose}:
+
+buildPythonPackage rec {
+  pname = "geoip";
+  version = "1.3.2";
+
+  nativeCheckInputs = [ nose ];
+  propagatedBuildInputs = [
+    libgeoip
+  ];
+
+  src = fetchPypi {
+    pname = "GeoIP";
+    inherit version;
+    sha256 = "1rphxf3vrn8wywjgr397f49s0s22m83lpwcq45lm0h2p45mdm458";
+  };
+
+  # Tests cannot be run because they require data that isn't included in the
+  # release tarball.
+  checkPhase = "true";
+
+  meta = {
+    description = "MaxMind GeoIP Legacy Database - Python API";
+    homepage = "https://www.maxmind.com/";
+    maintainers = with lib.maintainers; [ jluttine ];
+    license = lib.licenses.lgpl21Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/geoip2/default.nix b/nixpkgs/pkgs/development/python-modules/geoip2/default.nix
new file mode 100644
index 000000000000..dea210a9a6cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geoip2/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, maxminddb
+, mocket
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, requests
+, requests-mock
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "geoip2";
+  version = "4.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-O93kmU9ryRfq+rW1Hnctc3sq4AA3pbhQAfsG3Gj3ed8=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    maxminddb
+    requests
+    urllib3
+  ];
+
+  nativeCheckInputs = [
+    mocket
+    requests-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "geoip2"
+  ];
+
+  disabledTests = lib.optionals (pythonAtLeast "3.11") [
+    # https://github.com/maxmind/GeoIP2-python/pull/136
+    "TestAsyncClient"
+  ] ++ lib.optionals (pythonAtLeast "3.10") [
+    "test_request"
+  ];
+
+  meta = with lib; {
+    description = "GeoIP2 webservice client and database reader";
+    homepage = "https://github.com/maxmind/GeoIP2-python";
+    changelog = "https://github.com/maxmind/GeoIP2-python/blob/v${version}/HISTORY.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/geojson-client/default.nix b/nixpkgs/pkgs/development/python-modules/geojson-client/default.nix
new file mode 100644
index 000000000000..f315d99d8dd8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geojson-client/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, geojson
+, haversine
+, pytz
+, requests
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "geojson-client";
+  version = "0.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-geojson-client";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-nzM5P1ww6yWM3e2v3hRw0ECoYmRPhTs0Q7Wwicl+IpU=";
+  };
+
+  propagatedBuildInputs = [
+    geojson
+    haversine
+    pytz
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "geojson_client"
+  ];
+
+  meta = with lib; {
+    description = "Python module for convenient access to GeoJSON feeds";
+    homepage = "https://github.com/exxamalte/python-geojson-client";
+    changelog = "https://github.com/exxamalte/python-geojson-client/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/geojson/default.nix b/nixpkgs/pkgs/development/python-modules/geojson/default.nix
new file mode 100644
index 000000000000..69cd2ed30653
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geojson/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, glibcLocales
+, unittestCheckHook
+ }:
+
+buildPythonPackage rec {
+  pname = "geojson";
+  version = "3.0.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "jazzband";
+    repo = "geojson";
+    rev = "refs/tags/${version}";
+    hash = "sha256-VlP/odzRH6Eg0BMZPBQkbHL/O2cIwWTKJcL5SfZoUWQ=";
+  };
+
+  pythonImportsCheck = [
+    "geojson"
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  meta = {
+    homepage = "https://github.com/jazzband/geojson";
+    changelog = "https://github.com/jazzband/geojson/blob/${version}/CHANGELOG.rst";
+    description = "Python bindings and utilities for GeoJSON";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ oxzi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/geomet/default.nix b/nixpkgs/pkgs/development/python-modules/geomet/default.nix
new file mode 100644
index 000000000000..0f9742c34381
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geomet/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, click
+, setuptools
+, six
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "geomet";
+  version = "1.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "geomet";
+    repo = "geomet";
+    rev = "refs/tags/${version}";
+    hash = "sha256-YfI29925nffzRBMJb6Gm3muvlpwP3zSw2YJ2vWcf+Bo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    click
+    six
+  ];
+
+  pythonImportsCheck = [
+    "geomet"
+  ];
+
+  meta = with lib; {
+    description = "Convert GeoJSON to WKT/WKB (Well-Known Text/Binary) and vice versa";
+    homepage = "https://github.com/geomet/geomet";
+    changelog = "https://github.com/geomet/geomet/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ turion ris ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/geometric/default.nix b/nixpkgs/pkgs/development/python-modules/geometric/default.nix
new file mode 100644
index 000000000000..6d9e33df805b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geometric/default.nix
@@ -0,0 +1,49 @@
+{ buildPythonPackage
+, lib
+, fetchFromGitHub
+, fetchpatch
+, networkx
+, numpy
+, scipy
+, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "geometric";
+  version = "1.0.1";
+
+  src = fetchFromGitHub {
+    owner = "leeping";
+    repo = "geomeTRIC";
+    rev = version;
+    hash = "sha256-3d4z1n8+e0HgdeKLNSsHLb3XHOk09uy+gP9AwNvNITE=";
+  };
+
+  patches = [ (fetchpatch {
+    name = "ase-is-optional";
+    url = "https://github.com/leeping/geomeTRIC/commit/aff6e4411980ac9cbe112a050c3a34ba7e305a43.patch";
+    hash = "sha256-JGGPX+JwkQ8Imgmyx+ReRTV+k6mxHYgm+Nd8WUjbFEg=";
+  }) ];
+
+  propagatedBuildInputs = [
+    networkx
+    numpy
+    scipy
+    six
+  ];
+
+  preCheck = ''
+    export OMP_NUM_THREADS=2
+  '';
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Geometry optimization code for molecular structures";
+    homepage = "https://github.com/leeping/geomeTRIC";
+    license = [ licenses.bsd3 ];
+    maintainers = [ maintainers.markuskowa ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/geopandas/default.nix b/nixpkgs/pkgs/development/python-modules/geopandas/default.nix
new file mode 100644
index 000000000000..e075700ce1f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geopandas/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, fiona
+, packaging
+, pandas
+, pyproj
+, pytestCheckHook
+, pythonOlder
+, rtree
+, shapely
+}:
+
+buildPythonPackage rec {
+  pname = "geopandas";
+  version = "0.14.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "geopandas";
+    repo = "geopandas";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-mQ13fjhtFXvUnBok5bDz+zkbgfXEUmwiv77rBpYS5oo=";
+  };
+
+  propagatedBuildInputs = [
+    fiona
+    packaging
+    pandas
+    pyproj
+    shapely
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    rtree
+  ];
+
+  doCheck = !stdenv.isDarwin;
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  disabledTests = [
+    # Requires network access
+    "test_read_file_url"
+  ];
+
+  pytestFlagsArray = [
+    "geopandas"
+  ];
+
+  pythonImportsCheck = [
+    "geopandas"
+  ];
+
+  meta = with lib; {
+    description = "Python geospatial data analysis framework";
+    homepage = "https://geopandas.org";
+    changelog = "https://github.com/geopandas/geopandas/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = teams.geospatial.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/geopy/default.nix b/nixpkgs/pkgs/development/python-modules/geopy/default.nix
new file mode 100644
index 000000000000..3a25b434c301
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geopy/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, async-generator
+, buildPythonPackage
+, docutils
+, fetchFromGitHub
+, geographiclib
+, pytestCheckHook
+, pythonOlder
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "geopy";
+  version = "2.4.0";
+  format = "setuptools";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-3Sq76DcnoG0Uv/KPF/B3oep0MO96vemKiANjgR7/k/I=";
+  };
+
+  propagatedBuildInputs = [
+    geographiclib
+  ];
+
+  nativeCheckInputs = [
+    async-generator
+    docutils
+    pytestCheckHook
+    pytz
+  ];
+
+  disabledTests = [
+    # ignore --skip-tests-requiring-internet flag
+    "test_user_agent_default"
+  ];
+
+  pytestFlagsArray = [ "--skip-tests-requiring-internet" ];
+
+  pythonImportsCheck = [ "geopy" ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    homepage = "https://github.com/geopy/geopy";
+    description = "Python Geocoding Toolbox";
+    changelog = "https://github.com/geopy/geopy/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ GuillaumeDesforges ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/georss-client/default.nix b/nixpkgs/pkgs/development/python-modules/georss-client/default.nix
new file mode 100644
index 000000000000..d6529cbf9fec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/georss-client/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, dateparser
+, fetchFromGitHub
+, haversine
+, pytestCheckHook
+, pythonOlder
+, requests
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "georss-client";
+  version = "0.15";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-georss-client";
+    rev = "v${version}";
+    hash = "sha256-D1ggfEDU+vlFmi1USwdHj1due0PrCQCpKF4zaarHCFs=";
+  };
+
+  propagatedBuildInputs = [
+    haversine
+    xmltodict
+    requests
+    dateparser
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "georss_client"
+  ];
+
+  meta = with lib; {
+    description = "Python library for accessing GeoRSS feeds";
+    homepage = "https://github.com/exxamalte/python-georss-client";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/georss-generic-client/default.nix b/nixpkgs/pkgs/development/python-modules/georss-generic-client/default.nix
new file mode 100644
index 000000000000..7e3cb7758893
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/georss-generic-client/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, georss-client
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "georss-generic-client";
+  version = "0.7";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-georss-generic-client";
+    rev = "v${version}";
+    hash = "sha256-58NpACrJK29NUnx3RrsLFPPo+6A/JlIlkrv8N9juMu0=";
+  };
+
+  propagatedBuildInputs = [
+    georss-client
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "georss_generic_client" ];
+
+  meta = with lib; {
+    description = "Python library for accessing generic GeoRSS feeds";
+    homepage = "https://github.com/exxamalte/python-georss-generic-client";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/georss-ign-sismologia-client/default.nix b/nixpkgs/pkgs/development/python-modules/georss-ign-sismologia-client/default.nix
new file mode 100644
index 000000000000..15002c77f7bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/georss-ign-sismologia-client/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, georss-client
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "georss-ign-sismologia-client";
+  version = "0.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-georss-ign-sismologia-client";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-OLX6Megl5l8KDnd/G16QJ/wQn5AQc2cZ+LCbjuHFbwo=";
+  };
+
+  propagatedBuildInputs = [
+    georss-client
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "georss_ign_sismologia_client"
+  ];
+
+  meta = with lib; {
+    description = "Python library for accessing the IGN Sismologia GeoRSS feed";
+    homepage = "https://github.com/exxamalte/python-georss-ign-sismologia-client";
+    changelog = "https://github.com/exxamalte/python-georss-ign-sismologia-client/blob/v0.6/CHANGELOG.md";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/georss-ingv-centro-nazionale-terremoti-client/default.nix b/nixpkgs/pkgs/development/python-modules/georss-ingv-centro-nazionale-terremoti-client/default.nix
new file mode 100644
index 000000000000..273b67acfb7c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/georss-ingv-centro-nazionale-terremoti-client/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, georss-client
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "georss-ingv-centro-nazionale-terremoti-client";
+  version = "0.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-georss-ingv-centro-nazionale-terremoti-client";
+    rev = "v${version}";
+    hash = "sha256-zqjo70NzpUt5zNEar0P1sl/gMb+ZcS+7GX7QGuFjMYY=";
+  };
+
+  propagatedBuildInputs = [
+    georss-client
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "georss_ingv_centro_nazionale_terremoti_client"
+  ];
+
+  meta = with lib; {
+    description = "Python library for accessing the INGV Centro Nazionale Terremoti GeoRSS feed";
+    homepage = "https://github.com/exxamalte/python-georss-ingv-centro-nazionale-terremoti-client";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/georss-nrcan-earthquakes-client/default.nix b/nixpkgs/pkgs/development/python-modules/georss-nrcan-earthquakes-client/default.nix
new file mode 100644
index 000000000000..ef8ea220e9e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/georss-nrcan-earthquakes-client/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, georss-client
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "georss-nrcan-earthquakes-client";
+  version = "0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-georss-nrcan-earthquakes-client";
+    rev = "v${version}";
+    hash = "sha256-FFm37+dCkdoZXgvAjYhcHOYFf0oQ37bxJb7vzbWDTro=";
+  };
+
+  propagatedBuildInputs = [
+    georss-client
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "georss_nrcan_earthquakes_client"
+  ];
+
+  meta = with lib; {
+    description = "Python library for accessing Natural Resources Canada Earthquakes feed";
+    homepage = "https://github.com/exxamalte/python-georss-nrcan-earthquakes-client";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/georss-qld-bushfire-alert-client/default.nix b/nixpkgs/pkgs/development/python-modules/georss-qld-bushfire-alert-client/default.nix
new file mode 100644
index 000000000000..a85302544d09
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/georss-qld-bushfire-alert-client/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, georss-client
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "georss-qld-bushfire-alert-client";
+  version = "0.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-georss-qld-bushfire-alert-client";
+    rev = "v${version}";
+    hash = "sha256-7KVR0hdLwyCj7MYJoRvQ6wTeJQAmCUarYxJXEFaN8Pc=";
+  };
+
+  propagatedBuildInputs = [
+    georss-client
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "georss_qld_bushfire_alert_client"
+  ];
+
+  meta = with lib; {
+    description = "Python library for accessing Queensland Bushfire Alert feed";
+    homepage = "https://github.com/exxamalte/python-georss-qld-bushfire-alert-client";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/georss-tfs-incidents-client/default.nix b/nixpkgs/pkgs/development/python-modules/georss-tfs-incidents-client/default.nix
new file mode 100644
index 000000000000..adb89685d9bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/georss-tfs-incidents-client/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, georss-client
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "georss-tfs-incidents-client";
+  version = "0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-georss-tfs-incidents-client";
+    rev = "v${version}";
+    hash = "sha256-Cz0PRcGReAE0mg04ktCUaoLqPTjvyU1TiB/Pdz7o7zo=";
+  };
+
+  propagatedBuildInputs = [
+    georss-client
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "georss_tfs_incidents_client"
+  ];
+
+  meta = with lib; {
+    description = "Python library for accessing Tasmania Fire Service Incidents feed";
+    homepage = "https://github.com/exxamalte/python-georss-tfs-incidents-client";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/georss-wa-dfes-client/default.nix b/nixpkgs/pkgs/development/python-modules/georss-wa-dfes-client/default.nix
new file mode 100644
index 000000000000..170bae63567c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/georss-wa-dfes-client/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, georss-client
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "georss-wa-dfes-client";
+  version = "0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "exxamalte";
+    repo = "python-georss-wa-dfes-client";
+    rev = "v${version}";
+     hash = "sha256-s7qGTlWFdOtw0eMK7idld7HPOxO8CjODCmUi0WmRLdI=";
+  };
+
+  propagatedBuildInputs = [
+    georss-client
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "georss_wa_dfes_client"
+  ];
+
+  meta = with lib; {
+    description = "Python library for accessing WA Department of Fire and Emergency Services (DFES) feed";
+    homepage = "https://github.com/exxamalte/python-georss-wa-dfes-client";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/get-video-properties/default.nix b/nixpkgs/pkgs/development/python-modules/get-video-properties/default.nix
new file mode 100644
index 000000000000..63b9515cf791
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/get-video-properties/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ffmpeg-headless
+}:
+
+buildPythonPackage rec {
+  pname = "get-video-properties";
+  version = "0.1.1";
+
+  src = fetchFromGitHub {
+    owner = "mvasilkov";
+    repo = "python-get-video-properties";
+    rev = "944c68addbc27e320ebc6313d3f016fb69b5e880";
+    sha256 = "18aslx7amaiw31bl9gambmvzry7hp5nqab6kgp8sg3mz9ih4lzal";
+  };
+
+  # no tests
+  doCheck = false;
+
+  postPatch = ''
+    substituteInPlace videoprops/__init__.py \
+      --replace "which('ffprobe')" "'${ffmpeg-headless}/bin/ffprobe'"
+
+    # unused and vulnerable to various CVEs
+    rm -r videoprops/binary_dependencies
+  '';
+
+  pythonImportsCheck = [ "videoprops" ];
+
+  meta = with lib; {
+    description = "Get video properties";
+    homepage = "https://github.com/mvasilkov/python-get-video-properties";
+    license = licenses.mit;
+    maintainers = with maintainers; [ globin ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/getjump/default.nix b/nixpkgs/pkgs/development/python-modules/getjump/default.nix
new file mode 100644
index 000000000000..b1a1b7005c09
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/getjump/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, fetchPypi
+, pillow
+, poetry-core
+, pythonRelaxDepsHook
+, requests
+, rich
+}:
+
+buildPythonPackage rec {
+  pname = "getjump";
+  version = "2.4.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gu6h9Yb0xdfvdmoeZGQPFCJhBJxuQ4iWlQquig1ljnY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    # remove after https://github.com/eggplants/getjump/pull/123 is released
+    "pillow"
+  ];
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    pillow
+    requests
+    rich
+  ];
+
+  pythonImportsCheck = [
+    "getjump"
+  ];
+
+  # all the tests talk to the internet
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Get and save images from jump web viewer";
+    homepage = "https://github.com/eggplants/getjump";
+    license = licenses.mit;
+    maintainers = [ maintainers.marsam ];
+    mainProgram = "jget";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/getkey/default.nix b/nixpkgs/pkgs/development/python-modules/getkey/default.nix
new file mode 100644
index 000000000000..563ee6464412
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/getkey/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, flake8
+}:
+
+buildPythonPackage rec {
+  pname = "getkey";
+  version = "0.6.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ng0ihfagh9g8hral0bq5nhjlp3csqghyv3z8b7ylkdkqc1cgiv8";
+  };
+
+  # disable coverage, because we don't care and python-coveralls is not in nixpkgs
+  postPatch = ''
+    sed -e '/python-coveralls/d' -e '/pytest-cov/d' -i setup.py
+    rm setup.cfg
+  '';
+
+  nativeCheckInputs = [
+    flake8
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Read single characters and key-strokes";
+    homepage = "https://github.com/kcsaff/getkey";
+    license = licenses.mit;
+    maintainers = [ maintainers.symphorien ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/getmac/default.nix b/nixpkgs/pkgs/development/python-modules/getmac/default.nix
new file mode 100644
index 000000000000..0340642417c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/getmac/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, py
+, pytest-benchmark
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "getmac";
+  version = "0.9.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "GhostofGoes";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-B9agBmSrD3ZhqpGclZdMQNRSLSkepR6iduP1yrYz9tU=";
+  };
+
+  nativeCheckInputs = [
+    py
+    pytestCheckHook
+    pytest-benchmark
+    pytest-mock
+  ];
+
+  disabledTests = [
+    # Disable CLI tests
+    "test_cli_main_basic"
+    "test_cli_main_verbose"
+    "test_cli_main_debug"
+    "test_cli_multiple_debug_levels"
+    # Disable test that require network access
+    "test_uuid_lanscan_iface"
+    # Mocking issue
+    "test_initialize_method_cache_valid_types"
+  ];
+
+  pythonImportsCheck = [
+    "getmac"
+  ];
+
+  meta = with lib; {
+    description = "Python package to get the MAC address of network interfaces and hosts on the local network";
+    homepage = "https://github.com/GhostofGoes/getmac";
+    changelog = "https://github.com/GhostofGoes/getmac/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ colemickens ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gevent-socketio/default.nix b/nixpkgs/pkgs/development/python-modules/gevent-socketio/default.nix
new file mode 100644
index 000000000000..338398714494
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gevent-socketio/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, gevent
+, gevent-websocket
+, mock
+, versiontools
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gevent-socketio";
+  version = "0.3.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-UzlKuT+9hNnbuyvvhTSfalA7/FPYapvoZTJQ8aBBKv8=";
+  };
+
+  nativeBuildInputs = [
+    versiontools
+  ];
+
+  buildInputs = [
+    gevent-websocket
+  ];
+
+  propagatedBuildInputs = [
+    gevent
+  ];
+
+  # Tests are not ported to Python 3
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "socketio"
+  ];
+
+  meta = with lib; {
+    description = "SocketIO server based on the Gevent pywsgi server";
+    homepage = "https://github.com/abourget/gevent-socketio";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gevent-websocket/default.nix b/nixpkgs/pkgs/development/python-modules/gevent-websocket/default.nix
new file mode 100644
index 000000000000..66709d8fafa5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gevent-websocket/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, gevent
+, gunicorn
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gevent-websocket";
+  version = "0.10.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-fq7zKWgpDJEh98Nblz4swwL/sHbQGMkGjS9cqLLYX7A=";
+  };
+
+  propagatedBuildInputs = [
+    gevent
+    gunicorn
+  ];
+
+  # Module has no test
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "geventwebsocket"
+  ];
+
+  meta = with lib; {
+    description = "Websocket handler for the gevent pywsgi server";
+    homepage = "https://www.gitlab.com/noppo/gevent-websocket";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gevent/default.nix b/nixpkgs/pkgs/development/python-modules/gevent/default.nix
new file mode 100644
index 000000000000..938cb99cf8fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gevent/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, fetchPypi
+, fetchpatch
+, buildPythonPackage
+, isPyPy
+, python
+, libev
+, cffi
+, cython_3
+, greenlet
+, importlib-metadata
+, setuptools
+, wheel
+, zope_event
+, zope_interface
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gevent";
+  version = "22.10.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-HKAdoXbuN7NSeicC99QNvJ/7jPx75aA7+k+e7EXlXEY=";
+  };
+
+  patches = [
+    # Replace deprecated pkg_resources with importlib-metadata
+    (fetchpatch {
+      url = "https://github.com/gevent/gevent/commit/bd96d8e14dc99f757de22ab4bb98439f912dab1e.patch";
+      hash = "sha256-Y+cxIScuEgAVYmmxBJ8OI+JuJ4G+iiROTcRdWglo3l0=";
+      includes = [ "src/gevent/events.py" ];
+    })
+  ];
+
+  nativeBuildInputs = [
+    cython_3
+    setuptools
+    wheel
+  ] ++ lib.optionals (!isPyPy) [
+    cffi
+  ];
+
+  buildInputs = [
+    libev
+  ];
+
+  propagatedBuildInputs = [
+    importlib-metadata
+    zope_event
+    zope_interface
+  ] ++ lib.optionals (!isPyPy) [
+    greenlet
+  ];
+
+  # Bunch of failures.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "gevent"
+    "gevent.events"
+  ];
+
+  meta = with lib; {
+    description = "Coroutine-based networking library";
+    homepage = "http://www.gevent.org/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bjornfor ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/geventhttpclient/default.nix b/nixpkgs/pkgs/development/python-modules/geventhttpclient/default.nix
new file mode 100644
index 000000000000..906fcdbdb608
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/geventhttpclient/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, brotli
+, buildPythonPackage
+, certifi
+, dpkt
+, fetchPypi
+, gevent
+, pytestCheckHook
+, pythonOlder
+, six
+, stdenv
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "geventhttpclient";
+  version = "2.0.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-t8l7JlEZV6NqiU7FRlHAiJCmnhGLaXVfjnS/w3xjORs=";
+  };
+
+  propagatedBuildInputs = [
+    brotli
+    certifi
+    gevent
+    six
+  ];
+
+  nativeCheckInputs = [
+    dpkt
+    pytestCheckHook
+    urllib3
+  ];
+
+  # lots of: [Errno 48] Address already in use: ('127.0.0.1', 54323)
+  doCheck = !stdenv.isDarwin;
+
+  __darwinAllowLocalNetworking = true;
+
+  disabledTests = [
+    # socket.gaierror: [Errno -3] Temporary failure in name resolution
+    "test_client_simple"
+    "test_client_without_leading_slas"
+    "test_request_with_headers"
+    "test_response_context_manager"
+    "test_client_ssl"
+    "test_ssl_fail_invalid_certificate"
+    "test_multi_queries_greenlet_safe"
+  ];
+
+  pythonImportsCheck = [
+    "geventhttpclient"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/geventhttpclient/geventhttpclient";
+    description = "High performance, concurrent HTTP client library using gevent";
+    changelog = "https://github.com/geventhttpclient/geventhttpclient/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ koral ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gflags/default.nix b/nixpkgs/pkgs/development/python-modules/gflags/default.nix
new file mode 100644
index 000000000000..2cef0c11a900
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gflags/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, six, pytest }:
+
+buildPythonPackage rec {
+  version = "3.1.2";
+  pname = "python-gflags";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "40ae131e899ef68e9e14aa53ca063839c34f6a168afe622217b5b875492a1ee2";
+  };
+
+  nativeCheckInputs = [ pytest ];
+
+  propagatedBuildInputs = [ six ];
+
+  checkPhase = ''
+    # clashes with our pythhon wrapper (which is in argv0)
+    # AssertionError: 'gflags._helpers_test' != 'nix_run_setup.py'
+    py.test -k 'not testGetCallingModule'
+  '';
+
+  meta = {
+    homepage = "https://github.com/google/python-gflags";
+    description = "A module for command line handling, similar to Google's gflags for C++";
+    license = lib.licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ghapi/default.nix b/nixpkgs/pkgs/development/python-modules/ghapi/default.nix
new file mode 100644
index 000000000000..c613809b347d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ghapi/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, fastcore
+, packaging
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ghapi";
+  version = "1.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "fastai";
+    repo = "ghapi";
+    rev = "refs/tags/${version}";
+    hash = "sha256-nH3OciLhet4620WAEmm8mUAmlnpniyIsF2oIzqbZ7FI=";
+  };
+
+  propagatedBuildInputs = [
+    fastcore
+    packaging
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ghapi"
+  ];
+
+  meta = with lib; {
+    description = "Python interface to GitHub's API";
+    homepage = "https://github.com/fastai/ghapi";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ghdiff/default.nix b/nixpkgs/pkgs/development/python-modules/ghdiff/default.nix
new file mode 100644
index 000000000000..213f7fdd3008
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ghdiff/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi
+, zope_testrunner, six, chardet}:
+
+buildPythonPackage rec {
+  pname = "ghdiff";
+  version = "0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "17mdhi2sq9017nq8rkjhhc87djpi5z99xiil0xz17dyplr7nmkqk";
+  };
+
+  nativeCheckInputs = [ zope_testrunner ];
+  propagatedBuildInputs = [ six chardet ];
+
+  meta = with lib; {
+    homepage =  "https://github.com/kilink/ghdiff";
+    license = licenses.mit;
+    description = "Generate Github-style HTML for unified diffs.";
+    maintainers = [ maintainers.mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ghp-import/default.nix b/nixpkgs/pkgs/development/python-modules/ghp-import/default.nix
new file mode 100644
index 000000000000..956b1098e33f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ghp-import/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python-dateutil
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ghp-import";
+  version = "2.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-nFNcTGEZPC34hxIiVn1/1+UBTYNfl9x7dDkGniQT00M=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+  ];
+
+  # Does not include any unit tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ghp_import"
+  ];
+
+  meta = with lib; {
+    description = "Copy your docs directly to the gh-pages branch";
+    homepage = "https://github.com/c-w/ghp-import";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ veehaitch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ghrepo-stats/default.nix b/nixpkgs/pkgs/development/python-modules/ghrepo-stats/default.nix
new file mode 100644
index 000000000000..c7f3c0d52cda
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ghrepo-stats/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, fetchFromGitHub
+, matplotlib
+, pygithub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ghrepo-stats";
+  version = "0.5.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "mrbean-bremen";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Mr0FM2CbdgAUF8siMjUIZvypWiPNPU9OncPiBPqK3uE=";
+  };
+
+  postPatch = ''
+    # https://github.com/mrbean-bremen/ghrepo-stats/pull/1
+    substituteInPlace setup.py \
+      --replace "bs4" "beautifulsoup4"
+  '';
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    matplotlib
+    pygithub
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ghrepo_stats"
+  ];
+
+  meta = with lib; {
+    description = "Python module and CLI tool for GitHub repo statistics";
+    homepage = "https://github.com/mrbean-bremen/ghrepo-stats";
+    changelog = "https://github.com/mrbean-bremen/ghrepo-stats/blob/v${version}/CHANGES.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gibberish-detector/default.nix b/nixpkgs/pkgs/development/python-modules/gibberish-detector/default.nix
new file mode 100644
index 000000000000..274e8f9355d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gibberish-detector/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "gibberish-detector";
+  version = "0.1.1";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "domanchi";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1si0fkpnk9vjkwl31sq5jkyv3rz8a5f2nh3xq7591j9wv2b6dn0b";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "gibberish_detector" ];
+
+  meta = with lib; {
+    description = "Python module to detect gibberish strings";
+    homepage = "https://github.com/domanchi/gibberish-detector";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gidgethub/default.nix b/nixpkgs/pkgs/development/python-modules/gidgethub/default.nix
new file mode 100644
index 000000000000..e109f4fa0487
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gidgethub/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, flit
+, uritemplate
+, pyjwt
+, pytestCheckHook
+, aiohttp
+, httpx
+, importlib-resources
+, pytest-asyncio
+, pytest-tornasync
+}:
+
+buildPythonPackage rec {
+  pname = "gidgethub";
+  version = "5.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ns59N/vOuBm4BWDn7Vj5NuSKZdN+xfVtt5FFFWtCaiU=";
+  };
+
+  nativeBuildInputs = [
+    flit
+  ];
+
+  propagatedBuildInputs = [
+    uritemplate
+    pyjwt
+  ]
+  ++ pyjwt.optional-dependencies.crypto;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    aiohttp
+    httpx
+    importlib-resources
+    pytest-asyncio
+    pytest-tornasync
+  ];
+
+  disabledTests = [
+    # Require internet connection
+    "test__request"
+    "test_get"
+  ];
+
+  meta = with lib; {
+    description = "An async GitHub API library";
+    homepage = "https://github.com/brettcannon/gidgethub";
+    license = licenses.asl20;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gin-config/default.nix b/nixpkgs/pkgs/development/python-modules/gin-config/default.nix
new file mode 100644
index 000000000000..1c6c4fabaa37
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gin-config/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, enum34
+}:
+
+buildPythonPackage rec {
+  pname = "gin-config";
+  version = "0.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0c6ea5026ded927c8c93c990b01c695257c1df446e45e549a158cfbc79e19ed6";
+
+  };
+
+  propagatedBuildInputs = [ six enum34 ];
+
+  # PyPI archive does not ship with tests
+  doCheck= false;
+
+  meta = with lib; {
+    homepage = "https://github.com/google/gin-config";
+    description = "Gin provides a lightweight configuration framework for Python, based on dependency injection.";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jethro ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gios/default.nix b/nixpkgs/pkgs/development/python-modules/gios/default.nix
new file mode 100644
index 000000000000..d7f9845b3075
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gios/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, dacite
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-error-for-skips
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gios";
+  version = "3.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bieniu";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-5CiKikhIZ+1pb5/NJ2XzpG1XHrkyuW1WUvvNEpxJIcw=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    dacite
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytest-asyncio
+    pytest-error-for-skips
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Test requires network access
+    "test_invalid_station_id"
+  ];
+
+  pythonImportsCheck = [
+    "gios"
+  ];
+
+  meta = with lib; {
+    description = "Python client for getting air quality data from GIOS";
+    homepage = "https://github.com/bieniu/gios";
+    changelog = "https://github.com/bieniu/gios/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gipc/default.nix b/nixpkgs/pkgs/development/python-modules/gipc/default.nix
new file mode 100644
index 000000000000..297b6c9865de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gipc/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, gevent
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "gipc";
+  version = "1.4.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "jgehrcke";
+    repo = "gipc";
+    rev = "refs/tags/${version}";
+    hash = "sha256-T5TqLanODyzJGyjDZz+75bbz3THxoobYnfJFQxAB76E=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "gevent>=1.5,<=21.12.0" "gevent>=1.5"
+  '';
+
+  propagatedBuildInputs = [
+    gevent
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "gevent-cooperative child processes and IPC";
+    longDescription = ''
+      Usage of Python's multiprocessing package in a gevent-powered
+      application may raise problems and most likely breaks the application
+      in various subtle ways. gipc (pronunciation "gipsy") is developed with
+      the motivation to solve many of these issues transparently. With gipc,
+      multiprocessing. Process-based child processes can safely be created
+      anywhere within your gevent-powered application.
+    '';
+    homepage = "http://gehrcke.de/gipc";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gistyc/default.nix b/nixpkgs/pkgs/development/python-modules/gistyc/default.nix
new file mode 100644
index 000000000000..51003101abde
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gistyc/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, certifi
+, click
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "gistyc";
+  version = "1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WVK45U9e3qyZFi9wSRHNi9+1u4TetlZkYXAZN7LVqhE=";
+  };
+
+  propagatedBuildInputs = [
+    certifi
+    click
+    requests
+  ];
+
+  pythonImportsCheck = [
+    "gistyc"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ThomasAlbin/gistyc";
+    description = "A Python based GitHub GIST management tool";
+    longDescription = ''
+      gistyc is a Python-based library that enables developers to create, update
+      and delete their GitHub GISTs. CLI capabilities allow you to execute the
+      routines from the shell and can be integrated into your project's CI/CD
+      pipeline to automatically create or update your GISTs (e.g., via GitHub
+      actions). Files are separated in GIST sections depending on the separation
+      blocks.
+    '';
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ AndersonTorres ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/git-annex-adapter/default.nix b/nixpkgs/pkgs/development/python-modules/git-annex-adapter/default.nix
new file mode 100644
index 000000000000..649c2aa2bc51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/git-annex-adapter/default.nix
@@ -0,0 +1,57 @@
+{ lib, buildPythonPackage, isPy3k, fetchFromGitHub, fetchpatch, substituteAll
+, python, util-linux, pygit2, gitMinimal, git-annex, cacert
+}:
+
+buildPythonPackage rec {
+  pname = "git-annex-adapter";
+  version = "0.2.2";
+
+  disabled = !isPy3k;
+
+  # No tests in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "alpernebbi";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0666vqspgnvmfs6j3kifwyxr6zmxjs0wlwis7br4zcq0gk32zgdx";
+  };
+
+  patches = [
+    # fix tests with recent versions of git-annex
+    (fetchpatch {
+      url = "https://github.com/alpernebbi/git-annex-adapter/commit/6c210d828e8a57b12c716339ad1bf15c31cd4a55.patch";
+      sha256 = "17kp7pnm9svq9av4q7hfic95xa1w3z02dnr8nmg14sjck2rlmqsi";
+    })
+    (fetchpatch {
+      url = "https://github.com/alpernebbi/git-annex-adapter/commit/b78a8f445f1fb5cf34b28512fc61898ef166b5a1.patch";
+      hash = "sha256-BSVoOPWsgY1btvn68bco4yb90FAC7ay2kYZ+q9qDHHw=";
+    })
+    (fetchpatch {
+      url = "https://github.com/alpernebbi/git-annex-adapter/commit/d0d8905965a3659ce95cbd8f8b1e8598f0faf76b.patch";
+      hash = "sha256-UcRTKzD3sbXGIuxj4JzZDnvjTYyWVkfeWgKiZ1rAlus=";
+    })
+    (substituteAll {
+      src = ./git-annex-path.patch;
+      gitAnnex = "${git-annex}/bin/git-annex";
+    })
+  ];
+
+  nativeCheckInputs = [
+    gitMinimal
+    util-linux # `rev` is needed in tests/test_process.py
+  ];
+
+  propagatedBuildInputs = [ pygit2 cacert ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest
+  '';
+  pythonImportsCheck = [ "git_annex_adapter" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/alpernebbi/git-annex-adapter";
+    description = "Call git-annex commands from Python";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/git-annex-adapter/git-annex-path.patch b/nixpkgs/pkgs/development/python-modules/git-annex-adapter/git-annex-path.patch
new file mode 100644
index 000000000000..8b1b854058b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/git-annex-adapter/git-annex-path.patch
@@ -0,0 +1,75 @@
+diff --git a/git_annex_adapter/process.py b/git_annex_adapter/process.py
+index 6ddb985..bbd0ab8 100644
+--- a/git_annex_adapter/process.py
++++ b/git_annex_adapter/process.py
+@@ -389,7 +389,7 @@ class GitAnnexBatchProcess:
+     _procclass = Process
+ 
+     def __init__(self, args, workdir):
+-        self.args = ('git', 'annex', *args)
++        self.args = ('@gitAnnex@', *args)
+         self.workdir = workdir
+         self._process = None
+         self._dead_process = None
+@@ -586,7 +586,7 @@ class ProcessRunner:
+ class GitAnnexRunner(ProcessRunner):
+     """Helper class to run git-annex commands."""
+     def __init__(self, args_prefix, workdir):
+-        args_prefix = ('git-annex', *args_prefix)
++        args_prefix = ('@gitAnnex@', *args_prefix)
+         super().__init__(args_prefix, workdir)
+ 
+     def __call__(self, *args_suffix):
+diff --git a/tests/test_process.py b/tests/test_process.py
+index ed619bb..9335078 100644
+--- a/tests/test_process.py
++++ b/tests/test_process.py
+@@ -181,7 +181,7 @@ class TestProcessOnEmptyAnnex(TempAnnexTestCase):
+     def test_process_annex_metadata_batch(self):
+         """Process should be able to read one line"""
+         with Process(
+-            ['git', 'annex', 'metadata', '--batch', '--json'],
++            ['@gitAnnex@', 'metadata', '--batch', '--json'],
+             str(self.tempdir),
+         ) as proc:
+             proc.writeline(
+@@ -202,7 +202,7 @@ class TestProcessOnEmptyAnnex(TempAnnexTestCase):
+     def test_jsonprocess_annex_metadata_batch(self):
+         """JsonProcess should encode and decode properly"""
+         with JsonProcess(
+-            ['git', 'annex', 'metadata', '--batch', '--json'],
++            ['@gitAnnex@', 'metadata', '--batch', '--json'],
+             str(self.tempdir),
+         ) as proc:
+             obj = proc({'key':'SHA256E-s0--0'})
+@@ -218,7 +218,7 @@ class TestProcessOnEmptyAnnex(TempAnnexTestCase):
+     def test_process_annex_info_batch(self):
+         """Process should be able to read multiple lines"""
+         with Process(
+-            ['git', 'annex', 'info', '--batch'],
++            ['@gitAnnex@', 'info', '--batch'],
+             str(self.tempdir),
+         ) as proc:
+             proc.writeline('here')
+diff --git a/tests/utils.py b/tests/utils.py
+index 281ee3f..969aedc 100644
+--- a/tests/utils.py
++++ b/tests/utils.py
+@@ -107,7 +107,7 @@ class TempAnnexTestCase(TempRepoTestCase):
+         # Have to uninit before cleaning directory, since git-annex
+         # marks its objects read-only so that they don't get deleted.
+         subprocess.run(
+-            ['git', 'annex', 'uninit'],
++            ['@gitAnnex@', 'uninit'],
+             cwd=self.repo.workdir,
+             stdout=subprocess.PIPE,
+             stderr=subprocess.PIPE,
+@@ -122,7 +122,7 @@ class TempAnnexTestCase(TempRepoTestCase):
+         path.write_text(text)
+ 
+         subprocess.run(
+-            ['git', 'annex', 'add', '--quiet', relpath],
++            ['@gitAnnex@', 'add', '--quiet', relpath],
+             cwd=self.repo.workdir,
+             check=True,
+         )
diff --git a/nixpkgs/pkgs/development/python-modules/git-filter-repo/default.nix b/nixpkgs/pkgs/development/python-modules/git-filter-repo/default.nix
new file mode 100644
index 000000000000..5f4fede287d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/git-filter-repo/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "git-filter-repo";
+  version = "2.38.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/hdT4Y8L1tPJtXhoyAEa59BWpuurcGcGOWoV71MScl4=";
+  };
+
+  patches = [
+    # https://github.com/newren/git-filter-repo/pull/498
+    (fetchpatch {
+      name = "remove-duplicate-script.patch";
+      url = "https://github.com/newren/git-filter-repo/commit/a59e67e7918e577147ca36a70916741be029c878.patch";
+      hash = "sha256-b0QHy9wMWuBWQoptdvLRT+9SRx2u2+11PnzEEB5F0Yo=";
+      stripLen = 1;
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "git_filter_repo"
+  ];
+
+  meta = with lib; {
+    description = "Quickly rewrite git repository history";
+    homepage = "https://github.com/newren/git-filter-repo";
+    license = with licenses; [ mit /* or */ gpl2Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/git-revise/default.nix b/nixpkgs/pkgs/development/python-modules/git-revise/default.nix
new file mode 100644
index 000000000000..726805edbaf1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/git-revise/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, git
+, gnupg
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "git-revise";
+  version = "0.7.0";
+
+  # Missing tests on PyPI
+  src = fetchFromGitHub {
+    owner = "mystor";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-xV1Z9O5FO4Q/XEpNwnX31tbv8CrXY+wF1Ltpfq+ITRg=";
+  };
+
+  disabled = pythonOlder "3.8";
+
+  nativeCheckInputs = [ git gnupg pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Efficiently update, split, and rearrange git commits";
+    homepage = "https://github.com/mystor/git-revise";
+    changelog = "https://github.com/mystor/git-revise/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ emily ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/git-sweep/default.nix b/nixpkgs/pkgs/development/python-modules/git-sweep/default.nix
new file mode 100644
index 000000000000..0f223b03760a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/git-sweep/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, gitpython
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "git-sweep";
+  version = "0.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zSnxw3JHsFru9fOZSJZX+XOu144uJ0DaIKYlAtoHV7M=";
+  };
+
+  propagatedBuildInputs = [
+    gitpython
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "gitsweep"
+  ];
+
+  meta = with lib; {
+    description = "A command-line tool that helps you clean up Git branches";
+    homepage = "https://github.com/arc90/git-sweep";
+    license = licenses.mit;
+    maintainers = with maintainers; [ pSub ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/git-url-parse/default.nix b/nixpkgs/pkgs/development/python-modules/git-url-parse/default.nix
new file mode 100644
index 000000000000..b0c4c2077faf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/git-url-parse/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pbr
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "git-url-parse";
+  version = "1.2.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "coala";
+    repo = "git-url-parse";
+    rev = version;
+    hash = "sha256-+0V/C3wE02ppdDGn7iqdvmgsUwTR7THUakUilvkzoYg=";
+  };
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace " --cov giturlparse --cov-report term-missing" ""
+  '';
+
+
+  # Manually set version because prb wants to get it from the git
+  # upstream repository (and we are installing from tarball instead)
+  env.PBR_VERSION = version;
+
+  propagatedBuildInputs = [
+    pbr
+  ];
+
+  pythonImportsCheck = [ "giturlparse" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A simple GIT URL parser";
+    homepage = "https://github.com/coala/git-url-parse";
+    changelog = "https://github.com/coala/git-url-parse/blob/${src.rev}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ blaggacao ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/gitdb/default.nix b/nixpkgs/pkgs/development/python-modules/gitdb/default.nix
new file mode 100644
index 000000000000..dc6be575153c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gitdb/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, smmap
+}:
+
+buildPythonPackage rec {
+  pname = "gitdb";
+  version = "4.0.11";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-v1QhEmE21tCvVbwefBrxw5ejT1t71553bNPol4XCsEs=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    smmap
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "gitdb"
+  ];
+
+  disabledTests = [
+    # Tests need part which are not shipped with PyPI releases
+    "test_base"
+    "test_reading"
+    "test_writing"
+    "test_correctness"
+    "test_loose_correctness"
+    "test_pack_random_access"
+    "test_pack_writing"
+    "test_stream_reading"
+  ];
+
+  meta = with lib; {
+    description = "Git Object Database";
+    homepage = "https://github.com/gitpython-developers/gitdb";
+    changelog = "https://github.com/gitpython-developers/gitdb/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/github-to-sqlite/default.nix b/nixpkgs/pkgs/development/python-modules/github-to-sqlite/default.nix
new file mode 100644
index 000000000000..ed262841773e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/github-to-sqlite/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, pytestCheckHook
+, pyyaml
+, requests
+, requests-mock
+, sqlite-utils
+}:
+
+buildPythonPackage rec {
+  pname = "github-to-sqlite";
+  version = "2.8.3";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "dogsheep";
+    repo = pname;
+    rev = version;
+    hash = "sha256-4wkwtcChcR7XH421wa3dGdIPhwgeaTFk247zIRX98xo=";
+  };
+
+  propagatedBuildInputs = [
+    sqlite-utils
+    pyyaml
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests-mock
+  ];
+
+  disabledTests = [
+    "test_scrape_dependents"
+  ];
+
+  meta = with lib; {
+    description = "Save data from GitHub to a SQLite database";
+    homepage = "https://github.com/dogsheep/github-to-sqlite";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ sarcasticadmin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/github-webhook/default.nix b/nixpkgs/pkgs/development/python-modules/github-webhook/default.nix
new file mode 100644
index 000000000000..32b86896fdd1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/github-webhook/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi
+, flask
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "github-webhook";
+  version = "1.0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b2444dbfd03deda35792bd00ebd1692597c2605c61445da79da6322afaca7a8d";
+  };
+
+  propagatedBuildInputs = [ flask six ];
+
+  # touches network
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A framework for writing webhooks for GitHub";
+    homepage = "https://github.com/bloomberg/python-github-webhook";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/github3_py/default.nix b/nixpkgs/pkgs/development/python-modules/github3_py/default.nix
new file mode 100644
index 000000000000..e92af9380844
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/github3_py/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, requests
+, uritemplate
+, python-dateutil
+, pyjwt
+, pytestCheckHook
+, betamax
+, betamax-matchers
+}:
+
+buildPythonPackage rec {
+  pname = "github3.py";
+  version = "3.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Cbcr4Ul9NGsJaM3oNgoNavedwgbQFJpjzT7IbGXDd8w=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    uritemplate
+    python-dateutil
+    pyjwt
+  ]
+  ++ pyjwt.optional-dependencies.crypto;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    betamax
+    betamax-matchers
+  ];
+
+  # Solves "__main__.py: error: unrecognized arguments: -nauto"
+  preCheck = ''
+    rm tox.ini
+  '';
+
+  disabledTests = [
+    # FileNotFoundError: [Errno 2] No such file or directory: 'tests/id_rsa.pub'
+    "test_delete_key"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github3py.readthedocs.org/en/master/";
+    description = "A wrapper for the GitHub API written in python";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ pSub ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/githubkit/default.nix b/nixpkgs/pkgs/development/python-modules/githubkit/default.nix
new file mode 100644
index 000000000000..85509528bf35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/githubkit/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, poetry-core
+, httpx
+, pydantic
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "githubkit";
+  version = "0.10.7";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sKikL+761mBP7j+qugHKDQ0hVXT51FV8FYbB3ZJtweA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+    pydantic
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [ "githubkit" ];
+
+  meta = {
+    description = "GitHub SDK for Python";
+    homepage = "https://github.com/yanyongyu/githubkit";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ kranzes ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gitignore-parser/default.nix b/nixpkgs/pkgs/development/python-modules/gitignore-parser/default.nix
new file mode 100644
index 000000000000..a50d7ce2e235
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gitignore-parser/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "gitignore-parser";
+  version = "0.1.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mherrmann";
+    repo = "gitignore_parser";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-T1XgcOHVFv/+oCEFKSoJeFAspJguimHasuREzjQwgWE=";
+  };
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "gitignore_parser"
+  ];
+
+  meta = with lib; {
+    description = "A spec-compliant gitignore parser";
+    homepage = "https://github.com/mherrmann/gitignore_parser";
+    changelog = "https://github.com/mherrmann/gitignore_parser/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gitlike-commands/default.nix b/nixpkgs/pkgs/development/python-modules/gitlike-commands/default.nix
new file mode 100644
index 000000000000..f51adf2a184a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gitlike-commands/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gitlike-commands";
+  version = "0.2.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "unixorn";
+    repo = "gitlike-commands";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-VjweN4gigzCNvg6TccZx2Xw1p7SusKplxUTZjItTQc0=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  # Module has no real tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "gitlike_commands"
+  ];
+
+  meta = with lib; {
+    description = "Easy python module for creating git-style subcommand handling";
+    homepage = "https://github.com/unixorn/gitlike-commands";
+    changelog = "https://github.com/unixorn/gitlike-commands/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gitpython/default.nix b/nixpkgs/pkgs/development/python-modules/gitpython/default.nix
new file mode 100644
index 000000000000..43925e357a90
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gitpython/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, ddt
+, fetchFromGitHub
+, gitdb
+, pkgs
+, pythonOlder
+, substituteAll
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "gitpython";
+  version = "3.1.37";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "gitpython-developers";
+    repo = "GitPython";
+    rev = "refs/tags/${version}";
+    hash = "sha256-w3aSgIaD6tkxhYctkvvsdKlWXS8xU4+F0cCYeYTNHig=";
+  };
+
+  propagatedBuildInputs = [
+    ddt
+    gitdb
+    pkgs.gitMinimal
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    typing-extensions
+  ];
+
+  postPatch = ''
+    substituteInPlace git/cmd.py \
+      --replace 'git_exec_name = "git"' 'git_exec_name = "${pkgs.gitMinimal}/bin/git"'
+  '';
+
+  # Tests require a git repo
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "git"
+  ];
+
+  meta = with lib; {
+    description = "Python Git Library";
+    homepage = "https://github.com/gitpython-developers/GitPython";
+    changelog = "https://github.com/gitpython-developers/GitPython/blob/${version}/doc/source/changes.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/glad/default.nix b/nixpkgs/pkgs/development/python-modules/glad/default.nix
new file mode 100644
index 000000000000..ba738b357212
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glad/default.nix
@@ -0,0 +1,18 @@
+{ buildPythonPackage, fetchPypi, lib }:
+
+buildPythonPackage rec {
+  pname = "glad";
+  version = "0.1.36";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-P7ANv+x65t2+ugTiFUf2fzzPx5X8NFYkUM8/K7Gf28c=";
+  };
+
+  meta = with lib; {
+    description = "Multi-Language Vulkan/GL/GLES/EGL/GLX/WGL Loader-Generator based on the official specs";
+    homepage = "https://github.com/Dav1dde/glad";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/glad2/default.nix b/nixpkgs/pkgs/development/python-modules/glad2/default.nix
new file mode 100644
index 000000000000..57ee88c4997a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glad2/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jinja2
+}:
+
+buildPythonPackage rec {
+  pname = "glad2";
+  version = "2.0.4";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7eFjn2nyugjx9JikCnB/NKYJ0k6y6g1sk2RomnmM99A=";
+  };
+
+  propagatedBuildInputs = [
+    jinja2
+  ];
+
+  # no python tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "glad" ];
+
+  meta = with lib; {
+    description = "Multi-Language GL/GLES/EGL/GLX/WGL Loader-Generator based on the official specifications";
+    homepage = "https://github.com/Dav1dde/glad";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kranzes ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/glances-api/default.nix b/nixpkgs/pkgs/development/python-modules/glances-api/default.nix
new file mode 100644
index 000000000000..fc8d2edac2be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glances-api/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, poetry-core
+, pytest-asyncio
+, pytest-httpx
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "glances-api";
+  version = "0.5.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-ecosystem";
+    repo = "python-glances-api";
+    rev = "refs/tags/${version}";
+    hash = "sha256-DUTZLLWO4xUeUlxHGGVr/MD5uKqRxUf+p0crYsELgzw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-httpx
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "glances_api"
+  ];
+
+  meta = with lib; {
+    description = "Python API for interacting with Glances";
+    homepage = "https://github.com/home-assistant-ecosystem/python-glances-api";
+    changelog = "https://github.com/home-assistant-ecosystem/python-glances-api/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/glcontext/default.nix b/nixpkgs/pkgs/development/python-modules/glcontext/default.nix
new file mode 100644
index 000000000000..b74775a32197
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glcontext/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, libGL
+, libX11
+}:
+
+buildPythonPackage rec {
+  pname = "glcontext";
+  version = "2.5.0";
+
+  src = fetchFromGitHub {
+    owner = "moderngl";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-ld+INKIGDZA2Y+sTxDPY7MI1nru6x+FeixngaJQzKkg=";
+  };
+
+  disabled = !isPy3k;
+
+  buildInputs = [ libGL libX11 ];
+
+  postPatch = ''
+    substituteInPlace glcontext/x11.cpp \
+      --replace '"libGL.so"' '"${libGL}/lib/libGL.so"' \
+      --replace '"libX11.so"' '"${libX11}/lib/libX11.so"'
+    substituteInPlace glcontext/egl.cpp \
+      --replace '"libGL.so"' '"${libGL}/lib/libGL.so"' \
+      --replace '"libEGL.so"' '"${libGL}/lib/libEGL.so"'
+  '';
+
+  # Tests fail because they try to open display. See
+  # https://github.com/NixOS/nixpkgs/pull/121439
+  # for details.
+  doCheck = false;
+
+  pythonImportsCheck = [ "glcontext" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/moderngl/glcontext";
+    description = "OpenGL implementation for ModernGL";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ friedelino ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/glean-parser/default.nix b/nixpkgs/pkgs/development/python-modules/glean-parser/default.nix
new file mode 100644
index 000000000000..7ab2855d8d73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glean-parser/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, appdirs
+, buildPythonPackage
+, click
+, diskcache
+, fetchPypi
+, jinja2
+, jsonschema
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, setuptools-scm
+, yamllint
+}:
+
+buildPythonPackage rec {
+  pname = "glean-parser";
+  version = "9.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "glean_parser";
+    inherit version;
+    hash = "sha256-dwBKds89CaanZA4b5I6u01Q2s23joQp5SOCjdTXn/Xc=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest-runner" "" \
+      --replace "MarkupSafe>=1.1.1,<=2.0.1" "MarkupSafe>=1.1.1"
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    appdirs
+    click
+    diskcache
+    jinja2
+    jsonschema
+    pyyaml
+    yamllint
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  disabledTests = [
+    # Network access
+    "test_validate_ping"
+    # Fails since yamllint 1.27.x
+    "test_yaml_lint"
+  ];
+
+  pythonImportsCheck = [
+    "glean_parser"
+  ];
+
+  meta = with lib; {
+    description = "Tools for parsing the metadata for Mozilla's glean telemetry SDK";
+    homepage = "https://github.com/mozilla/glean_parser";
+    changelog = "https://github.com/mozilla/glean_parser/blob/v${version}/CHANGELOG.md";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/glean-sdk/default.nix b/nixpkgs/pkgs/development/python-modules/glean-sdk/default.nix
new file mode 100644
index 000000000000..22ac0e96ea9a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glean-sdk/default.nix
@@ -0,0 +1,83 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, cargo
+, cffi
+, fetchPypi
+, glean-parser
+, iso8601
+, lmdb
+, pkg-config
+, pytest-localserver
+, pytestCheckHook
+, python
+, pythonOlder
+, rustc
+, rustPlatform
+, semver
+, setuptools-rust
+}:
+
+buildPythonPackage rec {
+  pname = "glean-sdk";
+  version = "52.7.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sLjdGHiS7Co/oA9gQyAFkD14tAYjmwjWcPr4CRrzw/0=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-5TlgWcLmjklxhtDbB0aRF71iIRTJwetFj1Jii1DGdvU=";
+  };
+
+  nativeBuildInputs = [
+    cargo
+    pkg-config
+    rustc
+    rustPlatform.cargoSetupHook
+    setuptools-rust
+  ];
+
+  buildInputs = [
+    lmdb
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+    glean-parser
+    iso8601
+    semver
+  ];
+
+  nativeCheckInputs = [
+    pytest-localserver
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # RuntimeError: No ping received.
+    "test_client_activity_api"
+    "test_flipping_upload_enabled_respects_order_of_events"
+  ];
+
+  postInstallCheck = lib.optionalString (stdenv.hostPlatform.parsed.kernel.execFormat == lib.systems.parse.execFormats.elf) ''
+    readelf -a $out/${python.sitePackages}/glean/libglean_ffi.so | grep -F 'Shared library: [liblmdb.so'
+  '';
+
+  pythonImportsCheck = [
+    "glean"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Telemetry client libraries and are a part of the Glean project";
+    homepage = "https://mozilla.github.io/glean/book/index.html";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ melling ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/glfw/default.nix b/nixpkgs/pkgs/development/python-modules/glfw/default.nix
new file mode 100644
index 000000000000..db9f369a3497
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glfw/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, glfw3
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "glfw";
+  version = "2.6.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "FlorianRhiem";
+    repo = "pyGLFW";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-3K+mDSz4ifVYkUvhd2XDPbhh6UCY4y54YqNLoAYDsP0=";
+  };
+
+  # Patch path to GLFW shared object
+  patches = [ ./search-path.patch ];
+
+  postPatch = ''
+    substituteInPlace glfw/library.py --replace "@GLFW@" '${glfw3}/lib'
+  '';
+
+  propagatedBuildInputs = [
+    glfw3
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "glfw"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for GLFW";
+    homepage = "https://github.com/FlorianRhiem/pyGLFW";
+    changelog = "https://github.com/FlorianRhiem/pyGLFW/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = [ maintainers.McSinyx ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/glfw/search-path.patch b/nixpkgs/pkgs/development/python-modules/glfw/search-path.patch
new file mode 100644
index 000000000000..0c4a42ceb362
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glfw/search-path.patch
@@ -0,0 +1,11 @@
+diff --git a/glfw/library.py b/glfw/library.py
+index 20387e1..9bdd62a 100644
+--- a/glfw/library.py
++++ b/glfw/library.py
+@@ -189,5 +189,4 @@ elif sys.platform == 'win32':
+         except OSError:
+             pass
+ else:
+-    glfw = _load_library(['glfw', 'glfw3'], ['.so', '.dylib'],
+-                          _get_library_search_paths(), _glfw_get_version)
++    glfw = _load_library(['glfw', 'glfw3'], ['.so', '.dylib'], ['@GLFW@'], _glfw_get_version)
diff --git a/nixpkgs/pkgs/development/python-modules/glob2/default.nix b/nixpkgs/pkgs/development/python-modules/glob2/default.nix
new file mode 100644
index 000000000000..83d6aa13cfa2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glob2/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "glob2";
+  version = "0.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "135bj8gm6vn45vv0phrvhyir36kfm17y7kmasxinv8lagk8dphw5";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} test.py
+  '';
+
+  meta = with lib; {
+    description = "Version of the glob module that can capture patterns and supports recursive wildcards";
+    homepage = "https://github.com/miracle2k/python-glob2/";
+    license = licenses.bsd3;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/globre/default.nix b/nixpkgs/pkgs/development/python-modules/globre/default.nix
new file mode 100644
index 000000000000..c7c77b35c342
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/globre/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, pythonAtLeast
+, buildPythonPackage
+, fetchPypi
+, nose
+, coverage
+}:
+
+buildPythonPackage rec {
+  pname = "globre";
+  version = "0.1.5";
+  # https://github.com/metagriffin/globre/issues/7
+  disabled = pythonAtLeast "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1qhjpg0722871dm5m7mmldf6c7mx58fbdvk1ix5i3s9py82448gf";
+  };
+
+  nativeCheckInputs = [ nose coverage ];
+
+  meta = with lib; {
+    homepage = "https://github.com/metagriffin/globre";
+    description = "A python glob-like regular expression generation library.";
+    maintainers = with maintainers; [ glittershark ];
+    license = licenses.gpl3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/globus-sdk/default.nix b/nixpkgs/pkgs/development/python-modules/globus-sdk/default.nix
new file mode 100644
index 000000000000..f497821e07d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/globus-sdk/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pyjwt
+, pytestCheckHook
+, pythonOlder
+, requests
+, responses
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "globus-sdk";
+  version = "3.31.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "globus";
+    repo = "globus-sdk-python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-MJW0B3AXDYSVgNkv8iBA2+pOKrlI7pZeJfunMMxABx8=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    requests
+    pyjwt
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+    --replace "pyjwt[crypto]>=2.0.0,<3.0.0" "pyjwt[crypto]>=2.0.0,<3.0.0"
+  '';
+
+  pytestFlagsArray = [
+    "-W"
+    "ignore::DeprecationWarning"
+  ];
+
+  pythonImportsCheck = [
+    "globus_sdk"
+  ];
+
+  meta = with lib; {
+    description = "Interface to Globus REST APIs, including the Transfer API and the Globus Auth API";
+    homepage =  "https://github.com/globus/globus-sdk-python";
+    changelog = "https://github.com/globus/globus-sdk-python/releases/tag/${version}";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/glom/default.nix b/nixpkgs/pkgs/development/python-modules/glom/default.nix
new file mode 100644
index 000000000000..35d0b36a1bb1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glom/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, attrs
+, boltons
+, buildPythonPackage
+, face
+, fetchPypi
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "glom";
+  version = "23.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-AxaZKA+kZmBI5D0uq2i+EET/zUh6t0rLeS3i7rC8JRU=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "face==20.1.1" "face"
+  '';
+
+  propagatedBuildInputs = [
+    boltons
+    attrs
+    face
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pyyaml
+  ];
+
+  preCheck = ''
+    # test_cli.py checks the output of running "glom"
+    export PATH=$out/bin:$PATH
+  '';
+
+  disabledTests = [
+    # Test is outdated (was made for PyYAML 3.x)
+    "test_main_yaml_target"
+  ] ++ lib.optionals (pythonAtLeast "3.11") [
+    "test_regular_error_stack"
+    "test_long_target_repr"
+  ];
+
+  pythonImportsCheck = [
+    "glom"
+  ];
+
+  meta = with lib; {
+    description = "Restructuring data, the Python way";
+    longDescription = ''
+      glom helps pull together objects from other objects in a
+      declarative, dynamic, and downright simple way.
+    '';
+    homepage = "https://github.com/mahmoud/glom";
+    changelog = "https://github.com/mahmoud/glom/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ twey ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/glueviz/default.nix b/nixpkgs/pkgs/development/python-modules/glueviz/default.nix
new file mode 100644
index 000000000000..2d0e927c1acc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glueviz/default.nix
@@ -0,0 +1,87 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, dill
+, astropy
+, numpy
+, pandas
+, qt6
+, pyqt6
+, pyqt-builder
+, qtconsole
+, setuptools
+, setuptools-scm
+, scipy
+, ipython
+, ipykernel
+, h5py
+, matplotlib
+, xlrd
+, mpl-scatter-density
+, pvextractor
+, openpyxl
+, echo
+, pytest
+, pytest-flakes
+, pytest-cov
+}:
+
+buildPythonPackage rec {
+  pname = "glueviz";
+  version = "1.16.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "glue-viz";
+    repo = "glue";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-jjDa0DxB5AJm+x8P7FiH2kqhhc/bbzjzvdC9INs69Ro=";
+  };
+
+  buildInputs = [ pyqt-builder ];
+  nativeBuildInputs = [ setuptools setuptools-scm qt6.wrapQtAppsHook ];
+  propagatedBuildInputs = [
+    astropy
+    dill
+    setuptools
+    scipy
+    numpy
+    matplotlib
+    pandas
+    pyqt6
+    qtconsole
+    ipython
+    ipykernel
+    h5py
+    xlrd
+    mpl-scatter-density
+    pvextractor
+    openpyxl
+    echo
+  ];
+
+  dontConfigure = true;
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  # collecting ... qt.qpa.xcb: could not connect to display
+  # qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
+  doCheck = false;
+
+  nativeCheckInputs = [ pytest pytest-flakes pytest-cov ];
+
+  pythonImportsCheck = [ "glue" ];
+
+  preFixup = ''
+    makeWrapperArgs+=("''${qtWrapperArgs[@]}")
+  '';
+
+  meta = with lib; {
+    homepage = "https://glueviz.org";
+    description = "Linked Data Visualizations Across Multiple Files";
+    license = licenses.bsd3; # https://github.com/glue-viz/glue/blob/main/LICENSE
+    maintainers = with maintainers; [ ifurther ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/glymur/default.nix b/nixpkgs/pkgs/development/python-modules/glymur/default.nix
new file mode 100644
index 000000000000..4ff23443e40d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glymur/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, lxml
+, numpy
+, openjpeg
+, pytestCheckHook
+, pythonOlder
+, scikit-image
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "glymur";
+  version = "0.12.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "quintusdias";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-9NMSAt5yFRnlCUDP37/ozhDsS8FTdRkfjUz8kQwWzVc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    lxml
+    pytestCheckHook
+    scikit-image
+  ];
+
+  postConfigure = ''
+    substituteInPlace glymur/config.py \
+    --replace "path = read_config_file(libname)" "path = '${openjpeg}/lib/lib' + libname + ${if stdenv.isDarwin then "'.dylib'" else "'.so'"}"
+  '';
+
+  disabledTestPaths = [
+    # this test involves glymur's different ways of finding the openjpeg path on
+    # fsh systems by reading an .rc file and such, and is obviated by the patch
+    # in postConfigure
+    "tests/test_config.py"
+    "tests/test_tiff2jp2.py"
+  ];
+
+  pythonImportsCheck = [
+    "glymur"
+  ];
+
+  meta = with lib; {
+    description = "Tools for accessing JPEG2000 files";
+    homepage = "https://github.com/quintusdias/glymur";
+    changelog = "https://github.com/quintusdias/glymur/blob/v${version}/CHANGES.txt";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/glyphslib/default.nix b/nixpkgs/pkgs/development/python-modules/glyphslib/default.nix
new file mode 100644
index 000000000000..2a0276a3c7e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/glyphslib/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fonttools
+, openstep-plist
+, ufoLib2
+, pytestCheckHook
+, unicodedata2
+, setuptools-scm
+, ufonormalizer
+, xmldiff
+, defcon
+, ufo2ft
+, skia-pathops
+}:
+
+buildPythonPackage rec {
+  pname = "glyphslib";
+  version = "6.4.1";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "googlefonts";
+    repo = "glyphsLib";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-pDFPn1KDiZ5yw1UzPgi0+Syv3h606bsOOzLbdOiag8s=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [
+    fonttools
+    openstep-plist
+    ufoLib2
+    unicodedata2
+    ufonormalizer
+    xmldiff
+    defcon
+    ufo2ft
+    skia-pathops
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "glyphsLib" ];
+
+  disabledTestPaths = [
+    "tests/builder/designspace_gen_test.py" # this test tries to use non-existent font "CoolFoundry Examplary Serif"
+    "tests/builder/interpolation_test.py" # this test tries to use a font that previous test should made
+  ];
+
+  meta = {
+    description = "Bridge from Glyphs source files (.glyphs) to UFOs and Designspace files via defcon and designspaceLib";
+    homepage = "https://github.com/googlefonts/glyphsLib";
+    license = lib.licenses.asl20;
+    maintainers = [ lib.maintainers.BarinovMaxim ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/gmpy/default.nix b/nixpkgs/pkgs/development/python-modules/gmpy/default.nix
new file mode 100644
index 000000000000..9a2957fa23d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gmpy/default.nix
@@ -0,0 +1,27 @@
+{ buildPythonPackage, fetchurl, isPyPy, gmp, pythonAtLeast } :
+
+let
+  pname = "gmpy";
+  version = "1.17";
+in
+
+buildPythonPackage {
+  inherit pname version;
+
+  # Python 3.11 has finally made changes to its C API for which gmpy 1.17,
+  # published in 2013, would require patching. It seems unlikely that any
+  # patches will be forthcoming.
+  disabled = isPyPy || pythonAtLeast "3.11";
+
+  src = fetchurl {
+    url = "mirror://pypi/g/gmpy/${pname}-${version}.zip";
+    sha256 = "1a79118a5332b40aba6aa24b051ead3a31b9b3b9642288934da754515da8fa14";
+  };
+
+  buildInputs = [ gmp ];
+
+  meta = {
+    description = "GMP or MPIR interface to Python 2.4+ and 3.x";
+    homepage = "https://github.com/aleaxit/gmpy/";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gmpy2/default.nix b/nixpkgs/pkgs/development/python-modules/gmpy2/default.nix
new file mode 100644
index 000000000000..6f5d7be0021d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gmpy2/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPyPy
+, gmp
+, mpfr
+, libmpc
+}:
+
+let
+  pname = "gmpy2";
+  version = "2.1.2";
+in
+
+buildPythonPackage {
+  inherit pname version;
+
+  disabled = isPyPy;
+
+  src = fetchFromGitHub {
+    owner = "aleaxit";
+    repo = "gmpy";
+    rev = "gmpy2-${version}";
+    hash = "sha256-ARCttNzRA+Ji2j2NYaSCDXgvoEg01T9BnYadyqON2o0=";
+  };
+
+  buildInputs = [ gmp mpfr libmpc ];
+
+  pythonImportsCheck = [ "gmpy2" ];
+
+  meta = with lib; {
+    description = "GMP/MPIR, MPFR, and MPC interface to Python 2.6+ and 3.x";
+    homepage = "https://github.com/aleaxit/gmpy/";
+    license = licenses.gpl3Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gntp/default.nix b/nixpkgs/pkgs/development/python-modules/gntp/default.nix
new file mode 100644
index 000000000000..364a59732e11
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gntp/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "gntp";
+  version = "1.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1q6scs8lp84v0aph6b5c9jhv51rhq2vmzpdd38db92ybkq0g597l";
+  };
+
+  pythonImportsCheck = [ "gntp" "gntp.notifier" ];
+
+  # requires a growler service to be running
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/kfdm/gntp/";
+    description = "Python library for working with the Growl Notification Transport Protocol";
+    license = licenses.mit;
+    maintainers = [ maintainers.jfroche ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gnureadline/default.nix b/nixpkgs/pkgs/development/python-modules/gnureadline/default.nix
new file mode 100644
index 000000000000..e2d853c32bf6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gnureadline/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, pkgs
+}:
+
+buildPythonPackage rec {
+  version = "8.1.2";
+  pname = "gnureadline";
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QmKmqjVqsi72QvQ6f5TrQqctbwxTLttOjGuTP1cwVtI=";
+  };
+
+  buildInputs = [ pkgs.ncurses ];
+  patchPhase = ''
+    substituteInPlace setup.py --replace "/bin/bash" "${pkgs.bash}/bin/bash"
+  '';
+
+  meta = with lib; {
+    description = "The standard Python readline extension statically linked against the GNU readline library";
+    homepage = "https://github.com/ludwigschwardt/python-gnureadline";
+    license = licenses.gpl3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/goalzero/default.nix b/nixpkgs/pkgs/development/python-modules/goalzero/default.nix
new file mode 100644
index 000000000000..806d486d79cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/goalzero/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "goalzero";
+  version = "0.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-h/EaEOe0zvnO5BYfcIyC3Vq8sPED6ts1IeI/GM+vm7c=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "goalzero"
+  ];
+
+  meta = with lib; {
+    description = "Goal Zero Yeti REST Api Library";
+    homepage = "https://github.com/tkdrob/goalzero";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gocardless-pro/default.nix b/nixpkgs/pkgs/development/python-modules/gocardless-pro/default.nix
new file mode 100644
index 000000000000..4e5e919323ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gocardless-pro/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, six
+, pytestCheckHook
+, responses
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "gocardless-pro";
+  version = "1.48.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "gocardless";
+    repo = "gocardless-pro-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-9229lwCtVu4Pfru6e9JdbP3KUUYojBLuNQ+volP6OX0=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    six
+  ];
+
+  pythonImportsCheck = [ "gocardless_pro" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+    nose
+  ];
+
+  meta = with lib; {
+    description = "A client library for the GoCardless Pro API";
+    homepage = "https://github.com/gocardless/gocardless-pro-python";
+    changelog = "https://github.com/gocardless/gocardless-pro-python/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ blaggacao ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/goobook/default.nix b/nixpkgs/pkgs/development/python-modules/goobook/default.nix
new file mode 100644
index 000000000000..16125400c94b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/goobook/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitLab
+, pythonOlder
+, docutils
+, installShellFiles
+, poetry-core
+, google-api-python-client
+, simplejson
+, oauth2client
+, setuptools
+, pyxdg
+}:
+
+buildPythonPackage rec {
+  pname = "goobook";
+  version = "3.5.2";
+
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitLab {
+    owner = "goobook";
+    repo = "goobook";
+    rev = version;
+    hash = "sha256-gWmeRlte+lP7VP9gbPuMHwhVkx91wQ0GpQFQRLJ29h8=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'setuptools = "^62.6.0"' 'setuptools = "*"' \
+      --replace 'google-api-python-client = "^1.7.12"' 'google-api-python-client = "*"' \
+      --replace 'pyxdg = "^0.28"' 'pyxdg = "*"'
+  '';
+
+  nativeBuildInputs = [
+    docutils
+    installShellFiles
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    google-api-python-client
+    simplejson
+    oauth2client
+    setuptools
+    pyxdg
+  ];
+
+  postInstall = ''
+    rst2man goobook.1.rst goobook.1
+    installManPage goobook.1
+  '';
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "goobook" ];
+
+  meta = with lib; {
+    description = "Access your Google contacts from the command line";
+    longDescription = ''
+      The purpose of GooBook is to make it possible to use your Google Contacts
+      from the command-line and from MUAs such as Mutt.
+      It can be used from Mutt the same way as abook.
+    '';
+    homepage = "https://pypi.org/project/goobook/";
+    changelog = "https://gitlab.com/goobook/goobook/-/blob/${version}/CHANGES.rst";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ primeos ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/goocalendar/default.nix b/nixpkgs/pkgs/development/python-modules/goocalendar/default.nix
new file mode 100644
index 000000000000..a9d69447c2ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/goocalendar/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, gobject-introspection
+, goocanvas2
+, gtk3
+, pkg-config
+, pygobject3
+, pythonOlder
+ }:
+
+buildPythonPackage rec {
+  pname = "goocalendar";
+  version = "0.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "GooCalendar";
+    inherit version;
+    hash = "sha256-LwL5TLRkD6ALucabLUeB0k4rIX+O/aW2ebS2rZPjIUs=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+    gobject-introspection
+  ];
+
+  propagatedBuildInputs = [
+    pygobject3
+  ];
+
+  buildInputs = [
+    gtk3
+    goocanvas2
+  ];
+
+  # No upstream tests available
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "goocalendar"
+  ];
+
+  meta = with lib; {
+    description = "A calendar widget for GTK using PyGoocanvas";
+    homepage = "https://goocalendar.tryton.org/";
+    changelog = "https://foss.heptapod.net/tryton/goocalendar/-/blob/${version}/CHANGELOG";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ udono ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/goodwe/default.nix b/nixpkgs/pkgs/development/python-modules/goodwe/default.nix
new file mode 100644
index 000000000000..38b4af1e3ada
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/goodwe/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "goodwe";
+  version = "0.2.32";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "marcelblijleven";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Uj4f3OcPRqbMaM0ADP6OlPQAXFfCYZS0/qbz9eXGLv0=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "'marcelblijleven@gmail.com" "marcelblijleven@gmail.com" \
+      --replace "version: file: VERSION" "version = ${version}"
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  pythonImportsCheck = [
+    "goodwe"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+
+  meta = with lib; {
+    description = "Python library for connecting to GoodWe inverter";
+    homepage = "https://github.com/marcelblijleven/goodwe";
+    changelog = "https://github.com/marcelblijleven/goodwe/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-ai-generativelanguage/default.nix b/nixpkgs/pkgs/development/python-modules/google-ai-generativelanguage/default.nix
new file mode 100644
index 000000000000..ebadff454005
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-ai-generativelanguage/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-testutils
+, grpcio
+, grpcio-status
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-ai-generativelanguage";
+  version = "0.3.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-cnX9lGmtOrd5CdioC9bAVeHiMXjEsV6Z67ARSnV03P8=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    grpcio
+    grpcio-status
+    proto-plus
+    protobuf
+  ];
+
+  nativeCheckInputs = [
+    google-cloud-testutils
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "google.ai.generativelanguage"
+    "google.ai.generativelanguage_v1beta2"
+  ];
+
+  meta = with lib; {
+    description = "Google Ai Generativelanguage API client library";
+    homepage = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-ai-generativelanguage";
+    changelog = "https://github.com/googleapis/google-cloud-python/blob/google-ai-generativelanguage-v${version}/packages/google-ai-generativelanguage/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-api-core/default.nix b/nixpkgs/pkgs/development/python-modules/google-api-core/default.nix
new file mode 100644
index 000000000000..9df9562c3d15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-api-core/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-auth
+, googleapis-common-protos
+, grpcio
+, grpcio-gcp
+, grpcio-status
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "google-api-core";
+  version = "2.11.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JdKeBaAFjtXxnGHAp4sbU63qTZNktGTQFPvalB9tHJo=";
+  };
+
+  propagatedBuildInputs = [
+    googleapis-common-protos
+    google-auth
+    protobuf
+    proto-plus
+    requests
+  ];
+
+  passthru.optional-dependencies = {
+    grpc = [
+      grpcio
+      grpcio-status
+    ];
+    grpcgcp = [
+      grpcio-gcp
+    ];
+    grpcio-gcp = [
+      grpcio-gcp
+    ];
+  };
+
+  nativeCheckInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  # prevent google directory from shadowing google imports
+  preCheck = ''
+    rm -r google
+  '';
+
+  disabledTests = [
+    # Those grpc_helpers tests are failing
+    "test_wrap_unary_errors"
+    "test_wrap_stream_errors_raised"
+    "test_wrap_stream_errors_read"
+    "test_wrap_stream_errors_aiter"
+    "test_wrap_stream_errors_write"
+    "test_wrap_unary_errors"
+    "test___next___w_rpc_error"
+    "test_wrap_stream_errors_invocation"
+    "test_wrap_stream_errors_iterator_initialization"
+    "test_wrap_stream_errors_during_iteration"
+    "test_exception_with_error_code"
+  ];
+
+  pythonImportsCheck = [
+    "google.api_core"
+  ];
+
+  meta = with lib; {
+    description = "Core Library for Google Client Libraries";
+    longDescription = ''
+      This library is not meant to stand-alone. Instead it defines common
+      helpers used by all Google API clients.
+    '';
+    homepage = "https://github.com/googleapis/python-api-core";
+    changelog = "https://github.com/googleapis/python-api-core/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-api-python-client/default.nix b/nixpkgs/pkgs/development/python-modules/google-api-python-client/default.nix
new file mode 100644
index 000000000000..ecf2b36ab9db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-api-python-client/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-auth
+, google-auth-httplib2
+, google-api-core
+, httplib2
+, uritemplate
+, oauth2client
+, setuptools
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-api-python-client";
+  version = "2.99.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5zP9DyyHk7GgANXmmsgbG57AZltEW37YO9u7ADiXMwY=";
+  };
+
+  propagatedBuildInputs = [
+    google-auth
+    google-auth-httplib2
+    google-api-core
+    httplib2
+    uritemplate
+    oauth2client
+    setuptools
+  ];
+
+  # No tests included in archive
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "googleapiclient"
+  ];
+
+  meta = with lib; {
+    description = "The official Python client library for Google's discovery based APIs";
+    longDescription = ''
+      These client libraries are officially supported by Google. However, the
+      libraries are considered complete and are in maintenance mode. This means
+      that we will address critical bugs and security issues but will not add
+      any new features.
+    '';
+    homepage = "https://github.com/google/google-api-python-client";
+    changelog = "https://github.com/googleapis/google-api-python-client/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-auth-httplib2/default.nix b/nixpkgs/pkgs/development/python-modules/google-auth-httplib2/default.nix
new file mode 100644
index 000000000000..510b62c5bbae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-auth-httplib2/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flask
+, google-auth
+, httplib2
+, mock
+, pytest-localserver
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-auth-httplib2";
+  version = "0.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xkvFVf3G3XiOpi7Pe8z/z0l793JEiHo/PXpaAvjj/Ck=";
+  };
+
+  propagatedBuildInputs = [
+    google-auth
+    httplib2
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    flask
+    mock
+    pytestCheckHook
+    pytest-localserver
+  ];
+
+  meta = with lib; {
+    description = "Google Authentication Library: httplib2 transport";
+    homepage = "https://github.com/GoogleCloudPlatform/google-auth-library-python-httplib2";
+    changelog = "https://github.com/googleapis/google-auth-library-python-httplib2/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-auth-oauthlib/default.nix b/nixpkgs/pkgs/development/python-modules/google-auth-oauthlib/default.nix
new file mode 100644
index 000000000000..2a24f4c04b03
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-auth-oauthlib/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, click
+, mock
+, pytestCheckHook
+, google-auth
+, requests-oauthlib
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-auth-oauthlib";
+  version = "1.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-g+qMOwiB5FN5C6/0RI6KYRKsh3jR3p2gtoAQuEOTevs=";
+  };
+
+  propagatedBuildInputs = [
+    google-auth
+    requests-oauthlib
+  ];
+
+  nativeCheckInputs = [
+    click
+    mock
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # This test fails if the hostname is not associated with an IP (e.g., in `/etc/hosts`).
+    "test_run_local_server_bind_addr"
+  ];
+
+  pythonImportsCheck = [
+    "google_auth_oauthlib"
+  ];
+
+  meta = with lib; {
+    description = "Google Authentication Library: oauthlib integration";
+    homepage = "https://github.com/GoogleCloudPlatform/google-auth-library-python-oauthlib";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ terlar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-auth/default.nix b/nixpkgs/pkgs/development/python-modules/google-auth/default.nix
new file mode 100644
index 000000000000..4785bed59fb3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-auth/default.nix
@@ -0,0 +1,123 @@
+{ lib
+, stdenv
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, cachetools
+, cryptography
+, fetchpatch
+, fetchPypi
+, flask
+, freezegun
+, grpcio
+, mock
+, oauth2client
+, pyasn1-modules
+, pyopenssl
+, pytest-asyncio
+, pytest-localserver
+, pytestCheckHook
+, pythonOlder
+, pyu2f
+, requests
+, responses
+, rsa
+, six
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "google-auth";
+  version = "2.21.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-so6ASOV3J+fPDlvY5ydrISrvR2ZUoJURNUqoJ1O0XGY=";
+  };
+
+  patches = [
+    # Although the migration to urllib3-2.0.0 is incomplete,
+    # the discussion in the following PR has addressed the concerns.
+    # https://github.com/googleapis/google-auth-library-python/pull/1290
+    (fetchpatch {
+      name = "support-urllib3_2.patch";
+      url = "https://github.com/googleapis/google-auth-library-python/commit/9ed006d02d7c9de3e6898ee819648c2fd3367c1d.patch";
+      hash = "sha256-64g0GzZeyO8l/s1jqfsogr8pTOBbG9xfp/UeVZNA4q8=";
+      includes = [ "google/auth/transport/urllib3.py" ];
+    })
+  ];
+
+  propagatedBuildInputs = [
+    cachetools
+    pyasn1-modules
+    rsa
+    six
+    urllib3
+  ];
+
+  passthru.optional-dependencies = {
+    aiohttp = [
+      aiohttp
+      requests
+    ];
+    enterprise_cert = [
+      cryptography
+      pyopenssl
+    ];
+    pyopenssl = [
+      pyopenssl
+    ];
+    reauth = [
+      pyu2f
+    ];
+    requests = [
+      requests
+    ];
+  };
+
+  nativeCheckInputs = [
+    aioresponses
+    flask
+    freezegun
+    grpcio
+    mock
+    oauth2client
+    pytest-asyncio
+    pytest-localserver
+    pytestCheckHook
+    responses
+  ] ++ passthru.optional-dependencies.aiohttp
+  # `cryptography` is still required on `aarch64-darwin` for `tests/crypt/*`
+  ++ (if (stdenv.isDarwin && stdenv.isAarch64) then [ cryptography ] else passthru.optional-dependencies.enterprise_cert)
+  ++ passthru.optional-dependencies.reauth;
+
+  pythonImportsCheck = [
+    "google.auth"
+    "google.oauth2"
+  ];
+
+  disabledTestPaths = lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
+    # Disable tests using pyOpenSSL as it does not build on M1 Macs
+    "tests/transport/test__mtls_helper.py"
+    "tests/transport/test_requests.py"
+    "tests/transport/test_urllib3.py"
+    "tests/transport/test__custom_tls_signer.py"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Google Auth Python Library";
+    longDescription = ''
+      This library simplifies using Google's various server-to-server
+      authentication mechanisms to access Google APIs.
+    '';
+    homepage = "https://github.com/googleapis/google-auth-library-python";
+    changelog = "https://github.com/googleapis/google-auth-library-python/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-access-context-manager/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-access-context-manager/default.nix
new file mode 100644
index 000000000000..1e37e3a9552d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-access-context-manager/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, pythonOlder
+, protobuf
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-access-context-manager";
+  version = "0.1.16";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+L5Rre6LHpSlc+yzdQpMLSvURLHd412apDes5zwzdgc=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  # No tests in repo
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "google.identity.accesscontextmanager"
+  ];
+
+  meta = with lib; {
+    description = "Protobufs for Google Access Context Manager";
+    homepage = "https://github.com/googleapis/python-access-context-manager";
+    changelog = "https://github.com/googleapis/python-access-context-manager/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ austinbutler ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-appengine-logging/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-appengine-logging/default.nix
new file mode 100644
index 000000000000..d7ed23f14cec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-appengine-logging/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, grpc-google-iam-v1
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-appengine-logging";
+  version = "1.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-opifyg6IRjtWQyqoIeZLgcPRce43uEdxGJtI6Ll81JY=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    grpc-google-iam-v1
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.appengine_logging"
+    "google.cloud.appengine_logging_v1"
+  ];
+
+  meta = with lib; {
+    description = "Appengine logging client library";
+    homepage = "https://github.com/googleapis/python-appengine-logging";
+    changelog = "https://github.com/googleapis/python-appengine-logging/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-artifact-registry/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-artifact-registry/default.nix
new file mode 100644
index 000000000000..f778b745cb4c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-artifact-registry/default.nix
@@ -0,0 +1,44 @@
+{ buildPythonPackage
+, fetchPypi
+, google-api-core
+, grpc-google-iam-v1
+, lib
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-artifact-registry";
+  version = "1.9.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NITSosBPrfpIC+FqVU0B5H5MT0taEjzTcl6GW03X8yU=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    grpc-google-iam-v1
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.artifactregistry"
+    "google.cloud.artifactregistry_v1"
+    "google.cloud.artifactregistry_v1beta2"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud Artifact Registry API client library";
+    homepage = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-artifact-registry";
+    changelog = "https://github.com/googleapis/google-cloud-python/blob/google-cloud-artifact-registry-v${version}/packages/google-cloud-artifact-registry/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-asset/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-asset/default.nix
new file mode 100644
index 000000000000..c430d23c32f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-asset/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, grpc-google-iam-v1
+, google-api-core
+, google-cloud-access-context-manager
+, google-cloud-org-policy
+, google-cloud-os-config
+, google-cloud-testutils
+, libcst
+, protobuf
+, proto-plus
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-asset";
+  version = "3.20.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lJLC1igiY0OYLu3eyuOvJ2KmFr9n4su8T7LPgWlUtCk=";
+  };
+
+  propagatedBuildInputs = [
+    grpc-google-iam-v1
+    google-api-core
+    google-cloud-access-context-manager
+    google-cloud-org-policy
+    google-cloud-os-config
+    libcst
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  passthru.optional-dependencies = {
+    libcst = [
+      libcst
+    ];
+  };
+
+  nativeCheckInputs = [
+    google-cloud-testutils
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.asset"
+    "google.cloud.asset_v1"
+    "google.cloud.asset_v1p1beta1"
+    "google.cloud.asset_v1p2beta1"
+    "google.cloud.asset_v1p4beta1"
+    "google.cloud.asset_v1p5beta1"
+  ];
+
+  meta = with lib; {
+    description = "Python Client for Google Cloud Asset API";
+    homepage = "https://github.com/googleapis/python-asset";
+    changelog = "https://github.com/googleapis/python-asset/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-audit-log/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-audit-log/default.nix
new file mode 100644
index 000000000000..60515a9c65dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-audit-log/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, googleapis-common-protos
+, protobuf
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-audit-log";
+  version = "0.2.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-huL6ujODrcj9BKW9f9T5YLPkrtqn7ZUPL4kc4WkC62s=";
+  };
+
+  propagatedBuildInputs = [ googleapis-common-protos protobuf ];
+
+  # tests are a bit wonky to setup and are not very deep either
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "google.cloud.audit"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud Audit Protos";
+    homepage = "https://github.com/googleapis/python-audit-log";
+    changelog = "https://github.com/googleapis/python-audit-log/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-automl/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-automl/default.nix
new file mode 100644
index 000000000000..b45492a171f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-automl/default.nix
@@ -0,0 +1,86 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-storage
+, google-cloud-testutils
+, libcst
+, mock
+, pandas
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-automl";
+  version = "2.11.4";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-oUMXQWkwHMFI26hpe36mAyoh+bQogtyoDgTaBRactUU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    google-api-core
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  passthru.optional-dependencies = {
+    libcst = [
+      libcst
+    ];
+    pandas = [
+      pandas
+    ];
+    storage = [
+      google-cloud-storage
+    ];
+  };
+
+  nativeCheckInputs = [
+    google-cloud-storage
+    google-cloud-testutils
+    mock
+    pandas
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    # do not shadow imports
+    rm -r google
+  '';
+
+  disabledTests = [
+    # Test requires credentials
+    "test_prediction_client_client_info"
+    # Test requires project ID
+    "test_list_models"
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.automl"
+    "google.cloud.automl_v1"
+    "google.cloud.automl_v1beta1"
+  ];
+
+  meta = with lib; {
+    description = "Cloud AutoML API client library";
+    homepage = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-automl";
+    changelog = "https://github.com/googleapis/google-cloud-python/tree/google-cloud-automl-v${version}/packages/google-cloud-automl";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-bigquery-datatransfer/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-bigquery-datatransfer/default.nix
new file mode 100644
index 000000000000..d64bd1bf7340
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-bigquery-datatransfer/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, libcst
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-bigquery-datatransfer";
+  version = "3.12.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uEWnQIGs4yybuukzgrAqaduFYKNW9h/WouX2MzSVgUg=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    libcst
+    proto-plus
+    protobuf
+    pytz
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.bigquery_datatransfer"
+    "google.cloud.bigquery_datatransfer_v1"
+  ];
+
+  disabledTests = [
+    # Tests require project ID
+    "test_list_data_sources"
+  ];
+
+  meta = with lib; {
+    description = "BigQuery Data Transfer API client library";
+    homepage = "https://github.com/googleapis/python-bigquery-datatransfer";
+    changelog = "https://github.com/googleapis/python-bigquery-datatransfer/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-bigquery-logging/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-bigquery-logging/default.nix
new file mode 100644
index 000000000000..578990f30905
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-bigquery-logging/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, grpc-google-iam-v1
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-bigquery-logging";
+  version = "1.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7hj42cr9BKwSBEX09kZPngAUPFPrQ/VS5hBzbAaQhH4=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    grpc-google-iam-v1
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.bigquery_logging"
+    "google.cloud.bigquery_logging_v1"
+  ];
+
+  meta = with lib; {
+    description = "Bigquery logging client library";
+    homepage = "https://github.com/googleapis/python-bigquery-logging";
+    changelog = "https://github.com/googleapis/python-bigquery-logging/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-bigquery-storage/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-bigquery-storage/default.nix
new file mode 100644
index 000000000000..ce91fa6c6c05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-bigquery-storage/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, fastavro
+, fetchPypi
+, google-api-core
+, google-auth
+, google-cloud-bigquery
+, pandas
+, protobuf
+, pyarrow
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-bigquery-storage";
+  version = "2.22.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-9tjHs6ubV0xml3/O6dM24zStGjhDpyK+GRI2QOeAjqM=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  passthru.optional-dependencies = {
+    fastavro = [
+      fastavro
+    ];
+    pandas = [
+      pandas
+    ];
+    pyarrow = [
+      pyarrow
+    ];
+  };
+
+  nativeCheckInputs = [
+    google-auth
+    google-cloud-bigquery
+    pytestCheckHook
+  ];
+
+  # Dependency loop with google-cloud-bigquery
+  doCheck = false;
+
+  preCheck = ''
+    rm -r google
+  '';
+
+  pythonImportsCheck = [
+    "google.cloud.bigquery_storage"
+    "google.cloud.bigquery_storage_v1"
+    "google.cloud.bigquery_storage_v1beta2"
+  ];
+
+  meta = with lib; {
+    description = "BigQuery Storage API API client library";
+    homepage = "https://github.com/googleapis/python-bigquery-storage";
+    changelog = "https://github.com/googleapis/python-bigquery-storage/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-bigquery/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-bigquery/default.nix
new file mode 100644
index 000000000000..7edbedb80c6a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-bigquery/default.nix
@@ -0,0 +1,138 @@
+{ lib
+, buildPythonPackage
+, db-dtypes
+, fetchPypi
+, freezegun
+, google-api-core
+, google-cloud-bigquery-storage
+, google-cloud-core
+, google-cloud-datacatalog
+, google-cloud-storage
+, google-cloud-testutils
+, google-resumable-media
+, grpcio
+, ipython
+, mock
+, pandas
+, proto-plus
+, protobuf
+, psutil
+, pyarrow
+, pytest-xdist
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, requests
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-bigquery";
+  version = "3.11.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-aX3xFyQaIoO8u5OyHhC63BTlHJqQgA0qfho+HH2EKXQ=";
+  };
+
+  propagatedBuildInputs = [
+    grpcio
+    google-api-core
+    google-cloud-core
+    google-cloud-bigquery-storage
+    google-resumable-media
+    proto-plus
+    protobuf
+    requests
+    python-dateutil
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  passthru.optional-dependencies = {
+    bqstorage = [
+      google-cloud-bigquery-storage
+      grpcio
+      pyarrow
+    ];
+    pandas = [
+      db-dtypes
+      pandas
+      pyarrow
+    ];
+    tqdm = [
+      tqdm
+    ];
+    ipython = [
+      ipython
+    ];
+  };
+
+  nativeCheckInputs = [
+    freezegun
+    google-cloud-testutils
+    mock
+    psutil
+    google-cloud-datacatalog
+    google-cloud-storage
+    pytestCheckHook
+    pytest-xdist
+  ] ++ passthru.optional-dependencies.pandas
+  ++ passthru.optional-dependencies.ipython;
+
+  # prevent google directory from shadowing google imports
+  preCheck = ''
+    rm -r google
+  '';
+
+  disabledTests = [
+    # requires credentials
+    "test_bigquery_magic"
+    "TestBigQuery"
+    "test_context_with_no_query_cache_from_context"
+    "test_arrow_extension_types_same_for_storage_and_REST_APIs_894"
+    "test_list_rows_empty_table"
+    "test_list_rows_page_size"
+    "test_list_rows_scalars"
+    "test_list_rows_scalars_extreme"
+    "test_dry_run"
+    "test_session"
+    # Mocking of _ensure_bqstorage_client fails
+    "test_to_arrow_ensure_bqstorage_client_wo_bqstorage"
+    # requires network
+    "test_dbapi_create_view"
+    "test_list_rows_nullable_scalars_dtypes"
+    "test_parameterized_types_round_trip"
+    "test_structs"
+    "test_table_snapshots"
+    "test__initiate_resumable_upload"
+    "test__initiate_resumable_upload_mtls"
+    "test__initiate_resumable_upload_with_retry"
+    "test_table_clones"
+    "test_context_with_default_connection"
+    "test_context_with_custom_connection"
+  ];
+
+  disabledTestPaths = [
+    # Tests require credentials
+    "tests/system/test_query.py"
+    "tests/system/test_job_retry.py"
+    "tests/system/test_pandas.py"
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.bigquery"
+    "google.cloud.bigquery_v2"
+  ];
+
+  meta = with lib; {
+    # Not compatible with pyarrow13 yet.
+    broken = true;
+    description = "Google BigQuery API client library";
+    homepage = "https://github.com/googleapis/python-bigquery";
+    changelog = "https://github.com/googleapis/python-bigquery/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-bigtable/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-bigtable/default.nix
new file mode 100644
index 000000000000..9b214bebdfd3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-bigtable/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-core
+, grpcio
+, grpc-google-iam-v1
+, libcst
+, mock
+, proto-plus
+, protobuf
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-bigtable";
+  version = "2.21.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2fDvv5QMo5LwfRN4f8LadtHhaN7a+uD48bQgjgwRMtw=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    google-cloud-core
+    grpc-google-iam-v1
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  passthru.optional-dependencies = {
+    libcst = [
+      libcst
+    ];
+  };
+
+  nativeCheckInputs = [
+    grpcio
+    mock
+    pytestCheckHook
+  ];
+
+  checkPhase = ''
+    # Prevent google directory from shadowing google imports
+    rm -r google
+  '';
+
+  disabledTests = [
+    "policy"
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.bigtable_admin_v2"
+    "google.cloud.bigtable_v2"
+    "google.cloud.bigtable"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud Bigtable API client library";
+    homepage = "https://github.com/googleapis/python-bigtable";
+    changelog = "https://github.com/googleapis/python-bigtable/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-compute/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-compute/default.nix
new file mode 100644
index 000000000000..b705224111ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-compute/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, google-api-core
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-compute";
+  version = "1.14.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rNmHZH18gmqpe0QYFBx0Dq1eiBHTNJMV8viaMMAcf0s=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.compute"
+    "google.cloud.compute_v1"
+  ];
+
+  # disable tests that require credentials
+  disabledTestPaths = [
+    "tests/system/test_addresses.py"
+    "tests/system/test_instance_group.py"
+    "tests/system/test_pagination.py"
+    "tests/system/test_smoke.py"
+  ];
+
+  meta = with lib; {
+    description = "API Client library for Google Cloud Compute";
+    homepage = "https://github.com/googleapis/python-compute";
+    changelog = "https://github.com/googleapis/python-compute/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jpetrucciani ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-container/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-container/default.nix
new file mode 100644
index 000000000000..c955aafda501
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-container/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, libcst
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-container";
+  version = "2.33.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-dpJmSe7NjmmDqd0GrLxm1e/VFvo64+ECNRVwuRpjrmI=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    libcst
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Test requires credentials
+    "test_list_clusters"
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.container"
+    "google.cloud.container_v1"
+    "google.cloud.container_v1beta1"
+  ];
+
+  meta = with lib; {
+    description = "Google Container Engine API client library";
+    homepage = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-container";
+    changelog = "https://github.com/googleapis/google-cloud-python/blob/google-cloud-container-v${version}/packages/google-cloud-container/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-core/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-core/default.nix
new file mode 100644
index 000000000000..091729e95f69
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-core/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-auth
+, grpcio
+, mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-core";
+  version = "2.3.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-N7gCc8jX7uGugWs6IK5DWF6lBQbLDmDzz1vl+H8Tc8s=";
+  };
+
+  propagatedBuildInputs = [
+    google-auth
+    google-api-core
+  ];
+
+  passthru.optional-dependencies = {
+    grpc = [
+      grpcio
+    ];
+  };
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.grpc;
+
+  # prevent google directory from shadowing google imports
+  preCheck = ''
+    rm -r google
+  '';
+
+  pythonImportsCheck = [
+    "google.cloud"
+  ];
+
+  meta = with lib; {
+    description = "API Client library for Google Cloud: Core Helpers";
+    homepage = "https://github.com/googleapis/python-cloud-core";
+    changelog = "https://github.com/googleapis/python-cloud-core/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-datacatalog/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-datacatalog/default.nix
new file mode 100644
index 000000000000..2f934c38765a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-datacatalog/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, grpc-google-iam-v1
+, libcst
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-datacatalog";
+  version = "3.16.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-cD5BQ5Ykj6mEdLurnqli9MlqPK8RhMkDv8lFPSdLDqI=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    grpc-google-iam-v1
+    libcst
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.datacatalog"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud Data Catalog API API client library";
+    homepage = "https://github.com/googleapis/python-datacatalog";
+    changelog = "https://github.com/googleapis/python-datacatalog/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-dataproc/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-dataproc/default.nix
new file mode 100644
index 000000000000..81a5bb08599c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-dataproc/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, grpc-google-iam-v1
+, mock
+, libcst
+, proto-plus
+, protobuf
+, pytestCheckHook
+, pytest-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-dataproc";
+  version = "5.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-X6nfuIQzwtDBOLfrtq3hdBA743YszQObJNU8dEjjdg0=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    grpc-google-iam-v1
+    libcst
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  disabledTests = [
+    # Test requires credentials
+    "test_list_clusters"
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.dataproc"
+    "google.cloud.dataproc_v1"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud Dataproc API client library";
+    homepage = "https://github.com/googleapis/python-dataproc";
+    changelog = "https://github.com/googleapis/google-cloud-python/blob/google-cloud-dataproc-v${version}/packages/google-cloud-dataproc/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-datastore/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-datastore/default.nix
new file mode 100644
index 000000000000..b6148c30746c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-datastore/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-core
+, google-cloud-testutils
+, libcst
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-datastore";
+  version = "2.18.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Y7MbZ23LJ4amUNI9Mk2PiGxOFFhq/dDP5uJgpz8SRI4=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    google-cloud-core
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  passthru.optional-dependencies = {
+    libcst = [
+      libcst
+    ];
+  };
+
+  nativeCheckInputs = [
+    google-cloud-testutils
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  preCheck = ''
+    # directory shadows imports
+    rm -r google
+  '';
+
+  disabledTestPaths = [
+    # Requires credentials
+    "tests/system/test_aggregation_query.py"
+    "tests/system/test_allocate_reserve_ids.py"
+    "tests/system/test_query.py"
+    "tests/system/test_put.py"
+    "tests/system/test_read_consistency.py"
+    "tests/system/test_transaction.py"
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.datastore"
+    "google.cloud.datastore_admin_v1"
+    "google.cloud.datastore_v1"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud Datastore API client library";
+    homepage = "https://github.com/googleapis/python-datastore";
+    changelog = "https://github.com/googleapis/python-datastore/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-dlp/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-dlp/default.nix
new file mode 100644
index 000000000000..4fe3dddd3001
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-dlp/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-testutils
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-dlp";
+  version = "3.13.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-mFqptqEvHQAKNevzawDOfQsH0SCn9EanJ2js4vIpCGo=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    google-cloud-testutils
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  disabledTests = [
+    # Test requires credentials
+    "test_inspect_content"
+    "test_list_dlp_jobs"
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.dlp"
+    "google.cloud.dlp_v2"
+  ];
+
+  meta = with lib; {
+    description = "Cloud Data Loss Prevention (DLP) API API client library";
+    homepage = "https://github.com/googleapis/python-dlp";
+    changelog = "https://github.com/googleapis/python-dlp/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-dns/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-dns/default.nix
new file mode 100644
index 000000000000..0f9b9eca022f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-dns/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-core
+, mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-dns";
+  version = "0.34.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/GG9jPBw6Hqstidi6ypa8VUHBsmIgdeurrru0RKAr9M=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    google-cloud-core
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    # don#t shadow python imports
+    rm -r google
+  '';
+
+  disabledTests = [
+    # requires credentials
+    "test_quota"
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.dns"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud DNS API client library";
+    homepage = "https://github.com/googleapis/python-dns";
+    changelog = "https://github.com/googleapis/python-dns/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-error-reporting/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-error-reporting/default.nix
new file mode 100644
index 000000000000..4f2879196356
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-error-reporting/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-logging
+, google-cloud-testutils
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-error-reporting";
+  version = "1.9.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-S+7x6gIxJDfV7Xe6DOBVbJNMREYlRFLyGo8BEpIdIow=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    google-cloud-logging
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    google-cloud-testutils
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  disabledTests = [
+    # Tests require credentials
+    "test_report_error_event"
+    "test_report_exception"
+  ];
+
+  preCheck = ''
+    # prevent google directory from shadowing google imports
+    rm -r google
+  '';
+
+  meta = with lib; {
+    description = "Stackdriver Error Reporting API client library";
+    homepage = "https://github.com/googleapis/python-error-reporting";
+    changelog = "https://github.com/googleapis/python-error-reporting/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-firestore/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-firestore/default.nix
new file mode 100644
index 000000000000..45c257088183
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-firestore/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, aiounittest
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-core
+, google-cloud-testutils
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-firestore";
+  version = "2.13.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vRTS65rjWNIQWM4JHBPeoRkX4m8cQ3OKUenOqLSbTzg=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    google-cloud-core
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    aiounittest
+    google-cloud-testutils
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    # do not shadow imports
+    rm -r google
+  '';
+
+  disabledTestPaths = [
+    # Tests are broken
+    "tests/system/test_system.py"
+    "tests/system/test_system_async.py"
+    # requires credentials
+    "tests/unit/v1/test_bulk_writer.py"
+  ];
+
+  disabledTests = [
+    # requires credentials
+    "test_collections"
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.firestore_v1"
+    "google.cloud.firestore_admin_v1"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud Firestore API client library";
+    homepage = "https://github.com/googleapis/python-firestore";
+    changelog = "https://github.com/googleapis/python-firestore/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-iam-logging/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-iam-logging/default.nix
new file mode 100644
index 000000000000..f7c690c56f67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-iam-logging/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, grpc-google-iam-v1
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-iam-logging";
+  version = "1.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6IBjA2WwP11d/vQJSIY3WhbqYvAgFRtZFFSffUqKM38=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    grpc-google-iam-v1
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.iam_logging"
+    "google.cloud.iam_logging_v1"
+  ];
+
+  meta = with lib; {
+    description = "IAM Service Logging client library";
+    homepage = "https://github.com/googleapis/python-iam-logging";
+    changelog = "https://github.com/googleapis/python-iam-logging/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-iam/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-iam/default.nix
new file mode 100644
index 000000000000..ec412c732ddd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-iam/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, libcst
+, mock
+, proto-plus
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-iam";
+  version = "2.12.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/lBwhUR+z0Ydr9LNS4AWxYmeWOUgvQS1G7Orb2sI+v8=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    libcst
+    proto-plus
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.iam_credentials"
+    "google.cloud.iam_credentials_v1"
+  ];
+
+  meta = with lib; {
+    description = "IAM Service Account Credentials API client library";
+    homepage = "https://github.com/googleapis/python-iam";
+    changelog = "https://github.com/googleapis/python-iam/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ austinbutler ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-iot/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-iot/default.nix
new file mode 100644
index 000000000000..3cd2f397a6b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-iot/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, grpc-google-iam-v1
+, libcst
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-iot";
+  version = "2.9.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-pLQgcwR89F+9jcSDtW/5+6Gy+Wk7XQf4iD49vDPkN9U=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    grpc-google-iam-v1
+    libcst
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # requires credentials
+    "test_list_device_registries"
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.iot"
+    "google.cloud.iot_v1"
+  ];
+
+  meta = with lib; {
+    description = "Cloud IoT API API client library";
+    homepage = "https://github.com/googleapis/python-iot";
+    changelog = "https://github.com/googleapis/python-iot/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-kms/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-kms/default.nix
new file mode 100644
index 000000000000..5daa5fe466f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-kms/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, grpc-google-iam-v1
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-kms";
+  version = "2.19.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ia3XCpLUXJ93AGEHdDaOidQEagUkMVAnb2UYK+ktzKc=";
+  };
+
+  propagatedBuildInputs = [
+    grpc-google-iam-v1
+    google-api-core
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  # Disable tests that need credentials
+  disabledTests = [
+    "test_list_global_key_rings"
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.kms"
+    "google.cloud.kms_v1"
+  ];
+
+  meta = with lib; {
+    description = "Cloud Key Management Service (KMS) API API client library";
+    homepage = "https://github.com/googleapis/python-kms";
+    changelog = "https://github.com/googleapis/python-kms/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-language/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-language/default.nix
new file mode 100644
index 000000000000..54397f68cd8f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-language/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-language";
+  version = "2.11.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XxhECfBAwMcwV8JhbmvS6G5FrrZGGA0ZwYnfSqPQLbo=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.language"
+    "google.cloud.language_v1"
+    "google.cloud.language_v1beta2"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud Natural Language API client library";
+    homepage = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-language";
+    changelog = "https://github.com/googleapis/google-cloud-python/blob/google-cloud-language-v${version}/packages/google-cloud-language/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-logging/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-logging/default.nix
new file mode 100644
index 000000000000..83842597d877
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-logging/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, buildPythonPackage
+, django
+, fetchPypi
+, flask
+, google-api-core
+, google-cloud-appengine-logging
+, google-cloud-audit-log
+, google-cloud-core
+, google-cloud-testutils
+, grpc-google-iam-v1
+, mock
+, pandas
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, rich
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-logging";
+  version = "3.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/dkW5ZqEqowC6BSNf907O2I8V7DB/3H0MpfOjlD8Hqs=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    google-cloud-appengine-logging
+    google-cloud-audit-log
+    google-cloud-core
+    grpc-google-iam-v1
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    django
+    flask
+    google-cloud-testutils
+    mock
+    pandas
+    pytestCheckHook
+    pytest-asyncio
+    rich
+  ];
+
+  disabledTests = [
+    # requires credentials
+    "test_write_log_entries"
+  ];
+
+  preCheck = ''
+    # prevent google directory from shadowing google imports
+    rm -r google
+  '';
+
+  disabledTestPaths = [
+    # Tests require credentials
+    "tests/system/test_system.py"
+    "tests/unit/test__gapic.py"
+    # Exclude performance tests
+    "tests/performance/test_performance.py"
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.logging"
+    "google.cloud.logging_v2"
+  ];
+
+  meta = with lib; {
+    description = "Stackdriver Logging API client library";
+    homepage = "https://github.com/googleapis/python-logging";
+    changelog = "https://github.com/googleapis/python-logging/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-monitoring/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-monitoring/default.nix
new file mode 100644
index 000000000000..1622df520797
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-monitoring/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-testutils
+, mock
+, proto-plus
+, pandas
+, pytestCheckHook
+, pytest-asyncio
+, protobuf
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-monitoring";
+  version = "2.16.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-PRhRAJMSraXoq/IP92GvhHS3UwYKtuC31uxHvBHysTY=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  passthru.optional-dependencies = {
+    pandas = [
+      pandas
+    ];
+  };
+
+  nativeCheckInputs = [
+    google-cloud-testutils
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ] ++ passthru.optional-dependencies.pandas;
+
+  disabledTests = [
+    # requires credentials
+    "test_list_monitored_resource_descriptors"
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.monitoring"
+    "google.cloud.monitoring_v3"
+  ];
+
+  meta = with lib; {
+    description = "Stackdriver Monitoring API client library";
+    homepage = "https://github.com/googleapis/python-monitoring";
+    changelog = "https://github.com/googleapis/python-monitoring/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-org-policy/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-org-policy/default.nix
new file mode 100644
index 000000000000..2e91f2704c77
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-org-policy/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-org-policy";
+  version = "1.8.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VU+vB+x2DElwzl1cO7qTdV91Mn1i2Dsq2safnMrwuqI=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  # Prevent google directory from shadowing google imports
+  preCheck = ''
+    rm -r google
+  '';
+
+  pythonImportsCheck = [
+    "google.cloud.orgpolicy"
+  ];
+
+  meta = with lib; {
+    description = "Protobufs for Google Cloud Organization Policy";
+    homepage = "https://github.com/googleapis/python-org-policy";
+    changelog = "https://github.com/googleapis/python-org-policy/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ austinbutler ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-os-config/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-os-config/default.nix
new file mode 100644
index 000000000000..4c71548c0df8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-os-config/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, protobuf
+, proto-plus
+, pytestCheckHook
+, pytest-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-os-config";
+  version = "1.15.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-KNM4wASyfgoBqhXa5k+8tf+AN9VljHDDK0U849N5qHI=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.osconfig"
+  ];
+
+  disabledTests = [
+    # Test requires a project ID
+    "test_patch_deployment"
+    "test_patch_job"
+    "test_list_patch_jobs"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud OS Config API client library";
+    homepage = "https://github.com/googleapis/python-os-config";
+    changelog = "https://github.com/googleapis/python-os-config/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-pubsub/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-pubsub/default.nix
new file mode 100644
index 000000000000..943d55dab406
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-pubsub/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-testutils
+, grpc-google-iam-v1
+, grpcio
+, grpcio-status
+, libcst
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-pubsub";
+  version = "2.18.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Muth/UwdxshC9ZTWnZr6gFROOzJ6pkChZOtvsCAery0=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    grpc-google-iam-v1
+    grpcio
+    grpcio-status
+    libcst
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  passthru.optional-dependencies = {
+    libcst = [
+      libcst
+    ];
+  };
+
+  nativeCheckInputs = [
+    google-cloud-testutils
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  preCheck = ''
+    # prevent google directory from shadowing google imports
+    rm -r google
+  '';
+
+  disabledTestPaths = [
+    # Tests in pubsub_v1 attempt to contact pubsub.googleapis.com
+    "tests/unit/pubsub_v1"
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.pubsub"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud Pub/Sub API client library";
+    homepage = "https://github.com/googleapis/python-pubsub";
+    changelog = "https://github.com/googleapis/python-pubsub/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-redis/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-redis/default.nix
new file mode 100644
index 000000000000..37b9dcf80958
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-redis/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-redis";
+  version = "2.13.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XEhXMDVdlnI9ZK5jfxsiZPNbV8MB7A7yxtMLLwbcoU4=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.redis"
+    "google.cloud.redis_v1"
+    "google.cloud.redis_v1beta1"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud Memorystore for Redis API client library";
+    homepage = "https://github.com/googleapis/python-redis";
+    changelog = "https://github.com/googleapis/python-redis/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-resource-manager/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-resource-manager/default.nix
new file mode 100644
index 000000000000..50f605f5fc99
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-resource-manager/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-core
+, grpc-google-iam-v1
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-resource-manager";
+  version = "1.10.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-RWsl3do9TNJ0iKcnNrvDrwTXE64v42VcAbZqM50o1nk=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    google-cloud-core
+    grpc-google-iam-v1
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  # prevent google directory from shadowing google imports
+  preCheck = ''
+    rm -r google
+  '';
+
+  pythonImportsCheck = [
+    "google.cloud.resourcemanager"
+    "google.cloud.resourcemanager_v3"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud Resource Manager API client library";
+    homepage = "https://github.com/googleapis/python-resource-manager";
+    changelog = "https://github.com/googleapis/python-resource-manager/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-runtimeconfig/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-runtimeconfig/default.nix
new file mode 100644
index 000000000000..67d050c2e722
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-runtimeconfig/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-core
+, mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-runtimeconfig";
+  version = "0.33.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MPmyvm2FSrUzb1y5i4xl5Cqea6sxixLoZ7V1hxNi7hw=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    google-cloud-core
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  # Client tests require credentials
+  disabledTests = [
+    "client_options"
+  ];
+
+  # prevent google directory from shadowing google imports
+  preCheck = ''
+    rm -r google
+  '';
+
+  pythonImportsCheck = [
+    "google.cloud.runtimeconfig"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud RuntimeConfig API client library";
+    homepage = "https://github.com/googleapis/python-runtimeconfig";
+    changelog = "https://github.com/googleapis/python-runtimeconfig/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-secret-manager/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-secret-manager/default.nix
new file mode 100644
index 000000000000..5bb5940f55a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-secret-manager/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, grpc-google-iam-v1
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-secret-manager";
+  version = "2.16.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Nx3HL5FFrzI+ioE8jlA4DmrEvWpdvNQtzzFi2PN+UIA=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    grpc-google-iam-v1
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.secretmanager"
+    "google.cloud.secretmanager_v1"
+    "google.cloud.secretmanager_v1beta1"
+  ];
+
+  meta = with lib; {
+    description = "Secret Manager API API client library";
+    homepage = "https://github.com/googleapis/python-secret-manager";
+    changelog = "https://github.com/googleapis/python-secret-manager/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ siriobalmelli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-securitycenter/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-securitycenter/default.nix
new file mode 100644
index 000000000000..e7c930e77f07
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-securitycenter/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, grpc-google-iam-v1
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-securitycenter";
+  version = "1.24.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-KsXsWGEUwD0UFRD7V4rfqEuRjyWeU/PmPdh8X6djhG0=";
+  };
+
+  propagatedBuildInputs = [
+    grpc-google-iam-v1
+    google-api-core
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.securitycenter"
+    "google.cloud.securitycenter_v1"
+    "google.cloud.securitycenter_v1beta1"
+    "google.cloud.securitycenter_v1p1beta1"
+  ];
+
+  meta = with lib; {
+    description = "Cloud Security Command Center API API client library";
+    homepage = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-securitycenter";
+    changelog = "https://github.com/googleapis/google-cloud-python/blob/google-cloud-securitycenter-v${version}/packages/google-cloud-securitycenter/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-spanner/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-spanner/default.nix
new file mode 100644
index 000000000000..d7dcf9c3424e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-spanner/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-core
+, google-cloud-testutils
+, grpc-google-iam-v1
+, libcst
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, sqlparse
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-spanner";
+  version = "3.40.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-YWsHyGza5seLrSe4qznYznonNRHyuR/iYPFw2SZlPC4=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    google-cloud-core
+    grpc-google-iam-v1
+    proto-plus
+    protobuf
+    sqlparse
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  passthru.optional-dependencies = {
+    libcst = [
+      libcst
+    ];
+  };
+
+  nativeCheckInputs = [
+    google-cloud-testutils
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    # prevent google directory from shadowing google imports
+    rm -r google
+  '';
+
+  disabledTestPaths = [
+    # Requires credentials
+    "tests/system/test_backup_api.py"
+    "tests/system/test_database_api.py"
+    "tests/system/test_dbapi.py"
+    "tests/system/test_instance_api.py"
+    "tests/system/test_session_api.py"
+    "tests/system/test_streaming_chunking.py"
+    "tests/system/test_table_api.py"
+    "tests/unit/spanner_dbapi/test_connect.py"
+    "tests/unit/spanner_dbapi/test_connection.py"
+    "tests/unit/spanner_dbapi/test_cursor.py"
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.spanner_admin_database_v1"
+    "google.cloud.spanner_admin_instance_v1"
+    "google.cloud.spanner_dbapi"
+    "google.cloud.spanner_v1"
+  ];
+
+  meta = with lib; {
+    description = "Cloud Spanner API client library";
+    homepage = "https://github.com/googleapis/python-spanner";
+    changelog = "https://github.com/googleapis/python-spanner/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-speech/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-speech/default.nix
new file mode 100644
index 000000000000..3999f428c2b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-speech/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-speech";
+  version = "2.22.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lZKKiYaS1+qgVWbVeiE464tbkjSxw8y3LFUgce0qOrA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    google-api-core
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Test requires project ID
+    "test_list_phrase_set"
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.speech"
+    "google.cloud.speech_v1"
+    "google.cloud.speech_v1p1beta1"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud Speech API client library";
+    homepage = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-speech";
+    changelog = "https://github.com/googleapis/google-cloud-python/blob/google-cloud-speech-v${version}/packages/google-cloud-speech/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-storage/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-storage/default.nix
new file mode 100644
index 000000000000..ebcb32bf2b45
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-storage/default.nix
@@ -0,0 +1,94 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-auth
+, google-cloud-core
+, google-cloud-iam
+, google-cloud-kms
+, google-cloud-testutils
+, google-resumable-media
+, mock
+, protobuf
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-storage";
+  version = "2.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-k0sx6tXzmU5TYPn/V1CYLFtrEWBNwHK8RSwlll4Hbcc=";
+  };
+
+  propagatedBuildInputs = [
+    google-auth
+    google-cloud-core
+    google-resumable-media
+    requests
+  ];
+
+  passthru.optional-dependencies = {
+    protobuf = [
+      protobuf
+    ];
+  };
+
+  nativeCheckInputs = [
+    google-cloud-iam
+    google-cloud-kms
+    google-cloud-testutils
+    mock
+    pytestCheckHook
+  ];
+
+  # Disable tests which require credentials and network access
+  disabledTests = [
+    "create"
+    "download"
+    "get"
+    "post"
+    "upload"
+    "test_build_api_url"
+    "test_ctor_mtls"
+    "test_hmac_key_crud"
+    "test_list_buckets"
+    "test_open"
+    "test_anonymous_client_access_to_public_bucket"
+    "test_ctor_w_custom_endpoint_use_auth"
+  ];
+
+  disabledTestPaths = [
+    "tests/unit/test_bucket.py"
+    "tests/system/test_blob.py"
+    "tests/system/test_bucket.py"
+    "tests/system/test_fileio.py"
+    "tests/system/test_kms_integration.py"
+    "tests/unit/test_transfer_manager.py"
+  ];
+
+  preCheck = ''
+    # prevent google directory from shadowing google imports
+    rm -r google
+
+    # requires docker and network
+    rm tests/conformance/test_conformance.py
+  '';
+
+  pythonImportsCheck = [
+    "google.cloud.storage"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud Storage API client library";
+    homepage = "https://github.com/googleapis/python-storage";
+    changelog = "https://github.com/googleapis/python-storage/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-tasks/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-tasks/default.nix
new file mode 100644
index 000000000000..4354e9047444
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-tasks/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, grpc-google-iam-v1
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-tasks";
+  version = "2.14.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-PvsoDnpjX1eGCgajRhMcEXBC6CCtSDr9JWgA+uG01wE=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    grpc-google-iam-v1
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Test requires credentials
+    "test_list_queues"
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.tasks"
+    "google.cloud.tasks_v2"
+    "google.cloud.tasks_v2beta2"
+    "google.cloud.tasks_v2beta3"
+  ];
+
+  meta = with lib; {
+    description = "Cloud Tasks API API client library";
+    homepage = "https://github.com/googleapis/python-tasks";
+    changelog = "https://github.com/googleapis/python-tasks/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-testutils/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-testutils/default.nix
new file mode 100644
index 000000000000..55577e6fef96
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-testutils/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchPypi
+, google-auth
+, packaging
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-testutils";
+  version = "1.3.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bRjvNNmvsBy0sR4C0DoC/n7A9ez6AfXUJrXZiHKkz0g=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    google-auth
+    packaging
+  ];
+
+  # does not contain tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "test_utils"
+  ];
+
+  meta = with lib; {
+    description = "System test utilities for google-cloud-python";
+    homepage = "https://github.com/googleapis/python-test-utils";
+    changelog  ="https://github.com/googleapis/python-test-utils/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-texttospeech/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-texttospeech/default.nix
new file mode 100644
index 000000000000..6872b953efca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-texttospeech/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-texttospeech";
+  version = "2.14.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ojc4NmmI+vTSZSAPV8XeQxLvo9FLtDS5Km5UFxP12QY=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Disable tests that require credentials
+    "test_list_voices"
+    "test_synthesize_speech"
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.texttospeech"
+    "google.cloud.texttospeech_v1"
+    "google.cloud.texttospeech_v1beta1"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud Text-to-Speech API client library";
+    homepage = "https://github.com/googleapis/python-texttospeech";
+    changelog = "https://github.com/googleapis/python-texttospeech/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-trace/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-trace/default.nix
new file mode 100644
index 000000000000..ac134f2472ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-trace/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-testutils
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-trace";
+  version = "1.11.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ud0MLfv5Oy3AV6RdAkyMbCxM2+55txtfoekTB1eznFE=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    google-cloud-testutils
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  disabledTests = [
+    # require credentials
+    "test_batch_write_spans"
+    "test_list_traces"
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.trace"
+    "google.cloud.trace_v1"
+    "google.cloud.trace_v2"
+  ];
+
+  meta = with lib; {
+    description = "Cloud Trace API client library";
+    homepage = "https://github.com/googleapis/python-trace";
+    changelog = "https://github.com/googleapis/python-trace/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-translate/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-translate/default.nix
new file mode 100644
index 000000000000..bc5ab67b018c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-translate/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-core
+, google-cloud-testutils
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-translate";
+  version = "3.12.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Zhy4h5qjxjovclo+po+QGZvTVMlcoWnMLoOlEFmH0p4=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    google-cloud-core
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    google-cloud-testutils
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  preCheck = ''
+    # prevent shadowing imports
+    rm -r google
+  '';
+
+  pythonImportsCheck = [
+    "google.cloud.translate"
+    "google.cloud.translate_v2"
+    "google.cloud.translate_v3"
+    "google.cloud.translate_v3beta1"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud Translation API client library";
+    homepage = "https://github.com/googleapis/python-translate";
+    changelog = "https://github.com/googleapis/python-translate/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-videointelligence/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-videointelligence/default.nix
new file mode 100644
index 000000000000..3ff18366e426
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-videointelligence/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, google-cloud-testutils
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-videointelligence";
+  version = "2.11.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-B6zimaY/Wz1EQTdWNIU7Vc6PkMYsaiT4pH6wVBSfb5k=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    google-cloud-testutils
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  disabledTests = [
+    # require credentials
+    "test_annotate_video"
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.videointelligence"
+    "google.cloud.videointelligence_v1"
+    "google.cloud.videointelligence_v1beta2"
+    "google.cloud.videointelligence_v1p1beta1"
+    "google.cloud.videointelligence_v1p2beta1"
+    "google.cloud.videointelligence_v1p3beta1"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud Video Intelligence API client library";
+    homepage = "https://github.com/googleapis/python-videointelligence";
+    changelog = "https://github.com/googleapis/python-videointelligence/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-vision/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-vision/default.nix
new file mode 100644
index 000000000000..95c2ed0662ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-vision/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-vision";
+  version = "3.4.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-DfgkGrJ3GZuRnKODen3oUFk2P+oOPWYAYIcL587/wEc=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.vision"
+    "google.cloud.vision_helpers"
+    "google.cloud.vision_v1"
+    "google.cloud.vision_v1p1beta1"
+    "google.cloud.vision_v1p2beta1"
+    "google.cloud.vision_v1p3beta1"
+    "google.cloud.vision_v1p4beta1"
+  ];
+
+  meta = with lib; {
+    description = "Cloud Vision API API client library";
+    homepage = "https://github.com/googleapis/python-vision";
+    changelog = "https://github.com/googleapis/python-vision/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-cloud-websecurityscanner/default.nix b/nixpkgs/pkgs/development/python-modules/google-cloud-websecurityscanner/default.nix
new file mode 100644
index 000000000000..8804ad810aaa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-cloud-websecurityscanner/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-core
+, mock
+, proto-plus
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-cloud-websecurityscanner";
+  version = "1.12.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zu4e4MTpc24p5ZWeRfVQwX0brciaz80FDGbxy6UppEA=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    proto-plus
+    protobuf
+  ] ++ google-api-core.optional-dependencies.grpc;
+
+  nativeCheckInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "google.cloud.websecurityscanner_v1alpha"
+    "google.cloud.websecurityscanner_v1beta"
+  ];
+
+  meta = with lib; {
+    description = "Google Cloud Web Security Scanner API client library";
+    homepage = "https://github.com/googleapis/python-websecurityscanner";
+    changelog = "https://github.com/googleapis/python-websecurityscanner/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-crc32c/default.nix b/nixpkgs/pkgs/development/python-modules/google-crc32c/default.nix
new file mode 100644
index 000000000000..b1dc31da8733
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-crc32c/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchFromGitHub, cffi, crc32c, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "google-crc32c";
+  version = "1.5.0";
+
+  src = fetchFromGitHub {
+    owner = "googleapis";
+    repo = "python-crc32c";
+    rev = "v${version}";
+    hash = "sha256-Tx7UBIwKzSBbpuqdqGiXTbmBE+1MDRknVe3Zee0UHKQ=";
+  };
+
+  buildInputs = [ crc32c ];
+
+  propagatedBuildInputs = [ cffi ];
+
+  LDFLAGS = "-L${crc32c}/lib";
+  CFLAGS = "-I${crc32c}/include";
+
+  nativeCheckInputs = [ pytestCheckHook crc32c ];
+
+  pythonImportsCheck = [ "google_crc32c" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/googleapis/python-crc32c";
+    description = "Wrapper the google/crc32c hardware-based implementation of the CRC32C hashing algorithm";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ freezeboy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-generativeai/default.nix b/nixpkgs/pkgs/development/python-modules/google-generativeai/default.nix
new file mode 100644
index 000000000000..69c9180ce423
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-generativeai/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, google-ai-generativelanguage
+, google-api-core
+, google-auth
+, protobuf
+, pythonOlder
+, pythonRelaxDepsHook
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "google-generativeai";
+  version = "0.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = "generative-ai-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-WiDoeScro7TcW5nQBmLpVQriL6IzR9CAVqBj36nqivk=";
+  };
+
+  pythonRelaxDeps = [
+    "google-ai-generativelanguage"
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    google-ai-generativelanguage
+    google-auth
+    google-api-core
+    protobuf
+    tqdm
+  ];
+
+  # Issue with the google.ai module. Check with the next release
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "google.generativeai"
+  ];
+
+  meta = with lib; {
+    description = "Python client library for Google's large language model PaLM API";
+    homepage = "https://github.com/google/generative-ai-python";
+    changelog = "https://github.com/google/generative-ai-python/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-i18n-address/default.nix b/nixpkgs/pkgs/development/python-modules/google-i18n-address/default.nix
new file mode 100644
index 000000000000..3cc5c3d43664
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-i18n-address/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, requests
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google-i18n-address";
+  version = "3.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mirumee";
+    repo = "google-i18n-address";
+    rev = "refs/tags/${version}";
+    hash = "sha256-dW/1wwnFDjYpym1ZaSZ7mOLpkHxsvuAHC8zBRekxWaw=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "i18naddress"
+  ];
+
+  meta = with lib; {
+    description = "Google's i18n address data packaged for Python";
+    homepage = "https://github.com/mirumee/google-i18n-address";
+    changelog = "https://github.com/mirumee/google-i18n-address/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-nest-sdm/default.nix b/nixpkgs/pkgs/development/python-modules/google-nest-sdm/default.nix
new file mode 100644
index 000000000000..31564a0536d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-nest-sdm/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, coreutils
+, fetchFromGitHub
+, google-auth
+, google-auth-oauthlib
+, google-cloud-pubsub
+, pydantic
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, requests-oauthlib
+}:
+
+buildPythonPackage rec {
+  pname = "google-nest-sdm";
+  version = "3.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "allenporter";
+    repo = "python-google-nest-sdm";
+    rev = "refs/tags/${version}";
+    hash = "sha256-VO/TY/QBzVFxqIumVJjw+Ic0hrqkRBS+7wQKBhcN9Jw=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    google-auth
+    google-auth-oauthlib
+    google-cloud-pubsub
+    pydantic
+    requests-oauthlib
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    coreutils
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "google_nest_sdm"
+  ];
+
+  disabledTests = [
+    "test_clip_preview_transcode"
+    "test_event_manager_event_expiration_with_transcode"
+  ];
+
+  meta = with lib; {
+    description = "Module for Google Nest Device Access using the Smart Device Management API";
+    homepage = "https://github.com/allenporter/python-google-nest-sdm";
+    changelog = "https://github.com/allenporter/python-google-nest-sdm/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-pasta/default.nix b/nixpkgs/pkgs/development/python-modules/google-pasta/default.nix
new file mode 100644
index 000000000000..608ab9ccd1bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-pasta/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "google-pasta";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0vm1r1jlaiagj0l9yf7j6zn9w3733dr2169911c0svgrr3gwiwn9";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  meta = {
+    description = "An AST-based Python refactoring library";
+    homepage    = "https://github.com/google/pasta";
+    # Usually the tag message contains a one-line summary of the changes.
+    changelog   = "https://github.com/google/pasta/releases/tag/v${version}";
+    license     = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ timokau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-re2/default.nix b/nixpkgs/pkgs/development/python-modules/google-re2/default.nix
new file mode 100644
index 000000000000..1528cb1a59e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-re2/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, pybind11
+, re2
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "google-re2";
+  version = "1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-06lGfuUrRqx3ypKPbQy+rM/ZLwPKDw9lud9qlRhPOhw=";
+  };
+
+  propagatedBuildInputs = [
+    pybind11
+    re2
+    six
+  ];
+
+  pythonImportsCheck = [
+    "re2"
+  ];
+
+  meta = with lib; {
+    description = "RE2 Python bindings";
+    homepage = "https://github.com/google/re2";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ alexbakker ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-reauth/default.nix b/nixpkgs/pkgs/development/python-modules/google-reauth/default.nix
new file mode 100644
index 000000000000..5a4524926d4d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-reauth/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, oauth2client
+, pytestCheckHook
+, pythonOlder
+, pyu2f
+}:
+
+buildPythonPackage rec {
+  pname = "google-reauth";
+  version = "0.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Google";
+    repo = "google-reauth-python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-J7GVh+iY+69rFzf4hN/KLFZMZ1/S3CL5TZ7SsP5Oy3g=";
+  };
+
+  propagatedBuildInputs = [
+    oauth2client
+    pyu2f
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "google_reauth"
+  ];
+
+  meta = with lib; {
+    description = "Auth plugin allowing use the use of OAuth 2.0 credentials for Google Cloud Storage";
+    homepage = "https://github.com/Google/google-reauth-python";
+    changelog = "https://github.com/google/google-reauth-python/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-resumable-media/default.nix b/nixpkgs/pkgs/development/python-modules/google-resumable-media/default.nix
new file mode 100644
index 000000000000..846b390b9c9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-resumable-media/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, google-auth
+, google-cloud-testutils
+, google-crc32c
+, mock
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "google-resumable-media";
+  version = "2.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lyhS9sZfkz4VpKIQwrlpMHY7Rxl830ql9b6kNe+2Juc=";
+  };
+
+  propagatedBuildInputs = [
+    google-auth
+    google-crc32c
+  ];
+
+  passthru.optional-dependencies = {
+    requests = [
+      requests
+    ];
+    aiohttp = [
+      aiohttp
+    ];
+  };
+
+  nativeCheckInputs = [
+    google-cloud-testutils
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.requests;
+
+  preCheck = ''
+    # prevent shadowing imports
+    rm -r google
+    # fixture 'authorized_transport' not found
+    rm tests/system/requests/test_upload.py
+    # requires network
+    rm tests/system/requests/test_download.py
+  '';
+
+  pythonImportsCheck = [
+    "google._async_resumable_media"
+    "google.resumable_media"
+  ];
+
+  meta = with lib; {
+    description = "Utilities for Google Media Downloads and Resumable Uploads";
+    homepage = "https://github.com/GoogleCloudPlatform/google-resumable-media-python";
+    changelog = "https://github.com/googleapis/google-resumable-media-python/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google-search-results/default.nix b/nixpkgs/pkgs/development/python-modules/google-search-results/default.nix
new file mode 100644
index 000000000000..9130ad9ddb05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google-search-results/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "google-search-results";
+  version = "2.4.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit version;
+    pname = builtins.replaceStrings [ "-" ] [ "_" ] pname;
+    hash = "sha256-YDow7K4q+OYAsiY1dXpt8nXa1Lk0+XXmeHjM1kC3gkU=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # almost all tests require an API key or network access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "serpapi"
+  ];
+
+  meta = with lib; {
+    description = "Scrape and search localized results from Google, Bing, Baidu, Yahoo, Yandex, Ebay, Homedepot, youtube at scale using SerpApi.com";
+    homepage = "https://github.com/serpapi/google-search-results-python";
+    changelog = "https://github.com/serpapi/google-search-results-python/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/google/default.nix b/nixpkgs/pkgs/development/python-modules/google/default.nix
new file mode 100644
index 000000000000..7dc34933d452
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/google/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, beautifulsoup4
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "google";
+  version = "3.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-FDUwEi7lEwUJrV6YnwUS98shiy1O3br7rUD9EOjYzL4=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "googlesearch"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings to the Google search engine";
+    homepage = "https://pypi.org/project/google/";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/googleapis-common-protos/default.nix b/nixpkgs/pkgs/development/python-modules/googleapis-common-protos/default.nix
new file mode 100644
index 000000000000..64dc4d2c7182
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/googleapis-common-protos/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, grpc
+, protobuf
+}:
+
+buildPythonPackage rec {
+  pname = "googleapis-common-protos";
+  version = "1.60.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5z67QECY20BbqV0eGuCqkcPhWnHaAxou62suI+e8Nwg=";
+  };
+
+  propagatedBuildInputs = [ grpc protobuf ];
+
+  # does not contain tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "google.api"
+    "google.logging"
+    "google.longrunning"
+    "google.rpc"
+    "google.type"
+  ];
+
+  meta = with lib; {
+    description = "Common protobufs used in Google APIs";
+    homepage = "https://github.com/googleapis/python-api-common-protos";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/googlemaps/default.nix b/nixpkgs/pkgs/development/python-modules/googlemaps/default.nix
new file mode 100644
index 000000000000..d2e67e4676e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/googlemaps/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-cov
+, pytestCheckHook
+, pythonOlder
+, requests
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "googlemaps";
+  version = "4.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "googlemaps";
+    repo = "google-maps-services-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-8oGZEMKUGaDHKq4qIZy10cbLNMmVclJnQE/dx877pNQ=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytest-cov
+    pytestCheckHook
+    responses
+  ];
+
+  disabledTests = [
+    # touches network
+    "test_elevation_along_path_single"
+    "test_transit_without_time"
+  ];
+
+  pythonImportsCheck = [
+    "googlemaps"
+  ];
+
+  meta = with lib; {
+    description = "Python client library for Google Maps API Web Services";
+    homepage = "https://github.com/googlemaps/google-maps-services-python";
+    changelog = "https://github.com/googlemaps/google-maps-services-python/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ Scriptkiddi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/googletrans/default.nix b/nixpkgs/pkgs/development/python-modules/googletrans/default.nix
new file mode 100644
index 000000000000..32b839ab11c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/googletrans/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchFromGitHub, requests }:
+
+buildPythonPackage rec {
+  pname = "googletrans";
+  version = "2.4.0";
+
+  src = fetchFromGitHub {
+    owner = "ssut";
+    repo = "py-googletrans";
+    rev = "v${version}";
+    sha256 = "0wzzinn0k9rfv9z1gmfk9l4kljyd4n6kizsjw4wjxv91kfhj92hz";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # majority of tests just try to ping Google's Translate API endpoint
+  doCheck = false;
+
+  pythonImportsCheck = [ "googletrans" ];
+
+  meta = with lib; {
+    description = "Googletrans is python library to interact with Google Translate API";
+    homepage = "https://py-googletrans.readthedocs.io";
+    license = licenses.mit;
+    maintainers = with maintainers; [ unode ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gorilla/default.nix b/nixpkgs/pkgs/development/python-modules/gorilla/default.nix
new file mode 100644
index 000000000000..22e71df32451
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gorilla/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi}:
+
+buildPythonPackage rec {
+  pname = "gorilla";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "005ab8853b037162a7c77bb824604c6e081878ee03c09ad01ef41744856019d3";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/christophercrouzet/gorilla";
+    description = "Convenient approach to monkey patching";
+    license = licenses.mit;
+    maintainers = with maintainers; [ tbenst ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gotenberg-client/default.nix b/nixpkgs/pkgs/development/python-modules/gotenberg-client/default.nix
new file mode 100644
index 000000000000..751d0b742787
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gotenberg-client/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, hatchling
+, httpx
+, typing-extensions
+}:
+buildPythonPackage rec {
+  pname = "gotenberg-client";
+  version = "0.3.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "stumpylog";
+    repo = "gotenberg-client";
+    rev = "refs/tags/${version}";
+    hash = "sha256-xgkpVvklZrew+XOoqFKcbuDsTVfDda67R6YIxR3kzS8=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    typing-extensions
+  ] ++ httpx.optional-dependencies.http2;
+
+  pythonImportsCheck = [
+    "gotenberg_client"
+  ];
+
+  meta = with lib; {
+    description = "A Python client for interfacing with the Gotenberg API";
+    homepage = "https://github.com/stumpylog/gotenberg-client";
+    changelog = "https://github.com/stumpylog/gotenberg-client/blob/${version}/CHANGELOG.md";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ leona ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/govee-ble/default.nix b/nixpkgs/pkgs/development/python-modules/govee-ble/default.nix
new file mode 100644
index 000000000000..354a1569b002
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/govee-ble/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, bluetooth-data-tools
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, fetchFromGitHub
+, home-assistant-bluetooth
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "govee-ble";
+  version = "0.24.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-uuC7CVf/KKr36mvd0TqNJd2OtK/xshCGYJXEtllE9is=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-data-tools
+    bluetooth-sensor-state-data
+    home-assistant-bluetooth
+    sensor-state-data
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=govee_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "govee_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for Govee BLE devices";
+    homepage = "https://github.com/Bluetooth-Devices/govee-ble";
+    changelog = "https://github.com/bluetooth-devices/govee-ble/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/goveelights/default.nix b/nixpkgs/pkgs/development/python-modules/goveelights/default.nix
new file mode 100644
index 000000000000..254ae57d32f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/goveelights/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "goveelights";
+  version = "0.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-A7tfY+aFzhfruCZ43usj1/CsTejbPMzHM8SYrY/TU1s=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "goveelights"
+  ];
+
+  meta = with lib; {
+    description = "Python module for interacting with the Govee API";
+    homepage = "https://github.com/arcanearronax/govee_lights";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gpapi/default.nix b/nixpkgs/pkgs/development/python-modules/gpapi/default.nix
new file mode 100644
index 000000000000..6c2454dbbfeb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gpapi/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage
+, cryptography
+, fetchPypi
+, lib
+, pythonOlder
+, protobuf
+, pycryptodome
+, requests
+}:
+
+buildPythonPackage rec {
+  version = "0.4.4";
+  pname = "gpapi";
+  disabled = pythonOlder "3.3"; # uses shutil.which(), added in 3.3
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "0ampvsv97r3hy1cakif4kmyk1ynf3scbvh4fbk02x7xrxn4kl38w";
+  };
+
+  # package doesn't contain unit tests
+  # scripts in ./test require networking
+  doCheck = false;
+
+  pythonImportsCheck = [ "gpapi.googleplay" ];
+
+  propagatedBuildInputs = [ cryptography protobuf pycryptodome requests ];
+
+  meta = with lib; {
+    homepage = "https://github.com/NoMore201/googleplay-api";
+    license = licenses.gpl3Only;
+    description = "Google Play Unofficial Python API";
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gpaw/SetupPath.patch b/nixpkgs/pkgs/development/python-modules/gpaw/SetupPath.patch
new file mode 100644
index 000000000000..e13389429f72
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gpaw/SetupPath.patch
@@ -0,0 +1,18 @@
+diff --git a/gpaw/__init__.py b/gpaw/__init__.py
+index b5c029e13..518c16b13 100644
+--- a/gpaw/__init__.py
++++ b/gpaw/__init__.py
+@@ -201,12 +201,7 @@ def initialize_data_paths():
+     try:
+         setup_paths[:0] = os.environ['GPAW_SETUP_PATH'].split(os.pathsep)
+     except KeyError:
+-        if len(setup_paths) == 0:
+-            if os.pathsep == ';':
+-                setup_paths[:] = [r'C:\gpaw-setups']
+-            else:
+-                setup_paths[:] = ['/usr/local/share/gpaw-setups',
+-                                  '/usr/share/gpaw-setups']
++        setup_paths[:0] = ["@gpawSetupPath@"]
+ 
+ 
+ read_rc_file()
diff --git a/nixpkgs/pkgs/development/python-modules/gpaw/default.nix b/nixpkgs/pkgs/development/python-modules/gpaw/default.nix
new file mode 100644
index 000000000000..e359c78c66f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gpaw/default.nix
@@ -0,0 +1,128 @@
+{ buildPythonPackage
+, lib
+, fetchFromGitLab
+, writeTextFile
+, fetchurl
+, blas
+, lapack
+, mpi
+, scalapack
+, libxc
+, libvdwxc
+, which
+, ase
+, numpy
+, scipy
+, pyyaml
+, inetutils
+}:
+
+assert lib.asserts.assertMsg (!blas.isILP64)
+  "A 32 bit integer implementation of BLAS is required.";
+
+assert lib.asserts.assertMsg (!lapack.isILP64)
+  "A 32 bit integer implementation of LAPACK is required.";
+
+let
+  gpawConfig = writeTextFile {
+    name = "siteconfig.py";
+    text = ''
+      # Compiler
+      compiler = 'gcc'
+      mpicompiler = '${mpi}/bin/mpicc'
+      mpilinker = '${mpi}/bin/mpicc'
+
+      # BLAS
+      libraries += ['blas']
+      library_dirs += ['${blas}/lib']
+
+      # FFTW
+      fftw = True
+      if fftw:
+        libraries += ['fftw3']
+
+      scalapack = True
+      if scalapack:
+        libraries += ['scalapack']
+
+      # LibXC
+      libxc = True
+      if libxc:
+        xc = '${libxc}/'
+        include_dirs += [xc + 'include']
+        library_dirs += [xc + 'lib/']
+        extra_link_args += ['-Wl,-rpath={xc}/lib'.format(xc=xc)]
+        if 'xc' not in libraries:
+          libraries.append('xc')
+
+      # LibVDWXC
+      libvdwxc = True
+      if libvdwxc:
+        vdwxc = '${libvdwxc}/'
+        extra_link_args += ['-Wl,-rpath=%s/lib' % vdwxc]
+        library_dirs += ['%s/lib' % vdwxc]
+        include_dirs += ['%s/include' % vdwxc]
+        libraries += ['vdwxc']
+    '';
+  };
+
+  setupVersion = "0.9.20000";
+  pawDataSets = fetchurl {
+    url = "https://wiki.fysik.dtu.dk/gpaw-files/gpaw-setups-${setupVersion}.tar.gz";
+    sha256 = "07yldxnn38gky39fxyv3rfzag9p4lb0xfpzn15wy2h9aw4mnhwbc";
+  };
+
+in buildPythonPackage rec {
+  pname = "gpaw";
+  version = "23.9.1";
+
+  src = fetchFromGitLab {
+    owner = "gpaw";
+    repo = pname;
+    rev = version;
+    hash = "sha256-9nnK4ksTFATO6HexnxfMiih/yoY/noyJZXZOaDG/2kc=";
+  };
+
+  # `inetutils` is required because importing `gpaw`, as part of
+  # pythonImportsCheck, tries to execute its binary, which in turn tries to
+  # execute `rsh` as a side-effect.
+  nativeBuildInputs = [ which inetutils ];
+
+  buildInputs = [ blas scalapack libxc libvdwxc ];
+
+  propagatedBuildInputs = [ ase scipy numpy mpi pyyaml ];
+
+  patches = [ ./SetupPath.patch ];
+
+  postPatch = ''
+    substituteInPlace gpaw/__init__.py \
+      --subst-var-by gpawSetupPath "$out/share/gpaw/gpaw-setups-${setupVersion}"
+  '';
+
+  preConfigure = ''
+    unset CC
+    cp ${gpawConfig} siteconfig.py
+  '';
+
+  postInstall = ''
+    currDir=$(pwd)
+    mkdir -p $out/share/gpaw && cd $out/share/gpaw
+    cp ${pawDataSets} gpaw-setups.tar.gz
+    tar -xvf $out/share/gpaw/gpaw-setups.tar.gz
+    rm gpaw-setups.tar.gz
+    cd $currDir
+  '';
+
+  doCheck = false; # Requires MPI runtime to work in the sandbox
+  pythonImportsCheck = [ "gpaw" ];
+
+  passthru = { inherit mpi; };
+
+  meta = with lib; {
+    description = "Density functional theory and beyond within the projector-augmented wave method";
+    homepage = "https://wiki.fysik.dtu.dk/gpaw/index.html";
+    license = licenses.gpl3Only;
+    platforms = platforms.unix;
+    maintainers = [ maintainers.sheepforce ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gphoto2/default.nix b/nixpkgs/pkgs/development/python-modules/gphoto2/default.nix
new file mode 100644
index 000000000000..6ea7744cab6d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gphoto2/default.nix
@@ -0,0 +1,39 @@
+{ lib, fetchPypi, fetchpatch, buildPythonPackage
+, pkg-config
+, libgphoto2
+, setuptools
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "gphoto2";
+  version = "2.5.0";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-l9B6PEIGf8rkUlYApOytW2s9OhgcxMHVlDgfQR5ZnoA=";
+  };
+
+  # only convert first 2 values from setuptools_version to ints to avoid
+  # parse errors if last value is a string.
+  patches = fetchpatch {
+    url = "https://github.com/jim-easterbrook/python-gphoto2/commit/d388971b63fea831eb986d2212d4828c6c553235.patch";
+    hash = "sha256-EXtXlhBx2jCKtMl7HmN87liqiHVAFSeXr11y830AlpY=";
+  };
+
+  nativeBuildInputs = [ pkg-config setuptools toml ];
+
+  buildInputs = [ libgphoto2 ];
+
+  doCheck = false; # No tests available
+
+  pythonImportsCheck = [ "gphoto2" ];
+
+  meta = with lib; {
+    description = "Python interface to libgphoto2";
+    homepage = "https://github.com/jim-easterbrook/python-gphoto2";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gpib-ctypes/default.nix b/nixpkgs/pkgs/development/python-modules/gpib-ctypes/default.nix
new file mode 100644
index 000000000000..42c07a9ef421
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gpib-ctypes/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, pytestCheckHook
+, linux-gpib
+}:
+
+buildPythonPackage rec {
+  pname = "gpib-ctypes";
+  version = "0.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "gpib_ctypes";
+    inherit version;
+    hash = "sha256-c9l6TNmM4PtbvopnnFi5R1dQ9o3MI39BHHHPSGqfjCY=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace gpib_ctypes/gpib/gpib.py \
+      --replace "libgpib.so.0" "${linux-gpib}/lib/libgpib.so.0"
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'," ""
+  '';
+
+  pythonImportsCheck = [
+    "gpib_ctypes.gpib"
+  ];
+
+  meta = with lib; {
+    description = "Cross-platform Python bindings for the NI GPIB and linux-gpib C interfaces";
+    homepage = "https://github.com/tivek/gpib_ctypes/";
+    changelog = "https://github.com/tivek/gpib_ctypes/blob/${version}/HISTORY.rst";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ fsagbuya ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gpiozero/default.nix b/nixpkgs/pkgs/development/python-modules/gpiozero/default.nix
new file mode 100644
index 000000000000..929ce0e24f5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gpiozero/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, sphinx-rtd-theme
+, sphinxHook
+, colorzero
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "gpiozero";
+  version = "2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "gpiozero";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-6qSB9RMypNXNj+Ds1nyzB7iaeHXvF0swSubrJSn2L34=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --cov" ""
+  '';
+
+  outputs = [
+    "out"
+    "doc"
+  ];
+
+  nativeBuildInputs = [
+    sphinx-rtd-theme
+    sphinxHook
+  ];
+
+  propagatedBuildInputs = [
+    colorzero
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "gpiozero"
+    "gpiozero.tools"
+  ];
+
+  disabledTests = [
+    # https://github.com/gpiozero/gpiozero/issues/1087
+    "test_spi_hardware_write"
+  ];
+
+  meta = with lib; {
+    description = "A simple interface to GPIO devices with Raspberry Pi";
+    homepage = "https://github.com/gpiozero/gpiozero";
+    changelog = "https://github.com/gpiozero/gpiozero/blob/v${version}/docs/changelog.rst";
+    license = licenses.bsd3;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gplaycli/default.nix b/nixpkgs/pkgs/development/python-modules/gplaycli/default.nix
new file mode 100644
index 000000000000..769670edf433
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gplaycli/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, args
+, buildPythonPackage
+, clint
+, fetchFromGitHub
+, libffi
+, matlink-gpapi
+, ndg-httpsclient
+, protobuf
+, pyasn1
+, pyaxmlparser
+, pytestCheckHook
+, pythonOlder
+, requests
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "gplaycli";
+  version = "3.29";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "matlink";
+    repo = "gplaycli";
+    rev = "refs/tags/${version}";
+    hash = "sha256-uZBrIxnDSaJDOPcD7J4SCPr9nvecDDR9h+WnIjIP7IE=";
+  };
+
+  propagatedBuildInputs = [
+    libffi
+    pyasn1
+    clint
+    ndg-httpsclient
+    protobuf
+    requests
+    args
+    matlink-gpapi
+    pyaxmlparser
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "gplaycli"
+  ];
+
+  preCheck = ''
+    export PATH="$PATH:$out/bin";
+  '';
+
+  disabledTests = [
+    "test_alter_token"
+    "test_another_device"
+    "test_connection_credentials"
+    "test_connection_token"
+    "test_download_additional_files"
+    "test_download_focus"
+    "test_download_version"
+    "test_download"
+    "test_search"
+    "test_update"
+  ];
+
+  meta = with lib; {
+    description = "Google Play Downloader via Command line";
+    homepage = "https://github.com/matlink/gplaycli";
+    changelog = "https://github.com/matlink/gplaycli/releases/tag/${version}";
+    license = licenses.agpl3Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gprof2dot/default.nix b/nixpkgs/pkgs/development/python-modules/gprof2dot/default.nix
new file mode 100644
index 000000000000..cd0ef5b174a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gprof2dot/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, python
+, graphviz
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gprof2dot";
+  version = "2022.07.29";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jrfonseca";
+    repo = "gprof2dot";
+    rev = "refs/tags/${version}";
+    hash = "sha256-nIsBO6KTyG2VZZRXrkU/T/a9Ki1x6hda5Vv3rZv/mJM=";
+  };
+
+  makeWrapperArgs = [
+    "--prefix PATH : ${lib.makeBinPath [ graphviz ]}"
+  ];
+
+  # Needed so dot is on path of the test script
+  nativeCheckInputs = [
+    graphviz
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    # if options not specified, will use unwrapped gprof2dot from original source
+    ${python.interpreter} tests/test.py --python bash --gprof2dot $out/bin/gprof2dot
+
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Python script to convert the output from many profilers into a dot graph";
+    homepage = "https://github.com/jrfonseca/gprof2dot";
+    changelog = "https://github.com/jrfonseca/gprof2dot/releases/tag/${version}";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ pmiddend ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gps3/default.nix b/nixpkgs/pkgs/development/python-modules/gps3/default.nix
new file mode 100644
index 000000000000..95e1c136031e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gps3/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "gps3";
+  version = "unstable-2017-11-01";
+
+  src = fetchFromGitHub {
+    owner = "wadda";
+    repo = pname;
+    rev = "91adcd7073b891b135b2a46d039ce2125cf09a09";
+    hash = "sha256-sVK61l8YunKAGFTSAq/m5aUGFfnizwhqTYbdznBIKfk=";
+  };
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "gps3" ];
+
+  meta = with lib; {
+    description = "Python client for GPSD";
+    homepage = "https://github.com/wadda/gps3";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gpsoauth/default.nix b/nixpkgs/pkgs/development/python-modules/gpsoauth/default.nix
new file mode 100644
index 000000000000..3a1707a4676f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gpsoauth/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pycryptodomex
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  version = "1.0.2";
+  pname = "gpsoauth";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-68rnLrMlp/BsvqlbnV5kvsJTcDEtsV6OLkbE1U5ynno=";
+  };
+
+  propagatedBuildInputs = [ pycryptodomex requests ];
+
+  # upstream tests are not very comprehensive
+  doCheck = false;
+
+  pythonImportsCheck = [ "gpsoauth" ];
+
+  meta = with lib; {
+    description = "Library for Google Play Services OAuth";
+    homepage = "https://github.com/simon-weber/gpsoauth";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jgillich ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gpt-2-simple/default.nix b/nixpkgs/pkgs/development/python-modules/gpt-2-simple/default.nix
new file mode 100644
index 000000000000..f627ead49d0a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gpt-2-simple/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub, regex, requests, tqdm, numpy
+, toposort, tensorflow }:
+
+buildPythonPackage rec {
+  pname = "gpt-2-simple";
+  version = "0.8.1";
+
+  src = fetchFromGitHub {
+    owner = "minimaxir";
+    repo = "gpt-2-simple";
+    rev = "v${version}";
+    hash = "sha256-WwD4sDcc28zXEOISJsq8e+rgaNrrgIy79Wa4J3E7Ovc=";
+  };
+
+  propagatedBuildInputs = [ regex requests tqdm numpy toposort tensorflow ];
+
+  dontCheck = true; # no tests in upstream
+
+  meta = with lib; {
+    description =
+      "Easily retrain OpenAI's GPT-2 text-generating model on new texts";
+    homepage = "https://github.com/minimaxir/gpt-2-simple";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ckie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gptcache/default.nix b/nixpkgs/pkgs/development/python-modules/gptcache/default.nix
new file mode 100644
index 000000000000..ea2c09eed4a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gptcache/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cachetools
+, numpy
+, pythonOlder
+, redis
+, redis-om
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "gptcache";
+  version = "0.1.42";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8.1";
+
+  src = fetchFromGitHub {
+    owner = "zilliztech";
+    repo = "GPTCache";
+    rev = "refs/tags/${version}";
+    hash = "sha256-rrPs5ZwBooltVcvrs4AHObx69xmZ8F+IP/lJGPVTNXY=";
+  };
+
+  propagatedBuildInputs = [
+    cachetools
+    numpy
+    redis
+    redis-om
+    requests
+  ];
+
+  # many tests require network access and complicated dependencies
+  doCheck = false;
+
+  pythonImportsCheck = [ "gptcache" ];
+
+  meta = with lib; {
+    description = "Semantic cache for LLMs and fully integrated with LangChain and llama_index";
+    homepage = "https://github.com/zilliztech/GPTCache";
+    changelog = "https://github.com/zilliztech/GPTCache/releases/tag/${src.rev}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gpustat/default.nix b/nixpkgs/pkgs/development/python-modules/gpustat/default.nix
new file mode 100644
index 000000000000..8952e84c5c12
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gpustat/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, blessed
+, buildPythonPackage
+, fetchPypi
+, mockito
+, nvidia-ml-py
+, psutil
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "gpustat";
+  version = "1.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wY0+1VGPwWMAxC1pTevHCuuzvlXK6R8dtk1jtfqK+dg=";
+  };
+
+  pythonRelaxDeps = [
+    "nvidia-ml-py"
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    blessed
+    nvidia-ml-py
+    psutil
+  ];
+
+  nativeCheckInputs = [
+    mockito
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "gpustat"
+  ];
+
+  meta = with lib; {
+    description = "A simple command-line utility for querying and monitoring GPU status";
+    homepage = "https://github.com/wookayin/gpustat";
+    changelog = "https://github.com/wookayin/gpustat/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ billhuang ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gpxpy/default.nix b/nixpkgs/pkgs/development/python-modules/gpxpy/default.nix
new file mode 100644
index 000000000000..96c969c520bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gpxpy/default.nix
@@ -0,0 +1,28 @@
+{ lib, fetchFromGitHub, buildPythonPackage, python, lxml, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "gpxpy";
+  version = "1.5.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "tkrajina";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Fkl2dte1WkPi2hBOdT23BMfNflR0j4GeNH86d46WNQk=";
+  };
+
+  propagatedBuildInputs = [ lxml ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest test
+  '';
+
+  meta = with lib; {
+    description = "Python GPX (GPS eXchange format) parser";
+    homepage = "https://github.com/tkrajina/gpxpy";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ sikmir ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gpy/default.nix b/nixpkgs/pkgs/development/python-modules/gpy/default.nix
new file mode 100644
index 000000000000..b6e4b4910e24
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gpy/default.nix
@@ -0,0 +1,53 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, numpy
+, scipy
+, six
+, paramz
+, matplotlib
+, cython
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "GPy";
+  version = "1.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a2b793ef8d0ac71739e7ba1c203bc8a5afa191058b42caa617e0e29aa52aa6fb";
+  };
+
+  buildInputs = [ cython ];
+  propagatedBuildInputs = [ numpy scipy six paramz matplotlib ];
+  nativeCheckInputs = [ nose ];
+
+  # $ nosetests GPy/testing/*.py
+  # => Ran 483 tests in 112.146s (on 8 cores)
+  # So instead, run shorter set of tests
+  checkPhase = ''
+    nosetests GPy/testing/linalg_test.py
+  '';
+
+  # Rebuild cython-generated .c files since the included
+  # ones were built with an older version of cython that is
+  # incompatible with python3.9
+  preBuild = ''
+    for fn in $(find . -name '*.pyx'); do
+      echo $fn | sed 's/\.\.pyx$/\.c/' | xargs ${cython}/bin/cython -3
+    done
+  '';
+
+  pythonImportsCheck = [
+    "GPy"
+  ];
+
+  meta = with lib; {
+    description = "Gaussian process framework in Python";
+    homepage = "https://sheffieldml.github.io/GPy";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bcdarwin ];
+    broken = stdenv.isDarwin;  # See inscrutable error message here: https://github.com/NixOS/nixpkgs/pull/107653#issuecomment-751527547
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gpytorch/default.nix b/nixpkgs/pkgs/development/python-modules/gpytorch/default.nix
new file mode 100644
index 000000000000..1fea3699d9f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gpytorch/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, linear_operator
+, scikit-learn
+, setuptools
+, setuptools-scm
+, wheel
+, torch
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "gpytorch";
+  version = "1.11";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "cornellius-gp";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-cpkfjx5G/4duL1Rr4nkHTHi03TDcYbcx3bKP2Ny7Ijo=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    linear_operator
+    scikit-learn
+    torch
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "gpytorch" ];
+
+  disabledTests = [
+    # AssertionError on number of warnings emitted
+    "test_deprecated_methods"
+    # flaky numerical tests
+    "test_classification_error"
+    "test_matmul_matrix_broadcast"
+    # https://github.com/cornellius-gp/gpytorch/issues/2396
+    "test_t_matmul_matrix"
+  ];
+
+  meta = with lib; {
+    description = "A highly efficient and modular implementation of Gaussian Processes, with GPU acceleration";
+    homepage = "https://gpytorch.ai";
+    license = licenses.mit;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gql/default.nix b/nixpkgs/pkgs/development/python-modules/gql/default.nix
new file mode 100644
index 000000000000..9827f8d5a71a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gql/default.nix
@@ -0,0 +1,131 @@
+{ lib
+, aiofiles
+, aiohttp
+, backoff
+, botocore
+, buildPythonPackage
+, fetchFromGitHub
+, graphql-core
+, mock
+, parse
+, pytest-asyncio
+, pytest-console-scripts
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-toolbelt
+, urllib3
+, vcrpy
+, websockets
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "gql";
+  version = "3.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "graphql-python";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-/uPaRju2AJCjMCfA29IKQ4Hu71RBu/Yz8jHwk9EE1Eg=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace \
+      "websockets>=10,<11;python_version>'3.6'" \
+      "websockets>=10,<12;python_version>'3.6'"
+  '';
+
+  propagatedBuildInputs = [
+    backoff
+    graphql-core
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aiofiles
+    mock
+    parse
+    pytest-asyncio
+    pytest-console-scripts
+    pytestCheckHook
+    vcrpy
+  ] ++ passthru.optional-dependencies.all;
+
+  passthru.optional-dependencies = {
+    all = [
+      aiohttp
+      botocore
+      requests
+      requests-toolbelt
+      urllib3
+      websockets
+    ];
+    aiohttp = [
+      aiohttp
+    ];
+    requests = [
+      requests
+      requests-toolbelt
+      urllib3
+    ];
+    websockets = [
+      websockets
+    ];
+    botocore = [
+      botocore
+    ];
+  };
+
+  preCheck = ''
+    export PATH=$out/bin:$PATH
+  '';
+
+  pytestFlagsArray = [
+    "--asyncio-mode=auto"
+  ];
+
+  disabledTests = [
+    # Tests requires network access
+    "test_execute_result_error"
+    "test_http_transport"
+  ];
+
+  disabledTestPaths = [
+    # Exclude linter tests
+    "gql-checker/tests/test_flake8_linter.py"
+    "gql-checker/tests/test_pylama_linter.py"
+    # Tests require network access
+    "tests/custom_scalars/test_money.py"
+    "tests/test_aiohttp.py"
+    "tests/test_appsync_http.py"
+    "tests/test_appsync_websockets.py"
+    "tests/test_async_client_validation.py"
+    "tests/test_graphqlws_exceptions.py"
+    "tests/test_graphqlws_subscription.py"
+    "tests/test_phoenix_channel_exceptions.py"
+    "tests/test_phoenix_channel_exceptions.py"
+    "tests/test_phoenix_channel_query.py"
+    "tests/test_phoenix_channel_subscription.py"
+    "tests/test_requests.py"
+    "tests/test_websocket_exceptions.py"
+    "tests/test_websocket_query.py"
+    "tests/test_websocket_subscription.py"
+  ];
+
+  pythonImportsCheck = [
+    "gql"
+  ];
+
+  meta = with lib; {
+    description = "GraphQL client in Python";
+    homepage = "https://github.com/graphql-python/gql";
+    changelog = "https://github.com/graphql-python/gql/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/grad-cam/default.nix b/nixpkgs/pkgs/development/python-modules/grad-cam/default.nix
new file mode 100644
index 000000000000..8636a71ecdce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grad-cam/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, matplotlib
+, numpy
+, opencv4
+, pillow
+, scikit-learn
+, torch
+, torchvision
+, ttach
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "grad-cam";
+  version = "1.4.8";
+  disabled = pythonOlder "3.6";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BNcwDaEEmRsEoJ4nvvGfjZ9LdG0eRqZCFuY5/Gmp5N4=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt --replace "opencv-python" "opencv"
+  '';
+
+  propagatedBuildInputs = [
+    matplotlib
+    numpy
+    opencv4
+    pillow
+    scikit-learn
+    torchvision
+    ttach
+    tqdm
+  ];
+
+  # Let the user bring their own instance (as with torchmetrics)
+  buildInputs = [
+    torch
+  ];
+
+  doCheck = false;  # every nontrivial test tries to download a pretrained model
+
+  pythonImportsCheck = [
+    "pytorch_grad_cam"
+    "pytorch_grad_cam.metrics"
+    "pytorch_grad_cam.metrics.cam_mult_image"
+    "pytorch_grad_cam.metrics.road"
+    "pytorch_grad_cam.utils"
+    "pytorch_grad_cam.utils.image"
+    "pytorch_grad_cam.utils.model_targets"
+  ];
+
+  meta = with lib; {
+    description = "Advanced AI explainability for computer vision.";
+    homepage = "https://jacobgil.github.io/pytorch-gradcam-book";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gradient-utils/default.nix b/nixpkgs/pkgs/development/python-modules/gradient-utils/default.nix
new file mode 100644
index 000000000000..3d3cd47cf41e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gradient-utils/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hyperopt
+, mock
+, numpy
+, poetry-core
+, prometheus-client
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "gradient-utils";
+  version = "0.5.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Paperspace";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-swnl0phdOsBSP8AX/OySI/aYI9z60Ss3SsJox/mb9KY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    hyperopt
+    prometheus-client
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    mock
+    requests
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # https://github.com/Paperspace/gradient-utils/issues/68
+    # https://github.com/Paperspace/gradient-utils/issues/72
+    substituteInPlace pyproject.toml \
+      --replace 'wheel = "^0.35.1"' 'wheel = "*"' \
+      --replace 'prometheus-client = ">=0.8,<0.10"' 'prometheus-client = "*"' \
+      --replace 'pymongo = "^3.11.0"' 'pymongo = ">=3.11.0"'
+  '';
+
+  preCheck = ''
+    export HOSTNAME=myhost-experimentId
+  '';
+
+  disabledTestPaths = [
+    # Requires a working Prometheus push gateway
+    "tests/integration/test_metrics.py"
+  ];
+
+  pythonImportsCheck = [
+    "gradient_utils"
+  ];
+
+  meta = with lib; {
+    description = "Python utils and helpers library for Gradient";
+    homepage = "https://github.com/Paperspace/gradient-utils";
+    license = licenses.mit;
+    maintainers = with maintainers; [ freezeboy ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gradient/default.nix b/nixpkgs/pkgs/development/python-modules/gradient/default.nix
new file mode 100644
index 000000000000..7d6148616e0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gradient/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, attrs
+, boto3
+, buildPythonPackage
+, click-completion
+, click-didyoumean
+, click-help-colors
+, colorama
+, fetchPypi
+, gradient_statsd
+, gradient-utils
+, gql
+, halo
+, marshmallow
+, progressbar2
+, pyopenssl
+, pyyaml
+, requests
+, requests-toolbelt
+, terminaltables
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "gradient";
+  version = "2.0.6";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-pqyyNzx2YPP3qmWQbzGd3q2HzCkrWlIVSJZeFrGm9dk=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'attrs<=' 'attrs>=' \
+      --replace 'colorama==' 'colorama>=' \
+      --replace 'gql[requests]==3.0.0a6' 'gql' \
+      --replace 'PyYAML==5.*' 'PyYAML' \
+      --replace 'marshmallow<' 'marshmallow>=' \
+      --replace 'websocket-client==0.57.*' 'websocket-client'
+  '';
+
+  propagatedBuildInputs = [
+    attrs
+    boto3
+    click-completion
+    click-didyoumean
+    click-help-colors
+    colorama
+    gql
+    gradient_statsd
+    gradient-utils
+    halo
+    marshmallow
+    progressbar2
+    pyopenssl
+    pyyaml
+    requests
+    requests-toolbelt
+    terminaltables
+    websocket-client
+  ];
+
+  # Tries to use /homeless-shelter to mimic container usage, etc
+  doCheck = false;
+
+  # marshmallow.exceptions.StringNotCollectionError: "only" should be a collection of strings.
+  # Support for marshmallow > 3
+  # pythonImportsCheck = [
+  #   "gradient"
+  # ];
+
+  meta = with lib; {
+    description = "The command line interface for Gradient";
+    homepage = "https://github.com/Paperspace/gradient-cli";
+    license = licenses.isc;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ thoughtpolice ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gradient_statsd/default.nix b/nixpkgs/pkgs/development/python-modules/gradient_statsd/default.nix
new file mode 100644
index 000000000000..d7c5c258ab5e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gradient_statsd/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, certifi
+, chardet
+, datadog
+, decorator
+, fetchPypi
+, idna
+, requests
+, urllib3
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gradient-statsd";
+  version = "1.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "gradient_statsd";
+    inherit version;
+    hash = "sha256-iWlNX43ZtvU73wz4+8DgDulQNOnssJGxTBkvAaLj530=";
+  };
+
+  propagatedBuildInputs = [
+    certifi
+    chardet
+    datadog
+    decorator
+    idna
+    requests
+    urllib3
+  ];
+
+  pythonImportsCheck = [
+    "gradient_statsd"
+  ];
+
+  # Pypi does not contain tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Wrapper around the DogStatsd client";
+    homepage = "https://paperspace.com";
+    license = licenses.mit;
+    maintainers = with maintainers; [ freezeboy ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gradio/client.nix b/nixpkgs/pkgs/development/python-modules/gradio/client.nix
new file mode 100644
index 000000000000..ce866a67b4cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gradio/client.nix
@@ -0,0 +1,109 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pythonRelaxDepsHook
+# pyproject
+, hatchling
+, hatch-requirements-txt
+, hatch-fancy-pypi-readme
+# runtime
+, setuptools
+, fsspec
+, httpx
+, huggingface-hub
+, packaging
+, requests
+, typing-extensions
+, websockets
+# checkInputs
+, pytestCheckHook
+, pytest-asyncio
+, pydub
+, gradio
+}:
+
+let
+
+  # Cyclic dependencies are fun!
+  # This is gradio without gradio-client, only needed for checkPhase
+  gradio' = (gradio.override (old: {
+    gradio-client = null;
+  })).overridePythonAttrs (old: {
+    nativeBuildInputs = (old.nativeBuildInputs or []) ++ [ pythonRelaxDepsHook ];
+    pythonRemoveDeps = (old.pythonRemoveDeps or []) ++ [ "gradio_client" ];
+    doInstallCheck = false;
+    doCheck = false;
+    pythonImportsCheck = null;
+  });
+
+in
+
+buildPythonPackage rec {
+  pname = "gradio_client";
+  version = "0.5.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  # no tests on pypi
+  src = fetchFromGitHub {
+    owner = "gradio-app";
+    repo = "gradio";
+    #rev = "refs/tags/v${gradio.version}";
+    rev = "ba4c6d9e65138c97062d1757d2a588c4fc449daa"; # v3.43.1 is not tagged...
+    sparseCheckout = [ "client/python" ];
+    hash = "sha256-savka4opyZKSWPeBqc2LZqvwVXLYIZz5dS1OWJSwvHo=";
+  };
+  prePatch = ''
+    cd client/python
+  '';
+
+  nativeBuildInputs = [
+    hatchling
+    hatch-requirements-txt
+    hatch-fancy-pypi-readme
+  ];
+
+  propagatedBuildInputs = [
+    setuptools # needed for 'pkg_resources'
+    fsspec
+    httpx
+    huggingface-hub
+    packaging
+    requests
+    typing-extensions
+    websockets
+  ];
+
+  nativeCheckInputs =[
+    pytestCheckHook
+    pytest-asyncio
+    pydub
+    gradio'
+  ];
+  disallowedReferences = [
+    gradio' # ensuring we don't propagate this intermediate build
+  ];
+
+  # Add a pytest hook skipping tests that access network, marking them as "Expected fail" (xfail).
+  preCheck = ''
+    export HOME=$TMPDIR
+    cat ${./conftest-skip-network-errors.py} >> test/conftest.py
+  '';
+
+  pytestFlagsArray = [
+    "test/"
+    #"-m" "not flaky" # doesn't work, even when advertised
+    #"-x" "-W" "ignore" # uncomment for debugging help
+  ];
+
+  pythonImportsCheck = [ "gradio_client" ];
+
+  meta = with lib; {
+    homepage = "https://www.gradio.app/";
+    description = "Lightweight library to use any Gradio app as an API";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ pbsds ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gradio/conftest-skip-network-errors.py b/nixpkgs/pkgs/development/python-modules/gradio/conftest-skip-network-errors.py
new file mode 100644
index 000000000000..4738de317552
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gradio/conftest-skip-network-errors.py
@@ -0,0 +1,57 @@
+# This is a pytest hook that skips tests that tries to access the network.
+# These tests will immediately fail, then get marked as "Expected fail" (xfail).
+
+from _pytest.runner import pytest_runtest_makereport as orig_pytest_runtest_makereport
+
+# We use BaseException to minimize the chance it gets caught and 'pass'ed
+class NixNetworkAccessDeniedError(BaseException):
+    pass
+
+def pytest_runtest_makereport(item, call):
+    """
+    Modifies test results after-the-fact. The function name is magic, see:
+    https://docs.pytest.org/en/7.1.x/reference/reference.html?highlight=pytest_runtest_makereport#std-hook-pytest_runtest_makereport
+    """
+
+    def iterate_exc_chain(exc: Exception):
+        """
+        Recurses through exception chain, yielding all exceptions
+        """
+        yield exc
+        if getattr(exc, "__context__", None) is not None:
+            yield from iterate_exc_chain(exc.__context__)
+        if getattr(exc, "__cause__", None) is not None:
+            yield from iterate_exc_chain(exc.__cause__)
+
+    tr = orig_pytest_runtest_makereport(item, call)
+    if call.excinfo is not None:
+        for exc in iterate_exc_chain(call.excinfo.value):
+            if isinstance(exc, NixNetworkAccessDeniedError):
+                tr.outcome, tr.wasxfail = 'skipped', "reason: Requires network access."
+            if isinstance(exc, FileNotFoundError):  # gradio specific
+                tr.outcome, tr.wasxfail = 'skipped', "reason: Pypi dist bad."
+    return tr
+
+# replace network access with exception
+
+def deny_network_access(*a, **kw):
+    raise NixNetworkAccessDeniedError
+
+import httpx
+import requests
+import socket
+import urllib
+import urllib3
+import websockets
+
+httpx.AsyncClient.get = deny_network_access
+httpx.AsyncClient.head = deny_network_access
+httpx.Request = deny_network_access
+requests.get = deny_network_access
+requests.head = deny_network_access
+requests.post = deny_network_access
+socket.socket.connect = deny_network_access
+urllib.request.Request = deny_network_access
+urllib.request.urlopen = deny_network_access
+urllib3.connection.HTTPSConnection._new_conn = deny_network_access
+websockets.connect = deny_network_access
diff --git a/nixpkgs/pkgs/development/python-modules/gradio/default.nix b/nixpkgs/pkgs/development/python-modules/gradio/default.nix
new file mode 100644
index 000000000000..19474d8d9fbf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gradio/default.nix
@@ -0,0 +1,174 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pythonRelaxDepsHook
+
+# pyproject
+, hatchling
+, hatch-requirements-txt
+, hatch-fancy-pypi-readme
+
+# runtime
+, setuptools
+, aiofiles
+, altair
+, fastapi
+, ffmpy
+, gradio-client
+, httpx
+, huggingface-hub
+, importlib-resources
+, jinja2
+, markupsafe
+, matplotlib
+, numpy
+, orjson
+, packaging
+, pandas
+, pillow
+, pydantic
+, python-multipart
+, pydub
+, pyyaml
+, requests
+, semantic-version
+, typing-extensions
+, uvicorn
+, websockets
+
+# check
+, pytestCheckHook
+, boto3
+, ffmpeg
+, ipython
+, pytest-asyncio
+, respx
+, scikit-image
+, torch
+, tqdm
+, transformers
+, vega-datasets
+}:
+
+buildPythonPackage rec {
+  pname = "gradio";
+  version = "3.44.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  # We use the Pypi release, as it provides prebuilt webui assets,
+  # and has more frequent releases compared to github tags
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3mXs9PwlzUo89VosBWtnsOzDQf/T22Yv7s5j6OLLp3M=";
+  };
+
+  # fix packaging.ParserSyntaxError, which can't handle comments
+  postPatch = ''
+    sed -ie "s/ #.*$//g" requirements*.txt
+  '';
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    hatchling
+    hatch-requirements-txt
+    hatch-fancy-pypi-readme
+  ];
+
+  propagatedBuildInputs = [
+    setuptools # needed for 'pkg_resources'
+    aiofiles
+    altair
+    fastapi
+    ffmpy
+    gradio-client
+    httpx
+    huggingface-hub
+    importlib-resources
+    jinja2
+    markupsafe
+    matplotlib
+    numpy
+    orjson
+    packaging
+    pandas
+    pillow
+    pydantic
+    python-multipart
+    pydub
+    pyyaml
+    requests
+    semantic-version
+    typing-extensions
+    uvicorn
+    websockets
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    boto3
+    ffmpeg
+    ipython
+    pytest-asyncio
+    respx
+    scikit-image
+    # shap is needed as well, but breaks too often
+    torch
+    tqdm
+    transformers
+    vega-datasets
+  ];
+
+  # Add a pytest hook skipping tests that access network, marking them as "Expected fail" (xfail).
+  # We additionally xfail FileNotFoundError, since the gradio devs often fail to upload test assets to pypi.
+  preCheck = ''
+    export HOME=$TMPDIR
+    cat ${./conftest-skip-network-errors.py} >> test/conftest.py
+  '';
+
+  disabledTests = [
+    # Actually broken
+    "test_mount_gradio_app"
+
+    # requires network, it caught our xfail exception
+    "test_error_analytics_successful"
+
+    # Flaky, tries to pin dependency behaviour. Sensitive to dep versions
+    # These error only affect downstream use of the check dependencies.
+    "test_no_color"
+    "test_in_interface_as_output"
+    "test_should_warn_url_not_having_version"
+
+    # Flaky, unknown reason
+    "test_in_interface"
+
+    # shap is too often broken in nixpkgs
+    "test_shapley_text"
+  ];
+  disabledTestPaths = [
+    # makes pytest freeze 50% of the time
+    "test/test_interfaces.py"
+  ];
+  pytestFlagsArray = [
+    "-x"  # abort on first failure
+    #"-m" "not flaky" # doesn't work, even when advertised
+    #"-W" "ignore" # uncomment for debugging help
+  ];
+
+  # check the binary works outside the build env
+  doInstallCheck = true;
+  postInstallCheck = ''
+    env --ignore-environment $out/bin/gradio environment >/dev/null
+  '';
+
+  pythonImportsCheck = [ "gradio" ];
+
+  meta = with lib; {
+    homepage = "https://www.gradio.app/";
+    description = "Python library for easily interacting with trained machine learning models";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ pbsds ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/grammalecte/default.nix b/nixpkgs/pkgs/development/python-modules/grammalecte/default.nix
new file mode 100644
index 000000000000..9aa3c4ffd031
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grammalecte/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+, bottle
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "grammalecte";
+  version = "2.1.1";
+
+  src = fetchurl {
+    url = "https://grammalecte.net/grammalecte/zip/Grammalecte-fr-v${version}.zip";
+    sha256 = "076jv3ywdgqqzg92bfbagc7ypy08xjq5zn4vgna6j9350fkfqhzn";
+  };
+
+  patchPhase = ''
+    runHook prePatch
+    substituteInPlace grammalecte-server.py --replace sys.version_info.major sys.version_info
+    runHook postPatch
+  '';
+
+  propagatedBuildInputs = [ bottle ];
+
+  sourceRoot = ".";
+
+  disabled = !isPy3k;
+
+  meta = {
+    description = "An open source grammar and typographic corrector for the French language";
+    homepage = "https://grammalecte.net";
+    license = lib.licenses.gpl3Only;
+    maintainers = with lib.maintainers; [ apeyroux ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/grandalf/default.nix b/nixpkgs/pkgs/development/python-modules/grandalf/default.nix
new file mode 100644
index 000000000000..1852364fbfe2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grandalf/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyparsing
+, future
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "grandalf";
+  version = "0.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bdcht";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-j2SvpQvDMfwoj2PAQSxzEIyIzzJ61Eb9wgetKyni6A4=";
+  };
+
+  propagatedBuildInputs = [
+    pyparsing
+    future
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  patches = [
+    ./no-setup-requires-pytestrunner.patch
+  ];
+
+  pythonImportsCheck = [
+    "grandalf"
+  ];
+
+  meta = with lib; {
+    description = "Module for experimentations with graphs and drawing algorithms";
+    homepage = "https://github.com/bdcht/grandalf";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ cmcdragonkai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/grandalf/no-setup-requires-pytestrunner.patch b/nixpkgs/pkgs/development/python-modules/grandalf/no-setup-requires-pytestrunner.patch
new file mode 100644
index 000000000000..80e12e246ebb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grandalf/no-setup-requires-pytestrunner.patch
@@ -0,0 +1,15 @@
+diff --git a/setup.py b/setup.py
+index 0470622..d574ceb 100755
+--- a/setup.py
++++ b/setup.py
+@@ -75,8 +75,8 @@ setup(
+     # your project is installed. For an analysis of "install_requires" vs pip's
+     # requirements files see:
+     # https://packaging.python.org/en/latest/requirements.html
+-    setup_requires=['pytest-runner',],
+-    tests_require=['pytest',],
++    setup_requires=[],
++    tests_require=['pytest','pytest-runner',],
+ 
+     install_requires=['pyparsing','future'],
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/graph-tool/default.nix b/nixpkgs/pkgs/development/python-modules/graph-tool/default.nix
new file mode 100644
index 000000000000..61545e3a2ec9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graph-tool/default.nix
@@ -0,0 +1,73 @@
+{ buildPythonPackage
+, lib
+, fetchurl
+
+, autoreconfHook
+, boost
+, cairomm
+, cgal
+, expat
+, gmp
+, gobject-introspection
+, gtk3
+, matplotlib
+, mpfr
+, numpy
+, pkg-config
+, pycairo
+, pygobject3
+, python
+, scipy
+, sparsehash
+}:
+
+buildPythonPackage rec {
+  pname = "graph-tool";
+  format = "other";
+  version = "2.45";
+
+  src = fetchurl {
+    url = "https://downloads.skewed.de/graph-tool/graph-tool-${version}.tar.bz2";
+    hash = "sha256-+S2nrM/aArKXke/k8LPtkzKfJyMq9NOvwHySQh7Ghmg=";
+  };
+
+  configureFlags = [
+    "--with-python-module-path=$(out)/${python.sitePackages}"
+    "--with-boost-libdir=${boost}/lib"
+    "--with-expat=${expat}"
+    "--with-cgal=${cgal}"
+    "--enable-openmp"
+  ];
+
+  enableParallelBuilding = true;
+
+  nativeBuildInputs = [
+    autoreconfHook
+    pkg-config
+  ];
+
+  # https://git.skewed.de/count0/graph-tool/-/wikis/installation-instructions#manual-compilation
+  propagatedBuildInputs = [
+    boost
+    cairomm
+    cgal
+    expat
+    gmp
+    gobject-introspection
+    gtk3
+    matplotlib
+    mpfr
+    numpy
+    pycairo
+    pygobject3
+    scipy
+    sparsehash
+  ];
+
+  meta = with lib; {
+    description = "Python module for manipulation and statistical analysis of graphs";
+    homepage = "https://graph-tool.skewed.de";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/grapheme/default.nix b/nixpkgs/pkgs/development/python-modules/grapheme/default.nix
new file mode 100644
index 000000000000..965b1a1d2197
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grapheme/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "grapheme";
+  version = "0.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1jiwc3w05c8kh22s3zk7a8km8na3plqc5zimb2qcyxxy3grbkhj4";
+  };
+
+  # Tests are no available on PyPI
+  # https://github.com/alvinlindstam/grapheme/issues/18
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "grapheme"
+  ];
+
+  meta = with lib; {
+    description = "Python package for grapheme aware string handling";
+    homepage = "https://github.com/alvinlindstam/grapheme";
+    license = licenses.mit;
+    maintainers = with maintainers; [ creator54 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/graphene-django/default.nix b/nixpkgs/pkgs/development/python-modules/graphene-django/default.nix
new file mode 100644
index 000000000000..5ad186d75476
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphene-django/default.nix
@@ -0,0 +1,82 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, pythonAtLeast
+, pythonOlder
+, fetchFromGitHub
+
+, graphene
+, graphql-core
+, django
+, djangorestframework
+, promise
+, text-unidecode
+
+, django-filter
+, mock
+, py
+, pytest-django
+, pytest-random-order
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "graphene-django";
+  version = "3.1.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "graphql-python";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-1vl1Yj9MVBej5aFND8A63JMIog8aIW9SdwiOLIUwXxI=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner"' ""
+  '';
+
+  propagatedBuildInputs = [
+    djangorestframework
+    graphene
+    graphql-core
+    django
+    promise
+    text-unidecode
+  ];
+
+  preCheck = ''
+    export DJANGO_SETTINGS_MODULE=examples.django_test_settings
+  '';
+
+  nativeCheckInputs = [
+    django-filter
+    mock
+    py
+    pytest-django
+    pytest-random-order
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals (pythonAtLeast "3.11") [
+    # Python 3.11 support, https://github.com/graphql-python/graphene-django/pull/1365
+    "test_django_objecttype_convert_choices_enum_naming_collisions"
+    "test_django_objecttype_choices_custom_enum_name"
+    "test_django_objecttype_convert_choices_enum_list"
+    "test_schema_representation"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # this test touches files in the "/" directory and fails in darwin sandbox
+    "test_should_filepath_convert_string"
+  ];
+
+  meta = with lib; {
+    description = "Integrate GraphQL into your Django project";
+    homepage = "https://github.com/graphql-python/graphene-django";
+    changelog = "https://github.com/graphql-python/graphene-django/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/graphene/default.nix b/nixpkgs/pkgs/development/python-modules/graphene/default.nix
new file mode 100644
index 000000000000..e87dc333558f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphene/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, aniso8601
+, buildPythonPackage
+, fetchFromGitHub
+, graphql-core
+, graphql-relay
+, promise
+, py
+, pytest-asyncio
+, pytest-benchmark
+, pytest-mock
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, pytz
+, snapshottest
+}:
+
+buildPythonPackage rec {
+  pname = "graphene";
+  version = "3.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "graphql-python";
+    repo = "graphene";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-DGxicCXZp9kW/OFkr0lAWaQ+GaECx+HD8+X4aW63vgQ=";
+  };
+
+  propagatedBuildInputs = [
+    aniso8601
+    graphql-core
+    graphql-relay
+  ];
+
+  nativeCheckInputs = [
+    promise
+    py
+    pytestCheckHook
+    pytest-asyncio
+    pytest-benchmark
+    pytest-mock
+    pytz
+    snapshottest
+  ];
+
+  pytestFlagsArray = [
+    "--benchmark-disable"
+  ];
+
+  pythonImportsCheck = [
+    "graphene"
+  ];
+
+  meta = with lib; {
+    description = "GraphQL Framework for Python";
+    homepage = "https://github.com/graphql-python/graphene";
+    changelog = "https://github.com/graphql-python/graphene/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/graphite-web/default.nix b/nixpkgs/pkgs/development/python-modules/graphite-web/default.nix
new file mode 100644
index 000000000000..d80ed27297cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphite-web/default.nix
@@ -0,0 +1,105 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, python
+, cairocffi
+, django
+, django-tagging
+, fetchFromGitHub
+, fetchpatch
+, gunicorn
+, mock
+, pyparsing
+, python-memcached
+, pythonOlder
+, pytz
+, six
+, txamqp
+, urllib3
+, whisper
+}:
+
+buildPythonPackage rec {
+  pname = "graphite-web";
+  version = "1.1.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "graphite-project";
+    repo = pname;
+    rev = version;
+    hash = "sha256-2HgCBKwLfxJLKMopoIdsEW5k/j3kNAiifWDnJ98a7Qo=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "CVE-2022-4730.CVE-2022-4729.CVE-2022-4728.part-1.patch";
+      url = "https://github.com/graphite-project/graphite-web/commit/9c626006eea36a9fd785e8f811359aebc9774970.patch";
+      hash = "sha256-JMmdhLqsaRhUG2FsH+yPNl+cR7O2YLfKFliL2GU0aAk=";
+    })
+    (fetchpatch {
+      name = "CVE-2022-4730.CVE-2022-4729.CVE-2022-4728.part-2.patch";
+      url = "https://github.com/graphite-project/graphite-web/commit/2f178f490e10efc03cd1d27c72f64ecab224eb23.patch";
+      hash = "sha256-NL7K5uekf3NlLa58aFFRPJT9ktjqBeNlWC4Htd0fRQ0=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    cairocffi
+    django
+    django-tagging
+    gunicorn
+    pyparsing
+    python-memcached
+    pytz
+    six
+    txamqp
+    urllib3
+    whisper
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "Django>=1.8,<3.1" "Django" \
+      --replace "django-tagging==0.4.3" "django-tagging"
+  '';
+
+  # Carbon-s default installation is /opt/graphite. This env variable ensures
+  # carbon is installed as a regular Python module.
+  GRAPHITE_NO_PREFIX = "True";
+
+  preConfigure = ''
+    substituteInPlace webapp/graphite/settings.py \
+      --replace "join(WEBAPP_DIR, 'content')" "join('$out', 'webapp', 'content')"
+  '';
+
+  checkInputs = [ mock ];
+  checkPhase = ''
+    runHook preCheck
+
+    pushd webapp/
+    # avoid confusion with installed module
+    rm -r graphite
+    # redis not practical in test environment
+    substituteInPlace tests/test_tags.py \
+      --replace test_redis_tagdb _dont_test_redis_tagdb
+
+    DJANGO_SETTINGS_MODULE=tests.settings ${python.interpreter} manage.py test
+    popd
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "graphite"
+  ];
+
+  meta = with lib; {
+    description = "Enterprise scalable realtime graphing";
+    homepage = "http://graphiteapp.org/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ offline basvandijk ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/graphql-core/default.nix b/nixpkgs/pkgs/development/python-modules/graphql-core/default.nix
new file mode 100644
index 000000000000..0d866a29bd28
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphql-core/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, py
+, pytest-benchmark
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "graphql-core";
+  version = "3.2.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "graphql-python";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-LtBbHA5r6/YNh2gKX0+NqQjrpKuMioyOYWT0R59SIL4=";
+  };
+
+  nativeCheckInputs = [
+    py
+    pytest-asyncio
+    pytest-benchmark
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "graphql"
+  ];
+
+  meta = with lib; {
+    description = "Port of graphql-js to Python";
+    homepage = "https://github.com/graphql-python/graphql-core";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kamadorueda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/graphql-relay/default.nix b/nixpkgs/pkgs/development/python-modules/graphql-relay/default.nix
new file mode 100644
index 000000000000..ac91b749070d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphql-relay/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+
+, pythonOlder
+
+# build
+, poetry-core
+
+# runtime
+, graphql-core
+, typing-extensions
+
+# tests
+, pytest-asyncio
+, pytest-describe
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "graphql-relay";
+  version = "3.2.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-H/HFEpg1bkgaC+AJzN/ySYMs5T8wVZwTOPIqDg0XJQw=";
+  };
+
+  # This project doesn't seem to actually need setuptools. To find out why it
+  # specifies it, follow up in:
+  #
+  #   https://github.com/graphql-python/graphql-relay-py/issues/49
+  #
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace ', "setuptools>=59,<70"' ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    graphql-core
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-describe
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "graphql_relay" ];
+
+  meta = with lib; {
+    description = "A library to help construct a graphql-py server supporting react-relay";
+    homepage = "https://github.com/graphql-python/graphql-relay-py/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/graphql-server-core/default.nix b/nixpkgs/pkgs/development/python-modules/graphql-server-core/default.nix
new file mode 100644
index 000000000000..16217cd23a51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphql-server-core/default.nix
@@ -0,0 +1,48 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, graphql-core
+, promise
+, fetchpatch
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "graphql-server-core";
+  version = "2.0.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "graphql-python";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1w3biv2za2m1brwjy0z049c2m94gm1zfwxzgc6lwrsci724jv9fr";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/graphql-python/graphql-server-core/commit/865ee9d5602f352c958f6f7e15adbe9abe216784.patch";
+      sha256 = "03p44p4j8rys7mgamh2h9ibbnac2cqwvp5f5hrl2avj2hh0l6j46";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    graphql-core
+    promise
+  ];
+
+  # fail with: cannot import name 'format_error' from 'graphql'
+  doCheck = false;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Core package for using GraphQL in a custom server easily";
+    homepage = "https://github.com/graphql-python/graphql-server-core";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kamadorueda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/graphql-subscription-manager/default.nix b/nixpkgs/pkgs/development/python-modules/graphql-subscription-manager/default.nix
new file mode 100644
index 000000000000..feaf6432fedd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphql-subscription-manager/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "graphql-subscription-manager";
+  version = "0.7.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "PyGraphqlWebsocketManager";
+    rev = "refs/tags/${version}";
+    hash = "sha256-6/REvY5QxsAPV41Pvg8vrJPYbDrGUrpOPn0vzIcCu0k=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+    websockets
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "graphql_subscription_manager"
+  ];
+
+  meta = with lib; {
+    description = "Python3 library for graphql subscription manager";
+    homepage = "https://github.com/Danielhiversen/PyGraphqlWebsocketManager";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/graphqlclient/default.nix b/nixpkgs/pkgs/development/python-modules/graphqlclient/default.nix
new file mode 100644
index 000000000000..2f09897d4f57
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphqlclient/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "graphqlclient";
+  version = "0.2.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0b6r3ng78qsn7c9zksx4rgdkmp5296d40kbmjn8q614cz0ymyc5k";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "graphqlclient" ];
+
+  meta = with lib; {
+    description = "Simple GraphQL client for Python";
+    homepage = "https://github.com/prisma-labs/python-graphql-client";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lde ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/graphtage/default.nix b/nixpkgs/pkgs/development/python-modules/graphtage/default.nix
new file mode 100644
index 000000000000..8b5e27a24134
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphtage/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, colorama
+, intervaltree
+, json5
+, pyyaml
+, scipy
+, tqdm
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "graphtage";
+  version = "0.3.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "trailofbits";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-rzX5pSSPm3CjpnCm0gxsgUaeXho9dP7WTanCzBK6Yps=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "json5==0.9.5" "json5>=0.9.5"
+  '';
+
+  propagatedBuildInputs = [
+    colorama
+    intervaltree
+    json5
+    pyyaml
+    scipy
+    tqdm
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "graphtage"
+  ];
+
+  meta = with lib; {
+    description = "A utility to diff tree-like files such as JSON and XML";
+    homepage = "https://github.com/trailofbits/graphtage";
+    changelog = "https://github.com/trailofbits/graphtage/releases/tag/v${version}";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ veehaitch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/graphviz/default.nix b/nixpkgs/pkgs/development/python-modules/graphviz/default.nix
new file mode 100644
index 000000000000..e83a90729f2c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphviz/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, substituteAll
+, graphviz
+, xdg-utils
+, makeFontsConf
+, freefont_ttf
+, mock
+, pytest
+, pytest-mock
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "graphviz";
+  version = "0.20.1";
+
+  disabled = pythonOlder "3.7";
+
+  # patch does not apply to PyPI tarball due to different line endings
+  src = fetchFromGitHub {
+    owner = "xflr6";
+    repo = "graphviz";
+    rev = version;
+    hash = "sha256-plhWG9mE9DoTMg7mWCvFLAgtBx01LAgJ0gQ/mqBU3yc=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./paths.patch;
+      inherit graphviz;
+      xdgutils = xdg-utils;
+    })
+  ];
+
+  postPatch = ''
+    sed -i "/--cov/d" setup.cfg
+  '';
+
+  # Fontconfig error: Cannot load default config file
+  FONTCONFIG_FILE = makeFontsConf {
+    fontDirectories = [ freefont_ttf ];
+  };
+
+  nativeCheckInputs = [
+    mock
+    pytest
+    pytest-mock
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    HOME=$TMPDIR ${python.interpreter} run-tests.py
+
+    runHook postCheck
+  '';
+
+  # Too many failures due to attempting to connect to com.apple.fonts daemon
+  doCheck = !stdenv.isDarwin;
+
+  meta = with lib; {
+    description = "Simple Python interface for Graphviz";
+    homepage = "https://github.com/xflr6/graphviz";
+    changelog = "https://github.com/xflr6/graphviz/blob/${src.rev}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/graphviz/paths.patch b/nixpkgs/pkgs/development/python-modules/graphviz/paths.patch
new file mode 100644
index 000000000000..f53852544a2d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graphviz/paths.patch
@@ -0,0 +1,79 @@
+diff --git a/graphviz/backend/dot_command.py b/graphviz/backend/dot_command.py
+index 60654bd..2c62b47 100644
+--- a/graphviz/backend/dot_command.py
++++ b/graphviz/backend/dot_command.py
+@@ -9,7 +9,7 @@ from .. import parameters
+ 
+ __all__ = ['DOT_BINARY', 'command']
+ 
+-DOT_BINARY = pathlib.Path('dot')
++DOT_BINARY = pathlib.Path('@graphviz@/bin/dot')
+ 
+ 
+ def command(engine: str, format_: str, *,
+diff --git a/graphviz/backend/unflattening.py b/graphviz/backend/unflattening.py
+index a386b8c..883cdc6 100644
+--- a/graphviz/backend/unflattening.py
++++ b/graphviz/backend/unflattening.py
+@@ -11,7 +11,7 @@ from . import execute
+ 
+ __all__ = ['UNFLATTEN_BINARY', 'unflatten']
+ 
+-UNFLATTEN_BINARY = pathlib.Path('unflatten')
++UNFLATTEN_BINARY = pathlib.Path('@graphviz@/bin/unflatten')
+ 
+ 
+ @_tools.deprecate_positional_args(supported_number=1)
+diff --git a/graphviz/backend/viewing.py b/graphviz/backend/viewing.py
+index fde74a6..6f29b68 100644
+--- a/graphviz/backend/viewing.py
++++ b/graphviz/backend/viewing.py
+@@ -55,7 +55,7 @@ def view_darwin(filepath: typing.Union[os.PathLike, str], *,
+ def view_unixoid(filepath: typing.Union[os.PathLike, str], *,
+                  quiet: bool) -> None:
+     """Open filepath in the user's preferred application (linux, freebsd)."""
+-    cmd = ['xdg-open', filepath]
++    cmd = ['@xdgutils@/bin/xdg-open', filepath]
+     log.debug('view: %r', cmd)
+     kwargs = {'stderr': subprocess.DEVNULL} if quiet else {}
+     subprocess.Popen(cmd, **kwargs)
+diff --git a/tests/_common.py b/tests/_common.py
+index 87b4cbd..4188beb 100644
+--- a/tests/_common.py
++++ b/tests/_common.py
+@@ -14,9 +14,9 @@ __all__ = ['EXPECTED_DOT_BINARY', 'EXPECTED_UNFLATTEN_BINARY',
+            'as_cwd',
+            'check_startupinfo', 'StartupinfoMatcher']
+ 
+-EXPECTED_DOT_BINARY = _compat.make_subprocess_arg(pathlib.Path('dot'))
++EXPECTED_DOT_BINARY = _compat.make_subprocess_arg(pathlib.Path('@graphviz@/bin/dot'))
+ 
+-EXPECTED_UNFLATTEN_BINARY = _compat.make_subprocess_arg(pathlib.Path('unflatten'))
++EXPECTED_UNFLATTEN_BINARY = _compat.make_subprocess_arg(pathlib.Path('@graphviz@/bin/unflatten'))
+ 
+ EXPECTED_DEFAULT_ENCODING = 'utf-8'
+ 
+diff --git a/tests/backend/test_execute.py b/tests/backend/test_execute.py
+index 2cb853a..8093dfe 100644
+--- a/tests/backend/test_execute.py
++++ b/tests/backend/test_execute.py
+@@ -15,6 +15,7 @@ def empty_path(monkeypatch):
+     monkeypatch.setenv('PATH', '')
+ 
+ 
++@pytest.mark.skip(reason='empty $PATH has no effect')
+ @pytest.mark.usefixtures('empty_path')
+ @pytest.mark.parametrize(
+     'func, args',
+diff --git a/tests/backend/test_viewing.py b/tests/backend/test_viewing.py
+index 59a23d5..f73f905 100644
+--- a/tests/backend/test_viewing.py
++++ b/tests/backend/test_viewing.py
+@@ -26,6 +26,6 @@ def test_view_mocked(mocker, mock_platform, mock_popen, mock_startfile, quiet):
+     if mock_platform == 'darwin':
+         mock_popen.assert_called_once_with(['open', 'nonfilepath'], **kwargs)
+     elif mock_platform in ('linux', 'freebsd'):
+-        mock_popen.assert_called_once_with(['xdg-open', 'nonfilepath'], **kwargs)
++        mock_popen.assert_called_once_with(['@xdgutils@/bin/xdg-open', 'nonfilepath'], **kwargs)
+     else:
+         raise RuntimeError
diff --git a/nixpkgs/pkgs/development/python-modules/grappelli-safe/default.nix b/nixpkgs/pkgs/development/python-modules/grappelli-safe/default.nix
new file mode 100644
index 000000000000..916ac606473b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grappelli-safe/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  version = "1.1.1";
+  pname = "grappelli-safe";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "grappelli_safe";
+    inherit version;
+    hash = "sha256-7jSz4qNxFJix+No9naqKEjnv3yVaISGBdCtqWJD6wDk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "grappelli_safe"
+  ];
+
+  meta = with lib; {
+    description = "A snapshot of django-grappelli for the Mezzanine CMS";
+    longDescription = ''
+      grappelli_safe was created to provide a snapshot of the
+      Grappelli admin skin for Django, to be referenced as a
+      dependency for the Mezzanine CMS for Django.
+
+      At the time of grappelli_safe's creation, Grappelli was
+      incorrectly packaged on PyPI, and had also dropped compatibility
+      with Django 1.1 - grappelli_safe was therefore created to
+      address these specific issues.
+    '';
+    homepage = "https://github.com/stephenmcd/grappelli-safe";
+    downloadPage = "http://pypi.python.org/pypi/grappelli_safe/";
+    changelog = "https://github.com/stephenmcd/grappelli-safe/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ prikhi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/graspologic/default.nix b/nixpkgs/pkgs/development/python-modules/graspologic/default.nix
new file mode 100644
index 000000000000..afc5b2edad2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/graspologic/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitHub
+, pytestCheckHook
+, pytest-cov
+, hyppo
+, matplotlib
+, networkx
+, numpy
+, scikit-learn
+, scipy
+, seaborn
+}:
+
+buildPythonPackage rec {
+  pname = "graspologic";
+  version = "3.2.0";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "microsoft";
+    repo = "graspologic";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-yXhEI/8qm526D+Ehqqfb+j+sbbh83Q4OWC+UM7cgCjU=";
+  };
+
+  propagatedBuildInputs = [
+    hyppo
+    matplotlib
+    networkx
+    numpy
+    scikit-learn
+    scipy
+    seaborn
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook pytest-cov ];
+  pytestFlagsArray = [ "tests" "--ignore=docs" "--ignore=tests/test_sklearn.py" ];
+  disabledTests = [ "gridplot_outputs" ];
+
+  meta = with lib; {
+    homepage = "https://graspologic.readthedocs.io";
+    description = "A package for graph statistical algorithms";
+    license = licenses.asl20;  # changing to `licenses.mit` in next release
+    maintainers = with maintainers; [ bcdarwin ];
+    # graspologic-native is not available
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/greatfet/default.nix b/nixpkgs/pkgs/development/python-modules/greatfet/default.nix
new file mode 100644
index 000000000000..7859d2f4c087
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/greatfet/default.nix
@@ -0,0 +1,34 @@
+{ lib, fetchFromGitHub, buildPythonPackage, isPy3k, future, pyusb, ipython, pygreat }:
+
+buildPythonPackage rec {
+  pname = "GreatFET";
+  version = "2019.5.1.dev0";
+
+  src = fetchFromGitHub {
+    owner = "greatscottgadgets";
+    repo = "greatfet";
+    rev = "v${version}";
+    sha256 = "054vkx4xkbhxhh5grjbs9kw3pjkv1zapp91ysrqr0c8mg1pc7zxv";
+  };
+
+  disabled = !isPy3k;
+
+  propagatedBuildInputs = [ future pyusb ipython pygreat ];
+
+  doCheck = false;
+
+  preBuild = ''
+    cd host
+    echo "$version" > ../VERSION
+  '';
+
+  meta = {
+    description = "Hardware hacking with the greatfet";
+    homepage = "https://greatscottgadgets.com/greatfet";
+    license = lib.licenses.bsd3;
+    platforms = lib.platforms.all;
+    maintainers = with lib.maintainers; [ mog ];
+  };
+}
+
+
diff --git a/nixpkgs/pkgs/development/python-modules/greeclimate/default.nix b/nixpkgs/pkgs/development/python-modules/greeclimate/default.nix
new file mode 100644
index 000000000000..30a724c07c44
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/greeclimate/default.nix
@@ -0,0 +1,52 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, netifaces
+, pycryptodome
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "greeclimate";
+  version = "1.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "cmroche";
+    repo = "greeclimate";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-M4oxFi/PpqhJgZX/wM+9rSrraIZcqzubbxnihfK0W2E=";
+  };
+
+  propagatedBuildInputs = [
+    netifaces
+    pycryptodome
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "greeclimate"
+    "greeclimate.device"
+    "greeclimate.discovery"
+    "greeclimate.exceptions"
+    "greeclimate.network"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Discover, connect and control Gree based minisplit systems";
+    homepage = "https://github.com/cmroche/greeclimate";
+    changelog = "https://github.com/cmroche/greeclimate/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/green/default.nix b/nixpkgs/pkgs/development/python-modules/green/default.nix
new file mode 100644
index 000000000000..56f6bfae2a42
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/green/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, django
+, colorama
+, coverage
+, unidecode
+, lxml
+}:
+
+buildPythonPackage rec {
+  pname = "green";
+  version = "3.4.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-iGXQt3tcsThR3WAaWK0sgry1LafKEG8FOMV4fxJzaKY=";
+  };
+
+  patches = [
+    ./tests.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace green/test/test_integration.py \
+      --subst-var-by green "$out/bin/green"
+  '';
+
+  propagatedBuildInputs = [
+    colorama
+    coverage
+    unidecode
+    lxml
+  ];
+
+  # let green run it's own test suite
+  checkPhase = ''
+    $out/bin/green -tvvv \
+      green.test.test_version \
+      green.test.test_cmdline \
+      green.test.test_command
+  '';
+
+  pythonImportsCheck = [
+    "green"
+  ];
+
+  meta = with lib; {
+    description = "Python test runner";
+    homepage = "https://github.com/CleanCut/green";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/green/tests.patch b/nixpkgs/pkgs/development/python-modules/green/tests.patch
new file mode 100644
index 000000000000..7e1c3be62e3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/green/tests.patch
@@ -0,0 +1,22 @@
+diff --git a/green/test/test_integration.py b/green/test/test_integration.py
+index 0cf8cbb..40d9f6b 100644
+--- a/green/test/test_integration.py
++++ b/green/test/test_integration.py
+@@ -41,9 +41,7 @@ class TestFinalizer(unittest.TestCase):
+             )
+             fh.close()
+         args = [
+-            sys.executable,
+-            "-m",
+-            "green.cmdline",
++            "@green@",
+             "--finalizer=test_finalizer0.msg",
+             "--maxtasksperchild=1",
+         ]
+@@ -58,6 +56,5 @@ class TestFinalizer(unittest.TestCase):
+             stdout=subprocess.PIPE,
+             stderr=subprocess.STDOUT,
+             env=env,
+-            timeout=10,
+         ).stdout.decode("utf-8")
+         self.assertIn("finalizer worked", output)
diff --git a/nixpkgs/pkgs/development/python-modules/greeneye-monitor/default.nix b/nixpkgs/pkgs/development/python-modules/greeneye-monitor/default.nix
new file mode 100644
index 000000000000..3b6e9f6f0f23
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/greeneye-monitor/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, siobrultech-protocols
+}:
+
+buildPythonPackage rec {
+  pname = "greeneye-monitor";
+  version = "5.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "jkeljo";
+    repo = "greeneye-monitor";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-zNGizNOuZuPRdz82y8IaVvwrTos4lZSqTP5FwOlnRao=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    siobrultech-protocols
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "greeneye.monitor"
+  ];
+
+  meta = with lib; {
+    description = "Receive data packets from GreenEye Monitor";
+    homepage = "https://github.com/jkeljo/greeneye-monitor";
+    changelog = "https://github.com/jkeljo/greeneye-monitor/blob/v${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/greenlet/default.nix b/nixpkgs/pkgs/development/python-modules/greenlet/default.nix
new file mode 100644
index 000000000000..8b885133cf2a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/greenlet/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+
+# build-system
+, setuptools
+
+# tests
+, objgraph
+, psutil
+, python
+, unittestCheckHook
+}:
+
+let greenlet = buildPythonPackage rec {
+  pname = "greenlet";
+  version = "3.0.1";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gWvZSIqUy6eNk+GrtYAA6CZvqcwqqczdbrBpasskAFs=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  # tests in passthru, infinite recursion via objgraph/graphviz
+  doCheck = false;
+
+  nativeCheckInputs = [
+    objgraph
+    psutil
+    unittestCheckHook
+  ];
+
+  preCheck = ''
+    pushd ${placeholder "out"}/${python.sitePackages}
+  '';
+
+  unittestFlagsArray = [
+    "greenlet.tests"
+  ];
+
+  postCheck = ''
+    popd
+  '';
+
+  passthru.tests.pytest = greenlet.overridePythonAttrs (_: { doCheck = true; });
+
+  meta = with lib; {
+    changelog = "https://github.com/python-greenlet/greenlet/blob/${version}/CHANGES.rst";
+    homepage = "https://github.com/python-greenlet/greenlet";
+    description = "Module for lightweight in-process concurrent programming";
+    license = with licenses; [
+      psfl # src/greenlet/slp_platformselect.h & files in src/greenlet/platform/ directory
+      mit
+    ];
+  };
+};
+in greenlet
diff --git a/nixpkgs/pkgs/development/python-modules/gremlinpython/default.nix b/nixpkgs/pkgs/development/python-modules/gremlinpython/default.nix
new file mode 100644
index 000000000000..49401b44532a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gremlinpython/default.nix
@@ -0,0 +1,84 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aenum
+, aiohttp
+, importlib-metadata
+, isodate
+, nest-asyncio
+, pytestCheckHook
+, pythonOlder
+, mock
+, pyhamcrest
+, radish-bdd
+}:
+
+buildPythonPackage rec {
+  pname = "gremlinpython";
+  version = "3.6.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "apache";
+    repo = "tinkerpop";
+    rev = "refs/tags/${version}";
+    hash = "sha256-SQ+LcHeHDB1Hd5wXGDJBZmBG4KEZ3NsV4+4X9WgPb9E=";
+  };
+
+  sourceRoot = "${src.name}/gremlin-python/src/main/python";
+
+  postPatch = ''
+    sed -i '/pytest-runner/d' setup.py
+
+    substituteInPlace setup.py \
+      --replace 'importlib-metadata<5.0.0' 'importlib-metadata' \
+      --replace "os.getenv('VERSION', '?').replace('-SNAPSHOT', '.dev-%d' % timestamp)" '"${version}"'
+  '';
+
+  # setup-requires requirements
+  nativeBuildInputs = [
+    importlib-metadata
+  ];
+
+  propagatedBuildInputs = [
+    aenum
+    aiohttp
+    isodate
+    nest-asyncio
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+    pyhamcrest
+    radish-bdd
+  ];
+
+  # disable custom pytest report generation
+  preCheck = ''
+    substituteInPlace setup.cfg --replace 'addopts' '#addopts'
+    export TEST_TRANSACTIONS='false'
+  '';
+
+  # many tests expect a running tinkerpop server
+  disabledTestPaths = [
+    "tests/driver/test_client.py"
+    "tests/driver/test_driver_remote_connection.py"
+    "tests/driver/test_driver_remote_connection_threaded.py"
+    "tests/process/test_dsl.py"
+    "tests/structure/io/test_functionalityio.py"
+  ];
+  pytestFlagsArray = [
+    # disabledTests doesn't quite allow us to be precise enough for this
+    "-k 'not (TestFunctionalGraphSONIO and (test_timestamp or test_datetime or test_uuid))'"
+  ];
+
+  meta = with lib; {
+    description = "Gremlin-Python implements Gremlin, the graph traversal language of Apache TinkerPop, within the Python language";
+    homepage = "https://tinkerpop.apache.org/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ris ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/grequests/default.nix b/nixpkgs/pkgs/development/python-modules/grequests/default.nix
new file mode 100644
index 000000000000..e1dfe77d577e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grequests/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, gevent
+}:
+
+buildPythonPackage rec {
+  pname = "grequests";
+  version = "0.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-XDPxQmjfW4+hEH2FN4Fb5v67rW7FYFJNakBLd3jPa6Y=";
+  };
+
+  # No tests in archive
+  doCheck = false;
+
+  propagatedBuildInputs = [ requests gevent ];
+
+  meta = with lib; {
+    description = "Asynchronous HTTP requests";
+    homepage = "https://github.com/kennethreitz/grequests";
+    license = with licenses; [ bsd2 ];
+    maintainers = with maintainers; [ matejc ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/greynoise/default.nix b/nixpkgs/pkgs/development/python-modules/greynoise/default.nix
new file mode 100644
index 000000000000..ada5f4096216
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/greynoise/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, click
+, ansimarkup
+, cachetools
+, colorama
+, click-default-group
+, click-repl
+, dict2xml
+, jinja2
+, more-itertools
+, requests
+, six
+, pytestCheckHook
+, mock
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "greynoise";
+  version = "2.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "GreyNoise-Intelligence";
+    repo = "pygreynoise";
+    rev = "v${version}";
+    hash = "sha256-zevom7JqXnZuotXfGtfPOmQNh32dANS4Uc6tHUuq08s=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    ansimarkup
+    cachetools
+    colorama
+    click-default-group
+    click-repl
+    dict2xml
+    jinja2
+    more-itertools
+    requests
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+  ];
+
+  pythonImportsCheck = [ "greynoise" ];
+
+  meta = with lib; {
+    description = "Python3 library and command line for GreyNoise";
+    homepage = "https://github.com/GreyNoise-Intelligence/pygreynoise";
+    changelog = "https://github.com/GreyNoise-Intelligence/pygreynoise/blob/${src.rev}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gridnet/default.nix b/nixpkgs/pkgs/development/python-modules/gridnet/default.nix
new file mode 100644
index 000000000000..46a3f3f1b839
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gridnet/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "gridnet";
+  version = "5.0.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "klaasnicolaas";
+    repo = "python-gridnet";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-7tLT5sRoUjWs1DOIuUEbnJJkg9LHZqrN/eu+Mjx5Yd4=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "0.0.0" "${version}" \
+      --replace "--cov" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "gridnet"
+  ];
+
+  meta = with lib; {
+    description = "Asynchronous Python client for NET2GRID devices";
+    homepage = "https://github.com/klaasnicolaas/python-gridnet";
+    changelog = "https://github.com/klaasnicolaas/python-gridnet/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/griffe/default.nix b/nixpkgs/pkgs/development/python-modules/griffe/default.nix
new file mode 100644
index 000000000000..63d985326efc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/griffe/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, aiofiles
+, buildPythonPackage
+, colorama
+, fetchFromGitHub
+, git
+, jsonschema
+, pdm-backend
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "griffe";
+  version = "0.38.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "mkdocstrings";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-GhohFO5tHb9ByISPUf4U2MrDATE4WjuekcC9QZaP2Ls=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    pdm-backend
+  ];
+
+  propagatedBuildInputs = [
+    colorama
+  ];
+
+  nativeCheckInputs = [
+    git
+    jsonschema
+    pytestCheckHook
+  ];
+
+  passthru.optional-dependencies = {
+    async = [
+      aiofiles
+    ];
+  };
+
+  pythonImportsCheck = [
+    "griffe"
+  ];
+
+  meta = with lib; {
+    description = "Signatures for entire Python programs";
+    homepage = "https://github.com/mkdocstrings/griffe";
+    changelog = "https://github.com/mkdocstrings/griffe/blob/${version}/CHANGELOG.md";
+    license = licenses.isc;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/grip/default.nix b/nixpkgs/pkgs/development/python-modules/grip/default.nix
new file mode 100644
index 000000000000..ef1ad0512c95
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grip/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, fetchFromGitHub
+# Python bits:
+, buildPythonPackage
+, pytest
+, responses
+, docopt
+, flask
+, markdown
+, path-and-address
+, pygments
+, requests
+, tabulate
+}:
+
+buildPythonPackage rec {
+  pname = "grip";
+  version = "4.6.1";
+
+  src = fetchFromGitHub {
+    owner = "joeyespo";
+    repo = "grip";
+    rev = "v${version}";
+    hash = "sha256-CHL2dy0H/i0pLo653F7aUHFvZHTeZA6jC/rwn1KrEW4=";
+  };
+
+  nativeCheckInputs = [ pytest responses ];
+
+  propagatedBuildInputs = [ docopt flask markdown path-and-address pygments requests tabulate ];
+
+  checkPhase = ''
+      export PATH="$PATH:$out/bin"
+      py.test -xm "not assumption"
+  '';
+
+  meta = with lib; {
+    description = "Preview GitHub Markdown files like Readme locally before committing them";
+    homepage = "https://github.com/joeyespo/grip";
+    license = licenses.mit;
+    maintainers = with maintainers; [ koral ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/groestlcoin_hash/default.nix b/nixpkgs/pkgs/development/python-modules/groestlcoin_hash/default.nix
new file mode 100644
index 000000000000..477ff19e33ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/groestlcoin_hash/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "groestlcoin_hash";
+  version = "1.0.3";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "31a8f6fa4c19db5258c3c73c071b71702102c815ba862b6015d9e4b75ece231e";
+  };
+
+  pythonImportsCheck = [
+    "groestlcoin_hash"
+  ];
+
+  meta = with lib; {
+    description = "Bindings for groestl key derivation function library used in Groestlcoin";
+    homepage = "https://pypi.org/project/groestlcoin_hash/";
+    maintainers = with maintainers; [ gruve-p ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/growattserver/default.nix b/nixpkgs/pkgs/development/python-modules/growattserver/default.nix
new file mode 100644
index 000000000000..1c7e12fab2e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/growattserver/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "growattserver";
+  version = "1.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "indykoning";
+    repo = "PyPi_GrowattServer";
+    rev = "refs/tags/${version}";
+    hash = "sha256-V0EW3I0FIDx9urbxX/zh3A51B/BiDqUfsrKbKU9FKiE=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "growattServer"
+  ];
+
+  meta = with lib; {
+    description = "Python package to retrieve information from Growatt units";
+    homepage = "https://github.com/indykoning/PyPi_GrowattServer";
+    changelog = "https://github.com/indykoning/PyPi_GrowattServer/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/grpc-google-iam-v1/default.nix b/nixpkgs/pkgs/development/python-modules/grpc-google-iam-v1/default.nix
new file mode 100644
index 000000000000..f5a25339def2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grpc-google-iam-v1/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, grpcio
+, googleapis-common-protos
+}:
+
+buildPythonPackage rec {
+  pname = "grpc-google-iam-v1";
+  version = "0.12.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-K8S4/fIhFaZddRyTFzKTImAsObfIaiicm3LSKNlg718=";
+  };
+
+  propagatedBuildInputs = [ grpcio googleapis-common-protos ];
+
+  # no tests run
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "google.iam"
+    "google.iam.v1"
+  ];
+
+  meta = with lib; {
+    description = "GRPC library for the google-iam-v1 service";
+    homepage = "https://github.com/googleapis/googleapis";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/grpc-interceptor/default.nix b/nixpkgs/pkgs/development/python-modules/grpc-interceptor/default.nix
new file mode 100644
index 000000000000..a940aa17de74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grpc-interceptor/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pythonOlder
+, poetry-core
+, grpcio
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "grpc-interceptor";
+  version = "0.15.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "d5h-foss";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-tTi1X1r7584ZXa12eLp2G/Am8G6Dnd18eE5wF/Lp/EY=";
+  };
+
+  patches = [
+    # https://github.com/d5h-foss/grpc-interceptor/pull/44
+    (fetchpatch {
+      name = "replace-poetry-with-poetry-core.patch";
+      url = "https://github.com/d5h-foss/grpc-interceptor/commit/916cb394acd8dd7abb4f5edcb4e88aee961a32d0.patch";
+      hash = "sha256-W2SF2zyjusTxgvCxBDLpisD03bofzDug1eyd4FLJmKs=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    grpcio
+    protobuf
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "grpc_interceptor"
+  ];
+
+  meta = with lib; {
+    description = "Simplified gRPC interceptors";
+    homepage = "https://github.com/d5h-foss/grpc-interceptor";
+    changelog = "https://github.com/d5h-foss/grpc-interceptor/releases/tag/v${version}";
+    longDescription = ''
+      Simplified Python gRPC interceptors.
+
+      The Python gRPC package provides service interceptors, but they're a bit
+      hard to use because of their flexibility. The gRPC interceptors don't
+      have direct access to the request and response objects, or the service
+      context. Access to these are often desired, to be able to log data in the
+      request or response, or set status codes on the context.
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ tomaskala ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/grpcio-channelz/default.nix b/nixpkgs/pkgs/development/python-modules/grpcio-channelz/default.nix
new file mode 100644
index 000000000000..f827c8508122
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grpcio-channelz/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, pythonRelaxDepsHook
+, fetchPypi
+, grpcio
+, protobuf
+}:
+
+buildPythonPackage rec {
+  pname = "grpcio-channelz";
+  version = "1.59.2";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-apOnMd8EDU+ocj6fL/dkl3tqh6en/Q8H9K/lgvkqFN8=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+  pythonRelaxDeps = [
+    "grpcio"
+  ];
+
+  propagatedBuildInputs = [
+    grpcio
+    protobuf
+  ];
+
+  pythonImportsCheck = [ "grpc_channelz" ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Channel Level Live Debug Information Service for gRPC";
+    homepage = "https://pypi.org/project/grpcio-channelz";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/grpcio-gcp/default.nix b/nixpkgs/pkgs/development/python-modules/grpcio-gcp/default.nix
new file mode 100644
index 000000000000..c45423ed95e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grpcio-gcp/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, grpcio
+}:
+
+buildPythonPackage rec {
+  pname = "grpcio-gcp";
+  version = "0.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e292605effc7da39b7a8734c719afb12ec4b5362add3528d8afad3aa3aa9057c";
+  };
+
+  propagatedBuildInputs = [ grpcio ];
+
+  meta = with lib; {
+    description = "gRPC extensions for Google Cloud Platform";
+    homepage = "https://grpc.io";
+    license = licenses.asl20;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/grpcio-health-checking/default.nix b/nixpkgs/pkgs/development/python-modules/grpcio-health-checking/default.nix
new file mode 100644
index 000000000000..4c028e4ec71c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grpcio-health-checking/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, pythonRelaxDepsHook
+, fetchPypi
+, grpcio
+, protobuf
+}:
+
+buildPythonPackage rec {
+  pname = "grpcio-health-checking";
+  version = "1.59.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-4CIcpupsITlhQXmAi4+LMjA30LG977D8TN2agUmZVx4=";
+  };
+
+  propagatedBuildInputs = [
+    grpcio
+    protobuf
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+  pythonRelaxDeps = [
+    "grpcio"
+  ];
+
+  pythonImportsCheck = [ "grpc_health" ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Standard Health Checking Service for gRPC";
+    homepage = "https://pypi.org/project/grpcio-health-checking/";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/grpcio-reflection/default.nix b/nixpkgs/pkgs/development/python-modules/grpcio-reflection/default.nix
new file mode 100644
index 000000000000..cd0506870a27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grpcio-reflection/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonRelaxDepsHook
+, grpcio
+, protobuf
+}:
+
+buildPythonPackage rec {
+  pname = "grpcio-reflection";
+  version = "1.59.2";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-l5bcvFnc+59tVGXVnn+mKld3o+TVqolPRIVciWpG+os=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+  pythonRelaxDeps = [
+    "grpcio"
+  ];
+
+  propagatedBuildInputs = [
+    grpcio
+    protobuf
+  ];
+
+  pythonImportsCheck = [ "grpc_reflection" ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Standard Protobuf Reflection Service for gRPC";
+    homepage = "https://pypi.org/project/grpcio-reflection";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/grpcio-status/default.nix b/nixpkgs/pkgs/development/python-modules/grpcio-status/default.nix
new file mode 100644
index 000000000000..e7d6fd550958
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grpcio-status/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, googleapis-common-protos
+, grpcio
+, protobuf
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "grpcio-status";
+  version = "1.59.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+TucM+CiYWLvhDG/z/zD4fshfM2Ne1swYbbp+BPmmLU=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'protobuf>=4.21.6' 'protobuf'
+  '';
+
+  propagatedBuildInputs = [
+    googleapis-common-protos
+    grpcio
+    protobuf
+  ];
+
+  # Projec thas no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "grpc_status"
+  ];
+
+  meta = with lib; {
+    description = "GRPC Python status proto mapping";
+    homepage = "https://github.com/grpc/grpc/tree/master/src/python/grpcio_status";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/grpcio-testing/default.nix b/nixpkgs/pkgs/development/python-modules/grpcio-testing/default.nix
new file mode 100644
index 000000000000..bb3024d44076
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grpcio-testing/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, grpcio
+, protobuf
+, pythonOlder
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "grpcio-testing";
+  version = "1.59.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-YiqbhlOsyoAT/uYNPbLQK5c2T8cYGEDXVkAPIzCaOQ4=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"grpcio>={version}".format(version=grpc_version.VERSION)' '"grpcio"'
+  '';
+
+  propagatedBuildInputs = [
+    grpcio
+    protobuf
+  ];
+
+  pythonImportsCheck = [
+    "grpc_testing"
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Testing utilities for gRPC Python";
+    homepage = "https://grpc.io/";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/grpcio-tools/default.nix b/nixpkgs/pkgs/development/python-modules/grpcio-tools/default.nix
new file mode 100644
index 000000000000..cd0b0abcb121
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grpcio-tools/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchPypi, protobuf, grpcio, setuptools }:
+
+buildPythonPackage rec {
+  pname = "grpcio-tools";
+  version = "1.59.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-qkAY8thmKsTZgwRF09JToRs+CW6K/iCGVUcTeqEWDpM=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'protobuf>=4.21.6,<5.0dev' 'protobuf'
+  '';
+
+  outputs = [ "out" "dev" ];
+
+  enableParallelBuilding = true;
+
+  propagatedBuildInputs = [ protobuf grpcio setuptools ];
+
+  # no tests in the package
+  doCheck = false;
+
+  pythonImportsCheck = [ "grpc_tools" ];
+
+  meta = with lib; {
+    description = "Protobuf code generator for gRPC";
+    license = licenses.asl20;
+    homepage = "https://grpc.io/grpc/python/";
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/grpcio/default.nix b/nixpkgs/pkgs/development/python-modules/grpcio/default.nix
new file mode 100644
index 000000000000..e8ea37c90448
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grpcio/default.nix
@@ -0,0 +1,56 @@
+{ lib, stdenv
+, buildPythonPackage
+, grpc
+, six
+, protobuf
+, enum34 ? null
+, futures ? null
+, isPy27
+, pkg-config
+, cython
+, c-ares
+, openssl
+, zlib
+}:
+
+buildPythonPackage rec {
+  inherit (grpc) src version;
+  pname = "grpcio";
+  format = "setuptools";
+
+  outputs = [ "out" "dev" ];
+
+  nativeBuildInputs = [ cython pkg-config ];
+
+  buildInputs = [ c-ares openssl zlib ];
+  propagatedBuildInputs = [ six protobuf ]
+    ++ lib.optionals (isPy27) [ enum34 futures ];
+
+  preBuild = ''
+    export GRPC_PYTHON_BUILD_EXT_COMPILER_JOBS="$NIX_BUILD_CORES"
+    if [ -z "$enableParallelBuilding" ]; then
+      GRPC_PYTHON_BUILD_EXT_COMPILER_JOBS=1
+    fi
+  '' + lib.optionalString stdenv.isDarwin ''
+    unset AR
+  '';
+
+  GRPC_BUILD_WITH_BORING_SSL_ASM = "";
+  GRPC_PYTHON_BUILD_SYSTEM_OPENSSL = 1;
+  GRPC_PYTHON_BUILD_SYSTEM_ZLIB = 1;
+  GRPC_PYTHON_BUILD_SYSTEM_CARES = 1;
+
+  # does not contain any tests
+  doCheck = false;
+
+  enableParallelBuilding = true;
+
+  pythonImportsCheck = [ "grpc" ];
+
+  meta = with lib; {
+    description = "HTTP/2-based RPC framework";
+    license = licenses.asl20;
+    homepage = "https://grpc.io/grpc/python/";
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/grpclib/default.nix b/nixpkgs/pkgs/development/python-modules/grpclib/default.nix
new file mode 100644
index 000000000000..11692e59ef23
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/grpclib/default.nix
@@ -0,0 +1,51 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, pythonOlder
+, h2
+, multidict
+, pytestCheckHook
+, pytest-asyncio
+, async-timeout
+, faker
+, googleapis-common-protos
+, certifi
+}:
+let
+  pname = "grpclib";
+  version = "0.4.4";
+in
+buildPythonPackage {
+  inherit pname version;
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "vmagamedov";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-bCLyBfsNdIGdpz9l/r2iYIQ5TitKmsctekeOthIkXhw=";
+  };
+
+  propagatedBuildInputs = [
+    h2
+    multidict
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+    async-timeout
+    faker
+    googleapis-common-protos
+    certifi
+  ];
+
+  pythonImportsCheck = [ "grpclib" ];
+
+  meta = with lib; {
+    description = "Pure-Python gRPC implementation for asyncio";
+    homepage = "https://github.com/vmagamedov/grpclib";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ nikstur ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gruut-ipa/default.nix b/nixpkgs/pkgs/development/python-modules/gruut-ipa/default.nix
new file mode 100644
index 000000000000..26a7223b97e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gruut-ipa/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, espeak
+, numpy
+, python
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "gruut-ipa";
+  version = "0.13.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "rhasspy";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Q2UKELoG8OaAPxIrZNCpXgeWZ2fCzb3g3SOVzCm/gg0=";
+  };
+
+  postPatch = ''
+    patchShebangs bin/*
+    substituteInPlace bin/speak-ipa \
+      --replace '${"\${src_dir}:"}' "$out/lib/${python.libPrefix}/site-packages:" \
+      --replace "do espeak" "do ${espeak}/bin/espeak"
+  '';
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  pythonImportsCheck = [
+    "gruut_ipa"
+  ];
+
+  meta = with lib; {
+    description = "Library for manipulating pronunciations using the International Phonetic Alphabet (IPA)";
+    homepage = "https://github.com/rhasspy/gruut-ipa";
+    license = licenses.mit;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gruut/default.nix b/nixpkgs/pkgs/development/python-modules/gruut/default.nix
new file mode 100644
index 000000000000..bd6e95909d99
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gruut/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, buildPythonPackage
+, callPackage
+, fetchFromGitHub
+, babel
+, gruut-ipa
+, dateparser
+, jsonlines
+, num2words
+, python-crfsuite
+, python
+, networkx
+, glibcLocales
+, pytestCheckHook
+}:
+
+let
+  langPkgs = [
+    "ar"
+    "cs"
+    "de"
+    "en"
+    "es"
+    "fa"
+    "fr"
+    "it"
+    "lb"
+    "nl"
+    "pt"
+    "ru"
+    "sv"
+    "sw"
+  ];
+in
+buildPythonPackage rec {
+  pname = "gruut";
+  version = "2.3.4";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "rhasspy";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-DD7gnvH9T2R6E19+exWE7Si+XEpfh0Iy5FYbycjgzgM=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "gruut_lang_en~=2.0.0" "gruut_lang_en" \
+      --replace "jsonlines~=1.2.0" "jsonlines" \
+      --replace "networkx>=2.5.0,<3.0.0" "networkx"
+  '';
+
+  propagatedBuildInputs = [
+    babel
+    gruut-ipa
+    jsonlines
+    num2words
+    python-crfsuite
+    dateparser
+    networkx
+  ] ++ (map (lang: callPackage ./language-pack.nix {
+    inherit lang version format src;
+  }) langPkgs);
+
+  nativeCheckInputs = [ glibcLocales pytestCheckHook ];
+
+  disabledTests = [
+    # https://github.com/rhasspy/gruut/issues/25
+    "test_lexicon_external"
+
+    # requires mishkal library
+    "test_fa"
+    "test_ar"
+    "test_lb"
+  ];
+
+  preCheck = ''
+    export LC_ALL=en_US.utf-8
+  '';
+
+  pythonImportsCheck = [
+    "gruut"
+  ];
+
+  meta = with lib; {
+    description = "A tokenizer, text cleaner, and phonemizer for many human languages";
+    homepage = "https://github.com/rhasspy/gruut";
+    license = licenses.mit;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gruut/language-pack.nix b/nixpkgs/pkgs/development/python-modules/gruut/language-pack.nix
new file mode 100644
index 000000000000..2d3cfa9cc518
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gruut/language-pack.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+
+, lang
+, version
+, format
+, src
+}:
+
+buildPythonPackage rec {
+  pname = "gruut-lang-${lang}";
+  inherit version format src;
+
+  prePatch = ''
+    cd "${pname}"
+  '';
+
+  pythonImportsCheck = [
+    "gruut_lang_${lang}"
+  ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Language files for gruut tokenizer/phonemizer";
+    homepage = "https://github.com/rhasspy/gruut";
+    license = licenses.mit;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gsd/default.nix b/nixpkgs/pkgs/development/python-modules/gsd/default.nix
new file mode 100644
index 000000000000..3040102f8773
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gsd/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchFromGitHub
+, numpy
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gsd";
+  version = "3.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "glotzerlab";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ceoHHEX44DrVgatV2EIS6gT9oVZkAx6OTFMZG/x4q64=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "gsd"
+  ];
+
+
+  preCheck = ''
+    pushd gsd/test
+  '';
+
+  postCheck = ''
+    popd
+  '';
+
+  meta = with lib; {
+    description = "General simulation data file format";
+    homepage = "https://github.com/glotzerlab/gsd";
+    changelog = "https://github.com/glotzerlab/gsd/blob/v${version}/CHANGELOG.rst";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gsm0338/default.nix b/nixpkgs/pkgs/development/python-modules/gsm0338/default.nix
new file mode 100644
index 000000000000..029204c98730
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gsm0338/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  pname = "gsm0338";
+  version = "1.1.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "dsch";
+    repo = "gsm0338";
+    rev = "1c036bd3b656b5075fdc221cbc578c4a47b42b1f";
+    hash = "sha256-EkUVd4d4Te8brHerygDc6KQSpiX11NrHYkcZSDRi05w=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "gsm0338" ];
+
+  meta = with lib; {
+    description = "Python codec for GSM 03.38";
+    homepage = "https://github.com/dsch/gsm0338";
+    license = licenses.mit;
+    maintainers = with maintainers; [ flokli janik ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gspread/default.nix b/nixpkgs/pkgs/development/python-modules/gspread/default.nix
new file mode 100644
index 000000000000..f71690c877e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gspread/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, google-auth
+, google-auth-oauthlib
+, pytest-vcr
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "gspread";
+  version = "5.12.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "burnash";
+    repo = "gspread";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-v6kpje5rw3/OfcoMWdSCZdkmETyIJ08cly8lLUt9j64=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    google-auth
+    google-auth-oauthlib
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytest-vcr
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "gspread"
+  ];
+
+  meta = with lib; {
+    description = "Google Spreadsheets client library";
+    homepage = "https://github.com/burnash/gspread";
+    changelog = "https://github.com/burnash/gspread/blob/v${version}/HISTORY.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gssapi/default.nix b/nixpkgs/pkgs/development/python-modules/gssapi/default.nix
new file mode 100644
index 000000000000..56b79e8c08b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gssapi/default.nix
@@ -0,0 +1,83 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, six
+, decorator
+, nose
+, krb5
+, GSS
+, parameterized
+, shouldbe
+, cython
+, python
+, k5test
+}:
+
+buildPythonPackage rec {
+  pname = "gssapi";
+  version = "1.8.3";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "pythongssapi";
+    repo = "python-${pname}";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-H1JfdvxJvX5dmC9aTqIOkjAqFEL44KoUXEhoYj2uRY8=";
+  };
+
+  # It's used to locate headers
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'get_output(f"{kc} gssapi --prefix")' '"${lib.getDev krb5}"'
+  '';
+
+  env = lib.optionalAttrs (!stdenv.buildPlatform.canExecute stdenv.hostPlatform) {
+    GSSAPI_SUPPORT_DETECT = "false";
+  };
+
+  nativeBuildInputs = [
+    cython
+    krb5
+  ];
+
+  propagatedBuildInputs =  [
+    decorator
+    six
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    GSS
+  ];
+
+  nativeCheckInputs = [
+    k5test
+    nose
+    parameterized
+    shouldbe
+    six
+  ];
+
+  doCheck = pythonOlder "3.8"  # `shouldbe` not available
+    && !stdenv.isDarwin;  # many failures on darwin
+
+  # skip tests which fail possibly due to be an upstream issue (see
+  # https://github.com/pythongssapi/python-gssapi/issues/220)
+  checkPhase = ''
+    # some tests don't respond to being disabled through nosetests -x
+    echo $'\ndel CredsTestCase.test_add_with_impersonate' >> gssapi/tests/test_high_level.py
+    echo $'\ndel TestBaseUtilities.test_acquire_creds_impersonate_name' >> gssapi/tests/test_raw.py
+    echo $'\ndel TestBaseUtilities.test_add_cred_impersonate_name' >> gssapi/tests/test_raw.py
+
+    export PYTHONPATH="$out/${python.sitePackages}:$PYTHONPATH"
+    nosetests -e 'ext_test_\d.*'
+  '';
+  pythonImportsCheck = [ "gssapi" ];
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/gssapi";
+    description = "Python GSSAPI Wrapper";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gst-python/default.nix b/nixpkgs/pkgs/development/python-modules/gst-python/default.nix
new file mode 100644
index 000000000000..abc5d52ece6d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gst-python/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+, meson
+, ninja
+
+, pkg-config
+, python
+, pygobject3
+, gobject-introspection
+, gst_all_1
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "gst-python";
+  version = "1.22.6";
+
+  format = "other";
+
+  outputs = [ "out" "dev" ];
+
+  src = fetchurl {
+    url = "${meta.homepage}/src/gst-python/${pname}-${version}.tar.xz";
+    hash = "sha256-Ud4tbROxLOCV6sl8C5TuWcKuujcSu3Rit4xNV93hdsU=";
+  };
+
+  # Python 2.x is not supported.
+  disabled = !isPy3k;
+
+  depsBuildBuild = [
+    pkg-config
+  ];
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    gobject-introspection
+    gst_all_1.gst-plugins-base
+  ];
+
+  propagatedBuildInputs = [
+    gst_all_1.gst-plugins-base
+    pygobject3
+  ];
+
+  mesonFlags = [
+    "-Dpygi-overrides-dir=${placeholder "out"}/${python.sitePackages}/gi/overrides"
+    # Exec format error during configure
+    "-Dpython=${python.pythonOnBuildForHost.interpreter}"
+  ];
+
+  doCheck = true;
+
+  # TODO: Meson setup hook does not like buildPythonPackage
+  # https://github.com/NixOS/nixpkgs/issues/47390
+  installCheckPhase = "meson test --print-errorlogs";
+
+  meta = with lib; {
+    homepage = "https://gstreamer.freedesktop.org";
+    description = "Python bindings for GStreamer";
+    license = licenses.lgpl2Plus;
+    maintainers = with maintainers; [ lilyinstarlight ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gtfs-realtime-bindings/default.nix b/nixpkgs/pkgs/development/python-modules/gtfs-realtime-bindings/default.nix
new file mode 100644
index 000000000000..99348cb44363
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gtfs-realtime-bindings/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, protobuf
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gtfs-realtime-bindings";
+  version = "1.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-LoztiQRADMk6t+hSCttpNM+mAe2sxvWT/Cy0RIZiu0c=";
+  };
+
+  propagatedBuildInputs = [
+    protobuf
+  ];
+
+  # Tests are not shipped, only a tarball for Java is present
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "google.transit"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings generated from the GTFS Realtime protocol buffer spec";
+    homepage = "https://github.com/MobilityData/gtfs-realtime-bindings";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gtimelog/default.nix b/nixpkgs/pkgs/development/python-modules/gtimelog/default.nix
new file mode 100644
index 000000000000..0d00eaa22dd2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gtimelog/default.nix
@@ -0,0 +1,59 @@
+{ lib, fetchFromGitHub, makeWrapper
+, glibcLocales, gobject-introspection, gtk3, libsoup, libsecret
+, buildPythonPackage, python
+, pygobject3, freezegun, mock
+}:
+
+buildPythonPackage rec {
+  pname = "gtimelog";
+  version = "unstable-2020-05-16";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "80682ddbf9e0d68b8c67257289784f3b49b543d8";
+    sha256 = "0qv2kv7vc3qqlzxsisgg31cmrkkqgnmxspbj10c5fhdmwzzwi0i9";
+  };
+
+  nativeBuildInputs = [ makeWrapper gobject-introspection ];
+  buildInputs = [
+    glibcLocales gtk3 libsoup libsecret
+  ];
+
+  propagatedBuildInputs = [
+    pygobject3 freezegun mock
+  ];
+
+  checkPhase = ''
+    substituteInPlace runtests --replace "/usr/bin/env python3" "${python.interpreter}"
+    ./runtests
+  '';
+
+  pythonImportsCheck = [ "gtimelog" ];
+
+  preFixup = ''
+    wrapProgram $out/bin/gtimelog \
+      --prefix GI_TYPELIB_PATH : "$GI_TYPELIB_PATH" \
+      --prefix LD_LIBRARY_PATH ":" "${gtk3.out}/lib" \
+  '';
+
+  meta = with lib; {
+    description = "A time tracking app";
+    longDescription = ''
+      GTimeLog is a small time tracking application for GNOME.
+      It's main goal is to be as unintrusive as possible.
+
+      To run gtimelog successfully on a system that does not have full GNOME 3
+      installed, the following NixOS options should be set:
+      - programs.dconf.enable = true;
+      - services.gnome.gnome-keyring.enable = true;
+
+      In addition, the following packages should be added to the environment:
+      - gnome.adwaita-icon-theme
+      - gnome.dconf
+    '';
+    homepage = "https://gtimelog.org/";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ oxzi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gtts-token/default.nix b/nixpkgs/pkgs/development/python-modules/gtts-token/default.nix
new file mode 100644
index 000000000000..7785a449d4e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gtts-token/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "gtts-token";
+  version = "1.1.4";
+
+  src = fetchFromGitHub {
+    owner = "boudewijn26";
+    repo = "gTTS-token";
+    rev = "v${version}";
+    sha256 = "0vr52zc0jqyfvsccl67j1baims3cdx2is1y2lpx2kav9gadkn8hp";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  # requires internet access
+  disabledTests = [ "test_real" ];
+
+  meta = with lib; {
+    description = "Calculates a token to run the Google Translate text to speech";
+    homepage = "https://github.com/boudewijn26/gTTS-token";
+    license = licenses.mit;
+    maintainers = with maintainers; [ makefu ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/gtts/default.nix b/nixpkgs/pkgs/development/python-modules/gtts/default.nix
new file mode 100644
index 000000000000..bfdc1b0aecb6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gtts/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, beautifulsoup4
+, click
+, gtts-token
+, mock
+, pytest
+, requests
+, six
+, testfixtures
+, twine
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "gtts";
+  version = "2.4.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pndurette";
+    repo = "gTTS";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-M/RbNw5SJb1R78MDTqBHNWE0I/9PlqikrrJAy1r02f8=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    click
+    gtts-token
+    requests
+    six
+    urllib3
+    twine
+  ];
+
+  nativeCheckInputs = [ pytest mock testfixtures ];
+
+  # majority of tests just try to call out to Google's Translate API endpoint
+  doCheck = false;
+  checkPhase = ''
+    pytest
+  '';
+
+  pythonImportsCheck = [ "gtts" ];
+
+  meta = with lib; {
+    description = "A Python library and CLI tool to interface with Google Translate text-to-speech API";
+    homepage = "https://gtts.readthedocs.io";
+    changelog = "https://gtts.readthedocs.io/en/latest/changelog.html";
+    license = licenses.mit;
+    maintainers = with maintainers; [ unode ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gudhi/default.nix b/nixpkgs/pkgs/development/python-modules/gudhi/default.nix
new file mode 100644
index 000000000000..1e0932e62867
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gudhi/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, cmake
+, boost
+, eigen
+, gmp
+, cgal_5  # see https://github.com/NixOS/nixpkgs/pull/94875 about cgal
+, mpfr
+, tbb
+, numpy
+, cython
+, pybind11
+, matplotlib
+, scipy
+, pytest
+, enableTBB ? false
+}:
+
+buildPythonPackage rec {
+  pname = "gudhi";
+  version = "3.8.0";
+
+  src = fetchFromGitHub {
+    owner = "GUDHI";
+    repo = "gudhi-devel";
+    rev = "tags/gudhi-release-${version}";
+    fetchSubmodules = true;
+    sha256 = "sha256-f2ajy4muG9vuf4JarGWZmdk/LF9OYd2KLSaGyY6BQrY=";
+  };
+
+  patches = [ ./remove_explicit_PYTHONPATH.patch ];
+
+  nativeBuildInputs = [ cmake numpy cython pybind11 matplotlib ];
+  buildInputs = [ boost eigen gmp cgal_5 mpfr ]
+    ++ lib.optionals enableTBB [ tbb ];
+  propagatedBuildInputs = [ numpy scipy ];
+  nativeCheckInputs = [ pytest ];
+
+  cmakeFlags = [
+    "-DWITH_GUDHI_PYTHON=ON"
+    "-DPython_ADDITIONAL_VERSIONS=3"
+  ];
+
+  preBuild = ''
+    cd src/python
+  '';
+
+  checkPhase = ''
+    rm -r gudhi
+    ${cmake}/bin/ctest --output-on-failure
+  '';
+
+  pythonImportsCheck = [ "gudhi" "gudhi.hera" "gudhi.point_cloud" "gudhi.clustering" ];
+
+  meta = {
+    description = "Library for Computational Topology and Topological Data Analysis (TDA)";
+    homepage = "https://gudhi.inria.fr/python/latest/";
+    downloadPage = "https://github.com/GUDHI/gudhi-devel";
+    license = with lib.licenses; [ mit gpl3 ];
+    maintainers = with lib.maintainers; [ yl3dy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gudhi/remove_explicit_PYTHONPATH.patch b/nixpkgs/pkgs/development/python-modules/gudhi/remove_explicit_PYTHONPATH.patch
new file mode 100644
index 000000000000..2b8284ba216d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gudhi/remove_explicit_PYTHONPATH.patch
@@ -0,0 +1,195 @@
+diff --git a/src/python/CMakeLists.txt b/src/python/CMakeLists.txt
+index 86a409b6..09544fb5 100644
+--- a/src/python/CMakeLists.txt
++++ b/src/python/CMakeLists.txt
+@@ -329,15 +329,6 @@ if(PYTHONINTERP_FOUND)
+         WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+         COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_BINARY_DIR}/setup.py" "build_ext" "--inplace")
+ 
+-    add_custom_target(python ALL DEPENDS gudhi.so
+-                      COMMENT "Do not forget to add ${CMAKE_CURRENT_BINARY_DIR}/ to your PYTHONPATH before using examples or tests")
+-
+-    # Path separator management for windows
+-    if (WIN32)
+-      set(GUDHI_PYTHON_PATH_ENV "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR};$ENV{PYTHONPATH}")
+-    else(WIN32)
+-      set(GUDHI_PYTHON_PATH_ENV "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}:$ENV{PYTHONPATH}")
+-    endif(WIN32)
+     # Documentation generation is available through sphinx - requires all modules
+     # Make it first as sphinx test is by far the longest test which is nice when testing in parallel
+     if(SPHINX_PATH)
+@@ -358,13 +349,13 @@ if(PYTHONINTERP_FOUND)
+                       # sphinx target requires gudhi.so, because conf.py reads gudhi version from it
+                       add_custom_target(sphinx
+                           WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc
+-                          COMMAND ${CMAKE_COMMAND} -E env "${GUDHI_PYTHON_PATH_ENV}"
++                          COMMAND ${CMAKE_COMMAND} -E env
+                           ${SPHINX_PATH} -b html ${CMAKE_CURRENT_SOURCE_DIR}/doc ${CMAKE_CURRENT_BINARY_DIR}/sphinx
+                           DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/gudhi.so"
+                           COMMENT "${GUDHI_SPHINX_MESSAGE}" VERBATIM)
+                       add_test(NAME sphinx_py_test
+                                WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+-                               COMMAND ${CMAKE_COMMAND} -E env "${GUDHI_PYTHON_PATH_ENV}"
++                               COMMAND ${CMAKE_COMMAND} -E env
+                                ${SPHINX_PATH} -b doctest ${CMAKE_CURRENT_SOURCE_DIR}/doc ${CMAKE_CURRENT_BINARY_DIR}/doctest)
+                       # Set missing or not modules
+                       set(GUDHI_MODULES ${GUDHI_MODULES} "python-documentation" CACHE INTERNAL "GUDHI_MODULES")
+@@ -408,13 +399,13 @@ if(PYTHONINTERP_FOUND)
+     # Cubical
+     add_test(NAME periodic_cubical_complex_barcode_persistence_from_perseus_file_example_py_test
+              WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+-             COMMAND ${CMAKE_COMMAND} -E env "${GUDHI_PYTHON_PATH_ENV}"
++             COMMAND ${CMAKE_COMMAND} -E env
+              ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/example/periodic_cubical_complex_barcode_persistence_from_perseus_file_example.py"
+              --no-barcode -f ${CMAKE_SOURCE_DIR}/data/bitmap/CubicalTwoSphere.txt)
+ 
+     add_test(NAME random_cubical_complex_persistence_example_py_test
+              WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+-             COMMAND ${CMAKE_COMMAND} -E env "${GUDHI_PYTHON_PATH_ENV}"
++             COMMAND ${CMAKE_COMMAND} -E env
+              ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/example/random_cubical_complex_persistence_example.py"
+              10 10 10)
+ 
+@@ -426,7 +417,7 @@ if(PYTHONINTERP_FOUND)
+ 
+       add_test(NAME cubical_complex_sklearn_itf_py_test
+                WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+-               COMMAND ${CMAKE_COMMAND} -E env "${GUDHI_PYTHON_PATH_ENV}"
++               COMMAND ${CMAKE_COMMAND} -E env
+                ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/example/cubical_complex_sklearn_itf.py")
+     endif()
+ 
+@@ -435,7 +426,7 @@ if(PYTHONINTERP_FOUND)
+       # Bottleneck and Alpha
+       add_test(NAME alpha_rips_persistence_bottleneck_distance_py_test
+                WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+-               COMMAND ${CMAKE_COMMAND} -E env "${GUDHI_PYTHON_PATH_ENV}"
++               COMMAND ${CMAKE_COMMAND} -E env
+                ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/example/alpha_rips_persistence_bottleneck_distance.py"
+                -f ${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off -t 0.15 -d 3)
+     endif (NOT CGAL_WITH_EIGEN3_VERSION VERSION_LESS 5.1.0)
+@@ -443,7 +434,7 @@ if(PYTHONINTERP_FOUND)
+       # Tangential
+       add_test(NAME tangential_complex_plain_homology_from_off_file_example_py_test
+                WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+-               COMMAND ${CMAKE_COMMAND} -E env "${GUDHI_PYTHON_PATH_ENV}"
++               COMMAND ${CMAKE_COMMAND} -E env
+                ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/example/tangential_complex_plain_homology_from_off_file_example.py"
+                --no-diagram -i 2 -f ${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off)
+ 
+@@ -452,13 +443,13 @@ if(PYTHONINTERP_FOUND)
+       # Witness complex
+       add_test(NAME euclidean_strong_witness_complex_diagram_persistence_from_off_file_example_py_test
+                WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+-               COMMAND ${CMAKE_COMMAND} -E env "${GUDHI_PYTHON_PATH_ENV}"
++               COMMAND ${CMAKE_COMMAND} -E env
+                ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/example/euclidean_strong_witness_complex_diagram_persistence_from_off_file_example.py"
+                --no-diagram -f ${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off -a 1.0 -n 20 -d 2)
+ 
+       add_test(NAME euclidean_witness_complex_diagram_persistence_from_off_file_example_py_test
+                WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+-               COMMAND ${CMAKE_COMMAND} -E env "${GUDHI_PYTHON_PATH_ENV}"
++               COMMAND ${CMAKE_COMMAND} -E env
+                ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/example/euclidean_witness_complex_diagram_persistence_from_off_file_example.py"
+                --no-diagram -f ${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off -a 1.0 -n 20 -d 2)
+ 
+@@ -467,7 +458,7 @@ if(PYTHONINTERP_FOUND)
+       # Bottleneck
+       add_test(NAME bottleneck_basic_example_py_test
+                WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+-               COMMAND ${CMAKE_COMMAND} -E env "${GUDHI_PYTHON_PATH_ENV}"
++               COMMAND ${CMAKE_COMMAND} -E env
+                ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/example/bottleneck_basic_example.py")
+ 
+       add_gudhi_py_test(test_bottleneck_distance)
+@@ -479,26 +470,26 @@ if(PYTHONINTERP_FOUND)
+     file(COPY ${CMAKE_SOURCE_DIR}/data/points/COIL_database/lucky_cat_PCA1 DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/)
+     add_test(NAME cover_complex_nerve_example_py_test
+              WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+-             COMMAND ${CMAKE_COMMAND} -E env "${GUDHI_PYTHON_PATH_ENV}"
++             COMMAND ${CMAKE_COMMAND} -E env
+              ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/example/nerve_of_a_covering.py"
+              -f human.off -c 2 -r 10 -g 0.3)
+ 
+     add_test(NAME cover_complex_coordinate_gic_example_py_test
+              WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+-             COMMAND ${CMAKE_COMMAND} -E env "${GUDHI_PYTHON_PATH_ENV}"
++             COMMAND ${CMAKE_COMMAND} -E env
+              ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/example/coordinate_graph_induced_complex.py"
+              -f human.off -c 0 -v)
+ 
+     add_test(NAME cover_complex_functional_gic_example_py_test
+              WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+-             COMMAND ${CMAKE_COMMAND} -E env "${GUDHI_PYTHON_PATH_ENV}"
++             COMMAND ${CMAKE_COMMAND} -E env
+              ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/example/functional_graph_induced_complex.py"
+              -o lucky_cat.off
+              -f lucky_cat_PCA1 -v)
+ 
+     add_test(NAME cover_complex_voronoi_gic_example_py_test
+              WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+-             COMMAND ${CMAKE_COMMAND} -E env "${GUDHI_PYTHON_PATH_ENV}"
++             COMMAND ${CMAKE_COMMAND} -E env
+              ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/example/voronoi_graph_induced_complex.py"
+              -f human.off -n 700 -v)
+ 
+@@ -506,15 +497,15 @@ if(PYTHONINTERP_FOUND)
+       # Alpha
+       add_test(NAME alpha_complex_from_points_example_py_test
+                WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+-               COMMAND ${CMAKE_COMMAND} -E env "${GUDHI_PYTHON_PATH_ENV}"
++               COMMAND ${CMAKE_COMMAND} -E env
+                ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/example/alpha_complex_from_points_example.py")
+       add_test(NAME alpha_complex_from_generated_points_on_sphere_example_py_test
+                WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+-               COMMAND ${CMAKE_COMMAND} -E env "${GUDHI_PYTHON_PATH_ENV}"
++               COMMAND ${CMAKE_COMMAND} -E env
+                ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/example/alpha_complex_from_generated_points_on_sphere_example.py")
+       add_test(NAME alpha_complex_diagram_persistence_from_off_file_example_py_test
+              WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+-             COMMAND ${CMAKE_COMMAND} -E env "${GUDHI_PYTHON_PATH_ENV}"
++             COMMAND ${CMAKE_COMMAND} -E env
+              ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/example/alpha_complex_diagram_persistence_from_off_file_example.py"
+              --no-diagram -f ${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off)
+       add_gudhi_py_test(test_alpha_complex)
+@@ -532,19 +523,19 @@ if(PYTHONINTERP_FOUND)
+     # Rips
+     add_test(NAME rips_complex_diagram_persistence_from_distance_matrix_file_example_py_test
+              WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+-             COMMAND ${CMAKE_COMMAND} -E env "${GUDHI_PYTHON_PATH_ENV}"
++             COMMAND ${CMAKE_COMMAND} -E env
+              ${PYTHON_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/example/rips_complex_diagram_persistence_from_distance_matrix_file_example.py"
+              --no-diagram -f ${CMAKE_SOURCE_DIR}/data/distance_matrix/lower_triangular_distance_matrix.csv -s , -e 12.0 -d 3)
+ 
+     add_test(NAME rips_complex_diagram_persistence_from_off_file_example_py_test
+              WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+-             COMMAND ${CMAKE_COMMAND} -E env "${GUDHI_PYTHON_PATH_ENV}"
++             COMMAND ${CMAKE_COMMAND} -E env
+              ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/example/rips_complex_diagram_persistence_from_off_file_example.py
+              --no-diagram -f ${CMAKE_SOURCE_DIR}/data/points/tore3D_300.off  -e 0.25 -d 3)
+ 
+     add_test(NAME rips_complex_from_points_example_py_test
+              WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+-             COMMAND ${CMAKE_COMMAND} -E env "${GUDHI_PYTHON_PATH_ENV}"
++             COMMAND ${CMAKE_COMMAND} -E env
+              ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/example/rips_complex_from_points_example.py)
+ 
+     add_gudhi_py_test(test_rips_complex)
+@@ -552,7 +543,7 @@ if(PYTHONINTERP_FOUND)
+     # Simplex tree
+     add_test(NAME simplex_tree_example_py_test
+              WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+-             COMMAND ${CMAKE_COMMAND} -E env "${GUDHI_PYTHON_PATH_ENV}"
++             COMMAND ${CMAKE_COMMAND} -E env
+              ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/example/simplex_tree_example.py)
+ 
+     add_gudhi_py_test(test_simplex_tree)
+@@ -565,7 +556,7 @@ if(PYTHONINTERP_FOUND)
+     # Witness
+     add_test(NAME witness_complex_from_nearest_landmark_table_py_test
+              WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+-             COMMAND ${CMAKE_COMMAND} -E env "${GUDHI_PYTHON_PATH_ENV}"
++             COMMAND ${CMAKE_COMMAND} -E env
+              ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/example/witness_complex_from_nearest_landmark_table.py)
+ 
+     add_gudhi_py_test(test_witness_complex)
diff --git a/nixpkgs/pkgs/development/python-modules/guessit/default.nix b/nixpkgs/pkgs/development/python-modules/guessit/default.nix
new file mode 100644
index 000000000000..1b1639ef7d1a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/guessit/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python-dateutil
+, babelfish
+, rebulk
+, pythonOlder
+, importlib-resources
+, py
+, pytestCheckHook
+, pytest-mock
+, pytest-benchmark
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "guessit";
+  version = "3.7.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-LBjZgu5tsw211ZVXrdAySitJvzlAp1KUdRBjKitYo8E=";
+  };
+
+  propagatedBuildInputs = [
+    rebulk
+    babelfish
+    python-dateutil
+  ] ++ lib.optionals (pythonOlder "3.9") [
+   importlib-resources
+ ];
+
+  nativeCheckInputs = [
+    py
+    pytestCheckHook
+    pytest-mock
+    pytest-benchmark
+    pyyaml
+  ];
+
+  pytestFlagsArray = [ "--benchmark-disable" ];
+
+  pythonImportsCheck = [ "guessit" ];
+
+  meta = with lib; {
+    description = "A Python library that extracts as much information as possible from a video filename";
+    homepage = "https://guessit-io.github.io/guessit/";
+    changelog = "https://github.com/guessit-io/guessit/raw/v${version}/CHANGELOG.md";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/guestfs/default.nix b/nixpkgs/pkgs/development/python-modules/guestfs/default.nix
new file mode 100644
index 000000000000..68401e9ea4d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/guestfs/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchurl, libguestfs, qemu }:
+
+buildPythonPackage rec {
+  pname = "guestfs";
+  version = "1.40.1";
+
+  src = fetchurl {
+    url = "http://download.libguestfs.org/python/guestfs-${version}.tar.gz";
+    sha256 = "06a4b5xf1rkhnzfvck91n0z9mlkrgy90s9na5a8da2g4p776lhkf";
+  };
+
+  propagatedBuildInputs = [ libguestfs qemu ];
+
+  # no tests
+  doCheck = false;
+  pythonImportsCheck = [ "guestfs" ];
+
+  meta = with lib; {
+    homepage = "https://libguestfs.org/guestfs-python.3.html";
+    description = "Use libguestfs from Python";
+    license = licenses.lgpl2Plus;
+    maintainers = with maintainers; [ grahamc ];
+    inherit (libguestfs.meta) platforms;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/guidance/default.nix b/nixpkgs/pkgs/development/python-modules/guidance/default.nix
new file mode 100644
index 000000000000..7cd557d394ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/guidance/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, aiohttp
+, diskcache
+, gptcache
+, msal
+, nest-asyncio
+, numpy
+, openai
+, platformdirs
+, pygtrie
+, pyparsing
+, requests
+, tiktoken
+, torch
+}:
+
+buildPythonPackage rec {
+  pname = "guidance";
+  version = "0.0.64";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "microsoft";
+    repo = "guidance";
+    rev = "refs/tags/${version}";
+    hash = "sha256-tQpDJprxctKI88F+CZ9aSJbVo7tjmI4+VrI+WO4QlxE=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    diskcache
+    gptcache
+    msal
+    nest-asyncio
+    numpy
+    openai
+    platformdirs
+    pygtrie
+    pyparsing
+    requests
+    tiktoken
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    torch
+  ];
+
+  disabledTests = [
+    # require network access
+    "test_each_parallel_with_gen_openai"
+  ];
+
+  disabledTestPaths = [
+    # require network access
+    "tests/library/test_gen.py"
+    "tests/library/test_include.py"
+    "tests/library/test_select.py"
+    "tests/llms/test_openai.py"
+    "tests/llms/test_transformers.py"
+    "tests/test_program.py"
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  pythonImportsCheck = [ "guidance" ];
+
+  meta = with lib; {
+    description = "A guidance language for controlling large language models";
+    homepage = "https://github.com/microsoft/guidance";
+    changelog = "https://github.com/microsoft/guidance/releases/tag/${src.rev}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gumath/default.nix b/nixpkgs/pkgs/development/python-modules/gumath/default.nix
new file mode 100644
index 000000000000..7b052fa429c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gumath/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchpatch
+, python
+, numba
+, ndtypes
+, xnd
+, libndtypes
+, libxnd
+, libgumath
+, isPy27
+}:
+
+buildPythonPackage {
+  pname = "gumath";
+  format = "setuptools";
+  disabled = isPy27;
+  inherit (libgumath) src version meta;
+
+  patches = [
+    # https://github.com/xnd-project/gumath/pull/42
+    (fetchpatch {
+      name = "remove-np-warnings-call.patch";
+      url = "https://github.com/xnd-project/gumath/commit/83ab3aa3b07d55654b4e6e75e5ec6be8190fca97.patch";
+      hash = "sha256-7lUXNVH5M+Go1iEu0bud03XI8cyGbdLNdLraMZplDaM=";
+    })
+    (fetchpatch {
+      name = "remove-np-1.25-bartlett-test-assertion.patch";
+      url = "https://github.com/xnd-project/gumath/commit/8741e31f2967ded08c96a7f0631e1e38fe813870.patch";
+      hash = "sha256-flltk3RNPHalbcIV0BrkxWuhqqJBrycos7Fyv3P3mWg=";
+    })
+  ];
+
+  nativeCheckInputs = [ numba ];
+
+  propagatedBuildInputs = [ ndtypes xnd ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'add_include_dirs = [".", "libgumath", "ndtypes/python/ndtypes", "xnd/python/xnd"] + INCLUDES' \
+                'add_include_dirs = [".", "${libndtypes.dev}/include", "${libxnd}/include", "${libgumath}/include"]' \
+      --replace 'add_library_dirs = ["libgumath", "ndtypes/libndtypes", "xnd/libxnd"] + LIBS' \
+                'add_library_dirs = ["${libndtypes}/lib", "${libxnd}/lib", "${libgumath}/lib"]' \
+      --replace 'add_runtime_library_dirs = ["$ORIGIN"]' \
+                'add_runtime_library_dirs = ["${libndtypes}/lib", "${libxnd}/lib", "${libgumath}/lib"]'
+  '';
+
+  postInstall = lib.optionalString stdenv.isDarwin ''
+    install_name_tool -add_rpath ${libgumath}/lib $out/${python.sitePackages}/gumath/_gumath.*.so
+  '';
+
+  checkPhase = ''
+    pushd python
+    mv gumath _gumath
+    # minor precision issues
+    substituteInPlace test_gumath.py --replace 'test_sin' 'dont_test_sin'
+    python test_gumath.py
+    python test_xndarray.py
+    popd
+  '';
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/gunicorn/default.nix b/nixpkgs/pkgs/development/python-modules/gunicorn/default.nix
new file mode 100644
index 000000000000..23bfaae0d2bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gunicorn/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, packaging
+, pythonOlder
+, eventlet
+, gevent
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "gunicorn";
+  version = "21.2.0";
+  format = "setuptools";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "benoitc";
+    repo = "gunicorn";
+    rev = version;
+    hash = "sha256-xP7NNKtz3KNrhcAc00ovLZRx2h6ZqHbwiFOpCiuwf98=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=gunicorn --cov-report=xml" ""
+  '';
+
+  propagatedBuildInputs = [
+    packaging
+  ];
+
+  nativeCheckInputs = [
+    eventlet
+    gevent
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "gunicorn" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/benoitc/gunicorn";
+    description = "gunicorn 'Green Unicorn' is a WSGI HTTP Server for UNIX, fast clients and sleepy applications";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/guppy3/default.nix b/nixpkgs/pkgs/development/python-modules/guppy3/default.nix
new file mode 100644
index 000000000000..65d7c2622a8e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/guppy3/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, tkinter
+}:
+
+buildPythonPackage rec {
+  pname = "guppy3";
+  version = "3.1.4";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "zhuyifei1999";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-RMWIP4tVSCCEQpr0kZvsN1HwL6rBcLuubfBl175eSNg=";
+  };
+
+  propagatedBuildInputs = [ tkinter ];
+
+  # Tests are starting a Tkinter GUI
+  doCheck = false;
+  pythonImportsCheck = [ "guppy" ];
+
+  meta = with lib; {
+    description = "Python Programming Environment & Heap analysis toolset";
+    homepage = "https://zhuyifei1999.github.io/guppy3/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gurobipy/darwin.nix b/nixpkgs/pkgs/development/python-modules/gurobipy/darwin.nix
new file mode 100644
index 000000000000..3bd3b3b2a329
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gurobipy/darwin.nix
@@ -0,0 +1,33 @@
+{ fetchurl, python, xar, cpio, cctools, insert_dylib }:
+assert python.pkgs.isPy27 && python.ucsEncoding == 2;
+python.pkgs.buildPythonPackage
+  { pname = "gurobipy";
+    version = "7.5.2";
+    src = fetchurl
+      { url = "http://packages.gurobi.com/7.5/gurobi7.5.2_mac64.pkg";
+        sha256 = "10zgn8741x48xjdiknj59x66mwj1azhihi1j5a1ajxi2n5fsak2h";
+      };
+    buildInputs = [ xar cpio cctools insert_dylib ];
+    unpackPhase =
+      ''
+        xar -xf $src
+        zcat gurobi*mac64tar.pkg/Payload | cpio -i
+        tar xf gurobi*_mac64.tar.gz
+        sourceRoot=$(echo gurobi*/*64)
+        runHook postUnpack
+      '';
+    patches = [ ./no-clever-setup.patch ];
+    postInstall = "mv lib/lib*.so $out/lib";
+    postFixup =
+      ''
+        install_name_tool -change \
+          /System/Library/Frameworks/Python.framework/Versions/2.7/Python \
+          ${python}/lib/libpython2.7.dylib \
+          $out/lib/python2.7/site-packages/gurobipy/gurobipy.so
+        install_name_tool -change /Library/gurobi752/mac64/lib/libgurobi75.so \
+          $out/lib/libgurobi75.so \
+          $out/lib/python2.7/site-packages/gurobipy/gurobipy.so
+        insert_dylib --inplace $out/lib/libaes75.so \
+          $out/lib/python2.7/site-packages/gurobipy/gurobipy.so
+      '';
+  }
diff --git a/nixpkgs/pkgs/development/python-modules/gurobipy/linux.nix b/nixpkgs/pkgs/development/python-modules/gurobipy/linux.nix
new file mode 100644
index 000000000000..e9a72cbb5cba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gurobipy/linux.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, python, gurobi }:
+
+buildPythonPackage {
+  pname = "gurobipy";
+  version = "9.1.2";
+
+  src = gurobi.src;
+
+  setSourceRoot = "sourceRoot=$(echo gurobi*/*64)";
+
+  patches = [ ./no-clever-setup.patch ];
+
+  postInstall = ''
+    mv lib/libgurobi*.so* $out/lib
+  '';
+
+  postFixup = ''
+    patchelf --set-rpath $out/lib \
+      $out/lib/${python.libPrefix}/site-packages/gurobipy/gurobipy.so
+  '';
+
+  meta = with lib; {
+    description = "The Gurobi Python interface";
+    homepage = "https://www.gurobi.com";
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    license = licenses.unfree;
+    platforms = [ "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gurobipy/no-clever-setup.patch b/nixpkgs/pkgs/development/python-modules/gurobipy/no-clever-setup.patch
new file mode 100644
index 000000000000..bcb43a4707bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gurobipy/no-clever-setup.patch
@@ -0,0 +1,41 @@
+diff -Naur a/setup.py b/setup.py
+--- a/setup.py	2021-04-24 12:53:18.300255006 -0500
++++ b/setup.py	2021-04-24 12:47:51.619052574 -0500
+@@ -15,29 +15,6 @@
+ from distutils.command.install import install
+ import os,sys,shutil
+ 
+-class GurobiClean(Command):
+-    description = "remove the build directory"
+-    user_options = []
+-    def initialize_options(self):
+-        self.cwd = None
+-    def finalize_options(self):
+-        self.cwd = os.path.dirname(os.path.realpath(__file__))
+-    def run(self):
+-        build_dir = os.path.join(os.getcwd(), "build")
+-        if os.path.exists(build_dir):
+-            print('removing %s' % build_dir)
+-            shutil.rmtree(build_dir)
+-
+-class GurobiInstall(install):
+-
+-    # Calls the default run command, then deletes the build area
+-    # (equivalent to "setup clean --all").
+-    def run(self):
+-        install.run(self)
+-        c = GurobiClean(self.distribution)
+-        c.finalize_options()
+-        c.run()
+-
+ License = """
+     This software is covered by the Gurobi End User License Agreement.
+     By completing the Gurobi installation process and using the software,
+@@ -78,7 +55,5 @@
+       packages = ['gurobipy'],
+       package_dir={'gurobipy' : srcpath },
+       package_data = {'gurobipy' : [srcfile] },
+-      cmdclass={'install' : GurobiInstall, 
+-                'clean'   : GurobiClean }
+       )
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/guzzle-sphinx-theme/default.nix b/nixpkgs/pkgs/development/python-modules/guzzle-sphinx-theme/default.nix
new file mode 100644
index 000000000000..48d87c8dd7d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/guzzle-sphinx-theme/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "guzzle-sphinx-theme";
+  version = "0.7.11";
+  pyproject = true;
+
+  src = fetchPypi {
+    pname = "guzzle_sphinx_theme";
+    inherit version;
+    hash = "sha256-m4wWOcNDwCw/PbffZg3fb1M7VFTukqX3sC7apXP+0+Y=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  doCheck = false; # no tests
+
+  propagatedBuildInputs = [ sphinx ];
+
+  pythonImportsCheck = [
+    "guzzle_sphinx_theme"
+  ];
+
+  meta = with lib; {
+    description = "Sphinx theme used by Guzzle: http://guzzlephp.org";
+    homepage = "https://github.com/guzzle/guzzle_sphinx_theme/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ flokli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gviz-api/default.nix b/nixpkgs/pkgs/development/python-modules/gviz-api/default.nix
new file mode 100644
index 000000000000..04ba3b9520fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gviz-api/default.nix
@@ -0,0 +1,25 @@
+{ lib, fetchPypi, buildPythonPackage
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "gviz_api";
+  version = "1.10.0";
+  format = "wheel";
+
+  src = fetchPypi {
+    inherit pname version format;
+    sha256 = "a05055fed8c279f34f4b496eace7648c7fe9c1b06851e8a36e748541f1adbb05";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  meta = with lib; {
+    description = "Python API for Google Visualization";
+    homepage = "https://developers.google.com/chart/interactive/docs/dev/gviz_api_lib";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ndl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gvm-tools/default.nix b/nixpkgs/pkgs/development/python-modules/gvm-tools/default.nix
new file mode 100644
index 000000000000..7cb78248c172
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gvm-tools/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, python-gvm
+, pythonAtLeast
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gvm-tools";
+  version = "23.11.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "greenbone";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ZwImkTYYSscmGJYCpMWmZjToi41XjT4Znpo8j66BKIs=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    python-gvm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Don't test sending
+    "SendTargetTestCase"
+  ] ++ lib.optionals (pythonAtLeast "3.10") [
+    "HelpFormattingParserTestCase"
+  ];
+
+  pythonImportsCheck = [
+    "gvmtools"
+  ];
+
+  meta = with lib; {
+    description = "Collection of APIs that help with remote controlling a Greenbone Security Manager";
+    homepage = "https://github.com/greenbone/gvm-tools";
+    changelog = "https://github.com/greenbone/gvm-tools/releases/tag/v${version}";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gym-notices/default.nix b/nixpkgs/pkgs/development/python-modules/gym-notices/default.nix
new file mode 100644
index 000000000000..6c6d97a459ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gym-notices/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "gym-notices";
+  version = "0.0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rSXiAEh8r6NpcoYl/gZOiK2hNGYYUmECZZtGQPK0uRE=";
+  };
+
+  pythonImportsCheck = [ "gym_notices" ];
+
+  meta = with lib; {
+    description = "Notices for Python package Gym";
+    homepage = "https://github.com/Farama-Foundation/gym-notices";
+    license = licenses.mit;
+    maintainers = with maintainers; [ billhuang ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/gym/default.nix b/nixpkgs/pkgs/development/python-modules/gym/default.nix
new file mode 100644
index 000000000000..56bbe2b9e80b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gym/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, cloudpickle
+, gym-notices
+, importlib-metadata
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "gym";
+  version = "0.26.2";
+
+  src = fetchFromGitHub {
+    owner = "openai";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-uJgm8l1SxIRC5PV6BIH/ht/1ucGT5UaUhkFMdusejgA=";
+  };
+
+  propagatedBuildInputs = [
+    cloudpickle
+    numpy
+    gym-notices
+  ] ++ lib.optionals (pythonOlder "3.10") [ importlib-metadata ];
+
+  # The test needs MuJoCo that is not free library.
+  doCheck = false;
+
+  pythonImportsCheck = [ "gym" ];
+
+  meta = with lib; {
+    description = "A toolkit for developing and comparing your reinforcement learning agents";
+    homepage = "https://gym.openai.com/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hyphon81 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gymnasium/default.nix b/nixpkgs/pkgs/development/python-modules/gymnasium/default.nix
new file mode 100644
index 000000000000..6e9e33913fb7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gymnasium/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, numpy
+, cloudpickle
+, gym-notices
+, jax-jumpy
+, typing-extensions
+, farama-notifications
+, importlib-metadata
+, pythonOlder
+, ffmpeg
+, jax
+, jaxlib
+, matplotlib
+, moviepy
+, opencv4
+, pybox2d
+, pygame
+, pytestCheckHook
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "gymnasium";
+  version = "0.29.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "Farama-Foundation";
+    repo = "gymnasium";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-L7fn9FaJzXwQhjDKwI9hlFpbPuQdwynU+Xjd8bbjxiw=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  propagatedBuildInputs = [
+    cloudpickle
+    farama-notifications
+    gym-notices
+    jax-jumpy
+    numpy
+    typing-extensions
+  ] ++ lib.optionals (pythonOlder "3.10") [ importlib-metadata ];
+
+  pythonImportsCheck = [ "gymnasium" ];
+
+  nativeCheckInputs = [
+    ffmpeg
+    jax
+    jaxlib
+    matplotlib
+    moviepy
+    opencv4
+    pybox2d
+    pygame
+    pytestCheckHook
+    scipy
+  ];
+
+  disabledTestPaths = [
+    # mujoco is required for those tests but the mujoco python bindings are not packaged in nixpkgs.
+    "tests/envs/mujoco/test_mujoco_custom_env.py"
+
+    # Those tests need to write on the filesystem which cause them to fail.
+    "tests/experimental/wrappers/test_record_video.py"
+    "tests/utils/test_save_video.py"
+    "tests/wrappers/test_record_video.py"
+    "tests/wrappers/test_video_recorder.py"
+  ];
+
+  meta = with lib; {
+    description = "A standard API for reinforcement learning and a diverse set of reference environments (formerly Gym)";
+    homepage = "https://github.com/Farama-Foundation/Gymnasium";
+    license = licenses.mit;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gyp/default.nix b/nixpkgs/pkgs/development/python-modules/gyp/default.nix
new file mode 100644
index 000000000000..385f28b4615a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gyp/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitiles
+, six
+, python
+}:
+
+buildPythonPackage {
+  pname = "gyp";
+  version = "unstable-2022-04-01";
+
+  src = fetchFromGitiles {
+    url = "https://chromium.googlesource.com/external/gyp";
+    rev = "9ecf45e37677743503342ee4c6a76eaee80e4a7f";
+    hash = "sha256-LUlF2VhRnuDwJLdITgmXIQV/IuKdx1KXQkiPVHKrl4Q=";
+  };
+
+  patches = lib.optionals stdenv.isDarwin [
+    ./no-darwin-cflags.patch
+    ./no-xcode.patch
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  pythonImportsCheck = [ "gyp" "gyp.generator" ];
+
+  # Make mac_tool.py executable so that patchShebangs hook processes it. This
+  # file is copied and run by builds using gyp on macOS
+  preFixup = ''
+    chmod +x "$out/${python.sitePackages}/gyp/mac_tool.py"
+  '';
+
+  meta = with lib; {
+    description = "A tool to generate native build files";
+    homepage = "https://gyp.gsrc.io";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ codyopel ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/gyp/no-darwin-cflags.patch b/nixpkgs/pkgs/development/python-modules/gyp/no-darwin-cflags.patch
new file mode 100644
index 000000000000..798d0f0b16d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gyp/no-darwin-cflags.patch
@@ -0,0 +1,40 @@
+Index: gyp/pylib/gyp/xcode_emulation.py
+===================================================================
+--- gyp/pylib/gyp/xcode_emulation.py
++++ gyp/pylib/gyp/xcode_emulation.py
+@@ -483,9 +483,6 @@
+     if self._Test('GCC_CHAR_IS_UNSIGNED_CHAR', 'YES', default='NO'):
+       cflags.append('-funsigned-char')
+ 
+-    if self._Test('GCC_CW_ASM_SYNTAX', 'YES', default='YES'):
+-      cflags.append('-fasm-blocks')
+-
+     if 'GCC_DYNAMIC_NO_PIC' in self._Settings():
+       if self._Settings()['GCC_DYNAMIC_NO_PIC'] == 'YES':
+         cflags.append('-mdynamic-no-pic')
+@@ -495,9 +492,6 @@
+       # mdynamic-no-pic by default for executable and possibly static lib
+       # according to mento
+ 
+-    if self._Test('GCC_ENABLE_PASCAL_STRINGS', 'YES', default='YES'):
+-      cflags.append('-mpascal-strings')
+-
+     self._Appendf(cflags, 'GCC_OPTIMIZATION_LEVEL', '-O%s', default='s')
+ 
+     if self._Test('GCC_GENERATE_DEBUGGING_SYMBOLS', 'YES', default='YES'):
+@@ -553,7 +541,6 @@
+       # TODO: Supporting fat binaries will be annoying.
+       self._WarnUnimplemented('ARCHS')
+       archs = ['i386']
+-    cflags.append('-arch ' + archs[0])
+ 
+     if archs[0] in ('i386', 'x86_64'):
+       if self._Test('GCC_ENABLE_SSE3_EXTENSIONS', 'YES', default='NO'):
+@@ -811,7 +798,6 @@
+       # TODO: Supporting fat binaries will be annoying.
+       self._WarnUnimplemented('ARCHS')
+       archs = ['i386']
+-    ldflags.append('-arch ' + archs[0])
+ 
+     # Xcode adds the product directory by default.
+     ldflags.append('-L' + product_dir)
diff --git a/nixpkgs/pkgs/development/python-modules/gyp/no-xcode.patch b/nixpkgs/pkgs/development/python-modules/gyp/no-xcode.patch
new file mode 100644
index 000000000000..0e46865846a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/gyp/no-xcode.patch
@@ -0,0 +1,25 @@
+--- gyp-old/pylib/gyp/xcode_emulation.py	1980-01-02 00:00:00.000000000 -0600
++++ gyp/pylib/gyp/xcode_emulation.py	2020-08-02 20:24:24.871322520 -0500
+@@ -1407,10 +1407,10 @@
+       raise GypError("xcodebuild returned unexpected results")
+   except:
+     version = CLTVersion()
+-    if version:
++    if version and re.match(r'(\d\.\d\.?\d*)', version):
+       version = re.match(r'(\d\.\d\.?\d*)', version).groups()[0]
+     else:
+-      raise GypError("No Xcode or CLT version detected!")
++      version = '7.0.0'
+     # The CLT has no build information, so we return an empty string.
+     version_list = [version, '']
+   version = version_list[0]
+@@ -1667,7 +1667,8 @@
+     sdk_root = xcode_settings._SdkRoot(configuration)
+     if not sdk_root:
+       sdk_root = xcode_settings._XcodeSdkPath('')
+-    env['SDKROOT'] = sdk_root
++    if not sdk_root:
++      env['SDKROOT'] = ''
+ 
+   if not additional_settings:
+     additional_settings = {}
diff --git a/nixpkgs/pkgs/development/python-modules/h11/default.nix b/nixpkgs/pkgs/development/python-modules/h11/default.nix
new file mode 100644
index 000000000000..872ef1ab4358
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/h11/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, httpcore
+, httpx
+, wsproto
+}:
+
+buildPythonPackage rec {
+  pname = "h11";
+  version = "0.14.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jxn7vpnnJCD/NcALJ6NMuZN+kCqLgQ4siDAMbwo7aZ0=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  # Some of the tests use localhost networking.
+  __darwinAllowLocalNetworking = true;
+
+  passthru.tests = {
+    inherit httpcore httpx wsproto;
+  };
+
+  meta = with lib; {
+    description = "Pure-Python, bring-your-own-I/O implementation of HTTP/1.1";
+    homepage = "https://github.com/python-hyper/h11";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/h2/default.nix b/nixpkgs/pkgs/development/python-modules/h2/default.nix
new file mode 100644
index 000000000000..bb37c4d1607b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/h2/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, fetchpatch
+, hpack
+, hyperframe
+, pytestCheckHook
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "h2";
+  version = "4.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-qDrKCPvnqst5/seIycC6yTY0NWDtnsGLgqE6EsKNKrs=";
+  };
+
+  patches = [
+    # https://github.com/python-hyper/h2/pull/1274
+    (fetchpatch {
+      name = "fix-tests-in-python-3.11.patch";
+      url = "https://github.com/python-hyper/h2/commit/8952c91606cd014720ccf202a25b5ee1fbed1591.patch";
+      hash = "sha256-skAdAVHMZo1xJEqqKa6FOKPvoQQbGUgGsQjE11jIjtw=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    hpack
+    hyperframe
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    hypothesis
+  ];
+
+  disabledTests = [
+    # timing sensitive
+    "test_changing_max_frame_size"
+  ];
+
+  pythonImportsCheck = [
+    "h2.connection"
+    "h2.config"
+  ];
+
+  meta = with lib; {
+    description = "HTTP/2 State-Machine based protocol implementation";
+    homepage = "https://github.com/python-hyper/h2";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/h3/default.nix b/nixpkgs/pkgs/development/python-modules/h3/default.nix
new file mode 100644
index 000000000000..eb9af29bbb0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/h3/default.nix
@@ -0,0 +1,69 @@
+{ autoPatchelfHook
+, buildPythonPackage
+, cmake
+, cython
+, fetchFromGitHub
+, h3
+, lib
+, numpy
+, pytestCheckHook
+, scikit-build
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "h3";
+  version = "3.7.6";
+
+  # pypi version does not include tests
+  src = fetchFromGitHub {
+    owner = "uber";
+    repo = "h3-py";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-QNiuiHJ4IMxpi39iobPSSlYUUj5oxpxO4B2+HXVQ/Zk=";
+  };
+
+  dontConfigure = true;
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  nativeBuildInputs = [
+    scikit-build cmake cython
+  ] ++ lib.optionals stdenv.hostPlatform.isLinux [
+    # On Linux the .so files ends up referring to libh3.so instead of the full
+    # Nix store path. I'm not sure why this is happening! On Darwin it works
+    # fine.
+    autoPatchelfHook
+  ];
+
+  # This is not needed per-se, it's only added for autoPatchelfHook to work
+  # correctly. See the note above ^^
+  buildInputs = lib.optionals stdenv.hostPlatform.isLinux [ h3 ];
+
+  propagatedBuildInputs = [ numpy ];
+
+  # The following prePatch replaces the h3lib compilation with using the h3 packaged in nixpkgs.
+  #
+  # - Remove the h3lib submodule.
+  # - Patch CMakeLists to avoid building h3lib, and use h3 instead.
+  prePatch =
+    let
+      cmakeCommands = ''
+        include_directories(${h3}/include/h3)
+        link_directories(${h3}/lib)
+      '';
+    in ''
+      rm -r src/h3lib
+      substituteInPlace CMakeLists.txt --replace "add_subdirectory(src/h3lib)" "${cmakeCommands}"
+    '';
+
+  # Extra check to make sure we can import it from Python
+  pythonImportsCheck = [ "h3" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/uber/h3-py";
+    description = "Hierarchical hexagonal geospatial indexing system";
+    license = licenses.asl20;
+    maintainers = [ maintainers.kalbasit ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/h5netcdf/default.nix b/nixpkgs/pkgs/development/python-modules/h5netcdf/default.nix
new file mode 100644
index 000000000000..1c97861f1eee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/h5netcdf/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, h5py
+, pytestCheckHook
+, netcdf4
+, pythonOlder
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "h5netcdf";
+  version = "1.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-f2snM73gbqJXW3mmRQ2b1cOJGP9MsqNVvyK76Mhsa88=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    h5py
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    netcdf4
+  ];
+
+  dontUseSetuptoolsCheck = true;
+
+  pythonImportsCheck = [
+    "h5netcdf"
+  ];
+
+  meta = with lib; {
+    description = "netCDF4 via h5py";
+    homepage = "https://github.com/shoyer/h5netcdf";
+    changelog = "https://github.com/h5netcdf/h5netcdf/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/h5py/default.nix b/nixpkgs/pkgs/development/python-modules/h5py/default.nix
new file mode 100644
index 000000000000..3fb20fad4c3b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/h5py/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, oldest-supported-numpy
+, setuptools
+, wheel
+, numpy
+, hdf5
+, cython
+, pkgconfig
+, mpi4py ? null
+, openssh
+, pytestCheckHook
+, cached-property
+}:
+
+assert hdf5.mpiSupport -> mpi4py != null && hdf5.mpi == mpi4py.mpi;
+
+let
+  mpi = hdf5.mpi;
+  mpiSupport = hdf5.mpiSupport;
+in buildPythonPackage rec {
+  version = "3.9.0";
+  pname = "h5py";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5gTbZSHB42fGvX+tI5yEf1PMRmRvLSZRNy0Frl6V+Bc=";
+  };
+
+  # avoid strict pinning of numpy
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "mpi4py ==" "mpi4py >="
+  '';
+
+  HDF5_DIR = "${hdf5}";
+  HDF5_MPI = if mpiSupport then "ON" else "OFF";
+
+  postConfigure = ''
+    # Needed to run the tests reliably. See:
+    # https://bitbucket.org/mpi4py/mpi4py/issues/87/multiple-test-errors-with-openmpi-30
+    ${lib.optionalString mpiSupport "export OMPI_MCA_rmaps_base_oversubscribe=yes"}
+  '';
+
+  preBuild = lib.optionalString mpiSupport "export CC=${mpi}/bin/mpicc";
+
+  nativeBuildInputs = [
+    cython
+    oldest-supported-numpy
+    pkgconfig
+    setuptools
+    wheel
+  ];
+
+  buildInputs = [ hdf5 ]
+    ++ lib.optional mpiSupport mpi;
+
+  propagatedBuildInputs = [ numpy ]
+    ++ lib.optionals mpiSupport [ mpi4py openssh ]
+    ++ lib.optionals (pythonOlder "3.8") [ cached-property ];
+
+  # tests now require pytest-mpi, which isn't available and difficult to package
+  doCheck = false;
+  nativeCheckInputs = [ pytestCheckHook openssh ];
+
+  pythonImportsCheck = [ "h5py" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/h5py/h5py/blob/${version}/docs/whatsnew/${lib.versions.majorMinor version}.rst";
+    description = "Pythonic interface to the HDF5 binary data format";
+    homepage = "http://www.h5py.org/";
+    license = licenses.bsd3;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ha-ffmpeg/default.nix b/nixpkgs/pkgs/development/python-modules/ha-ffmpeg/default.nix
new file mode 100644
index 000000000000..0da05c75f2db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ha-ffmpeg/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, async-timeout
+}:
+
+buildPythonPackage rec {
+  pname = "ha-ffmpeg";
+  version = "3.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sheNYtmp1panthglpEqJTdaCgGBTUJRswikl5hu9k7s=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+  ];
+
+  # only manual tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "haffmpeg.camera"
+    "haffmpeg.sensor"
+    "haffmpeg.tools"
+  ];
+
+  meta = with lib; {
+    description = "Library for Home Assistant to handle ffmpeg";
+    homepage = "https://github.com/home-assistant-libs/ha-ffmpeg/";
+    changelog = "https://github.com/home-assistant-libs/ha-ffmpeg/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = teams.home-assistant.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ha-mqtt-discoverable/default.nix b/nixpkgs/pkgs/development/python-modules/ha-mqtt-discoverable/default.nix
new file mode 100644
index 000000000000..202678344145
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ha-mqtt-discoverable/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, gitlike-commands
+, paho-mqtt
+, poetry-core
+, pyaml
+, pydantic
+, pythonOlder
+, thelogrus
+}:
+
+buildPythonPackage rec {
+  pname = "ha-mqtt-discoverable";
+  version = "0.13.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "unixorn";
+    repo = "ha-mqtt-discoverable";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-DY2VvCxcbSO+H+SCRmIybq9fcB+areYQ+R6Js6oExjk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    gitlike-commands
+    paho-mqtt
+    pyaml
+    pydantic
+    thelogrus
+  ];
+
+  # Test require a running Mosquitto instance
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ha_mqtt_discoverable"
+  ];
+
+  meta = with lib; {
+    description = "Python module to create MQTT entities that are automatically discovered by Home Assistant";
+    homepage = "https://github.com/unixorn/ha-mqtt-discoverable";
+    changelog = "https://github.com/unixorn/ha-mqtt-discoverable/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ha-philipsjs/default.nix b/nixpkgs/pkgs/development/python-modules/ha-philipsjs/default.nix
new file mode 100644
index 000000000000..5530cfe070f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ha-philipsjs/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, httpx
+, pytest-aiohttp
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, respx
+}:
+
+buildPythonPackage rec {
+  pname = "ha-philipsjs";
+  version = "3.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "danielperna84";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-r8uqToxkJg9j89UUZpxsPXutWPefAYDW95zFBKU9Al4=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    httpx
+  ];
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytest-mock
+    pytestCheckHook
+    respx
+  ];
+
+  pythonImportsCheck = [
+    "haphilipsjs"
+  ];
+
+  meta = with lib; {
+    description = "Python library to interact with Philips TVs with jointSPACE API";
+    homepage = "https://github.com/danielperna84/ha-philipsjs";
+    changelog = "https://github.com/danielperna84/ha-philipsjs/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/habanero/default.nix b/nixpkgs/pkgs/development/python-modules/habanero/default.nix
new file mode 100644
index 000000000000..8450386c2677
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/habanero/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, requests
+, tqdm
+, nose
+, vcrpy
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "habanero";
+  version = "1.2.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sckott";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-IQp85Cigs0in3X07a9d45nMC3X2tAkPzl5hFVhfr00o=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    tqdm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    vcrpy
+  ];
+
+  pythonImportsCheck = [
+    "habanero"
+  ];
+
+  # almost the entirety of the test suite makes network calls
+  pytestFlagsArray = [
+    "test/test-filters.py"
+  ];
+
+  meta = with lib; {
+    description = "Python interface to Library Genesis";
+    homepage = "https://habanero.readthedocs.io/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nico202 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/habitipy/default.nix b/nixpkgs/pkgs/development/python-modules/habitipy/default.nix
new file mode 100644
index 000000000000..db4e84d13615
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/habitipy/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, plumbum
+, requests
+, setuptools
+, hypothesis
+, nose
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "habitipy";
+  version = "0.3.0";
+
+  src = fetchFromGitHub {
+    owner = "ASMfreaK";
+    repo = "habitipy";
+    rev = "v${version}";
+    sha256 = "1vf485z5m4h61p64zr3sgkcil2s3brq7dja4n7m49d1fvzcirylv";
+  };
+
+  propagatedBuildInputs = [
+    plumbum
+    requests
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    nose
+    responses
+  ];
+
+  checkPhase = ''
+    HOME=$TMPDIR nosetests
+  '';
+
+  pythonImportsCheck = [ "habitipy" ];
+
+  meta = with lib; {
+    description = "Tools and library for Habitica restful API";
+    homepage = "https://github.com/ASMfreaK/habitipy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hachoir/default.nix b/nixpkgs/pkgs/development/python-modules/hachoir/default.nix
new file mode 100644
index 000000000000..0de262ab7b43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hachoir/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, urwid
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hachoir";
+  version = "3.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "vstinner";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-BRrb6bnPSDVjZF1cOA9NlUYd2HrtqZEAVhHgkjmE0Xg=";
+  };
+
+  propagatedBuildInputs = [
+    urwid
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "hachoir"
+  ];
+
+  meta = with lib; {
+    description = "Python library to view and edit a binary stream";
+    homepage = "https://hachoir.readthedocs.io/";
+    changelog = "https://github.com/vstinner/hachoir/blob/${version}/doc/changelog.rst";
+    license = with licenses; [ gpl2Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hacking/default.nix b/nixpkgs/pkgs/development/python-modules/hacking/default.nix
new file mode 100644
index 000000000000..bd92a2712228
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hacking/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pbr
+, flake8
+, stestr
+, ddt
+, testscenarios
+}:
+
+buildPythonPackage rec {
+  pname = "hacking";
+  version = "6.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-YdeEb8G58m7CFnjpkHQmkJX5ZNe72M1kbrbIxML4jcE=";
+  };
+
+  postPatch = ''
+    sed -i 's/flake8.*/flake8/' requirements.txt
+    substituteInPlace hacking/checks/python23.py \
+      --replace 'H236: class Foo(object):\n    __metaclass__ = \' 'Okay: class Foo(object):\n    __metaclass__ = \'
+    substituteInPlace hacking/checks/except_checks.py \
+      --replace 'H201: except:' 'Okay: except:'
+  '';
+
+  nativeBuildInputs = [ pbr ];
+
+  propagatedBuildInputs = [
+    flake8
+  ];
+
+  nativeCheckInputs = [
+    ddt
+    stestr
+    testscenarios
+  ];
+
+  checkPhase = ''
+    # tries to trigger flake8 and fails
+    rm hacking/tests/test_doctest.py
+
+    stestr run
+  '';
+
+  pythonImportsCheck = [ "hacking" ];
+
+  meta = with lib; {
+    description = "OpenStack Hacking Guideline Enforcement";
+    homepage = "https://github.com/openstack/hacking";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hahomematic/default.nix b/nixpkgs/pkgs/development/python-modules/hahomematic/default.nix
new file mode 100644
index 000000000000..e69d51887050
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hahomematic/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, freezegun
+, orjson
+, pydevccu
+, pytest-aiohttp
+, pytestCheckHook
+, python-slugify
+, pythonOlder
+, setuptools
+, voluptuous
+, websocket-client
+, xmltodict
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "hahomematic";
+  version = "2023.11.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "danielperna84";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-LB0BGj/DWjHGAFkyACkkzGY1oYNc7hJ2BeT1lHlNjqU=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "setuptools~=68.2" "setuptools" \
+      --replace "wheel~=0.41.2" "wheel"
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    orjson
+    python-slugify
+    voluptuous
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    pydevccu
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "hahomematic"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interact with HomeMatic devices";
+    homepage = "https://github.com/danielperna84/hahomematic";
+    changelog = "https://github.com/danielperna84/hahomematic/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/halo/default.nix b/nixpkgs/pkgs/development/python-modules/halo/default.nix
new file mode 100644
index 000000000000..bd1d5f726363
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/halo/default.nix
@@ -0,0 +1,33 @@
+{ buildPythonPackage
+, colorama
+, fetchPypi
+, isPy27
+, lib
+, log-symbols
+, six
+, spinners
+, termcolor }:
+
+buildPythonPackage rec {
+  pname = "halo";
+  version = "0.0.31";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1mn97h370ggbc9vi6x8r6akd5q8i512y6kid2nvm67g93r9a6rvv";
+  };
+
+  propagatedBuildInputs = [ colorama log-symbols termcolor six spinners ];
+
+  # Tests are not included in the PyPI distribution and the git repo does not have tagged releases
+  doCheck = false;
+  pythonImportsCheck = [ "halo" ];
+
+  meta = with lib; {
+    description = "Beautiful Spinners for Terminal, IPython and Jupyter.";
+    homepage = "https://github.com/manrajgrover/halo";
+    license = licenses.mit;
+    maintainers = with maintainers; [ urbas ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/halohome/default.nix b/nixpkgs/pkgs/development/python-modules/halohome/default.nix
new file mode 100644
index 000000000000..2ef4acd0770d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/halohome/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, aiohttp
+, bleak
+, buildPythonPackage
+, csrmesh
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "halohome";
+  version = "0.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nayaverdier";
+    repo = pname;
+    rev = version;
+    hash = "sha256-xnUOObqVg1E7mTDKHZMoC95KI9ZIn0YpkQjoASa5Dds=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    bleak
+    csrmesh
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "halohome"
+  ];
+
+  meta = with lib; {
+    description = "Python library to control Eaton HALO Home Smart Lights";
+    homepage = "https://github.com/nayaverdier/halohome";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/handout/default.nix b/nixpkgs/pkgs/development/python-modules/handout/default.nix
new file mode 100644
index 000000000000..316c9a6edcac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/handout/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi
+, imageio, imageio-ffmpeg }:
+
+buildPythonPackage rec {
+  pname = "handout";
+  version = "1.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "52daaf1f9a4cb2ceb88c1dedf85d22ef449b9422b424a2534d21f941e57bc915";
+  };
+
+  propagatedBuildInputs = [ imageio imageio-ffmpeg ];
+
+  meta = with lib; {
+    description = "Turn Python scripts into handouts with Markdown and figures";
+    homepage = "https://github.com/danijar/handout";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ averelld ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hap-python/default.nix b/nixpkgs/pkgs/development/python-modules/hap-python/default.nix
new file mode 100644
index 000000000000..0bb7f35e288f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hap-python/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, base36
+, chacha20poly1305-reuseable
+, cryptography
+, fetchFromGitHub
+, h11
+, orjson
+, pyqrcode
+, pytest-asyncio
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, zeroconf
+}:
+
+buildPythonPackage rec {
+  pname = "hap-python";
+  version = "4.9.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ikalchev";
+    repo = "HAP-python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-nnh8PSEcuPN1qGuInJ7uYe83zdne8axbTrHd4g1xoJs=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+    chacha20poly1305-reuseable
+    cryptography
+    h11
+    orjson
+    zeroconf
+  ];
+
+  passthru.optional-dependencies.QRCode = [
+    base36
+    pyqrcode
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-timeout
+    pytestCheckHook
+  ]
+  ++ passthru.optional-dependencies.QRCode;
+
+  disabledTestPaths = [
+    # Disable tests requiring network access
+    "tests/test_accessory_driver.py"
+    "tests/test_hap_handler.py"
+    "tests/test_hap_protocol.py"
+  ];
+
+  disabledTests = [
+    "test_persist_and_load"
+    "test_we_can_connect"
+    "test_idle_connection_cleanup"
+    "test_we_can_start_stop"
+    "test_push_event"
+    "test_bridge_run_stop"
+    "test_migration_to_include_client_properties"
+  ];
+
+  pythonImportsCheck = [
+    "pyhap"
+  ];
+
+  meta = with lib; {
+    description = "HomeKit Accessory Protocol implementation";
+    homepage = "https://github.com/ikalchev/HAP-python";
+    changelog = "https://github.com/ikalchev/HAP-python/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ oro ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hass-nabucasa/default.nix b/nixpkgs/pkgs/development/python-modules/hass-nabucasa/default.nix
new file mode 100644
index 000000000000..e27ef7ffce6b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hass-nabucasa/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, acme
+, aiohttp
+, atomicwrites-homeassistant
+, attrs
+, buildPythonPackage
+, ciso8601
+, cryptography
+, fetchFromGitHub
+, pycognito
+, pytest-aiohttp
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, snitun
+, syrupy
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "hass-nabucasa";
+  version = "0.74.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "nabucasa";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-r4Huvn9mBqnASpUd+drwORE+fApLV/l6Y3aO/UIiEC8=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "acme==" "acme>=" \
+      --replace "pycognito==" "pycognito>=" \
+      --replace "snitun==" "snitun>=" \
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    acme
+    aiohttp
+    atomicwrites-homeassistant
+    attrs
+    ciso8601
+    cryptography
+    pycognito
+    snitun
+  ];
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytest-timeout
+    pytestCheckHook
+    syrupy
+    xmltodict
+  ];
+
+  pythonImportsCheck = [
+    "hass_nabucasa"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/NabuCasa/hass-nabucasa";
+    description = "Python module for the Home Assistant cloud integration";
+    changelog = "https://github.com/NabuCasa/hass-nabucasa/releases/tag/${version}";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ Scriptkiddi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hassil/default.nix b/nixpkgs/pkgs/development/python-modules/hassil/default.nix
new file mode 100644
index 000000000000..6059ce3cb5e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hassil/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+# propagates
+, importlib-resources
+, pyyaml
+
+# tests
+, pytestCheckHook
+}:
+
+let
+  pname = "hassil";
+  version = "1.2.5";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-udOkZILoba2+eR8oSFThsB846COaIXawwRYhn261mCA=";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog  = "https://github.com/home-assistant/hassil/releases/tag/v${version}";
+    description = "Intent parsing for Home Assistant";
+    homepage = "https://github.com/home-assistant/hassil";
+    license = licenses.asl20;
+    maintainers = teams.home-assistant.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hatasmota/default.nix b/nixpkgs/pkgs/development/python-modules/hatasmota/default.nix
new file mode 100644
index 000000000000..f8e45949dbe7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hatasmota/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, voluptuous
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hatasmota";
+  version = "0.7.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "emontnemery";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-lsb92JsqIhq7zaNaolgV8dtSFIq+Enklb6hlBvT7/Ig=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    voluptuous
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "hatasmota"
+  ];
+
+  meta = with lib; {
+    description = "Python module to help parse and construct Tasmota MQTT messages";
+    homepage = "https://github.com/emontnemery/hatasmota";
+    changelog = "https://github.com/emontnemery/hatasmota/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hatch-fancy-pypi-readme/default.nix b/nixpkgs/pkgs/development/python-modules/hatch-fancy-pypi-readme/default.nix
new file mode 100644
index 000000000000..63789c90debd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hatch-fancy-pypi-readme/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, build
+, hatchling
+, tomli
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "hatch-fancy-pypi-readme";
+  version = "23.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "hatch_fancy_pypi_readme";
+    inherit version;
+    hash = "sha256-sd9EBjCUrx6CSM6s1HqSyc8xPWuYI79mr4qSfDlgKH0=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    hatchling
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    build
+    pytestCheckHook
+  ];
+
+  # Requires network connection
+  disabledTests = [
+    "test_build"  # Requires internet
+    "test_invalid_config"
+  ];
+
+  pythonImportsCheck = [
+    "hatch_fancy_pypi_readme"
+  ];
+
+  meta = with lib; {
+    description = "Fancy PyPI READMEs with Hatch";
+    homepage = "https://github.com/hynek/hatch-fancy-pypi-readme";
+    license = licenses.mit;
+    maintainers = with maintainers; [ tjni ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hatch-jupyter-builder/default.nix b/nixpkgs/pkgs/development/python-modules/hatch-jupyter-builder/default.nix
new file mode 100644
index 000000000000..fe641977812f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hatch-jupyter-builder/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, pytest-mock
+, pytestCheckHook
+, tomli
+, twine
+}:
+
+buildPythonPackage rec {
+  pname = "hatch-jupyter-builder";
+  version = "0.8.3";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "jupyterlab";
+    repo = "hatch-jupyter-builder";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-UywhFJ8d1+lSFOF5ECsknDeQuO7ppckdy5IqAT14ius=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+    tomli
+    twine
+  ];
+
+  disabledTests = [
+    # tests pip install, which unsuprisingly fails
+    "test_hatch_build"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/jupyterlab/hatch-jupyter-builder/releases/tag/v${version}";
+    description = "hatch plugin to help build Jupyter packages";
+    homepage = "https://github.com/jupyterlab/hatch-jupyter-builder";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hatch-nodejs-version/default.nix b/nixpkgs/pkgs/development/python-modules/hatch-nodejs-version/default.nix
new file mode 100644
index 000000000000..806bffe56cc1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hatch-nodejs-version/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, hatchling
+}:
+
+buildPythonPackage rec {
+  pname = "hatch-nodejs-version";
+  version = "0.3.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "agoose77";
+    repo = "hatch-nodejs-version";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-hknlb11DCe+b55CfF3Pr62ccWPxVrjQ197ZagSiH/zU=";
+  };
+
+  propagatedBuildInputs = [
+    hatchling
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "hatch_nodejs_version"
+  ];
+
+  meta = with lib; {
+    description = "Plugins for dealing with NodeJS versions";
+    homepage = "https://github.com/agoose77/hatch-nodejs-version";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hatch-requirements-txt/default.nix b/nixpkgs/pkgs/development/python-modules/hatch-requirements-txt/default.nix
new file mode 100644
index 000000000000..a6246b3a4746
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hatch-requirements-txt/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, packaging
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "hatch-requirements-txt";
+  version = "0.4.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "repo-helper";
+    repo = "hatch-requirements-txt";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-qk+70o/41BLxCuz3SOXkGYSEmUZOG1oLYcFUmlarqmY=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    hatchling
+    packaging
+  ];
+
+  doCheck = false; # missing coincidence dependency
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/repo-helper/hatch-requirements-txt/releases/tag/${version}";
+    description = "Hatchling plugin to read project dependencies from requirements.txt";
+    homepage = "https://github.com/repo-helper/hatch-requirements-txt";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/hatch-vcs/default.nix b/nixpkgs/pkgs/development/python-modules/hatch-vcs/default.nix
new file mode 100644
index 000000000000..4fa2c56cabfb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hatch-vcs/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, git
+, hatchling
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "hatch-vcs";
+  version = "0.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "hatch_vcs";
+    inherit version;
+    hash = "sha256-zsUQfPzkgsZ/i8lvGLvDIMmqDQaBgOFK0xe77loVP+4=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    hatchling
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    git
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # incompatible with setuptools-scm>=7
+    # https://github.com/ofek/hatch-vcs/issues/8
+    "test_write"
+  ];
+
+  pythonImportsCheck = [
+    "hatch_vcs"
+  ];
+
+  meta = with lib; {
+    description = "A plugin for Hatch that uses your preferred version control system (like Git) to determine project versions";
+    homepage = "https://github.com/ofek/hatch-vcs";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hatchling/default.nix b/nixpkgs/pkgs/development/python-modules/hatchling/default.nix
new file mode 100644
index 000000000000..8a886112fed9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hatchling/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+# runtime
+, editables
+, packaging
+, pathspec
+, pluggy
+, tomli
+, trove-classifiers
+
+# tests
+, build
+, python
+, requests
+, virtualenv
+}:
+
+buildPythonPackage rec {
+  pname = "hatchling";
+  version = "1.18.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-UOmcMRDOCvw/e9ut/xxxwXdY5HZzHCdgeUDPpmhkico=";
+  };
+
+  # listed in backend/pyproject.toml
+  propagatedBuildInputs = [
+    editables
+    packaging
+    pathspec
+    pluggy
+    trove-classifiers
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  pythonImportsCheck = [
+    "hatchling"
+    "hatchling.build"
+  ];
+
+  # tries to fetch packages from the internet
+  doCheck = false;
+
+  # listed in /backend/tests/downstream/requirements.txt
+  nativeCheckInputs = [
+    build
+    requests
+    virtualenv
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} tests/downstream/integrate.py
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Modern, extensible Python build backend";
+    homepage = "https://hatch.pypa.io/latest/";
+    changelog = "https://github.com/pypa/hatch/releases/tag/hatchling-v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ofek ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/haversine/default.nix b/nixpkgs/pkgs/development/python-modules/haversine/default.nix
new file mode 100644
index 000000000000..328af63b6e9e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/haversine/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "haversine";
+  version = "2.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mapado";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-cwvTs/91eJhjmeuCQAUBgfnKuCiLEg1jSnrXfx9VWkI=";
+  };
+
+  nativeCheckInputs = [
+    numpy
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "haversine"
+  ];
+
+  meta = with lib; {
+    description = "Python module the distance between 2 points on earth";
+    homepage = "https://github.com/mapado/haversine";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hawkauthlib/default.nix b/nixpkgs/pkgs/development/python-modules/hawkauthlib/default.nix
new file mode 100644
index 000000000000..7afb4eefa060
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hawkauthlib/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, webob
+}:
+
+buildPythonPackage rec {
+  pname = "hawkauthlib";
+  version = "0.1.1";
+
+  src = fetchFromGitHub {
+    owner = "mozilla-services";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "0mr1mpx4j9q7sch9arwfvpysnpf2p7ijy7072wilxm8pnj0bwvsi";
+  };
+
+  propagatedBuildInputs = [ requests webob ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mozilla-services/hawkauthlib";
+    description = "Hawk Access Authentication protocol";
+    license = licenses.mpl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hcloud/default.nix b/nixpkgs/pkgs/development/python-modules/hcloud/default.nix
new file mode 100644
index 000000000000..1e460fa3c7fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hcloud/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, future
+, mock
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "hcloud";
+  version = "1.32.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vX85fDFNGJ8zJe6YCPn7VFOdvPkT35VbM3Do+cP2b/Y=";
+  };
+
+  propagatedBuildInputs = [
+    future
+    requests
+    python-dateutil
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "hcloud"
+  ];
+
+  meta = with lib; {
+    description = "Library for the Hetzner Cloud API";
+    homepage = "https://github.com/hetznercloud/hcloud-python";
+    changelog = "https://github.com/hetznercloud/hcloud-python/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ liff ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hcs_utils/default.nix b/nixpkgs/pkgs/development/python-modules/hcs_utils/default.nix
new file mode 100644
index 000000000000..4e6931f0e339
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hcs_utils/default.nix
@@ -0,0 +1,31 @@
+{ lib, pythonOlder, buildPythonPackage, fetchPypi, six, glibcLocales, pytest }:
+
+buildPythonPackage rec {
+  pname = "hcs_utils";
+  version = "2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "04xq69hrys8lf9kp8pva0c4aphjjfw412km7c32ydkwq0i59rhp2";
+  };
+
+  LC_ALL="en_US.UTF-8";
+
+  checkPhase = ''
+    # root does not has /root as home in sandbox
+    py.test -k 'not test_expand' hcs_utils/test
+  '';
+
+  buildInputs = [ six glibcLocales ];
+  nativeCheckInputs = [ pytest ];
+
+  disabled = pythonOlder "3.4";
+
+  meta = with lib; {
+    description = "Library collecting some useful snippets";
+    homepage    = "https://pypi.python.org/pypi/hcs_utils/1.3";
+    license     = licenses.isc;
+    maintainers = with maintainers; [ lovek323 ];
+    platforms   = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hdate/default.nix b/nixpkgs/pkgs/development/python-modules/hdate/default.nix
new file mode 100644
index 000000000000..3c45b7ff08d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hdate/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, astral
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "hdate";
+  version = "0.10.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "py-libhdate";
+    repo = "py-libhdate";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-NF2ZA9ruW7sL2tLY11VAtyPRxGg2o5/mpv3ZsH/Zxb8=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'pytz = ">= 2020.0"' 'pytz = "*"' \
+      --replace 'astral = {version = "^2.2", python = "^3.6"}' 'astral = "*"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    astral
+    pytz
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests"
+  ];
+
+  pythonImportsCheck = [
+    "hdate"
+  ];
+
+  meta = with lib; {
+    description = "Python module for Jewish/Hebrew date and Zmanim";
+    homepage = "https://github.com/py-libhdate/py-libhdate";
+    changelog = "https://github.com/py-libhdate/py-libhdate/releases/tag/v${version}";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hdbscan/default.nix b/nixpkgs/pkgs/development/python-modules/hdbscan/default.nix
new file mode 100644
index 000000000000..50218663c43b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hdbscan/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, cython
+, numpy
+, pytestCheckHook
+, scipy
+, scikit-learn
+, fetchPypi
+, joblib
+, six
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "hdbscan";
+  version = "0.8.33";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-V/q8Xw5F9I0kB7NccxGSq8iWN2QR/n5LuDb/oD04+Q0=";
+  };
+
+  pythonRemoveDeps = [ "cython" ];
+  nativeBuildInputs = [ pythonRelaxDepsHook cython ];
+  propagatedBuildInputs = [ numpy scipy scikit-learn joblib six ];
+  preCheck = ''
+    cd hdbscan/tests
+    rm __init__.py
+  '';
+  nativeCheckInputs = [ pytestCheckHook ];
+  disabledTests = [
+    # known flaky tests: https://github.com/scikit-learn-contrib/hdbscan/issues/420
+    "test_mem_vec_diff_clusters"
+    "test_all_points_mem_vec_diff_clusters"
+    "test_approx_predict_diff_clusters"
+    # another flaky test https://github.com/scikit-learn-contrib/hdbscan/issues/421
+    "test_hdbscan_boruvka_balltree_matches"
+    # more flaky tests https://github.com/scikit-learn-contrib/hdbscan/issues/570
+    "test_hdbscan_boruvka_balltree"
+    "test_hdbscan_best_balltree_metric"
+  ];
+
+  pythonImportsCheck = [ "hdbscan" ];
+
+  meta = with lib; {
+    description = "Hierarchical Density-Based Spatial Clustering of Applications with Noise, a clustering algorithm with a scikit-learn compatible API";
+    homepage =  "https://github.com/scikit-learn-contrib/hdbscan";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hdf5plugin/default.nix b/nixpkgs/pkgs/development/python-modules/hdf5plugin/default.nix
new file mode 100644
index 000000000000..c5a1ad4141dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hdf5plugin/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, h5py
+}:
+
+buildPythonPackage rec {
+  pname = "hdf5plugin";
+  version = "4.3.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "silx-kit";
+    repo = "hdf5plugin";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-xOSGykG6D2Am/gnAPoqLOvIQz6FfxRQe9lPyRHxUoew=";
+  };
+
+  propagatedBuildInputs = [
+    h5py
+  ];
+
+  checkPhase = ''
+    python test/test.py
+  '';
+  pythonImportsCheck = [
+    "hdf5plugin"
+  ];
+
+  preBuild = ''
+    mkdir src/hdf5plugin/plugins
+  '';
+
+  meta = with lib; {
+    description = "Additional compression filters for h5py";
+    longDescription = ''
+      hdf5plugin provides HDF5 compression filters and makes them usable from h5py.
+      Supported encodings: Blosc, Blosc2, BitShuffle, BZip2, FciDecomp, LZ4, SZ, SZ3, Zfp, ZStd
+    '';
+    homepage = "http://www.silx.org/doc/hdf5plugin/latest/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ pbsds ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hdfs/default.nix b/nixpkgs/pkgs/development/python-modules/hdfs/default.nix
new file mode 100644
index 000000000000..9b9268c13eac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hdfs/default.nix
@@ -0,0 +1,36 @@
+{ buildPythonPackage
+, docopt
+, fastavro
+, fetchFromGitHub
+, lib
+, nose
+, pytestCheckHook
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "hdfs";
+  version = "2.7.3";
+
+  src = fetchFromGitHub {
+    owner = "mtth";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Pm2E8hB0wbu7npi/sLt9D8jQsH69qNOHLji9CYqST/8=";
+  };
+
+  propagatedBuildInputs = [ docopt requests six ];
+
+  nativeCheckInputs = [ fastavro nose pytestCheckHook ];
+
+  pythonImportsCheck = [ "hdfs" ];
+
+  meta = with lib; {
+    description = "Python API and command line interface for HDFS";
+    homepage = "https://github.com/mtth/hdfs";
+    changelog = "https://github.com/mtth/hdfs/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hdmedians/default.nix b/nixpkgs/pkgs/development/python-modules/hdmedians/default.nix
new file mode 100644
index 000000000000..59ca3e5b6117
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hdmedians/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, cython
+, numpy
+}:
+
+buildPythonPackage rec {
+  version = "0.14.2";
+  pname = "hdmedians";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b47aecb16771e1ba0736557255d80ae0240b09156bff434321de559b359ac2d6";
+  };
+
+  # nose was specified in setup.py as a build dependency...
+  buildInputs = [ cython nose ];
+  propagatedBuildInputs = [ numpy ];
+
+  # cannot resolve path for packages in tests
+  doCheck = false;
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/daleroberts/hdmedians";
+    description = "High-dimensional medians";
+    license = licenses.gpl3;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/headerparser/default.nix b/nixpkgs/pkgs/development/python-modules/headerparser/default.nix
new file mode 100644
index 000000000000..71cad63ef70f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/headerparser/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, attrs
+, buildPythonPackage
+, deprecated
+, fetchFromGitHub
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "headerparser";
+  version = "0.5.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jwodder";
+    repo = "headerparser";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-CWXha7BYVO5JFuhWP8OZ95fhUsZ3Jo0cgPAM+O5bfec=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    deprecated
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "headerparser"
+  ];
+
+  meta = with lib; {
+    description = "Module to parse key-value pairs in the style of RFC 822 (e-mail) headers";
+    homepage = "https://github.com/jwodder/headerparser";
+    changelog = "https://github.com/wheelodex/headerparser/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ ayazhafiz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/heapdict/default.nix b/nixpkgs/pkgs/development/python-modules/heapdict/default.nix
new file mode 100644
index 000000000000..61cbe39a256a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/heapdict/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "HeapDict";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8495f57b3e03d8e46d5f1b2cc62ca881aca392fd5cc048dc0aa2e1a6d23ecdb6";
+  };
+
+  doCheck = !isPy3k;
+
+  meta = with lib; {
+    description = "a heap with decrease-key and increase-key operations.";
+    homepage = "http://stutzbachenterprises.com";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ teh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/heatshrink2/default.nix b/nixpkgs/pkgs/development/python-modules/heatshrink2/default.nix
new file mode 100644
index 000000000000..dd37c7c0c0ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/heatshrink2/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "heatshrink2";
+  version = "0.12.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "eerimoq";
+    repo = "pyheatshrink";
+    rev = "refs/tags/${version}";
+    fetchSubmodules = true;
+    hash = "sha256-JthHYq78SYr49+sTNtLZ8GjtrHcr1dzXcPskTrb4M3o=";
+  };
+
+  pythonImportsCheck = [
+    "heatshrink2"
+  ];
+
+  meta = with lib; {
+    description = "Compression using the Heatshrink algorithm";
+    homepage = "https://github.com/eerimoq/pyheatshrink";
+    license = licenses.isc;
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/heatzypy/default.nix b/nixpkgs/pkgs/development/python-modules/heatzypy/default.nix
new file mode 100644
index 000000000000..1a71c5d17939
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/heatzypy/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "heatzypy";
+  version = "2.1.9";
+  pyproject = true;
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "Cyr-ius";
+    repo = "heatzypy";
+    rev = "refs/tags/${version}";
+    hash = "sha256-O2HtCaNtBvjhjlSXLRhEuilI8z7nGgzFa8USYiHfZ+E=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "replace_by_workflow" "${version}"
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    requests
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "heatzypy"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with Heatzy devices";
+    homepage = "https://github.com/Cyr-ius/heatzypy";
+    changelog = "https://github.com/cyr-ius/heatzypy/releases/tag/${version}";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/help2man/default.nix b/nixpkgs/pkgs/development/python-modules/help2man/default.nix
new file mode 100644
index 000000000000..38cff88b4a12
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/help2man/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, jinja2
+, setuptools-scm
+, shtab
+, tomli
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "help2man";
+  version = "0.0.9";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Freed-Wu";
+    repo = "help2man";
+    rev = version;
+    hash = "sha256-BIDn+LQzBtDHUtFvIRL3NMXNouO3cMLibuYBoFtCUxI=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    jinja2
+    setuptools-scm
+    shtab
+    tomli
+  ];
+
+  propagatedBuildInputs = [
+    jinja2
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "help2man" ];
+
+  meta = with lib; {
+    description = "Convert --help and --version to man page";
+    homepage = "https://github.com/Freed-Wu/help2man";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ natsukium ];
+    mainProgram = "help2man";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/helpdev/default.nix b/nixpkgs/pkgs/development/python-modules/helpdev/default.nix
new file mode 100644
index 000000000000..34b4d6974478
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/helpdev/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, importlib-metadata
+, psutil
+}:
+
+buildPythonPackage rec {
+  pname = "helpdev";
+  version = "0.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0gfvj28i82va7c264jl2p4cdsl3lpf9fpb9cyjnis55crfdafqmv";
+  };
+
+  propagatedBuildInputs = [
+    importlib-metadata
+    psutil
+  ];
+
+  # No tests included in archive
+  doCheck = false;
+
+  meta = {
+    description = "Extracts information about the Python environment easily";
+    license = lib.licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/helper/default.nix b/nixpkgs/pkgs/development/python-modules/helper/default.nix
new file mode 100644
index 000000000000..d1e38dfbab9e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/helper/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyyaml
+, pytestCheckHook
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "helper";
+  version = "2.5.0";
+
+  src = fetchFromGitHub {
+    owner = "gmr";
+    repo = pname;
+    rev = version;
+    sha256 = "0zypjv8rncvrsgl200v7d3bn08gs48dwqvgamfqv71h07cj6zngp";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+  ];
+
+  pythonImportsCheck = [
+    "helper"
+    "helper.config"
+  ];
+
+  meta = with lib; {
+    description = "Development library for quickly writing configurable applications and daemons";
+    homepage = "https://helper.readthedocs.org/";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hepunits/default.nix b/nixpkgs/pkgs/development/python-modules/hepunits/default.nix
new file mode 100644
index 000000000000..910694847033
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hepunits/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hatch-vcs
+, hatchling
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "hepunits";
+  version = "2.3.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ijNm+l1ywWrxFm7Vec2qge3SZ2rLj2of59opDO/KOwg=";
+  };
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = {
+    description = "Units and constants in the HEP system of units";
+    homepage = "https://github.com/scikit-hep/hepunits";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ doronbehar ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/here-routing/default.nix b/nixpkgs/pkgs/development/python-modules/here-routing/default.nix
new file mode 100644
index 000000000000..c1ca069b51d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/here-routing/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, aiohttp
+, async-timeout
+, yarl
+, aresponses
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "here-routing";
+  version = "1.0.0";
+
+  disabled = pythonOlder "3.10";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "eifinger";
+    repo = "here_routing";
+    rev = "v${version}";
+    hash = "sha256-wdjPbM9J+2q3NisdlOHIddSWHHIfwQY/83v6IBAXSq0=";
+  };
+
+  postPatch = ''
+    sed -i "/^addopts/d" pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "here_routing" ];
+
+  meta = {
+    changelog = "https://github.com/eifinger/here_routing/blob/${src.rev}/CHANGELOG.md";
+    description = "Asynchronous Python client for the HERE Routing V8 API";
+    homepage = "https://github.com/eifinger/here_routing";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/here-transit/default.nix b/nixpkgs/pkgs/development/python-modules/here-transit/default.nix
new file mode 100644
index 000000000000..638f46af434f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/here-transit/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, aiohttp
+, async-timeout
+, yarl
+, aresponses
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "here-transit";
+  version = "1.2.0";
+
+  disabled = pythonOlder "3.8";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "eifinger";
+    repo = "here_transit";
+    rev = "v${version}";
+    hash = "sha256-C5HZZCmK9ILUUXyx1i/cUggSM3xbOzXiJ13hrT2DWAI=";
+  };
+
+  postPatch = ''
+    sed -i "/^addopts/d" pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "here_transit" ];
+
+  meta = {
+    changelog = "https://github.com/eifinger/here_transit/blob/${src.rev}/CHANGELOG.md";
+    description = "Asynchronous Python client for the HERE Routing V8 API";
+    homepage = "https://github.com/eifinger/here_transit";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/herepy/default.nix b/nixpkgs/pkgs/development/python-modules/herepy/default.nix
new file mode 100644
index 000000000000..379790d4b79b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/herepy/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, requests
+, pytestCheckHook
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "herepy";
+  version = "3.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "abdullahselek";
+    repo = "HerePy";
+    rev = "refs/tags/${version}";
+    hash = "sha256-wz6agxPKQvWobRIiYKYU2og33tzswd0qG1hawPCh1qI=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "herepy"
+  ];
+
+  meta = with lib; {
+    description = "Library that provides a Python interface to the HERE APIs";
+    homepage = "https://github.com/abdullahselek/HerePy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hetzner/default.nix b/nixpkgs/pkgs/development/python-modules/hetzner/default.nix
new file mode 100644
index 000000000000..4264183e5f53
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hetzner/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "hetzner";
+  version = "0.8.3";
+
+  src = fetchFromGitHub {
+    repo = "hetzner";
+    owner = "aszlig";
+    rev = "v${version}";
+    sha256 = "0nhm7j2y4rgmrl0c1rklg982qllp7fky34dchqwd4czbsdnv9j7a";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/RedMoonStudios/hetzner";
+    description = "High-level Python API for accessing the Hetzner robot";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ aszlig ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/heudiconv/default.nix b/nixpkgs/pkgs/development/python-modules/heudiconv/default.nix
new file mode 100644
index 000000000000..3cdf1463cd57
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/heudiconv/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, datalad
+, dcm2niix
+, dcmstack
+, etelemetry
+, fetchPypi
+, filelock
+, git
+, nibabel
+, nipype
+, pydicom
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, versioningit
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "heudiconv";
+  version = "1.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-cW6G2NtPZiyqqJ3w9a3Y/6blEaXtR9eGG5epPknimsw=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "versioningit ~=" "versioningit >="
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    versioningit
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    nibabel
+    pydicom
+    nipype
+    dcmstack
+    etelemetry
+    filelock
+  ];
+
+  nativeCheckInputs = [
+    datalad
+    dcm2niix
+    pytestCheckHook
+    git
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  pythonImportsCheck = [
+    "heudiconv"
+  ];
+
+  meta = with lib; {
+    homepage = "https://heudiconv.readthedocs.io";
+    description = "Flexible DICOM converter for organizing imaging data";
+    changelog = "https://github.com/nipy/heudiconv/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hexbytes/default.nix b/nixpkgs/pkgs/development/python-modules/hexbytes/default.nix
new file mode 100644
index 000000000000..9bfb9918bf32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hexbytes/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, eth-utils
+, hypothesis
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hexbytes";
+  version = "0.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ethereum";
+    repo = "hexbytes";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-19oY/VPP6qkxHCkIgpC28fOOYKEYcNbVVGoHJmMmOl8=";
+  };
+
+  nativeCheckInputs = [
+    eth-utils
+    hypothesis
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "hexbytes"
+  ];
+
+  meta = with lib; {
+    description = "`bytes` subclass that decodes hex, with a readable console output";
+    homepage = "https://github.com/ethereum/hexbytes";
+    changelog = "https://github.com/ethereum/hexbytes/blob/v${version}/docs/release_notes.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hexdump/default.nix b/nixpkgs/pkgs/development/python-modules/hexdump/default.nix
new file mode 100644
index 000000000000..c00d7d5b4680
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hexdump/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "hexdump";
+  version = "3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-14GkOwwWrOP5Nmqt5z6K06e9UTfVjwtFqy0/VIdvINs=";
+    extension = "zip";
+  };
+
+  # the source zip has no prefix, so everything gets unpacked to /build otherwise
+  unpackPhase = ''
+    runHook preUnpack
+    mkdir source
+    pushd source
+    unzip $src
+    popd
+    runHook postUnpack
+  '';
+
+  sourceRoot = "source";
+
+  pythonImportsCheck = [ "hexdump" ];
+
+  meta = with lib; {
+    description = "Library to dump binary data to hex format and restore from there";
+    homepage = "https://pypi.org/project/hexdump/"; # BitBucket site returns 404
+    license = licenses.publicDomain;
+    maintainers = with maintainers; [ frogamic sbruder ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hfst/default.nix b/nixpkgs/pkgs/development/python-modules/hfst/default.nix
new file mode 100644
index 000000000000..b865c4c84d63
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hfst/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, pkgs
+, stdenv
+, buildPythonPackage
+, foma
+, icu
+, swig
+}:
+
+buildPythonPackage rec {
+  pname = "hfst";
+  inherit (pkgs.hfst) version src;
+
+  sourceRoot = "${src.name}/python";
+
+  postPatch = ''
+    # omorfi-python looks for 'hfst' Python package
+    sed -i 's/libhfst_swig/hfst/' setup.py;
+  '';
+
+  nativeBuildInputs = [
+    swig
+  ];
+
+  buildInputs = [
+    icu
+    pkgs.hfst
+  ];
+
+  setupPyBuildFlags = [
+    "--inplace"
+  ];
+
+  # Find foma in Darwin tests
+  preCheck = lib.optionalString stdenv.isDarwin ''
+    export DYLD_LIBRARY_PATH="${foma}/lib"
+  '';
+
+  meta = with lib; {
+    description = "Python bindings for HFST";
+    homepage = "https://github.com/hfst/hfst";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ lurkki ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hg-commitsigs/default.nix b/nixpkgs/pkgs/development/python-modules/hg-commitsigs/default.nix
new file mode 100644
index 000000000000..a97c2be2b98c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hg-commitsigs/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, fetchhg
+, stdenv
+, python
+}:
+
+stdenv.mkDerivation rec {
+  pname = "hg-commitsigs";
+  # Latest tag is 11 years old.
+  version = "unstable-2021-01-08";
+
+  src = fetchhg {
+    url = "https://foss.heptapod.net/mercurial/commitsigs";
+    rev = "b53eb6862bff";
+    sha256 = "sha256-PS1OhC9MiVFD7WYlIn6FavD5TyhM50WoV6YagI2pLxU=";
+  };
+
+  # Not sure how the tests are supposed to be run, and they 10 years old...
+  doCheck = false;
+  dontBuild = true;
+
+  installPhase = ''
+    mkdir -p $out/lib/${python.libPrefix}/site-packages/hgext3rd/
+    install -D $src/commitsigs.py \
+               $out/lib/${python.libPrefix}/site-packages/hgext3rd/
+  '';
+
+  meta = with lib; {
+    description = "Automatic signing of changeset hashes";
+    longDescription = ''
+      This packages provides a Mercurial extension that lets you sign
+      the changeset hash when you commit.  The signature is embedded
+      directly in the changeset itself; there wont be any extra
+      commits.  Either GnuPG or OpenSSL can be used to sign the hashes.
+    '';
+    homepage = "https://foss.heptapod.net/mercurial/commitsigs";
+    maintainers = with maintainers; [ yoctocell ];
+    license = licenses.gpl2Plus;
+    platforms = platforms.unix; # same as Mercurial
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hg-evolve/default.nix b/nixpkgs/pkgs/development/python-modules/hg-evolve/default.nix
new file mode 100644
index 000000000000..cfb79f88b72a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hg-evolve/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mercurial
+}:
+
+buildPythonPackage rec {
+  pname = "hg-evolve";
+  version = "11.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sMvHvHwLuMT0LaH2XFDePuePbwCXjvl66QGdERR0k6g=";
+  };
+
+  nativeCheckInputs = [
+    mercurial
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    export TESTTMP=$(mktemp -d)
+    export HOME=$TESTTMP
+    cat <<EOF >$HOME/.hgrc
+    [extensions]
+    evolve =
+    topic =
+    EOF
+
+    # Shipped tests use the mercurial testing framework, and produce inconsistent results.
+    # Do a quick smoke-test to see if things do what we expect.
+    hg init $TESTTMP/repo
+    pushd $TESTTMP/repo
+    touch a
+    hg add a
+    hg commit -m "init a"
+    hg topic something
+
+    touch b
+    hg add b
+    hg commit -m "init b"
+
+    echo hi > b
+    hg amend
+
+    hg obslog
+    popd
+
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Enables the “changeset evolution” feature of Mercurial core";
+    homepage = "https://www.mercurial-scm.org/doc/evolution/";
+    maintainers = with maintainers; [ xavierzwirtz lukegb ];
+    license = licenses.gpl2Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hg-git/default.nix b/nixpkgs/pkgs/development/python-modules/hg-git/default.nix
new file mode 100644
index 000000000000..26f04edbc024
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hg-git/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, dulwich
+, mercurial
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hg-git";
+  version = "1.0.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WoQOh6cKFcnB4GGWvD7VlV53LxHpsYA+iMDJ9VrwNBY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dulwich
+    mercurial
+  ];
+
+  pythonImportsCheck = [
+    "hggit"
+  ];
+
+  meta = with lib; {
+    description = "Push and pull from a Git server using Mercurial";
+    homepage = "https://hg-git.github.io/";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ koral ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hickle/default.nix b/nixpkgs/pkgs/development/python-modules/hickle/default.nix
new file mode 100644
index 000000000000..66968a94f552
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hickle/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, h5py
+, numpy
+, dill
+, astropy
+, scipy
+, pandas
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "hickle";
+  version = "5.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2+7OF/a89jK/zLhbk/Q2A+zsKnfRbq3YMKGycEWsLEQ=";
+  };
+
+  postPatch = ''
+    substituteInPlace tox.ini \
+      --replace "--cov=./hickle" ""
+  '';
+
+  propagatedBuildInputs = [
+    dill
+    h5py
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    astropy
+    pandas
+    pytestCheckHook
+    scipy
+  ];
+
+  pythonImportsCheck = [
+    "hickle"
+  ];
+
+  disabledTests = [
+    # broken in 5.0.2 with recent NumPy
+    # see https://github.com/telegraphic/hickle/issues/174
+    "test_scalar_compression"
+    # broken in 5.0.2 with Python 3.11
+    # see https://github.com/telegraphic/hickle/issues/169
+    "test_H5NodeFilterProxy"
+    # broken in 5.0.2
+    "test_slash_dict_keys"
+  ];
+
+  meta = with lib; {
+    description = "Serialize Python data to HDF5";
+    homepage = "https://github.com/telegraphic/hickle";
+    changelog = "https://github.com/telegraphic/hickle/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hid-parser/default.nix b/nixpkgs/pkgs/development/python-modules/hid-parser/default.nix
new file mode 100644
index 000000000000..56aeb503b49c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hid-parser/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, pytestCheckHook
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "hid-parser";
+  version = "0.0.3";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zbm+h+ieDmd1K0uH+9B8EWtYScxqYJXVpY9bXdBivA4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    hypothesis
+  ];
+
+  pythonImportsCheck = [ "hid_parser" ];
+
+  meta = with lib; {
+    description = "Typed pure Python library to parse HID report descriptors";
+    homepage = "https://github.com/usb-tools/python-hid-parser";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kranzes ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hid/default.nix b/nixpkgs/pkgs/development/python-modules/hid/default.nix
new file mode 100644
index 000000000000..eeade4606c8b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hid/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hidapi
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "hid";
+  version = "1.0.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-HpVOf3q5t8nfx421lQRpLBfbO3EklJK5drFSW5fbsOg=";
+  };
+
+  propagatedBuildInputs = [ hidapi ];
+
+  nativeCheckInputs = [ nose ];
+
+ postPatch = ''
+    hidapi=${hidapi}/lib/
+    test -d $hidapi || { echo "ERROR: $hidapi doesn't exist, please update/fix this build expression."; exit 1; }
+    sed -i -e "s|libhidapi|$hidapi/libhidapi|" hid/__init__.py
+  '';
+
+  meta = with lib; {
+    description = "hidapi bindings in ctypes";
+    homepage = "https://github.com/apmorton/pyhidapi";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ AndersonTorres ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hidapi/default.nix b/nixpkgs/pkgs/development/python-modules/hidapi/default.nix
new file mode 100644
index 000000000000..6805afc7c77c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hidapi/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, xcbuild
+, cython
+, libusb1
+, udev
+, darwin
+}:
+
+buildPythonPackage rec {
+  pname = "hidapi";
+  version = "0.14.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a7cb029286ced5426a381286526d9501846409701a29c2538615c3d1a612b8be";
+  };
+
+  nativeBuildInputs = lib.optionals stdenv.isDarwin [ xcbuild ];
+
+  propagatedBuildInputs = [ cython ]
+    ++ lib.optionals stdenv.isLinux [ libusb1 udev ]
+    ++ lib.optionals stdenv.isDarwin (with darwin.apple_sdk.frameworks; [ AppKit CoreFoundation IOKit ]);
+
+  # Fix the USB backend library lookup
+  postPatch = lib.optionalString stdenv.isLinux ''
+    libusb=${libusb1.dev}/include/libusb-1.0
+    test -d $libusb || { echo "ERROR: $libusb doesn't exist, please update/fix this build expression."; exit 1; }
+    sed -i -e "s|/usr/include/libusb-1.0|$libusb|" setup.py
+  '';
+
+  pythonImportsCheck = [ "hid" ];
+
+  meta = with lib; {
+    description = "A Cython interface to the hidapi from https://github.com/libusb/hidapi";
+    homepage = "https://github.com/trezor/cython-hidapi";
+    # license can actually be either bsd3 or gpl3
+    # see https://github.com/trezor/cython-hidapi/blob/master/LICENSE-orig.txt
+    license = with licenses; [ bsd3 gpl3Only ];
+    maintainers = with maintainers; [ np prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hieroglyph/default.nix b/nixpkgs/pkgs/development/python-modules/hieroglyph/default.nix
new file mode 100644
index 000000000000..d7fa9af5efae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hieroglyph/default.nix
@@ -0,0 +1,26 @@
+{ lib, fetchPypi, buildPythonPackage, isPy27, sphinx }:
+
+buildPythonPackage rec {
+  pname = "hieroglyph";
+  version = "2.1.0";
+  disabled = isPy27; # python2 compatible sphinx is too low
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b4b5db13a9d387438e610c2ca1d81386ccd206944d9a9dd273f21874486cddaf";
+  };
+
+  propagatedBuildInputs = [ sphinx ];
+
+  # all tests fail; don't know why:
+  # test_absolute_paths_made_relative (hieroglyph.tests.test_path_fixing.PostProcessImageTests) ... ERROR
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Generate HTML presentations from plain text sources";
+    homepage = "https://github.com/nyergler/hieroglyph/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ juliendehos ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/hijri-converter/default.nix b/nixpkgs/pkgs/development/python-modules/hijri-converter/default.nix
new file mode 100644
index 000000000000..7c6d0d85d2ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hijri-converter/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hijri-converter";
+  version = "2.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BptniSkeCDD0hgp53NNPs87qO5VRbtQBAgK5ZWuhq2E=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "hijri_converter"
+  ];
+
+  meta = with lib; {
+    description = "Accurate Hijri-Gregorian date converter based on the Umm al-Qura calendar";
+    homepage = "https://github.com/dralshehri/hijri-converter";
+    changelog = "https://github.com/dralshehri/hijridate/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hikvision/default.nix b/nixpkgs/pkgs/development/python-modules/hikvision/default.nix
new file mode 100644
index 000000000000..07224c627421
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hikvision/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "hikvision";
+  version = "2.0.4";
+
+  src = fetchFromGitHub {
+    owner = "fbradyirl";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1l0zvir4hf1pcwwcmrhkspbdljzmi4lknxar5bkipdanpsm588mn";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "hikvision.api" ];
+
+  meta = with lib; {
+    description = "Python module for interacting with Hikvision IP Cameras";
+    homepage = "https://github.com/fbradyirl/hikvision";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hiredis/default.nix b/nixpkgs/pkgs/development/python-modules/hiredis/default.nix
new file mode 100644
index 000000000000..c6bb5e7d8015
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hiredis/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# tested using
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "hiredis";
+  version = "2.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "redis";
+    repo = "hiredis-py";
+    rev = "refs/tags/v${version}";
+    fetchSubmodules = true;
+    hash = "sha256-OT8zFEHKSAebXV+VzagZDJRPidAhSrqvD2/F1YezVGs=";
+  };
+
+  pythonImportsCheck = [
+    "hiredis"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    rm -rf hiredis
+  '';
+
+  meta = with lib; {
+    description = "Wraps protocol parsing code in hiredis, speeds up parsing of multi bulk replies";
+    homepage = "https://github.com/redis/hiredis-py";
+    changelog = "https://github.com/redis/hiredis-py/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ mmai ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/hiro/default.nix b/nixpkgs/pkgs/development/python-modules/hiro/default.nix
new file mode 100644
index 000000000000..9eefc61dbfb9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hiro/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi, six, mock }:
+buildPythonPackage rec {
+  pname = "hiro";
+  version = "1.1.1";
+  src = fetchPypi {
+    inherit pname version;
+
+    hash = "sha256-2jM5rx3JpZTMqdycccclJysuMGYE5F0OBXXNE8X5XWg=";
+  };
+
+  propagatedBuildInputs = [ six mock ];
+
+  meta = with lib; {
+    description = "Time manipulation utilities for Python";
+    homepage = "https://hiro.readthedocs.io/en/latest/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nyarly ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hist/default.nix b/nixpkgs/pkgs/development/python-modules/hist/default.nix
new file mode 100644
index 000000000000..8d47c7de0f73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hist/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, boost-histogram
+, histoprint
+, hatchling
+, hatch-vcs
+, numpy
+, pytestCheckHook
+, pytest-mpl
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hist";
+  version = "2.7.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JrGrgQ2LECIttdFh1KyvZKqgT+a6rtKWbUHB2sVgHQY=";
+  };
+
+  buildInputs = [
+    hatchling
+    hatch-vcs
+  ];
+
+  propagatedBuildInputs = [
+    boost-histogram
+    histoprint
+    numpy
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-mpl
+  ];
+
+  meta = with lib; {
+    description = "Histogramming for analysis powered by boost-histogram";
+    homepage = "https://hist.readthedocs.io/";
+    changelog = "https://github.com/scikit-hep/hist/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/histoprint/default.nix b/nixpkgs/pkgs/development/python-modules/histoprint/default.nix
new file mode 100644
index 000000000000..3c65fbf0eb80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/histoprint/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, click
+, numpy
+, setuptools
+, setuptools-scm
+, uhi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "histoprint";
+  version = "2.4.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "328f789d186e3bd76882d57b5aad3fa08c7870a856cc83bcdbad9f4aefbda94d";
+  };
+
+  buildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    click
+    numpy
+    uhi
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Pretty print histograms to the console";
+    homepage = "https://github.com/scikit-hep/histoprint";
+    license = licenses.mit;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hiyapyco/default.nix b/nixpkgs/pkgs/development/python-modules/hiyapyco/default.nix
new file mode 100644
index 000000000000..fa55f03d4669
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hiyapyco/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyyaml
+, jinja2
+}:
+
+buildPythonPackage rec {
+  pname = "hiyapyco";
+  version = "0.5.1";
+
+  src = fetchFromGitHub {
+    owner = "zerwes";
+    repo = pname;
+    rev = "refs/tags/release-${version}";
+    hash = "sha256-MVJoMnEi+319ZkhffYWYVi/wj0Ihm0nfVeEXvx7Ac/4=";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+    jinja2
+  ];
+
+  checkPhase = ''
+    set -e
+    find test -name 'test_*.py' -exec python {} \;
+  '';
+
+  pythonImportsCheck = [ "hiyapyco" ];
+
+  meta = with lib; {
+    description = "Python library allowing hierarchical overlay of config files in YAML syntax";
+    homepage = "https://github.com/zerwes/hiyapyco";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ veehaitch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hjson/default.nix b/nixpkgs/pkgs/development/python-modules/hjson/default.nix
new file mode 100644
index 000000000000..cd48fcd6187e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hjson/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, pythonImportsCheckHook
+, makeWrapper
+}:
+
+buildPythonPackage rec {
+  pname = "hjson";
+  version = "3.0.2";
+
+  # N.B. pypi src tarball does not have tests
+  src = fetchFromGitHub {
+    owner = "hjson";
+    repo = "hjson-py";
+    rev = "v${version}";
+    sha256 = "1jc7j790rcqnhbrfj4lhnz3f6768dc55aij840wmx16jylfqpc2n";
+  };
+
+  nativeBuildInputs = [ makeWrapper pythonImportsCheckHook ];
+
+  pythonImportsCheck = [ "hjson" ];
+
+  postInstall = ''
+    rm $out/bin/hjson.cmd
+    wrapProgram $out/bin/hjson  \
+      --set PYTHONPATH "$PYTHONPATH" \
+      --prefix PATH : ${lib.makeBinPath [ python ]}
+  '';
+
+  meta = with lib; {
+    description = "A user interface for JSON";
+    homepage = "https://github.com/hjson/hjson-py";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bhipple ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hkavr/default.nix b/nixpkgs/pkgs/development/python-modules/hkavr/default.nix
new file mode 100644
index 000000000000..851150ea1dd8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hkavr/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "hkavr";
+  version = "0.0.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wa0yS0KPdrQUuxxViweESD6Itn2rFlTwwrPQ0COWIPc=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "hkavr"
+  ];
+
+  meta = with lib; {
+    description = "Library for interacting with Harman Kardon AVR controllers";
+    homepage = "https://github.com/Devqon/hkavr";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hkdf/default.nix b/nixpkgs/pkgs/development/python-modules/hkdf/default.nix
new file mode 100644
index 000000000000..c972104f2c3d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hkdf/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "hkdf";
+  version = "0.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1jhxk5vhxmxxjp3zj526ry521v9inzzl8jqaaf0ma65w6k332ak2";
+  };
+
+  nativeCheckInputs = [ nose ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  # no tests in PyPI tarball
+  doCheck = false;
+
+  meta = with lib; {
+    description = "HMAC-based Extract-and-Expand Key Derivation Function (HKDF)";
+    homepage = "https://github.com/casebeer/python-hkdf";
+    license = licenses.bsd2;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hledger-utils/default.nix b/nixpkgs/pkgs/development/python-modules/hledger-utils/default.nix
new file mode 100644
index 000000000000..cea6592b42b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hledger-utils/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitLab
+, setuptools
+, setuptools-scm
+, unittestCheckHook
+, hledger
+, perl
+, rich
+, pandas
+, scipy
+, psutil
+, matplotlib
+, drawilleplot
+, asteval
+}:
+
+buildPythonPackage rec {
+  pname = "hledger-utils";
+  version = "1.14.0";
+
+  format = "pyproject";
+
+  src = fetchFromGitLab {
+    owner = "nobodyinperson";
+    repo = "hledger-utils";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Qu4nUcAGTACmLhwc7fkLxITOyFnUHv85qMhtViFumVs=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    rich
+    pandas
+    scipy
+    psutil
+    matplotlib
+    drawilleplot
+    asteval
+  ];
+
+  checkInputs = [
+    unittestCheckHook
+  ];
+
+  nativeCheckInputs = [
+    hledger
+    perl
+  ];
+
+  preCheck = ''
+    export PATH=$out/bin:$PATH
+  '';
+
+  meta = with lib; {
+    description = "Utilities extending hledger";
+    homepage = "https://gitlab.com/nobodyinperson/hledger-utils";
+    license = with licenses; [cc0 cc-by-40 gpl3];
+    maintainers = with maintainers; [ nobbz ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hlk-sw16/default.nix b/nixpkgs/pkgs/development/python-modules/hlk-sw16/default.nix
new file mode 100644
index 000000000000..d013664ad25f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hlk-sw16/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "hlk-sw16";
+  version = "0.0.9";
+
+  src = fetchFromGitHub {
+    owner = "jameshilliard";
+    repo = "hlk-sw16";
+    rev = version;
+    sha256 = "010s85nr6xn89i8yvdagg72a97dh1v2pyfqa33v76p9p8xbgh8dz";
+  };
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "hlk_sw16" ];
+
+  meta = with lib; {
+    description = "Python client for HLK-SW16";
+    homepage = "https://github.com/jameshilliard/hlk-sw16";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hmmlearn/default.nix b/nixpkgs/pkgs/development/python-modules/hmmlearn/default.nix
new file mode 100644
index 000000000000..a7c673c38cad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hmmlearn/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, numpy
+, scikit-learn
+, pybind11
+, setuptools-scm
+, cython
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hmmlearn";
+  version = "0.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-0TqR6jaV34gUZePTYTLX7vToTUg/S6U4pLRuJLXqEA8=";
+  };
+
+  buildInputs = [
+    setuptools-scm
+    cython
+    pybind11
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scikit-learn
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "hmmlearn"
+  ];
+
+  pytestFlagsArray = [
+    "--pyargs"
+    "hmmlearn"
+  ];
+
+  meta = with lib; {
+    description = "Hidden Markov Models in Python with scikit-learn like API";
+    homepage = "https://github.com/hmmlearn/hmmlearn";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hnswlib/default.nix b/nixpkgs/pkgs/development/python-modules/hnswlib/default.nix
new file mode 100644
index 000000000000..c3dab17f5336
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hnswlib/default.nix
@@ -0,0 +1,32 @@
+{ buildPythonPackage
+, hnswlib
+, numpy
+, pybind11
+, setuptools
+, unittestCheckHook
+}:
+
+buildPythonPackage {
+  pname = "hnswlib";
+  inherit (hnswlib) version src meta;
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    numpy
+    setuptools
+    pybind11
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  unittestFlagsArray = [
+    "tests/python"
+    "--pattern 'bindings_test*.py'"
+  ];
+
+  pythonImportsCheck = [
+    "hnswlib"
+  ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hocr-tools/default.nix b/nixpkgs/pkgs/development/python-modules/hocr-tools/default.nix
new file mode 100644
index 000000000000..cfbf63a5869d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hocr-tools/default.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lxml
+, pillow
+, reportlab
+, lib
+}:
+buildPythonPackage rec {
+  pname = "hocr-tools";
+  version = "1.3.0";
+
+  src = fetchFromGitHub {
+    owner = "tmbdev";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "14f9hkp7pr677085w8iidwd0la9cjzy3pyj3rdg9b03nz9pc0w6p";
+  };
+
+  # hocr-tools uses a test framework that requires internet access
+  doCheck = false;
+
+  propagatedBuildInputs = [ pillow lxml reportlab ];
+
+  meta = with lib; {
+    description = "
+Tools for manipulating and evaluating the hOCR format for representing multi-lingual OCR results by embedding them into HTML";
+    homepage = "https://github.com/tmbdev/hocr-tools";
+    license = licenses.asl20;
+    maintainers = [ maintainers.kiwi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hole/default.nix b/nixpkgs/pkgs/development/python-modules/hole/default.nix
new file mode 100644
index 000000000000..37ac10cdfcaf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hole/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hole";
+  version = "0.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zkghLJe1SzN2qOeL23+T2ISjGkuODd9tJA1tO3hw2a0=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # no tests are present
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "hole"
+  ];
+
+  meta = with lib; {
+    description = "Python API for interacting with a Pihole instance.";
+    homepage = "https://github.com/home-assistant-ecosystem/python-hole";
+    changelog = "https://github.com/home-assistant-ecosystem/python-hole/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/holidays/default.nix b/nixpkgs/pkgs/development/python-modules/holidays/default.nix
new file mode 100644
index 000000000000..31d9423ebcde
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/holidays/default.nix
@@ -0,0 +1,84 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build-system
+, setuptools
+
+# l10n
+, polib
+, lingua
+, chameleon
+
+# dependencies
+, python-dateutil
+
+# tests
+, importlib-metadata
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "holidays";
+  version = "0.37";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "dr-prodigy";
+    repo = "python-holidays";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-3IhyHLwTPLTcyZY/9dZFmIr7Ael8I3mZrXhqYaULwY8=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+
+    # l10n
+    lingua
+    chameleon
+    polib
+  ];
+
+  postPatch = ''
+    patchShebangs scripts/l10n/*.py
+  '';
+
+  preBuild = ''
+    # make l10n
+    ./scripts/l10n/generate_po_files.py
+    ./scripts/l10n/generate_mo_files.py
+  '';
+
+  propagatedBuildInputs = [
+    python-dateutil
+  ];
+
+  doCheck = false;
+
+  nativeCheckInputs = [
+    importlib-metadata
+    polib
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "holidays"
+  ];
+
+  disabledTests = [
+    # Failure starting with 0.24
+    "test_l10n"
+  ];
+
+  meta = with lib; {
+    description = "Generate and work with holidays in Python";
+    homepage = "https://github.com/dr-prodigy/python-holidays";
+    changelog = "https://github.com/dr-prodigy/python-holidays/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab jluttine ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/hologram/default.nix b/nixpkgs/pkgs/development/python-modules/hologram/default.nix
new file mode 100644
index 000000000000..005834fc99b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hologram/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, jsonschema
+, pytestCheckHook
+, python-dateutil
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "hologram";
+  version = "0.0.16";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "dbt-labs";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-DboVCvByI8bTThamGBwSiQADGxIaEnTMmwmVI+4ARgc=";
+  };
+
+  patches = [
+    # https://github.com/dbt-labs/hologram/pull/58
+    (fetchpatch {
+      name = "python3.11-test-compatibility.patch";
+      url = "https://github.com/dbt-labs/hologram/commit/84bbe862ef6a2fcc8b8ce85b5c9a006cc7dc1f66.patch";
+      hash = "sha256-t096jJDoKUPED4QHSfVjUMLtUJjWcqjblCtGR8moEJc=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    jsonschema
+    python-dateutil
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "hologram"
+  ];
+
+  meta = with lib; {
+    description = "A library for automatically generating Draft 7 JSON Schemas from Python dataclasses";
+    homepage = "https://github.com/dbt-labs/hologram";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mausch tjni ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/holoviews/default.nix b/nixpkgs/pkgs/development/python-modules/holoviews/default.nix
new file mode 100644
index 000000000000..47f30ce2fc20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/holoviews/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, bokeh
+, buildPythonPackage
+, colorcet
+, fetchPypi
+, ipython
+, matplotlib
+, notebook
+, numpy
+, pandas
+, panel
+, param
+, pythonOlder
+, pyviz-comms
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "holoviews";
+  version = "1.18.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-urcpYat6GHlNsmk1HZBVI/Kq3K1ZOzIVEpJ86T3J35E=";
+  };
+
+  propagatedBuildInputs = [
+    colorcet
+    numpy
+    pandas
+    panel
+    param
+    pyviz-comms
+  ];
+
+  # tests not fully included with pypi release
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "holoviews"
+  ];
+
+  meta = with lib; {
+    description = "Python data analysis and visualization seamless and simple";
+    homepage = "https://www.holoviews.org/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/home-assistant-bluetooth/default.nix b/nixpkgs/pkgs/development/python-modules/home-assistant-bluetooth/default.nix
new file mode 100644
index 000000000000..c5cd3d2e4f3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/home-assistant-bluetooth/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, cython
+, poetry-core
+, setuptools
+, bleak
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "home-assistant-bluetooth";
+  version = "1.10.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-7gkesxQI6QBxyQpHlSSh1w6MDeid0dSdXn+jnxvafD0=";
+  };
+
+  postPatch = ''
+    # drop pytest parametrization (coverage, etc.)
+    sed -i '/addopts/d' pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    cython
+    poetry-core
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    bleak
+  ];
+
+  pythonImportsCheck = [
+    "home_assistant_bluetooth"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Basic bluetooth models used by Home Assistant";
+    changelog = "https://github.com/home-assistant-libs/home-assistant-bluetooth/blob/v${version}/CHANGELOG.md";
+    homepage = "https://github.com/home-assistant-libs/home-assistant-bluetooth";
+    license = licenses.asl20;
+    maintainers = teams.home-assistant.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/home-assistant-chip-clusters/default.nix b/nixpkgs/pkgs/development/python-modules/home-assistant-chip-clusters/default.nix
new file mode 100644
index 000000000000..86c01c1252e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/home-assistant-chip-clusters/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aenum
+, dacite
+}:
+
+buildPythonPackage rec {
+  pname = "home-assistant-chip-clusters";
+  version = "2023.10.2";
+  format = "wheel";
+
+  src = fetchPypi {
+    inherit format version;
+    pname = "home_assistant_chip_clusters";
+    dist = "py3";
+    python = "py3";
+    hash = "sha256-wAXxz0BryZ6i0yaqNp74PfApwMHYQuSLz5prJEiG1YE=";
+  };
+
+  propagatedBuildInputs = [
+    aenum
+    dacite
+  ];
+
+  pythonImportsCheck = [
+    "chip.clusters"
+    "chip.clusters.ClusterObjects"
+    "chip.tlv"
+  ];
+
+  doCheck = false; # no tests
+
+  meta = with lib; {
+    description = "Python-base APIs and tools for CHIP";
+    homepage = "https://github.com/home-assistant-libs/chip-wheels";
+    changelog = "https://github.com/home-assistant-libs/chip-wheels/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = teams.home-assistant.members;
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/home-assistant-chip-core/default.nix b/nixpkgs/pkgs/development/python-modules/home-assistant-chip-core/default.nix
new file mode 100644
index 000000000000..91cc9c65b13c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/home-assistant-chip-core/default.nix
@@ -0,0 +1,107 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+# build
+, autoPatchelfHook
+
+# runtime
+, libnl
+, openssl_1_1
+
+# propagates
+, aenum
+, coloredlogs
+, construct
+, cryptography
+, dacite
+, ecdsa
+, rich
+, pyyaml
+, ipdb
+, deprecation
+, mobly
+, pygobject3
+}:
+
+buildPythonPackage rec {
+  pname = "home-assistant-chip-core";
+  version = "2023.10.2";
+  format = "wheel";
+
+  disabled = pythonOlder "3.7";
+
+  src = let
+    system = {
+      "aarch64-linux" = {
+        name = "aarch64";
+        hash = "sha256-KBFXFD5cSVgE57S1cHghU3kPDrbRquAARN95UriPCnM=";
+      };
+      "x86_64-linux" = {
+        name = "x86_64";
+        hash = "sha256-9x7pjgERvsBuyol8LiuPOlFZ5Up92N9HYg1mH9/0HAU=";
+      };
+    }.${stdenv.system} or (throw "Unsupported system");
+  in fetchPypi {
+    pname = "home_assistant_chip_core";
+    inherit version format;
+    dist = "cp37";
+    python = "cp37";
+    abi = "abi3";
+    platform = "manylinux_2_31_${system.name}";
+    hash = system.hash;
+  };
+
+  nativeBuildInputs = [
+    autoPatchelfHook
+  ];
+
+  buildInputs = [
+    libnl
+    openssl_1_1
+  ];
+
+  propagatedBuildInputs = [
+    aenum
+    coloredlogs
+    construct
+    cryptography
+    dacite
+    ecdsa
+    rich
+    pyyaml
+    ipdb
+    deprecation
+    mobly
+    pygobject3
+  ];
+
+  pythonNamespaces = [
+    "chip"
+    "chip.clusters"
+  ];
+
+  pythonImportsCheck = [
+    "chip"
+    "chip.ble"
+    "chip.configuration"
+    "chip.discovery"
+    "chip.exceptions"
+    "chip.native"
+    "chip.storage"
+  ];
+
+  doCheck = false; # no tests
+
+  meta = with lib; {
+    description = "Python-base APIs and tools for CHIP";
+    homepage = "https://github.com/home-assistant-libs/chip-wheels";
+    changelog = "https://github.com/home-assistant-libs/chip-wheels/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = teams.home-assistant.members;
+    platforms = [ "aarch64-linux" "x86_64-linux" ];
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/homeassistant-pyozw/default.nix b/nixpkgs/pkgs/development/python-modules/homeassistant-pyozw/default.nix
new file mode 100644
index 000000000000..271059e48518
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/homeassistant-pyozw/default.nix
@@ -0,0 +1,28 @@
+{ python_openzwave, fetchPypi, openzwave, fetchFromGitHub }:
+
+(python_openzwave.override {
+  openzwave = openzwave.overrideAttrs (oldAttrs: {
+    version = "unstable-2020-03-24";
+
+    src = fetchFromGitHub {
+      owner = "home-assistant";
+      repo = "open-zwave";
+      rev = "94267fa298c1882f0dc73c0fd08f1f755ba83e83";
+      sha256 = "0p2869fwidz1wcqzfm52cwm9ab96pmwkna3d4yvvh21nh09cvmwk";
+    };
+
+    patches = [ ];
+  });
+}).overridePythonAttrs (oldAttrs: rec {
+  pname = "homeassistant_pyozw";
+  version = "0.1.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "47c1abd8f3dc287760471c6c7b5fad222ead64763c4cb25e37d0599ea3b26952";
+  };
+
+  patches = [];
+  meta.homepage = "https://github.com/home-assistant/python-openzwave";
+})
diff --git a/nixpkgs/pkgs/development/python-modules/homeconnect/default.nix b/nixpkgs/pkgs/development/python-modules/homeconnect/default.nix
new file mode 100644
index 000000000000..edf600921f1a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/homeconnect/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, requests-oauthlib
+, pythonOlder
+, setuptools
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "homeconnect";
+  version = "0.7.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wCx8Jh3NBTnYI+essH9toacjUaT4fS61SaAAZDCYZ4g=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    requests-oauthlib
+    six
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "homeconnect"
+  ];
+
+  meta = with lib; {
+    description = "Python client for the BSH Home Connect REST API";
+    homepage = "https://github.com/DavidMStraub/homeconnect";
+    changelog = "https://github.com/DavidMStraub/homeconnect/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/homematicip/default.nix b/nixpkgs/pkgs/development/python-modules/homematicip/default.nix
new file mode 100644
index 000000000000..f0260f04d3c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/homematicip/default.nix
@@ -0,0 +1,94 @@
+{ lib
+, aenum
+, aiohttp
+, aiohttp-wsgi
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, pytest-aiohttp
+, pytest-asyncio
+, requests
+, websocket-client
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "homematicip";
+  version = "1.0.16";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "hahn-th";
+    repo = "homematicip-rest-api";
+    rev = "refs/tags/${version}";
+    hash = "sha256-rvjdhsvGYllVeenVkU/ikwil4OVHPRIaXs+85q0pM/w=";
+  };
+
+  propagatedBuildInputs = [
+    aenum
+    aiohttp
+    async-timeout
+    requests
+    websocket-client
+    websockets
+  ];
+
+  nativeCheckInputs = [
+    aiohttp-wsgi
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=auto"
+  ];
+
+  disabledTests = [
+    # Assert issues with datetime
+    "test_contact_interface_device"
+    "test_dimmer"
+    "test_external_device"
+    "test_heating_failure_alert_group"
+    "test_heating"
+    "test_humidity_warning_rule_group"
+    "test_meta_group"
+    "test_pluggable_switch_measuring"
+    "test_rotary_handle_sensor"
+    "test_security_group"
+    "test_security_zone"
+    "test_shutter_device"
+    "test_smoke_detector"
+    "test_switching_group"
+    "test_temperature_humidity_sensor_outdoor"
+    "test_wall_mounted_thermostat_pro"
+    "test_weather_sensor"
+    # Random failures
+    "test_home_getSecurityJournal"
+    "test_home_unknown_types"
+    # Requires network access
+    "test_websocket"
+  ] ++ lib.optionals (pythonAtLeast "3.10") [
+    "test_connection_lost"
+    "test_user_disconnect_and_reconnect"
+    "test_ws_message"
+    "test_ws_no_pong"
+  ];
+
+  pythonImportsCheck = [
+    "homematicip"
+  ];
+
+  meta = with lib; {
+    description = "Module for the homematicIP REST API";
+    homepage = "https://github.com/hahn-th/homematicip-rest-api";
+    changelog = "https://github.com/hahn-th/homematicip-rest-api/releases/tag/${version}";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/homepluscontrol/default.nix b/nixpkgs/pkgs/development/python-modules/homepluscontrol/default.nix
new file mode 100644
index 000000000000..dfb255661eb9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/homepluscontrol/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, pyjwt
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "homepluscontrol";
+  version = "0.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "chemaaa";
+    repo = pname;
+    rev = version;
+    hash = "sha256-COOGqfYiR4tueQHXuCvVxShrYS0XNltcW4mclbFWcfA=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    pyjwt
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "homepluscontrol" ];
+
+  meta = with lib; {
+    description = "Python API to interact with the Legrand Eliot Home and Control";
+    homepage = "https://github.com/chemaaa/homepluscontrol";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hoomd-blue/default.nix b/nixpkgs/pkgs/development/python-modules/hoomd-blue/default.nix
new file mode 100644
index 000000000000..421ef73275c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hoomd-blue/default.nix
@@ -0,0 +1,63 @@
+{ lib, stdenv, fetchgit
+, cmake, pkgconfig
+, python
+, mpi ? null
+}:
+
+let components = {
+     cgcmm = true;
+     depreciated = true;
+     hpmc = true;
+     md = true;
+     metal = true;
+   };
+   onOffBool = b: if b then "ON" else "OFF";
+   withMPI = (mpi != null);
+in
+stdenv.mkDerivation rec {
+  version = "2.3.4";
+  pname = "hoomd-blue";
+
+  src = fetchgit {
+    url = "https://bitbucket.org/glotzer/hoomd-blue";
+    rev = "v${version}";
+    sha256 = "0in49f1dvah33nl5n2qqbssfynb31pw1ds07j8ziryk9w252j1al";
+  };
+
+  passthru = {
+    inherit components mpi;
+  };
+
+  nativeBuildInputs = [ cmake pkgconfig ];
+  buildInputs = lib.optionals withMPI [ mpi ];
+  propagatedBuildInputs = [ python.pkgs.numpy ]
+   ++ lib.optionals withMPI [ python.pkgs.mpi4py ];
+
+  dontAddPrefix = true;
+  cmakeFlags = [
+       "-DENABLE_MPI=${onOffBool withMPI}"
+       "-DBUILD_CGCMM=${onOffBool components.cgcmm}"
+       "-DBUILD_DEPRECIATED=${onOffBool components.depreciated}"
+       "-DBUILD_HPMC=${onOffBool components.hpmc}"
+       "-DBUILD_MD=${onOffBool components.md}"
+       "-DBUILD_METAL=${onOffBool components.metal}"
+  ];
+
+  preConfigure = ''
+    # Since we can't expand $out in `cmakeFlags`
+    cmakeFlags="$cmakeFlags -DCMAKE_INSTALL_PREFIX=$out/${python.sitePackages}"
+  '';
+
+  # tests fail but have tested that package runs properly
+  doCheck = false;
+  checkTarget = "test";
+
+  meta = with lib; {
+    homepage = "http://glotzerlab.engin.umich.edu/hoomd-blue/";
+    description = "HOOMD-blue is a general-purpose particle simulation toolkit";
+    license = licenses.bsdOriginal;
+    platforms = [ "x86_64-linux" ];
+    maintainers = [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hopcroftkarp/default.nix b/nixpkgs/pkgs/development/python-modules/hopcroftkarp/default.nix
new file mode 100644
index 000000000000..ae09ccfdf9f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hopcroftkarp/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "hopcroftkarp";
+  version = "1.2.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "28a7887db81ad995ccd36a1b5164a4c542b16d2781e8c49334dc9d141968c0e7";
+  };
+
+  # tests fail due to bad package name
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Implementation of HopcroftKarp's algorithm";
+    homepage = "https://github.com/sofiat-olaosebikan/hopcroftkarp";
+    license = licenses.gpl3Only;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/horizon-eda/default.nix b/nixpkgs/pkgs/development/python-modules/horizon-eda/default.nix
new file mode 100644
index 000000000000..d2385e190e77
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/horizon-eda/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, callPackage
+, horizon-eda
+, mesa
+, pycairo
+, python
+, pythonOlder
+}:
+
+let
+  base = horizon-eda.passthru.base;
+in
+buildPythonPackage {
+  inherit (base) pname version src meta CASROOT;
+
+  pyproject = false;
+
+  disabled = pythonOlder "3.9";
+
+  buildInputs = base.buildInputs ++ [
+    mesa
+    mesa.osmesa
+    python
+  ];
+
+  propagatedBuildInputs = [
+    pycairo
+  ];
+
+  nativeBuildInputs = base.nativeBuildInputs;
+
+  buildFlags = ["pymodule"];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/${python.sitePackages}
+    cp build/horizon.so $out/${python.sitePackages}
+
+    runHook postInstall
+  '';
+
+  enableParallelBuilding = true;
+}
diff --git a/nixpkgs/pkgs/development/python-modules/howdoi/default.nix b/nixpkgs/pkgs/development/python-modules/howdoi/default.nix
new file mode 100644
index 000000000000..4a910af1b988
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/howdoi/default.nix
@@ -0,0 +1,70 @@
+{ stdenv
+, lib
+, appdirs
+, buildPythonPackage
+, cachelib
+, colorama
+, cssselect
+, fetchFromGitHub
+, keep
+, lxml
+, pygments
+, pyquery
+, requests
+, rich
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "howdoi";
+  version = "2.0.20";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "gleitz";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-u0k+h7Sp2t/JUnfPqRzDpEA+vNXB7CpyZ/SRvk+B9t0=";
+  };
+
+  propagatedBuildInputs = [
+    appdirs
+    cachelib
+    colorama
+    cssselect
+    keep
+    lxml
+    pygments
+    pyquery
+    requests
+    rich
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  disabledTests = [
+    "test_colorize"
+  ];
+
+  pythonImportsCheck = [
+    "howdoi"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    changelog = "https://github.com/gleitz/howdoi/blob/v${version}/CHANGES.txt";
+    description = "Instant coding answers via the command line";
+    homepage = "https://github.com/gleitz/howdoi";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hpack/default.nix b/nixpkgs/pkgs/development/python-modules/hpack/default.nix
new file mode 100644
index 000000000000..ba819ba3882c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hpack/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, hypothesis
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "hpack";
+  version = "4.0.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "python-hyper";
+    repo = "hpack";
+    rev = "v${version}";
+    hash = "sha256-2CehGy3K5fKbkB1J8+8x1D4XvnBn1Mbapx+p8rdXDYc=";
+  };
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "hpack" ];
+
+  meta = with lib; {
+    description = "Pure-Python HPACK header compression";
+    homepage = "https://github.com/python-hyper/hpack";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hpccm/default.nix b/nixpkgs/pkgs/development/python-modules/hpccm/default.nix
new file mode 100644
index 000000000000..29f3234faadf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hpccm/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, six
+, archspec
+, pytestCheckHook
+, pytest-xdist
+}:
+
+buildPythonPackage rec {
+  pname = "hpccm";
+  version = "22.10.0";
+
+  src = fetchFromGitHub {
+    owner = "NVIDIA";
+    repo = "hpc-container-maker";
+    rev = "v${version}";
+    hash = "sha256-dLMbwtvn7HTVVlWHAzXU19ERdJxytf9NlnqMXW6ShKI=";
+  };
+
+  propagatedBuildInputs = [ six archspec ];
+  nativeCheckInputs = [ pytestCheckHook pytest-xdist ];
+
+  disabledTests = [
+    # tests require git
+    "test_commit"
+    "test_tag"
+  ];
+
+  pythonImportsCheck = [ "hpccm" ];
+
+  meta = with lib; {
+    description = "HPC Container Maker";
+    homepage = "https://github.com/NVIDIA/hpc-container-maker";
+    license = licenses.asl20;
+    platforms = platforms.x86;
+    maintainers = with maintainers; [ atila ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hs-dbus-signature/default.nix b/nixpkgs/pkgs/development/python-modules/hs-dbus-signature/default.nix
new file mode 100644
index 000000000000..ebf8de2f5668
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hs-dbus-signature/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "hs-dbus-signature";
+  version = "0.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NNnTcSX+K8zU+sj1QBd13h7aEXN9VqltJMNWCuhgZ6I=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    hypothesis
+  ];
+
+  pythonImportsCheck = [ "hs_dbus_signature" ];
+
+  meta = with lib; {
+    description = "A Hypothesis Strategy for Generating Arbitrary DBus Signatures";
+    homepage = "https://github.com/stratis-storage/hs-dbus-signature";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hsaudiotag3k/default.nix b/nixpkgs/pkgs/development/python-modules/hsaudiotag3k/default.nix
new file mode 100644
index 000000000000..66ea895960c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hsaudiotag3k/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "hsaudiotag3k";
+  version = "1.1.3.post1";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ef60e9210d4727e82f0095a686cb07b676d055918f0c59c5bfa8598da03e59d1";
+  };
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A pure Python library that lets one to read metadata from media files";
+    homepage = "http://hg.hardcoded.net/hsaudiotag/";
+    license = licenses.bsd3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hsluv/default.nix b/nixpkgs/pkgs/development/python-modules/hsluv/default.nix
new file mode 100644
index 000000000000..27701da88914
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hsluv/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hsluv";
+  version = "5.0.4";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "hsluv";
+    repo = "hsluv-python";
+    rev = "v${version}";
+    hash = "sha256-bjivmPTU3Gp3pcC0ru4GSZANdhPqS1QSTMeiPGN8GCI=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "hsluv" ];
+
+  meta = with lib; {
+    description = "Python implementation of HSLuv";
+    homepage = "https://github.com/hsluv/hsluv-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hstspreload/default.nix b/nixpkgs/pkgs/development/python-modules/hstspreload/default.nix
new file mode 100644
index 000000000000..68508b655e4c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hstspreload/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hstspreload";
+  version = "2023.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "sethmlarson";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-MF+pRP0KluF7LrSkfxs6ZSEXyqmr51mUqUn01dLdUdQ=";
+  };
+
+  # Tests require network connection
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "hstspreload"
+  ];
+
+  meta = with lib; {
+    description = "Chromium HSTS Preload list as a Python package and updated daily";
+    homepage = "https://github.com/sethmlarson/hstspreload";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/html-sanitizer/default.nix b/nixpkgs/pkgs/development/python-modules/html-sanitizer/default.nix
new file mode 100644
index 000000000000..c640ee8a106d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/html-sanitizer/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, lxml
+, beautifulsoup4
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "html-sanitizer";
+  version = "2.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "matthiask";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-WU5wdTvCzYEw1eiuTLcFImvydzxWANfmDQCmEgyU9h4=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    lxml
+    beautifulsoup4
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "html_sanitizer/tests.py"
+  ];
+
+  disabledTests = [
+    # Tests are sensitive to output
+    "test_billion_laughs"
+    "test_10_broken_html"
+  ];
+
+  pythonImportsCheck = [
+    "html_sanitizer"
+  ];
+
+  meta = with lib; {
+    description = "Allowlist-based and very opinionated HTML sanitizer";
+    homepage = "https://github.com/matthiask/html-sanitizer";
+    changelog = "https://github.com/matthiask/html-sanitizer/blob/${version}/CHANGELOG.rst";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/html-tag-names/default.nix b/nixpkgs/pkgs/development/python-modules/html-tag-names/default.nix
new file mode 100644
index 000000000000..543ef8686dc9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/html-tag-names/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "html-tag-names";
+  version = "0.1.2";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "Riverside-Healthcare";
+    repo = "html-tag-names";
+    rev = version;
+    hash = "sha256-2YywP4/0yocejuJwanC5g9BR7mcy5C+zMhCjNZ9FRH4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "HtmlTagNames" ];
+
+  meta = with lib; {
+    description = "List of known HTML tags";
+    homepage = "https://github.com/Riverside-Healthcare/html-tag-names";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ traxys ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/html-text/default.nix b/nixpkgs/pkgs/development/python-modules/html-text/default.nix
new file mode 100644
index 000000000000..c7b4ec236602
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/html-text/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, lxml
+, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "html-text";
+  version = "0.5.2";
+
+  src = fetchFromGitHub {
+    owner = "TeamHG-Memex";
+    repo = "html-text";
+    rev = version;
+    hash = "sha256-jw/hpz0QfcgP5OEJcmre0h1OzOfpPtaROxHm+YUqces=";
+  };
+
+  propagatedBuildInputs = [
+    lxml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    six
+  ];
+
+  pythonImportsCheck = [ "html_text" ];
+
+  meta = with lib; {
+    description = "Extract text from HTML";
+    homepage = "https://github.com/TeamHG-Memex/html-text";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ambroisie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/html-void-elements/default.nix b/nixpkgs/pkgs/development/python-modules/html-void-elements/default.nix
new file mode 100644
index 000000000000..bef3d9208026
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/html-void-elements/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "html-void-elements";
+  version = "0.1.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "Riverside-Healthcare";
+    repo = "html-void-elements";
+    rev = version;
+    hash = "sha256-Q5OEczTdgCCyoOsKv3MKRE3w4t/qyPG4YKbF19jlC88=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "HtmlVoidElements" ];
+
+  meta = with lib; {
+    description = "List of HTML void tag names";
+    homepage = "https://github.com/Riverside-Healthcare/html-void-elements";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ traxys ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/html2text/default.nix b/nixpkgs/pkgs/development/python-modules/html2text/default.nix
new file mode 100644
index 000000000000..95698872a08f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/html2text/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "html2text";
+  version = "2020.1.16";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "Alir3z4";
+    repo = pname;
+    rev = version;
+    sha256 = "1y924clp2hiqg3a9437z808p29mqcx537j5fmz71plx8qrcm5jf9";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "html2text" ];
+
+  meta = with lib; {
+    description = "Turn HTML into equivalent Markdown-structured text";
+    homepage = "https://github.com/Alir3z4/html2text/";
+    license = licenses.gpl3Only;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/html5-parser/default.nix b/nixpkgs/pkgs/development/python-modules/html5-parser/default.nix
new file mode 100644
index 000000000000..67f05cb8e7f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/html5-parser/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, chardet
+, fetchFromGitHub
+, lxml
+, pkg-config
+, pkgs
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "html5-parser";
+  version = "0.4.12";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "kovidgoyal";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-0Qn+To/d3+HMx+KhhgJBEHVYPOfIeBnngBraY7r4uSs=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  buildInputs = [
+    pkgs.libxml2
+  ];
+
+  propagatedBuildInputs = [
+    chardet
+    lxml
+  ];
+
+  nativeCheckInputs = [
+    beautifulsoup4
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "html5_parser"
+  ];
+
+  pytestFlagsArray = [
+    "test/*.py"
+  ];
+
+  meta = with lib; {
+    description = "Fast C based HTML 5 parsing for python";
+    homepage = "https://html5-parser.readthedocs.io";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/html5lib/default.nix b/nixpkgs/pkgs/development/python-modules/html5lib/default.nix
new file mode 100644
index 000000000000..f069aee87666
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/html5lib/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, six
+, webencodings
+, mock
+, pytest-expect
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "html5lib";
+  version = "1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f";
+  };
+
+  patches = [
+    # Fix compatibility with pytest 6.
+    # Will be included in the next release after 1.1.
+    (fetchpatch {
+      url = "https://github.com/html5lib/html5lib-python/commit/2c19b9899ab3a3e8bd0ca35e5d78544334204169.patch";
+      hash = "sha256-VGCeB6o2QO/skeCZs8XLPfgEYVOSRL8cCpG7ajbZWEs=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    six
+    webencodings
+  ];
+
+  # latest release not compatible with pytest 6
+  doCheck = false;
+  nativeCheckInputs = [
+    mock
+    pytest-expect
+    pytestCheckHook
+  ];
+
+  meta = {
+    homepage = "https://github.com/html5lib/html5lib-python";
+    downloadPage = "https://github.com/html5lib/html5lib-python/releases";
+    description = "HTML parser based on WHAT-WG HTML5 specification";
+    longDescription = ''
+      html5lib is a pure-python library for parsing HTML. It is designed to
+      conform to the WHATWG HTML specification, as is implemented by all
+      major web browsers.
+    '';
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ domenkozar prikhi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/html5tagger/default.nix b/nixpkgs/pkgs/development/python-modules/html5tagger/default.nix
new file mode 100644
index 000000000000..42bc3aa18ad6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/html5tagger/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "html5tagger";
+  version = "1.3.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "sanic-org";
+    repo = "html5tagger";
+    rev = "v${version}";
+    hash = "sha256-Or0EizZC9FMjTcbgecDvgGB09KNGyxHreSDojgB7ysg=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "html5tagger"
+  ];
+
+  meta = with lib; {
+    description = "Create HTML documents from Python";
+    homepage = "https://github.com/sanic-org/html5tagger";
+    license = licenses.unlicense;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/htmllaundry/default.nix b/nixpkgs/pkgs/development/python-modules/htmllaundry/default.nix
new file mode 100644
index 000000000000..e844c99693a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/htmllaundry/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi, nose
+, six
+, lxml
+}:
+
+buildPythonPackage rec {
+  pname = "htmllaundry";
+  version = "2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9124f067d3c06ef2613e2cc246b2fde2299802280a8b0e60dc504137085f0334";
+  };
+
+  buildInputs = [ nose ];
+  propagatedBuildInputs = [ six lxml ];
+
+  # some tests fail, probably because of changes in lxml
+  # not relevant for me, if releavnt for you, fix it...
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Simple HTML cleanup utilities";
+    license = licenses.bsd3;
+    homepage = "https://pypi.org/project/htmllaundry/";
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/htmllistparse/default.nix b/nixpkgs/pkgs/development/python-modules/htmllistparse/default.nix
new file mode 100644
index 000000000000..ae13f6585a1d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/htmllistparse/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, beautifulsoup4
+, html5lib
+, requests
+, fusepy
+}:
+
+buildPythonPackage rec {
+  pname = "htmllistparse";
+  version = "0.6.1";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bcimvwPIQ7nTJYQ6JqI1GnlbVzzZKiybgnFiEBnGQII=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+  propagatedBuildInputs = [ beautifulsoup4 html5lib requests fusepy ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "htmllistparse"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/gumblex/htmllisting-parser";
+    description = "Python parser for Apache/nginx-style HTML directory listing";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexchen ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/htmlmin/default.nix b/nixpkgs/pkgs/development/python-modules/htmlmin/default.nix
new file mode 100644
index 000000000000..e91aedc6cdb1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/htmlmin/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "htmlmin";
+  version = "0.1.12";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "50c1ef4630374a5d723900096a961cff426dff46b48f34d194a81bbe14eca178";
+  };
+
+  # Tests run fine in a normal source checkout, but not when being built by nix.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A configurable HTML Minifier with safety features";
+    homepage = "https://pypi.python.org/pypi/htmlmin";
+    license = licenses.bsd3;
+    maintainers = [];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/htseq/default.nix b/nixpkgs/pkgs/development/python-modules/htseq/default.nix
new file mode 100644
index 000000000000..5c369d7f06a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/htseq/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchFromGitHub, cython, numpy, pysam, matplotlib, python, isPy27, isPy3k }:
+buildPythonPackage rec {
+  version = "0.12.4";
+  pname = "htseq";
+
+  src = fetchFromGitHub {
+    owner = "htseq";
+    repo = "htseq";
+    rev = "release_${version}";
+    sha256 = "0y7vh249sljqjnv81060w4xkdx6f1y5zdqkh38yk926x6v9riijm";
+  };
+
+  nativeBuildInputs = [ cython ];
+  propagatedBuildInputs = [ numpy pysam matplotlib ];
+
+  checkPhase = lib.optionalString isPy27 ''
+    ${python.interpreter} python2/test/test_general.py
+  '' + lib.optionalString isPy3k ''
+    ${python.interpreter} python3/test/test_general.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://htseq.readthedocs.io/";
+    description = "A framework to work with high-throughput sequencing data";
+    maintainers = with maintainers; [ unode ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/httmock/default.nix b/nixpkgs/pkgs/development/python-modules/httmock/default.nix
new file mode 100644
index 000000000000..f48cdbd1ff45
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httmock/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "httmock";
+  version = "1.4.0";
+
+  src = fetchFromGitHub {
+    owner = "patrys";
+    repo = "httmock";
+    rev = version;
+    hash = "sha256-yid4vh1do0zqVzd1VV7gc+Du4VPrkeGFsDHqNbHL28I=";
+  };
+
+  nativeCheckInputs = [
+    requests
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [ "tests.py" ];
+
+  pythonImportsCheck = [ "httmock" ];
+
+  meta = with lib; {
+    description = "A mocking library for requests";
+    homepage = "https://github.com/patrys/httmock";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ nyanloutre ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/http-ece/default.nix b/nixpkgs/pkgs/development/python-modules/http-ece/default.nix
new file mode 100644
index 000000000000..16f8fa23c328
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/http-ece/default.nix
@@ -0,0 +1,25 @@
+{ lib, fetchPypi, buildPythonPackage, pythonOlder
+, coverage, flake8, mock, nose, importlib-metadata
+, cryptography }:
+
+buildPythonPackage rec {
+  pname = "http_ece";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1y5ln09ji4dwpzhxr77cggk02kghq7lql60a6969a5n2lwpvqblk";
+  };
+
+  propagatedBuildInputs = [ cryptography ]
+    ++ lib.optionals (pythonOlder "3.8") [ importlib-metadata ];
+
+  nativeCheckInputs = [ coverage flake8 mock nose ];
+
+  meta = with lib; {
+    description = "Encipher HTTP Messages";
+    homepage = "https://github.com/martinthomson/encrypted-content-encoding";
+    license = licenses.mit;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/http-message-signatures/default.nix b/nixpkgs/pkgs/development/python-modules/http-message-signatures/default.nix
new file mode 100644
index 000000000000..d88832f81acd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/http-message-signatures/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, http-sfv
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "http-message-signatures";
+  version = "0.4.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pyauth";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-acTziJM5H5Td+eG/LNrlNwgpVvFDyl/tf6//YuE1XZk=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    http-sfv
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests
+  ];
+
+  pytestFlagsArray = [
+    "test/test.py"
+  ];
+
+  pythonImportsCheck = [
+    "http_message_signatures"
+  ];
+
+  meta = with lib; {
+    description = "Requests authentication module for HTTP Signature";
+    homepage = "https://github.com/pyauth/http-message-signatures";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/http-parser/default.nix b/nixpkgs/pkgs/development/python-modules/http-parser/default.nix
new file mode 100644
index 000000000000..8f21bc75daa0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/http-parser/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "http-parser";
+  version = "0.9.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "benoitc";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-WHimvSaNcncwzLwwk5+ZNg7BbHF+hPr39SfidEDYfhU=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    setuptools
+  ];
+
+  preBuild = ''
+    # re-run cython
+    make -B
+  '';
+
+  pythonImportsCheck = [
+    "http_parser"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "HTTP request/response parser for python in C";
+    homepage = "https://github.com/benoitc/http-parser";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/http-sfv/default.nix b/nixpkgs/pkgs/development/python-modules/http-sfv/default.nix
new file mode 100644
index 000000000000..55b318ff40de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/http-sfv/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "http-sfv";
+  version = "0.9.8";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mnot";
+    repo = "http_sfv";
+    rev = "http_sfv-${version}";
+    hash = "sha256-zl0Rk4QbzCVmYZ6TnVq+C+oe27Imz5fEQY9Fco5lo5s=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  # Tests require external data (https://github.com/httpwg/structured-field-tests)
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "http_sfv"
+  ];
+
+  meta = with lib; {
+    description = "Module to parse and serialise HTTP structured field values";
+    homepage = "https://github.com/mnot/http_sfv";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/httpagentparser/default.nix b/nixpkgs/pkgs/development/python-modules/httpagentparser/default.nix
new file mode 100644
index 000000000000..bc7a8e33f4ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpagentparser/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "httpagentparser";
+  version = "1.9.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-U879nWWZD2/lnAN4ytjqG53493DS6L2dh2LtrgM76Ao=";
+  };
+
+  # PyPi version does not include test directory
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "httpagentparser"
+  ];
+
+  meta = with lib; {
+    description = "Module to extract OS, Browser, etc. information from http user agent string";
+    homepage = "https://github.com/shon/httpagentparser";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/httpauth/default.nix b/nixpkgs/pkgs/development/python-modules/httpauth/default.nix
new file mode 100644
index 000000000000..a7d4240db143
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpauth/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  version = "0.3";
+  pname = "httpauth";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0qas7876igyz978pgldp5r7n7pis8n4vf0v87gxr9l7p7if5lr3l";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "WSGI HTTP Digest Authentication middleware";
+    homepage = "https://github.com/jonashaag/httpauth";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/httpbin/default.nix b/nixpkgs/pkgs/development/python-modules/httpbin/default.nix
new file mode 100644
index 000000000000..cc15e00748c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpbin/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, brotlicffi
+, buildPythonPackage
+, decorator
+, fetchPypi
+, flask
+, flask-limiter
+, flasgger
+, itsdangerous
+, markupsafe
+, raven
+, six
+, pytestCheckHook
+, setuptools
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "httpbin";
+  version = "0.10.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-e4WWvrDnWntlPDnR888mPW1cR20p4d9ve7K3C/nwaj0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    brotlicffi
+    decorator
+    flask
+    flask-limiter
+    flasgger
+    itsdangerous
+    markupsafe
+    raven
+    six
+    werkzeug
+  ] ++ raven.optional-dependencies.flask;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests seems to be outdated
+    "test_anything"
+    "test_get"
+    "test_redirect_n_equals_to_1"
+    "test_redirect_n_higher_than_1"
+    "test_redirect_to_post"
+    "test_relative_redirect_n_equals_to_1"
+    "test_relative_redirect_n_higher_than_1"
+  ];
+
+  pythonImportsCheck = [
+    "httpbin"
+  ];
+
+  meta = with lib; {
+    description = "HTTP Request and Response Service";
+    homepage = "https://github.com/psf/httpbin";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/httpcore/default.nix b/nixpkgs/pkgs/development/python-modules/httpcore/default.nix
new file mode 100644
index 000000000000..91cd904e3afe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpcore/default.nix
@@ -0,0 +1,95 @@
+{ lib
+, anyio
+, buildPythonPackage
+, certifi
+, fetchFromGitHub
+, hatchling
+, hatch-fancy-pypi-readme
+, h11
+, h2
+, pproxy
+, pytest-asyncio
+, pytest-httpbin
+, pytest-trio
+, pytestCheckHook
+, pythonOlder
+, sniffio
+, socksio
+# for passthru.tests
+, httpx
+, httpx-socks
+}:
+
+buildPythonPackage rec {
+  pname = "httpcore";
+  version = "0.18.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "encode";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-UEpERsB7jZlMqRtyHxLYBisfDbTGaAiTtsgU1WUpvtA=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+    hatch-fancy-pypi-readme
+  ];
+
+  propagatedBuildInputs = [
+    anyio
+    certifi
+    h11
+    sniffio
+  ];
+
+  passthru.optional-dependencies = {
+    http2 = [
+      h2
+    ];
+    socks = [
+      socksio
+    ];
+  };
+
+  nativeCheckInputs = [
+    pproxy
+    pytest-asyncio
+    pytest-httpbin
+    pytest-trio
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.http2
+    ++ passthru.optional-dependencies.socks;
+
+  disabledTests = [
+    # https://github.com/encode/httpcore/discussions/813
+    "test_connection_pool_timeout_during_request"
+    "test_connection_pool_timeout_during_response"
+    "test_h11_timeout_during_request"
+    "test_h11_timeout_during_response"
+    "test_h2_timeout_during_handshake"
+    "test_h2_timeout_during_request"
+    "test_h2_timeout_during_response"
+  ];
+
+  pythonImportsCheck = [
+    "httpcore"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  passthru.tests = {
+    inherit httpx httpx-socks;
+  };
+
+  meta = with lib; {
+    changelog = "https://github.com/encode/httpcore/releases/tag/${version}";
+    description = "A minimal low-level HTTP client";
+    homepage = "https://github.com/encode/httpcore";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ris ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/httpie-ntlm/default.nix b/nixpkgs/pkgs/development/python-modules/httpie-ntlm/default.nix
new file mode 100644
index 000000000000..22a995ebd24b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpie-ntlm/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, httpie
+, requests_ntlm
+}:
+
+buildPythonPackage rec {
+  pname = "httpie-ntlm";
+  version = "1.0.2";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b1f757180c0bd60741ea16cf91fc53d47df402a5c287c4a61a14b335ea0552b3";
+  };
+
+  propagatedBuildInputs = [ httpie requests_ntlm ];
+
+  # Package have no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "httpie_ntlm" ];
+
+  meta = with lib; {
+    description = "NTLM auth plugin for HTTPie";
+    homepage = "https://github.com/httpie/httpie-ntlm";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ kfollesdal ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/httpie/default.nix b/nixpkgs/pkgs/development/python-modules/httpie/default.nix
new file mode 100644
index 000000000000..43f69ecd3c9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpie/default.nix
@@ -0,0 +1,126 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, installShellFiles
+, pandoc
+, pythonOlder
+# BuildInputs
+, charset-normalizer
+, defusedxml
+, multidict
+, pygments
+, requests
+, requests-toolbelt
+, setuptools
+, rich
+, pysocks
+# CheckInputs
+, pip
+, pytest-httpbin
+, pytest-lazy-fixture
+, pytest-mock
+, pytestCheckHook
+, responses
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "httpie";
+  version = "3.2.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "httpie";
+    repo = "httpie";
+    rev = version;
+    hash = "sha256-hPsjEpvT6tnPm68AUB2Tv3Gon4DfSzO2VYCGqP8ozSI=";
+  };
+
+  nativeBuildInputs = [
+    installShellFiles
+    pandoc
+  ];
+
+  propagatedBuildInputs = [
+    charset-normalizer
+    defusedxml
+    multidict
+    pygments
+    requests
+    requests-toolbelt
+    setuptools
+    rich
+  ] ++ requests.optional-dependencies.socks;
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pip
+    pytest-httpbin
+    pytest-lazy-fixture
+    pytest-mock
+    pytestCheckHook
+    responses
+    werkzeug
+  ];
+
+  postInstall = ''
+    # install completions
+    installShellCompletion --cmd http \
+      --bash extras/httpie-completion.bash \
+      --fish extras/httpie-completion.fish
+
+    # convert the docs/README.md file
+    pandoc --standalone -f markdown -t man docs/README.md -o docs/http.1
+    installManPage docs/http.1
+  '';
+
+  pytestFlagsArray = [
+    "httpie"
+    "tests"
+  ];
+
+  pythonImportsCheck = [
+    "httpie"
+  ];
+
+  disabledTestPaths = lib.optionals stdenv.isDarwin [
+    # flaky
+    "tests/test_plugins_cli.py"
+  ];
+
+  disabledTests = [
+    # flaky
+    "test_stdin_read_warning"
+    # Re-evaluate those tests with the next release
+    "test_duplicate_keys_support_from_response"
+    "test_invalid_xml"
+    "test_json_formatter_with_body_preceded_by_non_json_data"
+    "test_pretty_options_with_and_without_stream_with_converter"
+    "test_response_mime_overwrite"
+    "test_terminal_output_response_charset_detection"
+    "test_terminal_output_response_charset_override"
+    "test_terminal_output_response_content_type_charset_with_stream"
+    "test_terminal_output_response_content_type_charset"
+    "test_valid_xml"
+    "test_xml_format_options"
+    "test_xml_xhtm"
+    # httpbin compatibility issues
+    "test_compress_form"
+    "test_binary_suppresses_when_terminal"
+    "test_binary_suppresses_when_not_terminal_but_pretty"
+    "test_binary_included_and_correct_when_suitable"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # flaky
+    "test_daemon_runner"
+  ];
+
+  meta = with lib; {
+    description = "A command line HTTP client whose goal is to make CLI human-friendly";
+    homepage = "https://httpie.org/";
+    changelog = "https://github.com/httpie/httpie/blob/${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ antono relrod schneefux ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/httplib2/default.nix b/nixpkgs/pkgs/development/python-modules/httplib2/default.nix
new file mode 100644
index 000000000000..c201bc3126c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httplib2/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, isPy27
+, mock
+, pyparsing
+, pytest-forked
+, pytest-randomly
+, pytest-timeout
+, pytestCheckHook
+, pythonAtLeast
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "httplib2";
+  version = "0.21.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-1Pl+l28J7crfO2UY/9/D019IzOHWOwjR+UvVEHICTqU=";
+  };
+
+  postPatch = ''
+    sed -i "/--cov/d" setup.cfg
+  '';
+
+  propagatedBuildInputs = [
+    pyparsing
+  ];
+
+  nativeCheckInputs = [
+    cryptography
+    mock
+    pytest-forked
+    pytest-randomly
+    pytest-timeout
+    six
+    pytestCheckHook
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  # Don't run tests for older Pythons
+  doCheck = pythonAtLeast "3.9";
+
+  disabledTests = [
+    # ValueError: Unable to load PEM file.
+    # https://github.com/httplib2/httplib2/issues/192#issuecomment-993165140
+    "test_client_cert_password_verified"
+
+    # improper pytest marking
+    "test_head_301"
+    "test_303"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # fails with "ConnectionResetError: [Errno 54] Connection reset by peer"
+    "test_connection_close"
+    # fails with HTTP 408 Request Timeout, instead of expected 200 OK
+    "test_timeout_subsequent"
+    "test_connection_close"
+  ];
+
+  pytestFlagsArray = [
+    "--ignore python2"
+  ];
+
+  pythonImportsCheck = [
+    "httplib2"
+  ];
+
+  meta = with lib; {
+    description = "A comprehensive HTTP client library";
+    homepage = "https://github.com/httplib2/httplib2";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/httpretty/default.nix b/nixpkgs/pkgs/development/python-modules/httpretty/default.nix
new file mode 100644
index 000000000000..aeab2d9e00a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpretty/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sure
+, six
+, pytest
+, freezegun
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "httpretty";
+  version = "1.1.4";
+
+  # drop this for version > 0.9.7
+  # Flaky tests: https://github.com/gabrielfalcao/HTTPretty/pull/394
+  doCheck = lib.versionAtLeast version "0.9.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "20de0e5dd5a18292d36d928cc3d6e52f8b2ac73daec40d41eb62dee154933b68";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  nativeCheckInputs = [
+    sure
+    freezegun
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    "tests/bugfixes"
+    "tests/functional"
+    "tests/pyopenssl"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    homepage = "https://httpretty.readthedocs.org/";
+    description = "HTTP client request mocking tool";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/httpserver/default.nix b/nixpkgs/pkgs/development/python-modules/httpserver/default.nix
new file mode 100644
index 000000000000..830e0c9b1bf2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpserver/default.nix
@@ -0,0 +1,26 @@
+{ lib, fetchPypi, buildPythonPackage, docopt, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "httpserver";
+  version = "1.1.0";
+
+  buildInputs = [ docopt ];
+
+  # Tests pull in lots of other dependencies to emulate different web
+  # drivers.
+  doCheck = false;
+
+  # Because it uses asyncio
+  disabled = pythonOlder "3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1q62g324dvb0hqdwwrnj41sqr4d3ly78v9nc26rz1whj4pwdmhsv";
+  };
+
+  meta = {
+    description = "Asyncio implementation of an HTTP server";
+    homepage = "https://github.com/thomwiggers/httpserver";
+    license = with lib.licenses; [ bsd3 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/httpsig/default.nix b/nixpkgs/pkgs/development/python-modules/httpsig/default.nix
new file mode 100644
index 000000000000..accc731eeadf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpsig/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, pycryptodome
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "httpsig";
+  version = "1.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1rkc3zwsq53rjsmc47335m4viljiwdbmw3y2zry4z70j8q1dbmki";
+  };
+
+  buildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    pycryptodome
+    requests
+    six
+  ];
+
+  pythonImportsCheck = [ "httpsig" ];
+
+  meta = with lib; {
+    description = "Sign HTTP requests with secure signatures";
+    license = licenses.mit;
+    maintainers = with maintainers; [ srhb ];
+    homepage = "https://github.com/ahknight/httpsig";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/httptools/default.nix b/nixpkgs/pkgs/development/python-modules/httptools/default.nix
new file mode 100644
index 000000000000..c516267629cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httptools/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "httptools";
+  version = "0.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-n8bkCa04y9aLF3zVFY/EBCx5a4LKiNmex48HvtbGt5Y=";
+  };
+
+  # Tests are not included in pypi tarball
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "httptools"
+  ];
+
+  meta = with lib; {
+    description = "A collection of framework independent HTTP protocol utils";
+    homepage = "https://github.com/MagicStack/httptools";
+    changelog = "https://github.com/MagicStack/httptools/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/httpx-auth/default.nix b/nixpkgs/pkgs/development/python-modules/httpx-auth/default.nix
new file mode 100644
index 000000000000..5c099d91d436
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpx-auth/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, setuptools-scm
+, wheel
+, httpx
+, pyjwt
+, pytest-httpx
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "httpx-auth";
+  version = "0.18.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Colin-b";
+    repo = "httpx_auth";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-kK31jpS9Ax5kNkvUSbWWIC6CKdZKVJ28kLS0iuntWqg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  nativeCheckInputs = [
+    pyjwt
+    pytest-httpx
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "httpx_auth" ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Authentication classes to be used with httpx";
+    homepage = "https://github.com/Colin-b/httpx_auth";
+    changelog = "https://github.com/Colin-b/httpx_auth/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/httpx-ntlm/default.nix b/nixpkgs/pkgs/development/python-modules/httpx-ntlm/default.nix
new file mode 100644
index 000000000000..8d8a5e838b79
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpx-ntlm/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, httpx
+, pyspnego
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "httpx-ntlm";
+  version = "1.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "httpx_ntlm";
+    inherit version;
+    hash = "sha256-Qb6KK6hRQ0hOYX3LkX1LGeOuEq/caIYipJAQNJk7U+Q=";
+  };
+
+  propagatedBuildInputs = [
+    httpx
+    pyspnego
+  ];
+
+  # https://github.com/ulodciv/httpx-ntlm/issues/5
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "httpx_ntlm"
+  ];
+
+  meta = with lib; {
+    description = "NTLM authentication support for HTTPX";
+    homepage = "https://github.com/ulodciv/httpx-ntlm";
+    changelog = "https://github.com/ulodciv/httpx-ntlm/releases/tag/${version}";
+    license = licenses.isc;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/httpx-socks/default.nix b/nixpkgs/pkgs/development/python-modules/httpx-socks/default.nix
new file mode 100644
index 000000000000..75be71df04f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpx-socks/default.nix
@@ -0,0 +1,88 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, curio
+, fetchFromGitHub
+, flask
+, httpcore
+, httpx
+, hypercorn
+, pytest-asyncio
+, pytest-trio
+, pytestCheckHook
+, python-socks
+, pythonOlder
+, setuptools
+, sniffio
+, starlette
+, tiny-proxy
+, trio
+, trustme
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "httpx-socks";
+  version = "0.8.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "romis2012";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-3Dj+rrH5Pil5xQE6sAAD5RTycwlKq+TVsAeB2NVqGjY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+    httpcore
+    python-socks
+  ];
+
+  passthru.optional-dependencies = {
+    asyncio = [
+      async-timeout
+    ];
+    trio = [
+      trio
+    ];
+  };
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    flask
+    hypercorn
+    pytest-asyncio
+    pytest-trio
+    pytestCheckHook
+    starlette
+    tiny-proxy
+    trustme
+    yarl
+  ];
+
+  pythonImportsCheck = [
+    "httpx_socks"
+  ];
+
+  disabledTests = [
+    # Tests don't work in the sandbox
+    "test_proxy"
+    "test_secure_proxy"
+  ];
+
+  meta = with lib; {
+    description = "Proxy (HTTP, SOCKS) transports for httpx";
+    homepage = "https://github.com/romis2012/httpx-socks";
+    changelog = "https://github.com/romis2012/httpx-socks/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/httpx/default.nix b/nixpkgs/pkgs/development/python-modules/httpx/default.nix
new file mode 100644
index 000000000000..7e451532af04
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/httpx/default.nix
@@ -0,0 +1,130 @@
+{ lib
+, stdenv
+, brotli
+, brotlicffi
+, buildPythonPackage
+, certifi
+, chardet
+, click
+, fetchFromGitHub
+, h2
+, hatch-fancy-pypi-readme
+, hatchling
+, httpcore
+, isPyPy
+, multipart
+, pygments
+, python
+, pythonOlder
+, rfc3986
+, rich
+, sniffio
+, socksio
+, pytestCheckHook
+, pytest-asyncio
+, pytest-trio
+, trustme
+, uvicorn
+}:
+
+buildPythonPackage rec {
+  pname = "httpx";
+  version = "0.25.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "encode";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-zQVavjU66ksO0FB1h32e0YUhOGiQ4jHPvjgLhtxjU6s=";
+  };
+
+  nativeBuildInputs = [
+    hatch-fancy-pypi-readme
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    certifi
+    httpcore
+    rfc3986
+    sniffio
+  ];
+
+  passthru.optional-dependencies = {
+    http2 = [
+      h2
+    ];
+    socks = [
+      socksio
+    ];
+    brotli = if isPyPy then [
+      brotlicffi
+    ] else [
+      brotli
+    ];
+    cli = [
+      click
+      rich
+      pygments
+    ];
+  };
+
+  # trustme uses pyopenssl
+  doCheck = !(stdenv.isDarwin && stdenv.isAarch64);
+
+  nativeCheckInputs = [
+    chardet
+    multipart
+    pytestCheckHook
+    pytest-asyncio
+    pytest-trio
+    trustme
+    uvicorn
+  ] ++ passthru.optional-dependencies.http2
+    ++ passthru.optional-dependencies.brotli
+    ++ passthru.optional-dependencies.socks;
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "rfc3986[idna2008]>=1.3,<2" "rfc3986>=1.3"
+  '';
+
+  # testsuite wants to find installed packages for testing entrypoint
+  preCheck = ''
+    export PYTHONPATH=$out/${python.sitePackages}:$PYTHONPATH
+  '';
+
+  pytestFlagsArray = [
+    "-W" "ignore::DeprecationWarning"
+    "-W" "ignore::trio.TrioDeprecationWarning"
+  ];
+
+  disabledTests = [
+    # httpcore.ConnectError: [Errno 101] Network is unreachable
+    "test_connect_timeout"
+    # httpcore.ConnectError: [Errno -2] Name or service not known
+    "test_async_proxy_close"
+    "test_sync_proxy_close"
+  ];
+
+  disabledTestPaths = [
+    "tests/test_main.py"
+  ];
+
+  pythonImportsCheck = [
+    "httpx"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    changelog = "https://github.com/encode/httpx/blob/${src.rev}/CHANGELOG.md";
+    description = "The next generation HTTP client";
+    homepage = "https://github.com/encode/httpx";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/huawei-lte-api/default.nix b/nixpkgs/pkgs/development/python-modules/huawei-lte-api/default.nix
new file mode 100644
index 000000000000..3bde42f186d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/huawei-lte-api/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pycryptodomex
+, pytestCheckHook
+, requests
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "huawei-lte-api";
+  version = "1.7.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Salamek";
+    repo = "huawei-lte-api";
+    rev = "refs/tags/${version}";
+    hash = "sha256-a01oNfUivbCzTd5auu+EXj+yvcC1vKyktIFK+zPQGy4=";
+  };
+
+  propagatedBuildInputs = [
+    pycryptodomex
+    requests
+    xmltodict
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "huawei_lte_api.AuthorizedConnection"
+    "huawei_lte_api.Client"
+    "huawei_lte_api.Connection"
+  ];
+
+  meta = with lib; {
+    description = "API For huawei LAN/WAN LTE Modems";
+    homepage = "https://github.com/Salamek/huawei-lte-api";
+    changelog = "https://github.com/Salamek/huawei-lte-api/releases/tag/${version}";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/huey/default.nix b/nixpkgs/pkgs/development/python-modules/huey/default.nix
new file mode 100644
index 000000000000..0b0b02b09714
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/huey/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, wheel
+, redis
+}:
+
+buildPythonPackage rec {
+  pname = "huey";
+  version = "2.5.0";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "coleifer";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-t767eqZ6U12mG8nWEYC9Hoq/jW2yfrPkCxB3/xLKQww=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [ redis ];
+
+  # connects to redis
+  doCheck = false;
+
+  meta = with lib; {
+    changelog = "https://github.com/coleifer/huey/blob/${src.rev}/CHANGELOG.md";
+    description = "A little task queue for python";
+    homepage = "https://github.com/coleifer/huey";
+    license = licenses.mit;
+    maintainers = [];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hug/default.nix b/nixpkgs/pkgs/development/python-modules/hug/default.nix
new file mode 100644
index 000000000000..afeb128e2048
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hug/default.nix
@@ -0,0 +1,53 @@
+{ lib , buildPythonPackage, fetchFromGitHub, isPy27
+, falcon
+, requests
+, pytestCheckHook
+, marshmallow
+, mock
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "hug";
+  version = "2.6.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "hugapi";
+    repo = pname;
+    rev = version;
+    sha256 = "05rsv16g7ph100p8kl4l2jba0y4wcpp3xblc02mfp67zp1279vaq";
+  };
+
+  propagatedBuildInputs = [ falcon requests ];
+
+  nativeCheckInputs = [ mock marshmallow pytestCheckHook numpy ];
+
+  postPatch = ''
+    substituteInPlace setup.py --replace '"pytest-runner"' ""
+  '';
+
+  preCheck = ''
+    # some tests need the `hug` CLI on the PATH
+    export PATH=$out/bin:$PATH
+  '';
+
+  disabledTests = [
+    # some tests attempt network access
+    "test_datagram_request"
+    "test_request"
+    # these tests use an unstable test dependency (https://github.com/hugapi/hug/issues/859)
+    "test_marshmallow_custom_context"
+    "test_marshmallow_schema"
+    "test_transform"
+    "test_validate_route_args_negative_case"
+  ];
+
+  meta = with lib; {
+    description = "A Python framework that makes developing APIs as simple as possible, but no simpler";
+    homepage = "https://github.com/hugapi/hug";
+    license = licenses.mit;
+    # Missing support for later falcon releases
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/huggingface-hub/default.nix b/nixpkgs/pkgs/development/python-modules/huggingface-hub/default.nix
new file mode 100644
index 000000000000..aa11d109dbc3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/huggingface-hub/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, filelock
+, fsspec
+, packaging
+, pyyaml
+, requests
+, tqdm
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "huggingface-hub";
+  version = "0.18.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "huggingface";
+    repo = "huggingface_hub";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-/KbD3TNSbQ9ueXYFLoXnIRIoi/y3l0w72GZ1+JC8ULk=";
+  };
+
+  propagatedBuildInputs = [
+    filelock
+    fsspec
+    packaging
+    pyyaml
+    requests
+    tqdm
+    typing-extensions
+  ];
+
+  # Tests require network access.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "huggingface_hub"
+  ];
+
+  meta = with lib; {
+    description = "Download and publish models and other files on the huggingface.co hub";
+    homepage = "https://github.com/huggingface/huggingface_hub";
+    changelog = "https://github.com/huggingface/huggingface_hub/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ kira-bruneau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/huisbaasje-client/default.nix b/nixpkgs/pkgs/development/python-modules/huisbaasje-client/default.nix
new file mode 100644
index 000000000000..56e44209676c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/huisbaasje-client/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, aiohttp
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "huisbaasje-client";
+  version = "0.1.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "dennisschroer";
+    repo = "huisbaasje-client";
+    rev = "v${version}";
+    sha256 = "113aymffyz1nki3a43j5cyj87qa0762j38qlz0wd5px7diwjxsfl";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "huisbaasje.huisbaasje" ];
+
+  meta = with lib; {
+    description = "Client for Huisbaasje";
+    homepage = "https://github.com/dennisschroer/huisbaasje-client";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/humanfriendly/default.nix b/nixpkgs/pkgs/development/python-modules/humanfriendly/default.nix
new file mode 100644
index 000000000000..77f0c75e0103
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/humanfriendly/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchPypi
+, monotonic
+}:
+
+buildPythonPackage rec {
+  pname = "humanfriendly";
+  version = "10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc";
+  };
+
+  propagatedBuildInputs = lib.optional (pythonOlder "3.3") monotonic;
+
+  # humanfriendly tests depends on coloredlogs which itself depends on
+  # humanfriendly. This lead to infinite recursion when trying to
+  # build this package so we have to disable the test suite :(
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Human friendly output for text interfaces using Python";
+    homepage = "https://humanfriendly.readthedocs.io/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ montag451 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/humanize/default.nix b/nixpkgs/pkgs/development/python-modules/humanize/default.nix
new file mode 100644
index 000000000000..ca06ac2abfd7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/humanize/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, freezegun
+, gettext
+, pytestCheckHook
+, pythonOlder
+, hatch-vcs
+, hatchling
+}:
+
+buildPythonPackage rec {
+  pname = "humanize";
+  version = "4.9.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "python-humanize";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-sLlgR6c65RmUNZdH2pHuxzo7dm71uUZXGqzcqyxCrk4=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+    gettext
+  ];
+
+  postBuild = ''
+    scripts/generate-translation-binaries.sh
+  '';
+
+  postInstall = ''
+    cp -r 'src/humanize/locale' "$out/lib/"*'/site-packages/humanize/'
+  '';
+
+  nativeCheckInputs = [
+    freezegun
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "humanize"
+  ];
+
+  meta = with lib; {
+    description = "Python humanize utilities";
+    homepage = "https://github.com/python-humanize/humanize";
+    changelog = "https://github.com/python-humanize/humanize/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rmcgibbo Luflosi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/humblewx/default.nix b/nixpkgs/pkgs/development/python-modules/humblewx/default.nix
new file mode 100644
index 000000000000..a134981485c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/humblewx/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, wxPython_4_2
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "humblewx";
+  version = "0.2.2";
+
+  src = fetchFromGitHub {
+    owner = "thetimelineproj";
+    repo = pname;
+    rev = version;
+    sha256 = "0fv8gwlbcj000qq34inbwgxf0xgibs590dsyqnw0mmyb7f1iq210";
+  };
+
+  propagatedBuildInputs = [ wxPython_4_2 ];
+
+  checkPhase = ''
+    runHook preCheck
+    for i in examples/*; do
+      ${python.interpreter} $i
+    done
+    runHook postCheck
+  '';
+
+  # Unable to access the X Display, is $DISPLAY set properly?
+  # would have to use nixos module tests, but it is not worth it
+  doCheck = false;
+
+  pythonImportsCheck = [ "humblewx" ];
+
+  meta = {
+    homepage = "https://github.com/thetimelineproj/humblewx";
+    description = "Library that simplifies creating user interfaces with wxPython";
+    license = lib.licenses.gpl3Only;
+    maintainers = with lib.maintainers; [ davidak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hupper/default.nix b/nixpkgs/pkgs/development/python-modules/hupper/default.nix
new file mode 100644
index 000000000000..11f37dcac28e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hupper/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, watchdog
+}:
+
+buildPythonPackage rec {
+  pname = "hupper";
+  version = "1.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GLFlPZgyyfjn00AZhsfnryrmeDYWvgvEBr/gsUE0pcY=";
+  };
+
+  # FIXME: watchdog dependency is disabled on Darwin because of #31865, which causes very silent
+  # segfaults in the testsuite that end up failing the tests in a background thread (in myapp)
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.optionals (!stdenv.isDarwin) [
+    watchdog
+  ];
+
+  disabledTestPaths = [
+    # Doesn't work with an exported home, RuntimeError: timeout waiting for change to file=/build/tmpgfn145cx
+    "tests/test_it.py"
+  ];
+
+  pythonImportsCheck = [ "hupper" ];
+
+  meta = with lib; {
+    description = "In-process file monitor/reloader for reloading your code automatically during development";
+    homepage = "https://github.com/Pylons/hupper";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/huum/default.nix b/nixpkgs/pkgs/development/python-modules/huum/default.nix
new file mode 100644
index 000000000000..68cba094ab31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/huum/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pydantic
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "huum";
+  version = "0.7.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "frwickst";
+    repo = "pyhuum";
+    rev = "refs/tags/${version}";
+    hash = "sha256-vYHwcEOzxYEBav5YbmWpm+izFlivzu2UIR6hmAXXi0U=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pydantic
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "huum"
+  ];
+
+  meta = with lib; {
+    description = "Library for Huum saunas";
+    homepage = "https://github.com/frwickst/pyhuum";
+    changelog = "https://github.com/frwickst/pyhuum/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hvac/default.nix b/nixpkgs/pkgs/development/python-modules/hvac/default.nix
new file mode 100644
index 000000000000..6fe396897114
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hvac/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyhcl
+, requests
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hvac";
+  version = "1.2.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-x4bj36HzUjmBDlMXzMrb41j0m4yQAaHy9ot5olC5+KE=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pyhcl
+    requests
+  ];
+
+  # Requires running a Vault server
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "hvac"
+  ];
+
+  meta = with lib; {
+    description = "HashiCorp Vault API client";
+    homepage = "https://github.com/ianunruh/hvac";
+    changelog = "https://github.com/hvac/hvac/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hvplot/default.nix b/nixpkgs/pkgs/development/python-modules/hvplot/default.nix
new file mode 100644
index 000000000000..5047eb68ea96
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hvplot/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, bokeh
+, buildPythonPackage
+, colorcet
+, fetchPypi
+, holoviews
+, pandas
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hvplot";
+  version = "0.9.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BkxnV90QxJjQYqN0DdjGbjPmNDaDN9hUBjO7nQte7eg=";
+  };
+
+  propagatedBuildInputs = [
+    bokeh
+    colorcet
+    holoviews
+    pandas
+  ];
+
+  # Many tests require a network connection
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "hvplot.pandas"
+  ];
+
+  meta = with lib; {
+    description = "A high-level plotting API for the PyData ecosystem built on HoloViews";
+    homepage = "https://hvplot.pyviz.org";
+    changelog = "https://github.com/holoviz/hvplot/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hwdata/default.nix b/nixpkgs/pkgs/development/python-modules/hwdata/default.nix
new file mode 100644
index 000000000000..9e73fb610170
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hwdata/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pkgs
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "hwdata";
+  version = "2.4.1";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "xsuchy";
+    repo = "python-hwdata";
+    rev = "python-hwdata-${version}-1";
+    hash = "sha256-hmvxVF9LOkezXnJdbtbEJWhU4uvUJgxQHYeWUoiniF0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  patchPhase = ''
+    substituteInPlace hwdata.py --replace "/usr/share/hwdata" "${pkgs.hwdata}/share/hwdata"
+  '';
+
+  pythonImportsCheck = [
+    "hwdata"
+  ];
+
+  doCheck = false; # no tests
+
+  meta = with lib; {
+    description = "Python bindings to hwdata";
+    homepage = "https://github.com/xsuchy/python-hwdata";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ lurkki ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hwi/default.nix b/nixpkgs/pkgs/development/python-modules/hwi/default.nix
new file mode 100644
index 000000000000..046dbc7bb4ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hwi/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, bitbox02
+, buildPythonPackage
+, cbor
+, ecdsa
+, fetchFromGitHub
+, hidapi
+, libusb1
+, mnemonic
+, pyaes
+, pyserial
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "hwi";
+  version = "2.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bitcoin-core";
+    repo = "HWI";
+    rev = "refs/tags/${version}";
+    hash = "sha256-V4BWB4mCONQ8kjAy6ySonAbCUTaKpBTvhSnHmoH8TQM=";
+  };
+
+  propagatedBuildInputs = [
+    bitbox02
+    cbor
+    ecdsa
+    hidapi
+    libusb1
+    mnemonic
+    pyaes
+    pyserial
+    typing-extensions
+  ];
+
+  # Tests require to clone quite a few firmwares
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "hwilib"
+  ];
+
+  meta = with lib; {
+    description = "Bitcoin Hardware Wallet Interface";
+    homepage = "https://github.com/bitcoin-core/hwi";
+    changelog = "https://github.com/bitcoin-core/HWI/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hy/default.nix b/nixpkgs/pkgs/development/python-modules/hy/default.nix
new file mode 100644
index 000000000000..c7cf5a864ef2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hy/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, astor
+, buildPythonPackage
+, fetchFromGitHub
+, funcparserlib
+, hy
+, pytestCheckHook
+, python
+, pythonOlder
+, testers
+}:
+
+buildPythonPackage rec {
+  pname = "hy";
+  version = "0.27.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "hylang";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Emzz6m5voH3dCAw7/7d0XLlLEEOjnfrVNZ8WWKa38Ow=";
+  };
+
+  # https://github.com/hylang/hy/blob/1.0a4/get_version.py#L9-L10
+  HY_VERSION = version;
+
+  propagatedBuildInputs = [
+    funcparserlib
+  ] ++
+  lib.optionals (pythonOlder "3.9") [
+    astor
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    # For test_bin_hy
+    export PATH="$out/bin:$PATH"
+  '';
+
+  pythonImportsCheck = [ "hy" ];
+
+  passthru = {
+    tests.version = testers.testVersion {
+      package = hy;
+      command = "hy -v";
+    };
+    # For backwards compatibility with removed pkgs/development/interpreters/hy
+    # Example usage:
+    #   hy.withPackages (ps: with ps; [ hyrule requests ])
+    withPackages = python-packages:
+      (python.withPackages
+        (ps: (python-packages ps) ++ [ ps.hy ])).overrideAttrs (old: {
+          name = "${hy.name}-env";
+          meta = lib.mergeAttrs (builtins.removeAttrs hy.meta [ "license" ]) {
+            mainProgram = "hy";
+          };
+        });
+  };
+
+  meta = with lib; {
+    description = "A LISP dialect embedded in Python";
+    homepage = "https://hylang.org/";
+    changelog = "https://github.com/hylang/hy/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab mazurel nixy thiagokokada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hydra-check/default.nix b/nixpkgs/pkgs/development/python-modules/hydra-check/default.nix
new file mode 100644
index 000000000000..4da98f083c37
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hydra-check/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, requests
+, beautifulsoup4
+, colorama
+}:
+
+buildPythonPackage rec {
+  pname = "hydra-check";
+  version = "1.3.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "nix-community";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-fRSC+dfZZSBBeN6YidXRKc1kPUbBKz5OiFSHGOSikgI=";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+  propagatedBuildInputs = [
+    colorama
+    requests
+    beautifulsoup4
+  ];
+
+  pythonImportsCheck = [ "hydra_check" ];
+
+  meta = with lib; {
+    description = "check hydra for the build status of a package";
+    homepage = "https://github.com/nix-community/hydra-check";
+    license = licenses.mit;
+    maintainers = with maintainers; [ makefu artturin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hydra-core/antlr4.patch b/nixpkgs/pkgs/development/python-modules/hydra-core/antlr4.patch
new file mode 100644
index 000000000000..958e128998d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hydra-core/antlr4.patch
@@ -0,0 +1,13 @@
+diff --git a/build_helpers/build_helpers.py b/build_helpers/build_helpers.py
+index 7159d22615..73db312bbe 100644
+--- a/build_helpers/build_helpers.py
++++ b/build_helpers/build_helpers.py
+@@ -185,7 +185,7 @@ class ANTLRCommand(Command):  # type: ignore
+             command = [
+                 "java",
+                 "-jar",
+-                join(root_dir, "bin/antlr-4.9.3-complete.jar"),
++                "@antlr_jar@",
+                 "-Dlanguage=Python3",
+                 "-o",
+                 join(project_root, "hydra/grammar/gen/"),
diff --git a/nixpkgs/pkgs/development/python-modules/hydra-core/default.nix b/nixpkgs/pkgs/development/python-modules/hydra-core/default.nix
new file mode 100644
index 000000000000..436a4e7e6213
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hydra-core/default.nix
@@ -0,0 +1,90 @@
+{ lib
+, antlr4
+, antlr4-python3-runtime
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, importlib-resources
+, jre_headless
+, omegaconf
+, packaging
+, pytestCheckHook
+, pythonOlder
+, substituteAll
+}:
+
+buildPythonPackage rec {
+  pname = "hydra-core";
+  version = "1.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "facebookresearch";
+    repo = "hydra";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-kD4BStnstr5hwyAOxdpPzLAJ9MZqU/CPiHkaD2HnUPI=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./antlr4.patch;
+      antlr_jar = "${antlr4.out}/share/java/antlr-${antlr4.version}-complete.jar";
+    })
+    # https://github.com/facebookresearch/hydra/pull/2731
+    (fetchpatch {
+      name = "setuptools-67.5.0-test-compatibility.patch";
+      url = "https://github.com/facebookresearch/hydra/commit/25873841ed8159ab25a0c652781c75cc4a9d6e08.patch";
+      hash = "sha256-oUfHlJP653o3RDtknfb8HaaF4fpebdR/OcbKHzJFK/Q=";
+    })
+  ];
+
+  postPatch = ''
+    # We substitute the path to the jar with the one from our antlr4
+    # package, so this file becomes unused
+    rm -v build_helpers/bin/antlr*-complete.jar
+
+    sed -i 's/antlr4-python3-runtime==.*/antlr4-python3-runtime/' requirements/requirements.txt
+  '';
+
+  nativeBuildInputs = [
+    jre_headless
+  ];
+
+  propagatedBuildInputs = [
+    antlr4-python3-runtime
+    omegaconf
+    packaging
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Test environment setup broken under Nix for a few tests:
+  disabledTests = [
+    "test_bash_completion_with_dot_in_path"
+    "test_install_uninstall"
+    "test_config_search_path"
+  ];
+
+  disabledTestPaths = [
+    "tests/test_hydra.py"
+  ];
+
+  pythonImportsCheck = [
+    "hydra"
+    # See https://github.com/NixOS/nixpkgs/issues/208843
+    "hydra.version"
+  ];
+
+  meta = with lib; {
+    description = "A framework for configuring complex applications";
+    homepage = "https://hydra.cc";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hydrawiser/default.nix b/nixpkgs/pkgs/development/python-modules/hydrawiser/default.nix
new file mode 100644
index 000000000000..76239f7876c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hydrawiser/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-cov
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "hydrawiser";
+  version = "0.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ptcryan";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "161hazlpvd71xcl2ja86560wm5lnrjv210ki3ji37l6c6gwmhjdj";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-cov
+    pytestCheckHook
+    requests
+    requests-mock
+  ];
+
+  pythonImportsCheck = [ "hydrawiser" ];
+
+  meta = with lib; {
+    description = "Python library for Hydrawise API";
+    homepage = "https://github.com/ptcryan/hydrawiser";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hydrus-api/default.nix b/nixpkgs/pkgs/development/python-modules/hydrus-api/default.nix
new file mode 100644
index 000000000000..17449fdf66ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hydrus-api/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, poetry-core
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "hydrus-api";
+  version = "5.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    pname = "hydrus_api";
+    inherit version;
+    hash = "sha256-3Roeab9/woGF/aZYm9nbqrcyYN8CKA1k66cTRxx6jM4=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml --replace \
+      "poetry.masonry.api" \
+      "poetry.core.masonry.api"
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  pythonImportsCheck = [ "hydrus_api" ];
+
+  # There are no unit tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python module implementing the Hydrus API";
+    homepage = "https://gitlab.com/cryzed/hydrus-api";
+    license = licenses.agpl3Plus;
+    maintainers = with maintainers; [ dandellion ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hypchat/default.nix b/nixpkgs/pkgs/development/python-modules/hypchat/default.nix
new file mode 100644
index 000000000000..1f69dfe21062
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hypchat/default.nix
@@ -0,0 +1,14 @@
+{ buildPythonPackage, fetchPypi
+, requests, six, python-dateutil }:
+
+buildPythonPackage rec {
+  pname = "hypchat";
+  version = "0.21";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1sd8f3gihagaqd848dqy6xw457fa4f9bla1bfyni7fq3h76sjdzg";
+  };
+
+  propagatedBuildInputs = [ requests six python-dateutil ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hypercorn/default.nix b/nixpkgs/pkgs/development/python-modules/hypercorn/default.nix
new file mode 100644
index 000000000000..d8e6936e8dc3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hypercorn/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, typing-extensions
+, wsproto
+, toml
+, h2
+, priority
+, mock
+, poetry-core
+, pytest-asyncio
+, pytest-trio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "Hypercorn";
+  version = "0.14.3";
+  disabled = pythonOlder "3.7";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pgjones";
+    repo = pname;
+    rev = version;
+    hash = "sha256-ECREs8UwqTWUweUrwnUwpVotCII2v4Bz7ZCk3DSAd8I=";
+  };
+
+  postPatch = ''
+    sed -i "/^addopts/d" pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [ wsproto toml h2 priority ]
+    ++ lib.optionals (pythonOlder "3.8") [ typing-extensions ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-trio
+    pytestCheckHook
+  ] ++ lib.optionals (pythonOlder "3.8") [ mock ];
+
+  pythonImportsCheck = [ "hypercorn" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pgjones/hypercorn";
+    description = "The ASGI web server inspired by Gunicorn";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dgliwka ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hyperframe/default.nix b/nixpkgs/pkgs/development/python-modules/hyperframe/default.nix
new file mode 100644
index 000000000000..d4d45fa2e775
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hyperframe/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "hyperframe";
+  version = "6.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "hyperframe" ];
+
+  meta = with lib; {
+    description = "HTTP/2 framing layer for Python";
+    homepage = "https://github.com/python-hyper/hyperframe/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hyperion-py/default.nix b/nixpkgs/pkgs/development/python-modules/hyperion-py/default.nix
new file mode 100644
index 000000000000..1e0f08936fb4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hyperion-py/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+, pythonOlder
+, pythonAtLeast
+, poetry-core
+, pytest-aiohttp
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "hyperion-py";
+  version = "0.7.5";
+  disabled = pythonOlder "3.8";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "dermotduffy";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-arcnpCQsRuiWCrAz/t4TCjTe8DRDtRuzYp8k7nnjGDk=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # python3.10 compat: Drop loop kwarg in asyncio.sleep call
+      url = "https://github.com/dermotduffy/hyperion-py/commit/f02af52fcce17888984c99bfc03935e372011394.patch";
+      hash = "sha256-4nfsQVxd77VV9INwNxTyFRDlAjwdTYqfSGuF487hFCs=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    # pytest-asyncio 0.17.0 compat
+    "--asyncio-mode=auto"
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --timeout=9 --cov=hyperion" ""
+  '';
+
+  pythonImportsCheck = [ "hyperion" ];
+
+  meta = with lib; {
+    description = "Python package for Hyperion Ambient Lighting";
+    homepage = "https://github.com/dermotduffy/hyperion-py";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hyperlink/default.nix b/nixpkgs/pkgs/development/python-modules/hyperlink/default.nix
new file mode 100644
index 000000000000..21927683b18b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hyperlink/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, idna
+, typing ? null
+}:
+
+buildPythonPackage rec {
+  pname = "hyperlink";
+  version = "21.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0sx50lkivsfjxx9zr4yh7l9gll2l9kvl0v0w8w4wk2x5v9bzjyj2";
+  };
+
+  propagatedBuildInputs = [ idna ]
+    ++ lib.optionals isPy27 [ typing ];
+
+  meta = with lib; {
+    description = "A featureful, correct URL for Python";
+    homepage = "https://github.com/python-hyper/hyperlink";
+    license = licenses.mit;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ apeschar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hyperopt/default.nix b/nixpkgs/pkgs/development/python-modules/hyperopt/default.nix
new file mode 100644
index 000000000000..605377a2ec39
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hyperopt/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, cloudpickle
+, fetchPypi
+, future
+, networkx
+, numpy
+, py4j
+, pymongo
+, pyspark
+, scipy
+, six
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "hyperopt";
+  version = "0.2.7";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1bf89ae58050bbd32c7307199046117feee245c2fd9ab6255c7308522b7ca149";
+  };
+
+  propagatedBuildInputs = [
+    cloudpickle
+    future
+    networkx
+    numpy
+    py4j
+    pymongo
+    pyspark
+    scipy
+    six
+    tqdm
+  ];
+
+  # tries to use /homeless-shelter to mimic container usage, etc
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "hyperopt"
+  ];
+
+  meta = with lib; {
+    description = "Distributed Asynchronous Hyperparameter Optimization";
+    homepage = "http://hyperopt.github.io/hyperopt/";
+    license = licenses.bsd2;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ freezeboy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hyperpyyaml/default.nix b/nixpkgs/pkgs/development/python-modules/hyperpyyaml/default.nix
new file mode 100644
index 000000000000..9395b299fea0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hyperpyyaml/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyyaml
+, ruamel-yaml
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "hyperpyyaml";
+  version = "1.2.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "speechbrain";
+    repo = "hyperpyyaml";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-eA4/wXmqlqomfRbJNi7dkBRoxneCbCbURSPvASF2sgA=";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+    ruamel-yaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "hyperpyyaml" ];
+
+  meta = with lib; {
+    description = "Extensions to YAML syntax for better python interaction";
+    homepage = "https://github.com/speechbrain/HyperPyYAML";
+    changelog = "https://github.com/speechbrain/HyperPyYAML/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hyperscan/default.nix b/nixpkgs/pkgs/development/python-modules/hyperscan/default.nix
new file mode 100644
index 000000000000..342dda967cfe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hyperscan/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, pkgs
+, buildPythonPackage
+, fetchFromGitHub
+, pdm-backend
+, setuptools
+, wheel
+, pcre
+, pkg-config
+, pytestCheckHook
+, pytest-mock
+}:
+
+buildPythonPackage rec {
+  pname = "hyperscan";
+  version = "0.6.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "darvid";
+    repo = "python-hyperscan";
+    rev = "v${version}";
+    hash = "sha256-6PoV9rY9CkXkAMWN2QCnfU4S0OJD/6bzkqFgvEVqNjo=";
+  };
+
+  buildInputs = [
+    (pkgs.hyperscan.override { withStatic = true; })
+    # we need static pcre to be built, by default only shared library is built
+    (pcre.overrideAttrs { dontDisableStatic = 0; })
+  ];
+
+  nativeBuildInputs = [
+    pkg-config
+    pdm-backend
+    setuptools
+    wheel
+  ];
+
+  pythonImportsCheck = [ "hyperscan" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+  ];
+
+  meta = with lib; {
+    description = "A CPython extension for the Hyperscan regular expression matching library";
+    homepage = "https://github.com/darvid/python-hyperscan";
+    changelog = "https://github.com/darvid/python-hyperscan/blob/${src.rev}/CHANGELOG.md";
+    platforms = [ "x86_64-linux" "x86_64-darwin" ];
+    license = licenses.mit;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hypothesis-auto/default.nix b/nixpkgs/pkgs/development/python-modules/hypothesis-auto/default.nix
new file mode 100644
index 000000000000..ad6ae8dbd96c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hypothesis-auto/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hypothesis
+, poetry-core
+, pydantic
+, pytest
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hypothesis-auto";
+  version = "1.1.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "hypothesis_auto";
+    inherit version;
+    hash = "sha256-U0vcOB9jXmUV5v2IwybVu2arY1FpPnKkP7m2kbD1kRw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pydantic
+    hypothesis
+    pytest
+  ];
+
+  pythonImportsCheck = [
+    "hypothesis_auto"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Enables fully automatic tests for type annotated functions";
+    homepage = "https://github.com/timothycrosley/hypothesis-auto/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hypothesis/default.nix b/nixpkgs/pkgs/development/python-modules/hypothesis/default.nix
new file mode 100644
index 000000000000..4cc5aab3bffe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hypothesis/default.nix
@@ -0,0 +1,113 @@
+{ lib
+, buildPythonPackage
+, isPyPy
+, fetchFromGitHub
+, attrs
+, exceptiongroup
+, pexpect
+, doCheck ? true
+, pytestCheckHook
+, pytest-xdist
+, python
+, sortedcontainers
+, stdenv
+, pythonOlder
+, sphinxHook
+, sphinx-rtd-theme
+, sphinx-hoverxref
+, sphinx-codeautolink
+, tzdata
+}:
+
+buildPythonPackage rec {
+  pname = "hypothesis";
+  version = "6.84.3";
+  outputs = [ "out" ];
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "HypothesisWorks";
+    repo = "hypothesis";
+    rev = "hypothesis-python-${version}";
+    hash = "sha256-wymZ/tJBGcP57B3BuDlBT7kbUxNwW4/SSmvwLSa5PvM=";
+  };
+
+  # I tried to package sphinx-selective-exclude, but it throws
+  # error about "module 'sphinx' has no attribute 'directives'".
+  #
+  # It probably has to do with monkey-patching internals of Sphinx.
+  # On bright side, this extension does not introduces new commands,
+  # only changes "::only" command, so we probably okay with stock
+  # implementation.
+  #
+  # I wonder how upstream of "hypothesis" builds documentation.
+  postPatch = ''
+    sed -i -e '/sphinx_selective_exclude.eager_only/ d' docs/conf.py
+  '';
+
+  postUnpack = "sourceRoot=$sourceRoot/hypothesis-python";
+
+  propagatedBuildInputs = [
+    attrs
+    sortedcontainers
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    exceptiongroup
+  ];
+
+  nativeCheckInputs = [
+    pexpect
+    pytest-xdist
+    pytestCheckHook
+  ] ++ lib.optionals isPyPy [
+    tzdata
+  ];
+
+  inherit doCheck;
+
+  # This file changes how pytest runs and breaks it
+  preCheck = ''
+    rm tox.ini
+  '';
+
+  pytestFlagsArray = [
+    "tests/cover"
+  ];
+
+  pythonImportsCheck = [
+    "hypothesis"
+  ];
+
+  passthru = {
+    doc = stdenv.mkDerivation {
+      # Forge look and feel of multi-output derivation as best as we can.
+      #
+      # Using 'outputs = [ "doc" ];' breaks a lot of assumptions.
+      name = "${pname}-${version}-doc";
+      inherit src pname version;
+
+      postInstallSphinx = ''
+        mv $out/share/doc/* $out/share/doc/python$pythonVersion-$pname-$version
+      '';
+
+      nativeBuildInputs = [
+        sphinxHook
+        sphinx-rtd-theme
+        sphinx-hoverxref
+        sphinx-codeautolink
+      ];
+
+      inherit (python) pythonVersion;
+      inherit meta;
+    };
+  };
+
+  meta = with lib; {
+    description = "Library for property based testing";
+    homepage = "https://github.com/HypothesisWorks/hypothesis";
+    changelog = "https://hypothesis.readthedocs.io/en/latest/changes.html#v${lib.replaceStrings [ "." ] [ "-" ] version}";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hypothesmith/default.nix b/nixpkgs/pkgs/development/python-modules/hypothesmith/default.nix
new file mode 100644
index 000000000000..d6ce47e38050
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hypothesmith/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hypothesis
+, lark
+, libcst
+, parso
+, pytestCheckHook
+, pytest-xdist
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hypothesmith";
+  version = "0.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Uj2gTAY7hzko1sKO8WUGz2S/MXdwOYN+F+a73G4szNs=";
+  };
+
+  patches = [
+    ./remove-black.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "lark-parser" "lark"
+
+    substituteInPlace tox.ini \
+      --replace "--cov=hypothesmith" "" \
+      --replace "--cov-branch" "" \
+      --replace "--cov-report=term-missing:skip-covered" "" \
+      --replace "--cov-fail-under=100" ""
+  '';
+
+  propagatedBuildInputs = [ hypothesis lark libcst ];
+
+  nativeCheckInputs = [ parso pytestCheckHook pytest-xdist ];
+
+  pytestFlagsArray = [
+    "-v"
+  ];
+
+  disabledTests = [
+    # https://github.com/Zac-HD/hypothesmith/issues/21
+    "test_source_code_from_libcst_node_type"
+  ];
+
+  disabledTestPaths = [
+    # missing blib2to3
+    "tests/test_syntactic.py"
+  ];
+
+  pythonImportsCheck = [ "hypothesmith" ];
+
+  meta = with lib; {
+    description = "Hypothesis strategies for generating Python programs, something like CSmith";
+    homepage = "https://github.com/Zac-HD/hypothesmith";
+    changelog = "https://github.com/Zac-HD/hypothesmith/blob/master/CHANGELOG.md";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hypothesmith/remove-black.patch b/nixpkgs/pkgs/development/python-modules/hypothesmith/remove-black.patch
new file mode 100644
index 000000000000..d37222ef4b2c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hypothesmith/remove-black.patch
@@ -0,0 +1,87 @@
+diff --git a/tests/test_cst.py b/tests/test_cst.py
+index 8532240..bdba2d7 100644
+--- a/tests/test_cst.py
++++ b/tests/test_cst.py
+@@ -3,7 +3,6 @@ import ast
+ from inspect import isabstract
+ from operator import attrgetter
+ 
+-import black
+ import libcst
+ import parso
+ import pytest
+@@ -51,27 +50,6 @@ def test_ast_unparse_from_nodes(source_code):
+     assert ast.dump(first) == ast.dump(second)
+ 
+ 
+-@pytest.mark.xfail
+-@example("A\u2592", black.Mode())
+-@given(
+-    source_code=hypothesmith.from_node(),
+-    mode=st.builds(
+-        black.Mode,
+-        line_length=st.just(88) | st.integers(0, 200),
+-        string_normalization=st.booleans(),
+-        is_pyi=st.booleans(),
+-    ),
+-)
+-def test_black_autoformatter_from_nodes(source_code, mode):
+-    try:
+-        result = black.format_file_contents(source_code, fast=False, mode=mode)
+-    except black.NothingChanged:
+-        pass
+-    else:
+-        with pytest.raises(black.NothingChanged):
+-            black.format_file_contents(result, fast=False, mode=mode)
+-
+-
+ @given(source_code=hypothesmith.from_node())
+ def test_from_node_always_compilable(source_code):
+     compile(source_code, "<string>", "exec")
+diff --git a/tests/test_syntactic.py b/tests/test_syntactic.py
+index 7fe9835..17c4f7c 100644
+--- a/tests/test_syntactic.py
++++ b/tests/test_syntactic.py
+@@ -3,7 +3,6 @@ import ast
+ import io
+ import tokenize
+ 
+-import black
+ import blib2to3
+ import parso
+ import pytest
+@@ -58,34 +57,6 @@ def test_ast_unparse_from_grammar(source_code):
+     assert ast.dump(first) == ast.dump(second)
+ 
+ 
+-@example("\\", black.Mode())
+-@example("A#\r#", black.Mode())
+-@given(
+-    source_code=hypothesmith.from_grammar(),
+-    mode=st.builds(
+-        black.Mode,
+-        line_length=st.just(88) | st.integers(0, 200),
+-        string_normalization=st.booleans(),
+-        is_pyi=st.booleans(),
+-    ),
+-)
+-def test_black_autoformatter_from_grammar(source_code, mode):
+-    try:
+-        result = black.format_file_contents(source_code, fast=False, mode=mode)
+-    except black.NothingChanged:
+-        pass
+-    except blib2to3.pgen2.tokenize.TokenError:
+-        # Fails to tokenise e.g. "\\", though compile("\\", "<string>", "exec") works.
+-        # See https://github.com/psf/black/issues/1012
+-        reject()
+-    except black.InvalidInput:
+-        # e.g. "A#\r#", see https://github.com/psf/black/issues/970
+-        reject()
+-    else:
+-        with pytest.raises(black.NothingChanged):
+-            black.format_file_contents(result, fast=False, mode=mode)
+-
+-
+ @given(source_code=hypothesmith.from_grammar("eval_input"))
+ def test_eval_input_generation(source_code):
+     compile(source_code, filename="<string>", mode="eval")
diff --git a/nixpkgs/pkgs/development/python-modules/hyppo/default.nix b/nixpkgs/pkgs/development/python-modules/hyppo/default.nix
new file mode 100644
index 000000000000..709c7180f004
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hyppo/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+, autograd
+, numba
+, numpy
+, scikit-learn
+, scipy
+, matplotlib
+, seaborn
+}:
+
+buildPythonPackage rec {
+  pname = "hyppo";
+  version = "0.4.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "neurodata";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-QRE3oSxTEobTQ/7DzCAUOdjzIZmWUn9bgPmJWj6JuZg=";
+  };
+
+  propagatedBuildInputs = [
+    autograd
+    numba
+    numpy
+    scikit-learn
+    scipy
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook matplotlib seaborn ];
+  disabledTestPaths = [
+    "docs"
+    "benchmarks"
+    "examples"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/neurodata/hyppo";
+    description = "Python package for multivariate hypothesis testing";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/hyrule/default.nix b/nixpkgs/pkgs/development/python-modules/hyrule/default.nix
new file mode 100644
index 000000000000..9f753cfa7898
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/hyrule/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hy
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "hyrule";
+  version = "0.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "hylang";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-D5d/WwGSbEmSeyVBTIpGOqi+I6PkRdo8dhDaCeeOW4M=";
+  };
+
+  propagatedBuildInputs = [
+    hy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Some tests depends on hy on PATH
+  preCheck = "PATH=${hy}/bin:$PATH";
+
+  pythonImportsCheck = [ "hyrule" ];
+
+  meta = with lib; {
+    description = "Hyrule is a utility library for the Hy programming language";
+    homepage = "https://github.com/hylang/hyrule";
+    changelog = "https://github.com/hylang/hylure/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ thiagokokada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/i-pi/default.nix b/nixpkgs/pkgs/development/python-modules/i-pi/default.nix
new file mode 100644
index 000000000000..6c6e7983b7c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/i-pi/default.nix
@@ -0,0 +1,41 @@
+{ buildPythonPackage, lib, fetchFromGitHub, gfortran
+, makeWrapper, numpy, pytest, mock, pytest-mock
+} :
+
+buildPythonPackage rec {
+  pname = "i-pi";
+  version = "2.4.0";
+
+  src = fetchFromGitHub {
+    owner = "i-pi";
+    repo = "i-pi";
+    rev = "v${version}";
+    sha256 = "0d0ag57aa0fsqjwya27fyj8alimjvlxzgh6hxjqy1k4ap9h3n1cy";
+  };
+
+  nativeBuildInputs = [
+    gfortran
+    makeWrapper
+  ];
+
+  propagatedBuildInputs = [ numpy ];
+
+  nativeCheckInputs = [
+    pytest
+    mock
+    pytest-mock
+  ];
+
+  postFixup = ''
+    wrapProgram $out/bin/i-pi \
+      --set IPI_ROOT $out
+  '';
+
+  meta = with lib; {
+    description = "A universal force engine for ab initio and force field driven (path integral) molecular dynamics";
+    license = with licenses; [ gpl3Only mit ];
+    homepage = "http://ipi-code.org/";
+    platforms = platforms.linux;
+    maintainers = [ maintainers.sheepforce ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/i2c-tools/default.nix b/nixpkgs/pkgs/development/python-modules/i2c-tools/default.nix
new file mode 100644
index 000000000000..60af11e24198
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/i2c-tools/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, i2c-tools
+}:
+
+buildPythonPackage rec {
+  inherit (i2c-tools) pname version src;
+
+  buildInputs = [ i2c-tools ];
+
+  preConfigure = "cd py-smbus";
+
+  meta = with lib; {
+    inherit (i2c-tools.meta) homepage platforms;
+
+    description = "wrapper for i2c-tools' smbus stuff";
+    # from py-smbus/smbusmodule.c
+    license = [ licenses.gpl2Only ];
+    maintainers = [ maintainers.evils ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/i2csense/default.nix b/nixpkgs/pkgs/development/python-modules/i2csense/default.nix
new file mode 100644
index 000000000000..475e77c21841
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/i2csense/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, smbus-cffi
+}:
+
+buildPythonPackage rec {
+  pname = "i2csense";
+  version = "0.0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6f9c0a37d971e5b8a60c54982bd580cff84bf94fedc08c097e603a8e5609c33f";
+  };
+
+  propagatedBuildInputs = [
+    smbus-cffi
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "i2csense.bme280"
+    "i2csense.bh1750"
+    "i2csense.htu21d"
+  ];
+
+  meta = with lib; {
+    description = "A library to handle i2c sensors with the Raspberry Pi";
+    homepage = "https://github.com/azogue/i2csense";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/i3-py/default.nix b/nixpkgs/pkgs/development/python-modules/i3-py/default.nix
new file mode 100644
index 000000000000..312c1bb45c70
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/i3-py/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  version = "0.6.4";
+  pname = "i3-py";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1sgl438jrb4cdyl7hbc3ymwsf7y3zy09g1gh7ynilxpllp37jc8y";
+  };
+
+  # no tests in tarball
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Tools for i3 users and developers";
+    homepage =  "https://github.com/ziberna/i3-py";
+    license = licenses.gpl3;
+    platforms = platforms.unix;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/i3ipc/default.nix b/nixpkgs/pkgs/development/python-modules/i3ipc/default.nix
new file mode 100644
index 000000000000..ee3b4252296c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/i3ipc/default.nix
@@ -0,0 +1,41 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, xorgserver, pytest, pytest-xvfb, i3, xlib, xdpyinfo
+, makeFontsConf, coreutils
+}:
+
+buildPythonPackage rec {
+  pname = "i3ipc";
+  version = "2.2.1";
+
+  src = fetchFromGitHub {
+    owner  = "acrisci";
+    repo   = "i3ipc-python";
+    rev    = "v${version}";
+    sha256 = "13bzs9dcv27czpnnbgz7a037lm8h991c8gk0qzzk5mq5yak24715";
+  };
+  propagatedBuildInputs = [ xlib ];
+
+  fontsConf = makeFontsConf {
+    fontDirectories = [ ];
+  };
+  FONTCONFIG_FILE = fontsConf; # Fontconfig error: Cannot load default config file
+  nativeCheckInputs = [ pytest xdpyinfo pytest-xvfb xorgserver i3 ];
+
+  postPatch = ''
+    substituteInPlace test/i3.config \
+      --replace /bin/true ${coreutils}/bin/true
+  '';
+
+  checkPhase = ''
+    py.test --ignore=test/aio/test_shutdown_event.py \
+            --ignore=test/test_shutdown_event.py
+  '';
+
+
+  meta = with lib; {
+    description = "An improved Python library to control i3wm and sway";
+    homepage    = "https://github.com/acrisci/i3ipc-python";
+    license     = licenses.bsd3;
+    maintainers = with maintainers; [ vanzef ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iammeter/default.nix b/nixpkgs/pkgs/development/python-modules/iammeter/default.nix
new file mode 100644
index 000000000000..7747e53f5bab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iammeter/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "iammeter";
+  version = "0.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Q0o392Xf3cY5BkX4ic6pE3XKMSgek5cpW4TMqSh+Ew8=";
+  };
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "iammeter"
+  ];
+
+  meta = with lib; {
+    description = "Module to work with the IamMeter API";
+    homepage = "https://pypi.org/project/iammeter/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iapws/default.nix b/nixpkgs/pkgs/development/python-modules/iapws/default.nix
new file mode 100644
index 000000000000..33c3b5073fd7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iapws/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, scipy }:
+
+buildPythonPackage rec {
+  pname = "iapws";
+  version = "1.5.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QVxbf9EF9YwAVPewAqhc1WZD6jVr/rFXQUw/jJ7kkDU=";
+  };
+
+  propagatedBuildInputs = [ scipy ];
+
+  meta = with lib; {
+    description = "Python implementation of standard from IAPWS";
+    homepage = "https://github.com/jjgomera/iapws";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ dawidsowa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iaqualink/default.nix b/nixpkgs/pkgs/development/python-modules/iaqualink/default.nix
new file mode 100644
index 000000000000..6e72b5a8519b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iaqualink/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatch-vcs
+, hatchling
+, httpx
+, pytestCheckHook
+, pythonOlder
+, respx
+}:
+
+buildPythonPackage rec {
+  pname = "iaqualink";
+  version = "0.5.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "flz";
+    repo = "iaqualink-py";
+    rev = "v${version}";
+    hash = "sha256-ewPP2Xq+ecZGc5kokvLEsRokGqTWlymrzkwk480tapk=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+  ] ++ httpx.optional-dependencies.http2;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    respx
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "pytest --cov-config=pyproject.toml --cov-report=xml --cov-report=term --cov=src --cov=tests" ""
+  '';
+
+  pythonImportsCheck = [
+    "iaqualink"
+  ];
+
+  meta = with lib; {
+    description = "Python library for Jandy iAqualink";
+    homepage = "https://github.com/flz/iaqualink-py";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ibeacon-ble/default.nix b/nixpkgs/pkgs/development/python-modules/ibeacon-ble/default.nix
new file mode 100644
index 000000000000..1f0f799d587f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ibeacon-ble/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, home-assistant-bluetooth
+, mac-vendor-lookup
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ibeacon-ble";
+  version = "1.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-iYgGflM0IpSIMNgPpJAFAl9FYoMfRinM3sP6VRcBSMc=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=ibeacon_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    home-assistant-bluetooth
+    mac-vendor-lookup
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ibeacon_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for iBeacon BLE devices";
+    homepage = "https://github.com/Bluetooth-Devices/ibeacon-ble";
+    changelog = "https://github.com/Bluetooth-Devices/ibeacon-ble/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ibis-framework/default.nix b/nixpkgs/pkgs/development/python-modules/ibis-framework/default.nix
new file mode 100644
index 000000000000..9b77a6be51d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ibis-framework/default.nix
@@ -0,0 +1,214 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, atpublic
+, bidict
+, black
+, clickhouse-connect
+, dask
+, datafusion
+, db-dtypes
+, duckdb
+, duckdb-engine
+, filelock
+, geoalchemy2
+, geopandas
+, google-cloud-bigquery
+, google-cloud-bigquery-storage
+, graphviz-nox
+, hypothesis
+, multipledispatch
+, numpy
+, oracledb
+, packaging
+, pandas
+, parsy
+, poetry-core
+, poetry-dynamic-versioning
+, polars
+, pooch
+, psycopg2
+, pyarrow
+, pydata-google-auth
+, pydruid
+, pymysql
+, pyspark
+, pytest-benchmark
+, pytest-httpserver
+, pytest-mock
+, pytest-randomly
+, pytest-snapshot
+, pytest-xdist
+, python-dateutil
+, pytz
+, regex
+, rich
+, shapely
+, snowflake-connector-python
+, snowflake-sqlalchemy
+, sqlalchemy
+, sqlalchemy-views
+, sqlglot
+, sqlite
+, toolz
+, trino-python-client
+, typing-extensions
+}:
+let
+  testBackends = [ "datafusion" "duckdb" "pandas" "sqlite" ];
+
+  ibisTestingData = fetchFromGitHub {
+    name = "ibis-testing-data";
+    owner = "ibis-project";
+    repo = "testing-data";
+    rev = "2b3968deaa1a28791b2901dbbcc9bfd3d2f23e9b";
+    hash = "sha256-q1b5IcOl5oIFXP7/P5RufncjHEVrWp4NjoU2uo/BE9U=";
+  };
+in
+
+buildPythonPackage rec {
+  pname = "ibis-framework";
+  version = "6.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    name = "ibis-source";
+    repo = "ibis";
+    owner = "ibis-project";
+    rev = "refs/tags/${version}";
+    hash = "sha256-+AtXgRNxPryP/fd/GQlLNxWbP6ozikqG2yBCp3dE0tY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    poetry-dynamic-versioning
+  ];
+
+  POETRY_DYNAMIC_VERSIONING_BYPASS = version;
+
+  propagatedBuildInputs = [
+    atpublic
+    bidict
+    filelock
+    multipledispatch
+    numpy
+    pandas
+    parsy
+    pooch
+    pyarrow
+    python-dateutil
+    pytz
+    rich
+    sqlglot
+    toolz
+    typing-extensions
+  ]
+  ++ pooch.optional-dependencies.progress
+  ++ pooch.optional-dependencies.xxhash;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    hypothesis
+    pytest-benchmark
+    pytest-httpserver
+    pytest-mock
+    pytest-randomly
+    pytest-snapshot
+    pytest-xdist
+  ] ++ lib.concatMap (name: passthru.optional-dependencies.${name}) testBackends;
+
+  pytestFlagsArray = [
+    "--dist=loadgroup"
+    "-m"
+    "'${lib.concatStringsSep " or " testBackends} or core'"
+    # breakage from sqlalchemy2 truediv changes
+    "--deselect=ibis/tests/sql/test_sqlalchemy.py::test_tpc_h17"
+    # tries to download duckdb extensions
+    "--deselect=ibis/backends/duckdb/tests/test_register.py::test_register_sqlite"
+    "--deselect=ibis/backends/duckdb/tests/test_register.py::test_read_sqlite"
+
+    # duckdb does not respect sample_size=2 (reads 3 lines of csv).
+    "--deselect=ibis/backends/tests/test_register.py::test_csv_reregister_schema"
+
+    # duckdb fails with:
+    # "This function can not be called with an active transaction!, commit or abort the existing one first"
+    "--deselect=ibis/backends/tests/test_udf.py::test_vectorized_udf"
+    "--deselect=ibis/backends/tests/test_udf.py::test_map_merge_udf"
+    "--deselect=ibis/backends/tests/test_udf.py::test_udf"
+    "--deselect=ibis/backends/tests/test_udf.py::test_map_udf"
+
+    # pyarrow13 is not supported yet.
+    "--deselect=ibis/backends/tests/test_temporal.py::test_date_truncate"
+    "--deselect=ibis/backends/tests/test_temporal.py::test_integer_to_interval_timestamp"
+    "--deselect=ibis/backends/tests/test_temporal.py::test_integer_to_interval_timestamp"
+    "--deselect=ibis/backends/tests/test_temporal.py::test_interval_add_cast_column"
+    "--deselect=ibis/backends/tests/test_temporal.py::test_integer_to_interval_timestamp"
+    "--deselect=ibis/backends/tests/test_temporal.py::test_integer_to_interval_timestamp"
+    "--deselect=ibis/backends/tests/test_temporal.py::test_integer_to_interval_timestamp"
+    "--deselect=ibis/backends/tests/test_temporal.py::test_integer_to_interval_timestamp"
+    "--deselect=ibis/backends/tests/test_timecontext.py::test_context_adjustment_filter_before_window"
+    "--deselect=ibis/backends/tests/test_timecontext.py::test_context_adjustment_window_udf"
+    "--deselect=ibis/backends/tests/test_timecontext.py::test_context_adjustment_window_udf"
+    "--deselect=ibis/backends/tests/test_aggregation.py::test_aggregate_grouped"
+  ];
+
+  # patch out tests that check formatting with black
+  postPatch = ''
+    find ibis/tests -type f -name '*.py' -exec sed -i \
+      -e '/^ *assert_decompile_roundtrip/d' \
+      -e 's/^\( *\)code = ibis.decompile(expr, format=True)/\1code = ibis.decompile(expr)/g' {} +
+    substituteInPlace pyproject.toml --replace 'sqlglot = ">=10.4.3,<12"' 'sqlglot = "*"'
+  '';
+
+  preCheck = ''
+    HOME="$TMPDIR"
+    export IBIS_TEST_DATA_DIRECTORY="ci/ibis-testing-data"
+
+    # copy the test data to a directory
+    ln -s "${ibisTestingData}" "$IBIS_TEST_DATA_DIRECTORY"
+  '';
+
+  postCheck = ''
+    rm -r "$IBIS_TEST_DATA_DIRECTORY"
+  '';
+
+  pythonImportsCheck = [
+    "ibis"
+  ] ++ map (backend: "ibis.backends.${backend}") testBackends;
+
+  passthru = {
+    optional-dependencies = {
+      bigquery = [ db-dtypes google-cloud-bigquery google-cloud-bigquery-storage pydata-google-auth ];
+      clickhouse = [ clickhouse-connect sqlalchemy ];
+      dask = [ dask regex ];
+      datafusion = [ datafusion ];
+      druid = [ pydruid sqlalchemy ];
+      duckdb = [ duckdb duckdb-engine packaging sqlalchemy sqlalchemy-views ];
+      flink = [ ];
+      geospatial = [ geoalchemy2 geopandas shapely ];
+      mysql = [ sqlalchemy pymysql sqlalchemy-views ];
+      oracle = [ sqlalchemy oracledb packaging sqlalchemy-views ];
+      pandas = [ regex ];
+      polars = [ polars ];
+      postgres = [ psycopg2 sqlalchemy sqlalchemy-views ];
+      pyspark = [ pyspark sqlalchemy ];
+      snowflake = [ snowflake-connector-python snowflake-sqlalchemy sqlalchemy-views ];
+      sqlite = [ regex sqlalchemy sqlite sqlalchemy-views ];
+      trino = [ trino-python-client sqlalchemy sqlalchemy-views ];
+      visualization = [ graphviz-nox ];
+      decompiler = [ black ];
+    };
+  };
+
+  meta = with lib; {
+    description = "Productivity-centric Python Big Data Framework";
+    homepage = "https://github.com/ibis-project/ibis";
+    changelog = "https://github.com/ibis-project/ibis/blob/${version}/docs/release_notes.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ibis/default.nix b/nixpkgs/pkgs/development/python-modules/ibis/default.nix
new file mode 100644
index 000000000000..e012ca20e2d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ibis/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ibis";
+  version = "3.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "dmulholl";
+    repo = pname;
+    rev = version;
+    hash = "sha256-EPz9zHnxR75WoRaiHKJNiCRWFwU1TBpC4uHz62jUOqM=";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} test_ibis.py
+  '';
+
+  pythonImportsCheck = [
+    "ibis"
+  ];
+
+  meta = with lib; {
+    description = "Lightweight template engine";
+    homepage = "https://github.com/dmulholland/ibis";
+    license = licenses.publicDomain;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ibm-cloud-sdk-core/default.nix b/nixpkgs/pkgs/development/python-modules/ibm-cloud-sdk-core/default.nix
new file mode 100644
index 000000000000..9aac09e8bff3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ibm-cloud-sdk-core/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyjwt
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, requests
+, responses
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "ibm-cloud-sdk-core";
+  version = "3.18.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vytpQHYZcMFLU/yPwTWvVnxYuXCdsyFL5AOjg91Ryrs=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pyjwt
+    python-dateutil
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  disabledTests = [
+    # Various tests try to access credential files which are not included with the source distribution
+    "test_configure_service"
+    "test_cp4d_authenticator"
+    "test_cwd"
+    "test_files_dict"
+    "test_files_duplicate_parts"
+    "test_files_list"
+    "test_get_authenticator"
+    "test_gzip_compression_external"
+    "test_iam"
+    "test_read_external_sources_2"
+    "test_retry_config_external"
+    # assertion error due to requests brotli support
+    "test_http_client"
+  ];
+
+  disabledTestPaths = [
+    "test/test_container_token_manager.py"
+    # Tests require credentials
+    "test_integration/"
+  ];
+
+  meta = with lib; {
+    description = "Client library for the IBM Cloud services";
+    homepage = "https://github.com/IBM/python-sdk-core";
+    changelog = "https://github.com/IBM/python-sdk-core/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ globin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ibm-watson/default.nix b/nixpkgs/pkgs/development/python-modules/ibm-watson/default.nix
new file mode 100644
index 000000000000..522b7b13cc1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ibm-watson/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ibm-cloud-sdk-core
+, pytest-rerunfailures
+, pytestCheckHook
+, python-dateutil
+, python-dotenv
+, pythonOlder
+, requests
+, responses
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "ibm-watson";
+  version = "7.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "watson-developer-cloud";
+    repo = "python-sdk";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-f/nf9WFiUNDQBkFNMV16EznCw0TN9L4fDIPQ/j4B1Sc=";
+  };
+
+  propagatedBuildInputs = [
+    ibm-cloud-sdk-core
+    python-dateutil
+    requests
+    websocket-client
+  ];
+
+  nativeCheckInputs = [
+    pytest-rerunfailures
+    pytestCheckHook
+    python-dotenv
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "ibm_watson"
+  ];
+
+  meta = with lib; {
+    description = "Client library to use the IBM Watson Services";
+    homepage = "https://github.com/watson-developer-cloud/python-sdk";
+    changelog = "https://github.com/watson-developer-cloud/python-sdk/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ globin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ical/default.nix b/nixpkgs/pkgs/development/python-modules/ical/default.nix
new file mode 100644
index 000000000000..b0ae3c59c6b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ical/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, emoji
+, fetchFromGitHub
+, freezegun
+, tzdata
+, pyparsing
+, pydantic
+, pytest-asyncio
+, pytest-benchmark
+, pytest-golden
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, python-dateutil
+, pyyaml
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "ical";
+  version = "6.1.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "allenporter";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-1tf/R9CridAdNkS6/G0C1v+lZghS7WV5MVnVuBv1zvI=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    setuptools
+  ];
+
+  pythonRelaxDeps = [
+    "tzdata"
+  ];
+
+  propagatedBuildInputs = [
+    python-dateutil
+    tzdata
+    pydantic
+    pyparsing
+  ];
+
+  nativeCheckInputs = [
+    emoji
+    freezegun
+    pytest-asyncio
+    pytest-benchmark
+    pytest-golden
+    pytestCheckHook
+    pyyaml
+  ];
+
+  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/nixpkgs/pkgs/development/python-modules/icalendar/default.nix b/nixpkgs/pkgs/development/python-modules/icalendar/default.nix
new file mode 100644
index 000000000000..c1237dc58829
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/icalendar/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, backports-zoneinfo
+, python-dateutil
+, pytz
+, hypothesis
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  version = "5.0.10";
+  pname = "icalendar";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "collective";
+    repo = "icalendar";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-sRsUjNClJ58kmCRiwSe7oq20eamj95Vwy/o0xPU8qPw=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    pytz
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    backports-zoneinfo
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [ "src/icalendar" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/collective/icalendar/blob/v${version}/CHANGES.rst";
+    description = "A parser/generator of iCalendar files";
+    homepage = "https://github.com/collective/icalendar";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ olcai ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/icecream/default.nix b/nixpkgs/pkgs/development/python-modules/icecream/default.nix
new file mode 100644
index 000000000000..a12b4c4c0a85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/icecream/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi
+, asttokens, colorama, executing, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "icecream";
+  version = "2.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-CqSnwzdOw2FTodCPgeMIDoPYrB7v2X0vT+lUTo+bSd4=";
+  };
+
+  propagatedBuildInputs = [ asttokens colorama executing pygments ];
+
+  meta = with lib; {
+    description = "A little library for sweet and creamy print debugging";
+    homepage = "https://github.com/gruns/icecream";
+    license = licenses.mit;
+    maintainers = with maintainers; [ renatoGarcia ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iceportal/default.nix b/nixpkgs/pkgs/development/python-modules/iceportal/default.nix
new file mode 100644
index 000000000000..ffc0335761b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iceportal/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, httpx
+, pytest-asyncio
+, pytest-httpx
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "iceportal";
+  version = "1.1.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-ecosystem";
+    repo = "python-iceportal";
+    rev = "refs/tags/${version}";
+    hash = "sha256-s+jEpxKsa3eIV4a/Ltso51jqZC4jzsvPLTjDFMV9FIA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-httpx
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "iceportal"
+  ];
+
+  meta = with lib; {
+    description = "Library for getting data from the ICE Portal";
+    homepage = "https://github.com/home-assistant-ecosystem/python-iceportal";
+    changelog = "https://github.com/home-assistant-ecosystem/python-iceportal/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/icmplib/default.nix b/nixpkgs/pkgs/development/python-modules/icmplib/default.nix
new file mode 100644
index 000000000000..5e963bd82e55
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/icmplib/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pbr
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "icmplib";
+  version = "3.0.4";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ValentinBELYN";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-PnBcGiUvftz/KYg9Qd2GaIcF3OW4lYH301uI5/M5CBI=";
+  };
+
+  propagatedBuildInputs = [
+    pbr
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "icmplib" ];
+
+  meta = with lib; {
+    description = "Python implementation of the ICMP protocol";
+    homepage = "https://github.com/ValentinBELYN/icmplib";
+    license = with licenses; [ lgpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/icnsutil/default.nix b/nixpkgs/pkgs/development/python-modules/icnsutil/default.nix
new file mode 100644
index 000000000000..46c1fcae3fac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/icnsutil/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "icnsutil";
+  version = "1.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "relikd";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-tiq8h6s2noWLBIOIWcj8jfSqJFN01ee2uoHN4aFwn7s=";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} tests/test_icnsutil.py
+    ${python.interpreter} tests/test_cli.py
+  '';
+
+  pythonImportsCheck = [
+    "icnsutil"
+  ];
+
+  meta = with lib; {
+    description = "Create and extract .icns files";
+    homepage = "https://github.com/relikd/icnsutil";
+    changelog = "https://github.com/relikd/icnsutil/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ reckenrode ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/icoextract/default.nix b/nixpkgs/pkgs/development/python-modules/icoextract/default.nix
new file mode 100644
index 000000000000..e050dd9b9406
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/icoextract/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchPypi, pefile, pillow}:
+
+buildPythonPackage rec {
+  pname = "icoextract";
+  version = "0.1.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "tar.gz";
+    hash = "sha256-x0GEV0PUbkAzoUJgAqup9bHd7iYttGyzIZNdo8KsFyo=";
+  };
+
+  propagatedBuildInputs = [
+    pefile
+    pillow
+  ];
+
+  # tests expect mingw and multiarch
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "icoextract"
+  ];
+
+  postInstall = ''
+    mkdir -p $out/share/thumbnailers
+    substituteAll ${./exe-thumbnailer.thumbnailer} $out/share/thumbnailers/exe-thumbnailer.thumbnailer
+  '';
+
+  meta = with lib; {
+    description = "Extract icons from Windows PE files";
+    homepage = "https://github.com/jlu5/icoextract";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bryanasdev000 donovanglover ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/icoextract/exe-thumbnailer.thumbnailer b/nixpkgs/pkgs/development/python-modules/icoextract/exe-thumbnailer.thumbnailer
new file mode 100644
index 000000000000..c275ac919b6b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/icoextract/exe-thumbnailer.thumbnailer
@@ -0,0 +1,3 @@
+[Thumbnailer Entry]
+Exec=@out@/bin/exe-thumbnailer -v -s %s %i %o
+MimeType=application/x-ms-dos-executable;application/x-dosexec;application/x-msdownload
diff --git a/nixpkgs/pkgs/development/python-modules/icontract/default.nix b/nixpkgs/pkgs/development/python-modules/icontract/default.nix
new file mode 100644
index 000000000000..76e1814ddddd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/icontract/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, astor
+, asttokens
+, asyncstdlib
+, deal
+, dpcontracts
+, numpy
+, pytestCheckHook
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "icontract";
+  version = "2.6.4";
+  format = "setuptools";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Parquery";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-zuaS9mmq47hUIBObYRuzEYQQdTArFXR3TpK9nfZt/yk=";
+  };
+
+  preCheck = ''
+    # we don't want to use the precommit.py script to build the package.
+    # For the tests to succeed, "ICONTRACT_SLOW" needs to be set.
+    # see https://github.com/Parquery/icontract/blob/aaeb1b06780a34b05743377e4cb2458780e808d3/precommit.py#L57
+    export ICONTRACT_SLOW=1
+  '';
+
+  propagatedBuildInputs = [
+    asttokens
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    astor
+    asyncstdlib
+    deal
+    dpcontracts
+    numpy
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # mypy decorator checks don't pass. For some reason mypy
+    # doesn't check the python file provided in the test.
+    "tests/test_mypy_decorators.py"
+    # those tests seems to simply re-run some typeguard tests
+    "tests/test_typeguard.py"
+  ];
+
+  pytestFlagsArray = [
+    # RuntimeWarning: coroutine '*' was never awaited
+    "-W" "ignore::RuntimeWarning"
+  ];
+
+  pythonImportsCheck = [ "icontract" ];
+
+  meta = with lib; {
+    description = "Provide design-by-contract with informative violation messages";
+    homepage = "https://github.com/Parquery/icontract";
+    changelog = "https://github.com/Parquery/icontract/blob/v${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gador thiagokokada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ics/default.nix b/nixpkgs/pkgs/development/python-modules/ics/default.nix
new file mode 100644
index 000000000000..9f2665b59f19
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ics/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, tatsu
+, arrow
+, pytestCheckHook
+, pytest-flakes
+}:
+
+buildPythonPackage rec {
+  pname = "ics";
+  version = "0.7.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ics-py";
+    repo = "ics-py";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-hdtnET7YfSb85+TGwpwzoxOfxPT7VSj9eKSiV6AXUS8=";
+  };
+
+  propagatedBuildInputs = [
+    arrow
+    tatsu
+  ];
+
+  nativeCheckInputs = [
+    pytest-flakes
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # 0.8 will move to python-dateutil
+    substituteInPlace requirements.txt \
+      --replace "arrow>=0.11,<0.15" "arrow"
+    substituteInPlace setup.cfg --replace "--pep8" ""
+  '';
+
+  disabledTests = [
+    # Failure seems to be related to arrow > 1.0
+    "test_event"
+    # Broke with TatSu 5.7:
+    "test_many_lines"
+  ];
+
+  pythonImportsCheck = [ "ics" ];
+
+  meta = with lib; {
+    description = "Pythonic and easy iCalendar library (RFC 5545)";
+    longDescription = ''
+      Ics.py is a pythonic and easy iCalendar library. Its goals are to read and
+      write ics data in a developer friendly way.
+    '';
+    homepage = "http://icspy.readthedocs.org/en/stable/";
+    changelog = "https://github.com/ics-py/ics-py/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/id/default.nix b/nixpkgs/pkgs/development/python-modules/id/default.nix
new file mode 100644
index 000000000000..c4b59268b4bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/id/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, pretend
+, pydantic
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "id";
+  version = "1.1.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "di";
+    repo = "id";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-T3p13EnXU1Efysnu1RQw5st1BgHyZNdrKtkzQSguRtM=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    pydantic
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pretend
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "id"
+  ];
+
+  meta = with lib; {
+    description = "A tool for generating OIDC identities";
+    homepage = "https://github.com/di/id";
+    changelog = "https://github.com/di/id/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/idasen/default.nix b/nixpkgs/pkgs/development/python-modules/idasen/default.nix
new file mode 100644
index 000000000000..7e9c67634976
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/idasen/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, bleak
+, pyyaml
+, voluptuous
+, pytestCheckHook
+, pytest-asyncio
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "idasen";
+  version = "0.10.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "newAM";
+    repo = "idasen";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-mAczHrFEH1LEH1IEUc7ZXTWtaPBrvIdSvkUqOCupyRs=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bleak
+    pyyaml
+    voluptuous
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  pythonImportsCheck = [
+    "idasen"
+  ];
+
+  meta = with lib; {
+    description = "Python API and CLI for the ikea IDÅSEN desk";
+    homepage = "https://github.com/newAM/idasen";
+    changelog = "https://github.com/newAM/idasen/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ newam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/identify/default.nix b/nixpkgs/pkgs/development/python-modules/identify/default.nix
new file mode 100644
index 000000000000..d754f90318cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/identify/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, editdistance-s
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, ukkonen
+}:
+
+buildPythonPackage rec {
+  pname = "identify";
+  version = "2.5.32";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pre-commit";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-fKcxK11IxC0wmpPdyGzYQViSW2rx1v9Bvc+uBvGT8kE=";
+  };
+
+  nativeCheckInputs = [
+    editdistance-s
+    pytestCheckHook
+    ukkonen
+  ];
+
+  pythonImportsCheck = [
+    "identify"
+  ];
+
+  meta = with lib; {
+    description = "File identification library for Python";
+    homepage = "https://github.com/chriskuehl/identify";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/idna-ssl/default.nix b/nixpkgs/pkgs/development/python-modules/idna-ssl/default.nix
new file mode 100644
index 000000000000..ba11a39f5d9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/idna-ssl/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, idna }:
+
+buildPythonPackage rec {
+  pname = "idna-ssl";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a933e3bb13da54383f9e8f35dc4f9cb9eb9b3b78c6b36f311254d6d0d92c6c7c";
+  };
+
+  propagatedBuildInputs = [ idna ];
+
+  # Infinite recursion: tests require aiohttp, aiohttp requires idna-ssl
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Patch ssl.match_hostname for Unicode(idna) domains support";
+    homepage = "https://github.com/aio-libs/idna-ssl";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/idna/default.nix b/nixpkgs/pkgs/development/python-modules/idna/default.nix
new file mode 100644
index 000000000000..a21125c2379e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/idna/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "idna";
+  version = "3.4";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gU9Sjo3q19MpgzuRxfqofWC/cYJM0Sp1MLVSYGPQLLQ=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = {
+    homepage = "https://github.com/kjd/idna/";
+    description = "Internationalized Domain Names in Applications (IDNA)";
+    license = lib.licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ifaddr/default.nix b/nixpkgs/pkgs/development/python-modules/ifaddr/default.nix
new file mode 100644
index 000000000000..77f6283e4be3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ifaddr/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  version = "0.2.0";
+  pname = "ifaddr";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zAy/yqv3ZdRFlYJfuWqZuxLHlxa3O0QzDqOO4rDErtQ=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "ifaddr" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pydron/ifaddr";
+    description = "Enumerates all IP addresses on all network adapters of the system";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ifconfig-parser/default.nix b/nixpkgs/pkgs/development/python-modules/ifconfig-parser/default.nix
new file mode 100644
index 000000000000..be4e2026bf10
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ifconfig-parser/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchFromGitHub }:
+
+buildPythonPackage rec {
+  pname = "ifconfig-parser";
+  version = "0.0.5";
+
+  src = fetchFromGitHub {
+    owner = "KnightWhoSayNi";
+    repo = pname;
+    rev = "4921ac9d6be6244b062d082c164f5a5e69522478";
+    sha256 = "07hbkbr1qspr7qgzldkaslzc6ripj5zlif12d4fk5j801yhvnxjd";
+  };
+
+  checkPhase = ''
+    export PYTHONPATH=$PYTHONPATH:$(pwd)/ifconfigparser:$(pwd)/ifconfigparser/tests
+    python -m unittest -v test_ifconfig_parser.TestIfconfigParser
+  '';
+
+  meta = with lib; {
+    description = "Unsophisticated python package for parsing raw output of ifconfig.";
+    homepage = "https://github.com/KnightWhoSayNi/ifconfig-parser";
+    license = licenses.mit;
+    maintainers = with maintainers; [ atemu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ifcopenshell/default.nix b/nixpkgs/pkgs/development/python-modules/ifcopenshell/default.nix
new file mode 100644
index 000000000000..eb1c71601c92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ifcopenshell/default.nix
@@ -0,0 +1,60 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, gcc10
+, cmake
+, boost179
+, icu
+, swig
+, pcre
+, opencascade-occt
+, opencollada
+, libxml2
+}:
+
+buildPythonPackage rec {
+  pname = "ifcopenshell";
+  version = "230915";
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner  = "IfcOpenShell";
+    repo   = "IfcOpenShell";
+    rev = "refs/tags/blenderbim-${version}";
+    fetchSubmodules = true;
+    sha256 = "sha256-dHw+5AlJbeuUeaxv7eE2XfLjR/K5S00dMSCtoWVcEB8=";
+  };
+
+  nativeBuildInputs = [ gcc10 cmake ];
+
+  buildInputs = [
+    boost179
+    icu
+    pcre
+    libxml2
+  ];
+
+  preConfigure = ''
+    cd cmake
+  '';
+
+  PYTHONUSERBASE=".";
+  cmakeFlags = [
+    "-DUSERSPACE_PYTHON_PREFIX=ON"
+    "-DOCC_INCLUDE_DIR=${opencascade-occt}/include/opencascade"
+    "-DOCC_LIBRARY_DIR=${opencascade-occt}/lib"
+    "-DOPENCOLLADA_INCLUDE_DIR=${opencollada}/include/opencollada"
+    "-DOPENCOLLADA_LIBRARY_DIR=${opencollada}/lib/opencollada"
+    "-DSWIG_EXECUTABLE=${swig}/bin/swig"
+    "-DLIBXML2_INCLUDE_DIR=${libxml2.dev}/include/libxml2"
+    "-DLIBXML2_LIBRARIES=${libxml2.out}/lib/libxml2${stdenv.hostPlatform.extensions.sharedLibrary}"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Open source IFC library and geometry engine";
+    homepage    = "http://ifcopenshell.org/";
+    license     = licenses.lgpl3;
+    maintainers = with maintainers; [ fehnomenal ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ignite/default.nix b/nixpkgs/pkgs/development/python-modules/ignite/default.nix
new file mode 100644
index 000000000000..853405d0476f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ignite/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pytest-xdist
+, torchvision
+, pythonOlder
+, matplotlib
+, mock
+, packaging
+, torch
+, scikit-learn
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "ignite";
+  version = "0.4.13";
+
+  src = fetchFromGitHub {
+    owner = "pytorch";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+olp+zphcHMvcGKHt0JhxXza1wd7UiydwVFnSQ310Vg=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook matplotlib mock pytest-xdist torchvision ];
+  propagatedBuildInputs = [ packaging torch scikit-learn tqdm ];
+
+  # runs successfully in 3.9, however, async isn't correctly closed so it will fail after test suite.
+  doCheck = pythonOlder "3.9";
+
+  # Some packages are not in NixPkgs; other tests try to build distributed
+  # models, which doesn't work in the sandbox.
+  # avoid tests which need special packages
+  pytestFlagsArray = [
+    "--ignore=tests/ignite/contrib/handlers/test_clearml_logger.py"
+    "--ignore=tests/ignite/contrib/handlers/test_lr_finder.py"
+    "--ignore=tests/ignite/contrib/handlers/test_trains_logger.py"
+    "--ignore=tests/ignite/metrics/nlp/test_bleu.py"
+    "--ignore=tests/ignite/metrics/nlp/test_rouge.py"
+    "--ignore=tests/ignite/metrics/gan" # requires pytorch_fid; tries to download model to $HOME
+    "--ignore=tests/ignite/metrics/test_dill.py"
+    "--ignore=tests/ignite/metrics/test_psnr.py"
+    "--ignore=tests/ignite/metrics/test_ssim.py"
+    "tests/"
+  ];
+
+  # disable tests which need specific packages
+  disabledTests = [
+    "idist"
+    "mlflow"
+    "tensorboard"
+    "test_gpu_info" # needs pynvml
+    "test_integration"
+    "test_output_handler" # needs mlflow
+    "test_pbar" # slight output differences
+    "test_setup_clearml_logging"
+    "test_setup_neptune"
+    "test_setup_plx"
+    "test_write_results"
+    "trains"
+    "visdom"
+  ];
+
+  meta = with lib; {
+    description = "High-level training library for PyTorch";
+    homepage = "https://pytorch.org/ignite";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/igraph/default.nix b/nixpkgs/pkgs/development/python-modules/igraph/default.nix
new file mode 100644
index 000000000000..4aebfc1cecd1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/igraph/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pkg-config
+, igraph
+, texttable
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "igraph";
+  version = "0.11.3";
+
+  disabled = pythonOlder "3.8";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "igraph";
+    repo = "python-igraph";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Pki0ygcQeuC5E4SwhzGX7oIe9LUSgoBKiXbtcpjL3ng=";
+  };
+
+  postPatch = ''
+    rm -r vendor
+  '';
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  buildInputs = [
+    igraph
+  ];
+
+  propagatedBuildInputs = [
+    texttable
+  ];
+
+  # NB: We want to use our igraph, not vendored igraph, but even with
+  # pkg-config on the PATH, their custom setup.py still needs to be explicitly
+  # told to do it. ~ C.
+  setupPyGlobalFlags = [ "--use-pkg-config" ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [ "igraph" ];
+
+  meta = with lib; {
+    description = "High performance graph data structures and algorithms";
+    homepage = "https://igraph.org/python/";
+    changelog = "https://github.com/igraph/python-igraph/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ MostAwesomeDude dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ihm/default.nix b/nixpkgs/pkgs/development/python-modules/ihm/default.nix
new file mode 100644
index 000000000000..b56459317f34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ihm/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, swig
+, wheel
+, msgpack
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ihm";
+  version = "0.41";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "ihmwg";
+    repo = "python-ihm";
+    rev = "refs/tags/${version}";
+    hash = "sha256-weeOizVWFcOxD45QsvEaoknTofZjglCvidyvXpyRKwc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    swig
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    msgpack
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # requires network access
+    "test_validator_example"
+  ];
+
+  pythonImportsCheck = [ "ihm" ];
+
+  meta = with lib; {
+    description = "Python package for handling IHM mmCIF and BinaryCIF files";
+    homepage = "https://github.com/ihmwg/python-ihm";
+    changelog = "https://github.com/ihmwg/python-ihm/blob/${src.rev}/ChangeLog.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iisignature/default.nix b/nixpkgs/pkgs/development/python-modules/iisignature/default.nix
new file mode 100644
index 000000000000..1ddfd05b5326
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iisignature/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, wheel
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "iisignature";
+  version = "0.24";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-C5MUxui4BIf68yMZH7NZhq1CJuhrDGfPCjspObaVucY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  # PyPI tarball has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "iisignature" ];
+
+  meta = with lib; {
+    description = "Iterated integral signature calculations";
+    homepage = "https://pypi.org/project/iisignature";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ijson/default.nix b/nixpkgs/pkgs/development/python-modules/ijson/default.nix
new file mode 100644
index 000000000000..99184c046719
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ijson/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, yajl
+, cffi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ijson";
+  version = "3.2.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-EClOm/ictxPaBbxHkL3/YWYQQy21YZZIJwdImOF0+Rc=";
+  };
+
+  buildInputs = [
+    yajl
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  doCheck = true;
+
+  pythonImportsCheck = [
+    "ijson"
+  ];
+
+  meta = with lib; {
+    description = "Iterative JSON parser with a standard Python iterator interface";
+    homepage = "https://github.com/ICRAR/ijson";
+    changelog = "https://github.com/ICRAR/ijson/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ rvl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ilua/default.nix b/nixpkgs/pkgs/development/python-modules/ilua/default.nix
new file mode 100644
index 000000000000..9c6a7f6cb337
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ilua/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jupyter-console
+, jupyter-core
+, pygments
+, termcolor
+, txzmq
+}:
+
+buildPythonPackage rec {
+  pname = "ilua";
+  version = "0.2.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-YxV6xC7GS5NXyMPRZN9YIJxamgP2etwrZUAZjk5PjtU=";
+  };
+
+  propagatedBuildInputs = [
+    jupyter-console
+    jupyter-core
+    pygments
+    termcolor
+    txzmq
+  ];
+
+  # No tests found
+  doCheck = false;
+
+  pythonImportsCheck = [ "ilua" ];
+
+  meta = with lib; {
+    description = "Portable Lua kernel for Jupyter";
+    homepage = "https://github.com/guysv/ilua";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/image-diff/default.nix b/nixpkgs/pkgs/development/python-modules/image-diff/default.nix
new file mode 100644
index 000000000000..d120737c3ffc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/image-diff/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, python
+, buildPythonPackage
+, fetchFromGitHub
+, pillow
+, click
+, click-default-group
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "image-diff";
+  version = "0.2.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "simonw";
+    repo = "image-diff";
+    rev = version;
+    hash = "sha256-AQykJNvBgVjmPVTwJOX17eKWelqvZZieq/giid8GYAY=";
+  };
+
+  propagatedBuildInputs = [
+    pillow
+    click
+    click-default-group
+  ];
+
+  pythonImportsCheck = [ "image_diff" ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "CLI tool for comparing images";
+    homepage = "https://github.com/simonw/image-diff";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ evils ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/image-go-nord/default.nix b/nixpkgs/pkgs/development/python-modules/image-go-nord/default.nix
new file mode 100644
index 000000000000..ff7c654c9ea3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/image-go-nord/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pillow, pytestCheckHook, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "image-go-nord";
+  version = "0.1.7";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Schrodinger-Hat";
+    repo = "ImageGoNord-pip";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-vXABG3aJ6bwT37hfo909oF8qfAY3ZW18xvr1V8vSy5w=";
+  };
+
+  propagatedBuildInputs = [ pillow ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "A tool that can convert rgb images to nordtheme palette";
+    homepage = "https://github.com/Schrodinger-Hat/ImageGoNord-pip";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kranzes ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/imagecodecs-lite/default.nix b/nixpkgs/pkgs/development/python-modules/imagecodecs-lite/default.nix
new file mode 100644
index 000000000000..a9cec8bb50c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imagecodecs-lite/default.nix
@@ -0,0 +1,40 @@
+{ stdenv
+, lib, fetchPypi, buildPythonPackage
+, pytest
+, numpy
+, cython
+}:
+
+buildPythonPackage rec {
+  pname = "imagecodecs-lite";
+  version = "2019.12.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0s4xb17qd7vimc46rafbjnibj4sf0lnv8cwl22k1h6zb7jhqmlcm";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    description = "Block-oriented, in-memory buffer transformation, compression, and decompression functions";
+    homepage = "https://www.lfd.uci.edu/~gohlke/";
+    maintainers = [ maintainers.tbenst ];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/imagecorruptions/default.nix b/nixpkgs/pkgs/development/python-modules/imagecorruptions/default.nix
new file mode 100644
index 000000000000..64da1392047d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imagecorruptions/default.nix
@@ -0,0 +1,38 @@
+{ buildPythonPackage
+, fetchPypi
+, numpy
+, scikit-image
+, lib
+, opencv4
+}:
+
+buildPythonPackage rec {
+  pname = "imagecorruptions";
+  version = "1.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "044e173f24d5934899bdbf3596bfbec917e8083e507eed583ab217abebbe084d";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'opencv-python >= 3.4.5'," ""
+  '';
+
+  propagatedBuildInputs = [
+    numpy
+    scikit-image
+    opencv4
+  ];
+
+  doCheck = false;
+  pythonImportsCheck = [ "imagecorruptions" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/bethgelab/imagecorruptions";
+    description = "This package provides a set of image corruptions";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ rakesh4g ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/imagededup/default.nix b/nixpkgs/pkgs/development/python-modules/imagededup/default.nix
new file mode 100644
index 000000000000..94d06f6becbd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imagededup/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchurl
+, cython
+, torch
+, torchvision
+, pillow
+, tqdm
+, scikit-learn
+, pywavelets
+, matplotlib
+, pytestCheckHook
+, pytest-mock
+}:
+let
+  MobileNetV3 = fetchurl {
+    url = "https://download.pytorch.org/models/mobilenet_v3_small-047dcff4.pth";
+    hash = "sha256-BH3P9K3e+G6lvC7/E8lhTcEfR6sRYNCnGiXn25lPTh8=";
+  };
+  ViT = fetchurl {
+    url = "https://download.pytorch.org/models/vit_b_16_swag-9ac1b537.pth";
+    hash = "sha256-msG1N42ZJ71sg3TODNVX74Dhs/j7wYWd8zLE3J0P2CU=";
+  };
+  EfficientNet = fetchurl {
+    url = "https://download.pytorch.org/models/efficientnet_b4_rwightman-7eb33cd5.pth";
+    hash = "sha256-I6uLzVvb72GnpDuRrcrYH2Iv1/NvtJNaVpgo13iIxE4=";
+  };
+in
+buildPythonPackage rec {
+  pname = "imagededup";
+  version = "0.3.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "idealo";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-B2IuNMTZnzBi6IxrHBoMDsmIcqGQpznd/2f1XKo1Oa4=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    torch
+    torchvision
+    pillow
+    tqdm
+    scikit-learn
+    pywavelets
+    matplotlib
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook pytest-mock ];
+
+  preCheck = ''
+    # checks fail with: error: [Errno 13] Permission denied: '/homeless-shelter'
+    export HOME=$(mktemp -d)
+
+    # checks with CNN are preloaded to avoid downloads in check-phase
+    mkdir -p $HOME/.cache/torch/hub/checkpoints/
+    ln -s ${MobileNetV3} $HOME/.cache/torch/hub/checkpoints/${MobileNetV3.name}
+    ln -s ${ViT} $HOME/.cache/torch/hub/checkpoints/${ViT.name}
+    ln -s ${EfficientNet} $HOME/.cache/torch/hub/checkpoints/${EfficientNet.name}
+  '';
+
+  pythonImportsCheck = [ "imagededup" ];
+
+  meta = with lib; {
+    homepage = "https://idealo.github.io/imagededup/";
+    changelog = "https://github.com/idealo/imagededup/releases/tag/${src.rev}";
+    description = "Finding duplicate images made easy";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ stunkymonkey ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/imagehash/default.nix b/nixpkgs/pkgs/development/python-modules/imagehash/default.nix
new file mode 100644
index 000000000000..b65053c56ead
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imagehash/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, numpy
+, six
+, scipy
+, pillow
+, pywavelets
+}:
+
+buildPythonPackage rec {
+  pname = "imagehash";
+  version = "4.3.1";
+
+  src = fetchFromGitHub {
+    owner = "JohannesBuchner";
+    repo = "imagehash";
+    rev = "v${version}";
+    hash = "sha256-Tsq10TZqnzNTuO4goKjdylN4Eqy7DNbHLjr5n3+nidM=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    six
+    scipy
+    pillow
+    pywavelets
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "A Python Perceptual Image Hashing Module";
+    homepage = "https://github.com/JohannesBuchner/imagehash";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ e1mo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/imageio-ffmpeg/default.nix b/nixpkgs/pkgs/development/python-modules/imageio-ffmpeg/default.nix
new file mode 100644
index 000000000000..3f2b7de89dde
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imageio-ffmpeg/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, substituteAll
+, ffmpeg_4
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "imageio-ffmpeg";
+  version = "0.4.9";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ObzRZgEY7zYPpAR0VlAQcTZGYaqdkCHT0mxY8e4ggfU=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./ffmpeg-path.patch;
+      ffmpeg = "${ffmpeg_4}/bin/ffmpeg";
+    })
+  ];
+
+  # https://github.com/imageio/imageio-ffmpeg/issues/59
+  postPatch = ''
+    sed -i '/setup_requires=\["pip>19"\]/d' setup.py
+  '';
+
+  checkPhase = ''
+    runHook preCheck
+
+    ${python.interpreter} << EOF
+    from imageio_ffmpeg import get_ffmpeg_version
+    assert get_ffmpeg_version() == '${ffmpeg_4.version}'
+    EOF
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "imageio_ffmpeg" ];
+
+  meta = with lib; {
+    description = "FFMPEG wrapper for Python";
+    homepage = "https://github.com/imageio/imageio-ffmpeg";
+    license = licenses.bsd2;
+    maintainers = [ maintainers.pmiddend ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/imageio-ffmpeg/ffmpeg-path.patch b/nixpkgs/pkgs/development/python-modules/imageio-ffmpeg/ffmpeg-path.patch
new file mode 100644
index 000000000000..33e2f9695d80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imageio-ffmpeg/ffmpeg-path.patch
@@ -0,0 +1,35 @@
+diff --git a/imageio_ffmpeg/_utils.py b/imageio_ffmpeg/_utils.py
+index 6387834..e5e312d 100644
+--- a/imageio_ffmpeg/_utils.py
++++ b/imageio_ffmpeg/_utils.py
+@@ -38,29 +38,7 @@ def get_ffmpeg_exe():
+ 
+ @lru_cache()
+ def _get_ffmpeg_exe():
+-    plat = get_platform()
+-
+-    # 2. Try from here
+-    bin_dir = resource_filename("imageio_ffmpeg", "binaries")
+-    exe = os.path.join(bin_dir, FNAME_PER_PLATFORM.get(plat, ""))
+-    if exe and os.path.isfile(exe) and _is_valid_exe(exe):
+-        return exe
+-
+-    # 3. Try binary from conda package
+-    # (installed e.g. via `conda install ffmpeg -c conda-forge`)
+-    if plat.startswith("win"):
+-        exe = os.path.join(sys.prefix, "Library", "bin", "ffmpeg.exe")
+-    else:
+-        exe = os.path.join(sys.prefix, "bin", "ffmpeg")
+-    if exe and os.path.isfile(exe) and _is_valid_exe(exe):
+-        return exe
+-
+-    # 4. Try system ffmpeg command
+-    exe = "ffmpeg"
+-    if _is_valid_exe(exe):
+-        return exe
+-
+-    return None
++    return "@ffmpeg@"
+ 
+ 
+ def _popen_kwargs(prevent_sigint=False):
diff --git a/nixpkgs/pkgs/development/python-modules/imageio/default.nix b/nixpkgs/pkgs/development/python-modules/imageio/default.nix
new file mode 100644
index 000000000000..ec4e3a3b749a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imageio/default.nix
@@ -0,0 +1,133 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, isPyPy
+, substituteAll
+
+# build-system
+, setuptools
+
+# native dependencies
+, libGL
+
+# dependencies
+, numpy
+, pillow
+
+# optional-dependencies
+, astropy
+, av
+, imageio-ffmpeg
+, pillow-heif
+, psutil
+, tifffile
+
+# tests
+, pytestCheckHook
+, fsspec
+}:
+
+buildPythonPackage rec {
+  pname = "imageio";
+  version = "2.33.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "imageio";
+    repo = "imageio";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-WoCycrJxo0vyV9LiWnEag1wbld3EJWu8mks8TnYt2+A=";
+  };
+
+  patches = lib.optionals (!stdenv.isDarwin) [
+    (substituteAll {
+      src = ./libgl-path.patch;
+      libgl = "${libGL.out}/lib/libGL${stdenv.hostPlatform.extensions.sharedLibrary}";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    pillow
+  ];
+
+  passthru.optional-dependencies = {
+    bsdf = [];
+    dicom = [];
+    feisem = [];
+    ffmpeg = [
+      imageio-ffmpeg
+      psutil
+    ];
+    fits = lib.optionals (!isPyPy) [
+      astropy
+    ];
+    freeimage = [];
+    lytro = [];
+    numpy = [];
+    pillow = [];
+    simpleitk = [];
+    spe = [];
+    swf = [];
+    tifffile = [
+      tifffile
+    ];
+    pyav = [
+      av
+    ];
+    heif = [
+      pillow-heif
+    ];
+  };
+
+  nativeCheckInputs = [
+    fsspec
+    psutil
+    pytestCheckHook
+  ]
+  ++ fsspec.optional-dependencies.github
+  ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pytestFlagsArray = [
+    "-m 'not needs_internet'"
+  ];
+
+  preCheck = ''
+    export IMAGEIO_USERDIR="$TMP"
+    export HOME=$TMPDIR
+  '';
+
+  disabledTestPaths = [
+    # tries to fetch fixtures over the network
+    "tests/test_freeimage.py"
+    "tests/test_pillow.py"
+    "tests/test_spe.py"
+    "tests/test_swf.py"
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # Segmentation fault
+    "test_bayer_write"
+    # RuntimeError: No valid H.264 encoder was found with the ffmpeg installation
+    "test_writer_file_properly_closed"
+    "test_writer_pixelformat_size_verbose"
+    "test_writer_ffmpeg_params"
+    "test_reverse_read"
+  ];
+
+  meta = with lib; {
+    description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats";
+    homepage = "https://imageio.readthedocs.io";
+    changelog = "https://github.com/imageio/imageio/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ Luflosi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/imageio/libgl-path.patch b/nixpkgs/pkgs/development/python-modules/imageio/libgl-path.patch
new file mode 100644
index 000000000000..f2a2bbfa093d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imageio/libgl-path.patch
@@ -0,0 +1,13 @@
+diff --git a/tests/test_core.py b/tests/test_core.py
+index 2cdbb3a..032974c 100644
+--- a/tests/test_core.py
++++ b/tests/test_core.py
+@@ -129,7 +129,7 @@ def test_findlib2():
+     open(os.path.join(fi_dir, "notalib.test.so"), "wb")
+ 
+     # Loading libs
+-    gllib = ctypes.util.find_library("GL")
++    gllib = "@libgl@"
+     core.load_lib([gllib], [])
+     # Fail
+     raises(ValueError, core.load_lib, [], [])  # Nothing given
diff --git a/nixpkgs/pkgs/development/python-modules/imagesize/default.nix b/nixpkgs/pkgs/development/python-modules/imagesize/default.nix
new file mode 100644
index 000000000000..e1d390a8c1fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imagesize/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "imagesize";
+  version = "1.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-aRUERK/7nLDVzFqSs2dvCy+3zZrjnpR6XhGja0SXzUo=";
+  };
+
+  meta = with lib; {
+    description = "Getting image size from png/jpeg/jpeg2000/gif file";
+    homepage = "https://github.com/shibukawa/imagesize_py";
+    license = with licenses; [ mit ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/imantics/default.nix b/nixpkgs/pkgs/development/python-modules/imantics/default.nix
new file mode 100644
index 000000000000..2e10ca6cb330
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imantics/default.nix
@@ -0,0 +1,44 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, numpy
+, opencv4
+, lxml
+, xmljson
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "imantics";
+  version = "0.1.12";
+
+  src = fetchFromGitHub {
+    owner = "jsbroks";
+    repo = "imantics";
+    rev = "76d81036d8f92854d63ad9938dd76c718f8b482e";
+    sha256 = "1zv2gj8cbakhh2fyr2611cbqhfk37a56x973ny9n43y70n26pzm8";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    opencv4
+    lxml
+    xmljson
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'opencv-python>=3'," ""
+  '';
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "imantics" ];
+
+  meta = with lib; {
+    description = "Convert and visualize many annotation formats for object dectection and localization";
+    homepage = "https://github.com/jsbroks/imantics";
+    license = with licenses; [ mit ];
+    maintainers = [ maintainers.rakesh4g ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/imap-tools/default.nix b/nixpkgs/pkgs/development/python-modules/imap-tools/default.nix
new file mode 100644
index 000000000000..6f9182bc1220
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imap-tools/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "imap-tools";
+  version = "1.5.0";
+
+  disabled = pythonOlder "3.5";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "ikvk";
+    repo = "imap_tools";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-kY6Y8Uu1HwSkcmlKL5+zPh4n+4mofX2aoPVXAZvInlI=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # tests require a network connection
+    "test_action"
+    "test_attributes"
+    "test_connection"
+    "test_folders"
+    "test_idle"
+    "test_live"
+  ];
+
+  pythonImportsCheck = [ "imap_tools" ];
+
+  meta = with lib; {
+    description = "Work with email and mailbox by IMAP";
+    homepage = "https://github.com/ikvk/imap_tools";
+    changelog = "https://github.com/ikvk/imap_tools/blob/v${version}/docs/release_notes.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/imapclient/default.nix b/nixpkgs/pkgs/development/python-modules/imapclient/default.nix
new file mode 100644
index 000000000000..58c45f992236
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imapclient/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "imapclient";
+  version = "3.0.0";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "mjs";
+    repo = "imapclient";
+    rev = "refs/tags/${version}";
+    hash = "sha256-ylYGh+78I+6pdvHuQPw8Gks9TLkXQL5HQiaZDnJK3DA=";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [
+    "imapclient"
+    "imapclient.response_types"
+    "imapclient.exceptions"
+    "imapclient.testable_imapclient"
+    "imapclient.tls"
+  ];
+
+  meta = with lib; {
+    homepage = "https://imapclient.readthedocs.io";
+    description = "Easy-to-use, Pythonic and complete IMAP client library";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ almac dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/imaplib2/default.nix b/nixpkgs/pkgs/development/python-modules/imaplib2/default.nix
new file mode 100644
index 000000000000..e6379c0af1dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imaplib2/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "imaplib2";
+  version = "3.6";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "jazzband";
+    repo = "imaplib2";
+    rev = "v${version}";
+    sha256 = "14asi3xnvf4bb394k5j8c3by6svvmrr75pawzy6kaax5jx0h793m";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "imaplib2" ];
+
+  meta = with lib; {
+    description = "A threaded Python IMAP4 client";
+    homepage = "https://github.com/jazzband/imaplib2";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/imbalanced-learn/default.nix b/nixpkgs/pkgs/development/python-modules/imbalanced-learn/default.nix
new file mode 100644
index 000000000000..b93c304a5c7e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imbalanced-learn/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pandas
+, pytestCheckHook
+, scikit-learn
+}:
+
+buildPythonPackage rec {
+  pname = "imbalanced-learn";
+  version = "0.11.0";
+  disabled = isPy27; # scikit-learn>=0.21 doesn't work on python2
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-dYKuiFjm2wuS/vl90IZgoYKX7hKNeMKr3ABri9hrj9w=";
+  };
+
+  propagatedBuildInputs = [ scikit-learn ];
+  nativeCheckInputs = [ pytestCheckHook pandas ];
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+  disabledTests = [
+    "estimator"
+    "classification"
+    "_generator"
+    "show_versions"
+    "test_make_imbalanced_iris"
+    "test_rusboost[SAMME.R]"
+
+    # https://github.com/scikit-learn-contrib/imbalanced-learn/issues/824
+    "ValueDifferenceMetric"
+  ];
+
+  meta = with lib; {
+    description = "Library offering a number of re-sampling techniques commonly used in datasets showing strong between-class imbalance";
+    homepage = "https://github.com/scikit-learn-contrib/imbalanced-learn";
+    license = licenses.mit;
+    maintainers = [ maintainers.rmcgibbo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/img2pdf/default-icc-profile.patch b/nixpkgs/pkgs/development/python-modules/img2pdf/default-icc-profile.patch
new file mode 100644
index 000000000000..28d334a71e6b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/img2pdf/default-icc-profile.patch
@@ -0,0 +1,23 @@
+diff --git a/src/img2pdf.py b/src/img2pdf.py
+index f89670b..01ec4d3 100755
+--- a/src/img2pdf.py
++++ b/src/img2pdf.py
+@@ -3841,17 +3841,7 @@ def validate_icc(fname):
+ 
+ 
+ def get_default_icc_profile():
+-    for profile in [
+-        "/usr/share/color/icc/sRGB.icc",
+-        "/usr/share/color/icc/OpenICC/sRGB.icc",
+-        "/usr/share/color/icc/colord/sRGB.icc",
+-    ]:
+-        if not os.path.exists(profile):
+-            continue
+-        if not file_is_icc(profile):
+-            continue
+-        return profile
+-    return "/usr/share/color/icc/sRGB.icc"
++    return "@srgbProfile@"
+ 
+ 
+ def get_main_parser():
diff --git a/nixpkgs/pkgs/development/python-modules/img2pdf/default.nix b/nixpkgs/pkgs/development/python-modules/img2pdf/default.nix
new file mode 100644
index 000000000000..3bfbb03fc675
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/img2pdf/default.nix
@@ -0,0 +1,100 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitea
+, substituteAll
+, fetchpatch
+, colord
+, setuptools
+, pikepdf
+, pillow
+, stdenv
+, exiftool
+, ghostscript
+, imagemagick
+, mupdf
+, netpbm
+, numpy
+, poppler_utils
+, pytestCheckHook
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "img2pdf";
+  version = "0.5.1";
+  disabled = isPy27;
+
+  pyproject = true;
+
+  src = fetchFromGitea {
+    domain = "gitlab.mister-muffin.de";
+    owner = "josch";
+    repo = "img2pdf";
+    rev = version;
+    hash = "sha256-mrNTc37GrHTc7NW0sYI1FlAOlnvXum02867enqHsAEQ=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./default-icc-profile.patch;
+      srgbProfile = if stdenv.isDarwin then
+        "/System/Library/ColorSync/Profiles/sRGB Profile.icc"
+      else
+        "${colord}/share/color/icc/colord/sRGB.icc";
+    })
+    (fetchpatch {
+      # https://gitlab.mister-muffin.de/josch/img2pdf/issues/178
+      url = "https://salsa.debian.org/debian/img2pdf/-/raw/4a7dbda0f473f7c5ffcaaf68ea4ad3f435e0920d/debian/patches/fix_tests.patch";
+      hash = "sha256-A1zK6yINhS+dvyckZjqoSO1XJRTaf4OXFdq5ufUrBs8=";
+    })
+
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pikepdf
+    pillow
+  ];
+
+  # FIXME: Only add "sRGB Profile.icc" to __impureHostDeps once
+  # https://github.com/NixOS/nix/issues/9301 is fixed.
+  __impureHostDeps = lib.optionals stdenv.isDarwin [
+    "/System/Library/ColorSync/Profiles"
+  ];
+
+  nativeCheckInputs = [
+    exiftool
+    ghostscript
+    imagemagick
+    mupdf
+    netpbm
+    numpy
+    poppler_utils
+    pytestCheckHook
+    scipy
+  ];
+
+  preCheck = ''
+    export img2pdfprog="$out/bin/img2pdf"
+  '';
+
+  disabledTests = [
+    # https://gitlab.mister-muffin.de/josch/img2pdf/issues/178
+    "test_miff_cmyk16"
+  ];
+
+  pythonImportsCheck = [ "img2pdf" ];
+
+  meta = with lib; {
+    changelog = "https://gitlab.mister-muffin.de/josch/img2pdf/src/tag/${src.rev}/CHANGES.rst";
+    description = "Convert images to PDF via direct JPEG inclusion";
+    homepage = "https://gitlab.mister-muffin.de/josch/img2pdf";
+    license = licenses.lgpl3Plus;
+    mainProgram = "img2pdf";
+    maintainers = with maintainers; [ veprbl dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/imgdiff/default.nix b/nixpkgs/pkgs/development/python-modules/imgdiff/default.nix
new file mode 100644
index 000000000000..586ed19b2572
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imgdiff/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pillow
+, mock
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "imgdiff";
+  version = "1.7.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "mgedmin";
+    repo = "imgdiff";
+    rev = version;
+    hash = "sha256-Y5nUnjihRpVVehhP1LUgfuJN5nCxEJu6P1w99Igpxjs=";
+  };
+
+  propagatedBuildInputs = [
+    pillow
+  ];
+
+  pythonImportsCheck = [ "imgdiff" ];
+
+  nativeCheckInputs = [
+    mock
+    unittestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Compare two images side-by-side";
+    homepage = "https://github.com/mgedmin/imgdiff";
+    changelog = "https://github.com/mgedmin/imgdiff/blob/${src.rev}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ evils ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/imgsize/default.nix b/nixpkgs/pkgs/development/python-modules/imgsize/default.nix
new file mode 100644
index 000000000000..a8f50cd8f326
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imgsize/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "imgsize";
+  version = "2.1";
+
+  src = fetchFromGitHub {
+    owner = "ojii";
+    repo = pname;
+    rev = version;
+    sha256 = "0k24qj4i996fz7lpjrs36il6lp51rh13b0j2wip87cy5v9109m2d";
+  };
+
+  meta = with lib; {
+    description = "Pure Python image size library";
+    homepage = "https://github.com/ojii/imgsize";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ twey ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/imgtool/default.nix b/nixpkgs/pkgs/development/python-modules/imgtool/default.nix
new file mode 100644
index 000000000000..54bd8026d9a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imgtool/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, cbor2
+, click
+, cryptography
+, intelhex
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "imgtool";
+  version = "2.0.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-elQSVeae7B8Sqjjc4fHU/iDYISZ3xoqbbsY0ypGgZhI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    cbor2
+    click
+    cryptography
+    intelhex
+    pyyaml
+  ];
+
+  pythonImportsCheck = [
+    "imgtool"
+  ];
+
+  meta = with lib; {
+    description = "MCUboot's image signing and key management";
+    homepage = "https://github.com/mcu-tools/mcuboot";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ samueltardieu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iminuit/default.nix b/nixpkgs/pkgs/development/python-modules/iminuit/default.nix
new file mode 100644
index 000000000000..3969b1c9ca51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iminuit/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+# build-system
+, cmake
+, scikit-build-core
+, pybind11
+, pathspec
+, ninja
+, pyproject-metadata
+
+# dependencies
+, numpy
+
+# tests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "iminuit";
+  version = "2.24.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JatjHDyOAksbzHyW9mM4yqxUpKIyTVXx47pWF4FuRP0=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    scikit-build-core
+    pybind11
+    pathspec
+    ninja
+    pyproject-metadata
+  ] ++ scikit-build-core.optional-dependencies.pyproject;
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/scikit-hep/iminuit";
+    description = "Python interface for the Minuit2 C++ library";
+    license = with licenses; [ mit lgpl2Only ];
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/immutabledict/default.nix b/nixpkgs/pkgs/development/python-modules/immutabledict/default.nix
new file mode 100644
index 000000000000..555fa80acd64
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/immutabledict/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "immutabledict";
+  version = "3.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "corenting";
+    repo = "immutabledict";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-DsvKtiy9sawGKpQu3f5OMUtE2Emq3Br8FupopUcLVew=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  pythonImportsCheck = [
+    "immutabledict"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A fork of frozendict, an immutable wrapper around dictionaries";
+    homepage = "https://github.com/corenting/immutabledict";
+    changelog = "https://github.com/corenting/immutabledict/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/immutables/default.nix b/nixpkgs/pkgs/development/python-modules/immutables/default.nix
new file mode 100644
index 000000000000..c01fa75e5447
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/immutables/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "immutables";
+  version = "0.20";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "MagicStack";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-fEECtP6WQVzwSzBYX+CbhQtzkB/1WC3OYKXk2XY//xA=";
+  };
+
+  postPatch = ''
+    rm tests/conftest.py
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Version mismatch
+    "testMypyImmu"
+  ];
+
+  disabledTestPaths = [
+    # avoid dependency on mypy
+    "tests/test_mypy.py"
+  ];
+
+  pythonImportsCheck = [
+    "immutables"
+  ];
+
+  meta = with lib; {
+    description = "An immutable mapping type";
+    homepage = "https://github.com/MagicStack/immutables";
+    changelog = "https://github.com/MagicStack/immutables/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ catern ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/impacket/default.nix b/nixpkgs/pkgs/development/python-modules/impacket/default.nix
new file mode 100644
index 000000000000..7c7542252601
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/impacket/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, charset-normalizer
+, dsinternals
+, fetchPypi
+, flask
+, ldapdomaindump
+, pyasn1
+, pycryptodomex
+, pyopenssl
+, pythonOlder
+, setuptools
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "impacket";
+  version = "0.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7kA5tNKu3o9fZEeLxZ+qyGA2eWviTeqNwY8An7CQXko=";
+  };
+
+  propagatedBuildInputs = [
+    charset-normalizer
+    dsinternals
+    flask
+    ldapdomaindump
+    pyasn1
+    pycryptodomex
+    pyopenssl
+    setuptools
+    six
+  ];
+
+  # RecursionError: maximum recursion depth exceeded
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "impacket"
+  ];
+
+  meta = with lib; {
+    description = "Network protocols Constructors and Dissectors";
+    homepage = "https://github.com/SecureAuthCorp/impacket";
+    changelog = "https://github.com/fortra/impacket/releases/tag/impacket_"
+      + replaceStrings [ "." ] [ "_" ] version;
+    # Modified Apache Software License, Version 1.1
+    license = licenses.free;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/importlab/default.nix b/nixpkgs/pkgs/development/python-modules/importlab/default.nix
new file mode 100644
index 000000000000..8fd01ca7008e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/importlab/default.nix
@@ -0,0 +1,35 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, networkx
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "importlab";
+  version = "0.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-s4k4U7H26wJ9pQnDtA5nh+ld1mtLZvGzYTqtd1VuFGU=";
+  };
+
+  propagatedBuildInputs = [ networkx ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  disabledTestPaths = [ "tests/test_parsepy.py" ];
+
+  # Test fails on darwin filesystem
+  disabledTests = [ "testIsDir" ];
+
+  pythonImportsCheck = [ "importlab" ];
+
+  meta = with lib; {
+    description = "A library that automatically infers dependencies for Python files";
+    homepage = "https://github.com/google/importlab";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sei40kr ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/importlib-metadata/default.nix b/nixpkgs/pkgs/development/python-modules/importlib-metadata/default.nix
new file mode 100644
index 000000000000..b4c20163cb7a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/importlib-metadata/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, setuptools-scm
+, typing-extensions
+, toml
+, zipp
+}:
+
+buildPythonPackage rec {
+  pname = "importlib-metadata";
+  version = "6.8.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "importlib_metadata";
+    inherit version;
+    hash = "sha256-26zniS2MDErBrQlmYiMvgx1OZPTEVFvVMBaj6dRlR0M=";
+  };
+
+  nativeBuildInputs = [
+    setuptools # otherwise cross build fails
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    toml
+    zipp
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  # Cyclic dependencies due to pyflakefs
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "importlib_metadata"
+  ];
+
+  meta = with lib; {
+    description = "Read metadata from Python packages";
+    homepage = "https://importlib-metadata.readthedocs.io/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab AndersonTorres ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/importlib-resources/default.nix b/nixpkgs/pkgs/development/python-modules/importlib-resources/default.nix
new file mode 100644
index 000000000000..8b6afb522b6a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/importlib-resources/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, isPy27
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, importlib-metadata
+, typing ? null
+, pythonOlder
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "importlib-resources";
+  version = "6.0.1";
+  format = "pyproject";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    pname = "importlib_resources";
+    inherit version;
+    hash = "sha256-Q1lFfkJwhGK5YmoEZXxiCK15nOtB5cWMV/+g5qCYpdQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    importlib-metadata
+  ] ++ lib.optionals (pythonOlder "3.5") [
+    typing
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "importlib_resources"
+  ];
+
+  meta = with lib; {
+    description = "Read resources from Python packages";
+    homepage = "https://importlib-resources.readthedocs.io/";
+    license = licenses.asl20;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/importmagic/default.nix b/nixpkgs/pkgs/development/python-modules/importmagic/default.nix
new file mode 100644
index 000000000000..6e4c00c286e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/importmagic/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "importmagic";
+  version = "0.1.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3f7757a5b74c9a291e20e12023bb3bf71bc2fa3adfb15a08570648ab83eaf8d8";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "importmagic" ];
+
+  meta = with lib; {
+    description = "Python Import Magic - automagically add, remove and manage imports";
+    homepage = "https://github.com/alecthomas/importmagic";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ onny ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/imread/default.nix b/nixpkgs/pkgs/development/python-modules/imread/default.nix
new file mode 100644
index 000000000000..9d5ea1bebd20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imread/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, pkg-config
+, libjpeg
+, libpng
+, libtiff
+, libwebp
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "python-imread";
+  version = "0.7.4";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "imread";
+    sha256 = "0kvlpy62vc16i0mysv1b2gv746in41q75hb815q6h8d227psv1q4";
+  };
+
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ nose libjpeg libpng libtiff libwebp ];
+  propagatedBuildInputs = [ numpy ];
+
+  meta = with lib; {
+    description = "Python package to load images as numpy arrays";
+    homepage = "https://imread.readthedocs.io/en/latest/";
+    maintainers = with maintainers; [ luispedro ];
+    license = licenses.mit;
+    platforms = platforms.unix;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/imutils/default.nix b/nixpkgs/pkgs/development/python-modules/imutils/default.nix
new file mode 100644
index 000000000000..b655ddc47014
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/imutils/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, opencv4
+}:
+
+buildPythonPackage rec {
+  version = "0.5.4";
+  pname = "imutils";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "03827a9fca8b5c540305c0844a62591cf35a0caec199cb0f2f0a4a0fb15d8f24";
+  };
+
+  propagatedBuildInputs = [ opencv4 ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "imutils"
+    "imutils.video"
+    "imutils.io"
+    "imutils.feature"
+    "imutils.face_utils"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jrosebr1/imutils";
+    description = "A series of convenience functions to make basic image processing functions";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/in-n-out/default.nix b/nixpkgs/pkgs/development/python-modules/in-n-out/default.nix
new file mode 100644
index 000000000000..b35e4588a4dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/in-n-out/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, cython_3
+, fetchPypi
+, future
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, hatchling
+, hatch-vcs
+, toolz
+}:
+
+buildPythonPackage rec {
+  pname = "in-n-out";
+  version = "0.1.9";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "in_n_out";
+    inherit version;
+    hash = "sha256-if65ROQg+vQtPCVCFFaBtNVxRDVZMsK4WWlfzcT5oto=";
+  };
+
+  nativeBuildInputs = [
+    cython_3
+    hatchling
+    hatch-vcs
+  ];
+
+  propagatedBuildInputs = [
+    future
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    toolz
+  ];
+
+  pythonImportsCheck = [
+    "in_n_out"
+  ];
+
+  disabledTestPaths = lib.optionals (pythonAtLeast "3.11") [
+    # Fatal Python error
+    "tests/test_injection.py"
+    "tests/test_processors.py"
+    "tests/test_providers.py"
+    "tests/test_store.py"
+  ];
+
+  meta = with lib; {
+    description = "Module for dependency injection and result processing";
+    homepage = "https://github.com/pyapp-kit/in-n-out";
+    changelog = "https://github.com/pyapp-kit/in-n-out/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/in-place/default.nix b/nixpkgs/pkgs/development/python-modules/in-place/default.nix
new file mode 100644
index 000000000000..324cd61537fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/in-place/default.nix
@@ -0,0 +1,42 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "in-place";
+  version = "1.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "jwodder";
+    repo = "inplace";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-TfWfSb1GslzcT30/xvBg5Xui7ptp7+g89Fq/giLCoQ8=";
+  };
+
+  postPatch = ''
+    substituteInPlace tox.ini --replace "--cov=in_place --no-cov-on-fail" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "in_place" ];
+
+  meta = with lib; {
+    description = "In-place file processing";
+    homepage = "https://github.com/jwodder/inplace";
+    changelog = "https://github.com/jwodder/inplace/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/incomfort-client/default.nix b/nixpkgs/pkgs/development/python-modules/incomfort-client/default.nix
new file mode 100644
index 000000000000..496c98488910
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/incomfort-client/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "incomfort-client";
+  version = "0.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "zxdavb";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-kdPue3IfF85O+0dgvX+dN6S4WoQmjxdCfwfv83SnO8E=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  checkInputs = [
+    aioresponses
+    pytest-asyncio
+  ];
+
+  pythonImportsCheck = [
+    "incomfortclient"
+  ];
+
+  meta = with lib; {
+    description = "Python module to poll Intergas boilers via a Lan2RF gateway";
+    homepage = "https://github.com/zxdavb/incomfort-client";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/incremental/default.nix b/nixpkgs/pkgs/development/python-modules/incremental/default.nix
new file mode 100644
index 000000000000..3498b4935ce8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/incremental/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, click
+, twisted
+}:
+
+let incremental = buildPythonPackage rec {
+  pname = "incremental";
+  version = "22.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-kS/uteD34BiOb0IkHS9FAALhG7wJN8ZYZQRYVMJMC9A=";
+  };
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  # escape infinite recursion with twisted
+  doCheck = false;
+
+  nativeCheckInputs = [
+    twisted
+  ];
+
+  checkPhase = ''
+    trial incremental
+  '';
+
+  passthru.tests = {
+    check = incremental.overridePythonAttrs (_: { doCheck = true; });
+  };
+
+  pythonImportsCheck = [ "incremental" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/twisted/incremental";
+    description = "Incremental is a small library that versions your Python projects";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}; in incremental
diff --git a/nixpkgs/pkgs/development/python-modules/indexed-bzip2/default.nix b/nixpkgs/pkgs/development/python-modules/indexed-bzip2/default.nix
new file mode 100644
index 000000000000..d6c82e3aec9a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/indexed-bzip2/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "indexed_bzip2";
+  version = "1.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-tKf9odadfQZQYJz//vWYpeB99Z8VLg+hEPvfEHXgdnM=";
+  };
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "indexed_bzip2" ];
+
+  meta = with lib; {
+    description = "Python library for parallel decompression and seeking within compressed bzip2 files";
+    homepage = "https://github.com/mxmlnkn/indexed_bzip2";
+    license = licenses.mit; # dual MIT and asl20, https://internals.rust-lang.org/t/rationale-of-apache-dual-licensing/8952
+    maintainers = with lib.maintainers; [ mxmlnkn ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/indexed-gzip/default.nix b/nixpkgs/pkgs/development/python-modules/indexed-gzip/default.nix
new file mode 100644
index 000000000000..73ad916f35f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/indexed-gzip/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, cython
+, zlib
+}:
+
+buildPythonPackage rec {
+  pname = "indexed_gzip";
+  version = "1.8.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-h9JgYq9KxmknaRuMgq+5YWA8tUaFk+lclkqdNAnr/cI=";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  buildInputs = [ zlib ];
+
+  # Too complicated to get to work, not a simple pytest call.
+  doCheck = false;
+
+  pythonImportsCheck = [ "indexed_gzip" ];
+
+  meta = with lib; {
+    description = "Python library to seek within compressed gzip files";
+    homepage = "https://github.com/pauldmccarthy/indexed_gzip";
+    license = licenses.zlib;
+    maintainers = with lib.maintainers; [ mxmlnkn ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/indexed-zstd/default.nix b/nixpkgs/pkgs/development/python-modules/indexed-zstd/default.nix
new file mode 100644
index 000000000000..f9d643c8ff49
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/indexed-zstd/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, cython
+, zstd
+}:
+
+buildPythonPackage rec {
+  pname = "indexed_zstd";
+  version = "1.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-icCerrv6ihBjSTS4Fsw7qhoA5ha8yegfMVRiIOhTvvY=";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  buildInputs = [ zstd.dev ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "indexed_zstd" ];
+
+  meta = with lib; {
+    description = "Python library to seek within compressed zstd files";
+    homepage = "https://github.com/martinellimarco/indexed_zstd";
+    license = licenses.mit;
+    maintainers = with lib.maintainers; [ mxmlnkn ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/infinity/default.nix b/nixpkgs/pkgs/development/python-modules/infinity/default.nix
new file mode 100644
index 000000000000..366572cedacb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/infinity/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "infinity";
+  version = "1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1npcc4adcc3c9diw4kgmd5c0ikym1iz364p2zp6gs011rqaprald";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    six
+  ];
+
+  meta = with lib; {
+    description = "All-in-one infinity value for Python. Can be compared to any object.";
+    homepage = "https://github.com/kvesteri/infinity";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ mupdt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/inflect/default.nix b/nixpkgs/pkgs/development/python-modules/inflect/default.nix
new file mode 100644
index 000000000000..10f5a56763ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inflect/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, setuptools-scm
+, pydantic
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "inflect";
+  version = "7.0.0";
+  disabled = isPy27;
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Y9qTJa0p2oHsI+BVtBIleVq3k7TstIO+XcH6Nj/UcX4=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ pydantic ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "inflect" ];
+
+  meta = with lib; {
+    description = "Correctly generate plurals, singular nouns, ordinals, indefinite articles";
+    homepage = "https://github.com/jaraco/inflect";
+    changelog = "https://github.com/jaraco/inflect/blob/v${version}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/inflection/default.nix b/nixpkgs/pkgs/development/python-modules/inflection/default.nix
new file mode 100644
index 000000000000..01dd785e4184
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inflection/default.nix
@@ -0,0 +1,24 @@
+{ lib, fetchPypi, buildPythonPackage, isPy27, pytest } :
+
+buildPythonPackage rec {
+  pname = "inflection";
+  version = "0.5.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+   inherit pname version;
+   sha256 = "1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417";
+  };
+
+  nativeCheckInputs = [ pytest ];
+  # Suppress overly verbose output if tests run successfully
+  checkPhase = "pytest >/dev/null || pytest";
+
+  meta = {
+   homepage = "https://github.com/jpvanhal/inflection";
+   description = "A port of Ruby on Rails inflector to Python";
+   maintainers = with lib.maintainers; [ NikolaMandic ilya-kolpakov ];
+   license = lib.licenses.mit;
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/influxdb-client/default.nix b/nixpkgs/pkgs/development/python-modules/influxdb-client/default.nix
new file mode 100644
index 000000000000..5bc9ba395063
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/influxdb-client/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, aiohttp
+, aiocsv
+, buildPythonPackage
+, certifi
+, ciso8601
+, fetchFromGitHub
+, numpy
+, pandas
+, python-dateutil
+, pythonOlder
+, reactivex
+, setuptools
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "influxdb-client";
+  version = "1.38.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "influxdata";
+    repo = "influxdb-client-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-oE0RPryuUJcy6HN3V2XIxipGYU41xrYMC7b0sGRfay8=";
+  };
+
+  propagatedBuildInputs = [
+    certifi
+    python-dateutil
+    reactivex
+    setuptools
+    urllib3
+  ];
+
+  passthru.optional-dependencies = {
+    async = [
+      aiocsv
+      aiohttp
+    ];
+    ciso = [
+      ciso8601
+    ];
+    extra = [
+      numpy
+      pandas
+    ];
+  };
+
+  # Requires influxdb server
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "influxdb_client"
+  ];
+
+  meta = with lib; {
+    description = "InfluxDB client library";
+    homepage = "https://github.com/influxdata/influxdb-client-python";
+    changelog = "https://github.com/influxdata/influxdb-client-python/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/influxdb/default.nix b/nixpkgs/pkgs/development/python-modules/influxdb/default.nix
new file mode 100644
index 000000000000..e270df9746d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/influxdb/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, python-dateutil
+, fetchPypi
+, mock
+, msgpack
+, nose
+, pandas
+, pytestCheckHook
+, pytz
+, requests
+, requests-mock
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "influxdb";
+  version = "5.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ymjv322mv6y424fmpd70f87152w55mbwwj6i7p3sjzf0ixmxy26";
+  };
+
+  postPatch = ''
+    for f in influxdb/tests/dataframe_client_test.py influxdb/tests/influxdb08/dataframe_client_test.py; do
+      substituteInPlace "$f" \
+        --replace "pandas.util.testing" "pandas.testing"
+    done
+  '';
+
+  propagatedBuildInputs = [
+    requests
+    python-dateutil
+    pytz
+    six
+    msgpack
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests-mock
+    mock
+    nose
+    pandas
+  ];
+
+  disabledTests = [
+    # Tests cause FutureWarning due to use of 'record' instead of 'records' in pandas.
+    #   https://github.com/influxdata/influxdb-python/pull/845
+    # Also type mismatches in assertEqual on DataFrame:
+    #   b'foo[30 chars]_one=1.0,column_two=1.0 0\nfoo,tag_one=red,tag[47 chars]00\n' !=
+    #   b'foo[30 chars]_one="1",column_two=1i 0\nfoo,tag_one=red,tag_[46 chars]00\n'
+    "test_write_points_from_dataframe_with_nan_json"
+    "test_write_points_from_dataframe_with_tags_and_nan_json"
+    "test_write_points_from_dataframe_with_numeric_precision"
+    # Reponse is not empty but `s = '孝'` and the JSON decoder chokes on that
+    "test_query_with_empty_result"
+    # Pandas API changes cause it to no longer infer datetimes in the expected manner
+    "test_multiquery_into_dataframe"
+    "test_multiquery_into_dataframe_dropna"
+  ];
+
+  pythonImportsCheck = [ "influxdb" ];
+
+  meta = with lib; {
+    description = "Python client for InfluxDB";
+    homepage = "https://github.com/influxdb/influxdb-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/inform/default.nix b/nixpkgs/pkgs/development/python-modules/inform/default.nix
new file mode 100644
index 000000000000..a95e9e9cc8e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inform/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, arrow
+, six
+, hypothesis
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "inform";
+  version = "1.28";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "KenKundert";
+    repo = "inform";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-RA8/or3HTS/rQmG4A/Eg5j24YElaTEpnHa1yksARVMQ=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    arrow
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    hypothesis
+  ];
+
+  disabledTests = [
+    "test_prostrate"
+  ];
+
+  meta = with lib; {
+    description = "Print and logging utilities";
+    longDescription = ''
+      Inform is designed to display messages from programs that are typically
+      run from a console. It provides a collection of ‘print’ functions that
+      allow you to simply and cleanly print different types of messages.
+    '';
+    homepage = "https://inform.readthedocs.io";
+    changelog = "https://github.com/KenKundert/inform/blob/v${version}/doc/releases.rst";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ jeremyschlatter ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iniconfig/default.nix b/nixpkgs/pkgs/development/python-modules/iniconfig/default.nix
new file mode 100644
index 000000000000..b9c6e8e205fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iniconfig/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, substituteAll
+, fetchPypi
+, hatch-vcs
+, hatchling
+}:
+
+buildPythonPackage rec {
+  pname = "iniconfig";
+  version = "2.0.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-LZHhNb9y0xpBCxfBbaYQqCy1X2sEd9GpAhNLJKRVuLM=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  patches = [
+    # Cannot use hatch-vcs, due to an inifinite recursion
+    (substituteAll {
+      src = ./version.patch;
+      inherit version;
+    })
+  ];
+
+  pythonImportsCheck = [
+    "iniconfig"
+  ];
+
+  # Requires pytest, which in turn requires this package - causes infinite
+  # recursion. See also: https://github.com/NixOS/nixpkgs/issues/63168
+  doCheck = false;
+
+  meta = with lib; {
+    description = "brain-dead simple parsing of ini files";
+    homepage = "https://github.com/pytest-dev/iniconfig";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iniconfig/version.patch b/nixpkgs/pkgs/development/python-modules/iniconfig/version.patch
new file mode 100644
index 000000000000..a075464046fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iniconfig/version.patch
@@ -0,0 +1,42 @@
+diff --git a/pyproject.toml b/pyproject.toml
+index 6eee6ef..263999f 100644
+--- a/pyproject.toml
++++ b/pyproject.toml
+@@ -1,12 +1,12 @@
+ [build-system]
+ build-backend = "hatchling.build"
+ requires = [
+-  "hatch-vcs",
+   "hatchling",
+ ]
+ 
+ [project]
+ name = "iniconfig"
++version = "@version@"
+ description = "brain-dead simple config-ini parsing"
+ readme = "README.rst"
+ license = "MIT"
+@@ -15,9 +15,6 @@ authors = [
+     { name = "Holger Krekel", email = "holger.krekel@gmail.com" },
+ ]
+ requires-python = ">=3.7"
+-dynamic = [
+-  "version",
+-]
+ classifiers = [
+     "Development Status :: 4 - Beta",
+     "Intended Audience :: Developers",
+@@ -38,13 +35,6 @@ classifiers = [
+ [project.urls]
+ Homepage = "https://github.com/pytest-dev/iniconfig"
+ 
+-
+-[tool.hatch.version]
+-source = "vcs"
+-
+-[tool.hatch.build.hooks.vcs]
+-version-file = "src/iniconfig/_version.py"
+-
+ [tool.hatch.build.targets.sdist]
+ include = [
+     "/src",
diff --git a/nixpkgs/pkgs/development/python-modules/inifile/default.nix b/nixpkgs/pkgs/development/python-modules/inifile/default.nix
new file mode 100644
index 000000000000..0e9cb91ded9e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inifile/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "inifile";
+  version = "0.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d9e5eb4708ebf13353c4cfce798ad47890a8bcc5fbae04630223d15d79f55e96";
+  };
+
+  meta = with lib; {
+    description = "A small INI library for Python";
+    homepage    = "https://github.com/mitsuhiko/python-inifile";
+    license     = licenses.bsd0;
+    maintainers = with maintainers; [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iniparse/default.nix b/nixpkgs/pkgs/development/python-modules/iniparse/default.nix
new file mode 100644
index 000000000000..e4473c0bd1c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iniparse/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "iniparse";
+  version = "0.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "932e5239d526e7acb504017bb707be67019ac428a6932368e6851691093aa842";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} runtests.py
+  '';
+
+  propagatedBuildInputs = [ six ];
+
+  # Does not install tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Accessing and Modifying INI files";
+    homepage = "https://github.com/candlepin/python-iniparse";
+    license = licenses.mit;
+    maintainers = with maintainers; [ danbst ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/injector/default.nix b/nixpkgs/pkgs/development/python-modules/injector/default.nix
new file mode 100644
index 000000000000..1f15e496f5cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/injector/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, typing-extensions
+, pytestCheckHook
+, pytest-cov
+}:
+
+buildPythonPackage rec {
+  pname = "injector";
+  version = "0.21.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "python-injector";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-5O4vJSXfYNTrUzmv5XuT9pSUndNSvTZTxfVwiAd+0ck=";
+  };
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.9") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-cov
+  ];
+
+  pythonImportsCheck = [ "injector" ];
+
+  meta = with lib; {
+    description = "Python dependency injection framework, inspired by Guice";
+    homepage = "https://github.com/alecthomas/injector";
+    maintainers = [ maintainers.ivar ];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/inkbird-ble/default.nix b/nixpkgs/pkgs/development/python-modules/inkbird-ble/default.nix
new file mode 100644
index 000000000000..fc5eb2d12ba4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inkbird-ble/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, bluetooth-data-tools
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, fetchFromGitHub
+, home-assistant-bluetooth
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "inkbird-ble";
+  version = "0.5.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-re5HjPtssFkpcltCr0HEJmJyHbXJdkr2wDgaAHfy2Tk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-data-tools
+    bluetooth-sensor-state-data
+    home-assistant-bluetooth
+    sensor-state-data
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=inkbird_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "inkbird_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for Inkbird BLE devices";
+    homepage = "https://github.com/Bluetooth-Devices/inkbird-ble";
+    changelog = "https://github.com/Bluetooth-Devices/inkbird-ble/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/inkex/default.nix b/nixpkgs/pkgs/development/python-modules/inkex/default.nix
new file mode 100644
index 000000000000..4d04618ec3e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inkex/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, buildPythonPackage
+, inkscape
+, fetchFromGitLab
+, poetry-core
+, cssselect
+, lxml
+, numpy
+, packaging
+, pillow
+, pygobject3
+, pyparsing
+, pyserial
+, scour
+, gobject-introspection
+, pytestCheckHook
+, gtk3
+}:
+
+buildPythonPackage {
+  pname = "inkex";
+  inherit (inkscape) version;
+
+  format = "pyproject";
+
+  inherit (inkscape) src;
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    cssselect
+    lxml
+    numpy
+    pygobject3
+    pyserial
+  ];
+
+  pythonImportsCheck = [ "inkex" ];
+
+  nativeCheckInputs = [
+    gobject-introspection
+    pytestCheckHook
+  ];
+
+  checkInputs = [
+    gtk3
+    packaging
+    pillow
+    pyparsing
+    scour
+  ];
+
+  disabledTests = [
+    "test_extract_multiple"
+    "test_lookup_and"
+  ];
+
+  disabledTestPaths = [
+    # Fatal Python error: Segmentation fault
+    "tests/test_inkex_gui.py"
+    "tests/test_inkex_gui_listview.py"
+    "tests/test_inkex_gui_window.py"
+    # Failed to find pixmap 'image-missing' in /build/source/tests/data/
+    "tests/test_inkex_gui_pixmaps.py"
+  ];
+
+  postPatch = ''
+    cd share/extensions
+
+    substituteInPlace pyproject.toml \
+      --replace 'scour = "^0.37"' 'scour = ">=0.37"'
+  '';
+
+  meta = {
+    description = "Library for manipulating SVG documents which is the basis for Inkscape extensions";
+    homepage = "https://gitlab.com/inkscape/extensions";
+    license = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/inlinestyler/default.nix b/nixpkgs/pkgs/development/python-modules/inlinestyler/default.nix
new file mode 100644
index 000000000000..c4cc47fabfa4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inlinestyler/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# dependencies
+, cssutils
+, lxml
+, requests
+
+# tests
+, ipdb
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "inlinestyler";
+  version = "0.2.5";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "dlanger";
+    repo = "inlinestyler";
+    rev = version;
+    hash = "sha256-9TKXqW+5SiiNXnHW2lOVh3zhFhodM7a1UB2yXsEuX3I=";
+  };
+
+  propagatedBuildInputs = [
+    cssutils
+    lxml
+    requests
+  ];
+
+  pythonImportsCheck = [
+    "inlinestyler"
+  ];
+
+  nativeCheckInputs = [
+    ipdb
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A simple CSS inliner for generating HTML email messages";
+    homepage = "https://github.com/dlanger/inlinestyler";
+    changelog = "https://github.com/dlanger/inlinestyler/blob/${src.rev}/CHANGELOG";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/inotify-simple/default.nix b/nixpkgs/pkgs/development/python-modules/inotify-simple/default.nix
new file mode 100644
index 000000000000..8fdc7c4926c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inotify-simple/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "inotify-simple";
+  version = "1.3.5";
+
+  src = fetchPypi {
+    pname = "inotify_simple";
+    inherit version;
+    sha256 = "0a61bh087cq5wfrvz680hg5pmykb9gmy26kwyn6ims2akkjgyh44";
+  };
+
+  # The package has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "inotify_simple" ];
+
+  meta = with lib; {
+    description = "A simple Python wrapper around inotify";
+    homepage = "https://github.com/chrisjbillington/inotify_simple";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ erikarvstedt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/inotify/default.nix b/nixpkgs/pkgs/development/python-modules/inotify/default.nix
new file mode 100644
index 000000000000..64737035193b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inotify/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "inotify";
+  version = "unstable-2020-08-27";
+
+  src = fetchFromGitHub {
+    owner = "dsoprea";
+    repo = "PyInotify";
+    rev = "f77596ae965e47124f38d7bd6587365924dcd8f7";
+    sha256 = "X0gu4s1R/Kg+tmf6s8SdZBab2HisJl4FxfdwKktubVc=";
+    fetchSubmodules = false;
+  };
+
+  nativeCheckInputs = [
+    nose
+  ];
+
+  # dunno what's wrong but the module works regardless
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/dsoprea/PyInotify";
+    description = "Monitor filesystems events on Linux platforms with inotify";
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/inotifyrecursive/default.nix b/nixpkgs/pkgs/development/python-modules/inotifyrecursive/default.nix
new file mode 100644
index 000000000000..d0f81abaa47f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inotifyrecursive/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, inotify-simple
+}:
+
+buildPythonPackage rec {
+  pname = "inotifyrecursive";
+  version = "0.3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "osRQsxdpPkU4QW+Q6x14WFBtr+a4uIUDe9LdmuLa+h4=";
+  };
+
+  propagatedBuildInputs = [ inotify-simple ];
+
+  # No tests included
+  doCheck = false;
+  pythonImportsCheck = [ pname ];
+
+  meta = with lib; {
+    description = "Simple recursive inotify watches for Python";
+    homepage = "https://github.com/letorbi/inotifyrecursive";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ Flakebi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/inquirer/default.nix b/nixpkgs/pkgs/development/python-modules/inquirer/default.nix
new file mode 100644
index 000000000000..1d13d50804af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inquirer/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# native
+, poetry-core
+
+# propagated
+, blessed
+, python-editor
+, readchar
+
+# tests
+, pytest-mock
+, pytestCheckHook
+, pexpect
+}:
+
+buildPythonPackage rec {
+  pname = "inquirer";
+  version = "3.1.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub rec {
+    owner = "magmax";
+    repo = "python-inquirer";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-7GfHsCQgnDUdiM1z9YNdDuwMNy6rLjR1UTnZMgpQ5k4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    blessed
+    python-editor
+    readchar
+  ];
+
+  nativeCheckInputs = [
+    pexpect
+    pytest-mock
+    pytestCheckHook
+  ];
+
+
+  pythonImportsCheck = [
+    "inquirer"
+  ];
+
+  meta = with lib; {
+    description = "A collection of common interactive command line user interfaces, based on Inquirer.js";
+    homepage = "https://github.com/magmax/python-inquirer";
+    changelog = "https://github.com/magmax/python-inquirer/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mmahut ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/inquirerpy/default.nix b/nixpkgs/pkgs/development/python-modules/inquirerpy/default.nix
new file mode 100644
index 000000000000..c5460abaf7b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inquirerpy/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, furo
+, myst-parser
+, pfzy
+, poetry-core
+, prompt-toolkit
+, pytestCheckHook
+, pythonOlder
+, sphinx
+, sphinx-autobuild
+, sphinx-copybutton
+}:
+
+buildPythonPackage rec {
+  pname = "inquirerpy";
+  version = "0.3.4";
+  format = "pyproject";
+
+
+  src = fetchFromGitHub {
+    owner = "kazhala";
+    repo = "InquirerPy";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Ap0xZHEU458tjm6oEN5EtDoSRlnpZ7jvDq1L7fTlQQc=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pfzy
+    prompt-toolkit
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "InquirerPy"
+  ];
+
+  disabledTestPaths = [
+    # AttributeError: '_GeneratorContextManager' object has no attribute 'close'
+    "tests/prompts/"
+    "tests/base/test_simple.py"
+    "tests/base/test_complex.py"
+    "tests/base/test_list.py"
+  ];
+
+
+  meta = with lib; {
+    description = "Python port of Inquirer.js";
+    homepage = "https://github.com/kazhala/InquirerPy";
+    changelog = "https://github.com/kazhala/InquirerPy/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/inscriptis/default.nix b/nixpkgs/pkgs/development/python-modules/inscriptis/default.nix
new file mode 100644
index 000000000000..e62e7f17e874
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/inscriptis/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, lxml
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "inscriptis";
+  version = "2.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "weblyzard";
+    repo = "inscriptis";
+    rev = "refs/tags/${version}";
+    hash = "sha256-grsyHqt7ahiNsYKcZN/c5cJaag/nTWTBcaHaXnW1SpU=";
+  };
+
+  propagatedBuildInputs = [
+    lxml
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "inscriptis"
+  ];
+
+  meta = with lib; {
+    description = "HTML to text converter";
+    homepage = "https://github.com/weblyzard/inscriptis";
+    changelog = "https://github.com/weblyzard/inscriptis/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/insegel/default.nix b/nixpkgs/pkgs/development/python-modules/insegel/default.nix
new file mode 100644
index 000000000000..499d38067539
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/insegel/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, pygments }:
+
+buildPythonPackage rec {
+  pname = "insegel";
+  version = "1.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1d055dd64f6eb335580a485271511ba2f4e3b5e315f48f827f58da3cace4b4ae";
+  };
+
+  propagatedBuildInputs = [ pygments ];
+
+  # No tests included
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "insegel"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/autophagy/insegel";
+    description = "A monochrome 2 column Sphinx theme";
+    license = licenses.mit;
+    maintainers = with maintainers; [ autophagy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/insightface/default.nix b/nixpkgs/pkgs/development/python-modules/insightface/default.nix
new file mode 100644
index 000000000000..6d5c4a66239c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/insightface/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, albumentations
+, buildPythonPackage
+, cython
+, easydict
+, fetchPypi
+, insightface
+, matplotlib
+, mxnet
+, numpy
+, onnx
+, onnxruntime
+, opencv4
+, prettytable
+, pythonOlder
+, scikit-image
+, scikit-learn
+, tensorboard
+, testers
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "insightface";
+  version = "0.7.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8ZH3GWEuuzcBj0GTaBRQBUTND4bm/NZ2wCPzVMZo3fc=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    easydict
+    matplotlib
+    mxnet
+    numpy
+    onnx
+    onnxruntime
+    opencv4
+    scikit-learn
+    scikit-image
+    tensorboard
+    tqdm
+    albumentations
+    prettytable
+  ];
+
+  pythonImportsCheck = [
+    "insightface"
+    "insightface.app"
+    "insightface.data"
+  ];
+
+  passthru.tests.version = testers.testVersion {
+    package = insightface;
+    command = "insightface-cli --help";
+    # Doesn't support --version but we still want to make sure the cli is executable
+    # and returns the help output
+    version = "help";
+  };
+
+  doCheck = false; # Upstream has no tests
+
+  meta = with lib; {
+    description = "State-of-the-art 2D and 3D Face Analysis Project";
+    homepage = "https://github.com/deepinsight/insightface";
+    license = licenses.mit;
+    maintainers = with maintainers; [ oddlama ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/installer/default.nix b/nixpkgs/pkgs/development/python-modules/installer/default.nix
new file mode 100644
index 000000000000..d4f1e33ca606
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/installer/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+, flit-core
+, installer
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "installer";
+  version = "0.7.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pypa";
+    repo = pname;
+    rev = version;
+    hash = "sha256-thHghU+1Alpay5r9Dc3v7ATRFfYKV8l9qR0nbGOOX/A=";
+  };
+
+  nativeBuildInputs = [ flit-core ];
+
+  # We need to disable tests because this package is part of the bootstrap chain
+  # and its test dependencies cannot be built yet when this is being built.
+  doCheck = false;
+
+  passthru.tests = {
+    pytest = buildPythonPackage {
+      pname = "${pname}-pytest";
+      inherit version;
+      format = "other";
+
+      dontBuild = true;
+      dontInstall = true;
+
+      nativeCheckInputs = [
+        installer
+        mock
+        pytestCheckHook
+      ];
+    };
+  };
+
+  meta = with lib; {
+    description = "A low-level library for installing a Python package from a wheel distribution";
+    homepage = "https://github.com/pypa/installer";
+    changelog = "https://github.com/pypa/installer/blob/${src.rev}/docs/changelog.md";
+    license = licenses.mit;
+    maintainers = teams.python.members ++ [ maintainers.cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/insteon-frontend-home-assistant/default.nix b/nixpkgs/pkgs/development/python-modules/insteon-frontend-home-assistant/default.nix
new file mode 100644
index 000000000000..2a6e9f0556a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/insteon-frontend-home-assistant/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "insteon-frontend-home-assistant";
+  version = "0.3.5-1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-R+P4pgKbLvf0mwpSDoujCvlJe/yS+nvSJ7ewLVOOg/0=";
+  };
+
+  patches = [
+    # https://github.com/pyinsteon/insteon-panel/pull/33
+    (fetchpatch {
+      name = "unpin-setuptools.patch";
+      url = "https://github.com/pyinsteon/insteon-panel/commit/2297eb05668907edd03633f244e5876990e340c7.patch";
+      hash = "sha256-kTu1+IwDrcdqelyK/vfhxw8MQBis5I1jag7YTytKQhs=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "insteon_frontend"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/pyinsteon/insteon-panel/releases/tag/${version}";
+    description = "The Insteon frontend for Home Assistant";
+    homepage = "https://github.com/pyinsteon/insteon-panel";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/intake-parquet/default.nix b/nixpkgs/pkgs/development/python-modules/intake-parquet/default.nix
new file mode 100644
index 000000000000..c43db08d9fc9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/intake-parquet/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pandas
+, dask
+, fastparquet
+, pyarrow
+}:
+
+buildPythonPackage rec {
+  pname = "intake-parquet";
+  version = "0.3.0";
+
+  src = fetchFromGitHub {
+    owner = "intake";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-zSwylXBKOM/tG5mwYtc0FmxwcKJ6j+lw1bxJqf57NY8=";
+  };
+
+  propagatedBuildInputs = [
+    pandas
+    dask
+    fastparquet
+    pyarrow
+  ];
+
+  postPatch = ''
+    # Break circular dependency
+    substituteInPlace requirements.txt \
+      --replace "intake" ""
+  '';
+
+  doCheck = false;
+
+  #pythonImportsCheck = [ "intake_parquet" ];
+
+  meta = with lib; {
+    description = "Parquet plugin for Intake";
+    homepage = "https://github.com/intake/intake-parquet";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/intake/default.nix b/nixpkgs/pkgs/development/python-modules/intake/default.nix
new file mode 100644
index 000000000000..d4f9c66806ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/intake/default.nix
@@ -0,0 +1,139 @@
+{ lib
+, appdirs
+, bokeh
+, buildPythonPackage
+, dask
+, entrypoints
+, fetchFromGitHub
+, fsspec
+, hvplot
+, intake-parquet
+, jinja2
+, msgpack
+, msgpack-numpy
+, pandas
+, panel
+, pyarrow
+, pytestCheckHook
+, python-snappy
+, pythonOlder
+, pyyaml
+, requests
+, stdenv
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "intake";
+  version = "0.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "intake";
+    repo = "intake";
+    rev = "refs/tags/${version}";
+    hash = "sha256-LK4abwPViEFJZ10bbRofF2aw2Mj0dliKwX6dFy93RVQ=";
+  };
+
+  propagatedBuildInputs = [
+    appdirs
+    dask
+    entrypoints
+    fsspec
+    msgpack
+    jinja2
+    pandas
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    intake-parquet
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  passthru.optional-dependencies = {
+    server = [
+      msgpack
+      python-snappy
+      tornado
+    ];
+    dataframe = [
+      msgpack-numpy
+      pyarrow
+    ];
+    plot = [
+      hvplot
+      bokeh
+      panel
+    ];
+    remote = [
+      requests
+    ];
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'" ""
+  '';
+
+  __darwinAllowLocalNetworking = true;
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+    export PATH="$PATH:$out/bin";
+  '';
+
+  disabledTests = [
+    # Disable tests which touch network
+    "http"
+    "test_address_flag"
+    "test_dir"
+    "test_discover"
+    "test_filtered_compressed_cache"
+    "test_flatten_flag"
+    "test_get_dir"
+    "test_pagination"
+    "test_port_flag"
+    "test_read_part_compressed"
+    "test_read_partition"
+    "test_read_pattern"
+    "test_remote_arr"
+    "test_remote_cat"
+    "test_remote_env"
+    # ValueError
+    "test_mlist_parameter"
+    # ImportError
+    "test_dataframe"
+    "test_ndarray"
+    "test_python"
+    # Timing-based, flaky on darwin and possibly others
+    "test_idle_timer"
+    # arrow-cpp-13 related
+    "test_read"
+    "test_pickle"
+    "test_read_dask"
+    "test_read_list"
+    "test_read_list_with_glob"
+    "test_to_dask"
+    "test_columns"
+    "test_df_transform"
+    "test_pipeline_apply"
+  ] ++ lib.optionals (stdenv.isDarwin && lib.versionOlder stdenv.hostPlatform.darwinMinVersion "10.13") [
+    # Flaky with older low-res mtime on darwin < 10.13 (#143987)
+    "test_second_load_timestamp"
+  ];
+
+  pythonImportsCheck = [
+    "intake"
+  ];
+
+  meta = with lib; {
+    description = "Data load and catalog system";
+    homepage = "https://github.com/ContinuumIO/intake";
+    changelog = "https://github.com/intake/intake/blob/${version}/docs/source/changelog.rst";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/intbitset/default.nix b/nixpkgs/pkgs/development/python-modules/intbitset/default.nix
new file mode 100644
index 000000000000..620ead1afe2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/intbitset/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "intbitset";
+  version = "3.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-owCy1aSYmFf/HQw5cWJHZqiadR4xWqCAwHhlAxrmN6c=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "intbitset"
+  ];
+
+  meta = with lib; {
+    description = "C-based extension implementing fast integer bit sets";
+    homepage = "https://github.com/inveniosoftware/intbitset";
+    changelog = "https://github.com/inveniosoftware-contrib/intbitset/blob/v${version}/CHANGELOG.rst";
+    license = licenses.lgpl3Plus;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/intelhex/default.nix b/nixpkgs/pkgs/development/python-modules/intelhex/default.nix
new file mode 100644
index 000000000000..57b8fe75d404
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/intelhex/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "intelhex";
+  version = "2.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-iStzYacZ9JRSN9qMz3VOlRPbMvViiFJ4WuoQjc0lAJM=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pytestFlagsArray = [ "intelhex/test.py" ];
+
+  pythonImportsCheck = [ "intelhex" ];
+
+  meta = {
+    homepage = "https://github.com/bialix/intelhex";
+    description = "Python library for Intel HEX files manipulations";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ pjones ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/intellifire4py/default.nix b/nixpkgs/pkgs/development/python-modules/intellifire4py/default.nix
new file mode 100644
index 000000000000..ff7dad6f0be0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/intellifire4py/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, aenum
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, poetry-core
+, pydantic
+, pytest-asyncio
+, pytest-httpx
+, pytestCheckHook
+, pythonOlder
+, rich
+}:
+
+buildPythonPackage rec {
+  pname = "intellifire4py";
+  version = "3.1.30";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jeeftor";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-CIcudKyRPVJX6QvWk6dBbYnO5EULREDhaflJTAfJEvc=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aenum
+    httpx
+    pydantic
+    rich
+  ];
+
+  pythonImportsCheck = [
+    "intellifire4py"
+  ];
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-httpx
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Module to read Intellifire fireplace status data";
+    homepage = "https://github.com/jeeftor/intellifire4py";
+    changelog = "https://github.com/jeeftor/intellifire4py/blob/${version}/CHANGELOG";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/intensity-normalization/default.nix b/nixpkgs/pkgs/development/python-modules/intensity-normalization/default.nix
new file mode 100644
index 000000000000..19253b17fe66
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/intensity-normalization/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytestCheckHook
+, pythonRelaxDepsHook
+, matplotlib
+, nibabel
+, numpy
+, pydicom
+, pymedio
+, scikit-fuzzy
+, scikit-image
+, scikit-learn
+, scipy
+, simpleitk
+, statsmodels
+}:
+
+buildPythonPackage rec {
+  pname = "intensity-normalization";
+  version = "2.2.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "intensity_normalization";
+    inherit version;
+    hash = "sha256-s/trDIRoqLFj3NO+iv3E+AEB4grBAHDlEL6+TCdsgmg=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg --replace "!=3.10.*," "" --replace "!=3.11.*" ""
+    substituteInPlace setup.cfg --replace "pytest-runner" ""
+  '';
+
+  nativeBuildInputs = [ pythonRelaxDepsHook ];
+  pythonRelaxDeps = [ "nibabel" ];
+
+  propagatedBuildInputs = [
+    matplotlib
+    nibabel
+    numpy
+    pydicom
+    pymedio
+    scikit-fuzzy
+    scikit-image
+    scikit-learn
+    scipy
+    simpleitk
+    statsmodels
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+  pytestFlagsArray = [ "tests" ];
+
+  pythonImportsCheck = [
+    "intensity_normalization"
+    "intensity_normalization.normalize"
+    "intensity_normalization.plot"
+    "intensity_normalization.util"
+  ];
+
+
+  meta = with lib; {
+    homepage = "https://github.com/jcreinhold/intensity-normalization";
+    description = "MRI intensity normalization tools";
+    maintainers = with maintainers; [ bcdarwin ];
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/interface-meta/0001-fix-version.patch b/nixpkgs/pkgs/development/python-modules/interface-meta/0001-fix-version.patch
new file mode 100644
index 000000000000..7ff24a210ebd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/interface-meta/0001-fix-version.patch
@@ -0,0 +1,36 @@
+From 581102ae94a7e6dfd3ad3fa5371068189b9e7c44 Mon Sep 17 00:00:00 2001
+From: "Samuel W. Flint" <swflint@flintfam.org>
+Date: Thu, 27 Oct 2022 12:42:07 -0500
+Subject: [PATCH] fix-versions
+
+---
+ interface_meta/_version.py | 2 +-
+ pyproject.toml             | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/interface_meta/_version.py b/interface_meta/_version.py
+index 3d50665..b3d3818 100644
+--- a/interface_meta/_version.py
++++ b/interface_meta/_version.py
+@@ -1,5 +1,5 @@
+ __author__ = "Matthew Wardrop"
+ __author_email__ = "mpwardrop@gmail.com"
+-__version__ = "0.0.0"
++__version__ = "1.3.0"
+ 
+ __dependencies__ = []
+diff --git a/pyproject.toml b/pyproject.toml
+index 43dab27..e543549 100644
+--- a/pyproject.toml
++++ b/pyproject.toml
+@@ -1,6 +1,6 @@
+ [tool.poetry]
+ name = "interface_meta"
+-version = "0.0.0"
++version = "1.3.0"
+ description = "`interface_meta` provides a convenient way to expose an extensible API with enforced method signatures and consistent documentation."
+ authors = ["Matthew Wardrop <mpwardrop@gmail.com>"]
+ license = "MIT"
+-- 
+2.37.0
+
diff --git a/nixpkgs/pkgs/development/python-modules/interface-meta/default.nix b/nixpkgs/pkgs/development/python-modules/interface-meta/default.nix
new file mode 100644
index 000000000000..04daece781e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/interface-meta/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytestCheckHook, poetry-core, poetry-dynamic-versioning }:
+
+buildPythonPackage rec {
+  pname = "interface-meta";
+  version = "1.3.0";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "matthewwardrop";
+    repo = "interface_meta";
+    rev = "v${version}";
+    sha256 = "0rzh11wnab33b11391vc2ynf8ncxn22b12wn46lmgkrc5mqza8hd";
+  };
+
+  patches = [
+    ./0001-fix-version.patch
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    poetry-dynamic-versioning
+  ];
+
+  pythonImportsCheck = [ "interface_meta" ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  meta = {
+    homepage = "https://github.com/matthewwardrop/interface_meta";
+    description = "Convenient way to expose an extensible API with enforced method signatures and consistent documentation";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ swflint ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/internetarchive/default.nix b/nixpkgs/pkgs/development/python-modules/internetarchive/default.nix
new file mode 100644
index 000000000000..a9baf843076c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/internetarchive/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, docopt
+, fetchFromGitHub
+, pytestCheckHook
+, requests
+, jsonpatch
+, schema
+, responses
+, setuptools
+, tqdm
+, urllib3
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "internetarchive";
+  version = "3.5.0";
+
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  # no tests data included in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "jjjake";
+    repo = "internetarchive";
+    rev = "v${version}";
+    hash = "sha256-apBzx1qMHEA0wiWh82sS7I+AaiMEoAchhPsrtAgujbQ=";
+  };
+
+  propagatedBuildInputs = [
+    tqdm
+    docopt
+    requests
+    jsonpatch
+    schema
+    setuptools # needs pkg_resources at runtime
+    urllib3
+  ];
+
+  nativeCheckInputs = [
+    responses
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_get_item_with_kwargs"
+    "test_upload"
+    "test_upload_metadata"
+    "test_upload_queue_derive"
+    "test_upload_validate_identifie"
+    "test_upload_validate_identifier"
+  ];
+
+  disabledTestPaths = [
+    # Tests require network access
+    "tests/cli/test_ia.py"
+    "tests/cli/test_ia_download.py"
+  ];
+
+  pythonImportsCheck = [
+    "internetarchive"
+  ];
+
+  meta = with lib; {
+    description = "A Python and Command-Line Interface to Archive.org";
+    homepage = "https://github.com/jjjake/internetarchive";
+    changelog = "https://github.com/jjjake/internetarchive/raw/v${version}/HISTORY.rst";
+    license = licenses.agpl3Plus;
+    maintainers = [ maintainers.marsam ];
+    mainProgram = "ia";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/interruptingcow/default.nix b/nixpkgs/pkgs/development/python-modules/interruptingcow/default.nix
new file mode 100644
index 000000000000..62e021afdbbb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/interruptingcow/default.nix
@@ -0,0 +1,17 @@
+{ lib, buildPythonPackage, fetchPypi }:
+buildPythonPackage rec {
+  pname = "interruptingcow";
+  version = "0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3e8cd5058b651e625702cba53e3b1fb76d7a5ec07ab69c52a167a9f784e3306c";
+  };
+
+  meta = with lib; {
+    description = "A watchdog that interrupts long running code";
+    homepage = "https://bitbucket.org/evzijst/interruptingcow";
+    license = licenses.mit;
+    maintainers = with maintainers; [ benley ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/intervaltree/default.nix b/nixpkgs/pkgs/development/python-modules/intervaltree/default.nix
new file mode 100644
index 000000000000..dca73a93e8f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/intervaltree/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi
+, python, pytest, sortedcontainers }:
+
+buildPythonPackage rec {
+  version = "3.1.0";
+  pname = "intervaltree";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "902b1b88936918f9b2a19e0e5eb7ccb430ae45cde4f39ea4b36932920d33952d";
+  };
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [ sortedcontainers ];
+
+  checkPhase = ''
+    runHook preCheck
+    rm build -rf
+    ${python.interpreter} nix_run_setup test
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Editable interval tree data structure for Python 2 and 3";
+    homepage =  "https://github.com/chaimleib/intervaltree";
+    license = [ licenses.asl20 ];
+    maintainers =  [ maintainers.bennofs ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/into-dbus-python/default.nix b/nixpkgs/pkgs/development/python-modules/into-dbus-python/default.nix
new file mode 100644
index 000000000000..ff5da5e45926
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/into-dbus-python/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, dbus-signature-pyparsing
+, dbus-python
+, pytestCheckHook
+, hypothesis
+, hs-dbus-signature
+}:
+
+buildPythonPackage rec {
+  pname = "into-dbus-python";
+  version = "0.8.2";
+
+  src = fetchFromGitHub {
+    owner = "stratis-storage";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Ld/DyhVaDiWUXgqmvSmEHqFW2dcoRNM0O4X5DXE3UtM=";
+  };
+
+  propagatedBuildInputs = [
+    dbus-signature-pyparsing
+    dbus-python
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    hypothesis
+    hs-dbus-signature
+  ];
+
+  pythonImportsCheck = [ "into_dbus_python" ];
+
+  meta = with lib; {
+    description = "A transformer to dbus-python types";
+    homepage = "https://github.com/stratis-storage/into-dbus-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/invisible-watermark/default.nix b/nixpkgs/pkgs/development/python-modules/invisible-watermark/default.nix
new file mode 100644
index 000000000000..eab0c1c360aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/invisible-watermark/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, opencv4
+, torch
+, onnx
+, onnxruntime
+, pillow
+, pywavelets
+, numpy
+, callPackage
+, withOnnx ? false # Enables the rivaGan en- and decoding method
+}:
+
+buildPythonPackage rec {
+  pname = "invisible-watermark";
+  version = "0.2.0";
+  format = "setuptools";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ShieldMnt";
+    repo = "invisible-watermark";
+    rev = "e58e451cff7e092457cd915e445b1a20b64a7c8f"; # No git tag, see https://github.com/ShieldMnt/invisible-watermark/issues/22
+    hash = "sha256-6SjVpKFtiiLLU7tZ3hBQr0KT/YEQyywJj0e21/dJRzk=";
+  };
+
+  propagatedBuildInputs = [
+    opencv4
+    torch
+    pillow
+    pywavelets
+    numpy
+  ] ++ lib.optionals withOnnx [
+    onnx
+    onnxruntime
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'opencv-python>=4.1.0.25' 'opencv'
+    substituteInPlace imwatermark/rivaGan.py --replace \
+      'You can install it with pip: `pip install onnxruntime`.' \
+      'You can install it with an override: `python3Packages.invisible-watermark.override { withOnnx = true; };`.'
+  '';
+
+  passthru.tests = let
+    image = "${src}/test_vectors/original.jpg";
+    methods = [ "dwtDct" "dwtDctSvd" "rivaGan" ];
+    testCases = builtins.concatMap (method: [
+      { method = method; withOnnx = true; }
+      { method = method; withOnnx = false; }
+    ]) methods;
+    createTest = { method, withOnnx }: let
+      testName = "${if withOnnx then "withOnnx" else "withoutOnnx"}-${method}";
+    # This test fails in the sandbox on aarch64-linux, see https://github.com/microsoft/onnxruntime/issues/10038
+    skipTest = stdenv.isLinux && stdenv.isAarch64 && withOnnx && method == "rivaGan";
+    in lib.optionalAttrs (!skipTest) {
+      "${testName}" = callPackage ./tests/cli.nix { inherit image method testName withOnnx; };
+    };
+    allTests = builtins.map createTest testCases;
+  in (lib.attrsets.mergeAttrsList allTests) // {
+    python = callPackage ./tests/python { inherit image; };
+  };
+
+  pythonImportsCheck = [ "imwatermark" ];
+
+  meta = with lib; {
+    description = "A library for creating and decoding invisible image watermarks";
+    homepage = "https://github.com/ShieldMnt/invisible-watermark";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Luflosi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/invisible-watermark/tests/cli.nix b/nixpkgs/pkgs/development/python-modules/invisible-watermark/tests/cli.nix
new file mode 100644
index 000000000000..9cb936465786
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/invisible-watermark/tests/cli.nix
@@ -0,0 +1,64 @@
+{ image
+, method
+, python3Packages
+, runCommand
+, testName
+, withOnnx
+}:
+
+# This file runs one test case.
+# There are six test cases in total. method can have three possible values and
+# withOnnx two possible values. 3 * 2 = 6.
+#
+# The case where the method is rivaGan and invisible-watermark is built
+# without onnx is expected to fail and this case is handled accordingly.
+#
+# The test works by first encoding a message into a test image,
+# then decoding the message from the image again and checking
+# if the message was decoded correctly.
+
+let
+  message = if method == "rivaGan" then
+    "asdf" # rivaGan only supports 32 bits
+  else
+    "fnörd1";
+  length = (builtins.stringLength message) * 8;
+  invisible-watermark' = python3Packages.invisible-watermark.override { inherit withOnnx; };
+  expected-exit-code = if method == "rivaGan" && !withOnnx then "1" else "0";
+in
+runCommand "invisible-watermark-test-${testName}" { nativeBuildInputs = [ invisible-watermark' ]; } ''
+  set +e
+  invisible-watermark \
+    --verbose \
+    --action encode \
+    --type bytes \
+    --method '${method}' \
+    --watermark '${message}' \
+    --output output.png \
+    '${image}'
+  exit_code="$?"
+  set -euf -o pipefail
+  if [ "$exit_code" != '${expected-exit-code}' ]; then
+    echo "Exit code of invisible-watermark was $exit_code while ${expected-exit-code} was expected."
+    exit 1
+  fi
+  if [ '${expected-exit-code}' == '1' ]; then
+    echo 'invisible-watermark failed as expected.'
+    touch "$out"
+    exit 0
+  fi
+  decoded_message="$(invisible-watermark \
+                      --action decode \
+                      --type bytes \
+                      --method '${method}' \
+                      --length '${toString length}' \
+                      output.png \
+                    )"
+
+  if [ '${message}' != "$decoded_message" ]; then
+    echo "invisible-watermark did not decode the watermark correctly."
+    echo "The original message was ${message} but the decoded message was $decoded_message."
+    exit 1
+  fi
+  touch "$out"
+''
diff --git a/nixpkgs/pkgs/development/python-modules/invisible-watermark/tests/python/decode.py b/nixpkgs/pkgs/development/python-modules/invisible-watermark/tests/python/decode.py
new file mode 100644
index 000000000000..c1b7e52ff6f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/invisible-watermark/tests/python/decode.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+
+import os
+import cv2
+from imwatermark import WatermarkDecoder
+
+input_file = os.environ['image']
+output_file_path = os.environ['out']
+num_bits = int(os.environ['num_bits'])
+method = os.environ['method']
+
+bgr = cv2.imread(input_file)
+
+decoder = WatermarkDecoder('bytes', num_bits)
+watermark = decoder.decode(bgr, method)
+message = watermark.decode('utf-8')
+
+with open(output_file_path, 'w') as f:
+    f.write(message)
diff --git a/nixpkgs/pkgs/development/python-modules/invisible-watermark/tests/python/default.nix b/nixpkgs/pkgs/development/python-modules/invisible-watermark/tests/python/default.nix
new file mode 100644
index 000000000000..63db58867371
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/invisible-watermark/tests/python/default.nix
@@ -0,0 +1,42 @@
+{ image
+, invisible-watermark
+, opencv4
+, python3
+, runCommand
+, stdenvNoCC
+}:
+
+# This test checks if the python code shown in the README works correctly
+
+let
+  message = "fnörd1";
+  method = "dwtDct";
+
+  pythonWithPackages = python3.withPackages (pp: with pp; [ invisible-watermark opencv4 ]);
+  pythonInterpreter = pythonWithPackages.interpreter;
+
+  encode = stdenvNoCC.mkDerivation {
+    name = "encode";
+    realBuilder = pythonInterpreter;
+    args = [ ./encode.py ];
+    inherit image message method;
+  };
+
+  decode = stdenvNoCC.mkDerivation {
+    name = "decode";
+    realBuilder = pythonInterpreter;
+    args = [ ./decode.py ];
+    inherit method;
+    image = "${encode}/test_wm.png";
+    num_bits = (builtins.stringLength message) * 8;
+  };
+in
+runCommand "invisible-watermark-test-python" { } ''
+  decoded_message="$(cat '${decode}')"
+  if [ '${message}' != "$decoded_message" ]; then
+    echo "invisible-watermark did not decode the watermark correctly."
+    echo "The original message was ${message} but the decoded message was $decoded_message."
+    exit 1
+  fi
+  touch "$out"
+''
diff --git a/nixpkgs/pkgs/development/python-modules/invisible-watermark/tests/python/encode.py b/nixpkgs/pkgs/development/python-modules/invisible-watermark/tests/python/encode.py
new file mode 100644
index 000000000000..59a72cffe70d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/invisible-watermark/tests/python/encode.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+
+import os
+import cv2
+from imwatermark import WatermarkEncoder
+
+input_file_path = os.environ['image']
+output_dir = os.environ['out']
+message = os.environ['message']
+method = os.environ['method']
+
+os.mkdir(output_dir)
+
+bgr = cv2.imread(input_file_path)
+
+encoder = WatermarkEncoder()
+encoder.set_watermark('bytes', message.encode('utf-8'))
+bgr_encoded = encoder.encode(bgr, method)
+
+output_file = os.path.join(output_dir, 'test_wm.png')
+cv2.imwrite(output_file, bgr_encoded)
diff --git a/nixpkgs/pkgs/development/python-modules/invocations/default.nix b/nixpkgs/pkgs/development/python-modules/invocations/default.nix
new file mode 100644
index 000000000000..828c089d2931
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/invocations/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, blessings
+, fetchFromGitHub
+, invoke
+, pythonOlder
+, releases
+, semantic-version
+, tabulate
+, tqdm
+, twine
+}:
+
+buildPythonPackage rec {
+  pname = "invocations";
+  version = "3.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "pyinvoke";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-JnhdcxhBNsYgDMcljtGKjOT1agujlao/66QifGuh6I0=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "semantic_version>=2.4,<2.7" "semantic_version"
+  '';
+
+  propagatedBuildInputs = [
+    blessings
+    invoke
+    releases
+    semantic-version
+    tabulate
+    tqdm
+    twine
+  ];
+
+  # There's an error loading the test suite. See https://github.com/pyinvoke/invocations/issues/29.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "invocations"
+  ];
+
+  meta = with lib; {
+    description = "Common/best-practice Invoke tasks and collections";
+    homepage = "https://invocations.readthedocs.io/";
+    changelog = "https://github.com/pyinvoke/invocations/blob/${version}/docs/changelog.rst";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/invoke/default.nix b/nixpkgs/pkgs/development/python-modules/invoke/default.nix
new file mode 100644
index 000000000000..bf23cfbbcdd5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/invoke/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, bash
+, buildPythonPackage
+, fetchPypi
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "invoke";
+  version = "2.2.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7my7EBrxqFnH/oTyomTAWQILDLf+NTX5QkMAq1aPa9U=";
+  };
+
+  postPatch = ''
+    sed -e 's|/bin/bash|${bash}/bin/bash|g' -i invoke/config.py
+  '';
+
+  # errors with vendored libs
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "invoke"
+  ];
+
+  postInstall = lib.optionalString (stdenv.buildPlatform.canExecute stdenv.hostPlatform) ''
+    mkdir -p $out/share/{bash-completion/completions,fish/vendor_completions.d,zsh/site-functions}
+    $out/bin/inv --print-completion-script=zsh >$out/share/zsh/site-functions/_inv
+    $out/bin/inv --print-completion-script=bash >$out/share/bash-completion/completions/inv.bash
+    $out/bin/inv --print-completion-script=fish >$out/share/fish/vendor_completions.d/inv.fish
+  '';
+
+  meta = with lib; {
+    changelog = "https://www.pyinvoke.org/changelog.html";
+    description = "Pythonic task execution";
+    homepage = "https://www.pyinvoke.org/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iocapture/default.nix b/nixpkgs/pkgs/development/python-modules/iocapture/default.nix
new file mode 100644
index 000000000000..e3bee127b7b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iocapture/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flexmock
+, pytest
+, pytest-cov
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "iocapture";
+  version = "0.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "86670e1808bcdcd4f70112f43da72ae766f04cd8311d1071ce6e0e0a72e37ee8";
+  };
+
+  nativeCheckInputs = [
+    flexmock
+    pytest
+    pytest-cov
+    six
+  ];
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Capture stdout, stderr easily.";
+    homepage = "https://github.com/oinume/iocapture";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iocextract/default.nix b/nixpkgs/pkgs/development/python-modules/iocextract/default.nix
new file mode 100644
index 000000000000..3353d912b393
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iocextract/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, regex
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "iocextract";
+  version = "1.16.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "InQuest";
+    repo = "python-iocextract";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-cCp9ug/TuVY1zL+kiDlFGBmfFJyAmVwxLD36WT0oRAE=";
+  };
+
+  propagatedBuildInputs = [
+    regex
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "iocextract"
+  ];
+
+  pytestFlagsArray = [
+    "tests.py"
+  ];
+
+  disabledTests = [
+    # AssertionError: 'http://exampledotcom/test' != 'http://example.com/test'
+    "test_refang_data"
+  ];
+
+  meta = with lib; {
+    description = "Module to extract Indicator of Compromises (IOC)";
+    homepage = "https://github.com/InQuest/python-iocextract";
+    changelog = "https://github.com/InQuest/python-iocextract/releases/tag/v${version}";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iodata/default.nix b/nixpkgs/pkgs/development/python-modules/iodata/default.nix
new file mode 100644
index 000000000000..b81d7981a280
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iodata/default.nix
@@ -0,0 +1,28 @@
+{ buildPythonPackage, lib, fetchFromGitHub, numpy, scipy, attrs, cython, nose }:
+
+buildPythonPackage rec {
+  pname = "iodata";
+  version = "0.1.7";
+
+  src = fetchFromGitHub {
+    owner = "theochem";
+    repo = pname;
+    rev = version;
+    hash = "sha256-Qn2xWFxdS12K92DhdHVzYrBjPRV+vYo7Cs27vkeCaxM=";
+  };
+
+  leaveDotGit = true;
+
+  nativeBuildInputs = [ cython nose ];
+  propagatedBuildInputs = [ numpy scipy attrs ];
+
+  pythonImportsCheck = [ "iodata" "iodata.overlap_accel" ];
+  doCheck = false; # Requires roberto or nose and a lenghtly setup to find the cython modules
+
+  meta = with lib; {
+    description = "Python library for reading, writing, and converting computational chemistry file formats and generating input files";
+    homepage = "https://github.com/theochem/iodata";
+    license = licenses.lgpl3Only;
+    maintainers = [ maintainers.sheepforce ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ionhash/default.nix b/nixpkgs/pkgs/development/python-modules/ionhash/default.nix
new file mode 100644
index 000000000000..1b9455dbe821
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ionhash/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildPythonPackage, fetchFromGitHub, fetchpatch, amazon-ion, six, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "ionhash";
+  version = "1.2.1";
+
+  src = fetchFromGitHub {
+    owner = "amzn";
+    repo = "ion-hash-python";
+    rev = "v${version}";
+    hash = "sha256-mXOLKXauWwwIA/LnF4qyZsBiF/QM+rF9MmE2ewmozYo=";
+    fetchSubmodules = true;
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/amzn/ion-hash-python/commit/5cab56d694ecc176e394bb455c2d726ba1514ce0.patch";
+      hash = "sha256-P5QByNafgxI//e3m+b0oG00+rVymCsT/J4dOZSk3354=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "'pytest-runner'," ""
+  '';
+
+  propagatedBuildInputs = [ amazon-ion six ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "ionhash" ];
+
+  meta = with lib; {
+    description = "Python implementation of Amazon Ion Hash";
+    homepage = "https://github.com/amzn/ion-hash-python";
+    license = licenses.asl20;
+    maintainers = [ maintainers.terlar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ionoscloud/default.nix b/nixpkgs/pkgs/development/python-modules/ionoscloud/default.nix
new file mode 100644
index 000000000000..2d98144e90a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ionoscloud/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, urllib3
+, six
+, certifi
+, python-dateutil
+, asn1crypto
+}:
+
+buildPythonPackage rec {
+  pname = "ionoscloud";
+  version = "6.1.8";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash= "sha256-QQNDqKZ+X+w5vHFXr793QqRjShNBZ182DyD3fUUxqkc=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  propagatedBuildInputs = [ urllib3 six certifi python-dateutil asn1crypto ];
+
+  # upstream only has codecoverage tests, but no actual tests to go with them
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ionoscloud"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ionos-cloud/sdk-python";
+    description = "Python API client for ionoscloud";
+    changelog = "https://github.com/ionos-cloud/sdk-python/blob/v${version}/docs/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexchen ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iopath/default.nix b/nixpkgs/pkgs/development/python-modules/iopath/default.nix
new file mode 100644
index 000000000000..0a85de0fc9ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iopath/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+# build inputs
+, tqdm
+, portalocker
+, boto3
+# check inputs
+, pytestCheckHook
+, torch
+}:
+let
+  pname = "iopath";
+  version = "0.1.9";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "facebookresearch";
+    repo = "iopath";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Qubf/mWKMgYz9IVoptMZrwy4lQKsNGgdqpJB1j/u5s8=";
+  };
+
+  propagatedBuildInputs = [
+    tqdm
+    portalocker
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    torch
+  ];
+
+  disabledTests = [
+    # requires network access
+    "test_download"
+    "test_bad_args"
+  ];
+
+  disabledTestPaths = [
+    # flakey
+    "tests/async_torch_test.py"
+    "tests/async_writes_test.py"
+  ];
+
+  pythonImportsCheck = [
+    "iopath"
+  ];
+
+  passthru.optional-dependencies = {
+    aws = [ boto3 ];
+  };
+
+  meta = with lib; {
+    description = "A python library that provides common I/O interface across different storage backends.";
+    homepage = "https://github.com/facebookresearch/iopath";
+    changelog = "https://github.com/facebookresearch/iopath/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iotawattpy/default.nix b/nixpkgs/pkgs/development/python-modules/iotawattpy/default.nix
new file mode 100644
index 000000000000..7eca486eea0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iotawattpy/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, httpx
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "iotawattpy";
+  version = "0.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1pyxm87lvd6zy0rx7r9jivk2li267r3xr0b9p6vf0v0vp9fmgsw3";
+  };
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  # Project doesn't tag releases or ship the tests with PyPI
+  # https://github.com/gtdiehl/iotawattpy/issues/14
+  doCheck = false;
+
+  pythonImportsCheck = [ "iotawattpy" ];
+
+  meta = with lib; {
+    description = "Python interface for the IoTaWatt device";
+    homepage = "https://github.com/gtdiehl/iotawattpy";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iowait/default.nix b/nixpkgs/pkgs/development/python-modules/iowait/default.nix
new file mode 100644
index 000000000000..dc8a1265f7a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iowait/default.nix
@@ -0,0 +1,16 @@
+{ buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "iowait";
+  version = "0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "16djvxd9sxm7cr57clhqkyrq3xvdzgwj803sy5hwyb62hkmw46xb";
+  };
+
+  meta = {
+    description = "Platform-independent module for I/O completion events";
+    homepage = "https://launchpad.net/python-iowait";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipaddr/default.nix b/nixpkgs/pkgs/development/python-modules/ipaddr/default.nix
new file mode 100644
index 000000000000..41ef6faa7c37
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipaddr/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "ipaddr";
+  version = "2.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ml8r8z3f0mnn381qs1snbffa920i9ycp6mm2am1d3aqczkdz4j0";
+  };
+
+  checkPhase = ''
+    python ipaddr_test.py
+  '';
+
+  meta = with lib; {
+    description = "IP address manipulation library";
+    homepage = "https://github.com/google/ipaddr-py";
+    license = licenses.asl20;
+    maintainers = [ maintainers.astro ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipadic/default.nix b/nixpkgs/pkgs/development/python-modules/ipadic/default.nix
new file mode 100644
index 000000000000..841eccc9e157
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipadic/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, mecab
+, setuptools-scm
+, cython
+}:
+
+buildPythonPackage rec {
+  pname = "ipadic";
+  version = "1.0.0";
+  format = "setuptools";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "polm";
+    repo = "ipadic-py";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ybC8G1AOIZWkS3uQSErXctIJKq9Y7xBjRbBrO8/yAj4=";
+  };
+
+  # no tests
+  doCheck = false;
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [ cython mecab setuptools-scm ];
+
+  pythonImportsCheck = [ "ipadic" ];
+
+  meta = with lib; {
+    description = "Contemporary Written Japanese dictionary";
+    homepage = "https://github.com/polm/ipadic-py";
+    license = licenses.mit;
+    maintainers = with maintainers; [ laurent-f1z1 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipdb/default.nix b/nixpkgs/pkgs/development/python-modules/ipdb/default.nix
new file mode 100644
index 000000000000..f5911b627c8d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipdb/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, decorator
+, ipython
+, isPyPy
+, exceptiongroup
+, tomli
+, setuptools
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ipdb";
+  version = "0.13.13";
+  format = "pyproject";
+
+  disabled = isPyPy;  # setupterm: could not find terminfo database
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-46xgGO8FEm1EKvaAqthjAG7BnQIpBWGsiLixwLDPxyY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    ipython
+    decorator
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    exceptiongroup
+    tomli
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/gotcha/ipdb";
+    description = "IPython-enabled pdb";
+    license = licenses.bsd0;
+    maintainers = [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipdbplugin/default.nix b/nixpkgs/pkgs/development/python-modules/ipdbplugin/default.nix
new file mode 100644
index 000000000000..c4e9e17988bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipdbplugin/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, ipython
+}:
+
+buildPythonPackage rec {
+  pname = "ipdbplugin";
+  version = "1.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cdcd6bc1e995c3c2c4971ed95f207e680aa44980b716fa43fb675ff2dcc7894f";
+  };
+
+  propagatedBuildInputs = [ nose ipython ];
+
+  meta = with lib; {
+    homepage = "https://github.com/flavioamieiro/nose-ipdb/tree/master";
+    description = "Nose plugin to use iPdb instead of Pdb when tests fail";
+    license = licenses.lgpl2;
+    maintainers = [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipfshttpclient/default.nix b/nixpkgs/pkgs/development/python-modules/ipfshttpclient/default.nix
new file mode 100644
index 000000000000..1ac7fdd3cf75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipfshttpclient/default.nix
@@ -0,0 +1,97 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, pythonOlder
+, python
+, py-multiaddr
+, requests
+, pytestCheckHook
+, pytest-cov
+, pytest-dependency
+, pytest-localserver
+, pytest-mock
+, pytest-order
+, pytest-cid
+, mock
+, kubo
+, httpx
+, httpcore
+}:
+
+buildPythonPackage rec {
+  pname = "ipfshttpclient";
+  version = "0.8.0a2";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ipfs-shipyard";
+    repo = "py-ipfs-http-client";
+    rev = version;
+    hash = "sha256-OmC67pN2BbuGwM43xNDKlsLhwVeUbpvfOazyIDvoMEA=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    py-multiaddr
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-cov
+    pytest-dependency
+    pytest-localserver
+    pytest-mock
+    pytest-order
+    pytest-cid
+    mock
+    kubo
+    httpcore
+    httpx
+  ];
+
+  postPatch = ''
+    # This can be removed for the 0.8.0 release
+    # Use pytest-order instead of pytest-ordering since the latter is unmaintained and broken
+    substituteInPlace test/run-tests.py \
+      --replace 'pytest_ordering' 'pytest_order'
+    substituteInPlace test/functional/test_miscellaneous.py \
+      --replace '@pytest.mark.last' '@pytest.mark.order("last")'
+
+    # Until a proper fix is created, just skip these tests
+    # and ignore any breakage that may result from the API change in IPFS
+    # See https://github.com/ipfs-shipyard/py-ipfs-http-client/issues/308
+    substituteInPlace test/functional/test_pubsub.py \
+      --replace '# the message that will be published' 'pytest.skip("This test fails because of an incompatibility with the experimental PubSub feature in IPFS>=0.11.0")' \
+      --replace '# subscribe to the topic testing'     'pytest.skip("This test fails because of an incompatibility with the experimental PubSub feature in IPFS>=0.11.0")'
+    substituteInPlace test/functional/test_other.py \
+      --replace 'import ipfshttpclient' 'import ipfshttpclient; import pytest' \
+      --replace 'assert ipfs_is_available' 'pytest.skip("Unknown test failure with IPFS >=0.11.0"); assert ipfs_is_available'
+    substituteInPlace test/run-tests.py \
+      --replace '--cov-fail-under=90' '--cov-fail-under=75'
+  '';
+
+  checkPhase = ''
+    runHook preCheck
+
+    ${python.interpreter} -X utf8 test/run-tests.py
+
+    runHook postCheck
+  '';
+
+  doCheck = false;
+
+  pythonImportsCheck = [ "ipfshttpclient" ];
+
+  meta = with lib; {
+    description = "A python client library for the IPFS API";
+    homepage = "https://github.com/ipfs-shipyard/py-ipfs-http-client";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mguentner Luflosi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iptools/default.nix b/nixpkgs/pkgs/development/python-modules/iptools/default.nix
new file mode 100644
index 000000000000..3f2b854b6e7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iptools/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+}:
+
+buildPythonPackage rec {
+  version = "0.7.0";
+  pname = "iptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1sp2v76qqsgqjk0vqfbm2s4sc4mi0gkkpzjnvwih3ymmidilz2hi";
+  };
+
+  buildInputs = [ nose ];
+
+  meta = with lib; {
+    description = "Utilities for manipulating IP addresses including a class that can be used to include CIDR network blocks in Django's INTERNAL_IPS setting";
+    homepage = "https://pypi.python.org/pypi/iptools";
+    license = licenses.bsd0;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipwhl/default.nix b/nixpkgs/pkgs/development/python-modules/ipwhl/default.nix
new file mode 100644
index 000000000000..6e6d0e21ef02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipwhl/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, pythonOlder, fetchFromSourcehut
+, kubo, packaging, tomli, flit-core }:
+
+buildPythonPackage rec {
+  pname = "ipwhl";
+  version = "1.1.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromSourcehut {
+    owner = "~cnx";
+    repo = "ipwhl-utils";
+    rev = version;
+    hash = "sha256-YaIYcoUnbiv9wUOFIzGj2sWGbh7NsqRQcqOR2X6+QZA=";
+  };
+
+  nativeBuildInputs = [ flit-core ];
+  buildInputs = [ kubo ];
+  propagatedBuildInputs = [ packaging tomli ];
+  doCheck = false; # there's no test
+  pythonImportsCheck = [ "ipwhl" ];
+
+  meta = with lib; {
+    description = "Utilities for the InterPlanetary Wheels";
+    homepage = "https://git.sr.ht/~cnx/ipwhl-utils";
+    license = licenses.agpl3Plus;
+    maintainers = [ maintainers.McSinyx ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipwhois/default.nix b/nixpkgs/pkgs/development/python-modules/ipwhois/default.nix
new file mode 100644
index 000000000000..676ec23081a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipwhois/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, dnspython
+, fetchFromGitHub
+, iana-etc
+, libredirect
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "ipwhois";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "secynic";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-2CfRRHlIIaycUtzKeMBKi6pVPeBCb1nW3/1hoxQU1YM=";
+  };
+
+  pythonRelaxDeps = [
+    "dnspython"
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    dnspython
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ipwhois"
+  ];
+
+  preCheck = lib.optionalString stdenv.isLinux ''
+    echo "nameserver 127.0.0.1" > resolv.conf
+    export NIX_REDIRECTS=/etc/protocols=${iana-etc}/etc/protocols:/etc/resolv.conf=$(realpath resolv.conf) \
+      LD_PRELOAD=${libredirect}/lib/libredirect.so
+  '';
+
+  disabledTestPaths = [
+    # Tests require network access
+    "ipwhois/tests/online/"
+  ];
+
+  disabledTests = [
+    "test_lookup"
+    "test_unique_addresses"
+    "test_get_http_json"
+  ];
+
+  meta = with lib; {
+    description = "Library to retrieve and parse whois data";
+    homepage = "https://github.com/secynic/ipwhois";
+    changelog = "https://github.com/secynic/ipwhois/blob/v${version}/CHANGES.rst";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipycanvas/default.nix b/nixpkgs/pkgs/development/python-modules/ipycanvas/default.nix
new file mode 100644
index 000000000000..85961b450ec1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipycanvas/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, jupyter-packaging
+, ipywidgets
+, numpy
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "ipycanvas";
+  version = "0.13.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+cOUBoG8ODgzkPjEbqXYRF1uEcbaZITDfYnfWuHawTE=";
+  };
+
+  # We relax dependencies here instead of pulling in a patch because upstream
+  # has released a new version using hatch-jupyter-builder, but it is not yet
+  # trivial to upgrade to that.
+  #
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"jupyterlab==3.*",' "" \
+      --replace 'jupyter_packaging~=' 'jupyter_packaging>='
+  '';
+
+  nativeBuildInputs = [ jupyter-packaging ];
+
+  propagatedBuildInputs = [ ipywidgets numpy pillow ];
+
+  doCheck = false;  # tests are in Typescript and require `npx` and `chromium`
+  pythonImportsCheck = [ "ipycanvas" ];
+
+  meta = with lib; {
+    description = "Expose the browser's Canvas API to IPython";
+    homepage = "https://ipycanvas.readthedocs.io";
+    changelog = "https://github.com/jupyter-widgets-contrib/ipycanvas/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipydatawidgets/default.nix b/nixpkgs/pkgs/development/python-modules/ipydatawidgets/default.nix
new file mode 100644
index 000000000000..df7fe7ac3fc2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipydatawidgets/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pytest
+, pytest-cov
+, nbval
+, jupyter-packaging
+, ipywidgets
+, numpy
+, six
+, traittypes
+}:
+
+buildPythonPackage rec {
+  pname = "ipydatawidgets";
+  version = "4.3.5";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-OU8kiVdlh8/XVTd6CaBn9GytIggZZQkgIf0avL54Uqg=";
+  };
+
+  nativeBuildInputs = [
+    jupyter-packaging
+  ];
+
+  setupPyBuildFlags = [ "--skip-npm" ];
+
+  propagatedBuildInputs = [
+    ipywidgets
+    numpy
+    six
+    traittypes
+  ];
+
+  nativeCheckInputs = [ pytest pytest-cov nbval ];
+
+  checkPhase = "pytest ipydatawidgets/tests";
+
+  meta = {
+    description = "Widgets to help facilitate reuse of large datasets across different widgets";
+    homepage = "https://github.com/vidartf/ipydatawidgets";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipykernel/default.nix b/nixpkgs/pkgs/development/python-modules/ipykernel/default.nix
new file mode 100644
index 000000000000..74cb52629af5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipykernel/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, callPackage
+, fetchPypi
+, hatchling
+, pythonOlder
+, comm
+, ipython
+, jupyter-client
+, packaging
+, psutil
+, tornado
+, traitlets
+}:
+
+buildPythonPackage rec {
+  pname = "ipykernel";
+  version = "6.25.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-9Gjd0fF6y0jIzmf8+km6bUbU+awEOMH0Qb58PRNyIws=";
+  };
+
+  # debugpy is optional, see https://github.com/ipython/ipykernel/pull/767
+  postPatch = ''
+    sed -i "/debugpy/d" pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    comm
+    ipython
+    jupyter-client
+    packaging
+    psutil
+    tornado
+    traitlets
+  ];
+
+  # check in passthru.tests.pytest to escape infinite recursion with ipyparallel
+  doCheck = false;
+
+  passthru.tests = {
+    pytest = callPackage ./tests.nix { };
+  };
+
+  meta = {
+    description = "IPython Kernel for Jupyter";
+    homepage = "https://ipython.org/";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipykernel/tests.nix b/nixpkgs/pkgs/development/python-modules/ipykernel/tests.nix
new file mode 100644
index 000000000000..edbb13912ad9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipykernel/tests.nix
@@ -0,0 +1,56 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, flaky
+, ipykernel
+, ipyparallel
+, nose
+, pytestCheckHook
+
+}:
+
+buildPythonPackage {
+  pname = "ipykernel-tests";
+  inherit (ipykernel) version src;
+  format = "other";
+
+  dontBuild = true;
+  dontInstall = true;
+
+  nativeCheckInputs = [
+    flaky
+    ipykernel
+    ipyparallel
+    nose
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  disabledTests = lib.optionals stdenv.isDarwin ([
+    # see https://github.com/NixOS/nixpkgs/issues/76197
+    "test_subprocess_print"
+    "test_subprocess_error"
+    "test_ipython_start_kernel_no_userns"
+
+    # https://github.com/ipython/ipykernel/issues/506
+    "test_unc_paths"
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    # flaky test https://github.com/ipython/ipykernel/issues/485
+    "test_shutdown"
+
+    # test regression https://github.com/ipython/ipykernel/issues/486
+    "test_sys_path_profile_dir"
+    "test_save_history"
+    "test_help_output"
+    "test_write_kernel_spec"
+    "test_ipython_start_kernel_userns"
+    "ZMQDisplayPublisherTests"
+  ]);
+
+  # Some of the tests use localhost networking.
+  __darwinAllowLocalNetworking = true;
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipymarkup/default.nix b/nixpkgs/pkgs/development/python-modules/ipymarkup/default.nix
new file mode 100644
index 000000000000..1731c3c2075b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipymarkup/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, intervaltree
+}:
+
+buildPythonPackage rec {
+  pname = "ipymarkup";
+  version = "0.9.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-P0v6EP1mKTIBr4SEp+a8tyO/LjPZpqoAiCZxr5yiaRE=";
+  };
+
+  propagatedBuildInputs = [ intervaltree ];
+  pythonImportCheck = [ "ipymarkup" ];
+
+  # Upstream has no tests:
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Collection of NLP visualizations for NER and syntax tree markup";
+    homepage = "https://github.com/natasha/ipymarkup";
+    license = licenses.mit;
+    maintainers = with maintainers; [ npatsakula ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipympl/default.nix b/nixpkgs/pkgs/development/python-modules/ipympl/default.nix
new file mode 100644
index 000000000000..f461659c6500
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipympl/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, ipykernel
+, ipython-genutils
+, ipywidgets
+, matplotlib
+, numpy
+, pillow
+, traitlets
+}:
+
+buildPythonPackage rec {
+  pname = "ipympl";
+  version = "0.9.3";
+  format = "wheel";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version format;
+    hash = "sha256-0RPNVYkbr+myfvmbbdERqHvra7KuVQxAQpInIQO+gBM=";
+  };
+
+  propagatedBuildInputs = [
+    ipykernel
+    ipython-genutils
+    ipywidgets
+    matplotlib
+    numpy
+    pillow
+    traitlets
+  ];
+
+  # There are no unit tests in repository
+  doCheck = false;
+  pythonImportsCheck = [ "ipympl" "ipympl.backend_nbagg" ];
+
+  meta = with lib; {
+    description = "Matplotlib Jupyter Extension";
+    homepage = "https://github.com/matplotlib/jupyter-matplotlib";
+    maintainers = with maintainers; [ jluttine fabiangd ];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipynbname/default.nix b/nixpkgs/pkgs/development/python-modules/ipynbname/default.nix
new file mode 100644
index 000000000000..03a27ec19d8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipynbname/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ipykernel
+}:
+
+buildPythonPackage rec {
+  pname = "ipynbname";
+  version = "2023.2.0.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Riu915VmJIdtxOqB+nkoRas4cOREyh9res2uo32Mnr8=";
+  };
+
+  propagatedBuildInputs = [
+    ipykernel
+  ];
+
+  pythonImportsCheck = [ "ipynbname" ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  meta = {
+    description = "Simply returns either notebook filename or the full path to the notebook";
+    homepage = "https://github.com/msm1089/ipynbname";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipyniivue/default.nix b/nixpkgs/pkgs/development/python-modules/ipyniivue/default.nix
new file mode 100644
index 000000000000..2f711f92a087
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipyniivue/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, hatchling
+, hatch-jupyter-builder
+, ipywidgets
+, jupyter-ui-poll
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ipyniivue";
+  version = "1.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-kym7949VI6C+62p3IOQ2QIzWnuSBcrmySb83oqUwhjI=";
+  };
+
+  # We do not need the jupyterlab build dependency, because we do not need to
+  # build any JS components; these are present already in the PyPI artifact.
+  #
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"jupyterlab==3.*",' ""
+  '';
+
+  nativeBuildInputs = [
+    hatchling
+    hatch-jupyter-builder
+  ];
+
+  propagatedBuildInputs = [ ipywidgets jupyter-ui-poll ];
+
+  nativeCheckImports = [ pytestCheckHook ];
+  pythonImportsCheck = [ "ipyniivue" ];
+
+  meta = with lib; {
+    description = "Show a nifti image in a webgl 2.0 canvas within a jupyter notebook cell";
+    homepage = "https://github.com/niivue/ipyniivue";
+    changelog = "https://github.com/niivue/ipyniivue/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipyparallel/default.nix b/nixpkgs/pkgs/development/python-modules/ipyparallel/default.nix
new file mode 100644
index 000000000000..509b70b7fd3a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipyparallel/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, decorator
+, entrypoints
+, fetchPypi
+, hatchling
+, ipykernel
+, ipython
+, jupyter-client
+, psutil
+, python-dateutil
+, pythonOlder
+, pyzmq
+, tornado
+, tqdm
+, traitlets
+}:
+
+buildPythonPackage rec {
+  pname = "ipyparallel";
+  version = "8.6.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-o5ql75VgFwvw6a/typ/wReG5wYMsSTAzd+3Mkc6p+3c=";
+  };
+
+  # We do not need the jupyterlab build dependency, because we do not need to
+  # build any JS components; these are present already in the PyPI artifact.
+  #
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"jupyterlab>=3.0.0,==3.*",' ""
+  '';
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    decorator
+    entrypoints
+    ipykernel
+    ipython
+    jupyter-client
+    psutil
+    python-dateutil
+    pyzmq
+    tornado
+    tqdm
+    traitlets
+  ];
+
+  # Requires access to cluster
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ipyparallel"
+  ];
+
+  meta = with lib;{
+    description = "Interactive Parallel Computing with IPython";
+    homepage = "https://ipyparallel.readthedocs.io/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipytablewidgets/default.nix b/nixpkgs/pkgs/development/python-modules/ipytablewidgets/default.nix
new file mode 100644
index 000000000000..4aad3219eb52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipytablewidgets/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, ipywidgets
+, jupyter-packaging
+, jupyterlab
+, lz4
+, numpy
+, pandas
+, setuptools
+, traitlets
+, traittypes
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "ipytablewidgets";
+  version = "0.3.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-14vIih+r/PHLxhgG29YtwuosSBLpewD2CluWpH2+pLc=";
+  };
+
+  # Opened https://github.com/progressivis/ipytablewidgets/issues/3 to ask if
+  # jupyterlab can be updated upstream. (From commits, it looks like it was
+  # set to this version on purpose.) In the meantime, the build still works.
+  #
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'jupyterlab>=3.0.0,<3.7' 'jupyterlab>=3.0.0'
+  '';
+
+  nativeBuildInputs = [
+    jupyter-packaging
+    jupyterlab
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    ipywidgets
+    lz4
+    numpy
+    pandas
+    traitlets
+    traittypes
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "ipytablewidgets" ];
+
+  meta = with lib; {
+    description = "Traitlets and widgets to efficiently data tables (e.g. Pandas DataFrame) using the jupyter notebook";
+    homepage = "https://github.com/progressivis/ipytablewidgets";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipython-genutils/default.nix b/nixpkgs/pkgs/development/python-modules/ipython-genutils/default.nix
new file mode 100644
index 000000000000..e3a7b6c0a444
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipython-genutils/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, nose
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ipython-genutils";
+  version = "0.2.0";
+  pyproject = true;
+
+  src = fetchPypi {
+    pname = "ipython_genutils";
+    inherit version;
+    hash = "sha256-6y4RbnXs751NIo/cZq9UJpr6JqtEYwQuM3hbiHxii6g=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    nose
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    substituteInPlace ipython_genutils/tests/test_path.py \
+      --replace "setUp" "setup_method" \
+      --replace "tearDown" "teardown_method"
+  '';
+
+  pythonImportsCheck = [
+    "ipython_genutils"
+  ];
+
+  meta = {
+    description = "Vestigial utilities from IPython";
+    homepage = "https://ipython.org/";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipython-sql/default.nix b/nixpkgs/pkgs/development/python-modules/ipython-sql/default.nix
new file mode 100644
index 000000000000..2fc59859ab2a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipython-sql/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, ipython
+, ipython-genutils
+, pandas
+, prettytable
+, pytest
+, sqlalchemy
+, sqlparse
+}:
+buildPythonPackage rec {
+  pname = "ipython-sql";
+  version = "0.4.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "catherinedevlin";
+    repo = "ipython-sql";
+    rev = "117764caf099d80100ed4b09fc004b55eed6f121";
+    hash = "sha256-ScQihsvRSnC7VIgy8Tzi1z4x6KIZo0SAeLPvHAVdrfA=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace 'prettytable<1' prettytable
+  '';
+
+  propagatedBuildInputs = [
+    ipython
+    ipython-genutils
+    prettytable
+    sqlalchemy
+    sqlparse
+  ];
+
+  nativeCheckInputs = [ ipython pandas pytest ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    # running with ipython is required because the tests use objects available
+    # only inside of ipython, for example the global `get_ipython()` function
+    ipython -c 'import pytest; pytest.main()'
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "sql" ];
+
+  meta = with lib; {
+    description = "Introduces a %sql (or %%sql) magic.";
+    homepage = "https://github.com/catherinedevlin/ipython-sql";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipython/default.nix b/nixpkgs/pkgs/development/python-modules/ipython/default.nix
new file mode 100644
index 000000000000..a730531bf873
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipython/default.nix
@@ -0,0 +1,97 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+# Build dependencies
+, setuptools
+
+# Runtime dependencies
+, appnope
+, backcall
+, decorator
+, exceptiongroup
+, jedi
+, matplotlib-inline
+, pexpect
+, pickleshare
+, prompt-toolkit
+, pygments
+, stack-data
+, traitlets
+, typing-extensions
+
+# Test dependencies
+, pytestCheckHook
+, testpath
+}:
+
+buildPythonPackage rec {
+  pname = "ipython";
+  version = "8.15.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-K661vmlJ7uv1MhUPgXRvgzPizM4C3hx+7d4/I+1enx4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    backcall
+    decorator
+    jedi
+    matplotlib-inline
+    pexpect
+    pickleshare
+    prompt-toolkit
+    pygments
+    stack-data
+    traitlets
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    exceptiongroup
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    typing-extensions
+  ] ++ lib.optionals stdenv.isDarwin [
+    appnope
+  ];
+
+  pythonImportsCheck = [
+    "IPython"
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+
+    # doctests try to fetch an image from the internet
+    substituteInPlace pyproject.toml \
+      --replace '"--ipdoctest-modules",' '"--ipdoctest-modules", "--ignore=IPython/core/display.py",'
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    testpath
+  ];
+
+  disabledTests = [
+    # UnboundLocalError: local variable 'child' referenced before assignment
+    "test_system_interrupt"
+  ] ++ lib.optionals (stdenv.isDarwin) [
+    # FileNotFoundError: [Errno 2] No such file or directory: 'pbpaste'
+    "test_clipboard_get"
+  ];
+
+  meta = with lib; {
+    description = "IPython: Productive Interactive Computing";
+    downloadPage = "https://github.com/ipython/ipython/";
+    homepage = "https://ipython.org/";
+    changelog = "https://github.com/ipython/ipython/blob/${version}/docs/source/whatsnew/version${lib.versions.major version}.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bjornfor fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipyvue/default.nix b/nixpkgs/pkgs/development/python-modules/ipyvue/default.nix
new file mode 100644
index 000000000000..1fbb4e10805b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipyvue/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, isPy27
+, buildPythonPackage
+, fetchPypi
+  # Python Inputs
+, ipywidgets
+}:
+
+buildPythonPackage rec {
+  pname = "ipyvue";
+  version = "1.10.1";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-IGFc6GulFs8Leq2EzGB+TiyRBCMulUzQ7MvzNTCl4dQ=";
+  };
+
+  propagatedBuildInputs = [ ipywidgets ];
+
+  doCheck = false;  # No tests in package or GitHub
+  pythonImportsCheck = [ "ipyvue" ];
+
+  meta = with lib; {
+    description = "Jupyter widgets base for Vue libraries";
+    homepage = "https://github.com/mariobuikhuizen/ipyvue";
+    license = licenses.mit;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipyvuetify/default.nix b/nixpkgs/pkgs/development/python-modules/ipyvuetify/default.nix
new file mode 100644
index 000000000000..074d8a4522ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipyvuetify/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+  # Python Inputs
+, ipyvue
+}:
+
+buildPythonPackage rec {
+  pname = "ipyvuetify";
+  version = "1.8.10";
+
+  # GitHub version tries to run npm (Node JS)
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-m6RCeUefM/XLg69AaqgTBQ7pYgGVXCy6CH/SOoQ9W04=";
+  };
+
+  propagatedBuildInputs = [ ipyvue ];
+
+  doCheck = false;  # no tests on PyPi/GitHub
+  pythonImportsCheck = [ "ipyvuetify" ];
+
+  meta = with lib; {
+    description = "Jupyter widgets based on Vuetify UI Components.";
+    homepage = "https://github.com/mariobuikhuizen/ipyvuetify";
+    license = licenses.mit;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipywidgets/default.nix b/nixpkgs/pkgs/development/python-modules/ipywidgets/default.nix
new file mode 100644
index 000000000000..0de6db55b941
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipywidgets/default.nix
@@ -0,0 +1,42 @@
+{ buildPythonPackage
+, fetchPypi
+, ipykernel
+, ipython
+, jupyterlab-widgets
+, lib
+, nbformat
+, pytestCheckHook
+, pytz
+, traitlets
+, widgetsnbextension
+}:
+
+buildPythonPackage rec {
+  pname = "ipywidgets";
+  version = "8.1.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QCEe+1Vq3sb6RQzMKnfVnKRKBg9PnxNoM99ZyfU45ug=";
+  };
+
+  propagatedBuildInputs = [
+    ipython
+    ipykernel
+    jupyterlab-widgets
+    traitlets
+    nbformat
+    pytz
+    widgetsnbextension
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = {
+    description = "IPython HTML widgets for Jupyter";
+    homepage = "https://ipython.org/";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ipyxact/default.nix b/nixpkgs/pkgs/development/python-modules/ipyxact/default.nix
new file mode 100644
index 000000000000..7ddaf432d128
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ipyxact/default.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, pyyaml
+, six
+, lxml
+}:
+
+buildPythonPackage rec {
+  pname = "ipyxact";
+  version = "0.3.2";
+
+  propagatedBuildInputs = [ pyyaml ];
+  checkInputs = [ six lxml ];
+
+  src = fetchFromGitHub {
+    owner = "olofk";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-myD+NnqcxxaSAV7qZa8xqeciaiFqFePqIzd7sb/2GXA=";
+  };
+
+  pythonImportsCheck = [ "ipyxact" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/olofk/ipyxact";
+    description = "IP-XACT parser";
+    maintainers = with maintainers; [ genericnerdyusername ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/irc/default.nix b/nixpkgs/pkgs/development/python-modules/irc/default.nix
new file mode 100644
index 000000000000..a068d26695e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/irc/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jaraco-collections
+, jaraco-itertools
+, jaraco-logging
+, jaraco-stream
+, jaraco-text
+, pytestCheckHook
+, pythonOlder
+, pytz
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "irc";
+  version = "20.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JFteqYqwAlZnYx53alXjGRfmDvcIxgEC8hmLyfURMjY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    jaraco-collections
+    jaraco-itertools
+    jaraco-logging
+    jaraco-stream
+    jaraco-text
+    pytz
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "irc"
+  ];
+
+  meta = with lib; {
+    description = "IRC (Internet Relay Chat) protocol library for Python";
+    homepage = "https://github.com/jaraco/irc";
+    changelog = "https://github.com/jaraco/irc/blob/v${version}/NEWS.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ircrobots/default.nix b/nixpkgs/pkgs/development/python-modules/ircrobots/default.nix
new file mode 100644
index 000000000000..ef09e41c2361
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ircrobots/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, anyio
+, asyncio-rlock
+, asyncio-throttle
+, ircstates
+, async-stagger
+, async-timeout
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "ircrobots";
+  version = "0.6.6";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jesopo";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-mIh3tERwHtGH9eA0AT8Lcnwp1Wn9lQhKkUjuZcOXO/c=";
+  };
+
+  postPatch = ''
+    # too specific pins https://github.com/jesopo/ircrobots/issues/3
+    sed -iE 's/anyio.*/anyio/' requirements.txt
+  '';
+
+  propagatedBuildInputs = [
+    anyio
+    asyncio-rlock
+    asyncio-throttle
+    ircstates
+    async-stagger
+    async-timeout
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest test
+  '';
+
+  pythonImportsCheck = [ "ircrobots" ];
+
+  meta = with lib; {
+    description = "Asynchronous bare-bones IRC bot framework for python3";
+    license = licenses.mit;
+    homepage = "https://github.com/jesopo/ircrobots";
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ircstates/default.nix b/nixpkgs/pkgs/development/python-modules/ircstates/default.nix
new file mode 100644
index 000000000000..4ccaea6e6f24
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ircstates/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, irctokens
+, pendulum
+, freezegun
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "ircstates";
+  version = "0.12.1";
+  disabled = pythonOlder "3.6";  # f-strings
+
+  src = fetchFromGitHub {
+    owner = "jesopo";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-F9yOY3YBacyoUzNTvPs7pxp6yNx08tiq1jWQKhGiagc=";
+  };
+
+  propagatedBuildInputs = [
+    irctokens
+    pendulum
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest test
+  '';
+
+  pythonImportsCheck = [ "ircstates" ];
+
+  meta = with lib; {
+    description = "sans-I/O IRC session state parsing library";
+    license = licenses.mit;
+    homepage = "https://github.com/jesopo/ircstates";
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/irctokens/default.nix b/nixpkgs/pkgs/development/python-modules/irctokens/default.nix
new file mode 100644
index 000000000000..b2b35a7a926b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/irctokens/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pyyaml
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "irctokens";
+  version = "2.0.2";
+  disabled = pythonOlder "3.6";  # f-strings
+
+  src = fetchFromGitHub {
+    owner = "jesopo";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Y9NBqxGUkt48hnXxsmfydHkJmWWb+sRrElV8C7l9bpw=";
+  };
+
+  nativeCheckInputs = [ pyyaml ];
+  checkPhase = ''
+    ${python.interpreter} -m unittest test
+  '';
+
+  pythonImportsCheck = [ "irctokens" ];
+
+  meta = with lib; {
+    description = "RFC1459 and IRCv3 protocol tokeniser library for python3";
+    license = licenses.mit;
+    homepage = "https://github.com/jesopo/irctokens";
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/isbnlib/default.nix b/nixpkgs/pkgs/development/python-modules/isbnlib/default.nix
new file mode 100644
index 000000000000..a1af373ad58e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/isbnlib/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, coverage
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "isbnlib";
+  version = "3.10.14";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lvkIZMd7AfVfoR5b/Kn9kJUB2YQvO8cQ1Oq4UZXZBTk=";
+  };
+
+  nativeCheckInputs = [
+    nose
+    coverage
+  ];
+
+  # requires network connection
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "isbnlib"
+    "isbnlib.config"
+    "isbnlib.dev"
+    "isbnlib.dev.helpers"
+    "isbnlib.registry"
+  ];
+
+  meta = with lib; {
+    description = "Extract, clean, transform, hyphenate and metadata for ISBNs";
+    homepage = "https://github.com/xlcnd/isbnlib";
+    changelog = "https://github.com/xlcnd/isbnlib/blob/v${version}/CHANGES.txt";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/islpy/default.nix b/nixpkgs/pkgs/development/python-modules/islpy/default.nix
new file mode 100644
index 000000000000..149aa4c9c14a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/islpy/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isl
+, pybind11
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "islpy";
+  version = "2023.1.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-NsNI1N9ZuNYWr1i3dl7hSaTP3jdsTYsIpoF98vrZG9Y=";
+  };
+
+  postConfigure = ''
+    substituteInPlace setup.py \
+      --replace "\"pytest>=2\"," ""
+  '';
+
+  buildInputs = [ isl pybind11 ];
+  propagatedBuildInputs = [ six ];
+
+  preCheck = "mv islpy islpy.hidden";
+  nativeCheckInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [ "islpy" ];
+
+  meta = with lib; {
+    description = "Python wrapper around isl, an integer set library";
+    homepage = "https://github.com/inducer/islpy";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ismartgate/default.nix b/nixpkgs/pkgs/development/python-modules/ismartgate/default.nix
new file mode 100644
index 000000000000..1a61b002aa3a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ismartgate/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, click
+, defusedxml
+, dicttoxml
+, fetchFromGitHub
+, httpx
+, pycryptodome
+, pytest-asyncio
+, pytest-raises
+, pytestCheckHook
+, pythonOlder
+, respx
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "ismartgate";
+  version = "5.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-mfiHoli0ldw/E1SrtOBpDO8ZTC0wTeaoSZ2nPnx5EaQ=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner>=5.2",' ""
+  '';
+
+  propagatedBuildInputs = [
+    click
+    defusedxml
+    dicttoxml
+    httpx
+    pycryptodome
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-raises
+    pytestCheckHook
+    respx
+  ];
+
+  pythonImportsCheck = [
+    "ismartgate"
+  ];
+
+  meta = with lib; {
+    description = "Python module to work with the ismartgate and gogogate2 API";
+    homepage = "https://github.com/bdraco/ismartgate";
+    changelog = "https://github.com/bdraco/ismartgate/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iso-639/default.nix b/nixpkgs/pkgs/development/python-modules/iso-639/default.nix
new file mode 100644
index 000000000000..7a510598dca3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iso-639/default.nix
@@ -0,0 +1,20 @@
+{ lib, fetchPypi, buildPythonPackage, setuptools }:
+
+buildPythonPackage rec {
+  pname = "iso-639";
+  version = "0.4.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "dc9cd4b880b898d774c47fe9775167404af8a85dd889d58f9008035109acce49";
+  };
+
+  propagatedBuildInputs = [ setuptools ];
+
+  meta = with lib; {
+    homepage = "https://github.com/noumar/iso639";
+    description = "ISO 639 library for Python";
+    license = licenses.agpl3;
+    maintainers = with maintainers; [ zraexy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iso3166/default.nix b/nixpkgs/pkgs/development/python-modules/iso3166/default.nix
new file mode 100644
index 000000000000..d166ea496fca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iso3166/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "iso3166";
+  version = "2.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "deactivated";
+    repo = "python-iso3166";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-/y7c2qSA6+WKUP9YTSaMBjBxtqAuF4nB3MKvL5P6vL0=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "iso3166"
+  ];
+
+  meta = with lib; {
+    description = "Self-contained ISO 3166-1 country definitions";
+    homepage = "https://github.com/deactivated/python-iso3166";
+    changelog = "https://github.com/deactivated/python-iso3166/blob/v${version}/CHANGES";
+    license = licenses.mit;
+    maintainers = with maintainers; [ zraexy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iso4217/default.nix b/nixpkgs/pkgs/development/python-modules/iso4217/default.nix
new file mode 100644
index 000000000000..50268536bda5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iso4217/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchurl
+, importlib-resources
+, pytestCheckHook
+, python
+, pythonOlder
+}:
+let
+  table = fetchurl {
+    # See https://github.com/dahlia/iso4217/blob/main/setup.py#L19
+    url = "http://www.currency-iso.org/dam/downloads/lists/list_one.xml";
+    hash = "sha256-bp8uTMR1YRaI2cJLo0kdt9xD4nNaWK+LdlheWQ26qy0=";
+  };
+in
+buildPythonPackage rec {
+  pname = "iso4217";
+  version = "1.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dahlia";
+    repo = pname;
+    rev = version;
+    hash = "sha256-zJYtEIrsuHKPwnSoRjyZC/0rgAZoNMZ0Oh8gQcIb20Q=";
+  };
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preBuild = ''
+    # The table is already downloaded
+    export ISO4217_DOWNLOAD=0
+    # Copy the table file to satifiy the build process
+    cp -r ${table} $pname/table.xml
+  '';
+
+  postInstall = ''
+    # Copy the table file
+    cp -r ${table} $out/${python.sitePackages}/$pname/table.xml
+  '';
+
+  pytestFlagsArray = [
+    "$pname/test.py"
+  ];
+
+  pythonImportsCheck = [
+    "iso4217"
+  ];
+
+  meta = with lib; {
+    description = "ISO 4217 currency data package for Python";
+    homepage = "https://github.com/dahlia/iso4217";
+    license = with licenses; [ publicDomain ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iso8601/default.nix b/nixpkgs/pkgs/development/python-modules/iso8601/default.nix
new file mode 100644
index 000000000000..ade0c71ee887
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iso8601/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hypothesis
+, poetry-core
+, pytestCheckHook
+, pytz
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "iso8601";
+  version = "2.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-c5lg03x0x3vZvVRqdlYsy1gf49SCD/XDFB60nIOf2o8=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+    pytz
+  ];
+
+  pytestFlagsArray = [
+    "iso8601"
+  ];
+
+  pythonImportsCheck = [
+    "iso8601"
+  ];
+
+  meta = with lib; {
+    description = "Simple module to parse ISO 8601 dates";
+    homepage = "https://pyiso8601.readthedocs.io/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/isodate/default.nix b/nixpkgs/pkgs/development/python-modules/isodate/default.nix
new file mode 100644
index 000000000000..81f030e4830b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/isodate/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, unittestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "isodate";
+  version = "0.6.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "SMWIHefosKDWSMsCTIBi3ITnuEDtgehkx2FP08Envek=";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  unittestFlagsArray = [ "-s" "src/isodate/tests" ];
+
+  meta = with lib; {
+    description = "ISO 8601 date/time parser";
+    homepage = "http://cheeseshop.python.org/pypi/isodate";
+    license = licenses.bsd0;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/isoduration/default.nix b/nixpkgs/pkgs/development/python-modules/isoduration/default.nix
new file mode 100644
index 000000000000..e37e44361a10
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/isoduration/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, arrow
+, buildPythonPackage
+, fetchFromGitHub
+, hypothesis
+, isodate
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "isoduration";
+  version = "20.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bolsote";
+    repo = pname;
+    rev = version;
+    hash = "sha256-6LqsH+3V/K0s2YD1gvmelo+cCH+yCAmmyTYGhUegVdk=";
+  };
+
+  propagatedBuildInputs = [
+    arrow
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    isodate
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # We don't care about benchmarks
+    "tests/test_benchmark.py"
+  ];
+
+  pythonImportsCheck = [
+    "isoduration"
+  ];
+
+  meta = with lib; {
+    description = "Library for operations with ISO 8601 durations";
+    homepage = "https://github.com/bolsote/isoduration";
+    license = licenses.isc;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/isort/default.nix b/nixpkgs/pkgs/development/python-modules/isort/default.nix
new file mode 100644
index 000000000000..6bf563af4784
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/isort/default.nix
@@ -0,0 +1,84 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, colorama
+, hypothesis
+, poetry-core
+, setuptools
+, pylama
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "isort";
+  version = "5.12.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "PyCQA";
+    repo = "isort";
+    rev = "refs/tags/${version}";
+    hash = "sha256-8ija4xWWZuYkElXLdziV7ulN8dubIsChcZQ5dx9hfO0=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    colorama
+    hypothesis
+    pylama
+    pytestCheckHook
+  ];
+
+  postCheck = ''
+    # Confirm that the produced executable script is wrapped correctly and runs
+    # OK, by launching it in a subshell without PYTHONPATH
+    (
+      unset PYTHONPATH
+      echo "Testing that `isort --version-number` returns OK..."
+      $out/bin/isort --version-number
+    )
+  '';
+
+  preCheck = ''
+    HOME=$TMPDIR
+    export PATH=$PATH:$out/bin
+  '';
+
+  pytestFlagsArray = [
+    "--ignore=tests/benchmark/" # requires pytest-benchmark
+    "--ignore=tests/integration/" # pulls in 10 other packages
+    "--ignore=tests/unit/profiles/test_black.py" # causes infinite recursion to include black
+  ];
+
+  disabledTests = [
+    "test_run" # doesn't like paths in /build
+    "test_fuzz_show_unified_diff" # flakey
+    "test_pyi_formatting_issue_942"
+    "test_requirements_finder"
+    "test_pipfile_finder"
+    "test_main" # relies on git
+    "test_command_line" # not thread safe
+    "test_encoding_not_in_comment" # not python 3.9 compatible
+    "test_encoding_not_in_first_two_lines" # not python 3.9 compatible
+    "test_requirements_dir" # requires network
+    # plugin not available
+    "test_isort_literals_issue_1358"
+    "test_isort_supports_formatting_plugins_issue_1353"
+    "test_sort_configurable_sort_issue_1732"
+    "test_value_assignment_list"
+    # profiles not available
+    "test_isort_supports_shared_profiles_issue_970"
+  ];
+
+  meta = with lib; {
+    description = "A Python utility / library to sort Python imports";
+    homepage = "https://github.com/PyCQA/isort";
+    license = licenses.mit;
+    maintainers = with maintainers; [ couchemar ];
+    mainProgram = "isort";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/isosurfaces/default.nix b/nixpkgs/pkgs/development/python-modules/isosurfaces/default.nix
new file mode 100644
index 000000000000..49f3fb90b296
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/isosurfaces/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "isosurfaces";
+  version = "0.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fa1b44e5e59d2f429add49289ab89e36f8dcda49b7badd99e0beea273be331f4";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  # no tests defined upstream
+  doCheck = false;
+
+  pythonImportsCheck = [ "isosurfaces" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jared-hughes/isosurfaces";
+    description = "Construct isolines/isosurfaces of a 2D/3D scalar field defined by a function";
+    longDescription = ''
+      Construct isolines/isosurfaces of a 2D/3D scalar field defined by a
+      function, i.e. curves over which f(x,y)=0 or surfaces over which
+      f(x,y,z)=0. Most similar libraries use marching squares or similar over a
+      uniform grid, but this uses a quadtree to avoid wasting time sampling
+      many far from the implicit surface.
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ friedelino ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/isounidecode/default.nix b/nixpkgs/pkgs/development/python-modules/isounidecode/default.nix
new file mode 100644
index 000000000000..860b237c3de5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/isounidecode/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "isounidecode";
+  version = "0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-TbCpYsY0GCbJpprKq8L5I6WxJNU6M1voku8pFzvDHFs=";
+  };
+
+  pythonImportsCheck = [ "isounidecode" ];
+
+  # no real tests included, fails to run
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python package for conversion and transliteration of unicode into ascii or iso-8859-1";
+    homepage = "https://github.com/redvasily/isounidecode";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/isoweek/default.nix b/nixpkgs/pkgs/development/python-modules/isoweek/default.nix
new file mode 100644
index 000000000000..65de70b20b5e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/isoweek/default.nix
@@ -0,0 +1,19 @@
+{ lib, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "isoweek";
+  version = "1.3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1s7zsf0pab0l9gn6456qadnz5i5h90hafcjwnhx5mq23qjxggwvk";
+  };
+
+  meta = with lib; {
+    description = "The module provide the class Week. Instances represent specific weeks spanning Monday to Sunday.";
+    homepage = "https://github.com/gisle/isoweek";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ mrmebelman ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/itanium-demangler/default.nix b/nixpkgs/pkgs/development/python-modules/itanium-demangler/default.nix
new file mode 100644
index 000000000000..67b71c9bf217
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/itanium-demangler/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "itanium-demangler";
+  version = "1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "whitequark";
+    repo = "python-itanium_demangler";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-I6NUfckt2cocQt5dZSFadpshTCuA/6bVNauNXypWh+A=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests/test.py"
+  ];
+
+  pythonImportsCheck = [
+    "itanium_demangler"
+  ];
+
+  meta = with lib; {
+    description = "Python parser for the Itanium C++ ABI symbol mangling language";
+    homepage = "https://github.com/whitequark/python-itanium_demangler";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ fab pamplemousse ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/itemadapter/default.nix b/nixpkgs/pkgs/development/python-modules/itemadapter/default.nix
new file mode 100644
index 000000000000..75e00b4bbcdd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/itemadapter/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "itemadapter";
+  version = "0.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-d3WEhfsKwQcw1LExNj431ly42yRQv+x6V8PzJx9KSKk=";
+  };
+
+  # Infinite recursion with Scrapy
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "itemadapter"
+  ];
+
+  meta = with lib; {
+    description = "Common interface for data container classes";
+    homepage = "https://github.com/scrapy/itemadapter";
+    changelog = "https://github.com/scrapy/itemadapter/raw/v${version}/Changelog.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/itemdb/default.nix b/nixpkgs/pkgs/development/python-modules/itemdb/default.nix
new file mode 100644
index 000000000000..68fb6d5dc554
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/itemdb/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "itemdb";
+  version = "1.1.2";
+
+  # PyPI tarball doesn't include tests directory
+  src = fetchFromGitHub {
+    owner = "almarklein";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-s7a+MJLTAcGv2rYRMO2SAlsDYen6Si10qUQOVDFuf6c=";
+  };
+
+  meta = with lib; {
+    description = "Easy transactional database for Python dicts, backed by SQLite";
+    license = licenses.bsd2;
+    homepage = "https://itemdb.readthedocs.io";
+    maintainers = [ maintainers.matthiasbeyer ];
+  };
+}
+
+
diff --git a/nixpkgs/pkgs/development/python-modules/itemloaders/default.nix b/nixpkgs/pkgs/development/python-modules/itemloaders/default.nix
new file mode 100644
index 000000000000..d0fa322791d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/itemloaders/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, w3lib
+, parsel
+, jmespath
+, itemadapter
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "itemloaders";
+  version = "1.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "scrapy";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-jwxxKfr/SI1yfjSQbYqggWxBwusBZNYySHwZXHftgFs=";
+  };
+
+  propagatedBuildInputs = [
+    w3lib
+    parsel
+    jmespath
+    itemadapter
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Test are failing (AssertionError: Lists differ: ...)
+    "test_nested_css"
+    "test_nested_xpath"
+  ];
+
+  pythonImportsCheck = [
+    "itemloaders"
+  ];
+
+  meta = with lib; {
+    description = "Base library for scrapy's ItemLoader";
+    homepage = "https://github.com/scrapy/itemloaders";
+    changelog = "https://github.com/scrapy/itemloaders/raw/v${version}/docs/release-notes.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iteration-utilities/default.nix b/nixpkgs/pkgs/development/python-modules/iteration-utilities/default.nix
new file mode 100644
index 000000000000..dcfc86c3aa2c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iteration-utilities/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "iteration-utilities";
+  version = "0.12.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "MSeifert04";
+    repo = "iteration_utilities";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-KdL0lwlmBEG++JRociR92HdYxzArTeL5uEyUjvvwi1Y=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "iteration_utilities"
+  ];
+
+  meta = with lib; {
+    description = "Utilities based on Pythons iterators and generators";
+    homepage = "https://github.com/MSeifert04/iteration_utilities";
+    changelog = "https://github.com/MSeifert04/iteration_utilities/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iterative-telemetry/default.nix b/nixpkgs/pkgs/development/python-modules/iterative-telemetry/default.nix
new file mode 100644
index 000000000000..c6e211539103
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iterative-telemetry/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, appdirs
+, buildPythonPackage
+, distro
+, fetchFromGitHub
+, filelock
+, pytestCheckHook
+, pytest-mock
+, pythonOlder
+, requests
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "iterative-telemtry";
+  version = "0.0.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "iterative";
+    repo = "telemetry-python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-n67nc9a/Qrz2v1EYbHZb+pGhuMDqofUMpgfD/0BwqLM=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    appdirs
+    filelock
+    distro
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+  ];
+
+  pythonImportsCheck = [
+    "iterative_telemetry"
+  ];
+
+  meta = with lib; {
+    description = "Common library to send usage telemetry";
+    homepage = "https://github.com/iterative/iterative-telemetry";
+    changelog = "https://github.com/iterative/iterative-telemetry/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ melling ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iterm2/default.nix b/nixpkgs/pkgs/development/python-modules/iterm2/default.nix
new file mode 100644
index 000000000000..2016e492acf5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iterm2/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi
+, protobuf
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "iterm2";
+  version = "2.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-9vC+xGwyzsr3vn/YIpbsRpfUvyEB8MSqskzBI5kfojA=";
+  };
+
+  propagatedBuildInputs = [ protobuf websockets ];
+
+  # The tests require pyobjc. We can't use pyobjc because at
+  # time of writing the pyobjc derivation is disabled on python 3.
+  # iterm2 won't build on python 2 because it depends on websockets
+  # which is disabled below python 3.3.
+  doCheck = false;
+
+  pythonImportsCheck = [ "iterm2" ];
+
+  meta = with lib; {
+    description = "Python interface to iTerm2's scripting API";
+    homepage = "https://github.com/gnachman/iTerm2";
+    license = licenses.gpl2;
+    platforms = platforms.darwin;
+    maintainers = with maintainers; [ jeremyschlatter ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/itsdangerous/default.nix b/nixpkgs/pkgs/development/python-modules/itsdangerous/default.nix
new file mode 100644
index 000000000000..4121be315f5d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/itsdangerous/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, freezegun
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "itsdangerous";
+  version = "2.1.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XbvGizF+XkLzJ/kCF2NUXcP8O/4i5t65aq8fw4h0FWo=";
+  };
+
+  nativeCheckInputs = [
+    freezegun
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Safely pass data to untrusted environments and back";
+    homepage = "https://itsdangerous.palletsprojects.com";
+    license = licenses.bsd3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/itunespy/default.nix b/nixpkgs/pkgs/development/python-modules/itunespy/default.nix
new file mode 100644
index 000000000000..3bb0bb677bad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/itunespy/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchFromGitHub, requests, pycountry }:
+
+buildPythonPackage rec {
+  pname = "itunespy";
+  version = "1.6";
+
+  src = fetchFromGitHub {
+    owner = "sleepyfran";
+    repo = pname;
+    rev = version;
+    sha256 = "0yc3az5531qs8nbcw4rhgrszwczgy4bikfwfar7xb2044360sslw";
+  };
+
+  propagatedBuildInputs = [ requests pycountry ];
+
+  # This module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "itunespy" ];
+
+  meta = with lib; {
+    description = "A simple library to fetch data from the iTunes Store API";
+    homepage = "https://github.com/sleepyfran/itunespy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ j0hax ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/itypes/default.nix b/nixpkgs/pkgs/development/python-modules/itypes/default.nix
new file mode 100644
index 000000000000..14f021439788
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/itypes/default.nix
@@ -0,0 +1,31 @@
+{
+  lib,
+  fetchFromGitHub,
+  buildPythonPackage,
+  pytest,
+}:
+
+buildPythonPackage rec {
+  pname = "itypes";
+  version = "1.2.0";
+
+  src = fetchFromGitHub {
+    repo = pname;
+    owner = "tomchristie";
+    rev = version;
+    sha256 = "1ljhjp9pacbrv2phs58vppz1dlxix01p98kfhyclvbml6dgjcr52";
+  };
+
+  nativeCheckInputs = [ pytest ];
+  checkPhase = ''
+    mv itypes.py itypes.py.hidden
+    pytest tests.py
+  '';
+
+  meta = with lib; {
+    description = "Simple immutable types for python";
+    homepage = "https://github.com/tomchristie/itypes";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/iwlib/default.nix b/nixpkgs/pkgs/development/python-modules/iwlib/default.nix
new file mode 100644
index 000000000000..2f556e1717d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/iwlib/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, wirelesstools, cffi, pytest }:
+buildPythonPackage rec {
+  pname = "iwlib";
+  version = "1.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a805f6597a70ee3001aba8f039fb7b2dcb75dc15c4e7852f5594fd6379196da1";
+  };
+
+  propagatedBuildInputs = [ wirelesstools cffi ];
+  nativeBuildInputs = [ pytest ];
+  pythonImportsCheck = [ "iwlib" ];
+
+  doCheck = true;
+  checkInputs = [ pytest ];
+  checkPhase = "python iwlib/_iwlib_build.py; pytest -v";
+
+  meta = with lib; {
+    homepage = "https://github.com/nhoad/python-iwlib";
+    description = "Python interface for the Wireless Tools utility collection";
+    changelog = "https://github.com/nhoad/python-iwlib#change-history";
+    maintainers = with maintainers; [ jcspeegs ];
+    license = licenses.gpl2Only;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/j2cli/default.nix b/nixpkgs/pkgs/development/python-modules/j2cli/default.nix
new file mode 100644
index 000000000000..c83b1c77e2cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/j2cli/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jinja2
+, pyyaml
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "j2cli";
+  version = "0.3.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6f6f643b3fa5c0f72fbe9f07e246f8e138052b9f689e14c7c64d582c59709ae4";
+  };
+
+  doCheck = false; # tests aren't installed thus aren't found, so skip
+  propagatedBuildInputs = [ jinja2 pyyaml setuptools ];
+
+  meta = with lib; {
+    homepage = "https://github.com/kolypto/j2cli";
+    description = "Jinja2 Command-Line Tool";
+    license = licenses.bsd2;
+    longDescription = ''
+      J2Cli is a command-line tool for templating in shell-scripts,
+      leveraging the Jinja2 library.
+    '';
+    maintainers = with maintainers; [ rushmorem SuperSandro2000 ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jaconv/default.nix b/nixpkgs/pkgs/development/python-modules/jaconv/default.nix
new file mode 100644
index 000000000000..a7800b783a88
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaconv/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jaconv";
+  version = "0.3.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ikegami-yukino";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-9ruhOLaYNESeKOwJs3IN6ct66fSq7My9DOyA7/cH3d0=";
+  };
+
+  nativeCheckInputs = [
+    nose
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "jaconv"
+  ];
+
+  meta = with lib; {
+    description = "Python Japanese character interconverter for Hiragana, Katakana, Hankaku and Zenkaku";
+    homepage = "https://github.com/ikegami-yukino/jaconv";
+    changelog = "https://github.com/ikegami-yukino/jaconv/blob/v${version}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jaeger-client/default.nix b/nixpkgs/pkgs/development/python-modules/jaeger-client/default.nix
new file mode 100644
index 000000000000..a601fd9ce799
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaeger-client/default.nix
@@ -0,0 +1,40 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, opentracing
+, threadloop
+, thrift
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "jaeger-client";
+  version = "4.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3157836edab8e2c209bd2d6ae61113db36f7ee399e66b1dcbb715d87ab49bfe0";
+  };
+
+  propagatedBuildInputs = [
+    threadloop
+    thrift
+    tornado
+    opentracing
+  ];
+
+  # FIXME: Missing dependencies: tchannel, opentracing_instrumentation
+  # opentracing_instrumentation: Requires "tornado" lower than 6. Current is 6.1.
+  # https://github.com/uber-common/opentracing-python-instrumentation/pull/115
+  doCheck = false;
+
+  pythonImportsCheck = [ "jaeger_client" ];
+
+  meta = with lib; {
+    description = "Jaeger bindings for Python OpenTracing API";
+    downloadPage = "https://pypi.org/project/jaeger-client/";
+    homepage = "https://github.com/jaegertracing/jaeger-client-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jamo/default.nix b/nixpkgs/pkgs/development/python-modules/jamo/default.nix
new file mode 100644
index 000000000000..058df62cb041
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jamo/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jamo";
+  version = "0.4.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "JDongian";
+    repo = "python-jamo";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-QHI3Rqf1aQOsW49A/qnIwRnPuerbtyerf+eWIiEvyho=";
+  };
+
+  pythonImportsCheck = [
+    "jamo"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/JDongian/python-jamo/releases/tag/v${version}";
+    description = "Hangul syllable decomposition and synthesis using jamo";
+    homepage = "https://github.com/JDongian/python-jamo";
+    license = licenses.asl20;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/janus/default.nix b/nixpkgs/pkgs/development/python-modules/janus/default.nix
new file mode 100644
index 000000000000..a31d17b1fe7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/janus/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, pytestCheckHook, pythonOlder, pytest-asyncio
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "janus";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "df976f2cdcfb034b147a2d51edfc34ff6bfb12d4e2643d3ad0e10de058cb1612";
+  };
+
+  disabled = pythonOlder "3.6";
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [ pytest-asyncio pytestCheckHook ];
+
+  # also fails upstream: https://github.com/aio-libs/janus/pull/258
+  disabledTests = [ "test_format" ];
+
+  meta = with lib; {
+    description = "Mixed sync-async queue";
+    homepage = "https://github.com/aio-libs/janus";
+    license = licenses.asl20;
+    maintainers = [ maintainers.simonchatts ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jaraco-abode/default.nix b/nixpkgs/pkgs/development/python-modules/jaraco-abode/default.nix
new file mode 100644
index 000000000000..cbd739d5a955
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco-abode/default.nix
@@ -0,0 +1,98 @@
+{ lib
+, buildPythonPackage
+, bx-py-utils
+, colorlog
+, fetchFromGitHub
+, fetchPypi
+, importlib-resources
+, jaraco-classes
+, jaraco-collections
+, jaraco-itertools
+, jaraco-context
+, jaraco-net
+, keyring
+, lomond
+, more-itertools
+, platformdirs
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+, requests-toolbelt
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "jaraco-abode";
+  version = "5.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jaraco";
+    repo = "jaraco.abode";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-guLgmhjFgYLRZsQ0j92NXkktZ80bwVvMUJLZeg3dgxE=";
+  };
+
+  postPatch = ''
+    # https://github.com/jaraco/jaraco.abode/issues/19
+    echo "graft jaraco" > MANIFEST.in
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  propagatedBuildInputs = [
+    requests
+    lomond
+    colorlog
+    keyring
+    requests-toolbelt
+    jaraco-collections
+    jaraco-context
+    jaraco-classes
+    jaraco-net
+    more-itertools
+    importlib-resources
+    bx-py-utils
+    platformdirs
+    jaraco-itertools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pythonImportsCheck = [
+    "jaraco.abode"
+  ];
+
+  preCheck = ''
+    export HOME=$TEMP
+  '';
+
+  disabledTests = [
+    "_cookie_string"
+    "test_cookies"
+    "test_empty_cookies"
+    "test_invalid_cookies"
+    # Issue with the regex
+    "test_camera_capture_no_control_URLs"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/jaraco/jaraco.abode/blob/${version}/CHANGES.rst";
+    homepage = "https://github.com/jaraco/jaraco.abode";
+    description = "Library interfacing to the Abode home security system";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jamiemagee dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jaraco-classes/default.nix b/nixpkgs/pkgs/development/python-modules/jaraco-classes/default.nix
new file mode 100644
index 000000000000..317fc3e3dc1a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco-classes/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy27
+, setuptools-scm
+, more-itertools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jaraco-classes";
+  version = "3.3.0";
+  format = "pyproject";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "jaraco";
+    repo = "jaraco.classes";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-DW8qf6G6997vBOaO1+Bdx4LBvKfpl/MiiFqWJYKE/pg=";
+  };
+
+  pythonNamespaces = [ "jaraco" ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ more-itertools ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Utility functions for Python class constructs";
+    homepage = "https://github.com/jaraco/jaraco.classes";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jaraco-collections/default.nix b/nixpkgs/pkgs/development/python-modules/jaraco-collections/default.nix
new file mode 100644
index 000000000000..1d8f9a8f2241
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco-collections/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, setuptools-scm
+, jaraco-classes
+, jaraco-text
+}:
+
+buildPythonPackage rec {
+  pname = "jaraco-collections";
+  version = "4.3.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "jaraco.collections";
+    inherit version;
+    hash = "sha256-dP/CP8z+5N4KLr9VajNnW2o8AD1jNZR9MSKgvIgiyOQ=";
+  };
+
+  postPatch = ''
+    # break dependency cycle
+    sed -i "/'jaraco.text',/d" setup.cfg
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  propagatedBuildInputs = [
+    jaraco-classes
+    jaraco-text
+  ];
+
+  pythonNamespaces = [ "jaraco" ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [ "jaraco.collections" ];
+
+  meta = with lib; {
+    description = "Models and classes to supplement the stdlib 'collections' module";
+    homepage = "https://github.com/jaraco/jaraco.collections";
+    changelog = "https://github.com/jaraco/jaraco.collections/blob/v${version}/NEWS.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jaraco-context/default.nix b/nixpkgs/pkgs/development/python-modules/jaraco-context/default.nix
new file mode 100644
index 000000000000..7a882c80195c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco-context/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "jaraco-context";
+  version = "4.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jaraco";
+    repo = "jaraco.context";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-YdbkpKv7k62uyhmjKoxeA9uf5BWnRD/rK+z46FJN4xk=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  pythonNamespaces = [
+    "jaraco"
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "jaraco.context"
+  ];
+
+  meta = with lib; {
+    description = "Python module for context management";
+    homepage = "https://github.com/jaraco/jaraco.context";
+    changelog = "https://github.com/jaraco/jaraco.context/blob/v${version}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jaraco-email/default.nix b/nixpkgs/pkgs/development/python-modules/jaraco-email/default.nix
new file mode 100644
index 000000000000..b23d9504dea1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco-email/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, fetchpatch
+, setuptools
+, setuptools-scm
+, jaraco-text
+, jaraco-collections
+, keyring
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jaraco-email";
+  version = "3.1.0";
+
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "jaraco";
+    repo = "jaraco.email";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-MR/SX5jmZvEMULgvQbh0JBZjIosNCPWl1wvEoJbdw4Y=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "dos2unix-line-endings.patch";
+      url = "https://github.com/jaraco/jaraco.email/commit/ab9643598e26cca9c9cdbd34b00c972f547b9236.patch";
+      hash = "sha256-Z2WOnR+ELzQciVyUiUq4jaP+Vnc4aseLP7+LWJZoOU8=";
+    })
+    (fetchpatch {
+      name = "jaraco-collections-4-compatibility.patch";
+      url = "https://github.com/jaraco/jaraco.email/commit/e65e5fed0178ddcd009d16883b381c5582f1a9df.patch";
+      hash = "sha256-mKxa0ZU1JFeQPemrjQl94buLNY5gXnMCCRKBxdO870M=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  propagatedBuildInputs = [
+    jaraco-text
+    jaraco-collections
+    keyring
+  ];
+
+  pythonImportsCheck = [ "jaraco.email" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = {
+    changelog = "https://github.com/jaraco/jaraco.email/blob/${src.rev}/CHANGES.rst";
+    description = "E-mail facilities by jaraco";
+    homepage = "https://github.com/jaraco/jaraco.email";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jaraco-functools/default.nix b/nixpkgs/pkgs/development/python-modules/jaraco-functools/default.nix
new file mode 100644
index 000000000000..0cc2fa124db5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco-functools/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, more-itertools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "jaraco-functools";
+  version = "3.9.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "jaraco.functools";
+    inherit version;
+    hash = "sha256-ixN7D+rMF/70us7gTAEcnobyNBCZyHCh0S0743sypjg=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [
+    more-itertools
+  ];
+
+  doCheck = false;
+
+  pythonNamespaces = [ "jaraco" ];
+
+  pythonImportsCheck = [ "jaraco.functools" ];
+
+  meta = with lib; {
+    description = "Additional functools in the spirit of stdlib's functools";
+    homepage = "https://github.com/jaraco/jaraco.functools";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jaraco-itertools/default.nix b/nixpkgs/pkgs/development/python-modules/jaraco-itertools/default.nix
new file mode 100644
index 000000000000..23722cc20c4b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco-itertools/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchPypi, setuptools-scm
+, inflect, more-itertools, six, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "jaraco-itertools";
+  version = "6.4.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "jaraco.itertools";
+    inherit version;
+    hash = "sha256-MU/OVi67RepIIqmLvXsi5f6sfVEY28Gk8ess0Ea/+kc=";
+  };
+
+  pythonNamespaces = [ "jaraco" ];
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ inflect more-itertools six ];
+  nativeCheckInputs = [ pytest ];
+
+  # tests no longer available through pypi
+  doCheck = false;
+  checkPhase = ''
+    pytest
+  '';
+
+  pythonImportsCheck = [ "jaraco.itertools" ];
+
+  meta = with lib; {
+    description = "Tools for working with iterables";
+    homepage = "https://github.com/jaraco/jaraco.itertools";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jaraco-logging/default.nix b/nixpkgs/pkgs/development/python-modules/jaraco-logging/default.nix
new file mode 100644
index 000000000000..5e5e60b39624
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco-logging/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, setuptools-scm
+, tempora
+}:
+
+buildPythonPackage rec {
+  pname = "jaraco-logging";
+  version = "3.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "jaraco.logging";
+    inherit version;
+    hash = "sha256-X8ssPxI1HU1QN1trYPOJnFg3sjLxotj/y6/17NK3M+c=";
+  };
+
+  pythonNamespaces = [
+    "jaraco"
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    tempora
+  ];
+
+  # test no longer packaged with pypi
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "jaraco.logging"
+  ];
+
+  meta = with lib; {
+    description = "Support for Python logging facility";
+    homepage = "https://github.com/jaraco/jaraco.logging";
+    changelog = "https://github.com/jaraco/jaraco.logging/blob/v${version}/NEWS.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jaraco-net/default.nix b/nixpkgs/pkgs/development/python-modules/jaraco-net/default.nix
new file mode 100644
index 000000000000..565395d84023
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco-net/default.nix
@@ -0,0 +1,105 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, more-itertools
+, beautifulsoup4
+, mechanize
+, keyring
+, requests
+, feedparser
+, jaraco-text
+, jaraco-logging
+, jaraco-email
+, jaraco-functools
+, jaraco-collections
+, path
+, python-dateutil
+, pathvalidate
+, jsonpickle
+, ifconfig-parser
+, pytestCheckHook
+, cherrypy
+, importlib-resources
+, pyparsing
+, requests-mock
+, nettools
+}:
+
+buildPythonPackage rec {
+  pname = "jaraco-net";
+  version = "9.3.1";
+
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "jaraco";
+    repo = "jaraco.net";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-aq5v4QlapmMTrqwNA0GtRi/xZCcyoR1giZECBsYwymw=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  propagatedBuildInputs = [
+    more-itertools
+    beautifulsoup4
+    mechanize
+    keyring
+    requests
+    feedparser
+    jaraco-text
+    jaraco-logging
+    jaraco-email
+    jaraco-functools
+    jaraco-collections
+    path
+    python-dateutil
+    pathvalidate
+    jsonpickle
+  ] ++ lib.optionals stdenv.isDarwin [
+    ifconfig-parser
+  ];
+
+  pythonImportsCheck = [ "jaraco.net" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    cherrypy
+    importlib-resources
+    pyparsing
+    requests-mock
+  ] ++ lib.optionals stdenv.isDarwin [
+    nettools
+  ];
+
+  disabledTestPaths = [
+    # doesn't actually contain tests
+    "fabfile.py"
+    # require networking
+    "jaraco/net/ntp.py"
+    "jaraco/net/scanner.py"
+    "tests/test_cookies.py"
+  ];
+
+  # cherrypy does not support Python 3.11
+  doCheck = pythonOlder "3.11";
+
+  meta = {
+    changelog = "https://github.com/jaraco/jaraco.net/blob/${src.rev}/CHANGES.rst";
+    description = "Networking tools by jaraco";
+    homepage = "https://github.com/jaraco/jaraco.net";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jaraco-stream/default.nix b/nixpkgs/pkgs/development/python-modules/jaraco-stream/default.nix
new file mode 100644
index 000000000000..b7befef92757
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco-stream/default.nix
@@ -0,0 +1,18 @@
+{ buildPythonPackage, fetchPypi, setuptools-scm, six }:
+
+buildPythonPackage rec {
+  pname = "jaraco-stream";
+  version = "3.0.3";
+
+  src = fetchPypi {
+    pname = "jaraco.stream";
+    inherit version;
+    sha256 = "3af4b0441090ee65bd6dde930d29f93f50c4a2fe6048e2a9d288285f5e4dc441";
+  };
+
+  pythonNamespaces = [ "jaraco" ];
+
+  doCheck = false;
+  buildInputs = [ setuptools-scm ];
+  propagatedBuildInputs = [ six ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jaraco-test/default.nix b/nixpkgs/pkgs/development/python-modules/jaraco-test/default.nix
new file mode 100644
index 000000000000..cba2f375af35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco-test/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, setuptools
+, setuptools-scm
+, toml
+, jaraco-functools
+, jaraco-context
+, more-itertools
+, jaraco-collections
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jaraco-test";
+  version = "5.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "jaraco.test";
+    inherit version;
+    hash = "sha256-f2f8xTlTgXGCPlqp+dA04ulRLOTzVNEb39hNtytGHUA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    toml
+    jaraco-functools
+    jaraco-context
+    more-itertools
+    jaraco-collections
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "jaraco.test"
+  ];
+
+  meta = with lib; {
+    description = "Testing support by jaraco";
+    homepage = "https://github.com/jaraco/jaraco.test";
+    changelog = "https://github.com/jaraco/jaraco.test/blob/v${version}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jaraco-text/default.nix b/nixpkgs/pkgs/development/python-modules/jaraco-text/default.nix
new file mode 100644
index 000000000000..eacbf2cbfd96
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaraco-text/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, autocommand
+, importlib-resources
+, jaraco-functools
+, jaraco-context
+, inflect
+, pathlib2
+, pytestCheckHook
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "jaraco-text";
+  version = "3.11.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "jaraco.text";
+    inherit version;
+    hash = "sha256-Mzpd8hSPcTlxhgfN81L+HZUWKXGnKZw4Dcwk2rAWiYA=";
+  };
+
+  pythonNamespaces = [
+    "jaraco"
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    autocommand
+    jaraco-context
+    jaraco-functools
+    inflect
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    pathlib2
+  ];
+
+  pythonImportsCheck = [
+    "jaraco.text"
+  ];
+
+  meta = with lib; {
+    description = "Module for text manipulation";
+    homepage = "https://github.com/jaraco/jaraco.text";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jarowinkler/default.nix b/nixpkgs/pkgs/development/python-modules/jarowinkler/default.nix
new file mode 100644
index 000000000000..a0196265b845
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jarowinkler/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, rapidfuzz
+, hypothesis
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jarowinkler";
+  version = "2.0.1";
+
+  disabled = pythonOlder "3.8";
+
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "maxbachmann";
+    repo = "JaroWinkler";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-B3upTBNqMyi+CH7Zx04wceEXjGJnr6S3BIl87AQkfbo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    rapidfuzz
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "jarowinkler" ];
+
+  meta = with lib; {
+    description = "Library for fast approximate string matching using Jaro and Jaro-Winkler similarity";
+    homepage = "https://github.com/maxbachmann/JaroWinkler";
+    changelog = "https://github.com/maxbachmann/JaroWinkler/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/javaobj-py3/default.nix b/nixpkgs/pkgs/development/python-modules/javaobj-py3/default.nix
new file mode 100644
index 000000000000..ecdc0b82a743
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/javaobj-py3/default.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage
+, fetchPypi
+, isPy27
+, lib
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "javaobj-py3";
+  version = "0.4.3";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "38f74db3a57e9998a9774e3614afb95cb396f139f29b3fdb130c5af554435259";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  # Tests assume network connectivity
+  doCheck = false;
+
+  pythonImportsCheck = [ "javaobj" ];
+
+  meta = with lib; {
+    description = "Module for serializing and de-serializing Java objects";
+    homepage = "https://github.com/tcalmant/python-javaobj";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ kamadorueda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/javaproperties/default.nix b/nixpkgs/pkgs/development/python-modules/javaproperties/default.nix
new file mode 100644
index 000000000000..28ab53ce98a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/javaproperties/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, six
+, pytestCheckHook
+, python-dateutil
+}:
+
+buildPythonPackage rec {
+  version = "0.8.1";
+  pname = "javaproperties";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "jwodder";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "16rcdw5gd4a21v2xb1j166lc9z2dqcv68gqvk5mvpnm0x6nwadgp";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    python-dateutil
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "time"
+  ];
+
+  disabledTestPaths = [
+    "test/test_propclass.py"
+  ];
+
+  meta = with lib; {
+    description = "Microsoft Azure API Management Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jax-jumpy/default.nix b/nixpkgs/pkgs/development/python-modules/jax-jumpy/default.nix
new file mode 100644
index 000000000000..f37677da0283
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jax-jumpy/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "jumpy";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "Farama-Foundation";
+    repo = pname;
+    rev = version;
+    hash = "sha256-tPQ/v2AVnAEC+08BVAvvgJ8Pj89nXZSn2tQ6nxXuSfA=";
+  };
+
+  format = "pyproject";
+
+  nativeBuildInputs = [ setuptools ];
+
+  propagatedBuildInputs = [ numpy ];
+
+  pythonImportsCheck = [ "jumpy" ];
+
+  meta = with lib; {
+    description = "Jumpy is a common backend for NumPy and optionally JAX";
+    homepage = "https://github.com/Farama-Foundation/Jumpy";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jax/default.nix b/nixpkgs/pkgs/development/python-modules/jax/default.nix
new file mode 100644
index 000000000000..203aa49db8fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jax/default.nix
@@ -0,0 +1,130 @@
+{ lib
+, blas
+, buildPythonPackage
+, setuptools
+, importlib-metadata
+, fetchFromGitHub
+, jaxlib
+, jaxlib-bin
+, lapack
+, matplotlib
+, ml-dtypes
+, numpy
+, opt-einsum
+, pytestCheckHook
+, pytest-xdist
+, pythonOlder
+, scipy
+, stdenv
+}:
+
+let
+  usingMKL = blas.implementation == "mkl" || lapack.implementation == "mkl";
+  # jaxlib is broken on aarch64-* as of 2023-03-05, but the binary wheels work
+  # fine. jaxlib is only used in the checkPhase, so switching backends does not
+  # impact package behavior. Get rid of this once jaxlib is fixed on aarch64-*.
+  jaxlib' = if jaxlib.meta.broken then jaxlib-bin else jaxlib;
+in
+buildPythonPackage rec {
+  pname = "jax";
+  version = "0.4.20";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = "jax";
+    # google/jax contains tags for jax and jaxlib. Only use jax tags!
+    rev = "refs/tags/${pname}-v${version}";
+    hash = "sha256-WLYXUtchOaA6SGnKuVhN9CmV06xMCLQTEuEtL13ttZU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  # The version is automatically set to ".dev" if this variable is not set.
+  # https://github.com/google/jax/commit/e01f2617b85c5bdffc5ffb60b3d8d8ca9519a1f3
+  JAX_RELEASE = "1";
+
+  # jaxlib is _not_ included in propagatedBuildInputs because there are
+  # different versions of jaxlib depending on the desired target hardware. The
+  # JAX project ships separate wheels for CPU, GPU, and TPU.
+  propagatedBuildInputs = [
+    ml-dtypes
+    numpy
+    opt-einsum
+    scipy
+  ] ++ lib.optional (pythonOlder "3.10") importlib-metadata;
+
+  nativeCheckInputs = [
+    jaxlib'
+    matplotlib
+    pytestCheckHook
+    pytest-xdist
+  ];
+
+  # high parallelism will result in the tests getting stuck
+  dontUsePytestXdist = true;
+
+  # NOTE: Don't run the tests in the expiremental directory as they require flax
+  # which creates a circular dependency. See https://discourse.nixos.org/t/how-to-nix-ify-python-packages-with-circular-dependencies/14648/2.
+  # Not a big deal, this is how the JAX docs suggest running the test suite
+  # anyhow.
+  pytestFlagsArray = [
+    "--numprocesses=4"
+    "-W ignore::DeprecationWarning"
+    "tests/"
+  ];
+
+  disabledTests = [
+    # Exceeds tolerance when the machine is busy
+    "test_custom_linear_solve_aux"
+    # UserWarning: Explicitly requested dtype <class 'numpy.float64'>
+    #  requested in astype is not available, and will be truncated to
+    # dtype float32. (With numpy 1.24)
+    "testKde3"
+    "testKde5"
+    "testKde6"
+  ] ++ lib.optionals usingMKL [
+    # See
+    #  * https://github.com/google/jax/issues/9705
+    #  * https://discourse.nixos.org/t/getting-different-results-for-the-same-build-on-two-equally-configured-machines/17921
+    #  * https://github.com/NixOS/nixpkgs/issues/161960
+    "test_custom_linear_solve_cholesky"
+    "test_custom_root_with_aux"
+    "testEigvalsGrad_shape"
+  ] ++ lib.optionals stdenv.isAarch64 [
+    # See https://github.com/google/jax/issues/14793.
+    "test_for_loop_fixpoint_correctly_identifies_loop_varying_residuals_unrolled_for_loop"
+    "testQdwhWithRandomMatrix3"
+    "testScanGrad_jit_scan"
+
+    # See https://github.com/google/jax/issues/17867.
+    "test_array"
+    "test_async"
+    "test_copy0"
+    "test_device_put"
+    "test_make_array_from_callback"
+    "test_make_array_from_single_device_arrays"
+
+    # Fails on some hardware due to some numerical error
+    # See https://github.com/google/jax/issues/18535
+    "testQdwhWithOnRankDeficientInput5"
+  ];
+
+  disabledTestPaths = lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
+    # RuntimeWarning: invalid value encountered in cast
+    "tests/lax_test.py"
+  ];
+
+  pythonImportsCheck = [ "jax" ];
+
+  meta = with lib; {
+    description = "Differentiate, compile, and transform Numpy code";
+    homepage = "https://github.com/google/jax";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jaxlib/bin.nix b/nixpkgs/pkgs/development/python-modules/jaxlib/bin.nix
new file mode 100644
index 000000000000..4030bd5e4041
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaxlib/bin.nix
@@ -0,0 +1,217 @@
+# For the moment we only support the CPU and GPU backends of jaxlib. The TPU
+# backend will require some additional work. Those wheels are located here:
+# https://storage.googleapis.com/jax-releases/libtpu_releases.html.
+
+# For future reference, the easiest way to test the GPU backend is to run
+#   NIX_PATH=.. nix-shell -p python3 python3Packages.jax "python3Packages.jaxlib-bin.override { cudaSupport = true; }"
+#   export XLA_FLAGS=--xla_gpu_force_compilation_parallelism=1
+#   python -c "from jax.lib import xla_bridge; assert xla_bridge.get_backend().platform == 'gpu'"
+#   python -c "from jax import random; random.PRNGKey(0)"
+#   python -c "from jax import random; x = random.normal(random.PRNGKey(0), (100, 100)); x @ x"
+# There's no convenient way to test the GPU backend in the derivation since the
+# nix build environment blocks access to the GPU. See also:
+#   * https://github.com/google/jax/issues/971#issuecomment-508216439
+#   * https://github.com/google/jax/issues/5723#issuecomment-913038780
+
+{ absl-py
+, addOpenGLRunpath
+, autoPatchelfHook
+, buildPythonPackage
+, config
+, fetchPypi
+, fetchurl
+, flatbuffers
+, jaxlib-build
+, lib
+, ml-dtypes
+, python
+, scipy
+, stdenv
+  # Options:
+, cudaSupport ? config.cudaSupport
+, cudaPackages ? {}
+}:
+
+let
+  inherit (cudaPackages) cudatoolkit cudnn;
+in
+
+assert cudaSupport -> lib.versionAtLeast cudatoolkit.version "11.1" && lib.versionAtLeast cudnn.version "8.2" && stdenv.isLinux;
+
+let
+  version = "0.4.20";
+
+  inherit (python) pythonVersion;
+
+  # As of 2023-06-06, google/jax upstream is no longer publishing CPU-only wheels to their GCS bucket. Instead the
+  # official instructions recommend installing CPU-only versions via PyPI.
+  cpuSrcs =
+    let
+      getSrcFromPypi = { platform, dist, hash }: fetchPypi {
+        inherit version platform dist hash;
+        pname = "jaxlib";
+        format = "wheel";
+        # See the `disabled` attr comment below.
+        python = dist;
+        abi = dist;
+      };
+    in
+    {
+      "3.9-x86_64-linux" = getSrcFromPypi {
+        platform = "manylinux2014_x86_64";
+        dist = "cp39";
+        hash = "sha256-eIE+rz5x5BEkO85zncIWE8p/wDPxV8bnVJdHiknS998=";
+      };
+      "3.9-aarch64-darwin" = getSrcFromPypi {
+        platform = "macosx_11_0_arm64";
+        dist = "cp39";
+        hash = "sha256-dxInv8/aQiHsN7DpScuZao2ZyHDjF0AaTqUDA0qqg/M=";
+      };
+      "3.9-x86_64-darwin" = getSrcFromPypi {
+        platform = "macosx_10_14_x86_64";
+        dist = "cp39";
+        hash = "sha256-wva6LkSokEHN+WQLCancVC7YBIxfImPsQpB1LzFcyqM=";
+      };
+
+      "3.10-x86_64-linux" = getSrcFromPypi {
+        platform = "manylinux2014_x86_64";
+        dist = "cp310";
+        hash = "sha256-Yo2TYnkIelyy4vb5+nC/yY8SjV34i/jJvCe/VRQppmo=";
+      };
+      "3.10-aarch64-darwin" = getSrcFromPypi {
+        platform = "macosx_11_0_arm64";
+        dist = "cp310";
+        hash = "sha256-ufA/ACE4s4R/Fiq5SN7T44SVEN1Z5OfkJ/98lKxRFmo=";
+      };
+      "3.10-x86_64-darwin" = getSrcFromPypi {
+        platform = "macosx_10_14_x86_64";
+        dist = "cp310";
+        hash = "sha256-hBSrYQyOGMn0BexRWQKYnJdEYYlzHUWuWGHmjVT10TE=";
+      };
+
+      "3.11-x86_64-linux" = getSrcFromPypi {
+        platform = "manylinux2014_x86_64";
+        dist = "cp311";
+        hash = "sha256-5N0nghTBrsa7d8kt8hZC2ghqlxCNC7U8ApD0PG7DHn8=";
+      };
+      "3.11-aarch64-darwin" = getSrcFromPypi {
+        platform = "macosx_11_0_arm64";
+        dist = "cp311";
+        hash = "sha256-j13Br64cKe0hFh/cMBbOMuTXqauAvSKE+KzEmN7U6RA=";
+      };
+      "3.11-x86_64-darwin" = getSrcFromPypi {
+        platform = "macosx_10_14_x86_64";
+        dist = "cp311";
+        hash = "sha256-nTnyawU4Ngq9VTE6oDuEfR6iJPRy+E/VLt98cU6eW4M=";
+      };
+
+      "3.12-x86_64-linux" = getSrcFromPypi {
+        platform = "manylinux2014_x86_64";
+        dist = "cp312";
+        hash = "sha256-qPMoa7cso7DRBWuCJQoiOEzLPL3m76MPZZMYmZUj400=";
+      };
+      "3.12-aarch64-darwin" = getSrcFromPypi {
+        platform = "macosx_11_0_arm64";
+        dist = "cp312";
+        hash = "sha256-VqTC5egDHaDIvwVa3sAc9Sdtd0CwEFcXjDU/i54h844=";
+      };
+      "3.12-x86_64-darwin" = getSrcFromPypi {
+        platform = "macosx_10_14_x86_64";
+        dist = "cp312";
+        hash = "sha256-1F98Je2rMJJKrksI/EVAsX9n+dOpmDehUeAaMq/BY7o=";
+      };
+    };
+
+  # Find new releases at https://storage.googleapis.com/jax-releases/jax_releases.html.
+  # When upgrading, you can get these hashes from prefetch.sh. See
+  # https://github.com/google/jax/issues/12879 as to why this specific URL is the correct index.
+  gpuSrcs = {
+    "3.9" = fetchurl {
+      url = "https://storage.googleapis.com/jax-releases/cuda12/jaxlib-${version}+cuda12.cudnn89-cp39-cp39-manylinux2014_x86_64.whl";
+      hash = "sha256-VM2HuyMnG+hzrsTQEB5KJpqpBXyyp+eV1LVxmY1ZCGU=";
+    };
+    "3.10" = fetchurl {
+      url = "https://storage.googleapis.com/jax-releases/cuda12/jaxlib-${version}+cuda12.cudnn89-cp310-cp310-manylinux2014_x86_64.whl";
+      hash = "sha256-TLq3z3T2fjTcO3ESahboKG33mrOpjtj9C92f4d4nJKo=";
+    };
+    "3.11" = fetchurl {
+      url = "https://storage.googleapis.com/jax-releases/cuda12/jaxlib-${version}+cuda12.cudnn89-cp311-cp311-manylinux2014_x86_64.whl";
+      hash = "sha256-CUXwyJq0HOo2j3Sw+NguBCnFkDuJpc3wfZUc90yyhOY=";
+    };
+    "3.12" = fetchurl {
+      url = "https://storage.googleapis.com/jax-releases/cuda12/jaxlib-${version}+cuda12.cudnn89-cp312-cp312-manylinux2014_x86_64.whl";
+      hash = "sha256-bAR8FLtiqufU+rL2a1q9c61CjH1eXxGTNGnDUkHlDBA=";
+    };
+  };
+
+in
+buildPythonPackage {
+  pname = "jaxlib";
+  inherit version;
+  format = "wheel";
+
+  disabled = !(pythonVersion == "3.9" || pythonVersion == "3.10" || pythonVersion == "3.11" || pythonVersion == "3.12");
+
+  # See https://discourse.nixos.org/t/ofborg-does-not-respect-meta-platforms/27019/6.
+  src =
+    if !cudaSupport then
+      (
+        cpuSrcs."${pythonVersion}-${stdenv.hostPlatform.system}"
+          or (throw "jaxlib-bin is not supported on ${stdenv.hostPlatform.system}")
+      ) else gpuSrcs."${pythonVersion}";
+
+  # Prebuilt wheels are dynamically linked against things that nix can't find.
+  # Run `autoPatchelfHook` to automagically fix them.
+  nativeBuildInputs = lib.optionals stdenv.isLinux [ autoPatchelfHook ]
+    ++ lib.optionals cudaSupport [ addOpenGLRunpath ];
+  # Dynamic link dependencies
+  buildInputs = [ stdenv.cc.cc.lib ];
+
+  # jaxlib contains shared libraries that open other shared libraries via dlopen
+  # and these implicit dependencies are not recognized by ldd or
+  # autoPatchelfHook. That means we need to sneak them into rpath. This step
+  # must be done after autoPatchelfHook and the automatic stripping of
+  # artifacts. autoPatchelfHook runs in postFixup and auto-stripping runs in the
+  # patchPhase. Dependencies:
+  #   * libcudart.so.11.0 -> cudatoolkit_11.lib
+  #   * libcublas.so.11   -> cudatoolkit_11
+  #   * libcuda.so.1      -> opengl driver in /run/opengl-driver/lib
+  preInstallCheck = lib.optional cudaSupport ''
+    shopt -s globstar
+
+    addOpenGLRunpath $out/**/*.so
+
+    for file in $out/**/*.so; do
+      rpath=$(patchelf --print-rpath $file)
+      # For some reason `makeLibraryPath` on `cudatoolkit_11` maps to
+      # <cudatoolkit_11.lib>/lib which is different from <cudatoolkit_11>/lib.
+      patchelf --set-rpath "$rpath:${cudatoolkit}/lib:${lib.makeLibraryPath [ cudatoolkit.lib cudnn ]}" $file
+    done
+  '';
+
+  propagatedBuildInputs = [
+    absl-py
+    flatbuffers
+    ml-dtypes
+    scipy
+  ];
+
+  # Note that cudatoolkit is snecessary since jaxlib looks for "ptxas" in $PATH.
+  # See https://github.com/NixOS/nixpkgs/pull/164176#discussion_r828801621 for
+  # more info.
+  postInstall = lib.optional cudaSupport ''
+    mkdir -p $out/bin
+    ln -s ${cudatoolkit}/bin/ptxas $out/bin/ptxas
+  '';
+
+  inherit (jaxlib-build) pythonImportsCheck;
+
+  meta = with lib; {
+    description = "XLA library for JAX";
+    homepage = "https://github.com/google/jax";
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    license = licenses.asl20;
+    maintainers = with maintainers; [ samuela ];
+    platforms = [ "aarch64-darwin" "x86_64-linux" "x86_64-darwin" ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jaxlib/default.nix b/nixpkgs/pkgs/development/python-modules/jaxlib/default.nix
new file mode 100644
index 000000000000..c70ab0ac2b32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaxlib/default.nix
@@ -0,0 +1,359 @@
+{ lib
+, pkgs
+, stdenv
+
+  # Build-time dependencies:
+, addOpenGLRunpath
+, bazel_6
+, binutils
+, buildBazelPackage
+, buildPythonPackage
+, cctools
+, curl
+, cython
+, fetchFromGitHub
+, git
+, IOKit
+, jsoncpp
+, nsync
+, openssl
+, pybind11
+, setuptools
+, symlinkJoin
+, wheel
+, build
+, which
+
+  # Python dependencies:
+, absl-py
+, flatbuffers
+, ml-dtypes
+, numpy
+, scipy
+, six
+
+  # Runtime dependencies:
+, double-conversion
+, giflib
+, grpc
+, libjpeg_turbo
+, python
+, snappy
+, zlib
+
+, config
+  # CUDA flags:
+, cudaSupport ? config.cudaSupport
+, cudaPackages ? {}
+
+  # MKL:
+, mklSupport ? true
+}:
+
+let
+  inherit (cudaPackages) backendStdenv cudatoolkit cudaFlags cudnn nccl;
+
+  pname = "jaxlib";
+  version = "0.4.20";
+
+  meta = with lib; {
+    description = "JAX is Autograd and XLA, brought together for high-performance machine learning research.";
+    homepage = "https://github.com/google/jax";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ndl ];
+    platforms = platforms.unix;
+    # aarch64-darwin is broken because of https://github.com/bazelbuild/rules_cc/pull/136
+    # however even with that fix applied, it doesn't work for everyone:
+    # https://github.com/NixOS/nixpkgs/pull/184395#issuecomment-1207287129
+    broken = stdenv.isDarwin;
+  };
+
+  cudatoolkit_joined = symlinkJoin {
+    name = "${cudatoolkit.name}-merged";
+    paths = [
+      cudatoolkit.lib
+      cudatoolkit.out
+    ] ++ lib.optionals (lib.versionOlder cudatoolkit.version "11") [
+      # for some reason some of the required libs are in the targets/x86_64-linux
+      # directory; not sure why but this works around it
+      "${cudatoolkit}/targets/${stdenv.system}"
+    ];
+  };
+
+  cudatoolkit_cc_joined = symlinkJoin {
+    name = "${cudatoolkit.cc.name}-merged";
+    paths = [
+      backendStdenv.cc
+      binutils.bintools # for ar, dwp, nm, objcopy, objdump, strip
+    ];
+  };
+
+  # Copy-paste from TF derivation.
+  # Most of these are not really used in jaxlib compilation but it's simpler to keep it
+  # 'as is' so that it's more compatible with TF derivation.
+  tf_system_libs = [
+    "absl_py"
+    "astor_archive"
+    "astunparse_archive"
+    # Not packaged in nixpkgs
+    # "com_github_googleapis_googleapis"
+    # "com_github_googlecloudplatform_google_cloud_cpp"
+    "com_github_grpc_grpc"
+    # ERROR: /build/output/external/bazel_tools/tools/proto/BUILD:25:6: no such target '@com_google_protobuf//:cc_toolchain':
+    # target 'cc_toolchain' not declared in package '' defined by /build/output/external/com_google_protobuf/BUILD.bazel
+    # "com_google_protobuf"
+    # Fails with the error: external/org_tensorflow/tensorflow/core/profiler/utils/tf_op_utils.cc:46:49: error: no matching function for call to 're2::RE2::FullMatch(absl::lts_2020_02_25::string_view&, re2::RE2&)'
+    # "com_googlesource_code_re2"
+    "curl"
+    "cython"
+    "dill_archive"
+    "double_conversion"
+    "flatbuffers"
+    "functools32_archive"
+    "gast_archive"
+    "gif"
+    "hwloc"
+    "icu"
+    "jsoncpp_git"
+    "libjpeg_turbo"
+    "lmdb"
+    "nasm"
+    "opt_einsum_archive"
+    "org_sqlite"
+    "pasta"
+    "png"
+    # ERROR: /build/output/external/pybind11/BUILD.bazel: no such target '@pybind11//:osx':
+    # target 'osx' not declared in package '' defined by /build/output/external/pybind11/BUILD.bazel
+    # "pybind11"
+    "six_archive"
+    "snappy"
+    "tblib_archive"
+    "termcolor_archive"
+    "typing_extensions_archive"
+    "wrapt"
+    "zlib"
+  ];
+
+  arch =
+    # KeyError: ('Linux', 'arm64')
+    if stdenv.hostPlatform.isLinux && stdenv.hostPlatform.linuxArch == "arm64" then "aarch64"
+    else stdenv.hostPlatform.linuxArch;
+
+  bazel-build = buildBazelPackage rec {
+    name = "bazel-build-${pname}-${version}";
+
+    # See https://github.com/google/jax/blob/main/.bazelversion for the latest.
+    bazel = bazel_6;
+
+    src = fetchFromGitHub {
+      owner = "google";
+      repo = "jax";
+      # google/jax contains tags for jax and jaxlib. Only use jaxlib tags!
+      rev = "refs/tags/${pname}-v${version}";
+      hash = "sha256-WLYXUtchOaA6SGnKuVhN9CmV06xMCLQTEuEtL13ttZU=";
+    };
+
+    nativeBuildInputs = [
+      cython
+      pkgs.flatbuffers
+      git
+      setuptools
+      wheel
+      build
+      which
+    ] ++ lib.optionals stdenv.isDarwin [
+      cctools
+    ];
+
+    buildInputs = [
+      curl
+      double-conversion
+      giflib
+      grpc
+      jsoncpp
+      libjpeg_turbo
+      numpy
+      openssl
+      pkgs.flatbuffers
+      pkgs.protobuf
+      pybind11
+      scipy
+      six
+      snappy
+      zlib
+    ] ++ lib.optionals cudaSupport [
+      cudatoolkit
+      cudnn
+    ] ++ lib.optionals stdenv.isDarwin [
+      IOKit
+    ] ++ lib.optionals (!stdenv.isDarwin) [
+      nsync
+    ];
+
+    postPatch = ''
+      rm -f .bazelversion
+    '';
+
+    bazelRunTarget = "//jaxlib/tools:build_wheel";
+    runTargetFlags = [ "--output_path=$out" "--cpu=${arch}" ];
+
+    removeRulesCC = false;
+
+    GCC_HOST_COMPILER_PREFIX = lib.optionalString cudaSupport "${cudatoolkit_cc_joined}/bin";
+    GCC_HOST_COMPILER_PATH = lib.optionalString cudaSupport "${cudatoolkit_cc_joined}/bin/gcc";
+
+    # The version is automatically set to ".dev" if this variable is not set.
+    # https://github.com/google/jax/commit/e01f2617b85c5bdffc5ffb60b3d8d8ca9519a1f3
+    JAXLIB_RELEASE = "1";
+
+    preConfigure = ''
+      # dummy ldconfig
+      mkdir dummy-ldconfig
+      echo "#!${stdenv.shell}" > dummy-ldconfig/ldconfig
+      chmod +x dummy-ldconfig/ldconfig
+      export PATH="$PWD/dummy-ldconfig:$PATH"
+      cat <<CFG > ./.jax_configure.bazelrc
+      build --strategy=Genrule=standalone
+      build --repo_env PYTHON_BIN_PATH="${python}/bin/python"
+      build --action_env=PYENV_ROOT
+      build --python_path="${python}/bin/python"
+      build --distinct_host_configuration=false
+      build --define PROTOBUF_INCLUDE_PATH="${pkgs.protobuf}/include"
+    '' + lib.optionalString (stdenv.hostPlatform.avxSupport && stdenv.hostPlatform.isUnix) ''
+      build --config=avx_posix
+    '' + lib.optionalString mklSupport ''
+      build --config=mkl_open_source_only
+    '' + lib.optionalString cudaSupport ''
+      build --action_env CUDA_TOOLKIT_PATH="${cudatoolkit_joined}"
+      build --action_env CUDNN_INSTALL_PATH="${cudnn}"
+      build --action_env TF_CUDA_PATHS="${cudatoolkit_joined},${cudnn},${nccl}"
+      build --action_env TF_CUDA_VERSION="${lib.versions.majorMinor cudatoolkit.version}"
+      build --action_env TF_CUDNN_VERSION="${lib.versions.major cudnn.version}"
+      build:cuda --action_env TF_CUDA_COMPUTE_CAPABILITIES="${builtins.concatStringsSep "," cudaFlags.realArches}"
+    '' + ''
+      CFG
+    '';
+
+    # Make sure Bazel knows about our configuration flags during fetching so that the
+    # relevant dependencies can be downloaded.
+    bazelFlags = [
+      "-c opt"
+    ] ++ lib.optionals stdenv.cc.isClang [
+      # bazel depends on the compiler frontend automatically selecting these flags based on file
+      # extension but our clang doesn't.
+      # https://github.com/NixOS/nixpkgs/issues/150655
+      "--cxxopt=-x" "--cxxopt=c++" "--host_cxxopt=-x" "--host_cxxopt=c++"
+    ];
+
+    # We intentionally overfetch so we can share the fetch derivation across all the different configurations
+    fetchAttrs = {
+      TF_SYSTEM_LIBS = lib.concatStringsSep "," tf_system_libs;
+      # we have to force @mkl_dnn_v1 since it's not needed on darwin
+      bazelTargets = [ bazelRunTarget "@mkl_dnn_v1//:mkl_dnn" ];
+      bazelFlags = bazelFlags ++ [
+        "--config=avx_posix"
+      ] ++ lib.optionals cudaSupport [
+        # ideally we'd add this unconditionally too, but it doesn't work on darwin
+        # we make this conditional on `cudaSupport` instead of the system, so that the hash for both
+        # the cuda and the non-cuda deps can be computed on linux, since a lot of contributors don't
+        # have access to darwin machines
+        "--config=cuda"
+      ] ++ [
+        "--config=mkl_open_source_only"
+      ];
+
+      sha256 = (if cudaSupport then {
+        x86_64-linux = "sha256-QczClHxHElLZCqIZlHc3z3DXJ7rZQJaMs2XIb+lxarI=";
+      } else {
+        x86_64-linux = "sha256-mqiJe4u0NYh1PKCbQfbo0U2e9/kYiBqj98d+BPHFSxQ=";
+        aarch64-linux = "sha256-EuLqamVBJ+qoVMCFIYUT846AghltZolfLGdtO9UeXSM=";
+      }).${stdenv.system} or (throw "jaxlib: unsupported system: ${stdenv.system}");
+    };
+
+    buildAttrs = {
+      outputs = [ "out" ];
+
+      TF_SYSTEM_LIBS = lib.concatStringsSep "," (tf_system_libs ++ lib.optionals (!stdenv.isDarwin) [
+        "nsync" # fails to build on darwin
+      ]);
+
+      # Note: we cannot do most of this patching at `patch` phase as the deps are not available yet.
+      # 1) Link protobuf from nixpkgs (through TF_SYSTEM_LIBS when using gcc) to prevent crashes on
+      #    loading multiple extensions in the same python program due to duplicate protobuf DBs.
+      # 2) Patch python path in the compiler driver.
+      preBuild = lib.optionalString cudaSupport ''
+        export NIX_LDFLAGS+=" -L${backendStdenv.nixpkgsCompatibleLibstdcxx}/lib"
+        patchShebangs ../output/external/xla/third_party/gpus/crosstool/clang/bin/crosstool_wrapper_driver_is_not_gcc.tpl
+      '' + lib.optionalString stdenv.isDarwin ''
+        # Framework search paths aren't added by bintools hook
+        # https://github.com/NixOS/nixpkgs/pull/41914
+        export NIX_LDFLAGS+=" -F${IOKit}/Library/Frameworks"
+        substituteInPlace ../output/external/rules_cc/cc/private/toolchain/osx_cc_wrapper.sh.tpl \
+          --replace "/usr/bin/install_name_tool" "${cctools}/bin/install_name_tool"
+        substituteInPlace ../output/external/rules_cc/cc/private/toolchain/unix_cc_configure.bzl \
+          --replace "/usr/bin/libtool" "${cctools}/bin/libtool"
+      '';
+    };
+
+    inherit meta;
+  };
+  platformTag =
+    if stdenv.hostPlatform.isLinux then
+      "manylinux2014_${arch}"
+    else if stdenv.system == "x86_64-darwin" then
+      "macosx_10_9_${arch}"
+    else if stdenv.system == "aarch64-darwin" then
+      "macosx_11_0_${arch}"
+    else throw "Unsupported target platform: ${stdenv.hostPlatform}";
+
+in
+buildPythonPackage {
+  inherit meta pname version;
+  format = "wheel";
+
+  src =
+    let cp = "cp${builtins.replaceStrings ["."] [""] python.pythonVersion}";
+    in "${bazel-build}/jaxlib-${version}-${cp}-${cp}-${platformTag}.whl";
+
+  # Note that cudatoolkit is necessary since jaxlib looks for "ptxas" in $PATH.
+  # See https://github.com/NixOS/nixpkgs/pull/164176#discussion_r828801621 for
+  # more info.
+  postInstall = lib.optionalString cudaSupport ''
+    mkdir -p $out/bin
+    ln -s ${cudatoolkit}/bin/ptxas $out/bin/ptxas
+
+    find $out -type f \( -name '*.so' -or -name '*.so.*' \) | while read lib; do
+      addOpenGLRunpath "$lib"
+      patchelf --set-rpath "${cudatoolkit}/lib:${cudatoolkit.lib}/lib:${cudnn}/lib:${nccl}/lib:$(patchelf --print-rpath "$lib")" "$lib"
+    done
+  '';
+
+  nativeBuildInputs = lib.optional cudaSupport addOpenGLRunpath;
+
+  propagatedBuildInputs = [
+    absl-py
+    curl
+    double-conversion
+    flatbuffers
+    giflib
+    grpc
+    jsoncpp
+    libjpeg_turbo
+    ml-dtypes
+    numpy
+    scipy
+    six
+    snappy
+  ];
+
+  pythonImportsCheck = [
+    "jaxlib"
+    # `import jaxlib` loads surprisingly little. These imports are actually bugs that appeared in the 0.4.11 upgrade.
+    "jaxlib.cpu_feature_guard"
+    "jaxlib.xla_client"
+  ];
+
+  # Without it there are complaints about libcudart.so.11.0 not being found
+  # because RPATH path entries added above are stripped.
+  dontPatchELF = cudaSupport;
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jaxlib/prefetch.sh b/nixpkgs/pkgs/development/python-modules/jaxlib/prefetch.sh
new file mode 100755
index 000000000000..46b2573e3c30
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaxlib/prefetch.sh
@@ -0,0 +1,18 @@
+#! /usr/bin/env nix-shell
+#! nix-shell -i sh -p jq
+
+prefetch () {
+    expr="(import <nixpkgs> { system = \"$2\"; config.cudaSupport = $3; }).python$1.pkgs.jaxlib-bin.src.url"
+    url=$(NIX_PATH=.. nix-instantiate --eval -E "$expr" | jq -r)
+    echo "$url"
+    sha256=$(nix-prefetch-url "$url")
+    nix hash to-sri --type sha256 "$sha256"
+    echo
+}
+
+for py in "39" "310" "311" "312"; do
+    prefetch "$py" "x86_64-linux" "false"
+    prefetch "$py" "aarch64-darwin" "false"
+    prefetch "$py" "x86_64-darwin" "false"
+    prefetch "$py" "x86_64-linux" "true"
+done
diff --git a/nixpkgs/pkgs/development/python-modules/jaxopt/default.nix b/nixpkgs/pkgs/development/python-modules/jaxopt/default.nix
new file mode 100644
index 000000000000..36a43027231d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaxopt/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+, absl-py
+, cvxpy
+, jax
+, jaxlib
+, matplotlib
+, numpy
+, optax
+, scipy
+, scikit-learn
+}:
+
+buildPythonPackage rec {
+  pname = "jaxopt";
+  version = "0.8.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = "jaxopt";
+    rev = "refs/tags/jaxopt-v${version}";
+    hash = "sha256-uVOd3knoku5fKBNXOhCikGtjDuW3TtRqev94OM/8Pgk=";
+  };
+
+  propagatedBuildInputs = [
+    absl-py
+    jax
+    jaxlib
+    matplotlib
+    numpy
+    scipy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    cvxpy
+    optax
+    scikit-learn
+  ];
+
+  pythonImportsCheck = [
+    "jaxopt"
+    "jaxopt.implicit_diff"
+    "jaxopt.linear_solve"
+    "jaxopt.loss"
+    "jaxopt.tree_util"
+  ];
+
+  disabledTests = [
+    # Stack frame issue
+    "test_bisect"
+  ];
+
+  meta = with lib; {
+    homepage = "https://jaxopt.github.io";
+    description = "Hardware accelerated, batchable and differentiable optimizers in JAX";
+    changelog = "https://github.com/google/jaxopt/releases/tag/jaxopt-v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jaxtyping/default.nix b/nixpkgs/pkgs/development/python-modules/jaxtyping/default.nix
new file mode 100644
index 000000000000..364e65012b53
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaxtyping/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, numpy
+, typeguard
+, typing-extensions
+, cloudpickle
+, equinox
+, jax
+, jaxlib
+, torch
+, pytestCheckHook
+}:
+
+let
+  self = buildPythonPackage rec {
+    pname = "jaxtyping";
+    version = "0.2.23";
+    pyproject = true;
+
+    src = fetchFromGitHub {
+      owner = "google";
+      repo = "jaxtyping";
+      rev = "refs/tags/v${version}";
+      hash = "sha256-22dIuIjFgqRmV9AQok02skVt7fm17/WpzBm3FrJ6/zs=";
+    };
+
+    nativeBuildInputs = [
+      hatchling
+    ];
+
+    propagatedBuildInputs = [
+      numpy
+      typeguard
+      typing-extensions
+    ];
+
+    nativeCheckInputs = [
+      cloudpickle
+      equinox
+      jax
+      jaxlib
+      pytestCheckHook
+      torch
+    ];
+
+    doCheck = false;
+
+    # Enable tests via passthru to avoid cyclic dependency with equinox.
+    passthru.tests = {
+      check = self.overridePythonAttrs { doCheck = true; };
+    };
+
+    pythonImportsCheck = [ "jaxtyping" ];
+
+    meta = with lib; {
+      description = "Type annotations and runtime checking for JAX arrays and PyTrees";
+      homepage = "https://github.com/google/jaxtyping";
+      license = licenses.mit;
+      maintainers = with maintainers; [ GaetanLepage ];
+    };
+  };
+ in self
diff --git a/nixpkgs/pkgs/development/python-modules/jaydebeapi/default.nix b/nixpkgs/pkgs/development/python-modules/jaydebeapi/default.nix
new file mode 100644
index 000000000000..378da83759b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jaydebeapi/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jpype1
+}:
+
+buildPythonPackage rec {
+  pname = "jaydebeapi";
+  version = "1.2.3";
+
+  src = fetchPypi {
+    pname = "JayDeBeApi";
+    inherit version;
+    sha256 = "f25e9307fbb5960cb035394c26e37731b64cc465b197c4344cee85ec450ab92f";
+  };
+
+  propagatedBuildInputs = [
+    jpype1
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/baztian/jaydebeapi";
+    license = licenses.lgpl2;
+    description = "Use JDBC database drivers from Python 2/3 or Jython with a DB-API";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jc/default.nix b/nixpkgs/pkgs/development/python-modules/jc/default.nix
new file mode 100644
index 000000000000..39bc43bc4194
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jc/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, stdenv
+, buildPackages
+, buildPythonPackage
+, fetchFromGitHub
+, installShellFiles
+, ruamel-yaml
+, xmltodict
+, pygments
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "jc";
+  version = "1.23.6";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "kellyjonbrazil";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-vAPWMv5vYFl45ZTl+p4HHAXeZ/10VSvubKINoyGPRq4=";
+  };
+
+  propagatedBuildInputs = [ ruamel-yaml xmltodict pygments ];
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  postInstall = let emulator = stdenv.hostPlatform.emulator buildPackages; in ''
+    installShellCompletion --cmd jc \
+      --bash <(${emulator} $out/bin/jc --bash-comp) \
+      --zsh  <(${emulator} $out/bin/jc --zsh-comp)
+  '';
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "jc" ];
+
+  # tests require timezone to set America/Los_Angeles
+  doCheck = false;
+
+  meta = with lib; {
+    description = "This tool serializes the output of popular command line tools and filetypes to structured JSON output";
+    homepage = "https://github.com/kellyjonbrazil/jc";
+    license = licenses.mit;
+    maintainers = with maintainers; [ atemu ];
+    changelog = "https://github.com/kellyjonbrazil/jc/blob/v${version}/CHANGELOG";
+    mainProgram = "jc";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jdatetime/default.nix b/nixpkgs/pkgs/development/python-modules/jdatetime/default.nix
new file mode 100644
index 000000000000..5d2b4e31acea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jdatetime/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "jdatetime";
+  version = "4.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-HdDuIQFgx70wACgDxEPmJgrGAuplsGVlKh1WfTv9yno=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  pythonImportsCheck = [
+    "jdatetime"
+  ];
+
+  meta = with lib; {
+    description = "Jalali datetime binding";
+    homepage = "https://github.com/slashmili/python-jalali";
+    license = licenses.psfl;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jdcal/default.nix b/nixpkgs/pkgs/development/python-modules/jdcal/default.nix
new file mode 100644
index 000000000000..abf5880e80f0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jdcal/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "jdcal";
+  version = "1.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "472872e096eb8df219c23f2689fc336668bdb43d194094b5cc1707e1640acfc8";
+  };
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = {
+    description = "A module containing functions for converting between Julian dates and calendar dates";
+    homepage = "https://github.com/phn/jdcal";
+    license = lib.licenses.bsd2;
+    maintainers = with lib.maintainers; [ lihop ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jedi-language-server/default.nix b/nixpkgs/pkgs/development/python-modules/jedi-language-server/default.nix
new file mode 100644
index 000000000000..fca4a554d328
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jedi-language-server/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, docstring-to-markdown
+, fetchFromGitHub
+, jedi
+, lsprotocol
+, poetry-core
+, pygls
+, pydantic
+, pyhamcrest
+, pytestCheckHook
+, python-lsp-jsonrpc
+, pythonOlder
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "jedi-language-server";
+  version = "0.41.1-unstable-2023-10-04";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pappasam";
+    repo = pname;
+    rev = "c4c470cff67e54593a626b22d1b6b05e56fde3a3";
+    hash = "sha256-qFBni97B/GkabbznnZtWTG4dCHFkOx5UQjuevxq+Uvo=";
+  };
+
+  pythonRelaxDeps = [
+    "pygls"
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    docstring-to-markdown
+    jedi
+    lsprotocol
+    pydantic
+    pygls
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pyhamcrest
+    python-lsp-jsonrpc
+  ];
+
+  preCheck = ''
+    HOME="$(mktemp -d)"
+  '';
+
+  pythonImportsCheck = [
+    "jedi_language_server"
+  ];
+
+  meta = with lib; {
+    description = "A Language Server for the latest version(s) of Jedi";
+    homepage = "https://github.com/pappasam/jedi-language-server";
+    changelog = "https://github.com/pappasam/jedi-language-server/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ doronbehar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jedi/default.nix b/nixpkgs/pkgs/development/python-modules/jedi/default.nix
new file mode 100644
index 000000000000..eb90d3c907ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jedi/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+
+# build-system
+, setuptools
+
+# dependencies
+, parso
+
+# tests
+, attrs
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jedi";
+  version = "0.19.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "davidhalter";
+    repo = "jedi";
+    rev = "v${version}";
+    hash = "sha256-MD7lIKwAwULZp7yLE6jiao2PU6h6RIl0SQ/6b4Lq+9I=";
+    fetchSubmodules = true;
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    parso
+  ];
+
+  nativeCheckInputs = [
+    attrs
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  disabledTests = [
+    # sensitive to platform, causes false negatives on darwin
+    "test_import"
+  ] ++ lib.optionals (stdenv.isAarch64 && pythonOlder "3.9") [
+    # AssertionError: assert 'foo' in ['setup']
+    "test_init_extension_module"
+  ];
+
+  meta = with lib; {
+    description = "An autocompletion tool for Python that can be used for text editors";
+    homepage = "https://github.com/davidhalter/jedi";
+    changelog = "https://github.com/davidhalter/jedi/blob/${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jeepney/default.nix b/nixpkgs/pkgs/development/python-modules/jeepney/default.nix
new file mode 100644
index 000000000000..3ba062e1ac54
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jeepney/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, flit-core
+, async-timeout
+, dbus
+, pytest
+, pytest-trio
+, pytest-asyncio
+, testpath
+, trio
+}:
+
+buildPythonPackage rec {
+  pname = "jeepney";
+  version = "0.8.0";
+
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  nativeCheckInputs = [
+    async-timeout
+    dbus
+    pytest
+    pytest-trio
+    pytest-asyncio
+    testpath
+    trio
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    dbus-run-session --config-file=${dbus}/share/dbus-1/session.conf -- pytest
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "jeepney"
+    "jeepney.auth"
+    "jeepney.io"
+    "jeepney.io.asyncio"
+    "jeepney.io.blocking"
+    "jeepney.io.threading"
+    "jeepney.io.trio"
+  ];
+
+  meta = with lib; {
+    homepage = "https://gitlab.com/takluyver/jeepney";
+    description = "Pure Python DBus interface";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jello/default.nix b/nixpkgs/pkgs/development/python-modules/jello/default.nix
new file mode 100644
index 000000000000..01525078bcaa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jello/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, installShellFiles
+, pygments
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jello";
+  version = "1.6.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "kellyjonbrazil";
+    repo = "jello";
+    rev = "v${version}";
+    hash = "sha256-EN09Kcnw4HNT2roCoQyZkoHEfkM9qxqtneZPuBg46z4=";
+  };
+
+  nativeBuildInputs = [
+    installShellFiles
+  ];
+
+  propagatedBuildInputs = [
+    pygments
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [ "jello" ];
+
+  postInstall = ''
+    installManPage man/jello.1
+  '';
+
+  meta = with lib; {
+    description = "CLI tool to filter JSON and JSON Lines data with Python syntax";
+    homepage = "https://github.com/kellyjonbrazil/jello";
+    changelog = "https://github.com/kellyjonbrazil/jello/blob/${src.rev}/CHANGELOG";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jellyfin-apiclient-python/default.nix b/nixpkgs/pkgs/development/python-modules/jellyfin-apiclient-python/default.nix
new file mode 100644
index 000000000000..4413f081a635
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jellyfin-apiclient-python/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, certifi
+, fetchPypi
+, pythonOlder
+, requests
+, urllib3
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "jellyfin-apiclient-python";
+  version = "1.9.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vMzZeoiWli3HjM8Dqr5RhNfR7gcjPqoXG3b/aNNlx2Q=";
+  };
+
+  propagatedBuildInputs = [
+    certifi
+    requests
+    urllib3
+    websocket-client
+  ];
+
+  # Module has no test
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "jellyfin_apiclient_python"
+  ];
+
+  meta = with lib; {
+    description = "Python API client for Jellyfin";
+    homepage = "https://github.com/jellyfin/jellyfin-apiclient-python";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ jojosch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jellyfish/default.nix b/nixpkgs/pkgs/development/python-modules/jellyfish/default.nix
new file mode 100644
index 000000000000..5afe54567cb4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jellyfish/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, pytest
+, unicodecsv
+, rustPlatform
+, libiconv
+}:
+
+buildPythonPackage rec {
+  pname = "jellyfish";
+  version = "1.0.0";
+
+  disabled = !isPy3k;
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-iBquNnGZm7B85QwnaW8pyn6ELz4SOswNtlJcmZmIG9Q=";
+  };
+
+  nativeBuildInputs = with rustPlatform; [
+    maturinBuildHook
+    cargoSetupHook
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    libiconv
+  ];
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}-rust-dependencies";
+    hash = "sha256-Grk+n4VCPjirafcRWWI51jHw/IFUYkBtbXY739j0MFI=";
+  };
+
+  nativeCheckInputs = [ pytest unicodecsv ];
+
+  meta = {
+    homepage = "https://github.com/sunlightlabs/jellyfish";
+    description = "Approximate and phonetic matching of strings";
+    maintainers = with lib.maintainers; [ koral ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jenkins-job-builder/default.nix b/nixpkgs/pkgs/development/python-modules/jenkins-job-builder/default.nix
new file mode 100644
index 000000000000..05f857641b66
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jenkins-job-builder/default.nix
@@ -0,0 +1,42 @@
+{ lib, buildPythonPackage, fetchPypi, fasteners
+, jinja2
+, pbr
+, python-jenkins
+, pyyaml
+, six
+, stevedore
+}:
+
+buildPythonPackage rec {
+  pname = "jenkins-job-builder";
+  version = "5.0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+zrsfyi4I8venFGMKXDMUq+9+f7y6IY59y1/OJDExGs=";
+  };
+
+  postPatch = ''
+    # relax version constraint, https://storyboard.openstack.org/#!/story/2009723
+    substituteInPlace requirements.txt --replace 'PyYAML>=3.10.0,<6' 'PyYAML>=3.10.0'
+
+    # Allow building with setuptools from nixpkgs.
+    # Related: https://github.com/NixOS/nixpkgs/issues/238226.
+    substituteInPlace requirements.txt --replace 'setuptools<=65.7.0' 'setuptools'
+
+    export HOME=$TMPDIR
+  '';
+
+  propagatedBuildInputs = [ pbr python-jenkins pyyaml six stevedore fasteners jinja2 ];
+
+  # Need to fix test deps, relies on stestr and a few other packages that aren't available on nixpkgs
+  checkPhase = "$out/bin/jenkins-jobs --help";
+
+  meta = with lib; {
+    description = "Jenkins Job Builder is a system for configuring Jenkins jobs using simple YAML files stored in Git";
+    homepage = "https://docs.openstack.org/infra/jenkins-job-builder/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jenkinsapi/default.nix b/nixpkgs/pkgs/development/python-modules/jenkinsapi/default.nix
new file mode 100644
index 000000000000..eafc2b49e74c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jenkinsapi/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, mock
+, pbr
+, pytest-mock
+, pytestCheckHook
+, pytz
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "jenkinsapi";
+  version = "0.3.13";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JGqYpj5h9UoV0WEFyxVIjFZwc030HobHrw1dnAryQLk=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    pytz
+    requests
+    six
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  # don't run tests that try to spin up jenkins
+  disabledTests = [ "systests" ];
+
+  pythonImportsCheck = [ "jenkinsapi" ];
+
+  meta = with lib; {
+    description = "A Python API for accessing resources on a Jenkins continuous-integration server";
+    homepage = "https://github.com/salimfadhley/jenkinsapi";
+    maintainers = with maintainers; [ drets ] ++ teams.deshaw.members;
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jieba/default.nix b/nixpkgs/pkgs/development/python-modules/jieba/default.nix
new file mode 100644
index 000000000000..a0fd5acf440a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jieba/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchFromGitHub, glibcLocales, python, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "jieba";
+  version = "0.42.1";
+
+  # no tests in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "fxsjy";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "028vmd6sj6wn9l1ilw7qfmlpyiysnlzdgdlhwxs6j4fvq0gyrwxk";
+  };
+
+  nativeCheckInputs = [ glibcLocales ];
+
+  # UnicodeEncodeError
+  doCheck = isPy3k;
+
+  # Citing https://github.com/fxsjy/jieba/issues/384: "testcases is in a mess"
+  # So just picking random ones that currently work
+  checkPhase = ''
+    export LC_ALL=en_US.UTF-8
+    ${python.interpreter} test/test.py
+    ${python.interpreter} test/test_tokenize.py
+  '';
+
+  meta = with lib; {
+    description = "Chinese Words Segementation Utilities";
+    homepage = "https://github.com/fxsjy/jieba";
+    license = licenses.mit;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jinja2-ansible-filters/default.nix b/nixpkgs/pkgs/development/python-modules/jinja2-ansible-filters/default.nix
new file mode 100644
index 000000000000..79af7744a866
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jinja2-ansible-filters/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi
+, jinja2
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "jinja2-ansible-filters";
+  version = "1.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-B8EM9E1wc/TwEQLKEtmi3DG0HUfkxh7ZLvam0mabNWs=";
+  };
+
+  propagatedBuildInputs = [
+    jinja2
+    pyyaml
+  ];
+
+  # no tests include in sdist, and source not available
+  doCheck = false;
+
+  pythonImportsCheck = [ "jinja2_ansible_filters" ];
+
+  meta = with lib; {
+    description = "Jinja2 Ansible Filters";
+    homepage = "https://pypi.org/project/jinja2-ansible-filters/";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jinja2-git/default.nix b/nixpkgs/pkgs/development/python-modules/jinja2-git/default.nix
new file mode 100644
index 000000000000..518f62c54030
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jinja2-git/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, jinja2
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "jinja2-git";
+  version = "1.3.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "wemake-services";
+    repo = "jinja2-git";
+    rev = "refs/tags/${version}";
+    hash = "sha256-XuN2L3/HLcZ/WPWiCtufDOmkxj+q4I6IOgjrGQHfNLk=";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [ jinja2 ];
+
+  # the tests need to be run on the git repository
+  doCheck = false;
+
+  pythonImportsCheck = [ "jinja2_git" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/wemake-services/jinja2-git";
+    description = "Jinja2 extension to handle git-specific things";
+    changelog = "https://github.com/wemake-services/jinja2-git/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jinja2-pluralize/default.nix b/nixpkgs/pkgs/development/python-modules/jinja2-pluralize/default.nix
new file mode 100644
index 000000000000..2187c1a24147
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jinja2-pluralize/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jinja2
+, inflect
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jinja2-pluralize";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    pname = "jinja2_pluralize";
+    inherit version;
+    hash = "sha256-31wtUBe5tUwKZst5DMqfwIlFg3w9v8MjWJID8f+3PBw=";
+  };
+
+  propagatedBuildInputs = [
+    jinja2
+    inflect
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "jinja2_pluralize"
+  ];
+
+  meta = with lib; {
+    description = "Jinja2 pluralize filters";
+    homepage = "https://github.com/audreyr/jinja2_pluralize";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ dzabraev ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jinja2-time/default.nix b/nixpkgs/pkgs/development/python-modules/jinja2-time/default.nix
new file mode 100644
index 000000000000..3daf84fa69d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jinja2-time/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, arrow
+, freezegun
+, jinja2
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jinja2-time";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0h0dr7cfpjnjj8bgl2vk9063a53649pn37wnlkd8hxjy656slkni";
+  };
+
+  patches = [
+    # fix usage of arrow in tests
+    (fetchpatch {
+      url = "https://github.com/hackebrot/jinja2-time/pull/19/commits/3b2476c266ba53262352153104ca3501722823a4.patch";
+      hash = "sha256-zh4PpAj2GtpgaEap/Yvu6DNY84AwH/YTJlUPRRHPyTs=";
+    })
+  ];
+
+  propagatedBuildInputs = [ arrow jinja2 ];
+
+  nativeCheckInputs = [ freezegun pytestCheckHook ];
+
+  pythonImportsCheck = [ "jinja2_time" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/hackebrot/jinja2-time";
+    description = "Jinja2 Extension for Dates and Times";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jinja2/default.nix b/nixpkgs/pkgs/development/python-modules/jinja2/default.nix
new file mode 100644
index 000000000000..1fb7b26db5b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jinja2/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, babel
+, markupsafe
+, pytestCheckHook
+, sphinxHook
+, pallets-sphinx-themes
+, sphinxcontrib-log-cabinet
+, sphinx-issues
+, enableDocumentation ? false
+}:
+
+buildPythonPackage rec {
+  pname = "Jinja2";
+  version = "3.1.2";
+  outputs = [ "out" ] ++ lib.optional enableDocumentation "doc";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MTUacCpAip51laj8YVD8P0O7a/fjGXcMvA2535Q36FI=";
+  };
+
+  patches = lib.optionals enableDocumentation [ ./patches/import-order.patch ];
+
+  propagatedBuildInputs = [
+    babel
+    markupsafe
+  ];
+
+  nativeBuildInputs = lib.optionals enableDocumentation [
+    sphinxHook
+    sphinxcontrib-log-cabinet
+    pallets-sphinx-themes
+    sphinx-issues
+  ];
+
+  # Multiple tests run out of stack space on 32bit systems with python2.
+  # See https://github.com/pallets/jinja/issues/1158
+  doCheck = !stdenv.is32bit;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    # Avoid failure due to deprecation warning
+    # Fixed in https://github.com/python/cpython/pull/28153
+    # Remove after cpython 3.9.8
+    "-p no:warnings"
+  ];
+
+  meta = with lib; {
+    homepage = "https://jinja.palletsprojects.com/";
+    description = "Stand-alone template engine";
+    license = licenses.bsd3;
+    longDescription = ''
+      Jinja is a fast, expressive, extensible templating engine. Special
+      placeholders in the template allow writing code similar to Python
+      syntax. Then the template is passed data to render the final document.
+      an optional sandboxed environment.
+    '';
+    maintainers = with maintainers; [ pierron ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jinja2/patches/import-order.patch b/nixpkgs/pkgs/development/python-modules/jinja2/patches/import-order.patch
new file mode 100644
index 000000000000..38514dff24e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jinja2/patches/import-order.patch
@@ -0,0 +1,27 @@
+Sphinx changed something between sphinx=4.5.0 and sphinx=5.3 that broke
+"sphinxcontrib.log_cabinet" plugin.
+
+When Sphinx tries to importlib.import_module("sphinxcontrib.log_cabinet"), it
+has couple other sphinxcontrib.* libraries in sys.path, and they seem to cause
+conflict. So here I purge sys.path from sphixcontrib-related things, import
+log_cabinet and put everything back, so when Sphinx will do "import_module",
+"sphinxcontrib.log_cabinet" will be already imported and cached.
+
+All this is quite hacky, but we are talking about merely building documentation
+here. If resulting html looks good, what happened in Nix sandbox stays in Nix
+sandbox.
+
+--- a/docs/conf.py	1970-01-01 00:00:00.000000000 -0000
++++ b/docs/conf.py	1970-01-01 00:00:00.000000000 -0000
+@@ -1,5 +1,12 @@
+ from pallets_sphinx_themes import get_version
+ from pallets_sphinx_themes import ProjectLink
++import importlib
++import sys
++
++saved_path = sys.path
++sys.path = [x for x in sys.path if "sphinxcontrib" not in x or "cabinet" in x]
++import sphinxcontrib.log_cabinet
++sys.path = saved_path
+ 
+ # Project --------------------------------------------------------------
diff --git a/nixpkgs/pkgs/development/python-modules/jira/default.nix b/nixpkgs/pkgs/development/python-modules/jira/default.nix
new file mode 100644
index 000000000000..fa7e2b18e6f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jira/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, defusedxml
+, flaky
+, keyring
+, requests-mock
+, requests-oauthlib
+, requests-toolbelt
+, setuptools-scm
+, setuptools-scm-git-archive
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "jira";
+  version = "3.5.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pycontribs";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-9hzKN57OHi2be9C2mtHZU1KcpbcKxiiYDj9Vw7MxTK4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+    setuptools-scm-git-archive
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  propagatedBuildInputs = [
+    defusedxml
+    keyring
+    requests-oauthlib
+    requests-toolbelt
+  ];
+
+  nativeCheckInputs = [
+    flaky
+    pytestCheckHook
+    requests-mock
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov-report=xml --cov jira" ""
+  '';
+
+  pythonImportsCheck = [
+    "jira"
+  ];
+
+  # impure tests because of connectivity attempts to jira servers
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Library to interact with the JIRA REST API";
+    homepage = "https://github.com/pycontribs/jira";
+    changelog = "https://github.com/pycontribs/jira/releases/tag/${version}";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jiwer/default.nix b/nixpkgs/pkgs/development/python-modules/jiwer/default.nix
new file mode 100644
index 000000000000..d042726daa6a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jiwer/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pythonRelaxDepsHook
+, rapidfuzz
+, click
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "jiwer";
+  version = "3.0.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jitsi";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-32bpSBYl6yxb4lJhHnfnYhtye7DaBZT0VAe9rDcleTc=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    rapidfuzz
+    click
+  ];
+
+  pythonRelaxDeps = [
+    "rapidfuzz"
+  ];
+
+  pythonImportsCheck = [
+    "jiwer"
+  ];
+
+  meta = with lib; {
+    description = "A simple and fast python package to evaluate an automatic speech recognition system";
+    homepage = "https://github.com/jitsi/jiwer";
+    changelog = "https://github.com/jitsi/jiwer/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jmespath/default.nix b/nixpkgs/pkgs/development/python-modules/jmespath/default.nix
new file mode 100644
index 000000000000..db761a982305
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jmespath/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hypothesis
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jmespath";
+  version = "1.0.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-kCYbIG1t79WP3V6F9Hi/YzopAXmJBr4q04kVDFxg7b4=";
+  };
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jmespath/jmespath.py";
+    description = "JMESPath allows you to declaratively specify how to extract elements from a JSON document";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jmp/default.nix b/nixpkgs/pkgs/development/python-modules/jmp/default.nix
new file mode 100644
index 000000000000..2435d90accaf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jmp/default.nix
@@ -0,0 +1,40 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, jax
+, jaxlib
+, lib
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jmp";
+  version = "0.0.4";
+
+  src = fetchFromGitHub {
+    owner = "deepmind";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+PefZU1209vvf1SfF8DXiTvKYEnZ4y8iiIr8yKikx9Y=";
+  };
+
+  # Wheel requires only `numpy`, but the import needs `jax`.
+  propagatedBuildInputs = [
+    jax
+  ];
+
+  pythonImportsCheck = [
+    "jmp"
+  ];
+
+  nativeCheckInputs = [
+    jaxlib
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "This library implements support for mixed precision training in JAX.";
+    homepage = "https://github.com/deepmind/jmp";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ndl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/joblib/default.nix b/nixpkgs/pkgs/development/python-modules/joblib/default.nix
new file mode 100644
index 000000000000..76eea5097581
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/joblib/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, stdenv
+
+# build-system
+, setuptools
+
+# propagates (optional, but unspecified)
+# https://github.com/joblib/joblib#dependencies
+, lz4
+, psutil
+
+# tests
+, pytestCheckHook
+, threadpoolctl
+}:
+
+
+buildPythonPackage rec {
+  pname = "joblib";
+  version = "1.3.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-kvhl5iHhd4TnlVCAttBCSJ47jilJScxExurDBPWXcrE=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    lz4
+    psutil
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    threadpoolctl
+  ];
+
+  pytestFlagsArray = [
+    "joblib/test"
+  ];
+
+  disabledTests = [
+    "test_disk_used" # test_disk_used is broken: https://github.com/joblib/joblib/issues/57
+    "test_parallel_call_cached_function_defined_in_jupyter" # jupyter not available during tests
+    "test_nested_parallel_warnings" # tests is flaky under load
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_dispatch_multiprocessing" # test_dispatch_multiprocessing is broken only on Darwin.
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/joblib/joblib/releases/tag/${version}";
+    description = "Lightweight pipelining: using Python functions as pipeline jobs";
+    homepage = "https://joblib.readthedocs.io/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/johnnycanencrypt/default.nix b/nixpkgs/pkgs/development/python-modules/johnnycanencrypt/default.nix
new file mode 100644
index 000000000000..b65fbca46993
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/johnnycanencrypt/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, rustPlatform
+, pkg-config
+, pcsclite
+, nettle
+, httpx
+, pytestCheckHook
+, pythonOlder
+, vcrpy
+, PCSC
+, libiconv
+}:
+
+buildPythonPackage rec {
+  pname = "johnnycanencrypt";
+  version = "0.14.1";
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "kushaldas";
+    repo = "johnnycanencrypt";
+    rev = "v${version}";
+    hash = "sha256-13zIC+zH/BebMplUfdtiwEEVODS+jTURC1vudbmQPlA=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-u3qKli76XGS0Ijg15BQzbFlfLPpBPFKh++EZLfnO9ps=";
+  };
+
+  format = "pyproject";
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  nativeBuildInputs = [
+    pkg-config
+  ] ++ (with rustPlatform; [
+    bindgenHook
+    cargoSetupHook
+    maturinBuildHook
+  ]);
+
+  buildInputs = [
+    nettle
+  ] ++ lib.optionals stdenv.isLinux [
+    pcsclite
+  ] ++ lib.optionals stdenv.isDarwin [
+    PCSC
+    libiconv
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    vcrpy
+  ];
+
+  preCheck = ''
+    # import from $out
+    rm -r johnnycanencrypt
+  '';
+
+  pythonImportsCheck = [ "johnnycanencrypt" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/kushaldas/johnnycanencrypt";
+    changelog = "https://github.com/kushaldas/johnnycanencrypt/blob/v${version}/changelog.md";
+    description = "Python module for OpenPGP written in Rust";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ _0x4A6F ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/josepy/default.nix b/nixpkgs/pkgs/development/python-modules/josepy/default.nix
new file mode 100644
index 000000000000..f8a76641f537
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/josepy/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchpatch
+, fetchPypi
+, pyopenssl
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "josepy";
+  version = "1.13.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-iTHa84+KTIUnSg6LfLJa3f2NHyj5+4++0FPdUa7HXck=";
+  };
+
+  patches = [
+    # https://github.com/certbot/josepy/pull/158
+    (fetchpatch {
+      name = "fix-setuptools-deprecation.patch";
+      url = "https://github.com/certbot/josepy/commit/8f1b4b57a29a868a87fd6eee19a67a7ebfc07ea1.patch";
+      hash = "sha256-9d+Bk/G4CJXpnjJU0YkXLsg0G3tPxR8YN2niqriQQkI=";
+      includes = [ "tests/test_util.py" ];
+    })
+  ];
+
+  propagatedBuildInputs = [
+    pyopenssl
+    cryptography
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace " --flake8 --cov-report xml --cov-report=term-missing --cov=josepy --cov-config .coveragerc" ""
+    sed -i '/flake8-ignore/d' pytest.ini
+  '';
+
+  pythonImportsCheck = [
+    "josepy"
+  ];
+
+  meta = with lib; {
+    description = "JOSE protocol implementation in Python";
+    homepage = "https://github.com/jezdez/josepy";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jplephem/default.nix b/nixpkgs/pkgs/development/python-modules/jplephem/default.nix
new file mode 100644
index 000000000000..d945d9c11c56
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jplephem/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, numpy, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "jplephem";
+  version = "2.20";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-u5htUI6kbGiTaomWiaZE21+grznJpQRCIImgA+yg4fo=";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  # Weird import error, only happens in testing:
+  #   File "/build/jplephem-2.17/jplephem/daf.py", line 10, in <module>
+  #     from numpy import array as numpy_array, ndarray
+  # ImportError: cannot import name 'array' from 'sys' (unknown location)
+  doCheck = false;
+
+  pythonImportsCheck = [ "jplephem" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/brandon-rhodes/python-jplephem/";
+    description = "Python version of NASA DE4xx ephemerides, the basis for the Astronomical Alamanac";
+    license = licenses.mit;
+    maintainers = with maintainers; [ zane ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jproperties/default.nix b/nixpkgs/pkgs/development/python-modules/jproperties/default.nix
new file mode 100644
index 000000000000..c67fea93b13a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jproperties/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, six
+, pytest-datadir
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "jproperties";
+  version = "2.1.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Tblue";
+    repo = "python-jproperties";
+    rev = "v${version}";
+    hash = "sha256-O+ALeGHMNjW1dc9IRyLzO81k8DW2vbGjuZqXxgrhYjo=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytest-datadir
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "setuptools_scm ~= 3.3" "setuptools_scm"
+    substituteInPlace pytest.ini \
+      --replace "--cov=jproperties --cov-report=term --cov-report=html --cov-branch" ""
+  '';
+
+  disabledTestPaths = [
+    # TypeError: 'PosixPath' object...
+    "tests/test_simple_utf8.py"
+  ];
+
+  pythonImportsCheck = [
+    "jproperties"
+  ];
+
+  meta = with lib; {
+    description = "Java Property file parser and writer for Python";
+    homepage = "https://github.com/Tblue/python-jproperties";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jpylyzer/default.nix b/nixpkgs/pkgs/development/python-modules/jpylyzer/default.nix
new file mode 100644
index 000000000000..81f3c11b1b1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jpylyzer/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, six
+, lxml
+, pytestCheckHook
+, doFullCheck ? false  # weird filenames cause issues on some filesystems
+
+# for passthru.tests
+, jpylyzer
+}:
+
+let
+  # unclear relationship between test-files version and jpylyzer version.
+  # upstream appears to just always test against the latest version, so
+  # probably worth updating this when package is bumped.
+  testFiles = fetchFromGitHub {
+    owner = "openpreserve";
+    repo = "jpylyzer-test-files";
+    rev = "146cb0029b5ea9d8ef22dc6683cec8afae1cc63a";
+    hash = "sha256-uKUau7mYXqGs4dSnXGPnPsH9k81ZCK0aPj5F9HWBMZ8=";
+  };
+
+in buildPythonPackage rec {
+  pname = "jpylyzer";
+  version = "2.1.0";
+
+  src = fetchFromGitHub {
+    owner = "openpreserve";
+    repo = pname;
+    rev = version;
+    hash = "sha256-LBVOwjWC/HEvGgoi8WxEdl33M4JrfdHEj1Dk7f1NAiA=";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  nativeCheckInputs = [ pytestCheckHook lxml ];
+
+  # don't depend on testFiles unless doFullCheck as it may not be extractable
+  # on some filesystems due to weird filenames
+  preCheck = lib.optionalString doFullCheck ''
+    sed -i '/^testFilesDir = /ctestFilesDir = "${testFiles}"' tests/unit/test_testfiles.py
+  '';
+  disabledTestPaths = lib.optionals (!doFullCheck) [
+    "tests/unit/test_testfiles.py"
+  ];
+
+  pythonImportsCheck = [ "jpylyzer" ];
+
+  disallowedReferences = [ testFiles ];
+
+  passthru.tests = {
+    withFullCheck = jpylyzer.override { doFullCheck = true; };
+  };
+
+  meta = with lib; {
+    description = "JP2 (JPEG 2000 Part 1) image validator and properties extractor";
+    homepage = "https://jpylyzer.openpreservation.org/";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ ris ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jpype1/default.nix b/nixpkgs/pkgs/development/python-modules/jpype1/default.nix
new file mode 100644
index 000000000000..dc1601239187
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jpype1/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, packaging
+, pythonOlder
+, typing-extensions
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "jpype1";
+  version = "1.4.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    pname = "JPype1";
+    inherit version;
+    hash = "sha256-3I7oVAc0dK15rhaNkML2iThU9Yk2z6GPNYfK2uDTaW0=";
+  };
+
+  propagatedBuildInputs = [
+    packaging
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  # required openjdk (easy) but then there were some class path issues
+  # when running the tests
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/originell/jpype/";
+    sourceProvenance = with sourceTypes; [
+      fromSource
+      binaryBytecode
+    ];
+    license = licenses.asl20;
+    description = "A Python to Java bridge";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jq/default.nix b/nixpkgs/pkgs/development/python-modules/jq/default.nix
new file mode 100644
index 000000000000..d7dc37b06852
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jq/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchFromGitHub
+, fetchpatch
+, jq
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "jq";
+  version = "1.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mwilliamson";
+    repo = "jq.py";
+    rev = "refs/tags/${version}";
+    hash = "sha256-mITk5y2AdUc9kZ/WrsnHxS1GRRmO4FDbPRgTtV2gIXI=";
+  };
+
+  patches = [
+    # Removes vendoring
+    ./jq-py-setup.patch
+    (fetchpatch {
+      url = "https://github.com/mwilliamson/jq.py/commit/805705dde4beb9db9a1743663d415198fb02eb1a.patch";
+      includes = [ "tests/*" ];
+      hash = "sha256-AgdpwmtOTeJ4nSbM6IknKaIVqqtWkpxTTtblXjlbWeA=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  buildInputs = [
+    jq
+  ];
+
+  preBuild = ''
+    cython jq.pyx
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "jq"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for jq, the flexible JSON processor";
+    homepage = "https://github.com/mwilliamson/jq.py";
+    changelog = "https://github.com/mwilliamson/jq.py/blob/${version}/CHANGELOG.rst";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ benley ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jq/jq-py-setup.patch b/nixpkgs/pkgs/development/python-modules/jq/jq-py-setup.patch
new file mode 100644
index 000000000000..0894b776fef6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jq/jq-py-setup.patch
@@ -0,0 +1,111 @@
+diff --git a/setup.py b/setup.py
+index 01cc813..15e9048 100644
+--- a/setup.py
++++ b/setup.py
+@@ -1,97 +1,18 @@
+ #!/usr/bin/env python
+ 
+ import os
+-import subprocess
+-import tarfile
+-import shutil
+-import sysconfig
+ 
+ from setuptools import setup
+-from setuptools.command.build_ext import build_ext
+ from setuptools.extension import Extension
+ 
+-
+-def _path_in_dir(relative_path):
+-    return os.path.abspath(os.path.join(os.path.dirname(__file__), relative_path))
+-
+-def _dep_source_path(relative_path):
+-    return os.path.join(_path_in_dir("deps"), relative_path)
+-
+-def _dep_build_path(relative_path):
+-    return os.path.join(_path_in_dir("_deps/build"), relative_path)
+-
+ def _read(fname):
+     return open(os.path.join(os.path.dirname(__file__), fname)).read()
+ 
+ 
+-jq_lib_tarball_path = _dep_source_path("jq-1.6.tar.gz")
+-jq_lib_dir = _dep_build_path("jq-1.6")
+-
+-oniguruma_version = "6.9.4"
+-oniguruma_lib_tarball_path = _dep_source_path("onig-{}.tar.gz".format(oniguruma_version))
+-oniguruma_lib_build_dir = _dep_build_path("onig-{}".format(oniguruma_version))
+-oniguruma_lib_install_dir = _dep_build_path("onig-install-{}".format(oniguruma_version))
+-
+-class jq_build_ext(build_ext):
+-    def run(self):
+-        if not os.path.exists(_dep_build_path(".")):
+-            os.makedirs(_dep_build_path("."))
+-        self._build_oniguruma()
+-        self._build_libjq()
+-        build_ext.run(self)
+-
+-    def _build_oniguruma(self):
+-        self._build_lib(
+-            tarball_path=oniguruma_lib_tarball_path,
+-            lib_dir=oniguruma_lib_build_dir,
+-            commands=[
+-                ["./configure", "CFLAGS=-fPIC", "--prefix=" + oniguruma_lib_install_dir],
+-                ["make"],
+-                ["make", "install"],
+-            ])
+-
+-
+-    def _build_libjq(self):
+-        self._build_lib(
+-            tarball_path=jq_lib_tarball_path,
+-            lib_dir=jq_lib_dir,
+-            commands=[
+-                ["./configure", "CFLAGS=-fPIC -pthread", "--disable-maintainer-mode", "--with-oniguruma=" + oniguruma_lib_install_dir],
+-                ["make"],
+-            ])
+-
+-    def _build_lib(self, tarball_path, lib_dir, commands):
+-        self._extract_tarball(
+-            tarball_path=tarball_path,
+-            lib_dir=lib_dir,
+-        )
+-
+-        macosx_deployment_target = sysconfig.get_config_var("MACOSX_DEPLOYMENT_TARGET")
+-        if macosx_deployment_target:
+-            os.environ['MACOSX_DEPLOYMENT_TARGET'] = str(macosx_deployment_target)
+-
+-        def run_command(args):
+-            print("Executing: %s" % ' '.join(args))
+-            subprocess.check_call(args, cwd=lib_dir)
+-
+-        for command in commands:
+-            run_command(command)
+-
+-    def _extract_tarball(self, tarball_path, lib_dir):
+-        if os.path.exists(lib_dir):
+-            shutil.rmtree(lib_dir)
+-        tarfile.open(tarball_path, "r:gz").extractall(_dep_build_path("."))
+-
+-
+ jq_extension = Extension(
+     "jq",
+     sources=["jq.c"],
+-    include_dirs=[os.path.join(jq_lib_dir, "src")],
+-    extra_link_args=["-lm"],
+-    extra_objects=[
+-        os.path.join(jq_lib_dir, ".libs/libjq.a"),
+-        os.path.join(oniguruma_lib_install_dir, "lib/libonig.a"),
+-    ],
++    libraries=["jq"]
+ )
+ 
+ setup(
+@@ -104,7 +25,6 @@ def _extract_tarball(self, tarball_path, lib_dir):
+     python_requires='>=3.5',
+     license='BSD 2-Clause',
+     ext_modules = [jq_extension],
+-    cmdclass={"build_ext": jq_build_ext},
+     classifiers=[
+         'Development Status :: 5 - Production/Stable',
+         'Intended Audience :: Developers',
diff --git a/nixpkgs/pkgs/development/python-modules/js2py/default.nix b/nixpkgs/pkgs/development/python-modules/js2py/default.nix
new file mode 100644
index 000000000000..9bbfe091c892
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/js2py/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, tzlocal
+, six
+, pyjsparser
+}:
+
+buildPythonPackage rec {
+  pname = "js2py";
+  version = "0.74";
+
+  src = fetchPypi {
+    pname = "Js2Py";
+    inherit version;
+    hash = "sha256-OfOmqoRpGA77o8hncnHfJ8MTMv0bRx3xryr1i4e4ly8=";
+  };
+
+  propagatedBuildInputs = [
+    pyjsparser
+    six
+    tzlocal
+  ];
+
+  # Test require network connection
+  doCheck = false;
+
+  pythonImportsCheck = [ "js2py" ];
+
+  meta = with lib; {
+    description = "JavaScript to Python Translator & JavaScript interpreter written in 100% pure Python";
+    homepage = "https://github.com/PiotrDabkowski/Js2Py";
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsbeautifier/default.nix b/nixpkgs/pkgs/development/python-modules/jsbeautifier/default.nix
new file mode 100644
index 000000000000..4cd2a2886d6c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsbeautifier/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, editorconfig
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "jsbeautifier";
+  version = "1.14.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xzjrw2tHvZTkym3RepAEw8x07a1YLKHWDg5dWUWmPLk=";
+  };
+
+  propagatedBuildInputs = [
+    editorconfig
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "jsbeautifier"
+  ];
+
+  pytestFlagsArray = [
+    "jsbeautifier/tests/testindentation.py"
+  ];
+
+  meta = with lib; {
+    description = "JavaScript unobfuscator and beautifier";
+    homepage = "http://jsbeautifier.org";
+    changelog = "https://github.com/beautify-web/js-beautify/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ apeyroux ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jschema-to-python/default.nix b/nixpkgs/pkgs/development/python-modules/jschema-to-python/default.nix
new file mode 100644
index 000000000000..e217592e99b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jschema-to-python/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchPypi
+, attrs
+, jsonpickle
+, pbr
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jschema-to-python";
+  version = "1.2.3";
+
+  src = fetchPypi {
+    pname = "jschema_to_python";
+    inherit version;
+    sha256 = "76ff14fe5d304708ccad1284e4b11f96a658949a31ee7faed9e0995279549b91";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    jsonpickle
+    pbr
+  ];
+
+  nativeCheckInputs =[
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "jschema_to_python" ];
+
+  meta = with lib; {
+    description = "Generate source code for Python classes from a JSON schema";
+    homepage = "https://github.com/microsoft/jschema-to-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsmin/default.nix b/nixpkgs/pkgs/development/python-modules/jsmin/default.nix
new file mode 100644
index 000000000000..a36c350264be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsmin/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "jsmin";
+  version = "3.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "jsmin/test.py"
+  ];
+
+  pythonImportsCheck = [
+    "jsmin"
+  ];
+
+  meta = with lib; {
+    description = "JavaScript minifier";
+    homepage = "https://github.com/tikitu/jsmin/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/json-home-client/default.nix b/nixpkgs/pkgs/development/python-modules/json-home-client/default.nix
new file mode 100644
index 000000000000..6b63733505c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/json-home-client/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+# build inputs
+, typing-extensions
+, uri-template
+}:
+
+buildPythonPackage rec {
+  pname = "json-home-client";
+  version = "1.1.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "plinss";
+    repo = "json_home_client";
+    rev = "v${version}";
+    hash = "sha256-DhnvvY1nMe1sdRE+OgjBt4TsLmiqnD8If4rl700zW9E=";
+  };
+
+  postPatch = ''
+    sed -i -e 's/0.0.0/${version}/' setup.py
+  '';
+
+  propagatedBuildInputs = [
+    typing-extensions
+    uri-template
+  ];
+
+  pythonImportsCheck = [ "json_home_client" ];
+
+  meta = with lib; {
+    description = "Client class for calling http+json APIs in Python";
+    homepage = "https://github.com/plinss/json_home_client";
+    license = licenses.mit;
+    maintainers = [];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/json-logging/default.nix b/nixpkgs/pkgs/development/python-modules/json-logging/default.nix
new file mode 100644
index 000000000000..a3ac3ff7f005
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/json-logging/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fastapi
+, fetchFromGitHub
+, flask
+, httpx
+, pytestCheckHook
+, pythonOlder
+, requests
+, sanic
+, uvicorn
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "json-logging";
+  version = "1.5.0-rc0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bobbui";
+    repo = "json-logging-python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-WOAEY1pONH+Gx1b8zHZDMNgJJSn7jvMO60LYTA8z/dE=";
+  };
+
+  nativeCheckInputs = [
+    fastapi
+    flask
+    httpx
+    pytestCheckHook
+    # quart
+    requests
+    sanic
+    uvicorn
+    wheel
+  ];
+
+  pythonImportsCheck = [
+    "json_logging"
+  ];
+
+  disabledTests = [
+    "quart"
+  ];
+
+  disabledTestPaths = [
+    # Smoke tests don't always work
+    "tests/smoketests/test_run_smoketest.py"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Python library to emit logs in JSON format";
+    longDescription = ''
+      Python logging library to emit JSON log that can be easily indexed and searchable by logging
+      infrastructure such as ELK, EFK, AWS Cloudwatch, GCP Stackdriver.
+    '';
+    homepage = "https://github.com/bobbui/json-logging-python";
+    changelog = "https://github.com/bobbui/json-logging-python/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ AluisioASG ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/json-merge-patch/default.nix b/nixpkgs/pkgs/development/python-modules/json-merge-patch/default.nix
new file mode 100644
index 000000000000..582248ca32ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/json-merge-patch/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "json-merge-patch";
+  version = "0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "09898b6d427c08754e2a97c709cf2dfd7e28bd10c5683a538914975eab778d39";
+  };
+
+  patches = [
+    # This prevented tests from running (was using a relative import)
+    # https://github.com/OpenDataServices/json-merge-patch/pull/1
+   (fetchpatch {
+     name = "fully-qualified-json-merge-patch-import-on-tests";
+     url = "https://patch-diff.githubusercontent.com/raw/OpenDataServices/json-merge-patch/pull/1.patch";
+     sha256 = "1k6xsrxsmz03nwcqsf4gf0zsfnl2r20n83npic8z6bqlpl4lidl4";
+   })
+  ];
+
+  meta = with lib; {
+    description = "JSON Merge Patch library";
+    homepage = "https://github.com/open-contracting/json-merge-patch";
+    license = licenses.bsd3;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/json-rpc/default.nix b/nixpkgs/pkgs/development/python-modules/json-rpc/default.nix
new file mode 100644
index 000000000000..a1037f573dbd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/json-rpc/default.nix
@@ -0,0 +1,24 @@
+{ lib, isPy27, buildPythonPackage, fetchPypi, pytestCheckHook, mock }:
+
+let
+  pythonEnv = lib.optional isPy27 mock;
+in buildPythonPackage rec {
+  pname = "json-rpc";
+  version = "1.15.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5kQdVsHc1UJByTfQotzRk73wvcU5tTFlJHE/VUt/hbk=";
+  };
+
+  nativeCheckInputs = pythonEnv ++ [ pytestCheckHook ];
+
+  nativeBuildInputs = pythonEnv;
+
+  meta = with lib; {
+    description = "JSON-RPC 1/2 transport implementation";
+    homepage = "https://github.com/pavlov99/json-rpc";
+    license = licenses.mit;
+    maintainers = with maintainers; [ oxzi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/json-schema-for-humans/default.nix b/nixpkgs/pkgs/development/python-modules/json-schema-for-humans/default.nix
new file mode 100644
index 000000000000..dfbe2d7d638e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/json-schema-for-humans/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, click
+, dataclasses-json
+, fetchFromGitHub
+, htmlmin
+, jinja2
+, markdown2
+, poetry-core
+, pygments
+, pytestCheckHook
+, pythonOlder
+, pytz
+, pyyaml
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "json-schema-for-humans";
+  version = "0.46";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "coveooss";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-wTO+d0O3SKT2jJ2zNubT2q76PdJ7+kT9RBEw5MMH1yg=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    click
+    dataclasses-json
+    htmlmin
+    jinja2
+    markdown2
+    pygments
+    pytz
+    pyyaml
+    requests
+  ];
+
+  nativeCheckInputs = [
+    beautifulsoup4
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_references_url"
+    # Tests are failing
+    "TestMdGenerate"
+  ];
+
+  pythonImportsCheck = [
+    "json_schema_for_humans"
+  ];
+
+  meta = with lib; {
+    description = "Quickly generate HTML documentation from a JSON schema";
+    homepage = "https://github.com/coveooss/json-schema-for-humans";
+    changelog = "https://github.com/coveooss/json-schema-for-humans/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ astro ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/json-stream-rs-tokenizer/Cargo.lock b/nixpkgs/pkgs/development/python-modules/json-stream-rs-tokenizer/Cargo.lock
new file mode 100644
index 000000000000..d9d8b858c717
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/json-stream-rs-tokenizer/Cargo.lock
@@ -0,0 +1,742 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "aho-corasick"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "arrayvec"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6"
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "castaway"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a17ed5635fc8536268e5d4de1e22e81ac34419e5f052d4d51f4e01dcc263fcc"
+dependencies = [
+ "rustversion",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "compact_str"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f86b9c4c00838774a6d902ef931eff7470720c51d90c2e32cfe15dc304737b3f"
+dependencies = [
+ "castaway",
+ "cfg-if",
+ "itoa",
+ "ryu",
+ "static_assertions",
+]
+
+[[package]]
+name = "delegate-attr"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee7e7ea0dba407429d816e8e38dda1a467cd74737722f2ccc8eae60429a1a3ab"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.105",
+]
+
+[[package]]
+name = "duplex"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d43b5f852c3b23bc9450d2389c125a44f44ba88ba7c37c62e99a1a05c03ed06c"
+
+[[package]]
+name = "futures"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"
+
+[[package]]
+name = "futures-macro"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.25",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e"
+
+[[package]]
+name = "futures-task"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"
+
+[[package]]
+name = "futures-timer"
+version = "3.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c"
+
+[[package]]
+name = "futures-util"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "glob"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
+
+[[package]]
+name = "indoc"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "adab1eaa3408fb7f0c777a73e7465fd5656136fc93b670eb6df3c88c2c1344e3"
+
+[[package]]
+name = "io-extras"
+version = "0.17.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fde93d48f0d9277f977a333eca8313695ddd5301dc96f7e02aeddcb0dd99096f"
+dependencies = [
+ "io-lifetimes",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "io-lifetimes"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7d6c6f8c91b4b9ed43484ad1a938e393caf35960fce7f82a040497207bd8e9e"
+
+[[package]]
+name = "itoa"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
+
+[[package]]
+name = "json-stream-rs-tokenizer"
+version = "0.1.0"
+dependencies = [
+ "compact_str",
+ "num-bigint",
+ "owned_chars",
+ "pyo3",
+ "pyo3-build-config",
+ "rstest",
+ "thiserror",
+ "utf8-chars",
+ "utf8-io",
+ "utf8-read",
+ "utf8-width",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.138"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8"
+
+[[package]]
+name = "lock_api"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "num-bigint"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860"
+
+[[package]]
+name = "owned_chars"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09dbaf3100ac7057d6d4e885bb1cd85716f95b5690ac443b31fbf5aac206dc3b"
+dependencies = [
+ "delegate-attr",
+]
+
+[[package]]
+name = "parking_lot"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.64"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78803b62cbf1f46fde80d7c0e803111524b9877184cfe7c3033659490ac7a7da"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "pyo3"
+version = "0.16.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0220c44442c9b239dd4357aa856ac468a4f5e1f0df19ddb89b2522952eb4c6ca"
+dependencies = [
+ "cfg-if",
+ "indoc",
+ "libc",
+ "num-bigint",
+ "parking_lot",
+ "pyo3-build-config",
+ "pyo3-ffi",
+ "pyo3-macros",
+ "unindent",
+]
+
+[[package]]
+name = "pyo3-build-config"
+version = "0.16.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c819d397859445928609d0ec5afc2da5204e0d0f73d6bf9e153b04e83c9cdc2"
+dependencies = [
+ "once_cell",
+ "target-lexicon",
+]
+
+[[package]]
+name = "pyo3-ffi"
+version = "0.16.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca882703ab55f54702d7bfe1189b41b0af10272389f04cae38fe4cd56c65f75f"
+dependencies = [
+ "libc",
+ "pyo3-build-config",
+]
+
+[[package]]
+name = "pyo3-macros"
+version = "0.16.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "568749402955ad7be7bad9a09b8593851cd36e549ac90bfd44079cea500f3f21"
+dependencies = [
+ "proc-macro2",
+ "pyo3-macros-backend",
+ "quote",
+ "syn 1.0.105",
+]
+
+[[package]]
+name = "pyo3-macros-backend"
+version = "0.16.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "611f64e82d98f447787e82b8e7b0ebc681e1eb78fc1252668b2c605ffb4e1eb8"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.105",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "regex"
+version = "1.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2"
+
+[[package]]
+name = "relative-path"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bf2521270932c3c7bed1a59151222bd7643c79310f2916f01925e1e16255698"
+
+[[package]]
+name = "rstest"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b96577ca10cb3eade7b337eb46520108a67ca2818a24d0b63f41fd62bc9651c"
+dependencies = [
+ "futures",
+ "futures-timer",
+ "rstest_macros",
+ "rustc_version",
+]
+
+[[package]]
+name = "rstest_macros"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "225e674cf31712b8bb15fdbca3ec0c1b9d825c5a24407ff2b7e005fb6a29ba03"
+dependencies = [
+ "cfg-if",
+ "glob",
+ "proc-macro2",
+ "quote",
+ "regex",
+ "relative-path",
+ "rustc_version",
+ "syn 2.0.25",
+ "unicode-ident",
+]
+
+[[package]]
+name = "rustc_version"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
+dependencies = [
+ "semver",
+]
+
+[[package]]
+name = "rustversion"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06"
+
+[[package]]
+name = "ryu"
+version = "1.0.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "semver"
+version = "1.0.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed"
+
+[[package]]
+name = "slab"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
+
+[[package]]
+name = "static_assertions"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
+[[package]]
+name = "syn"
+version = "1.0.105"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15e3fc8c0c74267e2df136e5e5fb656a464158aa57624053375eb9c8c6e25ae2"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "target-lexicon"
+version = "0.12.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9410d0f6853b1d94f0e519fb95df60f29d2c1eff2d921ffdf01a4c8a3b54f12d"
+
+[[package]]
+name = "thiserror"
+version = "1.0.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.105",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3"
+
+[[package]]
+name = "unindent"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "58ee9362deb4a96cef4d437d1ad49cffc9b9e92d202b6995674e928ce684f112"
+
+[[package]]
+name = "utf8-chars"
+version = "2.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "437bc4a6a3acdb2a99491b19ec1c2131a536d9f1d7da112341ec5c9e5f4dfc3a"
+dependencies = [
+ "arrayvec",
+]
+
+[[package]]
+name = "utf8-io"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "828cc5cc2a9a4ac22b1b2fd0b359ad648dac746a39a338974500de330d70f000"
+dependencies = [
+ "duplex",
+ "io-extras",
+ "io-lifetimes",
+]
+
+[[package]]
+name = "utf8-read"
+version = "0.4.0"
+source = "git+https://github.com/smheidrich/utf8-read-rs.git?branch=configurable-chunk-size#0690310179a4fad9304101c1a431f19cfb809bbe"
+
+[[package]]
+name = "utf8-width"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5190c9442dcdaf0ddd50f37420417d219ae5261bbf5db120d0f9bab996c9cba1"
+
+[[package]]
+name = "windows-sys"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+dependencies = [
+ "windows_aarch64_gnullvm 0.42.0",
+ "windows_aarch64_msvc 0.42.0",
+ "windows_i686_gnu 0.42.0",
+ "windows_i686_msvc 0.42.0",
+ "windows_x86_64_gnu 0.42.0",
+ "windows_x86_64_gnullvm 0.42.0",
+ "windows_x86_64_msvc 0.42.0",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5"
+dependencies = [
+ "windows_aarch64_gnullvm 0.48.0",
+ "windows_aarch64_msvc 0.48.0",
+ "windows_i686_gnu 0.48.0",
+ "windows_i686_msvc 0.48.0",
+ "windows_x86_64_gnu 0.48.0",
+ "windows_x86_64_gnullvm 0.48.0",
+ "windows_x86_64_msvc 0.48.0",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
diff --git a/nixpkgs/pkgs/development/python-modules/json-stream-rs-tokenizer/default.nix b/nixpkgs/pkgs/development/python-modules/json-stream-rs-tokenizer/default.nix
new file mode 100644
index 000000000000..6800635c0b2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/json-stream-rs-tokenizer/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cargo
+, darwin
+, fetchFromGitHub
+, json-stream
+, json-stream-rs-tokenizer
+, rustc
+, rustPlatform
+, setuptools
+, setuptools-rust
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "json-stream-rs-tokenizer";
+  version = "0.4.22";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "smheidrich";
+    repo = "py-json-stream-rs-tokenizer";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-EW726gUXTBX3gTxlFQ45RgkUa2Z4tIjUZxO4GBLXgEs=";
+  };
+
+  cargoDeps = rustPlatform.importCargoLock {
+    lockFile = ./Cargo.lock;
+    outputHashes = {
+      "utf8-read-0.4.0" = "sha256-L/NcgbB+2Rwtc+1e39fQh1D9S4RqQY6CCFOTh8CI8Ts=";
+    };
+  };
+
+  nativeBuildInputs = [
+    cargo
+    rustPlatform.cargoSetupHook
+    rustc
+    setuptools
+    setuptools-rust
+    wheel
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    darwin.libiconv
+  ];
+
+  # Tests depend on json-stream, which depends on this package.
+  # To avoid infinite recursion, we only enable tests when building passthru.tests.
+  doCheck = false;
+
+  checkInputs = [
+    json-stream
+  ];
+
+  pythonImportsCheck = [
+    "json_stream_rs_tokenizer"
+  ];
+
+  passthru.tests = {
+    runTests = json-stream-rs-tokenizer.overrideAttrs (_: { doCheck = true; });
+  };
+
+  meta = with lib; {
+    description = "A faster tokenizer for the json-stream Python library";
+    homepage = "https://github.com/smheidrich/py-json-stream-rs-tokenizer";
+    license = licenses.mit;
+    maintainers = with maintainers; [ winter ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/json-stream/default.nix b/nixpkgs/pkgs/development/python-modules/json-stream/default.nix
new file mode 100644
index 000000000000..ba191bdcd2e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/json-stream/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, iconv
+, pytestCheckHook
+, pythonOlder
+, requests
+, json-stream-rs-tokenizer
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "json-stream";
+  version = "2.3.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uLRQ6o6OPCOenn440S/tk053o1PBSyl/juNFpc6yW5E=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    iconv
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    json-stream-rs-tokenizer
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "json_stream"
+  ];
+
+  disabledTests = [
+    "test_writer"
+  ];
+
+  meta = with lib; {
+    description = "Streaming JSON parser";
+    homepage = "https://github.com/daggaz/json-stream";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/json-tricks/default.nix b/nixpkgs/pkgs/development/python-modules/json-tricks/default.nix
new file mode 100644
index 000000000000..b75020c0e5bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/json-tricks/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, pytestCheckHook
+, numpy
+, pandas
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "json-tricks";
+  version = "3.17.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mverleg";
+    repo = "pyjson_tricks";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-xddMc4PvVI+mqB3eeVqECZmdeSKAURsdbOnUAXahqM0=";
+  };
+
+  nativeCheckInputs = [
+    numpy
+    pandas
+    pytz
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "json_tricks"
+  ];
+
+  meta = with lib; {
+    description = "Extra features for Python JSON handling";
+    homepage = "https://github.com/mverleg/pyjson_tricks";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/json5/default.nix b/nixpkgs/pkgs/development/python-modules/json5/default.nix
new file mode 100644
index 000000000000..b6a54dccc73d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/json5/default.nix
@@ -0,0 +1,34 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, hypothesis
+, lib
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "json5";
+  version = "0.9.14";
+
+  src = fetchFromGitHub {
+    owner = "dpranke";
+    repo = "pyjson5";
+    rev = "v${version}";
+    hash = "sha256-cshP1kraLENqWuQTlm4HPAP/0ywRRLFOJI8mteWcjR4=";
+  };
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "json5"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/dpranke/pyjson5";
+    description = "A Python implementation of the JSON5 data format";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ veehaitch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsonable/default.nix b/nixpkgs/pkgs/development/python-modules/jsonable/default.nix
new file mode 100644
index 000000000000..705087674adb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonable/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jsonable";
+  version = "0.3.1";
+
+  src = fetchFromGitHub {
+    owner = "halfak";
+    repo = "python-jsonable";
+    rev = "refs/tags/${version}";
+    hash = "sha256-3FIzG2djSZOPDdoYeKqs3obQjgHrFtyp0sdBwZakkHA=";
+  };
+
+  nativeCheckInputs = [
+    nose
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "jsonable" ];
+
+  meta = with lib; {
+    description = "Provides an abstract base class and utilities for defining trivially JSONable python objects";
+    homepage = "https://github.com/halfak/python-jsonable";
+    license = licenses.mit;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsonconversion/default.nix b/nixpkgs/pkgs/development/python-modules/jsonconversion/default.nix
new file mode 100644
index 000000000000..a98798f05fb8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonconversion/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, pytestCheckHook, numpy }:
+
+buildPythonPackage rec {
+  pname = "jsonconversion";
+  version = "0.2.13";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-4hMY0N/Px+g5zn3YzNfDWPyi8Pglvd/c2N9SeC4JoZ0=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "'pytest-runner'" ""
+  '';
+
+  nativeCheckInputs = [ pytestCheckHook numpy ];
+
+  pythonImportsCheck = [ "jsonconversion" ];
+
+  meta = with lib; {
+    description = "This python module helps converting arbitrary Python objects into JSON strings and back";
+    homepage = "https://pypi.org/project/jsonconversion/";
+    license = licenses.bsd2;
+    maintainers = [ maintainers.terlar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsondate/default.nix b/nixpkgs/pkgs/development/python-modules/jsondate/default.nix
new file mode 100644
index 000000000000..7888a6df23cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsondate/default.nix
@@ -0,0 +1,22 @@
+{ lib, fetchFromGitHub, buildPythonPackage, six }:
+
+buildPythonPackage rec {
+  version = "0.1.3";
+  pname = "jsondate";
+
+  src = fetchFromGitHub {
+    owner = "ilya-kolpakov";
+    repo = "jsondate";
+    rev = "refs/tags/v${version}";
+    sha256 = "0nhvi48nc0bmad5ncyn6c9yc338krs3xf10bvv55xgz25c5gdgwy";
+    fetchSubmodules = true; # Fetching by tag does not work otherwise
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  meta = {
+    homepage = "https://github.com/ilya-kolpakov/jsondate";
+    description = "JSON with datetime handling";
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsondiff/default.nix b/nixpkgs/pkgs/development/python-modules/jsondiff/default.nix
new file mode 100644
index 000000000000..df2e883825c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsondiff/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "jsondiff";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-J5WETvB17IorjThcTVn16kiwjnGA/OPLJ4e+DbALH7Q=";
+  };
+
+  postPatch = ''
+    sed -e "/'jsondiff=jsondiff.cli:main_deprecated',/d" -i setup.py
+  '';
+
+  # No tests
+  doCheck = false;
+
+  meta = {
+    description = "Diff JSON and JSON-like structures in Python";
+    homepage = "https://github.com/ZoomerAnalytics/jsondiff";
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsonfield/default.nix b/nixpkgs/pkgs/development/python-modules/jsonfield/default.nix
new file mode 100644
index 000000000000..37e280b2a184
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonfield/default.nix
@@ -0,0 +1,24 @@
+{ lib, fetchPypi, buildPythonPackage, django, pytestCheckHook, pytest-django }:
+
+buildPythonPackage rec {
+  pname = "jsonfield";
+  version = "3.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0yl828cd0m8jsyr4di6hcjdqmi31ijh5vk57mbpfl7p2gmcq8kky";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook pytest-django ];
+
+  preCheck = "export DJANGO_SETTINGS_MODULE=tests.settings";
+
+  propagatedBuildInputs = [ django ];
+
+  meta = with lib; {
+    description = "Reusable model field that allows you to store validated JSON, automatically handling serialization to and from the database";
+    homepage = "https://github.com/rpkilby/jsonfield/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mrmebelman ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsonlines/default.nix b/nixpkgs/pkgs/development/python-modules/jsonlines/default.nix
new file mode 100644
index 000000000000..6eb818013e9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonlines/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, attrs
+, fetchFromGitHub
+, buildPythonPackage
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "jsonlines";
+  version = "3.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "wbolster";
+    repo = pname;
+    rev = version;
+    hash = "sha256-eMpUk5s49OyD+cNGdAeKA2LvpXdKta2QjZIFDnIBKC8=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "jsonlines"
+  ];
+
+  meta = with lib; {
+    description = "Python library to simplify working with jsonlines and ndjson data";
+    homepage = "https://github.com/wbolster/jsonlines";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsonmerge/default.nix b/nixpkgs/pkgs/development/python-modules/jsonmerge/default.nix
new file mode 100644
index 000000000000..83275f54a9b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonmerge/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jsonschema
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jsonmerge";
+  version = "1.9.2";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xDdX4BgLDhm3rkwTCtQqB8xYDDGRL2H0gj6Ory+jlKM=";
+  };
+
+  propagatedBuildInputs = [ jsonschema ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Merge a series of JSON documents";
+    homepage = "https://github.com/avian2/jsonmerge";
+    changelog = "https://github.com/avian2/jsonmerge/blob/jsonmerge-${version}/ChangeLog";
+    license = licenses.mit;
+    maintainers = with maintainers; [ emily ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsonpatch/default.nix b/nixpkgs/pkgs/development/python-modules/jsonpatch/default.nix
new file mode 100644
index 000000000000..bdae44eb2d42
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonpatch/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, jsonpointer
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "jsonpatch";
+  version = "1.33";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "stefankoegl";
+    repo = "python-json-patch";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-JHBB64LExzHQVoFF2xcsqGlNWX/YeEBa1M/TmfeQLWI=";
+  };
+
+  propagatedBuildInputs = [
+    jsonpointer
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "jsonpatch"
+  ];
+
+  pytestFlagsArray = [
+    "tests.py"
+  ];
+
+  meta = with lib; {
+    description = "Library to apply JSON Patches according to RFC 6902";
+    homepage = "https://github.com/stefankoegl/python-json-patch";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsonpath-ng/default.nix b/nixpkgs/pkgs/development/python-modules/jsonpath-ng/default.nix
new file mode 100644
index 000000000000..edda6a341e32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonpath-ng/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ply
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "jsonpath-ng";
+  version = "1.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "h2non";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-q4kIH/2+VKdlSa+IhJ3ymHpc5gmml9lW4aJS477/YSo=";
+  };
+
+  propagatedBuildInputs = [
+    ply
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Exclude tests that require oslotest
+    "tests/test_jsonpath_rw_ext.py"
+  ];
+
+  pythonImportsCheck = [
+    "jsonpath_ng"
+  ];
+
+  meta = with lib; {
+    description = "JSONPath implementation";
+    homepage = "https://github.com/h2non/jsonpath-ng";
+    changelog = "https://github.com/h2non/jsonpath-ng/blob/v${version}/History.md";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsonpath/default.nix b/nixpkgs/pkgs/development/python-modules/jsonpath/default.nix
new file mode 100644
index 000000000000..00205eb1907a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonpath/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "jsonpath";
+  version = "0.82.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2H7yvLze1o7pa8NMGAm2lFfs7JsMTdRxZYoSvTkQAtE=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "jsonpath"
+  ];
+
+  pytestFlagsArray = [
+    "test/test*.py"
+  ];
+
+  meta = with lib; {
+    description = "An XPath for JSON";
+    homepage = "https://github.com/json-path/JsonPath";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsonpath_rw/default.nix b/nixpkgs/pkgs/development/python-modules/jsonpath_rw/default.nix
new file mode 100644
index 000000000000..d2b177c742ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonpath_rw/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, ply
+, six
+, decorator
+}:
+
+buildPythonPackage rec {
+  pname = "jsonpath-rw";
+  version = "1.4.0";
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "05c471281c45ae113f6103d1268ec7a4831a2e96aa80de45edc89b11fac4fbec";
+  };
+
+  propagatedBuildInputs = [ ply six decorator ];
+
+  # ImportError: No module named tests
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/kennknowles/python-jsonpath-rw";
+    description = "A robust and significantly extended implementation of JSONPath for Python, with a clear AST for metaprogramming";
+    license = licenses.asl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsonpickle/default.nix b/nixpkgs/pkgs/development/python-modules/jsonpickle/default.nix
new file mode 100644
index 000000000000..4fc2f49119dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonpickle/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, setuptools-scm
+, toml
+, importlib-metadata
+}:
+
+buildPythonPackage rec {
+  pname = "jsonpickle";
+  version = "3.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-43q7pL+zykpGR9KLufRwZDb3tGyKgzO0pxirr6jkazc=";
+  };
+
+  nativeCheckInputs = [ pytest ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+    toml
+  ];
+
+  propagatedBuildInputs = [
+    importlib-metadata
+  ];
+
+  checkPhase = ''
+    rm pytest.ini
+    pytest tests/jsonpickle_test.py
+  '';
+
+  meta = {
+    description = "Python library for serializing any arbitrary object graph into JSON";
+    homepage = "http://jsonpickle.github.io/";
+    license = lib.licenses.bsd3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsonpointer/default.nix b/nixpkgs/pkgs/development/python-modules/jsonpointer/default.nix
new file mode 100644
index 000000000000..f05b886cfb12
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonpointer/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "jsonpointer";
+  version = "2.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WFzugrcCEfqeYEO3u4nbbhqklSQ0Dd6K1rYyBuponYg=";
+  };
+
+  meta = with lib; {
+    description = "Resolve JSON Pointers in Python";
+    homepage = "https://github.com/stefankoegl/python-json-pointer";
+    license = licenses.bsd2; # "Modified BSD license, says pypi"
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsonref/default.nix b/nixpkgs/pkgs/development/python-modules/jsonref/default.nix
new file mode 100644
index 000000000000..dc12c60aed48
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonref/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pdm-backend
+, pdm-pep517
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "jsonref";
+  version = "1.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "gazpachoking";
+    repo = "jsonref";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-tOhabmqCkktJUZjCrzjOjUGgA/X6EVz0KqehyLtigfc=";
+  };
+
+  nativeBuildInputs = [
+    pdm-backend
+    pdm-pep517
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests.py"
+  ];
+
+  pythonImportsCheck = [
+    "jsonref"
+  ];
+
+  meta = with lib; {
+    description = "An implementation of JSON Reference for Python";
+    homepage = "https://github.com/gazpachoking/jsonref";
+    changelog = "https://github.com/gazpachoking/jsonref/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsonrpc-async/default.nix b/nixpkgs/pkgs/development/python-modules/jsonrpc-async/default.nix
new file mode 100644
index 000000000000..613d4478af87
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonrpc-async/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, jsonrpc-base
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "jsonrpc-async";
+  version = "2.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "emlove";
+    repo = pname;
+    rev = version;
+    hash = "sha256-KOnycsOZFDEVj8CJDwGbdtbOpMPQMVdrXbHG0fzr9PI=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    jsonrpc-base
+  ];
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests.py"
+  ];
+
+  pythonImportsCheck = [
+    "jsonrpc_async"
+  ];
+
+  meta = with lib; {
+    description = "A JSON-RPC client library for asyncio";
+    homepage = "https://github.com/emlove/jsonrpc-async";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsonrpc-base/default.nix b/nixpkgs/pkgs/development/python-modules/jsonrpc-base/default.nix
new file mode 100644
index 000000000000..42aa42638013
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonrpc-base/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "jsonrpc-base";
+  version = "2.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "emlove";
+    repo = pname;
+    rev = version;
+    hash = "sha256-C03m/zeLIFqsmEMSzt84LMOWAHUcpdEHhaa5hx2NsoQ=";
+  };
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests.py"
+  ];
+
+  pythonImportsCheck = [
+    "jsonrpc_base"
+  ];
+
+  meta = with lib; {
+    description = "A JSON-RPC client library base interface";
+    homepage = "https://github.com/emlove/jsonrpc-base";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsonrpc-websocket/default.nix b/nixpkgs/pkgs/development/python-modules/jsonrpc-websocket/default.nix
new file mode 100644
index 000000000000..6c1569055b5d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonrpc-websocket/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, jsonrpc-base
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "jsonrpc-websocket";
+  version = "3.1.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "emlove";
+    repo = "jsonrpc-websocket";
+    rev = version;
+    hash = "sha256-xSOITOVtsNMEDrq610l8LNipLdyMWzKOQDedQEGaNOQ=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    jsonrpc-base
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=auto"
+    "tests.py"
+  ];
+
+  pythonImportsCheck = [
+    "jsonrpc_websocket"
+  ];
+
+  meta = with lib; {
+    description = "A JSON-RPC websocket client library for asyncio";
+    homepage = "https://github.com/emlove/jsonrpc-websocket";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsonrpclib-pelix/default.nix b/nixpkgs/pkgs/development/python-modules/jsonrpclib-pelix/default.nix
new file mode 100644
index 000000000000..31bb0fe3137e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonrpclib-pelix/default.nix
@@ -0,0 +1,23 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "jsonrpclib-pelix";
+  version = "0.4.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6eCzPvqPog2BfdeN/Z5M2zlnyKXTy1p4O+HugcSonHw=";
+  };
+
+  doCheck = false; # test_suite="tests" in setup.py but no tests in pypi.
+
+  meta = with lib; {
+    description = "JSON RPC client library - Pelix compatible fork";
+    homepage = "https://pypi.python.org/pypi/jsonrpclib-pelix/";
+    license = lib.licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsons/default.nix b/nixpkgs/pkgs/development/python-modules/jsons/default.nix
new file mode 100644
index 000000000000..9a5116c94d6a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsons/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, typish
+, tzdata
+}:
+
+buildPythonPackage rec {
+  pname = "jsons";
+  version = "1.6.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ramonhagenaars";
+    repo = "jsons";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-7OIByHvsqhKFOkb1q2kuxmbkkleryavYgp/T4U5hvGk=";
+  };
+
+  propagatedBuildInputs = [
+    typish
+  ];
+
+  nativeCheckInputs = [
+    attrs
+    pytestCheckHook
+    tzdata
+  ];
+
+  disabledTestPaths = [
+    # These tests are based on timings, which fail
+    # on slow or overloaded machines.
+    "tests/test_performance.py"
+  ];
+
+  disabledTests = lib.optionals (pythonAtLeast "3.11") [
+    # https://github.com/ramonhagenaars/jsons/issues/187
+    "test_dump_load_parameterized_collections"
+  ];
+
+  pythonImportsCheck = [
+    "jsons"
+  ];
+
+  meta = with lib; {
+    description = "Turn Python objects into dicts or json strings and back";
+    homepage = "https://github.com/ramonhagenaars/jsons";
+    changelog = "https://github.com/ramonhagenaars/jsons/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fmoda3 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsonschema-spec/default.nix b/nixpkgs/pkgs/development/python-modules/jsonschema-spec/default.nix
new file mode 100644
index 000000000000..0da22f2cf98f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonschema-spec/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build
+, poetry-core
+
+# propagates
+, pathable
+, pyyaml
+, referencing
+, requests
+
+# tests
+, pytestCheckHook
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "jsonschema-spec";
+  version = "0.2.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "p1c2u";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-1Flb3XQCGhrAYzTvriSVhHDb/Z/uvCyZdbav2u7f3sg=";
+  };
+
+  postPatch = ''
+    sed -i "/^--cov/d" pyproject.toml
+
+    substituteInPlace pyproject.toml \
+      --replace 'referencing = ">=0.28.0,<0.30.0"' 'referencing = ">=0.28.0"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pathable
+    pyyaml
+    referencing
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/p1c2u/jsonschema-spec/releases/tag/${version}";
+    description = "JSONSchema Spec with object-oriented paths";
+    homepage = "https://github.com/p1c2u/jsonschema-spec";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsonschema-specifications/default.nix b/nixpkgs/pkgs/development/python-modules/jsonschema-specifications/default.nix
new file mode 100644
index 000000000000..54b8d6df6ea1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonschema-specifications/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hatch-vcs
+, hatchling
+, importlib-resources
+, pytestCheckHook
+, pythonOlder
+, referencing
+}:
+
+buildPythonPackage rec {
+  pname = "jsonschema-specifications";
+  version = "2023.7.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "jsonschema_specifications";
+    inherit version;
+    hash = "sha256-yRpQQE6Iofa6QGNneOLuCPbiTFYT/kxTrCRXilp/crs=";
+  };
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    referencing
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "jsonschema_specifications"
+  ];
+
+  meta = with lib; {
+    description = "Support files exposing JSON from the JSON Schema specifications";
+    homepage = "https://github.com/python-jsonschema/jsonschema-specifications";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsonschema/default.nix b/nixpkgs/pkgs/development/python-modules/jsonschema/default.nix
new file mode 100644
index 000000000000..d8c235efed23
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonschema/default.nix
@@ -0,0 +1,99 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchPypi
+, hatch-fancy-pypi-readme
+, hatch-vcs
+, hatchling
+, importlib-resources
+, jsonschema-specifications
+, pkgutil-resolve-name
+, pip
+, pytestCheckHook
+, pythonOlder
+, referencing
+, rpds-py
+
+# optionals
+, fqdn
+, idna
+, isoduration
+, jsonpointer
+, rfc3339-validator
+, rfc3986-validator
+, rfc3987
+, uri-template
+, webcolors
+}:
+
+buildPythonPackage rec {
+  pname = "jsonschema";
+  version = "4.19.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bh51aawTvoE5st0sIaVdNQBm7j+A3wbGCLOYzcbzDo8=";
+  };
+
+  postPatch = ''
+    patchShebangs json/bin/jsonschema_suite
+  '';
+
+  nativeBuildInputs = [
+    hatch-fancy-pypi-readme
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    jsonschema-specifications
+    referencing
+    rpds-py
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+    pkgutil-resolve-name
+  ];
+
+  passthru.optional-dependencies = {
+    format = [
+      fqdn
+      idna
+      isoduration
+      jsonpointer
+      rfc3339-validator
+      rfc3987
+      uri-template
+      webcolors
+    ];
+    format-nongpl = [
+      fqdn
+      idna
+      isoduration
+      jsonpointer
+      rfc3339-validator
+      rfc3986-validator
+      uri-template
+      webcolors
+    ];
+  };
+
+  nativeCheckInputs = [
+    pip
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "jsonschema"
+  ];
+
+  meta = with lib; {
+    description = "An implementation of JSON Schema validation";
+    homepage = "https://github.com/python-jsonschema/jsonschema";
+    license = licenses.mit;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jsonstreams/default.nix b/nixpkgs/pkgs/development/python-modules/jsonstreams/default.nix
new file mode 100644
index 000000000000..197e372edf16
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jsonstreams/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, lib, buildPythonPackage, fetchFromGitHub, pytestCheckHook, six, }:
+
+buildPythonPackage rec {
+  pname = "jsonstreams";
+  version = "0.6.0";
+
+  src = fetchFromGitHub {
+    owner = "dcbaker";
+    repo = pname;
+    rev = version;
+    sha256 = "0qw74wz9ngz9wiv89vmilbifsbvgs457yn1bxnzhrh7g4vs2wcav";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  pytestFlagsArray = [ "tests --doctest-modules jsonstreams" ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "A JSON streaming writer";
+    homepage = "https://github.com/dcbaker/jsonstreams";
+    license = licenses.mit;
+    maintainers = with maintainers; [ chkno ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jstyleson/default.nix b/nixpkgs/pkgs/development/python-modules/jstyleson/default.nix
new file mode 100644
index 000000000000..757a8ef8bf29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jstyleson/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jstyleson";
+  version = "0.0.2";
+
+  src = fetchFromGitHub {
+    owner = "linjackson78";
+    repo = "jstyleson";
+    # https://github.com/linjackson78/jstyleson/issues/6
+    rev = "544b9fdb43339cdd15dd03dc69a6d0f36dd73241";
+    hash = "sha256-s/0DDfy+07TuUNjHPqKRT3xMMQl6spZCacB7Dweof7A=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "jstyleson" ];
+
+  meta = with lib; {
+    description = "A python library to parse JSON with js-style comments";
+    homepage = "https://github.com/linjackson78/jstyleson";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ambroisie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jug/default.nix b/nixpkgs/pkgs/development/python-modules/jug/default.nix
new file mode 100644
index 000000000000..315b15629041
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jug/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, bottle
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, redis
+}:
+
+buildPythonPackage rec {
+  pname = "jug";
+  version = "2.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Jug";
+    inherit version;
+    hash = "sha256-Y2TWqJi7GjmWUFpe1b150NgwRw9VKhCk5EoN5NDcPXU=";
+  };
+
+  propagatedBuildInputs = [
+    bottle
+  ];
+
+  nativeCheckInputs = [
+    numpy
+    pytestCheckHook
+    pyyaml
+    redis
+  ];
+
+  pythonImportsCheck = [
+    "jug"
+  ];
+
+  meta = with lib; {
+    description = "A Task-Based Parallelization Framework";
+    homepage = "https://jug.readthedocs.io/";
+    changelog = "https://github.com/luispedro/jug/blob/v${version}/ChangeLog";
+    license = licenses.mit;
+    maintainers = with maintainers; [ luispedro ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/junit-xml/default.nix b/nixpkgs/pkgs/development/python-modules/junit-xml/default.nix
new file mode 100644
index 000000000000..a6475188405b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/junit-xml/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "junit-xml";
+  version = "1.9";
+
+  # Only a wheel on PyPI
+  src = fetchFromGitHub {
+    owner = "kyrus";
+    repo = "python-junit-xml";
+    # No tags...sigh
+    rev = "856414648cbab3f64e69b856bc25cea8b9aa0377";
+    sha256 = "1sg03mv7dk3x4mjxjg127vqjmx0ms7v3a5aibxrclxlhmdqcgvb2";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Creates JUnit XML test result documents that can be read by tools such as Jenkins";
+    homepage = "https://github.com/kyrus/python-junit-xml";
+    maintainers = with maintainers; [ multun ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/junit2html/default.nix b/nixpkgs/pkgs/development/python-modules/junit2html/default.nix
new file mode 100644
index 000000000000..bc21fdb74bf7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/junit2html/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jinja2
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "junit2html";
+  version = "30.1.3";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-1q6KpKdrZvp8XvxGCkoorlZDDgvGg/imTX8+NEOBbWs=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    jinja2
+  ];
+
+  # Tests are not shipped with PyPi and source is not tagged
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "junit2htmlreport"
+  ];
+
+  meta = with lib; {
+    description = "Generate HTML reports from Junit results";
+    homepage = "https://gitlab.com/inorton/junit2html";
+    license = licenses.mit;
+    maintainers = with maintainers; [ otavio ];
+    mainProgram = "junit2html";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/junitparser/default.nix b/nixpkgs/pkgs/development/python-modules/junitparser/default.nix
new file mode 100644
index 000000000000..2dbd902efeef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/junitparser/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, future
+, glibcLocales
+, lxml
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "junitparser";
+  version = "2.8.0";
+
+  src = fetchFromGitHub {
+    owner = "weiwei";
+    repo = pname;
+    rev = version;
+    hash = "sha256-rhDP05GSWT4K6Z2ip8C9+e3WbvBJOwP0vctvANBs7cw=";
+  };
+
+  propagatedBuildInputs = [ future ];
+
+  nativeCheckInputs = [ unittestCheckHook lxml glibcLocales ];
+
+  unittestFlagsArray = [ "-v" ];
+
+  meta = with lib; {
+    description = "Manipulates JUnit/xUnit Result XML files";
+    license = licenses.asl20;
+    homepage = "https://github.com/weiwei/junitparser";
+    maintainers = with maintainers; [ multun ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/junos-eznc/default.nix b/nixpkgs/pkgs/development/python-modules/junos-eznc/default.nix
new file mode 100644
index 000000000000..e6499c5196d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/junos-eznc/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, jinja2
+, lxml
+, mock
+, ncclient
+, netaddr
+, nose
+, ntc-templates
+, paramiko
+, pyparsing
+, pyserial
+, pythonOlder
+, pyyaml
+, scp
+, six
+, transitions
+, yamlordereddictloader
+}:
+
+buildPythonPackage rec {
+  pname = "junos-eznc";
+  version = "2.6.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Juniper";
+    repo = "py-junos-eznc";
+    rev = "refs/tags/${version}";
+    hash = "sha256-5xZjuU2U3BodAMQiWZIJ27AZiAwoMm4yJ4qr3DjMd9o=";
+  };
+
+  postPatch = ''
+    # https://github.com/Juniper/py-junos-eznc/issues/1236
+    substituteInPlace lib/jnpr/junos/utils/scp.py \
+      --replace "inspect.getargspec" "inspect.getfullargspec"
+  '';
+
+  propagatedBuildInputs = [
+    jinja2
+    lxml
+    ncclient
+    netaddr
+    ntc-templates
+    paramiko
+    pyparsing
+    pyserial
+    pyyaml
+    scp
+    six
+    transitions
+    yamlordereddictloader
+  ];
+
+  nativeCheckInputs = [
+    mock
+    nose
+  ];
+
+  checkPhase = ''
+    nosetests -v -a unit --exclude=test_sw_put_ftp
+  '';
+
+  pythonImportsCheck = [
+    "jnpr.junos"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/Juniper/py-junos-eznc/releases/tag/${version}";
+    description = "Junos 'EZ' automation for non-programmers";
+    homepage = "https://github.com/Juniper/py-junos-eznc";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ xnaveira ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-book/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-book/default.nix
new file mode 100644
index 000000000000..631a853833d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-book/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, flit-core
+, pythonRelaxDepsHook
+, click
+, docutils
+, jinja2
+, jsonschema
+, linkify-it-py
+, myst-nb
+, pyyaml
+, sphinx
+, sphinx-comments
+, sphinx-copybutton
+, sphinx-external-toc
+, sphinx-jupyterbook-latex
+, sphinx-design
+, sphinx-thebe
+, sphinx-book-theme
+, sphinx-togglebutton
+, sphinxcontrib-bibtex
+, sphinx-multitoc-numbering
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-book";
+  version = "0.15.1";
+
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ihY07Bb37t7g0Rbx5ft8SCAyia2S2kLglRnccdlWwBA=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    click
+    docutils
+    jinja2
+    jsonschema
+    linkify-it-py
+    myst-nb
+    pyyaml
+    sphinx
+    sphinx-comments
+    sphinx-copybutton
+    sphinx-external-toc
+    sphinx-jupyterbook-latex
+    sphinx-design
+    sphinx-thebe
+    sphinx-book-theme
+    sphinx-togglebutton
+    sphinxcontrib-bibtex
+    sphinx-multitoc-numbering
+  ];
+
+  pythonRelaxDeps = [
+    "docutils"
+    "sphinx-design"
+  ];
+
+  pythonImportsCheck = [
+    "jupyter_book"
+  ];
+
+  meta = with lib; {
+    description = "Build a book with Jupyter Notebooks and Sphinx";
+    homepage = "https://jupyterbook.org/";
+    changelog = "https://github.com/executablebooks/jupyter-book/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-c-kernel/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-c-kernel/default.nix
new file mode 100644
index 000000000000..a6fe574a9bac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-c-kernel/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ipykernel
+, gcc
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-c-kernel";
+  version = "1.2.2";
+
+  src = fetchPypi {
+    pname = "jupyter_c_kernel";
+    inherit version;
+    sha256 = "e4b34235b42761cfc3ff08386675b2362e5a97fb926c135eee782661db08a140";
+  };
+
+  postPatch = ''
+    substituteInPlace jupyter_c_kernel/kernel.py \
+      --replace "'gcc'" "'${gcc}/bin/gcc'"
+  '';
+
+  propagatedBuildInputs = [ ipykernel ];
+
+  # no tests in repository
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Minimalistic C kernel for Jupyter";
+    homepage = "https://github.com/brendanrius/jupyter-c-kernel/";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-cache/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-cache/default.nix
new file mode 100644
index 000000000000..7a2501f317b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-cache/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, attrs
+, click
+, flit-core
+, importlib-metadata
+, nbclient
+, nbformat
+, pyyaml
+, sqlalchemy
+, tabulate
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-cache";
+  version = "1.0.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "jupyter_cache";
+    hash = "sha256-0Pp9dTPNV5gZjYiJMYJpqME4LtOyL2IsCak1ZSH0hoc=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    click
+    importlib-metadata
+    nbclient
+    nbformat
+    pyyaml
+    sqlalchemy
+    tabulate
+  ];
+
+  pythonImportsCheck = [ "jupyter_cache" ];
+
+  meta = with lib; {
+    description = "A defined interface for working with a cache of jupyter notebooks";
+    homepage = "https://github.com/executablebooks/jupyter-cache";
+    changelog = "https://github.com/executablebooks/jupyter-cache/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-client/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-client/default.nix
new file mode 100644
index 000000000000..014b67cb4b46
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-client/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, entrypoints
+, jupyter-core
+, hatchling
+, nest-asyncio
+, python-dateutil
+, pyzmq
+, tornado
+, traitlets
+, isPyPy
+, py
+, pythonOlder
+, importlib-metadata
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter_client";
+  version = "8.3.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-YClLLVuGk1bIk/V7God+plENYNRc9LOAV/FnLYVpmsk=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    entrypoints
+    jupyter-core
+    nest-asyncio
+    python-dateutil
+    pyzmq
+    tornado
+    traitlets
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    importlib-metadata
+  ] ++ lib.optional isPyPy py;
+
+  # Circular dependency with ipykernel
+  doCheck = false;
+
+  meta = {
+    description = "Jupyter protocol implementation and client libraries";
+    homepage = "https://jupyter.org/";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-collaboration/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-collaboration/default.nix
new file mode 100644
index 000000000000..6c2842eb6d0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-collaboration/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, hatch-jupyter-builder
+, hatch-nodejs-version
+, hatchling
+, pythonRelaxDepsHook
+, jupyter-events
+, jupyter-server
+, jupyter-server-fileid
+, jupyter-ydoc
+, jupyterlab
+, ypy-websocket
+, pytest-asyncio
+, pytest-jupyter
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-collaboration";
+  version = "1.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "jupyter_collaboration";
+    inherit version;
+    hash = "sha256-qhcCPAgHlBwt+Lt8NdDa+ZPhNNotCvNtz9WQx6OHvOc=";
+  };
+
+  postPatch = ''
+    sed -i "/^timeout/d" pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    hatch-jupyter-builder
+    hatch-nodejs-version
+    hatchling
+    jupyterlab
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    "ypy-websocket"
+  ];
+
+  propagatedBuildInputs = [
+    jupyter-events
+    jupyter-server
+    jupyter-server-fileid
+    jupyter-ydoc
+    ypy-websocket
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-jupyter
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "jupyter_collaboration"
+  ];
+
+  pytestFlagsArray = [
+    "-W" "ignore::DeprecationWarning"
+  ];
+
+  preCheck = ''
+    export HOME=$TEMP
+  '';
+
+  meta = with lib; {
+    description = "JupyterLab Extension enabling Real-Time Collaboration";
+    homepage = "https://github.com/jupyterlab/jupyter_collaboration";
+    changelog = "https://github.com/jupyterlab/jupyter_collaboration/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = teams.jupyter.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-console/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-console/default.nix
new file mode 100644
index 000000000000..715557bad733
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-console/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, hatchling
+, ipykernel
+, exceptiongroup
+, ipython
+, jupyter-client
+, jupyter-core
+, prompt-toolkit
+, pygments
+, pyzmq
+, traitlets
+, flaky
+, pexpect
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-console";
+  version = "6.6.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "jupyter_console";
+    inherit version;
+    hash = "sha256-VmpL8xyHrb+t8izfhG4wabWace1dpx1rpNiqrRSlNTk=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  postPatch = ''
+    # use wrapped executable in tests
+    substituteInPlace jupyter_console/tests/test_console.py \
+      --replace "args = ['-m', 'jupyter_console', '--colors=NoColor']" "args = ['--colors=NoColor']" \
+      --replace "cmd = sys.executable" "cmd = '${placeholder "out"}/bin/jupyter-console'" \
+      --replace "check_output([sys.executable, '-m', 'jupyter_console'," "check_output(['${placeholder "out"}/bin/jupyter-console',"
+  '';
+
+  propagatedBuildInputs = [
+    ipykernel
+    ipython
+    jupyter-client
+    jupyter-core
+    prompt-toolkit
+    pygments
+    pyzmq
+    traitlets
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    exceptiongroup
+  ];
+
+  pythonImportsCheck = [
+    "jupyter_console"
+  ];
+
+  nativeCheckInputs = [
+    flaky
+    pexpect
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  meta = {
+    description = "Jupyter terminal console";
+    homepage = "https://github.com/jupyter/jupyter_console";
+    changelog = "https://github.com/jupyter/jupyter_console/releases/tag/v${version}";
+    license = lib.licenses.bsd3;
+    maintainers = lib.teams.jupyter.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-contrib-core/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-contrib-core/default.nix
new file mode 100644
index 000000000000..a81c35497430
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-contrib-core/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, jupyter-core
+, notebook
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-contrib-core";
+  version = "0.4.2";
+
+  src = fetchFromGitHub {
+    owner = "jupyter-contrib";
+    repo = "jupyter_contrib_core";
+    rev = "refs/tags/${version}";
+    hash = "sha256-UTtK+aKxBFkqKuHrt1ox8vdHyFz/9HiKFl7U4UQcG88=";
+  };
+
+  propagatedBuildInputs = [
+    jupyter-core
+    notebook
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  disabledTestPaths = [
+    # This test fails upstream too
+    "tests/test_application.py"
+  ];
+
+  pythonImportsCheck = [ "jupyter_contrib_core" ];
+
+  meta = with lib; {
+    description = "Common utilities for jupyter-contrib projects";
+    homepage = "https://github.com/jupyter-contrib/jupyter_contrib_core";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-contrib-nbextensions/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-contrib-nbextensions/default.nix
new file mode 100644
index 000000000000..5656043625f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-contrib-nbextensions/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ipython-genutils
+, jupyter-contrib-core
+, jupyter-highlight-selected-word
+, jupyter-nbextensions-configurator
+, lxml
+, nose
+, pytestCheckHook
+, notebook
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-contrib-nbextensions";
+  version = "0.7.0";
+
+  src = fetchFromGitHub {
+    owner = "ipython-contrib";
+    repo = "jupyter_contrib_nbextensions";
+    rev = "refs/tags/${version}";
+    hash = "sha256-1o8tBfRw6jNcKfNE7xXrQaEhx+KOv7mLOruvuMDtJ1Q=";
+  };
+
+  propagatedBuildInputs = [
+    ipython-genutils
+    jupyter-contrib-core
+    jupyter-highlight-selected-word
+    jupyter-nbextensions-configurator
+    lxml
+  ];
+
+  nativeCheckInputs = [
+    nose
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Thoses tests fail upstream because of nbconvert being too recent
+    # https://github.com/ipython-contrib/jupyter_contrib_nbextensions/issues/1606
+    "tests/test_exporters.py"
+
+    # Requires to run jupyter which is not feasible here
+    "tests/test_application.py"
+  ];
+
+  pythonImportsCheck = [ "jupyter_contrib_nbextensions" ];
+
+  meta = with lib; {
+    description = "A collection of various notebook extensions for Jupyter";
+    homepage = "https://github.com/ipython-contrib/jupyter_contrib_nbextensions";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ GaetanLepage ];
+    # https://github.com/ipython-contrib/jupyter_contrib_nbextensions/issues/1647
+    broken = versionAtLeast notebook.version "7";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-core/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-core/default.nix
new file mode 100644
index 000000000000..120585896600
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-core/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, hatchling
+, platformdirs
+, traitlets
+, pip
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-core";
+  version = "5.5.0";
+  disabled = pythonOlder "3.7";
+
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "jupyter";
+    repo = "jupyter_core";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-GufCQUkR4283xMsyrbv5tDfJ8SeL35WBW5Aw2z6Ardc=";
+  };
+
+  patches = [
+    ./tests_respect_pythonpath.patch
+  ];
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    platformdirs
+    traitlets
+  ];
+
+  nativeCheckInputs = [
+    pip
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  pytestFlagsArray = [
+    # suppress pytest.PytestUnraisableExceptionWarning: Exception ignored in: <socket.socket fd=-1, family=AddressFamily.AF_UNIX, type=SocketKind.SOCK_STREAM, proto=0>
+    "-W ignore::pytest.PytestUnraisableExceptionWarning"
+  ];
+
+  disabledTests = [
+    # creates a temporary script, which isn't aware of PYTHONPATH
+    "test_argv0"
+  ];
+
+  postCheck = ''
+    $out/bin/jupyter --help > /dev/null
+  '';
+
+  pythonImportsCheck = [ "jupyter_core" ];
+
+  meta = with lib; {
+    description = "Base package on which Jupyter projects rely";
+    homepage = "https://jupyter.org/";
+    changelog = "https://github.com/jupyter/jupyter_core/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = teams.jupyter.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-core/tests_respect_pythonpath.patch b/nixpkgs/pkgs/development/python-modules/jupyter-core/tests_respect_pythonpath.patch
new file mode 100644
index 000000000000..48b44ad56e70
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-core/tests_respect_pythonpath.patch
@@ -0,0 +1,22 @@
+diff --git a/tests/test_command.py b/tests/test_command.py
+index a0833c1..67c2110 100644
+--- a/tests/test_command.py
++++ b/tests/test_command.py
+@@ -191,7 +191,7 @@ def test_not_on_path(tmpdir):
+     witness_src = "#!{}\n{}\n".format(sys.executable, 'print("WITNESS ME")')
+     write_executable(witness, witness_src)
+ 
+-    env = {"PATH": ""}
++    env = {"PATH": "", "PYTHONPATH": os.environ["PYTHONPATH"]}
+     if "SYSTEMROOT" in os.environ:  # Windows http://bugs.python.org/issue20614
+         env["SYSTEMROOT"] = os.environ["SYSTEMROOT"]
+     if sys.platform == "win32":
+@@ -216,7 +216,7 @@ def test_path_priority(tmpdir):
+     witness_b_src = "#!{}\n{}\n".format(sys.executable, 'print("WITNESS B")')
+     write_executable(witness_b, witness_b_src)
+ 
+-    env = {"PATH": str(b)}
++    env = {"PATH": str(b), "PYTHONPATH": os.environ["PYTHONPATH"]}
+     if "SYSTEMROOT" in os.environ:  # Windows http://bugs.python.org/issue20614
+         env["SYSTEMROOT"] = os.environ["SYSTEMROOT"]
+     if sys.platform == "win32":
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-events/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-events/default.nix
new file mode 100644
index 000000000000..28aa80927763
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-events/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build
+, hatchling
+
+# runtime
+, jsonschema
+, python-json-logger
+, pyyaml
+, referencing
+, traitlets
+
+# optionals
+, click
+, rich
+
+# tests
+, pytest-asyncio
+, pytest-console-scripts
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-events";
+  version = "0.9.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "jupyter";
+    repo = "jupyter_events";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-LDj6dTtq3npJxLKBQEEwGQFeDPvWF2adHeJhOai2MRU=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    jsonschema
+    python-json-logger
+    pyyaml
+    referencing
+    traitlets
+  ]
+  ++ jsonschema.optional-dependencies.format-nongpl;
+
+  passthru.optional-dependencies = {
+    cli = [
+      click
+      rich
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-console-scripts
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  preCheck = ''
+    export PATH="$out/bin:$PATH"
+  '';
+
+  pythonImportsCheck = [
+    "jupyter_events"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/jupyter/jupyter_events/releases/tag/v${version}";
+    description = "Configurable event system for Jupyter applications and extensions";
+    homepage = "https://github.com/jupyter/jupyter_events";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-highlight-selected-word/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-highlight-selected-word/default.nix
new file mode 100644
index 000000000000..64cbe33ae8ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-highlight-selected-word/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-highlight-selected-word";
+  version = "0.2.0";
+
+  src = fetchFromGitHub {
+    owner = "jcb91";
+    repo = "jupyter_highlight_selected_word";
+    rev = "refs/tags/${version}";
+    hash = "sha256-KgM//SIfES46uZySwNR4ZOcolnJORltvThsmEvxXoIs=";
+  };
+
+  # This package does not have tests
+  doChecks = false;
+
+  pythonImportsCheck = [ "jupyter_highlight_selected_word" ];
+
+  meta = with lib; {
+    description = "Jupyter notebook extension that enables highlighting every instance of the current word in the notebook";
+    homepage = "https://github.com/jcb91/jupyter_highlight_selected_word";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-lsp/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-lsp/default.nix
new file mode 100644
index 000000000000..f098330666cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-lsp/default.nix
@@ -0,0 +1,32 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, jupyter-server
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-lsp";
+  version = "2.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jrvLUzrbQeXWNeuP6ClWsKr78P1EO2xL+pBu3uuGNaE=";
+  };
+
+  propagatedBuildInputs = [
+    jupyter-server
+  ];
+  # tests require network
+  doCheck = false;
+  pythonImportsCheck = [ "jupyter_lsp" ];
+
+  meta = with lib; {
+    description = "Multi-Language Server WebSocket proxy for your Jupyter notebook or lab server";
+    homepage = "https://jupyterlab-lsp.readthedocs.io/en/latest/";
+    license = licenses.bsd3;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-nbextensions-configurator/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-nbextensions-configurator/default.nix
new file mode 100644
index 000000000000..61c235877f4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-nbextensions-configurator/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, jupyter-contrib-core
+, jupyter-core
+, jupyter-server
+, notebook
+, pyyaml
+, tornado
+, nose
+, pytestCheckHook
+, selenium
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-nbextensions-configurator";
+  version = "0.6.3";
+
+  src = fetchFromGitHub {
+    owner = "jupyter-contrib";
+    repo = "jupyter_nbextensions_configurator";
+    rev = "refs/tags/${version}";
+    hash = "sha256-ovKYHATRAC5a5qTMv32ohU2gJd15/fRKXa5HI0zGp/0=";
+  };
+
+  patches = [
+    # https://github.com/Jupyter-contrib/jupyter_nbextensions_configurator/pull/166
+    (fetchpatch {
+      name = "notebook-v7-compat.patch";
+      url = "https://github.com/Jupyter-contrib/jupyter_nbextensions_configurator/commit/a600cef9222ca0c61a6912eb29d8fa0323409705.patch";
+      hash = "sha256-Rt9r5ZOgnhBcs18+ET5+k0/t980I2DiVN8oHkGLp0iw=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    jupyter-contrib-core
+    jupyter-core
+    jupyter-server
+    notebook
+    pyyaml
+    tornado
+  ];
+
+  nativeCheckInputs = [
+    nose
+    pytestCheckHook
+    selenium
+  ];
+
+  # Those tests fails upstream
+  disabledTestPaths = [
+    "tests/test_application.py"
+    "tests/test_jupyterhub.py"
+    "tests/test_nbextensions_configurator.py"
+  ];
+
+  pythonImportsCheck = [ "jupyter_nbextensions_configurator" ];
+
+  meta = with lib; {
+    description = "A jupyter notebook serverextension providing config interfaces for nbextensions";
+    homepage = "https://github.com/jupyter-contrib/jupyter_nbextensions_configurator";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-packaging/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-packaging/default.nix
new file mode 100644
index 000000000000..38dd7927d1eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-packaging/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, deprecation
+, hatchling
+, pythonOlder
+, packaging
+, pytestCheckHook
+, pytest-timeout
+, setuptools
+, tomlkit
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-packaging";
+  version = "0.12.3";
+  disabled = pythonOlder "3.7";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "jupyter_packaging";
+    inherit version;
+    hash = "sha256-nZsrY7l//WeovFORwypCG8QVsmSjLJnk2NjdMdqunPQ=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "setuptools-68-test-compatibility.patch";
+      url = "https://github.com/jupyter/jupyter-packaging/commit/e963fb27aa3b58cd70c5ca61ebe68c222d803b7e.patch";
+      hash = "sha256-NlO07wBCutAJ1DgoT+rQFkuC9Y+DyF1YFlTwWpwsJzo=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    deprecation
+    packaging
+    setuptools
+    tomlkit
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-timeout
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  disabledTests = [
+    # disable tests depending on network connection
+    "test_develop"
+    "test_install"
+    # Avoid unmainted "mocker" fixture library, and calls to dependent "build" module
+    "test_build"
+    "test_npm_build"
+    "test_create_cmdclass"
+    "test_ensure_with_skip_npm"
+  ];
+
+  pythonImportsCheck = [ "jupyter_packaging" ];
+
+  meta = with lib; {
+    description = "Jupyter Packaging Utilities";
+    homepage = "https://github.com/jupyter/jupyter-packaging";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.elohmeier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-repo2docker/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-repo2docker/default.nix
new file mode 100644
index 000000000000..0d39b868c132
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-repo2docker/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, chardet
+, docker
+, entrypoints
+, escapism
+, fetchFromGitHub
+, iso8601
+, jinja2
+, pkgs-docker
+, python-json-logger
+, pythonOlder
+, ruamel-yaml
+, semver
+, toml
+, traitlets
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-repo2docker";
+  version = "2022.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "jupyterhub";
+    repo = "repo2docker";
+    rev = "refs/tags/${version}";
+    hash = "sha256-n1Yhl3QC1YqdsCl6pI5NjzTiSEs6NrGq9jwT0uyS/p0=";
+  };
+
+  propagatedBuildInputs = [
+    chardet
+    docker
+    entrypoints
+    escapism
+    iso8601
+    jinja2
+    pkgs-docker
+    python-json-logger
+    ruamel-yaml
+    semver
+    toml
+    traitlets
+  ];
+
+  # Tests require a running Docker instance
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "repo2docker"
+    "repo2docker.app"
+    "repo2docker.utils"
+    "repo2docker.contentproviders.base"
+  ];
+
+  meta = with lib; {
+    description = "Turn code repositories into Jupyter enabled Docker Images";
+    homepage = "https://repo2docker.readthedocs.io/";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-server-fileid/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-server-fileid/default.nix
new file mode 100644
index 000000000000..4ef40134152d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-server-fileid/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, hatchling
+, jupyter-events
+, jupyter-server
+, pytest-jupyter
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-server-fileid";
+  version = "0.9.0";
+
+  disables = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "jupyter-server";
+    repo = "jupyter_server_fileid";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-3dwj8GV0FmbhSsC2uWOLcU5ofrvBBGJ/2F/noFh4RCU=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    jupyter-events
+    jupyter-server
+  ];
+
+  pythonImportsCheck = [ "jupyter_server_fileid" ];
+
+  checkInputs = [
+    pytest-jupyter
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TEMPDIR
+  '';
+
+  meta = {
+    changelog = "https://github.com/jupyter-server/jupyter_server_fileid/blob/${src.rev}/CHANGELOG.md";
+    description = "An extension that maintains file IDs for documents in a running Jupyter Server";
+    homepage = "https://github.com/jupyter-server/jupyter_server_fileid";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-server-mathjax/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-server-mathjax/default.nix
new file mode 100644
index 000000000000..1f6c3b354769
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-server-mathjax/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jupyter-packaging
+, setuptools
+, jupyter-server
+, pytest-jupyter
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-server-mathjax";
+  version = "0.2.6";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "jupyter_server_mathjax";
+    hash = "sha256-ux5rbcBobB/jhqIrWIYWPbVIiTqZwoEMNjmenEyiOUM=";
+  };
+
+  nativeBuildInputs = [
+    jupyter-packaging
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    jupyter-server
+  ];
+
+  nativeCheckInputs = [
+    pytest-jupyter
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "jupyter_server_mathjax" ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "MathJax resources as a Jupyter Server Extension";
+    homepage = "https://github.com/jupyter-server/jupyter_server_mathjax";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-server-terminals/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-server-terminals/default.nix
new file mode 100644
index 000000000000..584b7fb634b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-server-terminals/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build
+, hatchling
+
+# runtime
+, terminado
+
+# tests
+, pytest-jupyter
+, pytest-timeout
+, pytestCheckHook
+}:
+
+let self = buildPythonPackage rec {
+  pname = "jupyter-server-terminals";
+  version = "0.4.4";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "jupyter-server";
+    repo = "jupyter_server_terminals";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-F1lpg4ASw3ImvhC8XA8Ya4qpcbGY6fg8PYJt8sJj4cs=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    terminado
+  ];
+
+  doCheck = false; # infinite recursion
+
+  nativeCheckInputs = [
+    pytest-jupyter
+    pytest-timeout
+    pytestCheckHook
+  ] ++ pytest-jupyter.optional-dependencies.server;
+
+  passthru.tests = {
+    check = self.overridePythonAttrs (_: { doCheck = true; });
+  };
+
+  meta = with lib; {
+    changelog = "https://github.com/jupyter-server/jupyter_server_terminals/releases/tag/v${version}";
+    description = "A Jupyter Server Extension Providing Support for Terminals";
+    homepage = "https://github.com/jupyter-server/jupyter_server_terminals";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+};
+in self
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-server/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-server/default.nix
new file mode 100644
index 000000000000..5a61b06c5026
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-server/default.nix
@@ -0,0 +1,125 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, hatch-jupyter-builder
+, hatchling
+, pytestCheckHook
+, pytest-console-scripts
+, pytest-jupyter
+, pytest-timeout
+, argon2-cffi
+, jinja2
+, tornado
+, pyzmq
+, ipykernel
+, traitlets
+, jupyter-core
+, jupyter-client
+, jupyter-events
+, jupyter-server-terminals
+, nbformat
+, nbconvert
+, packaging
+, send2trash
+, terminado
+, prometheus-client
+, anyio
+, websocket-client
+, overrides
+, requests
+, flaky
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-server";
+  version = "2.10.1";
+  format = "pyproject";
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "jupyter_server";
+    inherit version;
+    hash = "sha256-5tomV6lUp4ee7SjMCOCBewH/2B1+q4Y0ZgOXtV+SZHI=";
+  };
+
+  nativeBuildInputs = [
+    hatch-jupyter-builder
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    argon2-cffi
+    jinja2
+    tornado
+    pyzmq
+    traitlets
+    jupyter-core
+    jupyter-client
+    jupyter-events
+    jupyter-server-terminals
+    nbformat
+    nbconvert
+    packaging
+    send2trash
+    terminado
+    prometheus-client
+    anyio
+    websocket-client
+    overrides
+  ];
+
+  nativeCheckInputs = [
+    ipykernel
+    pytestCheckHook
+    pytest-console-scripts
+    pytest-jupyter
+    pytest-timeout
+    requests
+    flaky
+  ];
+
+  pytestFlagsArray = [
+    "-W" "ignore::DeprecationWarning"
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+    export PATH=$out/bin:$PATH
+  '';
+
+  disabledTests = [
+    "test_cull_idle"
+    "test_server_extension_list"
+    "test_subscribe_websocket"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # attempts to use trashcan, build env doesn't allow this
+    "test_delete"
+    # test is presumable broken in sandbox
+    "test_authorized_requests"
+    # Insufficient access privileges for operation
+    "test_regression_is_hidden"
+  ] ++ lib.optionals stdenv.isLinux [
+    # Failed: DID NOT RAISE <class 'tornado.web.HTTPError'>
+    "test_copy_big_dir"
+  ];
+
+  disabledTestPaths = [
+    "tests/services/kernels/test_api.py"
+    "tests/services/sessions/test_api.py"
+    # nbconvert failed: `relax_add_props` kwargs of validate has been
+    # deprecated for security reasons, and will be removed soon.
+    "tests/nbconvert/test_handlers.py"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    changelog = "https://github.com/jupyter-server/jupyter_server/blob/v${version}/CHANGELOG.md";
+    description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications";
+    homepage = "https://github.com/jupyter-server/jupyter_server";
+    license = licenses.bsdOriginal;
+    maintainers = lib.teams.jupyter.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-sphinx/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-sphinx/default.nix
new file mode 100644
index 000000000000..13758cb07c13
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-sphinx/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nbformat
+, sphinx
+, ipywidgets
+, pythonOlder
+, nbconvert
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-sphinx";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "jupyter_sphinx";
+    hash = "sha256-DBGjjxNDE48sUFHA00xMVF9EgBdMG9QcAlb+gm4LqlU=";
+  };
+
+  propagatedBuildInputs = [ nbconvert nbformat sphinx ipywidgets ];
+
+  doCheck = false;
+
+  disabled = pythonOlder "3.5";
+
+  meta = with lib; {
+    description = "Jupyter Sphinx Extensions";
+    homepage = "https://github.com/jupyter/jupyter-sphinx/";
+    license = licenses.bsd3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-telemetry/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-telemetry/default.nix
new file mode 100644
index 000000000000..f7efc0a1598c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-telemetry/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, python-json-logger
+, jsonschema
+, ruamel-yaml
+, traitlets
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter_telemetry";
+  version = "0.1.0";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "052khyn6h97jxl3k5i2m81xvga5v6vwh5qixzrax4w6zwcx62p24";
+  };
+
+  propagatedBuildInputs = [
+    python-json-logger jsonschema ruamel-yaml traitlets
+  ];
+
+  meta = with lib; {
+    description = "Telemetry for Jupyter Applications and extensions";
+    homepage = "https://jupyter-telemetry.readthedocs.io/";
+    license = licenses.bsd3;
+    maintainers = with lib.maintainers; [ chiroptical ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-ui-poll/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-ui-poll/default.nix
new file mode 100644
index 000000000000..2b6a62f886f0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-ui-poll/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, ipython
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-ui-poll";
+  version = "0.2.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Kirill888";
+    repo = "jupyter-ui-poll";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-DWZFvzx0aNTmf1x8Rq19OT0PFRxdpKefWYFh8C116Fw";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+  propagatedBuildInputs = [
+    ipython
+  ];
+
+  doCheck = false;  # no tests in package :(
+  pythonImportsCheck = [ "jupyter_ui_poll" ];
+
+  meta = with lib; {
+    description = "Block jupyter cell execution while interacting with widgets";
+    homepage = "https://github.com/Kirill888/jupyter-ui-poll";
+    changelog = "https://github.com/Kirill888/jupyter-ui-poll/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter-ydoc/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter-ydoc/default.nix
new file mode 100644
index 000000000000..03dae2dfa9ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter-ydoc/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hatch-nodejs-version
+, hatchling
+, y-py
+, pytestCheckHook
+, websockets
+, ypy-websocket
+}:
+
+buildPythonPackage rec {
+  pname = "jupyter-ydoc";
+  version = "1.1.1";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "jupyter_ydoc";
+    inherit version;
+    hash = "sha256-APizOm59VcvhK5G4emqGtnPikz13w6EmG7qLJHU2Rd0=";
+  };
+
+  nativeBuildInputs = [
+    hatch-nodejs-version
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    y-py
+  ];
+
+  pythonImportsCheck = [ "jupyter_ydoc" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    websockets
+    ypy-websocket
+  ];
+
+  # requires a Node.js environment
+  doCheck = false;
+
+  meta = {
+    changelog = "https://github.com/jupyter-server/jupyter_ydoc/blob/v${version}/CHANGELOG.md";
+    description = "Document structures for collaborative editing using Ypy";
+    homepage = "https://github.com/jupyter-server/jupyter_ydoc";
+    license = lib.licenses.bsd3;
+    maintainers = lib.teams.jupyter.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyter/default.nix b/nixpkgs/pkgs/development/python-modules/jupyter/default.nix
new file mode 100644
index 000000000000..b795dc9c9101
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyter/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, notebook
+, qtconsole
+, jupyter-console
+, nbconvert
+, ipykernel
+, ipywidgets
+}:
+
+buildPythonPackage rec {
+  version = "1.0.0";
+  pname = "jupyter";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f";
+  };
+
+  propagatedBuildInputs = [ notebook qtconsole jupyter-console nbconvert ipykernel ipywidgets ];
+
+  # Meta-package, no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Installs all the Jupyter components in one go";
+    homepage = "https://jupyter.org/";
+    license = licenses.bsd3;
+    platforms = platforms.all;
+    priority = 100; # This is a metapackage which is unimportant
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyterhub-ldapauthenticator/default.nix b/nixpkgs/pkgs/development/python-modules/jupyterhub-ldapauthenticator/default.nix
new file mode 100644
index 000000000000..7283eaed4434
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterhub-ldapauthenticator/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, jupyterhub
+, ldap3
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "jupyterhub-ldapauthenticator";
+  version = "1.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "758081bbdb28b26313bb18c9d8aa2b8fcdc9162e4d3ab196c626567e64f1ab8b";
+  };
+
+  # No tests implemented
+  doCheck = false;
+
+  propagatedBuildInputs = [ jupyterhub ldap3 ];
+
+  meta = with lib; {
+    description = "Simple LDAP Authenticator Plugin for JupyterHub";
+    homepage =  "https://github.com/jupyterhub/ldapauthenticator";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyterhub-systemdspawner/default.nix b/nixpkgs/pkgs/development/python-modules/jupyterhub-systemdspawner/default.nix
new file mode 100644
index 000000000000..409539ccb4a7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterhub-systemdspawner/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, bash
+, buildPythonPackage
+, fetchFromGitHub
+, jupyterhub
+, pythonOlder
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "jupyterhub-systemdspawner";
+  version = "1.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "jupyterhub";
+    repo = "systemdspawner";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-2Pxswa472umovHBUVTIX1l+Glj6bzzgBLsu+p4IA6jA=";
+  };
+
+  postPatch = ''
+    substituteInPlace systemdspawner/systemd.py \
+      --replace "/bin/bash" "${bash}/bin/bash"
+
+    substituteInPlace systemdspawner/systemdspawner.py \
+      --replace "/bin/bash" "${bash}/bin/bash"
+  '';
+
+  buildInputs = [
+    bash
+  ];
+
+  propagatedBuildInputs = [
+    jupyterhub
+    tornado
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  postInstall = ''
+    mkdir -p $out/bin
+    cp check-kernel.bash $out/bin/
+    patchShebangs $out/bin
+  '';
+
+  pythonImportsCheck = [
+    "systemdspawner"
+  ];
+
+  meta = with lib; {
+    description = "JupyterHub Spawner using systemd for resource isolation";
+    homepage = "https://github.com/jupyterhub/systemdspawner";
+    changelog = "https://github.com/jupyterhub/systemdspawner/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyterhub-tmpauthenticator/default.nix b/nixpkgs/pkgs/development/python-modules/jupyterhub-tmpauthenticator/default.nix
new file mode 100644
index 000000000000..0c18569c4b5c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterhub-tmpauthenticator/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, jupyterhub
+}:
+
+buildPythonPackage rec {
+  pname = "jupyterhub-tmpauthenticator";
+  version = "1.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7TuAYP6mRffsZL+O+AMgt5HBu6PhwLYj5A8X8DnMfl0=";
+  };
+
+  propagatedBuildInputs = [
+    jupyterhub
+  ];
+
+  # No tests available in the package
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "tmpauthenticator"
+  ];
+
+  meta = with lib; {
+    description = "Simple Jupyterhub authenticator that allows anyone to log in";
+    homepage = "https://github.com/jupyterhub/tmpauthenticator";
+    changelog = "https://github.com/jupyterhub/tmpauthenticator/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ chiroptical ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyterhub/default.nix b/nixpkgs/pkgs/development/python-modules/jupyterhub/default.nix
new file mode 100644
index 000000000000..5f298922cfe6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterhub/default.nix
@@ -0,0 +1,212 @@
+{ lib
+, stdenv
+, alembic
+, async-generator
+, beautifulsoup4
+, buildPythonPackage
+, certipy
+, configurable-http-proxy
+, cryptography
+, entrypoints
+, fetchPypi
+, fetchzip
+, importlib-metadata
+, jinja2
+, jsonschema
+, jupyter-telemetry
+, jupyterlab
+, jupyter-core
+, jupyter-server
+, mock
+, nbclassic
+, nodePackages
+, notebook
+, oauthlib
+, packaging
+, pamela
+, playwright
+, prometheus-client
+, pytest-asyncio
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, requests
+, requests-mock
+, selenium
+, sqlalchemy
+, tornado
+, traitlets
+, virtualenv
+}:
+
+let
+  # js/css assets that setup.py tries to fetch via `npm install` when building
+  # from source. https://github.com/jupyterhub/jupyterhub/blob/master/package.json
+  bootstrap =
+    fetchzip {
+      url = "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz";
+      sha256 = "1ywmxqdccg0mgx0xknrn1hlrfnhcwphc12y9l91zizx26fqfmzgc";
+    };
+  font-awesome =
+    fetchzip {
+      url = "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz";
+      sha256 = "1xnxbdlfdd60z5ix152m8r2kk9dkwlqwpypky1mm3dv64ajnzdbk";
+    };
+  jquery =
+    fetchzip {
+      url = "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz";
+      sha256 = "0yi9ql493din1qa1s923nd5zvd0klk1sx00xj1wx2yambmq86vm9";
+    };
+  moment =
+    fetchzip {
+      url = "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz";
+      sha256 = "0ifzzla4zffw23g3xvhwx3fj3jny6cjzxfzl1x0317q8wa0c7w5i";
+    };
+  requirejs =
+    fetchzip {
+      url = "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz";
+      sha256 = "165hkli3qcd59cjqvli9r5f92i0h7czkmhcg1cgwamw2d0b7xibz";
+    };
+
+in
+
+buildPythonPackage rec {
+  pname = "jupyterhub";
+  version = "4.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-1ORQ7tjZDfvPDsoI8A8gk6C8503FH3z8C3BX9gI0Gh0=";
+  };
+
+  # Most of this only applies when building from source (e.g. js/css assets are
+  # pre-built and bundled in the official release tarball on pypi).
+  #
+  # Stuff that's always needed:
+  #   * At runtime, we need configurable-http-proxy, so we substitute the store
+  #     path.
+  #
+  # Other stuff that's only needed when building from source:
+  #   * js/css assets are fetched from npm.
+  #   * substitute store path for `lessc` commmand.
+  #   * set up NODE_PATH so `lessc` can find `less-plugin-clean-css`.
+  #   * don't run `npm install`.
+  preBuild = ''
+    export NODE_PATH=${nodePackages.less-plugin-clean-css}/lib/node_modules
+
+    substituteInPlace jupyterhub/proxy.py --replace \
+      "'configurable-http-proxy'" \
+      "'${configurable-http-proxy}/bin/configurable-http-proxy'"
+
+    substituteInPlace jupyterhub/tests/test_proxy.py --replace \
+      "'configurable-http-proxy'" \
+      "'${configurable-http-proxy}/bin/configurable-http-proxy'"
+
+    substituteInPlace setup.py --replace \
+      "'npm'" "'true'"
+
+    declare -A deps
+    deps[bootstrap]=${bootstrap}
+    deps[font-awesome]=${font-awesome}
+    deps[jquery]=${jquery}
+    deps[moment]=${moment}
+    deps[requirejs]=${requirejs}
+
+    mkdir -p share/jupyter/hub/static/components
+    for dep in "''${!deps[@]}"; do
+      if [ ! -e share/jupyter/hub/static/components/$dep ]; then
+        cp -r ''${deps[$dep]} share/jupyter/hub/static/components/$dep
+      fi
+    done
+  '';
+
+  propagatedBuildInputs = [
+    alembic
+    async-generator
+    certipy
+    python-dateutil
+    entrypoints
+    jinja2
+    jupyter-telemetry
+    oauthlib
+    packaging
+    pamela
+    prometheus-client
+    requests
+    selenium
+    sqlalchemy
+    tornado
+    traitlets
+    jupyter-core
+    jupyter-server
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    beautifulsoup4
+    cryptography
+    notebook
+    jsonschema
+    nbclassic
+    mock
+    jupyterlab
+    playwright
+    pytest-asyncio
+    pytestCheckHook
+    requests-mock
+    virtualenv
+  ];
+
+  preCheck = ''
+    substituteInPlace jupyterhub/tests/test_spawner.py --replace \
+      "'jupyterhub-singleuser'" "'$out/bin/jupyterhub-singleuser'"
+    export PATH="$PATH:$out/bin";
+  '';
+
+  disabledTests = [
+    # Tries to install older versions through pip
+    "test_upgrade"
+    # Testcase fails to find requests import
+    "test_external_service"
+    # Attempts to do TLS connection
+    "test_connection_notebook_wrong_certs"
+    # AttributeError: 'coroutine' object...
+    "test_valid_events"
+    "test_invalid_events"
+    "test_user_group_roles"
+  ];
+
+  disabledTestPaths = [
+    # Not testing with a running instance
+    # AttributeError: 'coroutine' object has no attribute 'db'
+    "docs/test_docs.py"
+    "jupyterhub/tests/browser/test_browser.py"
+    "jupyterhub/tests/test_api.py"
+    "jupyterhub/tests/test_auth_expiry.py"
+    "jupyterhub/tests/test_auth.py"
+    "jupyterhub/tests/test_metrics.py"
+    "jupyterhub/tests/test_named_servers.py"
+    "jupyterhub/tests/test_orm.py"
+    "jupyterhub/tests/test_pages.py"
+    "jupyterhub/tests/test_proxy.py"
+    "jupyterhub/tests/test_scopes.py"
+    "jupyterhub/tests/test_services_auth.py"
+    "jupyterhub/tests/test_singleuser.py"
+    "jupyterhub/tests/test_spawner.py"
+    "jupyterhub/tests/test_user.py"
+  ];
+
+  meta = with lib; {
+    description = "Serves multiple Jupyter notebook instances";
+    homepage = "https://jupyter.org/";
+    changelog = "https://github.com/jupyterhub/jupyterhub/blob/${version}/docs/source/reference/changelog.md";
+    license = licenses.bsd3;
+    maintainers = teams.jupyter.members;
+    # darwin: E   OSError: dlopen(/nix/store/43zml0mlr17r5jsagxr00xxx91hz9lky-openpam-20170430/lib/libpam.so, 6): image not found
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyterlab-git/default.nix b/nixpkgs/pkgs/development/python-modules/jupyterlab-git/default.nix
new file mode 100644
index 000000000000..512c79947457
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterlab-git/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, git
+, jupyter-server
+, hatch-jupyter-builder
+, hatch-nodejs-version
+, hatchling
+, jupyterlab
+, nbdime
+, nbformat
+, pexpect
+, pytest-asyncio
+, pytest-jupyter
+, pytest-tornasync
+, pytestCheckHook
+, pythonOlder
+, traitlets
+}:
+
+buildPythonPackage rec {
+  pname = "jupyterlab-git";
+  version = "0.50.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "jupyterlab_git";
+    inherit version;
+    hash = "sha256-CYWVRtOQE067kYqWXCw/4mBf6v4yfPYWFb592Qtb37s=";
+  };
+
+  nativeBuildInputs = [
+    hatch-jupyter-builder
+    hatch-nodejs-version
+    hatchling
+    jupyterlab
+  ];
+
+  propagatedBuildInputs = [
+    jupyter-server
+    nbdime
+    git
+    nbformat
+    pexpect
+    traitlets
+  ];
+
+  nativeCheckInputs = [
+    jupyterlab
+    pytest-asyncio
+    pytest-jupyter
+    pytest-tornasync
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  disabledTestPaths = [
+    "jupyterlab_git/tests/test_handlers.py"
+    # PyPI doesn't ship all required files for the tests
+    "jupyterlab_git/tests/test_config.py"
+    "jupyterlab_git/tests/test_integrations.py"
+    "jupyterlab_git/tests/test_remote.py"
+    "jupyterlab_git/tests/test_settings.py"
+  ];
+
+  disabledTests = [
+    "test_Git_get_nbdiff_file"
+    "test_Git_get_nbdiff_dict"
+  ];
+
+  pythonImportsCheck = [
+    "jupyterlab_git"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Jupyter lab extension for version control with Git";
+    homepage = "https://github.com/jupyterlab/jupyterlab-git";
+    changelog = "https://github.com/jupyterlab/jupyterlab-git/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ chiroptical ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyterlab-lsp/default.nix b/nixpkgs/pkgs/development/python-modules/jupyterlab-lsp/default.nix
new file mode 100644
index 000000000000..6d57bc519646
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterlab-lsp/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jupyterlab
+, jupyter-lsp
+}:
+
+buildPythonPackage rec {
+  pname = "jupyterlab-lsp";
+  version = "5.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-D4jiaAPQ8+TIyL7wip+GHycGp3ym1NkvZQJsCelYFks=";
+  };
+
+  propagatedBuildInputs = [
+    jupyterlab
+    jupyter-lsp
+  ];
+  # No tests
+  doCheck = false;
+  pythonImportsCheck = [ "jupyterlab_lsp" ];
+
+  meta = with lib; {
+    description = "Language Server Protocol integration for Jupyter(Lab)";
+    homepage = "https://github.com/jupyter-lsp/jupyterlab-lsp";
+    license = licenses.bsd3;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyterlab-pygments/default.nix b/nixpkgs/pkgs/development/python-modules/jupyterlab-pygments/default.nix
new file mode 100644
index 000000000000..a31f0de42e6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterlab-pygments/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, pygments, jupyter-packaging }:
+
+buildPythonPackage rec {
+  pname = "jupyterlab_pygments";
+  version = "0.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-dAXX/eYIGdkFqfqM6J5M2DDjGM2tIqADD3qQHacFWF0=";
+  };
+
+  nativeBuildInputs = [
+    jupyter-packaging
+  ];
+
+  # no tests exist on upstream repo
+  doCheck = false;
+
+  propagatedBuildInputs = [ pygments ];
+
+  pythonImportsCheck = [ "jupyterlab_pygments" ];
+
+  meta = with lib; {
+    description = "Jupyterlab syntax coloring theme for pygments";
+    homepage = "https://github.com/jupyterlab/jupyterlab_pygments";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyterlab-server/default.nix b/nixpkgs/pkgs/development/python-modules/jupyterlab-server/default.nix
new file mode 100644
index 000000000000..a408137650ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterlab-server/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, hatchling
+, babel
+, importlib-metadata
+, jinja2
+, json5
+, jsonschema
+, jupyter-server
+, packaging
+, requests
+, openapi-core
+, pytest-jupyter
+, pytestCheckHook
+, requests-mock
+, ruamel-yaml
+, strict-rfc3339
+}:
+
+buildPythonPackage rec {
+  pname = "jupyterlab-server";
+  version = "2.25.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "jupyterlab_server";
+    inherit version;
+    hash = "sha256-ZJEoOwAAaY6uGjjEhQeTBWDfz3RhrqABU2hpiqs03Zw=";
+  };
+
+  postPatch = ''
+    sed -i "/timeout/d" pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    babel
+    jinja2
+    json5
+    jsonschema
+    jupyter-server
+    packaging
+    requests
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    importlib-metadata
+  ];
+
+  passthru.optional-dependencies = {
+    openapi = [
+      openapi-core
+      ruamel-yaml
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytest-jupyter
+    pytestCheckHook
+    requests-mock
+    strict-rfc3339
+  ] ++ passthru.optional-dependencies.openapi;
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  disabledTestPaths = [
+    # require optional language pack packages for tests
+    "tests/test_translation_api.py"
+  ];
+
+  pythonImportsCheck = [
+    "jupyterlab_server"
+    "jupyterlab_server.pytest_plugin"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "A set of server components for JupyterLab and JupyterLab like applications";
+    homepage = "https://github.com/jupyterlab/jupyterlab_server";
+    changelog = "https://github.com/jupyterlab/jupyterlab_server/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = lib.teams.jupyter.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyterlab-widgets/default.nix b/nixpkgs/pkgs/development/python-modules/jupyterlab-widgets/default.nix
new file mode 100644
index 000000000000..4d668da9bde6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterlab-widgets/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi
+, jupyter-packaging
+}:
+
+buildPythonPackage rec {
+  pname = "jupyterlab-widgets";
+  version = "3.0.9";
+
+  src = fetchPypi {
+    pname = "jupyterlab_widgets";
+    inherit version;
+    hash = "sha256-YAWk6XTHvu6EBg/fujQaMhhJUEbeiuPsZIiOX+Gf20w=";
+  };
+
+  nativeBuildInputs = [
+    jupyter-packaging
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "jupyterlab_widgets" ];
+
+  meta = with lib; {
+    description = "Jupyter Widgets JupyterLab Extension";
+    homepage = "https://github.com/jupyter-widgets/ipywidgets";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupyterlab/default.nix b/nixpkgs/pkgs/development/python-modules/jupyterlab/default.nix
new file mode 100644
index 000000000000..6a6acff7aaf3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupyterlab/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hatch-jupyter-builder
+, hatchling
+, async-lru
+, packaging
+, tornado
+, ipykernel
+, jupyter-core
+, jupyter-lsp
+, jupyterlab-server
+, jupyter-server
+, notebook-shim
+, jinja2
+, tomli
+, pythonOlder
+, jupyter-packaging
+}:
+
+buildPythonPackage rec {
+  pname = "jupyterlab";
+  version = "4.0.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bEOuWmof0v36/LNFQASVi95tp2Mxq7RM/8b55Daxm6E=";
+  };
+
+  nativeBuildInputs = [
+    hatch-jupyter-builder
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    async-lru
+    packaging
+    tornado
+    ipykernel
+    jupyter-core
+    jupyter-lsp
+    jupyterlab-server
+    jupyter-server
+    notebook-shim
+    jinja2
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  makeWrapperArgs = [
+    "--set"
+    "JUPYTERLAB_DIR"
+    "$out/share/jupyter/lab"
+  ];
+
+  # Depends on npm
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "jupyterlab"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/jupyterlab/jupyterlab/blob/v${version}/CHANGELOG.md";
+    description = "Jupyter lab environment notebook server extension";
+    license = licenses.bsd3;
+    homepage = "https://jupyter.org/";
+    maintainers = lib.teams.jupyter.members;
+    mainProgram = "jupyter-lab";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jupytext/default.nix b/nixpkgs/pkgs/development/python-modules/jupytext/default.nix
new file mode 100644
index 000000000000..e5bc170509d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jupytext/default.nix
@@ -0,0 +1,100 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, gitpython
+, isort
+, jupyter-client
+, jupyter-packaging
+, jupyterlab
+, markdown-it-py
+, mdit-py-plugins
+, nbformat
+, notebook
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, setuptools
+, toml
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "jupytext";
+  version = "1.15.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "mwouts";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-GvMoz2BsYWk0atrT3xmSnbV7AuO5RJoM/bOJlZ5YIn4=";
+  };
+
+  # Follow https://github.com/mwouts/jupytext/pull/1119 to see if the patch
+  # relaxing jupyter_packaging version can be cleaned up.
+  #
+  # Follow https://github.com/mwouts/jupytext/pull/1077 to see when the patch
+  # relaxing jupyterlab version can be cleaned up.
+  #
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'jupyter_packaging~=' 'jupyter_packaging>=' \
+      --replace 'jupyterlab>=3,<=4' 'jupyterlab>=3'
+  '';
+
+  nativeBuildInputs = [
+    jupyter-packaging
+    jupyterlab
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    markdown-it-py
+    mdit-py-plugins
+    nbformat
+    pyyaml
+    toml
+  ];
+
+  nativeCheckInputs = [
+    gitpython
+    isort
+    jupyter-client
+    notebook
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    # Tests that use a Jupyter notebook require $HOME to be writable
+    export HOME=$(mktemp -d);
+  '';
+
+  pytestFlagsArray = [
+    # Pre-commit tests expect the source directory to be a Git repository
+    "--ignore-glob='tests/test_pre_commit_*.py'"
+  ];
+
+  disabledTests = [
+    "test_apply_black_through_jupytext" # we can't do anything about ill-formatted notebooks
+  ] ++ lib.optionals stdenv.isDarwin [
+    # requires access to trash
+    "test_load_save_rename"
+  ];
+
+  pythonImportsCheck = [
+    "jupytext"
+    "jupytext.cli"
+  ];
+
+  meta = with lib; {
+    description = "Jupyter notebooks as Markdown documents, Julia, Python or R scripts";
+    homepage = "https://github.com/mwouts/jupytext";
+    changelog = "https://github.com/mwouts/jupytext/releases/tag/${src.rev}";
+    license = licenses.mit;
+    maintainers = teams.jupyter.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/justbackoff/default.nix b/nixpkgs/pkgs/development/python-modules/justbackoff/default.nix
new file mode 100644
index 000000000000..f07af6df2d2a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/justbackoff/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "justbackoff";
+  version = "0.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "alexferl";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "097j6jxgl4b3z46x9y9z10643vnr9v831vhagrxzrq6nviil2z6l";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest-runner>=5.2" ""
+  '';
+
+  pythonImportsCheck = [
+    "justbackoff"
+  ];
+
+  meta = with lib; {
+    description = "Simple backoff algorithm in Python";
+    homepage = "https://github.com/alexferl/justbackoff";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/justbases/default.nix b/nixpkgs/pkgs/development/python-modules/justbases/default.nix
new file mode 100644
index 000000000000..dfa4d254654c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/justbases/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, unittestCheckHook
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "justbases";
+  version = "0.15.2";
+
+  src = fetchFromGitHub {
+    owner = "mulkieran";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-XraUh3beI2JqKPRHYN5W3Tn3gg0GJCwhnhHIOFdzh6U=";
+  };
+
+  nativeCheckInputs = [
+    unittestCheckHook
+    hypothesis
+  ];
+
+  meta = with lib; {
+    description = "conversion of ints and rationals to any base";
+    homepage = "https://github.com/mulkieran/justbases";
+    changelog = "https://github.com/mulkieran/justbases/blob/v${version}/CHANGES.txt";
+    license = licenses.lgpl2Plus;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/justbytes/default.nix b/nixpkgs/pkgs/development/python-modules/justbytes/default.nix
new file mode 100644
index 000000000000..f517c30c01b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/justbytes/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, justbases
+, unittestCheckHook
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "justbytes";
+  version = "0.15.2";
+
+  src = fetchFromGitHub {
+    owner = "mulkieran";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+jwIK1ZU+j58VoOfZAm7GdFy7KHU28khwzxhYhcws74=";
+  };
+
+  propagatedBuildInputs = [ justbases ];
+  nativeCheckInputs = [ unittestCheckHook hypothesis ];
+
+  meta = with lib; {
+    description = "computing with and displaying bytes";
+    homepage = "https://github.com/mulkieran/justbytes";
+    license = licenses.lgpl2Plus;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/justnimbus/default.nix b/nixpkgs/pkgs/development/python-modules/justnimbus/default.nix
new file mode 100644
index 000000000000..ecea9ef4a549
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/justnimbus/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "justnimbus";
+  version = "0.7.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "kvanzuijlen";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-arUdjZiEJx0L1YcCNxqlE4ItoTEzd/TYVgqDPIqomMg=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "justnimbus"
+  ];
+
+  meta = with lib; {
+    description = "Library for the JustNimbus API";
+    homepage = "https://github.com/kvanzuijlen/justnimbus";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/jwcrypto/default.nix b/nixpkgs/pkgs/development/python-modules/jwcrypto/default.nix
new file mode 100644
index 000000000000..2061f788c05b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jwcrypto/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cryptography
+, deprecated
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "jwcrypto";
+  version = "1.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-LB3FHPjjjd8yR5Xf6UJt7p3UbK9H9TXMvBh4H7qBC40=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    deprecated
+  ];
+
+  pythonImportsCheck = [
+    "jwcrypto"
+  ];
+
+  meta = with lib; {
+    description = "Implementation of JOSE Web standards";
+    homepage = "https://github.com/latchset/jwcrypto";
+    changelog = "https://github.com/latchset/jwcrypto/releases/tag/v${version}";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jwt/default.nix b/nixpkgs/pkgs/development/python-modules/jwt/default.nix
new file mode 100644
index 000000000000..7e21b4f45a21
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jwt/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, cryptography
+, freezegun
+, pytestCheckHook
+, pytest-cov
+}:
+
+buildPythonPackage rec {
+  pname = "jwt";
+  version = "1.3.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    inherit version;
+    owner = "GehirnInc";
+    repo = "python-jwt";
+    rev = "v${version}";
+    hash = "sha256-N1J8yBVX/O+92cRp+q2gA2cFsd+C7JjUR9jo0VGoINg=";
+  };
+
+  postPatch = ''
+    # pytest-flake8 is incompatible flake8 6.0.0 and currently unmaintained
+    substituteInPlace setup.cfg --replace "--flake8" ""
+  '';
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    freezegun
+    pytest-cov
+  ];
+
+  pythonImportsCheck = [ "jwt" ];
+
+  meta = with lib; {
+    description = "JSON Web Token library for Python 3";
+    homepage = "https://github.com/GehirnInc/python-jwt";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ thornycrackers ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/jxmlease/default.nix b/nixpkgs/pkgs/development/python-modules/jxmlease/default.nix
new file mode 100644
index 000000000000..a9782ef2d40f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/jxmlease/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, lxml
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "jxmlease";
+  version = "1.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "17l3w3ak07p72s8kv8hg0ilxs0kkxjn7bfwnl3g2cw58v1siab31";
+  };
+
+  propagatedBuildInputs = [
+    lxml
+  ];
+
+  # tests broken in expat bump
+  # https://github.com/Juniper/jxmlease/issues/26
+  doCheck = false;
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  unittestFlagsArray = [ "-v" ];
+
+  meta = with lib; {
+    description = "Converts between XML and intelligent Python data structures";
+    homepage = "https://github.com/Juniper/jxmlease";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/k-diffusion/default.nix b/nixpkgs/pkgs/development/python-modules/k-diffusion/default.nix
new file mode 100644
index 000000000000..4a2c6f0a1d32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/k-diffusion/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, accelerate
+, buildPythonPackage
+, clean-fid
+, clip-anytorch
+, dctorch
+, einops
+, fetchFromGitHub
+, jsonmerge
+, kornia
+, pillow
+, pythonOlder
+, rotary-embedding-torch
+, safetensors
+, scikit-image
+, scipy
+, torch
+, torchdiffeq
+, torchsde
+, torchvision
+, tqdm
+, wandb
+}:
+
+buildPythonPackage rec {
+  pname = "k-diffusion";
+  version = "0.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "crowsonkb";
+    repo = "k-diffusion";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ef4NhViHQcV+4T+GXpg+Qev5IC0Cid+XWE3sFVx7w4w=";
+  };
+
+  propagatedBuildInputs = [
+    accelerate
+    clean-fid
+    clip-anytorch
+    dctorch
+    einops
+    jsonmerge
+    kornia
+    pillow
+    rotary-embedding-torch
+    scikit-image
+    scipy
+    safetensors
+    torch
+    torchdiffeq
+    torchsde
+    torchvision
+    tqdm
+    wandb
+  ];
+
+  pythonImportsCheck = [
+    "k_diffusion"
+  ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Karras et al. (2022) diffusion models for PyTorch";
+    homepage = "https://github.com/crowsonkb/k-diffusion";
+    license = licenses.mit;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/k5test/default.nix b/nixpkgs/pkgs/development/python-modules/k5test/default.nix
new file mode 100644
index 000000000000..a4620c14882d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/k5test/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, substituteAll
+, findutils
+, krb5
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "k5test";
+  version = "0.10.3";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-nJ3uvK1joxXoGDPUXp/RK/IBZmQ7iry5/29NaxhMVx8=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      inherit findutils krb5;
+      # krb5-config is in dev output
+      krb5Dev = krb5.dev;
+    })
+  ];
+
+  # No tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "k5test" ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Library for setting up self-contained Kerberos 5 environment";
+    homepage = "https://github.com/pythongssapi/k5test";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/k5test/fix-paths.patch b/nixpkgs/pkgs/development/python-modules/k5test/fix-paths.patch
new file mode 100644
index 000000000000..04103df36d53
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/k5test/fix-paths.patch
@@ -0,0 +1,116 @@
+--- a/k5test/_utils.py
++++ b/k5test/_utils.py
+@@ -63,12 +63,12 @@ def find_plugin_dir():
+ 
+     # if there was no LD_LIBRARY_PATH, or the above failed
+     if _PLUGIN_DIR is None:
+-        lib_dir = os.path.join(get_output("krb5-config --prefix"), "lib64")
++        lib_dir = os.path.join(get_output("@krb5Dev@/bin/krb5-config --prefix"), "lib64")
+         _PLUGIN_DIR = _decide_plugin_dir(_find_plugin_dirs_installed(lib_dir))
+ 
+     # /usr/lib64 seems only to be distinct on Fedora/RHEL/Centos family
+     if _PLUGIN_DIR is None:
+-        lib_dir = os.path.join(get_output("krb5-config --prefix"), "lib")
++        lib_dir = os.path.join(get_output("@krb5Dev@/bin/krb5-config --prefix"), "lib")
+         _PLUGIN_DIR = _decide_plugin_dir(_find_plugin_dirs_installed(lib_dir))
+ 
+     if _PLUGIN_DIR is not None:
+@@ -87,7 +87,7 @@ def _decide_plugin_dir(dirs):
+ 
+     for path in shortest_first:
+         # check to see if it actually contains .so files
+-        if get_output('find %s -name "*.so"' % path):
++        if get_output('@findutils@/bin/find %s -name "*.so"' % path):
+             return path
+ 
+     return None
+@@ -96,7 +96,7 @@ def _decide_plugin_dir(dirs):
+ def _find_plugin_dirs_installed(search_path):
+     try:
+         options_raw = get_output(
+-            "find %s/ -type d \( ! -executable -o ! -readable \) "
++            "@findutils@/bin/find %s/ -type d \( ! -executable -o ! -readable \) "
+             "-prune -o "
+             '-type d -path "*/krb5/plugins" -print' % search_path,
+             stderr=subprocess.STDOUT,
+@@ -111,7 +111,7 @@ def _find_plugin_dirs_installed(search_path):
+ 
+ 
+ def _find_plugin_dirs_src(search_path):
+-    options_raw = get_output("find %s/../ -type d -name plugins" % search_path)
++    options_raw = get_output("@findutils@/bin/find %s/../ -type d -name plugins" % search_path)
+ 
+     if options_raw:
+         return options_raw.split("\n")
+--- a/k5test/realm.py
++++ b/k5test/realm.py
+@@ -84,7 +84,7 @@ class K5Realm(metaclass=abc.ABCMeta):
+         provider_cls = cls
+ 
+         if provider_cls == K5Realm:
+-            krb5_config = _discover_path("krb5-config", "/usr/bin/krb5-config", kwargs)
++            krb5_config = _discover_path("krb5-config", "@krb5@/bin/krb5-config", kwargs)
+ 
+             try:
+                 krb5_version = subprocess.check_output(
+@@ -96,7 +96,7 @@ class K5Realm(metaclass=abc.ABCMeta):
+ 
+                 # macOS output doesn't contain Heimdal
+                 if "heimdal" in krb5_version.lower() or (
+-                    sys.platform == "darwin" and krb5_config == "/usr/bin/krb5-config"
++                    sys.platform == "darwin" and krb5_config == "@krb5@/bin/krb5-config"
+                 ):
+                     provider_cls = HeimdalRealm
+                 else:
+@@ -457,14 +457,14 @@ class MITRealm(K5Realm):
+     @property
+     def _default_paths(self):
+         return [
+-            ("kdb5_util", "kdb5_util", "/usr/sbin/kdb5_util"),
+-            ("krb5kdc", "krb5kdc", "/usr/sbin/krb5kdc"),
+-            ("kadmin", "kadmin", "/usr/bin/kadmin"),
+-            ("kadmin_local", "kadmin.local", "/usr/sbin/kadmin.local"),
+-            ("kadmind", "kadmind", "/usr/sbin/kadmind"),
+-            ("kprop", "kprop", "/usr/sbin/kprop"),
+-            ("_kinit", "kinit", "/usr/bin/kinit"),
+-            ("_klist", "klist", "/usr/bin/klist"),
++            ("kdb5_util", "kdb5_util", "@krb5@/bin/kdb5_util"),
++            ("krb5kdc", "krb5kdc", "@krb5@/bin/krb5kdc"),
++            ("kadmin", "kadmin", "@krb5@/bin/kadmin"),
++            ("kadmin_local", "kadmin.local", "@krb5@/bin/kadmin.local"),
++            ("kadmind", "kadmind", "@krb5@/bin/kadmind"),
++            ("kprop", "kprop", "@krb5@/bin/kprop"),
++            ("_kinit", "kinit", "@krb5@/bin/kinit"),
++            ("_klist", "klist", "@krb5@/bin/klist"),
+         ]
+ 
+     @property
+@@ -625,12 +625,12 @@ class HeimdalRealm(K5Realm):
+ 
+         return [
+             ("krb5kdc", "kdc", os.path.join(base, "kdc")),
+-            ("kadmin", "kadmin", "/usr/bin/kadmin"),
+-            ("kadmin_local", "kadmin", "/usr/bin/kadmin"),
++            ("kadmin", "kadmin", "@krb5@/bin/kadmin"),
++            ("kadmin_local", "kadmin", "@krb5@/bin/kadmin"),
+             ("kadmind", "kadmind", os.path.join(base, "kadmind")),
+-            ("_kinit", "kinit", "/usr/bin/kinit"),
+-            ("_klist", "klist", "/usr/bin/klist"),
+-            ("_ktutil", "ktutil", "/usr/bin/ktutil"),
++            ("_kinit", "kinit", "@krb5@/bin/kinit"),
++            ("_klist", "klist", "@krb5@/bin/klist"),
++            ("_ktutil", "ktutil", "@krb5@/bin/ktutil"),
+         ]
+ 
+     @property
+--- a/k5test/unit.py
++++ b/k5test/unit.py
+@@ -39,7 +39,7 @@ _KRB_VERSION = None
+ def krb_minversion_test(target_version, problem, provider=None):
+     global _KRB_VERSION
+     if _KRB_VERSION is None:
+-        _KRB_VERSION = _utils.get_output("krb5-config --version")
++        _KRB_VERSION = _utils.get_output("@krb5Dev@/bin/krb5-config --version")
+         _KRB_VERSION = _KRB_VERSION.split(" ")[-1].split(".")
+ 
+     def make_ext_test(func):
diff --git a/nixpkgs/pkgs/development/python-modules/kaa-base/default.nix b/nixpkgs/pkgs/development/python-modules/kaa-base/default.nix
new file mode 100644
index 000000000000..5b789f5eda8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kaa-base/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, isPy3k
+, python
+}:
+
+buildPythonPackage rec {
+  version = "0.99.2dev-384-2b73caca";
+  pname = "kaa-base";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0k3zzz84wzz9q1fl3vvqr2ys96z9pcf4viq9q6s2a63zaysmcfd2";
+  };
+
+  doCheck = false;
+
+  disabled = isPyPy || isPy3k;
+
+  # Same as in buildPythonPackage except that it does not pass --old-and-unmanageable
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p "$out/lib/${python.libPrefix}/site-packages"
+
+    export PYTHONPATH="$out/lib/${python.libPrefix}/site-packages:$PYTHONPATH"
+
+    ${python}/bin/${python.executable} setup.py install \
+      --install-lib=$out/lib/${python.libPrefix}/site-packages \
+      --prefix="$out"
+
+    eapth="$out/lib/${python.libPrefix}"/site-packages/easy-install.pth
+    if [ -e "$eapth" ]; then
+    mv "$eapth" $(dirname "$eapth")/${pname}-${version}.pth
+    fi
+
+    rm -f "$out/lib/${python.libPrefix}"/site-packages/site.py*
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Generic application framework, providing the foundation for other modules";
+    homepage = "https://github.com/freevo/kaa-base";
+    license = licenses.lgpl21;
+    maintainers = with maintainers; [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kaa-metadata/default.nix b/nixpkgs/pkgs/development/python-modules/kaa-metadata/default.nix
new file mode 100644
index 000000000000..5a50d9e9c0a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kaa-metadata/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, kaa-base
+, isPyPy
+, isPy3k
+, python
+, pkgs
+}:
+
+buildPythonPackage rec {
+  version = "0.7.8dev-r4569-20111003";
+  pname = "kaa-metadata";
+  disabled = isPyPy || isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0bkbzfgxvmby8lvzkqjp86anxvv3vjd9nksv2g4l7shsk1n7y27a";
+  };
+
+  doCheck = false;
+
+  buildInputs = [ pkgs.libdvdread ];
+
+  propagatedBuildInputs = [ kaa-base ];
+
+  # Same as in buildPythonPackage except that it does not pass --old-and-unmanageable
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p "$out/lib/${python.libPrefix}/site-packages"
+
+    export PYTHONPATH="$out/lib/${python.libPrefix}/site-packages:$PYTHONPATH"
+
+    ${python}/bin/${python.executable} setup.py install \
+      --install-lib=$out/lib/${python.libPrefix}/site-packages \
+      --prefix="$out"
+
+    eapth="$out/lib/${python.libPrefix}"/site-packages/easy-install.pth
+    if [ -e "$eapth" ]; then
+    mv "$eapth" $(dirname "$eapth")/${pname}-${version}.pth
+    fi
+
+    rm -f "$out/lib/${python.libPrefix}"/site-packages/site.py*
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Python library for parsing media metadata, which can extract metadata (e.g., such as id3 tags) from a wide range of media files";
+    homepage = "https://github.com/freevo/kaa-metadata";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kafka-python/default.nix b/nixpkgs/pkgs/development/python-modules/kafka-python/default.nix
new file mode 100644
index 000000000000..089c4a8ffc0a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kafka-python/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, pytest, six, mock }:
+
+buildPythonPackage rec {
+  version = "2.0.2";
+  pname = "kafka-python";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "04dfe7fea2b63726cd6f3e79a2d86e709d608d74406638c5da33a01d45a9d7e3";
+  };
+
+  nativeCheckInputs = [ pytest six mock ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  # Upstream uses tox but we don't on Nix. Running tests manually produces however
+  #     from . import unittest
+  # E   ImportError: cannot import name 'unittest'
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Pure Python client for Apache Kafka";
+    homepage = "https://github.com/dpkp/kafka-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kaggle/default.nix b/nixpkgs/pkgs/development/python-modules/kaggle/default.nix
new file mode 100644
index 000000000000..ce68748ac7e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kaggle/default.nix
@@ -0,0 +1,50 @@
+{ buildPythonPackage
+, bleach
+, certifi
+, fetchPypi
+, lib
+, python-dateutil
+, python-slugify
+, six
+, requests
+, tqdm
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "kaggle";
+  version = "1.5.16";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-prNUL1kM80GlrUQdWuAhvpO9ZEQclsdYsVSQNJWjpgA=";
+  };
+
+  propagatedBuildInputs = [
+    bleach
+    certifi
+    python-dateutil
+    python-slugify
+    requests
+    six
+    tqdm
+    urllib3
+    bleach
+  ];
+
+  # Tests try to access the network.
+  checkPhase = ''
+    export HOME="$TMP"
+    mkdir -p "$HOME/.kaggle/"
+    echo '{"username":"foobar","key":"00000000000000000000000000000000"}' > "$HOME/.kaggle/kaggle.json"
+    $out/bin/kaggle --help > /dev/null
+  '';
+  pythonImportsCheck = [ "kaggle" ];
+
+  meta = with lib; {
+    description = "Official API for https://www.kaggle.com, accessible using a command line tool implemented in Python 3";
+    homepage = "https://github.com/Kaggle/kaggle-api";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kaitaistruct/default.nix b/nixpkgs/pkgs/development/python-modules/kaitaistruct/default.nix
new file mode 100644
index 000000000000..c6f8ebf7eaf0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kaitaistruct/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchFromGitHub
+, brotli
+, lz4
+}:
+
+let
+  kaitai_compress = fetchFromGitHub {
+    owner = "kaitai-io";
+    repo = "kaitai_compress";
+    rev = "12f4cffb45d95b17033ee4f6679987656c6719cc";
+    hash = "sha256-l3rGbblUgxO6Y7grlsMEiT3nRIgUZV1VqTyjIgIDtyA=";
+  };
+in
+buildPythonPackage rec {
+  pname = "kaitaistruct";
+  version = "0.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-oETe4pFz1q+6zye8rDna+JtlTdQYz6AJq4LZF4qa5So=";
+  };
+
+  preBuild = ''
+    ln -s ${kaitai_compress}/python/kaitai kaitai
+    sed '32ipackages = kaitai/compress' -i setup.cfg
+  '';
+
+  propagatedBuildInputs = [
+    brotli
+    lz4
+  ];
+
+  # no tests
+  dontCheck = true;
+
+  pythonImportsCheck = [
+    "kaitaistruct"
+    "kaitai.compress"
+  ];
+
+  meta = with lib; {
+    description = "Kaitai Struct: runtime library for Python";
+    homepage = "https://github.com/kaitai-io/kaitai_struct_python_runtime";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kajiki/default.nix b/nixpkgs/pkgs/development/python-modules/kajiki/default.nix
new file mode 100644
index 000000000000..e11e16fbedbc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kajiki/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, babel
+, buildPythonPackage
+, fetchFromGitHub
+, linetable
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "kajiki";
+  version = "0.9.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jackrosenthal";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-EbXe4Jh2IKAYw9GE0kFgKVv9c9uAOiFFYaMF8CGaOfg=";
+  };
+
+  propagatedBuildInputs = [
+    linetable
+  ];
+
+  nativeCheckInputs = [
+    babel
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "kajiki"
+  ];
+
+  meta = with lib; {
+    description = "Module provides fast well-formed XML templates";
+    homepage = "https://github.com/nandoflorestan/kajiki";
+    changelog = "https://github.com/jackrosenthal/kajiki/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/0001-stub.patch b/nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/0001-stub.patch
new file mode 100644
index 000000000000..597907c14be6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/0001-stub.patch
@@ -0,0 +1,158 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 17c7032..12ed398 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -1,87 +1,12 @@
+ cmake_minimum_required(VERSION 3.13.0)
+ project(kaldi_binaries)
+ 
+-include(ExternalProject)
+-include(ProcessorCount)
+-
+-ProcessorCount(NCPU)
+-if(NOT NCPU EQUAL 0)
+-  set(MAKE_FLAGS -j${NCPU})
+-endif()
+-
+-set(DST ${PROJECT_SOURCE_DIR}/kaldi_active_grammar/exec)
+-if ("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Darwin")
+-  set(DST ${DST}/macos/)
+-elseif("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Linux")
+-  set(DST ${DST}/linux/)
+-else()
+-  set(DST ${DST}/windows/)
+-endif()
+-
+ set(BINARIES
+   )
+ set(LIBRARIES
+   src/lib/libkaldi-dragonfly${CMAKE_SHARED_LIBRARY_SUFFIX}
+   )
+ 
+-# For MacOS, we handle all the "indirect" shared libraries manually.
+-if("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Darwin")
+-  list(APPEND LIBRARIES
+-    tools/openfst/lib/libfst${CMAKE_SHARED_LIBRARY_SUFFIX}
+-    tools/openfst/lib/libfstscript${CMAKE_SHARED_LIBRARY_SUFFIX}
+-    src/lib/libkaldi-base${CMAKE_SHARED_LIBRARY_SUFFIX}
+-    src/lib/libkaldi-chain${CMAKE_SHARED_LIBRARY_SUFFIX}
+-    src/lib/libkaldi-cudamatrix${CMAKE_SHARED_LIBRARY_SUFFIX}
+-    src/lib/libkaldi-decoder${CMAKE_SHARED_LIBRARY_SUFFIX}
+-    src/lib/libkaldi-feat${CMAKE_SHARED_LIBRARY_SUFFIX}
+-    src/lib/libkaldi-fstext${CMAKE_SHARED_LIBRARY_SUFFIX}
+-    src/lib/libkaldi-gmm${CMAKE_SHARED_LIBRARY_SUFFIX}
+-    src/lib/libkaldi-hmm${CMAKE_SHARED_LIBRARY_SUFFIX}
+-    src/lib/libkaldi-ivector${CMAKE_SHARED_LIBRARY_SUFFIX}
+-    src/lib/libkaldi-lat${CMAKE_SHARED_LIBRARY_SUFFIX}
+-    src/lib/libkaldi-lm${CMAKE_SHARED_LIBRARY_SUFFIX}
+-    src/lib/libkaldi-matrix${CMAKE_SHARED_LIBRARY_SUFFIX}
+-    src/lib/libkaldi-nnet2${CMAKE_SHARED_LIBRARY_SUFFIX}
+-    src/lib/libkaldi-nnet3${CMAKE_SHARED_LIBRARY_SUFFIX}
+-    src/lib/libkaldi-online2${CMAKE_SHARED_LIBRARY_SUFFIX}
+-    src/lib/libkaldi-rnnlm${CMAKE_SHARED_LIBRARY_SUFFIX}
+-    src/lib/libkaldi-transform${CMAKE_SHARED_LIBRARY_SUFFIX}
+-    src/lib/libkaldi-tree${CMAKE_SHARED_LIBRARY_SUFFIX}
+-    src/lib/libkaldi-util${CMAKE_SHARED_LIBRARY_SUFFIX}
+-  )
+-endif()
+-
+-if("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows")
+-  message(FATAL_ERROR "CMake build not supported on Windows")
+-  # FIXME: copy files?
+-  # https://cmake.org/cmake/help/latest/command/foreach.html
+-  # https://stackoverflow.com/questions/34799916/copy-file-from-source-directory-to-binary-directory-using-cmake
+-endif()  
+-
+-find_program(MAKE_EXE NAMES make gmake nmake)
+-
+-if(DEFINED ENV{INTEL_MKL_DIR})
+-  # Default: INTEL_MKL_DIR=/opt/intel/mkl/
+-  message("Compiling with MKL in: $ENV{INTEL_MKL_DIR}")
+-  set(KALDI_CONFIG_FLAGS --shared --static-math --use-cuda=no --mathlib=MKL --mkl-root=$ENV{INTEL_MKL_DIR})
+-  set(MATHLIB_BUILD_COMMAND true)
+-else()  
+-  message("Compiling with OpenBLAS")
+-  set(KALDI_CONFIG_FLAGS --shared --static-math --use-cuda=no --mathlib=OPENBLAS)
+-  set(MATHLIB_BUILD_COMMAND cd tools
+-    && git clone -b v0.3.13 --single-branch https://github.com/xianyi/OpenBLAS
+-    && ${MAKE_EXE} ${MAKE_FLAGS} -C OpenBLAS DYNAMIC_ARCH=1 TARGET=GENERIC USE_LOCKING=1 USE_THREAD=0 all
+-    && ${MAKE_EXE} ${MAKE_FLAGS} -C OpenBLAS PREFIX=install install
+-    && cd ..)
+-endif()
+-
+-if(DEFINED ENV{KALDI_BRANCH})
+-  set(KALDI_BRANCH $ENV{KALDI_BRANCH})
+-else()
+-  message(FATAL_ERROR "KALDI_BRANCH not set! Use 'origin/master'?")
+-  # set(KALDI_BRANCH "origin/master")
+-endif()
+-
+ message("MAKE_EXE                  = ${MAKE_EXE}")
+ message("PYTHON_EXECUTABLE         = ${PYTHON_EXECUTABLE}")
+ message("PYTHON_INCLUDE_DIR        = ${PYTHON_INCLUDE_DIR}")
+@@ -94,65 +19,4 @@ message("CMAKE_CURRENT_BINARY_DIR  = ${CMAKE_CURRENT_BINARY_DIR}")
+ 
+ # CXXFLAGS are set and exported in kaldi-configure-wrapper.sh
+ 
+-if(NOT "${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows")
+-  set(STRIP_LIBS_COMMAND find src/lib tools/openfst/lib -name *${CMAKE_SHARED_LIBRARY_SUFFIX} | xargs strip)
+-  # set(STRIP_DST_COMMAND find ${DST} [[[other specifiers]]] | xargs strip)
+-  if("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Darwin")
+-    list(APPEND STRIP_LIBS_COMMAND -x)
+-    # list(APPEND STRIP_DST_COMMAND -x)
+-  endif()
+-  # set(STRIP_LIBS_COMMAND true)
+-  set(STRIP_DST_COMMAND true)
+-  ExternalProject_Add(kaldi
+-    GIT_CONFIG        advice.detachedHead=false
+-    GIT_REPOSITORY    https://github.com/daanzu/kaldi-fork-active-grammar.git
+-    GIT_TAG           ${KALDI_BRANCH}
+-    GIT_SHALLOW       TRUE
+-    CONFIGURE_COMMAND sed -i.bak -e "s/status=0/exit 0/g" tools/extras/check_dependencies.sh && sed -i.bak -e "s/openfst_add_CXXFLAGS = -g -O2/openfst_add_CXXFLAGS = -g0 -O3/g" tools/Makefile && cp ${PROJECT_SOURCE_DIR}/building/kaldi-configure-wrapper.sh src/
+-    BUILD_IN_SOURCE   TRUE
+-    BUILD_COMMAND     ${MATHLIB_BUILD_COMMAND} && cd tools && ${MAKE_EXE} ${MAKE_FLAGS} && cd openfst && autoreconf && cd ../../src && bash ./kaldi-configure-wrapper.sh ./configure ${KALDI_CONFIG_FLAGS} && ${MAKE_EXE} ${MAKE_FLAGS} depend && ${MAKE_EXE} ${MAKE_FLAGS} dragonfly
+-    LIST_SEPARATOR    " "
+-    INSTALL_COMMAND   ${STRIP_LIBS_COMMAND} && mkdir -p ${DST} && cp ${BINARIES} ${LIBRARIES} ${DST} && ${STRIP_DST_COMMAND}
+-    )
+-endif()
+-
+-# Fix dynamic libraries loading paths on macOS.  The libraries and
+-# executables are built with RPATH settings embedded in them, pointing
+-# to the locations in temporary directories used to build the
+-# binaries.  After package installation is done, these directories are
+-# deleted and the dynamic libraries cannot be loaded.  The following
+-# commands generate a shell script that fixes the paths to the dynamic
+-# libraries in the built executables and the libraries themselves.
+-# Also the commands add a custom target to invoke the generated script
+-# after the external project (kaldi) has been built.  An alternative
+-# would be to change the kaldi engine build system to accept a path to
+-# where the binaries would be placed and point RPATH to that location.
+-if("${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Darwin")
+-  string (REPLACE ";" " " BINARIES_STR "${BINARIES}")
+-  string (REPLACE ";" " " LIBRARIES_STR "${LIBRARIES}")
+-  file(GENERATE OUTPUT name_fixer
+-    CONTENT
+-    "for a in ${BINARIES_STR} ; do
+-       a_bare=$\{a##*/\}
+-       install_name_tool -change ${PROJECT_BINARY_DIR}/kaldi-prefix/src/kaldi/tools/openfst-1.6.7/lib/libfst.10.dylib \"@loader_path/libfst.dylib\" ${DST}$a_bare
+-       install_name_tool -change ${PROJECT_BINARY_DIR}/kaldi-prefix/src/kaldi/tools/openfst-1.6.7/lib/libfstscript.10.dylib \"@loader_path/libfstscript.dylib\" ${DST}$a_bare
+-       for b in ${LIBRARIES_STR} ; do
+-          b_bare=$\{b##*/\}
+-         install_name_tool -change \"@rpath/$b_bare\" \"@loader_path/$b_bare\" ${DST}$a_bare
+-       done
+-     done
+-     for a in ${LIBRARIES_STR} ; do
+-       a_bare=$\{a##*/\}
+-       install_name_tool -id \"@loader_path/$a_bare\" ${DST}$a_bare
+-       install_name_tool -change ${PROJECT_BINARY_DIR}/kaldi-prefix/src/kaldi/tools/openfst-1.6.7/lib/libfst.10.dylib \"@loader_path/libfst.dylib\" ${DST}$a_bare
+-       install_name_tool -change ${PROJECT_BINARY_DIR}/kaldi-prefix/src/kaldi/tools/openfst-1.6.7/lib/libfstscript.10.dylib \"@loader_path/libfstscript.dylib\" ${DST}$a_bare
+-       for b in ${LIBRARIES_STR} ; do
+-          b_bare=$\{b##*/\}
+-         install_name_tool -change \"@rpath/$b_bare\" \"@loader_path/$b_bare\" ${DST}$a_bare
+-       done
+-     done")
+-  add_custom_target(fixer ALL COMMAND /bin/sh name_fixer)
+-  add_dependencies(fixer kaldi)
+-endif()
+-
+ install(CODE "MESSAGE(\"Installed kaldi engine binaries.\")")
diff --git a/nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/0002-exec-path.patch b/nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/0002-exec-path.patch
new file mode 100644
index 000000000000..3a45ea7e104d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/0002-exec-path.patch
@@ -0,0 +1,34 @@
+diff --git a/kaldi_active_grammar/utils.py b/kaldi_active_grammar/utils.py
+index 823f997..3850336 100644
+--- a/kaldi_active_grammar/utils.py
++++ b/kaldi_active_grammar/utils.py
+@@ -79,7 +79,7 @@ elif sys.platform.startswith('linux'): platform = 'linux'
+ elif sys.platform.startswith('darwin'): platform = 'macos'
+ else: raise KaldiError("unknown sys.platform")
+ 
+-exec_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'exec', platform)
++exec_dir = '/'
+ 
+ import ush
+ 
+@@ -87,13 +87,13 @@ class ExternalProcess(object):
+ 
+     shell = ush.Shell(raise_on_error=True)
+ 
+-    fstcompile = shell(os.path.join(exec_dir, 'fstcompile'))
+-    fstarcsort = shell(os.path.join(exec_dir, 'fstarcsort'))
+-    fstaddselfloops = shell(os.path.join(exec_dir, 'fstaddselfloops'))
+-    fstinfo = shell(os.path.join(exec_dir, 'fstinfo'))
+-    # compile_graph = shell(os.path.join(exec_dir, 'compile-graph'))
+-    compile_graph_agf = shell(os.path.join(exec_dir, 'compile-graph-agf'))
+-    # compile_graph_agf_debug = shell(os.path.join(exec_dir, 'compile-graph-agf-debug'))
++    fstcompile = shell('fstcompile')
++    fstarcsort = shell('fstarcsort')
++    fstaddselfloops = shell('fstaddselfloops')
++    fstinfo = shell('fstinfo')
++    # compile_graph = shell('compile-graph')
++    compile_graph_agf = shell('compile-graph-agf')
++    # compile_graph_agf_debug = shell('compile-graph-agf-debug')
+ 
+     make_lexicon_fst = shell([sys.executable, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'kaldi', 'make_lexicon_fst%s.py' % ('_py2' if PY2 else ''))])
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/0003-ffi-path.patch b/nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/0003-ffi-path.patch
new file mode 100644
index 000000000000..19fd8692e57a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/0003-ffi-path.patch
@@ -0,0 +1,13 @@
+diff --git a/kaldi_active_grammar/ffi.py b/kaldi_active_grammar/ffi.py
+index 936ed35..1eb2f3d 100644
+--- a/kaldi_active_grammar/ffi.py
++++ b/kaldi_active_grammar/ffi.py
+@@ -15,7 +15,7 @@ from cffi import FFI
+ from .utils import exec_dir, platform
+ 
+ _ffi = FFI()
+-_library_binary_path = os.path.join(exec_dir, dict(windows='kaldi-dragonfly.dll', linux='libkaldi-dragonfly.so', macos='libkaldi-dragonfly.dylib')[platform])
++_library_binary_path = os.path.join('@kaldiFork@', dict(windows='kaldi-dragonfly.dll', linux='libkaldi-dragonfly.so', macos='libkaldi-dragonfly.dylib')[platform])
+ _c_source_ignore_regex = re.compile(r'(\b(extern|DRAGONFLY_API)\b)|("C")|(//.*$)', re.MULTILINE)  # Pattern for extraneous stuff to be removed
+ 
+ def encode(text):
diff --git a/nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/0004-fork-cmake.patch b/nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/0004-fork-cmake.patch
new file mode 100644
index 000000000000..b5ae7bc607f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/0004-fork-cmake.patch
@@ -0,0 +1,20 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index ededc78b8..7ee1879a5 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -188,6 +188,7 @@ add_subdirectory(src/ivector)
+ add_subdirectory(src/online)

+ add_subdirectory(src/online2)

+ add_subdirectory(src/kws)

++add_subdirectory(src/dragonfly)

+ 

+ add_subdirectory(src/itf)

+ 

+@@ -219,6 +220,7 @@ add_subdirectory(src/ivectorbin)
+ add_subdirectory(src/onlinebin)

+ add_subdirectory(src/online2bin)

+ add_subdirectory(src/kwsbin)

++add_subdirectory(src/dragonflybin)

+ 

+ # add all cuda executables

+ if(CUDA_FOUND)

diff --git a/nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/0006-fork-configure.patch b/nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/0006-fork-configure.patch
new file mode 100644
index 000000000000..8467b83f00c7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/0006-fork-configure.patch
@@ -0,0 +1,26 @@
+diff --git a/src/configure b/src/configure
+index 1186c6d12..4ad355e64 100755
+--- a/src/configure
++++ b/src/configure
+@@ -1045,9 +1045,6 @@ echo "AS = $AS" >> kaldi.mk
+ echo "RANLIB = $RANLIB" >> kaldi.mk
+ echo >> kaldi.mk
+ 
+-echo "Checking compiler $CXX ..."
+-check_compiler $CXX
+-
+ echo "# Base configuration" >> kaldi.mk
+ echo >> kaldi.mk
+ if $dynamic_kaldi ; then
+@@ -1066,11 +1063,6 @@ if [ ! -f $FSTROOT/include/fst/fst.h  ]; then
+   failure "Could not find file $FSTROOT/include/fst/fst.h:
+   you may not have installed OpenFst. See ../tools/INSTALL"
+ fi
+-OPENFST_VER=${OPENFST_VER:-$(grep 'PACKAGE_VERSION' $FSTROOT/Makefile | sed -e 's:.*= ::')}
+-OPENFST_VER_NUM=$(echo $OPENFST_VER | sed 's/\./ /g' | xargs printf "%d%02d%02d")
+-if [ $OPENFST_VER_NUM -lt 10600 ]; then
+-  failure "OpenFst-$OPENFST_VER is not supported. You need OpenFst >= 1.6.0.)"
+-fi
+ echo "OPENFSTINC = $FSTROOT/include" >> kaldi.mk
+ if $static_fst ; then
+   OPENFSTLIBS="$FSTROOT/lib/libfst.a"
diff --git a/nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/default.nix b/nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/default.nix
new file mode 100644
index 000000000000..a1ef7e314656
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, scikit-build
+, cmake
+, ush
+, requests
+, six
+, numpy
+, cffi
+, openfst
+, substituteAll
+, callPackage
+}:
+
+#
+# Maintainer note: only in-tree dependant is `dragonfly`, try to
+# update the two alongside eachother.
+#
+
+let
+  kaldi = callPackage ./fork.nix { };
+in
+buildPythonPackage rec {
+  pname = "kaldi-active-grammar";
+  version = "3.1.0";
+
+  src = fetchFromGitHub {
+    owner = "daanzu";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0lilk6yjzcy31avy2z36bl9lr60gzwhmyqwqn8akq11qc3mbffsk";
+  };
+
+  KALDI_BRANCH = "foo";
+  KALDIAG_SETUP_RAW = "1";
+
+  patches = [
+    # Makes sure scikit-build doesn't try to build the dependencies for us
+    ./0001-stub.patch
+    # Uses the dependencies' binaries from $PATH instead of a specific directory
+    ./0002-exec-path.patch
+    # Makes it dynamically link to the correct Kaldi library
+    (substituteAll {
+      src = ./0003-ffi-path.patch;
+      kaldiFork = "${kaldi}/lib";
+    })
+  ];
+
+  # scikit-build puts us in the wrong folder. That is bad.
+  preBuild = ''
+    cd ..
+  '';
+
+  buildInputs = [ openfst kaldi ];
+  nativeBuildInputs = [ scikit-build cmake ];
+  propagatedBuildInputs = [ ush requests numpy cffi six ];
+
+  doCheck = false;  # no tests exist
+
+  meta = with lib; {
+    description = "Python Kaldi speech recognition";
+    homepage = "https://github.com/daanzu/kaldi-active-grammar";
+    license = licenses.agpl3Plus;
+    maintainers = with maintainers; [ ckie ];
+    # Other platforms are supported upstream.
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/fork.nix b/nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/fork.nix
new file mode 100644
index 000000000000..7748e34df6f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kaldi-active-grammar/fork.nix
@@ -0,0 +1,111 @@
+{ lib
+, stdenv
+, blas
+, lapack
+, openfst
+, icu
+, pkg-config
+, fetchFromGitHub
+, python3
+, openblas
+, zlib
+, gfortran
+}:
+
+let
+  old-openfst = openfst.overrideAttrs (prev: {
+    version = "kag-unstable-2022-05-06";
+
+    src = fetchFromGitHub {
+      owner = "kkm000";
+      repo = "openfst";
+      # required by https://github.com/daanzu/kaldi-fork-active-grammar/blob/e9c7d0ffca401cf312779d25f2c05a34b41ff696/cmake/third_party/openfst.cmake#L7
+      rev = "0bca6e76d24647427356dc242b0adbf3b5f1a8d9";
+      sha256 = "1802rr14a03zl1wa5a0x1fa412kcvbgprgkadfj5s6s3agnn11rx";
+    };
+    buildInputs = [ zlib ];
+  });
+in
+
+assert blas.implementation == "openblas" && lapack.implementation == "openblas";
+
+stdenv.mkDerivation rec {
+  pname = "kaldi";
+  version = "kag-v2.1.0";
+
+  src = fetchFromGitHub {
+    owner = "daanzu";
+    repo = "kaldi-fork-active-grammar";
+    rev = version;
+    sha256 = "+kT2xJRwDj/ECv/v/J1FpsINWOK8XkP9ZvZ9moFRl70=";
+  };
+
+  patches = [
+    ./0004-fork-cmake.patch
+    ./0006-fork-configure.patch
+  ];
+
+  enableParallelBuilding = true;
+
+  buildInputs = [
+    openblas
+    old-openfst
+    icu
+  ];
+
+  nativeBuildInputs = [
+    pkg-config
+    python3
+    gfortran
+  ];
+
+  buildFlags = [
+    "dragonfly"
+    "dragonflybin"
+    "bin"
+    "fstbin"
+    "lmbin"
+  ];
+
+  postPatch = ''
+    # Replace the shebangs for the various build scripts
+    patchShebangs src
+    # Compatability with OpenBLAS 0.3.21
+    substituteInPlace src/matrix/cblas-wrappers.h \
+      --replace stptri_ LAPACK_stptri \
+      --replace dtptri_ LAPACK_dtptri \
+      --replace sgetrf_ LAPACK_sgetrf \
+      --replace dgetrf_ LAPACK_dgetrf \
+      --replace sgetri_ LAPACK_sgetri \
+      --replace dgetri_ LAPACK_dgetri \
+      --replace sgesvd_ LAPACK_sgesvd \
+      --replace dgesvd_ LAPACK_dgesvd \
+      --replace ssptri_ LAPACK_ssptri \
+      --replace dsptri_ LAPACK_dsptri \
+      --replace ssptrf_ LAPACK_ssptrf \
+      --replace dsptrf_ LAPACK_dsptrf
+  '';
+
+  configurePhase = ''
+    cd src
+    ./configure --shared --fst-root="${old-openfst}" --use-cuda=no --openblas-root="${openblas}" --mathlib=OPENBLAS
+  '';
+
+  installPhase = ''
+    # Fixes "patchelf: wrong ELF type"
+    find . -type f -name "*.o" -print0 | xargs -0 rm -f
+    mkdir -p $out/{bin,lib}
+    cp lib/* $out/lib/
+    patchelf \
+      --set-rpath "${lib.makeLibraryPath buildInputs}:$out/lib" \
+      $out/lib/*
+  '';
+
+  meta = with lib; {
+    description = "Speech Recognition Toolkit";
+    homepage = "https://kaldi-asr.org";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ckie ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kanidm/default.nix b/nixpkgs/pkgs/development/python-modules/kanidm/default.nix
new file mode 100644
index 000000000000..eb60f61d5f3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kanidm/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pythonOlder
+
+# build
+, poetry-core
+
+# propagates
+, aiohttp
+, pydantic
+, toml
+
+# tests
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+}:
+
+let
+  pname = "kanidm";
+  version = "0.0.3";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sTkAKxtJa7CVYKuXC//eMmf3l8ABsrEr2mdf1r2Gf9A=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pydantic
+    toml
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "-m 'not network'"
+  ];
+
+  pythonImportsCheck = [
+    "kanidm"
+  ];
+
+  meta = with lib; {
+    description = "Kanidm client library";
+    homepage = "https://github.com/kanidm/kanidm/tree/master/pykanidm";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ arianvp hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kaptan/default.nix b/nixpkgs/pkgs/development/python-modules/kaptan/default.nix
new file mode 100644
index 000000000000..c86e2a2d6f3a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kaptan/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyyaml
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "kaptan";
+  version = "0.6.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-EBMwpE/e3oiFhvMBC9FFwOxIpIBrxWQp+lSHpndAIfg=";
+  };
+
+  postPatch = ''
+    sed -i "s/==.*//g" requirements/test.txt
+
+    substituteInPlace requirements/base.txt --replace 'PyYAML>=3.13,<6' 'PyYAML>=3.13'
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Configuration manager for python applications";
+    homepage = "https://kaptan.readthedocs.io/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/karton-asciimagic/default.nix b/nixpkgs/pkgs/development/python-modules/karton-asciimagic/default.nix
new file mode 100644
index 000000000000..fee502989ba0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/karton-asciimagic/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, karton-core
+, unittestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "karton-asciimagic";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CERT-Polska";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-sY5ik9efzLBa6Fbh17Vh4q7PlwOGYjuodU9yvp/8E3k=";
+  };
+
+  propagatedBuildInputs = [
+    karton-core
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "karton.asciimagic"
+  ];
+
+  meta = with lib; {
+    description = "Decoders for ascii-encoded executables for the Karton framework";
+    homepage = "https://github.com/CERT-Polska/karton-asciimagic";
+    changelog = "https://github.com/CERT-Polska/karton-asciimagic/releases/tag/v${version}";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/karton-autoit-ripper/default.nix b/nixpkgs/pkgs/development/python-modules/karton-autoit-ripper/default.nix
new file mode 100644
index 000000000000..7bdac115385f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/karton-autoit-ripper/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, autoit-ripper
+, buildPythonPackage
+, fetchFromGitHub
+, karton-core
+, malduck
+, pythonOlder
+, regex
+}:
+
+buildPythonPackage rec {
+  pname = "karton-autoit-ripper";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CERT-Polska";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-D+M3JsIN8LUWg8GVweEzySHI7KaBb6cNHHn4pXoq55M=";
+  };
+
+  propagatedBuildInputs = [
+    autoit-ripper
+    karton-core
+    malduck
+    regex
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "autoit-ripper==" "autoit-ripper>=" \
+      --replace "malduck==" "malduck>=" \
+      --replace "regex==" "regex>="
+  '';
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "karton.autoit_ripper"
+  ];
+
+  meta = with lib; {
+    description = "AutoIt script ripper for Karton framework";
+    homepage = "https://github.com/CERT-Polska/karton-autoit-ripper";
+    changelog = "https://github.com/CERT-Polska/karton-autoit-ripper/releases/tag/v${version}";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/karton-classifier/default.nix b/nixpkgs/pkgs/development/python-modules/karton-classifier/default.nix
new file mode 100644
index 000000000000..9f19e1ab6b9e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/karton-classifier/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, chardet
+, fetchFromGitHub
+, karton-core
+, pytestCheckHook
+, python-magic
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "karton-classifier";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CERT-Polska";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-DH8I4Lbbs2TVMvYlvh/P2I/7O4+VechP2JDDVHNsTSg=";
+  };
+
+  propagatedBuildInputs = [
+    chardet
+    karton-core
+    python-magic
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "chardet==3.0.4" "chardet" \
+      --replace "python-magic==0.4.18" "python-magic"
+  '';
+
+  pythonImportsCheck = [
+    "karton.classifier"
+  ];
+
+  disabledTests = [
+    # Tests expecting results from a different version of libmagic
+    "test_process_archive_ace"
+    "test_process_runnable_win32_lnk"
+    "test_process_misc_csv"
+  ];
+
+  meta = with lib; {
+    description = "File type classifier for the Karton framework";
+    homepage = "https://github.com/CERT-Polska/karton-classifier";
+    changelog = "https://github.com/CERT-Polska/karton-classifier/releases/tag/v${version}";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/karton-config-extractor/default.nix b/nixpkgs/pkgs/development/python-modules/karton-config-extractor/default.nix
new file mode 100644
index 000000000000..8d8b51bc842f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/karton-config-extractor/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, karton-core
+, malduck
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "karton-config-extractor";
+  version = "2.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CERT-Polska";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-X2g/wgWLIY2ZIwH1l83EApyoeYQU5/MWq5S0qmYz+CA=";
+  };
+
+  propagatedBuildInputs = [
+    karton-core
+    malduck
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "malduck==4.1.0" "malduck"
+  '';
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "karton.config_extractor"
+  ];
+
+  meta = with lib; {
+    description = "Static configuration extractor for the Karton framework";
+    homepage = "https://github.com/CERT-Polska/karton-config-extractor";
+    changelog = "https://github.com/CERT-Polska/karton-config-extractor/releases/tag/v${version}";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/karton-core/default.nix b/nixpkgs/pkgs/development/python-modules/karton-core/default.nix
new file mode 100644
index 000000000000..1af9386b5b6a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/karton-core/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, boto3
+, buildPythonPackage
+, fetchFromGitHub
+, orjson
+, unittestCheckHook
+, pythonOlder
+, redis
+}:
+
+buildPythonPackage rec {
+  pname = "karton-core";
+  version = "5.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CERT-Polska";
+    repo = "karton";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-sf8O4Y/yMoTFCibQRtNDX3pXdQ0Xzor3WqeU4xp3WuU=";
+  };
+
+  propagatedBuildInputs = [
+    boto3
+    orjson
+    redis
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "karton.core"
+  ];
+
+  meta = with lib; {
+    description = "Distributed malware processing framework";
+    homepage = "https://karton-core.readthedocs.io/";
+    changelog = "https://github.com/CERT-Polska/karton/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ chivay fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/karton-dashboard/default.nix b/nixpkgs/pkgs/development/python-modules/karton-dashboard/default.nix
new file mode 100644
index 000000000000..60e21e63b116
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/karton-dashboard/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, karton-core
+, mistune
+, networkx
+, prometheus-client
+, pythonOlder
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "karton-dashboard";
+  version = "1.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CERT-Polska";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-O7Wrl9+RWkHPO0+9aue1Nlv0263qX8Thnh5FmnoKjxU=";
+  };
+
+  pythonRelaxDeps = [
+    "Flask"
+    "mistune"
+    "networkx"
+    "prometheus-client"
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    flask
+    karton-core
+    mistune
+    networkx
+    prometheus-client
+  ];
+
+  # Project has no tests. pythonImportsCheck requires MinIO configuration
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Web application that allows for Karton task and queue introspection";
+    homepage = "https://github.com/CERT-Polska/karton-dashboard";
+    changelog = "https://github.com/CERT-Polska/karton-dashboard/releases/tag/v${version}";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/karton-mwdb-reporter/default.nix b/nixpkgs/pkgs/development/python-modules/karton-mwdb-reporter/default.nix
new file mode 100644
index 000000000000..090b19f02ce7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/karton-mwdb-reporter/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, karton-core
+, mwdblib
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "karton-mwdb-reporter";
+  version = "1.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CERT-Polska";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-KJh9uJzVGYEEk1ed56ynKA/+dK9ouDB7L06xERjfjdc=";
+  };
+
+  propagatedBuildInputs = [
+    karton-core
+    mwdblib
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "karton.mwdb_reporter"
+  ];
+
+  meta = with lib; {
+    description = "Karton service that uploads analyzed artifacts and metadata to MWDB Core";
+    homepage = "https://github.com/CERT-Polska/karton-mwdb-reporter";
+    changelog = "https://github.com/CERT-Polska/karton-mwdb-reporter/releases/tag/v${version}";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/karton-yaramatcher/default.nix b/nixpkgs/pkgs/development/python-modules/karton-yaramatcher/default.nix
new file mode 100644
index 000000000000..2c6dc57d9966
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/karton-yaramatcher/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, karton-core
+, unittestCheckHook
+, pythonOlder
+, yara-python
+}:
+
+buildPythonPackage rec {
+  pname = "karton-yaramatcher";
+  version = "1.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CERT-Polska";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-URGW8FyJZ3ktrwolls5ElSWn8FD6vWCA+Eu0aGtPh6U=";
+  };
+
+  propagatedBuildInputs = [
+    karton-core
+    yara-python
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "karton.yaramatcher"
+  ];
+
+  meta = with lib; {
+    description = "File and analysis artifacts yara matcher for the Karton framework";
+    homepage = "https://github.com/CERT-Polska/karton-yaramatcher";
+    changelog = "https://github.com/CERT-Polska/karton-yaramatcher/releases/tag/v${version}";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kasa-crypt/default.nix b/nixpkgs/pkgs/development/python-modules/kasa-crypt/default.nix
new file mode 100644
index 000000000000..c02c0043eacc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kasa-crypt/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, poetry-core
+, pytestCheckHook
+, setuptools
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "kasa-crypt";
+  version = "0.4.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = "kasa-crypt";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-wjZnro5sIRt8+vQYxA62sGnPi7Ittp3oSqph7aBBEg0=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=kasa_crypt --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeBuildInputs = [
+    cython
+    poetry-core
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "kasa_crypt"
+  ];
+
+  meta = with lib; {
+    description = "Fast kasa crypt";
+    homepage = "https://github.com/bdraco/kasa-crypt";
+    changelog = "https://github.com/bdraco/kasa-crypt/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kazoo/default.nix b/nixpkgs/pkgs/development/python-modules/kazoo/default.nix
new file mode 100644
index 000000000000..4799e1503e60
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kazoo/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, eventlet
+, gevent
+, nose
+, mock
+, coverage
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "kazoo";
+  version = "2.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gAMYx/PatkjN9hbfslvavu+rKmg3qmlR4Po/+A5laWk=";
+  };
+
+  propagatedBuildInputs = [ six ];
+  buildInputs = [ eventlet gevent nose mock coverage pkgs.openjdk8 ];
+
+  # not really needed
+  preBuild = ''
+    sed -i '/flake8/d' setup.py
+  '';
+
+  preCheck = ''
+    sed -i 's/test_unicode_auth/noop/' kazoo/tests/test_client.py
+  '';
+
+  # tests take a long time to run and leave threads hanging
+  doCheck = false;
+  #ZOOKEEPER_PATH = "${pkgs.zookeeper}";
+
+  meta = with lib; {
+    homepage = "https://kazoo.readthedocs.org";
+    description = "Higher Level Zookeeper Client";
+    license = licenses.asl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kbcstorage/default.nix b/nixpkgs/pkgs/development/python-modules/kbcstorage/default.nix
new file mode 100644
index 000000000000..04d5b17c55e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kbcstorage/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build
+, setuptools
+, setuptools-git-versioning
+, setuptools-scm
+
+# propagates
+, azure-storage-blob
+, boto3
+, requests
+
+# tests
+, responses
+, unittestCheckHook
+}:
+buildPythonPackage rec {
+  pname = "sapi-python-client";
+  version = "0.7.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "keboola";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-74sChw6eMkBtfHV6hiaaLNOr/J0Sa73LB93Z8muLaiI=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-git-versioning
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    azure-storage-blob
+    boto3
+    requests
+  ];
+
+  # Requires API token and an active Keboola bucket
+  # ValueError: Root URL is required.
+  doCheck = false;
+
+  nativeCheckInputs = [
+    unittestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "kbcstorage"
+    "kbcstorage.buckets"
+    "kbcstorage.client"
+    "kbcstorage.tables"
+  ];
+
+  meta = with lib; {
+    description = "Keboola Connection Storage API client";
+    homepage = "https://github.com/keboola/sapi-python-client";
+    changelog = "https://github.com/keboola/sapi-python-client/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mrmebelman ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kconfiglib/default.nix b/nixpkgs/pkgs/development/python-modules/kconfiglib/default.nix
new file mode 100644
index 000000000000..ba8fecc470b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kconfiglib/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "kconfiglib";
+  version = "14.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0g690bk789hsry34y4ahvly5c8w8imca90ss4njfqf7m2qicrlmy";
+  };
+
+  # doesnt work out of the box but might be possible
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A flexible Python 2/3 Kconfig implementation and library";
+    homepage = "https://github.com/ulfalizer/Kconfiglib";
+    license = licenses.isc;
+    maintainers = with maintainers; [ teto ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/keba-kecontact/default.nix b/nixpkgs/pkgs/development/python-modules/keba-kecontact/default.nix
new file mode 100644
index 000000000000..33ece1b408cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keba-kecontact/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, asyncio-dgram
+, buildPythonPackage
+, fetchFromGitHub
+, netifaces
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "keba-kecontact";
+  version = "3.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dannerph";
+    repo = "keba-kecontact";
+    rev = "refs/tags/${version}";
+    hash = "sha256-gR1ut2IjrU/JMy8/ZFv0jQTB6c3A/tZqtXMpQsapuj0=";
+  };
+
+  propagatedBuildInputs = [
+    asyncio-dgram
+    netifaces
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "keba_kecontact"
+  ];
+
+  meta = with lib; {
+    description = "Python library for controlling KEBA charging stations";
+    homepage = "https://github.com/dannerph/keba-kecontact";
+    changelog = "https://github.com/dannerph/keba-kecontact/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/keep/default.nix b/nixpkgs/pkgs/development/python-modules/keep/default.nix
new file mode 100644
index 000000000000..176924b5fd1b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keep/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pygithub
+, terminaltables
+, click
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "keep";
+  version = "2.10.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3abbe445347711cecd9cbb80dab4a0777418972fc14a14e9387d0d2ae4b6adb7";
+  };
+
+  propagatedBuildInputs = [
+    click
+    requests
+    terminaltables
+    pygithub
+  ];
+
+  # no tests
+  doCheck = false;
+  pythonImportsCheck = [ "keep" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/orkohunter/keep";
+    description = "A Meta CLI toolkit: Personal shell command keeper and snippets manager";
+    platforms = platforms.all;
+    license = licenses.mit;
+    maintainers = with maintainers; [ ris ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/keepalive/default.nix b/nixpkgs/pkgs/development/python-modules/keepalive/default.nix
new file mode 100644
index 000000000000..94a9b413c4fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keepalive/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "keepalive";
+  version = "0.5";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-PGuW+QYqWnYCLwydQenvVVLYCxyt1PzMG/jxg7odHsE=";
+  };
+
+  patches = [
+    # https://github.com/wikier/keepalive/pull/11
+    (fetchpatch {
+      name = "remove-use_2to3.patch";
+      url = "https://github.com/wikier/keepalive/commit/64393f6c5bf9c69d946b584fd664dd4df72604e6.patch";
+      hash = "sha256-/G1eEt8a4Qz7x5oQnDZZD/PIQwo9+oPZoy9OrXGHvR4=";
+      excludes = ["README.md"];
+    })
+  ];
+
+  # No tests included
+  doCheck = false;
+
+  meta = with lib; {
+    description = "An HTTP handler for `urllib` that supports HTTP 1.1 and keepalive";
+    homepage = "https://github.com/wikier/keepalive";
+    license = licenses.lgpl21Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/keepkey/default.nix b/nixpkgs/pkgs/development/python-modules/keepkey/default.nix
new file mode 100644
index 000000000000..ca4f3c863e67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keepkey/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, ecdsa
+, hidapi
+, libusb1
+, mnemonic
+, protobuf
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "keepkey";
+  version = "7.2.1";
+
+  src = fetchFromGitHub {
+    owner = "keepkey";
+    repo = "python-keepkey";
+    rev = "v${version}";
+    sha256 = "00hqppdj3s9y25x4ad59y8axq94dd4chhw9zixq32sdrd9v8z55a";
+  };
+
+  propagatedBuildInputs = [ ecdsa hidapi libusb1 mnemonic protobuf ];
+
+  nativeCheckInputs = [ pytest ];
+
+  # tests requires hardware
+  doCheck = false;
+
+  # Remove impossible dependency constraint
+  postPatch = "sed -i -e 's|hidapi==|hidapi>=|' setup.py";
+
+  meta = with lib; {
+    description = "KeepKey Python client";
+    homepage = "https://github.com/keepkey/python-keepkey";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ np ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/keepkey_agent/default.nix b/nixpkgs/pkgs/development/python-modules/keepkey_agent/default.nix
new file mode 100644
index 000000000000..fc00b23ce509
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keepkey_agent/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, keepkey
+, setuptools
+, libagent
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "keepkey_agent";
+  version = "0.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "03779gvlx70i0nnry98i4pl1d92604ix5x6jgdfkrdgzqbh5vj27";
+  };
+
+  propagatedBuildInputs = [
+    keepkey libagent setuptools wheel
+  ];
+
+  doCheck = false;
+  pythonImportsCheck = [ "keepkey_agent" ];
+
+  meta = with lib; {
+    description = "Using KeepKey as hardware-based SSH/PGP agent";
+    homepage = "https://github.com/romanz/trezor-agent";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ hkjn np mmahut ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kegtron-ble/default.nix b/nixpkgs/pkgs/development/python-modules/kegtron-ble/default.nix
new file mode 100644
index 000000000000..e5ddcf01be1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kegtron-ble/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, bluetooth-data-tools
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "kegtron-ble";
+  version = "0.4.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-O5I5shW8nL2RAQptS2Bp/GI/4L6o0xXXmwYvRq0MM8o=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-data-tools
+    bluetooth-sensor-state-data
+    sensor-state-data
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=kegtron_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "kegtron_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for Kegtron BLE devices";
+    homepage = "https://github.com/Bluetooth-Devices/kegtron-ble";
+    changelog = "https://github.com/Bluetooth-Devices/kegtron-ble/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/keras-applications/default.nix b/nixpkgs/pkgs/development/python-modules/keras-applications/default.nix
new file mode 100644
index 000000000000..82ee6803d4bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keras-applications/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, numpy, h5py }:
+
+buildPythonPackage rec {
+  pname = "Keras_Applications";
+  version = "1.0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5579f9a12bcde9748f4a12233925a59b93b73ae6947409ff34aa2ba258189fe5";
+  };
+
+  # Cyclic dependency: keras-applications requires keras, which requires keras-applications
+  postPatch = ''
+    sed -i "s/keras>=[^']*//" setup.py
+  '';
+
+  # No tests in PyPI tarball
+  doCheck = false;
+
+  propagatedBuildInputs = [ numpy h5py ];
+
+  meta = with lib; {
+    description = "Reference implementations of popular deep learning models";
+    homepage = "https://github.com/keras-team/keras-applications";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/keras-preprocessing/default.nix b/nixpkgs/pkgs/development/python-modules/keras-preprocessing/default.nix
new file mode 100644
index 000000000000..49bc63a5db08
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keras-preprocessing/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchPypi, numpy, six, scipy, pillow, pytest, keras }:
+
+buildPythonPackage rec {
+  pname = "Keras_Preprocessing";
+  version = "1.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "add82567c50c8bc648c14195bf544a5ce7c1f76761536956c3d2978970179ef3";
+  };
+
+  propagatedBuildInputs = [
+    # required
+    numpy six
+    # optional
+    scipy pillow
+  ];
+
+  nativeCheckInputs = [
+    pytest keras
+  ];
+
+  checkPhase = ''
+    py.test tests/
+  '';
+
+  # Cyclic dependency: keras-preprocessing's tests require Keras, which requires keras-preprocessing
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Easy data preprocessing and data augmentation for deep learning models";
+    homepage = "https://github.com/keras-team/keras-preprocessing";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/keras/default.nix b/nixpkgs/pkgs/development/python-modules/keras/default.nix
new file mode 100644
index 000000000000..f5275ea1a2a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keras/default.nix
@@ -0,0 +1,39 @@
+{ lib, buildPythonPackage, fetchPypi
+, pytest, pytest-cov, pytest-xdist
+, six, numpy, scipy, pyyaml, h5py
+, keras-applications, keras-preprocessing
+}:
+
+buildPythonPackage rec {
+  pname = "keras";
+  version = "2.14.0";
+  format = "wheel";
+
+  src = fetchPypi {
+    inherit format pname version;
+    hash = "sha256-10KdHSExzH6x8uouwzAifH2dONqz398ueN7+5OzEP80=";
+    python = "py3";
+    dist = "py3";
+  };
+
+  nativeCheckInputs = [
+    pytest
+    pytest-cov
+    pytest-xdist
+  ];
+
+  propagatedBuildInputs = [
+    six pyyaml numpy scipy h5py
+    keras-applications keras-preprocessing
+  ];
+
+  # Couldn't get tests working
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Deep Learning library for Theano and TensorFlow";
+    homepage = "https://keras.io";
+    license = licenses.mit;
+    maintainers = with maintainers; [ NikolaMandic ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kerberos/default.nix b/nixpkgs/pkgs/development/python-modules/kerberos/default.nix
new file mode 100644
index 000000000000..a584e38810fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kerberos/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, libkrb5
+}:
+
+buildPythonPackage rec {
+  pname = "kerberos";
+  version = "1.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cdd046142a4e0060f96a00eb13d82a5d9ebc0f2d7934393ed559bac773460a2c";
+  };
+
+  nativeBuildInputs = [ libkrb5 ];
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Kerberos high-level interface";
+    homepage = "https://pypi.org/project/kerberos/";
+    license = licenses.asl20;
+    knownVulnerabilities = [
+      "CVE-2015-3206"
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/keyboard/default.nix b/nixpkgs/pkgs/development/python-modules/keyboard/default.nix
new file mode 100644
index 000000000000..c54f8f5fcd7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keyboard/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub }:
+
+buildPythonPackage rec {
+  pname = "keyboard";
+  version = "0.13.5";
+
+  src = fetchFromGitHub {
+    owner = "boppreh";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-U4GWhPp28azBE3Jn9xpLxudOKx0PjnYO77EM2HsJ9lM=";
+  };
+
+  pythonImportsCheck = [ "keyboard" ];
+
+  # Specific OS tests are being run for other OS, like
+  # winmouse on Linux, which provides the following error:
+  # AttributeError: module 'ctypes' has no attribute 'WinDLL'
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Hook and simulate keyboard events on Windows and Linux";
+    homepage = "https://github.com/boppreh/keyboard";
+    license = licenses.mit;
+    maintainers = with maintainers; [ wolfangaukang ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/keyring/default.nix b/nixpkgs/pkgs/development/python-modules/keyring/default.nix
new file mode 100644
index 000000000000..28df79fb9998
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keyring/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, installShellFiles
+, setuptools-scm
+, shtab
+, importlib-metadata
+, dbus-python
+, jaraco-classes
+, jeepney
+, secretstorage
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "keyring";
+  version = "24.3.0";
+  pyproject = true;
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5zDs/9MJZYoI7oJTWjtexLTIZpqb4R77ZiSdjgrrmiU=";
+  };
+
+  nativeBuildInputs = [
+    installShellFiles
+    setuptools-scm
+    shtab
+  ];
+
+  propagatedBuildInputs = [
+    jaraco-classes
+  ] ++ lib.optionals stdenv.isLinux [
+    jeepney
+    secretstorage
+  ] ++ lib.optionals (pythonOlder "3.12") [
+    importlib-metadata
+  ];
+
+  postInstall = ''
+    installShellCompletion --cmd keyring \
+      --bash <($out/bin/keyring --print-completion bash) \
+      --zsh <($out/bin/keyring --print-completion zsh)
+  '';
+
+  pythonImportsCheck = [
+    "keyring"
+    "keyring.backend"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    "tests/backends/test_macOS.py"
+  ]
+  # These tests fail when sandboxing is enabled because they are unable to get a password from keychain.
+  ++ lib.optional stdenv.isDarwin "tests/test_multiprocess.py";
+
+  meta = with lib; {
+    description = "Store and access your passwords safely";
+    homepage    = "https://github.com/jaraco/keyring";
+    changelog   = "https://github.com/jaraco/keyring/blob/v${version}/NEWS.rst";
+    license     = licenses.mit;
+    mainProgram = "keyring";
+    maintainers = with maintainers; [ lovek323 dotlambda ];
+    platforms   = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/keyrings-alt/default.nix b/nixpkgs/pkgs/development/python-modules/keyrings-alt/default.nix
new file mode 100644
index 000000000000..f463b18950dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keyrings-alt/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jaraco-classes
+, keyring
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "keyrings-alt";
+  version = "5.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "keyrings.alt";
+    inherit version;
+    hash = "sha256-nURstHu86pD/ouzD6AA6z0FXP8IBv0S0vxO9DhFISCg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    jaraco-classes
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    keyring
+  ];
+
+  pythonImportsCheck = [
+    "keyrings.alt"
+  ];
+
+  meta = with lib; {
+    description = "Alternate keyring implementations";
+    homepage = "https://github.com/jaraco/keyrings.alt";
+    changelog = "https://github.com/jaraco/keyrings.alt/blob/v${version}/NEWS.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nyarly ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/keyrings-cryptfile/default.nix b/nixpkgs/pkgs/development/python-modules/keyrings-cryptfile/default.nix
new file mode 100644
index 000000000000..f15e65a32b57
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keyrings-cryptfile/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, argon2-cffi
+, buildPythonPackage
+, fetchPypi
+, keyring
+, pycryptodome
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "keyrings-cryptfile";
+  version = "1.3.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    pname = "keyrings.cryptfile";
+    inherit version;
+    hash = "sha256-fCpFPKuZhUJrjCH3rVSlfkn/joGboY4INAvYgBrPAJE=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "-s --cov=keyrings/cryptfile" ""
+  '';
+
+  propagatedBuildInputs = [
+    argon2-cffi
+    keyring
+    pycryptodome
+  ];
+
+  pythonImportsCheck = [
+    "keyrings.cryptfile"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # FileNotFoundError: [Errno 2] No such file or directory: '/build/...
+    "test_versions"
+  ];
+
+  meta = with lib; {
+    description = "Encrypted file keyring backend";
+    homepage = "https://github.com/frispete/keyrings.cryptfile";
+    changelog = "https://github.com/frispete/keyrings.cryptfile/blob/v${version}/CHANGES.md";
+    license = licenses.mit;
+    maintainers = [ maintainers.lourkeur ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/keyrings-google-artifactregistry-auth/default.nix b/nixpkgs/pkgs/development/python-modules/keyrings-google-artifactregistry-auth/default.nix
new file mode 100644
index 000000000000..b9204cbdabe7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keyrings-google-artifactregistry-auth/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-auth
+, keyring
+, pluggy
+, pythonOlder
+, requests
+, setuptools-scm
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "keyrings.google-artifactregistry-auth";
+  version = "1.1.2";
+
+  disabled = pythonOlder "3.6";
+
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vWq7cnQNLf60pcA8OxBcb326FpyqKd7jlZaU8fAsd94=";
+  };
+
+  buildInputs = [
+    setuptools-scm
+    toml
+  ];
+
+  propagatedBuildInputs = [
+    google-auth
+    keyring
+    pluggy
+    requests
+  ];
+
+  pythonImportsCheck = [
+    "keyrings.gauth"
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    changelog = "https://github.com/GoogleCloudPlatform/artifact-registry-python-tools/blob/main/HISTORY.md";
+    description = "Python package which allows you to configure keyring to interact with Python repositories stored in Artifact Registry";
+    homepage = "https://pypi.org/project/keyrings.google-artifactregistry-auth";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ lovesegfault ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/keyrings-passwordstore/default.nix b/nixpkgs/pkgs/development/python-modules/keyrings-passwordstore/default.nix
new file mode 100644
index 000000000000..db8d934c9300
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keyrings-passwordstore/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+, keyring
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "keyrings.passwordstore";
+  version = "0.1.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-pylZw45FUtLHzUV4cDyl/nT8tCZwNj4Jf41MMlyskoU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    keyring
+  ];
+
+  pythonImportsCheck = [
+    "keyrings.passwordstore.backend"
+  ];
+
+  meta = {
+    license = lib.licenses.mit;
+    description = "Keyring backend for password-store";
+    homepage = "https://github.com/stv0g/keyrings.passwordstore";
+    maintainers = [ lib.maintainers.shlevy ];
+    broken = true; # https://github.com/stv0g/keyrings.passwordstore/issues/2
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/keystone-engine/default.nix b/nixpkgs/pkgs/development/python-modules/keystone-engine/default.nix
new file mode 100644
index 000000000000..7c3cf2e70d83
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keystone-engine/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, keystone }:
+
+buildPythonPackage rec {
+  pname = "keystone-engine";
+  version = "0.9.2";
+
+  src = fetchPypi {
+   inherit pname version;
+   sha256 = "1xahdr6bh3dw5swrc2r8kqa8ljhqlb7k2kxv5mrw5rhcmcnzcyig";
+  };
+
+  setupPyBuildFlags = lib.optionals stdenv.isLinux [ "--plat-name" "linux" ];
+
+  preConfigure = ''
+    substituteInPlace setup.py --replace \
+      "libkeystone" "${keystone}/lib/libkeystone"
+  '';
+
+  # No tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "keystone" ];
+
+  meta = with lib; {
+    description = "Lightweight multi-platform, multi-architecture assembler framework";
+    homepage = "https://www.keystone-engine.org";
+    maintainers = with maintainers; [ dump_stack ];
+    license = licenses.gpl2Only;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/keystoneauth1/default.nix b/nixpkgs/pkgs/development/python-modules/keystoneauth1/default.nix
new file mode 100644
index 000000000000..134f5af0632f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keystoneauth1/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, betamax
+, hacking
+, iso8601
+, lxml
+, oauthlib
+, os-service-types
+, oslo-config
+, oslo-utils
+, pbr
+, pycodestyle
+, pyyaml
+, requests
+, requests-kerberos
+, requests-mock
+, six
+, stestr
+, stevedore
+, testresources
+, testtools
+}:
+
+buildPythonPackage rec {
+  pname = "keystoneauth1";
+  version = "5.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-AXwrm1mUU8kpQHUO27IPF2hxIbKJARS/nTbfFKBicRc=";
+  };
+
+  postPatch = ''
+    # only a small portion of the listed packages are actually needed for running the tests
+    # so instead of removing them one by one remove everything
+    rm test-requirements.txt
+  '';
+
+  propagatedBuildInputs = [
+    betamax
+    iso8601
+    lxml
+    oauthlib
+    os-service-types
+    pbr
+    requests
+    requests-kerberos
+    six
+    stevedore
+  ];
+
+  nativeCheckInputs = [
+    hacking
+    oslo-config
+    oslo-utils
+    pycodestyle
+    pyyaml
+    requests-mock
+    stestr
+    testresources
+    testtools
+  ];
+
+  # test_keystoneauth_betamax_fixture is incompatible with urllib3 2.0.0
+  # https://bugs.launchpad.net/keystoneauth/+bug/2020112
+  checkPhase = ''
+    stestr run \
+      -E "keystoneauth1.tests.unit.test_betamax_fixture.TestBetamaxFixture.test_keystoneauth_betamax_fixture"
+  '';
+
+  pythonImportsCheck = [ "keystoneauth1" ];
+
+  meta = with lib; {
+    description = "Authentication Library for OpenStack Identity";
+    homepage = "https://github.com/openstack/keystoneauth";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/keyutils/default.nix b/nixpkgs/pkgs/development/python-modules/keyutils/default.nix
new file mode 100644
index 000000000000..c387c10ebc34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/keyutils/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchFromGitHub
+, keyutils
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "keyutils";
+  version = "0.6";
+
+  # github version comes bundled with tests
+  src = fetchFromGitHub {
+    owner = "sassoftware";
+    repo = "python-keyutils";
+    rev = version;
+    sha256 = "0pfqfr5xqgsqkxzrmj8xl2glyl4nbq0irs0k6ik7iy3gd3mxf5g1";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace '"pytest-runner"' ""
+  '';
+
+  preBuild = ''
+    cython keyutils/_keyutils.pyx
+  '';
+
+  preCheck = ''
+    rm -rf keyutils
+  '';
+
+  buildInputs = [ keyutils ];
+  nativeBuildInputs = [ cython ];
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = {
+    description = "A set of python bindings for keyutils";
+    homepage = "https://github.com/sassoftware/python-keyutils";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ primeos ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kinparse/default.nix b/nixpkgs/pkgs/development/python-modules/kinparse/default.nix
new file mode 100644
index 000000000000..95632f9ce9f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kinparse/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, future
+, pyparsing
+}:
+
+buildPythonPackage {
+  pname = "kinparse";
+  version = "unstable-2019-12-18";
+
+  src = fetchFromGitHub {
+    owner = "xesscorp";
+    repo = "kinparse";
+    rev = "eeb3f346d57a67a471bdf111f39bef8932644481";
+    sha256 = "1nrjnybwzy93c79yylcwmb4lvkx7hixavnjwffslz0zwn32l0kx3";
+  };
+
+  doCheck = true;
+  pythonImportsCheck = [ "kinparse" ];
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    future
+    pyparsing
+  ];
+
+  meta = with lib; {
+    description = "A Parser for KiCad EESCHEMA netlists";
+    homepage = "https://github.com/xesscorp/kinparse";
+    license = licenses.mit;
+    maintainers = with maintainers; [ matthuszagh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kiss-headers/default.nix b/nixpkgs/pkgs/development/python-modules/kiss-headers/default.nix
new file mode 100644
index 000000000000..5f2906cc8cca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kiss-headers/default.nix
@@ -0,0 +1,39 @@
+{ lib, buildPythonPackage, fetchFromGitHub, requests, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "kiss-headers";
+  version = "2.3.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Ousret";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-xPjw/uJTmvmQZDrI3i1KTUeAZuDF1mc13hvFBl8Erh0=";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=kiss_headers --doctest-modules --cov-report=term-missing -rxXs" "--doctest-modules -rxXs"
+  '';
+
+  disabledTestPaths = [
+    # Tests require internet access
+    "kiss_headers/__init__.py"
+    "tests/test_serializer.py"
+    "tests/test_with_http_request.py"
+  ];
+
+  pythonImportsCheck = [ "kiss_headers" ];
+
+  meta = with lib; {
+    description = "Python package for HTTP/1.1 style headers";
+    homepage = "https://github.com/Ousret/kiss-headers";
+    license = licenses.mit;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kitchen/default.nix b/nixpkgs/pkgs/development/python-modules/kitchen/default.nix
new file mode 100644
index 000000000000..e60650594855
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kitchen/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "kitchen";
+  version = "1.2.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uEz1gvG9FVa2DrxzcLnTMeuSR7awcM6J3+lZy6LAsDw=";
+  };
+
+  # Waiting for upstream's clean-up
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "kitchen"
+  ];
+
+  meta = with lib; {
+    description = "Kitchen contains a cornucopia of useful code";
+    homepage = "https://github.com/fedora-infra/kitchen";
+    changelog = "https://github.com/fedora-infra/kitchen/blob/${version}/NEWS.rst";
+    license = licenses.lgpl2Only;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kivy-garden/default.nix b/nixpkgs/pkgs/development/python-modules/kivy-garden/default.nix
new file mode 100644
index 000000000000..1475b4448230
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kivy-garden/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "kivy-garden";
+  version = "0.1.5";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "kivy-garden";
+    repo = "garden";
+    rev = "v${version}";
+    hash = "sha256-xOMBPFKV7mTa51Q0VKja7b0E509IaWjwlJVlSRVdct8=";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  pythonImportsCheck = [ "garden" ];
+
+  # There are no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "The kivy garden installation script, split into its own package for convenient use in buildozer.";
+    homepage = "https://github.com/kivy-garden/garden";
+    license = licenses.mit;
+    maintainers = with maintainers; [ risson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kivy/default.nix b/nixpkgs/pkgs/development/python-modules/kivy/default.nix
new file mode 100644
index 000000000000..dd04b97010dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kivy/default.nix
@@ -0,0 +1,92 @@
+{ lib, stdenv
+, buildPythonPackage, fetchFromGitHub, fetchpatch
+, pkg-config, cython, docutils
+, kivy-garden
+, mesa, mtdev, SDL2, SDL2_image, SDL2_ttf, SDL2_mixer
+, Accelerate, ApplicationServices, AVFoundation, libcxx
+, withGstreamer ? true
+, gst_all_1
+, pillow, requests, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "Kivy";
+  version = "2.1.0";
+
+  src = fetchFromGitHub {
+    owner = "kivy";
+    repo = "kivy";
+    rev = version;
+    hash = "sha256-k9LIiLtlHY6H1xfVylI/Xbm7R6pCpC5UHe8GWnCwEGA=";
+  };
+
+  patches = [
+    # Fixes incompatible function pointer conversion errors with clang 16.
+    # https://github.com/kivy/kivy/pull/8415
+    (fetchpatch {
+      url = "https://github.com/kivy/kivy/commit/a0ec8ff79fcbc1b82391132a89c8fc21ef1c5c55.patch";
+      hash = "sha256-2Kpkx75uWPiEiEqkOxBKl3HENKUGVHbQV4haeI5Gl3A=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    pkg-config
+    cython
+    docutils
+  ];
+
+  buildInputs = [
+    SDL2
+    SDL2_image
+    SDL2_ttf
+    SDL2_mixer
+  ] ++ lib.optionals stdenv.isLinux [
+    mesa
+    mtdev
+  ] ++ lib.optionals stdenv.isDarwin [
+    Accelerate
+    ApplicationServices
+    AVFoundation
+    libcxx
+  ] ++ lib.optionals withGstreamer (with gst_all_1; [
+    # NOTE: The degree to which gstreamer actually works is unclear
+    gstreamer
+    gst-plugins-base
+    gst-plugins-good
+    gst-plugins-bad
+  ]);
+
+  propagatedBuildInputs = [
+    kivy-garden
+    pillow
+    pygments
+    requests
+  ];
+
+  KIVY_NO_CONFIG = 1;
+  KIVY_NO_ARGS = 1;
+  KIVY_NO_FILELOG = 1;
+  # prefer pkg-config over hardcoded framework paths
+  USE_OSX_FRAMEWORKS = 0;
+  # work around python distutils compiling C++ with $CC (see issue #26709)
+  env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.isDarwin "-I${lib.getDev libcxx}/include/c++/v1";
+
+  postPatch = lib.optionalString stdenv.isLinux ''
+    substituteInPlace kivy/lib/mtdev.py \
+      --replace "LoadLibrary('libmtdev.so.1')" "LoadLibrary('${mtdev}/lib/libmtdev.so.1')"
+  '';
+
+  /*
+    We cannot run tests as Kivy tries to import itself before being fully
+    installed.
+  */
+  doCheck = false;
+  pythonImportsCheck = [ "kivy" ];
+
+  meta = with lib; {
+    description = "Library for rapid development of hardware-accelerated multitouch applications.";
+    homepage = "https://pypi.python.org/pypi/kivy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ risson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kiwiki-client/default.nix b/nixpkgs/pkgs/development/python-modules/kiwiki-client/default.nix
new file mode 100644
index 000000000000..22da8a5236e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kiwiki-client/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python-dateutil
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "kiwiki-client";
+  version = "0.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "c7h";
+    repo = "kiwiki_client";
+    rev = "refs/tags/${version}";
+    hash = "sha256-CIBed8HzbUqUIzNy1lHxIgjneA6R8uKtmd43LU92M0Q=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    requests
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "kiwiki"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with the KIWI.KI API";
+    homepage = "https://github.com/c7h/kiwiki_client";
+    changelog = "https://github.com/c7h/kiwiki_client/releases/tag/${version}";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kiwisolver/default.nix b/nixpkgs/pkgs/development/python-modules/kiwisolver/default.nix
new file mode 100644
index 000000000000..bc905e77269a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kiwisolver/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, stdenv
+, libcxx
+, cppy
+, setuptools-scm
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "kiwisolver";
+  version = "1.4.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5X5WOlf7IqFC2jTziswvwaXIZLwpyhUXqIq8lj5g1uw=";
+  };
+
+  env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.isDarwin "-I${lib.getDev libcxx}/include/c++/v1";
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    cppy
+  ];
+
+  pythonImportsCheck = [
+    "kiwisolver"
+  ];
+
+  meta = with lib; {
+    description = "Implementation of the Cassowary constraint solver";
+    homepage = "https://github.com/nucleic/kiwi";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/klaus/default.nix b/nixpkgs/pkgs/development/python-modules/klaus/default.nix
new file mode 100644
index 000000000000..0d393d0e8ae5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/klaus/default.nix
@@ -0,0 +1,40 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy3k, flask, pygments, dulwich, httpauth, humanize, pytest, requests, python-ctags3, mock }:
+
+buildPythonPackage rec {
+  pname = "klaus";
+  version = "2.0.3";
+
+  src = fetchFromGitHub {
+    owner = "jonashaag";
+    repo = pname;
+    rev = version;
+    hash = "sha256-VAwIdmwdo/Rim2sVlR605Wo5/zkNOMiGkh40qLrENmU=";
+  };
+
+  prePatch = ''
+    substituteInPlace runtests.sh \
+      --replace "mkdir -p \$builddir" "mkdir -p \$builddir && pwd"
+  '';
+
+  propagatedBuildInputs = [
+    flask pygments dulwich httpauth humanize
+  ];
+
+  nativeCheckInputs = [
+    pytest requests python-ctags3
+  ] ++ lib.optional (!isPy3k) mock;
+
+  checkPhase = ''
+    ./runtests.sh
+  '';
+
+  # Needs to set up some git repos
+  doCheck = false;
+
+  meta = with lib; {
+    description = "The first Git web viewer that Just Works";
+    homepage    = "https://github.com/jonashaag/klaus";
+    license     = licenses.isc;
+    maintainers = with maintainers; [ pSub ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/klein/default.nix b/nixpkgs/pkgs/development/python-modules/klein/default.nix
new file mode 100644
index 000000000000..c19746970a71
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/klein/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build-system
+, setuptools
+, wheel
+
+# dependencies
+, attrs
+, hyperlink
+, incremental
+, tubes
+, twisted
+, werkzeug
+, zope_interface
+
+# tests
+, idna
+, python
+, treq
+}:
+
+buildPythonPackage rec {
+  pname = "klein";
+  version = "unstable-2023-09-05";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "twisted";
+    repo = pname;
+    rev = "44b356ede27a667252ae5392014c802f0492c017";
+    hash = "sha256-zHdyyx5IseFWr25BGLL0dDM8/5BDehsvbxIci+DEo9s=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    hyperlink
+    incremental
+    twisted
+    tubes
+    werkzeug
+    zope_interface
+  ];
+
+  nativeCheckInputs = [
+    idna
+    treq
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m twisted.trial klein
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "klein"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/twisted/klein/releases/tag/${version}";
+    description = "Klein Web Micro-Framework";
+    homepage = "https://github.com/twisted/klein";
+    license = licenses.mit;
+    maintainers = with maintainers; [ exarkun ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kmapper/default.nix b/nixpkgs/pkgs/development/python-modules/kmapper/default.nix
new file mode 100644
index 000000000000..86d9f2b5f798
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kmapper/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, scikit-learn
+, numpy
+, scipy
+, jinja2
+, pytestCheckHook
+, networkx
+, matplotlib
+, igraph
+, plotly
+, ipywidgets
+}:
+
+buildPythonPackage rec {
+  pname = "kmapper";
+  version = "2.0.1";
+
+  src = fetchFromGitHub {
+    owner = "scikit-tda";
+    repo = "kepler-mapper";
+    rev = "v${version}";
+    sha256 = "1jqqrn7ig9kylcc8xbslxmchzghr9jgffaab3g3y3nyghk8azlgj";
+  };
+
+  propagatedBuildInputs = [
+    scikit-learn
+    numpy
+    scipy
+    jinja2
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    networkx
+    matplotlib
+    igraph
+    plotly
+    ipywidgets
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of Mapper algorithm for Topological Data Analysis";
+    homepage = "https://kepler-mapper.scikit-tda.org/";
+    license = licenses.mit;
+    maintainers = [ ];
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kml2geojson/default.nix b/nixpkgs/pkgs/development/python-modules/kml2geojson/default.nix
new file mode 100644
index 000000000000..489e80f94f04
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kml2geojson/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, poetry-core
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, click
+}:
+
+buildPythonPackage rec {
+  pname = "kml2geojson";
+  version = "5.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "mrcagney";
+    repo = pname;
+    rev = version;
+    hash = "sha256-iJEcXpvy+Y3MkxAF2Q1Tkcx8GxUVjeVzv6gl134zdiI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "kml2geojson"
+  ];
+
+  meta = with lib; {
+    description = "Library to convert KML to GeoJSON";
+    homepage = "https://github.com/mrcagney/kml2geojson";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/knack/default.nix b/nixpkgs/pkgs/development/python-modules/knack/default.nix
new file mode 100644
index 000000000000..7932b4953991
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/knack/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, argcomplete
+, colorama
+, jmespath
+, pygments
+, pyyaml
+, six
+, tabulate
+, mock
+, vcrpy
+, pytest
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "knack";
+  version = "0.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-62VoAB6RELGzIJQUMcUQM9EEzJjNoiVKXCsJulaf1JQ=";
+  };
+
+  propagatedBuildInputs = [
+    argcomplete
+    colorama
+    jmespath
+    pygments
+    pyyaml
+    six
+    tabulate
+  ];
+
+  nativeCheckInputs = [
+    mock
+    vcrpy
+    pytest
+  ];
+
+  checkPhase = ''
+    HOME=$TMPDIR pytest .
+  '';
+
+  pythonImportsCheck = [
+    "knack"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/microsoft/knack";
+    description = "A Command-Line Interface framework";
+    changelog = "https://github.com/microsoft/knack/blob/v${version}/HISTORY.rst";
+    platforms = platforms.all;
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kneed/default.nix b/nixpkgs/pkgs/development/python-modules/kneed/default.nix
new file mode 100644
index 000000000000..4510aaa1cac0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kneed/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, numpy
+, scipy
+, matplotlib
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "kneed";
+  version = "0.8.5";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "arvkevi";
+    repo = "kneed";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-oakP6NkdvTzMZcoXS6cKNsRo//K+CoPLlhvbQLGij00=";
+  };
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace "--cov=kneed" ""
+  '';
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    matplotlib
+  ];
+
+  disabledTestPaths = [
+    # Fails when matplotlib is installed
+    "tests/test_no_matplotlib.py"
+  ];
+
+  meta = with lib; {
+    description = "Knee point detection in Python";
+    homepage = "https://github.com/arvkevi/kneed";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ tm-drtina ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/knx-frontend/default.nix b/nixpkgs/pkgs/development/python-modules/knx-frontend/default.nix
new file mode 100644
index 000000000000..47b9fa4d8357
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/knx-frontend/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "knx-frontend";
+  version = "2023.6.23.191712";
+  format = "pyproject";
+
+  # TODO: source build, uses yarn.lock
+  src = fetchPypi {
+    pname = "knx_frontend";
+    inherit version;
+    hash = "sha256-MeurZ6731qjeBK6HTwXYLVs6+nXF9Hf1p8/NNwxmae4=";
+  };
+
+  patches = [
+    # https://github.com/XKNX/knx-frontend/pull/96
+    (fetchpatch {
+      name = "relax-setuptools-dependency.patch";
+      url = "https://github.com/XKNX/knx-frontend/commit/72ac6dc42eeeb488992b0709ee58ea4a79287817.patch";
+      hash = "sha256-EpfgEq4pIx7ahqJZalzo30ruj8NlZYHcKHxFXCGL98w=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  pythonImportsCheck = [
+    "knx_frontend"
+  ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    changelog = "https://github.com/XKNX/knx-frontend/releases/tag/${version}";
+    description = "Home Assistant Panel for managing the KNX integration";
+    homepage = "https://github.com/XKNX/knx-frontend";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kombu/default.nix b/nixpkgs/pkgs/development/python-modules/kombu/default.nix
new file mode 100644
index 000000000000..cdab3aac8ff4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kombu/default.nix
@@ -0,0 +1,111 @@
+{ lib
+, amqp
+, azure-identity
+, azure-servicebus
+, azure-storage-queue
+, backports-zoneinfo
+, boto3
+, buildPythonPackage
+, case
+, confluent-kafka
+, fetchPypi
+, hypothesis
+, kazoo
+, msgpack
+, pycurl
+, pymongo
+  #, pyro4
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, redis
+, sqlalchemy
+, typing-extensions
+, urllib3
+, vine
+}:
+
+buildPythonPackage rec {
+  pname = "kombu";
+  version = "5.3.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-C7LieGRNEd6mJywXl0o9u5aIqUnzu2CutbeRMpxE+tw=";
+  };
+
+  propagatedBuildInputs = [
+    amqp
+    vine
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    typing-extensions
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    backports-zoneinfo
+  ];
+
+  passthru.optional-dependencies = {
+    msgpack = [
+      msgpack
+    ];
+    yaml = [
+      pyyaml
+    ];
+    redis = [
+      redis
+    ];
+    mongodb = [
+      pymongo
+    ];
+    sqs = [
+      boto3
+      urllib3
+      pycurl
+    ];
+    zookeeper = [
+      kazoo
+    ];
+    sqlalchemy = [
+      sqlalchemy
+    ];
+    azurestoragequeues = [
+      azure-identity
+      azure-storage-queue
+    ];
+    azureservicebus = [
+      azure-servicebus
+    ];
+    confluentkafka = [
+      confluent-kafka
+    ];
+    # pyro4 doesn't suppport Python 3.11
+    #pyro = [
+    #  pyro4
+    #];
+  };
+
+  nativeCheckInputs = [
+    case
+    hypothesis
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "kombu"
+  ];
+
+  disabledTests = [
+    # Disable pyro4 test
+    "test_driver_version"
+  ];
+
+  meta = with lib; {
+    description = "Messaging library for Python";
+    homepage = "https://github.com/celery/kombu";
+    changelog = "https://github.com/celery/kombu/blob/v${version}/Changelog.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/konnected/default.nix b/nixpkgs/pkgs/development/python-modules/konnected/default.nix
new file mode 100644
index 000000000000..b2117aab2d5d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/konnected/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+}:
+
+buildPythonPackage rec {
+  pname = "konnected";
+  version = "1.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b8b4e15c3228b01c9fad3651e09fea1654357ae8c333096e759a1b7d0eb4e789";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "konnected" ];
+
+  meta = with lib; {
+    description = "Async Python library for interacting with Konnected home automation controllers";
+    homepage = "https://github.com/konnected-io/konnected-py";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/korean-lunar-calendar/default.nix b/nixpkgs/pkgs/development/python-modules/korean-lunar-calendar/default.nix
new file mode 100644
index 000000000000..3a172d73a393
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/korean-lunar-calendar/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "korean-lunar-calendar";
+  version = "0.3.1";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "korean_lunar_calendar";
+    hash = "sha256-6yxIUSSgYQFpJr3qbYnv35uf2/FttViVts8eW+wXuFc=";
+  };
+
+  # no real tests
+  pythonImportsCheck = [ "korean_lunar_calendar" ];
+
+  meta = with lib; {
+    description = "A library to convert Korean lunar-calendar to Gregorian calendar.";
+    homepage = "https://github.com/usingsky/korean_lunar_calendar_py";
+    license = licenses.mit;
+    maintainers = [ maintainers.ris ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kornia/default.nix b/nixpkgs/pkgs/development/python-modules/kornia/default.nix
new file mode 100644
index 000000000000..5d98379045ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kornia/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, packaging
+, torch
+}:
+
+buildPythonPackage rec {
+  pname = "kornia";
+  version = "0.7.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-XcQXKn4F3DIgn+XQcN5ZcGZLehd/IPBgLuGzIkPSxZg=";
+  };
+
+  propagatedBuildInputs = [
+    packaging
+    torch
+  ];
+
+  pythonImportsCheck = [
+    "kornia"
+    "kornia.augmentation"
+    "kornia.color"
+    "kornia.contrib"
+    "kornia.enhance"
+    "kornia.feature"
+    "kornia.filters"
+    "kornia.geometry"
+    "kornia.io"
+    "kornia.losses"
+    "kornia.metrics"
+    "kornia.morphology"
+    "kornia.tracking"
+    "kornia.testing"
+    "kornia.utils"
+  ];
+
+  doCheck = false;  # tests hang with no single test clearly responsible
+
+  meta = with lib; {
+    homepage = "https://kornia.github.io/kornia";
+    changelog = "https://github.com/kornia/kornia/releases/tag/v${version}";
+    description = "Differentiable computer vision library";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kotsu/default.nix b/nixpkgs/pkgs/development/python-modules/kotsu/default.nix
new file mode 100644
index 000000000000..f1f9389daf5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kotsu/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pandas
+, typing-extensions
+, pytestCheckHook
+, pytest-mock
+, scikit-learn
+}:
+
+buildPythonPackage rec {
+  pname = "kotsu";
+  version = "0.3.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "datavaluepeople";
+    repo = "kotsu";
+    rev = "v${version}";
+    hash = "sha256-V5OkgiLUTRNbNt6m94+aYUZd9Nw+/60LfhrqqdFhiUw=";
+  };
+
+  patches = [
+    ./disable-pytest-coverage-flags.patch
+  ];
+
+  propagatedBuildInputs = [ pandas typing-extensions ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+    scikit-learn
+  ];
+  pythonImportsCheck = [ "kotsu" ];
+
+  meta = with lib; {
+    description = "Lightweight framework for structured and repeatable model validation";
+    homepage = "https://github.com/datavaluepeople/kotsu";
+    changelog = "https://github.com/datavaluepeople/kotsu/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kotsu/disable-pytest-coverage-flags.patch b/nixpkgs/pkgs/development/python-modules/kotsu/disable-pytest-coverage-flags.patch
new file mode 100644
index 000000000000..f035ab0e6553
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kotsu/disable-pytest-coverage-flags.patch
@@ -0,0 +1,18 @@
+diff --git a/setup.cfg b/setup.cfg
+index 3ab277a..b253e18 100644
+--- a/setup.cfg
++++ b/setup.cfg
+@@ -50,13 +50,6 @@ convention = google
+ add_ignore = D105, D107
+ #add_ignore = D100,D101,D102,D103,D104,D200 - start with no ignored errors and add as required
+ 
+-[tool:pytest]
+-addopts = --cov=./kotsu --cov-report xml --cov-report term
+-
+-[coverage:run]
+-# Omit auto-generated versioneer file from test coverage
+-omit = kotsu/_version.py
+-
+ [versioneer]
+ VCS = git
+ style = pep440
diff --git a/nixpkgs/pkgs/development/python-modules/krakenex/default.nix b/nixpkgs/pkgs/development/python-modules/krakenex/default.nix
new file mode 100644
index 000000000000..bf907eb847de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/krakenex/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "krakenex";
+  version = "2.1.0";
+
+  src = fetchFromGitHub {
+    owner = "veox";
+    repo = "python3-krakenex";
+    rev = "v${version}";
+    sha256 = "0j8qmpk6lm57h80i5njhgvm1qnxllm18dlqxfd4kyxdb93si4z2p";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "krakenex" ];
+
+  meta = with lib; {
+    description = "Kraken.com cryptocurrency exchange API";
+    homepage = "https://github.com/veox/python3-krakenex";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/krfzf-py/default.nix b/nixpkgs/pkgs/development/python-modules/krfzf-py/default.nix
new file mode 100644
index 000000000000..d55334d21e8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/krfzf-py/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "krfzf-py";
+  version = "0.0.6";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "krfzf_py";
+    inherit version;
+    hash = "sha256-/M9Atu9MLAGmnEdx6tknMJAit2o4Xt971uQ7pb0CBCk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  pythonImportsCheck = [ "fzf" ];
+
+  meta = with lib; {
+    description = "A Pythonic Fzf Wrapper";
+    downloadPage = "https://github.com/justfoolingaround/fzf.py";
+    homepage = "https://pypi.org/project/krfzf-py/";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ doronbehar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/kubernetes/default.nix b/nixpkgs/pkgs/development/python-modules/kubernetes/default.nix
new file mode 100644
index 000000000000..2b28f76d051a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/kubernetes/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# propgatedBuildInputs
+, adal
+, certifi
+, google-auth
+, python-dateutil
+, pyyaml
+, requests
+, requests-oauthlib
+, setuptools
+, six
+, urllib3
+, websocket-client
+
+# tests
+, pytestCheckHook
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "kubernetes";
+  version = "27.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "kubernetes-client";
+    repo = "python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-KqQ7wUu5Se4WYOdtk9vMU3M5oyz0WgIltSEliCD7s10=";
+  };
+
+  propagatedBuildInputs = [
+    adal
+    certifi
+    google-auth
+    python-dateutil
+    pyyaml
+    requests
+    requests-oauthlib
+    setuptools
+    six
+    urllib3
+    websocket-client
+  ];
+
+  pythonImportsCheck = [
+    "kubernetes"
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # AssertionError: <class 'urllib3.poolmanager.ProxyManager'> != <class 'urllib3.poolmanager.Poolmanager'>
+    "test_rest_proxycare"
+  ];
+
+  meta = with lib; {
+    description = "Kubernetes Python client";
+    homepage = "https://github.com/kubernetes-client/python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ lsix ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/l18n/default.nix b/nixpkgs/pkgs/development/python-modules/l18n/default.nix
new file mode 100644
index 000000000000..cab48d4376f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/l18n/default.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, pytz
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "l18n";
+  version = "2021.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-GVbokNZz0XE1zCCRMlPBVPa8HAAmbCK31QPMGlpC2Eg=";
+  };
+
+  propagatedBuildInputs = [ pytz six ];
+
+  # tests are not included in sdist and building from source is none trivial
+  doCheck = false;
+
+  pythonImportsCheck = [ "l18n" ];
+
+  meta = with lib; {
+    description = "Locale internationalization package";
+    homepage = "https://github.com/tkhyn/l18n";
+    changelog = "https://github.com/tkhyn/l18n/blob/${version}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sephi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/labelbox/default.nix b/nixpkgs/pkgs/development/python-modules/labelbox/default.nix
new file mode 100644
index 000000000000..cf71b36b3c2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/labelbox/default.nix
@@ -0,0 +1,103 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, geojson
+, google-api-core
+, imagesize
+, nbconvert
+, nbformat
+, numpy
+, opencv4
+, packaging
+, pillow
+, pydantic
+, pyproj
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, requests
+, setuptools
+, shapely
+, tqdm
+, typeguard
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "labelbox";
+  version = "3.56.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Labelbox";
+    repo = "labelbox-python";
+    rev = "refs/tags/v.${version}";
+    hash = "sha256-JRh14XpW/iGeBWrslm7weCP/vyJ7eZICqRgQpE2wjXs=";
+  };
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace "--reruns 5 --reruns-delay 10" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    google-api-core
+    pydantic
+    python-dateutil
+    requests
+    tqdm
+  ];
+
+  passthru.optional-dependencies = {
+    data = [
+      shapely
+      geojson
+      numpy
+      pillow
+      opencv4
+      typeguard
+      imagesize
+      pyproj
+      # pygeotile
+      typing-extensions
+      packaging
+    ];
+  };
+
+  nativeCheckInputs = [
+    nbconvert
+    nbformat
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.data;
+
+  # disable pytest_plugins which requires `pygeotile`
+  preCheck = ''
+    substituteInPlace tests/conftest.py \
+      --replace "pytest_plugins" "_pytest_plugins"
+  '';
+
+  disabledTestPaths = [
+    # Requires network access
+    "tests/integration"
+    # Missing requirements
+    "tests/data"
+  ];
+
+  pythonImportsCheck = [
+    "labelbox"
+  ];
+
+  meta = with lib; {
+    description = "Platform API for LabelBox";
+    homepage = "https://github.com/Labelbox/labelbox-python";
+    changelog = "https://github.com/Labelbox/labelbox-python/blob/v.${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ rakesh4g ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/labgrid/default.nix b/nixpkgs/pkgs/development/python-modules/labgrid/default.nix
new file mode 100644
index 000000000000..aa4b10d49d5f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/labgrid/default.nix
@@ -0,0 +1,79 @@
+{ ansicolors
+, attrs
+, autobahn
+, buildPythonPackage
+, fetchFromGitHub
+, jinja2
+, lib
+, mock
+, packaging
+, pexpect
+, psutil
+, pyserial
+, pytestCheckHook
+, pytest-dependency
+, pytest-mock
+, pyudev
+, pyusb
+, pyyaml
+, requests
+, setuptools
+, setuptools-scm
+, wheel
+, xmodem
+}:
+
+buildPythonPackage rec {
+  pname = "labgrid";
+  version = "23.0.3";
+
+  src = fetchFromGitHub {
+    owner = "labgrid-project";
+    repo = "labgrid";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-yhlBqqCLOt6liw4iv8itG6E4QfIa7cW76QJqefUM5dw=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  pyproject = true;
+
+  propagatedBuildInputs = [
+    ansicolors
+    attrs
+    autobahn
+    jinja2
+    packaging
+    pexpect
+    pyserial
+    pyudev
+    pyusb
+    pyyaml
+    requests
+    xmodem
+  ];
+
+  preBuild = ''
+    export SETUPTOOLS_SCM_PRETEND_VERSION="${version}"
+  '';
+
+  nativeCheckInputs = [
+    mock
+    psutil
+    pytestCheckHook
+    pytest-mock
+    pytest-dependency
+  ];
+
+  meta = with lib; {
+    description = "Embedded control & testing library";
+    homepage = "https://labgrid.org";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ emantor ];
+    platforms = with platforms; linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/labmath/default.nix b/nixpkgs/pkgs/development/python-modules/labmath/default.nix
new file mode 100644
index 000000000000..8ace5b3327e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/labmath/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "labmath";
+  version = "2.2.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-dzJ4szPxnck0Cgc5IEp5FBmHvIyAC0rqKRVrkt20ntQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  pythonImportsCheck = [ "labmath" ];
+
+  meta = with lib; {
+    homepage = "https://pypi.org/project/labmath";
+    description = "Module for basic math in the general vicinity of computational number theory";
+    license = licenses.mit;
+    maintainers = with maintainers; [ siraben ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lakeside/default.nix b/nixpkgs/pkgs/development/python-modules/lakeside/default.nix
new file mode 100644
index 000000000000..bb33367d9647
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lakeside/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, protobuf
+, pycryptodome
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "lakeside";
+  version = "0.13";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nkgilley";
+    repo = "python-lakeside";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Y5g78trkwOF3jsbgTv0uVkvfB1HZN+w1T6xIorxGAhg=";
+  };
+
+  propagatedBuildInputs = [
+    protobuf
+    pycryptodome
+    requests
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "lakeside"
+  ];
+
+  meta = with lib; {
+    description = "Library for controlling LED bulbs from Eufy";
+    homepage = "https://github.com/nkgilley/python-lakeside";
+    changelog = "https://github.com/nkgilley/python-lakeside/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/langchain/default.nix b/nixpkgs/pkgs/development/python-modules/langchain/default.nix
new file mode 100644
index 000000000000..c2fabc40c03a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/langchain/default.nix
@@ -0,0 +1,293 @@
+{ lib
+, bash
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pythonRelaxDepsHook
+, poetry-core
+, aiohttp
+, anyio
+, async-timeout
+, dataclasses-json
+, jsonpatch
+, langsmith
+, numpy
+, pydantic
+, pyyaml
+, requests
+, sqlalchemy
+, tenacity
+  # optional dependencies
+, atlassian-python-api
+, azure-core
+, azure-cosmos
+, azure-identity
+, beautifulsoup4
+, chardet
+, clarifai
+, cohere
+, duckduckgo-search
+, elasticsearch
+, esprima
+, faiss
+, google-api-python-client
+, google-auth
+, google-search-results
+, gptcache
+, html2text
+, huggingface-hub
+, jinja2
+, jq
+, lark
+, librosa
+, lxml
+, manifest-ml
+, neo4j
+, networkx
+, nlpcloud
+, nltk
+, openai
+, opensearch-py
+, pdfminer-six
+, pgvector
+, pinecone-client
+, psycopg2
+, pymongo
+, pyowm
+, pypdf
+, pytesseract
+, python-arango
+, qdrant-client
+, rdflib
+, redis
+, requests-toolbelt
+, sentence-transformers
+, tiktoken
+, torch
+, transformers
+, typer
+, weaviate-client
+, wikipedia
+  # test dependencies
+, freezegun
+, pandas
+, pexpect
+, pytest-asyncio
+, pytest-mock
+, pytest-socket
+, pytestCheckHook
+, requests-mock
+, responses
+, syrupy
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "langchain";
+  version = "0.0.334";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "hwchase17";
+    repo = "langchain";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-mXPqc8wF9DhEtITm8h5R9kHBcMJ7AEK4kL5Z7V2p8NE=";
+  };
+
+  sourceRoot = "${src.name}/libs/langchain";
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  buildInputs = [
+    bash
+  ];
+
+  propagatedBuildInputs = [
+    pydantic
+    sqlalchemy
+    requests
+    pyyaml
+    numpy
+    dataclasses-json
+    tenacity
+    aiohttp
+    langsmith
+    anyio
+    jsonpatch
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    async-timeout
+  ];
+
+  passthru.optional-dependencies = {
+    llms = [
+      clarifai
+      cohere
+      openai
+      # openlm
+      nlpcloud
+      huggingface-hub
+      manifest-ml
+      torch
+      transformers
+    ];
+    qdrant = [
+      qdrant-client
+    ];
+    openai = [
+      openai
+      tiktoken
+    ];
+    text_helpers = [
+      chardet
+    ];
+    clarifai = [
+      clarifai
+    ];
+    cohere = [
+      cohere
+    ];
+    docarray = [
+      # docarray
+    ];
+    embeddings = [
+      sentence-transformers
+    ];
+    javascript = [
+      esprima
+    ];
+    azure = [
+      azure-identity
+      azure-cosmos
+      openai
+      azure-core
+      # azure-ai-formrecognizer
+      # azure-ai-vision
+      # azure-cognitiveservices-speech
+      # azure-search-documents
+    ];
+    all = [
+      clarifai
+      cohere
+      openai
+      nlpcloud
+      huggingface-hub
+      manifest-ml
+      elasticsearch
+      opensearch-py
+      google-search-results
+      faiss
+      sentence-transformers
+      transformers
+      nltk
+      wikipedia
+      beautifulsoup4
+      tiktoken
+      torch
+      jinja2
+      pinecone-client
+      # pinecone-text
+      # marqo
+      pymongo
+      weaviate-client
+      redis
+      google-api-python-client
+      google-auth
+      # wolframalpha
+      qdrant-client
+      # tensorflow-text
+      pypdf
+      networkx
+      # nomic
+      # aleph-alpha-client
+      # deeplake
+      # libdeeplake
+      pgvector
+      psycopg2
+      pyowm
+      pytesseract
+      html2text
+      atlassian-python-api
+      gptcache
+      duckduckgo-search
+      # arxiv
+      azure-identity
+      # clickhouse-connect
+      azure-cosmos
+      # lancedb
+      # langkit
+      lark
+      pexpect
+      # pyvespa
+      # O365
+      jq
+      # docarray
+      pdfminer-six
+      lxml
+      requests-toolbelt
+      neo4j
+      # openlm
+      # azure-ai-formrecognizer
+      # azure-ai-vision
+      # azure-cognitiveservices-speech
+      # momento
+      # singlestoredb
+      # tigrisdb
+      # nebula3-python
+      # awadb
+      esprima
+      rdflib
+      # amadeus
+      librosa
+      python-arango
+    ];
+    cli = [
+      typer
+    ];
+  };
+
+  nativeCheckInputs = [
+    freezegun
+    lark
+    pandas
+    pytest-asyncio
+    pytest-mock
+    pytest-socket
+    pytestCheckHook
+    requests-mock
+    responses
+    syrupy
+    toml
+  ];
+
+  pytestFlagsArray = [
+    # integration_tests have many network, db access and require `OPENAI_API_KEY`, etc.
+    "tests/unit_tests"
+    "--only-core"
+  ];
+
+  disabledTests = [
+    # these tests have db access
+    "test_table_info"
+    "test_sql_database_run"
+
+    # these tests have network access
+    "test_socket_disabled"
+  ];
+
+  pythonImportsCheck = [
+    "langchain"
+  ];
+
+  meta = with lib; {
+    description = "Building applications with LLMs through composability";
+    homepage = "https://github.com/hwchase17/langchain";
+    changelog = "https://github.com/hwchase17/langchain/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/langchainplus-sdk/default.nix b/nixpkgs/pkgs/development/python-modules/langchainplus-sdk/default.nix
new file mode 100644
index 000000000000..8747c0a8d9e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/langchainplus-sdk/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, poetry-core
+, pydantic
+, pythonOlder
+, requests
+, tenacity
+}:
+
+buildPythonPackage rec {
+  pname = "langchainplus-sdk";
+  version = "0.0.21";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "langchainplus_sdk";
+    hash = "sha256-frjZnQnOe6IHKrQk+Q/xMc5Akb+eBQ/eBzP545Fq6Xk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pydantic
+    requests
+    tenacity
+  ];
+
+  # upstrem has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "langchainplus_sdk"
+  ];
+
+  meta = {
+    description = "Client library to connect to the LangChainPlus LLM Tracing and Evaluation Platform";
+    homepage = "https://pypi.org/project/langchainplus-sdk/";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/langcodes/default.nix b/nixpkgs/pkgs/development/python-modules/langcodes/default.nix
new file mode 100644
index 000000000000..555cc9e4795e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/langcodes/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, marisa-trie
+, pythonOlder
+, fetchPypi
+, poetry-core
+, pytestCheckHook
+, language-data
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "langcodes";
+  version = "3.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "794d07d5a28781231ac335a1561b8442f8648ca07cd518310aeb45d6f0807ef6";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    language-data
+    marisa-trie
+    setuptools # pkg_resources import in language_data/util.py
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # AssertionError: assert 'Unknown language [aqk]' == 'Aninka'
+    "test_updated_iana"
+  ];
+
+  pythonImportsCheck = [
+    "langcodes"
+  ];
+
+  meta = with lib; {
+    description = "Python toolkit for working with and comparing the standardized codes for languages";
+    homepage = "https://github.com/LuminosoInsight/langcodes";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/langdetect/default.nix b/nixpkgs/pkgs/development/python-modules/langdetect/default.nix
new file mode 100644
index 000000000000..5d3dae158060
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/langdetect/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "langdetect";
+  version = "1.0.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1805svvb7xjm4sf1j7b6nc3409x37pd1xmabfwwjf1ldkzwgxhfb";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "langdetect" ];
+
+  meta = with lib; {
+    description = "Python port of Google's language-detection library";
+    homepage = "https://github.com/Mimino666/langdetect";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ erikarvstedt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/langid/default.nix b/nixpkgs/pkgs/development/python-modules/langid/default.nix
new file mode 100644
index 000000000000..fe8f07e85b23
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/langid/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, wheel
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "langid";
+  version = "1.1.6";
+  format = "setuptools";
+
+  src = fetchPypi { # use PyPi as source, github repository does not contain tags or release branches
+    inherit pname version;
+    hash = "sha256-BEvK4ZEtq4XDPY6Y8oEbj0/xIT5emp6VEBN7hNosspM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  doCheck = false; # Package has no tests
+  pythonImportsCheck = [ "langid" ];
+
+  meta = with lib; {
+    description = "Langid.py is a standalone Language Identification (LangID) tool";
+    homepage = "https://pypi.org/project/langid/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/langsmith/default.nix b/nixpkgs/pkgs/development/python-modules/langsmith/default.nix
new file mode 100644
index 000000000000..3b81c6128887
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/langsmith/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, freezegun
+, poetry-core
+, pydantic
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "langsmith";
+  version = "0.0.63";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "langchain-ai";
+    repo = "langsmith-sdk";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-KE+WMnuWAq1stZuuwZkOPOKQ2lZNKtxzNbZMRoOdmz0=";
+  };
+
+  sourceRoot = "${src.name}/python";
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pydantic
+    requests
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # These tests require network access
+    "integration_tests"
+    # due to circular import
+    "test_as_runnable"
+    "test_as_runnable_batch"
+    "test_as_runnable_async"
+    "test_as_runnable_async_batch"
+  ];
+
+  disabledTestPaths = [
+    # due to circular import
+    "tests/integration_tests/test_client.py"
+  ];
+
+  pythonImportsCheck = [
+    "langsmith"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform";
+    homepage = "https://github.com/langchain-ai/langsmith-sdk";
+    changelog = "https://github.com/langchain-ai/langsmith-sdk/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/language-data/default.nix b/nixpkgs/pkgs/development/python-modules/language-data/default.nix
new file mode 100644
index 000000000000..ff04b036dc05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/language-data/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, marisa-trie
+, poetry-core
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "language-data";
+  version = "1.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "rspeer";
+    repo = "language_data";
+    rev = "v${version}";
+    sha256 = "51TUVHXPHG6ofbnxI6+o5lrtr+QCIpGKu+OjDK3l7Mc=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    marisa-trie
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "language_data"
+  ];
+
+  meta = with lib; {
+    description = "Supplement module for langcodes";
+    homepage = "https://github.com/rspeer/language_data";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/language-tags/default.nix b/nixpkgs/pkgs/development/python-modules/language-tags/default.nix
new file mode 100644
index 000000000000..2d3f68f82cea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/language-tags/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "language-tags";
+  version = "1.2.0";
+
+  src = fetchFromGitHub {
+    owner = "OnroerendErfgoed";
+    repo = "language-tags";
+    rev = "refs/tags/${version}";
+    hash = "sha256-T9K290seKhQLqW36EfA9kn3WveKCmyjN4Mx2j50qIEk=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "language_tags" ];
+
+  meta = with lib; {
+    description = "Dealing with IANA language tags in Python";
+    homepage = "https://language-tags.readthedocs.io/en/latest/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ambroisie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lanms-neo/default.nix b/nixpkgs/pkgs/development/python-modules/lanms-neo/default.nix
new file mode 100644
index 000000000000..149f98a608ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lanms-neo/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nix-update-script
+, pythonOlder
+, pybind11
+, numpy
+}:
+let
+  pname = "lanms-neo";
+  version = "1.0.2";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "gen-ko";
+    repo = pname;
+    rev = "6510e19e731a1e105d42b2fbda64de41c169ce2e";
+    hash = "sha256-0fs4RNN1ptiir7GfR9B8HK0VqTkk5PbVJxgKiDId3po=";
+  };
+
+  propagatedBuildInputs = [
+    pybind11
+    numpy
+  ];
+
+  passthru.updateScript = nix-update-script { };
+
+  meta = with lib; {
+    description = "Standalone module for Locality-Aware NMS";
+    homepage = "https://github.com/gen-ko/lanms-neo";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lark/default.nix b/nixpkgs/pkgs/development/python-modules/lark/default.nix
new file mode 100644
index 000000000000..3158b626c2a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lark/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, regex
+, pytestCheckHook
+, js2py
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "lark";
+  version = "1.1.7";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "lark-parser";
+    repo = "lark";
+    rev = "refs/tags/${version}";
+    hash = "sha256-k74tozIgJuwtUqKKmYHlfLpCWyT2hdoygRJiIpw+GDE=";
+  };
+
+  patches = [
+    # include .lark files in package data
+    # https://github.com/lark-parser/lark/pull/1308
+    (fetchpatch {
+      url = "https://github.com/lark-parser/lark/commit/656334cb8793fd4e08a12843eaced5a7bb518be3.patch";
+      hash = "sha256-pYeNnFfXJ8xkR0KsU/KMWJ8nF+BhP9PXEANiVhT254s=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  # Optional import, but fixes some re known bugs & allows advanced regex features
+  propagatedBuildInputs = [ regex ];
+
+  pythonImportsCheck = [
+    "lark"
+    "lark.parsers"
+    "lark.tools"
+    "lark.grammars"
+  ];
+
+  nativeCheckInputs = [
+    js2py
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A modern parsing library for Python, implementing Earley & LALR(1) and an easy interface";
+    homepage = "https://lark-parser.readthedocs.io/";
+    changelog = "https://github.com/lark-parser/lark/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fridh drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/laspy/default.nix b/nixpkgs/pkgs/development/python-modules/laspy/default.nix
new file mode 100644
index 000000000000..69b4af29f01b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/laspy/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, laszip
+, setuptools
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "laspy";
+  version = "2.5.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uqPJxswVVjbxYRSREfnPwkPb0U9synKclLNWsxxmjy4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    laszip
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "laspy"
+    "laszip"
+  ];
+
+  meta = with lib; {
+    description = "Interface for reading/modifying/creating .LAS LIDAR files";
+    homepage = "https://github.com/laspy/laspy";
+    changelog = "https://github.com/laspy/laspy/blob/${version}/CHANGELOG.md";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ matthewcroughan ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/laszip/default.nix b/nixpkgs/pkgs/development/python-modules/laszip/default.nix
new file mode 100644
index 000000000000..85187d08f99f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/laszip/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, scikit-build-core
+, pybind11
+, cmake
+, LASzip
+, ninja
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "laszip-python";
+  version = "0.2.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tmontaigu";
+    repo = pname;
+    rev = version;
+    hash = "sha256-MiPzL9TDCf1xnCv7apwdfcpkFnBRi4PO/atTQxqL8cw=";
+  };
+
+  patches = [
+    # Removes depending on the cmake and ninja PyPI packages, since we can pass
+    # in the tools directly, and scikit-build-core can use them.
+    # https://github.com/tmontaigu/laszip-python/pull/9
+    (fetchpatch {
+      name = "remove-cmake-ninja-pypi-dependencies.patch";
+      url = "https://github.com/tmontaigu/laszip-python/commit/17e648d04945fa2d095d6d74d58c790a4fcde84a.patch";
+      hash = "sha256-k58sS1RqVzT1WPh2OVt/D4Y045ODtj6U3bUjegd44VY=";
+    })
+  ];
+
+  env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.cc.isGNU "-std=c++17";
+
+  nativeBuildInputs = [
+    cmake
+    ninja
+    pybind11
+    scikit-build-core
+  ] ++ scikit-build-core.optional-dependencies.pyproject;
+
+  dontUseCmakeConfigure = true;
+
+  buildInputs = [
+    LASzip
+  ];
+
+  # There are no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "laszip" ];
+
+  meta = with lib; {
+    description = "Unofficial bindings between Python and LASzip made using pybind11";
+    homepage = "https://github.com/tmontaigu/laszip-python";
+    changelog = "https://github.com/tmontaigu/laszip-python/blob/${src.rev}/Changelog.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ matthewcroughan ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/latex2mathml/default.nix b/nixpkgs/pkgs/development/python-modules/latex2mathml/default.nix
new file mode 100644
index 000000000000..4ff8ba6df59b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/latex2mathml/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, multidict
+, xmljson
+}:
+
+buildPythonPackage rec {
+  pname = "latex2mathml";
+  version = "3.76.0";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "roniemartinez";
+    repo = pname;
+    rev = version;
+    hash = "sha256-CoWXWgu1baM5v7OC+OlRHZB0NkPue4qFzylJk4Xq2e4=";
+  };
+
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    multidict
+    xmljson
+  ];
+
+  # Disable code coverage in check phase
+  postPatch = ''
+    sed -i '/--cov/d' pyproject.toml
+  '';
+
+  pythonImportsCheck = [ "latex2mathml" ];
+
+  meta = with lib; {
+    description = "Pure Python library for LaTeX to MathML conversion";
+    homepage = "https://github.com/roniemartinez/latex2mathml";
+    changelog = "https://github.com/roniemartinez/latex2mathml/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sfrijters ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/latexcodec/default.nix b/nixpkgs/pkgs/development/python-modules/latexcodec/default.nix
new file mode 100644
index 000000000000..be3808659220
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/latexcodec/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, six, pytest }:
+
+buildPythonPackage rec {
+  pname = "latexcodec";
+  version = "2.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "16pynfnn8y8xp55yp06i721fccv5dlx9ba6k5bzcwq9j6wf5b8ia";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/mcmtroffaes/latexcodec";
+    description = "Lexer and codec to work with LaTeX code in Python";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/latexify-py/default.nix b/nixpkgs/pkgs/development/python-modules/latexify-py/default.nix
new file mode 100644
index 000000000000..f56055e55fd7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/latexify-py/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, dill
+, fetchFromGitHub
+, hatchling
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "latexify-py";
+  version = "0.4.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = "latexify_py";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-sxXfm4zJJT+94jcSsYH7Ky3XwFOniSNxvcVUAsgz8u0=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    dill
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "latexify"
+  ];
+
+  preCheck = ''
+    cd src
+  '';
+
+  meta = with lib; {
+    description = "Generates LaTeX math description from Python functions";
+    homepage = "https://github.com/google/latexify_py";
+    changelog = "https://github.com/google/latexify_py/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/launchpadlib/default.nix b/nixpkgs/pkgs/development/python-modules/launchpadlib/default.nix
new file mode 100644
index 000000000000..02acb86b601e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/launchpadlib/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, httplib2
+, keyring
+, lazr-restfulclient
+, lazr-uri
+, setuptools
+, six
+, testresources
+, wadllib
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "launchpadlib";
+  version = "1.11.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-AYmMk3R3sMZKdTOK2wl3Ao1zRqigGesCPPaP7ZmFAUY=";
+  };
+
+  propagatedBuildInputs = [
+    httplib2
+    keyring
+    lazr-restfulclient
+    lazr-uri
+    setuptools
+    six
+    testresources
+    wadllib
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  doCheck = isPy3k;
+
+  pythonImportsCheck = [
+    "launchpadlib"
+    "launchpadlib.apps"
+    "launchpadlib.credentials"
+  ];
+
+  meta = with lib; {
+    description = "Script Launchpad through its web services interfaces. Officially supported";
+    homepage = "https://help.launchpad.net/API/launchpadlib";
+    license = licenses.lgpl3Only;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/laundrify-aio/default.nix b/nixpkgs/pkgs/development/python-modules/laundrify-aio/default.nix
new file mode 100644
index 000000000000..9c5e34dbf876
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/laundrify-aio/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, aiohttp
+, pyjwt
+}:
+
+buildPythonPackage rec {
+  pname = "laundrify-aio";
+  version = "1.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "laundrify";
+    repo = "laundrify-pypi";
+    rev = "v${version}";
+    hash = "sha256-+dTvYn4hux3Y19kWZwxhdkBARmfD8SuNlYWM/ET9K2M=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    pyjwt
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "laundrify_aio"
+  ];
+
+  meta = with lib; {
+    description = "Module to communicate with the laundrify API";
+    homepage = "https://github.com/laundrify/laundrify-pypi";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/layoutparser/default.nix b/nixpkgs/pkgs/development/python-modules/layoutparser/default.nix
new file mode 100644
index 000000000000..391cb7a235ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/layoutparser/default.nix
@@ -0,0 +1,100 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+# build inputs
+, numpy
+, opencv4
+, scipy
+, pandas
+, pillow
+, pyyaml
+, iopath
+, pdfplumber
+, pdf2image
+, google-cloud-vision
+, pytesseract
+, torch
+, torchvision
+, effdet
+# check inputs
+, pytestCheckHook
+}:
+let
+  pname = "layoutparser";
+  version = "0.3.4";
+  optional-dependencies = {
+    ocr = [ google-cloud-vision pytesseract ];
+    gcv = [ google-cloud-vision ];
+    tesseract = [ pytesseract ];
+    layoutmodels = [ torch torchvision effdet ];
+    effdet = [ torch torchvision effdet ];
+    # paddledetection = [ paddlepaddle ]
+  };
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Layout-Parser";
+    repo = "layout-parser";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-qBzcIUmgnGy/Xn/B+7UrLrRhCvCkapL+ymqGS2sMVgA=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "opencv-python" "opencv"
+  '';
+
+  propagatedBuildInputs = [
+    numpy
+    opencv4
+    scipy
+    pandas
+    pillow
+    pyyaml
+    iopath
+    pdfplumber
+    pdf2image
+  ];
+
+  pythonImportsCheck = [
+    "layoutparser"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ optional-dependencies.ocr;
+
+  disabledTests = [
+    "test_PaddleDetectionModel" # requires paddlepaddle not yet packaged
+     # requires detectron2 not yet packaged
+    "test_Detectron2Model"
+    "test_AutoModel"
+     # requires effdet (disable for now until effdet builds on darwin)
+    "test_EffDetModel"
+    # problems with google-cloud-vision
+    # AttributeError: module 'google.cloud.vision' has no attribute 'types'
+    "test_gcv_agent"
+    "test_viz"
+    #  - Failed: DID NOT RAISE <class 'ImportError'>
+    "test_when_backends_are_not_loaded"
+  ];
+
+  disabledTestPaths = [
+    "tests_deps/test_only_detectron2.py" # requires detectron2 not yet packaged
+    "tests_deps/test_only_effdet.py" # requires effdet (disable for now until effdet builds on darwin)
+    "tests_deps/test_only_paddledetection.py" # requires paddlepaddle not yet packaged
+  ];
+
+  passthru.optional-dependencies = optional-dependencies;
+
+  meta = with lib; {
+    description = "A unified toolkit for Deep Learning Based Document Image Analysis";
+    homepage = "https://github.com/Layout-Parser/layout-parser";
+    changelog = "https://github.com/Layout-Parser/layout-parser/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lazr-restfulclient/default.nix b/nixpkgs/pkgs/development/python-modules/lazr-restfulclient/default.nix
new file mode 100644
index 000000000000..c7a9ef78ae23
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lazr-restfulclient/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchPypi
+, distro
+, httplib2
+, oauthlib
+, setuptools
+, six
+, wadllib
+, fixtures
+, lazr-uri
+, pytestCheckHook
+, wsgi-intercept
+}:
+
+buildPythonPackage rec {
+  pname = "lazr.restfulclient";
+  version = "0.14.5";
+
+  disabled = isPy27; # namespace is broken for python2
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-B1FxfH502xmH6adzNXB9TX2XzwSxrQiYuCLxIzPWiHw=";
+  };
+
+  propagatedBuildInputs = [ distro httplib2 oauthlib setuptools six wadllib ];
+
+  # E   ModuleNotFoundError: No module named 'lazr.uri'
+  doCheck = false;
+  nativeCheckInputs = [ fixtures lazr-uri pytestCheckHook wsgi-intercept ];
+
+  pythonImportsCheck = [ "lazr.restfulclient" ];
+
+  meta = with lib; {
+    description = "A programmable client library that takes advantage of the commonalities among";
+    homepage = "https://launchpad.net/lazr.restfulclient";
+    license = licenses.lgpl3;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lazr-uri/default.nix b/nixpkgs/pkgs/development/python-modules/lazr-uri/default.nix
new file mode 100644
index 000000000000..4ba3b5d1cdcd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lazr-uri/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchPypi
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "lazr.uri";
+  version = "1.0.6";
+
+  disabled = isPy27; # namespace is broken for python2
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5026853fcbf6f91d5a6b11ea7860a641fe27b36d4172c731f4aa16b900cf8464";
+  };
+
+  propagatedBuildInputs = [ setuptools ];
+
+  meta = with lib; {
+    description = "A self-contained, easily reusable library for parsing, manipulating";
+    homepage = "https://launchpad.net/lazr.uri";
+    license = licenses.lgpl3;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lazr/config.nix b/nixpkgs/pkgs/development/python-modules/lazr/config.nix
new file mode 100644
index 000000000000..bc369705e265
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lazr/config.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, lazr-delegates
+, zope_interface
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "lazr-config";
+  version = "3.0";
+  pyproject = true;
+
+  src = fetchPypi {
+    pname = "lazr.config";
+    inherit version;
+    hash = "sha256-oU5PbMCa68HUCxdhWK6g7uIlLBQAO40O8LMcfFFMNkQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    lazr-delegates
+    zope_interface
+  ];
+
+  pythonImportsCheck = [
+    "lazr.config"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # change the directory to avoid a namespace-related problem
+  # ModuleNotFoundError: No module named 'lazr.delegates'
+  preCheck = ''
+    cd $out
+  '';
+
+  pythonNamespaces = [
+    "lazr"
+  ];
+
+  meta = with lib; {
+    description = "Create configuration schemas, and process and validate configurations";
+    homepage = "https://launchpad.net/lazr.config";
+    changelog = "https://git.launchpad.net/lazr.config/tree/NEWS.rst?h=${version}";
+    license = licenses.lgpl3Only;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lazr/delegates.nix b/nixpkgs/pkgs/development/python-modules/lazr/delegates.nix
new file mode 100644
index 000000000000..e0b03e693194
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lazr/delegates.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, zope_interface
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "lazr-delegates";
+  version = "2.1.0";
+  pyproject = true;
+
+  src = fetchPypi {
+    pname = "lazr.delegates";
+    inherit version;
+    hash = "sha256-UNT7iHK5UuV6SOEmEOVQ+jBm7rV8bGx1tqUUJBi6wZw=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    zope_interface
+  ];
+
+  pythonImportsCheck = [
+    "lazr.delegates"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonNamespaces = [
+    "lazr"
+  ];
+
+  meta = with lib; {
+    description = "Easily write objects that delegate behavior";
+    homepage = "https://launchpad.net/lazr.delegates";
+    changelog = "https://git.launchpad.net/lazr.delegates/tree/NEWS.rst?h=${version}";
+    license = licenses.lgpl3Only;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lazy-imports/default.nix b/nixpkgs/pkgs/development/python-modules/lazy-imports/default.nix
new file mode 100644
index 000000000000..e15b3226006f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lazy-imports/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, packaging
+}:
+let
+  pname = "lazy-imports";
+  version = "0.3.1";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "telekom";
+    repo = "lazy-imports";
+    rev = "refs/tags/${version}";
+    hash = "sha256-i+VPlBoxNqk56U4oiEgS1Ayhi1t2O8PtLZ/bzEurUY8=";
+  };
+
+  pythonImportsCheck = [
+    "lazy_imports"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    packaging
+  ];
+
+  meta = with lib; {
+    description = "Python tool to support lazy imports.";
+    homepage = "https://github.com/telekom/lazy-imports";
+    changelog = "https://github.com/telekom/lazy-imports/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lazy-loader/default.nix b/nixpkgs/pkgs/development/python-modules/lazy-loader/default.nix
new file mode 100644
index 000000000000..e118b3bd649f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lazy-loader/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "lazy-loader";
+  version = "0.3";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "scientific-python";
+    repo = "lazy_loader";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Ky9EwPYt/wBqWXopH5WFjlVG+/Rd2gc+mlCeWqG7mZg=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Populate library namespace without incurring immediate import costs";
+    homepage = "https://github.com/scientific-python/lazy_loader";
+    changelog = "https://github.com/scientific-python/lazy_loader/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lazy-object-proxy/default.nix b/nixpkgs/pkgs/development/python-modules/lazy-object-proxy/default.nix
new file mode 100644
index 000000000000..a3367cc9bd4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lazy-object-proxy/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "lazy-object-proxy";
+  version = "1.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ZZ+1gJ+kYpuKGsUQb2ac/HvvJvuzid2lOz4BDRrE664=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml --replace ",<6.0" ""
+    substituteInPlace setup.cfg --replace ",<6.0" ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Broken tests. Seem to be fixed upstream according to Travis.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A fast and thorough lazy object proxy";
+    homepage = "https://github.com/ionelmc/python-lazy-object-proxy";
+    license = with licenses; [ bsd2 ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lazy/default.nix b/nixpkgs/pkgs/development/python-modules/lazy/default.nix
new file mode 100644
index 000000000000..1e5f72ff803c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lazy/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "lazy";
+  version = "1.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2c6d27a5ab130fb85435320651a47403adcb37ecbcc501b0c6606391f65f5b43";
+    extension = "zip";
+  };
+
+  meta = {
+    description = "Lazy attributes for Python objects";
+    license = lib.licenses.bsd2;
+    homepage = "https://github.com/stefanholek/lazy";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lazy_import/default.nix b/nixpkgs/pkgs/development/python-modules/lazy_import/default.nix
new file mode 100644
index 000000000000..f3812f0723d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lazy_import/default.nix
@@ -0,0 +1,42 @@
+{ lib, buildPythonPackage, fetchPypi
+, pytestCheckHook
+, pytest-forked
+, py
+, python
+, six }:
+
+buildPythonPackage rec {
+  pname = "lazy_import";
+  version = "0.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0gca9xj60qr3aprj9qdc66crr4r7hl8wzv6gc9y40nclazwawj91";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-forked
+    py
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  preCheck = ''
+    # avoid AttributeError: module 'py' has no attribute 'process'
+    export PYTHONPATH=${py}/${python.sitePackages}:$PYTHONPATH
+  '';
+
+  pytestFlagsArray = [
+    "--forked"
+  ];
+
+  meta = with lib; {
+    description = "A set of functions that load modules, and related attributes, in a lazy fashion";
+    homepage = "https://github.com/mnmelo/lazy_import";
+    license = licenses.gpl3Plus;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lc7001/default.nix b/nixpkgs/pkgs/development/python-modules/lc7001/default.nix
new file mode 100644
index 000000000000..6e0f565bdc98
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lc7001/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchPypi
+, pythonOlder
+, poetry-core
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "lc7001";
+  version = "1.0.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-I4I3vwW1kJsgLFPMGpe9hkD3iEeC3AqI4pCi6SCWPx4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "lc7001"
+  ];
+
+  meta = with lib; {
+    description = "Python module for interacting with Legrand LC7001";
+    homepage = "https://github.com/rtyle/lc7001";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lcgit/default.nix b/nixpkgs/pkgs/development/python-modules/lcgit/default.nix
new file mode 100644
index 000000000000..967ef29fe2a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lcgit/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "lcgit";
+  version = "0.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "cisagov";
+    repo = "lcgit";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-MYRqlfz2MRayBT7YGZmcyqJdoDRfENmgxk/TmhyoAlQ=";
+  };
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace " --cov" ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "lcgit"
+  ];
+
+  meta = with lib; {
+    description = "A pythonic Linear Congruential Generator iterator";
+    homepage = "https://github.com/cisagov/lcgit";
+    changelog = "https://github.com/cisagov/lcgit/releases/tag/v${version}";
+    license = licenses.cc0;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lcov_cobertura/default.nix b/nixpkgs/pkgs/development/python-modules/lcov_cobertura/default.nix
new file mode 100644
index 000000000000..a40265c76c88
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lcov_cobertura/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "lcov_cobertura";
+  version = "2.0.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xs40e/PuZ/jV0CDNZiYmo1lM8r5yfMY0qg0R+j9/E3Q=";
+  };
+
+  doCheck = true;
+  pythonImportsCheck = [
+    "lcov_cobertura"
+  ];
+
+  meta = {
+    description = "Converts code coverage from lcov format to Cobertura's XML format";
+    homepage = "https://eriwen.github.io/lcov-to-cobertura-xml/";
+    license = lib.licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ld2410-ble/default.nix b/nixpkgs/pkgs/development/python-modules/ld2410-ble/default.nix
new file mode 100644
index 000000000000..774e79e5ca29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ld2410-ble/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, async-timeout
+, bleak
+, bleak-retry-connector
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ld2410-ble";
+  version = "0.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "930913";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-wQnE2hNT0UOnPJbHq1eayIO8g0XRZvEH6V19DL6RqoA=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=ld2410_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    async-timeout
+    bleak
+    bleak-retry-connector
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ld2410_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for the LD2410B modules from HiLinks";
+    homepage = "https://github.com/930913/ld2410-ble";
+    changelog = "https://github.com/930913/ld2410-ble/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ldap3/default.nix b/nixpkgs/pkgs/development/python-modules/ldap3/default.nix
new file mode 100644
index 000000000000..530a8d7ec0dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ldap3/default.nix
@@ -0,0 +1,38 @@
+{ lib, fetchPypi, fetchpatch, buildPythonPackage, dos2unix, pyasn1 }:
+
+buildPythonPackage rec {
+  pname = "ldap3";
+  version = "2.9.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f3e7fc4718e3f09dda568b57100095e0ce58633bcabbed8667ce3f8fbaa4229f";
+  };
+
+  prePatch = ''
+    # patch fails to apply because of line endings
+    dos2unix ldap3/utils/asn1.py
+  '';
+
+  patches = [
+    # fix pyasn1 0.5.0 compability
+    # https://github.com/cannatag/ldap3/pull/983
+    (fetchpatch {
+      url = "https://github.com/cannatag/ldap3/commit/ca689f4893b944806f90e9d3be2a746ee3c502e4.patch";
+      hash = "sha256-A8qI0t1OV3bkKaSdhVWHFBC9MoSkWynqxpgznV+5gh8=";
+    })
+  ];
+
+  nativeBuildInputs = [ dos2unix ];
+
+  propagatedBuildInputs = [ pyasn1 ];
+
+  doCheck = false; # requires network
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/ldap3";
+    description = "A strictly RFC 4510 conforming LDAP V3 pure Python client library";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ldapdomaindump/default.nix b/nixpkgs/pkgs/development/python-modules/ldapdomaindump/default.nix
new file mode 100644
index 000000000000..5f8941047bb2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ldapdomaindump/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, dnspython
+, future
+, ldap3
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ldapdomaindump";
+  version = "0.9.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-mdzaFwUKllSZZuU7yJ5x2mcAlNU9lUKzsNAZfQNeb1I=";
+  };
+
+  propagatedBuildInputs = [
+    dnspython
+    future
+    ldap3
+  ];
+
+  # requires ldap server
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ldapdomaindump"
+  ];
+
+  meta = with lib; {
+    description = "Active Directory information dumper via LDAP";
+    homepage = "https://github.com/dirkjanm/ldapdomaindump/";
+    changelog = "https://github.com/dirkjanm/ldapdomaindump/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ldappool/default.nix b/nixpkgs/pkgs/development/python-modules/ldappool/default.nix
new file mode 100644
index 000000000000..a95db8650980
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ldappool/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pbr
+, python-ldap
+, prettytable
+, six
+, fixtures
+, testresources
+, testtools
+}:
+
+buildPythonPackage rec {
+  pname = "ldappool";
+  version = "3.0.0";
+
+  src = fetchPypi {
+    pname = "ldappool";
+    inherit version;
+    sha256 = "4bb59b7d6b11407f48ee01a781267e3c8ba98d91f426806ac7208612ae087b86";
+  };
+
+  postPatch = ''
+    # Tests run without most of the dependencies
+    echo "" > test-requirements.txt
+    # PrettyTable is now maintained again
+    substituteInPlace requirements.txt --replace "PrettyTable<0.8,>=0.7.2" "PrettyTable"
+  '';
+
+  nativeBuildInputs = [ pbr ];
+
+  propagatedBuildInputs = [ python-ldap prettytable six ];
+
+  nativeCheckInputs = [ fixtures testresources testtools ];
+
+  meta = with lib; {
+    description = "A simple connector pool for python-ldap";
+    homepage = "https://opendev.org/openstack/ldappool/";
+    license = with licenses; [ mpl11 lgpl21Plus gpl2Plus ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ldaptor/default.nix b/nixpkgs/pkgs/development/python-modules/ldaptor/default.nix
new file mode 100644
index 000000000000..e100690e6b7a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ldaptor/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, twisted
+, passlib
+, pyparsing
+, service-identity
+, six
+, zope_interface
+, pythonOlder
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "ldaptor";
+  version = "21.2.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jEnrGTddSqs+W4NYYGFODLF+VrtaIOGHSAj6W+xno1g=";
+  };
+
+  propagatedBuildInputs = [
+    passlib
+    pyparsing
+    six
+    twisted
+    zope_interface
+  ] ++ twisted.optional-dependencies.tls;
+
+  nativeCheckInputs = [
+    twisted
+  ];
+
+  # Test creates an excessive amount of temporary files (order of millions).
+  # Cleaning up those files already took over 15 hours already on my zfs
+  # filesystem and is not finished yet.
+  doCheck = false;
+
+  checkPhase = ''
+    trial -j$NIX_BUILD_CORES ldaptor
+  '';
+
+  meta = with lib; {
+    description = "A Pure-Python Twisted library for LDAP";
+    homepage = "https://github.com/twisted/ldaptor";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ldfparser/default.nix b/nixpkgs/pkgs/development/python-modules/ldfparser/default.nix
new file mode 100644
index 000000000000..f71543c828bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ldfparser/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, bitstruct
+, buildPythonPackage
+, fetchFromGitHub
+, jinja2
+, jsonschema
+, lark
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "ldfparser";
+  version = "0.21.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "c4deszes";
+    repo = "ldfparser";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-4uwze9TJYmNvhDiKYyUX6Ya+eQb0mbpQQaawUWmO3Gs=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    bitstruct
+    jinja2
+    lark
+  ];
+
+  nativeCheckInputs = [
+    jsonschema
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ldfparser"
+  ];
+
+  disabledTestPaths = [
+    # We don't care about benchmarks
+    "tests/test_performance.py"
+  ];
+
+  meta = with lib; {
+    description = "LIN Description File parser written in Python";
+    homepage = "https://github.com/c4deszes/ldfparser";
+    changelog = "https://github.com/c4deszes/ldfparser/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/leather/default.nix b/nixpkgs/pkgs/development/python-modules/leather/default.nix
new file mode 100644
index 000000000000..99977e7c6a2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/leather/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, six
+, cssselect
+, lxml
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "leather";
+  version = "0.3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b43e21c8fa46b2679de8449f4d953c06418666dc058ce41055ee8a8d3bb40918";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  nativeCheckInputs = [
+    cssselect
+    lxml
+    nose
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    nosetests
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    homepage = "http://leather.rtfd.io";
+    description = "Python charting library";
+    license = licenses.mit;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ vrthra ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/leb128/default.nix b/nixpkgs/pkgs/development/python-modules/leb128/default.nix
new file mode 100644
index 000000000000..b206de136219
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/leb128/default.nix
@@ -0,0 +1,24 @@
+{ buildPythonPackage, fetchFromGitHub, pytestCheckHook, lib }:
+
+buildPythonPackage rec {
+  pname = "leb128";
+  version = "1.0.5";
+
+  # fetchPypi doesn't include files required for tests
+  src = fetchFromGitHub {
+    owner = "mohanson";
+    repo = "leb128";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-zK14LPziBkvXAMzuPbcg/47caO/5GEYA9txAzCGfpS8=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [ "leb128" ];
+
+  meta = with lib; {
+    description = "A utility to encode and decode Little Endian Base 128";
+    homepage = "https://github.com/mohanson/leb128";
+    license = licenses.mit;
+    maintainers = with maintainers; [ urlordjames ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/led-ble/default.nix b/nixpkgs/pkgs/development/python-modules/led-ble/default.nix
new file mode 100644
index 000000000000..653d75a46da4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/led-ble/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, async-timeout
+, bleak
+, bleak-retry-connector
+, buildPythonPackage
+, fetchFromGitHub
+, flux-led
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "led-ble";
+  version = "1.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-8DBA01QjW99OVYI9zC1Q+utnwzc10idUG7y+lmUbO4A=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=led_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bleak
+    bleak-retry-connector
+    flux-led
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    async-timeout
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "led_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for LED BLE devices";
+    homepage = "https://github.com/Bluetooth-Devices/led-ble";
+    changelog = "https://github.com/Bluetooth-Devices/led-ble/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ledger-bitcoin/default.nix b/nixpkgs/pkgs/development/python-modules/ledger-bitcoin/default.nix
new file mode 100644
index 000000000000..c2ad7b47f6c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ledger-bitcoin/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, ledgercomm
+, packaging
+, bip32
+, coincurve
+, typing-extensions
+ }:
+
+buildPythonPackage rec {
+  pname = "ledger-bitcoin";
+  version = "0.2.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "ledger_bitcoin";
+    hash = "sha256-MEZuwIthIOwBkRdR7dEsEznO+GVBeOf7/5xmwNW1SvI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    ledgercomm
+    packaging
+    bip32
+    coincurve
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [
+    "ledger_bitcoin"
+  ];
+
+  meta = with lib; {
+    description = "Client library for Ledger Bitcoin application.";
+    homepage = "https://github.com/LedgerHQ/app-bitcoin-new/tree/develop/bitcoin_client/ledger_bitcoin";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ledger_agent/default.nix b/nixpkgs/pkgs/development/python-modules/ledger_agent/default.nix
new file mode 100644
index 000000000000..8a0ace126458
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ledger_agent/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ledgerblue
+, setuptools
+, libagent
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "ledger_agent";
+  version = "0.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "03zj602m2rln9yvr08dswy56vzkbldp8b074ixwzz525dafblr92";
+  };
+
+  propagatedBuildInputs = [
+    ledgerblue libagent setuptools wheel
+  ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Using Ledger as hardware-based SSH/PGP agent";
+    homepage = "https://github.com/romanz/trezor-agent";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ hkjn np mmahut ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ledgerblue/default.nix b/nixpkgs/pkgs/development/python-modules/ledgerblue/default.nix
new file mode 100644
index 000000000000..5a39ef7ecba4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ledgerblue/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, bleak
+, buildPythonPackage
+, ecpy
+, fetchPypi
+, future
+, hidapi
+, nfcpy
+, pillow
+, protobuf
+, pycrypto
+, pycryptodomex
+, pyelftools
+, python-u2flib-host
+, pythonOlder
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "ledgerblue";
+  version = "0.1.48";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-LVRNcsTmJOR3zTBhbKV4V0zCQk0sk/Uf6kSmfbAhgfY=";
+  };
+
+  propagatedBuildInputs = [
+    bleak
+    ecpy
+    future
+    hidapi
+    nfcpy
+    pillow
+    protobuf
+    pycrypto
+    pycryptodomex
+    pyelftools
+    python-u2flib-host
+    websocket-client
+  ];
+
+  # No tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ledgerblue"
+  ];
+
+  meta = with lib; {
+    description = "Python library to communicate with Ledger Blue/Nano S";
+    homepage = "https://github.com/LedgerHQ/blue-loader-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ np ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ledgercomm/default.nix b/nixpkgs/pkgs/development/python-modules/ledgercomm/default.nix
new file mode 100644
index 000000000000..15bac008f0d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ledgercomm/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, setuptools-scm
+ }:
+
+buildPythonPackage rec {
+  pname = "ledgercomm";
+  version = "1.2.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-HunJjIRa3IpSL/3pZPf6CroLxEK/l7ihh737VOAILgU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  pythonImportsCheck = [
+    "ledgercomm"
+  ];
+
+  meta = with lib; {
+    description = "Python library to send and receive APDU through HID or TCP socket. It can be used with a Ledger Nano S/X or with the Speculos emulator.";
+    homepage = "https://github.com/LedgerHQ/ledgercomm";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ledgerwallet/default.nix b/nixpkgs/pkgs/development/python-modules/ledgerwallet/default.nix
new file mode 100644
index 000000000000..c13f57ffd3f0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ledgerwallet/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchpatch
+, buildPythonPackage
+, cryptography
+, click
+, construct
+, ecdsa
+, flit-core
+, hidapi
+, intelhex
+, pillow
+, protobuf3
+, requests
+, setuptools
+, tabulate
+, toml
+, AppKit
+}:
+
+buildPythonPackage rec {
+  pname = "ledgerwallet";
+  version = "0.2.4";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "LedgerHQ";
+    repo = "ledgerctl";
+    rev = "v${version}";
+    hash = "sha256-IcStYYkKEdZxwgJKL8l2Y1BtO/Oncd4aKUAZD8umbHs=";
+  };
+
+  buildInputs = [ flit-core setuptools ] ++ lib.optionals stdenv.isDarwin [ AppKit ];
+  propagatedBuildInputs = [
+    cryptography
+    click
+    construct
+    ecdsa
+    hidapi
+    intelhex
+    pillow
+    protobuf3
+    requests
+    tabulate
+    toml
+  ];
+
+  pythonImportsCheck = [ "ledgerwallet" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/LedgerHQ/ledgerctl";
+    description = "A library to control Ledger devices";
+    license = licenses.mit;
+    maintainers = with maintainers; [ d-xo erdnaxe ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/leidenalg/default.nix b/nixpkgs/pkgs/development/python-modules/leidenalg/default.nix
new file mode 100644
index 000000000000..f1b55e0ae817
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/leidenalg/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, ddt
+, fetchPypi
+, igraph
+, igraph-c
+, pythonOlder
+, setuptools-scm
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "leidenalg";
+  version = "0.9.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-flz+O2+A8yuQ9V81xo1KmQsEibEoLPP6usjNpJiJdfM=";
+  };
+
+  postPatch = ''
+    substituteInPlace ./setup.py \
+      --replace "[\"/usr/include/igraph\", \"/usr/local/include/igraph\"]" \
+                "[\"${igraph-c.dev}/include/igraph\"]"
+
+    rm -r vendor
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    igraph
+    igraph-c
+  ];
+
+  checkInputs = [
+    ddt
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [ "leidenalg" ];
+
+  meta = with lib; {
+    description = "Implementation of the Leiden algorithm for various quality functions to be used with igraph in Python";
+    homepage = "https://leidenalg.readthedocs.io";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ jboy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/leveldb/default.nix b/nixpkgs/pkgs/development/python-modules/leveldb/default.nix
new file mode 100644
index 000000000000..212f13d00cf8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/leveldb/default.nix
@@ -0,0 +1,19 @@
+{ lib, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "leveldb";
+  version = "0.201";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1cffe776842917e09f073bd6ea5856c64136aebddbe51bd17ea29913472fecbf";
+  };
+
+  meta = with lib; {
+    homepage = "https://code.google.com/archive/p/py-leveldb/";
+    description = "Thread-safe Python bindings for LevelDB";
+    platforms = [ "x86_64-linux" "i686-linux" ];
+    license = licenses.bsd3;
+    maintainers = [ maintainers.aanderse ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/levenshtein/default.nix b/nixpkgs/pkgs/development/python-modules/levenshtein/default.nix
new file mode 100644
index 000000000000..037ae3cda69f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/levenshtein/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, cmake
+, cython_3
+, pytestCheckHook
+, rapidfuzz
+, rapidfuzz-cpp
+, scikit-build
+}:
+
+buildPythonPackage rec {
+  pname = "levenshtein";
+  version = "0.23.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "maxbachmann";
+    repo = "Levenshtein";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-O39Xe26WKAGcv6DEvwuOL8NZJBem5SYZDX1TPAY7/uA=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    cython_3
+    scikit-build
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  buildInputs = [
+    rapidfuzz-cpp
+  ];
+
+  env.NIX_CFLAGS_COMPILE = toString (lib.optionals (stdenv.cc.isClang && stdenv.isDarwin) [
+    "-fno-lto"  # work around https://github.com/NixOS/nixpkgs/issues/19098
+  ]);
+
+  propagatedBuildInputs = [
+    rapidfuzz
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "Levenshtein"
+  ];
+
+  meta = with lib; {
+    description = "Functions for fast computation of Levenshtein distance and string similarity";
+    homepage = "https://github.com/maxbachmann/Levenshtein";
+    changelog = "https://github.com/maxbachmann/Levenshtein/blob/${src.rev}/HISTORY.md";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lexid/default.nix b/nixpkgs/pkgs/development/python-modules/lexid/default.nix
new file mode 100644
index 000000000000..5ab5953aef62
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lexid/default.nix
@@ -0,0 +1,28 @@
+{ lib, pythonOlder, buildPythonPackage, fetchPypi, pytestCheckHook, click }:
+
+buildPythonPackage rec {
+  pname = "lexid";
+  version = "2021.1006";
+  disabled = pythonOlder "3.6";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "509a3a4cc926d3dbf22b203b18a4c66c25e6473fb7c0e0d30374533ac28bafe5";
+  };
+
+  prePatch = ''
+    # Disable lib3to6, since we're only building this on 3.6+ anyway.
+    substituteInPlace setup.py \
+      --replace 'if any(arg.startswith("bdist") for arg in sys.argv):' 'if False:'
+  '';
+
+  propagatedBuildInputs = [ click ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "micro library to increment lexically ordered numerical ids";
+    homepage = "https://pypi.org/project/lexid/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kfollesdal ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libagent/default.nix b/nixpkgs/pkgs/development/python-modules/libagent/default.nix
new file mode 100644
index 000000000000..61d58ea468c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libagent/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, fetchFromGitHub
+, bech32
+, buildPythonPackage
+, cryptography
+, ed25519
+, ecdsa
+, gnupg
+, semver
+, mnemonic
+, unidecode
+, mock
+, pytest
+, backports-shutil-which
+, configargparse
+, python-daemon
+, pymsgbox
+, pynacl
+}:
+
+# XXX: when changing this package, please test the package onlykey-agent.
+
+buildPythonPackage rec {
+  pname = "libagent";
+  version = "0.14.5";
+
+  src = fetchFromGitHub {
+    owner = "romanz";
+    repo = "trezor-agent";
+    rev = "v${version}";
+    hash = "sha256-RISAy0efdatr9u4CWNRGnlffkC8ksw1NyRpJWKwqz+s=";
+  };
+
+  # hardcode the path to gpgconf in the libagent library
+  postPatch = ''
+    substituteInPlace libagent/gpg/keyring.py \
+      --replace "util.which('gpgconf')" "'${gnupg}/bin/gpgconf'" \
+      --replace "'gpg-connect-agent'" "'${gnupg}/bin/gpg-connect-agent'"
+  '';
+
+  propagatedBuildInputs = [
+    unidecode
+    backports-shutil-which
+    configargparse
+    python-daemon
+    pymsgbox
+    ecdsa
+    ed25519
+    mnemonic
+    semver
+    pynacl
+    bech32
+    cryptography
+  ];
+
+  nativeCheckInputs = [ mock pytest ];
+
+  checkPhase = ''
+    py.test libagent/tests
+  '';
+
+  meta = with lib; {
+    description = "Using hardware wallets as SSH/GPG agent";
+    homepage = "https://github.com/romanz/trezor-agent";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ np ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libais/default.nix b/nixpkgs/pkgs/development/python-modules/libais/default.nix
new file mode 100644
index 000000000000..ba42d47d346d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libais/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "libais";
+  version = "0.17";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6yrqIpjF6XaSfXSOTA0B4f3aLcHXkgA/3WBZBBNQ018=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'," ""
+  '';
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # data files missing
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ais"
+  ];
+
+  meta = with lib; {
+    description = "Library for decoding maritime Automatic Identification System messages";
+    homepage = "https://github.com/schwehr/libais";
+    changelog = "https://github.com/schwehr/libais/blob/master/Changelog.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libarchive-c/default.nix b/nixpkgs/pkgs/development/python-modules/libarchive-c/default.nix
new file mode 100644
index 000000000000..43f2e11ef3df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libarchive-c/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, libarchive
+, glibcLocales
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "libarchive-c";
+  version = "5.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Changaco";
+    repo = "python-${pname}";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-8e3Tnek5q5NJneSVIrbFNTQPjHZ7Ieb14uiKjQwufTE=";
+  };
+
+  LC_ALL="en_US.UTF-8";
+
+  postPatch = ''
+    substituteInPlace libarchive/ffi.py --replace \
+      "find_library('archive')" "'${libarchive.lib}/lib/libarchive${stdenv.hostPlatform.extensions.sharedLibrary}'"
+  '';
+
+  pythonImportsCheck = [
+    "libarchive"
+  ];
+
+  nativeCheckInputs = [
+    glibcLocales
+    mock
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Changaco/python-libarchive-c";
+    description = "Python interface to libarchive";
+    license = licenses.cc0;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libarcus/default.nix b/nixpkgs/pkgs/development/python-modules/libarcus/default.nix
new file mode 100644
index 000000000000..0230e68007de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libarcus/default.nix
@@ -0,0 +1,43 @@
+{ lib, buildPythonPackage, python, fetchFromGitHub
+, fetchpatch
+, cmake, sip_4, protobuf, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "libarcus";
+  version = "4.12.0";
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "Ultimaker";
+    repo = "libArcus";
+    rev = version;
+    hash = "sha256-X33ptwYj9YkVWqUDPP+Ic+hoIb+rwsLdQXvHLA9z+3w=";
+  };
+
+  patches = [
+    # Fix build against protobuf 3.18+
+    # https://github.com/Ultimaker/libArcus/issues/121
+    (fetchpatch {
+      url = "https://raw.githubusercontent.com/coryan/vcpkg/f69b85aa403b04e7d442c90db3418d484e44024f/ports/arcus/0001-fix-protobuf-deprecated.patch";
+      sha256 = "0bqj7pxzpwsamknd6gadj419x6mwx8wnlfzg4zqn6cax3cmasjb2";
+    })
+  ];
+
+  disabled = pythonOlder "3.4";
+
+  propagatedBuildInputs = [ sip_4 ];
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ protobuf ];
+
+  postPatch = ''
+    sed -i 's#''${Python3_SITEARCH}#${placeholder "out"}/${python.sitePackages}#' cmake/SIPMacros.cmake
+  '';
+
+  meta = with lib; {
+    description = "Communication library between internal components for Ultimaker software";
+    homepage = "https://github.com/Ultimaker/libArcus";
+    license = licenses.lgpl3Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ abbradar gebner ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libasyncns/default.nix b/nixpkgs/pkgs/development/python-modules/libasyncns/default.nix
new file mode 100644
index 000000000000..bd28c2207340
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libasyncns/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchurl
+, libasyncns
+, pkg-config
+}:
+
+buildPythonPackage rec {
+  pname = "libasyncns-python";
+  version = "0.7.1";
+
+  src = fetchurl {
+    url = "https://launchpad.net/libasyncns-python/trunk/${version}/+download/libasyncns-python-${version}.tar.bz2";
+    sha256 = "1q4l71b2h9q756x4pjynp6kczr2d8c1jvbdp982hf7xzv7w5gxqg";
+  };
+
+  patches = [ ./libasyncns-fix-res-consts.patch ];
+
+  postPatch = lib.optionalString stdenv.isDarwin ''
+    substituteInPlace resquery.c \
+      --replace '<arpa/nameser.h>' '<arpa/nameser_compat.h>'
+  '';
+
+  buildInputs = [ libasyncns ];
+  nativeBuildInputs = [ pkg-config ];
+  doCheck = false; # requires network access
+
+  pythonImportsCheck = [ "libasyncns" ];
+
+  meta = with lib; {
+    description = "libasyncns-python is a python binding for the asynchronous name service query library";
+    license = licenses.lgpl21;
+    maintainers = [ maintainers.mic92 ];
+    homepage = "https://launchpad.net/libasyncns-python";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libasyncns/libasyncns-fix-res-consts.patch b/nixpkgs/pkgs/development/python-modules/libasyncns/libasyncns-fix-res-consts.patch
new file mode 100644
index 000000000000..62877300a276
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libasyncns/libasyncns-fix-res-consts.patch
@@ -0,0 +1,14 @@
+diff --git a/libasyncns.c b/libasyncns.c
+index 99a73de..85709b0 100644
+--- a/libasyncns.c
++++ b/libasyncns.c
+@@ -134,9 +134,8 @@ PyMODINIT_FUNC initlibasyncns(void)
+ 	ADDNSCONST(ns_t_mailb);
+ 	ADDNSCONST(ns_t_maila);
+ 	ADDNSCONST(ns_t_any);
+-	ADDNSCONST(ns_t_zxfr);
+ 	ADDNSCONST(ns_t_max);
+ 	
+ 	ADDNSCONST(ns_c_invalid);
+ 	ADDNSCONST(ns_c_in);
+ 	ADDNSCONST(ns_c_2);
diff --git a/nixpkgs/pkgs/development/python-modules/libclang/default.nix b/nixpkgs/pkgs/development/python-modules/libclang/default.nix
new file mode 100644
index 000000000000..24d0e287ea03
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libclang/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, llvmPackages
+, setuptools
+, writeText
+}:
+
+let
+  libclang = llvmPackages.libclang;
+
+  pyproject_toml = writeText "pyproject.toml" ''
+    [build-system]
+    requires = ["setuptools>=42", "wheel"]
+    build-backend = "setuptools.build_meta"
+  '';
+
+  setup_cfg = writeText "setup.cfg" ''
+    [metadata]
+    name = clang
+    version = ${libclang.version}
+
+    [options]
+    packages = clang
+  '';
+in buildPythonPackage {
+  pname = "libclang";
+  format = "pyproject";
+
+  inherit (libclang) version src;
+
+  buildInputs = [ setuptools ];
+
+  postUnpack = ''
+    # set source root to python bindings
+    if [ -e "$sourceRoot/clang/bindings/python" ]; then
+      # LLVM 13+ puts clang sources in subdirectory instead of plain tarball
+      sourceRoot="$sourceRoot/clang/bindings/python"
+    else
+      sourceRoot="$sourceRoot/bindings/python"
+    fi
+  '';
+
+  postPatch = ''
+    # link in our own build info to build as a python package
+    ln -s ${pyproject_toml} ./pyproject.toml
+    ln -s ${setup_cfg} ./setup.cfg
+
+    # set passed libclang for runtime
+    echo 'Config.set_library_path("${lib.getLib libclang}/lib")' >>./clang/cindex.py
+  '';
+
+  meta = libclang.meta // {
+    description = "Python bindings for the C language family frontend for LLVM";
+    maintainers = with lib.maintainers; [ lilyinstarlight ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libcloud/default.nix b/nixpkgs/pkgs/development/python-modules/libcloud/default.nix
new file mode 100644
index 000000000000..2361768258df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libcloud/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pycrypto
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "apache-libcloud";
+  version = "3.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-FIqeUAaWVEMqfTSZeVTpFDTdOOv2iDLrnHXUQrPmL60=";
+  };
+
+  propagatedBuildInputs = [
+    pycrypto
+    requests
+  ];
+
+  preConfigure = ''
+    cp libcloud/test/secrets.py-dist libcloud/test/secrets.py
+  '';
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "setup_requires=pytest_runner," "setup_requires=[],"
+  '';
+
+  # requires a certificates file
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "libcloud"
+  ];
+
+  meta = with lib; {
+    description = "A unified interface to many cloud providers";
+    homepage = "https://libcloud.apache.org/";
+    changelog = "https://github.com/apache/libcloud/blob/v${version}/CHANGES.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libcst/default.nix b/nixpkgs/pkgs/development/python-modules/libcst/default.nix
new file mode 100644
index 000000000000..abad21fe6760
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libcst/default.nix
@@ -0,0 +1,99 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, cargo
+, hypothesis
+, libiconv
+, pytestCheckHook
+, python
+, pythonOlder
+, pyyaml
+, rustPlatform
+, rustc
+, setuptools-rust
+, setuptools-scm
+, typing-extensions
+, typing-inspect
+}:
+
+buildPythonPackage rec {
+  pname = "libcst";
+  version = "1.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "instagram";
+    repo = "libcst";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-kFs7edBWz0GRbgbLDmtpUVi5R+6mYXsJSvceOoPW9ck=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    sourceRoot = "${src.name}/${cargoRoot}";
+    name = "${pname}-${version}";
+    hash = "sha256-fhaHiz64NH6S61fSXj4gNxxcuB+ECxWSSmG5StiFr1k=";
+  };
+
+  cargoRoot = "native";
+
+  postPatch = ''
+    # avoid infinite recursion by not formatting the release files
+    substituteInPlace libcst/codegen/generate.py \
+      --replace '"ufmt"' '"true"'
+  '';
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-rust
+    setuptools-scm
+    rustPlatform.cargoSetupHook
+    cargo
+    rustc
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv ];
+
+  propagatedBuildInputs = [
+    typing-extensions
+    typing-inspect
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    # otherwise import libcst.native fails
+    cp build/lib.*/libcst/native.* libcst/
+
+    ${python.interpreter} -m libcst.codegen.generate visitors
+    ${python.interpreter} -m libcst.codegen.generate return_types
+
+    # Can't run all tests due to circular dependency on hypothesmith -> libcst
+    rm -r {libcst/tests,libcst/codegen/tests,libcst/m*/tests}
+  '';
+
+  disabledTests = [
+    # No files are generated
+    "test_codemod_formatter_error_input"
+  ];
+
+  pythonImportsCheck = [
+    "libcst"
+  ];
+
+  meta = with lib; {
+    description = "Concrete Syntax Tree (CST) parser and serializer library for Python";
+    homepage = "https://github.com/Instagram/libcst";
+    changelog = "https://github.com/Instagram/LibCST/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit asl20 psfl ];
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libevdev/default.nix b/nixpkgs/pkgs/development/python-modules/libevdev/default.nix
new file mode 100644
index 000000000000..5f63653e3c43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libevdev/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchPypi
+, substituteAll
+, pkgs
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "libevdev";
+  version = "0.11";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6coAak3ySIpgvZp0ABHulI2BkEviNk8BflYBaVCPVg8=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      libevdev = lib.getLib pkgs.libevdev;
+    })
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Python wrapper around the libevdev C library";
+    homepage = "https://gitlab.freedesktop.org/libevdev/python-libevdev";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nickhu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libevdev/fix-paths.patch b/nixpkgs/pkgs/development/python-modules/libevdev/fix-paths.patch
new file mode 100644
index 000000000000..e73c360b1460
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libevdev/fix-paths.patch
@@ -0,0 +1,22 @@
+diff --git a/libevdev/_clib.py b/libevdev/_clib.py
+index 6e4ab2c..9db54d1 100644
+--- a/libevdev/_clib.py
++++ b/libevdev/_clib.py
+@@ -120,7 +120,7 @@ class Libevdev(_LibraryWrapper):
+ 
+     @staticmethod
+     def _cdll():
+-        return ctypes.CDLL("libevdev.so.2", use_errno=True)
++        return ctypes.CDLL("@libevdev@/lib/libevdev.so.2", use_errno=True)
+ 
+     _api_prototypes = {
+         # const char *libevdev_event_type_get_name(unsigned int type);
+@@ -910,7 +910,7 @@ class UinputDevice(_LibraryWrapper):
+ 
+     @staticmethod
+     def _cdll():
+-        return ctypes.CDLL("libevdev.so.2", use_errno=True)
++        return ctypes.CDLL("@libevdev@/lib/libevdev.so.2", use_errno=True)
+ 
+     _api_prototypes = {
+         # int libevdev_uinput_create_from_device(const struct libevdev *, int, struct libevdev_uinput **)
diff --git a/nixpkgs/pkgs/development/python-modules/libgpiod/default.nix b/nixpkgs/pkgs/development/python-modules/libgpiod/default.nix
new file mode 100644
index 000000000000..56f225d283ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libgpiod/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, libgpiod
+}:
+buildPythonPackage {
+  inherit (libgpiod) pname version src;
+  format = "setuptools";
+
+  buildInputs = [ libgpiod ];
+
+  preConfigure = ''
+    cd bindings/python
+  '';
+
+  # Requires libgpiod built with --enable-tests
+  doCheck = false;
+  pythonImportsCheck = [ "gpiod" ];
+
+  meta = with lib; {
+    description = "Python bindings for libgpiod";
+    homepage = "https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git/about/";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ lopsided98 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libgpuarray/default.nix b/nixpkgs/pkgs/development/python-modules/libgpuarray/default.nix
new file mode 100644
index 000000000000..699bbabdfc76
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libgpuarray/default.nix
@@ -0,0 +1,87 @@
+{ stdenv
+, lib
+, addOpenGLRunpath
+, buildPythonPackage
+, fetchFromGitHub
+, cmake
+, cython
+, numpy
+, six
+, nose
+, mako
+, config
+, cudaSupport ? config.cudaSupport
+, cudaPackages ? { }
+, openclSupport ? true, ocl-icd, clblas
+}:
+
+buildPythonPackage rec {
+  pname = "libgpuarray";
+  version = "0.7.6";
+
+  src = fetchFromGitHub {
+    owner = "Theano";
+    repo = "libgpuarray";
+    rev = "v${version}";
+    sha256 = "0ksil18c9ign4xrv5k323flhvdy6wdxh8szdd3nivv31jc3zsdri";
+  };
+
+  # requires a GPU
+  doCheck = false;
+
+  configurePhase = "cmakeConfigurePhase";
+
+  libraryPath = lib.makeLibraryPath (
+    lib.optionals cudaSupport (with cudaPackages; [ cudatoolkit.lib cudatoolkit.out ])
+    ++ lib.optionals openclSupport ([ clblas ] ++ lib.optional (!stdenv.isDarwin) ocl-icd)
+  );
+
+  preBuild = ''
+    make -j$NIX_BUILD_CORES
+    make install
+
+    export NIX_CFLAGS_COMPILE="-L $out/lib -I $out/include $NIX_CFLAGS_COMPILE"
+
+    cd ..
+  '';
+
+  postFixup = ''
+    rm $out/lib/libgpuarray-static.a
+  '' + lib.optionalString (!stdenv.isDarwin) ''
+    function fixRunPath {
+      p=$(patchelf --print-rpath $1)
+      patchelf --set-rpath "$p:$libraryPath" $1
+    }
+
+    fixRunPath $out/lib/libgpuarray.so
+  '' + lib.optionalString cudaSupport ''
+    addOpenGLRunpath $out/lib/libgpuarray.so
+  '';
+
+  propagatedBuildInputs = [
+    numpy
+    six
+    mako
+  ];
+
+  nativeBuildInputs = [
+    cmake
+  ] ++ lib.optionals cudaSupport [
+    addOpenGLRunpath
+  ];
+
+
+  buildInputs = [
+    cython
+    nose
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Theano/libgpuarray";
+    description = "Library to manipulate tensors on GPU.";
+    license = licenses.free;
+    maintainers = with maintainers; [ artuuge ];
+    platforms = platforms.unix;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libkeepass/default.nix b/nixpkgs/pkgs/development/python-modules/libkeepass/default.nix
new file mode 100644
index 000000000000..aa922db9c102
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libkeepass/default.nix
@@ -0,0 +1,24 @@
+{ lib, fetchPypi, buildPythonPackage
+, lxml, pycryptodome, colorama }:
+
+buildPythonPackage rec {
+  pname = "libkeepass";
+  version = "0.3.1.post1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0pwg7n9xqcjia1qmz6g48h5s31slh3mxmcqag73gq4zhl4xb6bai";
+  };
+
+  propagatedBuildInputs = [ lxml pycryptodome colorama ];
+
+  # No tests on PyPI
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/libkeepass/libkeepass";
+    description = "A library to access KeePass 1.x/KeePassX (v3) and KeePass 2.x (v4) files";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ jqueiroz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libknot/default.nix b/nixpkgs/pkgs/development/python-modules/libknot/default.nix
new file mode 100644
index 000000000000..1913d0765133
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libknot/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+
+# build-system
+, hatchling
+
+# native dependencies
+, knot-dns
+}:
+
+buildPythonPackage rec {
+  pname = "libknot";
+  version = "3.3.2";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uttdIl2ONoR9ba6gJXmJkU++UQldcezwTUG+X5mCcbE=";
+  };
+
+  postPatch = ''
+    substituteInPlace libknot/__init__.py \
+      --replace "libknot%s.dylib" "${lib.getLib knot-dns}/lib/libknot%s.dylib" \
+      --replace "libknot.so%s" "${lib.getLib knot-dns}/lib/libknot.so%s"
+  '';
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  pythonImportsCheck = [
+    "libknot"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for libknot";
+    homepage = "https://gitlab.nic.cz/knot/knot-dns/-/tree/master/python/libknot";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ hexa ];
+    mainProgram = "libknot";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/liblarch/default.nix b/nixpkgs/pkgs/development/python-modules/liblarch/default.nix
new file mode 100644
index 000000000000..45c020b53720
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/liblarch/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, python
+, pygobject3
+, xvfb-run
+, gobject-introspection
+, gtk3
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  version = "3.2.0";
+  pname = "liblarch";
+  disabled = pythonOlder "3.5.0";
+
+  src = fetchFromGitHub {
+    owner = "getting-things-gnome";
+    repo = "liblarch";
+    rev = "v${version}";
+    hash = "sha256-A2qChe2z6rAhjRVX5VoHQitebf/nMATdVZQgtlquuYg=";
+  };
+
+  nativeCheckInputs = [
+    gobject-introspection # for setup hook
+    gtk3
+  ];
+
+  buildInputs = [ gtk3 ];
+
+  propagatedBuildInputs = [
+    pygobject3
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${xvfb-run}/bin/xvfb-run -s '-screen 0 800x600x24' \
+      ${python.interpreter} nix_run_setup test
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "A python library built to easily handle data structure such are lists, trees and acyclic graphs";
+    homepage = "https://github.com/getting-things-gnome/liblarch";
+    downloadPage = "https://github.com/getting-things-gnome/liblarch/releases";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ oyren ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/liblzfse/default.nix b/nixpkgs/pkgs/development/python-modules/liblzfse/default.nix
new file mode 100644
index 000000000000..687d1df765b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/liblzfse/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, lzfse
+}:
+buildPythonPackage rec {
+  pname = "pyliblzfse";
+  version = "0.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bb0b899b3830c02fdf3dbde48ea59611833f366fef836e5c32cf8145134b7d3d";
+  };
+
+  preBuild = ''
+    rm -r lzfse
+    ln -s ${lzfse.src} lzfse
+  '';
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "liblzfse"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for LZFSE";
+    homepage = "https://github.com/ydkhatri/pyliblzfse";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libmr/default.nix b/nixpkgs/pkgs/development/python-modules/libmr/default.nix
new file mode 100644
index 000000000000..d775cc7b245b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libmr/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, numpy, cython }:
+
+buildPythonPackage rec {
+  pname = "libmr";
+  version = "0.1.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "43ccd86693b725fa3abe648c8cdcef17ba5fa46b5528168829e5f9b968dfeb70";
+  };
+
+  propagatedBuildInputs = [ numpy cython ];
+
+  # No tests in the pypi tarball
+  doCheck = false;
+
+  meta = with lib; {
+    description = "libMR provides core MetaRecognition and Weibull fitting functionality";
+    homepage = "https://github.com/Vastlab/libMR";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/libnacl/default.nix b/nixpkgs/pkgs/development/python-modules/libnacl/default.nix
new file mode 100644
index 000000000000..ec6d1e442564
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libnacl/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, libsodium
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "libnacl";
+  version = "2.1.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "saltstack";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-phECLGDcBfDi/r2y0eGtqgIX/hvirtBqO8UUvEJ66zo=";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+
+  buildInputs = [ libsodium ];
+
+  postPatch =
+    let soext = stdenv.hostPlatform.extensions.sharedLibrary; in
+    ''
+      substituteInPlace "./libnacl/__init__.py" \
+        --replace \
+          "l_path = ctypes.util.find_library('sodium')" \
+          "l_path = None" \
+        --replace \
+          "ctypes.cdll.LoadLibrary('libsodium${soext}')" \
+          "ctypes.cdll.LoadLibrary('${libsodium}/lib/libsodium${soext}')"
+    '';
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "libnacl" ];
+
+  meta = with lib; {
+    description = "Python bindings for libsodium based on ctypes";
+    homepage = "https://libnacl.readthedocs.io/";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ xvapx ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libpcap/default.nix b/nixpkgs/pkgs/development/python-modules/libpcap/default.nix
new file mode 100644
index 000000000000..d094e7715fca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libpcap/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, dbus
+, pkgsLibpcap
+, pkg-about
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "libpcap";
+  version = "1.11.0b7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-gEWFqmeOJTVHdjcSOxfVLZtrNSO3CTY1L2VcXOu7q7k=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  # tox is listed in build requirements but not actually used to build
+  # keeping it as a requirement breaks the build unnecessarily
+  postPatch = ''
+    sed  -i "/requires/s/, 'tox>=3.25.1'//"  pyproject.toml
+    cat <<EOF >src/libpcap/libpcap.cfg
+    [libpcap]
+    LIBPCAP = ${pkgsLibpcap}/lib/libpcap${stdenv.hostPlatform.extensions.sharedLibrary}
+    EOF
+  '';
+
+  propagatedBuildInputs = [
+    dbus.lib
+    pkgsLibpcap
+    pkg-about
+  ];
+
+  # Project has tests, but I can't get them to run even outside of nix
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "libpcap"
+  ];
+
+  meta = with lib; {
+    description = "Python binding for the libpcap C library";
+    longDescription = ''
+      Python libpcap module is a low-level binding for libpcap C library.
+
+      It is an effort to allow python programs full access to the API provided by the well known libpcap Unix C library and by its implementations provided under Win32 systems by such packet capture systems as: Npcap, WinPcap
+
+      libpcap is a lightweight Python package, based on the ctypes library.
+
+      It is fully compliant implementation of the original C libpcap from 1.0.0 up to 1.9.0 API and the WinPcap’s 4.1.3 libpcap (1.0.0rel0b) API by implementing whole its functionality in a clean Python instead of C.
+    '';
+    homepage = "https://github.com/karpierz/libpcap/";
+    license = licenses.bsd3;
+    maintainers = [ teams.ororatech ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libpurecool/default.nix b/nixpkgs/pkgs/development/python-modules/libpurecool/default.nix
new file mode 100644
index 000000000000..aa523d9a98bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libpurecool/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, netifaces
+, paho-mqtt
+, pycryptodome
+, requests
+, six
+, zeroconf
+}:
+
+buildPythonPackage rec {
+  pname = "libpurecool";
+  version = "0.6.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1kwbinbg0i4fca1bpx6jwa1fiw71vg0xa89jhq4pmnl5cn9c8kqx";
+  };
+
+  # Remove vendorized zeroconf, https://github.com/etheralm/libpurecool/issues/33
+  postPatch = ''
+    rm libpurecool/zeroconf.py
+    substituteInPlace libpurecool/dyson_pure_cool_link.py \
+      --replace "from .zeroconf import ServiceBrowser, Zeroconf" "from zeroconf import ServiceBrowser, Zeroconf"
+  '';
+
+  propagatedBuildInputs = [
+    netifaces
+    paho-mqtt
+    pycryptodome
+    requests
+    six
+    zeroconf
+  ];
+
+  # Tests are only present in repo, https://github.com/etheralm/libpurecool/issues/36
+  doCheck = false;
+  pythonImportsCheck = [ "libpurecool" ];
+
+  meta = with lib; {
+    description = "Python library for Dyson devices";
+    homepage = "http://libpurecool.readthedocs.io";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libpyfoscam/default.nix b/nixpkgs/pkgs/development/python-modules/libpyfoscam/default.nix
new file mode 100644
index 000000000000..472c53f72ca9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libpyfoscam/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "libpyfoscam";
+  version = "1.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-FLPerVzx2+3f5biiqt0JHJjBuMIalUBkY+bGb2ShVao=";
+  };
+
+  # tests need access to a camera
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "libpyfoscam"
+  ];
+
+  meta = with lib; {
+    description = "Python Library for Foscam IP Cameras";
+    homepage = "https://github.com/krmarien/python-foscam";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libpyvivotek/default.nix b/nixpkgs/pkgs/development/python-modules/libpyvivotek/default.nix
new file mode 100644
index 000000000000..9a4cda0ae684
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libpyvivotek/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+, vcrpy
+}:
+
+buildPythonPackage rec {
+  pname = "libpyvivotek";
+  version = "0.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "HarlemSquirrel";
+    repo = "python-vivotek";
+    rev = "v${version}";
+    sha256 = "pNlnGpDjdYE7Lxog8GGZV+UZZmfmt5bwHof5LngPQjg=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    vcrpy
+  ];
+
+  pythonImportsCheck = [
+    "libpyvivotek"
+  ];
+
+  meta = with lib; {
+    description = "Python Library for Vivotek IP Cameras";
+    homepage = "https://github.com/HarlemSquirrel/python-vivotek";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/librespot/default.nix b/nixpkgs/pkgs/development/python-modules/librespot/default.nix
new file mode 100644
index 000000000000..97277f68a981
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/librespot/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, defusedxml
+, fetchFromGitHub
+, protobuf
+, pycryptodomex
+, pyogg
+, pytestCheckHook
+, pythonRelaxDepsHook
+, requests
+, websocket-client
+, zeroconf
+}:
+
+buildPythonPackage rec {
+  pname = "librespot";
+  version = "0.0.9";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "kokarare1212";
+    repo = "librespot-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-k9qVsxjRlUZ7vCBx00quiAR7S+YkfyoZiAKVnOOG4xM=";
+  };
+
+  pythonRelaxDeps = true;
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    defusedxml
+    protobuf
+    pycryptodomex
+    pyogg
+    requests
+    websocket-client
+    zeroconf
+  ];
+
+  # Doesn't include any tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "librespot"
+  ];
+
+  meta = with lib; {
+    description = "Open Source Spotify Client";
+    homepage = "https://github.com/kokarare1212/librespot-python";
+    changelog = "https://github.com/kokarare1212/librespot-python/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libretranslate/default.nix b/nixpkgs/pkgs/development/python-modules/libretranslate/default.nix
new file mode 100644
index 000000000000..12e33f45895f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libretranslate/default.nix
@@ -0,0 +1,94 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, argostranslate
+, flask
+, flask-swagger
+, flask-swagger-ui
+, flask-limiter
+, flask-babel
+, flask-session
+, waitress
+, expiringdict
+, ltpycld2
+, morfessor
+, appdirs
+, apscheduler
+, translatehtml
+, argos-translate-files
+, requests
+, redis
+, prometheus-client
+, polib
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "libretranslate";
+  version = "1.3.11";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "LibreTranslate";
+    repo = "LibreTranslate";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-S2J7kcoZFHOjVm2mb3TblWf9/FzkxZEB3h27BCaPYgY=";
+  };
+
+  propagatedBuildInputs = [
+    argostranslate
+    flask
+    flask-swagger
+    flask-swagger-ui
+    flask-limiter
+    flask-babel
+    flask-session
+    waitress
+    expiringdict
+    ltpycld2
+    morfessor
+    appdirs
+    apscheduler
+    translatehtml
+    argos-translate-files
+    requests
+    redis
+    prometheus-client
+    polib
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements.txt  \
+      --replace "==" ">="
+
+    substituteInPlace setup.py  \
+      --replace "'pytest-runner'" ""
+  '';
+
+  postInstall = ''
+    # expose static files to be able to serve them via web-server
+    mkdir -p $out/share/libretranslate
+    ln -s $out/${python.sitePackages}/libretranslate/static $out/share/libretranslate/static
+  '';
+
+  doCheck = false; # needs network access
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # required for import check to work (argostranslate)
+  env.HOME = "/tmp";
+
+  pythonImportsCheck = [ "libretranslate" ];
+
+  meta = with lib; {
+    description = "Free and Open Source Machine Translation API. Self-hosted, no limits, no ties to proprietary services";
+    homepage = "https://libretranslate.com";
+    changelog = "https://github.com/LibreTranslate/LibreTranslate/releases/tag/v${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ misuzu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/librosa/default.nix b/nixpkgs/pkgs/development/python-modules/librosa/default.nix
new file mode 100644
index 000000000000..a93b6b0d99cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/librosa/default.nix
@@ -0,0 +1,119 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+
+# build-system
+, setuptools
+
+# runtime
+, audioread
+, decorator
+, joblib
+, lazy-loader
+, matplotlib
+, msgpack
+, numba
+, numpy
+, pooch
+, scikit-learn
+, scipy
+, soundfile
+, soxr
+, typing-extensions
+
+# tests
+, ffmpeg-headless
+, packaging
+, pytest-mpl
+, pytestCheckHook
+, resampy
+, samplerate
+}:
+
+buildPythonPackage rec {
+  pname = "librosa";
+  version = "0.10.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "librosa";
+    repo = "librosa";
+    rev = "refs/tags/${version}";
+    fetchSubmodules = true; # for test data
+    hash = "sha256-zbmU87hI9A1CVcBZ/5FU8z0t6SS4jfJk9bj9kLe/EHI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  patches = [
+    (fetchpatch {
+      # https://github.com/librosa/librosa/issues/1754
+      # https://github.com/librosa/librosa/pull/1755
+      name = "matplotlib-3.8-compat.patch";
+      url = "https://github.com/librosa/librosa/commit/beef47885ce1255b43b65e48ea2054ddace37c6c.patch";
+      hash = "sha256-rrnlUHXHY2me4BWGs3wFq8WJmz75CbXTWKFp3VdJKzE=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov-report term-missing --cov librosa --cov-report=xml " ""
+  '';
+
+  propagatedBuildInputs = [
+    audioread
+    decorator
+    joblib
+    lazy-loader
+    msgpack
+    numba
+    numpy
+    pooch
+    scipy
+    scikit-learn
+    soundfile
+    soxr
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies.matplotlib = [
+    matplotlib
+  ];
+
+  # check that import works, this allows to capture errors like https://github.com/librosa/librosa/issues/1160
+  pythonImportsCheck = [
+    "librosa"
+  ];
+
+  nativeCheckInputs = [
+    ffmpeg-headless
+    packaging
+    pytest-mpl
+    pytestCheckHook
+    resampy
+    samplerate
+  ] ++ passthru.optional-dependencies.matplotlib;
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  disabledTests = [
+    # requires network access
+    "test_example"
+    "test_example_info"
+    "test_load_resample"
+  ];
+
+  meta = with lib; {
+    description = "Python library for audio and music analysis";
+    homepage = "https://github.com/librosa/librosa";
+    changelog = "https://github.com/librosa/librosa/releases/tag/${version}";
+    license = licenses.isc;
+    maintainers = with maintainers; [ GuillaumeDesforges ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/librouteros/default.nix b/nixpkgs/pkgs/development/python-modules/librouteros/default.nix
new file mode 100644
index 000000000000..c59af697b5f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/librouteros/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, pytestCheckHook
+, pytest-xdist
+}:
+
+buildPythonPackage rec {
+  pname = "librouteros";
+  version = "3.2.1";
+  format = "setuptools";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "luqasz";
+    repo = pname;
+    rev = version;
+    hash = "sha256-VwpZ1RY6Sul7xvWY7ZoOxZ7KgbRmKRwcVdF9e2b3f6Q=";
+  };
+
+  nativeCheckInputs = [
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Disable tests which require QEMU to run
+    "test_login"
+    "test_long_word"
+    "test_query"
+    "test_add_then_remove"
+    "test_add_then_update"
+    "test_generator_ditch"
+  ];
+
+  pythonImportsCheck = [
+    "librouteros"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of the MikroTik RouterOS API";
+    homepage = "https://librouteros.readthedocs.io/";
+    license = with licenses; [ gpl2Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libsass/default.nix b/nixpkgs/pkgs/development/python-modules/libsass/default.nix
new file mode 100644
index 000000000000..8a6bc5106636
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libsass/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, libsass
+, six
+, pytestCheckHook
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "libsass";
+  version = "0.22.0";
+
+  src = fetchFromGitHub {
+    owner = "sass";
+    repo = "libsass-python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-5O4Er3jNUFy83m/K0HzYR+fHcSDqF/3M+fXaFZY8zEg=";
+  };
+
+  buildInputs = [ libsass ];
+
+  propagatedBuildInputs = [ six ];
+
+  preBuild = ''
+    export SYSTEM_SASS=true;
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    werkzeug
+  ];
+
+  pytestFlagsArray = [ "sasstests.py" ];
+
+  pythonImportsCheck = [ "sass" ];
+
+  meta = with lib; {
+    description = "Python binding for libsass to compile Sass/SCSS";
+    homepage = "https://sass.github.io/libsass-python/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libsavitar/default.nix b/nixpkgs/pkgs/development/python-modules/libsavitar/default.nix
new file mode 100644
index 000000000000..83b3e129ea39
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libsavitar/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, python, pythonOlder, fetchFromGitHub, cmake, sip_4 }:
+
+buildPythonPackage rec {
+  pname = "libsavitar";
+  version = "4.12.0";
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "Ultimaker";
+    repo = "libSavitar";
+    rev = version;
+    hash = "sha256-MAA1WtGED6lvU6N4BE6wwY1aYaFrCq/gkmQFz3VWqNA=";
+  };
+
+  postPatch = ''
+    sed -i 's#''${Python3_SITEARCH}#${placeholder "out"}/${python.sitePackages}#' cmake/SIPMacros.cmake
+  '';
+
+  nativeBuildInputs = [ cmake ];
+
+  propagatedBuildInputs = [ sip_4 ];
+
+  disabled = pythonOlder "3.4.0";
+
+  meta = with lib; {
+    description = "C++ implementation of 3mf loading with SIP python bindings";
+    homepage = "https://github.com/Ultimaker/libSavitar";
+    license = licenses.lgpl3Plus;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ abbradar orivej gebner ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libsixel/default.nix b/nixpkgs/pkgs/development/python-modules/libsixel/default.nix
new file mode 100644
index 000000000000..c061b51ab849
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libsixel/default.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage
+, lib
+, stdenv
+, libsixel
+}:
+
+buildPythonPackage rec {
+  version = libsixel.version;
+  pname = "libsixel";
+
+  src = libsixel.src;
+  sourceRoot = "${src.name}/python";
+
+  prePatch = ''
+    substituteInPlace libsixel/__init__.py --replace \
+      'from ctypes.util import find_library' \
+      'find_library = lambda _x: "${lib.getLib libsixel}/lib/libsixel${stdenv.hostPlatform.extensions.sharedLibrary}"'
+  '';
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "libsixel" ];
+
+  meta = with lib; {
+    description = "SIXEL graphics encoder/decoder implementation";
+    homepage = "https://github.com/libsixel/libsixel";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rmcgibbo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libsoundtouch/default.nix b/nixpkgs/pkgs/development/python-modules/libsoundtouch/default.nix
new file mode 100644
index 000000000000..2abd187d0476
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libsoundtouch/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, enum-compat
+, requests
+, websocket-client
+, zeroconf
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname   = "libsoundtouch";
+  version = "0.8.0";
+
+  src = fetchFromGitHub {
+    owner = "CharlesBlonde";
+    repo = "libsoundtouch";
+    rev = version;
+    sha256 = "1wl2w5xfdkrv0qzsz084z2k6sycfyq62mqqgciycha3dywf2fvva";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    enum-compat
+    websocket-client
+    zeroconf
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # mock data order mismatch
+    "test_select_content_item"
+    "test_snapshot_restore"
+  ];
+
+  meta = with lib; {
+    description = "Bose Soundtouch Python library";
+    homepage    = "https://github.com/CharlesBlonde/libsoundtouch";
+    license     = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libthumbor/default.nix b/nixpkgs/pkgs/development/python-modules/libthumbor/default.nix
new file mode 100644
index 000000000000..0fdb4c4fab94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libthumbor/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, django
+, six
+, pycrypto
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "libthumbor";
+  version = "2.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-1PsiFZrTDVQqy8A3nkaM5LdPiBoriRgHkklTOiczN+g=";
+  };
+
+  buildInputs = [
+    django
+  ];
+
+  propagatedBuildInputs = [
+    six
+    pycrypto
+  ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "libthumbor"
+  ];
+
+  meta = with lib; {
+    description = "Python extension to thumbor";
+    homepage = "https://github.com/heynemann/libthumbor";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libtmux/default.nix b/nixpkgs/pkgs/development/python-modules/libtmux/default.nix
new file mode 100644
index 000000000000..f94608c1b452
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libtmux/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, poetry-core
+, pytest-rerunfailures
+, pytestCheckHook
+, procps
+, tmux
+, ncurses
+}:
+
+buildPythonPackage rec {
+  pname = "libtmux";
+  version = "0.23.2";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "tmux-python";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-W1gBhukBooPo8uej6i8i3UxLuDeBBeSX5xU50SyjjlA=";
+  };
+
+  postPatch = ''
+    sed -i '/addopts/d' setup.cfg
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    procps
+    tmux
+    ncurses
+    pytest-rerunfailures
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [ "tests" ];
+
+  disabledTests = [
+    # Fail with: 'no server running on /tmp/tmux-1000/libtmux_test8sorutj1'.
+    "test_new_session_width_height"
+    # Assertion error
+    "test_capture_pane_start"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # tests/test_pane.py:113: AssertionError
+    "test_capture_pane_start"
+  ];
+
+  disabledTestPaths = lib.optionals stdenv.isDarwin [
+    "tests/test_test.py"
+    "tests/legacy_api/test_test.py"
+  ];
+
+  pythonImportsCheck = [
+    "libtmux"
+  ];
+
+  meta = with lib; {
+    description = "Typed scripting library / ORM / API wrapper for tmux";
+    homepage = "https://libtmux.git-pull.com/";
+    changelog = "https://github.com/tmux-python/libtmux/raw/v${version}/CHANGES";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libusb1/default.nix b/nixpkgs/pkgs/development/python-modules/libusb1/default.nix
new file mode 100644
index 000000000000..bdafac942636
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libusb1/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, libusb1, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "libusb1";
+  version = "3.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4ee9b0a55f8bd0b3ea7017ae919a6c1f439af742c4a4b04543c5fd7af89b828c";
+  };
+
+  postPatch = ''
+    substituteInPlace usb1/_libusb1.py --replace \
+      "ctypes.util.find_library(base_name)" \
+      "'${libusb1}/lib/libusb-1.0${stdenv.hostPlatform.extensions.sharedLibrary}'"
+  '';
+
+  buildInputs = [ libusb1 ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pytestFlagsArray = [
+    "usb1/testUSB1.py"
+  ];
+
+  meta = with lib; {
+    homepage    = "https://github.com/vpelletier/python-libusb1";
+    description = "Python ctype-based wrapper around libusb1";
+    license     = licenses.lgpl2Plus;
+    maintainers = with maintainers; [ prusnak rnhmjoj ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libusbsio/default.nix b/nixpkgs/pkgs/development/python-modules/libusbsio/default.nix
new file mode 100644
index 000000000000..b6cab59570b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libusbsio/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, libusbsio }:
+
+buildPythonPackage rec {
+  pname = "libusbsio";
+  inherit (libusbsio) version;
+
+  src = "${libusbsio.src}/python";
+
+  # The source includes both the python module directly and also a source tarball for it.
+  # The direct files lack setup information, the tarball includes unwanted binaries.
+  # This takes only the setup files from the tarball.
+  postUnpack = ''
+    tar -C python --strip-components=1 -xf python/dist/libusbsio-${version}.tar.gz libusbsio-${version}/{setup.py,setup.cfg,pyproject.toml}
+    rm -r python/dist
+  '';
+
+  postPatch = ''
+    substituteInPlace libusbsio/libusbsio.py \
+        --replace "dllpath = LIBUSBSIO._lookup_dll_path(dfltdir, dllname)" 'dllpath = "${libusbsio}/lib/" + dllname'
+  '';
+
+  buildInputs = [ libusbsio ];
+
+  doCheck = false; # they require a device to be connected over USB
+
+  pythonImportsCheck = [ "libusbsio" ];
+
+  meta = with lib; {
+    description = "NXP Secure Provisioning SDK";
+    homepage = "https://github.com/NXPmicro/spsdk";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ frogamic sbruder ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libversion/default.nix b/nixpkgs/pkgs/development/python-modules/libversion/default.nix
new file mode 100644
index 000000000000..dfebeaad538c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libversion/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, libversion
+, pkg-config
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "libversion";
+  version = "1.2.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "repology";
+    repo = "py-libversion";
+    rev = version;
+    hash = "sha256-p0wtSB+QXAERf+57MMb8cqWoy1bG3XaCpR9GPwYYvJM=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pkg-config'" "'$(command -v $PKG_CONFIG)'"
+  '';
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  buildInputs = [
+    libversion
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    # import from $out
+    rm -r libversion
+  '';
+
+  pythonImportsCheck = [
+    "libversion"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for libversion, which provides fast, powerful and correct generic version string comparison algorithm";
+    homepage = "https://github.com/repology/py-libversion";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ryantm ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/libvirt/default.nix b/nixpkgs/pkgs/development/python-modules/libvirt/default.nix
new file mode 100644
index 000000000000..3e5d6af48afa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/libvirt/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchFromGitLab, pkg-config, lxml, libvirt, nose }:
+
+buildPythonPackage rec {
+  pname = "libvirt";
+  version = "9.9.0";
+
+  src = fetchFromGitLab {
+    owner = "libvirt";
+    repo = "libvirt-python";
+    rev = "v${version}";
+    hash = "sha256-cajKzRRhKCUKWm+1p3xvCyEbVB2R/70WY584o7V+XaY=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ libvirt lxml ];
+
+  nativeCheckInputs = [ nose ];
+  checkPhase = ''
+    nosetests
+  '';
+
+  meta = with lib; {
+    homepage = "https://libvirt.org/python.html";
+    description = "libvirt Python bindings";
+    license = licenses.lgpl2;
+    maintainers = [ maintainers.fpletz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/liccheck/default.nix b/nixpkgs/pkgs/development/python-modules/liccheck/default.nix
new file mode 100644
index 000000000000..713fc3cca23c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/liccheck/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, configparser
+, fetchFromGitHub
+, pip
+, pytest-mock
+, pytestCheckHook
+, python3-openid
+, pythonOlder
+, semantic-version
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "liccheck";
+  version = "0.9.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dhatim";
+    repo = "python-license-check";
+    rev = "refs/tags/${version}";
+    hash = "sha256-2WJw5TVMjOr+GX4YV0nssOtQeYvDHBLnlWquJQWPL9I=";
+  };
+
+  propagatedBuildInputs = [
+    configparser
+    semantic-version
+    toml
+  ];
+
+  nativeCheckInputs = [
+    pip
+    pytest-mock
+    pytestCheckHook
+    python3-openid
+  ];
+
+  pythonImportsCheck = [
+    "liccheck"
+  ];
+
+  meta = with lib; {
+    description = "Check python packages from requirement.txt and report issues";
+    homepage = "https://github.com/dhatim/python-license-check";
+    changelog = "https://github.com/dhatim/python-license-check/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/license-expression/default.nix b/nixpkgs/pkgs/development/python-modules/license-expression/default.nix
new file mode 100644
index 000000000000..bd95899398f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/license-expression/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, boolean-py
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "license-expression";
+  version = "30.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "nexB";
+    repo = "license-expression";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-5pRfFRQLxWmhEKoJZiC7gZbmW8BbqBNBWbdwFL0MtpM=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  dontConfigure = true;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    boolean-py
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "license_expression"
+  ];
+
+  meta = with lib; {
+    description = "Utility library to parse, normalize and compare License expressions";
+    homepage = "https://github.com/nexB/license-expression";
+    changelog = "https://github.com/nexB/license-expression/blob/v${version}/CHANGELOG.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/life360/default.nix b/nixpkgs/pkgs/development/python-modules/life360/default.nix
new file mode 100644
index 000000000000..e3fd2a8ecbae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/life360/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "life360";
+  version = "6.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pnbruckner";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-GRQPH7fp8YkkCEpXtvgFxJO6VLFQK/PBaRe0Tfg3KdU=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "life360"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interact with Life360";
+    homepage = "https://github.com/pnbruckner/life360";
+    changelog = "https://github.com/pnbruckner/life360/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lifelines/default.nix b/nixpkgs/pkgs/development/python-modules/lifelines/default.nix
new file mode 100644
index 000000000000..d0dd1b757fae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lifelines/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, autograd
+, autograd-gamma
+, buildPythonPackage
+, dill
+, fetchFromGitHub
+, flaky
+, formulaic
+, jinja2
+, matplotlib
+, numpy
+, pandas
+, psutil
+, pytestCheckHook
+, pythonOlder
+, scikit-learn
+, scipy
+, sybil
+}:
+
+buildPythonPackage rec {
+  pname = "lifelines";
+  version = "0.27.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CamDavidsonPilon";
+    repo = "lifelines";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-2AjqN4TtBY1KtgFlY0E2UcFUHniHe2Hge+JaUQd4gO8=";
+  };
+
+  propagatedBuildInputs = [
+    autograd
+    autograd-gamma
+    formulaic
+    matplotlib
+    numpy
+    pandas
+    scipy
+  ];
+
+  nativeCheckInputs = [
+    dill
+    flaky
+    jinja2
+    psutil
+    pytestCheckHook
+    scikit-learn
+    sybil
+  ];
+
+  pythonImportsCheck = [
+    "lifelines"
+  ];
+
+  disabledTestPaths = [
+    "lifelines/tests/test_estimation.py"
+  ];
+
+  disabledTests = [
+    "test_datetimes_to_durations_with_different_frequencies"
+  ];
+
+  meta = with lib; {
+    description = "Survival analysis in Python";
+    homepage = "https://lifelines.readthedocs.io";
+    changelog = "https://github.com/CamDavidsonPilon/lifelines/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ swflint ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lightgbm/default.nix b/nixpkgs/pkgs/development/python-modules/lightgbm/default.nix
new file mode 100644
index 000000000000..d2fc8cbc13a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lightgbm/default.nix
@@ -0,0 +1,87 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+
+# build-system
+, cmake
+, ninja
+, pathspec
+, pyproject-metadata
+, scikit-build-core
+
+# dependencies
+, llvmPackages
+, numpy
+, scipy
+, scikit-learn
+, pythonOlder
+
+# optionals: gpu
+, boost
+, cudatoolkit
+, ocl-icd
+, opencl-headers
+, gpuSupport ? stdenv.isLinux
+}:
+
+buildPythonPackage rec {
+  pname = "lightgbm";
+  version = "4.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vuWd0mmpOwk/LGENSmaDp+qHxj0+o1xiISPOLAILKrw=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    ninja
+    pathspec
+    pyproject-metadata
+    scikit-build-core
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  buildInputs = (lib.optionals stdenv.cc.isClang [
+    llvmPackages.openmp
+  ]) ++ (lib.optionals gpuSupport [
+    boost
+    cudatoolkit
+    ocl-icd
+    opencl-headers
+  ]);
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    scikit-learn
+  ];
+
+  pypaBuildFlags = lib.optionalString gpuSupport "--config-setting=cmake.define.USE_CUDA=ON";
+
+  postConfigure = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  # The pypi package doesn't distribute the tests from the GitHub
+  # repository. It contains c++ tests which don't seem to wired up to
+  # `make check`.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "lightgbm"
+  ];
+
+  meta = {
+    description = "A fast, distributed, high performance gradient boosting (GBDT, GBRT, GBM or MART) framework";
+    homepage = "https://github.com/Microsoft/LightGBM";
+    changelog = "https://github.com/microsoft/LightGBM/releases/tag/v${version}";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ teh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lightning-utilities/default.nix b/nixpkgs/pkgs/development/python-modules/lightning-utilities/default.nix
new file mode 100644
index 000000000000..65d5f064ce57
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lightning-utilities/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build
+, setuptools
+
+# runtime
+, packaging
+, typing-extensions
+
+# tests
+, pytest-timeout
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "lightning-utilities";
+  version = "0.10.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "Lightning-AI";
+    repo = "utilities";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-lp/+ArgoMIa7Q2ufWghr8OYUMlFcj8123Et73ORNI5U=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [
+    "lightning_utilities"
+  ];
+
+  nativeCheckInputs = [
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "lightning_utilities.core.enums.StrEnum"
+    "lightning_utilities.core.imports.RequirementCache"
+    "lightning_utilities.core.imports.compare_version"
+    "lightning_utilities.core.imports.get_dependency_min_version_spec"
+    # weird doctests fail on imports, but providing the dependency
+    # fails another test
+    "lightning_utilities.core.imports.ModuleAvailableCache"
+    "lightning_utilities.core.imports.requires"
+  ];
+
+  disabledTestPaths = [
+    "docs"
+    # doctests that expect docs.txt in the wrong location
+    "src/lightning_utilities/install/requirements.py"
+  ];
+
+  pytestFlagsArray = [
+    # warns about distutils removal in python 3.12
+    "-W" "ignore::DeprecationWarning"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/Lightning-AI/utilities/releases/tag/v${version}";
+    description = "Common Python utilities and GitHub Actions in Lightning Ecosystem";
+    homepage = "https://github.com/Lightning-AI/utilities";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lightparam/default.nix b/nixpkgs/pkgs/development/python-modules/lightparam/default.nix
new file mode 100644
index 000000000000..936cc9a06269
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lightparam/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy3k
+, ipython
+, ipywidgets
+, numpy
+, pyqt5
+}:
+
+buildPythonPackage rec {
+  pname = "lightparam";
+  version = "0.4.6";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "portugueslab";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "13hlkvjcyz2lhvlfqyavja64jccbidshhs39sl4fibrn9iq34s3i";
+  };
+
+  propagatedBuildInputs = [
+    ipython
+    ipywidgets
+    numpy
+    pyqt5
+  ];
+
+  pythonImportsCheck = [ "lightparam" ];
+
+  meta = {
+    homepage = "https://github.com/portugueslab/lightparam";
+    description = "Another attempt at parameters in Python";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ tbenst ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lightwave/default.nix b/nixpkgs/pkgs/development/python-modules/lightwave/default.nix
new file mode 100644
index 000000000000..5536483a0d56
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lightwave/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "lightwave";
+  version = "0.24";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-l9hwdAKrpdXj/pkrgyiuhbPaGgT6tjfoOw/TBpR+k1I=";
+  };
+
+  pythonImportsCheck = [
+    "lightwave"
+  ];
+
+  # Requires phyiscal hardware
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Module for interacting with LightwaveRF hubs";
+    homepage = "https://github.com/GeoffAtHome/lightwave";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lightwave2/default.nix b/nixpkgs/pkgs/development/python-modules/lightwave2/default.nix
new file mode 100644
index 000000000000..4d1b01fd68a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lightwave2/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "lightwave2";
+  version = "0.8.23";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-umhFqeX16c6o006MU9/9h4EnqcX7v8C5q3XjxYgi+xk=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "lightwave2"
+  ];
+
+  meta = with lib; {
+    description = "Library to interact with LightWaveRF 2nd Gen lights and switches";
+    homepage = "https://github.com/bigbadblunt/lightwave2";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lima/default.nix b/nixpkgs/pkgs/development/python-modules/lima/default.nix
new file mode 100644
index 000000000000..6174a4d76410
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lima/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "lima";
+  version = "0.5";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0qqj0053r77ppkcyyk2fhpaxjzsl1h98nf9clpny6cs66sdl241v";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Lightweight Marshalling of Python 3 Objects.";
+    homepage = "https://github.com/b6d/lima";
+    license = licenses.mit;
+    maintainers = with maintainers; [ zhaofengli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lime/default.nix b/nixpkgs/pkgs/development/python-modules/lime/default.nix
new file mode 100644
index 000000000000..a3296f09c52c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lime/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+
+, matplotlib
+, numpy
+, scipy
+, tqdm
+, scikit-learn
+, scikit-image
+
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "lime";
+  version = "0.2.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-dpYOTwVf61Pom1AiODuvyHtj8lusYmWYSwozPRpX94E=";
+  };
+
+  propagatedBuildInputs =  [
+    matplotlib
+    numpy
+    scipy
+    tqdm
+    scikit-learn
+    scikit-image
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # touches network
+    "lime/tests/test_lime_text.py"
+  ];
+
+  pythonImportsCheck = [
+    "lime.exceptions"
+    "lime.explanation"
+    "lime.lime_base"
+    "lime.lime_image"
+    "lime.lime_text"
+  ];
+
+  meta = with lib; {
+    description = "Local Interpretable Model-Agnostic Explanations for machine learning classifiers";
+    homepage = "https://github.com/marcotcr/lime";
+    changelog = "https://github.com/marcotcr/lime/releases/tag/${version}";
+    license = licenses.bsd2;
+    maintainers = with lib.maintainers; [ khaser ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/limiter/default.nix b/nixpkgs/pkgs/development/python-modules/limiter/default.nix
new file mode 100644
index 000000000000..f550651c104d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/limiter/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, strenum
+, token-bucket
+}:
+
+buildPythonPackage rec {
+  pname = "limiter";
+  version = "0.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "alexdelorenzo";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-2Et4ozVf9t+tp2XtLbDk/LgLIU+jQAEAlU8hA5lpxdk=";
+  };
+
+  propagatedBuildInputs = [
+    strenum
+    token-bucket
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "limiter"
+  ];
+
+  meta = with lib; {
+    description = "Python rate-limiting, thread-safe and asynchronous decorators and context managers";
+    homepage = "https://github.com/alexdelorenzo/limiter";
+    license = with licenses; [ agpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/limitlessled/default.nix b/nixpkgs/pkgs/development/python-modules/limitlessled/default.nix
new file mode 100644
index 000000000000..6d12f6d51496
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/limitlessled/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "limitlessled";
+  version = "1.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0pd71wxqjvznx10brsj1sgy3420bz7awbzk9jlj422rrdxql754j";
+  };
+
+  meta = with lib; {
+    description = "Control LimitlessLED products";
+    homepage = "https://github.com/happyleavesaoc/python-limitlessled/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sephalon ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/limits/default.nix b/nixpkgs/pkgs/development/python-modules/limits/default.nix
new file mode 100644
index 000000000000..2146f1b9a0bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/limits/default.nix
@@ -0,0 +1,88 @@
+{ lib
+, buildPythonPackage
+, deprecated
+, fetchFromGitHub
+, etcd3
+, hiro
+, importlib-resources
+, packaging
+, pymemcache
+, pymongo
+, pytest-asyncio
+, pytest-lazy-fixture
+, pytestCheckHook
+, pythonOlder
+, redis
+, setuptools
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "limits";
+  version = "3.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "alisaifee";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    # Upstream uses versioneer, which relies on git attributes substitution.
+    # This leads to non-reproducible archives on github. Remove the substituted
+    # file here, and recreate it later based on our version info.
+    postFetch = ''
+      rm "$out/limits/_version.py"
+    '';
+    hash = "sha256-VLfFWFcwLgEEvPUKQ00QjEq1HN28OpE6Eu1eyF+TwXU=";
+  };
+
+  propagatedBuildInputs = [
+    deprecated
+    importlib-resources
+    packaging
+    setuptools
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    etcd3
+    hiro
+    pymemcache
+    pymongo
+    pytest-asyncio
+    pytest-lazy-fixture
+    pytestCheckHook
+    redis
+  ];
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace "--cov=limits" "" \
+      --replace "-K" ""
+
+    substituteInPlace setup.py \
+      --replace "versioneer.get_version()" "'${version}'"
+
+    # Recreate _version.py, deleted at fetch time due to non-reproducibility.
+    echo 'def get_versions(): return {"version": "${version}"}' > limits/_version.py
+  '';
+
+  pythonImportsCheck = [
+    "limits"
+  ];
+
+  pytestFlagsArray = [
+    # All other tests require a running Docker instance
+    "tests/test_limits.py"
+    "tests/test_ratelimit_parser.py"
+    "tests/test_limit_granularities.py"
+  ];
+
+  meta = with lib; {
+    description = "Rate limiting using various strategies and storage backends such as redis & memcached";
+    homepage = "https://github.com/alisaifee/limits";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/limnoria/default.nix b/nixpkgs/pkgs/development/python-modules/limnoria/default.nix
new file mode 100644
index 000000000000..0cc2d73d969b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/limnoria/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, chardet
+, cryptography
+, feedparser
+, fetchPypi
+, mock
+, pysocks
+, pytestCheckHook
+, python-dateutil
+, python-gnupg
+, pythonOlder
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "limnoria";
+  version = "2023.9.24";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VJXIuGcgwAEObCCah+yc/o3IEpe4ln5F4wVwCy54Auc=";
+  };
+
+  propagatedBuildInputs = [
+    chardet
+    cryptography
+    feedparser
+    mock
+    pysocks
+    python-dateutil
+    python-gnupg
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    pytz
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "version=version" 'version="${version}"'
+  '';
+
+  checkPhase = ''
+    runHook preCheck
+    export PATH="$PATH:$out/bin";
+    supybot-test test -v --no-network
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    # Uses the same names as Supybot
+    "supybot"
+  ];
+
+  meta = with lib; {
+    description = "A modified version of Supybot, an IRC bot";
+    homepage = "https://github.com/ProgVal/Limnoria";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/line-profiler/default.nix b/nixpkgs/pkgs/development/python-modules/line-profiler/default.nix
new file mode 100644
index 000000000000..10decb4f3f52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/line-profiler/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cython_3
+, isPyPy
+, ipython
+, scikit-build
+, cmake
+, pythonOlder
+, pytestCheckHook
+, ubelt
+}:
+
+buildPythonPackage rec {
+  pname = "line-profiler";
+  version = "4.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6" || isPyPy;
+
+  src = fetchPypi {
+    pname = "line_profiler";
+    inherit version;
+    hash = "sha256-qlZXiw/1p1b+GAs/2nvWfCe71Hiz0BJGEtjPAOSiHfI=";
+  };
+
+  nativeBuildInputs = [
+    cython_3
+    cmake
+    scikit-build
+  ];
+
+  passthru.optional-dependencies = {
+    ipython = [ ipython ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    ubelt
+  ] ++ passthru.optional-dependencies.ipython;
+
+  dontUseCmakeConfigure = true;
+
+  preBuild = ''
+    rm -f _line_profiler.c
+  '';
+
+  preCheck = ''
+    rm -r line_profiler
+    export PATH=$out/bin:$PATH
+  '';
+
+  pythonImportsCheck = [
+    "line_profiler"
+  ];
+
+  meta = with lib; {
+    description = "Line-by-line profiler";
+    homepage = "https://github.com/pyutils/line_profiler";
+    changelog = "https://github.com/pyutils/line_profiler/blob/v${version}/CHANGELOG.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/linear_operator/default.nix b/nixpkgs/pkgs/development/python-modules/linear_operator/default.nix
new file mode 100644
index 000000000000..1bf11865dfc0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/linear_operator/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, jaxtyping
+, pytestCheckHook
+, scipy
+, setuptools
+, setuptools-scm
+, torch
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "linear_operator";
+  version = "0.5.2";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "cornellius-gp";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-OuE6jx9Q4IU+b2a+mrglRdBOReN1tt/thetNXxwk1GI=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    jaxtyping
+    scipy
+    torch
+  ];
+
+  pythonImportsCheck = [ "linear_operator" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # flaky numerical tests
+    "test_svd"
+  ];
+
+  meta = with lib; {
+    description = "A LinearOperator implementation to wrap the numerical nuts and bolts of GPyTorch";
+    homepage = "https://github.com/cornellius-gp/linear_operator/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/linecache2/default.nix b/nixpkgs/pkgs/development/python-modules/linecache2/default.nix
new file mode 100644
index 000000000000..4231ed43ad5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/linecache2/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pbr
+}:
+
+buildPythonPackage rec {
+  pname = "linecache2";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0z79g3ds5wk2lvnqw0y2jpakjf32h95bd9zmnvp7dnqhf57gy9jb";
+  };
+
+  buildInputs = [ pbr ];
+  # circular dependencies for tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A backport of linecache to older supported Pythons";
+    homepage = "https://github.com/testing-cabal/linecache2";
+    license = licenses.psfl;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lineedit/default.nix b/nixpkgs/pkgs/development/python-modules/lineedit/default.nix
new file mode 100644
index 000000000000..563105462764
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lineedit/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pygments
+, six
+, wcwidth
+, pytestCheckHook
+, pyte
+, ptyprocess
+, pexpect
+}:
+
+buildPythonPackage rec {
+  pname = "lineedit";
+  version = "0.1.6";
+
+  src = fetchFromGitHub {
+    owner = "randy3k";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "fq2NpjIQkIq1yzXEUxi6cz80kutVqcH6MqJXHtpTFsk=";
+  };
+
+  propagatedBuildInputs = [
+    pygments
+    six
+    wcwidth
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pyte
+    pexpect
+    ptyprocess
+  ];
+
+  pythonImportsCheck = [ "lineedit" ];
+
+  meta = with lib; {
+    description = "A readline library based on prompt_toolkit which supports multiple modes";
+    homepage = "https://github.com/randy3k/lineedit";
+    license = licenses.mit;
+    maintainers = with maintainers; [ savyajha ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/linetable/default.nix b/nixpkgs/pkgs/development/python-modules/linetable/default.nix
new file mode 100644
index 000000000000..6c1cde30e6f0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/linetable/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "linetable";
+  version = "0.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "amol-";
+    repo = "linetable";
+    rev = "refs/tags/${version}";
+    hash = "sha256-nVZVxK6uB5TP0pReaEya3/lFXFkiqpnnaWqYzxzO6bM=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "linetable"
+  ];
+
+  meta = with lib; {
+    description = "Library to parse and generate co_linetable attributes in Python code objects";
+    homepage = "https://github.com/amol-/linetable";
+    changelog = "https://github.com/amol-/linetable/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lingua/default.nix b/nixpkgs/pkgs/development/python-modules/lingua/default.nix
new file mode 100644
index 000000000000..c218e4a5376f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lingua/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, flit-core
+, polib
+, click }:
+
+buildPythonPackage rec {
+  pname = "lingua";
+  version = "4.15.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-DhqUZ0HbKIpANhrQT/OP4EvwgZg0uKu4TEtTX+2bpO8=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    click
+    polib
+  ];
+
+  pythonImportsCheck = [ "lingua" ];
+
+  meta = with lib; {
+    description = "Translation toolset";
+    homepage = "https://github.com/wichert/lingua";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ np ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/linkify-it-py/default.nix b/nixpkgs/pkgs/development/python-modules/linkify-it-py/default.nix
new file mode 100644
index 000000000000..660e3cd2d9b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/linkify-it-py/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, uc-micro-py
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "linkify-it-py";
+  version = "2.0.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "tsutsu3";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-e3k2RblqvzWSSIrJL6ib2dxFw7T5vXlN8DrCV1qEr6w=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    uc-micro-py
+  ];
+
+  pythonImportsCheck = [
+    "linkify_it"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Links recognition library with full unicode support";
+    homepage = "https://github.com/tsutsu3/linkify-it-py";
+    license = licenses.mit;
+    maintainers = with maintainers; [ AluisioASG ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/linknlink/default.nix b/nixpkgs/pkgs/development/python-modules/linknlink/default.nix
new file mode 100644
index 000000000000..7bd25ff01545
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/linknlink/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "linknlink";
+  version = "0.1.9";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "xuanxuan000";
+    repo = "python-linknlink";
+    rev = "refs/tags/${version}";
+    hash = "sha256-msKunZsAxA9xpCJmG4MVXuJDMEqrCeShvAqOw8zjSPM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  pythonImportsCheck = [
+    "linknlink"
+  ];
+
+  # Module has no test
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Module and CLI for controlling Linklink devices locally";
+    homepage = "https://github.com/xuanxuan000/python-linknlink";
+    changelog = "https://github.com/xuanxuan000/python-linknlink/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/linode-api/default.nix b/nixpkgs/pkgs/development/python-modules/linode-api/default.nix
new file mode 100644
index 000000000000..4c1b77bf86a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/linode-api/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, requests
+, pytestCheckHook
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "linode-api";
+  version = "5.7.2";
+  disabled = pythonOlder "3.6";
+
+  # Sources from Pypi exclude test fixtures
+  src = fetchFromGitHub {
+    owner = "linode";
+    repo = "python-linode-api";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-RU/GyNYV05iYVNanMqKMmoksXWrxTQ2H2XvaIwSSslA=";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "linode_api4" ];
+
+  meta = with lib; {
+    description = "Python library for the Linode API v4";
+    homepage = "https://github.com/linode/python-linode-api";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ glenns ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/linode/default.nix b/nixpkgs/pkgs/development/python-modules/linode/default.nix
new file mode 100644
index 000000000000..c7a60201ee88
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/linode/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "linode";
+  version = "0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "db3c2a7fab8966d903a63f16c515bff241533e4ef2d746aa7aae4a49bba5e573";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ghickman/linode";
+    description = "A thin python wrapper around Linode's API";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/linuxfd/default.nix b/nixpkgs/pkgs/development/python-modules/linuxfd/default.nix
new file mode 100644
index 000000000000..7d968c191441
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/linuxfd/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "linuxfd";
+  version = "1.5";
+
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b8c00109724b68e093f9b556edd78e41ed65fb8d969fd0e83186a97b5d3139b4";
+  };
+
+  # no tests
+  doCheck = false;
+
+  meta = {
+    description = "Python bindings for the Linux eventfd/signalfd/timerfd/inotify syscalls";
+    homepage = "https://github.com/FrankAbelbeck/linuxfd";
+    platforms = lib.platforms.linux;
+    license = with lib.licenses; [ lgpl3Plus ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lion-pytorch/default.nix b/nixpkgs/pkgs/development/python-modules/lion-pytorch/default.nix
new file mode 100644
index 000000000000..e23011aeb837
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lion-pytorch/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, torch
+}:
+
+buildPythonPackage rec {
+  pname = "lion-pytorch";
+  version = "0.1.2";
+  format = "setuptools";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "lucidrains";
+    repo = "lion-pytorch";
+    rev = "refs/tags/${version}";
+    hash = "sha256-9hdpRJvCpv3PeC7f0IXpHt6i+e6LiT0QUl5jeDGelQE=";
+  };
+
+  propagatedBuildInputs = [ torch ];
+
+  pythonImportsCheck = [ "lion_pytorch" ];
+  doCheck = false;  # no tests currently
+
+  meta = with lib; {
+    description = "Optimizer tuned by Google Brain using genetic algorithms";
+    homepage = "https://github.com/lucidrains/lion-pytorch";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/liquidctl/default.nix b/nixpkgs/pkgs/development/python-modules/liquidctl/default.nix
new file mode 100644
index 000000000000..f6e5379fb271
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/liquidctl/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, installShellFiles
+, setuptools
+, setuptools-scm
+, wheel
+, docopt
+, hidapi
+, pyusb
+, smbus-cffi
+, i2c-tools
+, pytestCheckHook
+, colorlog
+, crcmod
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "liquidctl";
+  version = "1.13.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-LU8rQmXrEIoOBTTFotGvMeHqksYGrtNo2YSl2l2e/UI=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    installShellFiles
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    docopt
+    hidapi
+    pyusb
+    smbus-cffi
+    i2c-tools
+    colorlog
+    crcmod
+    pillow
+  ];
+
+  propagatedNativeBuildInputs = [
+    smbus-cffi
+  ];
+
+  outputs = [
+    "out"
+    "man"
+  ];
+
+  postInstall = ''
+    installManPage liquidctl.8
+    installShellCompletion extra/completions/liquidctl.bash
+
+    mkdir -p $out/lib/udev/rules.d
+    cp extra/linux/71-liquidctl.rules $out/lib/udev/rules.d/.
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postBuild = ''
+    # needed for pythonImportsCheck
+    export XDG_RUNTIME_DIR=$TMPDIR
+  '';
+
+  pythonImportsCheck = [
+    "liquidctl"
+  ];
+
+  meta = with lib; {
+    description = "Cross-platform CLI and Python drivers for AIO liquid coolers and other devices";
+    homepage = "https://github.com/liquidctl/liquidctl";
+    changelog = "https://github.com/liquidctl/liquidctl/blob/v${version}/CHANGELOG.md";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ arturcygan evils ];
+    mainProgram = "liquidctl";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lit/default.nix b/nixpkgs/pkgs/development/python-modules/lit/default.nix
new file mode 100644
index 000000000000..1467dfaa1f6d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lit/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "lit";
+  version = "17.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-RIZ65Xa1eQVnsSC8Pw2fAh2slCTRsIQMdazYX0YQrAQ=";
+  };
+
+  passthru = {
+    inherit python;
+  };
+
+  # Non-standard test suite. Needs custom checkPhase.
+  # Needs LLVM's `FileCheck` and `not`: `$out/bin/lit tests`
+  # There should be `llvmPackages.lit` since older LLVM versions may
+  # have the possibility of not correctly interfacing with newer lit versions
+  doCheck = false;
+
+  meta = {
+    description = "Portable tool for executing LLVM and Clang style test suites";
+    homepage = "http://llvm.org/docs/CommandGuide/lit.html";
+    license = lib.licenses.ncsa;
+    maintainers = with lib.maintainers; [ dtzWill ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/litellm/default.nix b/nixpkgs/pkgs/development/python-modules/litellm/default.nix
new file mode 100644
index 000000000000..ef70a50f70d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/litellm/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, importlib-metadata
+, openai
+, python-dotenv
+, tiktoken
+}:
+let
+  version = "0.11.1";
+in
+buildPythonPackage rec {
+  pname = "litellm";
+  format = "pyproject";
+  inherit version;
+
+  src = fetchFromGitHub {
+    owner = "BerriAI";
+    repo = "litellm";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-5Zk1lc7G0dU/AoLE5V+p30wE/gRfYRPsVS3sNgwWzCU=";
+  };
+
+  postPatch = ''
+    rm -rf dist
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    importlib-metadata
+    openai
+    python-dotenv
+    tiktoken
+  ];
+
+  # the import check phase fails trying to do a network request to openai
+  # pythonImportsCheck = [ "litellm" ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Use any LLM as a drop in replacement for gpt-3.5-turbo. Use Azure, OpenAI, Cohere, Anthropic, Ollama, VLLM, Sagemaker, HuggingFace, Replicate (100+ LLMs)";
+    homepage = "https://github.com/BerriAI/litellm";
+    license = licenses.mit;
+    changelog = "https://github.com/BerriAI/litellm/releases/tag/v${version}";
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/litemapy/default.nix b/nixpkgs/pkgs/development/python-modules/litemapy/default.nix
new file mode 100644
index 000000000000..6040cb1f47f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/litemapy/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nbtlib
+}:
+
+buildPythonPackage rec {
+  pname = "litemapy";
+  version = "0.7.2b0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "SmylerMC";
+    repo = "litemapy";
+    rev = "v${version}";
+    hash = "sha256-VfEo/JLeU17bEkvc8oZYfq19RsHl6QvKv0sGZYQjYhE=";
+  };
+
+  propagatedBuildInputs = [
+    nbtlib
+  ];
+
+  pythonImportsCheck = [ "litemapy" ];
+
+  meta = with lib; {
+    description = "A Python library to read and edit Litematica's schematic file format";
+    homepage = "https://github.com/SmylerMC/litemapy";
+    changelog = "https://github.com/SmylerMC/litemapy/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ gdd ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/littleutils/default.nix b/nixpkgs/pkgs/development/python-modules/littleutils/default.nix
new file mode 100644
index 000000000000..538f4dea0a67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/littleutils/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "littleutils";
+  version = "0.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5srjpCA+Uw1RyWZ+0xD/47GUjyh249aWBbPeS32WkW8=";
+  };
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "littleutils"
+  ];
+
+  meta = with lib; {
+    description = "Small collection of Python utility functions";
+    homepage = "https://github.com/alexmojaki/littleutils";
+    changelog = "https://github.com/alexmojaki/littleutils/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/livelossplot/default.nix b/nixpkgs/pkgs/development/python-modules/livelossplot/default.nix
new file mode 100644
index 000000000000..dd7a19c22484
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/livelossplot/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, bokeh
+, ipython
+, matplotlib
+, numpy
+, nbconvert
+, nbformat
+}:
+
+buildPythonPackage rec {
+  pname = "livelossplot";
+  version = "0.5.5";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner  = "stared";
+    repo   = pname;
+    rev    = "v${version}";
+    sha256 = "sha256-YU8vX4SubI6txmC/i5fOjcvWfuDFm8+SPmie8Eb1qRs=";
+  };
+
+  propagatedBuildInputs = [ bokeh ipython matplotlib numpy ];
+
+  nativeCheckInputs = [ nbconvert nbformat pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Live training loss plot in Jupyter for Keras, PyTorch, and others";
+    homepage = "https://github.com/stared/livelossplot";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/livereload/default.nix b/nixpkgs/pkgs/development/python-modules/livereload/default.nix
new file mode 100644
index 000000000000..de2064538047
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/livereload/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, django
+, tornado
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "livereload";
+  version = "2.6.3";
+
+  src = fetchFromGitHub {
+    owner = "lepture";
+    repo = "python-livereload";
+    rev = version;
+    sha256 = "1alp83h3l3771l915jqa1ylyllad7wxnmblayan0z0zj37jkp9n7";
+  };
+
+  buildInputs = [ django ];
+
+  propagatedBuildInputs = [ tornado six ];
+
+  nativeCheckInputs = [ nose ];
+  # TODO: retry running all tests after v2.6.1
+  checkPhase = "NOSE_EXCLUDE=test_watch_multiple_dirs nosetests -s";
+
+  meta = {
+    description = "Runs a local server that reloads as you develop";
+    homepage = "https://github.com/lepture/python-livereload";
+    license = lib.licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/livestreamer-curses/default.nix b/nixpkgs/pkgs/development/python-modules/livestreamer-curses/default.nix
new file mode 100644
index 000000000000..213caaf4fb30
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/livestreamer-curses/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPyPy
+, livestreamer
+}:
+
+buildPythonPackage rec {
+  pname = "livestreamer-curses";
+  version = "1.5.2";
+  disabled = isPyPy;
+
+  src = fetchFromGitHub {
+    owner = "gapato";
+    repo = "livestreamer-curses";
+    rev = "v${version}";
+    hash = "sha256-Pi0PIOUhMMAWft9ackB04IgF6DyPrXppNqyVjozIjN4=";
+  };
+
+  propagatedBuildInputs = [ livestreamer ];
+
+  meta = with lib; {
+    homepage = "https://github.com/gapato/livestreamer-curses";
+    description = "Curses frontend for livestreamer";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/livestreamer/default.nix b/nixpkgs/pkgs/development/python-modules/livestreamer/default.nix
new file mode 100644
index 000000000000..c7c4b06a9746
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/livestreamer/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPyPy
+, makeWrapper
+, rtmpdump
+, pycrypto
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "livestreamer";
+  version = "1.12.2";
+  disabled = isPyPy;
+
+  src = fetchFromGitHub {
+    owner = "chrippa";
+    repo = "livestreamer";
+    rev = "v${version}";
+    hash = "sha256-PqqyBh+oMmu7Ynly3fqx/+6mQYX+6SpI0Okj2O+YLz0=";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  propagatedBuildInputs = [ rtmpdump pycrypto requests ];
+
+  postInstall = ''
+    wrapProgram $out/bin/livestreamer --prefix PATH : ${lib.makeBinPath [ rtmpdump ]}
+  '';
+
+  meta = with lib; {
+    homepage = "http://livestreamer.tanuki.se";
+    description = "Livestreamer is CLI program that extracts streams from various services and pipes them into a video player of choice";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lizard/default.nix b/nixpkgs/pkgs/development/python-modules/lizard/default.nix
new file mode 100644
index 000000000000..b54e910cac45
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lizard/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, mock
+, jinja2
+}:
+
+buildPythonPackage rec {
+  pname = "lizard";
+  version = "1.17.10";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "terryyin";
+    repo = "lizard";
+    rev = version;
+    hash = "sha256-4jq6gXpI1hFtX7ka2c/qQ+S6vZCThKOGhQwJ2FOYItY=";
+  };
+
+  propagatedBuildInputs = [ jinja2 ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+  ];
+
+  pythonImportsCheck = [
+    "lizard"
+  ];
+
+  meta = with lib; {
+    description = "Code analyzer without caring the C/C++ header files";
+    homepage = "http://www.lizard.ws";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jpetrucciani ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/llfuse/default.nix b/nixpkgs/pkgs/development/python-modules/llfuse/default.nix
new file mode 100644
index 000000000000..85c6d0fb50fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/llfuse/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, cython_3
+, fuse
+, pkg-config
+, pytestCheckHook
+, python
+, setuptools
+, which
+}:
+
+buildPythonPackage rec {
+  pname = "llfuse";
+  version = "1.5.0";
+
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "python-llfuse";
+    repo = "python-llfuse";
+    rev = "refs/tags/release-${version}";
+    hash = "sha256-6/iW5eHmX6ODVPLFkOo3bN9yW8ixqy2MHwQ2r9FA0iI=";
+  };
+
+  nativeBuildInputs = [ cython_3 pkg-config setuptools ];
+
+  buildInputs = [ fuse ];
+
+  preConfigure = ''
+    substituteInPlace setup.py \
+        --replace "'pkg-config'" "'${stdenv.cc.targetPrefix}pkg-config'"
+  '';
+
+  preBuild = ''
+    ${python.pythonOnBuildForHost.interpreter} setup.py build_cython
+  '';
+
+  # On Darwin, the test requires macFUSE to be installed outside of Nix.
+  doCheck = !stdenv.isDarwin;
+  nativeCheckInputs = [ pytestCheckHook which ];
+
+  disabledTests = [
+    "test_listdir" # accesses /usr/bin
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for the low-level FUSE API";
+    homepage = "https://github.com/python-llfuse/python-llfuse";
+    changelog = "https://github.com/python-llfuse/python-llfuse/raw/release-${version}/Changes.rst";
+    license = licenses.lgpl2Plus;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ bjornfor dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/llm/001-disable-install-uninstall-commands.patch b/nixpkgs/pkgs/development/python-modules/llm/001-disable-install-uninstall-commands.patch
new file mode 100644
index 000000000000..cef7fba13343
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/llm/001-disable-install-uninstall-commands.patch
@@ -0,0 +1,34 @@
+diff --git a/llm/cli.py b/llm/cli.py
+index af37feb..18b078a 100644
+--- a/llm/cli.py
++++ b/llm/cli.py
+@@ -1014,18 +1014,7 @@ def templates_path():
+ )
+ def install(packages, upgrade, editable, force_reinstall, no_cache_dir):
+     """Install packages from PyPI into the same environment as LLM"""
+-    args = ["pip", "install"]
+-    if upgrade:
+-        args += ["--upgrade"]
+-    if editable:
+-        args += ["--editable", editable]
+-    if force_reinstall:
+-        args += ["--force-reinstall"]
+-    if no_cache_dir:
+-        args += ["--no-cache-dir"]
+-    args += list(packages)
+-    sys.argv = args
+-    run_module("pip", run_name="__main__")
++    click.echo("Install command has been disabled for Nix. If you want to install extra llm plugins, use llm.withPlugins([]) expression.")
+ 
+ 
+ @cli.command()
+@@ -1033,8 +1022,7 @@ def install(packages, upgrade, editable, force_reinstall, no_cache_dir):
+ @click.option("-y", "--yes", is_flag=True, help="Don't ask for confirmation")
+ def uninstall(packages, yes):
+     """Uninstall Python packages from the LLM environment"""
+-    sys.argv = ["pip", "uninstall"] + list(packages) + (["-y"] if yes else [])
+-    run_module("pip", run_name="__main__")
++    click.echo("Uninstall command has been disabled for Nix. If you want to uninstall extra llm plugins, just remove them from llm.withPlugins([]) list expression.")
+ 
+ 
+ @cli.command()
diff --git a/nixpkgs/pkgs/development/python-modules/llm/default.nix b/nixpkgs/pkgs/development/python-modules/llm/default.nix
new file mode 100644
index 000000000000..318f67353308
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/llm/default.nix
@@ -0,0 +1,107 @@
+{
+  buildPythonApplication,
+  buildPythonPackage,
+  fetchFromGitHub,
+  lib,
+  makeWrapper,
+  pytestCheckHook,
+  python3,
+  pythonOlder,
+  ruff,
+  setuptools,
+}: let
+  llm = buildPythonPackage rec {
+    pname = "llm";
+    version = "0.12";
+    pyproject = true;
+
+    disabled = pythonOlder "3.8";
+
+    src = fetchFromGitHub {
+      owner = "simonw";
+      repo = pname;
+      rev = "refs/tags/${version}";
+      hash = "sha256-aCqdw2co/cXrBwVY/k/aSLl3C22nlH5LvU2yir1/NnQ=";
+    };
+
+    patches = [
+      ./001-disable-install-uninstall-commands.patch
+    ];
+
+    nativeBuildInputs = [
+      setuptools
+    ];
+
+    propagatedBuildInputs = with python3.pkgs; [
+      click-default-group
+      numpy
+      openai
+      pluggy
+      pydantic
+      python-ulid
+      pyyaml
+      setuptools # for pkg_resources
+      sqlite-migrate
+      sqlite-utils
+    ];
+
+    nativeCheckInputs = with python3.pkgs; [
+      cogapp
+      numpy
+      pytestCheckHook
+      requests-mock
+    ];
+
+    doCheck = true;
+
+    pytestFlagsArray = [
+      "-svv"
+      "tests/"
+    ];
+
+    pythonImportsCheck = [
+      "llm"
+    ];
+
+    passthru = {inherit withPlugins;};
+
+    meta = with lib; {
+      homepage = "https://github.com/simonw/llm";
+      description = "Access large language models from the command-line";
+      changelog = "https://github.com/simonw/llm/releases/tag/${version}";
+      license = licenses.asl20;
+      mainProgram = "llm";
+      maintainers = with maintainers; [aldoborrero];
+    };
+  };
+
+  withPlugins = plugins: buildPythonApplication {
+    inherit (llm) pname version;
+    format = "other";
+
+    disabled = pythonOlder "3.8";
+
+    dontUnpack = true;
+    dontBuild = true;
+    doCheck = false;
+
+    nativeBuildInputs = [
+      makeWrapper
+    ];
+
+    installPhase = ''
+      makeWrapper ${llm}/bin/llm $out/bin/llm \
+        --prefix PYTHONPATH : "${llm}/${python3.sitePackages}:$PYTHONPATH"
+      ln -sfv ${llm}/lib $out/lib
+    '';
+
+    propagatedBuildInputs = llm.propagatedBuildInputs ++ plugins;
+
+    passthru = llm.passthru // {
+      withPlugins = morePlugins: withPlugins (morePlugins ++ plugins);
+    };
+
+    inherit (llm) meta;
+  };
+in
+  llm
diff --git a/nixpkgs/pkgs/development/python-modules/llvmlite/default.nix b/nixpkgs/pkgs/development/python-modules/llvmlite/default.nix
new file mode 100644
index 000000000000..e3afe80624fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/llvmlite/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, python
+, llvm
+, pythonOlder
+, isPyPy
+, enum34
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "llvmlite";
+  # The main dependency of llvmlite is numba, which we currently package an
+  # untagged version of it (for numpy>1.25 support). That numba version
+  # requires at least this version of llvmlite (also not yet officially
+  # released, but at least tagged).
+  version = "0.41.0dev0";
+
+  disabled = isPyPy || !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "numba";
+    repo = "llvmlite";
+    rev = "v${version}";
+    hash = "sha256-fsH+rqouweNENU+YlWr7m0bC0YdreQLNp1n2rwrOiFw=";
+  };
+
+  nativeBuildInputs = [ llvm ];
+  propagatedBuildInputs = lib.optional (pythonOlder "3.4") enum34;
+
+  # Disable static linking
+  # https://github.com/numba/llvmlite/issues/93
+  postPatch = ''
+    substituteInPlace ffi/Makefile.linux --replace "-static-libstdc++" ""
+
+    substituteInPlace llvmlite/tests/test_binding.py --replace "test_linux" "nope"
+  '';
+
+  # Set directory containing llvm-config binary
+  preConfigure = ''
+    export LLVM_CONFIG=${llvm.dev}/bin/llvm-config
+  '';
+
+  checkPhase = ''
+    ${python.executable} runtests.py
+  '';
+
+  __impureHostDeps = lib.optionals stdenv.isDarwin [ "/usr/lib/libm.dylib" ];
+
+  passthru.llvm = llvm;
+
+  meta = with lib; {
+    description = "A lightweight LLVM python binding for writing JIT compilers";
+    homepage = "http://llvmlite.pydata.org/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lmdb/default.nix b/nixpkgs/pkgs/development/python-modules/lmdb/default.nix
new file mode 100644
index 000000000000..3f145ed367e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lmdb/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, cffi
+, lmdb
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "lmdb";
+  version = "1.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-H0x2ryTpB1k0h8kE7166GZO+s47Tha+CrbJahY8tZY0=";
+  };
+
+  buildInputs = [
+    lmdb
+  ];
+
+  nativeCheckInputs = [
+    cffi
+    pytestCheckHook
+  ];
+
+  LMDB_FORCE_SYSTEM=1;
+
+  meta = with lib; {
+    description = "Universal Python binding for the LMDB 'Lightning' Database";
+    homepage = "https://github.com/dw/py-lmdb";
+    changelog = "https://github.com/jnwatson/py-lmdb/blob/py-lmdb_${version}/ChangeLog";
+    license = licenses.openldap;
+    maintainers = with maintainers; [ copumpkin ivan ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lmfit/default.nix b/nixpkgs/pkgs/development/python-modules/lmfit/default.nix
new file mode 100644
index 000000000000..d96eb4d4c9ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lmfit/default.nix
@@ -0,0 +1,61 @@
+{ lib,
+  buildPythonPackage,
+  fetchPypi,
+  setuptools,
+  setuptools-scm,
+  asteval,
+  numpy,
+  scipy,
+  uncertainties,
+  pytestCheckHook,
+  pandas,
+  matplotlib,
+}:
+
+buildPythonPackage rec {
+  pname = "lmfit";
+  version = "1.2.2";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BEoFKhGmHaBXYnRQTBfrfigDtBEo4lgh6WYyIH8jyIw=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg --replace "--cov=lmfit --cov-report html" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    asteval
+    numpy
+    scipy
+    uncertainties
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pandas
+    matplotlib
+  ];
+
+  disabledTests = [
+    # https://github.com/lmfit/lmfit-py/issues/878
+    "test_emcee_multiprocessing"
+    "test_explicit_independent_vars"
+    "test_result_eval_custom_x"
+  ];
+
+  meta = with lib; {
+    description = "Least-Squares Minimization with Bounds and Constraints";
+    homepage = "https://lmfit-py.readthedocs.io/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ nomeata ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lml/default.nix b/nixpkgs/pkgs/development/python-modules/lml/default.nix
new file mode 100644
index 000000000000..e1d900ba6574
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lml/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "lml";
+  version = "0.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "57a085a29bb7991d70d41c6c3144c560a8e35b4c1030ffb36d85fa058773bcc5";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+  ];
+
+  # Tests broken.
+  doCheck = false;
+
+  meta = {
+    description = "Load me later. A lazy plugin management system for Python";
+    homepage = "http://lml.readthedocs.io/";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lmnotify/default.nix b/nixpkgs/pkgs/development/python-modules/lmnotify/default.nix
new file mode 100644
index 000000000000..bf9d857dc74d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lmnotify/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, oauthlib
+, requests
+, requests-oauthlib
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "lmnotify";
+  version = "0.0.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-cCP7BU2f7QJe9gAI298cvkp3OGijvBv8G1RN7qfZ5PE=";
+  };
+
+  propagatedBuildInputs = [
+    oauthlib
+    requests
+    requests-oauthlib
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "lmnotify"
+  ];
+
+  meta = with lib; {
+    description = "Python package for sending notifications to LaMetric Time";
+    homepage = "https://github.com/keans/lmnotify";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rhoriguchi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lmtpd/default.nix b/nixpkgs/pkgs/development/python-modules/lmtpd/default.nix
new file mode 100644
index 000000000000..bb27c29173b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lmtpd/default.nix
@@ -0,0 +1,20 @@
+{ buildPythonPackage, fetchPypi, isPy3k, lib }:
+
+buildPythonPackage rec {
+  pname = "lmtpd";
+  version = "6.2.0";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2c6825d2ffa1de099440411a742f58e1b3e8deeb3345adcfd4c2c38d4baf62b3";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/moggers87/lmtpd";
+    description = "LMTP counterpart to smtpd in the Python standard library";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/loca/default.nix b/nixpkgs/pkgs/development/python-modules/loca/default.nix
new file mode 100644
index 000000000000..28a9020d7444
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/loca/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, pythonOlder, fetchFromSourcehut, flit-core }:
+
+buildPythonPackage rec {
+  pname = "loca";
+  version = "2.0.1";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromSourcehut {
+    owner = "~cnx";
+    repo = pname;
+    rev = version;
+    sha256 = "1l6jimw3wd81nz1jrzsfw1zzsdm0jm998xlddcqaq0h38sx69w8g";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  doCheck = false; # all checks are static analyses
+  pythonImportsCheck = [ "loca" ];
+
+  meta = with lib; {
+    description = "Local locations";
+    homepage = "https://pypi.org/project/loca";
+    license = licenses.lgpl3Plus;
+    maintainers = [ maintainers.McSinyx ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/localimport/default.nix b/nixpkgs/pkgs/development/python-modules/localimport/default.nix
new file mode 100644
index 000000000000..c5bc45aae4f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/localimport/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "localimport";
+  version = "1.7.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8UhaZyGdN/N6UwR7pPYQR2hZCz3TrBxr1KOBJRx28ok=";
+  };
+
+  pythonImportsCheck = [ "localimport" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/NiklasRosenstein/py-localimport";
+    description = "Isolated import of Python modules";
+    license = licenses.mit;
+    maintainers = with maintainers; [ AndersonTorres ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/localstack-client/default.nix b/nixpkgs/pkgs/development/python-modules/localstack-client/default.nix
new file mode 100644
index 000000000000..65744f35d075
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/localstack-client/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, boto3
+, pytestCheckHook
+
+# downstream dependencies
+, localstack
+}:
+
+buildPythonPackage rec {
+  pname = "localstack-client";
+  version = "1.39";
+
+  src = fetchFromGitHub {
+    owner = "localstack";
+    repo = "localstack-python-client";
+    # Request for proper tags: https://github.com/localstack/localstack-python-client/issues/38
+    rev = "f1e538ad23700e5b1afe98720404f4801475e470";
+    hash = "sha256-MBXTiTzCwkduJPPRN7OKaWy2q9J8xCX/GGu09tyac3A=";
+  };
+
+  propagatedBuildInputs = [
+    boto3
+  ];
+
+  pythonImportsCheck = [
+    "localstack_client"
+  ];
+
+  # All commands test `localstack` which is a downstream dependency
+  doCheck = false;
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Has trouble creating a socket
+    "test_session"
+  ];
+
+  # For tests
+  __darwinAllowLocalNetworking = true;
+
+  passthru.tests = {
+    inherit localstack;
+  };
+
+  meta = with lib; {
+    description = "A lightweight Python client for LocalStack";
+    homepage = "https://github.com/localstack/localstack-python-client";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/localstack-ext/default.nix b/nixpkgs/pkgs/development/python-modules/localstack-ext/default.nix
new file mode 100644
index 000000000000..f312371afe9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/localstack-ext/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, dill
+, dnslib
+, dnspython
+, plux
+, pyaes
+, python-jose
+, requests
+, tabulate
+
+# Sensitive downstream dependencies
+, localstack
+}:
+
+buildPythonPackage rec {
+  pname = "localstack-ext";
+  version = "2.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Ex5ZPlteDaiyex90QumucVdTTbpp9uWiBrvw1kMr++8=";
+  };
+
+  postPatch = ''
+    # Avoid circular dependency
+    sed -i '/localstack>=/d' setup.cfg
+
+    # Pip is unable to resolve attr logic, so it will emit version as 0.0.0
+    substituteInPlace setup.cfg \
+      --replace "version = attr: localstack_ext.__version__" "version = ${version}"
+    cat setup.cfg
+
+    substituteInPlace setup.cfg \
+      --replace "dill==0.3.2" "dill~=0.3.0" \
+      --replace "requests>=2.20.0,<2.26" "requests~=2.20"
+  '';
+
+  propagatedBuildInputs = [
+    dill
+    dnslib
+    dnspython
+    plux
+    pyaes
+    python-jose
+    requests
+    tabulate
+  ];
+
+  pythonImportsCheck = [ "localstack_ext" ];
+
+  # No tests in repo
+  doCheck = false;
+
+  passthru.tests = {
+    inherit localstack;
+  };
+
+  meta = with lib; {
+    description = "Extensions for LocalStack";
+    homepage = "https://github.com/localstack/localstack";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/localstack/default.nix b/nixpkgs/pkgs/development/python-modules/localstack/default.nix
new file mode 100644
index 000000000000..663b20e5355f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/localstack/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, apispec
+, boto3
+, cachetools
+, click
+, localstack-client
+, localstack-ext
+, plux
+, psutil
+, python-dotenv
+, pyyaml
+, packaging
+, requests
+, rich
+, semver
+, tailer
+}:
+
+buildPythonPackage rec {
+  pname = "localstack";
+  version = "3.0.0";
+
+  src = fetchFromGitHub {
+    owner = "localstack";
+    repo = "localstack";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-N/Mc1bubCcq38VxUqkO9LGG25pEetEyJ+VJMdg/7hrU=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "requests>=2.20.0,<2.26" "requests~=2.20" \
+      --replace "cachetools~=5.0.0" "cachetools~=5.0" \
+      --replace "boto3>=1.20,<1.25.0" "boto3~=1.20"
+  '';
+
+  propagatedBuildInputs = [
+    apispec
+    boto3
+    cachetools
+    click
+    localstack-client
+    localstack-ext
+    plux
+    psutil
+    python-dotenv
+    pyyaml
+    packaging
+    requests
+    rich
+    semver
+    tailer
+  ];
+
+  pythonImportsCheck = [ "localstack" ];
+
+  # Test suite requires boto, which has been removed from nixpkgs
+  # Just do minimal test, buildPythonPackage maps checkPhase
+  # to installCheckPhase, so we can test that entrypoint point works.
+  checkPhase = ''
+    $out/bin/localstack --version
+  '';
+
+  meta = with lib; {
+    description = "A fully functional local Cloud stack";
+    homepage = "https://github.com/localstack/localstack";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/localzone/default.nix b/nixpkgs/pkgs/development/python-modules/localzone/default.nix
new file mode 100644
index 000000000000..c84cd1c893b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/localzone/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, dnspython
+, sphinx
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "localzone";
+  version = "0.9.8";
+
+  src = fetchFromGitHub {
+    owner = "ags-slc";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1cbiv21yryjqy46av9hbjccks95sxznrx8nypd3yzihf1vkjiq5a";
+  };
+
+  propagatedBuildInputs = [ dnspython sphinx ];
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "A simple DNS library for managing zone files";
+    homepage = "https://localzone.iomaestro.com";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ flyfloh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/locationsharinglib/default.nix b/nixpkgs/pkgs/development/python-modules/locationsharinglib/default.nix
new file mode 100644
index 000000000000..5f47be17a4db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/locationsharinglib/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, betamax
+, buildPythonPackage
+, cachetools
+, coloredlogs
+, emoji
+, fetchPypi
+, nose
+, pythonOlder
+, pytz
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "locationsharinglib";
+  version = "5.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ydwtcIJ2trQ6xg2r5kU/ogvjdBwUZhYhBdc6nBmSGcg=";
+  };
+
+  propagatedBuildInputs = [
+    coloredlogs
+    requests
+    cachetools
+    pytz
+  ];
+
+  nativeCheckInputs = [
+    betamax
+    emoji
+    nose
+  ];
+
+  postPatch = ''
+    # Tests requirements want to pull in multiple modules which we don't need
+    substituteInPlace setup.py \
+      --replace "tests_require=test_requirements" "tests_require=[]"
+    substituteInPlace requirements.txt \
+      --replace "coloredlogs>=15.0.1" "coloredlogs" \
+      --replace "pytz>=2023.3" "pytz"
+  '';
+
+  checkPhase = ''
+    runHook preCheck
+    # Only coverage no real unit tests
+    nosetests
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "locationsharinglib"
+  ];
+
+  meta = with lib; {
+    description = "Python package to retrieve coordinates from a Google account";
+    homepage = "https://locationsharinglib.readthedocs.io/";
+    changelog = "https://github.com/costastf/locationsharinglib/blob/${version}/HISTORY.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/locket/default.nix b/nixpkgs/pkgs/development/python-modules/locket/default.nix
new file mode 100644
index 000000000000..e416d8dd8288
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/locket/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "locket";
+  version = "1.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XA1MBSqLu/dQ4Fao5lzNMJCG9PDxii6sMGqN+kESpjI=";
+  };
+
+  # weird test requirements (spur.local>=0.3.7,<0.4)
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "locket"
+  ];
+
+  meta = with lib; {
+    description = "Library which provides a lock that can be used by multiple processes";
+    homepage = "https://github.com/mwilliamson/locket.py";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ teh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lockfile/default.nix b/nixpkgs/pkgs/development/python-modules/lockfile/default.nix
new file mode 100644
index 000000000000..2368c4415ba4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lockfile/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pbr
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "lockfile";
+  version = "0.12.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799";
+  };
+
+  buildInputs = [ pbr ];
+  nativeCheckInputs = [ nose ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  meta = with lib; {
+    homepage = "https://launchpad.net/pylockfile";
+    description = "Platform-independent advisory file locking capability for Python applications";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/log-symbols/default.nix b/nixpkgs/pkgs/development/python-modules/log-symbols/default.nix
new file mode 100644
index 000000000000..819f771b91ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/log-symbols/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage
+, colorama
+, fetchPypi
+, isPy27
+, lib }:
+
+buildPythonPackage rec {
+  pname = "log_symbols";
+  version = "0.0.14";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0mh5d0igw33libfmbsr1ri1p1y644p36nwaa2w6kzrd8w5pvq2yg";
+  };
+
+  propagatedBuildInputs = [ colorama ];
+
+  # Tests are not included in the PyPI distribution and the git repo does not have tagged releases
+  doCheck = false;
+  pythonImportsCheck = [ "log_symbols" ];
+
+  meta = with lib; {
+    description = "Colored Symbols for Various Log Levels.";
+    homepage = "https://github.com/manrajgrover/py-log-symbols";
+    license = licenses.mit;
+    maintainers = with maintainers; [ urbas ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/logbook/default.nix b/nixpkgs/pkgs/development/python-modules/logbook/default.nix
new file mode 100644
index 000000000000..d8251a40099f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/logbook/default.nix
@@ -0,0 +1,87 @@
+{ lib
+, brotli
+, buildPythonPackage
+, cython
+, execnet
+, fetchFromGitHub
+, jinja2
+, pytestCheckHook
+, pythonOlder
+, pyzmq
+, redis
+, setuptools
+, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "logbook";
+  version = "1.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "getlogbook";
+    repo = "logbook";
+    rev = "refs/tags/${version}";
+    hash = "sha256-2K6fM6MFrh3l0smhSz8RFd79AIOXQZJQbNLTJM4WZUo=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    setuptools
+  ];
+
+  passthru.optional-dependencies = {
+    execnet = [
+      execnet
+    ];
+    sqlalchemy = [
+      sqlalchemy
+    ];
+    redis = [
+      redis
+    ];
+    zmq = [
+      pyzmq
+    ];
+    compression = [
+      brotli
+    ];
+    jinja = [
+      jinja2
+    ];
+    all = [
+      brotli
+      execnet
+      jinja2
+      pyzmq
+      redis
+      sqlalchemy
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  # Some of the tests use localhost networking.
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [
+    "logbook"
+  ];
+
+  disabledTests = [
+    # Test require Redis instance
+    "test_redis_handler"
+  ];
+
+  meta = with lib; {
+    description = "A logging replacement for Python";
+    homepage = "https://logbook.readthedocs.io/";
+    changelog = "https://github.com/getlogbook/logbook/blob/${version}/CHANGES";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/logfury/default.nix b/nixpkgs/pkgs/development/python-modules/logfury/default.nix
new file mode 100644
index 000000000000..9909ab410675
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/logfury/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, pytestCheckHook
+, pythonOlder
+, testfixtures
+}:
+
+buildPythonPackage rec {
+  pname = "logfury";
+  version = "1.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-EwpdrOq5rVNJJCUt33BIKqLJZmKzo4JafTCYHQO3aiY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    testfixtures
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'setuptools_scm<6.0'" "'setuptools_scm'"
+  '';
+
+  pythonImportsCheck = [
+    "logfury"
+  ];
+
+  meta = with lib; {
+    description = "Python module that allows for responsible, low-boilerplate logging of method calls";
+    homepage = "https://github.com/ppolewicz/logfury";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jwiegley ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/logging-journald/default.nix b/nixpkgs/pkgs/development/python-modules/logging-journald/default.nix
new file mode 100644
index 000000000000..92cb8475c9d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/logging-journald/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "logging-journald";
+  version = "0.6.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mosquito";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-EyKXc/Qr9mRFngDqbCPNVs/0eD9OCbQq0FbymA6kpLQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  # Circular dependency with aiomisc
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "logging_journald"
+  ];
+
+  meta = with lib; {
+    description = "Logging handler for writing logs to the journald";
+    homepage = "https://github.com/mosquito/logging-journald";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/logi-circle/default.nix b/nixpkgs/pkgs/development/python-modules/logi-circle/default.nix
new file mode 100644
index 000000000000..51d66dd40672
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/logi-circle/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, aiohttp
+, python-slugify
+, pytz
+, aresponses
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "logi-circle";
+  version = "0.2.3";
+
+  disabled = pythonOlder "3.6";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "evanjd";
+    repo = "python-logi-circle";
+    rev = "v${version}";
+    hash = "sha256-Q+uoaimJjn6MiO3jXGYyZ6cS0tqI06Azkq1QbNq2FN8=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    python-slugify
+    pytz
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "logi_circle" ];
+
+  meta = {
+    description = "A Python library to communicate with Logi Circle cameras";
+    homepage = "https://github.com/evanjd/python-logi-circle";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/logical-unification/default.nix b/nixpkgs/pkgs/development/python-modules/logical-unification/default.nix
new file mode 100644
index 000000000000..6e78dc850ed0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/logical-unification/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, toolz
+, multipledispatch
+, py
+, pytestCheckHook
+, pytest-html
+, pytest-benchmark
+}:
+
+buildPythonPackage rec {
+  pname = "logical-unification";
+  version = "0.4.6";
+
+  src = fetchFromGitHub {
+    owner = "pythological";
+    repo = "unification";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-uznmlkREFONU1YoI/+mcfb+Yg30NinWvsMxTfHCXzOU=";
+  };
+
+  propagatedBuildInputs = [
+    toolz
+    multipledispatch
+  ];
+
+  nativeCheckInputs = [
+    py
+    pytestCheckHook
+    pytest-html
+    pytest-benchmark  # Needed for the `--benchmark-skip` flag
+  ];
+
+  pytestFlagsArray = [
+    "--benchmark-skip"
+    "--html=testing-report.html"
+    "--self-contained-html"
+  ];
+
+  pythonImportsCheck = [ "unification" ];
+
+  meta = with lib; {
+    description = "Straightforward unification in Python that's extensible via generic functions";
+    homepage = "https://github.com/pythological/unification";
+    changelog = "https://github.com/pythological/unification/releases";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ Etjean ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/logilab/common.nix b/nixpkgs/pkgs/development/python-modules/logilab/common.nix
new file mode 100644
index 000000000000..b03fd98eefe8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/logilab/common.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, importlib-metadata
+, mypy-extensions
+, typing-extensions
+, pytestCheckHook
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "logilab-common";
+  version = "1.11.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lWl6654nbOBCec24iJ7GGKEcYy/gYDn9wMil3PPqWkk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    setuptools
+    mypy-extensions
+    typing-extensions
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytz
+  ];
+
+  preCheck = ''
+    export COLLECT_DEPRECATION_WARNINGS_PACKAGE_NAME=true
+  '';
+
+  meta = with lib; {
+    description = "Python packages and modules used by Logilab ";
+    homepage = "https://logilab-common.readthedocs.io/";
+    changelog = "https://forge.extranet.logilab.fr/open-source/logilab-common/-/blob/branch/default/CHANGELOG.md";
+    license = licenses.lgpl21Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/logilab/constraint.nix b/nixpkgs/pkgs/development/python-modules/logilab/constraint.nix
new file mode 100644
index 000000000000..f97cb9593b6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/logilab/constraint.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, importlib-metadata
+, logilab-common
+, pip
+, six
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "logilab-constraint";
+  version = "0.6.2";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Jk6wvvcDEeHfy7dUcjbnzFIeGBYm5tXzCI26yy+t2qs=";
+  };
+
+  nativeBuildInputs = [
+    importlib-metadata
+    pip
+  ];
+
+  propagatedBuildInputs = [
+    logilab-common
+    setuptools
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    # avoid ModuleNotFoundError: No module named 'logilab.common' due to namespace
+    rm -r logilab
+  '';
+
+  disabledTests = [
+    # these tests are abstract test classes intended to be inherited
+    "Abstract"
+  ];
+
+  pythonImportsCheck = [ "logilab.constraint" ];
+
+  meta = with lib; {
+    description = "logilab-database provides some classes to make unified access to different";
+    homepage = "https://forge.extranet.logilab.fr/open-source/logilab-constraint";
+    changelog = "https://forge.extranet.logilab.fr/open-source/logilab-constraint/-/blob/${version}/CHANGELOG.md";
+    license = licenses.lgpl21Plus;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/logster/default.nix b/nixpkgs/pkgs/development/python-modules/logster/default.nix
new file mode 100644
index 000000000000..7f3a4eeb83b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/logster/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pygtail }:
+
+buildPythonPackage rec {
+  pname = "logster";
+  version = "1.0.1";
+
+  src = fetchFromGitHub {
+    owner = "etsy";
+    repo = pname;
+    rev = version;
+    sha256 = "06ac5hydas24h2cn8l5i69v1z0min5hwh6a1lcm1b08xnvpsi85q";
+  };
+
+  propagatedBuildInputs = [ pygtail ];
+
+  meta = with lib; {
+    description = "Parses log files, generates metrics for Graphite and Ganglia";
+    license = licenses.gpl3Plus;
+    homepage = "https://github.com/etsy/logster";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/loguru/default.nix b/nixpkgs/pkgs/development/python-modules/loguru/default.nix
new file mode 100644
index 000000000000..93e9d8937bd8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/loguru/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, colorama
+, fetchFromGitHub
+, freezegun
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "loguru";
+  version = "0.7.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Delgan";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-1xcPAOOhjFmWSxmPj6NICRur3ITOuQRNNKPJlfp89Jw=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    colorama
+    freezegun
+  ];
+
+  disabledTestPaths = [
+    "tests/test_type_hinting.py" # avoid dependency on mypy
+  ] ++ lib.optionals stdenv.isDarwin [
+    "tests/test_multiprocessing.py"
+  ];
+
+  disabledTests = [
+    # fails on some machine configurations
+    # AssertionError: assert '' != ''
+    "test_file_buffering"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_rotation_and_retention"
+    "test_rotation_and_retention_timed_file"
+    "test_renaming"
+    "test_await_complete_inheritance"
+  ];
+
+  pythonImportsCheck = [
+    "loguru"
+  ];
+
+  meta = with lib; {
+    description = "Python logging made (stupidly) simple";
+    homepage = "https://github.com/Delgan/loguru";
+    changelog = "https://github.com/delgan/loguru/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jakewaksbaum rmcgibbo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/logutils/default.nix b/nixpkgs/pkgs/development/python-modules/logutils/default.nix
new file mode 100644
index 000000000000..7f3584578563
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/logutils/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, redis
+, redis-server
+}:
+
+buildPythonPackage rec {
+  pname = "logutils";
+  version = "0.3.5";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bc058a25d5c209461f134e1f03cab637d66a7a5ccc12e593db56fbb279899a82";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    redis
+    redis-server
+  ];
+
+  disabledTests = [
+    # https://bitbucket.org/vinay.sajip/logutils/issues/4/035-pytest-test-suite-warnings-and-errors
+    "test_hashandlers"
+  ];
+
+  disabledTestPaths = lib.optionals (stdenv.isDarwin) [
+    # Exception: unable to connect to Redis server
+    "tests/test_redis.py"
+  ];
+
+  meta = with lib; {
+    description = "Logging utilities";
+    homepage = "https://bitbucket.org/vinay.sajip/logutils/";
+    license = licenses.bsd0;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/logzero/default.nix b/nixpkgs/pkgs/development/python-modules/logzero/default.nix
new file mode 100644
index 000000000000..5e6b45fa7f46
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/logzero/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, pytest }:
+
+buildPythonPackage rec {
+  pname = "logzero";
+  version = "1.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7f73ddd3ae393457236f081ffebd044a3aa2e423a47ae6ddb5179ab90d0ad082";
+  };
+
+  nativeCheckInputs = [ pytest ];
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/metachris/logzero";
+    description = "Robust and effective logging for Python 2 and 3";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jakewaksbaum ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lomond/default.nix b/nixpkgs/pkgs/development/python-modules/lomond/default.nix
new file mode 100644
index 000000000000..4fbdf5a2f823
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lomond/default.nix
@@ -0,0 +1,62 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, pythonAtLeast
+, pythonOlder
+
+# runtime
+, six
+
+# tests
+, freezegun
+, pytest-mock
+, pytestCheckHook
+, tornado_4
+}:
+
+buildPythonPackage rec {
+  pname = "lomond";
+  version = "0.3.3";
+
+  src = fetchFromGitHub {
+    owner = "wildfoundry";
+    repo = "dataplicity-${pname}";
+    rev = "b30dad3cc38d5ff210c5dd01f8c3c76aa6c616d1";
+    sha256 = "0lydq0imala08wxdyg2iwhqa6gcdrn24ah14h91h2zcxjhjk4gv8";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'" ""
+  '';
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    pytest-mock
+    pytestCheckHook
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    tornado_4
+  ];
+
+  disabledTests = [
+    # Makes HTTP requests
+    "test_proxy"
+    "test_live"
+  ];
+
+  disabledTestPaths = lib.optionals (pythonAtLeast "3.10") [
+    # requires tornado_4, which is not compatible with python3.10
+    "tests/test_integration.py"
+  ];
+
+  meta = with lib; {
+    description = "Websocket Client Library";
+    homepage = "https://github.com/wildfoundry/dataplicity-lomond";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jamiemagee ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/loopy/default.nix b/nixpkgs/pkgs/development/python-modules/loopy/default.nix
new file mode 100644
index 000000000000..8bdde865df9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/loopy/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, codepy
+, cgen
+, colorama
+, fetchFromGitHub
+, genpy
+, islpy
+, mako
+, numpy
+, pymbolic
+, pyopencl
+, pyrsistent
+, pythonOlder
+, pytools
+}:
+
+buildPythonPackage rec {
+  pname = "loopy";
+  version = "2020.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "inducer";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-GL2GY3fbP9yMEQYyuh4CRHpeN9DGnZxbMt6jC+O/C0g=";
+  };
+
+  propagatedBuildInputs = [
+    codepy
+    cgen
+    colorama
+    genpy
+    islpy
+    mako
+    numpy
+    pymbolic
+    pyopencl
+    pyrsistent
+    pytools
+  ];
+
+  # pyopencl._cl.LogicError: clGetPlatformIDs failed: PLATFORM_NOT_FOUND_KHR
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A code generator for array-based code on CPUs and GPUs";
+    homepage = "https://github.com/inducer/loopy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/looseversion/default.nix b/nixpkgs/pkgs/development/python-modules/looseversion/default.nix
new file mode 100644
index 000000000000..b16fd1a572d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/looseversion/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, hatchling
+}:
+
+buildPythonPackage rec {
+  pname = "looseversion";
+  version = "1.3.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "sha256-695l8/a7lTGoEBbG/vPrlaYRga3Ee3+UnpwOpHkRZp4=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+  pytestFlagsArray = [ "tests.py" ];
+  pythonImportsCheck = [ "looseversion" ];
+
+  meta = with lib; {
+    description = "Version numbering for anarchists and software realists";
+    homepage = "https://github.com/effigies/looseversion";
+    license = licenses.psfl;
+    maintainers = with maintainers; [ pelme ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/loqedapi/default.nix b/nixpkgs/pkgs/development/python-modules/loqedapi/default.nix
new file mode 100644
index 000000000000..332edd1c0112
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/loqedapi/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "loqedapi";
+  version = "2.1.8";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "cpolhout";
+    repo = "loqedAPI";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-9ekZ98GazH1tna4JT5SEUETKR227UYRIBBghdj+TFB4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # Tests require network access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "loqedAPI"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with the Loqed Smart Door Lock API";
+    homepage = "https://github.com/cpolhout/loqedAPI";
+    changelog = "https://github.com/cpolhout/loqedAPI/releases/tag/v${version}";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/losant-rest/default.nix b/nixpkgs/pkgs/development/python-modules/losant-rest/default.nix
new file mode 100644
index 000000000000..ee84d47edf55
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/losant-rest/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "losant-rest";
+  version = "1.19.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Losant";
+    repo = "losant-rest-python";
+    rev = "v${version}";
+    hash = "sha256-JaXADzNxRqumjx6FZxJj6ioMVdUMR6S1FQQ6QcP8S5Q=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pytestFlagsArray = [
+    "tests/losantrest_tests.py"
+  ];
+
+  pythonImportsCheck = [
+    "losantrest"
+  ];
+
+  meta = with lib; {
+    description = "Python module for consuming the Losant IoT Platform API";
+    homepage = "https://github.com/Losant/losant-rest-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lpc-checksum/default.nix b/nixpkgs/pkgs/development/python-modules/lpc-checksum/default.nix
new file mode 100644
index 000000000000..2ebdba9fe095
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lpc-checksum/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, intelhex
+}:
+
+buildPythonPackage rec {
+  pname = "lpc-checksum";
+  version = "3.0.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "basilfx";
+    repo = "lpc_checksum";
+    rev = "v${version}";
+    hash = "sha256-POgV0BdkMLmdjBh/FToPPmJTAxsPASB7ZE32SqGGKHk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    pytestCheckHook
+  ];
+
+  propagatedBuildInputs = [
+    intelhex
+  ];
+
+  pythonImportsCheck = [ "lpc_checksum" ];
+
+  meta = with lib; {
+    description = "Python script to calculate LPC firmware checksums";
+    homepage = "https://pypi.org/project/lpc-checksum/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ otavio ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lrcalc-python/default.nix b/nixpkgs/pkgs/development/python-modules/lrcalc-python/default.nix
new file mode 100644
index 000000000000..66c0ad46e5b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lrcalc-python/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, cython
+, pkg-config
+, lrcalc
+}:
+
+buildPythonPackage rec {
+  pname = "lrcalc-python";
+  version = "2.1";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "lrcalc";
+    sha256 = "e3a0509aeda487b412b391a52e817ca36b5c063a8305e09fd54d53259dd6aaa9";
+  };
+
+  nativeBuildInputs = [ cython pkg-config ];
+
+  buildInputs = [ lrcalc ];
+
+  pythonImportsCheck = [ "lrcalc" ];
+
+  meta = with lib; {
+    description = "Littlewood-Richardson Calculator bindings";
+    homepage = "https://sites.math.rutgers.edu/~asbuch/lrcalc/";
+    maintainers = teams.sage.members;
+    license = licenses.gpl3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lru-dict/default.nix b/nixpkgs/pkgs/development/python-modules/lru-dict/default.nix
new file mode 100644
index 000000000000..801d68dccb66
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lru-dict/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+let
+  pname = "lru-dict";
+  version = "1.3.0";
+in
+buildPythonPackage {
+  inherit pname version;
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VP0ZZta9H83ngVlsuGBoIU7e6/8dsTos6hEHnj/Qe2s=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "lru"
+  ];
+
+  meta = with lib; {
+    description = "Fast and memory efficient LRU cache for Python";
+    homepage = "https://github.com/amitdev/lru-dict";
+    changelog = "https://github.com/amitdev/lru-dict/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lsassy/default.nix b/nixpkgs/pkgs/development/python-modules/lsassy/default.nix
new file mode 100644
index 000000000000..a7860e91542e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lsassy/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, impacket
+, netaddr
+, pythonOlder
+, pypykatz
+, rich
+}:
+
+buildPythonPackage rec {
+  pname = "lsassy";
+  version = "3.1.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Hackndo";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-VGLSVv/+UpgeSTHoOTjEfQSAYfXA3bAI+yKjcKBI1Z4=";
+  };
+
+  propagatedBuildInputs = [
+    impacket
+    netaddr
+    pypykatz
+    rich
+  ];
+
+  # Tests require an active domain controller
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "lsassy"
+  ];
+
+  meta = with lib; {
+    description = "Python module to extract data from Local Security Authority Subsystem Service (LSASS)";
+    homepage = "https://github.com/Hackndo/lsassy";
+    changelog = "https://github.com/Hackndo/lsassy/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lsprotocol/default.nix b/nixpkgs/pkgs/development/python-modules/lsprotocol/default.nix
new file mode 100644
index 000000000000..5ee4d3ed1126
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lsprotocol/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, attrs
+, buildPythonPackage
+, cattrs
+, fetchFromGitHub
+, flit-core
+, importlib-resources
+, jsonschema
+, nox
+, pyhamcrest
+, pytest
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "lsprotocol";
+  version = "2023.0.0b1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "microsoft";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Y/Mp/8MskRB6irNU3CBOKmo2Zt5S69h+GyMg71sQ9Uw=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+    nox
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    cattrs
+  ];
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  checkInputs = [
+    importlib-resources
+    jsonschema
+    pyhamcrest
+  ];
+
+  preBuild = ''
+    cd packages/python
+  '';
+
+  preCheck = ''
+    cd ../../
+  '';
+
+  checkPhase = ''
+    runHook preCheck
+
+    sed -i "/^    _install_requirements/d" noxfile.py
+    nox --session tests
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "lsprotocol"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of the Language Server Protocol";
+    homepage = "https://github.com/microsoft/lsprotocol";
+    license = licenses.mit;
+    maintainers = with maintainers; [ doronbehar fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ltpycld2/default.nix b/nixpkgs/pkgs/development/python-modules/ltpycld2/default.nix
new file mode 100644
index 000000000000..558dab085dd9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ltpycld2/default.nix
@@ -0,0 +1,29 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "LTpycld2";
+  version = "0.42";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "948d0c1ab5518ab4efcbcc3cd73bb29f809f1dfb30f4d2fbd81b175a1ffeb516";
+  };
+
+  doCheck = false; # completely broken tests
+
+  pythonImportsCheck = [ "pycld2" ];
+
+  meta = with lib; {
+    description = "Python bindings around Google Chromium's embedded compact language detection library (CLD2)";
+    homepage = "https://github.com/LibreTranslate/pycld2";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ misuzu ];
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/luddite/default.nix b/nixpkgs/pkgs/development/python-modules/luddite/default.nix
new file mode 100644
index 000000000000..26570a1540b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/luddite/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pytestCheckHook
+, pytest-socket
+, pytest-mock
+}:
+
+buildPythonPackage rec {
+  pname = "luddite";
+  version = "1.0.2";
+
+  src = fetchFromGitHub {
+    owner = "jumptrading";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "8/7uwO5HLhyXYt+T6VUO/O7TN9+FfRlT8y0r5+CJ/l4=";
+  };
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace "--cov=luddite --cov-report=html --cov-report=term --no-cov-on-fail" ""
+  '';
+
+  propagatedBuildInputs = [ setuptools ];
+
+  nativeCheckInputs = [ pytestCheckHook pytest-socket pytest-mock ];
+  pythonImportsCheck = [ "luddite" ];
+
+  meta = with lib; {
+    description = "Checks for out-of-date package versions";
+    homepage = "https://github.com/jumptrading/luddite";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ emilytrau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/luftdaten/default.nix b/nixpkgs/pkgs/development/python-modules/luftdaten/default.nix
new file mode 100644
index 000000000000..b87771380a8d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/luftdaten/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, httpx
+, pytest-asyncio
+, pytest-httpx
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "luftdaten";
+  version = "0.7.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-ecosystem";
+    repo = "python-luftdaten";
+    rev = version;
+    hash = "sha256-nOhJKlUJ678DJ/ilyRHaiQ2fGfoCl+x6l9lsczVLAGw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-httpx
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "luftdaten" ];
+
+  meta = with lib; {
+    description = "Python API for interacting with luftdaten.info";
+    homepage = "https://github.com/home-assistant-ecosystem/python-luftdaten";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/luhn/default.nix b/nixpkgs/pkgs/development/python-modules/luhn/default.nix
new file mode 100644
index 000000000000..95d1cad3b807
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/luhn/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "luhn";
+  version = "0.2.0";
+
+  src = fetchFromGitHub {
+    owner = "mmcloughlin";
+    repo = pname;
+    rev = version;
+    hash = "sha256-ZifaCjOVhWdXuzi5n6V+6eVN5vrEHKgUdpSOXoMyR18=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "test.py"
+  ];
+
+  pythonImportsCheck = [
+    "luhn"
+  ];
+
+  meta = with lib; {
+    description = "Python module for generate and verify Luhn check digits";
+    homepage = "https://github.com/mmcloughlin/luhn";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lunarcalendar/default.nix b/nixpkgs/pkgs/development/python-modules/lunarcalendar/default.nix
new file mode 100644
index 000000000000..e5233fec6cb7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lunarcalendar/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+, python-dateutil
+, ephem
+, pytz
+
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "lunarcalendar";
+  version = "0.0.9";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "wolfhong";
+    repo = "LunarCalendar";
+    rev = "885418ea1a2a90b7e0bbe758919af9987fb2863b";
+    hash = "sha256-AhxCWWqCjlOroqs4pOSZTWoIQT8a1l/D2Rxuw1XUoU8=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    ephem
+    pytz
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "lunarcalendar" ];
+
+  meta = {
+    homepage = "https://github.com/wolfhong/LunarCalendar";
+    description = "A Lunar-Solar Converter, containing a number of lunar and solar festivals in China";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ tomasajt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lupa/default.nix b/nixpkgs/pkgs/development/python-modules/lupa/default.nix
new file mode 100644
index 000000000000..b2123b92eb1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lupa/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "lupa";
+  version = "2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rT/vSGvnrd3TSf6anDk3iQYTEs+Y68UztIm+NPSEy3k=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  pythonImportsCheck = [
+    "lupa"
+  ];
+
+  meta = with lib; {
+    description = "Lua in Python";
+    homepage = "https://github.com/scoder/lupa";
+    changelog = "https://github.com/scoder/lupa/blob/lupa-${version}/CHANGES.rst";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lupupy/default.nix b/nixpkgs/pkgs/development/python-modules/lupupy/default.nix
new file mode 100644
index 000000000000..d2481a5bada9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lupupy/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, colorlog
+, pyyaml
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "lupupy";
+  version = "0.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-mij5WGIl60D7ya1SdIvZ8TEgIZhJ9Xd2kcUnnbO1dD4=";
+  };
+
+  propagatedBuildInputs = [
+    colorlog
+    pyyaml
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "lupupy"
+  ];
+
+  meta = with lib; {
+    description = "Python module to control Lupusec alarm control panels";
+    homepage = "https://github.com/majuss/lupupy";
+    changelog = "https://github.com/majuss/lupupy/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/luqum/default.nix b/nixpkgs/pkgs/development/python-modules/luqum/default.nix
new file mode 100644
index 000000000000..2c9f78fc583c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/luqum/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+# dependencies
+, ply
+# test dependencies
+, elasticsearch-dsl
+}:
+let
+  pname = "luqum";
+  version = "0.13.0";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "jurismarches";
+    repo = pname;
+    rev = version;
+    hash = "sha256-lcJCLl0crCl3Y5UlWBMZJR2UtVP96gaJNRxwY9Xn7TM=";
+  };
+
+  propagatedBuildInputs = [
+    ply
+  ];
+
+  nativeCheckInputs = [
+    elasticsearch-dsl
+  ];
+
+  meta = with lib; {
+    description = "A lucene query parser generating ElasticSearch queries and more !";
+    homepage = "https://github.com/jurismarches/luqum";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/luxor/default.nix b/nixpkgs/pkgs/development/python-modules/luxor/default.nix
new file mode 100644
index 000000000000..1bd7a7bbc018
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/luxor/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytest-aiohttp
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "luxor";
+  version = "0.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "GIwVEOKZAudTu2M3OM4LFVR8e22q52m/AN0anskdmWQ=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "luxor"
+  ];
+
+  meta = with lib; {
+    description = "Python module to control FX Luminaire controllers";
+    homepage = "https://github.com/pbozeman/luxor";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/luxtronik/default.nix b/nixpkgs/pkgs/development/python-modules/luxtronik/default.nix
new file mode 100644
index 000000000000..14e0cece25c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/luxtronik/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "luxtronik";
+  version = "0.3.14";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Bouni";
+    repo = "python-luxtronik";
+    rev = version;
+    hash = "sha256-7TuvqOAb/MUumOF6BKTRLOJuvteqZPmFUXXsuwEpmOM=";
+  };
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "luxtronik"
+  ];
+
+  meta = with lib; {
+    description = "Python library to interact with Luxtronik heatpump controllers";
+    homepage = "https://github.com/Bouni/python-luxtronik";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lxmf/default.nix b/nixpkgs/pkgs/development/python-modules/lxmf/default.nix
new file mode 100644
index 000000000000..6081f17c2727
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lxmf/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, rns
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "lxmf";
+  version = "0.3.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "markqvist";
+    repo = "lxmf";
+    rev = "refs/tags/${version}";
+    hash = "sha256-tse2Hgu50KfxWLBkzyV4VpDj2YHgxIc5izgvwJAJ/7k=";
+  };
+
+  propagatedBuildInputs = [
+    rns
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "LXMF"
+  ];
+
+  meta = with lib; {
+    description = "Lightweight Extensible Message Format for Reticulum";
+    homepage = "https://github.com/markqvist/lxmf";
+    changelog = "https://github.com/markqvist/LXMF/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lxml-stubs/default.nix b/nixpkgs/pkgs/development/python-modules/lxml-stubs/default.nix
new file mode 100644
index 000000000000..8df03f526896
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lxml-stubs/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pytestCheckHook
+, pytest-mypy-plugins
+, lxml
+}:
+
+buildPythonPackage rec {
+  pname = "lxml-stubs";
+  version = "0.4.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "lxml";
+    repo = "lxml-stubs";
+    rev = version;
+    hash = "sha256-RRH/taLtgaXOl0G/ve2Ad7Xy8WRDUG2/k26EFMv1PRM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+  propagatedBuildInputs = [
+    lxml
+  ];
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mypy-plugins
+  ];
+
+  meta = with lib; {
+    description = "Type stubs for the lxml package";
+    homepage = "https://github.com/lxml/lxml-stubs";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ doronbehar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lxml/default.nix b/nixpkgs/pkgs/development/python-modules/lxml/default.nix
new file mode 100644
index 000000000000..db531a65778f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lxml/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, lib, buildPythonPackage, fetchFromGitHub
+, cython
+, libxml2
+, libxslt
+, zlib
+, xcodebuild
+}:
+
+buildPythonPackage rec {
+  pname = "lxml";
+  version = "4.9.3-3";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/lxml-${version}";
+    hash = "sha256-Vrizi+6jUUEx7qODU4PAH5ZmvBIyT9H18+QpYB0m1f4=";
+  };
+
+  # setuptoolsBuildPhase needs dependencies to be passed through nativeBuildInputs
+  nativeBuildInputs = [ libxml2.dev libxslt.dev cython ] ++ lib.optionals stdenv.isDarwin [ xcodebuild ];
+  buildInputs = [ libxml2 libxslt zlib ];
+
+  # tests are meant to be ran "in-place" in the same directory as src
+  doCheck = false;
+
+  pythonImportsCheck = [ "lxml" "lxml.etree" ];
+
+  meta = with lib; {
+    description = "Pythonic binding for the libxml2 and libxslt libraries";
+    homepage = "https://lxml.de";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lyricwikia/default.nix b/nixpkgs/pkgs/development/python-modules/lyricwikia/default.nix
new file mode 100644
index 000000000000..6f2bed6acb20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lyricwikia/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+, responses
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "lyricwikia";
+  version = "0.1.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "enricobacis";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-P88DrRAa2zptt8JLy0/PLi0oZ/BghF/XGSP0kOObi7E=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'" ""
+  '';
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    requests
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "lyricwikia"
+  ];
+
+  disabledTests = [
+    # Test requires network access
+    "test_integration"
+  ];
+
+  meta = with lib; {
+    description = "LyricWikia API for song lyrics";
+    homepage = "https://github.com/enricobacis/lyricwikia";
+    changelog = "https://github.com/enricobacis/lyricwikia/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kmein ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lz4/default.nix b/nixpkgs/pkgs/development/python-modules/lz4/default.nix
new file mode 100644
index 000000000000..ed06dca7c4c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lz4/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pkgconfig
+, psutil
+, pytestCheckHook
+, python
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "python-lz4";
+  version = "4.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  # get full repository in order to run tests
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-aVnXCrTh+0Ip+FgYWN7hLw8N3iQCmXSywhReD5RTUfI=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  postPatch = ''
+    sed -i '/pytest-cov/d' setup.py
+  '';
+
+  nativeBuildInputs = [
+    pkgconfig
+    setuptools-scm
+  ];
+
+  pythonImportsCheck = [
+    "lz4"
+    "lz4.block"
+    "lz4.frame"
+    "lz4.stream"
+  ];
+
+  nativeCheckInputs = [
+    psutil
+    pytestCheckHook
+  ];
+
+  # for lz4.steam
+  PYLZ4_EXPERIMENTAL = true;
+
+  # prevent local lz4 directory from getting imported as it lacks native extensions
+  preCheck = ''
+    rm -r lz4
+    export PYTHONPATH=$out/${python.sitePackages}:$PYTHONPATH
+  '';
+
+  meta = with lib; {
+    description = "LZ4 Bindings for Python";
+    homepage = "https://github.com/python-lz4/python-lz4";
+    changelog = "https://github.com/python-lz4/python-lz4/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lzallright/default.nix b/nixpkgs/pkgs/development/python-modules/lzallright/default.nix
new file mode 100644
index 000000000000..a82a7980c70f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lzallright/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, callPackage
+, fetchFromGitHub
+, rustPlatform
+, libiconv
+}:
+
+buildPythonPackage rec {
+  pname = "lzallright";
+  version = "0.2.3";
+
+  src = fetchFromGitHub {
+    owner = "vlaci";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Zzif6WtecgAkNmml0kt0Z+Ewx0L30ahr+kwzYR5aUAM=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-+pV9q2QM6qFA1a5E10OAsE7KJEUsTiEiU1KqO4/2rFw=";
+  };
+
+  format = "pyproject";
+
+  nativeBuildInputs = with rustPlatform; [ cargoSetupHook maturinBuildHook ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv ];
+
+  pythonImportsCheck = [ "lzallright" ];
+
+  doCheck = false;
+
+  passthru.tests = {
+    pytest = callPackage ./tests.nix { };
+  };
+
+  meta = with lib; {
+    description = ''
+      A Python 3.8+ binding for lzokay library which is an MIT licensed
+      a minimal, C++14 implementation of the LZO compression format.
+    '';
+    homepage = "https://github.com/vlaci/lzallright";
+    license = licenses.mit;
+    maintainers = with maintainers; [ vlaci ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lzallright/tests.nix b/nixpkgs/pkgs/development/python-modules/lzallright/tests.nix
new file mode 100644
index 000000000000..1093fc3c79e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lzallright/tests.nix
@@ -0,0 +1,15 @@
+{ lzallright, buildPythonPackage, pytestCheckHook }:
+
+buildPythonPackage {
+  inherit (lzallright) version src;
+  pname = "lzallright-tests";
+  format = "other";
+
+  dontBuild = true;
+  dontInstall = true;
+
+  nativeCheckInputs = [
+    lzallright
+    pytestCheckHook
+  ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/lzstring/default.nix b/nixpkgs/pkgs/development/python-modules/lzstring/default.nix
new file mode 100644
index 000000000000..499c720d53fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/lzstring/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, future
+}:
+
+buildPythonPackage rec {
+  pname   = "lzstring";
+  version = "1.0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "18ly9pppy2yspxzw7k1b23wk77k7m44rz2g0271bqgqrk3jn3yhs";
+  };
+
+  propagatedBuildInputs = [ future ];
+
+  meta = {
+    description = "lz-string for python";
+    homepage    = "https://github.com/gkovacs/lz-string-python";
+    license     = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ obadz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/m2crypto/default.nix b/nixpkgs/pkgs/development/python-modules/m2crypto/default.nix
new file mode 100644
index 000000000000..f8ec95604542
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/m2crypto/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, openssl
+, parameterized
+, pytestCheckHook
+, pythonOlder
+, swig2
+}:
+
+buildPythonPackage rec {
+  pname = "m2crypto";
+  version = "0.39.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "M2Crypto";
+    inherit version;
+    hash = "sha256-JMD0cTWLixmtTIqp2hLoaAMLZcH9syedAG32DJUBM4o=";
+  };
+
+  nativeBuildInputs = [
+    swig2
+    openssl
+  ];
+
+  buildInputs = [
+    openssl
+    parameterized
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "M2Crypto"
+  ];
+
+  meta = with lib; {
+    description = "A Python crypto and SSL toolkit";
+    homepage = "https://gitlab.com/m2crypto/m2crypto";
+    changelog = "https://gitlab.com/m2crypto/m2crypto/-/blob/${version}/CHANGES";
+    license = licenses.mit;
+    maintainers = with maintainers; [ andrew-d ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/m2r/default.nix b/nixpkgs/pkgs/development/python-modules/m2r/default.nix
new file mode 100644
index 000000000000..02dd3c540ac4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/m2r/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, docutils
+, mistune
+, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "m2r";
+  version = "0.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-qvtn/EnPsdieRqNEOsdH4V9LtC3yDtBPBnrZ777iVqs=";
+  };
+
+  patches = [
+    # fix tests in python 3.10
+    (fetchpatch {
+      url = "https://github.com/miyakogi/m2r/commit/58ee9cabdadf5e3deb13037f3052238f0f2bffcd.patch";
+      hash = "sha256-CN3PWmnk7xsn1wngRHuEWmDTP3HtVNxkFv0xzD2Zjlo=";
+    })
+    ./docutils-0.19-compat.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace tests/test_cli.py \
+      --replace "optional" "positional"
+  '';
+
+  propagatedBuildInputs = [ mistune docutils ];
+
+  nativeCheckInputs = [ pygments ];
+
+  meta = with lib; {
+    homepage = "https://github.com/miyakogi/m2r";
+    description = "Markdown to reStructuredText converter";
+    license = licenses.mit;
+    maintainers = with maintainers; [ AndersonTorres ];
+    # https://github.com/miyakogi/m2r/issues/66
+    broken = versionAtLeast mistune.version "2";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/m2r/docutils-0.19-compat.patch b/nixpkgs/pkgs/development/python-modules/m2r/docutils-0.19-compat.patch
new file mode 100644
index 000000000000..9392702b982e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/m2r/docutils-0.19-compat.patch
@@ -0,0 +1,15 @@
+diff --git a/m2r.py b/m2r.py
+index a4e43c2..fb9e588 100644
+--- a/m2r.py
++++ b/m2r.py
+@@ -10,8 +10,8 @@ from argparse import ArgumentParser, Namespace
+ 
+ from docutils import statemachine, nodes, io, utils
+ from docutils.parsers import rst
+-from docutils.core import ErrorString
+-from docutils.utils import SafeString, column_width
++from docutils.utils.error_reporting import ErrorString, SafeString
++from docutils.utils import column_width
+ import mistune
+ 
+ if sys.version_info < (3, ):
diff --git a/nixpkgs/pkgs/development/python-modules/m3u8/default.nix b/nixpkgs/pkgs/development/python-modules/m3u8/default.nix
new file mode 100644
index 000000000000..9ff8dfbf0e73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/m3u8/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, iso8601
+, bottle
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "m3u8";
+  version = "3.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "globocom";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-JLYRkibcvmNct2eIBfBP7z3gR680xhZL/Kn/1S7feoo=";
+  };
+
+  propagatedBuildInputs = [
+    iso8601
+  ];
+
+  nativeCheckInputs = [
+    bottle
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_load_should_create_object_from_uri"
+    "test_load_should_create_object_from_uri_with_relative_segments"
+    "test_load_should_remember_redirect"
+  ];
+
+  pythonImportsCheck = [
+    "m3u8"
+  ];
+
+  meta = with lib; {
+    description = "Python m3u8 parser";
+    homepage = "https://github.com/globocom/m3u8";
+    changelog = "https://github.com/globocom/m3u8/releases/tag//${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Scriptkiddi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mac-vendor-lookup/default.nix b/nixpkgs/pkgs/development/python-modules/mac-vendor-lookup/default.nix
new file mode 100644
index 000000000000..d4a1be562f9e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mac-vendor-lookup/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiofiles
+, aiohttp
+}:
+
+buildPythonPackage rec {
+  pname = "mac-vendor-lookup";
+  version = "0.1.12";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "bauerj";
+    repo = "mac_vendor_lookup";
+    rev = "90dbea48f8a9d567b5f9039ebd151ddfe7d12a19";
+    hash = "sha256-mPPJDrWdyvkTdb4WfeTNYwuC+Ek9vH7ORKRTREg+vK8=";
+  };
+
+  postPatch = ''
+    sed -i '/mac-vendors.txt/d' setup.py
+  '';
+
+  propagatedBuildInputs = [
+    aiofiles
+    aiohttp
+  ];
+
+  doCheck = false; # no tests
+
+  pythonImportsCheck = [
+    "mac_vendor_lookup"
+  ];
+
+  meta = with lib; {
+    description = "Find the vendor for a given MAC address";
+    homepage = "https://github.com/bauerj/mac_vendor_lookup";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mac_alias/default.nix b/nixpkgs/pkgs/development/python-modules/mac_alias/default.nix
new file mode 100644
index 000000000000..159dfa1d89ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mac_alias/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "mac-alias";
+  version = "2.2.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "mac_alias";
+    inherit version;
+    hash = "sha256-yZxyjrUS6VXBHxpiA6D/qIg7JlSeiv5ogEAxql2oVrc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  # pypi package does not include tests;
+  # tests anyway require admin privileges to succeed
+  doCheck = false;
+  pythonImportsCheck = [ "mac_alias" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/al45tair/mac_alias";
+    description = "Generate or read binary Alias and Bookmark records from Python code";
+    longDescription = ''
+      mac_alias lets you generate or read binary Alias and Bookmark records from Python code.
+
+      While it is written in pure Python, some OS X specific code is required
+      to generate a proper Alias or Bookmark record for a given file,
+      so this module currently is not portable to other platforms.
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ siriobalmelli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/macaddress/default.nix b/nixpkgs/pkgs/development/python-modules/macaddress/default.nix
new file mode 100644
index 000000000000..2849506671b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/macaddress/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, hypothesis
+, reprshed
+}:
+
+buildPythonPackage rec {
+  pname = "macaddress";
+  version = "2.0.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "mentalisttraceur";
+    repo = "python-macaddress";
+    rev = "v${version}";
+    hash = "sha256-2eD5Ui8kUduKLJ0mSiwaz7TQSeF1+2ASirp70V/8+EA=";
+  };
+
+  pythonImportsCheck = [
+    "macaddress"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    hypothesis
+    reprshed
+  ];
+
+  pytestFlagsArray = [
+    "$src/test.py"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mentalisttraceur/python-macaddress";
+    description = "A module for handling hardware identifiers like MAC addresses";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ netali ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/macfsevents/default.nix b/nixpkgs/pkgs/development/python-modules/macfsevents/default.nix
new file mode 100644
index 000000000000..aa65bb91bad0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/macfsevents/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, CoreFoundation
+, CoreServices
+}:
+
+buildPythonPackage rec {
+  pname = "MacFSEvents";
+  version = "0.8.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-v3KD8dUXdkzNyBlbIWMdu6wcUGuSC/mo6ilWsxJ2Ucs=";
+  };
+
+  buildInputs = [ CoreFoundation CoreServices ];
+
+  # Some tests fail under nix build directory
+  doCheck = false;
+
+  pythonImportsCheck = [ "fsevents" ];
+
+  meta = with lib; {
+    description = "Thread-based interface to file system observation primitives";
+    homepage = "https://github.com/malthe/macfsevents";
+    changelog = "https://github.com/malthe/macfsevents/blob/${version}/CHANGES.rst";
+    license = licenses.bsd2;
+    maintainers = [ maintainers.marsam ];
+    platforms = platforms.darwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/macropy/default.nix b/nixpkgs/pkgs/development/python-modules/macropy/default.nix
new file mode 100644
index 000000000000..d7b122396e0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/macropy/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, isPy27
+, pythonAtLeast
+, pinqSupport ? false, sqlalchemy
+, pyxlSupport ? false, pyxl3
+}:
+
+buildPythonPackage rec {
+  # https://github.com/lihaoyi/macropy/issues/94
+  version = "1.1.0b2";
+  pname = "macropy";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "lihaoyi";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1bd2fzpa30ddva3f8lw2sbixxf069idwib8srd64s5v46ricm2cf";
+  };
+
+  # js_snippets extra only works with python2
+  propagatedBuildInputs = [ ]
+    ++ lib.optional pinqSupport sqlalchemy
+    ++ lib.optional pyxlSupport pyxl3;
+
+  checkPhase = ''
+    ${python.interpreter} run_tests.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/lihaoyi/macropy";
+    description = "Macros in Python: quasiquotes, case classes, LINQ and more";
+    license = licenses.mit;
+    maintainers = [ ];
+    broken = pythonAtLeast "3.8"; # see https://github.com/lihaoyi/macropy/issues/103
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/maestral/default.nix b/nixpkgs/pkgs/development/python-modules/maestral/default.nix
new file mode 100644
index 000000000000..3e871a90562b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/maestral/default.nix
@@ -0,0 +1,105 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, makePythonPath
+, pythonOlder
+, python
+, click
+, dbus-python
+, desktop-notifier
+, dropbox
+, fasteners
+, importlib-metadata
+, keyring
+, keyrings-alt
+, packaging
+, pathspec
+, pyro5
+, requests
+, rich
+, setuptools
+, survey
+, typing-extensions
+, watchdog
+, pytestCheckHook
+, nixosTests
+}:
+
+buildPythonPackage rec {
+  pname = "maestral";
+  version = "1.8.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "SamSchott";
+    repo = "maestral";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-YYbdd0GLVKE7+Oi0mpQjqhFdjdlquk/XnIg5WrtKcfI=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    desktop-notifier
+    dbus-python
+    dropbox
+    fasteners
+    importlib-metadata
+    keyring
+    keyrings-alt
+    packaging
+    pathspec
+    pyro5
+    requests
+    rich
+    setuptools
+    survey
+    typing-extensions
+    watchdog
+  ];
+
+  makeWrapperArgs = [
+    # Add the installed directories to the python path so the daemon can find them
+    "--prefix PYTHONPATH : ${makePythonPath propagatedBuildInputs}"
+    "--prefix PYTHONPATH : $out/lib/${python.libPrefix}/site-packages"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  disabledTests = [
+    # We don't want to benchmark
+    "test_performance"
+    # Requires systemd
+    "test_autostart"
+    # Requires network access
+    "test_check_for_updates"
+    # Tries to look at /usr
+    "test_filestatus"
+    "test_path_exists_case_insensitive"
+    "test_cased_path_candidates"
+    # AssertionError
+    "test_locking_multiprocess"
+  ];
+
+  pythonImportsCheck = [
+    "maestral"
+  ];
+
+  passthru.tests.maestral = nixosTests.maestral;
+
+  meta = with lib; {
+    description = "Open-source Dropbox client for macOS and Linux";
+    homepage = "https://maestral.app";
+    changelog = "https://github.com/samschott/maestral/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ peterhoeg sfrijters ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/magic-filter/default.nix b/nixpkgs/pkgs/development/python-modules/magic-filter/default.nix
new file mode 100644
index 000000000000..e9d2fb8b8696
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/magic-filter/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, hatchling
+}:
+
+buildPythonPackage rec {
+  pname = "magic-filter";
+  version = "1.0.12";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aiogram";
+    repo = "magic-filter";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-MSYIZ/bzngRu6mG3EGblUotSCA+6bi+l3EymFA8NRZA=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "magic_filter" ];
+
+  meta = with lib; {
+    description = "Magic filter based on dynamic attribute getter";
+    homepage = "https://github.com/aiogram/magic-filter";
+    changelog = "https://github.com/aiogram/magic-filter/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sikmir ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/magic-wormhole-mailbox-server/default.nix b/nixpkgs/pkgs/development/python-modules/magic-wormhole-mailbox-server/default.nix
new file mode 100644
index 000000000000..fc9636c351a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/magic-wormhole-mailbox-server/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, six
+, attrs
+, twisted
+, pyopenssl
+, service-identity
+, autobahn
+, treq
+, mock
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "magic-wormhole-mailbox-server";
+  version = "0.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1af10592909caaf519c00e706eac842c5e77f8d4356215fe9c61c7b2258a88fb";
+  };
+
+  patches = [
+    (fetchpatch {
+      # Remove the 'U' open mode removed, https://github.com/magic-wormhole/magic-wormhole-mailbox-server/pull/34
+      name = "fix-for-python-3.11.patch";
+      url = "https://github.com/magic-wormhole/magic-wormhole-mailbox-server/commit/4b358859ba80de37c3dc0a5f67ec36909fd48234.patch";
+      hash = "sha256-RzZ5kD+xhmFYusVzAbGE+CODXtJVR1zN2rZ+VGApXiQ=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    six
+    twisted
+    autobahn
+  ] ++ autobahn.optional-dependencies.twisted
+  ++ twisted.optional-dependencies.tls;
+
+  nativeCheckInputs = [
+    treq
+    mock
+    twisted
+  ];
+
+  # Fails in Darwin's sandbox
+  postPatch = lib.optionalString stdenv.isDarwin ''
+    echo 'LogRequests.skip = "Operation not permitted"' >> src/wormhole_mailbox_server/test/test_web.py
+    echo 'WebSocketAPI.skip = "Operation not permitted"' >> src/wormhole_mailbox_server/test/test_web.py
+  '';
+
+  checkPhase = ''
+    trial -j$NIX_BUILD_CORES wormhole_mailbox_server
+  '';
+
+  meta = with lib; {
+    description = "Securely transfer data between computers";
+    homepage = "https://github.com/warner/magic-wormhole-mailbox-server";
+    changelog = "https://github.com/magic-wormhole/magic-wormhole-mailbox-server/blob/${version}/NEWS.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/magic-wormhole-transit-relay/default.nix b/nixpkgs/pkgs/development/python-modules/magic-wormhole-transit-relay/default.nix
new file mode 100644
index 000000000000..76eaca6be65b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/magic-wormhole-transit-relay/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, autobahn
+, mock
+, twisted
+}:
+
+buildPythonPackage rec {
+  pname = "magic-wormhole-transit-relay";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ppsx2s1ysikns1h053x67z2zmficbn3y3kf52bzzslhd2s02j6b";
+  };
+
+  propagatedBuildInputs = [ autobahn twisted ];
+
+  nativeCheckInputs = [ mock twisted ];
+
+  checkPhase = ''
+    trial -j$NIX_BUILD_CORES wormhole_transit_relay
+  '';
+
+  meta = with lib; {
+    description = "Transit Relay server for Magic-Wormhole";
+    homepage = "https://github.com/magic-wormhole/magic-wormhole-transit-relay";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/magic-wormhole/default.nix b/nixpkgs/pkgs/development/python-modules/magic-wormhole/default.nix
new file mode 100644
index 000000000000..353e2c0e053b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/magic-wormhole/default.nix
@@ -0,0 +1,122 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+
+# build-system
+, setuptools
+
+# dependencies
+, spake2
+, pynacl
+, six
+, attrs
+, twisted
+, autobahn
+, automat
+, tqdm
+, click
+, humanize
+, txtorcon
+
+# optional-dependencies
+, noiseprotocol
+
+# tests
+, nettools
+, unixtools
+, mock
+, magic-wormhole-transit-relay
+, magic-wormhole-mailbox-server
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "magic-wormhole";
+  version = "0.13.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rDvWgoYnDn8UnAYUmo5Anl+jTX/rDoiESibSnu0tFRY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    spake2
+    pynacl
+    six
+    attrs
+    twisted
+    autobahn
+    automat
+    tqdm
+    click
+    humanize
+    txtorcon
+  ]
+  ++ autobahn.optional-dependencies.twisted
+  ++ twisted.optional-dependencies.tls;
+
+  passthru.optional-dependencies = {
+    dilation = [
+      noiseprotocol
+    ];
+  };
+
+  nativeCheckInputs = [
+    mock
+    magic-wormhole-transit-relay
+    magic-wormhole-mailbox-server
+    pytestCheckHook
+  ]
+  ++ passthru.optional-dependencies.dilation
+  ++ lib.optionals stdenv.isDarwin [ unixtools.locale ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # These tests doesn't work within Darwin's sandbox
+    "test_version"
+    "test_text"
+    "test_receiver"
+    "test_sender"
+    "test_sender_allocation"
+    "test_text_wrong_password"
+    "test_override"
+    "test_allocate_port"
+    "test_allocate_port_no_reuseaddr"
+    "test_ignore_localhost_hint"
+    "test_ignore_localhost_hint_orig"
+    "test_keep_only_localhost_hint"
+    "test_get_direct_hints"
+    "test_listener"
+    "test_success_direct"
+    "test_direct"
+    "test_relay"
+  ];
+
+  disabledTestPaths = lib.optionals stdenv.isDarwin [
+    # These tests doesn't work within Darwin's sandbox
+    "src/wormhole/test/test_xfer_util.py"
+    "src/wormhole/test/test_wormhole.py"
+  ];
+
+  postPatch = lib.optionalString stdenv.isLinux ''
+    sed -i -e "s|'ifconfig'|'${nettools}/bin/ifconfig'|" src/wormhole/ipaddrs.py
+  '';
+
+  postInstall = ''
+    install -Dm644 docs/wormhole.1 $out/share/man/man1/wormhole.1
+  '';
+
+  meta = with lib; {
+    changelog = "https://github.com/magic-wormhole/magic-wormhole/blob/${version}/NEWS.md";
+    description = "Securely transfer data between computers";
+    homepage = "https://github.com/magic-wormhole/magic-wormhole";
+    license = licenses.mit;
+    maintainers = with maintainers; [ asymmetric ];
+    mainProgram = "wormhole";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/magic/default.nix b/nixpkgs/pkgs/development/python-modules/magic/default.nix
new file mode 100644
index 000000000000..45fd740e2e89
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/magic/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, pkgs
+}:
+
+buildPythonPackage {
+  name = pkgs.file.name;
+
+  src = pkgs.file.src;
+
+  patchPhase = ''
+    substituteInPlace python/magic.py --replace "find_library('magic')" "'${pkgs.file}/lib/libmagic${stdenv.hostPlatform.extensions.sharedLibrary}'"
+  '';
+
+  buildInputs = [ pkgs.file ];
+
+  preConfigure = "cd python";
+
+  # No test suite
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A Python wrapper around libmagic";
+    homepage = "http://www.darwinsys.com/file/";
+    license = licenses.lgpl2;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/magicgui/default.nix b/nixpkgs/pkgs/development/python-modules/magicgui/default.nix
new file mode 100644
index 000000000000..ef327dd0f08b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/magicgui/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, pytestCheckHook
+, typing-extensions
+, qtpy
+, pyside2
+, psygnal
+, docstring-parser
+, napari # a reverse-dependency, for tests
+}: buildPythonPackage rec {
+  pname = "magicgui";
+  version = "0.5.1";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "napari";
+    repo = "magicgui";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-fVfBQaaT8/lUGqZRXjOPgvkC01Izb8Sxqn7RCqnW9bo=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [ setuptools-scm ];
+  propagatedBuildInputs = [ typing-extensions qtpy pyside2 psygnal docstring-parser ];
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  doCheck = false; # Reports "Fatal Python error"
+
+  passthru.tests = { inherit napari; };
+
+  meta = with lib; {
+    description = "Build GUIs from python functions, using magic.  (napari/magicgui)";
+    homepage = "https://github.com/napari/magicgui";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SomeoneSerge ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mahotas/default.nix b/nixpkgs/pkgs/development/python-modules/mahotas/default.nix
new file mode 100644
index 000000000000..2f234cc63542
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mahotas/default.nix
@@ -0,0 +1,74 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pillow
+, scipy
+, numpy
+, pytestCheckHook
+, imread
+, freeimage
+, lib
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "mahotas";
+  version = "1.4.13";
+
+  src = fetchFromGitHub {
+    owner = "luispedro";
+    repo = "mahotas";
+    rev = "v${version}";
+    hash = "sha256-AmctF/9hLgHw6FUm0s61eCdcc12lBa1t0OkXclis//w=";
+  };
+
+  propagatedBuildInputs = [
+    freeimage
+    imread
+    numpy
+    pillow
+    scipy
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  postPatch = ''
+    substituteInPlace mahotas/io/freeimage.py \
+      --replace "ctypes.util.find_library('freeimage')" 'True' \
+      --replace 'ctypes.CDLL(libname)' 'np.ctypeslib.load_library("libfreeimage", "${freeimage}/lib")'
+  '';
+
+  # mahotas/_morph.cpp:864:10: error: no member named 'random_shuffle' in namespace 'std'
+  env = lib.optionalAttrs stdenv.cc.isClang {
+    NIX_CFLAGS_COMPILE = "-std=c++14";
+  };
+
+  # tests must be run in the build directory
+  preCheck = ''
+    cd build/lib*
+  '';
+
+  # re-enable as soon as https://github.com/luispedro/mahotas/issues/97 is fixed
+  disabledTests = [
+    "test_colors"
+    "test_ellipse_axes"
+    "test_normalize"
+    "test_haralick3d"
+  ];
+
+  pythonImportsCheck = [
+    "mahotas"
+    "mahotas.freeimage"
+  ];
+
+  disabled = stdenv.isi686; # Failing tests
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64);
+    description = "Computer vision package based on numpy";
+    homepage = "https://mahotas.readthedocs.io/";
+    maintainers = with maintainers; [ luispedro ];
+    license = licenses.mit;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mail-parser/default.nix b/nixpkgs/pkgs/development/python-modules/mail-parser/default.nix
new file mode 100644
index 000000000000..42123445fc53
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mail-parser/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, python, glibcLocales, fetchFromGitHub, six, simplejson }:
+
+buildPythonPackage rec {
+  pname = "mail-parser";
+  version = "3.15.0";
+
+  src = fetchFromGitHub {
+    owner = "SpamScope";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0da2qr4p8jnjw6jdhbagm6slfcjnjyyjkszwfcfqvcywh1zm1sdw";
+  };
+
+  LC_ALL = "en_US.utf-8";
+
+  nativeBuildInputs = [ glibcLocales ];
+  propagatedBuildInputs = [ simplejson six ];
+
+  # Taken from .travis.yml
+  checkPhase = ''
+    ${python.interpreter} tests/test_main.py
+    ${python.interpreter} -m mailparser -v
+    ${python.interpreter} -m mailparser -h
+    ${python.interpreter} -m mailparser -f tests/mails/mail_malformed_3 -j
+    cat tests/mails/mail_malformed_3 | ${python.interpreter} -m mailparser -k -j
+  '';
+
+  meta = with lib; {
+    description = "A mail parser for python 2 and 3";
+    homepage = "https://github.com/SpamScope/mail-parser";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mailcap-fix/default.nix b/nixpkgs/pkgs/development/python-modules/mailcap-fix/default.nix
new file mode 100644
index 000000000000..3d644bec3a93
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mailcap-fix/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "mailcap-fix";
+  version = "1.0.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "02lijkq6v379r8zkqg9q2srin3i80m4wvwik3hcbih0s14v0ng0i";
+  };
+
+  meta = with lib; {
+    description = "A patched mailcap module that conforms to RFC 1524";
+    homepage = "https://github.com/michael-lazar/mailcap_fix";
+    license = licenses.unlicense;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mailchecker/default.nix b/nixpkgs/pkgs/development/python-modules/mailchecker/default.nix
new file mode 100644
index 000000000000..4701b456e09a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mailchecker/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mailchecker";
+  version = "5.0.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-iwg5B9pC2qRI2T6xnwyXjd4uhWVhel52Jxs1pfcoXM0=";
+  };
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "MailChecker"
+  ];
+
+  meta = with lib; {
+    description = "Module for temporary (disposable/throwaway) email detection";
+    homepage = "https://github.com/FGRibreau/mailchecker";
+    changelog = "https://github.com/FGRibreau/mailchecker/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mailchimp/default.nix b/nixpkgs/pkgs/development/python-modules/mailchimp/default.nix
new file mode 100644
index 000000000000..787ecb0316f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mailchimp/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, docopt
+, requests
+}:
+
+buildPythonPackage rec {
+  version = "2.0.10";
+  pname = "mailchimp";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5227999904233a7d2e9ce5eac5225b9a5fac0318ae5107e3ed09c8bf89286768";
+  };
+
+  buildInputs = [ docopt ];
+  propagatedBuildInputs = [ requests ];
+  patchPhase = ''
+    sed -i 's/==/>=/' setup.py
+  '';
+
+  meta = with lib; {
+    description = "A CLI client and Python API library for the MailChimp email platform";
+    homepage = "http://apidocs.mailchimp.com/api/2.0/";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mailmanclient/default.nix b/nixpkgs/pkgs/development/python-modules/mailmanclient/default.nix
new file mode 100644
index 000000000000..bb584d6797f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mailmanclient/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "mailmanclient";
+  version = "3.3.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Y1gcYEyn6sAhSJwVqsygaklY63b2ZXTG+rBerGVN2Fc=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  # Tests require a running Mailman instance
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "mailmanclient"
+  ];
+
+  meta = with lib; {
+    description = "REST client for driving Mailman 3";
+    homepage = "https://www.gnu.org/software/mailman/";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ qyliss ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mailsuite/default.nix b/nixpkgs/pkgs/development/python-modules/mailsuite/default.nix
new file mode 100644
index 000000000000..0069defa4b89
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mailsuite/default.nix
@@ -0,0 +1,51 @@
+{ buildPythonPackage
+, fetchPypi
+, pythonOlder
+, lib
+
+# pythonPackages
+, hatchling
+, dnspython
+, expiringdict
+, html2text
+, mail-parser
+, imapclient
+, publicsuffix2
+}:
+
+buildPythonPackage rec {
+  pname = "mailsuite";
+  version = "1.9.15";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-R4nAphydamZojQR7pro5Y3dZg3nYK0+X5lFBMJUpCfw=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    dnspython
+    expiringdict
+    html2text
+    mail-parser
+    imapclient
+    publicsuffix2
+  ];
+
+  pythonImportsCheck = [ "mailsuite" ];
+
+  doCheck = false;
+
+  meta = {
+    description = "A Python package to simplify receiving, parsing, and sending email";
+    homepage = "https://seanthegeek.github.io/mailsuite/";
+    maintainers = with lib.maintainers; [ talyz ];
+    license = lib.licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/maison/default.nix b/nixpkgs/pkgs/development/python-modules/maison/default.nix
new file mode 100644
index 000000000000..03d4c5c05d87
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/maison/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, poetry-core
+, pydantic
+, pytestCheckHook
+, pythonOlder
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "maison";
+  version = "1.4.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dbatten5";
+    repo = "maison";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-uJW+7+cIt+jnbiC+HvT7KzyNk1enEtELTxtfc4eXAPU=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    click
+    pydantic
+    toml
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "maison"
+  ];
+
+  meta = with lib; {
+    description = "Library to read settings from config files";
+    homepage = "https://github.com/dbatten5/maison";
+    changelog = "https://github.com/dbatten5/maison/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/makefun/default.nix b/nixpkgs/pkgs/development/python-modules/makefun/default.nix
new file mode 100644
index 000000000000..9eb72a891045
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/makefun/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, setuptools-scm
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "makefun";
+  version = "1.15.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QLDxGLbe0NjXjHjx62ebi2skYuPBs+BfsbLajNRrSKU=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "pytest-runner" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "makefun" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/smarie/python-makefun";
+    description = "Small library to dynamically create python functions";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ veehaitch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mako/default.nix b/nixpkgs/pkgs/development/python-modules/mako/default.nix
new file mode 100644
index 000000000000..cdfb682b5a65
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mako/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, isPyPy
+
+# propagates
+, markupsafe
+
+# extras: Babel
+, babel
+
+# tests
+, mock
+, pytestCheckHook
+, lingua
+, chameleon
+}:
+
+buildPythonPackage rec {
+  pname = "mako";
+  version = "1.2.4";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Mako";
+    inherit version;
+    hash = "sha256-1go5A9w7sBoYrWqJzb4uTq3GnAvI7x43c7pT1Ew/ejQ=";
+  };
+
+  propagatedBuildInputs = [
+    markupsafe
+  ];
+
+  passthru.optional-dependencies = {
+    babel = [
+      babel
+    ];
+  };
+
+  nativeCheckInputs = [
+    chameleon
+    lingua
+    mock
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.babel;
+
+  disabledTests = lib.optionals isPyPy [
+    # https://github.com/sqlalchemy/mako/issues/315
+    "test_alternating_file_names"
+    # https://github.com/sqlalchemy/mako/issues/238
+    "test_file_success"
+    "test_stdin_success"
+    # fails on pypy2.7
+    "test_bytestring_passthru"
+  ];
+
+  meta = with lib; {
+    description = "Super-fast templating language";
+    homepage = "https://www.makotemplates.org/";
+    changelog = "https://docs.makotemplates.org/en/latest/changelog.html";
+    license = licenses.mit;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/malduck/default.nix b/nixpkgs/pkgs/development/python-modules/malduck/default.nix
new file mode 100644
index 000000000000..0ae7abb72143
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/malduck/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, capstone
+, click
+, cryptography
+, dnfile
+, fetchFromGitHub
+, pefile
+, pycryptodomex
+, pyelftools
+, pythonOlder
+, pytestCheckHook
+, typing-extensions
+, yara-python
+}:
+
+buildPythonPackage rec {
+  pname = "malduck";
+  version = "4.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CERT-Polska";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-3joIfhQBJzKdoU3FNW/yAHsQa/lMMbw3wGEQTyOBrOQ=";
+  };
+
+  propagatedBuildInputs = [
+    capstone
+    click
+    cryptography
+    dnfile
+    pefile
+    pycryptodomex
+    pyelftools
+    typing-extensions
+    yara-python
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "pefile==2019.4.18" "pefile" \
+      --replace "dnfile==0.11.0" "dnfile"
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "malduck"
+  ];
+
+  meta = with lib; {
+    description = "Helper for malware analysis";
+    homepage = "https://github.com/CERT-Polska/malduck";
+    changelog = "https://github.com/CERT-Polska/malduck/releases/tag/v${version}";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/managesieve/default.nix b/nixpkgs/pkgs/development/python-modules/managesieve/default.nix
new file mode 100644
index 000000000000..9e2515b0e7b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/managesieve/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "managesieve";
+  version = "0.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "44930a3b48332d23b35a5305ae7ba47904d4485ed1b7a22208b7d5ad9d60427a";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "ManageSieve client library for remotely managing Sieve scripts";
+    homepage = "https://managesieve.readthedocs.io/";
+    # PSFL for the python module, GPLv3 only for sieveshell
+    license = with licenses; [ gpl3Only psfl ];
+    maintainers = with maintainers; [ dadada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mando/default.nix b/nixpkgs/pkgs/development/python-modules/mando/default.nix
new file mode 100644
index 000000000000..dc48dd18ebe1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mando/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+# Python deps
+, six
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "mando";
+  version = "0.7.1";
+
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "rubik";
+    repo = "mando";
+    rev = "v${version}";
+    hash = "sha256-Ylrrfo57jqGuWEqCa5RyTT9AagBpUvAfviHkyJPFv08=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  pythonImportsCheck = [
+    "mando"
+  ];
+
+  meta = with lib; {
+    description = "Create Python CLI apps with little to no effort at all";
+    homepage = "https://mando.readthedocs.org";
+    changelog = "https://github.com/rubik/mando/blob/v${version}/CHANGELOG";
+    license = licenses.mit;
+    maintainers = with maintainers; [ t4ccer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mandown/default.nix b/nixpkgs/pkgs/development/python-modules/mandown/default.nix
new file mode 100644
index 000000000000..ccc0e99b5111
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mandown/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, beautifulsoup4
+, comicon
+, feedparser
+, filetype
+, lxml
+, natsort
+, pillow
+, python-slugify
+, requests
+, typer
+, pyside6
+}:
+
+buildPythonPackage rec {
+  pname = "mandown";
+  version = "1.6.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "potatoeggy";
+    repo = "mandown";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-2kFzB1xLVEvO7Vo39lwQsVirRY6Z8GMczWK2b1oVYTg=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    comicon
+    feedparser
+    filetype
+    lxml
+    natsort
+    pillow
+    python-slugify
+    requests
+    typer
+  ];
+
+  passthru.optional-dependencies = {
+    gui = [
+      pyside6
+    ];
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml --replace 'typer = "^0.7.0"' 'typer = "^0"'
+  '';
+
+  pythonImportsCheck = [ "mandown" ];
+
+  meta = with lib; {
+    description = "Comic/manga/webtoon downloader and CBZ/EPUB/MOBI/PDF converter";
+    homepage = "https://github.com/potatoeggy/mandown";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ Scrumplex ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/manhole/default.nix b/nixpkgs/pkgs/development/python-modules/manhole/default.nix
new file mode 100644
index 000000000000..1480a002d0e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/manhole/default.nix
@@ -0,0 +1,47 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytest
+, requests
+, process-tests
+}:
+
+buildPythonPackage rec {
+  pname = "manhole";
+  version = "1.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bada20a25b547b395d472e2e08928f0437df26bbdbda4797c55863198e29a21f";
+  };
+
+  # test_help expects architecture-dependent Linux signal numbers.
+  #
+  # {test_locals,test_socket_path} fail to remove /tmp/manhole-socket
+  # on the x86_64-darwin builder.
+  #
+  # TODO: change this back to `doCheck = stdenv.isLinux` after
+  # https://github.com/ionelmc/python-manhole/issues/54 is fixed
+  doCheck = false;
+
+  nativeCheckInputs = [ pytest requests process-tests ];
+  checkPhase = ''
+    # Based on its tox.ini
+    export PYTHONUNBUFFERED=yes
+    export PYTHONPATH=.:tests:$PYTHONPATH
+
+    # The tests use manhole-cli
+    export PATH="$PATH:$out/bin"
+
+    # test_uwsgi fails with:
+    # http.client.RemoteDisconnected: Remote end closed connection without response
+    py.test -vv -k "not test_uwsgi"
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/ionelmc/python-manhole";
+    description = "Debugging manhole for Python applications";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ivan ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/manifest-ml/default.nix b/nixpkgs/pkgs/development/python-modules/manifest-ml/default.nix
new file mode 100644
index 000000000000..329f676ef45b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/manifest-ml/default.nix
@@ -0,0 +1,113 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, numpy
+, pydantic
+, redis
+, requests
+, aiohttp
+, sqlitedict
+, tenacity
+, tiktoken
+, xxhash
+, # optional dependencies
+  accelerate
+, flask
+, sentence-transformers
+, torch
+, transformers
+, fastapi
+, uvicorn
+, pillow
+, pg8000
+, sqlalchemy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "manifest-ml";
+  version = "0.1.8";
+  format = "setuptools";
+
+  disalbed = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "HazyResearch";
+    repo = "manifest";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-d34TIZYDB8EDEIZUH5mDzfDHzFT290DwjPLJkNneklc=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    pydantic
+    redis
+    requests
+    aiohttp
+    sqlitedict
+    tenacity
+    tiktoken
+    xxhash
+  ] ++ lib.flatten (lib.attrValues passthru.optional-dependencies);
+
+  passthru.optional-dependencies = {
+    api = [
+      accelerate
+      # deepspeed
+      # diffusers
+      flask
+      sentence-transformers
+      torch
+      transformers
+    ];
+    app = [
+      fastapi
+      uvicorn
+    ];
+    diffusers = [
+      pillow
+    ];
+    gcp = [
+      pg8000
+      # cloud-sql-python-connector
+      sqlalchemy
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  pytestFlagsArray = [
+    # this file tries importing `deepspeed`, which is not yet packaged in nixpkgs
+    "--ignore=tests/test_huggingface_api.py"
+  ];
+
+  disabledTests = [
+    # these tests have db access
+    "test_init"
+    "test_key_get_and_set"
+    "test_get"
+    # this test has network access
+    "test_retry_handling"
+    # Test is time-senstive
+    "test_timing"
+  ];
+
+  pythonImportsCheck = [
+    "manifest"
+  ];
+
+  meta = with lib; {
+    description = "Manifest for Prompting Foundation Models";
+    homepage = "https://github.com/HazyResearch/manifest";
+    changelog = "https://github.com/HazyResearch/manifest/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/manifestoo-core/default.nix b/nixpkgs/pkgs/development/python-modules/manifestoo-core/default.nix
new file mode 100644
index 000000000000..cec9773449c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/manifestoo-core/default.nix
@@ -0,0 +1,40 @@
+{ buildPythonPackage
+, typing-extensions
+, fetchPypi
+, lib
+, nix-update-script
+, hatch-vcs
+, pythonOlder
+, importlib-resources
+}:
+
+buildPythonPackage rec {
+  pname = "manifestoo-core";
+  version = "1.3";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "manifestoo_core";
+    hash = "sha256-psgUg55NiyONo3ob4UIMrO793UrxGMZV73hj4HRCR8E=";
+  };
+
+  nativeBuildInputs = [
+    hatch-vcs
+  ];
+
+  propagatedBuildInputs =
+    lib.optionals (pythonOlder "3.7") [ importlib-resources ]
+    ++ lib.optionals (pythonOlder "3.8") [ typing-extensions ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  passthru.updateScript = nix-update-script { };
+
+  meta = with lib; {
+    description = "A library to reason about Odoo addons manifests";
+    homepage = "https://github.com/acsone/manifestoo-core";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ yajo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/manifestoo/default.nix b/nixpkgs/pkgs/development/python-modules/manifestoo/default.nix
new file mode 100644
index 000000000000..c9499eb11310
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/manifestoo/default.nix
@@ -0,0 +1,51 @@
+{ buildPythonPackage
+, fetchPypi
+, hatch-vcs
+, importlib-metadata
+, lib
+, manifestoo-core
+, nix-update-script
+, pytestCheckHook
+, pythonOlder
+, textual
+, typer
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "manifestoo";
+  version = "0.7";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gCGchc+fShBgt6fVJAx80+QnH+vxWo3jsIyePkFwhYE=";
+  };
+
+  nativeBuildInputs = [
+    hatch-vcs
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  propagatedBuildInputs = [
+    manifestoo-core
+    textual
+    typer
+  ]
+  ++ typer.passthru.optional-dependencies.all
+  ++ lib.optionals (pythonOlder "3.8") [ importlib-metadata ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  passthru.updateScript = nix-update-script { };
+
+  meta = with lib; {
+    description = "A tool to reason about Odoo addons manifests";
+    homepage = "https://github.com/acsone/manifestoo";
+    license = licenses.mit;
+    maintainers = with maintainers; [ yajo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/manimpango/default.nix b/nixpkgs/pkgs/development/python-modules/manimpango/default.nix
new file mode 100644
index 000000000000..9fec1f0aa243
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/manimpango/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, pkg-config
+, pango
+, cython
+, AppKit
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "manimpango";
+  version = "0.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ManimCommunity";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-EBSbvjQyQIXOzvQMbuTwOoV8xSAOYDlCBZ56NLneuQI=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  buildInputs = [
+    pango
+  ] ++ lib.optionals stdenv.isDarwin [
+    AppKit
+  ];
+
+  propagatedBuildInputs = [
+    cython
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov --no-cov-on-fail" ""
+  '';
+
+  preBuild = ''
+    ${python.pythonOnBuildForHost.interpreter} setup.py build_ext --inplace
+  '';
+
+  pythonImportsCheck = [
+    "manimpango"
+  ];
+
+  meta = with lib; {
+    description = "Binding for Pango";
+    homepage = "https://github.com/ManimCommunity/ManimPango";
+    changelog = "https://github.com/ManimCommunity/ManimPango/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ emilytrau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/manuel/default.nix b/nixpkgs/pkgs/development/python-modules/manuel/default.nix
new file mode 100644
index 000000000000..c0040947488f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/manuel/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, python
+, isPy27
+, six
+, zope_testing
+}:
+
+buildPythonPackage rec {
+  pname = "manuel";
+  version = "1.12.4";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-A5Wq32mR+SSseVz61Z2l3AYYcyqMxYrQ9HSWWrco9/Q=";
+  };
+
+  patches = lib.optionals (lib.versionAtLeast python.version "3.11") [
+    # https://github.com/benji-york/manuel/pull/32
+    # Applying conditionally until upstream arrives at some general solution.
+    (fetchpatch {
+      name = "TextTestResult-python311.patch";
+      url = "https://github.com/benji-york/manuel/commit/d9f12d03e39bb76e4bb3ba43ad51af6d3e9d45c0.diff";
+      hash = "sha256-k0vBtxEixoI1INiKtc7Js3Ai00iGAcCvCFI1ZIBRPvQ=";
+    })
+  ];
+
+  propagatedBuildInputs = [ six ];
+  nativeCheckInputs = [ zope_testing ];
+
+  meta = with lib; {
+    description = "A documentation builder";
+    homepage = "https://pypi.python.org/pypi/manuel";
+    license = licenses.zpl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/manuf/default.nix b/nixpkgs/pkgs/development/python-modules/manuf/default.nix
new file mode 100644
index 000000000000..19b98a12a17c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/manuf/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, runCommand
+, python3
+, wireshark-cli
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "manuf";
+  version = "1.1.5";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "coolbho3k";
+    repo = "manuf";
+    rev = "${version}";
+    hash = "sha256-3CFs3aqwE8rZPwU1QBqAGxNHT5jg7ymG12yBD56gTNI=";
+  };
+
+  nativeBuildInputs = [ wireshark-cli ];
+
+  patches = [
+    # Do update while building package from wireshark-cli
+    ./internal_db_update_nix.patch
+    # Fix MANUF_URL for external db update functionality (https://github.com/coolbho3k/manuf/issues/34)
+    ./fix_manuf_url.patch
+  ];
+
+  postPatch = ''
+    ${lib.getExe wireshark-cli} -G manuf > manuf/manuf
+    cat ${wireshark-cli}/share/wireshark/wka >> manuf/manuf
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_update_update"
+  ];
+
+  pythonImportsCheck = [ "manuf" ];
+
+  passthru.tests = {
+    testMacAddress = runCommand "${pname}-test" {} ''
+      ${python3.pkgs.manuf}/bin/manuf BC:EE:7B:00:00:00 > $out
+      [ "$(cat $out | tr -d '\n')" = "Vendor(manuf='ASUSTekC', manuf_long='ASUSTek COMPUTER INC.', comment=None)" ]
+    '';
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/coolbho3k/manuf";
+    description = " Parser library for Wireshark's OUI database";
+    mainProgram = "manuf";
+    platforms = platforms.linux;
+    license = with licenses; [ lgpl3Plus asl20 ];
+    maintainers = with maintainers; [ dsuetin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/manuf/fix_manuf_url.patch b/nixpkgs/pkgs/development/python-modules/manuf/fix_manuf_url.patch
new file mode 100644
index 000000000000..e858649b90f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/manuf/fix_manuf_url.patch
@@ -0,0 +1,14 @@
+diff --git a/manuf/manuf.py b/manuf/manuf.py
+index 09e9687..0ac9296 100755
+--- a/manuf/manuf.py
++++ b/manuf/manuf.py
+@@ -61,7 +61,8 @@ class MacParser(object):
+         IOError: If manuf file could not be found.
+ 
+     """
+-    MANUF_URL = "https://gitlab.com/wireshark/wireshark/raw/master/manuf"
++    # https://github.com/coolbho3k/manuf/issues/34
++    MANUF_URL = "https://www.wireshark.org/download/automated/data/manuf"
+     WFA_URL = "https://gitlab.com/wireshark/wireshark/raw/master/wka"
+ 
+     def  __init__(self, manuf_name=None, update=False):
diff --git a/nixpkgs/pkgs/development/python-modules/manuf/internal_db_update_nix.patch b/nixpkgs/pkgs/development/python-modules/manuf/internal_db_update_nix.patch
new file mode 100644
index 000000000000..174c71e46929
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/manuf/internal_db_update_nix.patch
@@ -0,0 +1,31 @@
+diff --git a/manuf/manuf.py b/manuf/manuf.py
+index e5e9193..09e9687 100755
+--- a/manuf/manuf.py
++++ b/manuf/manuf.py
+@@ -65,8 +65,14 @@ class MacParser(object):
+     WFA_URL = "https://gitlab.com/wireshark/wireshark/raw/master/wka"
+ 
+     def  __init__(self, manuf_name=None, update=False):
+-        self._manuf_name = manuf_name or self.get_packaged_manuf_file_path()
+-        if update:
++        if manuf_name is not None:
++            self._manuf_name = manuf_name
++            self.external_db = True
++        else:
++            self._manuf_name = self.get_packaged_manuf_file_path()
++            self.external_db = False
++
++        if update and self.external_db:
+             self.update()
+         else:
+             self.refresh()
+@@ -134,6 +140,9 @@ class MacParser(object):
+             URLError: If the download fails
+ 
+         """
++        if manuf_url is None and not self.external_db:
++            return
++
+         if not manuf_url:
+             manuf_url = self.MANUF_URL
+         if not manuf_name:
diff --git a/nixpkgs/pkgs/development/python-modules/mapbox-earcut/default.nix b/nixpkgs/pkgs/development/python-modules/mapbox-earcut/default.nix
new file mode 100644
index 000000000000..fa4659ae40bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mapbox-earcut/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchFromGitHub
+, numpy
+, pybind11
+, pytestCheckHook
+, setuptools
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mapbox-earcut";
+  version = "1.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "skogler";
+    repo = "mapbox_earcut_python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+Vxvo++bkoCsJFmt/u1eaqhgpz8Uddz06iIi66ju+MQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    pybind11
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mapbox_earcut"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/skogler/mapbox_earcut_python";
+    changelog = "https://github.com/skogler/mapbox_earcut_python/releases/tag/v${version}";
+    license = licenses.isc;
+    description = "Mapbox-earcut fast triangulation of 2D-polygons";
+    longDescription = ''
+      Python bindings for the C++ implementation of the Mapbox Earcut
+      library, which provides very fast and quite robust triangulation of 2D
+      polygons.
+    '';
+    maintainers = with maintainers; [ friedelino ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mapbox/default.nix b/nixpkgs/pkgs/development/python-modules/mapbox/default.nix
new file mode 100644
index 000000000000..721a2ece39fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mapbox/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, boto3
+, cachecontrol
+, fetchFromGitHub
+, iso3166
+, python-dateutil
+, requests
+, responses
+, polyline
+, pytestCheckHook
+, uritemplate
+}:
+
+buildPythonPackage rec {
+  pname = "mapbox";
+  version = "0.18.0";
+
+  src = fetchFromGitHub {
+    owner = "mapbox";
+    repo = "mapbox-sdk-py";
+    rev = "0.18.0";
+    sha256 = "123wsa4j11ps5pkjgylbmw4gnzh2vi22swgmvy50w26glkszh075";
+  };
+
+  propagatedBuildInputs = [ boto3 cachecontrol iso3166 python-dateutil requests polyline uritemplate ];
+  nativeCheckInputs = [ pytestCheckHook responses ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mapbox/mapbox-sdk-py";
+    license = licenses.mit;
+    description = "Mapbox SDK for Python";
+    longDescription = "Low-level client API for Mapbox web services.";
+    maintainers = with maintainers; [ ersin ];
+    # ImportError: cannot import name 'Mapping' from 'collections'
+    # and archived upstreamed
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mariadb/default.nix b/nixpkgs/pkgs/development/python-modules/mariadb/default.nix
new file mode 100644
index 000000000000..54e31065a089
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mariadb/default.nix
@@ -0,0 +1,30 @@
+{ buildPythonPackage, fetchPypi, libmysqlclient, lib, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "mariadb";
+  version = "1.1.4";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-c6CsvSrOOB7BvPxhztenmlGeZsAsJOEq5tJ7qgNxeHY=";
+    extension = "zip";
+  };
+
+  nativeBuildInputs = [
+    libmysqlclient
+  ];
+
+  # Requires a running MariaDB instance
+  doCheck = false;
+
+  pythonImportsCheck = [ "mariadb" ];
+
+  meta = with lib; {
+    description = "MariaDB Connector/Python";
+    homepage = "https://github.com/mariadb-corporation/mariadb-connector-python";
+    license = licenses.lgpl21Only;
+    maintainers = with maintainers; [ vanilla ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/marionette-harness/manifestparser.nix b/nixpkgs/pkgs/development/python-modules/marionette-harness/manifestparser.nix
new file mode 100644
index 000000000000..45e24ec2e1a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marionette-harness/manifestparser.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "manifestparser";
+  version = "1.1";
+
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "06cnj682ynacwpi63k1427vbf7ydnwh3dchc4b11yw8ii25wbc5d";
+  };
+
+  propagatedBuildInputs = [ ];
+
+  meta = {
+    description = "Mozilla test manifest handling";
+    homepage = "https://wiki.mozilla.org/Auto-tools/Projects/Mozbase";
+    license = lib.licenses.mpl20;
+    maintainers = with lib.maintainers; [ raskin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/marisa-trie/default.nix b/nixpkgs/pkgs/development/python-modules/marisa-trie/default.nix
new file mode 100644
index 000000000000..8b069fd235a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marisa-trie/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cython
+, pytestCheckHook
+, hypothesis
+, readme_renderer
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "marisa-trie";
+  version = "1.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-W/Q+0M82r0V4/nsDTPlfUyQ5dmUWaA5L1gNyNhHr1Ws=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    readme_renderer
+    hypothesis
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "hypothesis==" "hypothesis>="
+  '';
+
+  preBuild = ''
+    ./update_cpp.sh
+  '';
+
+  disabledTestPaths = [
+    # Don't test packaging
+    "tests/test_packaging.py"
+  ];
+
+  disabledTests = [
+    # Pins hypothesis==2.0.0 from 2016/01 which complains about
+    # hypothesis.errors.FailedHealthCheck: tests/test_trie.py::[...] uses
+    # the 'tmpdir' fixture, which is reset between function calls but not
+    # between test cases generated by `@given(...)`.
+    "test_saveload"
+    "test_mmap"
+  ];
+
+  pythonImportsCheck = [
+    "marisa_trie"
+  ];
+
+  meta = with lib; {
+    description = "Static memory-efficient Trie-like structures for Python based on marisa-trie C++ library";
+    longDescription = ''
+      There are official SWIG-based Python bindings included in C++ library distribution.
+      This package provides alternative Cython-based pip-installable Python bindings.
+    '';
+    homepage =  "https://github.com/kmike/marisa-trie";
+    changelog = "https://github.com/pytries/marisa-trie/blob/${version}/CHANGES.rst";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/marisa/default.nix b/nixpkgs/pkgs/development/python-modules/marisa/default.nix
new file mode 100644
index 000000000000..21a457b5b34e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marisa/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, marisa
+, swig
+}:
+
+buildPythonPackage rec {
+  pname = "marisa";
+  inherit (marisa) src version;
+
+  nativeBuildInputs = [ swig ];
+
+  buildInputs = [ marisa ];
+
+  preBuild = ''
+    make -C bindings swig-python
+
+    cd bindings/python
+  '';
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "marisa" ];
+
+  meta = {
+    description = "Python bindings for marisa";
+    homepage = "https://github.com/s-yata/marisa-trie";
+    license = with lib.licenses; [ bsd2 lgpl21Plus ];
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/markdown-include/default.nix b/nixpkgs/pkgs/development/python-modules/markdown-include/default.nix
new file mode 100644
index 000000000000..f56a8b40e4bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markdown-include/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, markdown
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "markdown-include";
+  version = "0.8.1";
+  format = "setuptools";
+
+  # only wheel on pypi
+  src = fetchFromGitHub {
+    owner = "cmacmackin";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-1MEk0U00a5cpVhqnDZkwBIk4NYgsRXTVsI/ANNQ/OH0=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    markdown
+  ];
+
+  pythonImportsCheck = [
+    "markdown_include"
+  ];
+
+  doCheck = false; # no tests
+
+  meta = with lib; {
+    description = "Extension to Python-Markdown which provides an include function";
+    homepage = "https://github.com/cmacmackin/markdown-include";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/markdown-it-py/default.nix b/nixpkgs/pkgs/development/python-modules/markdown-it-py/default.nix
new file mode 100644
index 000000000000..ed3df6f804eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markdown-it-py/default.nix
@@ -0,0 +1,84 @@
+{ lib
+, attrs
+, buildPythonPackage
+, commonmark
+, fetchFromGitHub
+, flit-core
+, linkify-it-py
+, markdown
+, mdit-py-plugins
+, mdurl
+, mistletoe
+, mistune
+, myst-parser
+, panflute
+, pyyaml
+, sphinx
+, sphinx-book-theme
+, sphinx-copybutton
+, sphinx-design
+, stdenv
+, pytest-regressions
+, pytestCheckHook
+, pythonRelaxDepsHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "markdown-it-py";
+  version = "3.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "executablebooks";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-cmjLElJA61EysTUFMVY++Kw0pI4wOIXOyCY3To9fpQc=";
+  };
+
+  # fix downstrem usage of markdown-it-py[linkify]
+  pythonRelaxDeps = [
+    "linkify-it-py"
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    mdurl
+  ];
+
+  nativeCheckInputs = [
+    pytest-regressions
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.linkify;
+
+  # disable and remove benchmark tests
+  preCheck = ''
+    rm -r benchmarking
+  '';
+  doCheck = !stdenv.isi686;
+
+  pythonImportsCheck = [
+    "markdown_it"
+  ];
+
+  passthru.optional-dependencies = {
+    compare = [ commonmark markdown mistletoe mistune panflute ];
+    linkify = [ linkify-it-py ];
+    plugins = [ mdit-py-plugins ];
+    rtd = [ attrs myst-parser pyyaml sphinx sphinx-copybutton sphinx-design sphinx-book-theme ];
+  };
+
+  meta = with lib; {
+    description = "Markdown parser in Python";
+    homepage = "https://markdown-it-py.readthedocs.io/";
+    changelog = "https://github.com/executablebooks/markdown-it-py/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bhipple ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/markdown-macros/default.nix b/nixpkgs/pkgs/development/python-modules/markdown-macros/default.nix
new file mode 100644
index 000000000000..e0e41bf3d0a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markdown-macros/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, markdown
+}:
+
+buildPythonPackage rec {
+  pname = "markdown-macros";
+  version = "0.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1lzvrb7nci22yp21ab2qqc9p0fhkazqj29vw0wln2r4ckb2nbawv";
+  };
+
+  patches = [
+    # Fixes a bug with markdown>2.4
+    # https://github.com/wnielson/markdown-macros/pull/1
+    (fetchpatch {
+      name = "wnielson-markdown-macros-pull-1.patch";
+      url = "https://github.com/wnielson/markdown-macros/commit/e38cba9acb6789cc128f6fe9ca427ba71815a20f.patch";
+      sha256 = "17njbgq2srzkf03ar6yn92frnsbda3g45cdi529fdh0x8mmyxci0";
+    })
+  ];
+
+  prePatch = ''
+    substituteInPlace setup.py --replace "distribute" "setuptools"
+  '';
+
+  propagatedBuildInputs = [ markdown ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "An extension for python-markdown that makes writing trac-like macros easy";
+    homepage = "https://github.com/wnielson/markdown-macros";
+    license = licenses.mit;
+    maintainers = [ maintainers.abigailbuccaneer ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/markdown/default.nix b/nixpkgs/pkgs/development/python-modules/markdown/default.nix
new file mode 100644
index 000000000000..7de193bbbbd7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markdown/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, importlib-metadata
+, pyyaml
+, setuptools
+, unittestCheckHook
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "markdown";
+  version = "3.4.4";
+
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "Python-Markdown";
+    repo = "markdown";
+    rev = "refs/tags/${version}";
+    hash = "sha256-5PIIhbJVsotGwZ3BQ4x0I7WjgnGF3opNrn8J+xZCflg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.10") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [ unittestCheckHook pyyaml ];
+
+  pythonImportsCheck = [ "markdown" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/Python-Markdown/markdown/blob/${src.rev}/docs/change_log/index.md";
+    description = "Python implementation of John Gruber's Markdown";
+    homepage = "https://github.com/Python-Markdown/markdown";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/markdown2/default.nix b/nixpkgs/pkgs/development/python-modules/markdown2/default.nix
new file mode 100644
index 000000000000..ac5e880886cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markdown2/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, pygments
+, pythonOlder
+, wavedrom
+}:
+
+buildPythonPackage rec {
+  pname = "markdown2";
+  version = "2.4.10";
+
+  disabled = pythonOlder "3.5";
+
+  # PyPI does not contain tests, so using GitHub instead.
+  src = fetchFromGitHub {
+    owner = "trentm";
+    repo = "python-markdown2";
+    rev = version;
+    hash = "sha256-1Vs2OMQm/XBOEefV6W58X5hap91aTNuTx8UFf0285uk=";
+  };
+
+  nativeCheckInputs = [ pygments ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    pushd test
+    ${python.interpreter} ./test.py -- -knownfailure
+    popd  # test
+
+    runHook postCheck
+  '';
+
+  passthru.optional-dependencies = {
+    code_syntax_highlighting = [
+      pygments
+    ];
+    wavedrom = [
+      wavedrom
+    ];
+    all = lib.flatten (lib.attrValues (lib.filterAttrs (n: v: n != "all") passthru.optional-dependencies));
+  };
+
+  meta = with lib; {
+    changelog = "https://github.com/trentm/python-markdown2/blob/${src.rev}/CHANGES.md";
+    description = "A fast and complete Python implementation of Markdown";
+    homepage =  "https://github.com/trentm/python-markdown2";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hbunke ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/markdownify/default.nix b/nixpkgs/pkgs/development/python-modules/markdownify/default.nix
new file mode 100644
index 000000000000..8b5942d61fa3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markdownify/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, beautifulsoup4
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "markdownify";
+  version = "0.11.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-AJskDgyfTI6vHQhWJdzUAR4S8PjOxV3t+epvdlXkm/4=";
+  };
+
+  propagatedBuildInputs = [ beautifulsoup4 six ];
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "HTML to Markdown converter";
+    homepage = "https://github.com/matthewwithanm/python-markdownify";
+    license = licenses.mit;
+    maintainers = [ maintainers.McSinyx ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/markuppy/default.nix b/nixpkgs/pkgs/development/python-modules/markuppy/default.nix
new file mode 100644
index 000000000000..14661a84b623
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markuppy/default.nix
@@ -0,0 +1,24 @@
+{ lib, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "markuppy";
+  version = "1.14";
+
+  src = fetchPypi {
+    pname = "MarkupPy";
+    inherit version;
+    hash = "sha256-Gt7iwKVCrzeP6EVI/29rAWjzy39Ca0aWEDiivPqtDV8=";
+  };
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "MarkupPy" ];
+
+  meta = with lib; {
+    description = "An HTML/XML generator";
+    homepage = "https://github.com/tylerbakke/MarkupPy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sephi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/markups/default.nix b/nixpkgs/pkgs/development/python-modules/markups/default.nix
new file mode 100644
index 000000000000..163fc2539d2d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markups/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, docutils
+, fetchPypi
+, importlib-metadata
+, markdown
+, pygments
+, pytestCheckHook
+, python-markdown-math
+, pythonOlder
+, pyyaml
+, setuptools
+, textile
+}:
+
+buildPythonPackage rec {
+  pname = "markups";
+  version = "4.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Markups";
+    inherit version;
+    hash = "sha256-Pdua+xxV0M/4EuM5LKM/RoSYwHB6T6iy4F0LoNMsAZ4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    docutils
+    markdown
+    pygments
+    python-markdown-math
+    pyyaml
+    textile
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # AssertionError: '.selector .ch { color: #408080' not found in 'pre...
+    "test_get_pygments_stylesheet"
+  ];
+
+  pythonImportsCheck = [
+    "markups"
+  ];
+
+  meta = with lib; {
+    description = "Wrapper around various text markup languages";
+    homepage = "https://github.com/retext-project/pymarkups";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ klntsky ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/markupsafe/default.nix b/nixpkgs/pkgs/development/python-modules/markupsafe/default.nix
new file mode 100644
index 000000000000..e63af344a3a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/markupsafe/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "markupsafe";
+  version = "2.1.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "MarkupSafe";
+    inherit version;
+    hash = "sha256-r1mO0y1q6G8bdHuCeDlYsaSrj2F7Bv5oeVx/Amq73K0=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "markupsafe" ];
+
+  meta = with lib; {
+    changelog = "https://markupsafe.palletsprojects.com/en/${versions.majorMinor version}.x/changes/#version-${replaceStrings [ "." ] [ "-" ] version}";
+    description = "Implements a XML/HTML/XHTML Markup safe string";
+    homepage = "https://palletsprojects.com/p/markupsafe/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/marshmallow-dataclass/default.nix b/nixpkgs/pkgs/development/python-modules/marshmallow-dataclass/default.nix
new file mode 100644
index 000000000000..2883b6b31add
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marshmallow-dataclass/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, marshmallow
+, marshmallow-enum
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, typeguard
+, typing-inspect
+}:
+
+buildPythonPackage rec {
+  pname = "marshmallow-dataclass";
+  version = "8.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "lovasoa";
+    repo = "marshmallow_dataclass";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+1bMo5D+7kbkZHcAvmgC1WxNk6Ba04iLccMqTKrxt80=";
+  };
+
+  propagatedBuildInputs = [
+    marshmallow
+    typing-inspect
+  ];
+
+  nativeCheckInputs = [
+    marshmallow-enum
+    pytestCheckHook
+    typeguard
+  ];
+
+  pytestFlagsArray = [
+    # DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12.
+    "-W"
+    "ignore::DeprecationWarning"
+  ];
+
+  disabledTests = lib.optionals (pythonAtLeast "3.10") [
+    # TypeError: UserId is not a dataclass and cannot be turned into one.
+    "test_newtype"
+  ];
+
+  pythonImportsCheck = [
+    "marshmallow_dataclass"
+  ];
+
+  meta = with lib; {
+    description = "Automatic generation of marshmallow schemas from dataclasses";
+    homepage = "https://github.com/lovasoa/marshmallow_dataclass";
+    changelog = "https://github.com/lovasoa/marshmallow_dataclass/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/marshmallow-enum/default.nix b/nixpkgs/pkgs/development/python-modules/marshmallow-enum/default.nix
new file mode 100644
index 000000000000..1d108b36867b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marshmallow-enum/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, marshmallow
+, pytestCheckHook
+, isPy27
+, enum34
+}:
+
+buildPythonPackage rec {
+  pname = "marshmallow-enum";
+  version = "1.5.1";
+
+  src = fetchFromGitHub {
+    owner = "justanr";
+    repo = "marshmallow_enum";
+    rev = "v${version}";
+    sha256 = "1ihrcmyfjabivg6hc44i59hnw5ijlg1byv3zs1rqxfynp8xr7398";
+  };
+
+  postPatch = ''
+    sed -i '/addopts/d' tox.ini
+  '';
+
+  propagatedBuildInputs = [
+    marshmallow
+  ] ++ lib.optionals isPy27 [ enum34 ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_custom_error_in_deserialize_by_name"
+    "test_custom_error_in_deserialize_by_value"
+  ];
+
+  meta = with lib; {
+    description = "Enum field for Marshmallow";
+    homepage = "https://github.com/justanr/marshmallow_enum";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/marshmallow-oneofschema/default.nix b/nixpkgs/pkgs/development/python-modules/marshmallow-oneofschema/default.nix
new file mode 100644
index 000000000000..3e4faf8c6031
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marshmallow-oneofschema/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, marshmallow
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "marshmallow-oneofschema";
+  version = "3.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "marshmallow-code";
+    repo = pname;
+    rev = version;
+    hash = "sha256-Em2jQmvI5IiWREeOX/JAcdOQlpwP7k+cbCirkh82sf0=";
+  };
+
+  propagatedBuildInputs = [
+    marshmallow
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "marshmallow_oneofschema"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/marshmallow-code/marshmallow-oneofschema/blob/${src.rev}/CHANGELOG.rst";
+    description = "Marshmallow library extension that allows schema (de)multiplexing";
+    homepage = "https://github.com/marshmallow-code/marshmallow-oneofschema";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ivan-tkatchev ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/marshmallow-polyfield/default.nix b/nixpkgs/pkgs/development/python-modules/marshmallow-polyfield/default.nix
new file mode 100644
index 000000000000..d54b070fbf14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marshmallow-polyfield/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, marshmallow
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "marshmallow-polyfield";
+  version = "5.10";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Bachmann1234";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-oF5LBuDK4kqsAcKwidju+wFjigjy4CNbJ6bfWpGO1yQ=";
+  };
+
+  propagatedBuildInputs = [
+    marshmallow
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=marshmallow_polyfield" ""
+  '';
+
+  pythonImportsCheck = [
+    "marshmallow"
+  ];
+
+  meta = with lib; {
+    description = "Extension to Marshmallow to allow for polymorphic fields";
+    homepage = "https://github.com/Bachmann1234/marshmallow-polyfield";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/marshmallow-sqlalchemy/default.nix b/nixpkgs/pkgs/development/python-modules/marshmallow-sqlalchemy/default.nix
new file mode 100644
index 000000000000..92dd8d2f3d64
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marshmallow-sqlalchemy/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, marshmallow
+, packaging
+, sqlalchemy
+, pytest-lazy-fixture
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "marshmallow-sqlalchemy";
+  version = "0.29.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NSOndDkO8MHA98cIp1GYCcU5bPYIcg8U9Vw290/1u+w=";
+  };
+
+  propagatedBuildInputs = [
+    marshmallow
+    packaging
+    sqlalchemy
+  ];
+
+  pythonImportsCheck = [
+    "marshmallow_sqlalchemy"
+  ];
+
+  nativeCheckInputs = [
+    pytest-lazy-fixture
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "SQLAlchemy integration with marshmallow";
+    homepage = "https://github.com/marshmallow-code/marshmallow-sqlalchemy";
+    changelog = "https://github.com/marshmallow-code/marshmallow-sqlalchemy/blob/${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/marshmallow/default.nix b/nixpkgs/pkgs/development/python-modules/marshmallow/default.nix
new file mode 100644
index 000000000000..bbe9c9bf157d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/marshmallow/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, pytz
+, simplejson
+, packaging
+}:
+
+buildPythonPackage rec {
+  pname = "marshmallow";
+  version = "3.20.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "marshmallow-code";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-sPYiup7ontnubtBxv+rIT0up4IHPJNCUlH9J4FlHsss=";
+  };
+
+  propagatedBuildInputs = [
+    packaging
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytz
+    simplejson
+  ];
+
+  pythonImportsCheck = [
+    "marshmallow"
+  ];
+
+  meta = with lib; {
+    description = "Library for converting complex objects to and from simple Python datatypes";
+    homepage = "https://github.com/marshmallow-code/marshmallow";
+    changelog = "https://github.com/marshmallow-code/marshmallow/blob/${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cript0nauta ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mashumaro/default.nix b/nixpkgs/pkgs/development/python-modules/mashumaro/default.nix
new file mode 100644
index 000000000000..d61ddf90362d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mashumaro/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, ciso8601
+, fetchFromGitHub
+, msgpack
+, orjson
+, pendulum
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, setuptools
+, tomli
+, tomli-w
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "mashumaro";
+  version = "3.11";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Fatal1ty";
+    repo = "mashumaro";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-7gRbTNNK8elWsL0ub7c/EeswIk4xxJOxKVk8HmvWMZA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = {
+    orjson = [
+      orjson
+    ];
+    msgpack = [
+      msgpack
+    ];
+    yaml = [
+      pyyaml
+    ];
+    toml = [
+      tomli-w
+    ] ++ lib.optionals (pythonOlder "3.11") [
+      tomli
+    ];
+  };
+
+  nativeCheckInputs = [
+    ciso8601
+    pendulum
+    pytest-mock
+    pytestCheckHook
+  ] ++ lib.flatten (lib.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "mashumaro"
+  ];
+
+  meta = with lib; {
+    description = "Serialization library on top of dataclasses";
+    homepage = "https://github.com/Fatal1ty/mashumaro";
+    changelog = "https://github.com/Fatal1ty/mashumaro/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ tjni ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/masky/default.nix b/nixpkgs/pkgs/development/python-modules/masky/default.nix
new file mode 100644
index 000000000000..4d03c4d57d93
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/masky/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, asn1crypto
+, buildPythonPackage
+, colorama
+, cryptography
+, fetchFromGitHub
+, impacket
+, pyasn1
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "masky";
+  version = "0.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Z4kSec";
+    repo = "Masky";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-npRuszHkxwjJ+B+q8eQywXPd0OX0zS+AfCro4TM83Uc=";
+  };
+
+  propagatedBuildInputs = [
+    asn1crypto
+    colorama
+    cryptography
+    impacket
+    pyasn1
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "masky"
+  ];
+
+  meta = with lib; {
+    description = "Library to remotely dump domain credentials";
+    homepage = "https://github.com/Z4kSec/Masky";
+    changelog = "https://github.com/Z4kSec/Masky/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ elasticdog ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mastodon-py/default.nix b/nixpkgs/pkgs/development/python-modules/mastodon-py/default.nix
new file mode 100644
index 000000000000..5034346b9cfe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mastodon-py/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, blurhash
+, cryptography
+, decorator
+, http-ece
+, python-dateutil
+, python-magic
+, requests
+, six
+, pytestCheckHook
+, pytest-mock
+, pytest-vcr
+, requests-mock
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "mastodon-py";
+  version = "1.8.1";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "halcy";
+    repo = "Mastodon.py";
+    rev = "refs/tags/${version}";
+    hash = "sha256-r0AAUjd2MBfZANEpyztMNyaQTlGWvWoUVjJNO1eL218=";
+  };
+
+  postPatch = ''
+    sed -i '/addopts/d' setup.cfg
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    blurhash
+    decorator
+    python-dateutil
+    python-magic
+    requests
+    six
+  ];
+
+  passthru.optional-dependencies = {
+    blurhash = [
+      blurhash
+    ];
+    webpush = [
+      http-ece
+      cryptography
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+    pytest-vcr
+    requests-mock
+    setuptools
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  disabledTests = [
+    "test_notifications_dismiss_pre_2_9_2"
+    "test_status_card_pre_2_9_2"
+    "test_stream_user_direct"
+    "test_stream_user_local"
+  ];
+
+  pythonImportsCheck = [ "mastodon" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/halcy/Mastodon.py/blob/${src.rev}/CHANGELOG.rst";
+    description = "Python wrapper for the Mastodon API";
+    homepage = "https://github.com/halcy/Mastodon.py";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mat2/bubblewrap-path.patch b/nixpkgs/pkgs/development/python-modules/mat2/bubblewrap-path.patch
new file mode 100644
index 000000000000..2c71930b6df8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mat2/bubblewrap-path.patch
@@ -0,0 +1,35 @@
+diff --git a/libmat2/bubblewrap.py b/libmat2/bubblewrap.py
+index 970d5dd..5d3c0b7 100644
+--- a/libmat2/bubblewrap.py
++++ b/libmat2/bubblewrap.py
+@@ -22,11 +22,7 @@ CalledProcessError = subprocess.CalledProcessError
+ 
+ 
+ def _get_bwrap_path() -> str:
+-    which_path = shutil.which('bwrap')
+-    if which_path:
+-        return which_path
+-
+-    raise RuntimeError("Unable to find bwrap")  # pragma: no cover
++    return '@bwrap@'
+ 
+ 
+ def _get_bwrap_args(tempdir: str,
+@@ -37,16 +33,11 @@ def _get_bwrap_args(tempdir: str,
+ 
+     # XXX: use --ro-bind-try once all supported platforms
+     # have a bubblewrap recent enough to support it.
+-    ro_bind_dirs = ['/usr', '/lib', '/lib64', '/bin', '/sbin', '/etc/alternatives', cwd]
++    ro_bind_dirs = ['/nix/store', cwd]
+     for bind_dir in ro_bind_dirs:
+         if os.path.isdir(bind_dir):  # pragma: no cover
+             ro_bind_args.extend(['--ro-bind', bind_dir, bind_dir])
+ 
+-    ro_bind_files = ['/etc/ld.so.cache']
+-    for bind_file in ro_bind_files:
+-        if os.path.isfile(bind_file):  # pragma: no cover
+-            ro_bind_args.extend(['--ro-bind', bind_file, bind_file])
+-
+     args = ro_bind_args + \
+         ['--dev', '/dev',
+          '--proc', '/proc',
diff --git a/nixpkgs/pkgs/development/python-modules/mat2/default.nix b/nixpkgs/pkgs/development/python-modules/mat2/default.nix
new file mode 100644
index 000000000000..1646d3ac7246
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mat2/default.nix
@@ -0,0 +1,106 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pytestCheckHook
+, pythonOlder
+, fetchFromGitLab
+, substituteAll
+, bubblewrap
+, exiftool
+, ffmpeg
+, mailcap
+, wrapGAppsHook
+, gdk-pixbuf
+, gobject-introspection
+, librsvg
+, poppler_gi
+, mutagen
+, pygobject3
+, pycairo
+, dolphinIntegration ? false
+, plasma5Packages
+}:
+
+buildPythonPackage rec {
+  pname = "mat2";
+  version = "0.13.4";
+
+  disabled = pythonOlder "3.5";
+
+  format = "setuptools";
+
+  src = fetchFromGitLab {
+    domain = "0xacab.org";
+    owner = "jvoisin";
+    repo = "mat2";
+    rev = version;
+    hash = "sha256-SuN62JjSb5O8gInvBH+elqv/Oe7j+xjCo+dmPBU7jEY=";
+  };
+
+  patches = [
+    # hardcode paths to some binaries
+    (substituteAll ({
+      src = ./paths.patch;
+      exiftool = "${exiftool}/bin/exiftool";
+      ffmpeg = "${ffmpeg}/bin/ffmpeg";
+    } // lib.optionalAttrs dolphinIntegration {
+      kdialog = "${plasma5Packages.kdialog}/bin/kdialog";
+    }))
+    # the executable shouldn't be called .mat2-wrapped
+    ./executable-name.patch
+    # hardcode path to mat2 executable
+    ./tests.patch
+  ] ++ lib.optionals (stdenv.hostPlatform.isLinux) [
+    (substituteAll {
+      src = ./bubblewrap-path.patch;
+      bwrap = "${bubblewrap}/bin/bwrap";
+    })
+  ];
+
+  postPatch = ''
+    rm pyproject.toml
+    substituteInPlace dolphin/mat2.desktop \
+      --replace "@mat2@" "$out/bin/mat2" \
+      --replace "@mat2svg@" "$out/share/icons/hicolor/scalable/apps/mat2.svg"
+  '';
+
+  nativeBuildInputs = [
+    gobject-introspection
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    gdk-pixbuf
+    librsvg
+    poppler_gi
+  ];
+
+  propagatedBuildInputs = [
+    mutagen
+    pygobject3
+    pycairo
+  ];
+
+  postInstall = ''
+    install -Dm 444 data/mat2.svg -t "$out/share/icons/hicolor/scalable/apps"
+    install -Dm 444 doc/mat2.1 -t "$out/share/man/man1"
+  '' + lib.optionalString dolphinIntegration ''
+    install -Dm 444 dolphin/mat2.desktop -t "$out/share/kservices5/ServiceMenus"
+  '';
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  disabledTests = [
+    # Frequently fails when exiftool is updated and adds support for new metadata.
+    "test_all_parametred"
+  ];
+
+  meta = with lib; {
+    description = "A handy tool to trash your metadata";
+    homepage = "https://0xacab.org/jvoisin/mat2";
+    changelog = "https://0xacab.org/jvoisin/mat2/-/blob/${version}/CHANGELOG.md";
+    license = licenses.lgpl3Plus;
+    mainProgram = "mat2";
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mat2/executable-name.patch b/nixpkgs/pkgs/development/python-modules/mat2/executable-name.patch
new file mode 100644
index 000000000000..6eee0a949400
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mat2/executable-name.patch
@@ -0,0 +1,13 @@
+diff --git a/mat2 b/mat2
+index 3b77e1e..b99a633 100755
+--- a/mat2
++++ b/mat2
+@@ -46,7 +46,7 @@ def __check_file(filename: str, mode: int = os.R_OK) -> bool:
+ 
+ 
+ def create_arg_parser() -> argparse.ArgumentParser:
+-    parser = argparse.ArgumentParser(description='Metadata anonymisation toolkit 2')
++    parser = argparse.ArgumentParser(description='Metadata anonymisation toolkit 2', prog='mat2')
+ 
+     parser.add_argument('-V', '--verbose', action='store_true',
+                         help='show more verbose status information')
diff --git a/nixpkgs/pkgs/development/python-modules/mat2/paths.patch b/nixpkgs/pkgs/development/python-modules/mat2/paths.patch
new file mode 100644
index 000000000000..c2c156885c19
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mat2/paths.patch
@@ -0,0 +1,66 @@
+diff --git a/dolphin/mat2.desktop b/dolphin/mat2.desktop
+index 41c8de4..11df258 100644
+--- a/dolphin/mat2.desktop
++++ b/dolphin/mat2.desktop
+@@ -8,6 +8,6 @@ Type=Service
+ Name=Clean metadata
+ Name[de]=Metadaten löschen
+ Name[es]=Limpiar metadatos
+-Icon=/usr/share/icons/hicolor/scalable/apps/mat2.svg
+-Exec=kdialog --yesno  "$( mat2 -s %F )" --title "Clean Metadata?" && mat2 %U
+-Exec[de]=kdialog --yesno  "$( mat2 -s %F )" --title "Metadaten löschen?" && mat2 %U
++Icon=@mat2svg@
++Exec=@kdialog@ --yesno  "$( @mat2@ -s %F )" --title "Clean Metadata?" && @mat2@ %U
++Exec[de]=@kdialog@ --yesno  "$( @mat2@ -s %F )" --title "Metadaten löschen?" && @mat2@ %U
+diff --git a/libmat2/exiftool.py b/libmat2/exiftool.py
+index 2b91ac2..5fcf6e5 100644
+--- a/libmat2/exiftool.py
++++ b/libmat2/exiftool.py
+@@ -1,8 +1,6 @@
+-import functools
+ import json
+ import logging
+ import os
+-import shutil
+ import subprocess
+ from typing import Union, Set, Dict
+ 
+@@ -67,14 +65,5 @@ class ExiftoolParser(abstract.AbstractParser):
+             return False
+         return True
+ 
+-@functools.lru_cache(maxsize=None)
+ def _get_exiftool_path() -> str:  # pragma: no cover
+-    which_path = shutil.which('exiftool')
+-    if which_path:
+-        return which_path
+-
+-    # Exiftool on Arch Linux has a weird path
+-    if os.access('/usr/bin/vendor_perl/exiftool', os.X_OK):
+-        return '/usr/bin/vendor_perl/exiftool'
+-
+-    raise RuntimeError("Unable to find exiftool")
++    return '@exiftool@'
+diff --git a/libmat2/video.py b/libmat2/video.py
+index 39059c5..82fe1e7 100644
+--- a/libmat2/video.py
++++ b/libmat2/video.py
+@@ -1,6 +1,4 @@
+ import subprocess
+-import functools
+-import shutil
+ import logging
+ 
+ from typing import Union, Dict
+@@ -135,10 +133,5 @@ class MP4Parser(AbstractFFmpegParser):
+     }
+ 
+ 
+-@functools.lru_cache(maxsize=None)
+ def _get_ffmpeg_path() -> str:  # pragma: no cover
+-    which_path = shutil.which('ffmpeg')
+-    if which_path:
+-        return which_path
+-
+-    raise RuntimeError("Unable to find ffmpeg")
++    return '@ffmpeg@'
diff --git a/nixpkgs/pkgs/development/python-modules/mat2/tests.patch b/nixpkgs/pkgs/development/python-modules/mat2/tests.patch
new file mode 100644
index 000000000000..8958d937dd43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mat2/tests.patch
@@ -0,0 +1,18 @@
+diff --git a/tests/test_climat2.py b/tests/test_climat2.py
+index cede642..2d5ad77 100644
+--- a/tests/test_climat2.py
++++ b/tests/test_climat2.py
+@@ -10,12 +10,7 @@ import glob
+ from libmat2 import images, parser_factory
+ 
+ 
+-mat2_binary = ['./mat2']
+-
+-if 'MAT2_GLOBAL_PATH_TESTSUITE' in os.environ:
+-    # Debian runs tests after installing the package
+-    # https://0xacab.org/jvoisin/mat2/issues/16#note_153878
+-    mat2_binary = ['/usr/bin/env', 'mat2']
++mat2_binary = [os.environ['out'] + '/bin/mat2']
+ 
+ 
+ class TestHelp(unittest.TestCase):
diff --git a/nixpkgs/pkgs/development/python-modules/matchpy/default.nix b/nixpkgs/pkgs/development/python-modules/matchpy/default.nix
new file mode 100644
index 000000000000..57e7728b1aa3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/matchpy/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hopcroftkarp
+, multiset
+, pytestCheckHook
+, hypothesis
+, setuptools-scm
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "matchpy";
+  version = "0.5.5"; # Don't upgrade to 4.3.1, this tag is very old
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "HPAC";
+    repo = pname;
+    rev = version;
+    hash = "sha256-n5rXIjqVQZzEbfIZVQiGLh2PR1DHAJ9gumcrbvwnasA=";
+  };
+
+  postPatch = ''
+    sed -i '/pytest-runner/d' setup.cfg
+
+    substituteInPlace setup.cfg \
+      --replace "multiset>=2.0,<3.0" "multiset"
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    hopcroftkarp
+    multiset
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    hypothesis
+  ];
+
+  pythonImportsCheck = [
+    "matchpy"
+  ];
+
+  meta = with lib; {
+    description = "A library for pattern matching on symbolic expressions";
+    homepage = "https://github.com/HPAC/matchpy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/material-color-utilities/default.nix b/nixpkgs/pkgs/development/python-modules/material-color-utilities/default.nix
new file mode 100644
index 000000000000..8c92723e4a06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/material-color-utilities/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, pythonRelaxDepsHook, pillow, regex }:
+
+buildPythonPackage rec {
+  pname = "material-color-utilities-python";
+  version = "0.1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-PG8C585wWViFRHve83z3b9NijHyV+iGY2BdMJpyVH64=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+  pythonRelaxDeps = [
+    "Pillow"
+  ];
+
+  propagatedBuildInputs = [
+    pillow
+    regex
+  ];
+
+  # No tests implemented.
+  doCheck = false;
+
+  pythonImportsCheck = [ "material_color_utilities_python" ];
+
+  meta = with lib; {
+    homepage = "https://pypi.org/project/material_color_utilities_python";
+    description = "Python port of material_color_utilities used for Material You colors";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ foo-dogsquared ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mathlibtools/default.nix b/nixpkgs/pkgs/development/python-modules/mathlibtools/default.nix
new file mode 100644
index 000000000000..4f90bb7f3698
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mathlibtools/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, atomicwrites
+, buildPythonPackage
+, click
+, fetchPypi
+, gitpython
+, networkx
+, pydot
+, pygithub
+, pythonOlder
+, pyyaml
+, toml
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "mathlibtools";
+  version = "1.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-mkn0y3NV/acnkqVzi8xd+Sex4QLvxxmt++FtsZmgrGs=";
+  };
+
+  propagatedBuildInputs = [
+    atomicwrites
+    click
+    gitpython
+    networkx
+    pydot
+    pygithub
+    pyyaml
+    toml
+    tqdm
+  ];
+
+  # Requires internet access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "mathlibtools"
+  ];
+
+  meta = with lib; {
+    description = "Supporting tool for Lean's mathlib";
+    homepage = "https://github.com/leanprover-community/mathlib-tools";
+    changelog = "https://github.com/leanprover-community/mathlib-tools/raw/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ gebner ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/matlink-gpapi/default.nix b/nixpkgs/pkgs/development/python-modules/matlink-gpapi/default.nix
new file mode 100644
index 000000000000..1f8533748965
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/matlink-gpapi/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage
+, cryptography
+, fetchPypi
+, lib
+, pythonOlder
+, protobuf
+, pycryptodome
+, requests
+}:
+
+buildPythonPackage rec {
+  version = "0.4.4.5";
+  pname = "matlink-gpapi";
+  disabled = pythonOlder "3.3"; # uses shutil.which(), added in 3.3
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "0s45yb2xiq3pc1fh4bygfgly0fsjk5fkc4wckbckn3ddl7v7vz8c";
+  };
+
+  # package doesn't contain unit tests
+  # scripts in ./test require networking
+  doCheck = false;
+
+  pythonImportsCheck = [ "gpapi.googleplay" ];
+
+  propagatedBuildInputs = [ cryptography protobuf pycryptodome requests ];
+
+  meta = with lib; {
+    homepage = "https://github.com/NoMore201/googleplay-api";
+    license = licenses.gpl3Only;
+    description = "Google Play Unofficial Python API";
+    maintainers = with maintainers; [ schnusch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/matplotlib-inline/default.nix b/nixpkgs/pkgs/development/python-modules/matplotlib-inline/default.nix
new file mode 100644
index 000000000000..f960882b1617
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/matplotlib-inline/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildPythonPackage, fetchPypi
+, traitlets
+
+# tests
+, ipython
+}:
+
+buildPythonPackage rec {
+  pname = "matplotlib-inline";
+  version = "0.1.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+Ifl8Qupjo0rFQ3c9HAsHl+LOiAAXrD3S/29Ng7m8wQ=";
+  };
+
+  propagatedBuildInputs = [
+    traitlets
+  ];
+
+  # wants to import ipython, which creates a circular dependency
+  doCheck = false;
+
+  #
+  pythonImportsCheck = [
+    # tries to import matplotlib, which can't work with doCheck disabled
+    #"matplotlib_inline"
+  ];
+
+  passthru.tests = { inherit ipython; };
+
+  meta = with lib; {
+    description = "Matplotlib Inline Back-end for IPython and Jupyter";
+    homepage = "https://github.com/ipython/matplotlib-inline";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/matplotlib-sixel/default.nix b/nixpkgs/pkgs/development/python-modules/matplotlib-sixel/default.nix
new file mode 100644
index 000000000000..451f2a1a3dbe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/matplotlib-sixel/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, imagemagick
+, matplotlib
+}:
+
+buildPythonPackage rec {
+  pname = "matplotlib-sixel";
+  version = "0.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JXOb1/IacJV8bhDvF+OPs2Yg1tgRDOqwiAQfiSKTlew=";
+  };
+
+  propagatedBuildInputs = [ matplotlib ];
+
+  postPatch = ''
+    substituteInPlace sixel/sixel.py \
+      --replace 'Popen(["convert",' 'Popen(["${imagemagick}/bin/convert",'
+  '';
+
+  pythonImportsCheck = [ "sixel" ];
+
+  meta = with lib; {
+    description = "A sixel graphics backend for matplotlib";
+    homepage = "https://github.com/jonathf/matplotlib-sixel";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/matplotlib/default.nix b/nixpkgs/pkgs/development/python-modules/matplotlib/default.nix
new file mode 100644
index 000000000000..4ac081e26a20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/matplotlib/default.nix
@@ -0,0 +1,206 @@
+{ lib
+, stdenv
+, fetchPypi
+, writeText
+, buildPythonPackage
+, isPyPy
+, pythonOlder
+
+# https://github.com/matplotlib/matplotlib/blob/main/doc/devel/dependencies.rst
+# build-system
+, certifi
+, oldest-supported-numpy
+, pkg-config
+, pybind11
+, setuptools
+, setuptools-scm
+, wheel
+
+# native libraries
+, ffmpeg-headless
+, freetype
+, qhull
+
+# propagates
+, contourpy
+, cycler
+, fonttools
+, kiwisolver
+, numpy
+, packaging
+, pillow
+, pyparsing
+, python-dateutil
+
+# optional
+, importlib-resources
+
+# GTK3
+, enableGtk3 ? false
+, cairo
+, gobject-introspection
+, gtk3
+, pycairo
+, pygobject3
+
+# Tk
+# Darwin has its own "MacOSX" backend, PyPy has tkagg backend and does not support tkinter
+, enableTk ? (!stdenv.isDarwin && !isPyPy)
+, tcl
+, tk
+, tkinter
+
+# Ghostscript
+, enableGhostscript ? true
+, ghostscript
+
+# Qt
+, enableQt ? false
+, pyqt5
+
+# Webagg
+, enableWebagg ? false
+, tornado
+
+# nbagg
+, enableNbagg ? false
+, ipykernel
+
+# darwin
+, Cocoa
+
+# required for headless detection
+, libX11
+, wayland
+}:
+
+let
+  interactive = enableTk || enableGtk3 || enableQt;
+in
+
+buildPythonPackage rec {
+  version = "3.8.0";
+  pname = "matplotlib";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-34UF4cGdXCwmr/NJeny9PM/C6XBD0eTbPnavo5kWS2k=";
+  };
+
+  env.XDG_RUNTIME_DIR = "/tmp";
+
+  # Matplotlib tries to find Tcl/Tk by opening a Tk window and asking the
+  # corresponding interpreter object for its library paths. This fails if
+  # `$DISPLAY` is not set. The fallback option assumes that Tcl/Tk are both
+  # installed under the same path which is not true in Nix.
+  # With the following patch we just hard-code these paths into the install
+  # script.
+  postPatch =
+    let
+      tcl_tk_cache = ''"${tk}/lib", "${tcl}/lib", "${lib.strings.substring 0 3 tk.version}"'';
+    in
+    lib.optionalString enableTk ''
+      sed -i '/self.tcl_tk_cache = None/s|None|${tcl_tk_cache}|' setupext.py
+    '' + lib.optionalString (stdenv.isLinux && interactive) ''
+      # fix paths to libraries in dlopen calls (headless detection)
+      substituteInPlace src/_c_internal_utils.c \
+        --replace libX11.so.6 ${libX11}/lib/libX11.so.6 \
+        --replace libwayland-client.so.0 ${wayland}/lib/libwayland-client.so.0
+    '' +
+    # bring our own system libraries
+    # https://github.com/matplotlib/matplotlib/blob/main/doc/devel/dependencies.rst#c-libraries
+    ''
+      echo "[libs]
+      system_freetype=true
+      system_qhull=true" > mplsetup.cfg
+    '';
+
+  nativeBuildInputs = [
+    certifi
+    numpy
+    oldest-supported-numpy # TODO remove after updating to 3.8.0
+    pkg-config
+    pybind11
+    setuptools
+    setuptools-scm
+    wheel
+  ] ++ lib.optionals enableGtk3 [
+    gobject-introspection
+  ];
+
+  buildInputs = [
+    ffmpeg-headless
+    freetype
+    qhull
+  ] ++ lib.optionals enableGhostscript [
+    ghostscript
+  ] ++ lib.optionals enableGtk3 [
+    cairo
+    gtk3
+  ] ++ lib.optionals enableTk [
+    libX11
+    tcl
+    tk
+  ] ++ lib.optionals stdenv.isDarwin [
+    Cocoa
+  ];
+
+  # clang-11: error: argument unused during compilation: '-fno-strict-overflow' [-Werror,-Wunused-command-line-argument]
+  hardeningDisable = lib.optionals stdenv.isDarwin [
+    "strictoverflow"
+  ];
+
+  propagatedBuildInputs = [
+    # explicit
+    contourpy
+    cycler
+    fonttools
+    kiwisolver
+    numpy
+    packaging
+    pillow
+    pyparsing
+    python-dateutil
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    importlib-resources
+  ] ++ lib.optionals enableGtk3 [
+    pycairo
+    pygobject3
+  ] ++ lib.optionals enableQt [
+    pyqt5
+  ] ++ lib.optionals enableWebagg [
+    tornado
+  ] ++ lib.optionals enableNbagg [
+    ipykernel
+  ] ++ lib.optionals enableTk [
+    tkinter
+  ];
+
+  passthru.config = {
+    directories = { basedirlist = "."; };
+    libs = {
+      system_freetype = true;
+      system_qhull = true;
+    } // lib.optionalAttrs stdenv.isDarwin {
+      # LTO not working in darwin stdenv, see #19312
+      enable_lto = false;
+    };
+  };
+
+  env.MPLSETUPCFG = writeText "mplsetup.cfg" (lib.generators.toINI {} passthru.config);
+
+  # Matplotlib needs to be built against a specific version of freetype in
+  # order for all of the tests to pass.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python plotting library, making publication quality plots";
+    homepage = "https://matplotlib.org/";
+    changelog = "https://github.com/matplotlib/matplotlib/releases/tag/v${version}";
+    license = with licenses; [ psfl bsd0 ];
+    maintainers = with maintainers; [ lovek323 veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/matplotx/default.nix b/nixpkgs/pkgs/development/python-modules/matplotx/default.nix
new file mode 100644
index 000000000000..f20812606869
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/matplotx/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, setuptools
+, matplotlib
+, numpy
+, networkx
+, pypng
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "matplotx";
+  version = "0.3.10";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "nschloe";
+    repo = "matplotx";
+    rev = "v${version}";
+    hash = "sha256-EWEiEY23uFwd/vgWVLCH/buUmgRqz1rqqlJEdXINYMg=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+    matplotlib
+    numpy
+  ];
+
+  passthru.optional-dependencies = {
+    all = [
+      networkx
+      pypng
+      scipy
+    ];
+    contour = [ networkx ];
+    spy = [
+      pypng
+      scipy
+    ];
+  };
+
+  # This variable is needed to suppress the "Trace/BPT trap: 5" error in Darwin's checkPhase.
+  # Not sure of the details, but we can avoid it by changing the matplotlib backend during testing.
+  env.MPLBACKEND = lib.optionalString stdenv.isDarwin "Agg";
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.all;
+
+  disabledTestPaths = [
+    "tests/test_spy.py" # Requires meshzoo (non-free) and pytest-codeblocks (not packaged)
+  ];
+
+  pythonImportsCheck = [ "matplotx" ];
+
+  meta = {
+    homepage = "https://github.com/nschloe/matplotx";
+    description = "More styles and useful extensions for Matplotlib";
+    changelog = "https://github.com/nschloe/matplotx/releases/tag/v${version}";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ swflint ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/matrix-api-async/default.nix b/nixpkgs/pkgs/development/python-modules/matrix-api-async/default.nix
new file mode 100644
index 000000000000..d7ae05bddc96
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/matrix-api-async/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, matrix-client }:
+
+buildPythonPackage rec {
+  pname = "matrix_api_async";
+  version = "0.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0xdx8fci0lar3x09dwqgka6ssz9d3g7gsfx4yyr13sdwza7zsqc3";
+  };
+
+  propagatedBuildInputs = [ matrix-client ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "matrix_api_async" ];
+
+  meta = with lib; {
+    description = "An asyncio wrapper of matrix_client.api";
+    license = licenses.mit;
+    homepage = "https://github.com/Cadair/matrix_api_async";
+    maintainers = with maintainers; [ globin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/matrix-client/default.nix b/nixpkgs/pkgs/development/python-modules/matrix-client/default.nix
new file mode 100644
index 000000000000..9816f9470c64
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/matrix-client/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, requests
+, responses
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "matrix-client";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    pname = "matrix_client";
+    inherit version;
+    sha256 = "0mii7ib3bah5ppqs7i8sjv5l0zbl57011908m4l0jbyby90ayy06";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    urllib3
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py --replace \
+      "pytest-runner~=5.1" ""
+  '';
+
+  pythonImportsCheck = [ "matrix_client" ];
+
+  meta = with lib; {
+    description = "Python Matrix Client-Server SDK";
+    homepage = "https://github.com/matrix-org/matrix-python-sdk";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ olejorgenb ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/matrix-common/default.nix b/nixpkgs/pkgs/development/python-modules/matrix-common/default.nix
new file mode 100644
index 000000000000..8252bc267a02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/matrix-common/default.nix
@@ -0,0 +1,41 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, attrs
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "matrix-common";
+  version = "1.3.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "matrix_common";
+    inherit version;
+    hash = "sha256-YuEhzM2fJDQXtX7DenbcRK6xmKelxnr9a4J1mS/yq9E=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [ "matrix_common" ];
+
+  meta = with lib; {
+    description = "Common utilities for Synapse, Sydent and Sygnal";
+    homepage = "https://github.com/matrix-org/matrix-python-common";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ sumnerevans ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/matrix-nio/default.nix b/nixpkgs/pkgs/development/python-modules/matrix-nio/default.nix
new file mode 100644
index 000000000000..db6b13b0fcc3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/matrix-nio/default.nix
@@ -0,0 +1,106 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, logbook
+, aiofiles
+, aiohttp
+, aiohttp-socks
+, aioresponses
+, atomicwrites
+, attrs
+, cachetools
+, faker
+, future
+, git
+, h11
+, h2
+, hypothesis
+, jsonschema
+, peewee
+, poetry-core
+, py
+, pycryptodome
+, pytest-aiohttp
+, pytest-benchmark
+, pytestCheckHook
+, python-olm
+, unpaddedbase64
+}:
+
+buildPythonPackage rec {
+  pname = "matrix-nio";
+  version = "0.22.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "poljar";
+    repo = "matrix-nio";
+    rev = version;
+    hash = "sha256-hFSS2Nys95YJgBNED8SBan24iRo2q/UOr6pqUPAF5Ms=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'aiofiles = "^0.6.0"' 'aiofiles = "*"' \
+      --replace 'h11 = "^0.12.0"' 'h11 = "*"' \
+      --replace 'cachetools = { version = "^4.2.1", optional = true }' 'cachetools = { version = "*", optional = true }' \
+      --replace 'aiohttp-socks = "^0.7.0"' 'aiohttp-socks = "*"'
+  '';
+
+  nativeBuildInputs = [
+    git
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiofiles
+    aiohttp
+    aiohttp-socks
+    attrs
+    future
+    h11
+    h2
+    jsonschema
+    logbook
+    pycryptodome
+    unpaddedbase64
+  ];
+
+  passthru.optional-dependencies = {
+    e2e = [
+      atomicwrites
+      cachetools
+      python-olm
+      peewee
+    ];
+  };
+
+  nativeCheckInputs = [
+    aioresponses
+    faker
+    hypothesis
+    py
+    pytest-aiohttp
+    pytest-benchmark
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.e2e;
+
+  pytestFlagsArray = [
+    "--benchmark-disable"
+  ];
+
+  disabledTests = [
+    # touches network
+    "test_connect_wrapper"
+    # time dependent and flaky
+    "test_transfer_monitor_callbacks"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/poljar/matrix-nio";
+    changelog = "https://github.com/poljar/matrix-nio/blob/${version}/CHANGELOG.md";
+    description = "A Python Matrix client library, designed according to sans I/O principles";
+    license = licenses.isc;
+    maintainers = with maintainers; [ tilpner emily symphorien ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mattermostdriver/default.nix b/nixpkgs/pkgs/development/python-modules/mattermostdriver/default.nix
new file mode 100644
index 000000000000..629960797b03
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mattermostdriver/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, websockets
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "mattermostdriver";
+  version = "7.3.2";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2e4d7b4a17d3013e279c6f993746ea18cd60b45d8fa3be24f47bc2de22b9b3b4";
+  };
+
+  propagatedBuildInputs = [ websockets requests ];
+
+  pythonImportsCheck = [ "mattermostdriver" ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A Python Mattermost Driver";
+    homepage = "https://github.com/Vaelor/python-mattermost-driver";
+    license = licenses.mit;
+    maintainers = with maintainers; [ globin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mautrix/default.nix b/nixpkgs/pkgs/development/python-modules/mautrix/default.nix
new file mode 100644
index 000000000000..199b4ab8a696
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mautrix/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+  # deps
+, aiohttp
+, attrs
+, yarl
+  # optional deps
+, python-magic
+, python-olm
+, unpaddedbase64
+, pycryptodome
+  # check deps
+, pytestCheckHook
+, pytest-asyncio
+, aiosqlite
+, asyncpg
+}:
+
+buildPythonPackage rec {
+  pname = "mautrix";
+  version = "0.20.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "mautrix";
+    repo = "python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-7ZSPxKRLAgwC1ECxa1eOTH60cMJXs1iv2PE2Vq9f0co=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    attrs
+    yarl
+  ];
+
+  passthru.optional-dependencies = {
+    detect_mimetype = [
+      python-magic
+    ];
+    encryption = [
+      python-olm
+      unpaddedbase64
+      pycryptodome
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    aiosqlite
+    asyncpg
+  ] ++ passthru.optional-dependencies.encryption;
+
+  pythonImportsCheck = [
+    "mautrix"
+  ];
+
+  meta = with lib; {
+    description = "Asyncio Matrix framework";
+    homepage = "https://github.com/tulir/mautrix-python";
+    changelog = "https://github.com/mautrix/python/releases/tag/v${version}";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ nyanloutre ma27 sumnerevans nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/maxcube-api/default.nix b/nixpkgs/pkgs/development/python-modules/maxcube-api/default.nix
new file mode 100644
index 000000000000..e239fde3e1d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/maxcube-api/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "maxcube-api";
+  version = "0.4.3";
+  format = "setuptools";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "hackercowboy";
+    repo = "python-${pname}";
+    rev = "V${version}";
+    sha256 = "10k61gfpnqljf3p3qxr97xq7j67a9cr4ivd9v72hdni0znrbx6ym";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "license=license" "license='MIT'"
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "testSendRadioMsgClosesConnectionOnErrorAndRetriesIfReusingConnection"
+    "testSendRadioMsgReusesConnection"
+  ];
+
+  pythonImportsCheck = [
+    "maxcube"
+    "maxcube.cube"
+  ];
+
+  meta = with lib; {
+    description = "eQ-3/ELV MAX! Cube Python API";
+    homepage = "https://github.com/hackercowboy/python-maxcube-api";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/maxminddb/default.nix b/nixpkgs/pkgs/development/python-modules/maxminddb/default.nix
new file mode 100644
index 000000000000..b5f7fb9d5db0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/maxminddb/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, libmaxminddb
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "maxminddb";
+  version = "2.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-geVOU0CL1QJlDllpzLoWeAr2WewdscRLLJl+QzCl7ZY=";
+  };
+
+  buildInputs = [
+    libmaxminddb
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "maxminddb"
+  ];
+
+  # The multiprocessing tests fail on Darwin because multiprocessing uses spawn instead of fork,
+  # resulting in an exception when it can’t pickle the `lookup` local function.
+  disabledTests = lib.optionals stdenv.isDarwin [ "multiprocessing" ];
+
+  meta = with lib; {
+    description = "Reader for the MaxMind DB format";
+    homepage = "https://github.com/maxmind/MaxMind-DB-Reader-python";
+    changelog = "https://github.com/maxmind/MaxMind-DB-Reader-python/blob/v${version}/HISTORY.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/maya/default.nix b/nixpkgs/pkgs/development/python-modules/maya/default.nix
new file mode 100644
index 000000000000..e96d66826583
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/maya/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+
+# build-system
+, setuptools
+
+# dependencies
+, dateparser
+, humanize
+, tzlocal
+, pendulum
+, snaptime
+, pytz
+
+# tests
+, freezegun
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "maya";
+  version = "0.6.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "kennethreitz";
+    repo = "maya";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-4fUyUqVQk/AcQL3xMnU1cQlF5yiD/N9NPAsUPuDTTNY=";
+  };
+
+  postPatch = ''
+    # function was made private in humanize
+    substituteInPlace maya/core.py \
+      --replace "humanize.time.abs_timedelta" "humanize.time._abs_timedelta"
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    dateparser
+    humanize
+    pendulum
+    pytz
+    snaptime
+    tzlocal
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Datetimes for Humans";
+    homepage = "https://github.com/kennethreitz/maya";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mayavi/default.nix b/nixpkgs/pkgs/development/python-modules/mayavi/default.nix
new file mode 100644
index 000000000000..a34f98cdae39
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mayavi/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, apptools
+, buildPythonPackage
+, envisage
+, fetchPypi
+, fetchpatch
+, numpy
+, packaging
+, pyface
+, pygments
+, pyqt5
+, pythonOlder
+, pythonAtLeast
+, traitsui
+, vtk
+, wrapQtAppsHook
+}:
+
+buildPythonPackage rec {
+  pname = "mayavi";
+  version = "4.8.1";
+  format = "setuptools";
+  disabled = pythonOlder "3.8" || pythonAtLeast "3.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-n0J+8spska542S02ibpr7KJMhGDicG2KHJuEKJrT/Z4=";
+  };
+
+  patches = [
+    # Adds compatibility with Python 3.11.
+    # https://github.com/enthought/mayavi/pull/1199
+    (fetchpatch {
+      name = "python311-compat.patch";
+      url = "https://github.com/enthought/mayavi/commit/50c0cbfcf97560be69c84b7c924635a558ebf92f.patch";
+      hash = "sha256-zZOT6on/f5cEjnDBrNGog/wPQh7rBkaFqrxkBYDUQu0=";
+      includes = [ "tvtk/src/*" ];
+    })
+    # Fixes an incompatible function pointer conversion error
+    # https://github.com/enthought/mayavi/pull/1266
+    (fetchpatch {
+      name = "incompatible-pointer-conversion.patch";
+      url = "https://github.com/enthought/mayavi/commit/887adc8fe2b076a368070f5b1d564745b03b1964.patch";
+      hash = "sha256-88H1NNotd4pO0Zw1oLrYk5WNuuVrmTU01HJgsTRfKlo=";
+    })
+  ];
+
+  postPatch = ''
+    # building the docs fails with the usual Qt xcb error, so skip:
+    substituteInPlace setup.py \
+      --replace "build.build.run(self)" "build.build.run(self); return"
+  '';
+
+  nativeBuildInputs = [
+    wrapQtAppsHook
+  ];
+
+  propagatedBuildInputs = [
+    apptools
+    envisage
+    numpy
+    packaging
+    pyface
+    pygments
+    pyqt5
+    traitsui
+    vtk
+  ];
+
+  env.NIX_CFLAGS_COMPILE = "-Wno-error";
+
+  # Needs X server
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "mayavi"
+  ];
+
+  preFixup = ''
+    makeWrapperArgs+=("''${qtWrapperArgs[@]}")
+  '';
+
+  meta = with lib; {
+    description = "3D visualization of scientific data in Python";
+    homepage = "https://github.com/enthought/mayavi";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ knedlsepp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mbddns/default.nix b/nixpkgs/pkgs/development/python-modules/mbddns/default.nix
new file mode 100644
index 000000000000..05137b56b004
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mbddns/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mbddns";
+  version = "0.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "thinkl33t";
+    repo = "mb-ddns";
+    rev = version;
+    sha256 = "13xzkprqk1v0zlzx4a0n9zzpnlb1g2h6pc62ms66fj72lsmjynj7";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "mbddns" ];
+
+  meta = with lib; {
+    description = "Mythic Beasts Dynamic DNS updater";
+    homepage = "https://github.com/thinkl33t/mb-ddns";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mbstrdecoder/default.nix b/nixpkgs/pkgs/development/python-modules/mbstrdecoder/default.nix
new file mode 100644
index 000000000000..550c69ba006c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mbstrdecoder/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, chardet
+, pytestCheckHook
+, faker
+}:
+
+buildPythonPackage rec {
+  pname = "mbstrdecoder";
+  version = "1.1.3";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "thombashi";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-GcAxXcCYC2XAE8xu/jdDxjPxkLJzbmvWZ3OgmcvQcmk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    chardet
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  checkInputs = [
+    faker
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/thombashi/mbstrdecoder";
+    description = "A library for decoding multi-byte character strings";
+    maintainers = with maintainers; [ genericnerdyusername ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mccabe/default.nix b/nixpkgs/pkgs/development/python-modules/mccabe/default.nix
new file mode 100644
index 000000000000..2a7d2d396f37
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mccabe/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, hypothesis
+, hypothesmith
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "mccabe";
+  version = "0.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NI4CQMM7YLvfTlIxku+RnyjLLD19XHeU90AJKQ8jYyU=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  # https://github.com/PyCQA/mccabe/issues/93
+  doCheck = false;
+
+  meta = with lib; {
+    description = "McCabe checker, plugin for flake8";
+    homepage = "https://github.com/flintwork/mccabe";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mcstatus/default.nix b/nixpkgs/pkgs/development/python-modules/mcstatus/default.nix
new file mode 100644
index 000000000000..cff34c84442d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mcstatus/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, asyncio-dgram
+, buildPythonPackage
+, dnspython
+, fetchFromGitHub
+, poetry-core
+, poetry-dynamic-versioning
+, pytest-asyncio
+, pytest-rerunfailures
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mcstatus";
+  version = "11.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "py-mine";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-1jPIsFEJ17kjtCBiX4IvSf2FxYw9DkH3MrrJ85N71tc=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=mcstatus --cov-append --cov-branch --cov-report=term-missing -vvv --no-cov-on-fail" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+    poetry-dynamic-versioning
+  ];
+
+  propagatedBuildInputs = [
+    asyncio-dgram
+    dnspython
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-rerunfailures
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mcstatus"
+  ];
+
+  disabledTests = [
+    # DNS features are limited in the sandbox
+    "test_query"
+    "test_query_retry"
+  ];
+
+  meta = with lib; {
+    description = "Python library for checking the status of Minecraft servers";
+    homepage = "https://github.com/py-mine/mcstatus";
+    changelog = "https://github.com/py-mine/mcstatus/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mcuuid/default.nix b/nixpkgs/pkgs/development/python-modules/mcuuid/default.nix
new file mode 100644
index 000000000000..39236f792be7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mcuuid/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "mcuuid";
+  version = "1.1.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "clerie";
+    repo = "mcuuid";
+    rev = "refs/tags/${version}";
+    hash = "sha256-YwM7CdZVXpUXKXUzFL3AtoDhekLDIvZ/q8taLsHihNk=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # upstream code does not provide tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "mcuuid"
+  ];
+
+  meta = with lib; {
+    description = "Getting Minecraft player information from Mojang API";
+    homepage = "https://github.com/clerie/mcuuid";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ clerie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/md-toc/default.nix b/nixpkgs/pkgs/development/python-modules/md-toc/default.nix
new file mode 100644
index 000000000000..18aeac19b3ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/md-toc/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fpyutils
+, pyfakefs
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "md-toc";
+  version = "8.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "frnmst";
+    repo = pname;
+    rev = version;
+    hash = "sha256-fL3JlZWTEEinYILNeHw0cuvVza27atLLxjrBZkVLRiU=";
+  };
+
+  propagatedBuildInputs = [
+    fpyutils
+  ];
+
+  nativeCheckInputs = [
+    pyfakefs
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "md_toc/tests/*.py"
+  ];
+
+  pythonImportsCheck = [
+    "md_toc"
+  ];
+
+  meta = with lib; {
+    description = "Table of contents generator for Markdown";
+    homepage = "https://docs.franco.net.eu.org/md-toc/";
+    changelog = "https://blog.franco.net.eu.org/software/CHANGELOG-md-toc.html";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/md2gemini/default.nix b/nixpkgs/pkgs/development/python-modules/md2gemini/default.nix
new file mode 100644
index 000000000000..c0b6eec7f838
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/md2gemini/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, mistune, cjkwrap, wcwidth
+, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "md2gemini";
+  version = "1.9.1";
+
+  propagatedBuildInputs = [ mistune cjkwrap wcwidth ];
+  nativeCheckInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [ "md2gemini" ];
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XreDqqzH3UQ+RIBOrvHpaBb7PXcPPptjQx5cjpI+VzQ=";
+  };
+
+  meta = with lib; {
+    description = "Markdown to Gemini text format conversion library";
+    homepage = "https://github.com/makeworld-the-better-one/md2gemini";
+    license = licenses.lgpl3Plus;
+    maintainers = [ maintainers.kaction ];
+    broken = versionAtLeast mistune.version "3";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mdformat-admon/default.nix b/nixpkgs/pkgs/development/python-modules/mdformat-admon/default.nix
new file mode 100644
index 000000000000..a7fd0f940373
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdformat-admon/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mdformat
+, python3
+, pythonOlder
+}:
+
+let
+  python = python3.override {
+    packageOverrides = self: super: {
+      mdit-py-plugins = super.mdit-py-plugins.overridePythonAttrs (_prev: rec {
+      version = "0.4.0";
+      doCheck = false;
+      src = fetchFromGitHub {
+        owner = "executablebooks";
+        repo = "mdit-py-plugins";
+        rev = "refs/tags/v${version}";
+        hash = "sha256-YBJu0vIOD747DrJLcqiZMHq34+gHdXeGLCw1OxxzIJ0=";
+      };
+    });
+    };
+  };
+in python.pkgs.buildPythonPackage rec {
+  pname = "mdformat-admon";
+  version = "1.0.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "KyleKing";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-33Q3Re/axnoOHZ9XYA32mmK+efsSelJXW8sD7C1M/jU=";
+  };
+
+  nativeBuildInputs = with python.pkgs; [
+    flit-core
+  ];
+
+  buildInputs = with python.pkgs; [
+    mdformat
+  ];
+
+  propagatedBuildInputs = with python.pkgs; [
+    mdit-py-plugins
+  ];
+
+  meta = with lib; {
+    description = "mdformat plugin for admonitions";
+    homepage = "https://github.com/KyleKing/mdformat-admon";
+    license = licenses.mit;
+    maintainers = with maintainers; [ aldoborrero ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mdformat-beautysh/default.nix b/nixpkgs/pkgs/development/python-modules/mdformat-beautysh/default.nix
new file mode 100644
index 000000000000..a117fea936eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdformat-beautysh/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, beautysh
+, buildPythonPackage
+, fetchFromGitHub
+, mdformat
+, mdformat-gfm
+, mdit-py-plugins
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mdformat-beautysh";
+  version = "0.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "hukkin";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-mH9PN6QsPmnIzh/0vxa+5mYLzANUHRruXC0ql4h8myw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  buildInputs = [
+    mdformat
+    mdformat-gfm
+    mdit-py-plugins
+  ];
+
+  propagatedBuildInputs = [
+    beautysh
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mdformat_beautysh"
+  ];
+
+  meta = with lib; {
+    description = "Mdformat plugin to beautify Bash scripts";
+    homepage = "https://github.com/hukkin/mdformat-beautysh";
+    license = licenses.mit;
+    maintainers = with maintainers; [ aldoborrero ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mdformat-footnote/default.nix b/nixpkgs/pkgs/development/python-modules/mdformat-footnote/default.nix
new file mode 100644
index 000000000000..4d7b56f0c2fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdformat-footnote/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, linkify-it-py
+, markdown-it-py
+, mdformat
+, mdit-py-plugins
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mdformat-footnote";
+  version = "0.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "executablebooks";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-DUCBWcmB5i6/HkqxjlU3aTRO7i0n2sj+e/doKB8ffeo=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  buildInputs = [
+    mdformat
+    mdit-py-plugins
+  ];
+
+  pythonImportsCheck = [
+    "mdformat_footnote"
+  ];
+
+  meta = with lib; {
+    description = "Footnote format addition for mdformat";
+    homepage = "https://github.com/executablebooks/mdformat-footnote";
+    license = licenses.mit;
+    maintainers = with maintainers; [ aldoborrero ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mdformat-frontmatter/default.nix b/nixpkgs/pkgs/development/python-modules/mdformat-frontmatter/default.nix
new file mode 100644
index 000000000000..333cb5651130
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdformat-frontmatter/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, linkify-it-py
+, markdown-it-py
+, mdformat
+, mdit-py-plugins
+, ruamel-yaml
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mdformat-frontmatter";
+  version = "2.0.8";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "butler54";
+    repo = "mdformat-frontmatter";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-2heQw8LL/ILY36oItBeQq33qjVBGT51qGG4CcCEDutA=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  buildInputs = [
+    mdformat
+    mdit-py-plugins
+  ];
+
+  propagatedBuildInputs = [
+    ruamel-yaml
+  ];
+
+  pythonImportsCheck = [
+    "mdformat_frontmatter"
+  ];
+
+  meta = with lib; {
+    description = "mdformat plugin to ensure frontmatter is respected";
+    homepage = "https://github.com/butler54/mdformat-frontmatter";
+    changelog = "https://github.com/butler54/mdformat-frontmatter/blob/v{version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ aldoborrero polarmutex ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mdformat-gfm/default.nix b/nixpkgs/pkgs/development/python-modules/mdformat-gfm/default.nix
new file mode 100644
index 000000000000..de5a1d2ac68b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdformat-gfm/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, linkify-it-py
+, markdown-it-py
+, mdformat
+, mdformat-tables
+, mdit-py-plugins
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mdformat-gfm";
+  version = "0.3.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "hukkin";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-7sIa50jCN+M36Y0C05QaAL+TVwLzKxJ0gzpZI1YQFxg=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  buildInputs = [
+    mdformat
+    markdown-it-py
+    mdit-py-plugins
+  ];
+
+  propagatedBuildInputs = [
+    mdformat-tables
+    linkify-it-py
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_default_style__api"
+    "test_default_style__cli"
+  ];
+
+  pythonImportsCheck = [
+    "mdformat_gfm"
+  ];
+
+  meta = with lib; {
+    description = "Mdformat plugin for GitHub Flavored Markdown compatibility";
+    homepage = "https://github.com/hukkin/mdformat-gfm";
+    license = licenses.mit;
+    maintainers = with maintainers; [ aldoborrero polarmutex ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mdformat-mkdocs/default.nix b/nixpkgs/pkgs/development/python-modules/mdformat-mkdocs/default.nix
new file mode 100644
index 000000000000..9052c67be207
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdformat-mkdocs/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, mdformat
+, mdformat-gfm
+, mdit-py-plugins
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mdformat-mkdocs";
+  version = "1.1.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "KyleKing";
+    repo = "mdformat-mkdocs";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-5MCsXCkYnoLEZZoj9WrO/Z3VzTKagoOrMCuTpA4dGAQ=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  buildInputs = [
+    mdformat
+    mdformat-gfm
+    mdit-py-plugins
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mdformat_mkdocs"
+  ];
+
+  meta = with lib; {
+    description = "mdformat plugin for MkDocs";
+    homepage = "https://github.com/KyleKing/mdformat-mkdocs";
+    changelog = "https://github.com/KyleKing/mdformat-mkdocs/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ aldoborrero ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mdformat-nix-alejandra/default.nix b/nixpkgs/pkgs/development/python-modules/mdformat-nix-alejandra/default.nix
new file mode 100644
index 000000000000..6323312072ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdformat-nix-alejandra/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mdformat
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mdformat-nix-alejandra";
+  version = "0.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aldoborrero";
+    repo = pname;
+    rev = "${version}";
+    hash = "sha256-jUXApGsxCA+pRm4m4ZiHWlxmVkqCPx3A46oQdtyKz5g=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  buildInputs = [
+    mdformat
+  ];
+
+  pythonImportsCheck = [
+    "mdformat_nix_alejandra"
+  ];
+
+  meta = with lib; {
+    description = "Mdformat plugin format Nix code blocks with alejandra";
+    homepage = "https://github.com/aldoborrero/mdformat-nix-alejandra";
+    license = licenses.mit;
+    maintainers = with maintainers; [ aldoborrero ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mdformat-simple-breaks/default.nix b/nixpkgs/pkgs/development/python-modules/mdformat-simple-breaks/default.nix
new file mode 100644
index 000000000000..c5bbeeb46de9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdformat-simple-breaks/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, mdformat
+, mdit-py-plugins
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mdformat-simple-breaks";
+  version = "0.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "csala";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-4lJHB4r9lI2uGJ/BmFFc92sumTRKBBwiRmGBdQkzfd0=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  buildInputs = [
+    mdformat
+  ];
+
+  pythonImportsCheck = [
+    "mdformat_simple_breaks"
+  ];
+
+  meta = with lib; {
+    description = "mdformat plugin to render thematic breaks using three dashes";
+    homepage = "https://github.com/csala/mdformat-simple-breaks";
+    license = licenses.mit;
+    maintainers = with maintainers; [ aldoborrero ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mdformat-tables/default.nix b/nixpkgs/pkgs/development/python-modules/mdformat-tables/default.nix
new file mode 100644
index 000000000000..018371ada82f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdformat-tables/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, mdformat
+, mdit-py-plugins
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mdformat-tables";
+  version = "0.4.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "executablebooks";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Q61GmaRxjxJh9GjyR8QCZOH0njFUtAWihZ9lFQJ2nQQ=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  buildInputs = [
+    mdformat
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mdformat_tables"
+  ];
+
+  meta = with lib; {
+    description = "An mdformat plugin for rendering tables";
+    homepage = "https://github.com/executablebooks/mdformat-tables";
+    license = licenses.mit;
+    maintainers = with maintainers; [ aldoborrero polarmutex ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mdformat-toc/default.nix b/nixpkgs/pkgs/development/python-modules/mdformat-toc/default.nix
new file mode 100644
index 000000000000..56d7ce69a0d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdformat-toc/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mdformat
+, mdit-py-plugins
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mdformat-toc";
+  version = "0.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "hukkin";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-3EX6kGez408tEYiR9VSvi3GTrb4ds+HJwpFflv77nkg=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  buildInputs = [
+    mdformat
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mdformat_toc"
+  ];
+
+  meta = with lib; {
+    description = "Mdformat plugin to generate a table of contents";
+    homepage = "https://github.com/hukkin/mdformat-toc";
+    license = licenses.mit;
+    maintainers = with maintainers; [ aldoborrero polarmutex ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mdformat/default.nix b/nixpkgs/pkgs/development/python-modules/mdformat/default.nix
new file mode 100644
index 000000000000..a25a632f5150
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdformat/default.nix
@@ -0,0 +1,103 @@
+{ lib
+, buildPythonApplication
+, buildPythonPackage
+, fetchFromGitHub
+, importlib-metadata
+, makeWrapper
+, markdown-it-py
+, poetry-core
+, pytestCheckHook
+, python3
+, pythonOlder
+, setuptools
+, tomli
+, typing-extensions
+}:
+
+let
+  withPlugins = plugins: buildPythonApplication {
+    pname = "${package.pname}";
+    inherit (package) version;
+    format = "other";
+
+    disabled = pythonOlder "3.7";
+
+    dontUnpack = true;
+    dontBuild = true;
+    doCheck = false;
+
+    nativeBuildInputs = [
+      makeWrapper
+    ];
+
+    installPhase = ''
+      makeWrapper ${package}/bin/mdformat $out/bin/mdformat \
+        --prefix PYTHONPATH : "${package}/${python3.sitePackages}:$PYTHONPATH"
+      ln -sfv ${package}/lib $out/lib
+    '';
+
+    propagatedBuildInputs = package.propagatedBuildInputs ++ plugins;
+
+    passthru = package.passthru // {
+      withPlugins = morePlugins: withPlugins (morePlugins ++ plugins);
+    };
+
+    meta.mainProgram = "mdformat";
+  };
+
+  package = buildPythonPackage rec {
+    pname = "mdformat";
+    version = "0.7.17";
+    format = "pyproject";
+
+    disabled = pythonOlder "3.7";
+
+    src = fetchFromGitHub {
+      owner = "executablebooks";
+      repo = pname;
+      rev = "refs/tags/${version}";
+      hash = "sha256-umtfbhN6sDR/rFr1LwmJ21Ph9bK1Qq43bmMVzGCPD5s=";
+    };
+
+    nativeBuildInputs = [
+      poetry-core
+      setuptools
+    ];
+
+    propagatedBuildInputs = [
+      markdown-it-py
+      tomli
+    ] ++ lib.optionals (pythonOlder "3.10") [
+      importlib-metadata
+    ] ++ lib.optionals (pythonOlder "3.7") [
+      typing-extensions
+    ];
+
+    nativeCheckInputs = [
+      pytestCheckHook
+    ];
+
+    disabledTests = [
+      # AssertionError
+      "test_no_codeblock_trailing_newline"
+      # Issue with upper/lower case
+      "default_style.md-options0"
+    ];
+
+    pythonImportsCheck = [
+      "mdformat"
+    ];
+
+    passthru = { inherit withPlugins; };
+
+    meta = with lib; {
+      description = "CommonMark compliant Markdown formatter";
+      homepage = "https://mdformat.rtfd.io/";
+      changelog = "https://github.com/executablebooks/mdformat/blob/${version}/docs/users/changelog.md";
+      license = with licenses; [ mit ];
+      maintainers = with maintainers; [ fab aldoborrero ];
+      mainProgram = "mdformat";
+    };
+  };
+in
+package
diff --git a/nixpkgs/pkgs/development/python-modules/mdit-py-plugins/default.nix b/nixpkgs/pkgs/development/python-modules/mdit-py-plugins/default.nix
new file mode 100644
index 000000000000..ad3e8580f11d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdit-py-plugins/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, flit-core
+, markdown-it-py
+, pytest-regressions
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mdit-py-plugins";
+  version = "0.4.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "executablebooks";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-YBJu0vIOD747DrJLcqiZMHq34+gHdXeGLCw1OxxzIJ0=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    markdown-it-py
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-regressions
+  ];
+
+  pythonImportsCheck = [
+    "mdit_py_plugins"
+  ];
+
+  meta = with lib; {
+    description = "Collection of core plugins for markdown-it-py";
+    homepage = "https://github.com/executablebooks/mdit-py-plugins";
+    changelog = "https://github.com/executablebooks/mdit-py-plugins/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ AluisioASG ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mdp/default.nix b/nixpkgs/pkgs/development/python-modules/mdp/default.nix
new file mode 100644
index 000000000000..40f57408703f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdp/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, future
+, joblib
+, numpy
+, pytest
+, pythonOlder
+, scikit-learn
+}:
+
+buildPythonPackage rec {
+  pname = "mdp";
+  version = "3.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "MDP";
+    inherit version;
+    hash = "sha256-rFKmUsy67RhX/xIJhi8Dv5sG0JOxJgb7QQeH2jqmWg4=";
+  };
+
+  postPatch = ''
+    # https://github.com/mdp-toolkit/mdp-toolkit/issues/92
+    substituteInPlace mdp/utils/routines.py \
+      --replace numx.typeDict numx.sctypeDict
+    substituteInPlace mdp/test/test_NormalizingRecursiveExpansionNode.py \
+      --replace py.test"" "pytest"
+    substituteInPlace mdp/test/test_RecursiveExpansionNode.py \
+      --replace py.test"" "pytest"
+  '';
+
+  propagatedBuildInputs = [
+    future
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    joblib
+    pytest
+    scikit-learn
+  ];
+
+  pythonImportsCheck = [
+    "mdp"
+    "bimdp"
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    pytest --seed 7710873 mdp
+    pytest --seed 7710873 bimdp
+
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Library for building complex data processing software by combining widely used machine learning algorithms";
+    homepage = "https://mdp-toolkit.github.io/";
+    changelog = "https://github.com/mdp-toolkit/mdp-toolkit/blob/MDP-${version}/CHANGES";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ nico202 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mdtraj/default.nix b/nixpkgs/pkgs/development/python-modules/mdtraj/default.nix
new file mode 100644
index 000000000000..ad20cdbf0671
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdtraj/default.nix
@@ -0,0 +1,102 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, llvmPackages
+, zlib
+, cython
+, oldest-supported-numpy
+, setuptools
+, wheel
+, astunparse
+, numpy
+, pyparsing
+, scipy
+, gsd
+, networkx
+, pandas
+, pytest-xdist
+, pytestCheckHook
+, tables
+}:
+
+buildPythonPackage rec {
+  pname = "mdtraj";
+  version = "1.9.9";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "mdtraj";
+    repo = "mdtraj";
+    rev = "refs/tags/${version}";
+    hash = "sha256-2Jg6DyVJlRBLD/6hMtcsrAdxKF5RkpUuhAQm/lqVGeE=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "gsd_3-compatibility.patch";
+      url = "https://github.com/mdtraj/mdtraj/commit/81209d00817ab07cfc4668bf5ec88088d16904c0.patch";
+      hash = "sha256-ttNmij7csxF0Z5wPPwhGumRX055W2IgFjRAe6nI6GNY=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    cython
+    oldest-supported-numpy
+    setuptools
+    wheel
+  ];
+
+  buildInputs = [
+    zlib
+  ] ++ lib.optionals stdenv.cc.isClang [
+    llvmPackages.openmp
+  ];
+
+  propagatedBuildInputs = [
+    astunparse
+    numpy
+    pyparsing
+    scipy
+  ];
+
+  env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.cc.isClang "-Wno-incompatible-function-pointer-types";
+
+  nativeCheckInputs = [
+    gsd
+    networkx
+    pandas
+    pytest-xdist
+    pytestCheckHook
+    tables
+  ];
+
+  preCheck = ''
+    cd tests
+    export PATH=$out/bin:$PATH
+  '';
+
+  disabledTests = [
+    # require network access
+    "test_pdb_from_url"
+    "test_1vii_url_and_gz"
+
+    # fail due to data race
+    "test_read_atomindices_1"
+    "test_read_atomindices_2"
+
+    # flaky test
+    "test_distances_t"
+  ];
+
+  pythonImportsCheck = [ "mdtraj" ];
+
+  meta = with lib; {
+    description = "An open library for the analysis of molecular dynamics trajectories";
+    homepage = "https://github.com/mdtraj/mdtraj";
+    changelog = "https://github.com/mdtraj/mdtraj/releases/tag/${src.rev}";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mdurl/default.nix b/nixpkgs/pkgs/development/python-modules/mdurl/default.nix
new file mode 100644
index 000000000000..4c3bde1d2dd4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdurl/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mdurl";
+  version = "0.1.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "hukkin";
+    repo = pname;
+    rev = version;
+    hash = "sha256-wxV8DKeTwKpFTUBuGTQXaVHc0eW1//Y+2V8Kgs85TDM=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mdurl"
+  ];
+
+  meta = with lib; {
+    description = "URL utilities for markdown-it";
+    homepage = "https://github.com/hukkin/mdurl";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mdutils/default.nix b/nixpkgs/pkgs/development/python-modules/mdutils/default.nix
new file mode 100644
index 000000000000..53589394c4aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdutils/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mdutils";
+  version = "1.6.0";
+
+  src = fetchFromGitHub {
+    owner = "didix21";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-xF6z63CjL/qSBQsm/fSTQhwpg9yJU4qrY06cjn1PbCk=";
+  };
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  pythonImportsCheck = [ "mdutils" ];
+
+  meta = with lib; {
+    description = "Set of basic tools that can help to create Markdown files";
+    longDescription = ''
+      This Python package contains a set of basic tools that can help to create
+      a Markdown file while running a Python code. Thus, if you are executing a
+      Python code and you save the result in a text file, Why not format it? So
+      using files such as Markdown can give a great look to those results. In
+      this way, mdutils will make things easy for creating Markdown files.
+    '';
+    homepage = "https://github.com/didix21/mdutils";
+    changelog = "https://github.com/didix21/mdutils/releases/tag/${src.rev}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ azahi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mdx-truly-sane-lists/default.nix b/nixpkgs/pkgs/development/python-modules/mdx-truly-sane-lists/default.nix
new file mode 100644
index 000000000000..823d1e26efef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mdx-truly-sane-lists/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, markdown
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "mdx_truly_sane_lists";
+  version = "1.3";
+
+  src = fetchFromGitHub {
+    owner = "radude";
+    repo = "mdx_truly_sane_lists";
+    rev = "refs/tags/${version}";
+    hash = "sha256-hPnqF1UA4peW8hzeFiMlsBPfodC1qJXETGoq2yUm7d4=";
+  };
+
+  propagatedBuildInputs = [ markdown ];
+
+  pythonImportsCheck = [ "mdx_truly_sane_lists" ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} mdx_truly_sane_lists/tests.py
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Extension for Python-Markdown that makes lists truly sane.";
+    longDescription = ''
+      Features custom indents for nested lists and fix for messy linebreaks and
+      paragraphs between lists.
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ kaction ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/measurement/default.nix b/nixpkgs/pkgs/development/python-modules/measurement/default.nix
new file mode 100644
index 000000000000..3323e8c198ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/measurement/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, isPy3k
+, flit-core
+, flit-scm
+, sympy
+, pytestCheckHook
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "measurement";
+  version = "3.2.2";
+  format = "pyproject";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "coddingtonbear";
+    repo = "python-measurement";
+    rev = "refs/tags/${version}";
+    hash = "sha256-ULId0W10FaAtSgVY5ctQL3FPETVr+oq6TKWd/W53viM=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+    flit-scm
+    sphinx
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov=measurement" ""
+  '';
+
+  propagatedBuildInputs = [
+    sympy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Use and manipulate unit-aware measurement objects in Python";
+    homepage = "https://github.com/coddingtonbear/python-measurement";
+    changelog = "https://github.com/coddingtonbear/python-measurement/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bhipple ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/meater-python/default.nix b/nixpkgs/pkgs/development/python-modules/meater-python/default.nix
new file mode 100644
index 000000000000..219af570dfe8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meater-python/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "meater-python";
+  version = "0.0.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-86XJmKOc2MCyU9v0UAZsPCUL/kAXywOlQOIHaykNF1o=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "meater"
+  ];
+
+  meta = with lib; {
+    description = "Library for the Apption Labs Meater cooking probe";
+    homepage = "https://github.com/Sotolotl/meater-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mecab-python3/default.nix b/nixpkgs/pkgs/development/python-modules/mecab-python3/default.nix
new file mode 100644
index 000000000000..e347aa107d7c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mecab-python3/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mecab
+, swig
+, setuptools-scm
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mecab-python3";
+  version = "1.0.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-cJiLqyY2lkVvddPYkQx1rqR3qdCAVK1++FvlRw3T9ls=";
+  };
+
+  nativeBuildInputs = [
+    mecab # for mecab-config
+    swig
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    mecab
+  ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "MeCab"
+  ];
+
+  meta = with lib; {
+    description = "A python wrapper for mecab: Morphological Analysis engine";
+    homepage =  "https://github.com/SamuraiT/mecab-python3";
+    changelog = "https://github.com/SamuraiT/mecab-python3/releases/tag/v${version}";
+    license = with licenses; [ gpl2 lgpl21 bsd3 ]; # any of the three
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mechanicalsoup/default.nix b/nixpkgs/pkgs/development/python-modules/mechanicalsoup/default.nix
new file mode 100644
index 000000000000..93b61a40972d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mechanicalsoup/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, fetchFromGitHub
+, lxml
+, pytest-httpbin
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "mechanicalsoup";
+  version = "1.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "MechanicalSoup";
+    repo = "MechanicalSoup";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-iZ2nwBxikf0cTTlxzcGvHJim4N6ZEqIhlK7t1WAYdms=";
+  };
+
+  postPatch = ''
+    # Is in setup_requires but not used in setup.py
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'" ""
+    substituteInPlace setup.cfg \
+      --replace " --cov --cov-config .coveragerc --flake8" ""
+  '';
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    lxml
+    requests
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytest-httpbin
+    pytest-mock
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pythonImportsCheck = [
+    "mechanicalsoup"
+  ];
+
+  meta = with lib; {
+    description = "Python library for automating interaction with websites";
+    homepage = "https://github.com/hickford/MechanicalSoup";
+    changelog = "https://github.com/MechanicalSoup/MechanicalSoup/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jgillich fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mechanize/default.nix b/nixpkgs/pkgs/development/python-modules/mechanize/default.nix
new file mode 100644
index 000000000000..0f89f3f42525
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mechanize/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, html5lib
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "mechanize";
+  version = "0.4.9";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-aaXtsJYvkh6LEINzaMIkLYrQSfC5H/aZzn9gG/xDFSE=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    html5lib
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mechanize"
+  ];
+
+  disabledTestPaths = [
+    # Tests require network access
+    "test/test_urllib2_localnet.py"
+    "test/test_functional.py"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_pickling"
+    "test_password_manager"
+  ];
+
+  meta = with lib; {
+    description = "Stateful programmatic web browsing in Python";
+    homepage = "https://github.com/python-mechanize/mechanize";
+    changelog = "https://github.com/python-mechanize/mechanize/blob/v${version}/ChangeLog";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mediafile/default.nix b/nixpkgs/pkgs/development/python-modules/mediafile/default.nix
new file mode 100644
index 000000000000..00a657800da8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mediafile/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, mutagen
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "mediafile";
+  version = "0.10.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "beetbox";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-2h17FA0GTY4R+WhZiQtPFYf6gH7XLbI3aOB/nUXFtJI=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    mutagen
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mediafile"
+  ];
+
+  meta = with lib; {
+    description = "Python interface to the metadata tags for many audio file formats";
+    homepage = "https://github.com/beetbox/mediafile";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lovesegfault ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mediapy/default.nix b/nixpkgs/pkgs/development/python-modules/mediapy/default.nix
new file mode 100644
index 000000000000..2c58382a4779
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mediapy/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, flit-core
+, ipython
+, matplotlib
+, numpy
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "mediapy";
+  version = "1.1.9";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WUOxtE0NfXi0fpdasZTqixPhVV2+Refatvf6dgCb0Z8=";
+  };
+
+  nativeBuildInputs = [ flit-core ];
+
+  propagatedBuildInputs = [ ipython matplotlib numpy pillow ];
+
+
+  pythonImportsCheck = [ "mediapy" ];
+
+  meta = with lib; {
+    description = "Read/write/show images and videos in an IPython notebook";
+    homepage = "https://github.com/google/mediapy";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ mcwitt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/meeko/default.nix b/nixpkgs/pkgs/development/python-modules/meeko/default.nix
new file mode 100644
index 000000000000..14162af458fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meeko/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, numpy
+, pytestCheckHook
+, pythonOlder
+, rdkit
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "meeko";
+  version = "0.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "forlilab";
+    repo = "Meeko";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-pngFu6M63W26P7wd6FUNLuf0NikxtRtVR/pnR5PR6Wo=";
+  };
+
+  patches = [
+    # https://github.com/forlilab/Meeko/issues/60
+    (fetchpatch {
+      name = "fix-unknown-sidechains.patch";
+      url = "https://github.com/forlilab/Meeko/commit/28c9fbfe3b778aa1bd5e8d7e4f3e6edf44633a0c.patch";
+      hash = "sha256-EJbLnbKTTOsTxKtLiU7Af07yjfY63ungGUHbGvrm0AU=";
+    })
+    (fetchpatch {
+      name = "add-test-data.patch";
+      url = "https://github.com/forlilab/Meeko/commit/57b52e3afffb82685cdd1ef1bf6820d55924b97a.patch";
+      hash = "sha256-nLnyIjT68iaY3lAEbH9EJ5jZflhxABBwDqw8kaRKf3k=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    # setup.py only requires numpy but others are needed at runtime
+    numpy
+    rdkit
+    scipy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "meeko"
+  ];
+
+  meta = {
+    description = "Python package for preparing small molecule for docking";
+    homepage = "https://github.com/forlilab/Meeko";
+    changelog = "https://github.com/forlilab/Meeko/releases/tag/${src.rev}";
+    license = lib.licenses.lgpl21Only;
+    maintainers = with lib.maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/meep/default.nix b/nixpkgs/pkgs/development/python-modules/meep/default.nix
new file mode 100644
index 000000000000..1e0dbb166839
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meep/default.nix
@@ -0,0 +1,150 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, autoreconfHook
+, pkg-config
+, mpiCheckPhaseHook
+, gfortran
+, mpi
+, blas
+, lapack
+, fftw
+, hdf5-mpi
+, swig
+, gsl
+, harminv
+, libctl
+, libGDSII
+, openssh
+, guile
+, python
+, numpy
+, scipy
+, matplotlib
+, h5py-mpi
+, cython
+, autograd
+, mpi4py
+}:
+
+assert !blas.isILP64;
+assert !lapack.isILP64;
+
+buildPythonPackage rec {
+  pname = "meep";
+  version = "1.27.0";
+
+  src = fetchFromGitHub {
+    owner = "NanoComp";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-9ha6YPlvq2HUTuEqngFOAJUqCahBi7L7O8qsIMMfbrY=";
+  };
+
+  format = "other";
+
+  # MPI is needed in nativeBuildInputs too, otherwise MPI libs will be missing
+  # at runtime
+  nativeBuildInputs = [
+    autoreconfHook
+    gfortran
+    pkg-config
+    swig
+    mpi
+  ];
+
+  buildInputs = [
+    gsl
+    blas
+    lapack
+    fftw
+    hdf5-mpi
+    harminv
+    libctl
+    libGDSII
+    guile
+    gsl
+  ];
+
+  propagatedBuildInputs = [
+    mpi
+    numpy
+    scipy
+    matplotlib
+    h5py-mpi
+    cython
+    autograd
+    mpi4py
+  ];
+
+  propagatedUserEnvPkgs = [ mpi ];
+
+  dontUseSetuptoolsBuild = true;
+  dontUsePipInstall = true;
+  dontUseSetuptoolsCheck = true;
+
+  enableParallelBuilding = true;
+
+  preConfigure = ''
+    export HDF5_MPI=ON
+    export PYTHON=${python}/bin/${python.executable};
+  '';
+
+  configureFlags = [
+    "--without-libctl"
+    "--enable-shared"
+    "--with-mpi"
+    "--with-openmp"
+    "--enable-maintainer-mode"
+  ];
+
+  passthru = { inherit mpi; };
+
+  /*
+  This test is taken from the MEEP tutorial "Fields in a Waveguide" at
+  <https://meep.readthedocs.io/en/latest/Python_Tutorials/Basics/>.
+  It is important, that the test actually performs a calculation
+  (calls `sim.run()`), as only then MPI will be initialised and MPI linking
+  errors can be caught.
+  */
+  doCheck = true;
+  nativeCheckInputs = [ mpiCheckPhaseHook openssh ];
+  checkPhase = ''
+    runHook preCheck
+
+    export PYTHONPATH="$out/lib/${python.libPrefix}/site-packages:$PYTHONPATH"
+
+    # Generate a python test script
+    cat > test.py << EOF
+    import meep as mp
+    cell = mp.Vector3(16,8,0)
+    geometry = [mp.Block(mp.Vector3(mp.inf,1,mp.inf),
+                     center=mp.Vector3(),
+                     material=mp.Medium(epsilon=12))]
+    sources = [mp.Source(mp.ContinuousSource(frequency=0.15),
+                     component=mp.Ez,
+                     center=mp.Vector3(-7,0))]
+    pml_layers = [mp.PML(1.0)]
+    resolution = 10
+    sim = mp.Simulation(cell_size=cell,
+                    boundary_layers=pml_layers,
+                    geometry=geometry,
+                    sources=sources,
+                    resolution=resolution)
+    sim.run(until=200)
+    EOF
+
+    ${mpi}/bin/mpiexec -np 2 python3 test.py
+
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Free finite-difference time-domain (FDTD) software for electromagnetic simulations";
+    homepage = "https://meep.readthedocs.io/en/latest/";
+    license = licenses.gpl2Only;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ sheepforce markuskowa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/meilisearch/default.nix b/nixpkgs/pkgs/development/python-modules/meilisearch/default.nix
new file mode 100644
index 000000000000..cb40f3194198
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meilisearch/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, camel-converter
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "meilisearch";
+  version = "0.28.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "meilisearch";
+    repo = "meilisearch-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ASrm21dW1lCiUZJReJYlot2sp9sO1HuGaWVZXDOC9i4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    camel-converter
+    requests
+  ] ++ camel-converter.optional-dependencies.pydantic;
+
+  pythonImportsCheck = [
+    "meilisearch"
+  ];
+
+  # Tests spin up a local server and are not mocking the requests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Client for the Meilisearch API";
+    homepage = "https://github.com/meilisearch/meilisearch-python";
+    changelog = "https://github.com/meilisearch/meilisearch-python/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/meinheld/default.nix b/nixpkgs/pkgs/development/python-modules/meinheld/default.nix
new file mode 100644
index 000000000000..c33aae4d20c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meinheld/default.nix
@@ -0,0 +1,32 @@
+{ lib, fetchPypi, buildPythonPackage, greenlet }:
+
+buildPythonPackage rec {
+  pname = "meinheld";
+  version = "1.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "008c76937ac2117cc69e032dc69cea9f85fc605de9bac1417f447c41c16a56d6";
+  };
+
+  patchPhase = ''
+    # Allow greenlet-1.0.0.
+    # See https://github.com/mopemope/meinheld/pull/123
+    substituteInPlace setup.py --replace "greenlet>=0.4.5,<0.5" "greenlet>=0.4.5"
+  '';
+
+  propagatedBuildInputs = [ greenlet ];
+
+  # No tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "meinheld"
+  ];
+
+  meta = with lib; {
+    description = "High performance asynchronous Python WSGI Web Server";
+    homepage = "https://meinheld.org/";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/meld3/default.nix b/nixpkgs/pkgs/development/python-modules/meld3/default.nix
new file mode 100644
index 000000000000..a751dbeac3fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meld3/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "meld3";
+  version = "2.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3ea266994f1aa83507679a67b493b852c232a7905e29440a6b868558cad5e775";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "An HTML/XML templating engine used by supervisor";
+    homepage = "https://github.com/supervisor/meld3";
+    license = licenses.free;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/memestra/default.nix b/nixpkgs/pkgs/development/python-modules/memestra/default.nix
new file mode 100644
index 000000000000..3bcae8336a89
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/memestra/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, beniget
+, frilouz
+, gast
+, nbconvert
+, nbformat
+, pythonOlder
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "memestra";
+  version = "0.2.1";
+
+  disabled = pythonOlder "3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6shwf9BoDfZMy0itP8esNP4ov6fw6LJpO3Y5ZahwDZw=";
+  };
+
+  propagatedBuildInputs = [
+    gast
+    beniget
+    frilouz
+    nbconvert
+    nbformat
+    pyyaml
+  ];
+
+  # Tests are not detected and so the checkPhase fails
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "memestra"
+  ];
+
+  meta = with lib; {
+    description = "A linter that tracks reference to deprecated functions.";
+    homepage = "https://github.com/QuantStack/memestra";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/memory-allocator/default.nix b/nixpkgs/pkgs/development/python-modules/memory-allocator/default.nix
new file mode 100644
index 000000000000..b42544963a19
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/memory-allocator/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, cython
+}:
+
+buildPythonPackage rec {
+  pname = "memory-allocator";
+  version = "0.1.3";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "memory_allocator";
+    hash = "sha256-E4BcKuHAG3SJ+rXo6sk2FmK08sAkEuNlLuzkj/aVMWI=";
+  };
+
+  propagatedBuildInputs = [ cython ];
+
+  pythonImportsCheck = [ "memory_allocator" ];
+
+  meta = with lib; {
+    description = "An extension class to allocate memory easily with cython";
+    homepage = "https://github.com/sagemath/memory_allocator/";
+    maintainers = teams.sage.members;
+    license = licenses.lgpl3Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/memory-profiler/default.nix b/nixpkgs/pkgs/development/python-modules/memory-profiler/default.nix
new file mode 100644
index 000000000000..218772a1527e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/memory-profiler/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, python
+, fetchPypi
+}:
+
+python.pkgs.buildPythonPackage rec {
+  pname = "memory-profiler";
+  version = "0.61.0";
+
+  src = fetchPypi {
+    pname = "memory_profiler";
+    inherit version;
+    sha256 = "sha256-Tltz14ZKHRKS+3agPoKj5475NNBoKKaY2dradtogZ7A=";
+  };
+
+  propagatedBuildInputs = with python.pkgs; [
+    psutil # needed to profile child processes
+    matplotlib # needed for plotting memory usage
+  ];
+
+  meta = with lib; {
+    description = "A module for monitoring memory usage of a process";
+    longDescription = ''
+      This is a python module for monitoring memory consumption of a process as
+      well as line-by-line analysis of memory consumption for python programs.
+    '';
+    homepage = "https://pypi.python.org/pypi/memory_profiler";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/meraki/default.nix b/nixpkgs/pkgs/development/python-modules/meraki/default.nix
new file mode 100644
index 000000000000..0720a290cb9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meraki/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "meraki";
+  version = "1.39.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-B3+2KnRXWkB83Sy/NH9kJwgSha9L17tx37fFwBjT3Mw=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    requests
+  ];
+
+  # All tests require an API key
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "meraki"
+  ];
+
+  meta = with lib; {
+    description = "Provides all current Meraki dashboard API calls to interface with the Cisco Meraki cloud-managed platform";
+    homepage = "https://github.com/meraki/dashboard-api-python";
+    changelog = "https://github.com/meraki/dashboard-api-python/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dylanmtaylor ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mercadopago/default.nix b/nixpkgs/pkgs/development/python-modules/mercadopago/default.nix
new file mode 100644
index 000000000000..dc71fc326667
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mercadopago/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "mercadopago";
+  version = "2.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mercadopago";
+    repo = "sdk-python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-ABxYGYUBOzeOSE0yK8jym+ldinDUCTpqO165OWhszgs=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # require internet
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "mercadopago"
+  ];
+
+  meta = with lib; {
+    description = "This library provides developers with a simple set of bindings to help you integrate Mercado Pago API to a website and start receiving payments.";
+    homepage = "https://www.mercadopago.com";
+    changelog = "https://github.com/mercadopago/sdk-python/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ derdennisop ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mercantile/default.nix b/nixpkgs/pkgs/development/python-modules/mercantile/default.nix
new file mode 100644
index 000000000000..b79bac0633d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mercantile/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, click
+, pytestCheckHook
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "mercantile";
+  version = "1.2.1";
+
+  src = fetchFromGitHub {
+    owner = "mapbox";
+    repo = pname;
+    rev = version;
+    hash = "sha256-DiDXO2XnD3We6NhP81z7aIHzHrHDi/nkqy98OT9986w=";
+  };
+
+  propagatedBuildInputs = [ click ];
+
+  nativeCheckInputs = [ pytestCheckHook hypothesis ];
+
+  meta = with lib; {
+    description = "Spherical mercator tile and coordinate utilities";
+    homepage = "https://github.com/mapbox/mercantile";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ sikmir ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/merge3/default.nix b/nixpkgs/pkgs/development/python-modules/merge3/default.nix
new file mode 100644
index 000000000000..e06556dddf35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/merge3/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "merge3";
+  version = "0.0.14";
+
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-MEBumThvSmUoD7nEPmgYkPoqHYOcrCdZ0VbHzBYDAVk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  pythonImportsCheck = [
+    "merge3"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of 3-way merge";
+    homepage = "https://github.com/breezy-team/merge3";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mergedb/default.nix b/nixpkgs/pkgs/development/python-modules/mergedb/default.nix
new file mode 100644
index 000000000000..3c78026632ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mergedb/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, colorama
+, fetchPypi
+, jinja2
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "mergedb";
+  version = "0.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2034c18dca23456c5b166b63d94300bcd8ec9f386e6cd639c2f66e141c0313f9";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    pyyaml
+    colorama
+    jinja2
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mergedb"
+  ];
+
+  meta = with lib; {
+    description = "A tool/library for deep merging YAML files";
+    homepage = "https://github.com/graysonhead/mergedb";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ graysonhead ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/mergedeep/default.nix b/nixpkgs/pkgs/development/python-modules/mergedeep/default.nix
new file mode 100644
index 000000000000..8b348120c235
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mergedeep/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, isPy27, fetchFromGitHub, pytest }:
+
+buildPythonPackage rec {
+  pname = "mergedeep";
+  version = "1.3.4";
+  disabled = isPy27;
+
+  # PyPI tarball doesn't include tests directory
+  src = fetchFromGitHub {
+    owner = "clarketm";
+    repo = "mergedeep";
+    rev = "v${version}";
+    sha256 = "1msvvdzk33sxzgyvs4fs8dlsrsi7fjj038z83s0yw5h8m8d78469";
+  };
+
+  nativeCheckInputs = [ pytest ];
+  checkPhase = "pytest";
+  pythonImportsCheck = [ "mergedeep" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/clarketm/mergedeep";
+    description = "A deep merge function for python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ris ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mergedict/default.nix b/nixpkgs/pkgs/development/python-modules/mergedict/default.nix
new file mode 100644
index 000000000000..32b91aea2e89
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mergedict/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mergedict";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-4ZkrNqVCKQFPvLx6nIwo0fSuEx6h2NNFyTlz+fDcb9w=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "mergedict" ];
+
+  meta = with lib; {
+    description = "A Python dict with a merge() method";
+    homepage = "https://github.com/schettino72/mergedict";
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/merkletools/default.nix b/nixpkgs/pkgs/development/python-modules/merkletools/default.nix
new file mode 100644
index 000000000000..b5dc5adf3dcc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/merkletools/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "merkletools";
+  version = "1.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Tierion";
+    repo = "pymerkletools";
+    rev = "refs/tags/${version}";
+    hash = "sha256-pd7Wxi7Sk95RcrFOTOtl725nIXidva3ftdKSGxHYPTA=";
+  };
+
+  postPatch = ''
+    # pysha3 is deprecated and not needed for Python > 3.6
+    substituteInPlace setup.py \
+      --replace "install_requires=install_requires" "install_requires=[],"
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "merkletools"
+  ];
+
+  meta = with lib; {
+    description = "Python tools for creating Merkle trees, generating Merkle proofs, and verification of Merkle proofs";
+    homepage = "https://github.com/Tierion/pymerkletools";
+    changelog = "https://github.com/Tierion/pymerkletools/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Madouura ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/meross-iot/default.nix b/nixpkgs/pkgs/development/python-modules/meross-iot/default.nix
new file mode 100644
index 000000000000..7947ca1f6021
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meross-iot/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, paho-mqtt
+, pytestCheckHook
+, pythonOlder
+, requests
+, retrying
+}:
+
+buildPythonPackage rec {
+  pname = "meross-iot";
+  version = "0.4.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "albertogeniola";
+    repo = "MerossIot";
+    rev = "refs/tags/${version}";
+    hash = "sha256-8DnzTwW4fQQIGAHZJbu2aKkqOUU6a6IGgif5tIZCing=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    paho-mqtt
+    requests
+    retrying
+  ];
+
+  # Test require network access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "meross_iot"
+  ];
+
+  meta = with lib; {
+    description = "Python library to interact with Meross devices";
+    homepage = "https://github.com/albertogeniola/MerossIot";
+    changelog = "https://github.com/albertogeniola/MerossIot/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mesa/default.nix b/nixpkgs/pkgs/development/python-modules/mesa/default.nix
new file mode 100644
index 000000000000..fe4e8dd598d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mesa/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, cookiecutter
+, networkx
+, pandas
+, tornado
+, tqdm
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mesa";
+  version = "2.1.1";
+  format = "setuptools";
+
+  # According to their docs, this library is for Python 3+.
+  disabled = isPy27;
+
+  src = fetchPypi {
+    pname = "Mesa";
+    inherit version;
+    hash = "sha256-1wyXndB7xQy1jnfHsIqMQgsvmGYUhjDuSBB2M0GcXC4=";
+  };
+
+  propagatedBuildInputs = [
+    cookiecutter
+    networkx
+    pandas
+    tornado
+    tqdm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_examples"
+    "test_run"
+    "test_scaffold_creates_project_dir"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/projectmesa/mesa";
+    description = "An agent-based modeling (or ABM) framework in Python";
+    license = licenses.asl20;
+    maintainers = [ maintainers.dpaetzel ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/meshcat/default.nix b/nixpkgs/pkgs/development/python-modules/meshcat/default.nix
new file mode 100644
index 000000000000..932d9a2390a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meshcat/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ipython
+, u-msgpack-python
+, numpy
+, tornado
+, pyzmq
+, pyngrok
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "meshcat";
+  version = "0.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-LP4XzeT+hdByo94Bip2r9WJvgMJV//LOY7JqSNJIStk=";
+  };
+
+  postPatch = ''
+    sed -i '/PYTHONPATH/d' src/meshcat/servers/zmqserver.py
+  '';
+
+  propagatedBuildInputs = [
+    ipython
+    u-msgpack-python
+    numpy
+    tornado
+    pyzmq
+    pyngrok
+    pillow
+  ];
+
+  pythonImportsCheck = [ "meshcat" ];
+
+  # requires a running MeshCat viewer
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/rdeits/meshcat-python";
+    description = "WebGL-based 3D visualizer for Python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ wegank ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/meshio/default.nix b/nixpkgs/pkgs/development/python-modules/meshio/default.nix
new file mode 100644
index 000000000000..2d86a55bd246
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meshio/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, netcdf4
+, h5py
+, exdown
+, pytestCheckHook
+, rich
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "meshio";
+  version = "5.3.4";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-4kBpLX/yecErE8bl17QDYpqGrStE6SMJWLPwDB7DafA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    netcdf4
+    h5py
+    rich
+  ];
+
+  nativeCheckInputs = [
+    exdown
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = ["meshio"];
+
+  meta = with lib; {
+    homepage = "https://github.com/nschloe/meshio";
+    description = "I/O for mesh files.";
+    license = licenses.mit;
+    maintainers = with maintainers; [ wd15 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/meshlabxml/default.nix b/nixpkgs/pkgs/development/python-modules/meshlabxml/default.nix
new file mode 100644
index 000000000000..e0793f3ec978
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meshlabxml/default.nix
@@ -0,0 +1,28 @@
+{
+  buildPythonPackage,
+  fetchPypi,
+  lib,
+}:
+
+buildPythonPackage rec {
+  pname = "MeshLabXML";
+  version = "2018.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1villmg46hqby5jjkkpxr5bxydr72y5b3cbfngwpyxxdljn091w8";
+  };
+
+  propagatedBuildInputs = [ ];
+
+  doCheck = false; # Upstream not currently have any tests.
+
+  pythonImportsCheck = [ "meshlabxml" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/3DLIRIOUS/MeshLabXML";
+    description = "Create and run MeshLab XML scripts with Python";
+    license = licenses.lgpl21;
+    maintainers = with maintainers; [ nh2 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/meshtastic/default.nix b/nixpkgs/pkgs/development/python-modules/meshtastic/default.nix
new file mode 100644
index 000000000000..8bfb65056f16
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meshtastic/default.nix
@@ -0,0 +1,123 @@
+{ lib
+, buildPythonPackage
+, dotmap
+, fetchFromGitHub
+, pexpect
+, protobuf
+, pygatt
+, pypubsub
+, pyqrcode
+, pyserial
+, pytap2
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, requests
+, setuptools
+, tabulate
+, timeago
+}:
+
+buildPythonPackage rec {
+  pname = "meshtastic";
+  version = "2.2.12";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "meshtastic";
+    repo = "Meshtastic-python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-W//mDKtTWjcKT43n82OU3h4yKrNZMAVzLzQCjsmkJP0=";
+  };
+
+  propagatedBuildInputs = [
+    dotmap
+    pexpect
+    protobuf
+    pygatt
+    pypubsub
+    pyqrcode
+    pyserial
+    pyyaml
+    setuptools
+    requests
+    tabulate
+    timeago
+  ];
+
+  passthru.optional-dependencies = {
+    tunnel = [
+      pytap2
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytap2
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export PATH="$PATH:$out/bin";
+  '';
+
+  pythonImportsCheck = [
+    "meshtastic"
+  ];
+
+  disabledTests = [
+    # AttributeError: 'HardwareMessage'...
+    "test_handleFromRadio_with_my_info"
+    "test_handleFromRadio_with_node_info"
+    "test_main_ch_longsfast_on_non_primary_channel"
+    "test_main_ch_set_name_with_ch_index"
+    "test_main_configure_with_camel_case_keys"
+    "test_main_configure_with_snake_case"
+    "test_main_export_config_called_from_main"
+    "test_main_export_config_use_camel"
+    "test_main_export_config"
+    "test_main_get_with_invalid"
+    "test_main_get_with_valid_values_camel"
+    "test_main_getPref_invalid_field_camel"
+    "test_main_getPref_invalid_field"
+    "test_main_getPref_valid_field_bool_camel"
+    "test_main_getPref_valid_field_bool"
+    "test_main_getPref_valid_field_camel"
+    "test_main_getPref_valid_field_string_camel"
+    "test_main_getPref_valid_field_string"
+    "test_main_getPref_valid_field"
+    "test_main_set_invalid_wifi_passwd"
+    "test_main_set_valid_camel_case"
+    "test_main_set_valid_wifi_passwd"
+    "test_main_set_valid"
+    "test_main_set_with_invalid"
+    "test_main_setPref_ignore_incoming_0"
+    "test_main_setPref_ignore_incoming_123"
+    "test_main_setPref_invalid_field_camel"
+    "test_main_setPref_invalid_field"
+    "test_main_setPref_valid_field_int_as_string"
+    "test_readGPIOs"
+    "test_onGPIOreceive"
+    "test_setURL_empty_url"
+    "test_watchGPIOs"
+    "test_writeConfig_with_no_radioConfig"
+    "test_writeGPIOs"
+    "test_reboot"
+    "test_shutdown"
+    "test_main_sendtext"
+    "test_main_sendtext_with_channel"
+    "test_MeshInterface"
+    "test_getNode_not_local"
+    "test_getNode_not_local_timeout"
+    "test_main_onConnected_exception"
+  ];
+
+  meta = with lib; {
+    description = "Python API for talking to Meshtastic devices";
+    homepage = "https://github.com/meshtastic/Meshtastic-python";
+    changelog = "https://github.com/meshtastic/python/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/meson-python/add-build-flags.sh b/nixpkgs/pkgs/development/python-modules/meson-python/add-build-flags.sh
new file mode 100644
index 000000000000..d9327960eb1d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meson-python/add-build-flags.sh
@@ -0,0 +1,10 @@
+mesonPythonBuildFlagsHook() {
+  # Add all of mesonFlags to -Csetup-args for pypa builds
+  for f in $mesonFlags; do
+    pypaBuildFlags+=" -Csetup-args=$f"
+    # This requires pip>23.0.1, see: https://meson-python.readthedocs.io/en/latest/how-to-guides/config-settings.html
+    pipBuildFlags+=" --config-settings=setup-args=$f"
+  done
+}
+
+postConfigureHooks+=(mesonPythonBuildFlagsHook)
diff --git a/nixpkgs/pkgs/development/python-modules/meson-python/default.nix b/nixpkgs/pkgs/development/python-modules/meson-python/default.nix
new file mode 100644
index 000000000000..84031db71b80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meson-python/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, colorama
+, meson
+, ninja
+, pyproject-metadata
+, tomli
+, typing-extensions
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "meson-python";
+  version = "0.14.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "meson_python";
+    hash = "sha256-uWhmaQMmVE3+RSWDdTrD9DMTIn6f2UFnAajfkK8hIjQ=";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pyproject-metadata
+    tomli
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    typing-extensions
+  ];
+
+  propagatedBuildInputs = [
+    meson
+    ninja
+    pyproject-metadata
+    tomli
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    typing-extensions
+  ];
+  setupHooks = [
+    ./add-build-flags.sh
+  ];
+
+  meta = {
+    changelog = "https://github.com/mesonbuild/meson-python/blob/${version}/CHANGELOG.rst";
+    description = "Meson Python build backend (PEP 517)";
+    homepage = "https://github.com/mesonbuild/meson-python";
+    license = [ lib.licenses.mit ];
+    maintainers = [ lib.maintainers.fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mesonpep517/default.nix b/nixpkgs/pkgs/development/python-modules/mesonpep517/default.nix
new file mode 100644
index 000000000000..58ddc57bfe7e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mesonpep517/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, meson
+, ninja
+, setuptools
+, toml
+, wheel
+}:
+
+# TODO: offer meson as a Python package so we have dist-info folder.
+
+buildPythonPackage rec {
+  pname = "mesonpep517";
+  version = "0.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Fyo7JfLqHJqbahEjVDt/0xJxOfVLqLn3xNJ4lSB7KIw=";
+  };
+
+  # Applies the following merge request, which doesn't apply cleanly:
+  # https://gitlab.com/thiblahute/mesonpep517/-/merge_requests/25
+  #
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'backend-path = "."' 'backend-path = ["."]'
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [ toml ];
+
+  propagatedNativeBuildInputs = [ meson ninja ];
+
+  meta = {
+    description = "Create pep517 compliant packages from the meson build system";
+    homepage = "https://gitlab.com/thiblahute/mesonpep517";
+    license = lib.licenses.asl20;
+    maintainers = [ lib.maintainers.fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/messagebird/default.nix b/nixpkgs/pkgs/development/python-modules/messagebird/default.nix
new file mode 100644
index 000000000000..4365e4462374
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/messagebird/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, pyjwt
+, mock
+, python-dateutil
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "messagebird";
+  version = "2.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "messagebird";
+    repo = "python-rest-api";
+    rev = version;
+    hash = "sha256-2KVAxdHT5+Ie3ZRxXZhU0hLOtHWjIiJi+ferkYTlSn0=";
+  };
+
+  propagatedBuildInputs = [
+    pyjwt
+    python-dateutil
+    requests
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "messagebird"
+  ];
+
+  disabledTestPaths = [
+    # ValueError: not enough values to unpack (expected 6, got 0)
+    "tests/test_request_validator.py"
+  ];
+
+  meta = with lib; {
+    description = "Client for MessageBird's REST API";
+    homepage = "https://github.com/messagebird/python-rest-api";
+    license = with licenses; [ bsd2 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/metakernel/default.nix b/nixpkgs/pkgs/development/python-modules/metakernel/default.nix
new file mode 100644
index 000000000000..3c8396bef797
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/metakernel/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hatchling
+, ipykernel
+, jedi
+, jupyter-core
+, pexpect
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "metakernel";
+  version = "0.30.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-TKBvuGh8DnPDLaOpwOvLZHdj1kBOTE/JLda1nQ6J//U=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    ipykernel
+    jedi
+    jupyter-core
+    pexpect
+  ];
+
+  # Tests hang, so disable
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "metakernel"
+  ];
+
+  meta = with lib; {
+    description = "Jupyter/IPython Kernel Tools";
+    homepage = "https://github.com/Calysto/metakernel";
+    changelog = "https://github.com/Calysto/metakernel/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ thomasjm ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/metar/default.nix b/nixpkgs/pkgs/development/python-modules/metar/default.nix
new file mode 100644
index 000000000000..b130672810ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/metar/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "metar";
+  version = "1.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "python-metar";
+    repo = "python-metar";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ZDjlXcSTUcSP7oRdhzLpXf/fLUA7Nkc6nj2I6vovbHg=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "metar"
+  ];
+
+  meta = with lib; {
+    description = "Python parser for coded METAR weather reports";
+    homepage = "https://github.com/python-metar/python-metar";
+    changelog = "https://github.com/python-metar/python-metar/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ bsd1 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/metawear/default.nix b/nixpkgs/pkgs/development/python-modules/metawear/default.nix
new file mode 100644
index 000000000000..96f8c9434500
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/metawear/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, gcc
+, cython
+, boost
+, bluez
+, nlohmann_json
+, pyserial
+, requests
+, warble
+}:
+
+buildPythonPackage rec {
+  pname = "metawear";
+  version = "1.0.8";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gNEI6P6GslNd1DzFwCFndVIfUvSTPYollGdqkZhQ4Y8=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  buildInputs = [
+    boost
+    bluez
+    nlohmann_json
+  ];
+
+  postPatch = ''
+    # remove vendored nlohmann_json
+    rm MetaWear-SDK-Cpp/src/metawear/dfu/cpp/json.hpp
+    substituteInPlace MetaWear-SDK-Cpp/src/metawear/dfu/cpp/file_operations.cpp \
+        --replace '#include "json.hpp"' '#include <nlohmann/json.hpp>'
+  '';
+
+  propagatedBuildInputs = [
+    pyserial
+    requests
+    warble
+  ];
+
+  enableParallelBuilding = true;
+
+  pythonImportsCheck = [ "mbientlab" "mbientlab.metawear" ];
+
+  meta = with lib; {
+    description = "Python bindings for the MetaWear C++ SDK by MbientLab";
+    homepage = "https://github.com/mbientlab/metawear-sdk-python";
+    license = with licenses; [ unfree ];
+    maintainers = with maintainers; [ stepbrobd ];
+    platforms = platforms.linux;
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/meteoalertapi/default.nix b/nixpkgs/pkgs/development/python-modules/meteoalertapi/default.nix
new file mode 100644
index 000000000000..87a3b2b8fdf0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meteoalertapi/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, requests
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "meteoalertapi";
+  version = "0.3.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rolfberkenbosch";
+    repo = "meteoalert-api";
+    rev = "v${version}";
+    hash = "sha256-uB2nza9fj7vOWixL4WEQX1N3i2Y80zQPM3x1+gRtg+w=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    xmltodict
+  ];
+
+  # Tests require network access
+  doCheck = false;
+
+  pythonImportsCheck = [ "meteoalertapi" ];
+
+  meta = with lib; {
+    description = "Python wrapper for MeteoAlarm.org";
+    homepage = "https://github.com/rolfberkenbosch/meteoalert-api";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/meteocalc/default.nix b/nixpkgs/pkgs/development/python-modules/meteocalc/default.nix
new file mode 100644
index 000000000000..886b77de0880
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meteocalc/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "meteocalc";
+  version = "1.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "malexer";
+    repo = pname;
+    rev = version;
+    hash = "sha256-WuIW6hROQkjMfbCLUouECIrp4s6oCd2/N79hsrTbVTk=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "meteocalc"
+  ];
+
+  meta = with lib; {
+    description = "Module for calculation of meteorological variables";
+    homepage = "https://github.com/malexer/meteocalc";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/meteofrance-api/default.nix b/nixpkgs/pkgs/development/python-modules/meteofrance-api/default.nix
new file mode 100644
index 000000000000..b6fb1d51446d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/meteofrance-api/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, pytz
+, requests
+, requests-mock
+, typing-extensions
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "meteofrance-api";
+  version = "1.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "hacf-fr";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-W26R+L2ZJpycEQ9KwkHqVARKsd/5YkJCxMeciKnKAX8=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pytz
+    requests
+    typing-extensions
+    urllib3
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pythonImportsCheck = [
+    "meteofrance_api"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_currentphenomenons"
+    "test_forecast"
+    "test_full_with_coastal_bulletint"
+    "test_fulls"
+    "test_no_rain_expected"
+    "test_picture_of_the_day"
+    "test_places"
+    "test_rain"
+    "test_session"
+    "test_observation"
+    "test_workflow"
+  ];
+
+  meta = with lib; {
+    description = "Module to access information from the Meteo-France API";
+    homepage = "https://github.com/hacf-fr/meteofrance-api";
+    changelog = "https://github.com/hacf-fr/meteofrance-api/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mezzanine/default.nix b/nixpkgs/pkgs/development/python-modules/mezzanine/default.nix
new file mode 100644
index 000000000000..0b210e18d6d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mezzanine/default.nix
@@ -0,0 +1,91 @@
+{ lib
+, beautifulsoup4
+, bleach
+, buildPythonPackage
+, chardet
+, django
+, django-contrib-comments
+, fetchPypi
+, filebrowser_safe
+, future
+, grappelli-safe
+, isPyPy
+, pep8
+, pillow
+, pyflakes
+, pythonOlder
+, pytz
+, requests
+, requests-oauthlib
+, tzlocal
+}:
+
+buildPythonPackage rec {
+  pname = "mezzanine";
+  version = "6.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7" || isPyPy;
+
+  src = fetchPypi {
+    pname = "Mezzanine";
+    inherit version;
+    hash = "sha256-R/PB4PFQpVp6jnCasyPszgC294SKjLzq2oMkR2qV86s=";
+  };
+
+  buildInputs = [
+    pyflakes
+    pep8
+  ];
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    bleach
+    chardet
+    django
+    django-contrib-comments
+    filebrowser_safe
+    future
+    grappelli-safe
+    pillow
+    pytz
+    requests
+    requests-oauthlib
+    tzlocal
+  ] ++ bleach.optional-dependencies.css;
+
+  # Tests Fail Due to Syntax Warning, Fixed for v3.1.11+
+  doCheck = false;
+
+  # sed calls will be unnecessary in v3.1.11+
+  preConfigure = ''
+    sed -i 's/==/>=/' setup.py
+  '';
+
+  LC_ALL = "en_US.UTF-8";
+
+  meta = with lib; {
+    description = "Content management platform built using the Django framework";
+    longDescription = ''
+      Mezzanine is a powerful, consistent, and flexible content
+      management platform. Built using the Django framework, Mezzanine
+      provides a simple yet highly extensible architecture that
+      encourages diving in and hacking on the code. Mezzanine is BSD
+      licensed and supported by a diverse and active community.
+
+      In some ways, Mezzanine resembles tools such as Wordpress that
+      provide an intuitive interface for managing pages, blog posts,
+      form data, store products, and other types of content. But
+      Mezzanine is also different.  Unlike many other platforms that
+      make extensive use of modules or reusable applications,
+      Mezzanine provides most of its functionality by default. This
+      approach yields a more integrated and efficient platform.
+    '';
+    homepage = "http://mezzanine.jupo.org/";
+    downloadPage = "https://github.com/stephenmcd/mezzanine/releases";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ prikhi ];
+    platforms = platforms.unix;
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/mf2py/default.nix b/nixpkgs/pkgs/development/python-modules/mf2py/default.nix
new file mode 100644
index 000000000000..b39989bf322e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mf2py/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, beautifulsoup4
+, html5lib
+, requests
+, lxml
+, mock
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "mf2py";
+  version = "1.1.3";
+
+  src = fetchFromGitHub {
+    owner = "microformats";
+    repo = "mf2py";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Ya8DND1Dqbygbf1hjIGMlPwyc/MYIWIj+KnWB6Bqu1k=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    html5lib
+    requests
+  ];
+
+  nativeCheckInputs = [
+    lxml
+    mock
+    nose
+  ];
+
+  pythonImportsCheck = [ "mf2py" ];
+
+  meta = with lib; {
+    description = "Microformats2 parser written in Python";
+    homepage = "https://microformats.org/wiki/mf2py";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ambroisie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mhcflurry/default.nix b/nixpkgs/pkgs/development/python-modules/mhcflurry/default.nix
new file mode 100644
index 000000000000..2b2a7c9fcabb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mhcflurry/default.nix
@@ -0,0 +1,87 @@
+{ appdirs
+, buildPythonPackage
+, fetchFromGitHub
+, keras
+, lib
+, mhcgnomes
+, nose
+, pandas
+, pytestCheckHook
+, pyyaml
+, scikit-learn
+, tensorflow
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "mhcflurry";
+  version = "2.1.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "openvax";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-VyPHcNlZYgNJZb2UBFX55x+nE0GnHixkcsiTNjDCju0=";
+  };
+
+  # keras and tensorflow are not in the official setup.py requirements but are required for the CLI utilities to run.
+  propagatedBuildInputs = [
+    appdirs
+    keras
+    mhcgnomes
+    pandas
+    pyyaml
+    scikit-learn
+    tensorflow
+    tqdm
+  ];
+
+  nativeCheckInputs = [ nose pytestCheckHook ];
+
+  disabledTests = [
+    # RuntimeError: Missing MHCflurry downloadable file: /homeless-shelter/.local...
+    "test_a1_mage_epitope_downloaded_models"
+    "test_a1_titin_epitope_downloaded_models"
+    "test_a2_hiv_epitope_downloaded_models"
+    "test_basic"
+    "test_caching"
+    "test_class1_neural_network_a0205_training_accuracy"
+    "test_commandline_sequences"
+    "test_correlation"
+    "test_csv"
+    "test_downloaded_predictor_gives_percentile_ranks"
+    "test_downloaded_predictor_invalid_peptides"
+    "test_downloaded_predictor_is_savable"
+    "test_downloaded_predictor_is_serializable"
+    "test_downloaded_predictor_small"
+    "test_downloaded_predictor"
+    "test_fasta_50nm"
+    "test_fasta_best"
+    "test_fasta"
+    "test_merge"
+    "test_no_csv"
+    "test_on_hpv"
+    "test_run_cluster_parallelism"
+    "test_run_parallel"
+    "test_run_serial"
+    "test_speed_allele_specific"
+    "test_speed_pan_allele"
+  ];
+
+  disabledTestPaths = [
+    # RuntimeError: Missing MHCflurry downloadable file: /homeless-shelter/.local...
+    "test/test_changing_allele_representations.py"
+    "test/test_class1_affinity_predictor.py"
+    "test/test_class1_pan.py"
+  ];
+
+  pythonImportsCheck = [ "mhcflurry" ];
+
+  meta = with lib; {
+    description = "Peptide-MHC I binding affinity prediction";
+    homepage = "https://github.com/openvax/mhcflurry";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mhcgnomes/default.nix b/nixpkgs/pkgs/development/python-modules/mhcgnomes/default.nix
new file mode 100644
index 000000000000..4c5d1f6faac9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mhcgnomes/default.nix
@@ -0,0 +1,33 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, pandas
+, pyyaml
+, serializable
+}:
+
+buildPythonPackage rec {
+  pname = "mhcgnomes";
+  version = "1.8.6";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "pirl-unc";
+    repo = pname;
+    # See https://github.com/pirl-unc/mhcgnomes/issues/20. As of 2023-07-13,
+    # they do no have version tags.
+    rev = "c7e779b60e35a031f6e0f0ea6ae70e8a8e7671c6";
+    hash = "sha256-KKiBlnFlavRnaQnOpAzG0dyxmFB+zF9L6t/H05LkFZE=";
+  };
+
+  propagatedBuildInputs = [ pandas pyyaml serializable ];
+
+  pythonImportsCheck = [ "mhcgnomes" ];
+
+  meta = with lib; {
+    description = "Parsing MHC nomenclature in the wild";
+    homepage = "https://github.com/pirl-unc/mhcgnomes";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/miauth/default.nix b/nixpkgs/pkgs/development/python-modules/miauth/default.nix
new file mode 100644
index 000000000000..380fe8e23e1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/miauth/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, wheel
+, bluepy
+, pythonOlder
+, cryptography
+}:
+
+buildPythonPackage rec {
+  pname = "miauth";
+  version = "0.9.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "dnandha";
+    repo = "miauth";
+    # Release is not tagged properly, https://github.com/dnandha/miauth/issues/15
+    # rev = "refs/tags/${version}";
+    rev = "refs/tags/release";
+    hash = "sha256-+aoY0Eyd9y7xQTA3uSC6YIZisViilsHlFaOXmhPMcBY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    bluepy
+    cryptography
+  ];
+
+  pythonImportsCheck = [
+    "miauth"
+  ];
+
+  meta = with lib; {
+    description = "Authenticate and interact with Xiaomi devices over BLE";
+    homepage = "https://github.com/dnandha/miauth";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/micawber/default.nix b/nixpkgs/pkgs/development/python-modules/micawber/default.nix
new file mode 100644
index 000000000000..0a4decb49e4d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/micawber/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, beautifulsoup4
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "micawber";
+  version = "0.5.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-CsWBS2X/KngfsTlLkaI6ipX3NJK2u49wW67q2C6t1UM=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+  ];
+
+  meta = with lib; {
+    homepage = "https://micawber.readthedocs.io/en/latest/";
+    description = "Module for extracting rich content from URLs";
+    license = licenses.mit;
+    longDescription = ''
+      micawber supplies a few methods for retrieving rich metadata
+      about a variety of links, such as links to youtube videos.
+      micawber also provides functions for parsing blocks of text and html
+      and replacing links to videos with rich embedded content.
+    '';
+    maintainers = with maintainers; [ davidak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/micloud/default.nix b/nixpkgs/pkgs/development/python-modules/micloud/default.nix
new file mode 100644
index 000000000000..1cd2c43ea9e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/micloud/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, click
+, pycryptodome
+, requests
+, tzlocal
+}:
+
+buildPythonPackage rec {
+  pname = "micloud";
+  version = "0.6";
+
+  src = fetchFromGitHub {
+    owner = "Squachen";
+    repo = "micloud";
+    rev = "v_${version}";
+    hash = "sha256-IsNXFs1N+rKwqve2Pjp+wRTZCxHF4acEo6KyhsSKuqI=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    pycryptodome
+    requests
+    tzlocal
+  ];
+
+  # tests require credentials
+  doCheck = false;
+
+  pythonImportsCheck = [ "micloud" ];
+
+  meta = with lib; {
+    description = "Xiaomi cloud connect library";
+    homepage = "https://github.com/Squachen/micloud";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/microdata/default.nix b/nixpkgs/pkgs/development/python-modules/microdata/default.nix
new file mode 100644
index 000000000000..d271637d2c5a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/microdata/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, html5lib
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "microdata";
+  version = "0.8.0";
+
+  src = fetchFromGitHub {
+    owner = "edsu";
+    repo = "microdata";
+    rev = "v${version}";
+    hash = "sha256-BAygCLBLxZ033ZWRFSR52dSM2nPY8jXplDXQ8WW3KPo=";
+  };
+
+  propagatedBuildInputs = [
+    html5lib
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [ "microdata" ];
+
+  meta = with lib; {
+    description = "Library for extracting html microdata";
+    homepage = "https://github.com/edsu/microdata";
+    license = licenses.cc0;
+    maintainers = with maintainers; [ ambroisie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/midiutil/default.nix b/nixpkgs/pkgs/development/python-modules/midiutil/default.nix
new file mode 100644
index 000000000000..a3527bc6e1cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/midiutil/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "MIDIUtil";
+  version = "1.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "02m9sqv36zrzgz5zg2w9qmz8snzlm27yg3ways2hgipgs4xriykr";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/MarkCWirt/MIDIUtil";
+    description = "A pure python library for creating multi-track MIDI files";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mido/default.nix b/nixpkgs/pkgs/development/python-modules/mido/default.nix
new file mode 100644
index 000000000000..84fe78a59475
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mido/default.nix
@@ -0,0 +1,53 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, substituteAll
+, portmidi
+, python-rtmidi
+, pytestCheckHook
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "mido";
+  version = "1.3.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-hCguOs40vKP5hCINstvLmCRc/q+4VCYMAuAAdQ3Khqo=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./libportmidi-cdll.patch;
+      libportmidi = "${portmidi.out}/lib/libportmidi${stdenv.hostPlatform.extensions.sharedLibrary}";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    python-rtmidi
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mido"
+  ];
+
+  meta = with lib; {
+    description = "MIDI Objects for Python";
+    homepage = "https://mido.readthedocs.io";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mido/libportmidi-cdll.patch b/nixpkgs/pkgs/development/python-modules/mido/libportmidi-cdll.patch
new file mode 100644
index 000000000000..455064f12b9a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mido/libportmidi-cdll.patch
@@ -0,0 +1,19 @@
+diff --git a/mido/backends/portmidi_init.py b/mido/backends/portmidi_init.py
+index 84bb128..5efcdaa 100644
+--- a/mido/backends/portmidi_init.py
++++ b/mido/backends/portmidi_init.py
+@@ -10,13 +10,7 @@ from ctypes import (CDLL, CFUNCTYPE, POINTER, Structure, c_char_p,
+                     create_string_buffer, byref)
+ import ctypes.util
+ 
+-dll_name = ''
+-if sys.platform == 'darwin':
+-    dll_name = ctypes.util.find_library('libportmidi.dylib')
+-elif sys.platform in ('win32', 'cygwin'):
+-    dll_name = 'portmidi.dll'
+-else:
+-    dll_name = 'libportmidi.so'
++dll_name = '@libportmidi@'
+ 
+ lib = CDLL(dll_name)
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/migen/default.nix b/nixpkgs/pkgs/development/python-modules/migen/default.nix
new file mode 100644
index 000000000000..0bbecefff967
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/migen/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, colorama
+}:
+
+buildPythonPackage rec {
+  pname = "migen";
+  version = "unstable-2022-09-02";
+
+  src = fetchFromGitHub {
+    owner = "m-labs";
+    repo = "migen";
+    rev = "639e66f4f453438e83d86dc13491b9403bbd8ec6";
+    hash = "sha256-IPyhoFZLhY8d3jHB8jyvGdbey7V+X5eCzBZYSrJ18ec=";
+  };
+
+  propagatedBuildInputs = [
+    colorama
+  ];
+
+  pythonImportsCheck = [ "migen" ];
+
+  meta = with lib; {
+    description = " A Python toolbox for building complex digital hardware";
+    homepage = "https://m-labs.hk/migen";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ l-as ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mike/default.nix b/nixpkgs/pkgs/development/python-modules/mike/default.nix
new file mode 100644
index 000000000000..f107d8e632bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mike/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, git
+, importlib-metadata
+, importlib-resources
+, jinja2
+, mkdocs
+, pythonOlder
+, pyyaml
+, unittestCheckHook
+, verspec
+}:
+
+buildPythonPackage rec {
+  pname = "mike";
+  version = "unstable-2023-05-06";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jimporter";
+    repo = pname;
+    rev = "300593c338b18f61f604d18457c351e166318020";
+    hash = "sha256-Sjj2275IJDtLjG6uO9h4FbgxXTMgqD8c/rJj6iOxfuI=";
+  };
+
+  propagatedBuildInputs = [
+    importlib-metadata
+    importlib-resources
+    jinja2
+    mkdocs
+    pyyaml
+    verspec
+  ];
+
+  nativeCheckInputs = [
+    git
+    unittestCheckHook
+  ];
+
+  preCheck = ''
+    export PATH=$out/bin:$PATH
+  '';
+
+  # Difficult to setup
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "mike"
+  ];
+
+  meta = with lib; {
+    description = "Manage multiple versions of your MkDocs-powered documentation";
+    homepage = "https://github.com/jimporter/mike";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/milc/default.nix b/nixpkgs/pkgs/development/python-modules/milc/default.nix
new file mode 100644
index 000000000000..6db6d7492b05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/milc/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, appdirs
+, argcomplete
+, colorama
+, halo
+, nose2
+, semver
+}:
+
+buildPythonPackage rec {
+  pname = "milc";
+  version = "1.4.2";
+
+  src = fetchFromGitHub {
+    owner = "clueboard";
+    repo = "milc";
+    rev = version;
+    hash = "sha256-aX6cTpIN9+9xuEGYHVlM5SjTPLcudJFEuOI4CiN3byE=";
+  };
+
+  propagatedBuildInputs = [
+    appdirs
+    argcomplete
+    colorama
+    halo
+  ];
+
+  nativeCheckInputs = [
+    nose2
+    semver
+  ];
+
+  pythonImportsCheck = [ "milc" ];
+
+  meta = with lib; {
+    description = "An Opinionated Batteries-Included Python 3 CLI Framework";
+    homepage = "https://milc.clueboard.co";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bhipple ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/milksnake/default.nix b/nixpkgs/pkgs/development/python-modules/milksnake/default.nix
new file mode 100644
index 000000000000..6d063021697c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/milksnake/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, cffi }:
+
+buildPythonPackage rec {
+  pname = "milksnake";
+  version = "0.1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "120nprd8lqis7x7zy72536gk2j68f7gxm8gffmx8k4ygifvl7kfz";
+  };
+
+  propagatedBuildInputs = [
+   cffi
+  ];
+
+  # tests rely on pip/venv
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A python library that extends setuptools for binary extensions";
+    homepage = "https://github.com/getsentry/milksnake";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ matthiasbeyer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mill-local/default.nix b/nixpkgs/pkgs/development/python-modules/mill-local/default.nix
new file mode 100644
index 000000000000..6c24ba8f424c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mill-local/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mill-local";
+  version = "0.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "pyMillLocal";
+    rev = "refs/tags/${version}";
+    hash = "sha256-kFBzasS7/5AM/ZW5z1ncZ9Xwuy/bh2LTVXPxNTLQnV0=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "mill_local"
+  ];
+
+  meta = with lib; {
+    description = "Python module to communicate locally with Mill heaters";
+    homepage = "https://github.com/Danielhiversen/pyMillLocal";
+    changelog = "https://github.com/Danielhiversen/pyMillLocal/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/millheater/default.nix b/nixpkgs/pkgs/development/python-modules/millheater/default.nix
new file mode 100644
index 000000000000..7f2fe358c2fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/millheater/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "millheater";
+  version = "0.11.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "pymill";
+    rev = "refs/tags/${version}";
+    hash = "sha256-qd9JuZv1utwL523eiQ79P3hXuVQ8+teTatOJCtI6v00=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "mill"
+  ];
+
+  meta = with lib; {
+    description = "Python library for Mill heater devices";
+    homepage = "https://github.com/Danielhiversen/pymill";
+    changelog = "https://github.com/Danielhiversen/pymill/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mindsdb-evaluator/default.nix b/nixpkgs/pkgs/development/python-modules/mindsdb-evaluator/default.nix
new file mode 100644
index 000000000000..7e18975095b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mindsdb-evaluator/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, poetry-core
+, dataprep-ml
+, numpy
+, pandas
+, scikit-learn
+, type-infer
+}:
+
+buildPythonPackage rec {
+  pname = "mindsdb-evaluator";
+  version = "0.0.11";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  # using PyPI as git repository does not have release tags or branches
+  src = fetchPypi {
+    pname = "mindsdb_evaluator";
+    inherit version;
+    hash = "sha256-pEfY+ocLEE8qcDjf6AzJxtXo1cqD2LhcBmlLjN0llTA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    dataprep-ml
+    numpy
+    pandas
+    scikit-learn
+    type-infer
+  ];
+
+  pythonImportsCheck = [ "mindsdb_evaluator" ];
+
+  meta = with lib; {
+    description = "Model evaluation for Machine Learning pipelines";
+    homepage = "https://pypi.org/project/mindsdb-evaluator/";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/minexr/default.nix b/nixpkgs/pkgs/development/python-modules/minexr/default.nix
new file mode 100644
index 000000000000..dc5ae86b4fad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/minexr/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, numpy
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "minexr";
+  version = "1.0.1";
+
+  src = fetchFromGitHub {
+    owner = "cheind";
+    repo = "py-minexr";
+    rev = "v${version}";
+    hash = "sha256-Om67ttAHxu7C3IwPB+JHYi78E9qBi1E6layMVg4+S3M=";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  pythonImportsCheck = [ "minexr" ];
+  nativeCheckInputs = [ pytestCheckHook pillow ];
+
+  meta = with lib; {
+    description = "Minimal, standalone OpenEXR reader for single-part, uncompressed scan line files.";
+    homepage = "https://github.com/cheind/py-minexr";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lucasew ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/miniaudio/default.nix b/nixpkgs/pkgs/development/python-modules/miniaudio/default.nix
new file mode 100644
index 000000000000..973d4b40822e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/miniaudio/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, miniaudio
+, cffi
+, pytestCheckHook
+, AudioToolbox
+, CoreAudio
+}:
+
+let
+  # TODO: recheck after 1.59
+  miniaudio' = miniaudio.overrideAttrs (oldAttrs: rec {
+    version = "0.11.16"; # cffi breakage with 0.11.17
+    src = fetchFromGitHub {
+      inherit (oldAttrs.src) owner repo;
+      rev = "refs/tags/${version}";
+      hash = "sha256-POe/dYPJ25RKNGIhaLoqxm9JJ08MrTyHVN4NmaGOdwM=";
+    };
+  });
+in
+buildPythonPackage rec {
+  pname = "miniaudio";
+  version = "1.59";
+
+  disabled = pythonOlder "3.6";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "irmen";
+    repo = "pyminiaudio";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-tMQOGqEThtownW3cnNpCzWye0Uo/Es7E8abVySo1QnQ=";
+  };
+
+  postPatch = ''
+    rm -r miniaudio
+    ln -s ${miniaudio'} miniaudio
+    substituteInPlace build_ffi_module.py \
+      --replace "miniaudio/stb_vorbis.c" "miniaudio/extras/stb_vorbis.c";
+    substituteInPlace miniaudio.c \
+      --replace "miniaudio/stb_vorbis.c" "miniaudio/extras/stb_vorbis.c";
+  '';
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    AudioToolbox
+    CoreAudio
+  ];
+
+  propagatedNativeBuildInputs = [ cffi ];
+  propagatedBuildInputs = [ cffi ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "miniaudio" ];
+
+  meta = with lib; {
+    description = "Python bindings for the miniaudio library and its decoders";
+    homepage = "https://github.com/irmen/pyminiaudio";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/minichain/default.nix b/nixpkgs/pkgs/development/python-modules/minichain/default.nix
new file mode 100644
index 000000000000..1e69fbb1f25b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/minichain/default.nix
@@ -0,0 +1,73 @@
+{ buildPythonPackage
+, eliot
+, fetchPypi
+, google-search-results
+, jinja2
+, lib
+, manifest-ml
+, openai
+, pytestCheckHook
+, pythonAtLeast
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "minichain";
+  version = "0.3.3";
+  format = "setuptools";
+
+  # See https://github.com/NixOS/nixpkgs/pull/248195#issuecomment-1687398702.
+  disabled = pythonAtLeast "3.11";
+
+  # See https://github.com/srush/MiniChain/issues/23 and https://github.com/NixOS/nixpkgs/issues/248185 as to why we
+  # don't fetchFromGitHub.
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+mju1Mz/aojROpiOVzv6WoRNTrhgCub4yyYLEWcHWh0=";
+  };
+
+  # See https://github.com/srush/MiniChain/issues/24.
+  postPatch = ''
+    substituteInPlace ./minichain/__init__.py --replace "from .gradio import GradioConf, show" ""
+  '';
+
+  nativeBuildInputs = [ pythonRelaxDepsHook ];
+
+  pythonRemoveDeps = [
+    # Only used in the examples:
+    "datasets"
+    "faiss-cpu"
+    "jinja2-highlight"
+    "trio"
+
+    # Not used anywhere:
+    "eliot-tree"
+
+    # Not yet packaged in nixpkgs:
+    "gradio"
+  ];
+
+  # Some of these could be made optional. Certain packages are used by certain backends.
+  propagatedBuildInputs = [
+    eliot
+    google-search-results
+    jinja2
+    manifest-ml
+    openai
+  ];
+
+  # As of 0.3.3, the PyPI distribution does not include any tests.
+  doCheck = false;
+
+  pythonImportsCheck = [ "minichain" ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "A tiny library for coding with large language models";
+    homepage = "https://srush-minichain.hf.space";
+    changelog = "https://github.com/srush/MiniChain/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/minidb/default.nix b/nixpkgs/pkgs/development/python-modules/minidb/default.nix
new file mode 100644
index 000000000000..8bd0aea36ca4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/minidb/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "minidb";
+  version = "2.0.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "thp";
+    repo = "minidb";
+    rev = "refs/tags/${version}";
+    hash = "sha256-0f2usKoHs4NO/Ir8MhyiAVZFYnUkVH5avdh3QdHzY6s=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "minidb"
+  ];
+
+  meta = with lib; {
+    description = "SQLite3-based store for Python objects";
+    homepage = "https://thp.io/2010/minidb/";
+    license = licenses.isc;
+    maintainers = with maintainers; [ tv ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/minidump/default.nix b/nixpkgs/pkgs/development/python-modules/minidump/default.nix
new file mode 100644
index 000000000000..9168d3297b11
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/minidump/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "minidump";
+  version = "0.0.22";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-PPvvvHz3WA67Vn2P7MIY+ChkjXrCOuTgj0KXr4B2mZ0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  # Upstream doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "minidump"
+  ];
+
+  meta = with lib; {
+    description = "Python library to parse and read Microsoft minidump file format";
+    homepage = "https://github.com/skelsec/minidump";
+    changelog = "https://github.com/skelsec/minidump/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/miniful/default.nix b/nixpkgs/pkgs/development/python-modules/miniful/default.nix
new file mode 100644
index 000000000000..434e8bc403bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/miniful/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, scipy
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "miniful";
+  version = "0.0.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ZCyfNrh8gbPvwplHN5tbmbjTMYXJBKe8Mg2JqOGHFCk=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "miniful"
+  ];
+
+  meta = with lib; {
+    description = "Minimal Fuzzy Library";
+    homepage = "https://github.com/aresio/miniful";
+    license = with licenses; [ lgpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/minikanren/default.nix b/nixpkgs/pkgs/development/python-modules/minikanren/default.nix
new file mode 100644
index 000000000000..7a54b1eb97a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/minikanren/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, toolz
+, cons
+, multipledispatch
+, etuples
+, logical-unification
+, py
+, pytestCheckHook
+, pytest-html
+}:
+
+buildPythonPackage rec {
+  pname = "minikanren";
+  version = "1.0.3";
+
+  src = fetchFromGitHub {
+    owner = "pythological";
+    repo = "kanren";
+    rev = "5aa9b1734cbb3fe072a7c72b46e1b72a174d28ac";
+    hash = "sha256-daAtREgm91634Q0mc0/WZivDiyZHC7TIRoGRo8hMnGE=";
+  };
+
+  propagatedBuildInputs = [
+    toolz
+    cons
+    multipledispatch
+    etuples
+    logical-unification
+  ];
+
+  nativeCheckInputs = [
+    py
+    pytestCheckHook
+    pytest-html
+  ];
+
+  pytestFlagsArray = [
+    "--html=testing-report.html"
+    "--self-contained-html"
+  ];
+
+  pythonImportsCheck = [ "kanren" ];
+
+  meta = with lib; {
+    description = "Relational programming in Python";
+    homepage = "https://github.com/pythological/kanren";
+    changelog = "https://github.com/pythological/kanren/releases";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ Etjean ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/minikerberos/default.nix b/nixpkgs/pkgs/development/python-modules/minikerberos/default.nix
new file mode 100644
index 000000000000..5bf47f5a04ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/minikerberos/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, asn1crypto
+, asysocks
+, buildPythonPackage
+, fetchPypi
+, oscrypto
+, pythonOlder
+, six
+, tqdm
+, unicrypto
+}:
+
+buildPythonPackage rec {
+  pname = "minikerberos";
+  version = "0.4.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-9VPK15GIPcG+UcyUinevKyEoom6mNA99NKL0XWd9G/M=";
+  };
+
+  propagatedBuildInputs = [
+    asn1crypto
+    asysocks
+    oscrypto
+    six
+    tqdm
+    unicrypto
+  ];
+
+  # no tests are published: https://github.com/skelsec/minikerberos/pull/5
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "minikerberos"
+  ];
+
+  meta = with lib; {
+    description = "Kerberos manipulation library in Python";
+    homepage = "https://github.com/skelsec/minikerberos";
+    changelog = "https://github.com/skelsec/minikerberos/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/minimal-snowplow-tracker/default.nix b/nixpkgs/pkgs/development/python-modules/minimal-snowplow-tracker/default.nix
new file mode 100644
index 000000000000..a15f81014cfa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/minimal-snowplow-tracker/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "minimal-snowplow-tracker";
+  version = "0.0.2";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rKv3Vy2w5/XL9pg9SV7vVAgfcb45IzDrOq25zLOdqqQ=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    six
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "snowplow_tracker"
+  ];
+
+  meta = with lib; {
+    description = "Minimal snowplow event tracker";
+    homepage = "https://github.com/dbt-labs/snowplow-python-tracker";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ mausch tjni ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/minimock/default.nix b/nixpkgs/pkgs/development/python-modules/minimock/default.nix
new file mode 100644
index 000000000000..5bd48301e8ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/minimock/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "minimock";
+  version = "1.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "lowks";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Ut3iKc7Sr28uGgWCV3K3CS+gBta2icvbUPMjjo4fflU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "minimock"
+  ];
+
+  meta = with lib; {
+    description = "A minimalistic mocking library";
+    homepage = "https://pypi.python.org/pypi/MiniMock";
+    license = licenses.mit;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/minio/default.nix b/nixpkgs/pkgs/development/python-modules/minio/default.nix
new file mode 100644
index 000000000000..5181d8bef54e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/minio/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, certifi
+, configparser
+, faker
+, fetchFromGitHub
+, future
+, mock
+, nose
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pytz
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "minio";
+  version = "7.1.17";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "minio";
+    repo = "minio-py";
+    rev = "refs/tags/${version}";
+    hash = "sha256-I0Q1SkZ1zQ9s2HbMTc2EzUnnOti14zQBxHVJasaukug=";
+  };
+
+  propagatedBuildInputs = [
+    certifi
+    configparser
+    future
+    python-dateutil
+    pytz
+    urllib3
+  ];
+
+  nativeCheckInputs = [
+    faker
+    mock
+    nose
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # example credentials aren't present
+    "tests/unit/credentials_test.py"
+  ];
+
+  pythonImportsCheck = [
+    "minio"
+  ];
+
+  meta = with lib; {
+    description = "Simple APIs to access any Amazon S3 compatible object storage server";
+    homepage = "https://github.com/minio/minio-py";
+    changelog = "https://github.com/minio/minio-py/releases/tag/${version}";
+    maintainers = with maintainers; [ peterromfeldhk ];
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/miniupnpc/default.nix b/nixpkgs/pkgs/development/python-modules/miniupnpc/default.nix
new file mode 100644
index 000000000000..3eb92d770df0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/miniupnpc/default.nix
@@ -0,0 +1,20 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, cctools, which }:
+
+buildPythonPackage rec {
+  pname = "miniupnpc";
+  version = "2.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ca94zz7sr2x57j218aypxqcwkr23n8js30f3yrvvqbg929nr93y";
+  };
+
+  nativeBuildInputs = lib.optionals stdenv.isDarwin [ cctools which ];
+
+  meta = with lib; {
+    description = "miniUPnP client";
+    homepage = "http://miniupnp.free.fr/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mip/default.nix b/nixpkgs/pkgs/development/python-modules/mip/default.nix
new file mode 100644
index 000000000000..db2786915b56
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mip/default.nix
@@ -0,0 +1,89 @@
+{ lib, stdenv
+, buildPythonPackage
+, cffi
+, dos2unix
+, fetchPypi
+, matplotlib
+, networkx
+, numpy
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+, wheel
+, gurobi
+, gurobipy
+# Enable support for the commercial Gurobi solver (requires a license)
+, gurobiSupport ? false
+# If Gurobi has already been installed outside of the Nix store, specify its
+# installation directory here
+, gurobiHome ? null
+}:
+
+buildPythonPackage rec {
+  pname = "mip";
+  version = "1.15.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-f28Dgc/ixSwbhkAgPaLLVpdLJuI5UN37GnazfZFvGX4=";
+  };
+
+  nativeCheckInputs = [ matplotlib networkx numpy pytestCheckHook ];
+
+  nativeBuildInputs = [
+    dos2unix
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+  ] ++ lib.optionals gurobiSupport ([
+    gurobipy
+  ] ++ lib.optional (gurobiHome == null) gurobi);
+
+  # Source files have CRLF terminators, which make patch error out when supplied
+  # with diffs made on *nix machines
+  prePatch = ''
+    find . -type f -exec ${dos2unix}/bin/dos2unix {} \;
+  '';
+
+  patches = [
+    # Some tests try to be smart and dynamically construct a path to their test
+    # inputs. Unfortunately, since the test phase is run after installation,
+    # those paths point to the Nix store, which no longer contains the test
+    # data. This patch hardcodes the data path to point to the source directory.
+    ./test-data-path.patch
+  ];
+
+  postPatch = ''
+    # Allow cffi versions with a different patch level to be used
+    substituteInPlace pyproject.toml --replace "cffi==1.15.0" "cffi==1.15.*"
+  '';
+
+  # Make MIP use the Gurobi solver, if configured to do so
+  makeWrapperArgs = lib.optional gurobiSupport
+    "--set GUROBI_HOME ${if gurobiHome == null then gurobi.outPath else gurobiHome}";
+
+  # Tests that rely on Gurobi are activated only when Gurobi support is enabled
+  disabledTests = lib.optional (!gurobiSupport) "gurobi";
+
+  passthru.optional-dependencies = {
+    inherit gurobipy numpy;
+  };
+
+  meta = with lib; {
+    homepage = "https://python-mip.com/";
+    description = "A collection of Python tools for the modeling and solution of Mixed-Integer Linear programs (MIPs)";
+    downloadPage = "https://github.com/coin-or/python-mip/releases";
+    changelog = "https://github.com/coin-or/python-mip/releases/tag/${version}";
+    license = licenses.epl20;
+    broken = stdenv.isAarch64;
+    maintainers = with maintainers; [ nessdoor ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mip/test-data-path.patch b/nixpkgs/pkgs/development/python-modules/mip/test-data-path.patch
new file mode 100644
index 000000000000..d96f34254951
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mip/test-data-path.patch
@@ -0,0 +1,30 @@
+diff --git a/examples/extract_features_mip.py b/examples/extract_features_mip.py
+index cdc109f..90e79fa 100644
+--- a/examples/extract_features_mip.py
++++ b/examples/extract_features_mip.py
+@@ -9,9 +9,7 @@ import mip
+ lp_path = ""
+ 
+ #  using test data, replace with your instance
+-lp_path = mip.__file__.replace("mip/__init__.py", "test/data/1443_0-9.lp").replace(
+-    "mip\\__init__.py", "test\\data\\1443_0-9.lp"
+-)
++lp_path = "test/data/1443_0-9.lp"
+ 
+ m = Model()
+ if m.solver_name.upper() in ["GRB", "GUROBI"]:
+diff --git a/examples/gen_cuts_mip.py b/examples/gen_cuts_mip.py
+index f71edae..2799734 100644
+--- a/examples/gen_cuts_mip.py
++++ b/examples/gen_cuts_mip.py
+@@ -11,9 +11,7 @@ import mip
+ lp_path = ""
+ 
+ #  using test data
+-lp_path = mip.__file__.replace("mip/__init__.py", "test/data/1443_0-9.lp").replace(
+-    "mip\\__init__.py", "test\\data\\1443_0-9.lp"
+-)
++lp_path = "test/data/1443_0-9.lp"
+ 
+ m = Model()
+ if m.solver_name.upper() in ["GRB", "GUROBI"]:
diff --git a/nixpkgs/pkgs/development/python-modules/mir_eval/default.nix b/nixpkgs/pkgs/development/python-modules/mir_eval/default.nix
new file mode 100644
index 000000000000..eaf4a9e4f535
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mir_eval/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, future
+, six
+, numpy
+, scipy
+, matplotlib
+}:
+
+buildPythonPackage rec {
+  pname = "mir_eval";
+  version = "0.7";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-4f66pXZsZadUXCoXCyQUkPR6mJhzcLHgZ0JCTF3r5l4=";
+  };
+
+  propagatedBuildInputs = [
+    future
+    six
+    numpy
+    scipy
+    matplotlib
+  ];
+
+  pythonImportsCheck = [
+    "mir_eval"
+  ];
+
+  meta = with lib; {
+    description = "Common metrics for common audio/music processing tasks";
+    homepage = "https://github.com/craffel/mir_eval";
+    license = licenses.mit;
+    maintainers = with maintainers; [ carlthome ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mirakuru/default.nix b/nixpkgs/pkgs/development/python-modules/mirakuru/default.nix
new file mode 100644
index 000000000000..97f1cef438ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mirakuru/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, setuptools
+, psutil
+, netcat
+, ps
+, python-daemon
+}:
+
+buildPythonPackage rec {
+  pname = "mirakuru";
+  version = "2.5.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ClearcodeHQ";
+    repo = "mirakuru";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-I1TKP0ESuBMTcReZf0tryjvGpSpwzofwmOiQqhyr6Zg=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  propagatedBuildInputs = [ psutil ];
+
+  nativeCheckInputs = [
+    netcat.nc
+    ps
+    python-daemon
+    pytestCheckHook
+  ];
+  pythonImportsCheck = [ "mirakuru" ];
+
+  meta = with lib; {
+    homepage = "https://pypi.org/project/mirakuru";
+    description = "Process orchestration tool designed for functional and integration tests";
+    changelog = "https://github.com/ClearcodeHQ/mirakuru/blob/v${version}/CHANGES.rst";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/misaka/default.nix b/nixpkgs/pkgs/development/python-modules/misaka/default.nix
new file mode 100644
index 000000000000..e4c807a5bf5e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/misaka/default.nix
@@ -0,0 +1,24 @@
+{ lib, fetchPypi, buildPythonPackage, cffi }:
+buildPythonPackage rec {
+  pname = "misaka";
+  version = "2.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1mzc29wwyhyardclj1vg2xsfdibg2lzb7f1azjcxi580ama55wv2";
+  };
+
+  propagatedNativeBuildInputs = [ cffi ];
+
+  propagatedBuildInputs = [ cffi ];
+
+  # The tests require write access to $out
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A CFFI binding for Hoedown, a markdown parsing library";
+    homepage = "https://misaka.61924.nl";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fgaz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/misoc/default.nix b/nixpkgs/pkgs/development/python-modules/misoc/default.nix
new file mode 100644
index 000000000000..785043f1ae74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/misoc/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+, asyncserial
+, jinja2
+, migen
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "misoc";
+  version = "unstable-2022-10-08";
+
+  src = fetchFromGitHub {
+    owner = "m-labs";
+    repo = "misoc";
+    rev = "6a7c670ab6120b8136f652c41d907eb0fb16ed54";
+    hash = "sha256-dLDp0xg5y5b443hD7vbJFobHxbhtnj68RdZnQ7ckgp4=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+    asyncserial
+    jinja2
+    migen
+  ];
+
+  nativeCheckInputs = [
+    numpy
+  ];
+
+  pythonImportsCheck = [ "misoc" ];
+
+  meta = with lib; {
+    description = "The original high performance and small footprint system-on-chip based on Migen";
+    homepage = "https://github.com/m-labs/misoc";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ doronbehar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mistletoe/default.nix b/nixpkgs/pkgs/development/python-modules/mistletoe/default.nix
new file mode 100644
index 000000000000..c95a26eb6e04
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mistletoe/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, parameterized
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mistletoe";
+  version = "1.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-fQwas3RwR9Fp+fxLkl0cuj9cE+rwuQw2W3LkflnQCgI=";
+  };
+
+  pythonImportsCheck = [
+    "mistletoe"
+  ];
+
+  nativeCheckInputs = [
+    parameterized
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Fast and extensible Markdown parser";
+    homepage = "https://github.com/miyuchina/mistletoe";
+    changelog = "https://github.com/miyuchina/mistletoe/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ eadwu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mistune/default.nix b/nixpkgs/pkgs/development/python-modules/mistune/default.nix
new file mode 100644
index 000000000000..38e2c21ba66a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mistune/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "mistune";
+  version = "3.0.2";
+
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "lepture";
+    repo = "mistune";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-OoTiqJ7hsFP1Yx+7xW3rL+Yc/O2lCMdhBBbaZucyZXM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "mistune" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/lepture/mistune/blob/${src.rev}/docs/changes.rst";
+    description = "A sane Markdown parser with useful plugins and renderers";
+    homepage = "https://github.com/lepture/mistune";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mitmproxy-macos/default.nix b/nixpkgs/pkgs/development/python-modules/mitmproxy-macos/default.nix
new file mode 100644
index 000000000000..0ce125e691e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mitmproxy-macos/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+}:
+
+buildPythonPackage rec {
+  pname = "mitmproxy-macos";
+  version = "0.4.1";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "mitmproxy";
+    repo = "mitmproxy_rs";
+    rev = version;
+    hash = "sha256-Vc7ez/W40CefO2ZLAHot14p478pDPtQor865675vCtI=";
+  };
+
+  sourceRoot = "${src.name}/mitmproxy-macos";
+  pythonImportsCheck = [ "mitmproxy_macos" ];
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  meta = with lib; {
+    description = "The MacOS Rust bits in mitmproxy";
+    homepage = "https://github.com/mitmproxy/mitmproxy_rs/tree/main/mitmproxy-macos";
+    changelog = "https://github.com/mitmproxy/mitmproxy_rs/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ boltzmannrain ];
+    platforms = platforms.darwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mitmproxy-rs/Cargo.lock b/nixpkgs/pkgs/development/python-modules/mitmproxy-rs/Cargo.lock
new file mode 100644
index 000000000000..3c0c5cc67535
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mitmproxy-rs/Cargo.lock
@@ -0,0 +1,2762 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "addr2line"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
+dependencies = [
+ "gimli",
+]
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "aead"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0"
+dependencies = [
+ "crypto-common",
+ "generic-array",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea5d730647d4fadd988536d06fecce94b7b4f2a7efdae548f1cf4b63205518ab"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "anes"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
+
+[[package]]
+name = "anstyle"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b84bf0a05bbb2a83e5eb6fa36bb6e87baa08193c35ff52bbf6b38d8af2890e46"
+
+[[package]]
+name = "anyhow"
+version = "1.0.75"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
+dependencies = [
+ "backtrace",
+]
+
+[[package]]
+name = "apple-security-framework"
+version = "2.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07831f002eaa83d94f7e2c1300f3268a8f949c35a41dd99faceb6575c191d871"
+dependencies = [
+ "apple-security-framework-sys",
+ "bitflags 2.4.0",
+ "core-foundation",
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "apple-security-framework-sys"
+version = "2.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09acfa027e87e9f590474e9ef19d0f12158bf1c72af80ac76806f17e84959a42"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "arc-swap"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6"
+
+[[package]]
+name = "arrayvec"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
+
+[[package]]
+name = "async-stream"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51"
+dependencies = [
+ "async-stream-impl",
+ "futures-core",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "async-stream-impl"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.37",
+]
+
+[[package]]
+name = "async-trait"
+version = "0.1.74"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.37",
+]
+
+[[package]]
+name = "atomic-polyfill"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3ff7eb3f316534d83a8a2c3d1674ace8a5a71198eba31e2e2b597833f699b28"
+dependencies = [
+ "critical-section",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "axum"
+version = "0.6.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf"
+dependencies = [
+ "async-trait",
+ "axum-core",
+ "bitflags 1.3.2",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "hyper",
+ "itoa",
+ "matchit",
+ "memchr",
+ "mime",
+ "percent-encoding",
+ "pin-project-lite",
+ "rustversion",
+ "serde",
+ "sync_wrapper",
+ "tower",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "axum-core"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c"
+dependencies = [
+ "async-trait",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "mime",
+ "rustversion",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "backtrace"
+version = "0.3.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
+dependencies = [
+ "addr2line",
+ "cc",
+ "cfg-if",
+ "libc",
+ "miniz_oxide",
+ "object",
+ "rustc-demangle",
+]
+
+[[package]]
+name = "base64"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
+
+[[package]]
+name = "base64"
+version = "0.21.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2"
+
+[[package]]
+name = "bit_field"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bitflags"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
+
+[[package]]
+name = "blake2"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe"
+dependencies = [
+ "digest",
+]
+
+[[package]]
+name = "block-buffer"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "boringtun"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "751787b019c674b9ac353f4eaa285e6711c21badb421cd8c199bf2c83b727f29"
+dependencies = [
+ "aead",
+ "base64 0.13.1",
+ "blake2",
+ "chacha20poly1305",
+ "hex",
+ "hmac",
+ "ip_network",
+ "ip_network_table",
+ "libc",
+ "nix 0.25.1",
+ "parking_lot",
+ "rand_core",
+ "ring",
+ "tracing",
+ "untrusted 0.9.0",
+ "x25519-dalek",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"
+
+[[package]]
+name = "bytemuck"
+version = "1.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6"
+
+[[package]]
+name = "byteorder"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+
+[[package]]
+name = "bytes"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
+
+[[package]]
+name = "cast"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
+
+[[package]]
+name = "cc"
+version = "1.0.83"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "chacha20"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818"
+dependencies = [
+ "cfg-if",
+ "cipher",
+ "cpufeatures",
+]
+
+[[package]]
+name = "chacha20poly1305"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35"
+dependencies = [
+ "aead",
+ "chacha20",
+ "cipher",
+ "poly1305",
+ "zeroize",
+]
+
+[[package]]
+name = "ciborium"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926"
+dependencies = [
+ "ciborium-io",
+ "ciborium-ll",
+ "serde",
+]
+
+[[package]]
+name = "ciborium-io"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656"
+
+[[package]]
+name = "ciborium-ll"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b"
+dependencies = [
+ "ciborium-io",
+ "half 1.8.2",
+]
+
+[[package]]
+name = "cipher"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad"
+dependencies = [
+ "crypto-common",
+ "inout",
+ "zeroize",
+]
+
+[[package]]
+name = "clap"
+version = "4.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1d7b8d5ec32af0fadc644bf1fd509a688c2103b185644bb1e29d164e0703136"
+dependencies = [
+ "clap_builder",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5179bb514e4d7c2051749d8fcefa2ed6d06a9f4e6d69faf3805f5d80b8cf8d56"
+dependencies = [
+ "anstyle",
+ "clap_lex",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961"
+
+[[package]]
+name = "color_quant"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
+
+[[package]]
+name = "console-api"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd326812b3fd01da5bb1af7d340d0d555fd3d4b641e7f1dfcf5962a902952787"
+dependencies = [
+ "futures-core",
+ "prost",
+ "prost-types",
+ "tonic",
+ "tracing-core",
+]
+
+[[package]]
+name = "console-subscriber"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7481d4c57092cd1c19dd541b92bdce883de840df30aa5d03fd48a3935c01842e"
+dependencies = [
+ "console-api",
+ "crossbeam-channel",
+ "crossbeam-utils",
+ "futures-task",
+ "hdrhistogram",
+ "humantime",
+ "prost-types",
+ "serde",
+ "serde_json",
+ "thread_local",
+ "tokio",
+ "tokio-stream",
+ "tonic",
+ "tracing",
+ "tracing-core",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crc32fast"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "criterion"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f"
+dependencies = [
+ "anes",
+ "cast",
+ "ciborium",
+ "clap",
+ "criterion-plot",
+ "is-terminal",
+ "itertools 0.10.5",
+ "num-traits",
+ "once_cell",
+ "oorandom",
+ "plotters",
+ "rayon",
+ "regex",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "tinytemplate",
+ "walkdir",
+]
+
+[[package]]
+name = "criterion-plot"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1"
+dependencies = [
+ "cast",
+ "itertools 0.10.5",
+]
+
+[[package]]
+name = "critical-section"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216"
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
+dependencies = [
+ "cfg-if",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7"
+dependencies = [
+ "autocfg",
+ "cfg-if",
+ "crossbeam-utils",
+ "memoffset",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crunchy"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
+
+[[package]]
+name = "crypto-common"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+dependencies = [
+ "generic-array",
+ "rand_core",
+ "typenum",
+]
+
+[[package]]
+name = "curve25519-dalek"
+version = "4.0.0-rc.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "436ace70fc06e06f7f689d2624dc4e2f0ea666efb5aa704215f7249ae6e047a7"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "curve25519-dalek-derive",
+ "fiat-crypto",
+ "platforms",
+ "rustc_version",
+ "subtle",
+ "zeroize",
+]
+
+[[package]]
+name = "curve25519-dalek-derive"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.37",
+]
+
+[[package]]
+name = "data-encoding"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308"
+
+[[package]]
+name = "defmt"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8a2d011b2fee29fb7d659b83c43fce9a2cb4df453e16d441a51448e448f3f98"
+dependencies = [
+ "bitflags 1.3.2",
+ "defmt-macros",
+]
+
+[[package]]
+name = "defmt-macros"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54f0216f6c5acb5ae1a47050a6645024e6edafc2ee32d421955eccfef12ef92e"
+dependencies = [
+ "defmt-parser",
+ "proc-macro-error",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.37",
+]
+
+[[package]]
+name = "defmt-parser"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "269924c02afd7f94bc4cecbfa5c379f6ffcf9766b3408fe63d22c728654eccd0"
+dependencies = [
+ "thiserror",
+]
+
+[[package]]
+name = "digest"
+version = "0.10.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+dependencies = [
+ "block-buffer",
+ "crypto-common",
+ "subtle",
+]
+
+[[package]]
+name = "either"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
+
+[[package]]
+name = "env_logger"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0"
+dependencies = [
+ "humantime",
+ "is-terminal",
+ "log",
+ "regex",
+ "termcolor",
+]
+
+[[package]]
+name = "errno"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd"
+dependencies = [
+ "errno-dragonfly",
+ "libc",
+ "windows-sys",
+]
+
+[[package]]
+name = "errno-dragonfly"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "etherparse"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "827292ea592108849932ad8e30218f8b1f21c0dfd0696698a18b5d0aed62d990"
+dependencies = [
+ "arrayvec",
+]
+
+[[package]]
+name = "exr"
+version = "1.71.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "832a761f35ab3e6664babfbdc6cef35a4860e816ec3916dcfd0882954e98a8a8"
+dependencies = [
+ "bit_field",
+ "flume",
+ "half 2.2.1",
+ "lebe",
+ "miniz_oxide",
+ "rayon-core",
+ "smallvec",
+ "zune-inflate",
+]
+
+[[package]]
+name = "fdeflate"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10"
+dependencies = [
+ "simd-adler32",
+]
+
+[[package]]
+name = "fiat-crypto"
+version = "0.1.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77"
+
+[[package]]
+name = "filetime"
+version = "0.2.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "windows-sys",
+]
+
+[[package]]
+name = "flate2"
+version = "1.0.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010"
+dependencies = [
+ "crc32fast",
+ "miniz_oxide",
+]
+
+[[package]]
+name = "flume"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181"
+dependencies = [
+ "spin 0.9.8",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "futures"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa"
+
+[[package]]
+name = "futures-macro"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.37",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817"
+
+[[package]]
+name = "futures-task"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2"
+
+[[package]]
+name = "futures-util"
+version = "0.3.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.14.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi",
+]
+
+[[package]]
+name = "gif"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045"
+dependencies = [
+ "color_quant",
+ "weezl",
+]
+
+[[package]]
+name = "gimli"
+version = "0.28.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"
+
+[[package]]
+name = "h2"
+version = "0.3.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http",
+ "indexmap",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "half"
+version = "1.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7"
+
+[[package]]
+name = "half"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0"
+dependencies = [
+ "crunchy",
+]
+
+[[package]]
+name = "hash32"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67"
+dependencies = [
+ "byteorder",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
+[[package]]
+name = "hdrhistogram"
+version = "7.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f19b9f54f7c7f55e31401bb647626ce0cf0f67b0004982ce815b3ee72a02aa8"
+dependencies = [
+ "base64 0.13.1",
+ "byteorder",
+ "flate2",
+ "nom",
+ "num-traits",
+]
+
+[[package]]
+name = "heapless"
+version = "0.7.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "db04bc24a18b9ea980628ecf00e6c0264f3c1426dac36c00cb49b6fbad8b0743"
+dependencies = [
+ "atomic-polyfill",
+ "hash32",
+ "rustc_version",
+ "spin 0.9.8",
+ "stable_deref_trait",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7"
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
+[[package]]
+name = "hmac"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
+dependencies = [
+ "digest",
+]
+
+[[package]]
+name = "http"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "http-body"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
+dependencies = [
+ "bytes",
+ "http",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "httparse"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+
+[[package]]
+name = "httpdate"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
+
+[[package]]
+name = "humantime"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
+
+[[package]]
+name = "hyper"
+version = "0.14.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "socket2 0.4.9",
+ "tokio",
+ "tower-service",
+ "tracing",
+ "want",
+]
+
+[[package]]
+name = "hyper-timeout"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1"
+dependencies = [
+ "hyper",
+ "pin-project-lite",
+ "tokio",
+ "tokio-io-timeout",
+]
+
+[[package]]
+name = "image"
+version = "0.24.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711"
+dependencies = [
+ "bytemuck",
+ "byteorder",
+ "color_quant",
+ "exr",
+ "gif",
+ "jpeg-decoder",
+ "num-rational",
+ "num-traits",
+ "png",
+ "qoi",
+ "tiff",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+dependencies = [
+ "autocfg",
+ "hashbrown",
+]
+
+[[package]]
+name = "indoc"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306"
+
+[[package]]
+name = "inout"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "internet-checksum"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc6d6206008e25125b1f97fbe5d309eb7b85141cf9199d52dbd3729a1584dd16"
+
+[[package]]
+name = "internet-packet"
+version = "0.1.0"
+source = "git+https://github.com/mhils/internet-packet.git#9d706e0f6a28da91f63e3417c7bb4c2e977a2385"
+dependencies = [
+ "internet-checksum",
+]
+
+[[package]]
+name = "ip_network"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa2f047c0a98b2f299aa5d6d7088443570faae494e9ae1305e48be000c9e0eb1"
+
+[[package]]
+name = "ip_network_table"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4099b7cfc5c5e2fe8c5edf3f6f7adf7a714c9cc697534f63a5a5da30397cb2c0"
+dependencies = [
+ "ip_network",
+ "ip_network_table-deps-treebitmap",
+]
+
+[[package]]
+name = "ip_network_table-deps-treebitmap"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e537132deb99c0eb4b752f0346b6a836200eaaa3516dd7e5514b63930a09e5d"
+
+[[package]]
+name = "is-terminal"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b"
+dependencies = [
+ "hermit-abi",
+ "rustix",
+ "windows-sys",
+]
+
+[[package]]
+name = "itertools"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itertools"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
+
+[[package]]
+name = "jpeg-decoder"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e"
+dependencies = [
+ "rayon",
+]
+
+[[package]]
+name = "js-sys"
+version = "0.3.64"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "lebe"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8"
+
+[[package]]
+name = "libc"
+version = "0.2.148"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b"
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a9bad9f94746442c783ca431b22403b519cd7fbeed0533fdd6328b2f2212128"
+
+[[package]]
+name = "lock_api"
+version = "0.4.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
+
+[[package]]
+name = "lru_time_cache"
+version = "0.11.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9106e1d747ffd48e6be5bb2d97fa706ed25b144fbee4d5c02eae110cd8d6badd"
+
+[[package]]
+name = "macos-certificate-truster"
+version = "0.4.1"
+dependencies = [
+ "apple-security-framework",
+]
+
+[[package]]
+name = "managed"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ca88d725a0a943b096803bd34e73a4437208b6077654cc4ecb2947a5f91618d"
+
+[[package]]
+name = "matchers"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
+dependencies = [
+ "regex-automata 0.1.10",
+]
+
+[[package]]
+name = "matchit"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
+
+[[package]]
+name = "memchr"
+version = "2.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c"
+
+[[package]]
+name = "memoffset"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "mime"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
+[[package]]
+name = "miniz_oxide"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
+dependencies = [
+ "adler",
+ "simd-adler32",
+]
+
+[[package]]
+name = "mio"
+version = "0.8.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2"
+dependencies = [
+ "libc",
+ "wasi",
+ "windows-sys",
+]
+
+[[package]]
+name = "mitm-wg-test-client"
+version = "0.4.1"
+dependencies = [
+ "anyhow",
+ "boringtun",
+ "data-encoding",
+ "hex",
+ "smoltcp",
+]
+
+[[package]]
+name = "mitmproxy"
+version = "0.4.1"
+dependencies = [
+ "anyhow",
+ "apple-security-framework",
+ "async-trait",
+ "boringtun",
+ "console-subscriber",
+ "criterion",
+ "env_logger",
+ "futures-util",
+ "image",
+ "log",
+ "nix 0.27.1",
+ "once_cell",
+ "pretty-hex",
+ "prost",
+ "rand",
+ "rand_core",
+ "smoltcp",
+ "tokio",
+ "tokio-util",
+ "windows 0.51.1",
+ "x25519-dalek",
+]
+
+[[package]]
+name = "mitmproxy_rs"
+version = "0.4.1"
+dependencies = [
+ "anyhow",
+ "boringtun",
+ "console-subscriber",
+ "data-encoding",
+ "env_logger",
+ "log",
+ "mitmproxy",
+ "once_cell",
+ "pyo3",
+ "pyo3-asyncio",
+ "pyo3-log",
+ "rand_core",
+ "tar",
+ "tokio",
+]
+
+[[package]]
+name = "nix"
+version = "0.25.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4"
+dependencies = [
+ "autocfg",
+ "bitflags 1.3.2",
+ "cfg-if",
+ "libc",
+]
+
+[[package]]
+name = "nix"
+version = "0.27.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"
+dependencies = [
+ "bitflags 2.4.0",
+ "cfg-if",
+ "libc",
+]
+
+[[package]]
+name = "nom"
+version = "7.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-rational"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "object"
+version = "0.32.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+
+[[package]]
+name = "oorandom"
+version = "11.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
+
+[[package]]
+name = "opaque-debug"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
+
+[[package]]
+name = "parking_lot"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-targets",
+]
+
+[[package]]
+name = "percent-encoding"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
+
+[[package]]
+name = "pin-project"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422"
+dependencies = [
+ "pin-project-internal",
+]
+
+[[package]]
+name = "pin-project-internal"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.37",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "platforms"
+version = "3.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4503fa043bf02cee09a9582e9554b4c6403b2ef55e4612e96561d294419429f8"
+
+[[package]]
+name = "plotters"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45"
+dependencies = [
+ "num-traits",
+ "plotters-backend",
+ "plotters-svg",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "plotters-backend"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609"
+
+[[package]]
+name = "plotters-svg"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab"
+dependencies = [
+ "plotters-backend",
+]
+
+[[package]]
+name = "png"
+version = "0.17.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64"
+dependencies = [
+ "bitflags 1.3.2",
+ "crc32fast",
+ "fdeflate",
+ "flate2",
+ "miniz_oxide",
+]
+
+[[package]]
+name = "poly1305"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf"
+dependencies = [
+ "cpufeatures",
+ "opaque-debug",
+ "universal-hash",
+]
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+
+[[package]]
+name = "pretty-hex"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5"
+
+[[package]]
+name = "proc-macro-error"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
+dependencies = [
+ "proc-macro-error-attr",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+ "version_check",
+]
+
+[[package]]
+name = "proc-macro-error-attr"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "version_check",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.67"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "prost"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4fdd22f3b9c31b53c060df4a0613a1c7f062d4115a2b984dd15b1858f7e340d"
+dependencies = [
+ "bytes",
+ "prost-derive",
+]
+
+[[package]]
+name = "prost-derive"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "265baba7fabd416cf5078179f7d2cbeca4ce7a9041111900675ea7c4cb8a4c32"
+dependencies = [
+ "anyhow",
+ "itertools 0.11.0",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.37",
+]
+
+[[package]]
+name = "prost-types"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e081b29f63d83a4bc75cfc9f3fe424f9156cf92d8a4f0c9407cce9a1b67327cf"
+dependencies = [
+ "prost",
+]
+
+[[package]]
+name = "pyo3"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e681a6cfdc4adcc93b4d3cf993749a4552018ee0a9b65fc0ccfad74352c72a38"
+dependencies = [
+ "anyhow",
+ "cfg-if",
+ "indoc",
+ "libc",
+ "memoffset",
+ "parking_lot",
+ "pyo3-build-config",
+ "pyo3-ffi",
+ "pyo3-macros",
+ "unindent",
+]
+
+[[package]]
+name = "pyo3-asyncio"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2cc34c1f907ca090d7add03dc523acdd91f3a4dab12286604951e2f5152edad"
+dependencies = [
+ "futures",
+ "once_cell",
+ "pin-project-lite",
+ "pyo3",
+ "tokio",
+]
+
+[[package]]
+name = "pyo3-build-config"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "076c73d0bc438f7a4ef6fdd0c3bb4732149136abd952b110ac93e4edb13a6ba5"
+dependencies = [
+ "once_cell",
+ "target-lexicon",
+]
+
+[[package]]
+name = "pyo3-ffi"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e53cee42e77ebe256066ba8aa77eff722b3bb91f3419177cf4cd0f304d3284d9"
+dependencies = [
+ "libc",
+ "pyo3-build-config",
+]
+
+[[package]]
+name = "pyo3-log"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c10808ee7250403bedb24bc30c32493e93875fef7ba3e4292226fe924f398bd"
+dependencies = [
+ "arc-swap",
+ "log",
+ "pyo3",
+]
+
+[[package]]
+name = "pyo3-macros"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dfeb4c99597e136528c6dd7d5e3de5434d1ceaf487436a3f03b2d56b6fc9efd1"
+dependencies = [
+ "proc-macro2",
+ "pyo3-macros-backend",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "pyo3-macros-backend"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "947dc12175c254889edc0c02e399476c2f652b4b9ebd123aa655c224de259536"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "qoi"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001"
+dependencies = [
+ "bytemuck",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "rayon"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1"
+dependencies = [
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed"
+dependencies = [
+ "crossbeam-deque",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+dependencies = [
+ "bitflags 1.3.2",
+]
+
+[[package]]
+name = "regex"
+version = "1.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata 0.3.8",
+ "regex-syntax 0.7.5",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+dependencies = [
+ "regex-syntax 0.6.29",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax 0.7.5",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
+
+[[package]]
+name = "regex-syntax"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"
+
+[[package]]
+name = "ring"
+version = "0.16.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"
+dependencies = [
+ "cc",
+ "libc",
+ "once_cell",
+ "spin 0.5.2",
+ "untrusted 0.7.1",
+ "web-sys",
+ "winapi",
+]
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+
+[[package]]
+name = "rustc_version"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
+dependencies = [
+ "semver",
+]
+
+[[package]]
+name = "rustix"
+version = "0.38.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "747c788e9ce8e92b12cd485c49ddf90723550b654b32508f979b71a7b1ecda4f"
+dependencies = [
+ "bitflags 2.4.0",
+ "errno",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys",
+]
+
+[[package]]
+name = "rustversion"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
+
+[[package]]
+name = "ryu"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
+[[package]]
+name = "semver"
+version = "1.0.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad977052201c6de01a8ef2aa3378c4bd23217a056337d1d6da40468d267a4fb0"
+
+[[package]]
+name = "serde"
+version = "1.0.188"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.188"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.37",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.107"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "sharded-slab"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "simd-adler32"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
+
+[[package]]
+name = "slab"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a"
+
+[[package]]
+name = "smoltcp"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d2e3a36ac8fea7b94e666dfa3871063d6e0a5c9d5d4fec9a1a6b7b6760f0229"
+dependencies = [
+ "bitflags 1.3.2",
+ "byteorder",
+ "cfg-if",
+ "defmt",
+ "heapless",
+ "libc",
+ "log",
+ "managed",
+]
+
+[[package]]
+name = "socket2"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "socket2"
+version = "0.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e"
+dependencies = [
+ "libc",
+ "windows-sys",
+]
+
+[[package]]
+name = "spin"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
+
+[[package]]
+name = "spin"
+version = "0.9.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
+dependencies = [
+ "lock_api",
+]
+
+[[package]]
+name = "stable_deref_trait"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
+
+[[package]]
+name = "subtle"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "sync_wrapper"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
+
+[[package]]
+name = "tar"
+version = "0.4.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb"
+dependencies = [
+ "filetime",
+ "libc",
+ "xattr",
+]
+
+[[package]]
+name = "target-lexicon"
+version = "0.12.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a"
+
+[[package]]
+name = "termcolor"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.48"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.48"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.37",
+]
+
+[[package]]
+name = "thread_local"
+version = "1.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+]
+
+[[package]]
+name = "tiff"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d172b0f4d3fba17ba89811858b9d3d97f928aece846475bbda076ca46736211"
+dependencies = [
+ "flate2",
+ "jpeg-decoder",
+ "weezl",
+]
+
+[[package]]
+name = "tinytemplate"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
+dependencies = [
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "tokio"
+version = "1.33.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653"
+dependencies = [
+ "backtrace",
+ "bytes",
+ "libc",
+ "mio",
+ "num_cpus",
+ "pin-project-lite",
+ "signal-hook-registry",
+ "socket2 0.5.4",
+ "tokio-macros",
+ "tracing",
+ "windows-sys",
+]
+
+[[package]]
+name = "tokio-io-timeout"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf"
+dependencies = [
+ "pin-project-lite",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-macros"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.37",
+]
+
+[[package]]
+name = "tokio-stream"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842"
+dependencies = [
+ "futures-core",
+ "pin-project-lite",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.7.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "toml"
+version = "0.5.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "tonic"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e"
+dependencies = [
+ "async-stream",
+ "async-trait",
+ "axum",
+ "base64 0.21.4",
+ "bytes",
+ "h2",
+ "http",
+ "http-body",
+ "hyper",
+ "hyper-timeout",
+ "percent-encoding",
+ "pin-project",
+ "prost",
+ "tokio",
+ "tokio-stream",
+ "tower",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "tower"
+version = "0.4.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
+dependencies = [
+ "futures-core",
+ "futures-util",
+ "indexmap",
+ "pin-project",
+ "pin-project-lite",
+ "rand",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "tower-layer"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
+
+[[package]]
+name = "tower-service"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
+
+[[package]]
+name = "tracing"
+version = "0.1.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
+dependencies = [
+ "cfg-if",
+ "pin-project-lite",
+ "tracing-attributes",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-attributes"
+version = "0.1.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.37",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a"
+dependencies = [
+ "once_cell",
+ "valuable",
+]
+
+[[package]]
+name = "tracing-subscriber"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77"
+dependencies = [
+ "matchers",
+ "once_cell",
+ "regex",
+ "sharded-slab",
+ "thread_local",
+ "tracing",
+ "tracing-core",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
+
+[[package]]
+name = "typenum"
+version = "1.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
+
+[[package]]
+name = "unindent"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1766d682d402817b5ac4490b3c3002d91dfa0d22812f341609f97b08757359c"
+
+[[package]]
+name = "universal-hash"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea"
+dependencies = [
+ "crypto-common",
+ "subtle",
+]
+
+[[package]]
+name = "untrusted"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
+
+[[package]]
+name = "untrusted"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
+
+[[package]]
+name = "valuable"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "walkdir"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee"
+dependencies = [
+ "same-file",
+ "winapi-util",
+]
+
+[[package]]
+name = "want"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
+dependencies = [
+ "try-lock",
+]
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.37",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.37",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1"
+
+[[package]]
+name = "web-sys"
+version = "0.3.64"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "weezl"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb"
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "windivert"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc6b6833a760d1c36b489314a5541a12a39d162dc8341d8f6f400212b96d3df1"
+dependencies = [
+ "etherparse",
+ "thiserror",
+ "windivert-sys",
+ "windows 0.48.0",
+]
+
+[[package]]
+name = "windivert-sys"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "832bc4af9272458a8a64395b3aabe10dc4089546486fcbd0e19b9b6d28ba6e54"
+dependencies = [
+ "cc",
+ "thiserror",
+ "windows 0.48.0",
+]
+
+[[package]]
+name = "windows"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows"
+version = "0.51.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9"
+dependencies = [
+ "windows-core",
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.51.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-redirector"
+version = "0.4.1"
+dependencies = [
+ "anyhow",
+ "env_logger",
+ "hex",
+ "internet-packet",
+ "log",
+ "lru_time_cache",
+ "mitmproxy",
+ "prost",
+ "tokio",
+ "windivert",
+ "winres",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+
+[[package]]
+name = "winres"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c"
+dependencies = [
+ "toml",
+]
+
+[[package]]
+name = "x25519-dalek"
+version = "2.0.0-rc.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec7fae07da688e17059d5886712c933bb0520f15eff2e09cfa18e30968f4e63a"
+dependencies = [
+ "curve25519-dalek",
+ "rand_core",
+ "serde",
+ "zeroize",
+]
+
+[[package]]
+name = "xattr"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4686009f71ff3e5c4dbcf1a282d0a44db3f021ba69350cd42086b3e5f1c6985"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "zeroize"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9"
+dependencies = [
+ "zeroize_derive",
+]
+
+[[package]]
+name = "zeroize_derive"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.37",
+]
+
+[[package]]
+name = "zune-inflate"
+version = "0.2.54"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02"
+dependencies = [
+ "simd-adler32",
+]
diff --git a/nixpkgs/pkgs/development/python-modules/mitmproxy-rs/default.nix b/nixpkgs/pkgs/development/python-modules/mitmproxy-rs/default.nix
new file mode 100644
index 000000000000..33b0d7acee18
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mitmproxy-rs/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, rustPlatform
+, darwin
+, libiconv
+, mitmproxy-macos
+}:
+
+buildPythonPackage rec {
+  pname = "mitmproxy-rs";
+  version = "0.4.1";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "mitmproxy";
+    repo = "mitmproxy_rs";
+    rev = version;
+    hash = "sha256-Vc7ez/W40CefO2ZLAHot14p478pDPtQor865675vCtI=";
+  };
+
+  cargoDeps = rustPlatform.importCargoLock {
+    lockFile = ./Cargo.lock;
+    outputHashes = {
+      "internet-packet-0.1.0" = "sha256-VtEuCE1sulBIFVymh7YW7VHCuIBjtb6tHoPz2tjxX+Q=";
+    };
+  };
+
+  buildAndTestSubdir = "mitmproxy-rs";
+
+  nativeBuildInputs = [
+    rustPlatform.cargoSetupHook
+    rustPlatform.maturinBuildHook
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    darwin.apple_sdk.frameworks.Security
+    libiconv
+    mitmproxy-macos
+  ];
+
+  pythonImportsCheck = [ "mitmproxy_rs" ];
+
+  meta = with lib; {
+    description = "The Rust bits in mitmproxy";
+    homepage = "https://github.com/mitmproxy/mitmproxy_rs";
+    changelog = "https://github.com/mitmproxy/mitmproxy_rs/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mitmproxy-wireguard/default.nix b/nixpkgs/pkgs/development/python-modules/mitmproxy-wireguard/default.nix
new file mode 100644
index 000000000000..b67459a5de02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mitmproxy-wireguard/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, stdenv
+, darwin
+, pytestCheckHook
+, pythonOlder
+, rustPlatform
+, setuptools-rust
+}:
+
+buildPythonPackage rec {
+  pname = "mitmproxy-wireguard";
+  version = "0.1.23";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "decathorpe";
+    repo = "mitmproxy_wireguard";
+    rev = "refs/tags/${version}";
+    hash = "sha256-z9ucTBLLRXc1lcHA0r1wUleoP8X7yIlHrtdZdLD9qJk=";
+  };
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    darwin.libiconv
+    darwin.apple_sdk.frameworks.Security
+  ];
+
+  nativeBuildInputs = [
+    setuptools-rust
+  ] ++ (with rustPlatform; [
+    cargoSetupHook
+    maturinBuildHook
+  ]);
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-qgyAaUpyuWVYMxUA4Gg8inlUMlSLo++16+nVvmDMhTQ=";
+  };
+
+  # Module has no tests, only a test client
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "mitmproxy_wireguard"
+  ];
+
+  meta = with lib; {
+    description = "WireGuard frontend for mitmproxy";
+    homepage = "https://github.com/decathorpe/mitmproxy_wireguard";
+    changelog = "https://github.com/decathorpe/mitmproxy_wireguard/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mitmproxy/default.nix b/nixpkgs/pkgs/development/python-modules/mitmproxy/default.nix
new file mode 100644
index 000000000000..e8c941fb950a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mitmproxy/default.nix
@@ -0,0 +1,141 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+  # Mitmproxy requirements
+, aioquic
+, asgiref
+, blinker
+, brotli
+, certifi
+, cryptography
+, flask
+, h11
+, h2
+, hyperframe
+, kaitaistruct
+, ldap3
+, mitmproxy-macos
+, mitmproxy-rs
+, msgpack
+, passlib
+, protobuf
+, publicsuffix2
+, pyopenssl
+, pyparsing
+, pyperclip
+, ruamel-yaml
+, setuptools
+, sortedcontainers
+, tornado
+, urwid
+, wsproto
+, zstandard
+  # Additional check requirements
+, hypothesis
+, parver
+, pytest-asyncio
+, pytest-timeout
+, pytest-xdist
+, pytestCheckHook
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "mitmproxy";
+  version = "10.1.5";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "mitmproxy";
+    repo = "mitmproxy";
+    rev = "refs/tags/${version}";
+    hash = "sha256-WtZ5KPkTjYMCjrghVcihxuQ2cS88OOCbMYHfqzeo4qQ=";
+  };
+
+  propagatedBuildInputs = [
+    aioquic
+    asgiref
+    blinker
+    brotli
+    certifi
+    cryptography
+    flask
+    h11
+    h2
+    hyperframe
+    kaitaistruct
+    ldap3
+    mitmproxy-rs
+    msgpack
+    passlib
+    protobuf
+    publicsuffix2
+    pyopenssl
+    pyparsing
+    pyperclip
+    ruamel-yaml
+    setuptools
+    sortedcontainers
+    tornado
+    urwid
+    wsproto
+    zstandard
+  ] ++ lib.optionals stdenv.isDarwin [
+    mitmproxy-macos
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    parver
+    pytest-asyncio
+    pytest-timeout
+    pytest-xdist
+    pytestCheckHook
+    requests
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  disabledTests = [
+    # Tests require a git repository
+    "test_get_version"
+    # https://github.com/mitmproxy/mitmproxy/commit/36ebf11916704b3cdaf4be840eaafa66a115ac03
+    # Tests require terminal
+    "test_integration"
+    "test_contentview_flowview"
+    "test_flowview"
+    # ValueError: Exceeds the limit (4300) for integer string conversion
+    "test_roundtrip_big_integer"
+    "test_wireguard"
+    "test_commands_exist"
+    "test_statusbar"
+    # AssertionError: Playbook mismatch!
+    "test_untrusted_cert"
+    "test_mitmproxy_ca_is_untrusted"
+  ];
+
+  disabledTestPaths = [
+    # teardown of half the tests broken
+    "test/mitmproxy/addons/test_onboarding.py"
+  ];
+
+  dontUsePytestXdist = true;
+
+  pythonImportsCheck = [ "mitmproxy" ];
+
+  meta = with lib; {
+    description = "Man-in-the-middle proxy";
+    homepage = "https://mitmproxy.org/";
+    changelog = "https://github.com/mitmproxy/mitmproxy/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kamilchm SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mitogen/default.nix b/nixpkgs/pkgs/development/python-modules/mitogen/default.nix
new file mode 100644
index 000000000000..167378cecbbb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mitogen/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mitogen";
+  version = "0.3.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mitogen-hq";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-tMpjmSqZffFGbo06W/FAut584F8eOPrcLKjj2bnB+Zo=";
+  };
+
+  # Tests require network access and Docker support
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "mitogen"
+  ];
+
+  meta = with lib; {
+    description = "Python Library for writing distributed self-replicating programs";
+    homepage = "https://github.com/mitogen-hq/mitogen";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mixins/default.nix b/nixpkgs/pkgs/development/python-modules/mixins/default.nix
new file mode 100644
index 000000000000..9c9bfbc3a407
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mixins/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "mixins";
+  version = "0.1.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-SmYYRzo6wClQBMc2oRgO0CQEHOxWe8GFL24TPa6A4NQ=";
+  };
+
+  pythonImportsCheck = [
+    "mixins"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/nickderobertis/py-mixins";
+    description = "Mixin classes which may be added to your own classes to add certain functionality to them";
+    maintainers = with maintainers; [ aanderse ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mixpanel/default.nix b/nixpkgs/pkgs/development/python-modules/mixpanel/default.nix
new file mode 100644
index 000000000000..473520177177
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mixpanel/default.nix
@@ -0,0 +1,47 @@
+
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+
+# Python Dependencies
+, six
+, urllib3
+, requests
+
+# tests
+, pytestCheckHook
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "mixpanel";
+  version = "4.10.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "mixpanel";
+    repo = "mixpanel-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-jV2NLEc23uaI5Q7ZXDwGaZV9iAKQLMAETRTw8epZwQA=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    six
+    urllib3
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mixpanel/mixpanel-python";
+    description = "Official Mixpanel Python library";
+    license = licenses.asl20;
+    maintainers = with maintainers; [
+      kamadorueda
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mizani/default.nix b/nixpkgs/pkgs/development/python-modules/mizani/default.nix
new file mode 100644
index 000000000000..467da5dd80af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mizani/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, matplotlib
+, palettable
+, pandas
+, pytestCheckHook
+, pythonOlder
+, scipy
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "mizani";
+  version = "0.10.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "has2k1";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-JrE12dU0Es4VwUZLcbB8mabifnpxZ7Qt68WJ22HvPm4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    matplotlib
+    palettable
+    pandas
+    scipy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=mizani --cov-report=xml" ""
+  '';
+
+  pythonImportsCheck = [
+    "mizani"
+  ];
+
+  meta = with lib; {
+    description = "Scales for Python";
+    homepage = "https://github.com/has2k1/mizani";
+    changelog = "https://github.com/has2k1/mizani/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mkdocs-autorefs/default.nix b/nixpkgs/pkgs/development/python-modules/mkdocs-autorefs/default.nix
new file mode 100644
index 000000000000..1a0b64efe1e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-autorefs/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, markdown
+, mkdocs
+, pytestCheckHook
+, pdm-backend
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mkdocs-autorefs";
+  version = "0.5.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "mkdocstrings";
+    repo = "autorefs";
+    rev = "refs/tags/${version}";
+    hash = "sha256-GZKQlOXhQIQhS/z4cbmS6fhAKYgnVhSXh5a8Od7+TWc=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'dynamic = ["version"]' 'version = "${version}"'
+  '';
+
+  nativeBuildInputs = [
+    pdm-backend
+  ];
+
+  propagatedBuildInputs = [
+    markdown
+    mkdocs
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mkdocs_autorefs"
+  ];
+
+  meta = with lib; {
+    description = "Automatically link across pages in MkDocs";
+    homepage = "https://github.com/mkdocstrings/autorefs/";
+    changelog = "https://github.com/mkdocstrings/autorefs/blob/${version}/CHANGELOG.md";
+    license = licenses.isc;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mkdocs-drawio-exporter/default.nix b/nixpkgs/pkgs/development/python-modules/mkdocs-drawio-exporter/default.nix
new file mode 100644
index 000000000000..84823937388a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-drawio-exporter/default.nix
@@ -0,0 +1,33 @@
+{ buildPythonPackage
+, drawio-headless
+, fetchPypi
+, isPy3k
+, lib
+, mkdocs
+}:
+
+buildPythonPackage rec {
+  pname = "mkdocs-drawio-exporter";
+  version = "0.8.0";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-9cvA186FS6bHmpOrv4OfPZ5kRfgfafBfaWxgWJIlwwA=";
+  };
+
+  propagatedBuildInputs = [ mkdocs drawio-headless ];
+
+  pythonImportsCheck = [ "mkdocsdrawioexporter" ];
+
+  meta = with lib; {
+    description = "Exports your Draw.io diagrams at build time for easier embedding into your documentation.";
+    homepage = "https://github.com/LukeCarrier/mkdocs-drawio-exporter/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ snpschaaf ];
+    longDescription = ''
+      Exports your Draw.io diagrams at build time for easier embedding into your documentation.
+    '';
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mkdocs-exclude/default.nix b/nixpkgs/pkgs/development/python-modules/mkdocs-exclude/default.nix
new file mode 100644
index 000000000000..e959a15e4702
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-exclude/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, callPackage
+, buildPythonPackage
+, fetchFromGitHub
+, mkdocs
+}:
+
+buildPythonPackage rec {
+  pname = "mkdocs-exclude";
+  version = "1.0.2";
+
+  # Repository has only 3 commits and no tags. Each of these commits has
+  # version of 1.0.0, 1.0.1 and 1.0.2 in setup.py, though.
+  src = fetchFromGitHub {
+    owner = "apenwarr";
+    repo = "mkdocs-exclude";
+    rev = "fdd67d2685ff706de126e99daeaaaf3f6f7cf3ae";
+    sha256 = "1phhl79xf4xq8w2sb2w5zm4bahcr33gsbxkz7dl1dws4qhcbxrfd";
+  };
+
+  propagatedBuildInputs = [ mkdocs ];
+
+  # Attempt to import "mkdocs_exclude" module in stand-alone mode fails:
+  #
+  #    module 'mkdocs.config' has no attribute 'config_options'
+  #
+  # It works fine when actually used to build documentation of "pydantic",
+  # though. This package has no tests.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A mkdocs plugin to exclude files from input using globs or regexes.";
+    homepage = "https://github.com/apenwarr/mkdocs-exclude";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ kaction ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mkdocs-git-authors-plugin/default.nix b/nixpkgs/pkgs/development/python-modules/mkdocs-git-authors-plugin/default.nix
new file mode 100644
index 000000000000..cd40bb14b1c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-git-authors-plugin/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, mkdocs
+}:
+
+buildPythonPackage rec {
+  pname = "mkdocs-git-authors-plugin";
+  version = "0.7.2";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "timvink";
+    repo = "mkdocs-git-authors-plugin";
+    rev = "v${version}";
+    hash = "sha256-jhYwi9HO6kxOS1QmEKb1YnXGSJ4Eyo4Sm07jI4lxXnA=";
+  };
+
+  propagatedBuildInputs = [ mkdocs ];
+
+  pythonImportsCheck = [ "mkdocs_git_authors_plugin" ];
+
+  meta = with lib; {
+    description = "Lightweight MkDocs plugin to display git authors of a markdown page";
+    homepage = "https://github.com/timvink/mkdocs-git-authors-plugin";
+    license = licenses.mit;
+    maintainers = with maintainers; [ totoroot ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mkdocs-git-revision-date-localized-plugin/default.nix b/nixpkgs/pkgs/development/python-modules/mkdocs-git-revision-date-localized-plugin/default.nix
new file mode 100644
index 000000000000..986f0d1d2ce6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-git-revision-date-localized-plugin/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, gitpython
+, mkdocs
+, pytz
+, pytestCheckHook
+, git
+}:
+
+buildPythonPackage rec {
+  pname = "mkdocs-git-revision-date-localized-plugin";
+  version = "1.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "timvink";
+    repo = "mkdocs-git-revision-date-localized-plugin";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-UIbW64ac9kXptJjn86V6vPArnICANiT3QGi5JH45KLY=";
+  };
+
+  propagatedBuildInputs = [
+    gitpython
+    mkdocs
+    pytz
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  disabledTestPaths = [
+    "tests/test_builds.py"
+  ];
+
+  pythonImportsCheck = [ "mkdocs_git_revision_date_localized_plugin" ];
+
+  meta = with lib; {
+    description = "MkDocs plugin that enables displaying the date of the last git modification of a page";
+    homepage = "https://github.com/timvink/mkdocs-git-revision-date-localized-plugin";
+    changelog = "https://github.com/timvink/mkdocs-git-revision-date-localized-plugin/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ totoroot ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mkdocs-gitlab-plugin/default.nix b/nixpkgs/pkgs/development/python-modules/mkdocs-gitlab-plugin/default.nix
new file mode 100644
index 000000000000..69242caa8901
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-gitlab-plugin/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage
+, fetchzip
+, isPy3k
+, lib
+, mkdocs
+}:
+
+buildPythonPackage rec {
+  pname = "mkdocs-gitlab-plugin";
+  version = "0.1.4";
+
+  disabled = !isPy3k;
+
+  src = fetchzip {
+    url = "https://gitlab.inria.fr/vidjil/mkdocs-gitlab-plugin/-/archive/fb87fbfd404839e661a799c540664b1103096a5f/mkdocs-gitlab-plugin-fb87fbfd404839e661a799c540664b1103096a5f.tar.gz";
+    hash = "sha256-z+U0PRwymDDXVNM7a2Yl4pNNVBxpx/BhJnlx6kgyvww=";
+  };
+
+  patches = [ ./mkdocs-gitlab-plugin.diff ];
+
+  propagatedBuildInputs = [ mkdocs ];
+
+  pythonImportsCheck = [ "mkdocs_gitlab_plugin" ];
+
+  meta = with lib; {
+    description = "MkDocs plugin to transform strings such as #1234, %56, or !789 into links to a Gitlab repository.";
+    homepage = "https://gitlab.inria.fr/vidjil/mkdocs-gitlab-plugin";
+    license = licenses.mit;
+    maintainers = with maintainers; [ snpschaaf ];
+    longDescription = ''
+      Plugin for MkDocs.
+      Transform handles such as #1234, %56, !789, &12 or $34 into links to a gitlab repository,
+      given by the gitlab_url configuration option.
+      Before the #/%/!/&/$ is needed either a space, a '(', or a '['.
+    '';
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mkdocs-gitlab-plugin/mkdocs-gitlab-plugin.diff b/nixpkgs/pkgs/development/python-modules/mkdocs-gitlab-plugin/mkdocs-gitlab-plugin.diff
new file mode 100644
index 000000000000..65b0f2a10cd4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-gitlab-plugin/mkdocs-gitlab-plugin.diff
@@ -0,0 +1,37 @@
+diff --git a/mkdocs_gitlab_plugin/plugin.py b/mkdocs_gitlab_plugin/plugin.py
+index e8d7ab7..8b883f5 100644
+--- a/mkdocs_gitlab_plugin/plugin.py
++++ b/mkdocs_gitlab_plugin/plugin.py
+@@ -3,7 +3,7 @@
+ import re
+ import mkdocs
+ 
+-from mkdocs.config import Config
++from mkdocs.config.config_options import Type
+ from mkdocs.plugins import BasePlugin
+ 
+ class GitlabLinksPlugin(BasePlugin):
+@@ -13,8 +13,8 @@ class GitlabLinksPlugin(BasePlugin):
+     '''
+ 
+     config_scheme = (
+-        ('gitlab_url', mkdocs.config.config_options.Type(str, default='http://gitlab.com/XXX')),
+-        ('verbose', mkdocs.config.config_options.Type(bool, default=False))
++        ('gitlab_url', Type(str, default='http://gitlab.com/XXX')),
++        ('verbose', Type(bool, default=False))
+     )
+ 
+     TOKEN_PATHS = {
+diff --git a/mkdocs_gitlab_plugin/test.py b/mkdocs_gitlab_plugin/test.py
+index 4a5c35f..d5a19c6 100644
+--- a/mkdocs_gitlab_plugin/test.py
++++ b/mkdocs_gitlab_plugin/test.py
+@@ -1,7 +1,7 @@
+ 
+ import sys
+ 
+-from plugin import GitlabLinksPlugin
++from .plugin import GitlabLinksPlugin
+ 
+ if __name__ == '__main__':
+     plugin = GitlabLinksPlugin()
diff --git a/nixpkgs/pkgs/development/python-modules/mkdocs-jupyter/default.nix b/nixpkgs/pkgs/development/python-modules/mkdocs-jupyter/default.nix
new file mode 100644
index 000000000000..a83899c6c74c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-jupyter/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hatchling
+, ipykernel
+, jupytext
+, mkdocs
+, mkdocs-material
+, nbconvert
+, pygments
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "mkdocs-jupyter";
+  version = "0.24.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "mkdocs_jupyter";
+    inherit version;
+    hash = "sha256-ify+ipUjhk1UFt4aYHEWQLa8KXInnSrfRu0ndsLZ/3w=";
+  };
+
+  postPatch = ''
+    sed -i "/--cov/d" pyproject.toml
+    substituteInPlace src/mkdocs_jupyter/tests/test_base_usage.py \
+      --replace "[\"mkdocs\"," "[\"${mkdocs.out}/bin/mkdocs\","
+  '';
+
+  pythonRelaxDeps = [
+    "nbconvert"
+  ];
+
+  nativeBuildInputs = [
+    hatchling
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    ipykernel
+    jupytext
+    mkdocs
+    mkdocs-material
+    nbconvert
+    pygments
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mkdocs_jupyter"
+  ];
+
+  meta = with lib; {
+    description = "Use Jupyter Notebook in mkdocs";
+    homepage = "https://github.com/danielfrg/mkdocs-jupyter";
+    changelog = "https://github.com/danielfrg/mkdocs-jupyter/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ net-mist ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mkdocs-linkcheck/default.nix b/nixpkgs/pkgs/development/python-modules/mkdocs-linkcheck/default.nix
new file mode 100644
index 000000000000..540640e14beb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-linkcheck/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pythonPackages
+}:
+
+buildPythonPackage rec {
+  pname = "mkdocs-linkcheck";
+  version = "unstable-2021-08-24";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "byrnereese";
+    repo = "linkchecker-mkdocs";
+    rev = "a75d765b0ec564e5ed0218880ed0b5ab4b973917" ;
+    hash = "sha256-z59F7zUKZKIQSiTlE6wGbGDecPMeruNgltWUYfDf8jY=";
+  };
+
+  propagatedBuildInputs = with pythonPackages; [
+    aiohttp
+    requests
+  ];
+
+  pythonImportsCheck = [ "mkdocs_linkcheck" ];
+
+  meta = with lib; {
+    description = "Validate links in Markdown files for static site generators like MkDocs, Hugo or Jekyll";
+    longDescription = ''
+      This is not a MkDocs plugin, but a companion tool that is useful to validate links in Markdown files for
+      static site generators like MkDocs, Hugo or Jekyll. It can be used with any text files containing links.
+    '';
+    homepage = "https://github.com/byrnereese/mkdocs-linkcheck";
+    license = licenses.mit;
+    maintainers = with maintainers; [ totoroot ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mkdocs-macros/default.nix b/nixpkgs/pkgs/development/python-modules/mkdocs-macros/default.nix
new file mode 100644
index 000000000000..e55d1b0801ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-macros/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, callPackage
+, buildPythonPackage
+, fetchPypi
+, mkdocs
+, mkdocs-macros
+, mkdocs-material
+, jinja2
+, python-dateutil
+, termcolor
+, pyyaml
+, runCommand
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "mkdocs-macros-plugin";
+  version = "0.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256:0206cm0153vzp10c8a15bi2znisq5pv59zi9vrcm74pnpk5f2r4y";
+  };
+
+  propagatedBuildInputs = [
+    jinja2
+    termcolor
+    python-dateutil
+    pyyaml
+    mkdocs
+  ];
+
+  passthru.tests.example-doc = callPackage ./tests.nix { };
+
+  pythonImportsCheck = [ "mkdocs_macros" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/fralau/mkdocs_macros_plugin";
+    description = "Create richer and more beautiful pages in MkDocs, by using variables and calls to macros in the markdown code.";
+    license = licenses.mit;
+    maintainers = with maintainers; [ tljuniper ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mkdocs-macros/mkdocs-macros-test.nix b/nixpkgs/pkgs/development/python-modules/mkdocs-macros/mkdocs-macros-test.nix
new file mode 100644
index 000000000000..8a53933b19af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-macros/mkdocs-macros-test.nix
@@ -0,0 +1,27 @@
+{ lib
+, callPackage
+, buildPythonPackage
+, fetchPypi
+, runCommand
+, setuptools
+}:
+
+# Is required for properly testing mkdocs-macros
+buildPythonPackage rec {
+  pname = "mkdocs-macros-test";
+  version = "0.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256:1w12skm8l0r2x6z1va996lvq6z1873d0xzql9n0aja0g0v6s7ay5";
+  };
+
+  pythonImportsCheck = [ "mkdocs_macros_test" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/fralau/mkdocs-macros-test";
+    description = "Implementation of a (model) pluglet for mkdocs-macros";
+    license = licenses.mit;
+    maintainers = with maintainers; [ tljuniper ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mkdocs-macros/tests.nix b/nixpkgs/pkgs/development/python-modules/mkdocs-macros/tests.nix
new file mode 100644
index 000000000000..5ddcd26e0dab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-macros/tests.nix
@@ -0,0 +1,49 @@
+{ setuptools
+, mkdocs
+, mkdocs-macros
+, mkdocs-material
+, runCommand
+, callPackage
+}:
+
+let
+  inherit (mkdocs-macros) pname version src;
+
+  mkdocs-macros-test = callPackage ./mkdocs-macros-test.nix { };
+
+  env = {
+    nativeBuildInputs = [
+      setuptools
+      mkdocs
+      mkdocs-macros
+      mkdocs-macros-test
+      mkdocs-material
+    ];
+  };
+in
+runCommand "mkdocs-macros-example-docs" env ''
+  set -euo pipefail
+  mkdir $out
+
+  base_dir=${pname}-${version}/test
+  tar --extract "--file=${src}"
+
+  for test_dir in $base_dir/*/; do
+    pushd $test_dir
+    mkdocs build --site-dir=$out/$test_dir
+    popd
+  done
+
+  # Do some static checks on the generated content
+  pushd $out/$base_dir
+  # Non-existent variables
+  cat debug/index.html | grep "another one:  that"
+  # File inclusion
+  cat module/index.html | grep "part from an <em>included</em> file!"
+  # Variable replacement
+  cat module_dir/index.html | grep "total costs is 50 euros"
+  # New syntax with square brackets
+  cat new_syntax/index.html | grep "expensive"
+  # General info on macros
+  cat simple/index.html | grep "Macros Plugin Environment"
+''
diff --git a/nixpkgs/pkgs/development/python-modules/mkdocs-material/default.nix b/nixpkgs/pkgs/development/python-modules/mkdocs-material/default.nix
new file mode 100644
index 000000000000..59c433145b02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-material/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, callPackage
+, buildPythonPackage
+, fetchFromGitHub
+, colorama
+, hatch-requirements-txt
+, hatch-nodejs-version
+, hatchling
+, jinja2
+, markdown
+, mkdocs
+, mkdocs-material-extensions
+, pygments
+, pymdown-extensions
+, pythonOlder
+, regex
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "mkdocs-material";
+  version = "9.3.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "squidfunk";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-2Z1U71agXxkYp1OFYd/xInAfN5SVI9FQf39b8DkX10o=";
+  };
+
+  nativeBuildInputs = [
+    hatch-requirements-txt
+    hatch-nodejs-version
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    colorama
+    jinja2
+    markdown
+    mkdocs
+    mkdocs-material-extensions
+    pygments
+    pymdown-extensions
+    regex
+    requests
+  ];
+
+  # No tests for python
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "mkdocs"
+  ];
+
+  meta = with lib; {
+    description = "Material for mkdocs";
+    homepage = "https://squidfunk.github.io/mkdocs-material/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dandellion ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mkdocs-material/mkdocs-material-extensions.nix b/nixpkgs/pkgs/development/python-modules/mkdocs-material/mkdocs-material-extensions.nix
new file mode 100644
index 000000000000..4e1c47a8c49d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-material/mkdocs-material-extensions.nix
@@ -0,0 +1,33 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, hatchling
+}:
+
+buildPythonPackage rec {
+  pname = "mkdocs-material-extensions";
+  version = "1.1.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "facelessuser";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-FHI6WEQRd/Ff6pmU13f8f0zPSeFhhbmDdk4/0rdIl4I=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  doCheck = false; # Circular dependency
+
+  pythonImportsCheck = [ "materialx" ];
+
+  meta = with lib; {
+    description = "Markdown extension resources for MkDocs Material";
+    homepage = "https://github.com/facelessuser/mkdocs-material-extensions";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dandellion ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mkdocs-mermaid2-plugin/default.nix b/nixpkgs/pkgs/development/python-modules/mkdocs-mermaid2-plugin/default.nix
new file mode 100644
index 000000000000..86037b0c18ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-mermaid2-plugin/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, beautifulsoup4
+, jsbeautifier
+, mkdocs
+, mkdocs-material
+, pymdown-extensions
+, pyyaml
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mkdocs-mermaid2-plugin";
+  version = "1.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fralau";
+    repo = "mkdocs-mermaid2-plugin";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-9vYLkGUnL+rnmZntcgFzOvXQdf6angb9DRsmrBjnPUY=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    jsbeautifier
+    mkdocs
+    mkdocs-material
+    pymdown-extensions
+    pyyaml
+    requests
+  ];
+
+  # non-traditional python tests (e.g. nodejs based tests)
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "mermaid2"
+  ];
+
+  meta = with lib; {
+    description = "A MkDocs plugin for including mermaid graphs in markdown sources";
+    homepage = "https://github.com/fralau/mkdocs-mermaid2-plugin";
+    changelog = "https://github.com/fralau/mkdocs-mermaid2-plugin/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mkdocs-minify/default.nix b/nixpkgs/pkgs/development/python-modules/mkdocs-minify/default.nix
new file mode 100644
index 000000000000..631f881908c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-minify/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mkdocs
+, csscompressor
+, htmlmin
+, jsmin
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mkdocs-minify";
+  version = "0.7.1";
+
+  src = fetchFromGitHub {
+    owner = "byrnereese";
+    repo = "${pname}-plugin";
+    rev = "refs/tags/${version}";
+    hash = "sha256-LDCAWKVbFsa6Y/tmY2Zne4nOtxe4KvNplZuWxg4e4L8=";
+  };
+
+  propagatedBuildInputs = [
+    csscompressor
+    htmlmin
+    jsmin
+    mkdocs
+  ];
+
+  nativeCheckInputs = [
+    mkdocs
+    pytestCheckHook
+  ];
+
+  # Some tests fail with an assertion error failure
+  doCheck = false;
+
+  pythonImportsCheck = [ "mkdocs" ];
+
+  meta = with lib; {
+    description = "A mkdocs plugin to minify the HTML of a page before it is written to disk.";
+    homepage = "https://github.com/byrnereese/mkdocs-minify-plugin";
+    license = licenses.mit;
+    maintainers = with maintainers; [ tfc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mkdocs-redirects/default.nix b/nixpkgs/pkgs/development/python-modules/mkdocs-redirects/default.nix
new file mode 100644
index 000000000000..878117c6b60a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-redirects/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, callPackage
+, buildPythonPackage
+, fetchFromGitHub
+, mkdocs
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mkdocs-redirects";
+  version = "1.2.1";
+
+  src = fetchFromGitHub {
+    owner = "mkdocs";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-zv/tCsC2wrD0iH7Kvlq4nXJMPMGQ7+l68Y/q/x66LBg=";
+  };
+
+  propagatedBuildInputs = [
+    mkdocs
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mkdocs_redirects"
+  ];
+
+  meta = with lib; {
+    description = "Open source plugin for Mkdocs page redirects";
+    homepage = "https://github.com/mkdocs/mkdocs-redirects";
+    license = licenses.mit;
+    maintainers = with maintainers; [ tfc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mkdocs-simple-hooks/default.nix b/nixpkgs/pkgs/development/python-modules/mkdocs-simple-hooks/default.nix
new file mode 100644
index 000000000000..c403baebbae3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-simple-hooks/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, fetchFromGitHub
+, mkdocs
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mkdocs-simple-hooks";
+  version = "0.1.5";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "aklajnert";
+    repo = "mkdocs-simple-hooks";
+    rev = "v${version}";
+    hash = "sha256-N6xZjCREjJlhR6f8m65WJswUQv/TTdTbk670+C46UWQ=";
+  };
+
+  propagatedBuildInputs = [
+    mkdocs
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pytestFlagsArray = [ "tests.py" ];
+
+  # disable failing tests
+  disabledTests = [
+    "test_no_hooks_defined"
+    "test_no_attribute"
+  ];
+
+  meta = with lib; {
+    description = "Define your own hooks for mkdocs, without having to create a new package.";
+    homepage = "https://github.com/aklajnert/mkdocs-simple-hooks";
+    license = licenses.mit;
+    maintainers = with maintainers; [ arjan-s ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mkdocs-swagger-ui-tag/default.nix b/nixpkgs/pkgs/development/python-modules/mkdocs-swagger-ui-tag/default.nix
new file mode 100644
index 000000000000..0bd3f97175ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs-swagger-ui-tag/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, drawio-headless
+, fetchFromGitHub
+, mkdocs
+, pathspec
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mkdocs-swagger-ui-tag";
+  version = "0.6.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Blueswen";
+    repo = "mkdocs-swagger-ui-tag";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-NEFogrLJjOh98rChlJuxAeTj31yyL4OoE/jBUcHbBZM=";
+  };
+
+  propagatedBuildInputs = [
+    mkdocs
+    beautifulsoup4
+  ];
+
+  nativeCheckInputs = [
+    pathspec
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mkdocs_swagger_ui_tag"
+  ];
+
+  disabledTests = [
+    # Don't actually build results
+    "test_material"
+    "test_material_dark_scheme_name"
+    "test_template"
+  ];
+
+  meta = with lib; {
+    description = "A MkDocs plugin supports for add Swagger UI in page";
+    homepage = "https://github.com/Blueswen/mkdocs-swagger-ui-tag";
+    changelog = "https://github.com/blueswen/mkdocs-swagger-ui-tag/blob/v${version}/CHANGELOG";
+    license = licenses.mit;
+    maintainers = with maintainers; [ snpschaaf ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mkdocs/default.nix b/nixpkgs/pkgs/development/python-modules/mkdocs/default.nix
new file mode 100644
index 000000000000..61c8bdcd13c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocs/default.nix
@@ -0,0 +1,90 @@
+{
+  # eval time deps
+  lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# buildtime
+, hatchling
+
+# runtime deps
+, click
+, ghp-import
+, importlib-metadata
+, jinja2
+, markdown
+, markupsafe
+, mergedeep
+, packaging
+, pathspec
+, platformdirs
+, pyyaml
+, pyyaml-env-tag
+, watchdog
+
+# testing deps
+, babel
+, mock
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mkdocs";
+  version = "1.5.2";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-9sV1bewsHVJEc2kTyGxDM6SjDTEKEc/HSY6gWBC5tvE=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    click
+    ghp-import
+    jinja2
+    markdown
+    markupsafe
+    mergedeep
+    packaging
+    pathspec
+    platformdirs
+    pyyaml
+    pyyaml-env-tag
+    watchdog
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+    babel
+    mock
+  ];
+
+  unittestFlagsArray = [ "-v" "-p" "'*tests.py'" "mkdocs" ];
+
+  pythonImportsCheck = [ "mkdocs" ];
+
+  meta = with lib; {
+    description = "Project documentation with Markdown / static website generator";
+    longDescription = ''
+      MkDocs is a fast, simple and downright gorgeous static site generator that's
+      geared towards building project documentation. Documentation source files
+      are written in Markdown, and configured with a single YAML configuration file.
+
+      MkDocs can also be used to generate general-purpose websites.
+    '';
+    homepage = "http://mkdocs.org/";
+    license = licenses.bsd2;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ rkoe ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mkdocstrings-python/default.nix b/nixpkgs/pkgs/development/python-modules/mkdocstrings-python/default.nix
new file mode 100644
index 000000000000..212eded518eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocstrings-python/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, griffe
+, mkdocs-material
+, mkdocstrings
+, pdm-backend
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mkdocstrings-python";
+  version = "1.7.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "mkdocstrings";
+    repo = "python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-PfAdECR80kYgvaaL+09zsqOeWa8z4pSnORNFnj+/l7M=";
+  };
+
+  nativeBuildInputs = [
+    pdm-backend
+  ];
+
+  propagatedBuildInputs = [
+    griffe
+    mkdocstrings
+  ];
+
+  nativeCheckInputs = [
+    mkdocs-material
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mkdocstrings_handlers"
+  ];
+
+  meta = with lib; {
+    description = "Python handler for mkdocstrings";
+    homepage = "https://github.com/mkdocstrings/python";
+    changelog = "https://github.com/mkdocstrings/python/blob/${version}/CHANGELOG.md";
+    license = licenses.isc;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mkdocstrings/default.nix b/nixpkgs/pkgs/development/python-modules/mkdocstrings/default.nix
new file mode 100644
index 000000000000..d8fb50f586b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkdocstrings/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, jinja2
+, markdown
+, markupsafe
+, mkdocs
+, mkdocs-autorefs
+, pymdown-extensions
+, pytestCheckHook
+, pdm-backend
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mkdocstrings";
+  version = "0.23.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mkdocstrings";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-t7wxm600XgYl1jsqjOpZdWcmqR9qafdKTaz/xDPdDPY=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'dynamic = ["version"]' 'version = "${version}"' \
+      --replace 'license = "ISC"' 'license = {text = "ISC"}'
+  '';
+
+  nativeBuildInputs = [
+    pdm-backend
+  ];
+
+  propagatedBuildInputs = [
+    jinja2
+    markdown
+    markupsafe
+    mkdocs
+    mkdocs-autorefs
+    pymdown-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mkdocstrings"
+  ];
+
+  disabledTestPaths = [
+    # Circular dependencies
+    "tests/test_extension.py"
+  ];
+
+  disabledTests = [
+    # Not all requirements are available
+    "test_disabling_plugin"
+    # Circular dependency on mkdocstrings-python
+    "test_extended_templates"
+  ];
+
+  meta = with lib; {
+    description = "Automatic documentation from sources for MkDocs";
+    homepage = "https://github.com/mkdocstrings/mkdocstrings";
+    changelog = "https://github.com/mkdocstrings/mkdocstrings/blob/${version}/CHANGELOG.md";
+    license = licenses.isc;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mkl-service/default.nix b/nixpkgs/pkgs/development/python-modules/mkl-service/default.nix
new file mode 100644
index 000000000000..ef62dc1398a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mkl-service/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub, cython, mkl, nose, six }:
+
+buildPythonPackage rec {
+  pname = "mkl-service";
+  version = "2.4.0.post1";
+
+  src = fetchFromGitHub {
+    owner = "IntelPython";
+    repo = "mkl-service";
+    rev = "v${version}";
+    sha256 = "0ysjn8z1hkscb4cycbrvcb93r04w5793yylsy40h5dvjd04ns5jc";
+  };
+
+  MKLROOT = mkl;
+
+  nativeCheckInputs = [ nose ];
+  nativeBuildInputs = [ cython ];
+  propagatedBuildInputs = [ mkl six ];
+
+  meta = with lib; {
+    description = "Python hooks for Intel(R) Math Kernel Library runtime control settings";
+    homepage = "https://github.com/IntelPython/mkl-service";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bhipple ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ml-collections/default.nix b/nixpkgs/pkgs/development/python-modules/ml-collections/default.nix
new file mode 100644
index 000000000000..692bafc64a88
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ml-collections/default.nix
@@ -0,0 +1,53 @@
+{ absl-py
+, buildPythonPackage
+, contextlib2
+, fetchPypi
+, fetchurl
+, lib
+, pyyaml
+}:
+
+let
+  requirements = fetchurl {
+    url = "https://raw.githubusercontent.com/google/ml_collections/7f749a281c69f9d0b339c05ecb94b80d95029f25/requirements.txt";
+    sha256 = "1xb351hiscj4zmajfkql3swpacdp6lmz8iwdvwwdx2zqw9a62zps";
+  };
+  requirements-test = fetchurl {
+    url = "https://raw.githubusercontent.com/google/ml_collections/7f749a281c69f9d0b339c05ecb94b80d95029f25/requirements-test.txt";
+    sha256 = "0r457k2nrg5jkf093r0x29yf8xwy6l7jxi6al0fh7mmnfrhr9cb1";
+  };
+in
+buildPythonPackage rec {
+  pname = "ml-collections";
+  version = "0.1.1";
+
+  # ml-collections does not have any git release tags. See https://github.com/google/ml_collections/issues/8.
+  src = fetchPypi {
+    inherit version;
+    pname = "ml_collections";
+    hash = "sha256-P+/McuxDOqHl0yMHo+R0u7Z/QFvoFOpSohZr/J2+aMw=";
+  };
+
+  # The pypi source archive does not include requirements.txt or
+  # requirements-test.txt. See https://github.com/google/ml_collections/issues/7.
+  postPatch = ''
+    cp ${requirements} requirements.txt
+    cp ${requirements-test} requirements-test.txt
+  '';
+
+  propagatedBuildInputs = [ absl-py contextlib2 pyyaml ];
+
+  # The official test suite uses bazel. With pytestCheckHook there are name
+  # conflicts between files and tests have assumptions that are broken by the
+  # nix-build environment, eg. re module names and __file__ attributes.
+  doCheck = false;
+
+  pythonImportsCheck = [ "ml_collections" ];
+
+  meta = with lib; {
+    description = "ML Collections is a library of Python collections designed for ML usecases.";
+    homepage = "https://github.com/google/ml_collections";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ml-dtypes/default.nix b/nixpkgs/pkgs/development/python-modules/ml-dtypes/default.nix
new file mode 100644
index 000000000000..9b99c06ce40a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ml-dtypes/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, fetchpatch
+, setuptools
+, pybind11
+, numpy
+, pytestCheckHook
+, absl-py
+}:
+
+buildPythonPackage rec {
+  pname = "ml-dtypes";
+  version = "0.3.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "jax-ml";
+    repo = "ml_dtypes";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-tuqB5itrAkT2b76rgRAJaOeng4V83TzPu400DPYrdKU=";
+    # Since this upstream patch (https://github.com/jax-ml/ml_dtypes/commit/1bfd097e794413b0d465fa34f2eff0f3828ff521),
+    # the attempts to use the nixpkgs packaged eigen dependency have failed.
+    # Hence, we rely on the bundled eigen library.
+    fetchSubmodules = true;
+  };
+
+  patches = [
+    # See https://github.com/jax-ml/ml_dtypes/issues/106.
+    (fetchpatch {
+      url = "https://github.com/jax-ml/ml_dtypes/commit/c082a2df6bc0686b35c4b4a303fd1990485e181f.patch";
+      hash = "sha256-aVJy9vT00b98xOrJCdbCHSZBI3uyjafmN88Z2rjBS48=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "numpy~=1.21.2" "numpy" \
+      --replace "numpy~=1.23.3" "numpy" \
+      --replace "numpy~=1.26.0" "numpy" \
+      --replace "pybind11~=2.11.1" "pybind11" \
+      --replace "setuptools~=68.1.0" "setuptools"
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    pybind11
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    absl-py
+  ];
+
+  preCheck = ''
+    # remove src module, so tests use the installed module instead
+    mv ./ml_dtypes/tests ./tests
+    rm -rf ./ml_dtypes
+  '';
+
+  pythonImportsCheck = [
+    "ml_dtypes"
+  ];
+
+  meta = with lib; {
+    description = "A stand-alone implementation of several NumPy dtype extensions used in machine learning libraries";
+    homepage = "https://github.com/jax-ml/ml_dtypes";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ GaetanLepage samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mlflow/default.nix b/nixpkgs/pkgs/development/python-modules/mlflow/default.nix
new file mode 100644
index 000000000000..41ebc9545cef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mlflow/default.nix
@@ -0,0 +1,112 @@
+{ lib
+, alembic
+, buildPythonPackage
+, click
+, cloudpickle
+, databricks-cli
+, docker
+, entrypoints
+, fetchpatch
+, fetchPypi
+, flask
+, gitpython
+, gorilla
+, gunicorn
+, importlib-metadata
+, markdown
+, matplotlib
+, numpy
+, packaging
+, pandas
+, prometheus-flask-exporter
+, protobuf
+, python-dateutil
+, pythonOlder
+, pythonRelaxDepsHook
+, pyarrow
+, pytz
+, pyyaml
+, querystring_parser
+, requests
+, scikit-learn
+, scipy
+, shap
+, simplejson
+, sqlalchemy
+, sqlparse
+}:
+
+buildPythonPackage rec {
+  pname = "mlflow";
+  version = "2.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3q8PXydgjpUm1p//zKcMgirJDqKQpvPkuz36GyCbARE=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements/core-requirements.txt \
+      --replace "gunicorn<21" "gunicorn"
+  '';
+
+  # Remove currently broken dependency `shap`, a model explainability package.
+  # This seems quite unprincipled especially with tests not being enabled,
+  # but not mlflow has a 'skinny' install option which does not require `shap`.
+  nativeBuildInputs = [ pythonRelaxDepsHook ];
+  pythonRemoveDeps = [ "shap" ];
+  pythonRelaxDeps = [ "pytz" "pyarrow" ];
+
+  propagatedBuildInputs = [
+    alembic
+    click
+    cloudpickle
+    databricks-cli
+    docker
+    entrypoints
+    flask
+    gitpython
+    gorilla
+    gunicorn
+    importlib-metadata
+    markdown
+    matplotlib
+    numpy
+    packaging
+    pandas
+    prometheus-flask-exporter
+    protobuf
+    python-dateutil
+    pyarrow
+    pytz
+    pyyaml
+    querystring_parser
+    requests
+    scikit-learn
+    scipy
+    #shap
+    simplejson
+    sqlalchemy
+    sqlparse
+  ];
+
+  pythonImportsCheck = [
+    "mlflow"
+  ];
+
+  # no tests in PyPI dist
+  # run into https://stackoverflow.com/questions/51203641/attributeerror-module-alembic-context-has-no-attribute-config
+  # also, tests use conda so can't run on NixOS without buildFHSEnv
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Open source platform for the machine learning lifecycle";
+    homepage = "https://github.com/mlflow/mlflow";
+    changelog = "https://github.com/mlflow/mlflow/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ tbenst ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mlrose/default.nix b/nixpkgs/pkgs/development/python-modules/mlrose/default.nix
new file mode 100644
index 000000000000..72e2bf969c2a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mlrose/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, isPy27
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, scikit-learn
+, pytestCheckHook
+, pytest-randomly
+}:
+
+buildPythonPackage rec {
+  pname = "mlrose";
+  version = "1.3.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "gkhayes";
+    repo = "mlrose";
+    rev = "v${version}";
+    sha256 = "1dn43k3rcypj58ymcj849b37w66jz7fphw8842v6mlbij3x0rxfl";
+  };
+
+  patches = [
+    # Fixes compatibility with scikit-learn 0.24.1
+    (fetchpatch {
+      url = "https://github.com/gkhayes/mlrose/pull/55/commits/19caf8616fc194402678aa67917db334ad02852a.patch";
+      sha256 = "1nivz3bn21nd21bxbcl16a6jmy7y5j8ilz90cjmd0xq4v7flsahf";
+    })
+  ];
+
+  propagatedBuildInputs = [ scikit-learn ];
+  nativeCheckInputs = [ pytest-randomly pytestCheckHook ];
+
+  postPatch = ''
+    substituteInPlace setup.py --replace sklearn scikit-learn
+  '';
+
+  pythonImportsCheck = [ "mlrose" ];
+
+  # Fix random seed during tests
+  pytestFlagsArray = [ "--randomly-seed 0" ];
+
+  meta = with lib; {
+    description = "Machine Learning, Randomized Optimization and SEarch";
+    homepage    = "https://github.com/gkhayes/mlrose";
+    license     = licenses.bsd3;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mlxtend/default.nix b/nixpkgs/pkgs/development/python-modules/mlxtend/default.nix
new file mode 100644
index 000000000000..0da165ada2b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mlxtend/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, pytestCheckHook
+, scipy
+, numpy
+, scikit-learn
+, pandas
+, matplotlib
+, joblib
+}:
+
+buildPythonPackage rec {
+  pname = "mlxtend";
+  version = "0.22.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "rasbt";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-YLCNLpg2qrdFon0/gdggJd9XovHwRHAdleBFQc18qzE=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  # image tests download files over the network
+  pytestFlagsArray = [ "-sv" "--ignore=mlxtend/image" ];
+  # Fixed in master, but failing in release version
+  # see: https://github.com/rasbt/mlxtend/pull/721
+  disabledTests = [ "test_variance_explained_ratio" ];
+
+  propagatedBuildInputs = [
+    scipy
+    numpy
+    scikit-learn
+    pandas
+    matplotlib
+    joblib
+  ];
+
+  meta = with lib; {
+    description = "A library of Python tools and extensions for data science";
+    homepage = "https://github.com/rasbt/mlxtend";
+    license= licenses.bsd3;
+    maintainers = with maintainers; [ evax ];
+    platforms = platforms.unix;
+    # incompatible with nixpkgs scikit-learn version
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mmcif-pdbx/default.nix b/nixpkgs/pkgs/development/python-modules/mmcif-pdbx/default.nix
new file mode 100644
index 000000000000..05d43d54f25d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mmcif-pdbx/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mmcif-pdbx";
+  version = "2.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "Electrostatics";
+    repo = "mmcif_pdbx";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ymMQ/q4IMoq+B8RvIdL0aqolKxyE/4rnVfd4bUV5OUY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pdbx"
+  ];
+
+  meta = with lib; {
+    description = "Yet another version of PDBx/mmCIF Python implementation";
+    homepage = "https://github.com/Electrostatics/mmcif_pdbx";
+    changelog = "https://github.com/Electrostatics/mmcif_pdbx/releases/tag/v${version}";
+    license = licenses.cc0;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mmcv/default.nix b/nixpkgs/pkgs/development/python-modules/mmcv/default.nix
new file mode 100644
index 000000000000..923e40d02fcf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mmcv/default.nix
@@ -0,0 +1,125 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, torch
+, torchvision
+, opencv4
+, yapf
+, packaging
+, pillow
+, addict
+, ninja
+, which
+, pybind11
+, onnx
+, onnxruntime
+, scipy
+, pyturbojpeg
+, tifffile
+, lmdb
+, mmengine
+, symlinkJoin
+}:
+
+let
+  inherit (torch) cudaCapabilities cudaPackages cudaSupport;
+  inherit (cudaPackages) backendStdenv cudaVersion;
+
+  cuda-common-redist = with cudaPackages; [
+    cuda_cccl # <thrust/*>
+    libcublas # cublas_v2.h
+    libcusolver # cusolverDn.h
+    libcusparse # cusparse.h
+  ];
+
+  cuda-native-redist = symlinkJoin {
+    name = "cuda-native-redist-${cudaVersion}";
+    paths = with cudaPackages; [
+      cuda_cudart # cuda_runtime.h
+      cuda_nvcc
+    ] ++ cuda-common-redist;
+  };
+
+  cuda-redist = symlinkJoin {
+    name = "cuda-redist-${cudaVersion}";
+    paths = cuda-common-redist;
+  };
+
+in
+buildPythonPackage rec {
+  pname = "mmcv";
+  version = "2.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "open-mmlab";
+    repo = "mmcv";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-an78tRvx18zQ5Q0ca74r4Oe2gJ9F9OfWXLbuP2+rL68=";
+  };
+
+  preConfigure = ''
+    export MMCV_WITH_OPS=1
+  '' + lib.optionalString cudaSupport ''
+    export CC=${backendStdenv.cc}/bin/cc
+    export CXX=${backendStdenv.cc}/bin/c++
+    export TORCH_CUDA_ARCH_LIST="${lib.concatStringsSep ";" cudaCapabilities}"
+    export FORCE_CUDA=1
+  '';
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "cpu_use = 4" "cpu_use = $NIX_BUILD_CORES"
+  '';
+
+  preCheck = ''
+    # remove the conflicting source directory
+    rm -rf mmcv
+  '';
+
+  # test_cnn test_ops really requires gpus to be useful.
+  # some of the tests take exceedingly long time.
+  # the rest of the tests are disabled due to sandbox env.
+  disabledTests = [
+    "test_cnn"
+    "test_ops"
+    "test_fileclient"
+    "test_load_model_zoo"
+    "test_processing"
+    "test_checkpoint"
+    "test_hub"
+    "test_reader"
+  ];
+
+  nativeBuildInputs = [ ninja which ]
+    ++ lib.optionals cudaSupport [ cuda-native-redist ];
+
+  buildInputs = [ pybind11 torch ] ++ lib.optionals cudaSupport [ cuda-redist ];
+
+  nativeCheckInputs = [ pytestCheckHook torchvision lmdb onnx onnxruntime scipy pyturbojpeg tifffile ];
+
+  propagatedBuildInputs = [
+    mmengine
+    torch
+    opencv4
+    yapf
+    packaging
+    pillow
+    addict
+  ];
+
+  pythonImportsCheck = [
+    "mmcv"
+  ];
+
+  meta = with lib; {
+    description = "A Foundational Library for Computer Vision Research";
+    homepage = "https://github.com/open-mmlab/mmcv";
+    changelog = "https://github.com/open-mmlab/mmcv/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ rxiao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mmengine/default.nix b/nixpkgs/pkgs/development/python-modules/mmengine/default.nix
new file mode 100644
index 000000000000..ff071c066954
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mmengine/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, addict
+, buildPythonPackage
+, coverage
+, fetchFromGitHub
+, lmdb
+, matplotlib
+, mlflow
+, numpy
+, opencv4
+, parameterized
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, rich
+, termcolor
+, torch
+, yapf
+}:
+
+buildPythonPackage rec {
+  pname = "mmengine";
+  version = "0.8.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "open-mmlab";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-kJhcw6Hpzx3s5WHeLTF8pydbAKXwfVgvxo7SsSN5gls=";
+  };
+
+  propagatedBuildInputs = [
+    addict
+    matplotlib
+    numpy
+    opencv4
+    pyyaml
+    rich
+    termcolor
+    yapf
+  ];
+
+  nativeCheckInputs = [
+    coverage
+    lmdb
+    mlflow
+    torch
+    parameterized
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  pythonImportsCheck = [
+    "mmengine"
+  ];
+
+  disabledTestPaths = [
+    # AttributeError
+    "tests/test_fileio/test_backends/test_petrel_backend.py"
+  ];
+
+  disabledTests = [
+    # Tests are disabled due to sandbox
+    "test_fileclient"
+    "test_http_backend"
+    "test_misc"
+    # RuntimeError
+    "test_dump"
+    "test_deepcopy"
+    "test_copy"
+    "test_lazy_import"
+    # AssertionError
+    "test_lazy_module"
+  ];
+
+  meta = with lib; {
+    description = "Library for training deep learning models based on PyTorch";
+    homepage = "https://github.com/open-mmlab/mmengine";
+    changelog = "https://github.com/open-mmlab/mmengine/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ rxiao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mmh3/default.nix b/nixpkgs/pkgs/development/python-modules/mmh3/default.nix
new file mode 100644
index 000000000000..73f38bbca258
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mmh3/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mmh3";
+  version = "4.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rYvmldxORKeWMXSLpVYtgD8KxC02prl6U6yoSnCAk4U=";
+  };
+
+  pythonImportsCheck = [
+    "mmh3"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for MurmurHash3, a set of fast and robust hash functions";
+    homepage = "https://github.com/hajimes/mmh3";
+    changelog = "https://github.com/hajimes/mmh3/blob/v${version}/CHANGELOG.md";
+    license = licenses.cc0;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mmpython/default.nix b/nixpkgs/pkgs/development/python-modules/mmpython/default.nix
new file mode 100644
index 000000000000..64c270ca0722
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mmpython/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+, isPyPy
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  version = "0.4.10";
+  pname = "mmpython";
+
+  src = fetchurl {
+    url = "https://sourceforge.net/projects/mmpython/files/latest/download";
+    sha256 = "1b7qfad3shgakj37gcj1b9h78j1hxlz6wp9k7h76pb4sq4bfyihy";
+    name = "${pname}-${version}.tar.gz";
+  };
+
+  disabled = isPyPy || isPy3k;
+
+  meta = with lib; {
+    description = "Media Meta Data retrieval framework";
+    homepage = "https://sourceforge.net/projects/mmpython/";
+    license = licenses.gpl2;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mmtf-python/default.nix b/nixpkgs/pkgs/development/python-modules/mmtf-python/default.nix
new file mode 100644
index 000000000000..197d0cf3e65b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mmtf-python/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msgpack
+, numpy
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mmtf-python";
+  version = "1.1.3";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-EqAv4bcTHworjORbRvHgzdKLmBj+RJlVTCaISYfqDDI=";
+  };
+
+  propagatedBuildInputs = [
+    msgpack
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  unittestFlagsArray = [
+    "-s mmtf/tests"
+    "-p \"*_tests.py\""
+  ];
+
+  pythonImportsCheck = [
+    "mmtf"
+  ];
+
+  meta = {
+    description = "The python implementation of the MMTF API, decoder and encoder";
+    homepage = "https://github.com/rcsb/mmtf-python";
+    changelog = "https://github.com/rcsb/mmtf-python/releases/tag/v${version}";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mne-python/default.nix b/nixpkgs/pkgs/development/python-modules/mne-python/default.nix
new file mode 100644
index 000000000000..940c633d4115
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mne-python/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, scipy
+, pytestCheckHook
+, pytest-timeout
+, h5py
+, matplotlib
+, nibabel
+, pandas
+, scikit-learn
+, decorator
+, jinja2
+, pooch
+, tqdm
+, setuptools
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mne-python";
+  version = "1.5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mne-tools";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-djVQkj8ktIOxe1xmi+XuIvdS1WdDzozgTJNJhWAhuBo=";
+  };
+
+  propagatedBuildInputs = [
+    decorator
+    jinja2
+    matplotlib
+    numpy
+    pooch
+    scipy
+    setuptools
+    tqdm
+  ];
+
+  nativeCheckInputs = [
+    h5py
+    nibabel
+    pandas
+    pytestCheckHook
+    scikit-learn
+    pytest-timeout
+  ];
+
+  preCheck = ''
+    export HOME=$TMP
+    export MNE_SKIP_TESTING_DATASET_TESTS=true
+    export MNE_SKIP_NETWORK_TESTS=1
+  '';
+
+  # All tests pass, but Pytest hangs afterwards - probably some thread hasn't terminated
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "mne"
+  ];
+
+  meta = with lib; {
+    description = "Magnetoencephelography and electroencephalography in Python";
+    homepage = "https://mne.tools";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mnemonic/default.nix b/nixpkgs/pkgs/development/python-modules/mnemonic/default.nix
new file mode 100644
index 000000000000..f040a1c1daff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mnemonic/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mnemonic";
+  version = "0.20";
+
+  src = fetchFromGitHub {
+    owner = "trezor";
+    repo = "python-${pname}";
+    rev = "v${version}";
+    hash = "sha256-YYgWlYfVd1iALOziaUI8uVYjJDCIVk/dXcUmJd2jcvQ=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "mnemonic" ];
+
+  meta = with lib; {
+    description = "Reference implementation of BIP-0039";
+    homepage = "https://github.com/trezor/python-mnemonic";
+    license = licenses.mit;
+    maintainers = with maintainers; [ np prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mnist/default.nix b/nixpkgs/pkgs/development/python-modules/mnist/default.nix
new file mode 100644
index 000000000000..2d0b158534bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mnist/default.nix
@@ -0,0 +1,36 @@
+{ buildPythonPackage, fetchFromGitHub, isPy27, lib, mock, numpy, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mnist";
+  version = "0.2.2";
+
+  src = fetchFromGitHub {
+    owner = "datapythonista";
+    repo = "mnist";
+    rev = "${pname}-${version}";
+    sha256 = "17r37pbxiv5dw857bmg990x836gq6sgww069w3q5jjg9m3xdm7dh";
+  };
+
+  propagatedBuildInputs = [ numpy ] ++ lib.optional isPy27 mock;
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  dontUseSetuptoolsCheck = true;
+
+  # disable tests which fail due to socket related errors
+  disabledTests = [
+    "test_test_images_has_right_size"
+    "test_test_labels_has_right_size"
+    "test_train_images_has_right_size"
+    "test_train_labels_has_right_size"
+  ];
+
+  meta = with lib; {
+    description = "Python utilities to download and parse the MNIST dataset";
+    homepage = "https://github.com/datapythonista/mnist";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ dmrauh ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/moat-ble/default.nix b/nixpkgs/pkgs/development/python-modules/moat-ble/default.nix
new file mode 100644
index 000000000000..2e55edd7aedb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/moat-ble/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, fetchFromGitHub
+, home-assistant-bluetooth
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "moat-ble";
+  version = "0.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-dy1Fm0Z1PUsPY8QTiXUcWSi+csFnTUsobSkA92m06QI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-sensor-state-data
+    home-assistant-bluetooth
+    sensor-state-data
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=moat_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "moat_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for Moat BLE devices";
+    homepage = "https://github.com/Bluetooth-Devices/moat-ble";
+    changelog = "https://github.com/Bluetooth-Devices/moat-ble/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mobi/default.nix b/nixpkgs/pkgs/development/python-modules/mobi/default.nix
new file mode 100644
index 000000000000..262e724a7b53
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mobi/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+
+, loguru
+, poetry-core
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "mobi";
+  version = "0.3.3";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "iscc";
+    repo = "mobi";
+    rev = "v${version}";
+    hash = "sha256-g1L72MkJdrKQRsEdew+Qsn8LfCn8+cmj2pmY6s4nv2U=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    loguru
+  ];
+
+  pythonImportsCheck = [
+    "mobi"
+  ];
+
+  meta = with lib; {
+    description = "Library for unpacking unencrypted mobi files";
+    homepage = "https://github.com/iscc/mobi";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ paveloom ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mobly/default.nix b/nixpkgs/pkgs/development/python-modules/mobly/default.nix
new file mode 100644
index 000000000000..73d4d7d3df99
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mobly/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# runtime
+, portpicker
+, pyserial
+, pyyaml
+, timeout-decorator
+, typing-extensions
+
+# tests
+, procps
+, pytestCheckHook
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "mobly";
+  version = "1.12.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = "mobly";
+    rev = "refs/tags/${version}";
+    hash = "sha256-leUOC8AQwbuPNphDg4bIFWW+9tTnYvM3/ejHgZDMR44=";
+  };
+
+  propagatedBuildInputs = [
+    portpicker
+    pyserial
+    pyyaml
+    timeout-decorator
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    procps
+    pytestCheckHook
+    pytz
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    changelog = "https://github.com/google/mobly/blob/${src.rev}/CHANGELOG.md";
+    description = "Automation framework for special end-to-end test cases";
+    homepage = "https://github.com/google/mobly";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mock-open/default.nix b/nixpkgs/pkgs/development/python-modules/mock-open/default.nix
new file mode 100644
index 000000000000..391ba29a98c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mock-open/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchFromGitHub, fetchpatch, pythonOlder, mock }:
+
+buildPythonPackage rec {
+  pname = "mock-open";
+  version = "1.4.0";
+
+  # no tests in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "nivbend";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0qlz4y8jqxsnmqg03yp9f87rmnjrvmxm5qvm6n1218gm9k5dixbm";
+  };
+
+  patches = lib.optional (pythonOlder "3.0")
+    (fetchpatch {
+      name = "ascii-only.patch";
+      url = "https://github.com/das-g/mock-open/commit/521ff260da127949fe4aceff1667cba223c5b07b.patch";
+      sha256 = "0ampbhk7kwkn0q5d2h9wrflkr8fji2bybmdck4qdzw1qkslfwwrn";
+    });
+
+  propagatedBuildInputs = lib.optional (pythonOlder "3.3") mock;
+
+  meta = with lib; {
+    homepage = "https://github.com/nivbend/mock-open";
+    description = "A better mock for file I/O";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mock-services/default.nix b/nixpkgs/pkgs/development/python-modules/mock-services/default.nix
new file mode 100644
index 000000000000..51f07960bb0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mock-services/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, attrs
+, funcsigs
+, requests-mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mock-services";
+  version = "0.3.1";
+
+  src = fetchFromGitHub {
+    owner = "peopledoc";
+    repo = "mock-services";
+    rev = version;
+    sha256 = "1rqyyfwngi1xsd9a81irjxacinkj1zf6nqfvfxhi55ky34x5phf9";
+  };
+
+  patches = [
+    # Fix issues due to internal API breaking in latest versions of requests-mock
+    (fetchpatch {
+      url = "https://github.com/peopledoc/mock-services/commit/88d3a0c9ef4dd7d5e011068ed2fdbbecc4a1a03a.patch";
+      sha256 = "0a4pwxr33kr525sp8q4mb4cr3n2b51mj2a3052lhg6brdbi4gnms";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    funcsigs
+    requests-mock
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # require networking
+    "test_real_http_1"
+    "test_restart_http_mock"
+    "test_start_http_mock"
+    "test_stop_http_mock"
+  ];
+
+  pythonImportsCheck = [ "mock_services" ];
+
+  meta = with lib; {
+    description = "Mock an entire service API based on requests-mock";
+    homepage = "https://github.com/peopledoc/mock-services";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mock-ssh-server/default.nix b/nixpkgs/pkgs/development/python-modules/mock-ssh-server/default.nix
new file mode 100644
index 000000000000..46608965c1c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mock-ssh-server/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, paramiko
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mock-ssh-server";
+  version = "0.9.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "carletes";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-yJd+WDidW5ouofytAKTlSiZhIQg2cLs8BvEp15qwtjo=";
+  };
+
+  propagatedBuildInputs = [
+    paramiko
+  ];
+
+  # Tests are running into a timeout on Hydra, they work locally
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "mockssh"
+  ];
+
+  meta = with lib; {
+    description = "Python mock SSH server for testing purposes";
+    homepage = "https://github.com/carletes/mock-ssh-server";
+    changelog = "https://github.com/carletes/mock-ssh-server/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mock/default.nix b/nixpkgs/pkgs/development/python-modules/mock/default.nix
new file mode 100644
index 000000000000..7e5a72a47fad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mock/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mock";
+  version = "5.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Xpaq1czaRxjgointlLICTfdcwtVVdbpXYtMfV2e4dn0=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mock"
+  ];
+
+  meta = with lib; {
+    description = "Rolling backport of unittest.mock for all Pythons";
+    homepage = "https://github.com/testing-cabal/mock";
+    changelog = "https://github.com/testing-cabal/mock/blob/${version}/CHANGELOG.rst";
+    license = licenses.bsd2;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mocket/default.nix b/nixpkgs/pkgs/development/python-modules/mocket/default.nix
new file mode 100644
index 000000000000..41789a796dd1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mocket/default.nix
@@ -0,0 +1,115 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, stdenv
+
+# build-system
+, hatchling
+
+# dependencies
+, decorator
+, httptools
+, python-magic
+, urllib3
+
+# optional-dependencies
+, xxhash
+, pook
+
+# tests
+, aiohttp
+, asgiref
+, fastapi
+, gevent
+, httpx
+, pytest-asyncio
+, pytestCheckHook
+, redis
+, redis-server
+, requests
+, sure
+
+}:
+
+buildPythonPackage rec {
+  pname = "mocket";
+  version = "3.12.0";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-brvBWwTWT2F/usVBRr7wz9L0kct4X1Fddl4mu5LUENA=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    decorator
+    httptools
+    python-magic
+    urllib3
+  ];
+
+  passthru.optional-dependencies = {
+    pook = [
+      pook
+    ];
+    speedups = [
+      xxhash
+    ];
+  };
+
+  nativeCheckInputs = [
+    asgiref
+    fastapi
+    gevent
+    httpx
+    pytest-asyncio
+    pytestCheckHook
+    redis
+    requests
+    sure
+  ] ++ lib.optionals (pythonOlder "3.12") [
+    aiohttp
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  preCheck = lib.optionalString stdenv.isLinux ''
+    ${redis-server}/bin/redis-server &
+    REDIS_PID=$!
+  '';
+
+  postCheck = lib.optionalString stdenv.isLinux ''
+    kill $REDIS_PID
+  '';
+
+  # Skip http tests, they require network access
+  env.SKIP_TRUE_HTTP = true;
+
+  _darwinAllowLocalNetworking = true;
+
+  disabledTests = [
+    # tests that require network access (like DNS lookups)
+    "test_truesendall_with_dump_from_recording"
+    "test_asyncio_record_replay"
+    "test_gethostbyname"
+  ];
+
+  disabledTestPaths = lib.optionals stdenv.isDarwin [
+    "tests/main/test_redis.py"
+  ];
+
+  pythonImportsCheck = [
+    "mocket"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/mindflayer/python-mocket/releases/tag/${version}";
+    description = "A socket mock framework for all kinds of sockets including web-clients";
+    homepage = "https://github.com/mindflayer/python-mocket";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mockfs/default.nix b/nixpkgs/pkgs/development/python-modules/mockfs/default.nix
new file mode 100644
index 000000000000..234a3d14d696
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mockfs/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, wheel
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mockfs";
+  version = "1.1.4";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "mockfs";
+    repo = "mockfs";
+    rev = "v${version}";
+    hash = "sha256-JwSkOI0dz9ZetfE0ZL3CthvcCSXGFYX+yQZy/oC6VBk=";
+  };
+
+  postPatch = ''
+    sed -i '/addopts/d' pytest.ini
+  '';
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  pythonImportsCheck = [ "mockfs" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A simple mock filesystem for use in unit tests";
+    homepage = "https://github.com/mockfs/mockfs";
+    changelog = "https://github.com/mockfs/mockfs/blob/${src.rev}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mockito/default.nix b/nixpkgs/pkgs/development/python-modules/mockito/default.nix
new file mode 100644
index 000000000000..981665f7b03a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mockito/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, funcsigs, pytest, numpy }:
+
+buildPythonPackage rec {
+  version = "1.4.0";
+  pname = "mockito";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QJq2BMnr4bt9wY7GsO2YqK1RJ7CCc/WASyL00bUeUiI=";
+  };
+
+  propagatedBuildInputs = lib.optionals (!isPy3k) [ funcsigs ];
+  nativeCheckInputs = [ pytest numpy ];
+
+  # tests are no longer packaged in pypi tarball
+  doCheck = false;
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Spying framework";
+    homepage = "https://github.com/kaste/mockito-python";
+    license = licenses.mit;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mockupdb/default.nix b/nixpkgs/pkgs/development/python-modules/mockupdb/default.nix
new file mode 100644
index 000000000000..e06b1637b685
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mockupdb/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pymongo
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mockupdb";
+  version = "1.8.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-020OW2RF/5FB400BL6K13+WJhHqh4+y413QHSWKvlE4=";
+  };
+
+  propagatedBuildInputs = [
+    pymongo
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mockupdb"
+  ];
+
+  disabledTests = [
+    # AssertionError: expected to receive Request(), got nothing
+    "test_flags"
+    "test_iteration"
+    "test_ok"
+    "test_ssl_basic"
+    "test_unix_domain_socket"
+  ];
+
+  meta = with lib; {
+    description = "Simulate a MongoDB server";
+    license = licenses.asl20;
+    homepage = "https://github.com/ajdavis/mongo-mockup-db";
+    maintainers = with maintainers; [ globin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/moddb/default.nix b/nixpkgs/pkgs/development/python-modules/moddb/default.nix
new file mode 100644
index 000000000000..a0205d5c4676
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/moddb/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonRelaxDepsHook
+, beautifulsoup4
+, pyrate-limiter
+, requests
+, toolz
+}:
+
+buildPythonPackage rec {
+  pname = "moddb";
+  version = "0.9.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "ClementJ18";
+    repo = "moddb";
+    rev = "v${version}";
+    hash = "sha256-2t5QQAmSLOrdNCl0XdsFPdP2UF10/qq69DovqeQ1Vt8=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    pyrate-limiter
+    requests
+    toolz
+  ];
+
+  pythonRelaxDeps = true;
+
+  pythonImportsCheck = [ "moddb" ];
+
+  doCheck = false; # Tests try to access the internet.
+
+
+  meta = with lib; {
+    description = "A Python scrapper to access ModDB mods, games and more as objects";
+    homepage = "https://github.com/ClementJ18/moddb";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kranzes ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/model-bakery/default.nix b/nixpkgs/pkgs/development/python-modules/model-bakery/default.nix
new file mode 100644
index 000000000000..a5b38b525f7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/model-bakery/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, django
+, pytestCheckHook
+, pythonOlder
+, pytest-django
+}:
+
+buildPythonPackage rec {
+  pname = "model-bakery";
+  version = "1.17.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "model-bakers";
+    repo = "model_bakery";
+    rev = "refs/tags/${version}";
+    hash = "sha256-o3BI2lMwctR9tiGmY07dAOQUfv9K4rWkc/xI6uHnVfs=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  nativeCheckInputs = [
+    pytest-django
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "model_bakery"
+  ];
+
+  meta = with lib; {
+    description = "Object factory for Django";
+    homepage = "https://github.com/model-bakers/model_bakery";
+    changelog = "https://github.com/model-bakers/model_bakery/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/modelcif/default.nix b/nixpkgs/pkgs/development/python-modules/modelcif/default.nix
new file mode 100644
index 000000000000..e3bfea707429
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/modelcif/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, wheel
+, ihm
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "modelcif";
+  version = "0.9";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "ihmwg";
+    repo = "python-modelcif";
+    rev = "refs/tags/${version}";
+    hash = "sha256-u+e2QtG6gO1e31OzPfAuzfCkwZymEZMxa2p0haYplAk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    ihm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # require network access
+    "test_validate_mmcif_example"
+    "test_validate_modbase_example"
+  ];
+
+  pythonImportsCheck = [ "modelcif" ];
+
+  meta = with lib; {
+    description = "Python package for handling ModelCIF mmCIF and BinaryCIF files";
+    homepage = "https://github.com/ihmwg/python-modelcif";
+    changelog = "https://github.com/ihmwg/python-modelcif/blob/${src.rev}/ChangeLog.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/modeled/default.nix b/nixpkgs/pkgs/development/python-modules/modeled/default.nix
new file mode 100644
index 000000000000..f9b94a05065e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/modeled/default.nix
@@ -0,0 +1,37 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, zetup
+, six
+, moretools
+, path
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "modeled";
+  version = "0.1.8";
+
+  src = fetchPypi {
+    extension = "zip";
+    inherit pname version;
+    sha256 = "1wcl3r02q10gxy4xw7g8x2wg2sx4sbawzbfcl7a5xdydrxl4r4v4";
+  };
+
+  buildInputs = [ zetup ];
+
+  propagatedBuildInputs = [ six moretools path ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "modeled" ];
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    description = "Universal data modeling for Python";
+    homepage = "https://github.com/modeled/modeled";
+    license = licenses.lgpl3Only;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/moderngl/default.nix b/nixpkgs/pkgs/development/python-modules/moderngl/default.nix
new file mode 100644
index 000000000000..60a1374d9ae8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/moderngl/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, libGL
+, libX11
+, glcontext
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "moderngl";
+  version = "5.8.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-tmwY1/SrepS+P5655MpoNurR2lAtYugbf3pIFQ4u05E=";
+  };
+
+  buildInputs = [
+    libGL
+    libX11
+  ];
+
+  propagatedBuildInputs = [
+    glcontext
+  ];
+
+  # Tests need a display to run.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "moderngl"
+  ];
+
+  meta = with lib; {
+    description = "High performance rendering for Python";
+    homepage = "https://github.com/moderngl/moderngl";
+    changelog = "https://github.com/moderngl/moderngl/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ c0deaddict ];
+    # should be mesaPlatforms, darwin build breaks.
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/moderngl_window/default.nix b/nixpkgs/pkgs/development/python-modules/moderngl_window/default.nix
new file mode 100644
index 000000000000..f4e1d6a04de5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/moderngl_window/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, glfw
+, moderngl
+, numpy
+, pillow
+, pygame
+, pyglet
+, pyqt5
+, pyrr
+, pysdl2
+, pyside2
+, pythonOlder
+, scipy
+, trimesh
+}:
+
+buildPythonPackage rec {
+  pname = "moderngl-window";
+  version = "2.4.5";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "moderngl";
+    repo = "moderngl_window";
+    rev = "refs/tags/${version}";
+    hash = "sha256-OfvIxezeZyuv5LLbe+4o1X2UCGnXT2DNvAF7t2Isw6Y=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    moderngl
+    pyglet
+    pillow
+    pyrr
+  ];
+
+  passthru.optional-dependencies = {
+    trimesh = [
+      trimesh
+      scipy
+    ];
+    glfw = [
+      glfw
+    ];
+    pygame = [
+      pygame
+    ];
+    PySDL2 = [
+      pysdl2
+    ];
+    PySide2 = [
+      pyside2
+    ];
+    pyqt5 = [
+      pyqt5
+    ];
+  };
+
+  # Tests need a display to run.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "moderngl_window"
+  ];
+
+  meta = with lib; {
+    description = "Cross platform helper library for ModernGL making window creation and resource loading simple";
+    homepage = "https://github.com/moderngl/moderngl-window";
+    changelog = "https://github.com/moderngl/moderngl-window/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ c0deaddict ];
+    platforms = platforms.mesaPlatforms;
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/modestmaps/default.nix b/nixpkgs/pkgs/development/python-modules/modestmaps/default.nix
new file mode 100644
index 000000000000..202589b7435c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/modestmaps/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pillow
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "ModestMaps";
+  version = "1.4.7";
+  disabled = !isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "698442a170f02923f8ea55f18526b56c17178162e44304f896a8a5fd65ab4457";
+  };
+
+  propagatedBuildInputs = [ pillow ];
+
+  meta = with lib; {
+    description = "A library for building interactive maps";
+    homepage = "http://modestmaps.com";
+    license = licenses.bsd3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mohawk/default.nix b/nixpkgs/pkgs/development/python-modules/mohawk/default.nix
new file mode 100644
index 000000000000..ae57d8fbf84c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mohawk/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, mock, nose, pytest, six }:
+
+buildPythonPackage rec {
+  pname = "mohawk";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "08wppsv65yd0gdxy5zwq37yp6jmxakfz4a2yx5wwq2d222my786j";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  nativeCheckInputs = [ mock nose pytest ];
+
+  checkPhase = ''
+    pytest mohawk/tests.py
+  '';
+
+  meta = {
+    description = "Python library for Hawk HTTP authorization.";
+    homepage = "https://github.com/kumar303/mohawk";
+    license = lib.licenses.mpl20;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/molecule/default.nix b/nixpkgs/pkgs/development/python-modules/molecule/default.nix
new file mode 100644
index 000000000000..e62ee8fb29db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/molecule/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ansible-compat
+, ansible-core
+, click-help-colors
+, enrich
+, jsonschema
+, withPlugins ? true, molecule-plugins
+, packaging
+, pluggy
+, rich
+, setuptools
+, setuptools-scm
+, yamllint
+, wcmatch
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "molecule";
+  version = "6.0.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uRk1P3mXRt5gsWonV1YneD45wmj98vKqA3LwFix7VHg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    ansible-compat
+    ansible-core
+    click-help-colors
+    enrich
+    jsonschema
+    packaging
+    pluggy
+    rich
+    yamllint
+    wcmatch
+  ] ++ lib.optional withPlugins molecule-plugins;
+
+  pythonImportsCheck = [ "molecule" ];
+
+  # tests can't be easily run without installing things from ansible-galaxy
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Molecule aids in the development and testing of Ansible roles";
+    homepage = "https://github.com/ansible-community/molecule";
+    maintainers = with maintainers; [ dawidd6 ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/molecule/plugins.nix b/nixpkgs/pkgs/development/python-modules/molecule/plugins.nix
new file mode 100644
index 000000000000..af36fe3bb60c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/molecule/plugins.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonRelaxDepsHook
+, setuptools-scm
+, python-vagrant
+, docker
+}:
+
+buildPythonPackage rec {
+  pname = "molecule-plugins";
+  version = "23.5.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8T6gR7hlDIkmBLgbdjgryAu0riXqULI/MOgf2dWAKv8=";
+  };
+
+  # reverse the dependency
+  pythonRemoveDeps = [
+    "molecule"
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    setuptools-scm
+  ];
+
+  passthru.optional-dependencies = {
+    docker = [
+      docker
+    ];
+    vagrant = [
+      python-vagrant
+    ];
+  };
+
+  pythonImportsCheck = [ "molecule_plugins" ];
+
+  # Tests require container runtimes
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Collection on molecule plugins";
+    homepage = "https://github.com/ansible-community/molecule-plugins";
+    maintainers = with maintainers; [ dawidd6 ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/monai-deploy/default.nix b/nixpkgs/pkgs/development/python-modules/monai-deploy/default.nix
new file mode 100644
index 000000000000..e3a4f2418d16
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/monai-deploy/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, pytest-lazy-fixture
+, numpy
+, networkx
+, pydicom
+, colorama
+, typeguard
+, versioneer
+}:
+
+buildPythonPackage rec {
+  pname = "monai-deploy";
+  version = "0.5.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Project-MONAI";
+    repo = "monai-deploy-app-sdk";
+    rev = "refs/tags/${version}";
+    hash = "sha256-a5WtU+1XjsYsXB/uZS8ufE0fOOWDf+Wy7mOX2xPEQEg=";
+  };
+
+  postPatch = ''
+    # Asked in https://github.com/Project-MONAI/monai-deploy-app-sdk/issues/450
+    # if this patch can be incorporated upstream.
+    substituteInPlace pyproject.toml --replace 'versioneer-518' 'versioneer'
+  '';
+
+  nativeBuildInputs = [ versioneer ];
+
+  propagatedBuildInputs = [
+    numpy
+    networkx
+    colorama
+    typeguard
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook pytest-lazy-fixture ];
+  disabledTests = [
+    # requires Docker daemon:
+    "test_packager"
+  ];
+  pythonImportsCheck = [
+    "monai.deploy"
+    "monai.deploy.core"
+    # "monai.deploy.operators" should be imported as well but
+    # requires some "optional" dependencies
+    # like highdicom (which is not packaged yet) and pydicom
+  ];
+
+  meta = with lib; {
+    description = "Framework and tools to design, develop and verify AI applications in healthcare imaging";
+    homepage = "https://monai.io/deploy.html";
+    license = licenses.asl20;
+    maintainers = [ maintainers.bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/monai/default.nix b/nixpkgs/pkgs/development/python-modules/monai/default.nix
new file mode 100644
index 000000000000..c2e27b23d039
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/monai/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, ninja
+, ignite
+, numpy
+, pybind11
+, torch
+, which
+}:
+
+buildPythonPackage rec {
+  pname = "monai";
+  version = "1.3.0";
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Project-MONAI";
+    repo = "MONAI";
+    rev = "refs/tags/${version}";
+    hash = "sha256-h//igmSV1cPAFifE1woIluSyGwZBRByYMLqeY3oLHnk=";
+  };
+
+  # Ninja is not detected by setuptools for some reason even though it's present:
+  postPatch = ''
+    substituteInPlace "setup.cfg" --replace "    ninja" ""
+  '';
+
+  preBuild = ''
+    export MAX_JOBS=$NIX_BUILD_CORES;
+  '';
+
+  nativeBuildInputs = [ ninja which ];
+  buildInputs = [ pybind11 ];
+  propagatedBuildInputs = [ numpy torch ignite ];
+
+  BUILD_MONAI = 1;
+
+  doCheck = false;  # takes too long; tries to download data
+
+  pythonImportsCheck = [
+    "monai"
+    "monai.apps"
+    "monai.data"
+    "monai.engines"
+    "monai.handlers"
+    "monai.inferers"
+    "monai.losses"
+    "monai.metrics"
+    "monai.optimizers"
+    "monai.networks"
+    "monai.transforms"
+    "monai.utils"
+    "monai.visualize"
+  ];
+
+  meta = with lib; {
+    description = "Pytorch framework (based on Ignite) for deep learning in medical imaging";
+    homepage = "https://github.com/Project-MONAI/MONAI";
+    changelog = "https://github.com/Project-MONAI/MONAI/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = [ maintainers.bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/monero/default.nix b/nixpkgs/pkgs/development/python-modules/monero/default.nix
new file mode 100644
index 000000000000..adc34fa17360
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/monero/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pycryptodomex
+, pysocks
+, pynacl
+, requests
+, six
+, varint
+, pytestCheckHook
+, pytest-cov
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "monero";
+  version = "1.1.1";
+
+  src = fetchFromGitHub {
+    owner = "monero-ecosystem";
+    repo = "monero-python";
+    rev = "v${version}";
+    hash = "sha256-WIF3pFBOLgozYTrQHLzIRgSlT3dTZTe+7sF/dVjVdTo=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace 'pynacl~=1.4' 'pynacl>=1.4' \
+      --replace 'ipaddress' ""
+  '';
+
+  pythonImportsCheck = [ "monero" ];
+
+  propagatedBuildInputs = [
+    pycryptodomex
+    pynacl
+    pysocks
+    requests
+    six
+    varint
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook pytest-cov responses ];
+
+  meta = with lib; {
+    description = "Comprehensive Python module for handling Monero";
+    homepage = "https://github.com/monero-ecosystem/monero-python";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mongodict/default.nix b/nixpkgs/pkgs/development/python-modules/mongodict/default.nix
new file mode 100644
index 000000000000..c2fbd6a7ad1b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mongodict/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pymongo
+}:
+
+buildPythonPackage rec {
+  pname = "mongodict";
+  version = "0.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0nv5amfs337m0gbxpjb0585s20rndqfc3mfrzq1iwgnds5gxcrlw";
+  };
+
+  propagatedBuildInputs = [ pymongo ];
+
+  meta = with lib; {
+    description = "MongoDB-backed Python dict-like interface";
+    homepage = "https://github.com/turicas/mongodict/";
+    license = licenses.gpl3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mongoengine/default.nix b/nixpkgs/pkgs/development/python-modules/mongoengine/default.nix
new file mode 100644
index 000000000000..c4b7b7135e2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mongoengine/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pymongo
+, isPy27
+, six
+, blinker
+, nose
+, pillow
+, coverage
+}:
+
+buildPythonPackage rec {
+  pname = "mongoengine";
+  version = "0.27.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "MongoEngine";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-UCd7RpsSNDKh3vgVRYrFYWYVLQuK7WI0n/Moukhq5dM=";
+  };
+
+  propagatedBuildInputs = [
+    pymongo
+    six
+  ];
+
+  nativeCheckInputs = [
+    nose
+    pillow
+    coverage
+    blinker
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "coverage==4.2" "coverage" \
+      --replace "pymongo>=3.4,<=4.0" "pymongo"
+  '';
+
+  # tests require mongodb running in background
+  doCheck = false;
+
+  pythonImportsCheck = [ "mongoengine" ];
+
+  meta = with lib; {
+    description = "MongoEngine is a Python Object-Document Mapper for working with MongoDB";
+    homepage = "http://mongoengine.org/";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mongomock/default.nix b/nixpkgs/pkgs/development/python-modules/mongomock/default.nix
new file mode 100644
index 000000000000..5e66ad42197c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mongomock/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, packaging
+, pbr
+, pytestCheckHook
+, pythonOlder
+, sentinels
+}:
+
+buildPythonPackage rec {
+  pname = "mongomock";
+  version = "4.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8GzWKvuK4+9jujE0mr0iCmV+8N1PAkOilYfFIT+TG30=";
+  };
+
+  nativeBuildInputs = [
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+    sentinels
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mongomock"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mongomock/mongomock";
+    description = "Fake pymongo stub for testing simple MongoDB-dependent code";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mongoquery/default.nix b/nixpkgs/pkgs/development/python-modules/mongoquery/default.nix
new file mode 100644
index 000000000000..c6034ce27614
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mongoquery/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "mongoquery";
+  version = "1.4.2";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bd19fc465f0aa9feb3070f144fde41fc68cf28ea32dd3b7565f7df3ab6fc0ac2";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  pythonImportsCheck = [
+    "mongoquery"
+  ];
+
+  meta = with lib; {
+    description = "A python implementation of mongodb queries";
+    homepage = "https://github.com/kapouille/mongoquery";
+    license = with licenses; [ unlicense ];
+    maintainers = with maintainers; [ misuzu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/monkeyhex/default.nix b/nixpkgs/pkgs/development/python-modules/monkeyhex/default.nix
new file mode 100644
index 000000000000..7c10ad743f9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/monkeyhex/default.nix
@@ -0,0 +1,30 @@
+{ buildPythonPackage
+, fetchPypi
+, future
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "monkeyhex";
+  version = "1.7.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a646096dd3114ee8a7c6f30363f38c288ec56c4e032c8fc7e681792b604dd122";
+  };
+
+  propagatedBuildInputs = [ future ];
+
+  # No tests in repo.
+  doCheck = false;
+
+  # Verify import still works.
+  pythonImportsCheck = [ "monkeyhex" ];
+
+  meta = with lib; {
+    description = "A small library to assist users of the python shell who work in contexts where printed numbers are more usefully viewed in hexadecimal";
+    homepage = "https://github.com/rhelmot/monkeyhex";
+    license = licenses.mit;
+    maintainers = [ maintainers.pamplemousse ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/monotonic/default.nix b/nixpkgs/pkgs/development/python-modules/monotonic/default.nix
new file mode 100644
index 000000000000..512e86b0d2e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/monotonic/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "monotonic";
+  version = "1.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3a55207bcfed53ddd5c5bae174524062935efed17792e9de2ad0205ce9ad63f7";
+  };
+
+  __propagatedImpureHostDeps = lib.optional stdenv.isDarwin "/usr/lib/libc.dylib";
+
+  patchPhase = lib.optionalString stdenv.isLinux ''
+    substituteInPlace monotonic.py --replace \
+      "ctypes.util.find_library('c')" "'${stdenv.cc.libc}/lib/libc.so'"
+  '';
+
+  meta = with lib; {
+    description = "An implementation of time.monotonic() for Python 2 & < 3.3";
+    homepage = "https://github.com/atdt/monotonic";
+    license = licenses.asl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/monty/default.nix b/nixpkgs/pkgs/development/python-modules/monty/default.nix
new file mode 100644
index 000000000000..cebb9c382c7c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/monty/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, msgpack
+, numpy
+, pandas
+, pydantic
+, pymongo
+, pytestCheckHook
+, pythonOlder
+, ruamel-yaml
+, torch
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "monty";
+  version = "2023.9.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "materialsvirtuallab";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-VzOu0gLQcobWQs8uMFzI4CyN+1OVx94VqhJYB+rMpMI=";
+  };
+
+  postPatch = ''
+    substituteInPlace tests/test_os.py \
+      --replace 'self.assertEqual("/usr/bin/find", which("/usr/bin/find"))' '#'
+  '';
+
+  propagatedBuildInputs = [
+    msgpack
+    ruamel-yaml
+    tqdm
+  ];
+
+  nativeCheckInputs = [
+    numpy
+    pandas
+    pydantic
+    pymongo
+    pytestCheckHook
+    torch
+  ];
+
+  pythonImportsCheck = [
+    "monty"
+  ];
+
+  disabledTests = [
+    # Test file was removed and re-added after 2022.9.9
+    "test_reverse_readfile_gz"
+    "test_Path_objects"
+    "test_zopen"
+    "test_zpath"
+  ];
+
+  meta = with lib; {
+    description = "Serves as a complement to the Python standard library by providing a suite of tools to solve many common problems";
+    longDescription = "
+      Monty implements supplementary useful functions for Python that are not part of the
+      standard library. Examples include useful utilities like transparent support for zipped files, useful design
+      patterns such as singleton and cached_class, and many more.
+    ";
+    homepage = "https://github.com/materialsvirtuallab/monty";
+    changelog = "https://github.com/materialsvirtuallab/monty/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/moonraker-api/default.nix b/nixpkgs/pkgs/development/python-modules/moonraker-api/default.nix
new file mode 100644
index 000000000000..9a0437ea056f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/moonraker-api/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "moonraker-api";
+  version = "2.0.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "cmroche";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-PgFsXmdAmHXK0wZ6xLTu94RdME1L2H1Mb6V+qFlGXSk=";
+  };
+
+  postPatch = ''
+    # see comment on https://github.com/cmroche/moonraker-api/commit/e5ca8ab60d2839e150a81182fbe65255d84b4e4e
+    substituteInPlace setup.py \
+      --replace 'name="moonraker-api",' 'name="moonraker-api",version="${version}",'
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "moonraker_api"
+  ];
+
+  meta = with lib; {
+    description = "Python API for the Moonraker API";
+    homepage = "https://github.com/cmroche/moonraker-api";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mopeka-iot-ble/default.nix b/nixpkgs/pkgs/development/python-modules/mopeka-iot-ble/default.nix
new file mode 100644
index 000000000000..a5bb698aa1af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mopeka-iot-ble/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, bluetooth-data-tools
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, fetchFromGitHub
+, home-assistant-bluetooth
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "mopeka-iot-ble";
+  version = "0.5.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bluetooth-devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-m27As3tB77JbgY0kDDJ6kmYFTv2O/Sh6y9tFiKDIjbI=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=mopeka_iot_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-data-tools
+    bluetooth-sensor-state-data
+    home-assistant-bluetooth
+    sensor-state-data
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mopeka_iot_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for Mopeka IoT BLE devices";
+    homepage = "https://github.com/bluetooth-devices/mopeka-iot-ble";
+    changelog = "https://github.com/Bluetooth-Devices/mopeka-iot-ble/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/more-itertools/default.nix b/nixpkgs/pkgs/development/python-modules/more-itertools/default.nix
new file mode 100644
index 000000000000..df3804095665
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/more-itertools/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, pytestCheckHook
+, six
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "more-itertools";
+  version = "10.1.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Ymw2n6DrN7rAKRvOglmzMv1ZrHkvpUl7WYNzCc1bEUo=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # iterable = range(10 ** 10)  # Is efficiently reversible
+  # OverflowError: Python int too large to convert to C long
+  doCheck = !stdenv.hostPlatform.is32bit;
+
+  meta = with lib; {
+    homepage = "https://more-itertools.readthedocs.org";
+    changelog = "https://more-itertools.readthedocs.io/en/stable/versions.html";
+    description = "Expansion of the itertools module";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/more-properties/default.nix b/nixpkgs/pkgs/development/python-modules/more-properties/default.nix
new file mode 100644
index 000000000000..05c75b8f2107
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/more-properties/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "more-properties";
+  version = "1.1.1";
+
+  # upstream requires >= 3.6 but only 3.7 includes dataclasses
+  disabled = pythonOlder "3.7";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "madman-bob";
+    repo = "python-more-properties";
+    rev = version;
+    hash = "sha256-dKG97rw5IG19m7u3ZDBM2yGScL5cFaKBvGZxPVJaUTE=";
+  };
+
+  postPatch = ''
+    mv pypi_upload/setup.py .
+    substituteInPlace setup.py \
+      --replace "project_root = Path(__file__).parents[1]" "project_root = Path(__file__).parents[0]"
+
+    # dataclasses is included in Python 3.7
+    substituteInPlace requirements.txt \
+      --replace dataclasses ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "more_properties" ];
+
+  meta = {
+    description = "A collection of property variants";
+    homepage = "https://github.com/madman-bob/python-more-properties";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/moreorless/default.nix b/nixpkgs/pkgs/development/python-modules/moreorless/default.nix
new file mode 100644
index 000000000000..8f849b42f137
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/moreorless/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, parameterized
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "moreorless";
+  version = "0.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "thatch";
+    repo = "moreorless";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-N11iqsxMGgzwW2QYeOoHQaR/aDEuoUnnd/2Mc5culN0=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  nativeCheckInputs = [
+    parameterized
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "moreorless"
+  ];
+
+  pytestFlagsArray = [
+    "moreorless/tests/click.py"
+    "moreorless/tests/general.py"
+    "moreorless/tests/patch.py"
+  ];
+
+  meta = with lib; {
+    description = "Wrapper to make difflib.unified_diff more fun to use";
+    homepage = "https://github.com/thatch/moreorless/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/moretools/default.nix b/nixpkgs/pkgs/development/python-modules/moretools/default.nix
new file mode 100644
index 000000000000..75e92bb32bf2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/moretools/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi
+, six, path, zetup, pytest
+, decorator }:
+
+buildPythonPackage rec {
+  pname = "moretools";
+  version = "0.1.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "73b0469d4f1df6d967508103473f0b1524708adbff71f8f90ef71d9a44226b22";
+  };
+
+  checkPhase = ''
+    py.test test
+  '';
+
+  nativeBuildInputs = [ zetup ];
+  nativeCheckInputs = [ six path pytest ];
+  propagatedBuildInputs = [ decorator ];
+
+  meta = with lib; {
+    description = ''
+      Many more basic tools for python 2/3 extending itertools, functools, operator and collections
+    '';
+    homepage = "https://bitbucket.org/userzimmermann/python-moretools";
+    license = licenses.gpl3Plus;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/morfessor/default.nix b/nixpkgs/pkgs/development/python-modules/morfessor/default.nix
new file mode 100644
index 000000000000..5301438d4ecd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/morfessor/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "Morfessor";
+  version = "2.0.6";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bb3beac234341724c5f640f65803071f62373a50dba854d5a398567f9aefbab2";
+  };
+
+  checkPhase = "python -m unittest -v morfessor/test/*";
+
+  pythonImportsCheck = [ "morfessor" ];
+
+  meta = with lib; {
+    description = "A tool for unsupervised and semi-supervised morphological segmentation";
+    homepage = "https://github.com/aalto-speech/morfessor";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ misuzu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/morphys/default.nix b/nixpkgs/pkgs/development/python-modules/morphys/default.nix
new file mode 100644
index 000000000000..b89055829ef8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/morphys/default.nix
@@ -0,0 +1,24 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+}:
+buildPythonPackage rec {
+  pname = "morphys";
+  version = "1.0";
+
+  src = fetchFromGitHub {
+    owner = "mkalinski";
+    repo = "morphys";
+    rev = "0642a71126c32cd26b3a443a5cac27e4e1f7240f";
+    sha256 = "1da8s04m5wwih9cvkrks3ymb8v082lia47f274hxmfhi6ma3qc8b";
+  };
+
+  pythonImportsCheck = [ "morphys" ];
+
+  meta = with lib; {
+    description = "Smart conversions between unicode and bytes types";
+    homepage = "https://github.com/mkalinski/morphys";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rakesh4g ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mortgage/default.nix b/nixpkgs/pkgs/development/python-modules/mortgage/default.nix
new file mode 100644
index 000000000000..9cd4fe920c5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mortgage/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mortgage";
+  version = "1.0.5";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "18fcb356c631e9cc27fa7019f6ff6021707e34b9ce3a3b7dc815661288709921";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  doCheck = false; # No tests in sdist
+
+  disabled = pythonOlder "3.5";
+
+  meta = {
+    description = "Mortgage calculator";
+    license = lib.licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/motionblinds/default.nix b/nixpkgs/pkgs/development/python-modules/motionblinds/default.nix
new file mode 100644
index 000000000000..96b922ed4743
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/motionblinds/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pycryptodomex
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "motionblinds";
+  version = "0.6.18";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "starkillerOG";
+    repo = "motion-blinds";
+    rev = "refs/tags/${version}";
+    hash = "sha256-EkHrBhlPlavF6qbTF9myDBYh5eHxiZ4OoDzvlSs/LYM=";
+  };
+
+  propagatedBuildInputs = [
+    pycryptodomex
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "motionblinds"
+  ];
+
+  meta = with lib; {
+    description = "Python library for interfacing with Motion Blinds";
+    homepage = "https://github.com/starkillerOG/motion-blinds";
+    changelog = "https://github.com/starkillerOG/motion-blinds/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/motioneye-client/default.nix b/nixpkgs/pkgs/development/python-modules/motioneye-client/default.nix
new file mode 100644
index 000000000000..4f2afc6e4113
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/motioneye-client/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, stdenv
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-aiohttp
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "motioneye-client";
+  version = "0.3.14";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "dermotduffy";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-kgFSd5RjO+OtnPeAOimPTDVEfJ47rXh2Ku5xEYStHv8=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'aiohttp = "^3.8.1,!=3.8.2,!=3.8.3"' 'aiohttp = "*"' \
+      --replace " --cov-report=html:htmlcov --cov-report=xml:coverage.xml --cov-report=term-missing --cov=motioneye_client --cov-fail-under=100" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "motioneye_client"
+  ];
+
+  meta = with lib; {
+    description = "Python library for motionEye";
+    homepage = "https://github.com/dermotduffy/motioneye-client";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/moto/default.nix b/nixpkgs/pkgs/development/python-modules/moto/default.nix
new file mode 100644
index 000000000000..a76f39fc2a52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/moto/default.nix
@@ -0,0 +1,159 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+# build-system
+, setuptools
+
+# dependencies
+, boto3
+, botocore
+, cryptography
+, jinja2
+, python-dateutil
+, requests
+, responses
+, werkzeug
+, xmltodict
+
+# optional-dependencies
+, aws-xray-sdk
+, cfn-lint
+, docker
+, ecdsa
+, flask
+, flask-cors
+, graphql-core
+, jsondiff
+, multipart
+, openapi-spec-validator
+, py-partiql-parser
+, pyparsing
+, python-jose
+, pyyaml
+, sshpubkeys
+
+# tests
+, freezegun
+, pytestCheckHook
+, pytest-order
+, pytest-xdist
+}:
+
+buildPythonPackage rec {
+  pname = "moto";
+  version = "4.2.10";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-kllf4odHSjGsPvhHlB67CX6P+ww9bBBuR89XPbBpM7I=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    boto3
+    botocore
+    cryptography
+    requests
+    xmltodict
+    werkzeug
+    python-dateutil
+    responses
+    jinja2
+  ];
+
+  passthru.optional-dependencies = {
+    # non-exhaustive list of extras, that was cobbled together for testing
+    all = [
+      aws-xray-sdk
+      cfn-lint
+      docker
+      ecdsa
+      flask
+      flask-cors
+      graphql-core
+      jsondiff
+      multipart
+      openapi-spec-validator
+      py-partiql-parser
+      pyparsing
+      python-jose
+      pyyaml
+      setuptools
+      sshpubkeys
+    ] ++ python-jose.optional-dependencies.cryptography;
+  };
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    freezegun
+    pytestCheckHook
+    pytest-order
+    pytest-xdist
+  ] ++ passthru.optional-dependencies.all;
+
+  # Some tests depend on AWS credentials environment variables to be set.
+  env.AWS_ACCESS_KEY_ID = "ak";
+  env.AWS_SECRET_ACCESS_KEY = "sk";
+
+  pytestFlagsArray = [
+    "-m" "'not network and not requires_docker'"
+
+    # Matches upstream configuration, presumably due to expensive setup/teardown.
+    "--dist" "loadscope"
+
+    # Fails at local name resolution
+    "--deselect=tests/test_s3/test_multiple_accounts_server.py::TestAccountIdResolution::test_with_custom_request_header"
+    "--deselect=tests/test_s3/test_server.py::test_s3_server_post_cors_multiple_origins"
+
+    # Fails at resolving google.com
+    "--deselect=tests/test_firehose/test_firehose_put.py::test_put_record_http_destination"
+    "--deselect=tests/test_firehose/test_firehose_put.py::test_put_record_batch_http_destination"
+
+    # Download recordings returns faulty JSON
+    "--deselect=tests/test_moto_api/recorder/test_recorder.py::TestRecorder::test_ec2_instance_creation_recording_on"
+    "--deselect=tests/test_moto_api/recorder/test_recorder.py::TestRecorder::test_ec2_instance_creation__recording_off"
+
+    # Connection Reset by Peer, when connecting to localhost:5678
+    "--deselect=tests/test_moto_api/recorder/test_recorder.py::TestRecorder::test_replay"
+
+    # Requires docker, but isn't marked
+    # https://github.com/getmoto/moto/pull/6938
+    "--deselect=tests/test_awslambda/test_lambda_layers_invoked.py::test_invoke_local_lambda_layers"
+
+    # Flaky under parallel execution
+    "--deselect=tests/test_cloudformation/test_server.py::test_cloudformation_server_get"
+    "--deselect=tests/test_core/test_moto_api.py::TestModelDataResetForClassDecorator::test_should_find_bucket"
+  ];
+
+  disabledTestPaths = [
+    # Flaky under parallel execution, Connection Reset errors to localhost.
+    "tests/test_moto_api/recorder/test_recorder.py"
+
+    # Flaky under parallel execution
+    "tests/test_resourcegroupstaggingapi/*.py"
+
+    # Tries to access the network
+    "tests/test_batch/test_batch_jobs.py"
+
+    # Threading tests regularly blocks test execution
+    "tests/test_utilities/test_threaded_server.py"
+    "tests/test_s3/test_s3_bucket_policy.py"
+  ];
+
+  meta = with lib; {
+    description = "Allows your tests to easily mock out AWS Services";
+    homepage = "https://github.com/spulec/moto";
+    changelog = "https://github.com/getmoto/moto/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/motor/default.nix b/nixpkgs/pkgs/development/python-modules/motor/default.nix
new file mode 100644
index 000000000000..3e4cf4d574ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/motor/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mockupdb
+, pymongo
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "motor";
+  version = "3.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mongodb";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-iJz3JiW9cVT3G1rLQwWQXcPfPBRGsIwVLs4gauM+pYo=";
+  };
+
+  propagatedBuildInputs = [
+    pymongo
+  ];
+
+  nativeCheckInputs = [
+    mockupdb
+  ];
+
+  # network connections
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "motor"
+  ];
+
+  meta = with lib; {
+    description = "Non-blocking MongoDB driver for Tornado or asyncio";
+    license = licenses.asl20;
+    homepage = "https://github.com/mongodb/motor";
+    maintainers = with maintainers; [ globin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mouseinfo/default.nix b/nixpkgs/pkgs/development/python-modules/mouseinfo/default.nix
new file mode 100644
index 000000000000..f5c76b875241
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mouseinfo/default.nix
@@ -0,0 +1,42 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, pyperclip
+, fetchFromGitHub
+, xlib
+, pillow
+}:
+buildPythonPackage rec {
+  pname = "MouseInfo";
+  version = "0.1.3";
+
+  src = fetchFromGitHub {
+    owner = "asweigart";
+    repo = "mouseinfo";
+    rev = "1876ad5cd311b4352d46bc64a12edfb4da49974e";
+    hash = "sha256-UTaHTJE0xFihN9r+DY/WhekZ7S/CXtMFbqAayzexRxk=";
+  };
+
+  patches = [
+    ./fix-xlib-version.patch
+    ./pillow-version.patch
+  ];
+
+  doCheck = false;
+  # Mouseinfo requires a X server running to import successfully
+  # pythonImportsCheck = [ "mouseinfo" ];
+
+  propagatedBuildInputs = [
+    pyperclip
+    xlib
+    pillow
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "An application to display XY position and RGB color information for the pixel currently under the mouse. Works on Python 2 and 3.";
+    homepage = "https://github.com/asweigart/mouseinfo";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ lucasew ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mouseinfo/fix-xlib-version.patch b/nixpkgs/pkgs/development/python-modules/mouseinfo/fix-xlib-version.patch
new file mode 100644
index 000000000000..d6bd5f71ac57
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mouseinfo/fix-xlib-version.patch
@@ -0,0 +1,14 @@
+diff --git a/setup.py b/setup.py
+index 37d5f77..894fe78 100644
+--- a/setup.py
++++ b/setup.py
+@@ -31,8 +31,7 @@ setup(
+     test_suite='tests',
+     # NOTE: Update the python_version info for Pillow as Pillow supports later versions of Python.
+     install_requires=['rubicon-objc;platform_system=="Darwin"',
+-                      'python3-Xlib;platform_system=="Linux" and python_version>="3.0"',
+-                      'Xlib;platform_system=="Linux" and python_version<"3.0"',
++                      'python-Xlib;platform_system=="Linux"',
+                       'pyperclip',
+                       'Pillow >= 6.2.1; python_version == "3.8"',
+                       'Pillow >= 5.2.0; python_version == "3.7"',
diff --git a/nixpkgs/pkgs/development/python-modules/mouseinfo/pillow-version.patch b/nixpkgs/pkgs/development/python-modules/mouseinfo/pillow-version.patch
new file mode 100644
index 000000000000..b8abb02695f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mouseinfo/pillow-version.patch
@@ -0,0 +1,20 @@
+diff --git a/setup.py b/setup.py
+index 894fe78..ac580a6 100644
+--- a/setup.py
++++ b/setup.py
+@@ -33,14 +33,7 @@ setup(
+     install_requires=['rubicon-objc;platform_system=="Darwin"',
+                       'python-Xlib;platform_system=="Linux"',
+                       'pyperclip',
+-                      'Pillow >= 6.2.1; python_version == "3.8"',
+-                      'Pillow >= 5.2.0; python_version == "3.7"',
+-                      'Pillow >= 4.0.0; python_version == "3.6"',
+-                      'Pillow >= 3.2.0; python_version == "3.5"',
+-                      'Pillow <= 5.4.1, >= 2.5.0; python_version == "3.4"',
+-                      'Pillow <= 4.3.0, >= 2.0.0; python_version == "3.3"',
+-                      'Pillow <= 3.4.2, >= 2.0.0; python_version == "3.2"',
+-                      'Pillow >= 2.0.0; python_version == "2.7"',
++                      'Pillow',
+                       ],
+     keywords='',
+     classifiers=[
diff --git a/nixpkgs/pkgs/development/python-modules/moviepy/default.nix b/nixpkgs/pkgs/development/python-modules/moviepy/default.nix
new file mode 100644
index 000000000000..96b3206f7fde
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/moviepy/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, numpy
+, decorator
+, imageio
+, imageio-ffmpeg
+, proglog
+, requests
+, tqdm
+  # Advanced image processing (triples size of output)
+, advancedProcessing ? false
+, scikit-image
+, scikit-learn
+, scipy
+, matplotlib
+, youtube-dl
+}:
+
+buildPythonPackage rec {
+  pname = "moviepy";
+  version = "1.0.3";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2884e35d1788077db3ff89e763c5ba7bfddbd7ae9108c9bc809e7ba58fa433f5";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "decorator>=4.0.2,<5.0" "decorator>=4.0.2,<6.0"
+  '';
+
+  # No tests, require network connection
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    numpy
+    decorator
+    imageio
+    imageio-ffmpeg
+    tqdm
+    requests
+    proglog
+  ] ++ lib.optionals advancedProcessing [
+    scikit-image
+    scikit-learn
+    scipy
+    matplotlib
+    youtube-dl
+  ];
+
+  meta = with lib; {
+    description = "Video editing with Python";
+    homepage = "https://zulko.github.io/moviepy/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mox3/default.nix b/nixpkgs/pkgs/development/python-modules/mox3/default.nix
new file mode 100644
index 000000000000..2cdfd2c0c746
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mox3/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pythonAtLeast
+, subunit
+, testrepository
+, testtools
+, six
+, pbr
+, fixtures
+}:
+
+buildPythonPackage rec {
+  pname = "mox3";
+  version = "1.1.0";
+  disabled = pythonOlder "3.6" || pythonAtLeast "3.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8a526b7b9b6341f541a9aef3e08c93fd84a5373fe89d4cc51dd571f085b2363c";
+  };
+
+  buildInputs = [ subunit testrepository testtools six ];
+  propagatedBuildInputs = [ pbr fixtures ];
+
+  # Disabling as several tests dependencies are missing:
+  # https://opendev.org/openstack/mox3/src/branch/master/test-requirements.txt
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Mock object framework for Python";
+    homepage = "https://docs.openstack.org/mox3/latest/";
+    license = licenses.asl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mpd2/default.nix b/nixpkgs/pkgs/development/python-modules/mpd2/default.nix
new file mode 100644
index 000000000000..ba1e4f4022ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mpd2/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, twisted
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-mpd2";
+  version = "3.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8zws2w1rqnSjZyTzjBxKCZp84sjsSiu3GSFQpYVd9HY=";
+  };
+
+  passthru.optional-dependencies = {
+    twisted = [
+      twisted
+    ];
+  };
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ] ++ passthru.optional-dependencies.twisted;
+
+  meta = with lib; {
+    changelog = "https://github.com/Mic92/python-mpd2/blob/v${version}/doc/changes.rst";
+    description = "A Python client module for the Music Player Daemon";
+    homepage = "https://github.com/Mic92/python-mpd2";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ rvl mic92 hexa ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mpi4py/default.nix b/nixpkgs/pkgs/development/python-modules/mpi4py/default.nix
new file mode 100644
index 000000000000..eaf7d30efb5d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mpi4py/default.nix
@@ -0,0 +1,53 @@
+{ lib, fetchPypi, fetchpatch, python, buildPythonPackage
+, mpi, mpiCheckPhaseHook, openssh
+}:
+
+buildPythonPackage rec {
+  pname = "mpi4py";
+  version = "3.1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-pwbnbbklUTXC+10e9Uy097DkrZ4zy62n3idiYgXyoVM=";
+  };
+
+  passthru = {
+    inherit mpi;
+  };
+
+  postPatch = ''
+    substituteInPlace test/test_spawn.py --replace \
+                      "unittest.skipMPI('openmpi(<3.0.0)')" \
+                      "unittest.skipMPI('openmpi')"
+  '';
+
+  configurePhase = "";
+
+  installPhase = ''
+    mkdir -p "$out/lib/${python.libPrefix}/site-packages"
+    export PYTHONPATH="$out/lib/${python.libPrefix}/site-packages:$PYTHONPATH"
+
+    ${python}/bin/${python.executable} setup.py install \
+      --install-lib=$out/lib/${python.libPrefix}/site-packages \
+      --prefix="$out"
+
+    # --install-lib:
+    # sometimes packages specify where files should be installed outside the usual
+    # python lib prefix, we override that back so all infrastructure (setup hooks)
+    # work as expected
+  '';
+
+  setupPyBuildFlags = ["--mpicc=${mpi}/bin/mpicc"];
+
+  nativeBuildInputs = [ mpi ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [ openssh mpiCheckPhaseHook ];
+
+  meta = with lib; {
+    description = "Python bindings for the Message Passing Interface standard";
+    homepage = "https://github.com/mpi4py/mpi4py";
+    license = licenses.bsd2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mpi4py/tests.patch b/nixpkgs/pkgs/development/python-modules/mpi4py/tests.patch
new file mode 100644
index 000000000000..168e3b4b38d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mpi4py/tests.patch
@@ -0,0 +1,13 @@
+diff --git i/test/test_dl.py w/test/test_dl.py
+index a3211a3..9d25569 100644
+--- i/test/test_dl.py
++++ w/test/test_dl.py
+@@ -12,7 +12,7 @@ class TestDL(unittest.TestCase):
+         if sys.platform == 'darwin':
+             libm = 'libm.dylib'
+         else:
+-            libm = 'libm.so'
++            libm = 'libm.so.6'
+ 
+         handle = dl.dlopen(libm, dl.RTLD_LOCAL|dl.RTLD_LAZY)
+         self.assertTrue(handle != 0)
diff --git a/nixpkgs/pkgs/development/python-modules/mpl-scatter-density/default.nix b/nixpkgs/pkgs/development/python-modules/mpl-scatter-density/default.nix
new file mode 100644
index 000000000000..f0523c3594dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mpl-scatter-density/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, pytestCheckHook
+, fetchFromGitHub
+, fetchpatch
+, pythonOlder
+, setuptools-scm
+, setuptools
+, fast-histogram
+, matplotlib
+, numpy
+, wheel
+, pytest-mpl
+}:
+
+buildPythonPackage rec {
+  pname = "mpl-scatter-density";
+  version = "0.7";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "astrofrog";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-MMxM+iv5p9ZLcBpqa3tBBPbsMM/PTg6BXaDpGgSw+DE=";
+  };
+
+  patches = [
+    # https://github.com/astrofrog/mpl-scatter-density/pull/37
+    (fetchpatch {
+      name = "distutils-removal.patch";
+      url = "https://github.com/ifurther/mpl-scatter-density/commit/6feedabe1e82da67d8eec46a80eb370d9f334251.patch";
+      sha256 = "sha256-JqWlSm8mIwqjRPa+kMEaKipJyzGEO+gJK+Q045N1MXA=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [ matplotlib numpy fast-histogram ];
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mpl
+  ];
+
+  disabledTests = [
+    # AssertionError: (240, 240) != (216, 216)
+    # Erroneous pinning of figure DPI, sensitive to runtime environment
+    "test_default_dpi"
+  ];
+
+  pythonImportsCheck = [ "mpl_scatter_density" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/astrofrog/mpl-scatter-density";
+    description = "Fast scatter density plots for Matplotlib";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ifurther ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mpldatacursor/default.nix b/nixpkgs/pkgs/development/python-modules/mpldatacursor/default.nix
new file mode 100644
index 000000000000..b14470ca215a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mpldatacursor/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, matplotlib
+}:
+
+buildPythonPackage rec {
+  pname = "mpldatacursor";
+  version = "0.7.1";
+
+  src = fetchFromGitHub {
+    owner = "joferkington";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0i1lwl6x6hgjq4xwsc138i4v5895lmnpfqwpzpnj5mlck6fy6rda";
+  };
+
+  propagatedBuildInputs = [ matplotlib ];
+
+  # No tests included in archive
+  doCheck = false;
+
+  pythonImportsCheck = [ "mpldatacursor" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/joferkington/mpldatacursor";
+    description = "Interactive data cursors for matplotlib";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bzizou ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mplfinance/default.nix b/nixpkgs/pkgs/development/python-modules/mplfinance/default.nix
new file mode 100644
index 000000000000..dfad66f7d758
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mplfinance/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, matplotlib, pandas }:
+
+buildPythonPackage rec {
+  pname = "mplfinance";
+  version = "0.12.7a7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-pATiprTELt8GrEkeKjILPfpdNDVoex5t+Mc+6Gg7cPY=";
+  };
+
+  propagatedBuildInputs = [ matplotlib pandas ];
+
+  # tests are only included on GitHub where this version misses a tag
+  # and half of them fail
+  doCheck = false;
+
+  pythonImportsCheck = [ "mplfinance" ];
+
+  meta = with lib; {
+    description = "Matplotlib utilities for the visualization, and visual analysis, of financial data";
+    homepage = "https://github.com/matplotlib/mplfinance";
+    license = [ licenses.bsd3 ];
+    maintainers = [ maintainers.ehmry ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mplhep-data/default.nix b/nixpkgs/pkgs/development/python-modules/mplhep-data/default.nix
new file mode 100644
index 000000000000..12ec813f12b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mplhep-data/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "mplhep-data";
+  version = "0.0.3";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "mplhep_data";
+    inherit version;
+    hash = "sha256-tU0lfz9TyTpELNp6ZoHOJnJ34JFzwLQf14gg94Mhdy8=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  pythonImportsCheck = [
+    "mplhep_data"
+  ];
+
+  meta = with lib; {
+    description = "Sub-package to hold data (fonts) for mplhep";
+    homepage = "https://github.com/scikit-hep/mplhep_data";
+    license = with licenses; [ mit gfl ofl ];
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mplhep/default.nix b/nixpkgs/pkgs/development/python-modules/mplhep/default.nix
new file mode 100644
index 000000000000..c39b24a17f31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mplhep/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hist
+, matplotlib
+, mplhep-data
+, pytestCheckHook
+, pytest-mock
+, pytest-mpl
+, scipy
+, setuptools
+, setuptools-scm
+, uhi
+, uproot
+}:
+
+buildPythonPackage rec {
+  pname = "mplhep";
+  version = "0.3.31";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-aZwazbDljRncB2p7qD95Cms0uQBU8tciUrXcKpsyVTM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    matplotlib
+    uhi
+    mplhep-data
+  ];
+
+  nativeCheckInputs = [
+    hist
+    pytestCheckHook
+    pytest-mock
+    pytest-mpl
+    scipy
+    uproot
+  ];
+
+  disabledTests = [
+    # requires uproot4
+    "test_inputs_uproot"
+    "test_uproot_versions"
+  ];
+
+  pythonImportsCheck = [
+    "mplhep"
+  ];
+
+  meta = with lib; {
+    description = "Extended histogram plots on top of matplotlib and HEP compatible styling similar to current collaboration requirements (ROOT)";
+    homepage = "https://github.com/scikit-hep/mplhep";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mplleaflet/default.nix b/nixpkgs/pkgs/development/python-modules/mplleaflet/default.nix
new file mode 100644
index 000000000000..bfe442d05f51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mplleaflet/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jinja2
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "mplleaflet";
+  version = "0.0.5";
+
+  propagatedBuildInputs = [ jinja2 six ];
+
+  # No tests in archive
+  doCheck = false;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "049e0b91797ce5b462853395138161fed9e8dfc1f4723f482ebb0739a0bbd289";
+  };
+
+  meta = {
+    description = "Convert Matplotlib plots into Leaflet web maps";
+    homepage = "https://github.com/jwass/mplleaflet";
+    license = with lib.licenses; [ bsd3 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mpmath/default.nix b/nixpkgs/pkgs/development/python-modules/mpmath/default.nix
new file mode 100644
index 000000000000..1a8e4c030979
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mpmath/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, gmpy2
+, isPyPy
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mpmath";
+  version = "1.3.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "mpmath";
+    repo = "mpmath";
+    rev = "refs/tags/${version}";
+    hash = "sha256-9BGcaC3TyolGeO65/H42T/WQY6z5vc1h+MA+8MGFChU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  passthru.optional-dependencies = {
+    gmpy = lib.optionals (!isPyPy) [
+      gmpy2
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    homepage    = "https://mpmath.org/";
+    description = "A pure-Python library for multiprecision floating arithmetic";
+    license     = licenses.bsd3;
+    maintainers = with maintainers; [ lovek323 ];
+    platforms   = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mpris-server/default.nix b/nixpkgs/pkgs/development/python-modules/mpris-server/default.nix
new file mode 100644
index 000000000000..783fc6aab959
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mpris-server/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, emoji
+, pydbus
+, pygobject3
+, unidecode
+, setuptools
+}:
+buildPythonPackage rec {
+  pname = "mpris-server";
+  version = "0.4.2";
+  pyproject = true;
+
+  src = fetchPypi {
+    pname = "mpris_server";
+    inherit version;
+    hash = "sha256-p3nM80fOMtRmeKvOXuX40Fu9xH8gPgYyneXbUS678fE=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  propagatedBuildInputs = [
+    emoji
+    pydbus
+    pygobject3
+    unidecode
+  ];
+
+  pythonImportsCheck = [ "mpris_server" ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Publish a MediaPlayer2 MPRIS device to D-Bus";
+    homepage = "https://pypi.org/project/mpris-server/";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ quadradical ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mpv/default.nix b/nixpkgs/pkgs/development/python-modules/mpv/default.nix
new file mode 100644
index 000000000000..3763e25660a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mpv/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, mpv
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "mpv";
+  version = "1.0.4";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "jaseg";
+    repo = "python-mpv";
+    rev = "v${version}";
+    hash = "sha256-qP5Biw4sTLioAhmMZX+Pemue2PWc3N7afAe38dwJv3U=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  buildInputs = [ mpv ];
+
+  postPatch = ''
+    substituteInPlace mpv.py \
+      --replace "sofile = ctypes.util.find_library('mpv')" \
+                'sofile = "${mpv}/lib/libmpv${stdenv.hostPlatform.extensions.sharedLibrary}"'
+  '';
+
+  # tests impure, will error if it can't load libmpv.so
+  doCheck = false;
+  pythonImportsCheck = [ "mpv" ];
+
+  meta = with lib; {
+    description = "A python interface to the mpv media player";
+    homepage = "https://github.com/jaseg/python-mpv";
+    license = licenses.agpl3Plus;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mpyq/default.nix b/nixpkgs/pkgs/development/python-modules/mpyq/default.nix
new file mode 100644
index 000000000000..94c907c676c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mpyq/default.nix
@@ -0,0 +1,21 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "mpyq";
+  version = "0.2.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "01q0xh2fy3zzsrfr45d2ypj4whs7s060cy1rnprg6sg55fbgbaih";
+  };
+
+  meta = {
+    description = "A Python library for extracting MPQ (MoPaQ) files.";
+    homepage = "https://github.com/eagleflo/mpyq";
+    license = lib.licenses.bsd2;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mqtt2influxdb/default.nix b/nixpkgs/pkgs/development/python-modules/mqtt2influxdb/default.nix
new file mode 100644
index 000000000000..a2d7fa25fe0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mqtt2influxdb/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, influxdb
+, jsonpath-ng
+, paho-mqtt
+, py-expression-eval
+, pyaml
+, pycron
+, schema
+}:
+buildPythonPackage rec {
+  pname = "mqtt2influxdb";
+  version = "1.5.2";
+
+  src = fetchFromGitHub {
+    owner = "hardwario";
+    repo = "bch-mqtt2influxdb";
+    rev = "v${version}";
+    sha256 = "YDgMoxnH4vCCa7b857U6iVBhYLxk8ZjytGziryn24bg=";
+  };
+
+  propagatedBuildInputs = [
+    influxdb
+    jsonpath-ng
+    paho-mqtt
+    py-expression-eval
+    pyaml
+    pycron
+    schema
+  ];
+
+  pythonImportsCheck = [ "mqtt2influxdb" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/hardwario/bch-mqtt2influxdb";
+    description = "Flexible MQTT to InfluxDB Bridge";
+    platforms = platforms.linux;
+    license = licenses.mit;
+    maintainers = with maintainers; [ cynerd ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mrjob/default.nix b/nixpkgs/pkgs/development/python-modules/mrjob/default.nix
new file mode 100644
index 000000000000..97cd5fd78e85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mrjob/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# propagates
+, pyyaml
+
+# optionals
+, boto3
+, botocore
+, google-cloud-dataproc
+, google-cloud-logging
+, google-cloud-storage
+, python-rapidjson
+, simplejson
+, ujson
+
+
+# tests
+, pyspark
+, unittestCheckHook
+, warcio
+}:
+
+buildPythonPackage rec {
+  pname = "mrjob";
+  version = "0.7.4";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Yelp";
+    repo = "mrjob";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Yp4yUx6tkyGB622I9y+AWK2AkIDVGKQPMM+LtB/M3uo=";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+  ];
+
+  passthru.optional-dependencies = {
+    aws = [
+      boto3
+      botocore
+    ];
+    google = [
+      google-cloud-dataproc
+      google-cloud-logging
+      google-cloud-storage
+    ];
+    rapidjson = [
+      python-rapidjson
+    ];
+    simplejson = [
+      simplejson
+    ];
+    ujson = [
+      ujson
+    ];
+  };
+
+  doCheck = false; # failing tests
+
+  nativeCheckInputs = [
+    pyspark
+    unittestCheckHook
+    warcio
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  unittestFlagsArray = [
+    "-v"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/Yelp/mrjob/blob/v${version}/CHANGES.txt";
+    description = "Run MapReduce jobs on Hadoop or Amazon Web Services";
+    homepage = "https://github.com/Yelp/mrjob";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mrsqm/default.nix b/nixpkgs/pkgs/development/python-modules/mrsqm/default.nix
new file mode 100644
index 000000000000..d9748df70785
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mrsqm/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, cython
+, fftw
+, pandas
+, scikit-learn
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "mrsqm";
+  version = "0.0.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-dBwWiJEL76aXqM2vKn4uQsd86Rm3bMeDSsRRs/aLWCE=";
+  };
+
+  buildInputs = [ fftw ];
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    pandas
+    scikit-learn
+    numpy
+  ];
+
+  # Package has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "mrsqm" ];
+
+  meta = with lib; {
+    description = "MrSQM (Multiple Representations Sequence Miner) is a time series classifier";
+    homepage = "https://pypi.org/project/mrsqm";
+    changelog = "https://github.com/mlgig/mrsqm/releases/tag/v.${version}";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ms-active-directory/default.nix b/nixpkgs/pkgs/development/python-modules/ms-active-directory/default.nix
new file mode 100644
index 000000000000..b8459dc6d6a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ms-active-directory/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, dnspython
+, fetchFromGitHub
+, ldap3
+, pyasn1
+, pycryptodome
+, pythonOlder
+, pytz
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "ms-active-directory";
+  version = "1.12.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "zorn96";
+    repo = "ms_active_directory";
+    rev = "v${version}";
+    hash = "sha256-mErQib8xTgo29iPAtiLnhxLXyFboAzyEW9A/QMseM6k=";
+  };
+
+  propagatedBuildInputs = [
+    dnspython
+    ldap3
+    pyasn1
+    pycryptodome
+    pytz
+    six
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ms_active_directory"
+  ];
+
+  meta = with lib; {
+    description = "Python module for integrating with Microsoft Active Directory domains";
+    homepage = "https://github.com/zorn96/ms_active_directory/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ms-cv/default.nix b/nixpkgs/pkgs/development/python-modules/ms-cv/default.nix
new file mode 100644
index 000000000000..07af4ecb510f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ms-cv/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ms-cv";
+  version = "0.1.1";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "OpenXbox";
+    repo = "ms_cv";
+    rev = "v${version}";
+    sha256 = "0pkna0kvmq1cp4rx3dnzxsvvlxxngryp77k42wkyw2phv19a2mjd";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest-runner" ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Correlation vector implementation in python";
+    homepage = "https://github.com/OpenXbox/ms_cv";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/msal-extensions/default.nix b/nixpkgs/pkgs/development/python-modules/msal-extensions/default.nix
new file mode 100644
index 000000000000..3a95fcb86ef5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msal-extensions/default.nix
@@ -0,0 +1,45 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, isPy27
+
+# pythonPackages
+, msal
+, pathlib2
+, portalocker
+}:
+
+buildPythonPackage rec {
+  pname = "msal-extensions";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xnarpWsMzjeD3htcXs/oKNuZgWeHUSbKS0fcZDZFE1Q=";
+  };
+
+  propagatedBuildInputs = [
+    msal
+    portalocker
+  ] ++ lib.optionals isPy27 [
+    pathlib2
+  ];
+
+  # upstream doesn't update this requirement probably because they use pip
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "portalocker~=1.0" "portalocker"
+  '';
+
+  # No tests found
+  doCheck = false;
+
+  meta = with lib; {
+    description = "The Microsoft Authentication Library Extensions (MSAL-Extensions) for Python";
+    homepage = "https://github.com/AzureAD/microsoft-authentication-extensions-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [
+      kamadorueda
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/msal/default.nix b/nixpkgs/pkgs/development/python-modules/msal/default.nix
new file mode 100644
index 000000000000..ab54e9e5adea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msal/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyjwt
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "msal";
+  version = "1.24.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-qglyiEs8b97FPZoL0VwS5b17cawbZtdG9U0Shwnz+Pg=";
+  };
+
+  propagatedBuildInputs = [
+    pyjwt
+    requests
+  ]
+  ++ pyjwt.optional-dependencies.crypto;
+
+  # Tests assume Network Connectivity:
+  # https://github.com/AzureAD/microsoft-authentication-library-for-python/blob/e2958961e8ec16d0af4199f60c36c3f913497e48/tests/test_authority.py#L73
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "msal"
+  ];
+
+  meta = with lib; {
+    description = "Library to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect";
+    homepage = "https://github.com/AzureAD/microsoft-authentication-library-for-python";
+    changelog = "https://github.com/AzureAD/microsoft-authentication-library-for-python/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kamadorueda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mscerts/default.nix b/nixpkgs/pkgs/development/python-modules/mscerts/default.nix
new file mode 100644
index 000000000000..400e0c2774e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mscerts/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mscerts";
+  version = "2023.11.29";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ralphje";
+    repo = "mscerts";
+    rev = "refs/tags/${version}";
+    hash = "sha256-TNwpWxknCUcvXFy3UInrEx4iFZi/hLS7exvJBv3DlWo=";
+  };
+
+  # extras_require contains signify -> circular dependency
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "mscerts"
+  ];
+
+  meta = with lib; {
+    description = "Makes the Microsoft Trusted Root Program's Certificate Trust Lists available in Python";
+    homepage = "https://github.com/ralphje/mscerts";
+    license = with licenses; [ mpl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/msg-parser/default.nix b/nixpkgs/pkgs/development/python-modules/msg-parser/default.nix
new file mode 100644
index 000000000000..9670403e640e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msg-parser/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+# dependencies
+, olefile
+# test dependencies
+, pytestCheckHook
+}:
+let
+  pname = "msg-parser";
+  version = "1.2.0";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "vikramarsid";
+    repo = "msg_parser";
+    rev = "4100b553b24895b489ebd414c771933fc1e558d3";
+    hash = "sha256-srDk6w8nzt0dyGCFQWfVCnKb4LawHoqoHX6d1l1dAmM=";
+  };
+
+  propagatedBuildInputs = [
+    olefile
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Python module to read, parse and converting Microsoft Outlook MSG E-Mail files.";
+    homepage = "https://github.com/vikramarsid/msg_parser";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/msgpack-numpy/default.nix b/nixpkgs/pkgs/development/python-modules/msgpack-numpy/default.nix
new file mode 100644
index 000000000000..17f579510285
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msgpack-numpy/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cython
+, msgpack
+, numpy
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "msgpack-numpy";
+  version = "0.4.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xmfTGAUTQi+cdUW+XuxdKW3Ls1fgb3LtOcxoN5dVbmk=";
+  };
+
+  buildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+   msgpack
+   numpy
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} msgpack_numpy.py
+  '';
+
+  meta = with lib; {
+    description = "Numpy data type serialization using msgpack";
+    homepage = "https://github.com/lebedov/msgpack-numpy";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ aborsu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/msgpack/default.nix b/nixpkgs/pkgs/development/python-modules/msgpack/default.nix
new file mode 100644
index 000000000000..d44166b82f7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msgpack/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, borgbackup
+}:
+
+buildPythonPackage rec {
+  pname = "msgpack";
+  version = "1.0.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wHVUQoTq3Fzdxw9HVzMdmdy8FrK71ISdFfiq5M820xw=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "msgpack"
+  ];
+
+  passthru.tests = {
+    # borgbackup is sensible to msgpack versions: https://github.com/borgbackup/borg/issues/3753
+    # please be mindful before bumping versions.
+    inherit borgbackup;
+  };
+
+  meta = with lib;  {
+    description = "MessagePack serializer implementation";
+    homepage = "https://github.com/msgpack/msgpack-python";
+    changelog = "https://github.com/msgpack/msgpack-python/blob/v${version}/ChangeLog.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/msgraph-core/default.nix b/nixpkgs/pkgs/development/python-modules/msgraph-core/default.nix
new file mode 100644
index 000000000000..a1df35addf03
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msgraph-core/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, flit-core
+, requests
+, pytestCheckHook
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "msgraph-core";
+  version = "0.2.2";
+
+  disabled = pythonOlder "3.5";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "microsoftgraph";
+    repo = "msgraph-sdk-python-core";
+    rev = "v${version}";
+    hash = "sha256-eRRlG3GJX3WeKTNJVWgNTTHY56qiUGOlxtvEZ2xObLA=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  disabledTestPaths = [
+    "tests/integration"
+  ];
+
+  pythonImportsCheck = [ "msgraph.core" ];
+
+  meta = {
+    description = "Core component of the Microsoft Graph Python SDK";
+    homepage = "https://github.com/microsoftgraph/msgraph-sdk-python-core";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/msgspec/default.nix b/nixpkgs/pkgs/development/python-modules/msgspec/default.nix
new file mode 100644
index 000000000000..b2039e23c6ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msgspec/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, msgpack
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "msgspec";
+  version = "0.18.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "jcrist";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-u1mrj/pHvlbSwh6QtRdJKuVGN1zQ6mRITi/qzrCHnhk=";
+  };
+
+  # Requires libasan to be accessible
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "msgspec"
+  ];
+
+  meta = with lib; {
+    description = "Module to handle JSON/MessagePack";
+    homepage = "https://github.com/jcrist/msgspec";
+    changelog = "https://github.com/jcrist/msgspec/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/msldap/default.nix b/nixpkgs/pkgs/development/python-modules/msldap/default.nix
new file mode 100644
index 000000000000..dc7613354743
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msldap/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, asn1crypto
+, asyauth
+, asysocks
+, minikerberos
+, prompt-toolkit
+, tqdm
+, winacl
+, winsspi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "msldap";
+  version = "0.5.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6gTUPtGQKJSd7HpMRRlw87Iu3I1L2ea2F+QQs1U1jIM=";
+  };
+
+  propagatedBuildInputs = [
+    asn1crypto
+    asyauth
+    asysocks
+    minikerberos
+    prompt-toolkit
+    tqdm
+    winacl
+    winsspi
+  ];
+
+  # Project doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "msldap"
+  ];
+
+  meta = with lib; {
+    description = "Python LDAP library for auditing MS AD";
+    homepage = "https://github.com/skelsec/msldap";
+    changelog = "https://github.com/skelsec/msldap/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/msoffcrypto-tool/default.nix b/nixpkgs/pkgs/development/python-modules/msoffcrypto-tool/default.nix
new file mode 100644
index 000000000000..3f3cc47351bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msoffcrypto-tool/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, olefile
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, cryptography
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "msoffcrypto-tool";
+  version = "5.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "nolze";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-A1TeTE4TMHAb+KtFxTi+b4yTfuEFya8iyzy92dzQ0Z4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    olefile
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Test fails with AssertionError
+    "test_cli"
+  ];
+
+  pythonImportsCheck = [
+    "msoffcrypto"
+  ];
+
+  meta = with lib; {
+    description = "Python tool and library for decrypting MS Office files with passwords or other keys";
+    homepage = "https://github.com/nolze/msoffcrypto-tool";
+    changelog = "https://github.com/nolze/msoffcrypto-tool/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/msprime/default.nix b/nixpkgs/pkgs/development/python-modules/msprime/default.nix
new file mode 100644
index 000000000000..2ec32c255dfa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msprime/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, oldest-supported-numpy
+, setuptools-scm
+, wheel
+, pythonOlder
+, gsl
+, numpy
+, newick
+, tskit
+, demes
+, pytestCheckHook
+, pytest-xdist
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "msprime";
+  version = "1.2.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-YAJa2f0w2CenKubnYLbP8HodDhabLB2hAkyw/CPkp6o=";
+  };
+
+  patches = [
+    # upstream patch fixes 2 failing unittests. remove on update
+    (fetchpatch {
+      name = "python311.patch";
+      url = "https://github.com/tskit-dev/msprime/commit/639125ec942cb898cf4a80638f229e11ce393fbc.patch";
+      hash = "sha256-peli4tdu8Bv21xIa5H8SRdfjQnTMO72IPFqybmSBSO8=";
+      includes = [ "tests/test_ancestry.py" ];
+    })
+  ];
+
+  nativeBuildInputs = [
+    gsl
+    oldest-supported-numpy
+    setuptools-scm
+    wheel
+  ];
+
+  buildInputs = [
+    gsl
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    newick
+    tskit
+    demes
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-xdist
+    scipy
+  ];
+  disabledTests = [
+    "tests/test_ancestry.py::TestSimulator::test_debug_logging"
+    "tests/test_ancestry.py::TestSimulator::test_debug_logging_dtw"
+  ];
+  disabledTestPaths = [
+    "tests/test_demography.py"
+    "tests/test_algorithms.py"
+    "tests/test_provenance.py"
+    "tests/test_dict_encoding.py"
+  ];
+
+  # `python -m pytest` puts $PWD in sys.path, which causes the extension
+  # modules imported as `msprime._msprime` to be unavailable, failing the
+  # tests. This deletes the `msprime` folder such that only what's installed in
+  # $out is used for the imports. See also discussion at:
+  # https://github.com/NixOS/nixpkgs/issues/255262
+  preCheck = ''
+    rm -r msprime
+  '';
+  pythonImportsCheck = [
+    "msprime"
+  ];
+
+  meta = with lib; {
+    description = "Simulate genealogical trees and genomic sequence data using population genetic models";
+    homepage = "https://github.com/tskit-dev/msprime";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ alxsimon ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/msrest/default.nix b/nixpkgs/pkgs/development/python-modules/msrest/default.nix
new file mode 100644
index 000000000000..3463931a1cb6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msrest/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, aiodns
+, aiohttp
+, azure-core
+, buildPythonPackage
+, certifi
+, fetchFromGitHub
+, httpretty
+, isodate
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-oauthlib
+, trio
+}:
+
+buildPythonPackage rec {
+  pname = "msrest";
+  version = "0.7.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Azure";
+    repo = "msrest-for-python";
+    # no tag for 0.7.1
+    rev = "2d8fd04f68a124d0f3df7b81584accc3270b1afc";
+    hash = "sha256-1EXXXflhDeU+erdI+NsWxSX76ooDTl3+MyQwRzm2xV0=";
+  };
+
+  propagatedBuildInputs = [
+    azure-core
+    aiodns
+    aiohttp
+    certifi
+    isodate
+    requests
+    requests-oauthlib
+  ];
+
+  nativeCheckInputs = [
+    httpretty
+    pytest-aiohttp
+    pytestCheckHook
+    trio
+  ];
+
+  disabledTests = [
+    # Test require network access
+    "test_basic_aiohttp"
+    "test_basic_aiohttp"
+    "test_basic_async_requests"
+    "test_basic_async_requests"
+    "test_conf_async_requests"
+    "test_conf_async_requests"
+    "test_conf_async_trio_requests"
+  ];
+
+  pythonImportsCheck = [
+    "msrest"
+  ];
+
+  meta = with lib; {
+    description = "The runtime library for AutoRest generated Python clients";
+    homepage = "https://github.com/Azure/msrest-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bendlas jonringer maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/msrestazure/default.nix b/nixpkgs/pkgs/development/python-modules/msrestazure/default.nix
new file mode 100644
index 000000000000..716667e870d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/msrestazure/default.nix
@@ -0,0 +1,42 @@
+{ pkgs
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, adal
+, msrest
+, mock
+, httpretty
+, pytest
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  version = "0.6.4";
+  pname = "msrestazure";
+
+  # Pypi tarball doesnt include tests
+  # see https://github.com/Azure/msrestazure-for-python/pull/133
+  src = fetchFromGitHub {
+    owner = "Azure";
+    repo = "msrestazure-for-python";
+    rev = "v${version}";
+    sha256 = "0ik81f0n6r27f02gblgm0vl5zl3wc6ijsscihgvc1fgm9f5mk5b5";
+  };
+
+  propagatedBuildInputs = [ adal msrest ];
+
+  nativeCheckInputs = [ httpretty mock pytest ]
+                ++ lib.optionals isPy3k [ pytest-asyncio ];
+
+  checkPhase = ''
+    pytest tests/
+  '';
+
+  meta = with pkgs.lib; {
+    description = "The runtime library 'msrestazure' for AutoRest generated Python clients.";
+    homepage = "https://azure.microsoft.com/en-us/develop/python/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bendlas jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mss/default.nix b/nixpkgs/pkgs/development/python-modules/mss/default.nix
new file mode 100644
index 000000000000..6a82bffaa6c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mss/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mss";
+  version = "9.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bre5AIzydCiBH6M66zXzM024Hj98wt1J7HxuWpSznxI=";
+  };
+
+  prePatch = ''
+    # By default it attempts to build Windows-only functionality
+    rm src/mss/windows.py
+  '';
+
+  # Skipping tests due to most relying on DISPLAY being set
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "mss"
+  ];
+
+  meta = with lib; {
+    description = "Cross-platform multiple screenshots module";
+    homepage = "https://github.com/BoboTiG/python-mss";
+    changelog = "https://github.com/BoboTiG/python-mss/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ austinbutler ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mt-940/default.nix b/nixpkgs/pkgs/development/python-modules/mt-940/default.nix
new file mode 100644
index 000000000000..e8a032142254
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mt-940/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "mt-940";
+  version = "4.30.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "wolph";
+    repo = "mt940";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-t6FOMu+KcEib+TZAv5uVAzvrUSt/k/RQn28jpdAY5Y0=";
+  };
+
+  postPatch = ''
+    sed -i "/--cov/d" pytest.ini
+    sed -i "/--no-cov/d" pytest.ini
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pyyaml
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mt940"
+  ];
+
+  meta = with lib; {
+    description = "Module to parse MT940 files and returns smart Python collections for statistics and manipulation";
+    homepage = "https://github.com/WoLpH/mt940";
+    changelog = "https://github.com/wolph/mt940/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mujson/default.nix b/nixpkgs/pkgs/development/python-modules/mujson/default.nix
new file mode 100644
index 000000000000..c37c38a7ca87
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mujson/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "mujson";
+  version = "1.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-J9nPGxDkLQje6AkL9cewNqmQ7Z+00TXBEr3p71E2cnE=";
+  };
+
+  # LICENSE file missing from src
+  # https://github.com/mattgiles/mujson/issues/8
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "license_file = LICENSE" ""
+  '';
+
+  # No tests
+  doCheck = false;
+  pythonImportsCheck = [ "mujson" ];
+
+  meta = with lib; {
+    description = "Use the fastest JSON functions available at import time";
+    homepage = "https://github.com/mattgiles/mujson";
+    license = licenses.mit;
+    maintainers = with maintainers; [ artturin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mullvad-api/default.nix b/nixpkgs/pkgs/development/python-modules/mullvad-api/default.nix
new file mode 100644
index 000000000000..22e6647b57d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mullvad-api/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "mullvad-api";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    pname = "mullvad_api";
+    inherit version;
+    sha256 = "0r0hc2d6vky52hxdqxn37w0y42ddh1zal6zz2cvqlxamc53wbiv1";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "mullvad_api" ];
+
+  meta = with lib; {
+    description = "Python client for the Mullvad API";
+    homepage = "https://github.com/meichthys/mullvad-api";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mullvad-closest/default.nix b/nixpkgs/pkgs/development/python-modules/mullvad-closest/default.nix
new file mode 100644
index 000000000000..c5d45dfd1751
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mullvad-closest/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, setuptools
+, click
+, geopy
+, ping3
+, requests
+, tabulate
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "mullvad-closest";
+  version = "unstable-2023-07-09";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "Ch00k";
+    repo = "mullvad-closest";
+    rev = "894d2075a520fcad238256725245030374693a16";
+    hash = "sha256-scJiYjEmnDDElE5rHdPbnnuNjjRB0/X3vNGLoi2MAmo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    click
+    geopy
+    ping3
+    requests
+    tabulate
+  ];
+
+  pythonImportsCheck = [ "mullvad_closest" ];
+
+  meta = with lib; {
+    description = "Find Mullvad servers with the lowest latency at your location";
+    homepage = "https://github.com/Ch00k/mullvad-closest";
+    license = licenses.unlicense;
+    maintainers = with maintainers; [ siraben ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mulpyplexer/default.nix b/nixpkgs/pkgs/development/python-modules/mulpyplexer/default.nix
new file mode 100644
index 000000000000..ee27dc20766d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mulpyplexer/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "mulpyplexer";
+  version = "0.09";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0c5xzci1djy1yi9hxxh8g67l6ms8r7ad7ja20pv8hfbdysdrwkhl";
+  };
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "mulpyplexer" ];
+
+  meta = with lib; {
+    description = "Multiplex interactions with lists of Python objects";
+    homepage = "https://github.com/zardus/mulpyplexer";
+    license = with licenses; [ bsd2 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/multi-key-dict/default.nix b/nixpkgs/pkgs/development/python-modules/multi-key-dict/default.nix
new file mode 100644
index 000000000000..c959f2e8f2ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/multi-key-dict/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "multi-key-dict";
+  version = "2.0.3";
+  pyproject = true;
+
+  src = fetchPypi {
+    pname = "multi_key_dict";
+    inherit version;
+    hash = "sha256-3uvewXqjChxDLLP0N+gfhiHhwFQqDAYXp09x4jLpk54=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "multi_key_dict"
+  ];
+
+  meta = with lib; {
+    description = "multi_key_dict";
+    homepage = "https://github.com/formiaczek/multi_key_dict";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/multidict/default.nix b/nixpkgs/pkgs/development/python-modules/multidict/default.nix
new file mode 100644
index 000000000000..863e005d4a4b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/multidict/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "multidict";
+  version = "6.0.4";
+
+  disabled = pythonOlder "3.7";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NmaQZJLvt2RTwOe5fyz0WbBoLnQCwEialUhJZdvB2kk=";
+  };
+
+  postPatch = ''
+    sed -i '/^addopts/d' setup.cfg
+  '';
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "multidict" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/aio-libs/multidict/blob/v${version}/CHANGES.rst";
+    description = "Multidict implementation";
+    homepage = "https://github.com/aio-libs/multidict/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/multimethod/default.nix b/nixpkgs/pkgs/development/python-modules/multimethod/default.nix
new file mode 100644
index 000000000000..cc0ec79acdfe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/multimethod/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "multimethod";
+  version = "1.9.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "coady";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-KfO+6bZOZOv9SWTV4eqJTWb3/PeCpnXknSF47ddZR5o=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "multimethod"
+  ];
+
+  meta = with lib; {
+    description = "Multiple argument dispatching";
+    homepage = "https://coady.github.io/multimethod/";
+    changelog = "https://github.com/coady/multimethod/tree/v${version}#changes";
+    license = licenses.asl20;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/multipart/default.nix b/nixpkgs/pkgs/development/python-modules/multipart/default.nix
new file mode 100644
index 000000000000..84daaac2773f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/multipart/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "multipart";
+  version = "0.2.4";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "06ba205360bc7096fefe618e4f1e9b2cdb890b4f2157053a81f386912a2522cb";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "dont-test-semicolon-separators-in-urlencoded-data.patch";
+      url = "https://github.com/defnull/multipart/commit/4d4ac6b79c453918ebf40c690e8d57d982ee840b.patch";
+      hash = "sha256-rMeMhQEhonWAHzy5M8Im5mL6km5a9O0CGVOV+T3UNqo=";
+    })
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "multipart" ];
+
+  meta = {
+    description = "Parser for multipart/form-data";
+    homepage = "https://github.com/defnull/multipart";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/multipledispatch/default.nix b/nixpkgs/pkgs/development/python-modules/multipledispatch/default.nix
new file mode 100644
index 000000000000..0953e46a5545
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/multipledispatch/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "multipledispatch";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-XIOZFUZcaCBsPpxHM1eQghbCg4O0JTYeXRRFlL+Fp+A=";
+  };
+
+  # No tests in archive
+  doCheck = false;
+
+  propagatedBuildInputs = [ six ];
+
+  meta = {
+    homepage = "https://github.com/mrocklin/multipledispatch/";
+    description = "A relatively sane approach to multiple dispatch in Python";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/multiprocess/default.nix b/nixpkgs/pkgs/development/python-modules/multiprocess/default.nix
new file mode 100644
index 000000000000..647281b8b4ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/multiprocess/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, dill
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "multiprocess";
+  version = "0.70.15";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "uqfoundation";
+    repo = pname;
+    rev = "refs/tags/multiprocess-${version}";
+    hash = "sha256-fpyFBrQXy5TwbHmce3qg1RiM8JnH3J5skl3es1IQPiw=";
+  };
+
+  propagatedBuildInputs = [
+    dill
+  ];
+
+  # Python-version dependent tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "multiprocess"
+  ];
+
+  meta = with lib; {
+    description = "Multiprocessing and multithreading in Python";
+    homepage = "https://github.com/uqfoundation/multiprocess";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/multiset/default.nix b/nixpkgs/pkgs/development/python-modules/multiset/default.nix
new file mode 100644
index 000000000000..0e6e143676bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/multiset/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, setuptools
+, setuptools-scm
+, wheel
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "multiset";
+  version = "3.0.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5FZxyug4Wo5iSKmwejqDKAwtDMQxJxMFjPus3F7Jlz4=";
+  };
+
+  patches = [
+    # https://github.com/wheerd/multiset/pull/115
+    (fetchpatch {
+      name = "relax-setuptools-scm-dependency.patch";
+      url = "https://github.com/wheerd/multiset/commit/296187b07691c94b783f65504afc580a355abd96.patch";
+      hash = "sha256-vnZR1cyM/2/JfbLuVOxJuC9oMVVVploUHpbzagmo+AE=";
+    })
+  ];
+
+  postPatch = ''
+    # Drop broken version specifier
+    sed -i '/python_requires/d' setup.cfg
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  pythonImportsCheck = [
+    "multiset"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "An implementation of a multiset";
+    homepage = "https://github.com/wheerd/multiset";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/multitasking/default.nix b/nixpkgs/pkgs/development/python-modules/multitasking/default.nix
new file mode 100644
index 000000000000..a186325b3941
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/multitasking/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "multitasking";
+  version = "0.0.11";
+
+  # GitHub source releases aren't tagged
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-TWvDzGX5stynL7Wnh4UKiNro9iDCs2rptVJI5RvNYCY=";
+  };
+
+  doCheck = false;  # No tests included
+  pythonImportsCheck = [ "multitasking" ];
+
+  meta = with lib; {
+    description = "Non-blocking Python methods using decorators";
+    homepage = "https://github.com/ranaroussi/multitasking";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/munch/default.nix b/nixpkgs/pkgs/development/python-modules/munch/default.nix
new file mode 100644
index 000000000000..0ff62dcbee2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/munch/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, pbr
+}:
+
+buildPythonPackage rec {
+  pname = "munch";
+  version = "4.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-VCyxUUYSYyFqTjfD/Zr8Ql/urziqowJc0qmB+ttCIjU=";
+  };
+
+  propagatedBuildInputs = [ six pbr ];
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A dot-accessible dictionary (a la JavaScript objects)";
+    license = licenses.mit;
+    homepage = "https://github.com/Infinidat/munch";
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mung/default.nix b/nixpkgs/pkgs/development/python-modules/mung/default.nix
new file mode 100644
index 000000000000..03fcd29dba75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mung/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, lxml
+, numpy
+, pytestCheckHook
+, scikit-image
+}:
+let
+  version = "1.2";
+in
+buildPythonPackage {
+  pname = "mung";
+  inherit version;
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "OMR-Research";
+    repo = "mung";
+    rev = "refs/tags/${version}";
+    hash = "sha256-NSKaJkJRevTy5gh6/ik8Qe46bOPdznsmXPgh7Xz7vXQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    lxml
+    numpy
+    scikit-image
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mung"
+  ];
+
+  meta = with lib; {
+    description = "Music Notation Graph: a data model for optical music recognition";
+    homepage = "https://github.com/OMR-Research/mung";
+    changelog = "https://github.com/OMR-Research/mung/blob/${version}/CHANGES.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ piegames ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/munkres/default.nix b/nixpkgs/pkgs/development/python-modules/munkres/default.nix
new file mode 100644
index 000000000000..a047db7ffd9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/munkres/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, isPy3k
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "munkres";
+  version = "1.1.4";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fc44bf3c3979dada4b6b633ddeeb8ffbe8388ee9409e4d4e8310c2da1792db03";
+  };
+
+  patches = [
+    # Fixes test on 32-bit systems.
+    # Remove if https://github.com/bmc/munkres/pull/41 is merged.
+    (fetchpatch {
+      url = "https://github.com/bmc/munkres/commit/380a0d593a0569a761c4a035edaa4414c3b4b31d.patch";
+      sha256 = "0ga63k68r2080blzi04ajdl1m6xd87mmlqa8hxn9hyixrg1682vb";
+    })
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    homepage = "http://bmc.github.com/munkres/";
+    description = "Munkres algorithm for the Assignment Problem";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/murmurhash/default.nix b/nixpkgs/pkgs/development/python-modules/murmurhash/default.nix
new file mode 100644
index 000000000000..6845d8a5b6b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/murmurhash/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "murmurhash";
+  version = "1.0.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-UoKqsTF4BMbr1t1/afFbqQda7mccRKNL4r3g8bEe+Io=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'wheel>=0.32.0,<0.33.0'" ""
+  '';
+
+  buildInputs = [
+   cython
+  ];
+
+  # No test
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "murmurhash"
+  ];
+
+  meta = with lib; {
+    description = "Cython bindings for MurmurHash2";
+    homepage = "https://github.com/explosion/murmurhash";
+    license = licenses.mit;
+    maintainers = with maintainers; [ aborsu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/muscima/default.nix b/nixpkgs/pkgs/development/python-modules/muscima/default.nix
new file mode 100644
index 000000000000..37eb4950bfb7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/muscima/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, lxml
+, matplotlib
+, numpy
+, pytestCheckHook
+, scikit-image
+, scikit-learn
+}:
+
+let
+  rev = "9a016380625927f385e699664026c90356557850";
+in
+buildPythonPackage {
+  pname = "muscima";
+  version = "unstable-2023-04-26";
+
+  src = fetchFromGitHub {
+    owner = "hajicj";
+    repo = "muscima";
+    inherit rev;
+    hash = "sha256-0mRLJATn+6dYswgDg2zs7RHKSvY4+gNt4SBHeF0G3Xg=";
+  };
+
+  format = "setuptools";
+
+  propagatedBuildInputs = [
+    lxml
+    numpy
+    scikit-image
+    scikit-learn
+    matplotlib
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # They hard-code the path to the dataset and expect you to edit the test to update it to your value
+    "test/test_dataset.py"
+  ];
+
+  meta = with lib; {
+    description = "Tools for working with the MUSCIMA++ dataset of handwritten music notation";
+    homepage = "https://github.com/hajicj/muscima";
+    changelog = "https://github.com/hajicj/muscima/blob/${rev}/CHANGES.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ piegames ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/music-tag/default.nix b/nixpkgs/pkgs/development/python-modules/music-tag/default.nix
new file mode 100644
index 000000000000..f997ca47253c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/music-tag/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mutagen
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "music-tag";
+  version = "0.4.3";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Cqtubu2o3w9TFuwtIZC9dFYbfgNWKrCRzo1Wh828//Y=";
+  };
+
+  propagatedBuildInputs = [
+    mutagen
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [ "test" ];
+
+  # Tests fail: ModuleNotFoundError: No module named '_test_common'
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "music_tag"
+  ];
+
+  meta = with lib; {
+    description = "Simple interface to edit audio file metadata";
+    homepage = "https://github.com/KristoforMaynard/music-tag";
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/musicbrainzngs/default.nix b/nixpkgs/pkgs/development/python-modules/musicbrainzngs/default.nix
new file mode 100644
index 000000000000..e5f5eff6b284
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/musicbrainzngs/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "musicbrainzngs";
+  version = "0.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "09z6k07pxncfgfc8clfmmxl2xqbd7h8x8bjzwr95hc0bzl00275b";
+  };
+
+  buildInputs = [ pkgs.glibcLocales ];
+
+  LC_ALL="en_US.UTF-8";
+
+  preCheck = ''
+    # Remove tests that rely on networking (breaks sandboxed builds)
+    rm test/test_submit.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://python-musicbrainzngs.readthedocs.org/";
+    description = "Python bindings for musicbrainz NGS webservice";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mutag/default.nix b/nixpkgs/pkgs/development/python-modules/mutag/default.nix
new file mode 100644
index 000000000000..3ceb5e966c2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mutag/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, pyparsing
+}:
+
+buildPythonPackage {
+  pname = "mutag";
+  version = "0.0.2-2ffa0258ca";
+  disabled = ! isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "aroig";
+    repo = "mutag";
+    rev = "2ffa0258cadaf79313241f43bf2c1caaf197d9c2";
+    hash = "sha256-YT3DGvYPyTuB70gg6p/3oXcTahEPcNuSIqe56xu3rSs=";
+  };
+
+  propagatedBuildInputs = [ pyparsing ];
+
+  meta = with lib; {
+    homepage = "https://github.com/aroig/mutag";
+    description = "A script to change email tags in a mu indexed maildir";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mutagen/default.nix b/nixpkgs/pkgs/development/python-modules/mutagen/default.nix
new file mode 100644
index 000000000000..236af1eb5d1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mutagen/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+
+# docs
+, python
+, sphinx
+, sphinx-rtd-theme
+
+# tests
+, hypothesis
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mutagen";
+  version = "1.47.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-cZ+t7wqXjDG0zzyVYmGzxYtpSLMgIweKIRex3gnw/Jk=";
+  };
+
+  outputs = [
+    "out"
+    "doc"
+  ];
+
+  nativeBuildInputs = [
+    sphinx
+    sphinx-rtd-theme
+  ];
+
+  postInstall = ''
+    ${python.pythonOnBuildForHost.interpreter} setup.py build_sphinx --build-dir=$doc
+  '';
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Hypothesis produces unreliable results: Falsified on the first call but did not on a subsequent one
+    "test_test_fileobj_save"
+    "test_test_fileobj_load"
+    "test_test_fileobj_delete"
+    "test_mock_fileobj"
+  ];
+
+  pythonImportsCheck = [
+    "mutagen"
+  ];
+
+  meta = with lib; {
+    description = "Python module for handling audio metadata";
+    longDescription = ''
+      Mutagen is a Python module to handle audio metadata. It supports
+      ASF, FLAC, MP4, Monkey's Audio, MP3, Musepack, Ogg Opus, Ogg FLAC,
+      Ogg Speex, Ogg Theora, Ogg Vorbis, True Audio, WavPack, OptimFROG,
+      and AIFF audio files. All versions of ID3v2 are supported, and all
+      standard ID3v2.4 frames are parsed. It can read Xing headers to
+      accurately calculate the bitrate and length of MP3s. ID3 and APEv2
+      tags can be edited regardless of audio format. It can also
+      manipulate Ogg streams on an individual packet/page level.
+    '';
+    homepage = "https://mutagen.readthedocs.io";
+    changelog = "https://mutagen.readthedocs.io/en/latest/changelog.html#release-${lib.replaceStrings [ "." ] [ "-" ] version}";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mutatormath/default.nix b/nixpkgs/pkgs/development/python-modules/mutatormath/default.nix
new file mode 100644
index 000000000000..1fdb937e33ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mutatormath/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi
+, defcon, fontmath
+, unicodedata2, fs
+}:
+
+buildPythonPackage rec {
+  pname = "MutatorMath";
+  version = "3.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0r1qq45np49x14zz1zwkaayqrn7m8dn2jlipjldg2ihnmpzw29w1";
+    extension = "zip";
+  };
+
+  propagatedBuildInputs = [ fontmath unicodedata2 defcon ];
+  nativeCheckInputs = [ unicodedata2 fs ];
+
+  meta = with lib; {
+    description = "Piecewise linear interpolation in multiple dimensions with multiple, arbitrarily placed, masters";
+    homepage = "https://github.com/LettError/MutatorMath";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.sternenseemann ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mutesync/default.nix b/nixpkgs/pkgs/development/python-modules/mutesync/default.nix
new file mode 100644
index 000000000000..382f09ca6d0a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mutesync/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "mutesync";
+  version = "0.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1lz3q3q9lw8qxxb8jyrak77v6hkxwi39akyx96j8hd5jjaq2k5qc";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # Project has not published tests yet
+  doCheck = false;
+
+  pythonImportsCheck = [ "mutesync" ];
+
+  meta = with lib; {
+    description = "Python module for interacting with mutesync buttons";
+    homepage = "https://github.com/currentoor/pymutesync";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mutf8/default.nix b/nixpkgs/pkgs/development/python-modules/mutf8/default.nix
new file mode 100644
index 000000000000..dd6f554a66af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mutf8/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mutf8";
+  version = "1.0.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "TkTech";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-4Ojn3t0EbOVdrYEiY8JegJuvW9sz8jt9tKFwOluiGQo=";
+  };
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    # Using pytestCheckHook results in test failures
+    pytest
+  '';
+
+  pythonImportsCheck = [
+    "mutf8"
+  ];
+
+  meta = with lib; {
+    description = "Fast MUTF-8 encoder & decoder";
+    homepage = "https://github.com/TkTech/mutf8";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mwcli/default.nix b/nixpkgs/pkgs/development/python-modules/mwcli/default.nix
new file mode 100644
index 000000000000..cc58e46d20c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mwcli/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonRelaxDepsHook
+, docopt
+, para
+}:
+
+buildPythonPackage rec {
+  pname = "mwcli";
+  version = "0.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ADMb0P8WtXIcnGJ02R4l/TVfRewHc8ig45JurAWHGaA=";
+  };
+
+  # Prevent circular dependency
+  pythonRemoveDeps = [
+    "mwxml"
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    docopt
+    para
+  ];
+
+  # Tests require mwxml which itself depends on this package (circular dependency)
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A set of helper functions and classes for mediawiki-utilities command-line utilities";
+    homepage = "https://github.com/mediawiki-utilities/python-mwcli";
+    license = licenses.mit;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mwclient/default.nix b/nixpkgs/pkgs/development/python-modules/mwclient/default.nix
new file mode 100644
index 000000000000..048364d5bb6e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mwclient/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-oauthlib
+, responses
+, six
+}:
+
+buildPythonPackage rec {
+  version = "0.10.1";
+  pname = "mwclient";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "mwclient";
+    repo = "mwclient";
+    rev = "v${version}";
+    sha256 = "120snnsh9n5svfwkyj1w9jrxf99jnqm0jk282yypd3lpyca1l9hj";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    requests-oauthlib
+    six
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+    responses
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --cov mwclient test" ""
+  '';
+
+  pythonImportsCheck = [
+    "mwclient"
+  ];
+
+  meta = with lib; {
+    description = "Python client library to the MediaWiki API";
+    license = licenses.mit;
+    homepage = "https://github.com/mwclient/mwclient";
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mwdblib/default.nix b/nixpkgs/pkgs/development/python-modules/mwdblib/default.nix
new file mode 100644
index 000000000000..28e7f8c89f8a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mwdblib/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, beautifultable
+, buildPythonPackage
+, click
+, click-default-group
+, fetchFromGitHub
+, humanize
+, keyring
+, unittestCheckHook
+, python-dateutil
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "mwdblib";
+  version = "4.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CERT-Polska";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+hh7SJFITpLumIuzNgBbXtFh+26tUG66UFv6DLDk5ag=";
+  };
+
+  propagatedBuildInputs = [
+    beautifultable
+    click
+    click-default-group
+    humanize
+    keyring
+    python-dateutil
+    requests
+  ];
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  pythonImportsCheck = [
+    "mwdblib"
+  ];
+
+  meta = with lib; {
+    description = "Python client library for the mwdb service";
+    homepage = "https://github.com/CERT-Polska/mwdblib";
+    changelog = "https://github.com/CERT-Polska/mwdblib/releases/tag/v${version}";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mwoauth/default.nix b/nixpkgs/pkgs/development/python-modules/mwoauth/default.nix
new file mode 100644
index 000000000000..2e92fade6d43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mwoauth/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, oauthlib
+, pyjwt
+, pythonOlder
+, requests
+, requests-oauthlib
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "mwoauth";
+  version = "0.3.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-CNr07auqD5WoRfmOVwfecxaoODqWJfIK52iwNZkcNqw=";
+  };
+
+  propagatedBuildInputs = [
+    oauthlib
+    pyjwt
+    requests
+    requests-oauthlib
+    six
+  ];
+
+  # PyPI source has no tests included
+  # https://github.com/mediawiki-utilities/python-mwoauth/issues/44
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "mwoauth"
+  ];
+
+  meta = with lib; {
+    description = "Python library to perform OAuth handshakes with a MediaWiki installation";
+    homepage = "https://github.com/mediawiki-utilities/python-mwoauth";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mwparserfromhell/default.nix b/nixpkgs/pkgs/development/python-modules/mwparserfromhell/default.nix
new file mode 100644
index 000000000000..effa1e42ad36
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mwparserfromhell/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mwparserfromhell";
+  version = "0.6.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-K60L/2FFdjmeRHDWQAuinFLVlWgqS43mQq+7W+v0o0Y=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner"' ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mwparserfromhell"
+  ];
+
+  meta = with lib; {
+    description = "MWParserFromHell is a parser for MediaWiki wikicode";
+    homepage = "https://mwparserfromhell.readthedocs.io/";
+    changelog = "https://github.com/earwig/mwparserfromhell/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ melling ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mwtypes/default.nix b/nixpkgs/pkgs/development/python-modules/mwtypes/default.nix
new file mode 100644
index 000000000000..89e693dda89a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mwtypes/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jsonable
+, nose
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mwtypes";
+  version = "0.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3BF2xZZWKcEj6FmzGa5hUdTjhVMemngWBMDUyjQ045k=";
+  };
+
+  propagatedBuildInputs = [ jsonable ];
+
+  nativeCheckInputs = [
+    nose
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_normalize_path_bad_extension"
+    "test_open_file"
+  ];
+
+  pythonImportsCheck = [ "mwtypes" ];
+
+  meta = with lib; {
+    description = "A set of classes for working with MediaWiki data types.";
+    homepage = "https://github.com/mediawiki-utilities/python-mwtypes";
+    license = licenses.mit;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mwxml/default.nix b/nixpkgs/pkgs/development/python-modules/mwxml/default.nix
new file mode 100644
index 000000000000..792b52f01abc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mwxml/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jsonschema
+, mwcli
+, mwtypes
+, nose
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "mwxml";
+  version = "0.3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-CEjfDPLik3GPVUMRrPRxW9Z59jn05Sy+R9ggZYnbHTE=";
+  };
+
+  propagatedBuildInputs = [
+    jsonschema
+    mwcli
+    mwtypes
+  ];
+
+  nativeCheckInputs = [
+    nose
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_page_with_discussion"
+  ];
+
+  pythonImportsCheck = [ "mwxml" ];
+
+  meta = with lib; {
+    description = "A set of utilities for processing MediaWiki XML dump data";
+    homepage = "https://github.com/mediawiki-utilities/python-mwxml";
+    license = licenses.mit;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mxnet/default.nix b/nixpkgs/pkgs/development/python-modules/mxnet/default.nix
new file mode 100644
index 000000000000..8b386a425a0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mxnet/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, pkgs
+, requests
+, numpy
+, graphviz
+, python
+, isPy3k
+, isPy310
+}:
+
+buildPythonPackage {
+  inherit (pkgs.mxnet) pname version src;
+
+  buildInputs = [ pkgs.mxnet ];
+  propagatedBuildInputs = [ requests numpy graphviz ];
+
+  LD_LIBRARY_PATH = lib.makeLibraryPath [ pkgs.mxnet ];
+
+  doCheck = !isPy3k;
+
+  postPatch = ''
+    # Required to support numpy >=1.24 where np.bool is removed in favor of just bool
+    substituteInPlace python/mxnet/numpy/utils.py \
+      --replace "bool = onp.bool" "bool = bool"
+    substituteInPlace python/setup.py \
+      --replace "graphviz<0.9.0," "graphviz"
+  '';
+
+  preConfigure = ''
+    cd python
+  '';
+
+  postInstall = ''
+    rm -rf $out/mxnet
+    ln -s ${pkgs.mxnet}/lib/libmxnet.so $out/${python.sitePackages}/mxnet
+  '';
+
+  meta = pkgs.mxnet.meta // {
+    broken = (pkgs.mxnet.broken or false) || (isPy310 && pkgs.mxnet.cudaSupport);
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/myfitnesspal/default.nix b/nixpkgs/pkgs/development/python-modules/myfitnesspal/default.nix
new file mode 100644
index 000000000000..c6a944f1674c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/myfitnesspal/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, blessed
+, browser-cookie3
+, keyring
+, keyrings-alt
+, lxml
+, measurement
+, python-dateutil
+, requests
+, rich
+, typing-extensions
+, pytestCheckHook
+, mock
+, nose
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "myfitnesspal";
+  version = "2.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wlQ/mo9MBQo0t1p0h6/TJir3I87DKYAUc022T3hZjH8=";
+  };
+
+  propagatedBuildInputs = [
+    blessed
+    browser-cookie3
+    keyring
+    keyrings-alt
+    lxml
+    measurement
+    python-dateutil
+    requests
+    rich
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    mock
+    nose
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # Remove overly restrictive version constraints
+    sed -i -e "s/>=.*//" requirements.txt
+  '';
+
+  disabledTests = [
+    # Integration tests require an account to be set
+    "test_integration"
+  ];
+
+  pythonImportsCheck = [
+    "myfitnesspal"
+  ];
+
+  meta = with lib; {
+    description = "Python module to access meal tracking data stored in MyFitnessPal";
+    homepage = "https://github.com/coddingtonbear/python-myfitnesspal";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bhipple ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mygpoclient/default.nix b/nixpkgs/pkgs/development/python-modules/mygpoclient/default.nix
new file mode 100644
index 000000000000..c252f8cc294e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mygpoclient/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchFromGitHub, buildPythonPackage, nose, minimock }:
+
+buildPythonPackage rec {
+  pname = "mypgoclient";
+  version = "1.8";
+
+  src = fetchFromGitHub {
+    owner = "gpodder";
+    repo = "mygpoclient";
+    rev = version;
+    sha256 = "0aa28wc55x3rxa7clwfv5v5500ffyaq0vkxaa3v01y1r93dxkdvp";
+  };
+
+  nativeCheckInputs = [ nose minimock ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  doCheck = (!stdenv.isDarwin);
+
+  meta = with lib; {
+    description = "A gpodder.net client library";
+    longDescription = ''
+        The mygpoclient library allows developers to utilize a Pythonic interface
+        to the gpodder.net web services.
+    '';
+    homepage = "https://github.com/gpodder/mygpoclient";
+    license = with licenses; [ gpl3 ];
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/myhdl/default.nix b/nixpkgs/pkgs/development/python-modules/myhdl/default.nix
new file mode 100644
index 000000000000..e5b5bbf97a75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/myhdl/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, verilog
+, ghdl
+, pytest
+, pytest-xdist
+}:
+
+buildPythonPackage rec {
+  pname = "myhdl";
+  # The stable version is from 2019 and it doesn't pass tests
+  version = "unstable-2022-04-26";
+  # The pypi src doesn't contain the ci script used in checkPhase
+  src = fetchFromGitHub {
+    owner = "myhdl";
+    repo = "myhdl";
+    rev = "1a4f5cd4e9de2e7bbf1053c3c2bc9526b5cc524a";
+    hash = "sha256-Tgoem88Y6AhlCKVhMm0Khg6GPcrEktYOqV8xcMaNkl4=";
+  };
+
+  nativeCheckInputs = [
+    pytest
+    pytest-xdist
+    verilog
+    ghdl
+  ];
+  passthru = {
+    # If using myhdl as a dependency, use these if needed and not ghdl and
+    # verlog from all-packages.nix
+    inherit ghdl verilog;
+  };
+  checkPhase = ''
+    runHook preCheck
+
+    for target in {core,iverilog,ghdl}; do
+      env CI_TARGET="$target" bash ./scripts/ci.sh
+    done;
+
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "A free, open-source package for using Python as a hardware description and verification language.";
+    homepage = "https://www.myhdl.org/";
+    license = licenses.lgpl21;
+    maintainers = with maintainers; [ doronbehar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/myhome/default.nix b/nixpkgs/pkgs/development/python-modules/myhome/default.nix
new file mode 100644
index 000000000000..d716d6668080
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/myhome/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "myhome";
+  version = "0.2.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "speijnik";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-DJzwvgvSA9Q0kpueUoQV64pdDDNA7WzGu7r+g5aqutk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    python-dateutil
+    urllib3
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "myhome"
+  ];
+
+  meta = with lib; {
+    description = "Python library for interacting with MyHomeSERVER1";
+    homepage = "https://github.com/speijnik/myhome";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/myjwt/default.nix b/nixpkgs/pkgs/development/python-modules/myjwt/default.nix
new file mode 100644
index 000000000000..a54ab560a235
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/myjwt/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, click
+, colorama
+, cryptography
+, exrex
+, fetchFromGitHub
+, poetry-core
+, pyopenssl
+, pyperclip
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, questionary
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "myjwt";
+  version = "1.6.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "mBouamama";
+    repo = "MyJWT";
+    rev = "refs/tags/${version}";
+    hash = "sha256-qdDA8DpJ9kAPTvCkQcPBHNlUqxwsS0vAESglvUygXhg=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "1.6.0" "${version}" \
+      --replace 'cryptography = "^39.0.2"' 'cryptography = "^39.0.0"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    click
+    colorama
+    cryptography
+    exrex
+    pyopenssl
+    pyperclip
+    questionary
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pythonImportsCheck = [
+    "myjwt"
+  ];
+
+  meta = with lib; {
+    description = "CLI tool for testing vulnerabilities of JSON Web Tokens (JWT)";
+    homepage = "https://github.com/mBouamama/MyJWT";
+    changelog = "https://github.com/tyki6/MyJWT/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+    # Build failures
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mypy-boto3-builder/default.nix b/nixpkgs/pkgs/development/python-modules/mypy-boto3-builder/default.nix
new file mode 100644
index 000000000000..f3c06701eb65
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mypy-boto3-builder/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, black
+, boto3
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, isort
+, jinja2
+, md-toc
+, mdformat
+, newversion
+, poetry-core
+, pyparsing
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "mypy-boto3-builder";
+  version = "7.19.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "youtype";
+    repo = "mypy_boto3_builder";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Gz6OJ2ER60R14aTmhPfodX22FlbicUClBtlqNglTjC4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    black
+    boto3
+    cryptography
+    isort
+    jinja2
+    md-toc
+    mdformat
+    newversion
+    pyparsing
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mypy_boto3_builder"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "TestBotocoreChangelogChangelog"
+  ];
+
+  meta = with lib; {
+    description = "Type annotations builder for boto3";
+    homepage = "https://github.com/youtype/mypy_boto3_builder";
+    changelog = "https://github.com/youtype/mypy_boto3_builder/releases/tag/${version}";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mypy-boto3/default.nix b/nixpkgs/pkgs/development/python-modules/mypy-boto3/default.nix
new file mode 100644
index 000000000000..e3436bbb6b1a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mypy-boto3/default.nix
@@ -0,0 +1,755 @@
+{ lib
+, boto3
+, buildPythonPackage
+, pythonOlder
+, typing-extensions
+, fetchPypi
+}:
+let
+  toUnderscore = str: builtins.replaceStrings [ "-" ] [ "_" ] str;
+
+  buildMypyBoto3Package = serviceName: version: hash:
+    buildPythonPackage rec {
+      pname = "mypy-boto3-${serviceName}";
+      inherit version;
+      format = "setuptools";
+
+      disabled = pythonOlder "3.7";
+
+      src = fetchPypi {
+        inherit pname version hash;
+      };
+
+      propagatedBuildInputs = [
+        boto3
+      ] ++ lib.optionals (pythonOlder "3.12") [
+        typing-extensions
+      ];
+
+      # Project has no tests
+      doCheck = false;
+
+      pythonImportsCheck = [
+        "mypy_boto3_${toUnderscore serviceName}"
+      ];
+
+      meta = with lib; {
+        description = "Type annotations for boto3 ${serviceName}";
+        homepage = "https://github.com/youtype/mypy_boto3_builder";
+        license = with licenses; [ mit ];
+        maintainers = with maintainers; [ fab mbalatsko ];
+      };
+    };
+in
+rec {
+  mypy-boto3-accessanalyzer = buildMypyBoto3Package "accessanalyzer" "1.28.36" "sha256-1gfL7x81tTVZlYL8UwoI5k8pDotu1byCWqP31CruRIo=";
+
+  mypy-boto3-account = buildMypyBoto3Package "account" "1.28.36" "sha256-RDGy7V+YgVlGufL+bFJ1xR5yi4xc2zkV+gTBdXdwkxk=";
+
+  mypy-boto3-acm = buildMypyBoto3Package "acm" "1.28.37" "sha256-NDYWiS7MM7z6mCpRASWh42IGsSTUvVzIJU0eH5V7JUI=";
+
+  mypy-boto3-acm-pca = buildMypyBoto3Package "acm-pca" "1.28.37" "sha256-l79J8dndeHBZTdXhYCUSa39lYFgcgM6/lIUQPx4HbRE=";
+
+  mypy-boto3-alexaforbusiness = buildMypyBoto3Package "alexaforbusiness" "1.28.37" "sha256-Rk2BLp1oqwOG+Rd9lal53RArPjIo1XMkmXhZJLiI6Ik=";
+
+  mypy-boto3-amp = buildMypyBoto3Package "amp" "1.28.36" "sha256-/iFfYQ2hwndbtOPnFx5GopCNOYi4uAAOTbD8Z8xFOoE=";
+
+  mypy-boto3-amplify = buildMypyBoto3Package "amplify" "1.28.36" "sha256-ORwKl4j3M+O9a/JVrfal2lCBOe8QEcjAWscEhRqPrxc=";
+
+  mypy-boto3-amplifybackend = buildMypyBoto3Package "amplifybackend" "1.28.36" "sha256-tx837SLt7DL1bD/bZl0egzVpClfJKaSY6p82yrcHWRQ=";
+
+  mypy-boto3-amplifyuibuilder = buildMypyBoto3Package "amplifyuibuilder" "1.28.54" "sha256-5Y2AacuMzVHdPntUyDts21bUzttM9t8EdBcwV1MHhyU=";
+
+  mypy-boto3-apigateway = buildMypyBoto3Package "apigateway" "1.28.36" "sha256-5GDltAso++KS+EKZPnvzrVFNAHN3SzDxxeE33mq6xoE=";
+
+  mypy-boto3-apigatewaymanagementapi = buildMypyBoto3Package "apigatewaymanagementapi" "1.28.36" "sha256-yh5Xd7rKl6eUZBvnqgVU3BEThbIoVOWA15UEYoFicLo=";
+
+  mypy-boto3-apigatewayv2 = buildMypyBoto3Package "apigatewayv2" "1.28.36" "sha256-ZSj0PoLQaUtqd0qLzU+Eg3YG0q6GwWEitKZCTfYergI=";
+
+  mypy-boto3-appconfig = buildMypyBoto3Package "appconfig" "1.28.52" "sha256-OjHFaTlMso7dbUCyNfOtbIgpRQYmVm7n0PoUZjOaf18=";
+
+  mypy-boto3-appconfigdata = buildMypyBoto3Package "appconfigdata" "1.28.36" "sha256-dGBUpgH/1QQ3nGxhkLWBW06ngmr+Iq2v9MqjrZ0vP1k=";
+
+  mypy-boto3-appfabric = buildMypyBoto3Package "appfabric" "1.28.36" "sha256-WN7nEPs2KweoGu7XUycFpp8i/bOWSlcr+6BZFSFh6KM=";
+
+  mypy-boto3-appflow = buildMypyBoto3Package "appflow" "1.28.42" "sha256-zUqO8SGKoA9umP2iKrw5VXC4pBBVqs4D9Ou/lJwEVBI=";
+
+  mypy-boto3-appintegrations = buildMypyBoto3Package "appintegrations" "1.28.55" "sha256-Sii5aQ9Y1YvpW1QLMXOeboLXzSR7RCZA6hDGvI39yWM=";
+
+  mypy-boto3-application-autoscaling = buildMypyBoto3Package "application-autoscaling" "1.28.36" "sha256-sxkmyfgk3FJPrS9SUJrHA4tNADM8g+wGaEEPnZjv2H4=";
+
+  mypy-boto3-application-insights = buildMypyBoto3Package "application-insights" "1.28.36" "sha256-jNzhi3ashmQFH7QRi28UY5ZZ/su8RwzhU1XzmunOiro=";
+
+  mypy-boto3-applicationcostprofiler = buildMypyBoto3Package "applicationcostprofiler" "1.28.36" "sha256-keA+JdfyJVGf388qcA0HTIq9bUiMeEbcg1/s/SI7mt4=";
+
+  mypy-boto3-appmesh = buildMypyBoto3Package "appmesh" "1.28.36" "sha256-1Cf+Mzgg0KDqBRpCWeCR0lbR5q8KJM+p/p2we6925b0=";
+
+  mypy-boto3-apprunner = buildMypyBoto3Package "apprunner" "1.28.55" "sha256-lBbqHhOqWoudqK4NDFNSpzR/UA/dLCHzFmZWQSNhJLY=";
+
+  mypy-boto3-appstream = buildMypyBoto3Package "appstream" "1.28.49" "sha256-5TgCIA4bbUHgxMcLHrWPEyIIYhjlCXZlvW8mYubA0+I=";
+
+  mypy-boto3-appsync = buildMypyBoto3Package "appsync" "1.28.36" "sha256-Qag3caLiBRlUWl+TbUQjGkoAbQk+CEbuzZAJgq21PdE=";
+
+  mypy-boto3-arc-zonal-shift = buildMypyBoto3Package "arc-zonal-shift" "1.28.36" "sha256-hTGtmMTWhsMqo+Vq2Bxtfo1sGezi1vD05LsQyGOl9Ps=";
+
+  mypy-boto3-athena = buildMypyBoto3Package "athena" "1.28.36" "sha256-p232qs49wdkbP3RkDWF80bSALl80iiLbLxbfzgsB7iY=";
+
+  mypy-boto3-auditmanager = buildMypyBoto3Package "auditmanager" "1.28.38" "sha256-t32bXFUOsVNVs+1Sagx2PIO7/Re6gN2cOevLj+7gbqo=";
+
+  mypy-boto3-autoscaling = buildMypyBoto3Package "autoscaling" "1.28.36" "sha256-3b2iUNeY/8ZcZZsyqHTNTsGMwWBxCeiOm+1Tpq+iYf8=";
+
+  mypy-boto3-autoscaling-plans = buildMypyBoto3Package "autoscaling-plans" "1.28.36" "sha256-Hx/rpODs11SdfZTQTcOYAIsPbiLDpreqLdbBHGIEp5E=";
+
+  mypy-boto3-backup = buildMypyBoto3Package "backup" "1.28.36" "sha256-LbGiDazOf32hEoxGTZlTtH9iTj+3ru+sCO0VAMCfN6E=";
+
+  mypy-boto3-backup-gateway = buildMypyBoto3Package "backup-gateway" "1.28.36" "sha256-AGbffUSt3ndl5a0B5nl9CYgYExaM1JLT53T9jVJxeno=";
+
+  mypy-boto3-backupstorage = buildMypyBoto3Package "backupstorage" "1.28.36" "sha256-Km6lRkCrsWep/kAlPXplbyfHyy5D5nnrd0j0v8FID00=";
+
+  mypy-boto3-batch = buildMypyBoto3Package "batch" "1.28.36" "sha256-SEDD3Fjd4y337atj+RVUKIvpUd0oCvje8gOF1/Rg7Gs=";
+
+  mypy-boto3-billingconductor = buildMypyBoto3Package "billingconductor" "1.28.41" "sha256-aUphZNHrTLUt4dOvg+GmZR7z3whq5jx2PVsjvcY0qS0=";
+
+  mypy-boto3-braket = buildMypyBoto3Package "braket" "1.28.53" "sha256-fMNDKmjx/2hUJHWEWcveYbsbIkiWUXTQSv4itP8zOas=";
+
+  mypy-boto3-budgets = buildMypyBoto3Package "budgets" "1.28.57" "sha256-Af6omXHyctUeXbEOQC/KoiE3ux88r/hyxlWQoMM1eF4=";
+
+  mypy-boto3-ce = buildMypyBoto3Package "ce" "1.28.36" "sha256-lBrKm4s1QPGTuZHtHt+uNhX9zsMhNuV0l23822IYIDI=";
+
+  mypy-boto3-chime = buildMypyBoto3Package "chime" "1.28.37" "sha256-fg8svfLvw+Rzhcr+HxrjHtXw9UE1vuccaOFvjfgxC58=";
+
+  mypy-boto3-chime-sdk-identity = buildMypyBoto3Package "chime-sdk-identity" "1.28.37" "sha256-r+UvZ213ffIOdmZ1V8MNtZN/i3ozeKfwv7VIvJZ4CRg=";
+
+  mypy-boto3-chime-sdk-media-pipelines = buildMypyBoto3Package "chime-sdk-media-pipelines" "1.28.54" "sha256-ewC4woDpDkGUBvPgjpcctkO860EJWHGvZrgCgXSsPbA=";
+
+  mypy-boto3-chime-sdk-meetings = buildMypyBoto3Package "chime-sdk-meetings" "1.28.36" "sha256-OZijI8aLKnnZnXf3q8LmePd9ncIrDj2zRq19tNlNQTk=";
+
+  mypy-boto3-chime-sdk-messaging = buildMypyBoto3Package "chime-sdk-messaging" "1.28.37" "sha256-qMLqjzniJfyVCfnMGiIPMRzQoIj309P5WDBjy1P7B8Y=";
+
+  mypy-boto3-chime-sdk-voice = buildMypyBoto3Package "chime-sdk-voice" "1.28.36" "sha256-e627SiCiQV38AzvYusuNEsD9XoYkTYYbaTMJ2odKzAo=";
+
+  mypy-boto3-cleanrooms = buildMypyBoto3Package "cleanrooms" "1.28.38" "sha256-fbuCwuzXiK9ekk30m90WZW7LcDFLeR/Ta9BvFnT/wnU=";
+
+  mypy-boto3-cloud9 = buildMypyBoto3Package "cloud9" "1.28.47" "sha256-vV+cqYs7msRzBkIIz4uA123QM54gFpi1q9lXo997BOk=";
+
+  mypy-boto3-cloudcontrol = buildMypyBoto3Package "cloudcontrol" "1.28.36" "sha256-DshOzjolyUCztdlOqxxvRlKIIJP6izeyhp2Wl6ObCrY=";
+
+  mypy-boto3-clouddirectory = buildMypyBoto3Package "clouddirectory" "1.28.36" "sha256-ikyPoBWFRXl95QylMg3rstBymj3HKZqQs0orb14Uorg=";
+
+  mypy-boto3-cloudformation = buildMypyBoto3Package "cloudformation" "1.28.48" "sha256-775Aczl4AIJCh8jVKmU4MRKGL5A7Fv1Ye1ETRJZSNxs=";
+
+  mypy-boto3-cloudfront = buildMypyBoto3Package "cloudfront" "1.28.36" "sha256-lY3dwCA/xw6YIgmmJeglC3/mHubiKNqPqrrif6ZreDc=";
+
+  mypy-boto3-cloudhsm = buildMypyBoto3Package "cloudhsm" "1.28.39" "sha256-1K3HPvtZSkQZD5/V9T0tXv6PC2NSoB5v5aR20OWV6kw=";
+
+  mypy-boto3-cloudhsmv2 = buildMypyBoto3Package "cloudhsmv2" "1.28.36" "sha256-mxvW/ge2gEkGF0rz4LJZCkEIveNGkt9ud5bqs4WhlBs=";
+
+  mypy-boto3-cloudsearch = buildMypyBoto3Package "cloudsearch" "1.28.36" "sha256-fEGcYuWWDHOalygjig2qdMn8A3T4vBYZIbZRHtRRQns=";
+
+  mypy-boto3-cloudsearchdomain = buildMypyBoto3Package "cloudsearchdomain" "1.28.36" "sha256-yRUv7XlIpCqkyFw+whHh07LUw0aKbcRa0UkR6zpVtCA=";
+
+  mypy-boto3-cloudtrail = buildMypyBoto3Package "cloudtrail" "1.28.36" "sha256-YUrRZ53Wdd4CCjq9VYRkAIGxu2wYTaqXF7Fp4DA7jM4=";
+
+  mypy-boto3-cloudtrail-data = buildMypyBoto3Package "cloudtrail-data" "1.28.36" "sha256-aUZYh0fTrcv1d56HRdu7u4CzAMiCvVlN/tKY1e7piLM=";
+
+  mypy-boto3-cloudwatch = buildMypyBoto3Package "cloudwatch" "1.28.36" "sha256-108mLOQPp+qUdIBWHlN2UO5pRrIIrAf2wM/a/BYAFEM=";
+
+  mypy-boto3-codeartifact = buildMypyBoto3Package "codeartifact" "1.28.52" "sha256-kmPzmdQj79l+8KY7Q/E4qTxCxAEhEPivYiR1Hh04qm0=";
+
+  mypy-boto3-codebuild = buildMypyBoto3Package "codebuild" "1.28.36" "sha256-po4qcd6jiYjqMQj7aP+eMzNJcmwjYP22Q92fHkx1q5U=";
+
+  mypy-boto3-codecatalyst = buildMypyBoto3Package "codecatalyst" "1.28.36" "sha256-IuFxPWpE6zCGfbVfhTBtueUSspeVaq9TrESkfHdrxI8=";
+
+  mypy-boto3-codecommit = buildMypyBoto3Package "codecommit" "1.28.36" "sha256-o/kVzldUZNfMmK3Ni5L0kOLjKLxsB93YwutqM5GvHqQ=";
+
+  mypy-boto3-codedeploy = buildMypyBoto3Package "codedeploy" "1.28.55" "sha256-jkN9DCiS5fKhBq7752gRzHwmfdohQBZOSNGaA1OxVbc=";
+
+  mypy-boto3-codeguru-reviewer = buildMypyBoto3Package "codeguru-reviewer" "1.28.36" "sha256-xUkKfYEBmqA0D8RKxbf8VF0XeYOgwNWh1y7ORnj1VpM=";
+
+  mypy-boto3-codeguru-security = buildMypyBoto3Package "codeguru-security" "1.28.36" "sha256-EU6VTdhzWLofMEFF0vOXTDpJI/BkC3FpSAz1rbtbFWA=";
+
+  mypy-boto3-codeguruprofiler = buildMypyBoto3Package "codeguruprofiler" "1.28.36" "sha256-DHUALwX0ec7rzaSsU0vASersuuHpJXY8cDI8cDhzgl0=";
+
+  mypy-boto3-codepipeline = buildMypyBoto3Package "codepipeline" "1.28.36" "sha256-isqRkPLovlkHgmBuuYDPBTaBlOdu3LgwajD+z3luO8c=";
+
+  mypy-boto3-codestar = buildMypyBoto3Package "codestar" "1.28.36" "sha256-+D1SBuI6JMA0ISBv5OiGkA43dOESGH4d4m8CUN4Uhxk=";
+
+  mypy-boto3-codestar-connections = buildMypyBoto3Package "codestar-connections" "1.28.36" "sha256-1K0mrUUO0ycP7uBCqnESd/iGiElL0eqJfwLTpgPH5a0=";
+
+  mypy-boto3-codestar-notifications = buildMypyBoto3Package "codestar-notifications" "1.28.36" "sha256-BYTeNmL6fKXD6Ym0Z3DOZvLaTqRwANDWfCcWs9TUZ+Y=";
+
+  mypy-boto3-cognito-identity = buildMypyBoto3Package "cognito-identity" "1.28.36" "sha256-fJIKiNsKDcoDtTIRMxbxpcO6QZOl8KnCn2qTkb4owLI=";
+
+  mypy-boto3-cognito-idp = buildMypyBoto3Package "cognito-idp" "1.28.56" "sha256-LmuBr551lvNWlyPbEFTAgZA4+XSeFX4tK8kbuabo2JU=";
+
+  mypy-boto3-cognito-sync = buildMypyBoto3Package "cognito-sync" "1.28.36" "sha256-Hx+/3Q+FLMeDRu+ijTl80WbmqjW/jzpW8eDar8hu/ro=";
+
+  mypy-boto3-comprehend = buildMypyBoto3Package "comprehend" "1.28.37" "sha256-OK8LtQoV2Ccqc4qjRBNJirRDM8wHR7VDzcgbaJNrGok=";
+
+  mypy-boto3-comprehendmedical = buildMypyBoto3Package "comprehendmedical" "1.28.36" "sha256-6uyeuxkhRD5Xpfh5u09U28Zg1OzLyzwhgQZ/LRGI9lc=";
+
+  mypy-boto3-compute-optimizer = buildMypyBoto3Package "compute-optimizer" "1.28.41" "sha256-TYY9yrw8Az+x01fp3mXc2zzX7YBdnAQQr1uy+E8FkdQ=";
+
+  mypy-boto3-config = buildMypyBoto3Package "config" "1.28.36" "sha256-3NUJLfbriTXMsGyj+8XNbhI37BLVSm+sShaJJIz6I7s=";
+
+  mypy-boto3-connect = buildMypyBoto3Package "connect" "1.28.55" "sha256-sA6ef9iOyRrCKwxsSHU19IaBwYiVKeTR0+k94wUX4gw=";
+
+  mypy-boto3-connect-contact-lens = buildMypyBoto3Package "connect-contact-lens" "1.28.36" "sha256-7+DHcEkDov1/0mNu/mbKaCwwPfvGRYSEfp3+4tnOnuY=";
+
+  mypy-boto3-connectcampaigns = buildMypyBoto3Package "connectcampaigns" "1.28.39" "sha256-4c074TlgMh8YxdOl9vb+Xs0JEs5k0mA5rYaF+BIH3Ps=";
+
+  mypy-boto3-connectcases = buildMypyBoto3Package "connectcases" "1.28.36" "sha256-oYU/yw9CUltwPfvONhCvH6gCXirzKF26RZj9hdKTtPQ=";
+
+  mypy-boto3-connectparticipant = buildMypyBoto3Package "connectparticipant" "1.28.39" "sha256-iOv8UX4eh07Dwk7zvtv1YXeDiX/RHhuEMGzLafBk+kI=";
+
+  mypy-boto3-controltower = buildMypyBoto3Package "controltower" "1.28.36" "sha256-0j6Fa0hobGlNfvMDmlNrqp4EqIhnYTo9XJ41VpEY+Cs=";
+
+  mypy-boto3-cur = buildMypyBoto3Package "cur" "1.28.36" "sha256-pWKHl8zKmx3ypQOiWtFzRb92630sLJVO0qmn5KEZJ14=";
+
+  mypy-boto3-customer-profiles = buildMypyBoto3Package "customer-profiles" "1.28.39" "sha256-wAghxGUIThqLBfThNliSu39Dl8vmO8QCrfbxvQOuHxc=";
+
+  mypy-boto3-databrew = buildMypyBoto3Package "databrew" "1.28.36" "sha256-LhvgmeMOlP4EAmx3Xd97ZiHi/FeChpGtZ1LIuGkTnMU=";
+
+  mypy-boto3-dataexchange = buildMypyBoto3Package "dataexchange" "1.28.36" "sha256-cNgpRQTJ2JhPw+UZo+HiulWg1998kfgnAB/E6gyvetI=";
+
+  mypy-boto3-datapipeline = buildMypyBoto3Package "datapipeline" "1.28.36" "sha256-IkO7QXwdEWmkzaCOrCWTzNv1xpvwOHGp9wlris/KEws=";
+
+  mypy-boto3-datasync = buildMypyBoto3Package "datasync" "1.28.49" "sha256-BcW47DW0aHb+Gabj6fybaiZgtKotWNvNChyKyaagIw4=";
+
+  mypy-boto3-dax = buildMypyBoto3Package "dax" "1.28.36" "sha256-t5DMgU3iSxWLSXpC9QaNonKKQpl0tr/gQPnPxO+dTbY=";
+
+  mypy-boto3-detective = buildMypyBoto3Package "detective" "1.28.36" "sha256-RGSt2jtwDqC3qWh+Z6IfWoiVpoLDjSqLTSjo7+SUL3Q=";
+
+  mypy-boto3-devicefarm = buildMypyBoto3Package "devicefarm" "1.28.36" "sha256-TSxUsHAhGY4rgscwesf6mnlya8kHb6MZGKPzhud/OC0=";
+
+  mypy-boto3-devops-guru = buildMypyBoto3Package "devops-guru" "1.28.36" "sha256-Whn1VVBzBdav0D31XCH5izyVmZGg/ndPlOamIoY5U94=";
+
+  mypy-boto3-directconnect = buildMypyBoto3Package "directconnect" "1.28.36" "sha256-YUZ2XsKaPLi4qDF1Cuf5/6BZ1Pi+xf65hTBc0NHfQTc=";
+
+  mypy-boto3-discovery = buildMypyBoto3Package "discovery" "1.28.50" "sha256-bUFzZ+Ipw3hmaTvBBPlLRz48U+alvfLBiOKNljEap38=";
+
+  mypy-boto3-dlm = buildMypyBoto3Package "dlm" "1.28.36" "sha256-i+OVrnJ+irxgIWi0ZEad6lPLNwT1cvfQ+0xKKXWe8z0=";
+
+  mypy-boto3-dms = buildMypyBoto3Package "dms" "1.28.53" "sha256-CY3bGLiiciRnscCsqOSdFv04YKDG4gN7f/q3um7QwZ8=";
+
+  mypy-boto3-docdb = buildMypyBoto3Package "docdb" "1.28.36" "sha256-Dbg80rvJBHkXEzLLWeEi7jN6OrVZiJ6+C6wYkhM72J0=";
+
+  mypy-boto3-docdb-elastic = buildMypyBoto3Package "docdb-elastic" "1.28.36" "sha256-XvcexadEtui/Wh2sZnketqygNgpGfaSAGciM64Yc+Sk=";
+
+  mypy-boto3-drs = buildMypyBoto3Package "drs" "1.28.47" "sha256-4JBlsWQLu1KsPSTxwy/ySNQM1ZlIaX1sORvES8Lut00=";
+
+  mypy-boto3-ds = buildMypyBoto3Package "ds" "1.28.36" "sha256-l/k+1VhA6mi6mVRKCUis0gAv/dizqZB5JIqLmj9+IDI=";
+
+  mypy-boto3-dynamodb = buildMypyBoto3Package "dynamodb" "1.28.55" "sha256-owOfitoHohj5fwxwqC7Zz0YaDLUTMZT88eDoexXImaU=";
+
+  mypy-boto3-dynamodbstreams = buildMypyBoto3Package "dynamodbstreams" "1.28.36" "sha256-mqz+YRVZlSbwEKYbaC4ZbWw0qJTXpRObAphfI4sfRV4=";
+
+  mypy-boto3-ebs = buildMypyBoto3Package "ebs" "1.28.36" "sha256-w9OLKJAn9UBnA7x+uedhplSV8plZRYlBpviU9Gv1Ny8=";
+
+  mypy-boto3-ec2 = buildMypyBoto3Package "ec2" "1.28.58" "sha256-p4BGJSydAqtSMH8PFFc/IAwBquLHCq1I6vW50UNySRo=";
+
+  mypy-boto3-ec2-instance-connect = buildMypyBoto3Package "ec2-instance-connect" "1.28.36" "sha256-oVcd5yqbg8Drozgmog4nonRSe4nOM7rwpqZi9HVYTL0=";
+
+  mypy-boto3-ecr = buildMypyBoto3Package "ecr" "1.28.45" "sha256-NYShmgGLrNe26BR7ye9pMpZ4FcCRjGzzkp/1Xxyb5gE=";
+
+  mypy-boto3-ecr-public = buildMypyBoto3Package "ecr-public" "1.28.36" "sha256-LiFZtqdGf9tC6Tj4ukclFyaq/bLos5jZCgPL1y/0VMU=";
+
+  mypy-boto3-ecs = buildMypyBoto3Package "ecs" "1.28.41" "sha256-/aXw4fpS4o3/Jt+jfzm0p4zqZVcoSJLlk9EUMd3+SVo=";
+
+  mypy-boto3-efs = buildMypyBoto3Package "efs" "1.28.53" "sha256-QhSddCRqWUly2w+GLZJHJn/TKpQHbQO88yKny6nj/ZI=";
+
+  mypy-boto3-eks = buildMypyBoto3Package "eks" "1.28.36" "sha256-etvfyKLFr4lKE9DLvKQuHw2YHshhOBTXXTCvDv2hFxE=";
+
+  mypy-boto3-elastic-inference = buildMypyBoto3Package "elastic-inference" "1.28.36" "sha256-BwI32rA8Y1lhc+k/XQh+LHPlFHmaCTr37OYvLFJMX1o=";
+
+  mypy-boto3-elasticache = buildMypyBoto3Package "elasticache" "1.28.36" "sha256-6Ymobcuhh1dOqA9IoN9lWrj639ZKu/NQEP6ImlhapFA=";
+
+  mypy-boto3-elasticbeanstalk = buildMypyBoto3Package "elasticbeanstalk" "1.28.36" "sha256-V2vSEaN7Kf2TPateMNtJ95a+Ad/CRcZOV2JsJlTOPIo=";
+
+  mypy-boto3-elastictranscoder = buildMypyBoto3Package "elastictranscoder" "1.28.36" "sha256-lkz4up43fVyWCOO9dM4xI285wsAu1lnV4mICuJV8D4k=";
+
+  mypy-boto3-elb = buildMypyBoto3Package "elb" "1.28.36" "sha256-c9Re0WZOn+LaK58VJk+YlI3YWn/wrgT+/TdqrOisBnM=";
+
+  mypy-boto3-elbv2 = buildMypyBoto3Package "elbv2" "1.28.42" "sha256-NXyhMxuIbuyyDifzBicvDNQB3ysbVx+azsqpTBhfnZ8=";
+
+  mypy-boto3-emr = buildMypyBoto3Package "emr" "1.28.36" "sha256-DrhDkqcxAAUTfheZRpPJQkFFzeDynByF2wn9jyZr0F4=";
+
+  mypy-boto3-emr-containers = buildMypyBoto3Package "emr-containers" "1.28.36" "sha256-ZG7mf4C31COK7hobIbTLmd64Ydu2Al+NhSMrS8069jQ=";
+
+  mypy-boto3-emr-serverless = buildMypyBoto3Package "emr-serverless" "1.28.54" "sha256-cDbUY1Ftlhyid7CiMEhY7ZepqH2bANrwlU8wdrdDqc4=";
+
+  mypy-boto3-entityresolution = buildMypyBoto3Package "entityresolution" "1.28.48" "sha256-xCYg+Ik/VQpDjRR7QKlYyBffsGWZ7PSl531sTSvMv48=";
+
+  mypy-boto3-es = buildMypyBoto3Package "es" "1.28.36" "sha256-NfMTzKYwYgZ+dbyIzxn+3poLWo8zjF8ANGWQFtMRTbk=";
+
+  mypy-boto3-events = buildMypyBoto3Package "events" "1.28.46" "sha256-/a4rUcfBPQBFxqCnwt23NeZ655B3CEoo+SKHBZMJGtE=";
+
+  mypy-boto3-evidently = buildMypyBoto3Package "evidently" "1.28.36" "sha256-U3igtB9eGBYv8VW+PQXD2fc16FKiYl8musH/ccrrMKA=";
+
+  mypy-boto3-finspace = buildMypyBoto3Package "finspace" "1.28.36" "sha256-3l1/ACy5Z09z/ngQKdq3dgBTp05x+NUCRjj1z8I99/4=";
+
+  mypy-boto3-finspace-data = buildMypyBoto3Package "finspace-data" "1.28.54" "sha256-V5Rxrp94hrUWZgpc+LDn1PwyzZREHDXq3NaZdZQaYoE=";
+
+  mypy-boto3-firehose = buildMypyBoto3Package "firehose" "1.28.56" "sha256-IPwUkzEymLJ4NgB2OrD4mr5hZsmTaGjbbxCiHyFaaDw=";
+
+  mypy-boto3-fis = buildMypyBoto3Package "fis" "1.28.36" "sha256-km9Ia9Hs/rZv3ljv+BVnR9pOxNK3u5luJOMaW670km0=";
+
+  mypy-boto3-fms = buildMypyBoto3Package "fms" "1.28.36" "sha256-mzumkMcF2TMrcnHoPPA0SlrmwFAw0TR1cMvSXF28gvM=";
+
+  mypy-boto3-forecast = buildMypyBoto3Package "forecast" "1.28.36" "sha256-DCa0GNn7XL3iVgGl5M6E7uyPFdyYjrHfqHakCS7clcc=";
+
+  mypy-boto3-forecastquery = buildMypyBoto3Package "forecastquery" "1.28.36" "sha256-s2z8QZR9PP8Kj6yImCwUfh/gtbj4SKLn8wDTOYUVaEE=";
+
+  mypy-boto3-frauddetector = buildMypyBoto3Package "frauddetector" "1.28.36" "sha256-Zn3rGHErin7nPYnyC0Ojr0Kkc5T+YDD2KmZinYNV9Jg=";
+
+  mypy-boto3-fsx = buildMypyBoto3Package "fsx" "1.28.44" "sha256-t90+ngxgivF/KThwaB6/LNPZAHL2oLenhl6KUzSZSzU=";
+
+  mypy-boto3-gamelift = buildMypyBoto3Package "gamelift" "1.28.36" "sha256-ADxlyEX5KgAewNFq7JhYECNIhaoKiPkdqWK2pnS+65A=";
+
+  mypy-boto3-gamesparks = buildMypyBoto3Package "gamesparks" "1.28.36" "sha256-6lQXNJ55FYvkFA14rgJGhRMjBHA3YrOybnsKNecX7So=";
+
+  mypy-boto3-glacier = buildMypyBoto3Package "glacier" "1.28.36" "sha256-L0a7CoD9I0wM8JvzaAxL8bm1SV1XmFi5lvs2SuGPtl4=";
+
+  mypy-boto3-globalaccelerator = buildMypyBoto3Package "globalaccelerator" "1.28.36" "sha256-+nnFS/7kJHvqqiwqkWnYlgeIuSecicI1P+UtWyGUoGQ=";
+
+  mypy-boto3-glue = buildMypyBoto3Package "glue" "1.28.36" "sha256-FhdxJSu2oiCgv9jmrXHahUhZnGEflf6KlIRvSjOG0q4=";
+
+  mypy-boto3-grafana = buildMypyBoto3Package "grafana" "1.28.39" "sha256-OsEvT2f3LEvjz6aojIpG2scoZ80hETvk8t/BTumn+9M=";
+
+  mypy-boto3-greengrass = buildMypyBoto3Package "greengrass" "1.28.36" "sha256-vH/viSZe2UcjtbwGN2Zcf9IB1boBHhL3zmy3IHN1rpg=";
+
+  mypy-boto3-greengrassv2 = buildMypyBoto3Package "greengrassv2" "1.28.36" "sha256-VdsQUNg3a2PUaP8rgx3I1ZxUW4hqJsBCS0B8+7CfP1w=";
+
+  mypy-boto3-groundstation = buildMypyBoto3Package "groundstation" "1.28.36" "sha256-M0HaOpC6zbIaN3VVcM9oE/QzL+me4d5Co5miJGMU3n8=";
+
+  mypy-boto3-guardduty = buildMypyBoto3Package "guardduty" "1.28.53" "sha256-ctMp5+GrKYICPioPi5kB7cnxoP9QFIfbYiDxqf/pPCw=";
+
+  mypy-boto3-health = buildMypyBoto3Package "health" "1.28.39" "sha256-yp8r38QxJVKxiZtrCgvUcuqz2HnTM2IvYjyYGTgAqYc=";
+
+  mypy-boto3-healthlake = buildMypyBoto3Package "healthlake" "1.28.36" "sha256-RYbiExGphCkf8v+oC3ixOOFOnUrXE2bGnOvjRUGdQRQ=";
+
+  mypy-boto3-honeycode = buildMypyBoto3Package "honeycode" "1.28.36" "sha256-pOWZ+WNmgWwGz1sPq/feZiQ2TlXDcpoWMXcDPSESJOY=";
+
+  mypy-boto3-iam = buildMypyBoto3Package "iam" "1.28.37" "sha256-Ob1bi5pIy0fZCdRcE8cTwJnC+EcZYSoKhI16BJfG/PQ=";
+
+  mypy-boto3-identitystore = buildMypyBoto3Package "identitystore" "1.28.40" "sha256-KPPWrEMuciHf3ms3SkUgAaEFNPa5WyFKm5fFfG4o9G8=";
+
+  mypy-boto3-imagebuilder = buildMypyBoto3Package "imagebuilder" "1.28.36" "sha256-2fJtgGfwkY3V07kXAiyi61TUmvq3BVqiN+EFzxTQkvI=";
+
+  mypy-boto3-importexport = buildMypyBoto3Package "importexport" "1.28.36" "sha256-806+dIMqKZ14MifNoDqKgj8MGPYBQVd8KnT+V+eOr/E=";
+
+  mypy-boto3-inspector = buildMypyBoto3Package "inspector" "1.28.36" "sha256-plSUqqsTvOMxMeAYueWNpK8JFHdeOOr8DfgSZov9Gbw=";
+
+  mypy-boto3-inspector2 = buildMypyBoto3Package "inspector2" "1.28.36" "sha256-O20aGL3EhyS5HNYlY6Jv1n0OIUWPr3L2VVjReHwpAGM=";
+
+  mypy-boto3-internetmonitor = buildMypyBoto3Package "internetmonitor" "1.28.47" "sha256-qNv+Qi/5eZ5oUsysYokQufE3BgL32BzA9gdxWsJ6ocU=";
+
+  mypy-boto3-iot = buildMypyBoto3Package "iot" "1.28.56" "sha256-dLDUJEflskkXKb6soxoKRoPxko/Qb9lWkKjPnVklUWc=";
+
+  mypy-boto3-iot-data = buildMypyBoto3Package "iot-data" "1.28.36" "sha256-DDUn2TFgXeeltWJqH7g7D+gKLSQv832/J4lWBVyWmlQ=";
+
+  mypy-boto3-iot-jobs-data = buildMypyBoto3Package "iot-jobs-data" "1.28.36" "sha256-bpKEm6reRSLi74HT9wMGN+xkJPTYSLxOGf8Z7QN1qMY=";
+
+  mypy-boto3-iot-roborunner = buildMypyBoto3Package "iot-roborunner" "1.28.36" "sha256-DFaWmHPzlgZztGfbbxeyDWu2rGLm69r8Ejww5cvzkRQ=";
+
+  mypy-boto3-iot1click-devices = buildMypyBoto3Package "iot1click-devices" "1.28.36" "sha256-GROHe78qVJLlPtw+wH73fzyBjTsrKkUbpVN0U26HsJs=";
+
+  mypy-boto3-iot1click-projects = buildMypyBoto3Package "iot1click-projects" "1.28.36" "sha256-XAtVZ+j5k8eb1G79B+sin/W3bVfq+Vtr/P80BU2XnVQ=";
+
+  mypy-boto3-iotanalytics = buildMypyBoto3Package "iotanalytics" "1.28.36" "sha256-jO+/523WSPqhQCAOr6nFiag/tCHL1Up1A0q76jZ7/qE=";
+
+  mypy-boto3-iotdeviceadvisor = buildMypyBoto3Package "iotdeviceadvisor" "1.28.36" "sha256-0v8vHIOzHO7ZEZEA08hzukJV9EFSnTFh/1K1h3RhCyY=";
+
+  mypy-boto3-iotevents = buildMypyBoto3Package "iotevents" "1.28.36" "sha256-27oaZTqmrBRJ3xlE9QKqLkau+dR30aYdeczVaWwK1Xs=";
+
+  mypy-boto3-iotevents-data = buildMypyBoto3Package "iotevents-data" "1.28.36" "sha256-De7a/DdIEmK9jkd6CekBQ+ZNlp+5hyavdY5ISYNLM20=";
+
+  mypy-boto3-iotfleethub = buildMypyBoto3Package "iotfleethub" "1.28.36" "sha256-AH9zk6pQ5OhupzG9lkZGSAX/ngrFovlldGkfn40TZh4=";
+
+  mypy-boto3-iotfleetwise = buildMypyBoto3Package "iotfleetwise" "1.28.57" "sha256-KE8Q0jmXGhRAD3SmioxKVabyM0zLQEvhzogGEAMGvtU=";
+
+  mypy-boto3-iotsecuretunneling = buildMypyBoto3Package "iotsecuretunneling" "1.28.36" "sha256-ANWiAgtmQCchCYvPPXUGdUHYLJOCoQAsFz8ybpZSceg=";
+
+  mypy-boto3-iotsitewise = buildMypyBoto3Package "iotsitewise" "1.28.36" "sha256-Sr5hmTMLMDxxXwG6s+wv5kkq4NnFCTFjMisOwdniBN4=";
+
+  mypy-boto3-iotthingsgraph = buildMypyBoto3Package "iotthingsgraph" "1.28.36" "sha256-msc7aVFDSQRUNeqHWFqJ+4haUvCq+VYCpmZONl7+ySA=";
+
+  mypy-boto3-iottwinmaker = buildMypyBoto3Package "iottwinmaker" "1.28.36" "sha256-laSFI1ugTL+9bVVQLuMKvQ9WGgXGikvV3k1DsyTIJ00=";
+
+  mypy-boto3-iotwireless = buildMypyBoto3Package "iotwireless" "1.28.36" "sha256-CAAkka/CEZ1D+MgK1cbWDm6mArcRPxAo98Rz3ti6oHk=";
+
+  mypy-boto3-ivs = buildMypyBoto3Package "ivs" "1.28.39" "sha256-bsUwfBojGMRujL9yLhIqBLAxEpgz1H3KCSmhoQ/UrfM=";
+
+  mypy-boto3-ivs-realtime = buildMypyBoto3Package "ivs-realtime" "1.28.47" "sha256-f5aHtTu7H0TY3XYW1OJIkwKlKe6iZj0nxEjwlbEmc/4=";
+
+  mypy-boto3-ivschat = buildMypyBoto3Package "ivschat" "1.28.36" "sha256-WMq8phYMtEl8Ey7tDxBzVexuR4gmZQlO6qpDwYu8xwY=";
+
+  mypy-boto3-kafka = buildMypyBoto3Package "kafka" "1.28.36" "sha256-93kbJxpiLQsnhudgnGoGUimUPfhGMN0cc1x8qqsA/Jc=";
+
+  mypy-boto3-kafkaconnect = buildMypyBoto3Package "kafkaconnect" "1.28.39" "sha256-p2vmaWN7oBdsud3bCB2/rCme7IXKJ4xI/XSFj4AqmGo=";
+
+  mypy-boto3-kendra = buildMypyBoto3Package "kendra" "1.28.46" "sha256-zeKYrDZdcdNISV2eukD7GN/sdve8R5PNbvOhZN5FyRI=";
+
+  mypy-boto3-kendra-ranking = buildMypyBoto3Package "kendra-ranking" "1.28.36" "sha256-C1wYGskKNR6E4bL6OR8ERRwHZ8HpTbhCAoiBKIAsgME=";
+
+  mypy-boto3-keyspaces = buildMypyBoto3Package "keyspaces" "1.28.36" "sha256-p5Tj7bqC/E552Mmr/G+QxOA4LyW4YK9VlztEhKNw/Fc=";
+
+  mypy-boto3-kinesis = buildMypyBoto3Package "kinesis" "1.28.36" "sha256-Q3E8DOj2Oyy9GBEy5xNxAxvZDqwlCu9zV7I51NprhQQ=";
+
+  mypy-boto3-kinesis-video-archived-media = buildMypyBoto3Package "kinesis-video-archived-media" "1.28.36" "sha256-v3hjhhFbCTKsfYTUvI57lEvnRSIX5POdjH/4hC+GthA=";
+
+  mypy-boto3-kinesis-video-media = buildMypyBoto3Package "kinesis-video-media" "1.28.36" "sha256-Si9Dz0blHg5oq8Nnq/6V5NMmt3Zbl9rVt8/UcfwSgnU=";
+
+  mypy-boto3-kinesis-video-signaling = buildMypyBoto3Package "kinesis-video-signaling" "1.28.36" "sha256-sOiEpuZ3AMYRK6daSsoK3ti9LN4v7GgBPSThWTh25Og=";
+
+  mypy-boto3-kinesis-video-webrtc-storage = buildMypyBoto3Package "kinesis-video-webrtc-storage" "1.28.36" "sha256-AJPSjIIX+AQKXPPoNxTESszrC5ZzQhwHeb/eTF/LJkE=";
+
+  mypy-boto3-kinesisanalytics = buildMypyBoto3Package "kinesisanalytics" "1.28.36" "sha256-K/NUI/VQjoxmiL3s7ASUBCBv9GWqKQYpz4o0+oohDFU=";
+
+  mypy-boto3-kinesisanalyticsv2 = buildMypyBoto3Package "kinesisanalyticsv2" "1.28.36" "sha256-k+ftbXSH2gm76lsJvMdvAuAnWBVsLEh829o4x5rUQUQ=";
+
+  mypy-boto3-kinesisvideo = buildMypyBoto3Package "kinesisvideo" "1.28.52" "sha256-X05ZXElPveZ44sea7a0F5oO+wIIpYgTISpUwvACPiEY=";
+
+  mypy-boto3-kms = buildMypyBoto3Package "kms" "1.28.37" "sha256-l4RcfT1vhG8hlaWdapdDB6FqCFseZP56/kDppcBra48=";
+
+  mypy-boto3-lakeformation = buildMypyBoto3Package "lakeformation" "1.28.55" "sha256-RgYc0eRv7agKmJVwqTqsx2ua0Y1B8UHbwQ1eCh5kumU=";
+
+  mypy-boto3-lambda = buildMypyBoto3Package "lambda" "1.28.36" "sha256-cEmOb/a/1gt1hVPSf632kboWlXL6ygHCvUV9oLSLnP8=";
+
+  mypy-boto3-lex-models = buildMypyBoto3Package "lex-models" "1.28.36" "sha256-pe4WZgqSF3iodWqXn94fzNChq946ZydQlwJF7CB0HMc=";
+
+  mypy-boto3-lex-runtime = buildMypyBoto3Package "lex-runtime" "1.28.36" "sha256-pE1gAxoS2hb4N4H7irZNgXERAXBt/eWqF0CZZjszTyI=";
+
+  mypy-boto3-lexv2-models = buildMypyBoto3Package "lexv2-models" "1.28.36" "sha256-6DXon6AyJugNzp9bKXfvspvWGdD11dV5qxBZa7AikbE=";
+
+  mypy-boto3-lexv2-runtime = buildMypyBoto3Package "lexv2-runtime" "1.28.36" "sha256-6wP6YHyctJWXdPO8bmylwhxtJ3jltbWYyAxdu+5+X5w=";
+
+  mypy-boto3-license-manager = buildMypyBoto3Package "license-manager" "1.28.36" "sha256-/XOD5I4y2PHzW9Y+akeF1Oovf04jeh4r4ZcxjUP4ZOU=";
+
+  mypy-boto3-license-manager-linux-subscriptions = buildMypyBoto3Package "license-manager-linux-subscriptions" "1.28.36" "sha256-LuwZUXbQlSC1YSyfNuensyYVoKwy6cZzMbC2/bGJ5Pw=";
+
+  mypy-boto3-license-manager-user-subscriptions = buildMypyBoto3Package "license-manager-user-subscriptions" "1.28.36" "sha256-KcTO20KTKnvcCykL5C4BqDFyj/Xrp0l6gH7JslRIzcQ=";
+
+  mypy-boto3-lightsail = buildMypyBoto3Package "lightsail" "1.28.36" "sha256-3euT5o4jOo39mco4y7geAA7PBF6z7A3lj451xXnB98o=";
+
+  mypy-boto3-location = buildMypyBoto3Package "location" "1.28.36" "sha256-Gl0Q4693qhG9Wii6KlQXw9B5hZcoYoNcsO6rptLGPHQ=";
+
+  mypy-boto3-logs = buildMypyBoto3Package "logs" "1.28.52" "sha256-tR6bl5YSI7/iMUzhaIe70imFezlgph03JIDW1ogWi34=";
+
+  mypy-boto3-lookoutequipment = buildMypyBoto3Package "lookoutequipment" "1.28.48" "sha256-RXWRC9LegKQlODn8zgQJEADZGSuCYMp4/HdFGUge3rU=";
+
+  mypy-boto3-lookoutmetrics = buildMypyBoto3Package "lookoutmetrics" "1.28.36" "sha256-GDkmENl2VbNDdXS26ORGeEoK8YAURJJRVzoxAiFt9L8=";
+
+  mypy-boto3-lookoutvision = buildMypyBoto3Package "lookoutvision" "1.28.36" "sha256-tcA34QM+t2tiaV7kmaNDZjGEbtc6Bs1ZRQoPjHFNojw=";
+
+  mypy-boto3-m2 = buildMypyBoto3Package "m2" "1.28.36" "sha256-6UdS7JMp8vnbP/AHoiQJ+kTBZiPSvymziVeNQnkXNxg=";
+
+  mypy-boto3-machinelearning = buildMypyBoto3Package "machinelearning" "1.28.36" "sha256-ucXN/rMMlxsRBvR0rhvF+X98qKzuvXXHSGRZSqds2Cc=";
+
+  mypy-boto3-macie = buildMypyBoto3Package "macie" "1.28.36" "sha256-T7zd6G5Z4fz1/ZiCOwf+kWbXWCy35JaE3f2OUpWGNpE=";
+
+  mypy-boto3-macie2 = buildMypyBoto3Package "macie2" "1.28.50" "sha256-OSQqQIDB1mPTZNk1eZFHm5Undcc+C4W/cHnXk26STWQ=";
+
+  mypy-boto3-managedblockchain = buildMypyBoto3Package "managedblockchain" "1.28.58" "sha256-WurxI39UdFSgwdxaymDxsoO03bGZ1ooMaCCwOthnrPo=";
+
+  mypy-boto3-managedblockchain-query = buildMypyBoto3Package "managedblockchain-query" "1.28.36" "sha256-3RQJLfH4XCw8ajN6NdEZqhnBjfYZvxqbZOISKaQyuq0=";
+
+  mypy-boto3-marketplace-catalog = buildMypyBoto3Package "marketplace-catalog" "1.28.37" "sha256-Egrc6aap+HyguDM71bJrvFrtG0x3mxHjKqusw8PGTc8=";
+
+  mypy-boto3-marketplace-entitlement = buildMypyBoto3Package "marketplace-entitlement" "1.28.36" "sha256-9pTcu/s4RykpnM/FsI/VuBLmLCz1/AVpWSTPORFVraY=";
+
+  mypy-boto3-marketplacecommerceanalytics = buildMypyBoto3Package "marketplacecommerceanalytics" "1.28.36" "sha256-8omV1nyC83MRbAEwCOzDvyuTHARxCDJtMCkIJ76/42Q=";
+
+  mypy-boto3-mediaconnect = buildMypyBoto3Package "mediaconnect" "1.28.36" "sha256-xJ/i8IAQvwsCD/8F8hVMGuVpI/8ZbiWCW6w2O9PMmwg=";
+
+  mypy-boto3-mediaconvert = buildMypyBoto3Package "mediaconvert" "1.28.53" "sha256-nGLoDX8cgcCHad2hpZvOzNSkq+VfWvTQ6qGbsvqbnbc=";
+
+  mypy-boto3-medialive = buildMypyBoto3Package "medialive" "1.28.45" "sha256-vcf1hxhHJ/F6S58p9Jb/Pic063aeLVc+HrzAnN9ph/A=";
+
+  mypy-boto3-mediapackage = buildMypyBoto3Package "mediapackage" "1.28.36" "sha256-ezPUrghBEb7oInGgyP8JlEf2yKSOPHRznBZ7BcNP6Oc=";
+
+  mypy-boto3-mediapackage-vod = buildMypyBoto3Package "mediapackage-vod" "1.28.36" "sha256-CYgKkn7AOmwBgaMNhq2ofKH5dQXu+hgC0In+UfWa9f0=";
+
+  mypy-boto3-mediapackagev2 = buildMypyBoto3Package "mediapackagev2" "1.28.36" "sha256-oGwfsKI4PEhj5oJKr9pLvma7+nNSFyRlMzC2HYnVCsQ=";
+
+  mypy-boto3-mediastore = buildMypyBoto3Package "mediastore" "1.28.37" "sha256-OptRBCGquVDgcG/7K70WZCdMhGCPSU8Gyb236ooUwhY=";
+
+  mypy-boto3-mediastore-data = buildMypyBoto3Package "mediastore-data" "1.28.36" "sha256-X7PuP1LtOgJo/PJ5TBgq7O0iFAhBiVJRalNbQEWT7W4=";
+
+  mypy-boto3-mediatailor = buildMypyBoto3Package "mediatailor" "1.28.36" "sha256-1w5g2gzMCvufKYjjXey3ZeokZTxuL97LqHdu3CoG2UA=";
+
+  mypy-boto3-medical-imaging = buildMypyBoto3Package "medical-imaging" "1.28.36" "sha256-pAoO8V4SxZnUGou2Gf0p0Shpm7ZIvxdB9ZI8fhZU5U4=";
+
+  mypy-boto3-memorydb = buildMypyBoto3Package "memorydb" "1.28.36" "sha256-GsdpyKFaQyakXnKJzi2cBE0Vb1gLyUhXQ5VeGlkhVmk=";
+
+  mypy-boto3-meteringmarketplace = buildMypyBoto3Package "meteringmarketplace" "1.28.36" "sha256-LiZj7Dltu+C717k1Aywtkk1faeSUAFYCMiOe5Mgoy4A=";
+
+  mypy-boto3-mgh = buildMypyBoto3Package "mgh" "1.28.36" "sha256-7AGJAF8dh5FQz46IRinvrTX/PEC8cBkS2G/LMndjNS4=";
+
+  mypy-boto3-mgn = buildMypyBoto3Package "mgn" "1.28.36" "sha256-MMp+P5+6/vc/fSNFUVuKtZCZbyDh8XvGsPg1LFTtzxg=";
+
+  mypy-boto3-migration-hub-refactor-spaces = buildMypyBoto3Package "migration-hub-refactor-spaces" "1.28.36" "sha256-xfTzLCtQPfBM01l96ks/nGGYNgYYTy6GA3I/qU/y0II=";
+
+  mypy-boto3-migrationhub-config = buildMypyBoto3Package "migrationhub-config" "1.28.36" "sha256-p3FiriZZMmqWMMPGT4Zu/BRiDch1K4hGqMYM9dVWX7g=";
+
+  mypy-boto3-migrationhuborchestrator = buildMypyBoto3Package "migrationhuborchestrator" "1.28.36" "sha256-x5vC9TZD5y/wyNCUS4KbcJk3tfMbD6GxhxJQj+DYVo4=";
+
+  mypy-boto3-migrationhubstrategy = buildMypyBoto3Package "migrationhubstrategy" "1.28.36" "sha256-HvDtYoWRyBmQxzn/YZJ9nhXgpKAnnwfD8RtTG2RakDM=";
+
+  mypy-boto3-mobile = buildMypyBoto3Package "mobile" "1.28.36" "sha256-SyBzpVCo90lFHeT9K9wbxMXNnJEccEY+bWsgnYcnA7Q=";
+
+  mypy-boto3-mq = buildMypyBoto3Package "mq" "1.28.36" "sha256-nHADqvj4clxfJjeS0eiadhtaVKFKeXWLBG93QOwQkR8=";
+
+  mypy-boto3-mturk = buildMypyBoto3Package "mturk" "1.28.36" "sha256-7h2xEOjgYe1QVV3mbxb7HMZJunHo4RtDdr2Jojr6XDU=";
+
+  mypy-boto3-mwaa = buildMypyBoto3Package "mwaa" "1.28.36" "sha256-OyetpZbtbOjtUowUA7ahRY3OGgUEHD+Q7i4rej5CLIs=";
+
+  mypy-boto3-neptune = buildMypyBoto3Package "neptune" "1.28.36" "sha256-NEu+SKj/eoYlE2bRigVIFcXS+NRcyTwhB+xP0+SLh/s=";
+
+  mypy-boto3-neptunedata = buildMypyBoto3Package "neptunedata" "1.28.43" "sha256-IWYezgs1FUCYgGvmw6X/8u8QX5uHew5PXhv3gr9MzME=";
+
+  mypy-boto3-network-firewall = buildMypyBoto3Package "network-firewall" "1.28.38" "sha256-MR+/d8G6cfpSEXsC9+mk1WXg/y1fQatMDV0uASI9bU0=";
+
+  mypy-boto3-networkmanager = buildMypyBoto3Package "networkmanager" "1.28.36" "sha256-KESRmtzmmm/IMlQw8s7alP2PSupcdnXRtx2ZHETPzLA=";
+
+  mypy-boto3-nimble = buildMypyBoto3Package "nimble" "1.28.36" "sha256-VDO5M5cFq0CLE4i017Peq9PFAOzKtld5ID8pgcZXBIA=";
+
+  mypy-boto3-oam = buildMypyBoto3Package "oam" "1.28.36" "sha256-wZ1GYz84QiDvu1EWE8AFrGP/7VnzZbLsrVj8Zt3WehE=";
+
+  mypy-boto3-omics = buildMypyBoto3Package "omics" "1.28.37" "sha256-bJALOo0sx1IwD1RBBx2CeW1JSW0IpqzF6i85ICO9SUM=";
+
+  mypy-boto3-opensearch = buildMypyBoto3Package "opensearch" "1.28.36" "sha256-97rGlw+REicstwKchMVjN6EuZBxQuSwmhSfBnbHxsS4=";
+
+  mypy-boto3-opensearchserverless = buildMypyBoto3Package "opensearchserverless" "1.28.36" "sha256-7V+wNpLTrYueSnPkOGD1ARqAewrNjbQzlIPDQJ/eEDY=";
+
+  mypy-boto3-opsworks = buildMypyBoto3Package "opsworks" "1.28.36" "sha256-Dpp3frNgsAyzKqC0Etq/p7jpjV+1YMwBx2bFqchGpeI=";
+
+  mypy-boto3-opsworkscm = buildMypyBoto3Package "opsworkscm" "1.28.36" "sha256-zrkTx2FkTuP880vcmBYwfkHDsPvLmYA3aUEZx7dbHRU=";
+
+  mypy-boto3-organizations = buildMypyBoto3Package "organizations" "1.28.36" "sha256-IFR1uIVZVjJe2sWS9Tv75l67SXiB4Em74iKFz5giAWk=";
+
+  mypy-boto3-osis = buildMypyBoto3Package "osis" "1.28.36" "sha256-TOEjsJmgoUEXd4H4s4y7Gx7gWxo4GeLWbDd7FA5Xc/o=";
+
+  mypy-boto3-outposts = buildMypyBoto3Package "outposts" "1.28.51" "sha256-iA+7Mxkp3n6hUJuFhxZ/Nf4vjeQcd3PoOEmjzk2ITI8=";
+
+  mypy-boto3-panorama = buildMypyBoto3Package "panorama" "1.28.36" "sha256-st4X3JA9Wf6zBqx9Gr2BxE9Z+1LeU0kiDpI8b+IVnjw=";
+
+  mypy-boto3-payment-cryptography = buildMypyBoto3Package "payment-cryptography" "1.28.36" "sha256-2YvWtVCfr7tYJzml4LdYpEsFrSpLve+nAWF6s2xB6HQ=";
+
+  mypy-boto3-payment-cryptography-data = buildMypyBoto3Package "payment-cryptography-data" "1.28.39" "sha256-aMYAPA0/z6O4fSOcp+IfIaC49NiPq/cmCGSGHCCiyBo=";
+
+  mypy-boto3-pca-connector-ad = buildMypyBoto3Package "pca-connector-ad" "1.28.38" "sha256-fVexVJjucP+4UEsje+jQU+dbA0ycpQQxWc3dqKnENiY=";
+
+  mypy-boto3-personalize = buildMypyBoto3Package "personalize" "1.28.36" "sha256-SCQqvz6rBi9Ohbw10A9BS3Yu0xPQLs03a0a0zC9mXoM=";
+
+  mypy-boto3-personalize-events = buildMypyBoto3Package "personalize-events" "1.28.36" "sha256-Znmc+a37B+wlkDCT387ZGCyfQ6kLrQeVcHCkplAAOAo=";
+
+  mypy-boto3-personalize-runtime = buildMypyBoto3Package "personalize-runtime" "1.28.36" "sha256-EICeLDJQzOWkm+Lk94pfY6KPi+HQY46AbGUxOi4dsxg=";
+
+  mypy-boto3-pi = buildMypyBoto3Package "pi" "1.28.36" "sha256-sHhbm4A0BkC7h9SuYjOpIwQCLtvU5ukYzpgqNruvJnM=";
+
+  mypy-boto3-pinpoint = buildMypyBoto3Package "pinpoint" "1.28.55" "sha256-Qi9wlrmtGVeGW/BXYJggG12q0g2Jw8pu2A9jd+3ryKI=";
+
+  mypy-boto3-pinpoint-email = buildMypyBoto3Package "pinpoint-email" "1.28.36" "sha256-KGDy7obD+hVisnEStsIGmvUD6/Peyo83/mzKFsKd+xI=";
+
+  mypy-boto3-pinpoint-sms-voice = buildMypyBoto3Package "pinpoint-sms-voice" "1.28.36" "sha256-NyUHn3+WgCp5AI0ly9F1gB2uyXICy5ot4HWPkv1sRjE=";
+
+  mypy-boto3-pinpoint-sms-voice-v2 = buildMypyBoto3Package "pinpoint-sms-voice-v2" "1.28.36" "sha256-YO/15ikVJ0OJ4FuEubtcV4nc+NGBFMWwiZUgn28SgFQ=";
+
+  mypy-boto3-pipes = buildMypyBoto3Package "pipes" "1.28.36" "sha256-wGVcXwhUGM729QsU3Tkmg8aD2s2cpg8/CTqOR1i8Lt4=";
+
+  mypy-boto3-polly = buildMypyBoto3Package "polly" "1.28.36" "sha256-fntpy/+K4DYhfdv35hhanDS4oq1P0kNxxDFkkHQRmuU=";
+
+  mypy-boto3-pricing = buildMypyBoto3Package "pricing" "1.28.36" "sha256-zmtifAqoWolmES6GVNRHvcvsC43AWpI4BZLipns8vqU=";
+
+  mypy-boto3-privatenetworks = buildMypyBoto3Package "privatenetworks" "1.28.36" "sha256-JUaloEf/CtJBBwvf08tX1dfvMmo5zM85NFGKzLwd0zk=";
+
+  mypy-boto3-proton = buildMypyBoto3Package "proton" "1.28.36" "sha256-TGSxplMR6PQJT8LOTNUct4VjDAMqtgBkg3HOOB8To7w=";
+
+  mypy-boto3-qldb = buildMypyBoto3Package "qldb" "1.28.36" "sha256-y1UMibv5dwVuuvs2x3Cprc4gErqxUOYN6Loeaug6Tjw=";
+
+  mypy-boto3-qldb-session = buildMypyBoto3Package "qldb-session" "1.28.36" "sha256-JGlIwudacKEBgKlf2iDn3iRTf/b869rS7fYaK3Q6Jgk=";
+
+  mypy-boto3-quicksight = buildMypyBoto3Package "quicksight" "1.28.54" "sha256-NOQ9zNMTJYZNhEoE2xNcyG78x9eajyY0AUDsa5JW3Ls=";
+
+  mypy-boto3-ram = buildMypyBoto3Package "ram" "1.28.36" "sha256-5ne0E27ct5g2LQs3rzEJ5vQdnu/10uIfeS9t4FAVU2U=";
+
+  mypy-boto3-rbin = buildMypyBoto3Package "rbin" "1.28.36" "sha256-ADN+McM/ZuloBxZVug6Zc9w1Bij5pWhzQpP8if47re8=";
+
+  mypy-boto3-rds = buildMypyBoto3Package "rds" "1.28.58" "sha256-pm5I8iTKxAKscXXy99EvF+ZnIpmposPnmo0yG3y3NQU=";
+
+  mypy-boto3-rds-data = buildMypyBoto3Package "rds-data" "1.28.36" "sha256-rNDCwG1tnI3diKXH0sN2Qd/+J4UEh7aKBOWCIX4gvYs=";
+
+  mypy-boto3-redshift = buildMypyBoto3Package "redshift" "1.28.36" "sha256-j0MCYKr0R42X1EtoGhNPM7lqTyoisvbYJPdCji8GvI8=";
+
+  mypy-boto3-redshift-data = buildMypyBoto3Package "redshift-data" "1.28.36" "sha256-fEoxqvIsAs8mUTY/dSTAbQOxNlf4+1qpyZO28Fe2PLA=";
+
+  mypy-boto3-redshift-serverless = buildMypyBoto3Package "redshift-serverless" "1.28.36" "sha256-fd7nHbR/4eo08/RN8u6GESyshRa81BIussx8Rdg0IHE=";
+
+  mypy-boto3-rekognition = buildMypyBoto3Package "rekognition" "1.28.37" "sha256-6eNlzJDFLLP9YsFdogWE1vtXvSNP//N+f4KpnFfnpa4=";
+
+  mypy-boto3-resiliencehub = buildMypyBoto3Package "resiliencehub" "1.28.36" "sha256-A6Nbwo6IxIBDbhCWqaKIDFYUvHCc1GRHh2IzCaYn6Nc=";
+
+  mypy-boto3-resource-explorer-2 = buildMypyBoto3Package "resource-explorer-2" "1.28.36" "sha256-vTYcU6Lf5mhh3+PtwhLTb72MZwgrykAbXz8coSw7znM=";
+
+  mypy-boto3-resource-groups = buildMypyBoto3Package "resource-groups" "1.28.36" "sha256-0q1trks0Xs22VuqE5nYnMVOmsPQ936UXMN3k7qo2kDc=";
+
+  mypy-boto3-resourcegroupstaggingapi = buildMypyBoto3Package "resourcegroupstaggingapi" "1.28.36" "sha256-A2T8OZr2OibcP+WSCDk4NydfXA8UMI4DPRCnb4l+yWI=";
+
+  mypy-boto3-robomaker = buildMypyBoto3Package "robomaker" "1.28.36" "sha256-zgk5TPyOtimF9axIjv8f0chrD2M7LZbeo6Huat6IUEs=";
+
+  mypy-boto3-rolesanywhere = buildMypyBoto3Package "rolesanywhere" "1.28.36" "sha256-YQKGDMmakoxhIsarmBdvOlqno9Qtm5XqOOuBD3cnhsc=";
+
+  mypy-boto3-route53 = buildMypyBoto3Package "route53" "1.28.36" "sha256-x/T2EZtPlnSFmRkRhU+GSKvRQHpXAL3c+JN6kdmFSuY=";
+
+  mypy-boto3-route53-recovery-cluster = buildMypyBoto3Package "route53-recovery-cluster" "1.28.36" "sha256-UAHjH2z8jCvyR2vdM5igPc1gwkcxX7wb51qZbmHBe9c=";
+
+  mypy-boto3-route53-recovery-control-config = buildMypyBoto3Package "route53-recovery-control-config" "1.28.36" "sha256-kcVRZWAIDRrHwGxd/tnWcCuu9fIgdmHzvHIG1XUdMMs=";
+
+  mypy-boto3-route53-recovery-readiness = buildMypyBoto3Package "route53-recovery-readiness" "1.28.36" "sha256-iwncFBFaoMzDDApHHSBfbRaIHUOXaJJO9fWTEK6LAKY=";
+
+  mypy-boto3-route53domains = buildMypyBoto3Package "route53domains" "1.28.36" "sha256-0g6Xh6GS06L6o0De4V/zQdw0DMOQMFFW7NMWEY7I5fQ=";
+
+  mypy-boto3-route53resolver = buildMypyBoto3Package "route53resolver" "1.28.36" "sha256-o5wa4Jjskxw10OpjvVq62mdyi55nB8xsB1t52hEtrs8=";
+
+  mypy-boto3-rum = buildMypyBoto3Package "rum" "1.28.36" "sha256-e342+/wBjUwNWBtQnlPoJtShgDbFXEEGd8B43UPSCFg=";
+
+  mypy-boto3-s3 = buildMypyBoto3Package "s3" "1.28.55" "sha256-sAiAn0SOdAdQEtT8VLAXbeC09JvDjjneMMoOdk63UFY=";
+
+  mypy-boto3-s3control = buildMypyBoto3Package "s3control" "1.28.36" "sha256-ZgJtq2jXRtgUXQrTfIZKSbF7TMTw/bV+bGlxte7kVA8=";
+
+  mypy-boto3-s3outposts = buildMypyBoto3Package "s3outposts" "1.28.36" "sha256-56REWXuXLQP2mibMz1s2FbCZFqTRZNOsuUd0IZ3sOJI=";
+
+  mypy-boto3-sagemaker = buildMypyBoto3Package "sagemaker" "1.28.57" "sha256-W3QJIXU+RPgr4IrgyJC7o0ox65W1Xyye5X5qpUCnAzo=";
+
+  mypy-boto3-sagemaker-a2i-runtime = buildMypyBoto3Package "sagemaker-a2i-runtime" "1.28.36" "sha256-2qwf/dtIhBT5HSYDDEuSy4nqGQrBYEZ/1RiD5vMYPMI=";
+
+  mypy-boto3-sagemaker-edge = buildMypyBoto3Package "sagemaker-edge" "1.28.36" "sha256-JsDQv4j8QB0wrXA3142LdNdYabJd8iB7PiLVZz0X3ss=";
+
+  mypy-boto3-sagemaker-featurestore-runtime = buildMypyBoto3Package "sagemaker-featurestore-runtime" "1.28.57" "sha256-vcK8WdiV8m7cqJ7WkGAqYFLjRmKdqX0qCuxmZKYlrtw=";
+
+  mypy-boto3-sagemaker-geospatial = buildMypyBoto3Package "sagemaker-geospatial" "1.28.36" "sha256-2JU0tA26pENaTJBsg13RV40+gsSRz+g1p/s+5LKtKTM=";
+
+  mypy-boto3-sagemaker-metrics = buildMypyBoto3Package "sagemaker-metrics" "1.28.36" "sha256-DF36xuoA1csbTCz/NJ8UhU7NPYU/OgE0+Z1t5ppPKCA=";
+
+  mypy-boto3-sagemaker-runtime = buildMypyBoto3Package "sagemaker-runtime" "1.28.39" "sha256-BQFdGoaL6GPAtCgFBTT4ajdkSWXsPrxYcLGndAcZw2k=";
+
+  mypy-boto3-savingsplans = buildMypyBoto3Package "savingsplans" "1.28.36" "sha256-EuCyeSHWSlS2OC8DM5alD6IcZ3fewmJavMMHWXL12T0=";
+
+  mypy-boto3-scheduler = buildMypyBoto3Package "scheduler" "1.28.36" "sha256-dMEm7KqoZFFtFnqXR6upXHQ/CeKQO1xQ+v7CoR4o7Xs=";
+
+  mypy-boto3-schemas = buildMypyBoto3Package "schemas" "1.28.36" "sha256-gq8a1k0MEnXFdmB5IPE9zHYF1rfoSD3Vis7YOVyCTV8=";
+
+  mypy-boto3-sdb = buildMypyBoto3Package "sdb" "1.28.36" "sha256-pbH5y/bS15S6BeTPIZ0bw8h0elfLeHdab/IxJF4DNYU=";
+
+  mypy-boto3-secretsmanager = buildMypyBoto3Package "secretsmanager" "1.28.36" "sha256-fjkIh9Nb03CNjAzpQJUl2tCAU+qNpf0Ef3Lse88JP9M=";
+
+  mypy-boto3-securityhub = buildMypyBoto3Package "securityhub" "1.28.43" "sha256-Ein8Q/bhJoThpGzGK9ow53WEWs5D5ARW/15s3qzLqnw=";
+
+  mypy-boto3-securitylake = buildMypyBoto3Package "securitylake" "1.28.36" "sha256-YKtv/32/5ngUo4GUqeplkL5mmdcWP7rYrypLPJtebQ0=";
+
+  mypy-boto3-serverlessrepo = buildMypyBoto3Package "serverlessrepo" "1.28.36" "sha256-oNSQAc9ZBX3+q1ycI0mg4lJ3jjqYkMfb0Cs/wjBRhrY=";
+
+  mypy-boto3-service-quotas = buildMypyBoto3Package "service-quotas" "1.28.36" "sha256-qWw/5Q/S/60ZJ55wJf+1++YRnXS7fySFJSDLOm9neDE=";
+
+  mypy-boto3-servicecatalog = buildMypyBoto3Package "servicecatalog" "1.28.37" "sha256-BOhaddv6XQwCRLuYk3ybTmFSdAQfWkqMVW6IvB4q/78=";
+
+  mypy-boto3-servicecatalog-appregistry = buildMypyBoto3Package "servicecatalog-appregistry" "1.28.37" "sha256-rUHzIPXave2oWWyEDERmBfybNFyzw2RMxPFFidVqdh8=";
+
+  mypy-boto3-servicediscovery = buildMypyBoto3Package "servicediscovery" "1.28.52" "sha256-WaiZXFpKr59w0XtjF6mVI7kGt1X+vmbeWiDBNwEaeRw=";
+
+  mypy-boto3-ses = buildMypyBoto3Package "ses" "1.28.36" "sha256-HYAl9ock3b9chpYp+wd+sR1DElFN+jxipHc3lGoIFR8=";
+
+  mypy-boto3-sesv2 = buildMypyBoto3Package "sesv2" "1.28.37" "sha256-TqnrgOc+YI6YA3BtJcN2BdU8Cm3By60yQJPxcWdQrEY=";
+
+  mypy-boto3-shield = buildMypyBoto3Package "shield" "1.28.36" "sha256-io8Ux5jD5gyQwZDENXuT/5/R1iqTWd4c34zzQtBxNyk=";
+
+  mypy-boto3-signer = buildMypyBoto3Package "signer" "1.28.36" "sha256-4Aji9L+AI66iB9NaiuV96YefuoEJ0s+BPdsOu/UwDpM=";
+
+  mypy-boto3-simspaceweaver = buildMypyBoto3Package "simspaceweaver" "1.28.47" "sha256-13RYW3vObQUNBsBtp8uaZZ9JFAiwBwiaYQv8tJ0O85w=";
+
+  mypy-boto3-sms = buildMypyBoto3Package "sms" "1.28.36" "sha256-xV29r8VmjvEQyyTYIdfkB9WbF08kjWbKdtLB5fXoWOo=";
+
+  mypy-boto3-sms-voice = buildMypyBoto3Package "sms-voice" "1.28.36" "sha256-mtX0fSvFofCCD2gQhyc+YBWZbAoR497FAyjUezm4FgU=";
+
+  mypy-boto3-snow-device-management = buildMypyBoto3Package "snow-device-management" "1.28.36" "sha256-mD1oojs3893aLdZQybDe41j5bG8dkMT92eq9fDbo5V8=";
+
+  mypy-boto3-snowball = buildMypyBoto3Package "snowball" "1.28.36" "sha256-ngClAeGdx5U6b41iNIABhcrBWzv4t3PB0dkdavx2e2I=";
+
+  mypy-boto3-sns = buildMypyBoto3Package "sns" "1.28.36" "sha256-SXWRhkEBpRR9XS+nFRBIwMTLSxmvN0prcKwu+KrkMGY=";
+
+  mypy-boto3-sqs = buildMypyBoto3Package "sqs" "1.28.36" "sha256-2cFZ4CDw7yJabVhQo2c+iyNjJyQ7pf/g0Tdirk/cDiE=";
+
+  mypy-boto3-ssm = buildMypyBoto3Package "ssm" "1.28.54" "sha256-cf246Qy7fhVgvU7M9w38JkqsdWQma4GI+YmNNpIJtJ8=";
+
+  mypy-boto3-ssm-contacts = buildMypyBoto3Package "ssm-contacts" "1.28.36" "sha256-MK1Hp9196tv2vFaVtroRPAMSP5lgmBJJZjOi7sqK318=";
+
+  mypy-boto3-ssm-incidents = buildMypyBoto3Package "ssm-incidents" "1.28.36" "sha256-0wYmsUl+q0s163UReHdCGSd18GOAhYh2aZKujT25aZc=";
+
+  mypy-boto3-ssm-sap = buildMypyBoto3Package "ssm-sap" "1.28.36" "sha256-aQtr5rgXtokfiI/CoVxD1g4KmP9ii0hELER08sJOu3g=";
+
+  mypy-boto3-sso = buildMypyBoto3Package "sso" "1.28.58" "sha256-EieqwoZ+kj3bbRDgwDDNZEPQXXFv3wFQUCYHivM6zeE=";
+
+  mypy-boto3-sso-admin = buildMypyBoto3Package "sso-admin" "1.28.44" "sha256-BleFuvoN4f9/6Q/vvDRwgmRBP86F7i7tpaC6G3sXn1Y=";
+
+  mypy-boto3-sso-oidc = buildMypyBoto3Package "sso-oidc" "1.28.52" "sha256-LGxlGXTsYZdBHiTFGzCCMvRW20Ny0kXMXLoP2YTAbKg=";
+
+  mypy-boto3-stepfunctions = buildMypyBoto3Package "stepfunctions" "1.28.36" "sha256-jHlOmKvFyiPvE+NR9Gu4Sd5jS6ym81KG4x5Y3t5Atoc=";
+
+  mypy-boto3-storagegateway = buildMypyBoto3Package "storagegateway" "1.28.36" "sha256-59qw52muZfYjmzO3quhIfgSk5xurzialMIEh+k+C69Q=";
+
+  mypy-boto3-sts = buildMypyBoto3Package "sts" "1.28.58" "sha256-vv/scF8fC0Sdo8H1Ksdlhie7KJrs7BpECCZkecRuBTs=";
+
+  mypy-boto3-support = buildMypyBoto3Package "support" "1.28.36" "sha256-HjzL3qwEiQSvJvaiB6pJN/GUMRNseuIqxM7rfrfwRKs=";
+
+  mypy-boto3-support-app = buildMypyBoto3Package "support-app" "1.28.36" "sha256-p/v2QUgmGYRVKGUtrCt9i6c1LKCxqNoNKHnfbAw7qMU=";
+
+  mypy-boto3-swf = buildMypyBoto3Package "swf" "1.28.36" "sha256-GO8hb3oVmSK0J8GB4ZT1RlqyBaRrOM2ZorOHkE3L8p0=";
+
+  mypy-boto3-synthetics = buildMypyBoto3Package "synthetics" "1.28.36" "sha256-6vRCRKjNplmMqmUpvDC/JVPl4q/YUYealQdXOComXNQ=";
+
+  mypy-boto3-textract = buildMypyBoto3Package "textract" "1.28.56" "sha256-xWQQAJJSeB/vsY2RAxw4z9lKjtVHJ91tvgZklwl/g74=";
+
+  mypy-boto3-timestream-query = buildMypyBoto3Package "timestream-query" "1.28.36" "sha256-fslhEeOU6hSx6efMMesqkV4MyicL5hAvKBD1ZdyB1Dw=";
+
+  mypy-boto3-timestream-write = buildMypyBoto3Package "timestream-write" "1.28.36" "sha256-dWA9lZ/vw96WA69hyECGnTTo9O+5qPyQWAUCSdevBUM=";
+
+  mypy-boto3-tnb = buildMypyBoto3Package "tnb" "1.28.36" "sha256-sGoBXxbU2rLyTbW1olhS3jgrfcw10FtCNgHckcWiSpI=";
+
+  mypy-boto3-transcribe = buildMypyBoto3Package "transcribe" "1.28.36" "sha256-oBof0qzgKgS58e+2teI6bBiIY3svwiyS+Ztzb3wRtLI=";
+
+  mypy-boto3-transfer = buildMypyBoto3Package "transfer" "1.28.58" "sha256-aTpJa78Q/Z2xCtMCsExVqHsZwVlRlzBwKl3m/sWvXcM=";
+
+  mypy-boto3-translate = buildMypyBoto3Package "translate" "1.28.36" "sha256-Q2FuBXtXWenPvkJ3PprDolsO6ur5QAAn0y1ORYEQIMM=";
+
+  mypy-boto3-verifiedpermissions = buildMypyBoto3Package "verifiedpermissions" "1.28.36" "sha256-HpiBOyeWvB/T/MquJ0R8Uk647VqCAlmC0Tryw9iojjA=";
+
+  mypy-boto3-voice-id = buildMypyBoto3Package "voice-id" "1.28.36" "sha256-B4R1U1eU4IZdB/Q+keSRL41zLvBMBJUiGw0RcCsC2l4=";
+
+  mypy-boto3-vpc-lattice = buildMypyBoto3Package "vpc-lattice" "1.28.41" "sha256-azHtPlg9etjfZOpN2505djAq9enyrIkz5NcIQE+fl9U=";
+
+  mypy-boto3-waf = buildMypyBoto3Package "waf" "1.28.36" "sha256-andRHQn1HAms2m57rIy+40iF7jz4nzGzYH24fP8qHSw=";
+
+  mypy-boto3-waf-regional = buildMypyBoto3Package "waf-regional" "1.28.36" "sha256-WoIforrEs7OOroJB5YvPSw/M9tvrojNnbFJdG7BlzkU=";
+
+  mypy-boto3-wafv2 = buildMypyBoto3Package "wafv2" "1.28.57" "sha256-7xrRaEm54cKtRZplu6l8UbTg+hF6Y5qP9/lgAV8D6AY=";
+
+  mypy-boto3-wellarchitected = buildMypyBoto3Package "wellarchitected" "1.28.36" "sha256-Xsu8CV0MvpmbAMA6ZMoIPQHSMJn8okag1SxKW0SUv1I=";
+
+  mypy-boto3-wisdom = buildMypyBoto3Package "wisdom" "1.28.36" "sha256-paheK7r4sqDjBbUVieh6E5gPAbmVaEFAC3NsWsCWxBA=";
+
+  mypy-boto3-workdocs = buildMypyBoto3Package "workdocs" "1.28.36" "sha256-dQysUcm1xlXJbcM1vdYZ7+migQgjHl4gSqHoZDKnhHg=";
+
+  mypy-boto3-worklink = buildMypyBoto3Package "worklink" "1.28.36" "sha256-oFjYLBxp/dZf1+IN5rj3usSUvZnRyhRMu63mRgdsrmI=";
+
+  mypy-boto3-workmail = buildMypyBoto3Package "workmail" "1.28.50" "sha256-OfRyehgMROua9Ydcc8HBvBp4eddo0re1w0fciBVUuS4=";
+
+  mypy-boto3-workmailmessageflow = buildMypyBoto3Package "workmailmessageflow" "1.28.36" "sha256-hfRjdhr/xJJNWYy4XDg8LT00sx/JGAEa4D+5GyR+FCo=";
+
+  mypy-boto3-workspaces = buildMypyBoto3Package "workspaces" "1.28.44" "sha256-/LXeiuXeNTgfAf8BrzC/z0kdK201Htkau79BH0MQEO4=";
+
+  mypy-boto3-workspaces-web = buildMypyBoto3Package "workspaces-web" "1.28.36" "sha256-kVVNGZYzZ2wIQVOCq3domqztTqsHY8FFHgeT5GCWtg0=";
+
+  mypy-boto3-xray = buildMypyBoto3Package "xray" "1.28.47" "sha256-1OiTpbaBm2aAls4A7ZaZBNAM8DTRuQcwNKJDq3lOKMY=";
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mypy-protobuf/default.nix b/nixpkgs/pkgs/development/python-modules/mypy-protobuf/default.nix
new file mode 100644
index 000000000000..0010e40800ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mypy-protobuf/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, protobuf
+, types-protobuf
+, grpcio-tools
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mypy-protobuf";
+  version = "3.5.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-IfJw2gqXkqnax2sN9GPAJ+VhZkq2lzxZvk5NBk3+Z9w=";
+  };
+
+  propagatedBuildInputs = [
+    protobuf
+    types-protobuf
+    grpcio-tools
+  ];
+
+  doCheck = false; # ModuleNotFoundError: No module named 'testproto'
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mypy_protobuf"
+  ];
+
+  meta = with lib; {
+    description = "Generate mypy stub files from protobuf specs";
+    homepage = "https://github.com/dropbox/mypy-protobuf";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ lnl7 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mypy/default.nix b/nixpkgs/pkgs/development/python-modules/mypy/default.nix
new file mode 100644
index 000000000000..0ee96a6d690d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mypy/default.nix
@@ -0,0 +1,123 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build-system
+, setuptools
+, types-psutil
+, types-setuptools
+
+# propagates
+, mypy-extensions
+, tomli
+, typing-extensions
+
+# optionals
+, lxml
+, psutil
+
+# tests
+, attrs
+, filelock
+, pytest-xdist
+, pytest-forked
+, pytestCheckHook
+, py
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "mypy";
+  version = "1.5.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "python";
+    repo = "mypy";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-qs+axm2+UWNuWzLW8CI4qBV7k7Ra8gBajid8mYKDsso=";
+  };
+
+  nativeBuildInputs = [
+    mypy-extensions
+    setuptools
+    types-psutil
+    types-setuptools
+    typing-extensions
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  propagatedBuildInputs = [
+    mypy-extensions
+    typing-extensions
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  passthru.optional-dependencies = {
+    dmypy = [
+      psutil
+    ];
+    reports = [
+      lxml
+    ];
+  };
+
+  # Compile mypy with mypyc, which makes mypy about 4 times faster. The compiled
+  # version is also the default in the wheels on Pypi that include binaries.
+  # is64bit: unfortunately the build would exhaust all possible memory on i686-linux.
+  env.MYPY_USE_MYPYC = stdenv.buildPlatform.is64bit;
+
+  # when testing reduce optimisation level to reduce build time by 20%
+  env.MYPYC_OPT_LEVEL = 1;
+
+  pythonImportsCheck = [
+    "mypy"
+    "mypy.api"
+    "mypy.fastparse"
+    "mypy.types"
+    "mypyc"
+    "mypyc.analysis"
+  ] ++ lib.optionals (!stdenv.hostPlatform.isi686) [
+    # ImportError: cannot import name 'map_instance_to_supertype' from partially initialized module 'mypy.maptype' (most likely due to a circular import)
+    "mypy.report"
+  ];
+
+  checkInputs = [
+    attrs
+    filelock
+    pytest-xdist
+    pytest-forked
+    pytestCheckHook
+    py
+    setuptools
+    six
+    tomli
+  ] ++ lib.flatten (lib.attrValues passthru.optional-dependencies);
+
+  disabledTestPaths = [
+    # fails to find tyoing_extensions
+    "mypy/test/testcmdline.py"
+    "mypy/test/testdaemon.py"
+    # fails to find setuptools
+    "mypyc/test/test_commandline.py"
+    # fails to find hatchling
+    "mypy/test/testpep561.py"
+  ] ++ lib.optionals stdenv.hostPlatform.isi686 [
+    # https://github.com/python/mypy/issues/15221
+    "mypyc/test/test_run.py"
+  ];
+
+  meta = with lib; {
+    description = "Optional static typing for Python";
+    homepage = "https://www.mypy-lang.org";
+    license = licenses.mit;
+    mainProgram = "mypy";
+    maintainers = with maintainers; [ martingms lnl7 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mypy/extensions.nix b/nixpkgs/pkgs/development/python-modules/mypy/extensions.nix
new file mode 100644
index 000000000000..bdd6c63da6fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mypy/extensions.nix
@@ -0,0 +1,47 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, typing
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "mypy-extensions";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "python";
+    repo = "mypy_extensions";
+    rev = version;
+    hash = "sha256-gOfHC6dUeBE7SsWItpUHHIxW3wzhPM5SuGW1U8P7DD0=";
+  };
+
+  propagatedBuildInputs = lib.optional (pythonOlder "3.5") typing;
+
+  # make the testsuite run with pytest, so we can disable individual tests
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests/testextensions.py"
+  ];
+
+  disabledTests = lib.optionals (pythonAtLeast "3.11") [
+    # https://github.com/python/mypy_extensions/issues/24
+    "test_typeddict_errors"
+  ];
+
+  pythonImportsCheck = [
+    "mypy_extensions"
+  ];
+
+  meta = with lib; {
+    description = "Experimental type system extensions for programs checked with the mypy typechecker";
+    homepage = "https://www.mypy-lang.org";
+    license = licenses.mit;
+    maintainers = with maintainers; [ martingms lnl7 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mysql-connector/0001-Revert-Fix-MacOS-wheels-platform-tag.patch b/nixpkgs/pkgs/development/python-modules/mysql-connector/0001-Revert-Fix-MacOS-wheels-platform-tag.patch
new file mode 100644
index 000000000000..4b8e40d6588b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mysql-connector/0001-Revert-Fix-MacOS-wheels-platform-tag.patch
@@ -0,0 +1,22 @@
+diff --git a/cpydist/__init__.py b/cpydist/__init__.py
+index 7fdbaf2..3c427da 100644
+--- a/cpydist/__init__.py
++++ b/cpydist/__init__.py
+@@ -38,7 +38,7 @@ import tempfile
+ from glob import glob
+ from pathlib import Path
+ from subprocess import PIPE, Popen, check_call
+-from sysconfig import get_config_vars, get_python_version
++from sysconfig import get_python_version
+
+ from setuptools import Command
+ from setuptools.command.build_ext import build_ext
+@@ -68,8 +68,6 @@ version_py = os.path.join("lib", "mysql", "connector", "version.py")
+ with open(version_py, "rb") as fp:
+     exec(compile(fp.read(), version_py, "exec"))
+
+-if "MACOSX_DEPLOYMENT_TARGET" in get_config_vars():
+-    get_config_vars()["MACOSX_DEPLOYMENT_TARGET"] = "11.0"
+
+ COMMON_USER_OPTIONS = [
+     (
\ No newline at end of file
diff --git a/nixpkgs/pkgs/development/python-modules/mysql-connector/default.nix b/nixpkgs/pkgs/development/python-modules/mysql-connector/default.nix
new file mode 100644
index 000000000000..575c438eb551
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mysql-connector/default.nix
@@ -0,0 +1,75 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, django
+, dnspython
+, fetchFromGitHub
+, protobuf
+, pythonOlder
+, mysql80
+, openssl
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "mysql-connector";
+  version = "8.0.33";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  setupPyBuildFlags = [
+    "--with-mysql-capi=\"${mysql80}\""
+    "--with-openssl-include-dir=\"${openssl.dev}/include\""
+    "--with-openssl-lib-dir=\"${lib.getLib openssl}/lib\""
+    "-L \"${lib.getLib pkgs.zstd}/lib:${lib.getLib mysql80}/lib\""
+  ];
+
+  src = fetchFromGitHub {
+    owner = "mysql";
+    repo = "mysql-connector-python";
+    rev = version;
+    hash = "sha256-GtMq7E2qBqFu54hjUotzPyxScTKXNdEQcmgHnS7lBhc=";
+  };
+
+  patches = [
+    # mysql-connector overrides MACOSX_DEPLOYMENT_TARGET to 11.
+    # This makes the installation with nixpkgs fail. I suspect, that's
+    # because stdenv.hostPlatform.darwinSdkVersion is (currently) set to
+    # 10.12. The patch reverts
+    # https://github.com/mysql/mysql-connector-python/commit/d1e89fd3d7391084cdf35b0806cb5d2a4b413654
+    ./0001-Revert-Fix-MacOS-wheels-platform-tag.patch
+  ];
+
+  nativeBuildInputs = [
+    mysql80
+  ];
+
+
+  propagatedBuildInputs = [
+    dnspython
+    protobuf
+    mysql80
+    openssl
+    pkgs.zstd
+  ];
+
+  pythonImportsCheck = [
+    "mysql"
+  ];
+
+  # Tests require a running MySQL instance
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A MySQL driver";
+    longDescription = ''
+      A MySQL driver that does not depend on MySQL C client libraries and
+      implements the DB API v2.0 specification.
+    '';
+    homepage = "https://github.com/mysql/mysql-connector-python";
+    changelog = "https://raw.githubusercontent.com/mysql/mysql-connector-python/${version}/CHANGES.txt";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ neosimsim turion ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/mysqlclient/default.nix b/nixpkgs/pkgs/development/python-modules/mysqlclient/default.nix
new file mode 100644
index 000000000000..d821adc3bb25
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/mysqlclient/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, libmysqlclient
+, pkg-config
+}:
+
+buildPythonPackage rec {
+  pname = "mysqlclient";
+  version = "2.2.0";
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  buildInputs = [
+    libmysqlclient
+  ];
+
+  # Tests need a MySQL database
+  doCheck = false;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BDaERfnEh9irt6h449I+kj5gcsBKbDIPng3IqC77oU4=";
+  };
+
+  meta = with lib; {
+    description = "Python interface to MySQL";
+    homepage = "https://github.com/PyMySQL/mysqlclient-python";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ y0no ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/myst-docutils/default.nix b/nixpkgs/pkgs/development/python-modules/myst-docutils/default.nix
new file mode 100644
index 000000000000..66c07489dfaa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/myst-docutils/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, docutils
+, fetchPypi
+, flit-core
+, jinja2
+, markdown-it-py
+, mdit-py-plugins
+, pythonOlder
+, pyyaml
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "myst-docutils";
+  version = "2.0.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "myst_docutils";
+    inherit version;
+    hash = "sha256-WmmPEg+bINmeId+pjR6bbp8qzjfSXfEel+sQEdPIu8Y=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    docutils
+    jinja2
+    markdown-it-py
+    mdit-py-plugins
+    pyyaml
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [ "myst_parser" ];
+
+  meta = with lib; {
+    description = "An extended commonmark compliant parser, with bridges to docutils/sphinx.";
+    homepage = "https://github.com/executablebooks/MyST-Parser";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dpausp ];
+    broken = pythonOlder "3.8"; # dependency networkx requires 3.8
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/myst-nb/default.nix b/nixpkgs/pkgs/development/python-modules/myst-nb/default.nix
new file mode 100644
index 000000000000..cf3d309420eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/myst-nb/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, flit-core
+, importlib-metadata
+, ipython
+, jupyter-cache
+, nbclient
+, myst-parser
+, nbformat
+, pyyaml
+, sphinx
+, sphinx-togglebutton
+, typing-extensions
+, ipykernel
+}:
+
+buildPythonPackage rec {
+  pname = "myst-nb";
+  version = "1.0.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "myst_nb";
+    hash = "sha256-kHfkKhxrRB6lUHhQb4NVXdpdbIFu9JMIQdcdI54+DF4=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    importlib-metadata
+    ipython
+    jupyter-cache
+    nbclient
+    myst-parser
+    nbformat
+    pyyaml
+    sphinx
+    sphinx-togglebutton
+    typing-extensions
+    ipykernel
+  ];
+
+  pythonImportsCheck = [
+    "myst_nb"
+    "myst_nb.sphinx_ext"
+  ];
+
+  meta = with lib; {
+    description = "A Jupyter Notebook Sphinx reader built on top of the MyST markdown parser";
+    homepage = "https://github.com/executablebooks/MyST-NB";
+    changelog = "https://github.com/executablebooks/MyST-NB/raw/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/myst-parser/default.nix b/nixpkgs/pkgs/development/python-modules/myst-parser/default.nix
new file mode 100644
index 000000000000..e485b768a750
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/myst-parser/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, flit-core
+, pythonOlder
+, docutils
+, jinja2
+, markdown-it-py
+, mdit-py-plugins
+, pyyaml
+, sphinx
+, typing-extensions
+, beautifulsoup4
+, pytest-param-files
+, pytest-regressions
+, sphinx-pytest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "myst-parser";
+  version = "2.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "executablebooks";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-1BW7Z+0rs5Up+VZ3vDygnhLzE9Y2BqEMnTnflboweu0=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "myst-parser-sphinx7.2-compat.patch";
+      url = "https://github.com/executablebooks/MyST-Parser/commit/4f670fc04c438b57a9d4014be74e9a62cc0deba4.patch";
+      hash = "sha256-FCvFSsD7qQwqWjSW7R4Gx+E2jaGkifSZqaRbAglt9Yw=";
+    })
+  ];
+
+  nativeBuildInputs = [ flit-core ];
+
+  propagatedBuildInputs = [
+    docutils
+    jinja2
+    mdit-py-plugins
+    markdown-it-py
+    pyyaml
+    sphinx
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    beautifulsoup4
+    pytest-param-files
+    pytest-regressions
+    sphinx-pytest
+    pytestCheckHook
+  ] ++ markdown-it-py.optional-dependencies.linkify;
+
+  pythonImportsCheck = [
+    "myst_parser"
+  ];
+
+  disabledTests = [
+    # AssertionError due to different files
+    "test_basic"
+    "test_footnotes"
+    "test_gettext_html"
+    "test_fieldlist_extension"
+    # docutils 0.19 expectation mismatches
+    "test_docutils_roles"
+    # sphinx 6.0 expectation mismatches
+    "test_sphinx_directives"
+    # sphinx 5.3 expectation mismatches
+    "test_render"
+    "test_includes"
+  ];
+
+  meta = with lib; {
+    description = "Sphinx and Docutils extension to parse MyST";
+    homepage = "https://myst-parser.readthedocs.io/";
+    changelog = "https://raw.githubusercontent.com/executablebooks/MyST-Parser/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ loicreynier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/n3fit/default.nix b/nixpkgs/pkgs/development/python-modules/n3fit/default.nix
new file mode 100644
index 000000000000..5c8b06b74a65
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/n3fit/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, hyperopt
+, keras
+, nnpdf
+, psutil
+, tensorflow
+, validphys2
+}:
+
+buildPythonPackage rec {
+  pname = "n3fit";
+  version = "4.0";
+  format = "setuptools";
+
+  inherit (nnpdf) src;
+
+  prePatch = ''
+    cd n3fit
+  '';
+
+  postPatch = ''
+    substituteInPlace src/n3fit/version.py \
+      --replace '= __give_git()' '= "'$version'"'
+  '';
+
+  propagatedBuildInputs = [
+    hyperopt
+    keras
+    psutil
+    tensorflow
+    validphys2
+  ];
+
+  postInstall = ''
+    for prog in "$out"/bin/*; do
+      wrapProgram "$prog" --set PYTHONPATH "$PYTHONPATH:$(toPythonPath "$out")"
+    done
+  '';
+
+  doCheck = false; # no tests
+  pythonImportsCheck = [ "n3fit" ];
+
+  meta = with lib; {
+    description = "NNPDF fitting framework";
+    homepage = "https://docs.nnpdf.science";
+    inherit (nnpdf.meta) license;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nad-receiver/default.nix b/nixpkgs/pkgs/development/python-modules/nad-receiver/default.nix
new file mode 100644
index 000000000000..ed836bded204
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nad-receiver/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, pyserial
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "nad-receiver";
+  version = "0.3.0";
+
+  src = fetchFromGitHub {
+    owner = "joopert";
+    repo = "nad_receiver";
+    rev = version;
+    hash = "sha256-jRMk/yMA48ei+g/33+mMYwfwixaKTMYcU/z/VOoJbvY=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "nad_receiver" ];
+
+  meta = with lib; {
+    description = "Python interface for NAD receivers";
+    homepage = "https://github.com/joopert/nad_receiver";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nagiosplugin/default.nix b/nixpkgs/pkgs/development/python-modules/nagiosplugin/default.nix
new file mode 100644
index 000000000000..a7e7b016577d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nagiosplugin/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pytestCheckHook
+, pythonOlder
+, twine
+}:
+
+buildPythonPackage rec {
+  pname = "nagiosplugin";
+  version = "1.3.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vOr67DWfAyOT3dVgrizI0WNhODPsY8k85xifhZBOU9Y=";
+  };
+
+  nativeBuildInputs = [
+    twine
+  ];
+
+  nativeCheckInputs = [
+    numpy
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Test relies on who, which does not work in the sandbox
+    "test_check_users"
+  ];
+
+  pythonImportsCheck = [
+    "nagiosplugin"
+  ];
+
+  meta = with lib; {
+    description = "Python class library which helps with writing Nagios (Icinga) compatible plugins";
+    homepage = "https://github.com/mpounsett/nagiosplugin";
+    license = licenses.zpl21;
+    maintainers = with maintainers; [ symphorien ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/name-that-hash/default.nix b/nixpkgs/pkgs/development/python-modules/name-that-hash/default.nix
new file mode 100644
index 000000000000..e68764b13ff7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/name-that-hash/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, click
+, rich
+}:
+
+buildPythonPackage rec {
+  pname = "name-that-hash";
+  version = "1.11.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "HashPals";
+    repo = pname;
+    rev = version;
+    hash = "sha256-zOb4BS3zG1x8GLXAooqqvMOw0fNbw35JuRWOdGP26/8=";
+  };
+
+  # TODO remove on next update which bumps rich
+  postPatch = ''
+    substituteInPlace pyproject.toml --replace 'rich = ">=9.9,<11.0"' 'rich = ">=9.9"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    click
+    rich
+  ];
+
+  pythonImportsCheck = [ "name_that_hash" ];
+
+  meta = with lib; {
+    longDescription = "Don't know what type of hash it is? Name That Hash will name that hash type! Identify MD5, SHA256 and 300+ other hashes.";
+    description = "Module and CLI for the identification of hashes";
+    homepage = "https://github.com/HashPals/Name-That-Hash";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ eyjhb ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/namedlist/default.nix b/nixpkgs/pkgs/development/python-modules/namedlist/default.nix
new file mode 100644
index 000000000000..86d5a9f5b3b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/namedlist/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "namedlist";
+  version = "1.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NPifyZJZLICzmnCeE27c9B6hfyS6Mer4SjFKAsi5vO8=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  patches = [
+    # Deprecation warning using collections.abc, https://gitlab.com/ericvsmith/namedlist/-/merge_requests/1
+    (fetchpatch {
+      url = "https://gitlab.com/ericvsmith/namedlist/-/commit/102d15b455e6f058b9c95fe135167be82b34c14a.patch";
+      hash = "sha256-IfDgiObFFSOUnAlXR/+ye8uutGaFJ/AyQvCb76iNaMM=";
+    })
+  ];
+
+  # Test file has a `unittest.main()` at the bottom that fails the tests;
+  # py.test can run the tests without it.
+  postPatch = ''
+    substituteInPlace test/test_namedlist.py --replace "unittest.main()" ""
+  '';
+
+  pythonImportsCheck = [
+    "namedlist"
+  ];
+
+  disabledTests = [
+    # AttributeError: module 'collections' has no attribute 'Container'
+    "test_ABC"
+  ];
+
+  meta = with lib; {
+    description = "Similar to namedtuple, but instances are mutable";
+    homepage = "https://gitlab.com/ericvsmith/namedlist";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ivan ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nameparser/default.nix b/nixpkgs/pkgs/development/python-modules/nameparser/default.nix
new file mode 100644
index 000000000000..370a5300a04e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nameparser/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "nameparser";
+  version = "1.1.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-qiQArXHM+AcGdbQDEaJXyTRln5GFSxVOG6bCZHYcBJ0=";
+  };
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "nameparser"
+  ];
+
+  meta = with lib; {
+    description = "Module for parsing human names into their individual components";
+    homepage = "https://github.com/derek73/python-nameparser";
+    changelog = "https://github.com/derek73/python-nameparser/releases/tag/v${version}";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/names/default.nix b/nixpkgs/pkgs/development/python-modules/names/default.nix
new file mode 100644
index 000000000000..b2d6a25bb5ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/names/default.nix
@@ -0,0 +1,36 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+
+# pythonPackages
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "names";
+  version = "0.3.0";
+
+  src = fetchFromGitHub {
+    owner = "treyhunner";
+    repo = pname;
+    rev = version;
+    sha256 = "0jfn11bl05k3qkqw0f4vi2i2lhllxdrbb1732qiisdy9fbvv8611";
+  };
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = {
+    description = "Generate random names";
+    homepage = "https://github.com/treyhunner/names";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [
+      kamadorueda
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nampa/default.nix b/nixpkgs/pkgs/development/python-modules/nampa/default.nix
new file mode 100644
index 000000000000..133fd4932b44
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nampa/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, future
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "nampa";
+  version = "1.0";
+
+  src = fetchFromGitHub {
+    owner = "thebabush";
+    repo = pname;
+    rev = version;
+    sha256 = "14b6xjm497wrfw4kv24zhsvz2l6zknvx36w8i754hfwz3s3fsl6a";
+  };
+
+  propagatedBuildInputs = [
+    future
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # https://github.com/thebabush/nampa/pull/13
+    substituteInPlace setup.py \
+      --replace "0.1.1" "${version}"
+  '';
+
+  pythonImportsCheck = [ "nampa" ];
+
+  meta = with lib; {
+    description = "Python implementation of the FLIRT technology";
+    homepage = "https://github.com/thebabush/nampa";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nanoid/default.nix b/nixpkgs/pkgs/development/python-modules/nanoid/default.nix
new file mode 100644
index 000000000000..5054756a3092
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nanoid/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "nanoid";
+  version = "2.0.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WoDK1enG6a46Qfovs0rhiffLQgsqXY+CvZ0jRm5O+mg=";
+  };
+
+  doCheck = false; # tests not in sdist, git not tagged
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "nanoid"
+  ];
+
+  meta = with lib; {
+    description = "A tiny, secure, URL-friendly, unique string ID generator for Python";
+    homepage = "https://github.com/puyuan/py-nanoid";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nanoleaf/default.nix b/nixpkgs/pkgs/development/python-modules/nanoleaf/default.nix
new file mode 100644
index 000000000000..67cfdd353771
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nanoleaf/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, requests }:
+
+buildPythonPackage rec {
+  pname = "nanoleaf";
+  version = "0.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "17dmxibfjmwnrs6ng5cmvfis3cv6iw267xb8n1pijy15y9dz0s8s";
+  };
+
+  prePatch = ''
+    sed -i '/^gitVersion =/d' setup.py
+    substituteInPlace setup.py --replace 'gitVersion' '"${version}"'
+  '';
+
+  propagatedBuildInputs = [ requests ];
+
+  meta = with lib; {
+    description = "A python interface for Nanoleaf Aurora lighting";
+    homepage = "https://github.com/software-2/nanoleaf";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nanomsg-python/default.nix b/nixpkgs/pkgs/development/python-modules/nanomsg-python/default.nix
new file mode 100644
index 000000000000..765941457d4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nanomsg-python/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchFromGitHub, nanomsg }:
+
+buildPythonPackage {
+  pname = "nanomsg-python";
+  version = "1.0.20190114";
+
+  src = fetchFromGitHub {
+    owner = "tonysimpson";
+    repo = "nanomsg-python";
+    rev = "3acd9160f90f91034d4a43ce603aaa19fbaf1f2e";
+    sha256 = "1qgybcpmm9xxrn39alcgdcpvwphgm1glkbnwx0ljpz4nd1jsnyrl";
+  };
+
+  buildInputs = [ nanomsg ];
+
+  # Tests requires network connections
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Bindings for nanomsg";
+    homepage = "https://github.com/tonysimpson/nanomsg-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bgamari ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nanotime/default.nix b/nixpkgs/pkgs/development/python-modules/nanotime/default.nix
new file mode 100644
index 000000000000..e7802871b085
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nanotime/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, nose }:
+
+buildPythonPackage rec {
+  pname = "nanotime";
+  version = "0.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c7cc231fc5f6db401b448d7ab51c96d0a4733f4b69fabe569a576f89ffdf966b";
+  };
+
+  nativeCheckInputs = [ nose ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  # tests currently fail
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Provides a time object that keeps time as the number of nanoseconds since the UNIX epoch";
+    homepage = "https://github.com/jbenet/nanotime/tree/master/python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cmcdragonkai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/napalm/default.nix b/nixpkgs/pkgs/development/python-modules/napalm/default.nix
new file mode 100644
index 000000000000..9b835d52737a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/napalm/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build-system
+, setuptools
+, cffi
+
+# dependencies
+, future
+, jinja2
+, junos-eznc
+, lxml
+, ncclient
+, netaddr
+, netmiko
+, netutils
+, paramiko
+, pyeapi
+, pyyaml
+, requests
+, scp
+, textfsm
+, ttp
+, ttp-templates
+, typing-extensions
+
+# tests
+, pytestCheckHook
+, ddt
+, mock
+ }:
+
+buildPythonPackage rec {
+  pname = "napalm";
+  version = "4.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "napalm-automation";
+    repo = "napalm";
+    rev = "refs/tags/${version}";
+    hash = "sha256-JqjuYMJcP58UMn1pPYg7x8KpqCKQUs19Ng9HbI2iX38=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+    future
+    jinja2
+    junos-eznc
+    lxml
+    ncclient
+    netaddr
+    netmiko
+    # breaks infinite recursion
+    (netutils.override { napalm = null; })
+    paramiko
+    pyeapi
+    pyyaml
+    requests
+    scp
+    setuptools
+    textfsm
+    ttp
+    ttp-templates
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook mock ddt ];
+
+  meta = with lib; {
+    description =
+      "Network Automation and Programmability Abstraction Layer with Multivendor support";
+    homepage = "https://github.com/napalm-automation/napalm";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ] ++ teams.c3d2.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/napalm/hp-procurve.nix b/nixpkgs/pkgs/development/python-modules/napalm/hp-procurve.nix
new file mode 100644
index 000000000000..6402005bed6e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/napalm/hp-procurve.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, napalm
+, netmiko
+, pip
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "napalm-hp-procurve";
+  version = "0.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "napalm-automation-community";
+    repo = "napalm-hp-procurve";
+    rev = "refs/tags/${version}";
+    hash = "sha256-cO4kxI90krj1knzixRKWxa77OAaxjO8dLTy02VpkV9M=";
+  };
+
+  patchPhase = ''
+    # Dependency installation in setup.py doesn't work
+    echo -n > requirements.txt
+    substituteInPlace setup.cfg \
+      --replace "--cov=napalm_procurve --cov-report term-missing -vs --pylama" ""
+  '';
+
+  nativeBuildInputs = [
+    pip
+  ];
+
+  buildInputs = [
+    napalm
+  ];
+
+  propagatedBuildInputs = [
+    netmiko
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # AssertionError: Some methods vary.
+    "test_method_signatures"
+    # AttributeError: 'PatchedProcurveDriver' object has no attribute 'platform'
+    "test_get_config_filtered"
+    # AssertionError
+    "test_get_interfaces"
+    "test_get_facts"
+  ];
+
+  pythonImportsCheck = [
+    "napalm_procurve"
+  ];
+
+  meta = with lib; {
+    description = "HP ProCurve Driver for NAPALM automation frontend";
+    homepage = "https://github.com/napalm-automation-community/napalm-hp-procurve";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/napari-console/default.nix b/nixpkgs/pkgs/development/python-modules/napari-console/default.nix
new file mode 100644
index 000000000000..acefdcc14bca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/napari-console/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, imageio
+, ipykernel
+, ipython
+, napari-plugin-engine
+, pythonOlder
+, qtconsole
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "napari-console";
+  version = "0.0.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "napari";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-vHLCVMgrcs54pGb48wQpc0h7QBIfE6r7hCSoDNI3QvA=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    imageio
+    ipykernel
+    ipython
+    napari-plugin-engine
+    qtconsole
+  ];
+
+  # Circular dependency: napari
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "napari_console"
+  ];
+
+  meta = with lib; {
+    description = "A plugin that adds a console to napari";
+    homepage = "https://github.com/napari/napari-console";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ SomeoneSerge ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/napari-npe2/default.nix b/nixpkgs/pkgs/development/python-modules/napari-npe2/default.nix
new file mode 100644
index 000000000000..53fffeaadcba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/napari-npe2/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, appdirs
+, build
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, hatch-vcs
+, magicgui
+, napari # reverse dependency, for tests
+, pydantic
+, pythonOlder
+, pytomlpp
+, pyyaml
+, rich
+, typer
+}:
+
+buildPythonPackage rec {
+  pname = "napari-npe2";
+  version = "0.7.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "napari";
+    repo = "npe2";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-PjoLocNTkcAnBNRbPi+MZqZtQ2bjWPIUVz0+k8nIn2A=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    hatchling
+    hatch-vcs
+  ];
+
+  propagatedBuildInputs = [
+    appdirs
+    build
+    magicgui
+    pydantic
+    pytomlpp
+    pyyaml
+    rich
+    typer
+  ];
+
+  pythonImportsCheck = [
+    "npe2"
+  ];
+
+  passthru.tests = { inherit napari; };
+
+  meta = with lib; {
+    description = "Plugin system for napari (the image visualizer)";
+    homepage = "https://github.com/napari/npe2";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ SomeoneSerge ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/napari-plugin-engine/default.nix b/nixpkgs/pkgs/development/python-modules/napari-plugin-engine/default.nix
new file mode 100644
index 000000000000..8b9a015e0065
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/napari-plugin-engine/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "napari-plugin-engine";
+  version = "0.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "napari";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-cKpCAEYYRq3UPje7REjzhEe1J9mmrtXs8TBnxWukcNE=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  # Circular dependency: napari
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "napari_plugin_engine"
+  ];
+
+  meta = with lib; {
+    description = "First generation napari plugin engine";
+    homepage = "https://github.com/napari/napari-plugin-engine";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SomeoneSerge ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/napari-svg/default.nix b/nixpkgs/pkgs/development/python-modules/napari-svg/default.nix
new file mode 100644
index 000000000000..b07ca1e2cf18
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/napari-svg/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, imageio
+, napari-plugin-engine
+, pythonOlder
+, setuptools-scm
+, vispy
+}:
+
+buildPythonPackage rec {
+  pname = "napari-svg";
+  version = "0.1.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "napari";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-lvI6RWT9oUE95vL6WO75CASc/Z+1G5UMm2p8vhqIjA0=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    vispy
+    napari-plugin-engine
+    imageio
+  ];
+
+  # Circular dependency: napari
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A plugin for writing svg files from napari";
+    homepage = "https://github.com/napari/napari-svg";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ SomeoneSerge ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/napari/default.nix b/nixpkgs/pkgs/development/python-modules/napari/default.nix
new file mode 100644
index 000000000000..9df87e357dd3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/napari/default.nix
@@ -0,0 +1,112 @@
+{ lib
+, mkDerivationWith
+, appdirs
+, app-model
+, buildPythonPackage
+, cachey
+, certifi
+, dask
+, docstring-parser
+, fetchFromGitHub
+, imageio
+, jsonschema
+, magicgui
+, napari-console
+, napari-npe2
+, napari-svg
+, numpydoc
+, pint
+, psutil
+, pydantic
+, pyopengl
+, pillow
+, pythonOlder
+, pyyaml
+, scikit-image
+, scipy
+, setuptools-scm
+, sphinx
+, superqt
+, tifffile
+, toolz
+, tqdm
+, typing-extensions
+, vispy
+, wrapQtAppsHook
+, wrapt
+}:
+
+mkDerivationWith buildPythonPackage rec {
+  pname = "napari";
+  version = "0.4.18";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "napari";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-xF0DYK+226MZpB050IukNvTg2iHMQAIZW0serKRJd/0=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "scikit-image>=0.19.1" "scikit-image" \
+      --replace "sphinx<5" "sphinx" \
+      --replace "vispy>=0.11.0,<0.12" "vispy"
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+    wrapQtAppsHook
+  ];
+
+  propagatedBuildInputs = [
+    app-model
+    appdirs
+    cachey
+    certifi
+    dask
+    docstring-parser
+    imageio
+    jsonschema
+    magicgui
+    napari-console
+    napari-npe2
+    napari-svg
+    numpydoc
+    pint
+    pillow
+    psutil
+    pydantic
+    pyopengl
+    pyyaml
+    scikit-image
+    scipy
+    sphinx
+    superqt
+    tifffile
+    toolz
+    tqdm
+    typing-extensions
+    vispy
+    wrapt
+  ] ++ dask.optional-dependencies.array;
+
+  dontUseSetuptoolsCheck = true;
+
+  postFixup = ''
+    wrapQtApp $out/bin/napari
+  '';
+
+  meta = with lib; {
+    description = "A fast, interactive, multi-dimensional image viewer";
+    homepage = "https://github.com/napari/napari";
+    changelog = "https://github.com/napari/napari/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ SomeoneSerge ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nasdaq-data-link/default.nix b/nixpkgs/pkgs/development/python-modules/nasdaq-data-link/default.nix
new file mode 100644
index 000000000000..f72edadaf262
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nasdaq-data-link/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, factory-boy
+, fetchFromGitHub
+, httpretty
+, inflection
+, jsondate
+, mock
+, more-itertools
+, numpy
+, pandas
+, parameterized
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "nasdaq-data-link";
+  version = "1.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Nasdaq";
+    repo = "data-link-python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Q3Ay9FpJsvSVu0WU2bxFyo3ODKP/ZUo3SqsBtOGrIIE=";
+  };
+
+  propagatedBuildInputs = [
+    inflection
+    more-itertools
+    numpy
+    pandas
+    python-dateutil
+    requests
+    six
+  ];
+
+  nativeCheckInputs = [
+    factory-boy
+    httpretty
+    jsondate
+    mock
+    parameterized
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "nasdaqdatalink"
+  ];
+
+  meta = with lib; {
+    description = "Library for Nasdaq Data Link's RESTful API";
+    homepage = "https://github.com/Nasdaq/data-link-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/natasha/default.nix b/nixpkgs/pkgs/development/python-modules/natasha/default.nix
new file mode 100644
index 000000000000..ca49c2653b68
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/natasha/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pymorphy2
+, razdel
+, navec
+, slovnet
+, yagry
+, ipymarkup
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "natasha";
+  version = "1.6.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Rgguazgq06a8B9jeRnfHD5VTR+Xrd+8OCsQUfaGLEq0=";
+  };
+
+  propagatedBuildInputs = [ pymorphy2 navec razdel slovnet yagry ipymarkup ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  pytestFlagsArray = [ "tests/" ];
+  pythonImportCheck = [ "natasha" ];
+
+  meta = with lib; {
+    description = "NLP framework for Russian language";
+    homepage = "https://github.com/natasha/natasha";
+    license = licenses.mit;
+    maintainers = with maintainers; [ npatsakula ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nats-py/default.nix b/nixpkgs/pkgs/development/python-modules/nats-py/default.nix
new file mode 100644
index 000000000000..5028ab345f03
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nats-py/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, stdenv
+, aiohttp
+, buildPythonPackage
+, ed25519
+, fetchFromGitHub
+, nats-server
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, uvloop
+}:
+
+buildPythonPackage rec {
+  pname = "nats-py";
+  version = "2.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nats-io";
+    repo = "nats.py";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-gpQXCihKvuXzCt1WNOd5W7RxxfVAvpaVP6OuHUiAQkw=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"--cov=nats", "--cov-report=html"' ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    ed25519
+  ];
+
+  nativeCheckInputs = [
+    nats-server
+    pytestCheckHook
+    uvloop
+  ];
+
+  disabledTests = [
+    # AssertionError: assert 5 == 0
+    "test_pull_subscribe_limits"
+    "test_fetch_n"
+    "test_subscribe_no_echo"
+    "test_stream_management"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_subscribe_iterate_next_msg"
+    "test_buf_size_force_flush_timeout"
+  ];
+
+  pythonImportsCheck = [
+    "nats"
+  ];
+
+  meta = with lib; {
+    description = "Python client for NATS.io";
+    homepage = "https://github.com/nats-io/nats.py";
+    changelog = "https://github.com/nats-io/nats.py/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nats-python/default.nix b/nixpkgs/pkgs/development/python-modules/nats-python/default.nix
new file mode 100644
index 000000000000..9662dddd5ddb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nats-python/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "nats-python";
+  version = "0.8.0";
+  disabled = pythonOlder "3.6";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "Gr1N";
+    repo = "nats-python";
+    rev = version;
+    sha256 = "1j7skyxldir3mphvnsyhjxmf3cimv4h7n5v58jl2gff4yd0hdw7g";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  patches = [
+    # Switch to poetry-core, https://github.com/Gr1N/nats-python/pull/19
+    (fetchpatch {
+      name = "use-poetry-core.patch";
+      url = "https://github.com/Gr1N/nats-python/commit/71b25b324212dccd7fc06ba3914491adba22e83f.patch";
+      sha256 = "1fip1qpzk2ka7qgkrdpdr6vnrnb1p8cwapa51xp0h26nm7yis1gl";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  # Tests require a running NATS server
+  doCheck = false;
+
+  pythonImportsCheck = [ "pynats" ];
+
+  meta = with lib; {
+    description = "Python client for NATS messaging system";
+    homepage = "https://github.com/Gr1N/nats-python";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/natsort/default.nix b/nixpkgs/pkgs/development/python-modules/natsort/default.nix
new file mode 100644
index 000000000000..b39460f71aa6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/natsort/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fastnumbers
+, fetchPypi
+, glibcLocales
+, hypothesis
+, pyicu
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "natsort";
+  version = "8.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-RTEsSg5VB1k9oZPe3QSrsUaSU7YB7K9jRFrYDwoepYE=";
+  };
+
+  propagatedBuildInputs = [
+    fastnumbers
+    pyicu
+  ];
+
+  nativeCheckInputs = [
+    glibcLocales
+    hypothesis
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # timing sensitive test
+    # hypothesis.errors.DeadlineExceeded: Test took 524.23ms, which exceeds the deadline of 200.00ms
+    "test_string_component_transform_factory"
+  ];
+
+  pythonImportsCheck = [
+    "natsort"
+  ];
+
+  meta = with lib; {
+    description = "Natural sorting for Python";
+    homepage = "https://github.com/SethMMorton/natsort";
+    changelog = "https://github.com/SethMMorton/natsort/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/naturalsort/default.nix b/nixpkgs/pkgs/development/python-modules/naturalsort/default.nix
new file mode 100644
index 000000000000..98ced7a381c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/naturalsort/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchFromGitHub }:
+
+buildPythonPackage rec {
+  pname = "naturalsort";
+  version = "1.5.1";
+
+  src = fetchFromGitHub {
+    owner = "xolox";
+    repo = "python-naturalsort";
+    rev = version;
+    sha256 = "0w43vlddzh97hffnvxp2zkrns9qyirx5g8ijxnxkbx1c4b4gq5ih";
+  };
+
+  meta = with lib; {
+    description = "Simple natural order sorting API for Python that just works";
+    homepage = "https://github.com/xolox/python-naturalsort";
+    license = licenses.mit;
+    maintainers = with maintainers; [ eyjhb ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/navec/default.nix b/nixpkgs/pkgs/development/python-modules/navec/default.nix
new file mode 100644
index 000000000000..02a55e5d6619
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/navec/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, razdel
+, gensim
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "navec";
+  version = "0.10.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-TyNHSxwnmvbGBfhOeHPofEfKWLDFOKP50w2QxgnJ/SE=";
+  };
+
+  propagatedBuildInputs = [ numpy razdel ];
+  nativeCheckInputs = [ pytestCheckHook gensim ];
+  # TODO: remove when gensim usage will be fixed in `navec`.
+  disabledTests = [ "test_gensim" ];
+  pythonImportCheck = [ "navec" ];
+
+  meta = with lib; {
+    description = "Compact high quality word embeddings for Russian language";
+    homepage = "https://github.com/natasha/navec";
+    license = licenses.mit;
+    maintainers = with maintainers; [ npatsakula ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nbclassic/default.nix b/nixpkgs/pkgs/development/python-modules/nbclassic/default.nix
new file mode 100644
index 000000000000..d4730414006c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbclassic/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, argon2-cffi
+, buildPythonPackage
+, fetchPypi
+, ipykernel
+, ipython-genutils
+, jinja2
+, jupyter-client
+, jupyter-core
+, jupyter-server
+, nbconvert
+, nbformat
+, nest-asyncio
+, notebook-shim
+, prometheus-client
+, pytest-jupyter
+, pytest-tornasync
+, pytestCheckHook
+, pythonOlder
+, pyzmq
+, send2trash
+, terminado
+, tornado
+, traitlets
+}:
+
+buildPythonPackage rec {
+  pname = "nbclassic";
+  version = "1.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-CuEesjGUVdgFWWvzIDNs2pVUtB2Zq5o8Mb+BgL/6MOM=";
+  };
+
+  propagatedBuildInputs = [
+    argon2-cffi
+    ipykernel
+    ipython-genutils
+    jinja2
+    jupyter-client
+    jupyter-core
+    jupyter-server
+    nbconvert
+    nbformat
+    nest-asyncio
+    notebook-shim
+    prometheus-client
+    pyzmq
+    send2trash
+    terminado
+    tornado
+    traitlets
+  ];
+
+  nativeCheckInputs = [
+    pytest-jupyter
+    pytest-tornasync
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "nbclassic"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Jupyter lab environment notebook server extension";
+    homepage = "https://github.com/jupyter/nbclassic";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ elohmeier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nbclient/default.nix b/nixpkgs/pkgs/development/python-modules/nbclient/default.nix
new file mode 100644
index 000000000000..745de65f4b2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbclient/default.nix
@@ -0,0 +1,74 @@
+{ async-generator
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, ipykernel
+, ipywidgets
+, jupyter-client
+, lib
+, nbconvert
+, nbformat
+, nest-asyncio
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, testpath
+, traitlets
+, xmltodict
+}:
+
+let nbclient = buildPythonPackage rec {
+  pname = "nbclient";
+  version = "0.8.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jupyter";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-uBCYmrl/Zfw58hd12z20jLVwGSPv+M3fMo1mfV2GO/M=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    async-generator
+    traitlets
+    nbformat
+    nest-asyncio
+    jupyter-client
+  ];
+
+  # circular dependencies if enabled by default
+  doCheck = false;
+
+  nativeCheckInputs = [
+    ipykernel
+    ipywidgets
+    nbconvert
+    pytest-asyncio
+    pytestCheckHook
+    testpath
+    xmltodict
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  passthru.tests = {
+    check = nbclient.overridePythonAttrs (_: { doCheck = true; });
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/jupyter/nbclient";
+    description = "A client library for executing notebooks";
+    license = licenses.bsd3;
+    maintainers = [ ];
+  };
+};
+in nbclient
diff --git a/nixpkgs/pkgs/development/python-modules/nbconflux/default.nix b/nixpkgs/pkgs/development/python-modules/nbconflux/default.nix
new file mode 100644
index 000000000000..c986085a61e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbconflux/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, nbconvert
+, pytestCheckHook
+, requests
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "nbconflux";
+  version = "0.7.0";
+  disabled = isPy27; # no longer compatible with python 2 urllib
+
+  src = fetchFromGitHub {
+    owner = "Valassis-Digital-Media";
+    repo = "nbconflux";
+    rev = "refs/tags/${version}";
+    hash = "sha256-kHIuboFKLVsu5zlZ0bM1BUoQR8f1l0XWcaaVI9bECJw=";
+  };
+
+  propagatedBuildInputs = [ nbconvert requests ];
+
+  nativeCheckInputs = [ pytestCheckHook responses ];
+
+  patches = [
+    # The original setup.py file is missing commas in the install_requires list
+    ./setup-py.patch
+  ];
+
+  JUPYTER_PATH="${nbconvert}/share/jupyter";
+  disabledTests = [
+    "test_post_to_confluence"
+    "test_optional_components"
+  ];
+
+  meta = with lib; {
+    description = "Converts Jupyter Notebooks to Atlassian Confluence (R) pages using nbconvert";
+    homepage = "https://github.com/Valassis-Digital-Media/nbconflux";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.arnoldfarkas ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nbconflux/setup-py.patch b/nixpkgs/pkgs/development/python-modules/nbconflux/setup-py.patch
new file mode 100644
index 000000000000..1e92e2dd11c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbconflux/setup-py.patch
@@ -0,0 +1,16 @@
+diff --git a/setup.py b/setup.py
+index 26f882d..b7ccf67 100644
+--- a/setup.py
++++ b/setup.py
+@@ -27,8 +27,8 @@ setup(
+         ]
+     },
+     install_requires=[
+-        'nbconvert>=5.3'
+-        'requests'
+-        'traitlets'
++        'nbconvert>=5.3',
++        'requests',
++        'traitlets',
+     ],
+ )
diff --git a/nixpkgs/pkgs/development/python-modules/nbconvert/default.nix b/nixpkgs/pkgs/development/python-modules/nbconvert/default.nix
new file mode 100644
index 000000000000..4afb593479d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbconvert/default.nix
@@ -0,0 +1,110 @@
+{ lib
+, fetchurl
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, hatchling
+, beautifulsoup4
+, bleach
+, defusedxml
+, jinja2
+, jupyter-core
+, jupyterlab-pygments
+, markupsafe
+, mistune
+, nbclient
+, packaging
+, pandocfilters
+, pygments
+, tinycss2
+, traitlets
+, importlib-metadata
+, flaky
+, ipywidgets
+, pytestCheckHook
+}:
+
+let
+  # see https://github.com/jupyter/nbconvert/issues/1896
+  style-css = fetchurl {
+    url = "https://cdn.jupyter.org/notebook/5.4.0/style/style.min.css";
+    hash = "sha256-WGWmCfRDewRkvBIc1We2GQdOVAoFFaO4LyIvdk61HgE=";
+  };
+in buildPythonPackage rec {
+  pname = "nbconvert";
+  version = "7.11.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-q+3AHPVDF3/94L/Cppcm1aR49q8QozL8G/Kfy08M8AA=";
+  };
+
+  # Add $out/share/jupyter to the list of paths that are used to search for
+  # various exporter templates
+  patches = [
+    ./templates.patch
+  ];
+
+  postPatch = ''
+    substituteAllInPlace ./nbconvert/exporters/templateexporter.py
+
+    mkdir -p share/templates/classic/static
+    cp ${style-css} share/templates/classic/static/style.css
+  '';
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    bleach
+    defusedxml
+    jinja2
+    jupyter-core
+    jupyterlab-pygments
+    markupsafe
+    mistune
+    nbclient
+    packaging
+    pandocfilters
+    pygments
+    tinycss2
+    traitlets
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    importlib-metadata
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  nativeCheckInputs = [
+    flaky
+    ipywidgets
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Attempts network access (Failed to establish a new connection: [Errno -3] Temporary failure in name resolution)
+    "test_export"
+    "test_webpdf_with_chromium"
+    # ModuleNotFoundError: No module named 'nbconvert.tests'
+    "test_convert_full_qualified_name"
+    "test_post_processor"
+  ];
+
+  # Some of the tests use localhost networking.
+  __darwinAllowLocalNetworking = true;
+
+  meta = {
+    description = "Converting Jupyter Notebooks";
+    homepage = "https://github.com/jupyter/nbconvert";
+    changelog = "https://github.com/jupyter/nbconvert/blob/v${version}/CHANGELOG.md";
+    license = lib.licenses.bsd3;
+    maintainers = lib.teams.jupyter.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nbconvert/templates.patch b/nixpkgs/pkgs/development/python-modules/nbconvert/templates.patch
new file mode 100644
index 000000000000..cadaf69a7b84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbconvert/templates.patch
@@ -0,0 +1,12 @@
+diff --git a/nbconvert/exporters/templateexporter.py b/nbconvert/exporters/templateexporter.py
+index 0d540eb1..440f6382 100644
+--- a/nbconvert/exporters/templateexporter.py
++++ b/nbconvert/exporters/templateexporter.py
+@@ -616,6 +616,7 @@ class TemplateExporter(Exporter):
+         if DEV_MODE:
+             root_dirs.append(os.path.abspath(os.path.join(ROOT, '..', '..', 'share', 'jupyter')))
+         root_dirs.extend(jupyter_path())
++        root_dirs.append(os.path.join("@out@", "share", "jupyter"))
+         return root_dirs
+ 
+     def _init_resources(self, resources):
diff --git a/nixpkgs/pkgs/development/python-modules/nbdev/default.nix b/nixpkgs/pkgs/development/python-modules/nbdev/default.nix
new file mode 100644
index 000000000000..8a298ec19f67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbdev/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fastprogress
+, fastcore
+, asttokens
+, astunparse
+, watchdog
+, execnb
+, ghapi
+, pyyaml
+, quarto
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "nbdev";
+  version = "2.3.13";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Umkf3CcRRSS+pK3UKeTg+Ru3TW+qHNoQ2F6nUk8jQUU=";
+  };
+
+  propagatedBuildInputs = [
+    fastprogress
+    fastcore
+    asttokens
+    astunparse
+    watchdog
+    execnb
+    ghapi
+    pyyaml
+    quarto
+  ];
+
+  # no real tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "nbdev"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/fastai/nbdev";
+    description = "Create delightful software with Jupyter Notebooks";
+    changelog = "https://github.com/fastai/nbdev/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ rxiao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nbdime/default.nix b/nixpkgs/pkgs/development/python-modules/nbdime/default.nix
new file mode 100644
index 000000000000..e1bb3e84079b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbdime/default.nix
@@ -0,0 +1,96 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, hypothesis
+, setuptools-scm
+, six
+, attrs
+, py
+, setuptools
+, pytest-timeout
+, pytest-tornado
+, mock
+, tabulate
+, nbformat
+, jsonschema
+, pytestCheckHook
+, colorama
+, pygments
+, tornado
+, requests
+, gitpython
+, jupyter-server
+, jupyter-server-mathjax
+, notebook
+, jinja2
+}:
+
+buildPythonPackage rec {
+  pname = "nbdime";
+  version = "3.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MUCaMPhI/8azJUBpfoLVoKG4TcwycWynTni8xLRXxFM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    py
+    setuptools
+    six
+    jupyter-server-mathjax
+    nbformat
+    colorama
+    pygments
+    tornado
+    requests
+    gitpython
+    notebook
+    jinja2
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytest-timeout
+    pytest-tornado
+    jsonschema
+    mock
+    tabulate
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_apply_filter_no_repo"
+    "test_diff_api_checkpoint"
+    "test_filter_cmd_invalid_filter"
+    "test_inline_merge_source_add"
+    "test_inline_merge_source_patches"
+    "test_inline_merge_source_replace"
+    "test_inline_merge_cells_insertion"
+    "test_inline_merge_cells_replacement"
+    "test_interrogate_filter_no_repo"
+    "test_merge_input_strategy_inline"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [
+    "nbdime"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jupyter/nbdime";
+    description = "Tools for diffing and merging of Jupyter notebooks.";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ tbenst ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nbexec/default.nix b/nixpkgs/pkgs/development/python-modules/nbexec/default.nix
new file mode 100644
index 000000000000..5eec122cdc59
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbexec/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+# build inputs
+, jupyter-client
+, nbformat
+, nbconvert
+# check inputs
+, unittestCheckHook
+, ipykernel
+}:
+let
+  pname = "nbexec";
+  version = "0.2.0";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "jsvine";
+    repo = "nbexec";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Vv6EHX6WlnSmzQAYlO1mHnz5t078z3RQfVfte1+X2pw=";
+  };
+
+  propagatedBuildInputs = [
+    jupyter-client
+    nbformat
+    nbconvert
+  ];
+
+  # TODO there is a warning about debugpy_stream missing
+  nativeCheckInputs = [
+    unittestCheckHook
+    ipykernel
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  unittestFlagsArray = [
+    "-s" "test" "-v"
+  ];
+
+  pythonImportsCheck = [
+    "nbexec"
+  ];
+
+  meta = with lib; {
+    description = "A dead-simple tool for executing Jupyter notebooks from the command line.";
+    homepage = "https://github.com/jsvine/nbexec";
+    changelog = "https://github.com/jsvine/nbexec/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nbformat/default.nix b/nixpkgs/pkgs/development/python-modules/nbformat/default.nix
new file mode 100644
index 000000000000..290663e78a81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbformat/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, hatchling
+, hatch-nodejs-version
+, fastjsonschema
+, jsonschema
+, jupyter-core
+, traitlets
+, pep440
+, pytestCheckHook
+, testpath
+}:
+
+buildPythonPackage rec {
+  pname = "nbformat";
+  version = "5.9.2";
+  format = "pyproject";
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-X5i1uhmX3/F1534MF9XBCpbq7Sy9HeNTPR/DXV4REZI=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+    hatch-nodejs-version
+  ];
+
+  propagatedBuildInputs = [
+    fastjsonschema
+    jsonschema
+    jupyter-core
+    traitlets
+  ];
+
+  nativeCheckInputs = [
+    pep440
+    pytestCheckHook
+    testpath
+  ];
+
+  # Some of the tests use localhost networking.
+  __darwinAllowLocalNetworking = true;
+
+  meta = {
+    description = "The Jupyter Notebook format";
+    homepage = "https://jupyter.org/";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ fridh globin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nbmerge/default.nix b/nixpkgs/pkgs/development/python-modules/nbmerge/default.nix
new file mode 100644
index 000000000000..6aaee680582c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbmerge/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, nbformat
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "nbmerge";
+  version = "0.0.4";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "jbn";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Uqs/SO/AculHCFYcbjW08kLQX5GSU/eAwkN2iy/vhLM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [ nbformat ];
+
+  nativeCheckInputs = [ nose ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    patchShebangs .
+    nosetests -v
+    PATH=$PATH:$out/bin ./cli_tests.sh
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "nbmerge"
+  ];
+
+  meta = {
+    description = "A tool to merge/concatenate Jupyter (IPython) notebooks";
+    inherit (src.meta) homepage;
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ ];
+    mainProgram = "nbmerge";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nbsmoke/default.nix b/nixpkgs/pkgs/development/python-modules/nbsmoke/default.nix
new file mode 100644
index 000000000000..58b02546f7e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbsmoke/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, jupyter-client
+, ipykernel
+, holoviews
+, nbformat
+, nbconvert
+, pyflakes
+, requests
+, beautifulsoup4
+}:
+
+buildPythonPackage rec {
+  pname = "nbsmoke";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8b55333e2face27bc7ff80c266c468ca5633947cb0697727348020dd445b0874";
+  };
+
+  propagatedBuildInputs = [
+    pytest
+    holoviews
+    jupyter-client
+    ipykernel
+    nbformat
+    nbconvert
+    pyflakes
+    requests
+    beautifulsoup4
+  ];
+
+  # tests not included with pypi release
+  doCheck = false;
+  pythonImportsCheck = [ "nbsmoke" ];
+
+  meta = with lib; {
+    description = "Basic notebook checks and linting";
+    homepage = "https://github.com/pyviz/nbsmoke";
+    license = licenses.bsd3;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nbsphinx/default.nix b/nixpkgs/pkgs/development/python-modules/nbsphinx/default.nix
new file mode 100644
index 000000000000..de0d972aa986
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbsphinx/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, docutils
+, jinja2
+, nbconvert
+, nbformat
+, sphinx
+, traitlets
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "nbsphinx";
+  version = "0.9.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7DOchpG2iPhnYQSjZ6S4zz6gH9CJ3CjSTewi1WOxFWI=";
+  };
+
+  propagatedBuildInputs = [
+    docutils
+    jinja2
+    nbconvert
+    nbformat
+    sphinx
+    traitlets
+  ];
+
+  # The package has not tests
+  doCheck = false;
+
+  JUPYTER_PATH = "${nbconvert}/share/jupyter";
+
+  pythonImportsCheck = [
+    "nbsphinx"
+  ];
+
+  meta = with lib; {
+    description = "Jupyter Notebook Tools for Sphinx";
+    homepage = "https://nbsphinx.readthedocs.io/";
+    changelog = "https://github.com/spatialaudio/nbsphinx/blob/${version}/NEWS.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nbtlib/default.nix b/nixpkgs/pkgs/development/python-modules/nbtlib/default.nix
new file mode 100644
index 000000000000..b70259c9c76d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbtlib/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "nbtlib";
+  version = "2.0.4";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "vberlier";
+    repo = "nbtlib";
+    rev = "v${version}";
+    hash = "sha256-L8eX6/0qiQ4UxbmDicLedzj+oBjYmlK96NpljE/A3eI=";
+  };
+
+  prePatch = ''
+      substituteInPlace pyproject.toml \
+      --replace "poetry>=0.12" "poetry-core" \
+      --replace "poetry.masonry" "poetry.core.masonry"
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  pythonImportsCheck = [ "nbtlib" ];
+
+  meta = with lib; {
+    description = "A python library to read and edit nbt data";
+    homepage = "https://github.com/vberlier/nbtlib";
+    changelog = "https://github.com/vberlier/nbtlib/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gdd ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nbval/default.nix b/nixpkgs/pkgs/development/python-modules/nbval/default.nix
new file mode 100644
index 000000000000..9eaa2c60de29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbval/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, coverage
+, ipykernel
+, jupyter-client
+, nbformat
+, pytestCheckHook
+, pytest
+, six
+, glibcLocales
+, matplotlib
+, sympy
+}:
+
+buildPythonPackage rec {
+  pname = "nbval";
+  version = "0.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-tKzv3BEyrvihtbYr+ak9Eo66UoObKFTqPkJZj023vrM=";
+  };
+
+  buildInputs = [
+    glibcLocales
+  ];
+
+  propagatedBuildInputs = [
+    coverage
+    ipykernel
+    jupyter-client
+    nbformat
+    pytest
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    matplotlib
+    sympy
+  ];
+
+  disabledTestPaths = [
+    "tests/test_ignore.py"
+    # These are the main tests but they're fragile so skip them. They error
+    # whenever matplotlib outputs any unexpected warnings, e.g. deprecation
+    # warnings.
+    "tests/test_unit_tests_in_notebooks.py"
+    # Impure
+    "tests/test_timeouts.py"
+    # No value for us
+    "tests/test_coverage.py"
+    # nbdime marked broken
+    "tests/test_nbdime_reporter.py"
+  ];
+
+  # Some of the tests use localhost networking.
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [
+    "nbval"
+  ];
+
+  meta = with lib; {
+    description = "A py.test plugin to validate Jupyter notebooks";
+    homepage = "https://github.com/computationalmodelling/nbval";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nbxmpp/default.nix b/nixpkgs/pkgs/development/python-modules/nbxmpp/default.nix
new file mode 100644
index 000000000000..d070b4317eed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nbxmpp/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitLab
+, gobject-introspection
+, idna
+, libsoup_3
+, packaging
+, precis-i18n
+, pygobject3
+, pyopenssl
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "nbxmpp";
+  version = "4.5.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitLab {
+    domain = "dev.gajim.org";
+    owner = "gajim";
+    repo = "python-nbxmpp";
+    rev = "refs/tags/${version}";
+    hash = "sha256-vAuHfG2/DVUDCxUb7UMRejIh4fQHGl67A+dncvcJ8jQ=";
+  };
+
+  nativeBuildInputs = [
+    # required for pythonImportsCheck otherwise libsoup cannot be found
+    gobject-introspection
+    setuptools
+  ];
+
+  buildInputs = [
+    precis-i18n
+  ];
+
+  propagatedBuildInputs = [
+    gobject-introspection
+    idna
+    libsoup_3
+    packaging
+    pygobject3
+    pyopenssl
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "nbxmpp"
+  ];
+
+  meta = with lib; {
+    homepage = "https://dev.gajim.org/gajim/python-nbxmpp";
+    description = "Non-blocking Jabber/XMPP module";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nc-dnsapi/default.nix b/nixpkgs/pkgs/development/python-modules/nc-dnsapi/default.nix
new file mode 100644
index 000000000000..b68ef8fdf055
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nc-dnsapi/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "nc-dnsapi";
+  version = "0.1.6";
+
+  src = fetchFromGitHub {
+    owner = "nbuchwitz";
+    repo = "nc_dnsapi";
+    rev = "v${version}";
+    hash = "sha256-OE4+wJbJbUZ+YB5J5OyvytLFCcrnXCeZEqmphHKKprQ=";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  pythonImportsCheck = [ "nc_dnsapi" ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "API wrapper for the netcup DNS api";
+    homepage = "https://github.com/nbuchwitz/nc_dnsapi";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ veehaitch trundle ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ncclient/default.nix b/nixpkgs/pkgs/development/python-modules/ncclient/default.nix
new file mode 100644
index 000000000000..4b656fd72fd0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ncclient/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, lxml
+, paramiko
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "ncclient";
+  version = "0.6.13";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-NrilXB1NFcqNCGrwshhuLdhQoeHJ12PSp4MBScT9kYc=";
+  };
+
+  propagatedBuildInputs = [
+    paramiko
+    lxml
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ncclient"
+  ];
+
+  meta = with lib; {
+    description = "Python library for NETCONF clients";
+    homepage = "https://github.com/ncclient/ncclient";
+    changelog = "https://github.com/ncclient/ncclient/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ xnaveira ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nclib/default.nix b/nixpkgs/pkgs/development/python-modules/nclib/default.nix
new file mode 100644
index 000000000000..c2717746bf69
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nclib/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "nclib";
+  version = "1.0.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sKbISlL5hOBu1j6zWSib2HjJCvEoMrqdwzgG2keMqDE=";
+  };
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "nclib"
+  ];
+
+  meta = with lib; {
+    description = "Python module that provides netcat features";
+    homepage = "https://nclib.readthedocs.io/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ndeflib/default.nix b/nixpkgs/pkgs/development/python-modules/ndeflib/default.nix
new file mode 100644
index 000000000000..3699955627ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ndeflib/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ndeflib";
+  version = "0.3.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nfcpy";
+    repo = "ndeflib";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-cpfztE+/AW7P0J7QeTDfVGYc2gEkr7gzA352hC9bdTM=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ndef"
+  ];
+
+  disabledTests = [
+    # AssertionError caused due to wrong size
+    "test_decode_error"
+  ];
+
+  meta = with lib; {
+    description = "Python package for parsing and generating NFC Data Exchange Format messages";
+    homepage = "https://github.com/nfcpy/ndeflib";
+    license = licenses.isc;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ndg-httpsclient/default.nix b/nixpkgs/pkgs/development/python-modules/ndg-httpsclient/default.nix
new file mode 100644
index 000000000000..39429950b71c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ndg-httpsclient/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyasn1
+, pyopenssl
+}:
+
+buildPythonPackage rec {
+  version = "0.5.1";
+  pname = "ndg-httpsclient";
+
+  src = fetchFromGitHub {
+    owner = "cedadev";
+    repo = "ndg_httpsclient";
+    rev = version;
+    sha256 = "0lhsgs4am4xyjssng5p0vkfwqncczj1dpa0vss4lrhzq86mnn5rz";
+  };
+
+
+  propagatedBuildInputs = [
+    pyasn1
+    pyopenssl
+  ];
+
+  # uses networking
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/cedadev/ndg_httpsclient/";
+    description = "Provide enhanced HTTPS support for httplib and urllib2 using PyOpenSSL";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ndindex/default.nix b/nixpkgs/pkgs/development/python-modules/ndindex/default.nix
new file mode 100644
index 000000000000..de40dc3d71cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ndindex/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, cython
+
+# optional
+, numpy
+
+# tests
+, hypothesis
+, pytest-cov
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ndindex";
+  version = "1.7";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Quansight-Labs";
+    repo = "ndindex";
+    rev = "refs/tags/${version}";
+    hash = "sha256-JP0cEuxXfPTWc1EIUtMsy5Hx6eIo9vDzD0IUXm1lFME=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace "--cov=ndindex/ --cov-report=term-missing --flakes" ""
+  '';
+
+  passthru.optional-dependencies.arrays = [
+    numpy
+  ];
+
+  pythonImportsCheck = [
+    "ndindex"
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytest-cov # uses cov markers
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.arrays;
+
+  pytestFlagsArray = [
+    # pytest.PytestRemovedIn8Warning: Passing None has been deprecated.
+    "--deselect=ndindex/tests/test_ndindex.py::test_ndindex_invalid"
+  ];
+
+  meta = with lib; {
+    description = "";
+    homepage = "https://github.com/Quansight-Labs/ndindex";
+    changelog = "https://github.com/Quansight-Labs/ndindex/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ndjson/default.nix b/nixpkgs/pkgs/development/python-modules/ndjson/default.nix
new file mode 100644
index 000000000000..4bd84a73be0a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ndjson/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, six
+, watchdog
+}:
+
+buildPythonPackage rec {
+  pname = "ndjson";
+  version = "0.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-v5dGy2uxy1PRcs2n8VTAfHhtZl/yg0Hk5om3lrIp5dY=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner', " ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    six
+    watchdog
+  ];
+
+  pythonImportsCheck = [
+    "ndjson"
+  ];
+
+  meta = with lib; {
+    description = "Module supports ndjson";
+    homepage = "https://github.com/rhgrant10/ndjson";
+    changelog = "https://github.com/rhgrant10/ndjson/blob/v${version}/HISTORY.rst";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ freezeboy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ndms2-client/default.nix b/nixpkgs/pkgs/development/python-modules/ndms2-client/default.nix
new file mode 100644
index 000000000000..feeb36737a8a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ndms2-client/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ndms2-client";
+  version = "0.1.2";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "foxel";
+    repo = "python_ndms2_client";
+    rev = version;
+    hash = "sha256-cM36xNLymg5Xph3bvbUGdAEmMABJ9y3/w/U8re6ZfB4=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "ndms2_client" ];
+
+  meta = with lib; {
+    description = "Keenetic NDMS 2.x and 3.x client";
+    homepage = "https://github.com/foxel/python_ndms2_client";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ndspy/default.nix b/nixpkgs/pkgs/development/python-modules/ndspy/default.nix
new file mode 100644
index 000000000000..dbdce14ae1f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ndspy/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ndspy";
+  version = "4.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "RoadrunnerWMC";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-V7phRZCA0WbUpYLgS/4nJbje/JM61RksDUZQ2pnbQyU=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ndspy"
+  ];
+
+  preCheck = ''
+    cd tests
+  '';
+
+  meta = with lib; {
+    description = "Python library for many Nintendo DS file formats";
+    homepage = "https://github.com/RoadrunnerWMC/ndspy";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ xfix ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ndtypes/default.nix b/nixpkgs/pkgs/development/python-modules/ndtypes/default.nix
new file mode 100644
index 000000000000..8bfe1347e6df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ndtypes/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, python
+, numpy
+, libndtypes
+, isPy27
+}:
+
+buildPythonPackage {
+  pname = "ndtypes";
+  disabled = isPy27;
+  inherit (libndtypes) version src meta;
+
+  outputs = [ "out" "dev" ];
+
+  propagatedBuildInputs = [ numpy ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'include_dirs = ["libndtypes"]' \
+                'include_dirs = ["${libndtypes.dev}/include"]' \
+      --replace 'library_dirs = ["libndtypes"]' \
+                'library_dirs = ["${libndtypes}/lib"]' \
+      --replace 'runtime_library_dirs = ["$ORIGIN"]' \
+                'runtime_library_dirs = ["${libndtypes}/lib"]'
+  '';
+
+  postInstall = ''
+    mkdir $out/include
+    cp python/ndtypes/*.h $out/include
+  '' + lib.optionalString stdenv.isDarwin ''
+    install_name_tool -add_rpath ${libndtypes}/lib $out/${python.sitePackages}/ndtypes/_ndtypes.*.so
+  '';
+
+  checkPhase = ''
+    pushd python
+    mv ndtypes _ndtypes
+    python test_ndtypes.py
+    popd
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nengo/default.nix b/nixpkgs/pkgs/development/python-modules/nengo/default.nix
new file mode 100644
index 000000000000..c422278c830c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nengo/default.nix
@@ -0,0 +1,36 @@
+{ lib, fetchFromGitHub, buildPythonPackage
+, numpy
+, scipySupport ? false, scipy
+, scikitSupport ? false, scikit-learn
+}:
+
+buildPythonPackage rec {
+  pname = "nengo";
+  version = "3.2.0";
+
+  src = fetchFromGitHub {
+    owner = "nengo";
+    repo = "nengo";
+    rev = "v${version}";
+    sha256 = "12lz8lzirxvwnpa74k9k48c64gs6gi092928rh97siya3i6gjs6i";
+  };
+
+  propagatedBuildInputs = [ numpy ]
+    ++ lib.optionals scipySupport [ scipy ]
+    ++ lib.optionals scikitSupport [ scikit-learn ];
+
+  # checks req missing:
+  #   pytest-allclose
+  #   pytest-plt
+  #   pytest-rng
+  doCheck = false;
+
+  pythonImportsCheck = [ "nengo" ];
+
+  meta = with lib; {
+    description = "A Python library for creating and simulating large-scale brain models";
+    homepage    = "https://nengo.ai/";
+    license     = licenses.unfreeRedistributable;
+    maintainers = with maintainers; [ arjix ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/neo/default.nix b/nixpkgs/pkgs/development/python-modules/neo/default.nix
new file mode 100644
index 000000000000..3db12e647838
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/neo/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, numpy
+, packaging
+, quantities
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "neo";
+  version = "0.12.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-O2yk/AXf206VPiU+cJlL+7yP4ukJWPvaf6WGDK8/pjo=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    packaging
+    quantities
+  ];
+
+  nativeCheckInputs = [
+    nose
+  ];
+
+  checkPhase = ''
+    nosetests --exclude=iotest
+  '';
+
+  pythonImportsCheck = [
+    "neo"
+  ];
+
+  meta = with lib; {
+    description = "Package for representing electrophysiology data";
+    homepage = "https://neuralensemble.org/neo/";
+    changelog = "https://neo.readthedocs.io/en/${version}/releases/${version}.html";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/neo4j/default.nix b/nixpkgs/pkgs/development/python-modules/neo4j/default.nix
new file mode 100644
index 000000000000..f75be1cfc723
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/neo4j/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytz
+, tomlkit
+}:
+
+buildPythonPackage rec {
+  pname = "neo4j";
+  version = "5.15.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "neo4j";
+    repo = "neo4j-python-driver";
+    rev = "refs/tags/${version}";
+    hash = "sha256-vO/LzLQ7pA/4KcX48dIM9eH6z4XMbse0xGOJxZPcMfo=";
+  };
+
+  propagatedBuildInputs = [
+    pytz
+    tomlkit
+  ];
+
+  # Missing dependencies
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "neo4j"
+  ];
+
+  meta = with lib; {
+    description = "Neo4j Bolt Driver for Python";
+    homepage = "https://github.com/neo4j/neo4j-python-driver";
+    changelog = "https://github.com/neo4j/neo4j-python-driver/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nessclient/default.nix b/nixpkgs/pkgs/development/python-modules/nessclient/default.nix
new file mode 100644
index 000000000000..542ed4f94b64
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nessclient/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, justbackoff
+, pythonOlder
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "nessclient";
+  version = "1.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "nickw444";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-UqHXKfS4zF1YhFbNKSVESmsxD0CYJKOmjMOE3blGdI8=";
+  };
+
+  propagatedBuildInputs = [
+    justbackoff
+    click
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "nessclient"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation/abstraction of the Ness D8x/D16x Serial Interface ASCII protocol";
+    homepage = "https://github.com/nickw444/nessclient";
+    changelog = "https://github.com/nickw444/nessclient/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nest-asyncio/default.nix b/nixpkgs/pkgs/development/python-modules/nest-asyncio/default.nix
new file mode 100644
index 000000000000..fcd74efe9237
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nest-asyncio/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  version = "1.5.6";
+  pname = "nest_asyncio";
+  disabled = !(pythonAtLeast "3.5");
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-0mfMH/eUQD999pKWTR0qP6lBj/6io/aFmkOf9IL+8pA=";
+  };
+
+  # tests not packaged with source dist as of 1.3.2/1.3.2, and
+  # can't check tests out of GitHub easily without specific commit IDs (no tagged releases)
+  doCheck = false;
+  pythonImportsCheck = [ "nest_asyncio" ];
+
+  meta = with lib; {
+    description = "Patch asyncio to allow nested event loops";
+    homepage = "https://github.com/erdewit/nest_asyncio";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nested-lookup/default.nix b/nixpkgs/pkgs/development/python-modules/nested-lookup/default.nix
new file mode 100644
index 000000000000..c8c00c3366eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nested-lookup/default.nix
@@ -0,0 +1,33 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "nested-lookup";
+  version = "0.2.25";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-b6gydIyQOB8ikdhQgJ4ySSUZ7l8lPWpay8Kdk37KAug=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "nested_lookup" ];
+
+  meta = with lib; {
+    description = "Python functions for working with deeply nested documents (lists and dicts)";
+    homepage = "https://github.com/russellballestrini/nested-lookup";
+    license = licenses.publicDomain;
+    maintainers = with maintainers; [ tboerger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nestedtext/default.nix b/nixpkgs/pkgs/development/python-modules/nestedtext/default.nix
new file mode 100644
index 000000000000..185fffba413a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nestedtext/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, buildPythonPackage
+, docopt
+, fetchFromGitHub
+, flit-core
+, hypothesis
+, inform
+, nestedtext
+, pytestCheckHook
+, pythonOlder
+, quantiphy
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "nestedtext";
+  version = "3.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "KenKundert";
+    repo = "nestedtext";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-SHY/MTmYbNh3azkyvwEtuvT+V7YzfLi2B3FvBzv6Omo=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    inform
+  ];
+
+  nativeCheckInputs = [
+    docopt
+    hypothesis
+    quantiphy
+    pytestCheckHook
+    voluptuous
+  ];
+
+  # Tests depend on quantiphy. To avoid infinite recursion, tests are only
+  # enabled when building passthru.tests.
+  doCheck = false;
+
+  pytestFlagsArray = [
+    # Avoids an ImportMismatchError.
+    "--ignore=build"
+  ];
+
+  disabledTestPaths = [
+    # Examples are prefixed with test_
+    "examples/"
+  ];
+
+  passthru.tests = {
+    runTests = nestedtext.overrideAttrs (_: { doCheck = true; });
+  };
+
+  pythonImportsCheck = [
+    "nestedtext"
+  ];
+
+  meta = with lib; {
+    description = "A human friendly data format";
+    longDescription = ''
+      NestedText is a file format for holding data that is to be entered,
+      edited, or viewed by people. It allows data to be organized into a nested
+      collection of dictionaries, lists, and strings. In this way it is similar
+      to JSON, YAML and TOML, but without the complexity and risk of YAML and
+      without the syntactic clutter of JSON and TOML. NestedText is both simple
+      and natural. Only a small number of concepts and rules must be kept in
+      mind when creating it. It is easily created, modified, or viewed with a
+      text editor and easily understood and used by both programmers and
+      non-programmers.
+    '';
+    homepage = "https://nestedtext.org";
+    changelog = "https://github.com/KenKundert/nestedtext/blob/v${version}/doc/releases.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jeremyschlatter ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/netaddr/default.nix b/nixpkgs/pkgs/development/python-modules/netaddr/default.nix
new file mode 100644
index 000000000000..2a9f4b78b5c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/netaddr/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, glibcLocales
+, importlib-resources
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "netaddr";
+  version = "0.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0hx2npi0wnhwlcybilgwlddw6qffx1mb7a3sj4p9s7bvl33mgk6n";
+  };
+
+  LC_ALL = "en_US.UTF-8";
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.7") [ importlib-resources ];
+
+  nativeCheckInputs = [ glibcLocales pytestCheckHook ];
+
+  meta = with lib; {
+    homepage = "https://netaddr.readthedocs.io/en/latest/";
+    downloadPage = "https://github.com/netaddr/netaddr/releases";
+    changelog = "https://netaddr.readthedocs.io/en/latest/changes.html";
+    description = "A network address manipulation library for Python";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/netapp-lib/default.nix b/nixpkgs/pkgs/development/python-modules/netapp-lib/default.nix
new file mode 100644
index 000000000000..b84ff5613ecc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/netapp-lib/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, lxml
+, six
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "netapp-lib";
+  version = "2021.6.25";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-1g4FCSMyS8T6F/T8BOqak4h1nJis8g9jaOluA4FTNpA=";
+  };
+
+  propagatedBuildInputs = [
+    lxml
+    six
+    xmltodict
+  ];
+
+  # no tests in sdist and no other download available
+  doCheck = false;
+
+  pythonImportsCheck = [ "netapp_lib" ];
+
+  meta = with lib; {
+    description = "netapp-lib is required for Ansible deployments to interact with NetApp storage systems";
+    homepage = "https://netapp.io/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/netapp-ontap/default.nix b/nixpkgs/pkgs/development/python-modules/netapp-ontap/default.nix
new file mode 100644
index 000000000000..28a953f29f13
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/netapp-ontap/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cliche
+, marshmallow
+, pytestCheckHook
+, recline
+, requests
+, requests-toolbelt
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "netapp-ontap";
+  version = "9.13.1.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "netapp_ontap";
+    inherit version;
+    sha256 = "sha256-jPKfPJXtzARRlSuwkfJeZueQouwaaa0D6rZ+BcpILq0=";
+  };
+
+  propagatedBuildInputs = [
+    marshmallow
+    requests
+    requests-toolbelt
+    urllib3
+    # required for cli
+    cliche
+    recline
+  ];
+
+  # no tests in sdist and no other download available
+  doCheck = false;
+
+  pythonImportsCheck = [ "netapp_ontap" ];
+
+  meta = with lib; {
+    description = "A library for working with ONTAP's REST APIs simply in Python";
+    homepage = "https://devnet.netapp.com/restapi.php";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/netcdf4/default.nix b/nixpkgs/pkgs/development/python-modules/netcdf4/default.nix
new file mode 100644
index 000000000000..f181a7d4c4fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/netcdf4/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, python
+, oldest-supported-numpy
+, setuptools
+, wheel
+, numpy
+, zlib
+, netcdf
+, hdf5
+, curl
+, libjpeg
+, cython
+, cftime
+}:
+
+buildPythonPackage rec {
+  pname = "netCDF4";
+  version = "1.6.2";
+  format = "pyproject";
+
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-A4KwL/aiiEGfb/7IXexA9FH0G4dVVHFUxXXd2fD0rlM=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    oldest-supported-numpy
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    cftime
+    numpy
+    zlib
+    netcdf
+    hdf5
+    curl
+    libjpeg
+  ];
+
+  checkPhase = ''
+    pushd test/
+    NO_NET=1 NO_CDL=1 ${python.interpreter} run_all.py
+  '';
+
+  env = {
+    # Variables used to configure the build process
+    USE_NCCONFIG = "0";
+    HDF5_DIR = lib.getDev hdf5;
+    NETCDF4_DIR = netcdf;
+    CURL_DIR = curl.dev;
+    JPEG_DIR = libjpeg.dev;
+  } // lib.optionalAttrs stdenv.cc.isClang {
+    NIX_CFLAGS_COMPILE = "-Wno-error=int-conversion";
+  };
+
+  pythonImportsCheck = [ "netCDF4" ];
+
+  meta = with lib; {
+    description = "Interface to netCDF library (versions 3 and 4)";
+    homepage = "https://github.com/Unidata/netcdf4-python";
+    changelog = "https://github.com/Unidata/netcdf4-python/raw/v${version}/Changelog";
+    maintainers = with maintainers; [ ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/netdata/default.nix b/nixpkgs/pkgs/development/python-modules/netdata/default.nix
new file mode 100644
index 000000000000..efb92f2bdeb3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/netdata/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, httpx
+, pytest-asyncio
+, pytest-httpx
+, pytestCheckHook
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "netdata";
+  version = "1.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-ecosystem";
+    repo = "python-netdata";
+    rev = "refs/tags/${version}";
+    hash = "sha256-XWlUSKGgndHtJjzA0mYvhCkJsRJ1SUbl8DGdmyFUmoo=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-httpx
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "netdata"
+  ];
+
+  meta = with lib; {
+    description = "Python API for interacting with Netdata";
+    homepage = "https://github.com/home-assistant-ecosystem/python-netdata";
+    changelog = "https://github.com/home-assistant-ecosystem/python-netdata/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/netdisco/default.nix b/nixpkgs/pkgs/development/python-modules/netdisco/default.nix
new file mode 100644
index 000000000000..f44d54993d5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/netdisco/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, isPy3k, fetchPypi, requests, zeroconf, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "netdisco";
+  version = "3.0.0";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-TbtZBILzd8zEYeAXQnB8y+jx0tGyhXivkdybf+vNy9I=";
+  };
+
+  propagatedBuildInputs = [ requests zeroconf ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  disabledTestPaths = [
+    # Broken due to removed discoverables in https://github.com/home-assistant-libs/netdisco/commit/477db5a1dc93919a6c5bd61b4b1d3c80e75785bd
+    "tests/test_xboxone.py"
+  ];
+
+  pythonImportsCheck = [
+    "netdisco"
+    "netdisco.discovery"
+  ];
+
+  meta = with lib; {
+    description = "Python library to scan local network for services and devices";
+    homepage = "https://github.com/home-assistant/netdisco";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/netifaces/default.nix b/nixpkgs/pkgs/development/python-modules/netifaces/default.nix
new file mode 100644
index 000000000000..6d34bc3df4a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/netifaces/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  version = "0.11.0";
+  pname = "netifaces";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BDp5FG6ykH7fQ5iZ8mKz3+QXF9NBJCmO0oETmouTyjI=";
+  };
+
+  # No tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "netifaces"
+  ];
+
+  meta = with lib; {
+    description = "Portable access to network interfaces from Python";
+    homepage = "https://github.com/al45tair/netifaces";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/netio/default.nix b/nixpkgs/pkgs/development/python-modules/netio/default.nix
new file mode 100644
index 000000000000..30e9fc1af53a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/netio/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pyopenssl
+, pythonOlder
+, requests
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "netio";
+  version = "1.0.13";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "netioproducts";
+    repo = "PyNetio";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-s/X2WGhQXYsbo+ZPpkVSF/vclaThYYNHu0UY0yCnfPA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    pyopenssl
+  ];
+
+  pythonImportsCheck = [
+    "Netio"
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Module for interacting with NETIO devices";
+    homepage = "https://github.com/netioproducts/PyNetio";
+    changelog = "https://github.com/netioproducts/PyNetio/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/netmap/default.nix b/nixpkgs/pkgs/development/python-modules/netmap/default.nix
new file mode 100644
index 000000000000..012599216074
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/netmap/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, substituteAll
+, nmap
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "netmap";
+  version = "0.7.0.2";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = "python-nmap";
+    rev = version;
+    sha256 = "1a44zz9zsxy48ahlpjjrddpyfi7cnfknicfcp35hi588qm430mag";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./nmap-path.patch;
+      nmap = "${lib.getBin nmap}/bin/nmap";
+    })
+  ];
+
+  # upstream tests require sudo
+  # make sure nmap is found instead
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -c 'import nmap; nmap.PortScanner()'
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "nmap" ];
+
+  meta = with lib; {
+    description = "Python class to use nmap and access scan results from python3";
+    homepage = "https://github.com/home-assistant-libs/python-nmap";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/netmap/nmap-path.patch b/nixpkgs/pkgs/development/python-modules/netmap/nmap-path.patch
new file mode 100644
index 000000000000..99f9cb43a940
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/netmap/nmap-path.patch
@@ -0,0 +1,17 @@
+diff --git a/nmap/nmap.py b/nmap/nmap.py
+index 91c460d..8c5ff0a 100755
+--- a/nmap/nmap.py
++++ b/nmap/nmap.py
+@@ -77,11 +77,7 @@ class PortScanner(object):
+     def __init__(
+         self,
+         nmap_search_path=(
+-            "nmap",
+-            "/usr/bin/nmap",
+-            "/usr/local/bin/nmap",
+-            "/sw/bin/nmap",
+-            "/opt/local/bin/nmap",
++            "@nmap@",
+         ),
+     ):
+         """
diff --git a/nixpkgs/pkgs/development/python-modules/netmiko/default.nix b/nixpkgs/pkgs/development/python-modules/netmiko/default.nix
new file mode 100644
index 000000000000..513c3ade941f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/netmiko/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, setuptools, paramiko, scp, tenacity
+, textfsm, ntc-templates, pyserial, pytestCheckHook, pyyaml }:
+
+buildPythonPackage rec {
+  pname = "netmiko";
+  version = "4.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-et3m/j6mMzYij0moY2UMLYP7DmgODw0Vi1sPsExBAOE=";
+  };
+
+  buildInputs = [ setuptools ];
+  propagatedBuildInputs = [ paramiko scp tenacity pyyaml textfsm ntc-templates pyserial ];
+
+  # tests require closed-source pyats and genie packages
+  doCheck = false;
+
+  meta = with lib; {
+    description =
+      "Multi-vendor library to simplify Paramiko SSH connections to network devices";
+    homepage = "https://github.com/ktbyers/netmiko/";
+    license = licenses.mit;
+    maintainers = [ maintainers.astro ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nettigo-air-monitor/default.nix b/nixpkgs/pkgs/development/python-modules/nettigo-air-monitor/default.nix
new file mode 100644
index 000000000000..538aec6b4f24
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nettigo-air-monitor/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, aiohttp
+, aioresponses
+, aqipy-atmotech
+, buildPythonPackage
+, dacite
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-error-for-skips
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "nettigo-air-monitor";
+  version = "2.2.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "bieniu";
+    repo = "nettigo-air-monitor";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Z88IkXQi9Uqc+HX++Cp5nj4S0puwMfToqXzBCnbG59g=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    aqipy-atmotech
+    dacite
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytest-asyncio
+    pytest-error-for-skips
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "nettigo_air_monitor"
+  ];
+
+  meta = with lib; {
+    description = "Python module to get air quality data from Nettigo Air Monitor devices";
+    homepage = "https://github.com/bieniu/nettigo-air-monitor";
+    changelog = "https://github.com/bieniu/nettigo-air-monitor/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/netutils/default.nix b/nixpkgs/pkgs/development/python-modules/netutils/default.nix
new file mode 100644
index 000000000000..182485253875
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/netutils/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, jinja2
+, jsonschema
+, napalm
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "netutils";
+  version = "1.6.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "networktocode";
+    repo = "netutils";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ocajE7E4xIatEmv58/9gEpWF2plJdiZXjk6ajD2vTzw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    jsonschema
+  ];
+
+  passthru.optional-dependencies.optionals = [
+    jsonschema
+    napalm
+  ];
+
+  nativeCheckInputs = [
+    jinja2
+    pytestCheckHook
+    pyyaml
+    toml
+  ];
+
+  pythonImportsCheck = [
+    "netutils"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_is_fqdn_resolvable"
+    "test_fqdn_to_ip"
+    "test_tcp_ping"
+    # Skip Sphinx test
+    "test_sphinx_build"
+    # OSError: [Errno 22] Invalid argument
+    "test_compare_type5"
+    "test_encrypt_type5"
+    "test_compare_cisco_type5"
+    "test_get_napalm_getters_napalm_installed_default"
+    "test_encrypt_cisco_type5"
+  ];
+
+  meta = with lib; {
+    description = "Library that is a collection of objects for common network automation tasks";
+    homepage = "https://github.com/networktocode/netutils";
+    changelog = "https://github.com/networktocode/netutils/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/networkx/default.nix b/nixpkgs/pkgs/development/python-modules/networkx/default.nix
new file mode 100644
index 000000000000..b793bc57bf0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/networkx/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, pytestCheckHook
+, decorator
+, setuptools
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "networkx";
+  # upgrade may break sage, please test the sage build or ping @timokau on upgrade
+  version = "3.1";
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3jRjNUCPhN4Orab/n6+v/5vNoR8KDfqpMRM967FGq2E=";
+  };
+
+  propagatedBuildInputs = [ decorator setuptools ];
+  nativeCheckInputs = [ nose pytestCheckHook ];
+
+  meta = {
+    homepage = "https://networkx.github.io/";
+    description = "Library for the creation, manipulation, and study of the structure, dynamics, and functions of complex networks";
+    license = lib.licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nevow/default.nix b/nixpkgs/pkgs/development/python-modules/nevow/default.nix
new file mode 100644
index 000000000000..808427e241d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nevow/default.nix
@@ -0,0 +1,43 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, twisted }:
+
+buildPythonPackage rec {
+  pname = "Nevow";
+  version = "0.14.5";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "afb6ba85a5351953578c018fcdb9dfbd62f29a8d46c58bc9652bc000a27223f3";
+  };
+
+  propagatedBuildInputs = [ twisted ];
+
+  nativeCheckInputs = [ twisted ];
+
+  checkPhase = ''
+    trial formless nevow
+  '';
+
+  meta = with lib; {
+    description = "Nevow, a web application construction kit for Python";
+    longDescription = ''
+      Nevow - Pronounced as the French "nouveau", or "noo-voh", Nevow
+      is a web application construction kit written in Python.  It is
+      designed to allow the programmer to express as much of the view
+      logic as desired in Python, and includes a pure Python XML
+      expression syntax named stan to facilitate this.  However it
+      also provides rich support for designer-edited templates, using
+      a very small XML attribute language to provide bi-directional
+      template manipulation capability.
+
+      Nevow also includes formless, a declarative syntax for
+      specifying the types of method parameters and exposing these
+      methods to the web.  Forms can be rendered automatically, and
+      form posts will be validated and input coerced, rendering error
+      pages if appropriate.  Once a form post has validated
+      successfully, the method will be called with the coerced values.
+    '';
+    homepage = "https://github.com/twisted/nevow";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/newick/default.nix b/nixpkgs/pkgs/development/python-modules/newick/default.nix
new file mode 100644
index 000000000000..317a9c582b3d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/newick/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "newick";
+  version = "1.9.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dlce-eva";
+    repo = "python-newick";
+    rev = "v${version}";
+    hash = "sha256-TxyR6RYvy2oIcDNZnHrExtPYGspyWOtZqNy488OmWwk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  postPatch = ''
+    # remove coverage arguments to pytest
+    sed -i '/--cov/d' setup.cfg
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "newick"
+  ];
+
+  meta = with lib; {
+    description = "A python package to read and write the Newick format";
+    homepage = "https://github.com/dlce-eva/python-newick";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ alxsimon ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/newversion/default.nix b/nixpkgs/pkgs/development/python-modules/newversion/default.nix
new file mode 100644
index 000000000000..769750163663
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/newversion/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, packaging
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "newversion";
+  version = "2.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "vemel";
+    repo = "newversion";
+    rev = "refs/tags/${version}";
+    hash = "sha256-v9hfk2/hBkWtOobQdaYXNOZTTcEqnMV6JYqtjjoidOs=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "newversion"
+  ];
+
+  meta = with lib; {
+    description = "PEP 440 version manager";
+    homepage = "https://github.com/vemel/newversion";
+    changelog = "https://github.com/vemel/newversion/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nexia/default.nix b/nixpkgs/pkgs/development/python-modules/nexia/default.nix
new file mode 100644
index 000000000000..c5a5a2d00601
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nexia/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, aioresponses
+, buildPythonPackage
+, orjson
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "nexia";
+  version = "2.0.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-1uCmlFkha5oaNm5N0/8402ulBr7fNRUbDDASECfN9r8=";
+  };
+
+  propagatedBuildInputs = [
+    orjson
+    requests
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    requests-mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner",' ""
+  '';
+
+  pythonImportsCheck = [
+    "nexia"
+  ];
+
+  meta = with lib; {
+    description = "Python module for Nexia thermostats";
+    homepage = "https://github.com/bdraco/nexia";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nextcloudmonitor/default.nix b/nixpkgs/pkgs/development/python-modules/nextcloudmonitor/default.nix
new file mode 100644
index 000000000000..521295f53620
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nextcloudmonitor/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "nextcloudmonitor";
+  version = "1.4.0";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "meichthys";
+    repo = "nextcloud_monitor";
+    rev = "v${version}";
+    hash = "sha256-jyC8oOFr5yVtIJNxVCLNTyFpJTdjHu8t6Xs4il45ysI=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "nextcloudmonitor" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/meichthys/nextcloud_monitor/blob/${src.rev}/README.md#change-log";
+    description = "Python wrapper around nextcloud monitor api";
+    homepage = "https://github.com/meichthys/nextcloud_monitor";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nextcord/default.nix b/nixpkgs/pkgs/development/python-modules/nextcord/default.nix
new file mode 100644
index 000000000000..4a5faf4c33a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nextcord/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, substituteAll
+, ffmpeg
+, libopus
+, aiohttp
+, aiodns
+, brotli
+, faust-cchardet
+, orjson
+, pynacl
+}:
+
+buildPythonPackage rec {
+  pname = "nextcord";
+  version = "2.6.1";
+
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "nextcord";
+    repo = "nextcord";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-bv4I+Ol/N4kbp/Ch7utaUpo0GmF+Mpx4zWmHL7uIveM=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./paths.patch;
+      ffmpeg = "${ffmpeg}/bin/ffmpeg";
+      libopus = "${libopus}/lib/libopus${stdenv.hostPlatform.extensions.sharedLibrary}";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    aiodns
+    aiohttp
+    brotli
+    faust-cchardet
+    orjson
+    pynacl
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "nextcord"
+    "nextcord.ext.commands"
+    "nextcord.ext.tasks"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/nextcord/nextcord/blob/${src.rev}/docs/whats_new.rst";
+    description = "Python wrapper for the Discord API forked from discord.py";
+    homepage = "https://github.com/nextcord/nextcord";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nextcord/paths.patch b/nixpkgs/pkgs/development/python-modules/nextcord/paths.patch
new file mode 100644
index 000000000000..0b0e4c50fb9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nextcord/paths.patch
@@ -0,0 +1,74 @@
+diff --git a/nextcord/opus.py b/nextcord/opus.py
+index b1119a8e..b7c9c713 100644
+--- a/nextcord/opus.py
++++ b/nextcord/opus.py
+@@ -233,7 +233,7 @@ def _load_default() -> bool:
+             _filename = os.path.join(_basedir, "bin", f"libopus-0.{_target}.dll")
+             _lib = libopus_loader(_filename)
+         else:
+-            opus = ctypes.util.find_library("opus")
++            opus = "@libopus@"
+ 
+             if opus is None:
+                 _lib = None
+diff --git a/nextcord/player.py b/nextcord/player.py
+index 5c7daf52..48a11eb7 100644
+--- a/nextcord/player.py
++++ b/nextcord/player.py
+@@ -127,7 +127,7 @@ class FFmpegAudio(AudioSource):
+         self,
+         source: Union[str, io.BufferedIOBase],
+         *,
+-        executable: str = "ffmpeg",
++        executable: str = "@ffmpeg@",
+         args: Any,
+         **subprocess_kwargs: Any,
+     ) -> None:
+@@ -254,7 +254,7 @@ class FFmpegPCMAudio(FFmpegAudio):
+         self,
+         source: Union[str, io.BufferedIOBase],
+         *,
+-        executable: str = "ffmpeg",
++        executable: str = "@ffmpeg@",
+         pipe: bool = False,
+         stderr: Optional[IO[str]] = None,
+         before_options: Optional[str] = None,
+@@ -357,7 +357,7 @@ class FFmpegOpusAudio(FFmpegAudio):
+         *,
+         bitrate: int = 128,
+         codec: Optional[str] = None,
+-        executable: str = "ffmpeg",
++        executable: str = "@ffmpeg@",
+         pipe: bool = False,
+         stderr=None,
+         before_options=None,
+@@ -510,7 +510,7 @@ class FFmpegOpusAudio(FFmpegAudio):
+         """
+ 
+         method = method or "native"
+-        executable = executable or "ffmpeg"
++        executable = executable or "@ffmpeg@"
+         probefunc = fallback = None
+ 
+         if isinstance(method, str):
+@@ -555,9 +555,9 @@ class FFmpegOpusAudio(FFmpegAudio):
+ 
+     @staticmethod
+     def _probe_codec_native(
+-        source, executable: str = "ffmpeg"
++        source, executable: str = "@ffmpeg@"
+     ) -> Tuple[Optional[str], Optional[int]]:
+-        exe = executable[:2] + "probe" if executable in ("ffmpeg", "avconv") else executable
++        exe = executable[:-4] + "probe" if executable.endswith(("ffmpeg", "avconv")) else executable
+         args = [
+             exe,
+             "-v",
+@@ -584,7 +584,7 @@ class FFmpegOpusAudio(FFmpegAudio):
+ 
+     @staticmethod
+     def _probe_codec_fallback(
+-        source, executable: str = "ffmpeg"
++        source, executable: str = "@ffmpeg@"
+     ) -> Tuple[Optional[str], Optional[int]]:
+         args = [executable, "-hide_banner", "-i", source]
+         proc = subprocess.Popen(
diff --git a/nixpkgs/pkgs/development/python-modules/nextdns/default.nix b/nixpkgs/pkgs/development/python-modules/nextdns/default.nix
new file mode 100644
index 000000000000..7d81eccbcabf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nextdns/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, orjson
+, pytest-asyncio
+, pytest-error-for-skips
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "nextdns";
+  version = "2.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "bieniu";
+    repo = "nextdns";
+    rev = "refs/tags/${version}";
+    hash = "sha256-haw6t7pepMN77LFVgDFBbV4StRqcRMvnCaup8K38kEg=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    orjson
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytest-asyncio
+    pytest-error-for-skips
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "nextdns"
+  ];
+
+  meta = with lib; {
+    description = "Module for the NextDNS API";
+    homepage = "https://github.com/bieniu/nextdns";
+    changelog = "https://github.com/bieniu/nextdns/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nfcpy/default.nix b/nixpkgs/pkgs/development/python-modules/nfcpy/default.nix
new file mode 100644
index 000000000000..bf5f538da33c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nfcpy/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, libusb1
+, mock
+, ndeflib
+, pydes
+, pyserial
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "nfcpy";
+  version = "1.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nfcpy";
+    repo = "nfcpy";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-HFWOCiz6ISfxEeC6KPKNKGZoHvFjFGUn7QJWnwvJKYw=";
+  };
+
+  propagatedBuildInputs = [
+    libusb1
+    ndeflib
+    pydes
+    pyserial
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "nfc"
+  ];
+
+  disabledTestPaths = [
+    # AttributeError: 'NoneType' object has no attribute 'EC_KEY'
+    "tests/test_llcp_llc.py"
+    "tests/test_llcp_sec.py"
+    # Doesn't work on Hydra
+    "tests/test_clf_udp.py"
+  ];
+
+  meta = with lib; {
+    description = "A Python module to read/write NFC tags or communicate with another NFC device";
+    homepage = "https://github.com/nfcpy/nfcpy";
+    changelog = "https://github.com/nfcpy/nfcpy/blob/v${version}/HISTORY.rst";
+    license = licenses.eupl11;
+    maintainers = with maintainers; [ fab ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/nh3/default.nix b/nixpkgs/pkgs/development/python-modules/nh3/default.nix
new file mode 100644
index 000000000000..2bcdb6d49cde
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nh3/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, rustPlatform
+, libiconv
+, fetchFromGitHub
+, darwin
+}:
+let
+  pname = "nh3";
+  version = "0.2.13";
+  src = fetchFromGitHub {
+    owner = "messense";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-NILPy+lC0jhOF6ykriUPZWHLlSYBC00tpDdfJ6XjcjA=";
+  };
+in
+buildPythonPackage {
+  inherit pname version src;
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-Ror2KcIdSeXHa44eUWGiPsKiD935hsBREREySbGedxA=";
+  };
+
+  nativeBuildInputs = with rustPlatform; [ cargoSetupHook maturinBuildHook ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    libiconv
+    darwin.apple_sdk.frameworks.Security
+  ];
+
+  pythonImportsCheck = [ "nh3" ];
+
+  meta = with lib; {
+    description = "Python binding to Ammonia HTML sanitizer Rust crate";
+    homepage = "https://github.com/messense/nh3";
+    license = licenses.mit;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/niaaml/default.nix b/nixpkgs/pkgs/development/python-modules/niaaml/default.nix
new file mode 100644
index 000000000000..4a4f175a8943
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/niaaml/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, niapy
+, numpy
+, pandas
+, poetry-core
+, scikit-learn
+, toml-adapt
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "niaaml";
+  version = "1.1.12";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "lukapecnik";
+    repo = "NiaAML";
+    rev = version;
+    hash = "sha256-GAUXEkUOD04DQtRG/RAeeeLmenBd25h18Lmrxbm4X3A=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    toml-adapt
+  ];
+
+  propagatedBuildInputs = [
+    niapy
+    numpy
+    pandas
+    scikit-learn
+  ];
+
+  # create scikit-learn and niapy deps version consistent
+  preBuild = ''
+    toml-adapt -path pyproject.toml -a change -dep scikit-learn -ver X
+    toml-adapt -path pyproject.toml -a change -dep niapy -ver X
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "niaaml"
+  ];
+
+  meta = with lib; {
+    description = "Python automated machine learning framework";
+    homepage = "https://github.com/lukapecnik/NiaAML";
+    license = licenses.mit;
+    maintainers = with maintainers; [ firefly-cpp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/niaarm/default.nix b/nixpkgs/pkgs/development/python-modules/niaarm/default.nix
new file mode 100644
index 000000000000..3b0399365613
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/niaarm/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, niapy
+, nltk
+, numpy
+, pandas
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, tomli
+}:
+
+buildPythonPackage rec {
+  pname = "niaarm";
+  version = "0.3.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "firefly-cpp";
+    repo = "NiaARM";
+    rev = "refs/tags/${version}";
+    hash = "sha256-E5G1uVDSErqwxTBNQ7qselemW9A3W8sr3ExPEh+1les=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    niapy
+    nltk
+    numpy
+    pandas
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  disabledTests = [
+    # Test requires extra nltk data dependency
+    "test_text_mining"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "niaarm"
+  ];
+
+  meta = with lib; {
+    description = "A minimalistic framework for Numerical Association Rule Mining";
+    homepage = "https://github.com/firefly-cpp/NiaARM";
+    changelog = "https://github.com/firefly-cpp/NiaARM/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ firefly-cpp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/niaclass/default.nix b/nixpkgs/pkgs/development/python-modules/niaclass/default.nix
new file mode 100644
index 000000000000..89d8ae746aed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/niaclass/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, niapy
+, numpy
+, pandas
+, poetry-core
+, scikit-learn
+, toml-adapt
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "niaclass";
+  version = "0.1.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "lukapecnik";
+    repo = "NiaClass";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-md1e/cOIOQKoB760E5hjzjCsC5tS1CzgqAPTeVtrmuo=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    toml-adapt
+  ];
+
+  propagatedBuildInputs = [
+    niapy
+    numpy
+    pandas
+    scikit-learn
+  ];
+
+  # create scikit-learn dep version consistent
+  preBuild = ''
+    toml-adapt -path pyproject.toml -a change -dep scikit-learn -ver X
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "niaclass"
+  ];
+
+  meta = with lib; {
+    description = "A framework for solving classification tasks using Nature-inspired algorithms";
+    homepage = "https://github.com/lukapecnik/NiaClass";
+    license = licenses.mit;
+    maintainers = with maintainers; [ firefly-cpp ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/nianet/default.nix b/nixpkgs/pkgs/development/python-modules/nianet/default.nix
new file mode 100644
index 000000000000..4adca2e5b701
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nianet/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, matplotlib
+, niapy
+, numpy
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, scikit-learn
+, toml-adapt
+, torch
+}:
+
+buildPythonPackage rec {
+  pname = "nianet";
+  version = "1.1.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "SasoPavlic";
+    repo = pname;
+    rev = "version_${version}";
+    sha256 = "sha256-FZipl6Z9AfiL6WH0kvUn8bVxt8JLdDVlmTSqnyxe0nY=";
+  };
+
+  nativeBuildInputs = [
+    toml-adapt
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    niapy
+    numpy
+    scikit-learn
+    torch
+  ];
+
+  # create niapy and torch dep version consistent
+  preBuild = ''
+    toml-adapt -path pyproject.toml -a change -dep niapy -ver X
+    toml-adapt -path pyproject.toml -a change -dep torch -ver X
+  '';
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "nianet"
+  ];
+
+  meta = with lib; {
+    description = "Designing and constructing neural network topologies using nature-inspired algorithms";
+    homepage = "https://github.com/SasoPavlic/NiaNet";
+    changelog = "https://github.com/SasoPavlic/NiaNet/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ firefly-cpp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/niapy/default.nix b/nixpkgs/pkgs/development/python-modules/niapy/default.nix
new file mode 100644
index 000000000000..b0748f64b805
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/niapy/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, matplotlib
+, numpy
+, openpyxl
+, pandas
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "niapy";
+  version = "2.0.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "NiaOrg";
+    repo = "NiaPy";
+    rev = "refs/tags/${version}";
+    hash = "sha256-qstTxUo4jZ8YKbEjtDtSZUvR67VNkBQJdXeERJPOMDw=";
+  };
+
+  propagatedBuildInputs = [
+    matplotlib
+    numpy
+    openpyxl
+    pandas
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "niapy"
+  ];
+
+  meta = with lib; {
+    description = "Micro framework for building nature-inspired algorithms";
+    homepage = "https://niapy.org/";
+    changelog = "https://github.com/NiaOrg/NiaPy/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nibabel/default.nix b/nixpkgs/pkgs/development/python-modules/nibabel/default.nix
new file mode 100644
index 000000000000..34066a583646
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nibabel/default.nix
@@ -0,0 +1,91 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, hatchling
+, hatch-vcs
+, numpy
+, packaging
+, importlib-resources
+, pydicom
+, pillow
+, h5py
+, scipy
+, git
+, pytest-doctestplus
+, pytest-httpserver
+, pytest-xdist
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "nibabel";
+  version = "5.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-znPKXpVyCechmiI8tx93I1yd8qz00/J/hhujjpSBrFM=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+    hatch-vcs
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    packaging
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ];
+
+  passthru.optional-dependencies = rec {
+    all = dicom
+      ++ dicomfs
+      ++ minc2
+      ++ spm
+      ++ zstd;
+    dicom = [
+      pydicom
+    ];
+    dicomfs = [
+      pillow
+    ] ++ dicom;
+    minc2 = [
+      h5py
+    ];
+    spm = [
+      scipy
+    ];
+    zstd = [
+      # TODO: pyzstd
+    ];
+  };
+
+  nativeCheckInputs = [
+    git
+    pytest-doctestplus
+    pytest-httpserver
+    pytest-xdist
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.all;
+
+  preCheck = ''
+    export PATH=$out/bin:$PATH
+  '';
+
+  disabledTests = [
+    # https://github.com/nipy/nibabel/issues/951
+    "test_filenames"
+  ];
+
+  meta = with lib; {
+    homepage = "https://nipy.org/nibabel";
+    description = "Access a multitude of neuroimaging data formats";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ashgillman ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nibe/default.nix b/nixpkgs/pkgs/development/python-modules/nibe/default.nix
new file mode 100644
index 000000000000..a437ec2547ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nibe/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, aiohttp
+, aresponses
+, async-modbus
+, async-timeout
+, buildPythonPackage
+, construct
+, exceptiongroup
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, tenacity
+}:
+
+buildPythonPackage rec {
+  pname = "nibe";
+  version = "2.5.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "yozik04";
+    repo = "nibe";
+    rev = "refs/tags/${version}";
+    hash = "sha256-qlGQtjRG92AhFY+sF3mB4ghIn4kydkbDOolLu9Qh0JM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    async-modbus
+    async-timeout
+    construct
+    exceptiongroup
+    tenacity
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "nibe"
+  ];
+
+  meta = with lib; {
+    description = "Library for the communication with Nibe heatpumps";
+    homepage = "https://github.com/yozik04/nibe";
+    changelog = "https://github.com/yozik04/nibe/releases/tag/${version}";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nidaqmx/default.nix b/nixpkgs/pkgs/development/python-modules/nidaqmx/default.nix
new file mode 100644
index 000000000000..785b88185149
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nidaqmx/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, six
+, numpy
+, pytestCheckHook
+, pykka
+, enum34
+, pythonOlder
+, pythonAtLeast
+}:
+
+# Note we currently do not patch the path to the drivers
+# because those are not available in Nixpkgs.
+# https://github.com/NixOS/nixpkgs/pull/74980
+
+buildPythonPackage rec {
+  pname = "nidaqmx";
+  version = src.rev;
+
+  # 3.10 is not supported, upstream inactive
+  disabled = pythonAtLeast "3.10";
+
+  src = fetchFromGitHub {
+    owner = "ni";
+    repo = "nidaqmx-python";
+    rev = "0.5.7";
+    sha256 = "19m9p99qvdmvvqbwmqrqm6b50x7czgrj07gdsxbbgw04shf5bhrs";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    six
+  ] ++ lib.optionals (pythonOlder "3.4") [
+    enum34
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pykka
+  ];
+
+  dontUseSetuptoolsCheck = true;
+
+  # Older pytest is needed
+  # https://github.com/ni/nidaqmx-python/issues/80
+  # Fixture "x_series_device" called directly. Fixtures are not meant to be called directly
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "nidaqmx.task"
+  ];
+
+  meta = {
+    description = "API for interacting with the NI-DAQmx driver";
+    license = [ lib.licenses.mit ];
+    maintainers = [ lib.maintainers.fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/niko-home-control/default.nix b/nixpkgs/pkgs/development/python-modules/niko-home-control/default.nix
new file mode 100644
index 000000000000..46707205e863
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/niko-home-control/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nclib
+, netaddr
+, netifaces
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "niko-home-control";
+  version = "0.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "NoUseFreak";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-n/uQAX2LgxeGTRF56+G5vm5wbeTQQQODV4EKaPgKw1k=";
+  };
+
+  propagatedBuildInputs = [
+    nclib
+    netaddr
+    netifaces
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "nikohomecontrol"
+  ];
+
+  meta = with lib; {
+    description = "Python SDK for Niko Home Control";
+    homepage = "https://github.com/NoUseFreak/niko-home-control";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nikola/default.nix b/nixpkgs/pkgs/development/python-modules/nikola/default.nix
new file mode 100644
index 000000000000..e4990ff4af31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nikola/default.nix
@@ -0,0 +1,119 @@
+{ lib
+, aiohttp
+, babel
+, blinker
+, buildPythonPackage
+, python-dateutil
+, docutils
+, doit
+, fetchPypi
+, freezegun
+, ghp-import
+, hsluv
+, html5lib
+, ipykernel
+, jinja2
+, lxml
+, mako
+, markdown
+, micawber
+, mock
+, natsort
+, notebook
+, phpserialize
+, piexif
+, pillow
+, pygal
+, pygments
+, pyphen
+, pyrss2gen
+, pytestCheckHook
+, pythonOlder
+, requests
+, ruamel-yaml
+, stdenv
+, toml
+, typogrify
+, unidecode
+, watchdog
+, yapsy
+}:
+
+buildPythonPackage rec {
+  pname = "nikola";
+  version = "8.2.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Nikola";
+    inherit version;
+    hash = "sha256-LNVk2zfNwY4CC4qulqfNXwi3mWyFxzWIeMykh6gFOL8=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    babel
+    blinker
+    python-dateutil
+    docutils
+    doit
+    ghp-import
+    hsluv
+    html5lib
+    ipykernel
+    jinja2
+    lxml
+    mako
+    markdown
+    micawber
+    natsort
+    notebook
+    phpserialize
+    piexif
+    pillow
+    pygal
+    pygments
+    pyphen
+    pyrss2gen
+    requests
+    ruamel-yaml
+    toml
+    typogrify
+    unidecode
+    watchdog
+    yapsy
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    mock
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov nikola --cov-report term-missing" ""
+  '';
+
+  disabledTests = [
+    # AssertionError
+    "test_compiling_markdown"
+    # Date formatting slightly differs from expectation
+    "test_format_date_long"
+    "test_format_date_timezone"
+    "test_format_date_locale_variants"
+    "test_format_date_locale_variants"
+  ];
+
+  pythonImportsCheck = [ "nikola" ];
+
+  meta = with lib; {
+    description = "Static website and blog generator";
+    homepage = "https://getnikola.com/";
+    changelog = "https://github.com/getnikola/nikola/blob/v${version}/CHANGES.txt";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nilearn/default.nix b/nixpkgs/pkgs/development/python-modules/nilearn/default.nix
new file mode 100644
index 000000000000..3c21b0b62e51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nilearn/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytestCheckHook
+, hatch-vcs
+, lxml
+, matplotlib
+, nibabel
+, numpy
+, pandas
+, scikit-learn
+, scipy
+, joblib
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "nilearn";
+  version = "0.10.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-A+9Npy0a6HsuPyi3cdx+BUZKoXliblfDAFlWJahlQnM=";
+  };
+
+  nativeBuildInputs = [ hatch-vcs ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  disabledTests = [ "test_clean_confounds" ];  # https://github.com/nilearn/nilearn/issues/2608
+  # do subset of tests which don't fetch resources
+  pytestFlagsArray = [ "nilearn/connectome/tests" ];
+
+  propagatedBuildInputs = [
+    joblib
+    lxml
+    matplotlib
+    nibabel
+    numpy
+    pandas
+    requests
+    scikit-learn
+    scipy
+  ];
+
+  meta = with lib; {
+    homepage = "https://nilearn.github.io";
+    description = "A module for statistical learning on neuroimaging data";
+    changelog = "https://github.com/nilearn/nilearn/releases/tag/${version}";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/niluclient/default.nix b/nixpkgs/pkgs/development/python-modules/niluclient/default.nix
new file mode 100644
index 000000000000..7f6aa69da61e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/niluclient/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "niluclient";
+  version = "0.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "11ymn0cr4lchrcnf2xxlgljw223gwln01gxwr7mcgf95yc4006iq";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "niluclient" ];
+
+  meta = with lib; {
+    description = "Python client for getting air pollution data from NILU sensor stations";
+    homepage = "https://github.com/hfurubotten/niluclient";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nimfa/default.nix b/nixpkgs/pkgs/development/python-modules/nimfa/default.nix
new file mode 100644
index 000000000000..3f6e521047ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nimfa/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, numpy
+, scipy
+, matplotlib
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "nimfa";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "39cff2b86856d03ca8a3d9c38598034ecf1a768c325fd3a728bb9eadb8c6b919";
+  };
+
+  propagatedBuildInputs = [ numpy scipy ];
+  nativeCheckInputs = [ matplotlib pytest ];
+  doCheck = !isPy3k;  # https://github.com/marinkaz/nimfa/issues/42
+
+  meta = with lib; {
+    description = "Nonnegative matrix factorization library";
+    homepage = "http://nimfa.biolab.si";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ashgillman ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nine/default.nix b/nixpkgs/pkgs/development/python-modules/nine/default.nix
new file mode 100644
index 000000000000..e2ca5c6f27dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nine/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "nine";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e8a96b6326341637d25ca9c257c1d2af4033c957946438d9d37bf6eb798d3bbe";
+  };
+
+  meta = with lib; {
+    description = "Let's write Python 3 right now!";
+    homepage = "https://github.com/nandoflorestan/nine";
+    license = licenses.free;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ninebot-ble/default.nix b/nixpkgs/pkgs/development/python-modules/ninebot-ble/default.nix
new file mode 100644
index 000000000000..c13d96fe700c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ninebot-ble/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, bleak
+, bleak-retry-connector
+, bluetooth-data-tools
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, fetchFromGitHub
+, miauth
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "ninebot-ble";
+  version = "0.0.6";
+  pyproject = true;
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "ownbee";
+    repo = "ninebot-ble";
+    rev = "refs/tags/${version}";
+    hash = "sha256-gA3VTs45vVpO0Iy8MbvvDf9j99vsFzrkADaJEslx6y0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    bleak
+    bleak-retry-connector
+    bluetooth-data-tools
+    bluetooth-sensor-state-data
+    miauth
+  ];
+
+  # Module has no test
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ninebot_ble"
+  ];
+
+  meta = with lib; {
+    description = "Ninebot scooter BLE client";
+    homepage = "https://github.com/ownbee/ninebot-ble";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/ninja/default.nix b/nixpkgs/pkgs/development/python-modules/ninja/default.nix
new file mode 100644
index 000000000000..808bf9fb8c0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ninja/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, flit-core
+, ninja
+}:
+
+buildPythonPackage rec {
+  pname = "ninja";
+  inherit (ninja) version;
+  format = "pyproject";
+
+  src = ./stub;
+
+  postUnpack = ''
+    substituteInPlace "$sourceRoot/pyproject.toml" \
+      --subst-var version
+
+    substituteInPlace "$sourceRoot/ninja/__init__.py" \
+      --subst-var version \
+      --subst-var-by BIN_DIR "${ninja}/bin"
+  '';
+
+  inherit (ninja) setupHook;
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  preBuild = ''
+    cp "${ninja.src}/misc/ninja_syntax.py" ninja/ninja_syntax.py
+  '';
+
+  pythonImportsCheck = [
+    "ninja"
+    "ninja.ninja_syntax"
+  ];
+
+  meta = with lib; {
+    description = "A small build system with a focus on speed";
+    longDescription = ''
+      This is a stub of the ninja package on PyPI that uses the ninja program
+      provided by nixpkgs instead of downloading ninja from the web.
+    '';
+    homepage = "https://github.com/scikit-build/ninja-python-distributions";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ _999eagle tjni ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ninja/stub/ninja/__init__.py b/nixpkgs/pkgs/development/python-modules/ninja/stub/ninja/__init__.py
new file mode 100644
index 000000000000..d6e7abe15205
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ninja/stub/ninja/__init__.py
@@ -0,0 +1,13 @@
+import os
+import subprocess
+import sys
+
+__version__ = '@version@'
+
+BIN_DIR = '@BIN_DIR@'
+
+def _program(name, args):
+    return subprocess.call([os.path.join(BIN_DIR, name)] + args, close_fds=False)
+
+def ninja():
+    raise SystemExit(_program('ninja', sys.argv[1:]))
diff --git a/nixpkgs/pkgs/development/python-modules/ninja/stub/pyproject.toml b/nixpkgs/pkgs/development/python-modules/ninja/stub/pyproject.toml
new file mode 100644
index 000000000000..0a8a6314288a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ninja/stub/pyproject.toml
@@ -0,0 +1,11 @@
+[build-system]
+requires = ["flit_core"]
+build-backend = "flit_core.buildapi"
+
+[project]
+name = "ninja"
+version = "@version@"
+description = "Ninja is a small build system with a focus on speed"
+
+[project.scripts]
+ninja = "ninja:ninja"
diff --git a/nixpkgs/pkgs/development/python-modules/nipy/default.nix b/nixpkgs/pkgs/development/python-modules/nipy/default.nix
new file mode 100644
index 000000000000..9f600bdf86ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nipy/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, cython
+, nose
+, matplotlib
+, nibabel
+, numpy
+, scipy
+, sympy
+, python
+}:
+
+buildPythonPackage rec {
+  version = "0.5.0";
+  pname = "nipy";
+  disabled = pythonOlder "2.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a8a2c97ce854fece4aced5a6394b9fdca5846150ad6d2a36b86590924af3c848";
+  };
+
+  nativeBuildInputs = [ cython ];
+  buildInputs = lib.optionals doCheck [ nose ];
+  propagatedBuildInputs = [ matplotlib nibabel numpy scipy sympy ];
+
+  preBuild = ''
+    make recythonize
+  '';
+
+  checkPhase = ''    # wants to be run in a different directory
+    mkdir nosetests
+    cd nosetests
+    ${python.interpreter} -c "import nipy; nipy.test()"
+    rm -rf .
+  '';
+
+  # failing test:
+  # nipy.algorithms.statistics.models.tests.test_olsR.test_results(11.593139639404727, 11.593140144880794, 6)  # disagrees by 1 at 6th decimal place
+  # erroring tests:
+  # nipy.modalities.fmri.fmristat.tests.test_FIAC.test_altprotocol
+  # nipy.modalities.fmri.fmristat.tests.test_FIAC.test_agreement
+  # nipy.tests.test_scripts.test_nipy_4d_realign   # because `nipy_4d_realign` script isn't found at test time; works from nix-shell, so could be patched
+  # nipy.tests.test_scripts.test_nipy_3_4d         # ditto re.: `nipy_3_4d` script
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://nipy.org/nipy";
+    description = "Software for structural and functional neuroimaging analysis";
+    license = licenses.bsd3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nipype/default.nix b/nixpkgs/pkgs/development/python-modules/nipype/default.nix
new file mode 100644
index 000000000000..9386729d30b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nipype/default.nix
@@ -0,0 +1,112 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pythonRelaxDepsHook
+# python dependencies
+, click
+, python-dateutil
+, etelemetry
+, filelock
+, funcsigs
+, future
+, looseversion
+, mock
+, networkx
+, nibabel
+, numpy
+, packaging
+, prov
+, psutil
+, pybids
+, pydot
+, pytest
+, pytest-xdist
+, pytest-forked
+, rdflib
+, scipy
+, simplejson
+, traits
+, xvfbwrapper
+, codecov
+# other dependencies
+, which
+, bash
+, glibcLocales
+, callPackage
+# causes Python packaging conflict with any package requiring rdflib,
+# so use the unpatched rdflib by default (disables Nipype provenance tracking);
+# see https://github.com/nipy/nipype/issues/2888:
+, useNeurdflib ? false
+}:
+
+buildPythonPackage rec {
+  pname = "nipype";
+  version = "1.8.6";
+  disabled = pythonOlder "3.7";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-l3sTFej3D5QWPsB+MeVXG+g/Kt1gIxQcWgascAEm+NE=";
+  };
+
+  postPatch = ''
+    substituteInPlace nipype/interfaces/base/tests/test_core.py \
+      --replace "/usr/bin/env bash" "${bash}/bin/bash"
+  '';
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [ "traits" ];
+
+  propagatedBuildInputs = [
+    click
+    python-dateutil
+    etelemetry
+    filelock
+    funcsigs
+    future
+    looseversion
+    networkx
+    nibabel
+    numpy
+    packaging
+    prov
+    psutil
+    pydot
+    rdflib
+    scipy
+    simplejson
+    traits
+    xvfbwrapper
+  ];
+
+  nativeCheckInputs = [
+    pybids
+    codecov
+    glibcLocales
+    mock
+    pytest
+    pytest-forked
+    pytest-xdist
+    which
+  ];
+
+  # checks on darwin inspect memory which doesn't work in build environment
+  doCheck = !stdenv.isDarwin;
+  # ignore tests which incorrect fail to detect xvfb
+  checkPhase = ''
+    LC_ALL="en_US.UTF-8" pytest nipype/tests -k 'not display and not test_no_et_multiproc'
+  '';
+  pythonImportsCheck = [ "nipype" ];
+
+  meta = with lib; {
+    homepage = "https://nipy.org/nipype/";
+    description = "Neuroimaging in Python: Pipelines and Interfaces";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ashgillman ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nitime/default.nix b/nixpkgs/pkgs/development/python-modules/nitime/default.nix
new file mode 100644
index 000000000000..cba5f0da29db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nitime/default.nix
@@ -0,0 +1,63 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytestCheckHook
+, cython
+, setuptools
+, setuptools-scm
+, wheel
+, numpy
+, scipy
+, matplotlib
+, networkx
+, nibabel
+}:
+
+buildPythonPackage rec {
+  pname = "nitime";
+  version = "0.10.2";
+  disabled = pythonOlder "3.7";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NCaWr7ZqL1XV0QfUD+4+Yn33N1cCP33ib5oJ91OtJLU=";
+  };
+
+  # Upstream wants to build against the oldest version of numpy possible, but
+  # we only want to build against the most recent version.
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "numpy==" "numpy>="
+  '';
+
+  nativeBuildInputs = [
+    cython
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    matplotlib
+    networkx
+    nibabel
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  doCheck = !stdenv.isDarwin;  # tests hang indefinitely
+
+  pythonImportsCheck = [ "nitime" ];
+
+  meta = with lib; {
+    homepage = "https://nipy.org/nitime";
+    description = "Algorithms and containers for time-series analysis in time and spectral domains";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nitransforms/default.nix b/nixpkgs/pkgs/development/python-modules/nitransforms/default.nix
new file mode 100644
index 000000000000..f4e8fbcdae07
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nitransforms/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pythonRelaxDepsHook
+, h5py
+, nibabel
+, numpy
+, scipy
+, setuptools-scm
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "nitransforms";
+  version = "23.0.1";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Lty4aPzSlwRJSqCXeIVICF+gudYqto1OS4cVZyrB2nY=";
+  };
+
+  nativeBuildInputs = [ pythonRelaxDepsHook ];
+  buildInputs = [ setuptools-scm toml ];
+  propagatedBuildInputs = [ h5py nibabel numpy scipy ];
+
+  pythonRelaxDeps = [ "scipy" ];
+
+  doCheck = false;
+  # relies on data repo (https://github.com/nipreps-data/nitransforms-tests);
+  # probably too heavy
+  pythonImportsCheck = [
+    "nitransforms"
+    "nitransforms.base"
+    "nitransforms.io"
+    "nitransforms.io.base"
+    "nitransforms.linear"
+    "nitransforms.manip"
+    "nitransforms.nonlinear"
+    "nitransforms.patched"
+  ];
+
+  meta = with lib; {
+    homepage = "https://nitransforms.readthedocs.io";
+    description = "Geometric transformations for images and surfaces";
+    changelog = "https://github.com/nipy/nitransforms/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nix-kernel/default.nix b/nixpkgs/pkgs/development/python-modules/nix-kernel/default.nix
new file mode 100644
index 000000000000..8ec80af0736b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nix-kernel/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, pexpect
+, notebook
+, nix
+}:
+
+buildPythonPackage rec {
+  pname = "nix-kernel";
+  version = "unstable-2020-04-26";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "GTrunSec";
+    repo = "nix-kernel";
+    rev = "dfa42d0812d508ded99f690ee1a83281d900a3ec";
+    sha256 = "1lf4rbbxjmq9h6g3wrdzx3v3dn1bndfmiybxiy0sjavgb6lzc8kq";
+  };
+
+  postPatch = ''
+    substituteInPlace nix-kernel/kernel.py \
+      --replace "'nix'" "'${nix}/bin/nix'" \
+      --replace "'nix repl'" "'${nix}/bin/nix repl'"
+
+    substituteInPlace setup.py \
+      --replace "cmdclass={'install': install_with_kernelspec}," ""
+  '';
+
+  propagatedBuildInputs = [
+    pexpect
+    notebook
+  ];
+
+  # no tests in repo
+  doCheck = false;
+
+  pythonImportsCheck = [ "nix-kernel" ];
+
+  meta = with lib; {
+    description = "Simple jupyter kernel for nix-repl";
+    homepage = "https://github.com/GTrunSec/nix-kernel";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nix-prefetch-github/default.nix b/nixpkgs/pkgs/development/python-modules/nix-prefetch-github/default.nix
new file mode 100644
index 000000000000..ec967493d080
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nix-prefetch-github/default.nix
@@ -0,0 +1,34 @@
+{ fetchFromGitHub
+, lib
+, buildPythonPackage
+, git
+, which
+, pythonOlder
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "nix-prefetch-github";
+  version = "7.0.0";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "seppeljordan";
+    repo = "nix-prefetch-github";
+    rev = "v${version}";
+    hash = "sha256-oIR2iEiOBQ1VKouJTLqEiWWNzrMSJcnxK+m/j9Ia/m8=";
+  };
+
+  nativeCheckInputs = [ unittestCheckHook git which ];
+
+  # ignore tests which are impure
+  DISABLED_TESTS = "network requires_nix_build";
+
+  meta = with lib; {
+    description = "Prefetch sources from github";
+    homepage = "https://github.com/seppeljordan/nix-prefetch-github";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ seppeljordan ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nixpkgs-pytools/default.nix b/nixpkgs/pkgs/development/python-modules/nixpkgs-pytools/default.nix
new file mode 100644
index 000000000000..e0af4c496993
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nixpkgs-pytools/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jinja2
+, setuptools
+, rope
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "nixpkgs-pytools";
+  version = "1.3.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "11skcbi1lf9qcv9j5ikifb4pakhbbygqpcmv3390j7gxsa85cn19";
+  };
+
+  propagatedBuildInputs = [
+    jinja2
+    setuptools
+    rope
+  ];
+
+  # tests require network ..
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Tools for removing the tedious nature of creating nixpkgs derivations";
+    homepage = "https://github.com/nix-community/nixpkgs-pytools";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nixpkgs/default.nix b/nixpkgs/pkgs/development/python-modules/nixpkgs/default.nix
new file mode 100644
index 000000000000..acebe5d758f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nixpkgs/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pbr
+, pythonix
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "nixpkgs";
+  version = "0.2.4";
+  disabled = ! pythonAtLeast "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0dlvq4bpamhlva86042wlc0xxfsxlpdgm2adfb1c6y3vjgbm0nvd";
+  };
+
+  buildInputs = [ pbr ];
+  propagatedBuildInputs = [ pythonix ];
+
+  # does not have any tests
+  doCheck = false;
+  pythonImportsCheck = [ "nixpkgs" ];
+
+  meta = with lib; {
+    description = "Allows to `from nixpkgs import` stuff in interactive Python sessions";
+    homepage = "https://github.com/t184256/nixpkgs-python-importer";
+    license = licenses.mit;
+    maintainers = with maintainers; [ t184256 ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nkdfu/default.nix b/nixpkgs/pkgs/development/python-modules/nkdfu/default.nix
new file mode 100644
index 000000000000..35d6fa16e1d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nkdfu/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchPypi, flit-core, fire, tqdm, intelhex, libusb1 }:
+
+buildPythonPackage rec {
+  pname = "nkdfu";
+  version = "0.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8l913dOCxHKFtpQ83p9RV3sUlu0oT5PVi14FSuYJ9fg=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    fire
+    tqdm
+    intelhex
+    libusb1
+  ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "nkdfu" ];
+
+  meta = with lib; {
+    description = "Python tool for Nitrokeys' firmware update";
+    homepage = "https://github.com/Nitrokey/nkdfu";
+    license = with licenses; [ gpl2Only ];
+    maintainers = with maintainers; [ frogamic ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nlpcloud/default.nix b/nixpkgs/pkgs/development/python-modules/nlpcloud/default.nix
new file mode 100644
index 000000000000..55e9233bb527
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nlpcloud/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "nlpcloud";
+  version = "1.1.45";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-W/O7GhZuACUFCSCCJUUB6UfMB9WSF8uU7Yd/tgPsE0Q=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "nlpcloud"
+  ];
+
+  meta = with lib; {
+    description = "Python client for the NLP Cloud API";
+    homepage = "https://nlpcloud.com/";
+    changelog = "https://github.com/nlpcloud/nlpcloud-python/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nltk/default.nix b/nixpkgs/pkgs/development/python-modules/nltk/default.nix
new file mode 100644
index 000000000000..77ed843d47cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nltk/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, click
+, joblib
+, regex
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "nltk";
+  version = "3.8.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-GDTaPQaCy6Tyzt4vmq1rD6+2RhukUdsO+2+cOXmNZNM=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    joblib
+    regex
+    tqdm
+  ];
+
+  # Tests require some data, the downloading of which is impure. It would
+  # probably make sense to make the data another derivation, but then feeding
+  # that into the tests (given that we need nltk itself to download the data,
+  # unless there's an easy way to download it without nltk's downloader) might
+  # be complicated. For now let's just disable the tests and hope for the
+  # best.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "nltk"
+  ];
+
+  meta = with lib; {
+    description = "Natural Language Processing ToolKit";
+    homepage = "http://nltk.org/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ lheckemann ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nmapthon2/default.nix b/nixpkgs/pkgs/development/python-modules/nmapthon2/default.nix
new file mode 100644
index 000000000000..4c8a66c91a55
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nmapthon2/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, appdirs
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "nmapthon2";
+  version = "0.1.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "cblopez";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-4Na75TdKDywUomJF4tDWUWwCCtcOSxBUMOF7+FDhbpY=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests/scanner_tests.py"
+  ];
+
+  pythonImportsCheck = [
+    "nmapthon2"
+  ];
+
+  meta = with lib; {
+    description = "Python library to automate nmap";
+    homepage = "https://github.com/cblopez/nmapthon2";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nocasedict/default.nix b/nixpkgs/pkgs/development/python-modules/nocasedict/default.nix
new file mode 100644
index 000000000000..390658f8167b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nocasedict/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "nocasedict";
+  version = "2.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lgy2mfEgnagKw546tQqnNC/oyp9wYGwjRHpRBVBDXlA=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "nocasedict"
+  ];
+
+  meta = with lib; {
+    description = "A case-insensitive ordered dictionary for Python";
+    homepage = "https://github.com/pywbem/nocasedict";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ freezeboy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nocaselist/default.nix b/nixpkgs/pkgs/development/python-modules/nocaselist/default.nix
new file mode 100644
index 000000000000..3972833e1069
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nocaselist/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "nocaselist";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-RWqgAMZ3fF0hsCnFLlMvlDKNT7TxWtKk3T3WLbMLOJI=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "nocaselist"
+  ];
+
+  meta = with lib; {
+    description = "A case-insensitive list for Python";
+    homepage = "https://github.com/pywbem/nocaselist";
+    changelog = "https://github.com/pywbem/nocaselist/blob/${version}/docs/changes.rst";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ freezeboy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nocturne/default.nix b/nixpkgs/pkgs/development/python-modules/nocturne/default.nix
new file mode 100644
index 000000000000..036c3af91e19
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nocturne/default.nix
@@ -0,0 +1,61 @@
+{ buildPythonPackage
+, cmake
+, fetchFromGitHub
+, gtest
+, hydra-core
+, lib
+, nlohmann_json
+, pybind11
+, pyvirtualdisplay
+, sfml
+, substituteAll
+}:
+
+buildPythonPackage rec {
+  pname = "nocturne";
+  version = "unstable-2022-10-15";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "facebookresearch";
+    repo = pname;
+    rev = "ae0a4e361457caf6b7e397675cc86f46161405ed";
+    hash = "sha256-pFVbl4m7qX1mJgleNabRboS9klDDsbzUa4PYL5+Jupc=";
+  };
+
+  # Simulate the git submodules but with nixpkgs dependencies
+  postUnpack = ''
+    rm -rf $sourceRoot/third_party/*
+    ln -s ${nlohmann_json.src} $sourceRoot/third_party/json
+    ln -s ${pybind11.src} $sourceRoot/third_party/pybind11
+  '';
+
+  patches = [
+    (substituteAll {
+      src = ./dependencies.patch;
+      gtest_src = gtest.src;
+    })
+  ];
+
+  nativeBuildInputs = [ cmake ];
+  dontUseCmakeConfigure = true;
+
+  buildInputs = [ sfml ];
+
+  # hydra-core and pyvirtualdisplay are not declared as dependences but they are requirements
+  propagatedBuildInputs = [ hydra-core pyvirtualdisplay ];
+
+  # Test suite requires hydra-submitit-launcher which is not packaged as of 2022-01-02
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "nocturne"
+  ];
+
+  meta = with lib; {
+    description = "A data-driven, fast driving simulator for multi-agent coordination under partial observability";
+    homepage = "https://github.com/facebookresearch/nocturne";
+    license = licenses.mit;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nocturne/dependencies.patch b/nixpkgs/pkgs/development/python-modules/nocturne/dependencies.patch
new file mode 100644
index 000000000000..18843ff6309f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nocturne/dependencies.patch
@@ -0,0 +1,27 @@
+diff --git a/nocturne/cpp/CMakeLists.txt b/nocturne/cpp/CMakeLists.txt
+index c67815f..e1f825b 100644
+--- a/nocturne/cpp/CMakeLists.txt
++++ b/nocturne/cpp/CMakeLists.txt
+@@ -62,8 +62,7 @@ include(FetchContent)
+ 
+ FetchContent_Declare(
+   googletest
+-  GIT_REPOSITORY https://github.com/google/googletest.git
+-  GIT_TAG main
++  SOURCE_DIR @gtest_src@
+ )
+ 
+ set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
+diff --git a/setup.py b/setup.py
+index 4863ae6..b5d3545 100644
+--- a/setup.py
++++ b/setup.py
+@@ -92,6 +92,8 @@ def main():
+     # with open("./requirements.txt", "r") as f:
+     #     requires = f.read().splitlines()
+     setup(
++        # Adding `packages=` is necessary to get `python setup.py install` to work
++        packages=["nocturne", "cfgs"],
+         ext_modules=[CMakeExtension("nocturne", "./nocturne")],
+         cmdclass=dict(build_ext=CMakeBuild),
+     )
diff --git a/nixpkgs/pkgs/development/python-modules/node-semver/default.nix b/nixpkgs/pkgs/development/python-modules/node-semver/default.nix
new file mode 100644
index 000000000000..2fb460bc006d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/node-semver/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "node-semver";
+  version = "0.9.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "podhmo";
+    repo = "python-node-semver";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Ncl+RUvy9G9lF3EzLz2HfiDB02tEgAlZ34Wbn4mlF6Y=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "nodesemver"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/podhmo/python-node-semver/blob/${version}/CHANGES.txt";
+    description = "A port of node-semver";
+    homepage = "https://github.com/podhmo/python-semver";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nodeenv/default.nix b/nixpkgs/pkgs/development/python-modules/nodeenv/default.nix
new file mode 100644
index 000000000000..92d3bbb5d4c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nodeenv/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, python
+, pythonOlder
+, setuptools
+, which
+}:
+
+buildPythonPackage rec {
+  pname = "nodeenv";
+  version = "1.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ekalinin";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-aW/aNZbFXfP4bF/Nlvv419IDfaJRA1pJYM7awj+6Hz0=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  preFixup = ''
+    substituteInPlace $out/${python.sitePackages}/nodeenv.py \
+      --replace '["which", candidate]' '["${lib.getBin which}/bin/which", candidate]'
+  '';
+
+  pythonImportsCheck = [
+    "nodeenv"
+  ];
+
+  disabledTests = [
+    # Test requires coverage
+    "test_smoke"
+  ];
+
+  meta = with lib; {
+    description = "Node.js virtual environment builder";
+    homepage = "https://github.com/ekalinin/nodeenv";
+    changelog = "https://github.com/ekalinin/nodeenv/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nodepy-runtime/default.nix b/nixpkgs/pkgs/development/python-modules/nodepy-runtime/default.nix
new file mode 100644
index 000000000000..5be806e4cefe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nodepy-runtime/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, localimport
+, pathlib2
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "nodepy-runtime";
+  version = "2.1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6tSsD76EpCZxkdulv1BcUZtIXGWLG6PuII25J8STygE=";
+  };
+
+  propagatedBuildInputs = [
+    localimport
+    pathlib2
+    six
+  ];
+
+  pythonImportsCheck = [
+    "nodepy"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/nodepy/nodepy";
+    description = "Runtime for Python inspired by Node.JS";
+    longDescription = ''
+      Node.py is a Python runtime and package manager compatible with CPython
+      2.7 and 3.3 – 3.6. It provides a separate import mechanism for modules
+      inspired by Node.js, bringing dependency management and ease of deployment
+      for Python applications up to par with other languages without virtual
+      environments.
+
+      Node.py comes with a built-in package manager that builds on Pip for
+      standard Python dependencies but also adds the capability to install
+      packages that are specifically developed for Node.py. To install the
+      dependencies of the package manager you must specify the [pm] install
+      extra.
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ AndersonTorres ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/noise/default.nix b/nixpkgs/pkgs/development/python-modules/noise/default.nix
new file mode 100644
index 000000000000..ebd0178602ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/noise/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "noise";
+  version = "1.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0rcv40dcshqpchwkdlhsv3n68h9swm9fh4d1cgzr2hsp6rs7k8jp";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/caseman/noise";
+    description = "Native-code and shader implementations of Perlin noise";
+    license = licenses.mit;
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/noiseprotocol/default.nix b/nixpkgs/pkgs/development/python-modules/noiseprotocol/default.nix
new file mode 100644
index 000000000000..596468f83ca2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/noiseprotocol/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub, cryptography, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "noiseprotocol";
+  version = "0.3.1";
+
+  src = fetchFromGitHub {
+    owner = "plizonczyk";
+    repo = "noiseprotocol";
+    rev = "v${version}";
+    sha256 = "1mk0rqpjifdv3v1cjwkdnjbrfmzzjm9f3qqs1r8vii4j2wvhm6am";
+  };
+
+  propagatedBuildInputs = [ cryptography ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "noise" ];
+
+  meta = with lib; {
+    description = "Noise Protocol Framework";
+    homepage = "https://github.com/plizonczyk/noiseprotocol/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nomadnet/default.nix b/nixpkgs/pkgs/development/python-modules/nomadnet/default.nix
new file mode 100644
index 000000000000..7cca122333ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nomadnet/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, rns
+, fetchFromGitHub
+, lxmf
+, urwid
+, pythonOlder
+, qrcode
+}:
+
+buildPythonPackage rec {
+  pname = "nomadnet";
+  version = "0.4.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "markqvist";
+    repo = "NomadNet";
+    rev = "refs/tags/${version}";
+    hash = "sha256-jqevKKOQrVpeCe305VKYnF6ODD5JEdt7du+deSZXreA=";
+  };
+
+  propagatedBuildInputs = [
+    rns
+    lxmf
+    urwid
+    qrcode
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "nomadnet"
+  ];
+
+  meta = with lib; {
+    description = "Off-grid, resilient mesh communication";
+    homepage = "https://github.com/markqvist/NomadNet";
+    changelog = "https://github.com/markqvist/NomadNet/releases/tag/${version}";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/normality/default.nix b/nixpkgs/pkgs/development/python-modules/normality/default.nix
new file mode 100644
index 000000000000..5770b61718a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/normality/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, text-unidecode
+, chardet
+, banal
+, pyicu
+, pytestCheckHook
+}:
+buildPythonPackage rec {
+  pname = "normality";
+  version = "2.2.5";
+
+  src = fetchFromGitHub {
+    owner = "pudo";
+    repo = "normality";
+    rev = version;
+    sha256 = "n8Ycm5DeFItmMJTolazZKGIyN7CTg2ajDCwi/UqzVe8=";
+  };
+
+  propagatedBuildInputs = [
+    text-unidecode
+    chardet
+    banal
+    pyicu
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "normality"
+  ];
+
+  meta = with lib; {
+    description = "Micro-library to normalize text strings";
+    homepage = "https://github.com/pudo/normality";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nose-cov/default.nix b/nixpkgs/pkgs/development/python-modules/nose-cov/default.nix
new file mode 100644
index 000000000000..a95e162b1ba4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose-cov/default.nix
@@ -0,0 +1,20 @@
+{ buildPythonPackage, fetchPypi, lib, nose, covCore }:
+
+buildPythonPackage rec {
+  pname = "nose-cov";
+  version = "1.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "04j4fw01bv648gimqqj4z88606lcczbm1k326agcc74gb4sh7v4b";
+  };
+
+  propagatedBuildInputs = [ nose covCore ];
+
+  meta = with lib; {
+    homepage = "https://pypi.org/project/nose-cov/";
+    license = licenses.mit;
+    description = "This plugin produces coverage reports. It also supports coverage of subprocesses.";
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nose-cprof/default.nix b/nixpkgs/pkgs/development/python-modules/nose-cprof/default.nix
new file mode 100644
index 000000000000..f4959ec7be78
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose-cprof/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+}:
+
+
+buildPythonPackage rec {
+  pname = "nose-cprof";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0178834759b63dc50388444d4ff8d1ae84e1ba110bb167419afee6bf4699b119";
+  };
+
+  buildInputs = [ nose ];
+
+  meta = with lib; {
+    description = "A python nose plugin to profile using cProfile rather than the default Hotshot profiler";
+    homepage = "https://github.com/msherry/nose-cprof";
+    license = licenses.bsd0;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nose-exclude/default.nix b/nixpkgs/pkgs/development/python-modules/nose-exclude/default.nix
new file mode 100644
index 000000000000..81204a34bd9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose-exclude/default.nix
@@ -0,0 +1,28 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "nose-exclude";
+  version = "0.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f78fa8b41eeb815f0486414f710f1eea0949e346cfb11d59ba6295ed69e84304";
+  };
+
+  propagatedBuildInputs = [ nose ];
+
+  # "OSError: AF_UNIX path too long" for darwin
+  doCheck = !stdenv.isDarwin;
+
+  meta = {
+    license = lib.licenses.lgpl21;
+    description = "Exclude specific directories from nosetests runs";
+    homepage = "https://github.com/kgrandis/nose-exclude";
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nose-pattern-exclude/default.nix b/nixpkgs/pkgs/development/python-modules/nose-pattern-exclude/default.nix
new file mode 100644
index 000000000000..a550dc5aee15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose-pattern-exclude/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, nose }:
+
+buildPythonPackage rec {
+  pname = "nose-pattern-exclude";
+  version = "0.1.3";
+
+  propagatedBuildInputs = [ nose ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0apzxx8lavsdlxlpaxqw1snx5p7q8v5dfbip6v32f9pj2vyain1i";
+  };
+
+  # There are no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Exclude specific files and directories from nosetests runs";
+    homepage = "https://github.com/jakubroztocil/nose-pattern-exclude";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nose-randomly/default.nix b/nixpkgs/pkgs/development/python-modules/nose-randomly/default.nix
new file mode 100644
index 000000000000..786820b1adf4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose-randomly/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, nose
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "nose-randomly";
+  version = "1.2.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7e483a3d79e13ae760d6ade57ae07ae45bb4b223b61a805e958b4c077116c67c";
+  };
+
+  nativeCheckInputs = [ numpy nose ];
+
+  checkPhase = if stdenv.isDarwin then ''
+    # Work around "OSError: AF_UNIX path too long"
+    TMPDIR="/tmp" nosetests
+  '' else ''
+    nosetests
+  '';
+
+  meta = with lib; {
+    description = "Nose plugin to randomly order tests and control random.seed";
+    homepage = "https://github.com/adamchainz/nose-randomly";
+    license = licenses.bsd3;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nose-timer/default.nix b/nixpkgs/pkgs/development/python-modules/nose-timer/default.nix
new file mode 100644
index 000000000000..de3bbdc9a439
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose-timer/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, mock
+, parameterized
+, termcolor
+}:
+
+buildPythonPackage rec {
+  pname = "nose-timer";
+  version = "1.0.1";
+
+  src = fetchFromGitHub {
+    owner = "mahmoudimus";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0xsai2l5i1av62y9y0q63wy2zk27klmf2jizgghhxg2y8nfa8x3x";
+  };
+
+  propagatedBuildInputs = [ nose ];
+
+  nativeCheckInputs = [
+    mock
+    nose
+    parameterized
+    termcolor
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    nosetests --verbosity 2 tests
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "nosetimer" ];
+
+  meta = with lib; {
+    description = "A timer plugin for nosetests";
+    homepage = "https://github.com/mahmoudimus/nose-timer";
+    license = licenses.mit;
+    maintainers = with maintainers; [ doronbehar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nose/default.nix b/nixpkgs/pkgs/development/python-modules/nose/default.nix
new file mode 100644
index 000000000000..981d5dc03729
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, isPyPy
+, python
+, coverage
+, buildPackages
+}:
+
+buildPythonPackage rec {
+  version = "1.3.7";
+  pname = "nose";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f1bffef9cbc82628f6e7d7b40d7e255aefaa1adb6a1b1d26c69a8b79e6208a98";
+  };
+
+  # 2to3 was removed in setuptools 58
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'use_2to3': True," ""
+
+    substituteInPlace setup3lib.py \
+      --replace "from setuptools.command.build_py import Mixin2to3" "from distutils.util import Mixin2to3"
+  '';
+
+  preBuild = lib.optionalString (isPy3k) ''
+    ${python.pythonOnBuildForHost}/bin/2to3 -wn nose functional_tests unit_tests
+  '';
+
+  propagatedBuildInputs = [ coverage ];
+
+  doCheck = false; # lot's of transient errors, too much hassle
+  checkPhase = if isPy3k then ''
+    ${python.pythonOnBuildForHost.interpreter} setup.py build_tests
+  '' else "" + ''
+    rm functional_tests/test_multiprocessing/test_concurrent_shared.py* # see https://github.com/nose-devs/nose/commit/226bc671c73643887b36b8467b34ad485c2df062
+    ${python.pythonOnBuildForHost.interpreter} selftest.py
+  '';
+
+  meta = with lib; {
+    broken = isPyPy; # missing 2to3 conversion utility
+    description = "A unittest-based testing framework for python that makes writing and running tests easier";
+    homepage = "https://nose.readthedocs.io/";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nose2/default.nix b/nixpkgs/pkgs/development/python-modules/nose2/default.nix
new file mode 100644
index 000000000000..b49900e1576f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose2/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, six
+, pythonOlder
+, coverage
+}:
+
+buildPythonPackage rec {
+  pname = "nose2";
+  version = "0.14.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XCjXcKC5pwKGK9bDdVuizS95lN1RjJguXOKY1/N0ZqQ=";
+  };
+
+  propagatedBuildInputs = [
+    coverage
+    six
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest
+  '';
+
+  pythonImportsCheck = [
+    "nose2"
+  ];
+
+  meta = with lib; {
+    description = "Test runner for Python";
+    homepage = "https://github.com/nose-devs/nose2";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nose3/default.nix b/nixpkgs/pkgs/development/python-modules/nose3/default.nix
new file mode 100644
index 000000000000..f9966b246602
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose3/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, coverage
+, fetchPypi
+, isPyPy
+, isPy311
+, python
+, pythonAtLeast
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "nose3";
+  version = "1.3.8";
+
+  # https://github.com/jayvdb/nose3/issues/5
+  disabled = pythonAtLeast "3.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-diquIsrbiYsAudT0u7n46H+ODd5sSaiM0MVU9OWSW3Y=";
+  };
+
+  propagatedBuildInputs = [ coverage ];
+
+  # PyPy hangs for unknwon reason
+  # Darwin and python 3.11 fail at various assertions and I didn't find an easy way to find skip those tests
+  doCheck = !isPyPy && !stdenv.isDarwin && !isPy311;
+
+  checkPhase = ''
+    ${python.pythonOnBuildForHost.interpreter} selftest.py
+  '';
+
+  meta = with lib; {
+    description = "Fork of nose v1 not using lib2to3 for compatibility with Python 3";
+    homepage = "https://github.com/jayvdb/nose3";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nose_warnings_filters/default.nix b/nixpkgs/pkgs/development/python-modules/nose_warnings_filters/default.nix
new file mode 100644
index 000000000000..6617c85d16d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nose_warnings_filters/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "nose_warnings_filters";
+  version = "0.1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "17dvfqfy2fm7a5cmiffw2dc3064kpx72fn5mlw01skm2rhn5nv25";
+  };
+
+  disabled = !isPy3k;
+
+  propagatedBuildInputs = [ nose ];
+
+  nativeCheckInputs = [ nose ];
+  checkPhase = ''
+    nosetests -v
+  '';
+
+  meta = {
+    description = "Allow injecting warning filters during nosetest";
+    homepage = "https://github.com/Carreau/nose_warnings_filters";
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nosejs/default.nix b/nixpkgs/pkgs/development/python-modules/nosejs/default.nix
new file mode 100644
index 000000000000..7a63713d2d09
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nosejs/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "NoseJS";
+  version = "0.9.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0qrhkd3sga56qf6k0sqyhwfcladwi05gl6aqmr0xriiq1sgva5dy";
+  };
+
+  nativeCheckInputs = [ nose ];
+
+  checkPhase = ''
+    nosetests -v
+  '';
+
+  meta = with lib; {
+    homepage = "https://pypi.org/project/NoseJS/";
+    description = "A Nose plugin for integrating JavaScript tests into a Python test suite";
+    license = licenses.free;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nosexcover/default.nix b/nixpkgs/pkgs/development/python-modules/nosexcover/default.nix
new file mode 100644
index 000000000000..f60ed65448d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nosexcover/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, coverage
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "nosexcover";
+  version = "1.0.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "298c3c655da587f6cab8a666e9f4b150320032431062dea91353988d45c8b883";
+  };
+
+  propagatedBuildInputs = [ coverage nose ];
+
+  meta = with lib; {
+    description = "Extends nose.plugins.cover to add Cobertura-style XML reports";
+    homepage = "https://github.com/cmheisel/nose-xcover/";
+    license = licenses.bsd3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/notebook-shim/default.nix b/nixpkgs/pkgs/development/python-modules/notebook-shim/default.nix
new file mode 100644
index 000000000000..3bdb11416863
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notebook-shim/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, jupyter-server
+, pytestCheckHook
+, pytest-tornasync
+}:
+
+buildPythonPackage rec {
+  pname = "notebook-shim";
+  version = "0.2.3";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "jupyter";
+    repo = "notebook_shim";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-eAYZuNYqOMKC6joDbbKk4Q4nrfdbO7b+yZeSvMdWWrI=";
+  };
+
+  nativeBuildInputs = [ hatchling ];
+  propagatedBuildInputs = [ jupyter-server ];
+
+  preCheck = ''
+    mv notebook_shim/conftest.py notebook_shim/tests
+    cd notebook_shim/tests
+  '';
+
+  # TODO: understand & possibly fix why tests fail. On github most testfiles
+  # have been comitted with msgs "wip" though.
+  doCheck = false;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-tornasync
+  ];
+
+  pythonImportsCheck = [ "notebook_shim" ];
+
+  meta = with lib; {
+    description = "Switch frontends to Jupyter Server";
+    longDescription = ''
+      This project provides a way for JupyterLab and other frontends to switch
+      to Jupyter Server for their Python Web application backend.
+    '';
+    homepage = "https://github.com/jupyter/notebook_shim";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ friedelino ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/notebook/default.nix b/nixpkgs/pkgs/development/python-modules/notebook/default.nix
new file mode 100644
index 000000000000..88f4c975a858
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notebook/default.nix
@@ -0,0 +1,72 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, hatch-jupyter-builder
+, hatchling
+, jupyter-server
+, jupyterlab
+, jupyterlab-server
+, notebook-shim
+, tornado
+, pytest-jupyter
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "notebook";
+  version = "7.0.3";
+  disabled = pythonOlder "3.8";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-B/PFBi/Q5uaYZEN6A0erxIXZkaroepLEfWWWmfVxtyk=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "timeout = 300" ""
+  '';
+
+  nativeBuildInputs = [
+    hatch-jupyter-builder
+    hatchling
+    jupyterlab
+  ];
+
+  propagatedBuildInputs = [
+    jupyter-server
+    jupyterlab
+    jupyterlab-server
+    notebook-shim
+    tornado
+  ];
+
+  nativeCheckInputs = [
+    pytest-jupyter
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "-W" "ignore::DeprecationWarning"
+  ];
+
+  env = {
+    JUPYTER_PLATFORM_DIRS = 1;
+  };
+
+  # Some of the tests use localhost networking.
+  __darwinAllowLocalNetworking = true;
+
+  meta = {
+    changelog = "https://github.com/jupyter/notebook/blob/v${version}/CHANGELOG.md";
+    description = "Web-based notebook environment for interactive computing";
+    homepage = "https://github.com/jupyter/notebook";
+    license = lib.licenses.bsd3;
+    maintainers = lib.teams.jupyter.members;
+    mainProgram = "jupyter-notebook";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/notedown/default.nix b/nixpkgs/pkgs/development/python-modules/notedown/default.nix
new file mode 100644
index 000000000000..8ecbf1f5afab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notedown/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, nbconvert
+, nbformat
+, notebook
+, pandoc-attributes
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "notedown";
+  version = "1.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "36e033ebbbe5aca0fab031ffaf3611d5bc5c50237df68ff81bb95f8be353a1ee";
+  };
+
+  propagatedBuildInputs = [
+    notebook
+    nbconvert
+    nbformat
+    pandoc-attributes
+    six
+  ];
+
+  # No tests in pypi source
+  doCheck = false;
+
+  meta = {
+    homepage = "https://github.com/aaren/notedown";
+    description = "Convert IPython Notebooks to markdown (and back)";
+    license = lib.licenses.bsd2;
+    maintainers = with lib.maintainers; [ vcanadi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/notifications-android-tv/default.nix b/nixpkgs/pkgs/development/python-modules/notifications-android-tv/default.nix
new file mode 100644
index 000000000000..00e43cfe1879
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notifications-android-tv/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, poetry-core
+, pytest-asyncio
+, pytest-httpx
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "notifications-android-tv";
+  version = "1.0.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "engrbm87";
+    repo = "notifications_android_tv";
+    rev = version;
+    hash = "sha256-Xr+d2uYzgFp/Fb00ymov02+GYnwjGc3FbJ/rIvQXzCE=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  pythonImportsCheck = [ "notifications_android_tv" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytest-httpx
+  ];
+
+  meta = with lib; {
+    description = "Python API for sending notifications to Android/Fire TVs";
+    homepage = "https://github.com/engrbm87/notifications_android_tv";
+    changelog = "https://github.com/engrbm87/notifications_android_tv/blob/${version}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dominikh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/notifications-python-client/default.nix b/nixpkgs/pkgs/development/python-modules/notifications-python-client/default.nix
new file mode 100644
index 000000000000..5ae579c8deb2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notifications-python-client/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, docopt
+, fetchFromGitHub
+, freezegun
+, mock
+, pyjwt
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "notifications-python-client";
+  version = "8.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "alphagov";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-pdBPjc2j0/PSk224r8un22pNQ9g1jMdhPn8XmoKp+ng=";
+  };
+
+  propagatedBuildInputs = [
+    docopt
+    pyjwt
+    requests
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    mock
+    pytest-mock
+    pytestCheckHook
+    requests-mock
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest-runner" ""
+  '';
+
+  pythonImportsCheck = [
+    "notifications_python_client"
+  ];
+
+  meta = with lib; {
+    description = "Python client for the GOV.UK Notify API";
+    homepage = "https://github.com/alphagov/notifications-python-client";
+    changelog = "https://github.com/alphagov/notifications-python-client/blob/${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/notify-events/default.nix b/nixpkgs/pkgs/development/python-modules/notify-events/default.nix
new file mode 100644
index 000000000000..97d888ae23ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notify-events/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "notify-events";
+  version = "1.1.3";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "notify_events";
+    inherit version;
+    sha256 = "e63ba935c3300ff7f48cba115f7cb4474906e83c2e9b60b95a0881eb949701e7";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "notify_events" ];
+
+  meta = {
+    description = "Python client for Notify.Events";
+    homepage = "https://github.com/notify-events/python";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/notify-py/darwin-paths.patch b/nixpkgs/pkgs/development/python-modules/notify-py/darwin-paths.patch
new file mode 100644
index 000000000000..3088825b9b9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notify-py/darwin-paths.patch
@@ -0,0 +1,13 @@
+diff --git a/notifypy/os_notifiers/macos.py b/notifypy/os_notifiers/macos.py
+index 68731fb..53fcee3 100644
+--- a/notifypy/os_notifiers/macos.py
++++ b/notifypy/os_notifiers/macos.py
+@@ -75,7 +75,7 @@ class MacOSNotifier(BaseNotifier):
+     def _find_installed_afplay():
+         """Function to find the path for afplay"""
+         try:
+-            run_which_for_aplay = subprocess.check_output(["which", "afplay"])
++            run_which_for_aplay = subprocess.check_output(["@which@", "afplay"])
+             return run_which_for_aplay.decode("utf-8")
+         except subprocess.CalledProcessError:
+             logger.exception("Unable to find aplay.")
diff --git a/nixpkgs/pkgs/development/python-modules/notify-py/default.nix b/nixpkgs/pkgs/development/python-modules/notify-py/default.nix
new file mode 100644
index 000000000000..61c1c9026e0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notify-py/default.nix
@@ -0,0 +1,95 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, substituteAll
+, alsa-utils
+, libnotify
+, which
+, poetry-core
+, pythonRelaxDepsHook
+, jeepney
+, loguru
+, pytest
+, dbus
+, coreutils
+}:
+
+buildPythonPackage rec {
+  pname = "notify-py";
+  version = "0.3.42";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ms7m";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-XtjJImH9UwPPZS/Yqs8S5xGXOLBRmJRawzxWXoPWvrM=";
+  };
+
+  patches = lib.optionals stdenv.isLinux [
+    # hardcode paths to aplay and notify-send
+    (substituteAll {
+      src = ./linux-paths.patch;
+      aplay = "${alsa-utils}/bin/aplay";
+      notifysend = "${libnotify}/bin/notify-send";
+    })
+  ] ++ lib.optionals stdenv.isDarwin [
+    # hardcode path to which
+    (substituteAll {
+      src = ./darwin-paths.patch;
+      which = "${which}/bin/which";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    "loguru"
+  ];
+
+  propagatedBuildInputs = [
+    loguru
+  ] ++ lib.optionals stdenv.isLinux [
+    jeepney
+  ];
+
+  nativeCheckInputs = [
+    pytest
+  ] ++ lib.optionals stdenv.isLinux [
+    dbus
+  ];
+
+  checkPhase = if stdenv.isDarwin then ''
+    # Tests search for "afplay" binary which is built in to macOS and not available in nixpkgs
+    mkdir $TMP/bin
+    ln -s ${coreutils}/bin/true $TMP/bin/afplay
+    PATH="$TMP/bin:$PATH" pytest
+  '' else if stdenv.isLinux then ''
+    dbus-run-session \
+      --config-file=${dbus}/share/dbus-1/session.conf \
+      pytest
+  '' else ''
+    pytest
+  '';
+
+  # GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name
+  # org.freedesktop.Notifications was not provided by any .service files
+  doCheck = false;
+
+  pythonImportsCheck = [ "notifypy" ];
+
+  meta = with lib; {
+    description = "Cross-platform desktop notification library for Python";
+    homepage = "https://github.com/ms7m/notify-py";
+    changelog = "https://github.com/ms7m/notify-py/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ austinbutler dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/notify-py/linux-paths.patch b/nixpkgs/pkgs/development/python-modules/notify-py/linux-paths.patch
new file mode 100644
index 000000000000..19965f33996f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notify-py/linux-paths.patch
@@ -0,0 +1,22 @@
+diff --git a/notifypy/os_notifiers/linux.py b/notifypy/os_notifiers/linux.py
+index 5882481..e26eaaf 100644
+--- a/notifypy/os_notifiers/linux.py
++++ b/notifypy/os_notifiers/linux.py
+@@ -10,7 +10,7 @@ try:
+     from jeepney.io.blocking import open_dbus_connection
+     from shutil import which
+ 
+-    NOTIFY = which('notify-send') # alternatively: from ctypes.util import find_library 
++    NOTIFY = '@notifysend@' # alternatively: from ctypes.util import find_library 
+ 
+     if NOTIFY:
+         logger.info("libnotify found, using it for notifications")
+@@ -22,7 +22,7 @@ try:
+         else:
+             raise ImportError
+ 
+-    APLAY = which('aplay')
++    APLAY = '@aplay@'
+ 
+     if APLAY == None:
+         logger.debug("aplay binary not installed.. audio will not work!")
diff --git a/nixpkgs/pkgs/development/python-modules/notify2/default.nix b/nixpkgs/pkgs/development/python-modules/notify2/default.nix
new file mode 100644
index 000000000000..28c74415c5dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notify2/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, pygobject3
+, dbus-python
+}:
+
+buildPythonPackage rec {
+  pname = "notify2";
+  version = "0.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0z8rrv9rsg1r2qgh2dxj3dfj5xnki98kgi3w839kqby4a26i1yik";
+  };
+
+
+  # Tests require Xorg and Dbus instance
+  doCheck = false;
+  propagatedBuildInputs = [ pygobject3
+                            dbus-python ];
+
+  meta = {
+    description = "Pure Python interface to DBus notifications";
+    homepage = "https://bitbucket.org/takluyver/pynotify2";
+    license = lib.licenses.bsd2;
+    maintainers = with lib.maintainers; [ mog ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/notion-client/default.nix b/nixpkgs/pkgs/development/python-modules/notion-client/default.nix
new file mode 100644
index 000000000000..91cf18e3a2c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notion-client/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, anyio
+, httpx
+, pytest-asyncio
+, pytest-vcr
+}:
+
+buildPythonPackage rec {
+  pname = "notion-client";
+  version = "2.0.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ramnes";
+    repo = "notion-sdk-py";
+    rev = version;
+    hash = "sha256-zfG1OgH/2ytDUC+ogIY9/nP+xkgjiMt9+HVcWEMXoj8=";
+  };
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  # disable coverage options as they don't provide us value, and they break the default pytestCheckHook
+  preCheck = ''
+    sed -i '/addopts/d' ./setup.cfg
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    anyio
+    pytest-asyncio
+    pytest-vcr
+  ];
+
+  pythonImportsCheck = [
+    "notion_client"
+  ];
+
+  meta = with lib; {
+    description = "Python client for the official Notion API";
+    homepage = "https://github.com/ramnes/notion-sdk-py";
+    changelog = "https://github.com/ramnes/notion-sdk-py/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jpetrucciani ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/notmuch/default.nix b/nixpkgs/pkgs/development/python-modules/notmuch/default.nix
new file mode 100644
index 000000000000..90695b84c660
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notmuch/default.nix
@@ -0,0 +1,31 @@
+{ lib
+
+, buildPythonPackage
+, notmuch
+, python
+}:
+
+buildPythonPackage {
+  inherit (notmuch) pname version src;
+
+  sourceRoot = notmuch.pythonSourceRoot;
+
+  buildInputs = [ python notmuch ];
+
+  postPatch = ''
+    sed -i -e '/CDLL/s@"libnotmuch\.@"${notmuch}/lib/libnotmuch.@' \
+      notmuch/globals.py
+  '';
+
+  # no tests
+  doCheck = false;
+  pythonImportsCheck = [ "notmuch" ];
+
+  meta = with lib; {
+    description = "A Python wrapper around notmuch";
+    homepage = "https://notmuchmail.org/";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/notmuch2/default.nix b/nixpkgs/pkgs/development/python-modules/notmuch2/default.nix
new file mode 100644
index 000000000000..9bb930d6cfa4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notmuch2/default.nix
@@ -0,0 +1,47 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, notmuch
+, python
+, cffi
+}:
+
+buildPythonPackage {
+  pname = "notmuch2";
+  inherit (notmuch) version src;
+
+  sourceRoot = "notmuch-${notmuch.version}/bindings/python-cffi";
+
+  nativeBuildInputs = [
+    cffi
+  ];
+  buildInputs = [
+    python notmuch
+  ];
+
+  propagatedBuildInputs = [ cffi ];
+
+  # since notmuch 0.35, this package expects _notmuch_config.py that is
+  # generated by notmuch's configure script. We write one which references our
+  # built libraries.
+  postPatch = ''
+    cat > _notmuch_config.py << EOF
+    import os
+    dir_path = os.path.dirname(os.path.realpath(__file__))
+    NOTMUCH_VERSION_FILE=os.path.join(dir_path, '../../version.txt')
+    NOTMUCH_INCLUDE_DIR='${notmuch.out}/lib'
+    NOTMUCH_LIB_DIR='${notmuch.out}/lib'
+    EOF
+  '';
+
+  # no tests
+  doCheck = false;
+  pythonImportsCheck = [ "notmuch2" ];
+
+  meta = with lib; {
+    description = "Pythonic bindings for the notmuch mail database using CFFI";
+    homepage = "https://notmuchmail.org/";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ teto ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/notus-scanner/default.nix b/nixpkgs/pkgs/development/python-modules/notus-scanner/default.nix
new file mode 100644
index 000000000000..263aebada6a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/notus-scanner/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, paho-mqtt
+, poetry-core
+, psutil
+, pytestCheckHook
+, python-gnupg
+, pythonOlder
+, pythonRelaxDepsHook
+, sentry-sdk
+, tomli
+}:
+
+buildPythonPackage rec {
+  pname = "notus-scanner";
+  version = "22.6.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "greenbone";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-V70cFSfQ9SuLhCSUa8DuYA7qaabwiK9IbIkYcQMgVUk=";
+  };
+
+  pythonRelaxDeps = [
+    "python-gnupg"
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    paho-mqtt
+    psutil
+    python-gnupg
+    sentry-sdk
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "notus.scanner"
+  ];
+
+  meta = with lib; {
+    description = "Helper to create results from local security checks";
+    homepage = "https://github.com/greenbone/notus-scanner";
+    changelog = "https://github.com/greenbone/notus-scanner/releases/tag/v${version}";
+    license = with licenses; [ agpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nox/default.nix b/nixpkgs/pkgs/development/python-modules/nox/default.nix
new file mode 100644
index 000000000000..0b6067cb1cfb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nox/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, argcomplete
+, buildPythonPackage
+, colorlog
+, fetchFromGitHub
+, hatchling
+, importlib-metadata
+, jinja2
+, packaging
+, pytestCheckHook
+, pythonOlder
+, tox
+, typing-extensions
+, virtualenv
+}:
+
+buildPythonPackage rec {
+  pname = "nox";
+  version = "2023.04.22";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "wntrblm";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-WuyNp3jxIktI72zbk+1CK8xflTKrYE5evn/gVdMx+cQ=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    argcomplete
+    colorlog
+    packaging
+    virtualenv
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+    importlib-metadata
+  ];
+
+  checkInputs = [
+    jinja2
+    tox
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "nox"
+  ];
+
+  disabledTestPaths = [
+    # AttributeError: module 'tox.config' has...
+    "tests/test_tox_to_nox.py"
+  ];
+
+  meta = with lib; {
+    description = "Flexible test automation for Python";
+    homepage = "https://nox.thea.codes/";
+    changelog = "https://github.com/wntrblm/nox/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ doronbehar fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nplusone/default.nix b/nixpkgs/pkgs/development/python-modules/nplusone/default.nix
new file mode 100644
index 000000000000..5a31394c2d35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nplusone/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, blinker
+, buildPythonPackage
+, django
+, fetchFromGitHub
+, flake8
+, flask-sqlalchemy
+, isPy27
+, mock
+, peewee
+, pytest-django
+, pytestCheckHook
+, six
+, sqlalchemy
+, webtest
+}:
+
+buildPythonPackage rec {
+  pname = "nplusone";
+  version = "1.0.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "jmcarp";
+    repo = "nplusone";
+    rev = "v${version}";
+    sha256 = "0qdwpvvg7dzmksz3vqkvb27n52lq5sa8i06m7idnj5xk2dgjkdxg";
+  };
+
+  propagatedBuildInputs = [
+    blinker
+    six
+  ];
+
+  nativeCheckInputs = [
+    flake8
+    flask-sqlalchemy
+    mock
+    peewee
+    pytest-django
+    pytestCheckHook
+    sqlalchemy
+    webtest
+  ];
+
+  # The tests assume the source code is in an nplusone/ directory. When using
+  # the Nix sandbox, it will be in a source/ directory instead, making the
+  # tests fail.
+  prePatch = ''
+    substituteInPlace tests/conftest.py \
+      --replace nplusone/tests/conftest source/tests/conftest
+  '';
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace "python_paths" "pythonpath" \
+      --replace "--cov nplusone --cov-report term-missing" ""
+  '';
+
+  disabledTests = [
+    # Tests are out-dated
+    "test_many_to_one"
+    "test_many_to_many"
+    "test_eager_join"
+    "test_eager_subquery"
+    "test_eager_subquery_unused"
+    "test_many_to_many_raise"
+    "test_many_to_many_whitelist_decoy"
+    "test_many_to_one_subquery"
+    "test_many_to_one_reverse_subquery"
+    "test_many_to_many_subquery"
+    "test_many_to_many_reverse_subquery"
+    "test_profile"
+  ];
+
+  pythonImportsCheck = [ "nplusone" ];
+
+  meta = with lib; {
+    description = "Detecting the n+1 queries problem in Python";
+    homepage = "https://github.com/jmcarp/nplusone";
+    maintainers = with maintainers; [ cript0nauta ];
+    license = licenses.mit;
+    broken = lib.versionAtLeast django.version "4";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nptyping/default.nix b/nixpkgs/pkgs/development/python-modules/nptyping/default.nix
new file mode 100644
index 000000000000..883eb00384d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nptyping/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, beartype
+, invoke
+, numpy
+, pandas
+, feedparser
+}:
+
+buildPythonPackage rec {
+  pname = "nptyping";
+  version = "2.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ramonhagenaars";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-hz4YrcvARCAA7TXapmneIwle/F4pzcIYLPSmiFHC0VQ=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    beartype
+    feedparser
+    invoke
+    pandas
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # tries to download data
+    "test_pandas_stubs_fork_is_synchronized"
+  ];
+
+  disabledTestPaths = [
+    # missing pyright import:
+    "tests/test_pyright.py"
+    # can't find mypy stubs for pandas:
+    "tests/test_mypy.py"
+    "tests/pandas_/test_mypy_dataframe.py"
+    # typeguard release broke nptyping compatibility:
+    "tests/test_typeguard.py"
+    # tries to build wheel of package, broken/unnecessary under Nix:
+    "tests/test_wheel.py"
+  ];
+
+  pythonImportsCheck = [
+    "nptyping"
+  ];
+
+  meta = with lib; {
+    description = "Type hints for numpy";
+    homepage = "https://github.com/ramonhagenaars/nptyping";
+    changelog = "https://github.com/ramonhagenaars/nptyping/blob/v${version}/HISTORY.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/npyscreen/default.nix b/nixpkgs/pkgs/development/python-modules/npyscreen/default.nix
new file mode 100644
index 000000000000..1e93d54b3a29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/npyscreen/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "npyscreen";
+  version = "4.10.5";
+
+  src = fetchPypi {
+   inherit pname version;
+   sha256 = "0vhjwn0dan3zmffvh80dxb4x67jysvvf1imp6pk4dsfslpwy0bk2";
+  };
+
+  # Tests are outdated
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Framework for developing console applications using Python and curses";
+    homepage = "http://www.npcole.com/npyscreen/";
+    maintainers = with maintainers; [ dump_stack ];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nsapi/default.nix b/nixpkgs/pkgs/development/python-modules/nsapi/default.nix
new file mode 100644
index 000000000000..453eeb2c9519
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nsapi/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, future
+, pythonOlder
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "nsapi";
+  version = "3.0.5";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aquatix";
+    repo = "ns-api";
+    rev = "v${version}";
+    sha256 = "0i1zkvi4mrhkh1gxzpa54mq8mb76s9nf3jxxhpqia56nkq8f8krb";
+  };
+
+  propagatedBuildInputs = [
+    future
+    pytz
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "ns_api" ];
+
+  meta = with lib; {
+    description = "Python module to query routes of the Dutch railways";
+    homepage = "https://github.com/aquatix/ns-api/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nsz/default.nix b/nixpkgs/pkgs/development/python-modules/nsz/default.nix
new file mode 100644
index 000000000000..06cb7a9457b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nsz/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pycryptodome
+, pythonOlder
+, enlighten
+, zstandard
+, withGUI ? true
+, kivy
+}:
+
+buildPythonPackage rec {
+  pname = "nsz";
+  version = "4.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nicoboss";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-/46qOQEuzSBmnFG0XW4z71HAHpuyqhia29KQkUlDsgg=";
+  };
+
+  propagatedBuildInputs = [
+    pycryptodome
+    enlighten
+    zstandard
+  ] ++ lib.optional withGUI kivy;
+
+  # do not check, as nsz requires producation keys
+  # dumped from a Nintendo Switch.
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/nicoboss/nsz";
+    description = "Homebrew compatible NSP/XCI compressor/decompressor";
+    changelog = "https://github.com/nicoboss/nsz/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ eyjhb ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ntc-templates/default.nix b/nixpkgs/pkgs/development/python-modules/ntc-templates/default.nix
new file mode 100644
index 000000000000..e8c1be951a4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ntc-templates/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, poetry-core
+, textfsm
+, pytestCheckHook
+, ruamel-yaml
+, yamllint
+}:
+
+buildPythonPackage rec {
+  pname = "ntc-templates";
+  version = "3.5.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "networktocode";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-FhKMDSAW+MifAy2EnHePbSfY56rdK1SfOe85bFte6ps=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    textfsm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    ruamel-yaml
+    yamllint
+  ];
+
+  # https://github.com/networktocode/ntc-templates/issues/743
+  disabledTests = [
+    "test_raw_data_against_mock"
+    "test_verify_parsed_and_reference_data_exists"
+  ];
+
+  meta = with lib; {
+    description = "TextFSM templates for parsing show commands of network devices";
+    homepage = "https://github.com/networktocode/ntc-templates";
+    changelog = "https://github.com/networktocode/ntc-templates/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ntplib/default.nix b/nixpkgs/pkgs/development/python-modules/ntplib/default.nix
new file mode 100644
index 000000000000..399d27695ad1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ntplib/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "ntplib";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "899d8fb5f8c2555213aea95efca02934c7343df6ace9d7628a5176b176906267";
+  };
+
+  # Require networking
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python NTP library";
+    homepage = "http://code.google.com/p/ntplib/";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nuheat/default.nix b/nixpkgs/pkgs/development/python-modules/nuheat/default.nix
new file mode 100644
index 000000000000..97607ceab3dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nuheat/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, parameterized
+, pytestCheckHook
+, pythonOlder
+, requests
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "nuheat";
+  version = "1.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "broox";
+    repo = "python-nuheat";
+    rev = "refs/tags/${version}";
+    hash = "sha256-EsPuwILfKc1Bpvu0Qos7yooC3dBaqf46lWhiSZdu3sc=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    mock
+    parameterized
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "nuheat"
+  ];
+
+  meta = with lib; {
+    description = "Library to interact with NuHeat Signature and Mapei Mapeheat radiant floor thermostats";
+    homepage = "https://github.com/broox/python-nuheat";
+    changelog = "https://github.com/broox/python-nuheat/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nuitka/darwin-lto.patch b/nixpkgs/pkgs/development/python-modules/nuitka/darwin-lto.patch
new file mode 100644
index 000000000000..bd3a65905498
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nuitka/darwin-lto.patch
@@ -0,0 +1,15 @@
+diff --git a/nuitka/build/SconsCompilerSettings.py b/nuitka/build/SconsCompilerSettings.py
+index 319b72c4e..89d40f2a2 100644
+--- a/nuitka/build/SconsCompilerSettings.py
++++ b/nuitka/build/SconsCompilerSettings.py
+@@ -173,8 +173,8 @@ def _enableLtoSettings(
+         lto_mode = False
+         reason = "known to be not supported (CondaCC)"
+     elif isMacOS() and env.gcc_mode and env.clang_mode:
+-        lto_mode = True
+-        reason = "known to be supported (macOS clang)"
++        lto_mode = False
++        reason = "known to not be supported (macOS nix clang)"
+     elif env.mingw_mode and env.clang_mode:
+         lto_mode = False
+         reason = "known to not be supported (new MinGW64 Clang)"
diff --git a/nixpkgs/pkgs/development/python-modules/nuitka/default.nix b/nixpkgs/pkgs/development/python-modules/nuitka/default.nix
new file mode 100644
index 000000000000..fee04a0e40f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nuitka/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, ccache
+, fetchFromGitHub
+, isPyPy
+, ordered-set
+, python3
+, setuptools
+, zstandard
+}:
+
+buildPythonPackage rec {
+  pname = "nuitka";
+  version = "1.8.4";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "Nuitka";
+    repo = "Nuitka";
+    rev = version;
+    hash = "sha256-spa3V9KEjqmwnHSuxLLIu9hJk5PrRwNyOw72sfxBVKo=";
+  };
+
+  # default lto off for darwin
+  patches = [ ./darwin-lto.patch ];
+
+  nativeBuildInputs = [ setuptools ];
+  nativeCheckInputs = [ ccache  ];
+
+  propagatedBuildInputs = [
+    ordered-set
+    zstandard
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    ${python3.interpreter} tests/basics/run_all.py search
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "nuitka" ];
+
+  # Requires CPython
+  disabled = isPyPy;
+
+  meta = with lib; {
+    description = "Python compiler with full language support and CPython compatibility";
+    license = licenses.asl20;
+    homepage = "https://nuitka.net/";
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nulltype/default.nix b/nixpkgs/pkgs/development/python-modules/nulltype/default.nix
new file mode 100644
index 000000000000..f04f9df780dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nulltype/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "nulltype";
+  version = "2.3.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "0wpjbsmm0c9ifg9y6cnfz49qq9pa5f99nnqp6wdlv42ymfr3rak4";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "nulltype"
+  ];
+
+  meta = with lib; {
+    description = "Python library to handle Null values and sentinels like (but not) None, False and True";
+    homepage = "https://pypi.org/project/nulltype/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/num2words/default.nix b/nixpkgs/pkgs/development/python-modules/num2words/default.nix
new file mode 100644
index 000000000000..c43cb81eb2fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/num2words/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, docopt
+, delegator-py
+, pytest
+}:
+
+buildPythonPackage rec {
+  version = "0.5.13";
+  pname = "num2words";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-owZHFvu/kNdcRJRQzr+8c6ahPmOyUx0JvezDqxoiCc8=";
+  };
+
+  propagatedBuildInputs = [ docopt ];
+
+  nativeCheckInputs = [ delegator-py pytest ];
+
+  checkPhase = ''
+    pytest -k 'not cli_with_lang'
+  '';
+
+  meta = with lib; {
+    description = "Modules to convert numbers to words. 42 --> forty-two";
+    homepage = "https://github.com/savoirfairelinux/num2words";
+    license = licenses.lgpl21;
+    maintainers = with maintainers; [ jonringer ];
+
+    longDescription =
+    "num2words is a library that converts numbers like 42 to words like forty-two. It supports multiple languages (see the list below for full list of languages) and can even generate ordinal numbers like forty-second";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/numba-scipy/default.nix b/nixpkgs/pkgs/development/python-modules/numba-scipy/default.nix
new file mode 100644
index 000000000000..c4c37b7ad333
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numba-scipy/default.nix
@@ -0,0 +1,50 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, scipy
+, numba
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "numba-scipy";
+  version = "0.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-cApTGH5GJZH/RbkRjKhL3injvixD5kvfaS49FjrPA2U=";
+  };
+
+  propagatedBuildInputs = [
+    scipy
+    numba
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pythonRelaxDepsHook
+  ];
+  pythonRelaxDeps = [
+    "scipy"
+    "numba"
+  ];
+
+  pythonImportsCheck = [
+    "numba_scipy"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Extends Numba to make it aware of SciPy";
+    homepage = "https://github.com/numba/numba-scipy";
+    changelog = "https://github.com/numba/numba-scipy/blob/master/CHANGE_LOG";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ Etjean ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/numba/cuda_path.patch b/nixpkgs/pkgs/development/python-modules/numba/cuda_path.patch
new file mode 100644
index 000000000000..73f38e283d8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numba/cuda_path.patch
@@ -0,0 +1,79 @@
+diff --git a/numba/cuda/cuda_paths.py b/numba/cuda/cuda_paths.py
+index d195bbc29..0699b365b 100644
+--- a/numba/cuda/cuda_paths.py
++++ b/numba/cuda/cuda_paths.py
+@@ -24,11 +24,7 @@ def _find_valid_path(options):
+ 
+ def _get_libdevice_path_decision():
+     options = [
+-        ('Conda environment', get_conda_ctk()),
+-        ('Conda environment (NVIDIA package)', get_nvidia_libdevice_ctk()),
+-        ('CUDA_HOME', get_cuda_home('nvvm', 'libdevice')),
+-        ('System', get_system_ctk('nvvm', 'libdevice')),
+-        ('Debian package', get_debian_pkg_libdevice()),
++        ('Nix store', get_nix_ctk('nvvm', 'libdevice')),
+     ]
+     by, libdir = _find_valid_path(options)
+     return by, libdir
+@@ -36,17 +32,14 @@ def _get_libdevice_path_decision():
+ 
+ def _nvvm_lib_dir():
+     if IS_WIN32:
+-        return 'nvvm', 'bin'
++        return 'bin',
+     else:
+-        return 'nvvm', 'lib64'
++        return 'lib64',
+ 
+ 
+ def _get_nvvm_path_decision():
+     options = [
+-        ('Conda environment', get_conda_ctk()),
+-        ('Conda environment (NVIDIA package)', get_nvidia_nvvm_ctk()),
+-        ('CUDA_HOME', get_cuda_home(*_nvvm_lib_dir())),
+-        ('System', get_system_ctk(*_nvvm_lib_dir())),
++        ('Nix store', get_nix_ctk(*_nvvm_lib_dir())),
+     ]
+     by, path = _find_valid_path(options)
+     return by, path
+@@ -66,7 +59,7 @@ def _cudalib_path():
+     if IS_WIN32:
+         return 'bin'
+     else:
+-        return 'lib64'
++        return 'lib'
+ 
+ 
+ def _cuda_home_static_cudalib_path():
+@@ -78,10 +71,7 @@ def _cuda_home_static_cudalib_path():
+ 
+ def _get_cudalib_dir_path_decision():
+     options = [
+-        ('Conda environment', get_conda_ctk()),
+-        ('Conda environment (NVIDIA package)', get_nvidia_cudalib_ctk()),
+-        ('CUDA_HOME', get_cuda_home(_cudalib_path())),
+-        ('System', get_system_ctk(_cudalib_path())),
++        ('Nix store', get_nix_lib_ctk(_cudalib_path())),
+     ]
+     by, libdir = _find_valid_path(options)
+     return by, libdir
+@@ -239,3 +229,19 @@ def get_debian_pkg_libdevice():
+     if not os.path.exists(pkg_libdevice_location):
+         return None
+     return pkg_libdevice_location
++
++
++def get_nix_ctk(*subdirs):
++    """Return path to nix store cudatoolkit; or, None if it doesn't exist.
++    """
++    base = '@cuda_toolkit_path@'
++    if os.path.exists(base):
++        return os.path.join(base, *subdirs)
++
++
++def get_nix_lib_ctk(*subdirs):
++    """Return path to nix store cudatoolkit-lib; or, None if it doesn't exist.
++    """
++    base = '@cuda_toolkit_lib_path@'
++    if os.path.exists(base):
++        return os.path.join(base, *subdirs)
diff --git a/nixpkgs/pkgs/development/python-modules/numba/default.nix b/nixpkgs/pkgs/development/python-modules/numba/default.nix
new file mode 100644
index 000000000000..cbf8fa40d78c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numba/default.nix
@@ -0,0 +1,130 @@
+{ lib
+, stdenv
+, pythonAtLeast
+, pythonOlder
+, fetchFromGitHub
+, python
+, buildPythonPackage
+, setuptools
+, numpy
+, llvmlite
+, libcxx
+, importlib-metadata
+, substituteAll
+, runCommand
+
+, config
+
+# CUDA-only dependencies:
+, addOpenGLRunpath ? null
+, cudaPackages ? {}
+
+# CUDA flags:
+, cudaSupport ? config.cudaSupport
+}:
+
+let
+  inherit (cudaPackages) cudatoolkit;
+in buildPythonPackage rec {
+  # Using an untagged version, with numpy 1.25 support, when it's released
+  # also drop the versioneer patch in postPatch
+  version = "0.58.1";
+  pname = "numba";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8" || pythonAtLeast "3.12";
+
+  src = fetchFromGitHub {
+    owner = "numba";
+    repo = "numba";
+    rev = "refs/tags/${version}";
+    # Upstream uses .gitattributes to inject information about the revision
+    # hash and the refname into `numba/_version.py`, see:
+    #
+    # - https://git-scm.com/docs/gitattributes#_export_subst and
+    # - https://github.com/numba/numba/blame/5ef7c86f76a6e8cc90e9486487294e0c34024797/numba/_version.py#L25-L31
+    #
+    # Hence this hash may change if GitHub / Git will change it's behavior.
+    # Hopefully this will not happen until the next release. We are fairly sure
+    # that upstream relies on those strings to be valid, that's why we don't
+    # use `forceFetchGit = true;`.` If in the future we'll observe the hash
+    # changes too often, we can always use forceFetchGit, and inject the
+    # relevant strings ourselves, using `sed` commands, in extraPostFetch.
+    hash = "sha256-1Tj2GFoUwRRCWBFxhreF+0Mr+Tjyb7+X4peO+T0qGNs=";
+  };
+  env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.isDarwin "-I${lib.getDev libcxx}/include/c++/v1";
+
+  nativeBuildInputs = [
+    numpy
+  ] ++ lib.optionals cudaSupport [
+    addOpenGLRunpath
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    llvmlite
+    setuptools
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-metadata
+  ] ++ lib.optionals cudaSupport [
+    cudatoolkit
+    cudatoolkit.lib
+  ];
+
+  patches = lib.optionals cudaSupport [
+    (substituteAll {
+      src = ./cuda_path.patch;
+      cuda_toolkit_path = cudatoolkit;
+      cuda_toolkit_lib_path = cudatoolkit.lib;
+    })
+  ];
+
+  postFixup = lib.optionalString cudaSupport ''
+    find $out -type f \( -name '*.so' -or -name '*.so.*' \) | while read lib; do
+      addOpenGLRunpath "$lib"
+      patchelf --set-rpath "${cudatoolkit}/lib:${cudatoolkit.lib}/lib:$(patchelf --print-rpath "$lib")" "$lib"
+    done
+  '';
+
+  # run a smoke test in a temporary directory so that
+  # a) Python picks up the installed library in $out instead of the build files
+  # b) we have somewhere to put $HOME so some caching tests work
+  # c) it doesn't take 6 CPU hours for the full suite
+  checkPhase = ''
+    runHook preCheck
+
+    pushd $(mktemp -d)
+    HOME=. ${python.interpreter} -m numba.runtests -m $NIX_BUILD_CORES numba.tests.test_usecases
+    popd
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "numba"
+  ];
+
+  passthru.tests = {
+    # CONTRIBUTOR NOTE: numba also contains CUDA tests, though these cannot be run in
+    # this sandbox environment. Consider running similar commands to those below outside the
+    # sandbox manually if you have the appropriate hardware; support will be detected
+    # and the corresponding tests enabled automatically.
+    # Also, the full suite currently does not complete on anything but x86_64-linux.
+    fullSuite = runCommand "${pname}-test" {} ''
+      pushd $(mktemp -d)
+      # pip and python in $PATH is needed for the test suite to pass fully
+      PATH=${python.withPackages (p: [ p.numba p.pip ])}/bin:$PATH
+      HOME=$PWD python -m numba.runtests -m $NIX_BUILD_CORES
+      popd
+      touch $out # stop Nix from complaining no output was generated and failing the build
+    '';
+  };
+
+  meta =  with lib; {
+    description = "Compiling Python code using LLVM";
+    homepage = "https://numba.pydata.org/";
+    license = licenses.bsd2;
+    mainProgram = "numba";
+    maintainers = with maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/numcodecs/default.nix b/nixpkgs/pkgs/development/python-modules/numcodecs/default.nix
new file mode 100644
index 000000000000..d5722053c6e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numcodecs/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, setuptools
+, setuptools-scm
+, cython
+, entrypoints
+, numpy
+, msgpack
+, py-cpuinfo
+, pytestCheckHook
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "numcodecs";
+  version = "0.11.0";
+  format ="pyproject";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bAWLMh3oShcpKZsOrk1lKy5I6hyn+d8NplyxNHDmNes=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    cython
+    py-cpuinfo
+  ];
+
+  propagatedBuildInputs = [
+    entrypoints
+    numpy
+    msgpack
+  ];
+
+  preBuild = if (stdenv.hostPlatform.isx86 && !stdenv.hostPlatform.avx2Support) then ''
+    export DISABLE_NUMCODECS_AVX2=
+  '' else null;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "$out/${python.sitePackages}/numcodecs"
+  ];
+
+  disabledTests = [
+    "test_backwards_compatibility"
+
+    "test_encode_decode"
+    "test_legacy_codec_broken"
+    "test_bytes"
+
+    # ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (3,) + inhomogeneous part.
+    # with numpy 1.24
+    "test_non_numpy_inputs"
+  ];
+
+  meta = with lib;{
+    homepage = "https://github.com/zarr-developers/numcodecs";
+    license = licenses.mit;
+    description = "Buffer compression and transformation codecs for use in data storage and communication applications";
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/numdifftools/default.nix b/nixpkgs/pkgs/development/python-modules/numdifftools/default.nix
new file mode 100644
index 000000000000..fced2ae4cead
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numdifftools/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, pytestCheckHook
+, pythonOlder
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "numdifftools";
+  version = "0.9.41";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pbrod";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-HYacLaowSDdrwkxL1h3h+lw/8ahzaecpXEnwrCqMCWk=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+  ];
+
+  # Tests requires algopy and other modules which are optional and/or not available
+  doCheck = false;
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner"' ""
+    # Remove optional dependencies
+    substituteInPlace requirements.txt \
+      --replace "algopy>=0.4" "" \
+      --replace "statsmodels>=0.6" ""
+  '';
+
+  pythonImportsCheck = [
+    "numdifftools"
+  ];
+
+  meta = with lib; {
+    description = "Library to solve automatic numerical differentiation problems in one or more variables";
+    homepage = "https://github.com/pbrod/numdifftools";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/numericalunits/default.nix b/nixpkgs/pkgs/development/python-modules/numericalunits/default.nix
new file mode 100644
index 000000000000..64d6d291633e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numericalunits/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  version = "1.25";
+  pname = "numericalunits";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c32a482adae818a1a8d6c799bf9fb153326461d490c0de9deab9c694a6537eec";
+  };
+
+  disabled = !isPy3k;
+
+  meta = with lib; {
+    homepage = "http://pypi.python.org/pypi/numericalunits";
+    description = "A package that lets you define quantities with unit";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/numexpr/default.nix b/nixpkgs/pkgs/development/python-modules/numexpr/default.nix
new file mode 100644
index 000000000000..6acc3e53f4e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numexpr/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, packaging
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "numexpr";
+  version = "2.8.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Yzb426P0VuQaT/w8l+tj2JxzWJ/24XBxQSJLkwJjJg0=";
+  };
+
+  nativeBuildInputs = [
+    numpy
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    packaging
+  ];
+
+  preBuild = ''
+    # Remove existing site.cfg, use the one we built for numpy
+    ln -s ${numpy.cfg} site.cfg
+  '';
+
+  checkPhase = ''
+    runtest="$(pwd)/numexpr/tests/test_numexpr.py"
+    pushd "$out"
+    ${python.interpreter} "$runtest"
+    popd
+  '';
+
+  pythonImportsCheck = [
+    "numexpr"
+  ];
+
+  meta = with lib; {
+    description = "Fast numerical array expression evaluator for NumPy";
+    homepage = "https://github.com/pydata/numexpr";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/numpy-stl/default.nix b/nixpkgs/pkgs/development/python-modules/numpy-stl/default.nix
new file mode 100644
index 000000000000..fd2ad5c5e8c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numpy-stl/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, cython
+, enum34
+, fetchPypi
+, nine
+, numpy
+, pytestCheckHook
+, python-utils
+}:
+
+buildPythonPackage rec {
+  pname = "numpy-stl";
+  version = "3.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3U2ho3nSYy8WhRi+jc2c3dftxsMjgJT9jSFHazWGoLw=";
+  };
+
+  propagatedBuildInputs = [
+    cython
+    enum34
+    nine
+    numpy
+    python-utils
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "stl" ];
+
+  meta = with lib; {
+    description = "Library to make reading, writing and modifying both binary and ascii STL files easy";
+    homepage = "https://github.com/WoLpH/numpy-stl/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/numpy/default.nix b/nixpkgs/pkgs/development/python-modules/numpy/default.nix
new file mode 100644
index 000000000000..82ceee47d066
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numpy/default.nix
@@ -0,0 +1,175 @@
+{ lib
+, stdenv
+, fetchPypi
+, python
+, pythonAtLeast
+, pythonOlder
+, buildPythonPackage
+, writeTextFile
+
+# build-system
+, cython_3
+, gfortran
+, meson-python
+, pkg-config
+, xcbuild
+
+# native dependencies
+, blas
+, lapack
+
+# tests
+, hypothesis
+, pytest-xdist
+, pytestCheckHook
+, setuptools
+, typing-extensions
+}:
+
+assert (!blas.isILP64) && (!lapack.isILP64);
+
+let
+  cfg = writeTextFile {
+    name = "site.cfg";
+    text = lib.generators.toINI {} {
+      ${blas.implementation} = {
+        include_dirs = "${lib.getDev blas}/include:${lib.getDev lapack}/include";
+        library_dirs = "${blas}/lib:${lapack}/lib";
+        runtime_library_dirs = "${blas}/lib:${lapack}/lib";
+        libraries = "lapack,lapacke,blas,cblas";
+      };
+      lapack = {
+        include_dirs = "${lib.getDev lapack}/include";
+        library_dirs = "${lapack}/lib";
+        runtime_library_dirs = "${lapack}/lib";
+      };
+      blas = {
+        include_dirs = "${lib.getDev blas}/include";
+        library_dirs = "${blas}/lib";
+        runtime_library_dirs = "${blas}/lib";
+      };
+    };
+  };
+in buildPythonPackage rec {
+  pname = "numpy";
+  version = "1.26.1";
+  pyproject = true;
+  disabled = pythonOlder "3.9" || pythonAtLeast "3.13";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "tar.gz";
+    hash = "sha256-yMbHLUqfgx8yjvsTEmQqHK+vqoiYHZq3Y2jVDQfZPL4=";
+  };
+
+  patches = [
+    # Disable `numpy/core/tests/test_umath.py::TestComplexFunctions::test_loss_of_precision[complex256]`
+    # on x86_64-darwin because it fails under Rosetta 2 due to issues with trig functions and
+    # 80-bit long double complex numbers.
+    ./disable-failing-long-double-test-Rosetta-2.patch
+  ]
+  # We patch cpython/distutils to fix https://bugs.python.org/issue1222585
+  # Patching of numpy.distutils is needed to prevent it from undoing the
+  # patch to distutils.
+  ++ lib.optionals python.hasDistutilsCxxPatch [
+    ./numpy-distutils-C++.patch
+  ];
+
+  postPatch = ''
+    # fails with multiple errors because we are not using the pinned setuptools version
+    # see https://github.com/numpy/numpy/blob/v1.25.0/pyproject.toml#L7
+    #   error: option --single-version-externally-managed not recognized
+    #   TypeError: dist must be a Distribution instance
+    rm numpy/core/tests/test_cython.py
+
+    patchShebangs numpy/_build_utils/*.py
+  '';
+
+  nativeBuildInputs = [
+    cython_3
+    gfortran
+    meson-python
+    pkg-config
+  ] ++ lib.optionals (stdenv.isDarwin) [
+    xcbuild.xcrun
+  ];
+
+  buildInputs = [
+    blas
+    lapack
+  ];
+
+  # Causes `error: argument unused during compilation: '-fno-strict-overflow'` due to `-Werror`.
+  hardeningDisable = lib.optionals stdenv.cc.isClang [ "strictoverflow" ];
+
+  # we default openblas to build with 64 threads
+  # if a machine has more than 64 threads, it will segfault
+  # see https://github.com/xianyi/OpenBLAS/issues/2993
+  preConfigure = ''
+    sed -i 's/-faltivec//' numpy/distutils/system_info.py
+    export OMP_NUM_THREADS=$((NIX_BUILD_CORES > 64 ? 64 : NIX_BUILD_CORES))
+  '';
+
+  preBuild = ''
+    ln -s ${cfg} site.cfg
+  '';
+
+  enableParallelBuilding = true;
+
+  nativeCheckInputs = [
+    pytest-xdist
+    pytestCheckHook
+    hypothesis
+    setuptools
+    typing-extensions
+  ];
+
+  preCheck = ''
+    cd "$out"
+  '';
+
+  # https://github.com/numpy/numpy/blob/a277f6210739c11028f281b8495faf7da298dbef/numpy/_pytesttester.py#L180
+  pytestFlagsArray = [
+    "-m" "not\\ slow" # fast test suite
+  ];
+
+  # https://github.com/numpy/numpy/issues/24548
+  disabledTests = lib.optionals stdenv.isi686 [
+    "test_new_policy" # AssertionError: assert False
+    "test_identityless_reduction_huge_array" # ValueError: Maximum allowed dimension exceeded
+    "test_float_remainder_overflow" # AssertionError: FloatingPointError not raised by divmod
+    "test_int" # AssertionError: selectedintkind(19): expected 16 but got -1
+  ] ++ lib.optionals stdenv.isAarch32 [
+    "test_impossible_feature_enable" # AssertionError: Failed to generate error
+    "test_features" # AssertionError: Failure Detection
+    "test_new_policy" # AssertionError: assert False
+    "test_identityless_reduction_huge_array" # ValueError: Maximum allowed dimension exceeded
+    "test_unary_spurious_fpexception"#  AssertionError: Got warnings: [<warnings.WarningMessage object at 0xd1197430>]
+    "test_int" # AssertionError: selectedintkind(19): expected 16 but got -1
+    "test_real" # AssertionError: selectedrealkind(16): expected 10 but got -1
+    "test_quad_precision" # AssertionError: selectedrealkind(32): expected 16 but got -1
+    "test_big_arrays" # ValueError: array is too big; `arr.size * arr.dtype.itemsize` is larger tha...
+    "test_multinomial_pvals_float32" # Failed: DID NOT RAISE <class 'ValueError'>
+  ] ++ lib.optionals stdenv.isAarch64 [
+    "test_big_arrays" # OOM on a 16G machine
+  ];
+
+  passthru = {
+    # just for backwards compatibility
+    blas = blas.provider;
+    blasImplementation = blas.implementation;
+    inherit cfg;
+  };
+
+  # Disable test
+  # - test_large_file_support: takes a long time and can cause the machine to run out of disk space
+  env.NOSE_EXCLUDE = "test_large_file_support";
+
+  meta = {
+    changelog = "https://github.com/numpy/numpy/releases/tag/v${version}";
+    description = "Scientific tools for Python";
+    homepage = "https://numpy.org/";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/numpy/disable-failing-long-double-test-Rosetta-2.patch b/nixpkgs/pkgs/development/python-modules/numpy/disable-failing-long-double-test-Rosetta-2.patch
new file mode 100644
index 000000000000..3e446745f58c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numpy/disable-failing-long-double-test-Rosetta-2.patch
@@ -0,0 +1,23 @@
+diff --git a/numpy/core/tests/test_umath.py b/numpy/core/tests/test_umath.py
+index 6951d41e4..eefe86ad4 100644
+--- a/numpy/core/tests/test_umath.py
++++ b/numpy/core/tests/test_umath.py
+@@ -4180,7 +4180,17 @@ def test_against_cmath(self):
+     )
+     @pytest.mark.xfail(IS_MUSL, reason="gh23049")
+     @pytest.mark.xfail(IS_WASM, reason="doesn't work")
+-    @pytest.mark.parametrize('dtype', [np.complex64, np.complex_, np.longcomplex])
++    @pytest.mark.parametrize('dtype', [
++        np.complex64,
++        np.complex_,
++        pytest.param(
++            np.longcomplex,
++            marks=pytest.mark.skipif(
++                sys.platform == "darwin" and platform.machine() == "x86_64",
++                reason="doesn’t work under Rosetta 2",
++            ),
++        ),
++    ])
+     def test_loss_of_precision(self, dtype):
+         """Check loss of precision in complex arc* functions"""
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/numpy/numpy-distutils-C++.patch b/nixpkgs/pkgs/development/python-modules/numpy/numpy-distutils-C++.patch
new file mode 100644
index 000000000000..6c75f34ce07a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numpy/numpy-distutils-C++.patch
@@ -0,0 +1,30 @@
+diff --git a/numpy/distutils/unixccompiler.py b/numpy/distutils/unixccompiler.py
+--- a/numpy/distutils/unixccompiler.py
++++ b/numpy/distutils/unixccompiler.py
+@@ -37,8 +37,6 @@ def UnixCCompiler__compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts
+         if opt not in llink_s:
+             self.linker_so = llink_s.split() + opt.split()
+ 
+-    display = '%s: %s' % (os.path.basename(self.compiler_so[0]), src)
+-
+     # gcc style automatic dependencies, outputs a makefile (-MF) that lists
+     # all headers needed by a c file as a side effect of compilation (-MMD)
+     if getattr(self, '_auto_depends', False):
+@@ -47,8 +45,15 @@ def UnixCCompiler__compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts
+         deps = []
+ 
+     try:
+-        self.spawn(self.compiler_so + cc_args + [src, '-o', obj] + deps +
+-                   extra_postargs, display = display)
++        if self.detect_language(src) == 'c++':
++            display = '%s: %s' % (os.path.basename(self.compiler_so_cxx[0]), src)
++            self.spawn(self.compiler_so_cxx + cc_args + [src, '-o', obj] + deps +
++                       extra_postargs, display = display)
++        else:
++            display = '%s: %s' % (os.path.basename(self.compiler_so[0]), src)
++            self.spawn(self.compiler_so + cc_args + [src, '-o', obj] + deps +
++                       extra_postargs, display = display)
++
+     except DistutilsExecError as e:
+         msg = str(e)
+         raise CompileError(msg)
diff --git a/nixpkgs/pkgs/development/python-modules/numpydoc/default.nix b/nixpkgs/pkgs/development/python-modules/numpydoc/default.nix
new file mode 100644
index 000000000000..f189c16eafb2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numpydoc/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, jinja2
+, sphinx
+, pytestCheckHook
+, matplotlib
+}:
+
+buildPythonPackage rec {
+  pname = "numpydoc";
+  version = "1.5.0";
+  format = "setuptools";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname;
+    inherit version;
+    hash = "sha256-sNt7daMjZ6DiXCOzl4QsZeNEoSBlJNFsgGnwockbX0w=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "Jinja2>=2.10,<3.1" "Jinja2>=2.10,<3.2"
+    substituteInPlace setup.cfg \
+      --replace "--cov-report=" "" \
+      --replace "--cov=numpydoc" ""
+  '';
+
+  propagatedBuildInputs = [
+    jinja2
+    sphinx
+  ];
+
+  nativeCheckInputs = [
+    matplotlib
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # https://github.com/numpy/numpydoc/issues/373
+    "test_MyClass"
+    "test_my_function"
+    "test_reference"
+  ];
+
+  pythonImportsCheck = [
+    "numpydoc"
+  ];
+
+  meta = {
+    description = "Sphinx extension to support docstrings in Numpy format";
+    homepage = "https://github.com/numpy/numpydoc";
+    license = lib.licenses.free;
+   };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/numpyro/default.nix b/nixpkgs/pkgs/development/python-modules/numpyro/default.nix
new file mode 100644
index 000000000000..612be673dbc1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/numpyro/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, jax
+, jaxlib
+, multipledispatch
+, numpy
+, tqdm
+, funsor
+, pytestCheckHook
+# TODO: uncomment when tensorflow-probability gets fixed.
+# , tensorflow-probability
+}:
+
+buildPythonPackage rec {
+  pname = "numpyro";
+  version = "0.13.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    inherit version pname;
+    hash = "sha256-Um8LFVGAlMeOaN9uMwycHJzqEnTaxp8FYXIk+m2VTug=";
+  };
+
+  propagatedBuildInputs = [
+    jax
+    jaxlib
+    multipledispatch
+    numpy
+    tqdm
+  ];
+
+  nativeCheckInputs = [
+    funsor
+    pytestCheckHook
+    # TODO: uncomment when tensorflow-probability gets fixed.
+    # tensorflow-probability
+  ];
+
+  pythonImportsCheck = [
+    "numpyro"
+  ];
+
+  disabledTests = [
+    # AssertionError due to tolerance issues
+    "test_beta_binomial_log_prob"
+    "test_collapse_beta"
+    "test_cpu"
+    "test_gamma_poisson"
+    "test_gof"
+    "test_hpdi"
+    "test_kl_dirichlet_dirichlet"
+    "test_kl_univariate"
+    "test_mean_var"
+    # Tests want to download data
+    "data_load"
+    "test_jsb_chorales"
+    # RuntimeWarning: overflow encountered in cast
+    "test_zero_inflated_logits_probs_agree"
+    # NameError: unbound axis name: _provenance
+    "test_model_transformation"
+  ];
+
+  # TODO: remove when tensorflow-probability gets fixed.
+  disabledTestPaths = [
+    "test/test_distributions.py"
+  ];
+
+  meta = with lib; {
+    description = "Library for probabilistic programming with NumPy";
+    homepage = "https://num.pyro.ai/";
+    changelog = "https://github.com/pyro-ppl/numpyro/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nunavut/default.nix b/nixpkgs/pkgs/development/python-modules/nunavut/default.nix
new file mode 100644
index 000000000000..52a6d1c18259
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nunavut/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, importlib-resources
+, pydsdl
+, pyyaml
+}:
+
+ buildPythonPackage rec {
+  pname = "nunavut";
+  version = "2.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-23C3biUUs10Po5qzn3EFaq4+HeWCXIC6WzxOKy59VgM=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "pydsdl ~= 1.16" "pydsdl"
+  '';
+
+  propagatedBuildInputs = [
+    importlib-resources
+    pydsdl
+    pyyaml
+  ];
+
+  # allow for writable directory for darwin
+  preBuild = ''
+    export HOME=$TMPDIR
+  '';
+
+  # No tests in pypy package and no git tags yet for release versions, see
+  # https://github.com/UAVCAN/nunavut/issues/182
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "nunavut"
+  ];
+
+  meta = with lib; {
+    description = "A UAVCAN DSDL template engine";
+    longDescription = ''
+      It exposes a pydsdl abstract syntax tree to Jinja2 templates allowing
+      authors to generate code, schemas, metadata, documentation, etc.
+    '';
+    homepage = "https://nunavut.readthedocs.io/";
+    changelog = "https://github.com/OpenCyphal/nunavut/releases/tag/${version}";
+    maintainers = with maintainers; [ wucke13 ];
+    license = with licenses; [ bsd3 mit ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nutils/default.nix b/nixpkgs/pkgs/development/python-modules/nutils/default.nix
new file mode 100644
index 000000000000..421131e7f8e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nutils/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, treelog
+, stringly
+, flit-core
+, bottombar
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "nutils";
+  version = "8.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "evalf";
+    repo = "nutils";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-6VvzUKKUB5SkmvC7PFPqGayc51t3PTMPwrxgZI5+jHA=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    treelog
+    stringly
+    bottombar
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "nutils"
+  ];
+
+  disabledTestPaths = [
+    # AttributeError: type object 'setup' has no attribute '__code__'
+    "tests/test_cli.py"
+  ];
+
+  meta = with lib; {
+    description = "Numerical Utilities for Finite Element Analysis";
+    changelog = "https://github.com/evalf/nutils/releases/tag/v${version}";
+    homepage = "https://www.nutils.org/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Scriptkiddi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nvchecker/default.nix b/nixpkgs/pkgs/development/python-modules/nvchecker/default.nix
new file mode 100644
index 000000000000..ca327c3e54e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nvchecker/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, aiohttp
+, platformdirs
+, buildPythonPackage
+, docutils
+, fetchFromGitHub
+, flaky
+, installShellFiles
+, packaging
+, pycurl
+, pytest-asyncio
+, pytest-httpbin
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, structlog
+, tomli
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "nvchecker";
+  version = "2.12";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "lilydjwg";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-6mhVDC2jpIIOZeoKz4AxxU7jj8dqPVBKRWupbuY/T7E=";
+  };
+
+  nativeBuildInputs = [
+    docutils
+    installShellFiles
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    platformdirs
+    packaging
+    pycurl
+    setuptools
+    structlog
+    tornado
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    flaky
+    pytest-asyncio
+    pytest-httpbin
+    pytestCheckHook
+  ];
+
+  postBuild = ''
+    patchShebangs docs/myrst2man.py
+    make -C docs man
+  '';
+
+  postInstall = ''
+    installManPage docs/_build/man/nvchecker.1
+  '';
+
+  pythonImportsCheck = [
+    "nvchecker"
+  ];
+
+  pytestFlagsArray = [
+    "-m 'not needs_net'"
+  ];
+
+  meta = with lib; {
+    description = "New version checker for software";
+    homepage = "https://github.com/lilydjwg/nvchecker";
+    changelog = "https://github.com/lilydjwg/nvchecker/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nvidia-ml-py/0001-locate-libnvidia-ml.so.1-on-NixOS.patch b/nixpkgs/pkgs/development/python-modules/nvidia-ml-py/0001-locate-libnvidia-ml.so.1-on-NixOS.patch
new file mode 100644
index 000000000000..3db9030c0ee5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nvidia-ml-py/0001-locate-libnvidia-ml.so.1-on-NixOS.patch
@@ -0,0 +1,17 @@
+diff --git a/pynvml.py b/pynvml.py
+index 9a424de..669afe0 100644
+--- a/pynvml.py
++++ b/pynvml.py
+@@ -1676,7 +1676,11 @@ def _LoadNvmlLibrary():
+                             nvmlLib = CDLL(os.path.join(os.getenv("ProgramFiles", "C:/Program Files"), "NVIDIA Corporation/NVSMI/nvml.dll"))
+                     else:
+                         # assume linux
+-                        nvmlLib = CDLL("libnvidia-ml.so.1")
++                        try:
++                            nvmlLib = CDLL("libnvidia-ml.so.1")
++                        except OSError:
++                            # Assume NixOS
++                            nvmlLib = CDLL("/run/opengl-driver/lib/libnvidia-ml.so.1")
+                 except OSError as ose:
+                     _nvmlCheckReturn(NVML_ERROR_LIBRARY_NOT_FOUND)
+                 if (nvmlLib == None):
diff --git a/nixpkgs/pkgs/development/python-modules/nvidia-ml-py/default.nix b/nixpkgs/pkgs/development/python-modules/nvidia-ml-py/default.nix
new file mode 100644
index 000000000000..a8c327a08076
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nvidia-ml-py/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+}:
+
+buildPythonPackage rec {
+  pname = "nvidia-ml-py";
+  version = "12.535.133";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "tar.gz";
+    hash = "sha256-sVWa8NV90glVv1jQWv/3sWbd1ElH6zBRyZBWOHmesdw=";
+  };
+
+  patches = [
+    ./0001-locate-libnvidia-ml.so.1-on-NixOS.patch
+  ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "pynvml" ];
+
+  meta = {
+    description = "Python Bindings for the NVIDIA Management Library";
+    homepage = "https://pypi.org/project/nvidia-ml-py";
+    license = lib.licenses.bsd3;
+    platforms = [ "x86_64-linux" ];
+    maintainers = with lib.maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nwdiag/default.nix b/nixpkgs/pkgs/development/python-modules/nwdiag/default.nix
new file mode 100644
index 000000000000..a35d6159731a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nwdiag/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, blockdiag
+, fetchFromGitHub
+, buildPythonPackage
+, nose
+, pytestCheckHook
+, setuptools
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "nwdiag";
+  version = "3.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "blockdiag";
+    repo = pname;
+    rev = version;
+    hash = "sha256-uKrdkXpL5YBr953sRsHknYg+2/WwrZmyDf8BMA2+0tU=";
+  };
+
+  propagatedBuildInputs = [
+    blockdiag
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    nose
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "src/nwdiag/tests/"
+  ];
+
+  disabledTests = [
+    # UnicodeEncodeError: 'latin-1' codec can't encode...
+    "test_setup_inline_svg_is_true_with_multibytes"
+  ];
+
+  pythonImportsCheck = [
+    "nwdiag"
+  ];
+
+  meta = with lib; {
+    description = "Generate network-diagram image from spec-text file (similar to Graphviz)";
+    homepage = "http://blockdiag.com/";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/nxt-python/default.nix b/nixpkgs/pkgs/development/python-modules/nxt-python/default.nix
new file mode 100644
index 000000000000..fb953bce13dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/nxt-python/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pybluez
+, pytestCheckHook
+, pythonOlder
+, pyusb
+}:
+
+buildPythonPackage rec {
+  pname = "nxt-python";
+  version = "3.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "schodet";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-PWeR8xteLMxlOHcJJCtTI0o8QNzwGJVkUACmvf4tXWY=";
+  };
+
+  propagatedBuildInputs = [
+    pyusb
+  ];
+
+  passthru.optional-dependencies = {
+    bluetooth = [
+      pybluez
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "nxt"
+  ];
+
+  meta = with lib; {
+    description = "Python driver/interface for Lego Mindstorms NXT robot";
+    homepage = "https://github.com/schodet/nxt-python";
+    changelog = "https://github.com/schodet/nxt-python/releases/tag/${version}";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ ibizaman ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oasatelematics/default.nix b/nixpkgs/pkgs/development/python-modules/oasatelematics/default.nix
new file mode 100644
index 000000000000..c4d7ca121387
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oasatelematics/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "oasatelematics";
+  version = "0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "panosmz";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-3O7XbNVj1S3ZwheklEhm0ivw16Tj7drML/xYC9383Kg=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "oasatelematics"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for the OASA Telematics API";
+    homepage = "https://github.com/panosmz/oasatelematics";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oath/default.nix b/nixpkgs/pkgs/development/python-modules/oath/default.nix
new file mode 100644
index 000000000000..525988d2dd65
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oath/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "oath";
+  version = "1.4.4";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vWsg0g8sTj9TUj7pACEdynWu7KcvT1qf2NyswXX+HAs=";
+  };
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "oath"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of the three main OATH specifications: HOTP, TOTP and OCRA";
+    homepage = "https://github.com/bdauvergne/python-oath";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ aw ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oauth/default.nix b/nixpkgs/pkgs/development/python-modules/oauth/default.nix
new file mode 100644
index 000000000000..c74de8d6bd6e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oauth/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "oauth";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0pdgi35hczsslil4890xqawnbpdazkgf2v1443847h5hy2gq2sg7";
+  };
+
+  # No tests included in archive
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://code.google.com/archive/p/oauth/";
+    description = "Library for OAuth version 1.0a";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oauth2/default.nix b/nixpkgs/pkgs/development/python-modules/oauth2/default.nix
new file mode 100644
index 000000000000..d9c0ae505f71
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oauth2/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, httplib2
+, mock
+, coverage
+}:
+
+buildPythonPackage rec {
+  pname = "oauth2";
+  version = "1.9.0.post1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c006a85e7c60107c7cc6da1b184b5c719f6dd7202098196dfa6e55df669b59bf";
+  };
+
+  propagatedBuildInputs = [ httplib2 ];
+  buildInputs = [ mock coverage ];
+
+  # ServerNotFoundError: Unable to find the server at oauth-sandbox.sevengoslings.net
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/simplegeo/python-oauth2";
+    description = "Library for OAuth version 1.0";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+    platforms = platforms.unix;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oauth2client/default.nix b/nixpkgs/pkgs/development/python-modules/oauth2client/default.nix
new file mode 100644
index 000000000000..dc6e65d95cbf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oauth2client/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi
+, six, httplib2, pyasn1-modules, rsa }:
+
+buildPythonPackage rec {
+  pname = "oauth2client";
+  version = "4.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d486741e451287f69568a4d26d70d9acd73a2bbfa275746c535b4209891cccc6";
+  };
+
+  propagatedBuildInputs = [ six httplib2 pyasn1-modules rsa ];
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A client library for OAuth 2.0";
+    homepage = "https://github.com/google/oauth2client/";
+    license = licenses.bsd2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oauthenticator/default.nix b/nixpkgs/pkgs/development/python-modules/oauthenticator/default.nix
new file mode 100644
index 000000000000..ae8d6737380e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oauthenticator/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, google-api-python-client
+, google-auth-oauthlib
+, jupyterhub
+, mwoauth
+, pyjwt
+, pytest-asyncio
+, pytestCheckHook
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "oauthenticator";
+  version = "16.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-z5CFFfVJYeXaDFVPYaBOfUMzgl+Uvn3LYS5Zn1AHRy0=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=oauthenticator" ""
+  '';
+
+  propagatedBuildInputs = [
+    jupyterhub
+  ];
+
+  passthru.optional-dependencies = {
+    azuread = [
+      pyjwt
+    ];
+    googlegroups = [
+      google-api-python-client
+      google-auth-oauthlib
+    ];
+    mediawiki = [
+      mwoauth
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    requests-mock
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  disabledTests = [
+    # Tests are outdated, https://github.com/jupyterhub/oauthenticator/issues/432
+    "test_azuread"
+    "test_mediawiki"
+  ];
+
+  pythonImportsCheck = [
+    "oauthenticator"
+  ];
+
+  meta = with lib; {
+    description = "Authenticate JupyterHub users with common OAuth providers";
+    homepage =  "https://github.com/jupyterhub/oauthenticator";
+    changelog = "https://github.com/jupyterhub/oauthenticator/blob/${version}/docs/source/reference/changelog.md";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oauthlib/default.nix b/nixpkgs/pkgs/development/python-modules/oauthlib/default.nix
new file mode 100644
index 000000000000..424e35c5d3a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oauthlib/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, blinker
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, mock
+, pyjwt
+, pytestCheckHook
+, pythonOlder
+
+# for passthru.tests
+, django-allauth
+, django-oauth-toolkit
+, google-auth-oauthlib
+, requests-oauthlib
+}:
+
+buildPythonPackage rec {
+  pname = "oauthlib";
+  version = "3.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-KADS1pEaLYi86LEt2VVuz8FVTBANzxC8EeQLgGMxuBU=";
+  };
+
+  propagatedBuildInputs = [
+    blinker
+    cryptography
+    pyjwt
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "oauthlib"
+  ];
+
+  passthru.tests = {
+    inherit
+      django-allauth
+      django-oauth-toolkit
+      google-auth-oauthlib
+      requests-oauthlib;
+  };
+
+  meta = with lib; {
+    description = "Generic, spec-compliant, thorough implementation of the OAuth request-signing logic";
+    homepage = "https://github.com/idan/oauthlib";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ prikhi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/obfsproxy/default.nix b/nixpkgs/pkgs/development/python-modules/obfsproxy/default.nix
new file mode 100644
index 000000000000..5f652cb97f3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/obfsproxy/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchgit
+, pyptlib
+, twisted
+, pycrypto
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "obfsproxy";
+  version = "0.2.13";
+
+  src = fetchgit {
+    url = "https://git.torproject.org/pluggable-transports/obfsproxy.git";
+    rev = "refs/tags/${pname}-${version}";
+    sha256 = "04ja1cl8xzqnwrd2gi6nlnxbmjri141bzwa5gybvr44d8h3k2nfa";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "version=versioneer.get_version()" "version='${version}'"
+    substituteInPlace setup.py --replace "argparse" ""
+  '';
+
+  propagatedBuildInputs = [ pyptlib twisted pycrypto pyyaml ];
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A pluggable transport proxy";
+    homepage = "https://www.torproject.org/projects/obfsproxy";
+    maintainers = with maintainers; [ thoughtpolice ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/objax/default.nix b/nixpkgs/pkgs/development/python-modules/objax/default.nix
new file mode 100644
index 000000000000..be8a3d8327d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/objax/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, jaxlib
+, jax
+, numpy
+, parameterized
+, pillow
+, scipy
+, tensorboard
+, keras
+, pytestCheckHook
+, tensorflow
+}:
+
+buildPythonPackage rec {
+  pname = "objax";
+  version = "1.8.0";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = "objax";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-WD+pmR8cEay4iziRXqF3sHUzCMBjmLJ3wZ3iYOD+hzk=";
+  };
+
+  # Avoid propagating the dependency on `jaxlib`, see
+  # https://github.com/NixOS/nixpkgs/issues/156767
+  buildInputs = [
+    jaxlib
+  ];
+
+  propagatedBuildInputs = [
+    jax
+    numpy
+    parameterized
+    pillow
+    scipy
+    tensorboard
+  ];
+
+  pythonImportsCheck = [
+    "objax"
+  ];
+
+  # This is necessay to ignore the presence of two protobufs version (tensorflow is bringing an
+  # older version).
+  catchConflicts = false;
+
+  nativeCheckInputs = [
+    keras
+    pytestCheckHook
+    tensorflow
+  ];
+
+  pytestFlagsArray = [
+    "tests/*.py"
+  ];
+
+  disabledTests = [
+    # Test requires internet access for prefetching some weights
+    "test_pretrained_keras_weight_0_ResNet50V2"
+  ];
+
+  meta = with lib; {
+    description = "Objax is a machine learning framework that provides an Object Oriented layer for JAX.";
+    homepage = "https://github.com/google/objax";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ndl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/objgraph/default.nix b/nixpkgs/pkgs/development/python-modules/objgraph/default.nix
new file mode 100644
index 000000000000..bd0aa88262df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/objgraph/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, graphviz
+, graphvizPkgs
+, isPyPy
+, python
+, pythonOlder
+, substituteAll
+}:
+
+buildPythonPackage rec {
+  pname = "objgraph";
+  version = "3.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7" || isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NpVnw3tPL5KBYLb27e3L6o/H6SmDGHf9EFbHipAMF9M=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./hardcode-graphviz-path.patch;
+      graphviz = graphvizPkgs;
+    })
+  ];
+
+  passthru.optional-dependencies = {
+    ipython = [
+      graphviz
+    ];
+  };
+
+  pythonImportsCheck = [
+    "objgraph"
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} tests.py
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Draws Python object reference graphs with graphviz";
+    homepage = "https://mg.pov.lt/objgraph/";
+    changelog = "https://github.com/mgedmin/objgraph/blob/${version}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/objgraph/hardcode-graphviz-path.patch b/nixpkgs/pkgs/development/python-modules/objgraph/hardcode-graphviz-path.patch
new file mode 100644
index 000000000000..c5be5de64eed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/objgraph/hardcode-graphviz-path.patch
@@ -0,0 +1,61 @@
+diff --git a/objgraph.py b/objgraph.py
+index 88e307b..0369f49 100755
+--- a/objgraph.py
++++ b/objgraph.py
+@@ -1045,12 +1045,12 @@ def _present_graph(dot_filename, filename=None):
+     if not filename and _program_in_path('xdot'):
+         print("Spawning graph viewer (xdot)")
+         subprocess.Popen(['xdot', dot_filename], close_fds=True)
+-    elif _program_in_path('dot'):
++    elif True: # path to dot is hardcoded and hence always in $PATH
+         if not filename:
+             print("Graph viewer (xdot) not found, generating a png instead")
+             filename = dot_filename[:-4] + '.png'
+         stem, ext = os.path.splitext(filename)
+-        cmd = ['dot', '-T' + ext[1:], '-o' + filename, dot_filename]
++        cmd = ['@graphviz@/bin/dot', '-T' + ext[1:], '-o' + filename, dot_filename]
+         dot = subprocess.Popen(cmd, close_fds=False)
+         dot.wait()
+         if dot.returncode != 0:
+diff --git a/tests.py b/tests.py
+index 7db2888..bdb666e 100755
+--- a/tests.py
++++ b/tests.py
+@@ -557,7 +557,7 @@ class PresentGraphTest(CaptureMixin, TemporaryDirectoryMixin,
+         self.programsInPath(['dot'])
+         objgraph._present_graph('foo.dot', 'bar.png')
+         self.assertOutput("""
+-            subprocess.Popen(['dot', '-Tpng', '-obar.png', 'foo.dot'])
++            subprocess.Popen(['@graphviz@/bin/dot', '-Tpng', '-obar.png', 'foo.dot'])
+             Image generated as bar.png
+         """)
+ 
+@@ -566,11 +566,12 @@ class PresentGraphTest(CaptureMixin, TemporaryDirectoryMixin,
+         objgraph.subprocess.should_fail = True
+         objgraph._present_graph('f.dot', 'b.png')
+         self.assertOutput("""
+-            subprocess.Popen(['dot', '-Tpng', '-ob.png', 'f.dot'])
+-            dot failed (exit code 1) while executing "dot -Tpng -ob.png f.dot"
++            subprocess.Popen(['@graphviz@/bin/dot', '-Tpng', '-ob.png', 'f.dot'])
++            dot failed (exit code 1) while executing "@graphviz@/bin/dot -Tpng -ob.png f.dot"
+         """)
+ 
+-    def test_present_png_no_dot(self):
++    @unittest.skip("empty $PATH has no effect")
++    def no_test_present_png_no_dot(self):
+         self.programsInPath([])
+         objgraph._present_graph('foo.dot', 'bar.png')
+         self.assertOutput("""
+@@ -591,10 +592,11 @@ class PresentGraphTest(CaptureMixin, TemporaryDirectoryMixin,
+         objgraph._present_graph('foo.dot')
+         self.assertOutput("""
+             Graph viewer (xdot) not found, generating a png instead
+-            subprocess.Popen(['dot', '-Tpng', '-ofoo.png', 'foo.dot'])
++            subprocess.Popen(['@graphviz@/bin/dot', '-Tpng', '-ofoo.png', 'foo.dot'])
+             Image generated as foo.png
+         """)
+ 
++    @unittest.skip("empty $PATH has no effect")
+     def test_present_no_xdot_and_no_not(self):
+         self.programsInPath([])
+         objgraph._present_graph('foo.dot')
diff --git a/nixpkgs/pkgs/development/python-modules/objsize/default.nix b/nixpkgs/pkgs/development/python-modules/objsize/default.nix
new file mode 100644
index 000000000000..a002597da50a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/objsize/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "objsize";
+  version = "0.7.0";
+  pyproject= true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "liran-funaro";
+    repo = "objsize";
+    rev = "refs/tags/${version}";
+    hash = "sha256-wy4Tj+Q+4zymRdoN8Z7wcazJTb2lQ+XHY1Kta02R3R0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "objsize"
+  ];
+
+  pytestFlagsArray = [
+    "test_objsize.py"
+  ];
+
+  meta = with lib; {
+    description = "Traversal over objects subtree and calculate the total size";
+    homepage = "https://github.com/liran-funaro/objsize";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ocfox ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/obspy/default.nix b/nixpkgs/pkgs/development/python-modules/obspy/default.nix
new file mode 100644
index 000000000000..0f5f2c003da0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/obspy/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, decorator
+, future
+, lxml
+, matplotlib
+, numpy
+, requests
+, scipy
+, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "obspy";
+  version = "1.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "a0f2b0915beeb597762563fa0358aa1b4d6b09ffda49909c760b5cdf5bdc419e";
+  };
+
+  propagatedBuildInputs = [
+    decorator
+    future
+    lxml
+    matplotlib
+    numpy
+    requests
+    scipy
+    sqlalchemy
+  ];
+
+  # Tests require Internet access.
+  doCheck = false;
+
+  pythonImportsCheck = [ "obspy" ];
+
+  meta = with lib; {
+    description = "Python framework for seismological observatories";
+    homepage = "https://www.obspy.org";
+    license = licenses.lgpl3;
+    maintainers = [ maintainers.ametrine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oca-port/default.nix b/nixpkgs/pkgs/development/python-modules/oca-port/default.nix
new file mode 100644
index 000000000000..7b948c4ffdf3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oca-port/default.nix
@@ -0,0 +1,46 @@
+{ buildPythonPackage
+, click
+, fetchPypi
+, gitpython
+, lib
+, nix-update-script
+, requests
+, setuptools-scm
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "oca-port";
+  version = "0.14";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "oca_port";
+    hash = "sha256-P+uCoC2u5lR4oTtloNFd4N+CjssUa5PbzbnhEulaRoc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    click
+    gitpython
+    requests
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  passthru.updateScript = nix-update-script { };
+
+  pythonImportsCheck = [ "oca_port" ];
+
+  meta = with lib; {
+    description = "Tool helping to port an addon or missing commits of an addon from one branch to another";
+    homepage = "https://github.com/OCA/oca-port";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ yajo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ochre/default.nix b/nixpkgs/pkgs/development/python-modules/ochre/default.nix
new file mode 100644
index 000000000000..e3604446e7e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ochre/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, hypothesis
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ochre";
+  version = "0.4.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "getcuia";
+    repo = "ochre";
+    rev = "v${version}";
+    hash = "sha256-U6qycLnldwNze3XMAn6DS3XGX4RaCZgW0pH/y/FEAkk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "ochre" ];
+
+  meta = with lib; {
+    description = "A down-to-earth approach to colors";
+    homepage = "https://github.com/getcuia/ochre";
+    changelog = "https://github.com/getcuia/ochre/releases/tag/${src.rev}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oci/default.nix b/nixpkgs/pkgs/development/python-modules/oci/default.nix
new file mode 100644
index 000000000000..5101460704fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oci/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, certifi
+, circuitbreaker
+, cryptography
+, fetchFromGitHub
+, pyopenssl
+, python-dateutil
+, pythonOlder
+, pythonRelaxDepsHook
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "oci";
+  version = "2.113.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "oracle";
+    repo = "oci-python-sdk";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Ui7/rD307fSdAPexZF9VU4NC9udjEGcFpjg/Ob6GVvo=";
+  };
+
+  pythonRelaxDeps = [
+    "cryptography"
+    "pyOpenSSL"
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    certifi
+    circuitbreaker
+    cryptography
+    pyopenssl
+    python-dateutil
+    pytz
+  ];
+
+  # Tests fail: https://github.com/oracle/oci-python-sdk/issues/164
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "oci"
+  ];
+
+  meta = with lib; {
+    description = "Oracle Cloud Infrastructure Python SDK";
+    homepage = "https://github.com/oracle/oci-python-sdk";
+    changelog = "https://github.com/oracle/oci-python-sdk/blob/v${version}/CHANGELOG.rst";
+    license = with licenses; [ asl20 /* or */ upl ];
+    maintainers = with maintainers; [ ilian ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ocifs/default.nix b/nixpkgs/pkgs/development/python-modules/ocifs/default.nix
new file mode 100644
index 000000000000..479f2c839648
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ocifs/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, fsspec
+, oci
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ocifs";
+  version = "1.3.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "oracle";
+    repo = "ocifs";
+    rev = "refs/tags/${version}";
+    hash = "sha256-ugNITi2tSf3lhbASgr6ErmFDYinQjnhmtRjV3YL7F9U=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    fsspec
+    oci
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ocifs"
+  ];
+
+  meta = with lib; {
+    description = "Oracle Cloud Infrastructure Object Storage fsspec implementation";
+    homepage = "https://ocifs.readthedocs.io";
+    changelog = "https://github.com/oracle/ocifs/releases/tag/${version}";
+    license = with licenses; [ upl ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ocrmypdf/default.nix b/nixpkgs/pkgs/development/python-modules/ocrmypdf/default.nix
new file mode 100644
index 000000000000..c6e16c25d52c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ocrmypdf/default.nix
@@ -0,0 +1,110 @@
+{ lib
+, buildPythonPackage
+, deprecation
+, fetchFromGitHub
+, ghostscript
+, hypothesis
+, img2pdf
+, importlib-resources
+, jbig2enc
+, packaging
+, pdfminer-six
+, pikepdf
+, pillow
+, pluggy
+, pngquant
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, rich
+, reportlab
+, setuptools
+, setuptools-scm
+, substituteAll
+, tesseract
+, tqdm
+, typing-extensions
+, unpaper
+, wheel
+, installShellFiles
+}:
+
+buildPythonPackage rec {
+  pname = "ocrmypdf";
+  version = "15.4.0";
+
+  disabled = pythonOlder "3.9";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "ocrmypdf";
+    repo = "OCRmyPDF";
+    rev = "v${version}";
+    # The content of .git_archival.txt is substituted upon tarball creation,
+    # which creates indeterminism if master no longer points to the tag.
+    # See https://github.com/ocrmypdf/OCRmyPDF/issues/841
+    postFetch = ''
+      rm "$out/.git_archival.txt"
+    '';
+    hash = "sha256-cbKqisaRAeT8ljANbYiUDrptAoQmmIkMu1ya8O6nXvQ=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  patches = [
+    (substituteAll {
+      src = ./paths.patch;
+      gs = lib.getExe ghostscript;
+      jbig2 = lib.getExe jbig2enc;
+      pngquant = lib.getExe pngquant;
+      tesseract = lib.getExe tesseract;
+      unpaper = lib.getExe unpaper;
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+    installShellFiles
+  ];
+
+  propagatedBuildInputs = [
+    deprecation
+    img2pdf
+    packaging
+    pdfminer-six
+    pikepdf
+    pillow
+    pluggy
+    reportlab
+    rich
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ocrmypdf"
+  ];
+
+  postInstall = ''
+    installShellCompletion --cmd ocrmypdf \
+      --bash misc/completion/ocrmypdf.bash \
+      --fish misc/completion/ocrmypdf.fish
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/ocrmypdf/OCRmyPDF";
+    description = "Adds an OCR text layer to scanned PDF files, allowing them to be searched";
+    license = with licenses; [ mpl20 mit ];
+    maintainers = with maintainers; [ kiwi dotlambda ];
+    changelog = "https://github.com/ocrmypdf/OCRmyPDF/blob/${src.rev}/docs/release_notes.rst";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ocrmypdf/paths.patch b/nixpkgs/pkgs/development/python-modules/ocrmypdf/paths.patch
new file mode 100644
index 000000000000..a1db7c690bcf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ocrmypdf/paths.patch
@@ -0,0 +1,119 @@
+diff --git a/src/ocrmypdf/_exec/ghostscript.py b/src/ocrmypdf/_exec/ghostscript.py
+index 92b73a0a..9f04555c 100644
+--- a/src/ocrmypdf/_exec/ghostscript.py
++++ b/src/ocrmypdf/_exec/ghostscript.py
+@@ -58,7 +58,7 @@ log.addFilter(DuplicateFilter(log))
+ 
+ 
+ # Ghostscript executable - gswin32c is not supported
+-GS = 'gswin64c' if os.name == 'nt' else 'gs'
++GS = '@gs@'
+ 
+ 
+ def version() -> Version:
+diff --git a/src/ocrmypdf/_exec/jbig2enc.py b/src/ocrmypdf/_exec/jbig2enc.py
+index 5a34a95a..5ee1b333 100644
+--- a/src/ocrmypdf/_exec/jbig2enc.py
++++ b/src/ocrmypdf/_exec/jbig2enc.py
+@@ -14,7 +14,7 @@ from ocrmypdf.subprocess import get_version, run
+ 
+ 
+ def version() -> Version:
+-    return Version(get_version('jbig2', regex=r'jbig2enc (\d+(\.\d+)*).*'))
++    return Version(get_version('@jbig2@', regex=r'jbig2enc (\d+(\.\d+)*).*'))
+ 
+ 
+ def available():
+@@ -27,7 +27,7 @@ def available():
+ 
+ def convert_group(cwd, infiles, out_prefix, threshold):
+     args = [
+-        'jbig2',
++        '@jbig2@',
+         '-b',
+         out_prefix,
+         '--symbol-mode',  # symbol mode (lossy)
+@@ -44,7 +44,7 @@ def convert_group(cwd, infiles, out_prefix, threshold):
+ 
+ 
+ def convert_single(cwd, infile, outfile, threshold):
+-    args = ['jbig2', '--pdf', '-t', str(threshold), infile]
++    args = ['@jbig2@', '--pdf', '-t', str(threshold), infile]
+     with open(outfile, 'wb') as fstdout:
+         proc = run(args, cwd=cwd, stdout=fstdout, stderr=PIPE)
+     proc.check_returncode()
+diff --git a/src/ocrmypdf/_exec/pngquant.py b/src/ocrmypdf/_exec/pngquant.py
+index 5b8600d0..fcad771b 100644
+--- a/src/ocrmypdf/_exec/pngquant.py
++++ b/src/ocrmypdf/_exec/pngquant.py
+@@ -15,7 +15,7 @@ from ocrmypdf.subprocess import get_version, run
+ 
+ 
+ def version() -> Version:
+-    return Version(get_version('pngquant', regex=r'(\d+(\.\d+)*).*'))
++    return Version(get_version('@pngquant@', regex=r'(\d+(\.\d+)*).*'))
+ 
+ 
+ def available():
+@@ -37,7 +37,7 @@ def quantize(input_file: Path, output_file: Path, quality_min: int, quality_max:
+     """
+     with open(input_file, 'rb') as input_stream:
+         args = [
+-            'pngquant',
++            '@pngquant@',
+             '--force',
+             '--skip-if-larger',
+             '--quality',
+diff --git a/src/ocrmypdf/_exec/tesseract.py b/src/ocrmypdf/_exec/tesseract.py
+index fab92bb1..78b634a7 100644
+--- a/src/ocrmypdf/_exec/tesseract.py
++++ b/src/ocrmypdf/_exec/tesseract.py
+@@ -95,7 +95,7 @@ class TesseractVersion(Version):
+ 
+ 
+ def version() -> Version:
+-    return TesseractVersion(get_version('tesseract', regex=r'tesseract\s(.+)'))
++    return TesseractVersion(get_version('@tesseract@', regex=r'tesseract\s(.+)'))
+ 
+ 
+ def has_thresholding() -> bool:
+@@ -113,7 +113,7 @@ def get_languages() -> set[str]:
+         msg += output
+         return msg
+ 
+-    args_tess = ['tesseract', '--list-langs']
++    args_tess = ['@tesseract@', '--list-langs']
+     try:
+         proc = run(
+             args_tess,
+@@ -135,7 +135,7 @@ def get_languages() -> set[str]:
+ 
+ 
+ def tess_base_args(langs: list[str], engine_mode: int | None) -> list[str]:
+-    args = ['tesseract']
++    args = ['@tesseract@']
+     if langs:
+         args.extend(['-l', '+'.join(langs)])
+     if engine_mode is not None:
+diff --git a/src/ocrmypdf/_exec/unpaper.py b/src/ocrmypdf/_exec/unpaper.py
+index 493d9b3a..578c2dda 100644
+--- a/src/ocrmypdf/_exec/unpaper.py
++++ b/src/ocrmypdf/_exec/unpaper.py
+@@ -70,7 +70,7 @@ class UnpaperImageTooLargeError(Exception):
+ 
+ 
+ def version() -> Version:
+-    return Version(get_version('unpaper'))
++    return Version(get_version('@unpaper@'))
+ 
+ 
+ @contextmanager
+@@ -92,7 +92,7 @@ def _setup_unpaper_io(input_file: Path) -> Iterator[tuple[Path, Path, Path]]:
+ def run_unpaper(
+     input_file: Path, output_file: Path, *, dpi: DecFloat, mode_args: list[str]
+ ) -> None:
+-    args_unpaper = ['unpaper', '-v', '--dpi', str(round(dpi, 6))] + mode_args
++    args_unpaper = ['@unpaper@', '-v', '--dpi', str(round(dpi, 6))] + mode_args
+ 
+     with _setup_unpaper_io(input_file) as (input_png, output_pnm, tmpdir):
+         # To prevent any shenanigans from accepting arbitrary parameters in
diff --git a/nixpkgs/pkgs/development/python-modules/od/default.nix b/nixpkgs/pkgs/development/python-modules/od/default.nix
new file mode 100644
index 000000000000..510d042e7296
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/od/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, repeated-test
+}:
+
+buildPythonPackage rec {
+  pname = "od";
+  version = "2.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uGkj2Z8mLg51IV+FOqwZl1hT7zVyjmD1CcY/VbH4tKk=";
+  };
+
+  nativeCheckInputs = [
+    repeated-test
+  ];
+
+  pythonImportsCheck = [
+    "od"
+  ];
+
+  meta = with lib; {
+    description = "Shorthand syntax for building OrderedDicts";
+    homepage = "https://github.com/epsy/od";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/odfpy/default.nix b/nixpkgs/pkgs/development/python-modules/odfpy/default.nix
new file mode 100644
index 000000000000..ff874ac6fb15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/odfpy/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, defusedxml
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "odfpy";
+  version = "1.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1v1qqk9p12qla85yscq2g413l3qasn6yr4ncyc934465b5p6lxnv";
+  };
+
+  propagatedBuildInputs = [ defusedxml ];
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = {
+    description = "Python API and tools to manipulate OpenDocument files";
+    homepage = "https://github.com/eea/odfpy";
+    license = lib.licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/odp-amsterdam/default.nix b/nixpkgs/pkgs/development/python-modules/odp-amsterdam/default.nix
new file mode 100644
index 000000000000..9f8f810b4be9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/odp-amsterdam/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pythonOlder
+, pytest-asyncio
+, pytestCheckHook
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "odp-amsterdam";
+  version = "6.0.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "klaasnicolaas";
+    repo = "python-odp-amsterdam";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-dAyKypc8bMWkXhYa7BlGGAGqPaPJHFHwXd/UK80BGoE=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"0.0.0"' '"${version}"'
+    sed -i '/addopts/d' pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pytz
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "odp_amsterdam"
+  ];
+
+  meta = with lib; {
+    description = "Python client for getting garage occupancy in Amsterdam";
+    homepage = "https://github.com/klaasnicolaas/python-odp-amsterdam";
+    changelog = "https://github.com/klaasnicolaas/python-odp-amsterdam/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oelint-parser/default.nix b/nixpkgs/pkgs/development/python-modules/oelint-parser/default.nix
new file mode 100644
index 000000000000..37d6dd8b54e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oelint-parser/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, nix-update-script
+, fetchPypi
+, buildPythonPackage
+, regex
+, pip
+}:
+
+buildPythonPackage rec {
+  pname = "oelint-parser";
+  version = "2.11.6";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "oelint_parser";
+    hash = "sha256-CTZxxKZPrAvuWGhwD7qAPG10rry0H71QSRXbGT0J3J0=";
+  };
+
+  buildInputs = [ pip ];
+  propagatedBuildInputs = [ regex ];
+  pythonImportsCheck = [ "oelint_parser" ];
+
+  # Fail to run inside the code the build.
+  doCheck = false;
+
+  passthru.updateScript = nix-update-script { };
+
+  meta = with lib; {
+    description = "Alternative parser for bitbake recipes";
+    homepage = "https://github.com/priv-kweihmann/oelint-parser";
+    changelog = "https://github.com/priv-kweihmann/oelint-parser/releases/tag/v${version}";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ otavio ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oemthermostat/default.nix b/nixpkgs/pkgs/development/python-modules/oemthermostat/default.nix
new file mode 100644
index 000000000000..b97ddf64eb5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oemthermostat/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "oemthermostat";
+  version = "1.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Cadair";
+    repo = "openenergymonitor_thermostat";
+    rev = "v${version}";
+    sha256 = "vrMw3/X8MtejO1WyUA1DOlfVCPTCPgcK5p3+OlTWcM4=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "oemthermostat"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interact with OpenEnergyMonitor thermostats";
+    homepage = "https://github.com/Cadair/openenergymonitor_thermostat";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/offtrac/default.nix b/nixpkgs/pkgs/development/python-modules/offtrac/default.nix
new file mode 100644
index 000000000000..1ae555ffa15a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/offtrac/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "offtrac";
+  version = "0.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "06vd010pa1z7lyfj1na30iqzffr4kzj2k2sba09spik7drlvvl56";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "http://fedorahosted.org/offtrac";
+    description = "Trac xmlrpc library";
+    license = licenses.gpl2;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ofxclient/default.nix b/nixpkgs/pkgs/development/python-modules/ofxclient/default.nix
new file mode 100644
index 000000000000..72e2be7c78bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ofxclient/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi,
+ ofxhome, ofxparse, beautifulsoup4, lxml, keyring
+}:
+
+buildPythonPackage rec {
+  version = "2.0.3";
+  pname = "ofxclient";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0jdhqsbl34yn3n0x6mwsnl58c25v5lp6vr910c2hk7l74l5y7538";
+  };
+
+  patchPhase = ''
+    substituteInPlace setup.py --replace '"argparse",' ""
+  '';
+
+  # ImportError: No module named tests
+  doCheck = false;
+
+  propagatedBuildInputs = [ ofxhome ofxparse beautifulsoup4 lxml keyring ];
+
+  meta = with lib; {
+    homepage = "https://github.com/captin411/ofxclient";
+    description = "OFX client for dowloading transactions from banks";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ofxhome/default.nix b/nixpkgs/pkgs/development/python-modules/ofxhome/default.nix
new file mode 100644
index 000000000000..72ca65ed1711
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ofxhome/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, nose }:
+
+buildPythonPackage rec {
+  version = "0.3.3";
+  pname = "ofxhome";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1rpyfqr2q9pnin47rjd4qapl8ngk1m9jx36iqckhdhr8s8gla445";
+  };
+
+  buildInputs = [ nose ];
+
+  # ImportError: No module named tests
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/captin411/ofxhome";
+    description = "ofxhome.com financial institution lookup REST client";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ofxparse/default.nix b/nixpkgs/pkgs/development/python-modules/ofxparse/default.nix
new file mode 100644
index 000000000000..a364c7393ba8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ofxparse/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, beautifulsoup4
+, lxml
+}:
+
+buildPythonPackage rec {
+  pname = "ofxparse";
+  version = "0.21";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "19y4sp5l9jqiqzzlbqdfiab42qx7d84n4xm4s7jfq397666vcyh5";
+  };
+
+  propagatedBuildInputs = [ six beautifulsoup4 lxml ];
+
+  meta = with lib; {
+    homepage = "http://sites.google.com/site/ofxparse";
+    description = "Tools for working with the OFX (Open Financial Exchange) file format";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ofxtools/default.nix b/nixpkgs/pkgs/development/python-modules/ofxtools/default.nix
new file mode 100644
index 000000000000..d145610dc33b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ofxtools/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ofxtools";
+  version = "0.9.5";
+
+  disabled = pythonOlder "3.8";
+
+  # PyPI distribution does not include tests
+  src = fetchFromGitHub {
+    owner = "csingley";
+    repo = pname;
+    rev = version;
+    hash = "sha256-NsImnD+erhpakQnl1neuHfSKiV6ipNBMPGKMDM0gwWc=";
+  };
+
+  nativeCheckInputs = [ nose ];
+  # override $HOME directory:
+  #   error: [Errno 13] Permission denied: '/homeless-shelter'
+  checkPhase = ''
+    HOME=$TMPDIR nosetests tests/*.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/csingley/ofxtools";
+    description = "Library for working with Open Financial Exchange (OFX) formatted data used by financial institutions";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/okonomiyaki/default.nix b/nixpkgs/pkgs/development/python-modules/okonomiyaki/default.nix
new file mode 100644
index 000000000000..c82b13cc2ee7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/okonomiyaki/default.nix
@@ -0,0 +1,47 @@
+{ buildPythonPackage
+, stdenv
+, fetchFromGitHub
+, lib
+, attrs
+, distro
+, jsonschema
+, six
+, zipfile2
+, hypothesis
+, mock
+, packaging
+, testfixtures
+}:
+
+buildPythonPackage rec {
+  pname = "okonomiyaki";
+  version = "1.4.0";
+
+  src = fetchFromGitHub {
+    owner = "enthought";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-MEll1H7l41m8uz2/WK/Ilm7Dubg0uqYwe+ZgakO1aXQ=";
+  };
+
+  propagatedBuildInputs = [ distro attrs jsonschema six zipfile2 ];
+
+  preCheck = ''
+    substituteInPlace okonomiyaki/runtimes/tests/test_runtime.py \
+      --replace 'runtime_info = PythonRuntime.from_running_python()' 'raise unittest.SkipTest() #'
+   '' + lib.optionalString stdenv.isDarwin ''
+    substituteInPlace okonomiyaki/platforms/tests/test_pep425.py \
+      --replace 'self.assertEqual(platform_tag, self.tag.platform)' 'raise unittest.SkipTest()'
+  '';
+
+  checkInputs = [ hypothesis mock packaging testfixtures ];
+
+  pythonImportsCheck = [ "okonomiyaki" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/enthought/okonomiyaki";
+    description = "An experimental library aimed at consolidating a lot of low-level code used for Enthought's eggs";
+    maintainers = with maintainers; [ genericnerdyusername ];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/okta/default.nix b/nixpkgs/pkgs/development/python-modules/okta/default.nix
new file mode 100644
index 000000000000..d6068b59e043
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/okta/default.nix
@@ -0,0 +1,86 @@
+{ lib
+, stdenv
+, aenum
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, flatdict
+, pycryptodome
+, pycryptodomex
+, pydash
+, pyfakefs
+, pytest-asyncio
+, pytest-mock
+, pytest-recording
+, pytestCheckHook
+, python-jose
+, pythonOlder
+, pyyaml
+, xmltodict
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "okta";
+  version = "2.9.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-mOKVCRp8cLY7p0AVbvphWdB3II6eB6HlN8i1HrVUH+o=";
+  };
+
+  propagatedBuildInputs = [
+    aenum
+    aiohttp
+    flatdict
+    pycryptodome
+    pycryptodomex
+    pydash
+    python-jose
+    pyyaml
+    xmltodict
+    yarl
+  ];
+
+  checkInputs = [
+    pyfakefs
+    pytest-asyncio
+    pytest-mock
+    pytest-recording
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests/"
+  ];
+
+  disabledTests = [
+    "test_client_raise_exception"
+    # vcr.errors.CannotOverwriteExistingCassetteException: Can't overwrite existing cassette
+    "test_get_org_contact_user"
+    "test_update_org_contact_user"
+    "test_get_role_subscription"
+    "test_subscribe_unsubscribe"
+  ];
+
+  pythonImportsCheck = [
+    "okta"
+    "okta.cache"
+    "okta.client"
+    "okta.exceptions"
+    "okta.http_client"
+    "okta.models"
+    "okta.request_executor"
+  ];
+
+  meta = with lib; {
+    description = "Python SDK for the Okta Management API";
+    homepage = "https://github.com/okta/okta-sdk-python";
+    changelog = "https://github.com/okta/okta-sdk-python/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jbgosselin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oldest-supported-numpy/default.nix b/nixpkgs/pkgs/development/python-modules/oldest-supported-numpy/default.nix
new file mode 100644
index 000000000000..5d6e11c34daf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oldest-supported-numpy/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "oldest-supported-numpy";
+  version = "2023.8.3";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-yJp+wzsihagnI3crGPDBo+CqbVO4Xhxulj/o/NitxU0=";
+  };
+
+  # The purpose of oldest-supported-numpy is to build a project against the
+  # oldest version of numpy for a given Python distribution in order to build
+  # a binary that is compatible with the largest possible versons of numpy.
+  # We only build against one version of numpy in nixpkgs, so instead we only
+  # want to make sure that we have a version above the minimum.
+  #
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace 'numpy==' 'numpy>='
+  '';
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  # package has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Meta-package providing the oldest supported Numpy for a given Python version and platform";
+    homepage = "https://github.com/scipy/oldest-supported-numpy";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ tjni ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/olefile/default.nix b/nixpkgs/pkgs/development/python-modules/olefile/default.nix
new file mode 100644
index 000000000000..6bf379aacd90
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/olefile/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "olefile";
+  version = "0.46";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "133b031eaf8fd2c9399b78b8bc5b8fcbe4c31e85295749bb17a87cba8f3c3964";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "olefile"
+  ];
+
+  meta = with lib; {
+    description = "Python package to parse, read and write Microsoft OLE2 files";
+    homepage = "https://www.decalage.info/python/olefileio";
+    # BSD2 + reference to Pillow
+    # http://olefile.readthedocs.io/en/latest/License.html
+    license = with licenses; [ bsd2 /* and */ hpnd ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oletools/default.nix b/nixpkgs/pkgs/development/python-modules/oletools/default.nix
new file mode 100644
index 000000000000..d7df0523eac5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oletools/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, colorclass
+, easygui
+, fetchFromGitHub
+, msoffcrypto-tool
+, olefile
+, pcodedmp
+, pyparsing
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "oletools";
+  version = "0.60.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "decalage2";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-H3oL8sk2r267wV0hoHOq9r9DY2Atxs+hZUVb6tmHy0w=";
+  };
+
+  propagatedBuildInputs = [
+    colorclass
+    easygui
+    msoffcrypto-tool
+    olefile
+    pcodedmp
+    pyparsing
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pyparsing>=2.1.0,<3" "pyparsing>=2.1.0"
+  '';
+
+  disabledTests = [
+    # Test fails with AssertionError: Tuples differ: ('MS Word 2007+...
+    "test_all"
+    "test_xlm"
+  ];
+
+  pythonImportsCheck = [
+    "oletools"
+  ];
+
+  meta = with lib; {
+    description = "Module to analyze MS OLE2 files and MS Office documents";
+    homepage = "https://github.com/decalage2/oletools";
+    license = with licenses; [ bsd2 /* and */ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ome-zarr/default.nix b/nixpkgs/pkgs/development/python-modules/ome-zarr/default.nix
new file mode 100644
index 000000000000..130b45d631e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ome-zarr/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+, aiohttp
+, dask
+, distributed
+, fsspec
+, numpy
+, requests
+, scikit-image
+, toolz
+, zarr
+}:
+
+buildPythonPackage rec {
+  pname = "ome-zarr";
+  version = "0.8.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ome";
+    repo = "ome-zarr-py";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-DMBTrDyUmNsrjOsFKrqukJNZ1f/mAjz4aunNUcwVMKg=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    dask
+    distributed
+    zarr
+    fsspec
+    aiohttp
+    requests
+    scikit-image
+    toolz
+  ] ++ fsspec.passthru.optional-dependencies.s3;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # attempts to access network
+    "test_s3_info"
+  ];
+
+  pythonImportsCheck = [
+    "ome_zarr"
+    "ome_zarr.cli"
+    "ome_zarr.csv"
+    "ome_zarr.data"
+    "ome_zarr.format"
+    "ome_zarr.io"
+    "ome_zarr.reader"
+    "ome_zarr.writer"
+    "ome_zarr.scale"
+    "ome_zarr.utils"
+  ];
+
+  meta = with lib; {
+    description = "Implementation of next-generation file format (NGFF) specifications for storing bioimaging data in the cloud.";
+    homepage = "https://pypi.org/project/ome-zarr";
+    changelog = "https://github.com/ome/ome-zarr-py/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd2;
+    maintainers = [ maintainers.bcdarwin ];
+    mainProgram = "ome_zarr";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/omegaconf/0000-add-support-for-dataclasses_missing_type.patch b/nixpkgs/pkgs/development/python-modules/omegaconf/0000-add-support-for-dataclasses_missing_type.patch
new file mode 100644
index 000000000000..6435d86a68a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/omegaconf/0000-add-support-for-dataclasses_missing_type.patch
@@ -0,0 +1,21 @@
+diff --git a/omegaconf/omegaconf.py b/omegaconf/omegaconf.py
+index efde14a..a2a050e 100644
+--- a/omegaconf/omegaconf.py
++++ b/omegaconf/omegaconf.py
+@@ -7,6 +7,7 @@ import pathlib
+ import sys
+ import warnings
+ from collections import defaultdict
++from dataclasses import _MISSING_TYPE
+ from contextlib import contextmanager
+ from enum import Enum
+ from textwrap import dedent
+@@ -828,6 +829,8 @@ class OmegaConf:
+ 
+             if obj is _DEFAULT_MARKER_:
+                 obj = {}
++            if isinstance(obj, _MISSING_TYPE):
++                return OmegaConf.create({}, parent=parent, flags=flags)
+             if isinstance(obj, str):
+                 obj = yaml.load(obj, Loader=get_yaml_loader())
+                 if obj is None:
diff --git a/nixpkgs/pkgs/development/python-modules/omegaconf/antlr4.patch b/nixpkgs/pkgs/development/python-modules/omegaconf/antlr4.patch
new file mode 100644
index 000000000000..8b9ed34d313e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/omegaconf/antlr4.patch
@@ -0,0 +1,13 @@
+diff --git a/build_helpers/build_helpers.py b/build_helpers/build_helpers.py
+index 6419e26..9e6c21c 100644
+--- a/build_helpers/build_helpers.py
++++ b/build_helpers/build_helpers.py
+@@ -30,7 +30,7 @@ class ANTLRCommand(Command):  # type: ignore  # pragma: no cover
+             command = [
+                 "java",
+                 "-jar",
+-                str(build_dir / "bin" / "antlr-4.9.3-complete.jar"),
++                "@antlr_jar@",
+                 "-Dlanguage=Python3",
+                 "-o",
+                 str(project_root / "omegaconf" / "grammar" / "gen"),
diff --git a/nixpkgs/pkgs/development/python-modules/omegaconf/default.nix b/nixpkgs/pkgs/development/python-modules/omegaconf/default.nix
new file mode 100644
index 000000000000..c6dfada82bd2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/omegaconf/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, antlr4
+, antlr4-python3-runtime
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, jre_minimal
+, pydevd
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, substituteAll
+}:
+
+buildPythonPackage rec {
+  pname = "omegaconf";
+  version = "2.3.0";
+  pyproject = true;
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "omry";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Qxa4uIiX5TAyQ5rFkizdev60S4iVAJ08ES6FpNqf8zI=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./antlr4.patch;
+      antlr_jar = "${antlr4.out}/share/java/antlr-${antlr4.version}-complete.jar";
+    })
+
+    # https://github.com/omry/omegaconf/pull/1137
+    ./0000-add-support-for-dataclasses_missing_type.patch
+  ];
+
+  postPatch = ''
+    # We substitute the path to the jar with the one from our antlr4
+    # package, so this file becomes unused
+    rm -v build_helpers/bin/antlr*-complete.jar
+
+    sed -i 's/antlr4-python3-runtime==.*/antlr4-python3-runtime/' requirements/base.txt
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    jre_minimal
+  ];
+
+  propagatedBuildInputs = [
+    antlr4-python3-runtime
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    pydevd
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "omegaconf"
+  ];
+
+  pytestFlagsArray = [
+    "-W"
+    "ignore::DeprecationWarning"
+  ];
+
+  meta = with lib; {
+    description = "Framework for configuring complex applications";
+    homepage = "https://github.com/omry/omegaconf";
+    changelog = "https://github.com/omry/omegaconf/blob/v${version}/NEWS.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/omemo-dr/default.nix b/nixpkgs/pkgs/development/python-modules/omemo-dr/default.nix
new file mode 100644
index 000000000000..03850fc8cca7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/omemo-dr/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchPypi
+, protobuf
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "omemo-dr";
+  version = "1.0.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-KoqMdyMdc5Sb3TdSeNTVomElK9ruUstiQayyUcIC02E=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    protobuf
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "omemo_dr"
+  ];
+
+  meta = with lib; {
+    description = "OMEMO Double Ratchet";
+    homepage = "https://dev.gajim.org/gajim/omemo-dr/";
+    changelog = "https://dev.gajim.org/gajim/omemo-dr/-/blob/v${version}/CHANGELOG.md";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/omnikinverter/default.nix b/nixpkgs/pkgs/development/python-modules/omnikinverter/default.nix
new file mode 100644
index 000000000000..292abc349ea0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/omnikinverter/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "omnikinverter";
+  version = "0.9.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "klaasnicolaas";
+    repo = "python-omnikinverter";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Vjfnwk9iIe5j+s/zJHQ2X095Eexp/aKtIi/k0sK45q0=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # Upstream doesn't set a version for the pyproject.toml
+    substituteInPlace pyproject.toml \
+      --replace "0.0.0" "${version}" \
+      --replace "--cov" ""
+  '';
+
+  pythonImportsCheck = [
+    "omnikinverter"
+  ];
+
+  meta = with lib; {
+    description = "Python module for the Omnik Inverter";
+    homepage = "https://github.com/klaasnicolaas/python-omnikinverter";
+    changelog = "https://github.com/klaasnicolaas/python-omnikinverter/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/omnilogic/default.nix b/nixpkgs/pkgs/development/python-modules/omnilogic/default.nix
new file mode 100644
index 000000000000..343b65522cae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/omnilogic/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, aiohttp
+, xmltodict
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "omnilogic";
+  version = "0.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "djtimca";
+    repo = "omnilogic-api";
+    rev = "refs/tags/${version}";
+    hash = "sha256-ySK2T5T+Qdq8nVQqluIARR89KmM1N3oD44oLydwcs7E=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    xmltodict
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "omnilogic"
+  ];
+
+  meta = with lib; {
+    description = "Python interface for the Hayward Omnilogic pool control system";
+    homepage = "https://github.com/djtimca/omnilogic-api";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/omorfi/default.nix b/nixpkgs/pkgs/development/python-modules/omorfi/default.nix
new file mode 100644
index 000000000000..6bbe964de734
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/omorfi/default.nix
@@ -0,0 +1,32 @@
+{ buildPythonPackage
+, pkgs
+, lib
+, stdenv
+, hfst
+}:
+
+buildPythonPackage rec {
+  pname = "omorfi";
+  inherit (pkgs.omorfi) src version;
+
+  sourceRoot = "${src.name}/src/python";
+
+  propagatedBuildInputs = [
+    hfst
+  ];
+
+  # Fixes some improper import paths
+  patches = [ ./importfix.patch ];
+
+  # Apply patch relative to source/src
+  patchFlags = [ "-p3" ];
+
+  meta = with lib; {
+    description = "Python interface for Omorfi";
+    homepage = "https://github.com/flammie/omorfi";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ lurkki ];
+    # Ofborg build error (hfst not found?)
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/omorfi/importfix.patch b/nixpkgs/pkgs/development/python-modules/omorfi/importfix.patch
new file mode 100644
index 000000000000..67a54363c7b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/omorfi/importfix.patch
@@ -0,0 +1,76 @@
+diff --git a/src/python/omorfi/entryguessing/gradation.py b/src/python/omorfi/entryguessing/gradation.py
+index 7d3ed8cb..825d7ead 100755
+--- a/src/python/omorfi/entryguessing/gradation.py
++++ b/src/python/omorfi/entryguessing/gradation.py
+@@ -17,8 +17,8 @@
+ #   You should have received a copy of the GNU General Public License
+ #   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ 
+-from .omorfi.error_logging import fail_guess_because
+-from .omorfi.string_mangling import replace_rightmost, replace_rightmosts
++from omorfi.error_logging import fail_guess_because
++from omorfi.string_manglers import replace_rightmost, replace_rightmosts
+ 
+ 
+ def gradation_make_morphophonemes(wordmap):
+diff --git a/src/python/omorfi/entryguessing/guess_new_class.py b/src/python/omorfi/entryguessing/guess_new_class.py
+index 1884716b..3a781bfc 100755
+--- a/src/python/omorfi/entryguessing/guess_new_class.py
++++ b/src/python/omorfi/entryguessing/guess_new_class.py
+@@ -17,8 +17,8 @@
+ #   You should have received a copy of the GNU General Public License
+ #   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ 
+-from .error_logging import fail_guess_because
+-from .string_manglers import three_syllable
++from omorfi.error_logging import fail_guess_because
++from omorfi.string_manglers import three_syllable
+ 
+ 
+ def guess_new_class(wordmap):
+diff --git a/src/python/omorfi/entryguessing/plurale_tantum.py b/src/python/omorfi/entryguessing/plurale_tantum.py
+index a8af81fb..95fc4b7b 100755
+--- a/src/python/omorfi/entryguessing/plurale_tantum.py
++++ b/src/python/omorfi/entryguessing/plurale_tantum.py
+@@ -17,8 +17,8 @@
+ #   You should have received a copy of the GNU General Public License
+ #   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ 
+-from .error_logging import fail_guess_because
+-from .omorfi.string_manglers import replace_rightmost, replace_rightmosts
++from omorfi.error_logging import fail_guess_because
++from omorfi.string_manglers import replace_rightmost, replace_rightmosts
+ 
+ 
+ def plurale_tantum_get_singular_stem(wordmap):
+diff --git a/src/python/omorfi/formats/experimental_xml_formatter.py b/src/python/omorfi/formats/experimental_xml_formatter.py
+index abccbff5..11b0f518 100755
+--- a/src/python/omorfi/formats/experimental_xml_formatter.py
++++ b/src/python/omorfi/formats/experimental_xml_formatter.py
+@@ -19,9 +19,9 @@
+ 
+ from xml.sax.saxutils import escape as xml_escape
+ 
+-from ftb3_formatter import Ftb3Formatter
++from .ftb3_formatter import Ftb3Formatter
+ 
+-from .settings import version_id_easter_egg
++from omorfi.settings import version_id_easter_egg
+ 
+ 
+ def make_xmlid(s):
+diff --git a/src/python/omorfi/formats/lexc_formatter.py b/src/python/omorfi/formats/lexc_formatter.py
+index 4ec616b7..b146129f 100755
+--- a/src/python/omorfi/formats/lexc_formatter.py
++++ b/src/python/omorfi/formats/lexc_formatter.py
+@@ -19,8 +19,8 @@
+ 
+ # functions for formatting the database data to lexc
+ 
+-from .settings import deriv_boundary, morph_boundary, newword_boundary, optional_hyphen, stub_boundary, word_boundary
+-from .string_manglers import lexc_escape
++from omorfi.settings import deriv_boundary, morph_boundary, newword_boundary, optional_hyphen, stub_boundary, word_boundary
++from omorfi.string_manglers import lexc_escape
+ 
+ 
+ def format_copyright_lexc():
diff --git a/nixpkgs/pkgs/development/python-modules/omrdatasettools/default.nix b/nixpkgs/pkgs/development/python-modules/omrdatasettools/default.nix
new file mode 100644
index 000000000000..45c6ee0a90e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/omrdatasettools/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, h5py
+, ipython
+, lxml
+, mung
+, muscima
+, numpy
+, pillow
+, pytestCheckHook
+, scikit-image
+, sphinx-rtd-theme
+, sympy
+, pandas
+, pyhamcrest
+, tqdm
+, twine
+}:
+
+buildPythonPackage rec {
+  pname = "omrdatasettools";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-kUUcbti29uDnSEvCubMAUnptlaZGpEsW2IBGSAGnGyQ=";
+  };
+
+  propagatedBuildInputs = [
+    pillow
+    scikit-image
+    h5py
+    pyhamcrest
+    muscima
+    mung
+    numpy
+    lxml
+    tqdm
+    twine
+    sympy
+    sphinx-rtd-theme
+    pandas
+    ipython
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # The download tests require internet access
+    "omrdatasettools/tests/test_downloader.py"
+  ];
+
+  disabledTests = [
+    # The download tests require internet access
+    "test_download_extract_and_crop_bitmaps"
+    "test_download_extract_and_render_all_symbols"
+    "test_download_extract_and_draw_bitmaps"
+    # Other failures
+    "test_render_node_masks_instance_segmentation_of_staff_blobs"
+    "test_render_node_masks_instance_segmentation_of_staff_lines"
+    "test_render_node_masks_semantic_segmentation_of_nodes"
+  ];
+
+  meta = with lib; {
+    description = "Collection of datasets used for Optical Music Recognition";
+    homepage = "https://github.com/apacha/OMR-Datasets";
+    changelog = "https://github.com/apacha/OMR-Datasets/blob/${version}/CHANGES.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ piegames ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ondilo/default.nix b/nixpkgs/pkgs/development/python-modules/ondilo/default.nix
new file mode 100644
index 000000000000..c766e2cb158d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ondilo/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, oauthlib
+, pythonOlder
+, requests
+, requests-oauthlib
+}:
+
+buildPythonPackage rec {
+  pname = "ondilo";
+  version = "0.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "JeromeHXP";
+    repo = pname;
+    rev = version;
+    hash = "sha256-MI6K+41I/IVi+GRBdmRIHbljULDFLAwpo3W8tdxCOBM=";
+  };
+
+  propagatedBuildInputs = [
+    oauthlib
+    requests
+    requests-oauthlib
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ondilo"
+  ];
+
+  meta = with lib; {
+    description = "Python package to access Ondilo ICO APIs";
+    homepage = "https://github.com/JeromeHXP/ondilo";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/onetimepad/default.nix b/nixpkgs/pkgs/development/python-modules/onetimepad/default.nix
new file mode 100644
index 000000000000..cca4a06d6027
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/onetimepad/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "onetimepad";
+  version = "1.4";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1eaade76d8036e1cb79e944b75874bfe5ee4046a571c0724564e1721565c73fd";
+  };
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "onetimepad" ];
+
+  meta = {
+    description = "A hacky implementation of one-time pad";
+    homepage = "https://jailuthra.in/onetimepad";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/onetimepass/default.nix b/nixpkgs/pkgs/development/python-modules/onetimepass/default.nix
new file mode 100644
index 000000000000..6b339294a5cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/onetimepass/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchFromGitHub, six, timecop }:
+
+buildPythonPackage rec {
+  pname = "onetimepass";
+  version = "1.0.1";
+
+  src = fetchFromGitHub {
+    owner = "tadeck";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0wmv62l3r8r4428gdzyj80lhgadfqvj220khz1wnm9alyzg60wkh";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    timecop
+  ];
+
+  pythonImportsCheck = [ "onetimepass" ];
+
+  meta = with lib; {
+    description = "One-time password library for HMAC-based (HOTP) and time-based (TOTP) passwords";
+    homepage = "https://github.com/tadeck/onetimepass";
+    license = licenses.mit;
+    maintainers = with maintainers; [ zakame ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/onkyo-eiscp/default.nix b/nixpkgs/pkgs/development/python-modules/onkyo-eiscp/default.nix
new file mode 100644
index 000000000000..087706784323
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/onkyo-eiscp/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi
+, docopt, netifaces }:
+
+buildPythonPackage rec {
+  pname = "onkyo-eiscp";
+  version = "1.2.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "761abb16c654a1136763b927d094174d41f282809e44ea32cd47e199dd79d9c9";
+  };
+
+  propagatedBuildInputs = [ docopt netifaces ];
+
+  meta = with lib; {
+    description = "Control Onkyo receivers over ethernet";
+    homepage = "https://github.com/miracle2k/onkyo-eiscp";
+    license = licenses.mit;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/online-judge-api-client/default.nix b/nixpkgs/pkgs/development/python-modules/online-judge-api-client/default.nix
new file mode 100644
index 000000000000..5a96133a0daa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/online-judge-api-client/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, appdirs
+, beautifulsoup4
+, buildPythonPackage
+, colorlog
+, fetchFromGitHub
+, git
+, jsonschema
+, lxml
+, markdown
+, python
+, requests
+, substituteAll
+, toml
+}:
+
+let
+  # NOTE This is needed to download & run another Python program internally in
+  #      order to generate test cases for library-checker problems.
+  pythonEnv = python.withPackages (ps: with ps; [ colorlog jinja2 markdown toml ]);
+in buildPythonPackage rec {
+  pname = "online-judge-api-client";
+  version = "10.10.1";
+
+  src = fetchFromGitHub {
+    owner = "online-judge-tools";
+    repo = "api-client";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-P0pIjd/YS155dSDpY/ekMp8HnJcM35waV7aoTQiEWHo=";
+  };
+
+  patches = [ ./fix-paths.patch ];
+  postPatch = ''
+    substituteInPlace onlinejudge/service/library_checker.py \
+      --subst-var-by git               ${git} \
+      --subst-var-by pythonInterpreter ${pythonEnv.interpreter}
+  '';
+
+  propagatedBuildInputs = [
+    appdirs
+    beautifulsoup4
+    colorlog
+    jsonschema
+    lxml
+    requests
+    toml
+  ];
+
+  # Requires internet access
+  doCheck = false;
+
+  pythonImportsCheck = [ "onlinejudge" "onlinejudge_api" ];
+
+  meta = with lib; {
+    description = "API client to develop tools for competitive programming";
+    homepage = "https://github.com/online-judge-tools/api-client";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sei40kr ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/online-judge-api-client/fix-paths.patch b/nixpkgs/pkgs/development/python-modules/online-judge-api-client/fix-paths.patch
new file mode 100644
index 000000000000..5ec1f9b95c2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/online-judge-api-client/fix-paths.patch
@@ -0,0 +1,39 @@
+diff --git a/onlinejudge/service/library_checker.py b/onlinejudge/service/library_checker.py
+index b63c7b7..e062490 100644
+--- a/onlinejudge/service/library_checker.py
++++ b/onlinejudge/service/library_checker.py
+@@ -51,7 +51,7 @@ class LibraryCheckerService(onlinejudge.type.Service):
+             return
+ 
+         try:
+-            subprocess.check_call(['git', '--version'], stdout=sys.stderr, stderr=sys.stderr)
++            subprocess.check_call(['@git@/bin/git', '--version'], stdout=sys.stderr, stderr=sys.stderr)
+         except FileNotFoundError:
+             logger.error('git command not found')
+             raise
+@@ -60,12 +60,12 @@ class LibraryCheckerService(onlinejudge.type.Service):
+         if not path.exists():
+             # init the problem repository
+             url = 'https://github.com/yosupo06/library-checker-problems'
+-            logger.info('$ git clone %s %s', url, path)
+-            subprocess.check_call(['git', 'clone', url, str(path)], stdout=sys.stderr, stderr=sys.stderr)
++            logger.info('$ @git@/bin/git clone %s %s', url, path)
++            subprocess.check_call(['@git@/bin/git', 'clone', url, str(path)], stdout=sys.stderr, stderr=sys.stderr)
+         else:
+             # sync the problem repository
+-            logger.info('$ git -C %s pull', str(path))
+-            subprocess.check_call(['git', '-C', str(path), 'pull'], stdout=sys.stderr, stderr=sys.stderr)
++            logger.info('$ @git@/bin/git -C %s pull', str(path))
++            subprocess.check_call(['@git@/bin/git', '-C', str(path), 'pull'], stdout=sys.stderr, stderr=sys.stderr)
+ 
+         cls.is_repository_updated = True
+ 
+@@ -100,7 +100,7 @@ class LibraryCheckerProblem(onlinejudge.type.Problem):
+             logger.warning("generate.py may not work on Windows")
+ 
+         problem_spec = str(self._get_problem_directory_path() / 'info.toml')
+-        command = [sys.executable, str(path / 'generate.py'), problem_spec]
++        command = ['@pythonInterpreter@', str(path / 'generate.py'), problem_spec]
+         if compile_checker:
+             command.append('--compile-checker')
+         logger.info('$ %s', ' '.join(command))
diff --git a/nixpkgs/pkgs/development/python-modules/online-judge-tools/default.nix b/nixpkgs/pkgs/development/python-modules/online-judge-tools/default.nix
new file mode 100644
index 000000000000..34e1882d60e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/online-judge-tools/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, colorama
+, fetchFromGitHub
+, online-judge-api-client
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "online-judge-tools";
+  version = "11.5.1";
+
+  src = fetchFromGitHub {
+    owner = "online-judge-tools";
+    repo = "oj";
+    rev = "v${version}";
+    sha256 = "0zkzmmjgjb6lyrzq1ip54cpnp7al9a7mcyjyi5vx58bvnx3q0c6m";
+  };
+
+  propagatedBuildInputs = [ colorama online-judge-api-client requests ];
+
+  # Requires internet access
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Tools for various online judges. Download sample cases, generate additional test cases, test your code, and submit it.";
+    homepage = "https://github.com/online-judge-tools/oj";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sei40kr ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/onlykey-solo-python/default.nix b/nixpkgs/pkgs/development/python-modules/onlykey-solo-python/default.nix
new file mode 100644
index 000000000000..ad01e5b2f820
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/onlykey-solo-python/default.nix
@@ -0,0 +1,50 @@
+{ buildPythonPackage
+, click
+, ecdsa
+, fetchpatch
+, fetchPypi
+, fido2
+, intelhex
+, lib
+, pyserial
+, pyusb
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "onlykey-solo-python";
+  version = "0.0.32";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-88DuhgX4FCwzIKzw4RqWgMtjRdf5huVlKEHAAEminuQ=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "fido2 == 0.9.3" "fido2"
+  '';
+
+  patches = [
+    # https://github.com/trustcrypto/onlykey-solo-python/pull/2
+    (fetchpatch {
+      url = "https://github.com/trustcrypto/onlykey-solo-python/commit/c5a86506f940d4e8fbb670ed665ddca48779cbe9.patch";
+      hash = "sha256-LhCUR5QH9Je/Nr185HgQxfkCtat8W2Huv62zr5Mlrn4=";
+    })
+  ];
+
+  propagatedBuildInputs = [ click ecdsa fido2 intelhex pyserial pyusb requests ];
+
+  # no tests
+  doCheck = false;
+  pythonImportsCheck = [ "solo" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/trustcrypto/onlykey-solo-python";
+    description = "Python library for OnlyKey with Solo FIDO2";
+    maintainers = with maintainers; [ kalbasit ];
+    license = licenses.asl20;
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/onnx/default.nix b/nixpkgs/pkgs/development/python-modules/onnx/default.nix
new file mode 100644
index 000000000000..d0866f6c0a83
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/onnx/default.nix
@@ -0,0 +1,152 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cmake
+, fetchFromGitHub
+, gtest
+, nbval
+, numpy
+, parameterized
+, protobuf
+, pybind11
+, pytestCheckHook
+, pythonOlder
+, tabulate
+, typing-extensions
+, abseil-cpp
+}:
+
+let
+  gtestStatic = gtest.override { static = true; };
+in buildPythonPackage rec {
+  pname = "onnx";
+  version = "1.14.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ZVSdk6LeAiZpQrrzLxphMbc1b3rNUMpcxcXPP8s/5tE=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pybind11
+  ];
+
+  buildInputs = [
+    abseil-cpp
+  ];
+
+  propagatedBuildInputs = [
+    protobuf
+    numpy
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    nbval
+    parameterized
+    pytestCheckHook
+    tabulate
+  ];
+
+  postPatch = ''
+    chmod +x tools/protoc-gen-mypy.sh.in
+    patchShebangs tools/protoc-gen-mypy.sh.in
+
+    substituteInPlace setup.py \
+      --replace 'setup_requires.append("pytest-runner")' ""
+
+    # prevent from fetching & building own gtest
+    substituteInPlace CMakeLists.txt \
+      --replace 'include(googletest)' ""
+    substituteInPlace cmake/unittest.cmake \
+      --replace 'googletest)' ')'
+  '' + ''
+      # remove this override in 1.15 that will enable to set the CMAKE_CXX_STANDARD with cmakeFlags
+      substituteInPlace CMakeLists.txt \
+        --replace 'CMAKE_CXX_STANDARD 11' 'CMAKE_CXX_STANDARD 17'
+  '';
+
+  preConfigure = ''
+    # Set CMAKE_INSTALL_LIBDIR to lib explicitly, because otherwise it gets set
+    # to lib64 and cmake incorrectly looks for the protobuf library in lib64
+    export CMAKE_ARGS="-DCMAKE_INSTALL_LIBDIR=lib -DONNX_USE_PROTOBUF_SHARED_LIBS=ON"
+    export CMAKE_ARGS+=" -Dgoogletest_STATIC_LIBRARIES=${gtestStatic}/lib/libgtest.a -Dgoogletest_INCLUDE_DIRS=${lib.getDev gtestStatic}/include"
+    export ONNX_BUILD_TESTS=1
+  '';
+
+  preBuild = ''
+    export MAX_JOBS=$NIX_BUILD_CORES
+  '';
+
+  # The executables are just utility scripts that aren't too important
+  postInstall = ''
+    rm -r $out/bin
+  '';
+
+  # The setup.py does all the configuration
+  dontUseCmakeConfigure = true;
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+
+    # detecting source dir as a python package confuses pytest
+    mv onnx/__init__.py onnx/__init__.py.hidden
+  '';
+
+  pytestFlagsArray = [
+    "onnx/test"
+    "onnx/examples"
+  ];
+
+  disabledTests = [
+    # attempts to fetch data from web
+    "test_bvlc_alexnet_cpu"
+    "test_densenet121_cpu"
+    "test_inception_v1_cpu"
+    "test_inception_v2_cpu"
+    "test_resnet50_cpu"
+    "test_shufflenet_cpu"
+    "test_squeezenet_cpu"
+    "test_vgg19_cpu"
+    "test_zfnet512_cpu"
+  ] ++ lib.optionals stdenv.isAarch64 [
+    # AssertionError: Output 0 of test 0 in folder
+    "test__pytorch_converted_Conv2d_depthwise_padded"
+    "test__pytorch_converted_Conv2d_dilated"
+    "test_dft"
+    "test_dft_axis"
+    # AssertionError: Mismatch in test 'test_Conv2d_depthwise_padded'
+    "test_xor_bcast4v4d"
+    # AssertionError: assert 1 == 0
+    "test_ops_tested"
+  ];
+
+  disabledTestPaths = [
+    # Unexpected output fields from running code: {'stderr'}
+    "onnx/examples/np_array_tensorproto.ipynb"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  postCheck = ''
+    # run "cpp" tests
+    .setuptools-cmake-build/onnx_gtests
+  '';
+
+  pythonImportsCheck = [
+    "onnx"
+  ];
+
+  meta = with lib; {
+    description = "Open Neural Network Exchange";
+    homepage = "https://onnx.ai";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ acairncross ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/onnxconverter-common/default.nix b/nixpkgs/pkgs/development/python-modules/onnxconverter-common/default.nix
new file mode 100644
index 000000000000..dfe5a03e7cc7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/onnxconverter-common/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, packaging
+, protobuf
+, onnx
+, unittestCheckHook
+, onnxruntime
+}:
+
+buildPythonPackage rec {
+  pname = "onnxconverter-common";
+  version = "1.14.0";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "microsoft";
+    repo = "onnxconverter-common";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-NbHyjLcr/Gq1zRiJW3ZBpEVQGVQGhp7SmfVd5hBIi2o=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    packaging
+    protobuf
+    onnx
+  ];
+
+  pythonImportsCheck = [
+    "onnxconverter_common"
+  ];
+
+  nativeCheckInputs = [
+    onnxruntime
+    unittestCheckHook
+  ];
+
+  unittestFlagsArray = [ "-s" "tests" ];
+
+  # Failing tests
+  # https://github.com/microsoft/onnxconverter-common/issues/242
+  doCheck = false;
+
+  meta = {
+    description = "ONNX Converter and Optimization Tools";
+    homepage = "https://github.com/microsoft/onnxconverter-common";
+    changelog = "https://github.com/microsoft/onnxconverter-common/releases/tag/v${version}";
+    maintainers = with lib.maintainers; [ fridh ];
+    license = with lib.licenses; [ mit ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/onnxmltools/default.nix b/nixpkgs/pkgs/development/python-modules/onnxmltools/default.nix
new file mode 100644
index 000000000000..97eaf68254b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/onnxmltools/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, onnx
+, skl2onnx
+# native check inputs
+, pytestCheckHook
+, pandas
+, xgboost
+, onnxruntime
+, scikit-learn
+, pyspark
+, lightgbm
+}:
+
+buildPythonPackage rec {
+  pname = "onnxmltools";
+  version = "1.11.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "onnx";
+    repo = "onnxmltools";
+    rev = "v${version}";
+    hash = "sha256-uLFAGtCDLdMd0SMoonMXFE0kGHuDpwp6IrIbD0t8l4M=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    onnx
+    skl2onnx
+  ];
+
+  pythonImportsCheck = [ "onnxmltools" ];
+
+  # there are still some dependencies that need to be packaged for the tests to run
+  doCheck = false;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pandas
+    xgboost
+    onnxruntime
+    scikit-learn
+    pyspark
+    lightgbm
+    # coremltools
+    # libsvm
+    # h20
+  ];
+
+  meta = with lib; {
+    description = "ONNXMLTools enables conversion of models to ONNX";
+    homepage = "https://github.com/onnx/onnxmltools";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/onnxruntime-tools/default.nix b/nixpkgs/pkgs/development/python-modules/onnxruntime-tools/default.nix
new file mode 100644
index 000000000000..6f8a5001b1ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/onnxruntime-tools/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, coloredlogs
+, numpy
+, onnx
+, packaging
+, psutil
+, py-cpuinfo
+, py3nvml
+, sympy
+}:
+
+buildPythonPackage rec {
+  pname = "onnxruntime-tools";
+  version = "1.7.0";
+  format = "wheel";
+
+  # the build distribution doesn't work at all, it seems to expect the same structure
+  # as the github source repo.
+  # The github source wasn't immediately obvious how to build for this subpackage.
+  src = fetchPypi {
+    pname = "onnxruntime_tools";
+    inherit version;
+    format = "wheel";
+    dist = "py3";
+    python = "py3";
+    hash = "sha256-Hf+Ii1xIKsW8Yn8S4QhEX+/LPWAMQ/Y2M5dTFv5hetg=";
+  };
+
+  propagatedBuildInputs = [
+    coloredlogs
+    numpy
+    onnx
+    packaging
+    psutil
+    py-cpuinfo
+    py3nvml
+    sympy
+  ];
+
+  pythonImportsCheck = [ "onnxruntime_tools" ];
+
+  meta = with lib; {
+    description = "Transformers Model Optimization Tool of ONNXRuntime";
+    homepage = "https://pypi.org/project/onnxruntime-tools/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/onnxruntime/default.nix b/nixpkgs/pkgs/development/python-modules/onnxruntime/default.nix
new file mode 100644
index 000000000000..8fea2e6d9117
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/onnxruntime/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, autoPatchelfHook
+, pythonRelaxDepsHook
+, onnxruntime
+, coloredlogs
+, numpy
+, packaging
+, oneDNN
+, re2
+
+}:
+
+# onnxruntime requires an older protobuf.
+# Doing an override in protobuf in the python-packages set
+# can give you a functioning Python package but note not
+# all Python packages will be compatible then.
+#
+# Because protobuf is not always needed we remove it
+# as a runtime dependency from our wheel.
+#
+# We do include here the non-Python protobuf so the shared libs
+# link correctly. If you do also want to include the Python
+# protobuf, you can add it to your Python env, but be aware
+# the version likely mismatches with what is used here.
+
+buildPythonPackage {
+  inherit (onnxruntime) pname version;
+  format = "wheel";
+  src = onnxruntime.dist;
+
+  unpackPhase = ''
+    cp -r $src dist
+    chmod +w dist
+  '';
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ] ++ lib.optionals stdenv.isLinux [
+    autoPatchelfHook
+  ];
+
+  # This project requires fairly large dependencies such as sympy which we really don't always need.
+  pythonRemoveDeps = [
+    "flatbuffers"
+    "protobuf"
+    "sympy"
+  ];
+
+  # Libraries are not linked correctly.
+  buildInputs = [
+    oneDNN
+    re2
+    onnxruntime.protobuf
+  ];
+
+  propagatedBuildInputs = [
+    coloredlogs
+    # flatbuffers
+    numpy
+    packaging
+    # protobuf
+    # sympy
+  ];
+
+  meta = onnxruntime.meta // { maintainers = with lib.maintainers; [ fridh ]; };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/onvif-zeep-async/default.nix b/nixpkgs/pkgs/development/python-modules/onvif-zeep-async/default.nix
new file mode 100644
index 000000000000..3d70ef77fb86
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/onvif-zeep-async/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, ciso8601
+, fetchPypi
+, httpx
+, pythonOlder
+, zeep
+}:
+
+buildPythonPackage rec {
+  pname = "onvif-zeep-async";
+  version = "3.1.12";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-TXSwrWnDXzntXZN/u09QB3BsIa6tpf6LpGFKEyA/GH8=";
+  };
+
+  propagatedBuildInputs = [
+    ciso8601
+    httpx
+    zeep
+  ];
+
+  pythonImportsCheck = [
+    "onvif"
+  ];
+
+  # Tests are not shipped
+  doCheck = false;
+
+  meta = with lib; {
+    description = "ONVIF Client Implementation in Python";
+    homepage = "https://github.com/hunterjm/python-onvif-zeep-async";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oocsi/default.nix b/nixpkgs/pkgs/development/python-modules/oocsi/default.nix
new file mode 100644
index 000000000000..073909891389
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oocsi/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "oocsi";
+  version = "0.4.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-AgDBsPoi0aQ6uglc7Zl4gxVmeyDCysoef5vZpxgwE/Q=";
+  };
+
+  # Tests are not shipped
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "oocsi"
+  ];
+
+  meta = with lib; {
+    description = "OOCSI library for Python";
+    homepage = "https://github.com/iddi/oocsi-python";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opcua-widgets/default.nix b/nixpkgs/pkgs/development/python-modules/opcua-widgets/default.nix
new file mode 100644
index 000000000000..3034cb8fcc0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opcua-widgets/default.nix
@@ -0,0 +1,38 @@
+{ pkgs
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pyqt5
+, asyncua
+}:
+
+buildPythonPackage rec {
+  pname = "opcua-widgets";
+  version = "0.6.1";
+
+  src = fetchFromGitHub {
+    owner = "FreeOpcUa";
+    repo = pname;
+    rev = version;
+    hash = "sha256-ABJlKYN5H/1k8ynvSTSoJBX12vTTyavuNUAmTJ84mn0=";
+  };
+
+  disabled = pythonOlder "3.10";
+
+  propagatedBuildInputs = [
+    pyqt5
+    asyncua
+  ];
+
+  pythonImportsCheck = [ "uawidgets" ];
+
+  #This test is broken, when updating this package check if the test was fixed.
+  doCheck = false;
+
+  meta = with pkgs.lib; {
+    description = "Common widgets for opcua-modeler og opcua-client-gui";
+    homepage = "https://github.com/FreeOpcUa/opcua-widgets";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ janik ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/open-garage/default.nix b/nixpkgs/pkgs/development/python-modules/open-garage/default.nix
new file mode 100644
index 000000000000..3064bceda1a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/open-garage/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "open-garage";
+  version = "0.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "pyOpenGarage";
+    rev = version;
+    hash = "sha256-iJ7HcJhpTceFpHTUdNZOYDuxUWZGWPmZ9lxD3CyGvk8=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "opengarage"
+  ];
+
+  meta = with lib; {
+    description = "Python module to communicate with opengarage.io";
+    homepage = "https://github.com/Danielhiversen/pyOpenGarage";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/open-meteo/default.nix b/nixpkgs/pkgs/development/python-modules/open-meteo/default.nix
new file mode 100644
index 000000000000..4aec00f312b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/open-meteo/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pydantic
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "open-meteo";
+  version = "0.2.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-open-meteo";
+    rev = "v${version}";
+    sha256 = "0i8jmhd29vvkpfxs9l5wy8525ngs79mnc7si2j9b1nc41xrv91f6";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    aresponses
+    pydantic
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # Upstream doesn't set a version for the pyproject.toml
+    substituteInPlace pyproject.toml \
+      --replace "0.0.0" "${version}" \
+      --replace "--cov" "" \
+      --replace 'aiohttp = "^3.8.1"' 'aiohttp = "^3.8.0"'
+  '';
+
+  pythonImportsCheck = [
+    "open_meteo"
+  ];
+
+  meta = with lib; {
+    description = "Python client for the Open-Meteo API";
+    homepage = "https://github.com/frenck/python-open-meteo";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openai-triton/0000-dont-download-ptxas.patch b/nixpkgs/pkgs/development/python-modules/openai-triton/0000-dont-download-ptxas.patch
new file mode 100644
index 000000000000..5038a5ba52e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openai-triton/0000-dont-download-ptxas.patch
@@ -0,0 +1,39 @@
+diff --git a/python/setup.py b/python/setup.py
+index 2ac3accd2..f26161c72 100644
+--- a/python/setup.py
++++ b/python/setup.py
+@@ -101,25 +101,6 @@ def get_thirdparty_packages(triton_cache_path):
+ # ---- package data ---
+ 
+ 
+-def download_and_copy_ptxas():
+-    base_dir = os.path.dirname(__file__)
+-    src_path = "bin/ptxas"
+-    url = "https://conda.anaconda.org/nvidia/label/cuda-12.0.0/linux-64/cuda-nvcc-12.0.76-0.tar.bz2"
+-    dst_prefix = os.path.join(base_dir, "triton")
+-    dst_suffix = os.path.join("third_party", "cuda", src_path)
+-    dst_path = os.path.join(dst_prefix, dst_suffix)
+-    if not os.path.exists(dst_path):
+-        print(f'downloading and extracting {url} ...')
+-        ftpstream = urllib.request.urlopen(url)
+-        file = tarfile.open(fileobj=ftpstream, mode="r|*")
+-        with tempfile.TemporaryDirectory() as temp_dir:
+-            file.extractall(path=temp_dir)
+-            src_path = os.path.join(temp_dir, src_path)
+-            os.makedirs(os.path.split(dst_path)[0], exist_ok=True)
+-            shutil.copy(src_path, dst_path)
+-    return dst_suffix
+-
+-
+ # ---- cmake extension ----
+ 
+ 
+@@ -200,8 +181,6 @@ class CMakeBuild(build_ext):
+         subprocess.check_call(["cmake", "--build", "."] + build_args, cwd=self.build_temp)
+ 
+ 
+-download_and_copy_ptxas()
+-
+ setup(
+     name="triton",
+     version="2.0.0",
diff --git a/nixpkgs/pkgs/development/python-modules/openai-triton/bin.nix b/nixpkgs/pkgs/development/python-modules/openai-triton/bin.nix
new file mode 100644
index 000000000000..a1a04fcf944b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openai-triton/bin.nix
@@ -0,0 +1,82 @@
+{ lib
+, stdenv
+, addOpenGLRunpath
+, cudaPackages
+, buildPythonPackage
+, fetchurl
+, isPy38
+, isPy39
+, isPy310
+, isPy311
+, python
+, autoPatchelfHook
+, filelock
+, lit
+, pythonRelaxDepsHook
+, zlib
+}:
+
+buildPythonPackage rec {
+  pname = "triton";
+  version = "2.0.0";
+  format = "wheel";
+
+  src =
+    let pyVerNoDot = lib.replaceStrings [ "." ] [ "" ] python.pythonVersion;
+        unsupported = throw "Unsupported system";
+        srcs = (import ./binary-hashes.nix version)."${stdenv.system}-${pyVerNoDot}" or unsupported;
+    in fetchurl srcs;
+
+  disabled = !(isPy38 || isPy39 || isPy310 || isPy311);
+
+  pythonRemoveDeps = [ "cmake" "torch" ];
+
+  buildInputs = [ zlib ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook # torch and triton refer to each other so this hook is included to mitigate that.
+    autoPatchelfHook
+  ];
+
+  propagatedBuildInputs = [
+    filelock
+    lit
+    zlib
+  ];
+
+  dontStrip = true;
+
+  # If this breaks, consider replacing with "${cuda_nvcc}/bin/ptxas"
+  postFixup = ''
+    chmod +x "$out/${python.sitePackages}/triton/third_party/cuda/bin/ptxas"
+  '' +
+  (let
+    # Bash was getting weird without linting,
+    # but basically upstream contains [cc, ..., "-lcuda", ...]
+    # and we replace it with [..., "-lcuda", "-L/run/opengl-driver/lib", "-L$stubs", ...]
+    old = [ "-lcuda" ];
+    new = [ "-lcuda" "-L${addOpenGLRunpath.driverLink}" "-L${cudaPackages.cuda_cudart}/lib/stubs/" ];
+
+    quote = x: ''"${x}"'';
+    oldStr = lib.concatMapStringsSep ", " quote old;
+    newStr = lib.concatMapStringsSep ", " quote new;
+  in
+    ''
+      substituteInPlace $out/${python.sitePackages}/triton/compiler.py \
+        --replace '${oldStr}' '${newStr}'
+    '');
+
+  meta = with lib; {
+    description = "A language and compiler for custom Deep Learning operations";
+    homepage = "https://github.com/openai/triton/";
+    changelog = "https://github.com/openai/triton/releases/tag/v${version}";
+    # Includes NVIDIA's ptxas, but redistributions of the binary are not limited.
+    # https://docs.nvidia.com/cuda/eula/index.html
+    # triton's license is MIT.
+    # openai-triton-bin includes ptxas binary, therefore unfreeRedistributable is set.
+    license = with licenses; [ unfreeRedistributable mit ];
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    platforms = [ "x86_64-linux" ];
+    maintainers = with maintainers; [ junjihashimoto ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openai-triton/binary-hashes.nix b/nixpkgs/pkgs/development/python-modules/openai-triton/binary-hashes.nix
new file mode 100644
index 000000000000..a6baea5942b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openai-triton/binary-hashes.nix
@@ -0,0 +1,31 @@
+# Warning: Need to update at the same time as torch-bin
+#
+# Precompiled wheels can be found at:
+# https://download.pytorch.org/whl/torch_stable.html
+
+# To add a new version, run "prefetch.sh 'new-version'" to paste the generated file as follows.
+
+version : builtins.getAttr version {
+  "2.0.0" = {
+    x86_64-linux-38 = {
+      name = "triton-2.0.0-1-cp38-cp38-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/triton-2.0.0-1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl";
+      hash = "sha256-nUl4KYt0/PWadf5x5TXAkrAjCIkzsvHfkz7DJhXkvu8=";
+    };
+    x86_64-linux-39 = {
+      name = "triton-2.0.0-1-cp39-cp39-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/triton-2.0.0-1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl";
+      hash = "sha256-dPEYwStDf7LKJeGgR1kXO1F1gvz0x74RkTMWx2QhNlY=";
+    };
+    x86_64-linux-310 = {
+      name = "triton-2.0.0-1-cp310-cp310-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/triton-2.0.0-1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl";
+      hash = "sha256-OIBu6WY/Sw981keQ6WxXk3QInlj0mqxKZggSGqVeJQU=";
+    };
+    x86_64-linux-311 = {
+      name = "triton-2.0.0-1-cp311-cp311-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/triton-2.0.0-1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl";
+      hash = "sha256-ImlBx7hZUhnd71mh/bgh6MdEKJoTJBXd1YT6zt60dbE=";
+    };
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openai-triton/default.nix b/nixpkgs/pkgs/development/python-modules/openai-triton/default.nix
new file mode 100644
index 000000000000..e1ac9cb4cef6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openai-triton/default.nix
@@ -0,0 +1,184 @@
+{ lib
+, config
+, buildPythonPackage
+, fetchFromGitHub
+, addOpenGLRunpath
+, pytestCheckHook
+, pythonRelaxDepsHook
+, pkgsTargetTarget
+, cmake
+, ninja
+, pybind11
+, gtest
+, zlib
+, ncurses
+, libxml2
+, lit
+, llvm
+, filelock
+, torchWithRocm
+, python
+, cudaPackages
+, cudaSupport ? config.cudaSupport
+}:
+
+let
+  # A time may come we'll want to be cross-friendly
+  #
+  # Short explanation: we need pkgsTargetTarget, because we use string
+  # interpolation instead of buildInputs.
+  #
+  # Long explanation: OpenAI/triton downloads and vendors a copy of NVidia's
+  # ptxas compiler. We're not running this ptxas on the build machine, but on
+  # the user's machine, i.e. our Target platform. The second "Target" in
+  # pkgsTargetTarget maybe doesn't matter, because ptxas compiles programs to
+  # be executed on the GPU.
+  # Cf. https://nixos.org/manual/nixpkgs/unstable/#sec-cross-infra
+  ptxas = "${pkgsTargetTarget.cudaPackages.cuda_nvcc}/bin/ptxas"; # Make sure cudaPackages is the right version each update (See python/setup.py)
+in
+buildPythonPackage rec {
+  pname = "triton";
+  version = "2.0.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "openai";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-9GZzugab+Pdt74Dj6zjlEzjj4BcJ69rzMJmqcVMxsKU=";
+  };
+
+  patches = [
+    # TODO: there have been commits upstream aimed at removing the "torch"
+    # circular dependency, but the patches fail to apply on the release
+    # revision. Keeping the link for future reference
+    # Also cf. https://github.com/openai/triton/issues/1374
+
+    # (fetchpatch {
+    #   url = "https://github.com/openai/triton/commit/fc7c0b0e437a191e421faa61494b2ff4870850f1.patch";
+    #   hash = "sha256-f0shIqHJkVvuil2Yku7vuqWFn7VCRKFSFjYRlwx25ig=";
+    # })
+  ] ++ lib.optionals (!cudaSupport) [
+    ./0000-dont-download-ptxas.patch
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    # pytestCheckHook # Requires torch (circular dependency) and probably needs GPUs:
+    cmake
+    ninja
+
+    # Note for future:
+    # These *probably* should go in depsTargetTarget
+    # ...but we cannot test cross right now anyway
+    # because we only support cudaPackages on x86_64-linux atm
+    lit
+    llvm
+  ];
+
+  buildInputs = [
+    gtest
+    libxml2.dev
+    ncurses
+    pybind11
+    zlib
+  ];
+
+  propagatedBuildInputs = [ filelock ];
+
+  postPatch = let
+    # Bash was getting weird without linting,
+    # but basically upstream contains [cc, ..., "-lcuda", ...]
+    # and we replace it with [..., "-lcuda", "-L/run/opengl-driver/lib", "-L$stubs", ...]
+    old = [ "-lcuda" ];
+    new = [ "-lcuda" "-L${addOpenGLRunpath.driverLink}" "-L${cudaPackages.cuda_cudart}/lib/stubs/" ];
+
+    quote = x: ''"${x}"'';
+    oldStr = lib.concatMapStringsSep ", " quote old;
+    newStr = lib.concatMapStringsSep ", " quote new;
+  in ''
+    # Use our `cmakeFlags` instead and avoid downloading dependencies
+    substituteInPlace python/setup.py \
+      --replace "= get_thirdparty_packages(triton_cache_path)" "= os.environ[\"cmakeFlags\"].split()"
+
+    # Already defined in llvm, when built with -DLLVM_INSTALL_UTILS
+    substituteInPlace bin/CMakeLists.txt \
+      --replace "add_subdirectory(FileCheck)" ""
+
+    # Don't fetch googletest
+    substituteInPlace unittest/CMakeLists.txt \
+      --replace "include (\''${CMAKE_CURRENT_SOURCE_DIR}/googletest.cmake)" ""\
+      --replace "include(GoogleTest)" "find_package(GTest REQUIRED)"
+  '' + lib.optionalString cudaSupport ''
+    # Use our linker flags
+    substituteInPlace python/triton/compiler.py \
+      --replace '${oldStr}' '${newStr}'
+  '';
+
+  # Avoid GLIBCXX mismatch with other cuda-enabled python packages
+  preConfigure = ''
+    # Upstream's setup.py tries to write cache somewhere in ~/
+    export HOME=$(mktemp -d)
+
+    # Upstream's github actions patch setup.cfg to write base-dir. May be redundant
+    echo "
+    [build_ext]
+    base-dir=$PWD" >> python/setup.cfg
+
+    # The rest (including buildPhase) is relative to ./python/
+    cd python
+  '' + lib.optionalString cudaSupport ''
+    export CC=${cudaPackages.backendStdenv.cc}/bin/cc;
+    export CXX=${cudaPackages.backendStdenv.cc}/bin/c++;
+
+    # Work around download_and_copy_ptxas()
+    mkdir -p $PWD/triton/third_party/cuda/bin
+    ln -s ${ptxas} $PWD/triton/third_party/cuda/bin
+  '';
+
+  # CMake is run by setup.py instead
+  dontUseCmakeConfigure = true;
+
+  # Setuptools (?) strips runpath and +x flags. Let's just restore the symlink
+  postFixup = lib.optionalString cudaSupport ''
+    rm -f $out/${python.sitePackages}/triton/third_party/cuda/bin/ptxas
+    ln -s ${ptxas} $out/${python.sitePackages}/triton/third_party/cuda/bin/ptxas
+  '';
+
+  checkInputs = [ cmake ]; # ctest
+  dontUseSetuptoolsCheck = true;
+
+  preCheck = ''
+    # build/temp* refers to build_ext.build_temp (looked up in the build logs)
+    (cd /build/source/python/build/temp* ; ctest)
+
+    # For pytestCheckHook
+    cd test/unit
+  '';
+
+  # Circular dependency on torch
+  # pythonImportsCheck = [
+  #   "triton"
+  #   "triton.language"
+  # ];
+
+  # Ultimately, torch is our test suite:
+  passthru.tests = { inherit torchWithRocm; };
+
+  pythonRemoveDeps = [
+    # Circular dependency, cf. https://github.com/openai/triton/issues/1374
+    "torch"
+
+    # CLI tools without dist-info
+    "cmake"
+    "lit"
+  ];
+
+  meta = with lib; {
+    description = "Language and compiler for writing highly efficient custom Deep-Learning primitives";
+    homepage = "https://github.com/openai/triton";
+    platforms = lib.platforms.unix;
+    license = licenses.mit;
+    maintainers = with maintainers; [ SomeoneSerge Madouura ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openai-triton/prefetch.sh b/nixpkgs/pkgs/development/python-modules/openai-triton/prefetch.sh
new file mode 100755
index 000000000000..07e39e176dba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openai-triton/prefetch.sh
@@ -0,0 +1,40 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i bash -p nix-prefetch-scripts
+
+set -eou pipefail
+
+version=$1
+
+linux_bucket="https://download.pytorch.org/whl"
+
+url_and_key_list=(
+  "x86_64-linux-38 $linux_bucket/triton-${version}-1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl triton-${version}-cp38-cp38-linux_x86_64.whl"
+  "x86_64-linux-39 $linux_bucket/triton-${version}-1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl triton-${version}-cp39-cp39-linux_x86_64.whl"
+  "x86_64-linux-310 $linux_bucket/triton-${version}-1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl triton-${version}-cp310-cp310-linux_x86_64.whl"
+  "x86_64-linux-311 $linux_bucket/triton-${version}-1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl triton-${version}-cp311-cp311-linux_x86_64.whl"
+)
+
+hashfile=binary-hashes-"$version".nix
+echo "  \"$version\" = {" >> $hashfile
+
+for url_and_key in "${url_and_key_list[@]}"; do
+  key=$(echo "$url_and_key" | cut -d' ' -f1)
+  url=$(echo "$url_and_key" | cut -d' ' -f2)
+  name=$(echo "$url_and_key" | cut -d' ' -f3)
+
+  echo "prefetching ${url}..."
+  hash=$(nix hash to-sri --type sha256 `nix-prefetch-url "$url" --name "$name"`)
+
+  cat << EOF >> $hashfile
+    $key = {
+      name = "$name";
+      url = "$url";
+      hash = "$hash";
+    };
+EOF
+
+  echo
+done
+
+echo "  };" >> $hashfile
+echo "done."
diff --git a/nixpkgs/pkgs/development/python-modules/openai-whisper/default.nix b/nixpkgs/pkgs/development/python-modules/openai-whisper/default.nix
new file mode 100644
index 000000000000..7983abd2e985
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openai-whisper/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, substituteAll
+
+# build-system
+, setuptools
+
+# runtime
+, ffmpeg-headless
+
+# propagates
+, more-itertools
+, numba
+, numpy
+, openai-triton
+, scipy
+, tiktoken
+, torch
+, tqdm
+, transformers
+
+# tests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "whisper";
+  version = "20231117";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "openai";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-MJ1XjB/GuYUiECCuuHS0NWHvvs+ko0oTvLuDI7zLNiY=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./ffmpeg-path.patch;
+      ffmpeg = ffmpeg-headless;
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    more-itertools
+    numba
+    numpy
+    openai-triton
+    scipy
+    tiktoken
+    torch
+    tqdm
+    transformers
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # requires network access to download models
+    "test_transcribe"
+    # requires NVIDIA drivers
+    "test_dtw_cuda_equivalence"
+    "test_median_filter_equivalence"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/openai/whisper/blob/v${version}/CHANGELOG.md";
+    description = "General-purpose speech recognition model";
+    homepage = "https://github.com/openai/whisper";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa MayNiklas ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openai-whisper/ffmpeg-path.patch b/nixpkgs/pkgs/development/python-modules/openai-whisper/ffmpeg-path.patch
new file mode 100644
index 000000000000..784168d1f62d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openai-whisper/ffmpeg-path.patch
@@ -0,0 +1,13 @@
+diff --git a/whisper/audio.py b/whisper/audio.py
+index 4f5b6e0..bfe7924 100644
+--- a/whisper/audio.py
++++ b/whisper/audio.py
+@@ -44,7 +44,7 @@ def load_audio(file: str, sr: int = SAMPLE_RATE):
+     # and resampling as necessary.  Requires the ffmpeg CLI in PATH.
+     # fmt: off
+     cmd = [
+-        "ffmpeg",
++        "@ffmpeg@/bin/ffmpeg",
+         "-nostdin",
+         "-threads", "0",
+         "-i", file,
diff --git a/nixpkgs/pkgs/development/python-modules/openai/default.nix b/nixpkgs/pkgs/development/python-modules/openai/default.nix
new file mode 100644
index 000000000000..89a02ae69f15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openai/default.nix
@@ -0,0 +1,98 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, matplotlib
+, numpy
+, openpyxl
+, pandas
+, pandas-stubs
+, plotly
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, requests
+, scikit-learn
+, tenacity
+, tqdm
+, typing-extensions
+, wandb
+, withOptionalDependencies ? false
+}:
+
+buildPythonPackage rec {
+  pname = "openai";
+  version = "0.28.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7.1";
+
+  src = fetchFromGitHub {
+    owner = "openai";
+    repo = "openai-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-liJyeGxnYIC/jUQKdeATHpVJb/12KGbeM94Y2YQphfY=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    requests
+    tqdm
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ] ++ lib.optionals withOptionalDependencies (builtins.attrValues {
+    inherit (passthru.optional-dependencies) embeddings wandb;
+  });
+
+  passthru.optional-dependencies = {
+    datalib = [
+      numpy
+      openpyxl
+      pandas
+      pandas-stubs
+    ];
+    embeddings = [
+      matplotlib
+      plotly
+      scikit-learn
+      tenacity
+    ] ++ passthru.optional-dependencies.datalib;
+    wandb = [
+      wandb
+    ] ++ passthru.optional-dependencies.datalib;
+  };
+
+  pythonImportsCheck = [
+    "openai"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+    pytest-mock
+  ];
+
+  pytestFlagsArray = [
+    "openai/tests"
+  ];
+
+  OPENAI_API_KEY = "sk-foo";
+
+  disabledTestPaths = [
+    # Requires a real API key
+    "openai/tests/test_endpoints.py"
+    "openai/tests/asyncio/test_endpoints.py"
+    # openai: command not found
+    "openai/tests/test_file_cli.py"
+    "openai/tests/test_long_examples_validator.py"
+  ];
+
+  meta = with lib; {
+    description = "Python client library for the OpenAI API";
+    homepage = "https://github.com/openai/openai-python";
+    changelog = "https://github.com/openai/openai-python/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ malo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openaiauth/default.nix b/nixpkgs/pkgs/development/python-modules/openaiauth/default.nix
new file mode 100644
index 000000000000..da10f6ffbe55
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openaiauth/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "openaiauth";
+  version = "3.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "OpenAIAuth";
+    hash = "sha256-9SrptiheiM5s9YI6Ht68ahDGMFADWfBQgAWUBY3EEJ8=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "OpenAIAuth"
+  ];
+
+  meta = with lib; {
+    description = "Library for authenticating with the OpenAI API";
+    homepage = "https://github.com/acheong08/OpenAIAuth";
+    changelog = "https://github.com/acheong08/OpenAIAuth/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ realsnick ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openant/default.nix b/nixpkgs/pkgs/development/python-modules/openant/default.nix
new file mode 100644
index 000000000000..ed142826160b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openant/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, pyusb
+, influxdb-client
+, pyserial
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "openant-unstable";
+  version = "1.2.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Tigge";
+    repo = "openant";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Ook9dwcyWvpaGylVDjBxQ2bnXRUBPYQHo6Wub+ISpwE=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  postInstall = ''
+    install -dm755 "$out/etc/udev/rules.d"
+    install -m644 resources/42-ant-usb-sticks.rules "$out/etc/udev/rules.d/99-ant-usb-sticks.rules"
+  '';
+
+  propagatedBuildInputs = [ pyusb ];
+
+  passthru.optional-dependencies = {
+    serial = [
+      pyserial
+    ];
+    influx = [
+      influxdb-client
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "openant"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Tigge/openant";
+    description = "ANT and ANT-FS Python Library";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openapi-core/default.nix b/nixpkgs/pkgs/development/python-modules/openapi-core/default.nix
new file mode 100644
index 000000000000..282c659291a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openapi-core/default.nix
@@ -0,0 +1,111 @@
+{ lib
+, aiohttp
+, asgiref
+, buildPythonPackage
+, django
+, djangorestframework
+, falcon
+, fetchFromGitHub
+, flask
+, httpx
+, isodate
+, jsonschema
+, jsonschema-spec
+, more-itertools
+, openapi-schema-validator
+, openapi-spec-validator
+, parse
+, poetry-core
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, responses
+, requests
+, starlette
+, webob
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "openapi-core";
+  version = "0.18.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "p1c2u";
+    repo = "openapi-core";
+    rev = "refs/tags/${version}";
+    hash = "sha256-8zD4SDGH7Pcu54CcBTJ9Q2sbYfWP4OyNh5STatZ7pAk=";
+  };
+
+  postPatch = ''
+    sed -i "/--cov/d" pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    isodate
+    more-itertools
+    parse
+    openapi-schema-validator
+    openapi-spec-validator
+    werkzeug
+    jsonschema-spec
+    asgiref
+    jsonschema
+  ];
+
+  passthru.optional-dependencies = {
+    aiohttp = [
+      aiohttp
+    ];
+    django = [
+      django
+    ];
+    falcon = [
+      falcon
+    ];
+    flask = [
+      flask
+    ];
+    requests = [
+      requests
+    ];
+    starlette = [
+      httpx
+      starlette
+    ];
+  };
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytestCheckHook
+    responses
+    webob
+  ] ++ lib.flatten (lib.attrValues passthru.optional-dependencies);
+
+  disabledTestPaths = [
+    # Requires secrets and additional configuration
+    "tests/integration/contrib/django/"
+  ];
+
+  pythonImportsCheck = [
+    "openapi_core"
+    "openapi_core.validation.request.validators"
+    "openapi_core.validation.response.validators"
+  ];
+
+  meta = with lib; {
+    description = "Client-side and server-side support for the OpenAPI Specification v3";
+    homepage = "https://github.com/p1c2u/openapi-core";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openapi-schema-validator/default.nix b/nixpkgs/pkgs/development/python-modules/openapi-schema-validator/default.nix
new file mode 100644
index 000000000000..39074543b42f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openapi-schema-validator/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build-system
+, poetry-core
+
+# propagates
+, jsonschema
+, jsonschema-specifications
+, rfc3339-validator
+
+# tests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "openapi-schema-validator";
+  version = "0.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "p1c2u";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-859v6KqIRfUq4d/KbkvGnGqlxz6BXTl+tKQHPhtkTH0=";
+  };
+
+  postPatch = ''
+    sed -i "/--cov/d" pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    jsonschema
+    jsonschema-specifications
+    rfc3339-validator
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "openapi_schema_validator" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/python-openapi/openapi-schema-validator/releases/tag/${version}";
+    description = "Validates OpenAPI schema against the OpenAPI Schema Specification v3.0";
+    homepage = "https://github.com/p1c2u/openapi-schema-validator";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ AluisioASG ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openapi-spec-validator/default.nix b/nixpkgs/pkgs/development/python-modules/openapi-spec-validator/default.nix
new file mode 100644
index 000000000000..847a9fdcbddf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openapi-spec-validator/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+
+# build-system
+, poetry-core
+
+# propagates
+, importlib-resources
+, jsonschema
+, jsonschema-spec
+, lazy-object-proxy
+, openapi-schema-validator
+
+# tests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "openapi-spec-validator";
+  version = "0.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  # no tests via pypi sdist
+  src = fetchFromGitHub {
+    owner = "p1c2u";
+    repo = "openapi-spec-validator";
+    rev = "refs/tags/${version}";
+    hash = "sha256-sGr4dH6Twyi4OeCAXZiboN75dYZ6wJ0pWMzV9zOfee0=";
+  };
+
+  postPatch = ''
+    sed -i '/--cov/d' pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    jsonschema
+    jsonschema-spec
+    lazy-object-proxy
+    openapi-schema-validator
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # network access
+    "test_default_valid"
+    "test_urllib_valid"
+    "test_valid"
+  ];
+
+  pythonImportsCheck = [
+    "openapi_spec_validator"
+    "openapi_spec_validator.readers"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/p1c2u/openapi-spec-validator/releases/tag/${version}";
+    description = "Validates OpenAPI Specs against the OpenAPI 2.0 (aka Swagger) and OpenAPI 3.0.0 specification";
+    homepage = "https://github.com/p1c2u/openapi-spec-validator";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ rvl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openapi3/default.nix b/nixpkgs/pkgs/development/python-modules/openapi3/default.nix
new file mode 100644
index 000000000000..72e852d209c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openapi3/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, requests
+, pyyaml
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "openapi3";
+  version = "1.8.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ohpJBXPYnKaa2ny+WFrbL8pJZCV/bzod9THxKBVFXSw=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    pyyaml
+  ];
+
+  nativeCheckinputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+   "openapi3"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/Dorthu/openapi3/releases/tag/${version}";
+    description = "A Python3 OpenAPI 3 Spec Parser";
+    homepage = "https://github.com/Dorthu/openapi3";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ techknowlogick ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openbabel-bindings/default.nix b/nixpkgs/pkgs/development/python-modules/openbabel-bindings/default.nix
new file mode 100644
index 000000000000..fad677987bf4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openbabel-bindings/default.nix
@@ -0,0 +1,27 @@
+{ lib, openbabel, python, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "openbabel";
+  version = "3.1.1";
+
+  src = "${openbabel}/lib/python${python.sourceVersion.major}.${python.sourceVersion.minor}/site-packages";
+
+  nativeBuildInputs = [ openbabel ];
+
+  # these env variables are used by the bindings to find libraries
+  # they need to be included explicitly in your nix-shell for
+  # some functionality to work (inparticular, pybel).
+  # see https://openbabel.org/docs/dev/Installation/install.html
+  BABEL_LIBDIR = "${openbabel}/lib/openbabel/3.1.0";
+  LD_LIBRARY_PATH = "${openbabel}/lib";
+
+  doCheck = false;
+  pythonImportsCheck = [ "openbabel" ];
+
+  meta = with lib; {
+    homepage = "http://openbabel.org/wiki/Main_Page";
+    description = "Python bindings for openbabel";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ danielbarter ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opencensus-context/default.nix b/nixpkgs/pkgs/development/python-modules/opencensus-context/default.nix
new file mode 100644
index 000000000000..0379b27519ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opencensus-context/default.nix
@@ -0,0 +1,28 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "opencensus-context";
+  version = "0.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-oDEIw8ENjIC7Xd9cih8DMWH6YZcqmRf5ubOhhRfwCIw=";
+  };
+
+  pythonNamespaces = [
+    "opencensus.common"
+  ];
+
+  doCheck = false; # No tests in archive
+
+  meta = with lib; {
+    description = "OpenCensus Runtime Context";
+    homepage = "https://github.com/census-instrumentation/opencensus-python/tree/master/context/opencensus-context";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ billhuang ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opencensus-ext-azure/default.nix b/nixpkgs/pkgs/development/python-modules/opencensus-ext-azure/default.nix
new file mode 100644
index 000000000000..7250a0841f24
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opencensus-ext-azure/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, azure-core
+, azure-identity
+, opencensus
+, psutil
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "opencensus-ext-azure";
+  version = "1.1.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-IdTU0FGdSCOdBBQskLalH17MBDaE64DPoKcBqiM0YHM=";
+  };
+
+  propagatedBuildInputs = [
+    azure-core
+    azure-identity
+    opencensus
+    psutil
+    requests
+  ];
+
+  pythonImportsCheck = [ "opencensus.ext.azure" ];
+
+  doCheck = false; # tests are not included in the PyPi tarball
+
+  meta = with lib; {
+    homepage = "https://github.com/census-instrumentation/opencensus-python/tree/master/contrib/opencensus-ext-azure";
+    description = "OpenCensus Azure Monitor Exporter";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ billhuang evilmav ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opencensus/default.nix b/nixpkgs/pkgs/development/python-modules/opencensus/default.nix
new file mode 100644
index 000000000000..fa7141a8fb2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opencensus/default.nix
@@ -0,0 +1,39 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, unittestCheckHook
+, google-api-core
+, opencensus-context
+}:
+
+buildPythonPackage rec {
+  pname = "opencensus";
+  version = "0.11.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-r3qYvVHmOWgUTXcvNG1pbtSYoy29xL4mfNYBHEzgXag=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-core
+    opencensus-context
+  ];
+
+  pythonNamespaces = [
+    "opencensus.common"
+  ];
+
+  doCheck = false; # No tests in sdist
+
+  pythonImportsCheck = [
+    "opencensus.common"
+  ];
+
+  meta = with lib; {
+    description = "A stats collection and distributed tracing framework";
+    homepage = "https://github.com/census-instrumentation/opencensus-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ billhuang ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opencontainers/default.nix b/nixpkgs/pkgs/development/python-modules/opencontainers/default.nix
new file mode 100644
index 000000000000..5aa376cbc585
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opencontainers/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "opencontainers";
+  version = "0.0.14";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/eO4CZtWtclWQV34kz4iJ+GRToBaJ3uETy+eUjQXOPI=";
+  };
+
+  postPatch = ''
+    sed -i "/pytest-runner/d" setup.py
+  '';
+
+  passthru.optional-dependencies.reggie = [
+    requests
+  ];
+
+  pythonImportsCheck = [
+    "opencontainers"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.reggie;
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Python module for oci specifications";
+    homepage = "https://github.com/vsoch/oci-python";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openerz-api/default.nix b/nixpkgs/pkgs/development/python-modules/openerz-api/default.nix
new file mode 100644
index 000000000000..7fe8de134b48
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openerz-api/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+, testfixtures
+}:
+
+buildPythonPackage rec {
+  pname = "openerz-api";
+  version = "0.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "misialq";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-6q0mKWyTTlNJ/DCeAsck1meM5dQovYBcV2EqmjlABvc=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    testfixtures
+  ];
+
+  pythonImportsCheck = [
+    "openerz_api"
+  ];
+
+  disabledTests = [
+    # Assertion issue
+    "test_sensor_make_api_request"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interact with the OpenERZ API";
+    homepage = "https://github.com/misialq/openerz-api";
+    changelog = "https://github.com/misialq/openerz-api/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openevsewifi/default.nix b/nixpkgs/pkgs/development/python-modules/openevsewifi/default.nix
new file mode 100644
index 000000000000..86bb9636a2e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openevsewifi/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, deprecated
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "openevsewifi";
+  version = "1.1.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "miniconfig";
+    repo = "python-openevse-wifi";
+    rev = "v${version}";
+    hash = "sha256-7+BC5WG0JoyHNjgsoJBQRVDpmdXMJCV4bMf6pIaS5qo=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    deprecated
+    requests
+  ];
+
+  nativeCheckInputs = [
+    requests-mock
+    pytestCheckHook
+  ];
+
+  patches = [
+    # Switch to poetry-core, https://github.com/miniconfig/python-openevse-wifi/pull/31
+    (fetchpatch {
+      name = "switch-to-poetry-core.patch";
+      url = "https://github.com/miniconfig/python-openevse-wifi/commit/1083868dd9f39a8ad7bb17f02cea1b8458e5b82d.patch";
+      hash = "sha256-XGeyi/PchBju1ICgL/ZCDGCbWwIJmLAcHuKaj+kDsI0=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'pytest-cov = "^2.8.1"' ""
+  '';
+
+  pythonImportsCheck = [
+    "openevsewifi"
+  ];
+
+  meta = with lib; {
+    description = "Module for communicating with the wifi module from OpenEVSE";
+    homepage = "https://github.com/miniconfig/python-openevse-wifi";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openhomedevice/default.nix b/nixpkgs/pkgs/development/python-modules/openhomedevice/default.nix
new file mode 100644
index 000000000000..2e7ddf92a1d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openhomedevice/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, aioresponses
+, async-upnp-client
+, buildPythonPackage
+, fetchFromGitHub
+, lxml
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "openhomedevice";
+  version = "2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "bazwilliams";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-GGp7nKFH01m1KW6yMkKlAdd26bDi8JDWva6OQ0CWMIw=";
+  };
+
+  propagatedBuildInputs = [
+    async-upnp-client
+    lxml
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "openhomedevice"
+  ];
+
+  pytestFlagsArray = [
+    "tests/*.py"
+  ];
+
+  meta = with lib; {
+    description = "Python module to access Linn Ds and Openhome devices";
+    homepage = "https://github.com/bazwilliams/openhomedevice";
+    changelog = "https://github.com/bazwilliams/openhomedevice/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openidc-client/default.nix b/nixpkgs/pkgs/development/python-modules/openidc-client/default.nix
new file mode 100644
index 000000000000..ce6ccee9793c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openidc-client/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, requests }:
+
+buildPythonPackage rec {
+  pname = "openidc-client";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "680e969cae18c30adbddd6a087ed09f6a296b4937b4c8bc69be813bdbbfa9847";
+  };
+  propagatedBuildInputs = [ requests ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A CLI python OpenID Connect client with token caching and management";
+    homepage = "https://github.com/puiterwijk";
+    license = licenses.mit;
+    maintainers = with maintainers; [ disassembler ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openllm-client/default.nix b/nixpkgs/pkgs/development/python-modules/openllm-client/default.nix
new file mode 100644
index 000000000000..ce77953f12df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openllm-client/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, bentoml
+, hatch-fancy-pypi-readme
+, hatch-vcs
+, hatchling
+, anyio
+, distro
+, httpx
+, httpx-auth
+, openllm-core
+, soundfile
+, transformers
+}:
+
+buildPythonPackage rec {
+  inherit (openllm-core) src version;
+  pname = "openllm-client";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  sourceRoot = "source/openllm-client";
+
+  nativeBuildInputs = [
+    hatch-fancy-pypi-readme
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    anyio
+    distro
+    httpx
+    openllm-core
+  ];
+
+  passthru.optional-dependencies = {
+    grpc = [
+      bentoml
+    ] ++ bentoml.optional-dependencies.grpc;
+    auth = [
+      httpx-auth
+    ];
+    agents = [
+      transformers
+      # diffusers
+      soundfile
+    ] ++ transformers.agents;
+    full = passthru.optional-dependencies.grpc ++ passthru.optional-dependencies.agents;
+  };
+
+  # there is no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "openllm_client" ];
+
+  meta = with lib; {
+    description = "Interacting with OpenLLM HTTP/gRPC server, or any BentoML server";
+    homepage = "https://github.com/bentoml/OpenLLM/tree/main/openllm-client";
+    changelog = "https://github.com/bentoml/OpenLLM/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openllm-core/default.nix b/nixpkgs/pkgs/development/python-modules/openllm-core/default.nix
new file mode 100644
index 000000000000..ab39bf6c11b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openllm-core/default.nix
@@ -0,0 +1,90 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, accelerate
+, attrs
+, bitsandbytes
+, bentoml
+, cattrs
+, click-option-group
+, datasets
+, deepmerge
+, hatch-fancy-pypi-readme
+, hatch-vcs
+, hatchling
+, inflection
+, mypy-extensions
+, orjson
+, peft
+, transformers
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "openllm-core";
+  version = "0.4.22";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bentoml";
+    repo = "OpenLLM";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Hgwc4rneY0d7KZHuBIWRpndLksts5DTvaYuwZOO4sdI=";
+  };
+
+  sourceRoot = "source/openllm-core";
+
+  nativeBuildInputs = [
+    hatch-fancy-pypi-readme
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    cattrs
+    # not listed in pyproject.toml, but required at runtime
+    click-option-group
+    deepmerge
+    inflection
+    mypy-extensions
+    orjson
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = {
+    vllm = [
+      # vllm
+    ];
+    bentoml = [
+      bentoml
+    ];
+    fine-tune = [
+      accelerate
+      bitsandbytes
+      datasets
+      peft
+      transformers
+      # trl
+    ] ++ transformers.optional-dependencies.torch
+      ++ transformers.optional-dependencies.tokenizers
+      ++ transformers.optional-dependencies.accelerate;
+    full = with passthru.optional-dependencies; ( vllm ++ bentoml ++ fine-tune );
+  };
+
+  # there is no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "openllm_core" ];
+
+  meta = with lib; {
+    description = "Core components for OpenLLM";
+    homepage = "https://github.com/bentoml/OpenLLM/tree/main/openllm-core";
+    changelog = "https://github.com/bentoml/OpenLLM/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openllm/default.nix b/nixpkgs/pkgs/development/python-modules/openllm/default.nix
new file mode 100644
index 000000000000..b1cad320a11d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openllm/default.nix
@@ -0,0 +1,190 @@
+{ lib
+, buildPythonPackage
+, hatch-fancy-pypi-readme
+, hatch-vcs
+, hatchling
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, accelerate
+, bentoml
+, bitsandbytes
+, build
+, click
+, ctranslate2
+, datasets
+, docker
+, einops
+, ghapi
+, huggingface-hub
+, hypothesis
+, ipython
+, jupyter
+, jupytext
+, nbformat
+, notebook
+, openai
+, openllm-client
+, openllm-core
+, optimum
+, peft
+, pytest-mock
+, pytest-randomly
+, pytest-rerunfailures
+, pytest-xdist
+, safetensors
+, scipy
+, sentencepiece
+, soundfile
+, syrupy
+, tabulate
+, tiktoken
+, transformers
+, openai-triton
+, xformers
+}:
+
+buildPythonPackage rec {
+  inherit (openllm-core) src version;
+  pname = "openllm";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  sourceRoot = "source/openllm-python";
+
+  nativeBuildInputs = [
+    hatch-fancy-pypi-readme
+    hatch-vcs
+    hatchling
+    pythonRelaxDepsHook
+  ];
+
+  pythonRemoveDeps = [
+    # remove cuda-python as it has an unfree license
+    "cuda-python"
+  ];
+
+  propagatedBuildInputs = [
+    accelerate
+    bentoml
+    bitsandbytes
+    build
+    click
+    einops
+    ghapi
+    openllm-client
+    openllm-core
+    optimum
+    safetensors
+    scipy
+    sentencepiece
+    tabulate
+    transformers
+  ] ++ bentoml.optional-dependencies.io
+  ++ tabulate.optional-dependencies.widechars
+  ++ transformers.optional-dependencies.tokenizers
+  ++ transformers.optional-dependencies.torch;
+
+  passthru.optional-dependencies = {
+    agents = [
+      # diffusers
+      soundfile
+      transformers
+    ] ++ transformers.optional-dependencies.agents;
+    awq = [
+      # autoawq
+    ];
+    baichuan = [
+      # cpm-kernels
+    ];
+    chatglm = [
+      # cpm-kernels
+    ];
+    ctranslate = [
+      ctranslate2
+    ];
+    falcon = [
+      xformers
+    ];
+    fine-tune = [
+      datasets
+      huggingface-hub
+      peft
+      # trl
+    ];
+    ggml = [
+      # ctransformers
+    ];
+    gptq = [
+      # auto-gptq
+    ]; # ++ autogptq.optional-dependencies.triton;
+    grpc = [
+      bentoml
+    ] ++ bentoml.optional-dependencies.grpc;
+    mpt = [
+      openai-triton
+    ];
+    openai = [
+      openai
+      tiktoken
+    ] ++ openai.optional-dependencies.datalib;
+    playground = [
+      ipython
+      jupyter
+      jupytext
+      nbformat
+      notebook
+    ];
+    starcoder = [
+      bitsandbytes
+    ];
+    vllm = [
+      # vllm
+    ];
+    full = with passthru.optional-dependencies; (
+      agents ++ awq ++ baichuan ++ chatglm ++ ctranslate ++ falcon ++ fine-tune ++ ggml ++ gptq ++ mpt ++ openai ++ playground ++ starcoder ++ vllm
+    );
+    all = passthru.optional-dependencies.full;
+  };
+
+  nativeCheckInputs = [
+    docker
+    hypothesis
+    pytest-mock
+    pytest-randomly
+    pytest-rerunfailures
+    pytest-xdist
+    pytestCheckHook
+    syrupy
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+    # skip GPUs test on CI
+    export GITHUB_ACTIONS=1
+    # disable hypothesis' deadline
+    export CI=1
+  '';
+
+  disabledTestPaths = [
+    # require network access
+    "tests/models"
+  ];
+
+  disabledTests = [
+    # incompatible with recent TypedDict
+    # https://github.com/bentoml/OpenLLM/blob/f3fd32d596253ae34c68e2e9655f19f40e05f666/openllm-python/tests/configuration_test.py#L18-L21
+    "test_missing_default"
+  ];
+
+  pythonImportsCheck = [ "openllm" ];
+
+  meta = with lib; {
+    description = "Operating LLMs in production";
+    homepage = "https://github.com/bentoml/OpenLLM/tree/main/openllm-python";
+    changelog = "https://github.com/bentoml/OpenLLM/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openpyxl/default.nix b/nixpkgs/pkgs/development/python-modules/openpyxl/default.nix
new file mode 100644
index 000000000000..799c991e40fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openpyxl/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, et-xmlfile
+, fetchFromGitLab
+, jdcal
+, lxml
+, pillow
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "openpyxl";
+  version = "3.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitLab {
+    domain = "foss.heptapod.net";
+    owner = "openpyxl";
+    repo = "openpyxl";
+    rev = version;
+    hash = "sha256-SWRbjA83AOLrfe6on2CSb64pH5EWXkfyYcTqWJNBEP0=";
+  };
+
+  propagatedBuildInputs = [
+    jdcal
+    et-xmlfile
+    lxml
+  ];
+
+  nativeCheckInputs = [
+    pillow
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "openpyxl"
+  ];
+
+  meta = with lib; {
+    description = "Python library to read/write Excel 2010 xlsx/xlsm files";
+    homepage = "https://openpyxl.readthedocs.org";
+    changelog = "https://foss.heptapod.net/openpyxl/openpyxl/-/blob/${version}/doc/changes.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lihop ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openrazer/common.nix b/nixpkgs/pkgs/development/python-modules/openrazer/common.nix
new file mode 100644
index 000000000000..5b7a0bc0f8f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openrazer/common.nix
@@ -0,0 +1,20 @@
+{ lib
+, fetchFromGitHub
+}: rec {
+  version = "3.6.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "openrazer";
+    repo = "openrazer";
+    rev = "v${version}";
+    hash = "sha256-bboTRZqJq5tKeBQuiEQAXxTHYvoldDQlwbfehjDA8EE=";
+  };
+
+  meta = with lib; {
+    homepage = "https://openrazer.github.io/";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ evanjs ] ++ teams.lumiguide.members;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openrazer/daemon.nix b/nixpkgs/pkgs/development/python-modules/openrazer/daemon.nix
new file mode 100644
index 000000000000..ea90e089ec34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openrazer/daemon.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, daemonize
+, dbus-python
+, fetchFromGitHub
+, gobject-introspection
+, gtk3
+, makeWrapper
+, pygobject3
+, pyudev
+, setproctitle
+, wrapGAppsHook
+, notify2
+}:
+
+let
+  common = import ./common.nix { inherit lib fetchFromGitHub; };
+in
+buildPythonPackage (common // {
+  pname = "openrazer-daemon";
+
+  disabled = !isPy3k;
+
+  outputs = [ "out" "man" ];
+
+  sourceRoot = "${common.src.name}/daemon";
+
+  postPatch = ''
+    substituteInPlace openrazer_daemon/daemon.py --replace "plugdev" "openrazer"
+  '';
+
+  nativeBuildInputs = [ makeWrapper wrapGAppsHook ];
+
+  propagatedBuildInputs = [
+    daemonize
+    dbus-python
+    gobject-introspection
+    gtk3
+    pygobject3
+    pyudev
+    setproctitle
+    notify2
+  ];
+
+  postInstall = ''
+    DESTDIR="$out" PREFIX="" make manpages install-resources install-systemd
+  '';
+
+  # no tests run
+  doCheck = false;
+
+  meta = common.meta // {
+    description = "An entirely open source user-space daemon that allows you to manage your Razer peripherals on GNU/Linux";
+  };
+})
diff --git a/nixpkgs/pkgs/development/python-modules/openrazer/pylib.nix b/nixpkgs/pkgs/development/python-modules/openrazer/pylib.nix
new file mode 100644
index 000000000000..13e7a870b00c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openrazer/pylib.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, dbus-python
+, fetchFromGitHub
+, numpy
+, openrazer-daemon
+}:
+
+let
+  common = import ./common.nix { inherit lib fetchFromGitHub; };
+in
+buildPythonPackage (common // {
+  pname = "openrazer";
+
+  sourceRoot = "${common.src.name}/pylib";
+
+  propagatedBuildInputs = [
+    dbus-python
+    numpy
+    openrazer-daemon
+  ];
+
+  # no tests run
+  doCheck = false;
+
+  meta = common.meta // {
+    description = "An entirely open source Python library that allows you to manage your Razer peripherals on GNU/Linux";
+  };
+})
diff --git a/nixpkgs/pkgs/development/python-modules/openrgb-python/default.nix b/nixpkgs/pkgs/development/python-modules/openrgb-python/default.nix
new file mode 100644
index 000000000000..106a2f7533ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openrgb-python/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "openrgb-python";
+  version = "0.2.15";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rTfpqMM+IUd8rMmw/r15sICLoPHL6KLaRrmUjWTfUkA=";
+  };
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "openrgb"
+  ];
+
+  meta = with lib; {
+    description = "Module for the OpenRGB SDK";
+    homepage = "https://openrgb-python.readthedocs.io/";
+    changelog = "https://github.com/jath03/openrgb-python/releases/tag/v${version}";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openrouteservice/default.nix b/nixpkgs/pkgs/development/python-modules/openrouteservice/default.nix
new file mode 100644
index 000000000000..9f93d566b0bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openrouteservice/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchFromGitHub, responses, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "openrouteservice";
+  version = "2.3.3";
+
+  src = fetchFromGitHub {
+    owner = "GIScience";
+    repo = "${pname}-py";
+    rev = "v${version}";
+    sha256 = "1d5qbygb81fhpwfdm1a118r3xv45xz9n9avfkgxkvw1n8y6ywz2q";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook responses ];
+
+  disabledTests = [
+    # touches network
+    "test_optimized_waypoints"
+    "test_invalid_api_key"
+    "test_raise_timeout_retriable_requests"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/GIScience/openrouteservice-py";
+    description = "The Python API to consume openrouteservice(s) painlessly";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ Scriptkiddi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opensearch-py/default.nix b/nixpkgs/pkgs/development/python-modules/opensearch-py/default.nix
new file mode 100644
index 000000000000..da0c13d63d61
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opensearch-py/default.nix
@@ -0,0 +1,87 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, setuptools
+
+# dependencies
+, certifi
+, python-dateutil
+, requests
+, six
+, urllib3
+
+# optional-dependencies
+, aiohttp
+
+# tests
+, botocore
+, mock
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pyyaml
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "opensearch-py";
+  version = "2.4.2";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "opensearch-project";
+    repo = "opensearch-py";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-MPuHdjhsrccKYUIDlDYGoXBbBu/V+q43Puf0e5j8vhU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    certifi
+    python-dateutil
+    requests
+    six
+    urllib3
+  ];
+
+  passthru.optional-dependencies.async = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    botocore
+    mock
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+    pyyaml
+    pytz
+  ] ++ passthru.optional-dependencies.async;
+
+  disabledTestPaths = [
+    # require network
+    "test_opensearchpy/test_async/test_connection.py"
+    "test_opensearchpy/test_async/test_server"
+    "test_opensearchpy/test_server"
+    "test_opensearchpy/test_server_secured"
+  ];
+
+  disabledTests = [
+    # finds our ca-bundle, but expects something else (/path/to/clientcert/dir or None)
+    "test_ca_certs_ssl_cert_dir"
+    "test_no_ca_certs"
+  ];
+
+  meta = {
+    description = "Python low-level client for OpenSearch";
+    homepage = "https://github.com/opensearch-project/opensearch-py";
+    changelog = "https://github.com/opensearch-project/opensearch-py/releases/tag/v${version}";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ mcwitt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opensensemap-api/default.nix b/nixpkgs/pkgs/development/python-modules/opensensemap-api/default.nix
new file mode 100644
index 000000000000..326f7d2aceda
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opensensemap-api/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "opensensemap-api";
+  version = "0.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-UrgQjZYw7TlFvhnaI7wFUpuUYeVKO5hsnx8h1OKfV8w=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "opensensemap_api"
+  ];
+
+  meta = with lib; {
+    description = "OpenSenseMap API Python client";
+    longDescription = ''
+      Python Client for interacting with the openSenseMap API. All
+      available information from the sensor can be retrieved.
+    '';
+    homepage = "https://github.com/home-assistant-ecosystem/python-opensensemap-api";
+    changelog = "https://github.com/home-assistant-ecosystem/python-opensensemap-api/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opensfm/0002-cmake-find-system-distributed-gtest.patch b/nixpkgs/pkgs/development/python-modules/opensfm/0002-cmake-find-system-distributed-gtest.patch
new file mode 100644
index 000000000000..27b87c0b2d09
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opensfm/0002-cmake-find-system-distributed-gtest.patch
@@ -0,0 +1,57 @@
+From 79577371be21df40f1f6d4a4fe3453be6df9e93c Mon Sep 17 00:00:00 2001
+From: Someone Serge <sergei.kozlukov@aalto.fi>
+Date: Fri, 31 Dec 2021 10:03:25 +0200
+Subject: [PATCH 2/4] cmake: find system-distributed gtest
+
+---
+ opensfm/src/CMakeLists.txt | 19 +++++++------------
+ 1 file changed, 7 insertions(+), 12 deletions(-)
+
+diff --git a/opensfm/src/CMakeLists.txt b/opensfm/src/CMakeLists.txt
+index c85aa6fb..640d47a6 100644
+--- a/opensfm/src/CMakeLists.txt
++++ b/opensfm/src/CMakeLists.txt
+@@ -52,12 +52,14 @@ if (OPENMP_FOUND)
+   set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
+ endif()
+ 
++find_package(gflags REQUIRED)
++
+ find_package(LAPACK)
+ find_package(SuiteSparse)
+ find_package(Eigen3 REQUIRED)
+ find_package(Ceres)
+-find_package(Gflags REQUIRED)
+-find_package(Glog REQUIRED)
++find_package(glog REQUIRED)
++find_package(GTest REQUIRED)
+ 
+ # Ceres2 exposes Ceres::ceres target.
+ # Ceres1 exposes just ceres.
+@@ -100,20 +102,13 @@ option(OPENSFM_BUILD_TESTS "Build OpenSfM unit tests." on)
+ 
+ if (OPENSFM_BUILD_TESTS)
+   enable_testing()
+-  include_directories(third_party/gtest)
+-  add_definitions(-DCERES_GFLAGS_NAMESPACE=${GFLAGS_NAMESPACE})
+-
+-  add_library(gtest
+-              third_party/gtest/gmock_gtest_all.cc
+-              third_party/gtest/gmock_main.cc)
+-  target_include_directories(gtest PRIVATE ${GFLAGS_INCLUDE_DIR})
+ 
+   set(TEST_MAIN test_main)
+   add_library(${TEST_MAIN} testing_main.cc)
+   target_link_libraries(${TEST_MAIN}
+-                        ${GFLAGS_LIBRARY}
+-                        ${GLOG_LIBRARY}
+-                        gtest)
++      gflags
++      glog::glog
++      GTest::gtest)
+ endif()
+ 
+ ####### OpenSfM libraries #######
+-- 
+2.33.1
+
diff --git a/nixpkgs/pkgs/development/python-modules/opensfm/0003-cmake-use-system-pybind11.patch b/nixpkgs/pkgs/development/python-modules/opensfm/0003-cmake-use-system-pybind11.patch
new file mode 100644
index 000000000000..2815886e7e18
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opensfm/0003-cmake-use-system-pybind11.patch
@@ -0,0 +1,161 @@
+From 36820fbab1abeeebd99f14e368093e0e3f934ca7 Mon Sep 17 00:00:00 2001
+From: Someone Serge <sergei.kozlukov@aalto.fi>
+Date: Sat, 19 Feb 2022 02:37:54 +0200
+Subject: [PATCH 3/4] cmake: use system pybind11
+
+---
+ opensfm/src/CMakeLists.txt            | 3 ++-
+ opensfm/src/bundle/CMakeLists.txt     | 2 +-
+ opensfm/src/dense/CMakeLists.txt      | 2 +-
+ opensfm/src/features/CMakeLists.txt   | 1 -
+ opensfm/src/foundation/CMakeLists.txt | 1 -
+ opensfm/src/geo/CMakeLists.txt        | 1 -
+ opensfm/src/geometry/CMakeLists.txt   | 1 -
+ opensfm/src/map/CMakeLists.txt        | 3 +--
+ opensfm/src/robust/CMakeLists.txt     | 1 -
+ opensfm/src/sfm/CMakeLists.txt        | 1 -
+ 10 files changed, 5 insertions(+), 11 deletions(-)
+
+diff --git a/opensfm/src/CMakeLists.txt b/opensfm/src/CMakeLists.txt
+index 640d47a6..6e391ffa 100644
+--- a/opensfm/src/CMakeLists.txt
++++ b/opensfm/src/CMakeLists.txt
+@@ -54,6 +54,8 @@ endif()
+ 
+ find_package(gflags REQUIRED)
+ 
++find_package(pybind11 REQUIRED)
++
+ find_package(LAPACK)
+ find_package(SuiteSparse)
+ find_package(Eigen3 REQUIRED)
+@@ -82,7 +84,6 @@ else()
+ endif()
+ 
+ ####### Third party libraries #######
+-add_subdirectory(third_party/pybind11)
+ add_subdirectory(third_party/akaze)
+ add_subdirectory(third_party/vlfeat)
+ 
+diff --git a/opensfm/src/bundle/CMakeLists.txt b/opensfm/src/bundle/CMakeLists.txt
+index 7cd9cf74..307e963a 100644
+--- a/opensfm/src/bundle/CMakeLists.txt
++++ b/opensfm/src/bundle/CMakeLists.txt
+@@ -52,7 +52,7 @@ target_link_libraries(pybundle PRIVATE
+   bundle
+   geometry
+   foundation
+-  pybind11)
++)
+ set_target_properties(pybundle PROPERTIES
+     LIBRARY_OUTPUT_DIRECTORY "${opensfm_SOURCE_DIR}/.."
+ )
+diff --git a/opensfm/src/dense/CMakeLists.txt b/opensfm/src/dense/CMakeLists.txt
+index cbebb5ea..2728749d 100644
+--- a/opensfm/src/dense/CMakeLists.txt
++++ b/opensfm/src/dense/CMakeLists.txt
+@@ -23,7 +23,7 @@ endif()
+ 
+ pybind11_add_module(pydense python/pybind.cc)
+ target_include_directories(pydense PRIVATE ${GLOG_INCLUDE_DIR})
+-target_link_libraries(pydense PRIVATE dense foundation pybind11)
++target_link_libraries(pydense PRIVATE dense foundation)
+ set_target_properties(pydense PROPERTIES
+     LIBRARY_OUTPUT_DIRECTORY "${opensfm_SOURCE_DIR}/.."
+ )
+diff --git a/opensfm/src/features/CMakeLists.txt b/opensfm/src/features/CMakeLists.txt
+index b131d30a..6db5b3f1 100644
+--- a/opensfm/src/features/CMakeLists.txt
++++ b/opensfm/src/features/CMakeLists.txt
+@@ -22,7 +22,6 @@ target_link_libraries(pyfeatures
+   PRIVATE
+     features
+     foundation
+-    pybind11
+     akaze
+ )
+ set_target_properties(pyfeatures PROPERTIES
+diff --git a/opensfm/src/foundation/CMakeLists.txt b/opensfm/src/foundation/CMakeLists.txt
+index 40185227..9e0e45e7 100644
+--- a/opensfm/src/foundation/CMakeLists.txt
++++ b/opensfm/src/foundation/CMakeLists.txt
+@@ -12,7 +12,6 @@ set(FOUNDATION_FILES
+ add_library(foundation ${FOUNDATION_FILES})
+ target_link_libraries(foundation
+   PUBLIC
+-    pybind11
+     ${OpenCV_LIBS}
+     ${OpenMP_libomp_LIBRARY}
+     Eigen3::Eigen
+diff --git a/opensfm/src/geo/CMakeLists.txt b/opensfm/src/geo/CMakeLists.txt
+index a9cbae02..75620d06 100644
+--- a/opensfm/src/geo/CMakeLists.txt
++++ b/opensfm/src/geo/CMakeLists.txt
+@@ -29,7 +29,6 @@ target_link_libraries(pygeo
+   PRIVATE
+     geo
+     foundation
+-    pybind11
+ )
+ set_target_properties(pygeo PROPERTIES
+     LIBRARY_OUTPUT_DIRECTORY "${opensfm_SOURCE_DIR}/.."
+diff --git a/opensfm/src/geometry/CMakeLists.txt b/opensfm/src/geometry/CMakeLists.txt
+index e6dda2c2..51bfd6c5 100644
+--- a/opensfm/src/geometry/CMakeLists.txt
++++ b/opensfm/src/geometry/CMakeLists.txt
+@@ -48,7 +48,6 @@ target_link_libraries(pygeometry
+   PRIVATE
+     geometry
+     foundation
+-    pybind11
+ )
+ set_target_properties(pygeometry PROPERTIES
+     LIBRARY_OUTPUT_DIRECTORY "${opensfm_SOURCE_DIR}/.."
+diff --git a/opensfm/src/map/CMakeLists.txt b/opensfm/src/map/CMakeLists.txt
+index b6f67bcd..f869aa4c 100644
+--- a/opensfm/src/map/CMakeLists.txt
++++ b/opensfm/src/map/CMakeLists.txt
+@@ -20,7 +20,7 @@ set(MAP_FILES
+ add_library(map ${MAP_FILES})
+ target_link_libraries(map
+   PUBLIC
+-    pybind11
++    pybind11::module
+     Eigen3::Eigen
+   PRIVATE
+     geo
+@@ -39,7 +39,6 @@ target_link_libraries(pymap
+     map
+     geometry
+     bundle
+-    pybind11
+ )
+ 
+ if (OPENSFM_BUILD_TESTS)
+diff --git a/opensfm/src/robust/CMakeLists.txt b/opensfm/src/robust/CMakeLists.txt
+index ce70749f..40bdf7a4 100644
+--- a/opensfm/src/robust/CMakeLists.txt
++++ b/opensfm/src/robust/CMakeLists.txt
+@@ -29,7 +29,6 @@ target_link_libraries(pyrobust
+   PRIVATE
+     robust
+     foundation
+-    pybind11
+ )
+ set_target_properties(pyrobust PROPERTIES
+     LIBRARY_OUTPUT_DIRECTORY "${opensfm_SOURCE_DIR}/.."
+diff --git a/opensfm/src/sfm/CMakeLists.txt b/opensfm/src/sfm/CMakeLists.txt
+index 98c28f41..7f56b791 100644
+--- a/opensfm/src/sfm/CMakeLists.txt
++++ b/opensfm/src/sfm/CMakeLists.txt
+@@ -35,7 +35,6 @@ target_include_directories(pysfm PRIVATE ${GLOG_INCLUDE_DIR})
+ target_link_libraries(pysfm
+   PRIVATE
+     foundation
+-    pybind11
+     sfm
+ )
+ set_target_properties(pysfm PROPERTIES
+-- 
+2.33.1
+
diff --git a/nixpkgs/pkgs/development/python-modules/opensfm/0004-pybind_utils.h-conflicts-with-nixpkgs-pybind.patch b/nixpkgs/pkgs/development/python-modules/opensfm/0004-pybind_utils.h-conflicts-with-nixpkgs-pybind.patch
new file mode 100644
index 000000000000..f3cb2db00ecb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opensfm/0004-pybind_utils.h-conflicts-with-nixpkgs-pybind.patch
@@ -0,0 +1,86 @@
+From c35b110a83286e7413d7309eb218eb43b52f7d48 Mon Sep 17 00:00:00 2001
+From: Someone Serge <sergei.kozlukov@aalto.fi>
+Date: Sat, 19 Feb 2022 14:36:12 +0200
+Subject: [PATCH 4/4] pybind_utils.h: conflicts with nixpkgs' pybind
+
+---
+ opensfm/src/map/pybind_utils.h | 45 +++-------------------------------
+ 1 file changed, 3 insertions(+), 42 deletions(-)
+
+diff --git a/opensfm/src/map/pybind_utils.h b/opensfm/src/map/pybind_utils.h
+index 817d1a16..3f98a2ab 100644
+--- a/opensfm/src/map/pybind_utils.h
++++ b/opensfm/src/map/pybind_utils.h
+@@ -52,38 +52,6 @@ struct sfm_iterator_state {
+ };
+ PYBIND11_NAMESPACE_END_(detail)
+ 
+-/// Makes an python iterator over the keys (`.first`) of a iterator over pairs
+-/// from a first and past-the-end InputIterator.
+-template <return_value_policy Policy = return_value_policy::reference_internal,
+-          typename Iterator, typename Sentinel,
+-          typename KeyType = decltype((*std::declval<Iterator>()).second),
+-          typename... Extra>
+-iterator make_value_iterator(Iterator first, Sentinel last, Extra &&... extra) {
+-  typedef detail::sfm_iterator_state<Iterator, Sentinel, detail::RefIterator,
+-                                     Policy>
+-      state;
+-
+-  if (!detail::get_type_info(typeid(state), false)) {
+-    class_<state>(handle(), "iterator", pybind11::module_local())
+-        .def("__iter__", [](state &s) -> state & { return s; })
+-        .def("__next__",
+-             [](state &s) -> KeyType {
+-               if (!s.first_or_done)
+-                 ++s.it;
+-               else
+-                 s.first_or_done = false;
+-               if (s.it == s.end) {
+-                 s.first_or_done = true;
+-                 throw stop_iteration();
+-               }
+-               return (*s.it).second;
+-             },
+-             std::forward<Extra>(extra)..., Policy);
+-  }
+-
+-  return cast(state{first, last, true});
+-}
+-
+ template <return_value_policy Policy = return_value_policy::reference_internal,
+           typename Iterator, typename Sentinel,
+           typename KeyType = decltype(&((*std::declval<Iterator>()).second)),
+@@ -148,12 +116,13 @@ iterator make_ref_iterator(Iterator first, Sentinel last, Extra &&... extra) {
+ }
+ 
+ /// Makes a python iterator from a first and past-the-end C++ InputIterator.
+-template <return_value_policy Policy = return_value_policy::reference_internal,
++template <typename Access,
++          return_value_policy Policy = return_value_policy::reference_internal,
+           typename Iterator, typename Sentinel,
+           typename ValueType = decltype(std::declval<Iterator>()),
+           typename... Extra>
+ iterator make_ptr_iterator(Iterator first, Sentinel last, Extra &&... extra) {
+-  typedef detail::iterator_state<Iterator, Sentinel, false, Policy> state;
++  typedef detail::iterator_state<Access, Policy, Iterator, Sentinel, ValueType, Extra...> state;
+ 
+   if (!detail::get_type_info(typeid(state), false)) {
+     class_<state>(handle(), "iterator", pybind11::module_local())
+@@ -176,14 +145,6 @@ iterator make_ptr_iterator(Iterator first, Sentinel last, Extra &&... extra) {
+   return cast(state{first, last, true});
+ }
+ 
+-/// Makes an iterator over the keys (`.first`) of a stl map-like container
+-/// supporting `std::begin()`/`std::end()`
+-template <return_value_policy Policy = return_value_policy::reference_internal,
+-          typename Type, typename... Extra>
+-iterator make_value_iterator(Type &value, Extra &&... extra) {
+-  return make_value_iterator<Policy>(std::begin(value), std::end(value),
+-                                     extra...);
+-}
+ template <return_value_policy Policy = return_value_policy::reference_internal,
+           typename Type, typename... Extra>
+ iterator make_unique_ptr_value_iterator(Type &value, Extra &&... extra) {
+-- 
+2.33.1
+
diff --git a/nixpkgs/pkgs/development/python-modules/opensfm/default.nix b/nixpkgs/pkgs/development/python-modules/opensfm/default.nix
new file mode 100644
index 000000000000..65931f770a2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opensfm/default.nix
@@ -0,0 +1,125 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, cmake
+, opencv4
+, ceres-solver
+, suitesparse
+, metis
+, eigen
+, pkg-config
+, pybind11
+, numpy
+, pyyaml
+, lapack
+, gtest
+, gflags
+, glog
+, pytestCheckHook
+, networkx
+, pillow
+, exifread
+, gpxpy
+, pyproj
+, python-dateutil
+, joblib
+, repoze_lru
+, xmltodict
+, cloudpickle
+, scipy
+, sphinx
+, matplotlib
+, fpdf
+,
+}:
+
+let
+  ceresSplit = (builtins.length ceres-solver.outputs) > 1;
+  ceres' =
+    if ceresSplit
+    then ceres-solver.dev
+    else ceres-solver;
+in
+buildPythonPackage rec {
+  pname = "OpenSfM";
+  version = "unstable-2022-03-10";
+
+  src = fetchFromGitHub {
+    owner = "mapillary";
+    repo = pname;
+    rev = "536b6e1414c8a93f0815dbae85d03749daaa5432";
+    sha256 = "Nfl20dFF2PKOkIvHbRxu1naU+qhz4whLXJvX5c5Wnwo=";
+  };
+  patches = [
+    ./0002-cmake-find-system-distributed-gtest.patch
+    ./0003-cmake-use-system-pybind11.patch
+    ./0004-pybind_utils.h-conflicts-with-nixpkgs-pybind.patch
+    ./fix-scripts.patch
+  ];
+  postPatch = ''
+    rm opensfm/src/cmake/FindGlog.cmake
+    rm opensfm/src/cmake/FindGflags.cmake
+
+    # HAHOG is the default descriptor.
+    # We'll test both HAHOG and SIFT because this is
+    # where segfaults might be introduced in future
+    echo 'feature_type: SIFT' >> data/berlin/config.yaml
+    echo 'feature_type: HAHOG' >> data/lund/config.yaml
+  '';
+
+  nativeBuildInputs = [ cmake pkg-config sphinx ];
+  buildInputs = [
+    ceres'
+    suitesparse
+    metis
+    eigen
+    lapack
+    gflags
+    gtest
+    glog
+    pybind11
+  ];
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    pyyaml
+    opencv4
+    networkx
+    pillow
+    matplotlib
+    fpdf
+    exifread
+    gpxpy
+    pyproj
+    python-dateutil
+    joblib
+    repoze_lru
+    xmltodict
+    cloudpickle
+  ];
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  dontUseCmakeBuildDir = true;
+  cmakeFlags = [
+    "-Bcmake_build"
+    "-Sopensfm/src"
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    "test_reconstruction_incremental"
+    "test_reconstruction_triangulation"
+  ];
+
+  pythonImportsCheck = [ "opensfm" ];
+
+  meta = {
+    broken = stdenv.isDarwin;
+    maintainers = [ lib.maintainers.SomeoneSerge ];
+    license = lib.licenses.bsd2;
+    changelog = "https://github.com/mapillary/OpenSfM/blob/${src.rev}/CHANGELOG.md";
+    description = "Open source Structure-from-Motion pipeline from Mapillary";
+    homepage = "https://opensfm.org/";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opensfm/fix-scripts.patch b/nixpkgs/pkgs/development/python-modules/opensfm/fix-scripts.patch
new file mode 100644
index 000000000000..634820a32755
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opensfm/fix-scripts.patch
@@ -0,0 +1,41 @@
+diff --git a/bin/opensfm b/bin/opensfm
+index b5ee4b15..f05c0d1c 100755
+--- a/bin/opensfm
++++ b/bin/opensfm
+@@ -1,12 +1,6 @@
+-#!/bin/bash
++#!/usr/bin/env bash
+ set -e
+ 
+ DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+ 
+-if [ -x "$(command -v python3)" ]; then
+-    PYTHON=python3
+-else
+-    PYTHON=python
+-fi
+-
+-"$PYTHON" "$DIR"/opensfm_main.py "$@"
++exec "$DIR"/opensfm_main.py "$@"
+diff --git a/bin/opensfm_main.py b/bin/opensfm_main.py
+index 31249e12..cc71560c 100755
+--- a/bin/opensfm_main.py
++++ b/bin/opensfm_main.py
+@@ -1,3 +1,5 @@
++#!/usr/bin/env python
++
+ import sys
+ from os.path import abspath, join, dirname
+ 
+diff --git a/setup.py b/setup.py
+index 1120717f..438a16db 100644
+--- a/setup.py
++++ b/setup.py
+@@ -71,6 +71,7 @@ setuptools.setup(
+     scripts=[
+         "bin/opensfm_run_all",
+         "bin/opensfm",
++        "bin/opensfm_main.py",
+     ],
+     package_data={
+         "opensfm": [
diff --git a/nixpkgs/pkgs/development/python-modules/openshift/default.nix b/nixpkgs/pkgs/development/python-modules/openshift/default.nix
new file mode 100644
index 000000000000..9950b6af1620
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openshift/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, jinja2
+, kubernetes
+, ruamel-yaml
+, six
+, python-string-utils
+, pytest-bdd
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "openshift";
+  version = "0.13.2";
+
+  src = fetchFromGitHub {
+    owner = "openshift";
+    repo = "openshift-restclient-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-uLfewj7M8KNs3oL1AM18sR/WhAR2mvBfqadyhR73FP0=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "kubernetes ~= 12.0" "kubernetes"
+
+    sed -i '/--cov/d' setup.cfg
+  '';
+
+  propagatedBuildInputs = [
+    jinja2
+    kubernetes
+    python-string-utils
+    ruamel-yaml
+    six
+  ];
+
+  pythonImportsCheck = ["openshift"];
+
+  nativeCheckInputs = [
+    pytest-bdd
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # requires kubeconfig
+    "test/integration"
+  ];
+
+  meta = with lib; {
+    description = "Python client for the OpenShift API";
+    homepage = "https://github.com/openshift/openshift-restclient-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ teto ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opensimplex/default.nix b/nixpkgs/pkgs/development/python-modules/opensimplex/default.nix
new file mode 100644
index 000000000000..bcbbd28178e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opensimplex/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "opensimplex";
+  version = "0.4.3";
+
+  src = fetchFromGitHub {
+    owner = "lmas";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "C/MTKTHjxMsOgzuXvokw039Kv6N/PgBoOqKleWPLpw0=";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  pytestFlagsArray = [ "tests/test_opensimplex.py" ];
+  pythonImportsCheck = [ "opensimplex" ];
+
+  meta = with lib; {
+    description = "OpenSimplex Noise functions for 2D, 3D and 4D";
+    longDescription = ''
+      OpenSimplex noise is an n-dimensional gradient noise function that was
+      developed in order to overcome the patent-related issues surrounding
+      Simplex noise, while continuing to also avoid the visually-significant
+      directional artifacts characteristic of Perlin noise.
+    '';
+    homepage = "https://github.com/lmas/opensimplex";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ emilytrau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openstackdocstheme/default.nix b/nixpkgs/pkgs/development/python-modules/openstackdocstheme/default.nix
new file mode 100644
index 000000000000..00b2128db2aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openstackdocstheme/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, dulwich
+, pbr
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "openstackdocstheme";
+  version = "3.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-PwSWLJr5Hjwz8cRXXutnE4Jc+vLcL3TJTZl6biK/4E4=";
+  };
+
+  postPatch = ''
+    # only a small portion of the listed packages are actually needed for running the tests
+    # so instead of removing them one by one remove everything
+    rm test-requirements.txt
+  '';
+
+  propagatedBuildInputs = [ dulwich pbr sphinx ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "openstackdocstheme" ];
+
+  meta = with lib; {
+    description = "Sphinx theme for RST-sourced documentation published to docs.openstack.org";
+    homepage = "https://github.com/openstack/openstackdocstheme";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openstacksdk/default.nix b/nixpkgs/pkgs/development/python-modules/openstacksdk/default.nix
new file mode 100644
index 000000000000..748149ae1f44
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openstacksdk/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, callPackage
+, fetchPypi
+, appdirs
+, cryptography
+, dogpile-cache
+, jmespath
+, jsonpatch
+, keystoneauth1
+, munch
+, netifaces
+, os-service-types
+, pbr
+, pythonOlder
+, pyyaml
+, requestsexceptions
+}:
+
+buildPythonPackage rec {
+  pname = "openstacksdk";
+  version = "1.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-FBtR+ijGsc3rmOvcOMHO5qTnVL1ryEq3qqDQwrzlRD4=";
+  };
+
+  propagatedBuildInputs = [
+    appdirs
+    cryptography
+    dogpile-cache
+    jmespath
+    jsonpatch
+    keystoneauth1
+    munch
+    netifaces
+    os-service-types
+    pbr
+    requestsexceptions
+    pyyaml
+  ];
+
+  # Checks moved to 'passthru.tests' to workaround slowness
+  doCheck = false;
+
+  passthru.tests = {
+    tests = callPackage ./tests.nix { };
+  };
+
+  pythonImportsCheck = [
+    "openstack"
+  ];
+
+  meta = with lib; {
+    description = "An SDK for building applications to work with OpenStack";
+    homepage = "https://github.com/openstack/openstacksdk";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openstacksdk/tests.nix b/nixpkgs/pkgs/development/python-modules/openstacksdk/tests.nix
new file mode 100644
index 000000000000..148f76d03529
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openstacksdk/tests.nix
@@ -0,0 +1,64 @@
+{ buildPythonPackage
+, ddt
+, hacking
+, jsonschema
+, lib
+, openstacksdk
+, oslo-config
+, oslotest
+, prometheus-client
+, requests-mock
+, stdenv
+, stestr
+, testscenarios
+}:
+
+buildPythonPackage {
+  pname = "openstacksdk-tests";
+  inherit (openstacksdk) version src;
+  format = "other";
+
+  dontBuild = true;
+  dontInstall = true;
+
+  nativeCheckInputs = [
+    ddt
+    hacking
+    jsonschema
+    openstacksdk
+    oslo-config
+    oslotest
+    prometheus-client
+    requests-mock
+    stestr
+    testscenarios
+  ];
+
+  checkPhase = ''
+    stestr run -e <(echo "
+  '' + lib.optionalString stdenv.isAarch64 ''
+    openstack.tests.unit.cloud.test_baremetal_node.TestBaremetalNode.test_node_set_provision_state_with_retries
+    openstack.tests.unit.cloud.test_role_assignment.TestRoleAssignment.test_grant_role_user_domain_exists
+    openstack.tests.unit.cloud.test_volume_backups.TestVolumeBackups.test_delete_volume_backup_force
+    openstack.tests.unit.object_store.v1.test_proxy.TestTempURLBytesPathAndKey.test_set_account_temp_url_key_second
+    openstack.tests.unit.cloud.test_security_groups.TestSecurityGroups.test_delete_security_group_neutron_not_found
+  '' + ''
+    openstack.tests.unit.cloud.test_baremetal_node.TestBaremetalNode.test_wait_for_baremetal_node_lock_locked
+    openstack.tests.unit.cloud.test_baremetal_node.TestBaremetalNode.test_inspect_machine_inspect_failed
+    openstack.tests.unit.cloud.test_baremetal_node.TestBaremetalNode.test_inspect_machine_available_wait
+    openstack.tests.unit.cloud.test_baremetal_node.TestBaremetalNode.test_inspect_machine_wait
+    openstack.tests.unit.cloud.test_image.TestImage.test_create_image_task
+    openstack.tests.unit.image.v2.test_proxy.TestImageProxy.test_wait_for_task_error_396
+    openstack.tests.unit.image.v2.test_proxy.TestImageProxy.test_wait_for_task_wait
+    openstack.tests.unit.test_resource.TestWaitForStatus.test_status_fails
+    openstack.tests.unit.test_resource.TestWaitForStatus.test_status_fails_different_attribute
+    openstack.tests.unit.test_resource.TestWaitForStatus.test_status_match
+    openstack.tests.unit.test_resource.TestWaitForStatus.test_status_match_with_none
+    openstack.tests.unit.test_stats.TestStats.test_list_projects
+    openstack.tests.unit.test_stats.TestStats.test_projects
+    openstack.tests.unit.test_stats.TestStats.test_servers
+    openstack.tests.unit.test_stats.TestStats.test_servers_no_detail
+    openstack.tests.unit.test_stats.TestStats.test_timeout
+    ")
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openstep-plist/default.nix b/nixpkgs/pkgs/development/python-modules/openstep-plist/default.nix
new file mode 100644
index 000000000000..7e0cdfb71a14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openstep-plist/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, pytestCheckHook
+, cython
+, pythonImportsCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "openstep-plist";
+  version = "0.3.0.post1";
+
+  src = fetchPypi {
+    pname = "openstep_plist";
+    inherit version;
+    hash = "sha256-GK/z1e3tnr++3+ukRKPASDJGl7+KObsENhwN1Tv+qws=";
+    extension = "zip";
+  };
+
+  nativeBuildInputs = [ setuptools-scm cython ];
+  nativeCheckInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [ "openstep_plist" ];
+
+  meta = {
+    description = "Parser for the 'old style' OpenStep property list format also known as ASCII plist";
+    homepage = "https://github.com/fonttools/openstep-plist";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.BarinovMaxim ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opentelemetry-api/default.nix b/nixpkgs/pkgs/development/python-modules/opentelemetry-api/default.nix
new file mode 100644
index 000000000000..289784d4ac41
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentelemetry-api/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, deprecated
+, hatchling
+, importlib-metadata
+, opentelemetry-test-utils
+, setuptools
+, pytestCheckHook
+, pythonRelaxDepsHook
+}:
+
+let
+  self = buildPythonPackage rec {
+    pname = "opentelemetry-api";
+    version = "1.20.0";
+    disabled = pythonOlder "3.7";
+
+    # to avoid breakage, every package in opentelemetry-python must inherit this version, src, and meta
+    src = fetchFromGitHub {
+      owner = "open-telemetry";
+      repo = "opentelemetry-python";
+      rev = "refs/tags/v${version}";
+      hash = "sha256-tOg3G6BjHInY5TFYyS7/JA4mQajeP0b1QjrZBGqiqnM=";
+    };
+
+    sourceRoot = "${src.name}/opentelemetry-api";
+
+    format = "pyproject";
+
+    nativeBuildInputs = [
+      hatchling
+      pythonRelaxDepsHook
+    ];
+
+    propagatedBuildInputs = [
+      deprecated
+      importlib-metadata
+      setuptools
+    ];
+
+    pythonRelaxDeps = [
+      "importlib-metadata"
+    ];
+
+    nativeCheckInputs = [
+      opentelemetry-test-utils
+      pytestCheckHook
+    ];
+
+    pythonImportsCheck = [ "opentelemetry" ];
+
+    doCheck = false;
+
+    # Enable tests via passthru to avoid cyclic dependency with opentelemetry-test-utils.
+    passthru.tests.${self.pname} = self.overridePythonAttrs { doCheck = true; };
+
+    meta = with lib; {
+      homepage = "https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-api";
+      description = "OpenTelemetry Python API";
+      changelog = "https://github.com/open-telemetry/opentelemetry-python/releases/tag/${self.src.rev}";
+      license = licenses.asl20;
+      maintainers = teams.deshaw.members ++ [ maintainers.natsukium ];
+    };
+  };
+in self
diff --git a/nixpkgs/pkgs/development/python-modules/opentelemetry-exporter-otlp-proto-common/default.nix b/nixpkgs/pkgs/development/python-modules/opentelemetry-exporter-otlp-proto-common/default.nix
new file mode 100644
index 000000000000..8a43e9b4cda4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentelemetry-exporter-otlp-proto-common/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, hatchling
+, backoff
+, opentelemetry-api
+, opentelemetry-proto
+, opentelemetry-sdk
+, opentelemetry-test-utils
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  inherit (opentelemetry-api) version src;
+  pname = "opentelemetry-exporter-otlp-proto-common";
+  disabled = pythonOlder "3.7";
+
+  sourceRoot = "${opentelemetry-api.src.name}/exporter/opentelemetry-exporter-otlp-proto-common";
+
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    backoff
+    opentelemetry-sdk
+    opentelemetry-proto
+  ];
+
+  nativeCheckInputs = [
+    opentelemetry-test-utils
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "opentelemetry.exporter.otlp.proto.common" ];
+
+  meta = opentelemetry-api.meta // {
+    homepage = "https://github.com/open-telemetry/opentelemetry-python/tree/main/exporter/opentelemetry-exporter-otlp-proto-common";
+    description = "OpenTelemetry Protobuf encoding";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opentelemetry-exporter-otlp-proto-grpc/default.nix b/nixpkgs/pkgs/development/python-modules/opentelemetry-exporter-otlp-proto-grpc/default.nix
new file mode 100644
index 000000000000..b727d16b8e65
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentelemetry-exporter-otlp-proto-grpc/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, backoff
+, googleapis-common-protos
+, grpcio
+, hatchling
+, opentelemetry-api
+, opentelemetry-test-utils
+, opentelemetry-exporter-otlp-proto-common
+, pytest-grpc
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  inherit (opentelemetry-api) version src;
+  pname = "opentelemetry-exporter-otlp-proto-grpc";
+  disabled = pythonOlder "3.7";
+
+  sourceRoot = "${opentelemetry-api.src.name}/exporter/opentelemetry-exporter-otlp-proto-grpc";
+
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    backoff
+    googleapis-common-protos
+    grpcio
+    opentelemetry-exporter-otlp-proto-common
+  ];
+
+  nativeCheckInputs = [
+    opentelemetry-test-utils
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    "tests/performance/benchmarks/"
+  ];
+
+  pythonImportsCheck = [ "opentelemetry.exporter.otlp.proto.grpc" ];
+
+  meta = opentelemetry-api.meta // {
+    homepage = "https://github.com/open-telemetry/opentelemetry-python/tree/main/exporter/opentelemetry-exporter-otlp-proto-grpc";
+    description = "OpenTelemetry Collector Protobuf over gRPC Exporter";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opentelemetry-exporter-otlp-proto-http/default.nix b/nixpkgs/pkgs/development/python-modules/opentelemetry-exporter-otlp-proto-http/default.nix
new file mode 100644
index 000000000000..2478826cd67e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentelemetry-exporter-otlp-proto-http/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, backoff
+, googleapis-common-protos
+, hatchling
+, opentelemetry-api
+, opentelemetry-exporter-otlp-proto-common
+, opentelemetry-test-utils
+, requests
+, responses
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  inherit (opentelemetry-api) version src;
+  pname = "opentelemetry-exporter-otlp-proto-http";
+  disabled = pythonOlder "3.7";
+
+  sourceRoot = "${opentelemetry-api.src.name}/exporter/opentelemetry-exporter-otlp-proto-http";
+
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    backoff
+    googleapis-common-protos
+    opentelemetry-exporter-otlp-proto-common
+    requests
+  ];
+
+  nativeCheckInputs = [
+    opentelemetry-test-utils
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [ "opentelemetry.exporter.otlp.proto.http" ];
+
+  meta = opentelemetry-api.meta // {
+    homepage = "https://github.com/open-telemetry/opentelemetry-python/tree/main/exporter/opentelemetry-exporter-otlp-proto-http";
+    description = "OpenTelemetry Collector Protobuf over HTTP Exporter";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opentelemetry-exporter-otlp/default.nix b/nixpkgs/pkgs/development/python-modules/opentelemetry-exporter-otlp/default.nix
new file mode 100644
index 000000000000..7dcc282e1536
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentelemetry-exporter-otlp/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, backoff
+, hatchling
+, opentelemetry-api
+, opentelemetry-exporter-otlp-proto-grpc
+, opentelemetry-exporter-otlp-proto-http
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  inherit (opentelemetry-api) version src;
+  pname = "opentelemetry-exporter-otlp";
+  disabled = pythonOlder "3.7";
+
+  sourceRoot = "${opentelemetry-api.src.name}/exporter/opentelemetry-exporter-otlp";
+
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    opentelemetry-exporter-otlp-proto-grpc
+    opentelemetry-exporter-otlp-proto-http
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "opentelemetry.exporter.otlp" ];
+
+  meta = opentelemetry-api.meta // {
+    homepage = "https://github.com/open-telemetry/opentelemetry-python/tree/main/exporter/opentelemetry-exporter-otlp";
+    description = "OpenTelemetry Collector Exporters";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opentelemetry-exporter-prometheus/default.nix b/nixpkgs/pkgs/development/python-modules/opentelemetry-exporter-prometheus/default.nix
new file mode 100644
index 000000000000..7708b404a980
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentelemetry-exporter-prometheus/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, hatchling
+, opentelemetry-api
+, opentelemetry-sdk
+, opentelemetry-test-utils
+, prometheus-client
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  inherit (opentelemetry-api) version src;
+  pname = "opentelemetry-exporter-prometheus";
+  disabled = pythonOlder "3.7";
+
+  sourceRoot = "${opentelemetry-api.src.name}/exporter/opentelemetry-exporter-prometheus";
+
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    opentelemetry-api
+    opentelemetry-sdk
+    prometheus-client
+  ];
+
+  nativeCheckInputs = [
+    opentelemetry-test-utils
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "opentelemetry.exporter.prometheus" ];
+
+  meta = opentelemetry-api.meta // {
+    homepage = "https://github.com/open-telemetry/opentelemetry-python/tree/main/exporter/opentelemetry-exporter-prometheus";
+    description = "Prometheus Metric Exporter for OpenTelemetry";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation-aiohttp-client/default.nix b/nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation-aiohttp-client/default.nix
new file mode 100644
index 000000000000..cdd40d447050
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation-aiohttp-client/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, hatchling
+, opentelemetry-api
+, opentelemetry-instrumentation
+, opentelemetry-semantic-conventions
+, opentelemetry-test-utils
+, opentelemetry-util-http
+, wrapt
+, pytestCheckHook
+, aiohttp
+}:
+
+buildPythonPackage {
+  inherit (opentelemetry-instrumentation) version src;
+  pname = "opentelemetry-instrumentation-aiohttp-client";
+  disabled = pythonOlder "3.7";
+
+  sourceRoot = "${opentelemetry-instrumentation.src.name}/instrumentation/opentelemetry-instrumentation-aiohttp-client";
+
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    opentelemetry-api
+    opentelemetry-instrumentation
+    opentelemetry-semantic-conventions
+    opentelemetry-util-http
+    wrapt
+    aiohttp
+  ];
+
+  # missing https://github.com/ezequielramos/http-server-mock
+  # which looks unmaintained
+  doCheck = false;
+
+  nativeCheckInputs = [
+    opentelemetry-test-utils
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "opentelemetry.instrumentation.aiohttp_client" ];
+
+  meta = opentelemetry-instrumentation.meta // {
+    homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/blob/main/instrumentation/opentelemetry-instrumentation-aiohttp-client";
+    description = "OpenTelemetry Instrumentation for aiohttp-client";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation-asgi/default.nix b/nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation-asgi/default.nix
new file mode 100644
index 000000000000..952824cd1b72
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation-asgi/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, asgiref
+, hatchling
+, opentelemetry-api
+, opentelemetry-instrumentation
+, opentelemetry-semantic-conventions
+, opentelemetry-test-utils
+, opentelemetry-util-http
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  inherit (opentelemetry-instrumentation) version src;
+  pname = "opentelemetry-instrumentation-asgi";
+  disabled = pythonOlder "3.7";
+
+  sourceRoot = "${opentelemetry-instrumentation.src.name}/instrumentation/opentelemetry-instrumentation-asgi";
+
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    asgiref
+    opentelemetry-instrumentation
+    opentelemetry-api
+    opentelemetry-semantic-conventions
+    opentelemetry-util-http
+  ];
+
+  nativeCheckInputs = [
+    opentelemetry-test-utils
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "opentelemetry.instrumentation.asgi" ];
+
+  meta = opentelemetry-instrumentation.meta // {
+    homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/blob/main/instrumentation/opentelemetry-instrumentation-asgi";
+    description = "ASGI instrumentation for OpenTelemetry";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation-django/default.nix b/nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation-django/default.nix
new file mode 100644
index 000000000000..39058d16e259
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation-django/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, django
+, hatchling
+, opentelemetry-api
+, opentelemetry-instrumentation
+, opentelemetry-instrumentation-asgi
+, opentelemetry-instrumentation-wsgi
+, opentelemetry-semantic-conventions
+, opentelemetry-test-utils
+, opentelemetry-util-http
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  inherit (opentelemetry-instrumentation) version src;
+  pname = "opentelemetry-instrumentation-django";
+  disabled = pythonOlder "3.7";
+
+  sourceRoot = "${opentelemetry-instrumentation.src.name}/instrumentation/opentelemetry-instrumentation-django";
+
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    django
+    opentelemetry-api
+    opentelemetry-instrumentation
+    opentelemetry-instrumentation-asgi
+    opentelemetry-instrumentation-wsgi
+    opentelemetry-semantic-conventions
+    opentelemetry-util-http
+  ];
+
+  nativeCheckInputs = [
+    opentelemetry-test-utils
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "opentelemetry.instrumentation.django" ];
+
+  meta = opentelemetry-instrumentation.meta // {
+    homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/blob/main/instrumentation/opentelemetry-instrumentation-django";
+    description = "OpenTelemetry Instrumentation for Django";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation-grpc/default.nix b/nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation-grpc/default.nix
new file mode 100644
index 000000000000..ad408c3dfbaa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation-grpc/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, hatchling
+, opentelemetry-api
+, opentelemetry-instrumentation
+, opentelemetry-sdk
+, opentelemetry-semantic-conventions
+, opentelemetry-test-utils
+, wrapt
+, pytestCheckHook
+, grpcio
+}:
+
+buildPythonPackage {
+  inherit (opentelemetry-instrumentation) version src;
+  pname = "opentelemetry-instrumentation-grpc";
+  disabled = pythonOlder "3.7";
+
+  sourceRoot = "${opentelemetry-instrumentation.src.name}/instrumentation/opentelemetry-instrumentation-grpc";
+
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    opentelemetry-api
+    opentelemetry-instrumentation
+    opentelemetry-sdk
+    opentelemetry-semantic-conventions
+    wrapt
+  ];
+
+  passthru.optional-dependencies = {
+    instruments = [ grpcio ];
+  };
+
+  nativeCheckInputs = [
+    opentelemetry-test-utils
+    grpcio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "opentelemetry.instrumentation.grpc" ];
+
+  meta = opentelemetry-instrumentation.meta // {
+    homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-grpc";
+    description = "OpenTelemetry Instrumentation for grpc";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation-wsgi/default.nix b/nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation-wsgi/default.nix
new file mode 100644
index 000000000000..0b1fda0276c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation-wsgi/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, hatchling
+, opentelemetry-api
+, opentelemetry-instrumentation
+, opentelemetry-semantic-conventions
+, opentelemetry-test-utils
+, opentelemetry-util-http
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  inherit (opentelemetry-instrumentation) version src;
+  pname = "opentelemetry-instrumentation-wsgi";
+  disabled = pythonOlder "3.7";
+
+  sourceRoot = "${opentelemetry-instrumentation.src.name}/instrumentation/opentelemetry-instrumentation-wsgi";
+
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    opentelemetry-instrumentation
+    opentelemetry-api
+    opentelemetry-semantic-conventions
+    opentelemetry-util-http
+  ];
+
+  nativeCheckInputs = [
+    opentelemetry-test-utils
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "opentelemetry.instrumentation.wsgi" ];
+
+  meta = opentelemetry-instrumentation.meta // {
+    homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/blob/main/instrumentation/opentelemetry-instrumentation-wsgi";
+    description = "WSGI Middleware for OpenTelemetry";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation/default.nix b/nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation/default.nix
new file mode 100644
index 000000000000..4ee758ea564d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentelemetry-instrumentation/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, hatchling
+, opentelemetry-api
+, opentelemetry-sdk
+, opentelemetry-test-utils
+, setuptools
+, wrapt
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "opentelemetry-instrumentation";
+  version = "1.16.0";
+  disabled = pythonOlder "3.7";
+
+  # to avoid breakage, every package in opentelemetry-python-contrib must inherit this version, src, and meta
+  src = fetchFromGitHub {
+    owner = "open-telemetry";
+    repo = "opentelemetry-python-contrib";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-6tGQjPBej2zv5yJN0S46le3kyD7q3TELYyDmyxlp5Wo=";
+  };
+
+  sourceRoot = "${src.name}/opentelemetry-instrumentation";
+
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    opentelemetry-api
+    opentelemetry-sdk
+    setuptools
+    wrapt
+  ];
+
+  nativeCheckInputs = [
+    opentelemetry-test-utils
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "opentelemetry.instrumentation" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/opentelemetry-instrumentation";
+    description = "Instrumentation Tools & Auto Instrumentation for OpenTelemetry Python";
+    changelog = "https://github.com/open-telemetry/opentelemetry-python-contrib/releases/tag/${src.rev}";
+    license = licenses.asl20;
+    maintainers = teams.deshaw.members ++ [ maintainers.natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opentelemetry-proto/default.nix b/nixpkgs/pkgs/development/python-modules/opentelemetry-proto/default.nix
new file mode 100644
index 000000000000..21b84dd5898f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentelemetry-proto/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, hatchling
+, opentelemetry-api
+, protobuf
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  inherit (opentelemetry-api) version src;
+  pname = "opentelemetry-proto";
+  disabled = pythonOlder "3.7";
+
+  sourceRoot = "${opentelemetry-api.src.name}/opentelemetry-proto";
+
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    protobuf
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "opentelemetry.proto" ];
+
+  meta = opentelemetry-api.meta // {
+    homepage = "https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-proto";
+    description = "OpenTelemetry Python Proto";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opentelemetry-sdk/default.nix b/nixpkgs/pkgs/development/python-modules/opentelemetry-sdk/default.nix
new file mode 100644
index 000000000000..ba5e7de5db83
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentelemetry-sdk/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, flaky
+, hatchling
+, opentelemetry-api
+, opentelemetry-semantic-conventions
+, opentelemetry-test-utils
+, setuptools
+, typing-extensions
+, pytestCheckHook
+}:
+
+let
+  self = buildPythonPackage {
+    inherit (opentelemetry-api) version src;
+    pname = "opentelemetry-sdk";
+    disabled = pythonOlder "3.7";
+
+    sourceRoot = "${opentelemetry-api.src.name}/opentelemetry-sdk";
+
+    format = "pyproject";
+
+    nativeBuildInputs = [
+      hatchling
+    ];
+
+    propagatedBuildInputs = [
+      opentelemetry-api
+      opentelemetry-semantic-conventions
+      setuptools
+      typing-extensions
+    ];
+
+    nativeCheckInputs = [
+      flaky
+      opentelemetry-test-utils
+      pytestCheckHook
+    ];
+
+    disabledTestPaths = [
+      "tests/performance/benchmarks/"
+    ];
+
+    pythonImportsCheck = [ "opentelemetry.sdk" ];
+
+    doCheck = false;
+
+    # Enable tests via passthru to avoid cyclic dependency with opentelemetry-test-utils.
+    passthru.tests.${self.pname} = self.overridePythonAttrs { doCheck = true; };
+
+    meta = opentelemetry-api.meta // {
+      homepage = "https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-sdk";
+      description = "OpenTelemetry Python SDK";
+    };
+  };
+in self
diff --git a/nixpkgs/pkgs/development/python-modules/opentelemetry-semantic-conventions/default.nix b/nixpkgs/pkgs/development/python-modules/opentelemetry-semantic-conventions/default.nix
new file mode 100644
index 000000000000..d57a7f13fa53
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentelemetry-semantic-conventions/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, hatchling
+, opentelemetry-api
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  inherit (opentelemetry-api) version src;
+  pname = "opentelemetry-semantic-conventions";
+  disabled = pythonOlder "3.7";
+
+  sourceRoot = "${opentelemetry-api.src.name}/opentelemetry-semantic-conventions";
+
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "opentelemetry.semconv" ];
+
+  meta = opentelemetry-api.meta // {
+    homepage = "https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-semantic-conventions";
+    description = "OpenTelemetry Semantic Conventions";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opentelemetry-test-utils/default.nix b/nixpkgs/pkgs/development/python-modules/opentelemetry-test-utils/default.nix
new file mode 100644
index 000000000000..4e2405058b86
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentelemetry-test-utils/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, callPackage
+, buildPythonPackage
+, pythonOlder
+, asgiref
+, hatchling
+, opentelemetry-api
+, opentelemetry-sdk
+}:
+
+buildPythonPackage {
+  inherit (opentelemetry-api) version src;
+  pname = "opentelemetry-test-utils";
+  disabled = pythonOlder "3.7";
+
+  sourceRoot = "${opentelemetry-api.src.name}/tests/opentelemetry-test-utils";
+
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    asgiref
+    opentelemetry-api
+    opentelemetry-sdk
+  ];
+
+  pythonImportsCheck = [ "opentelemetry.test" ];
+
+  meta = opentelemetry-api.meta // {
+    homepage = "https://github.com/open-telemetry/opentelemetry-python/tree/main/tests/opentelemetry-test-utils";
+    description = "Test utilities for OpenTelemetry unit tests";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opentelemetry-util-http/default.nix b/nixpkgs/pkgs/development/python-modules/opentelemetry-util-http/default.nix
new file mode 100644
index 000000000000..85e28f2a6d49
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentelemetry-util-http/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, hatchling
+, opentelemetry-instrumentation
+, opentelemetry-sdk
+, opentelemetry-semantic-conventions
+, opentelemetry-test-utils
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  inherit (opentelemetry-instrumentation) version src;
+  pname = "opentelemetry-util-http";
+  disabled = pythonOlder "3.7";
+
+  sourceRoot = "${opentelemetry-instrumentation.src.name}/util/opentelemetry-util-http";
+
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    opentelemetry-instrumentation
+    opentelemetry-sdk
+    opentelemetry-semantic-conventions
+  ];
+
+  nativeCheckInputs = [
+    opentelemetry-test-utils
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "opentelemetry.util.http" ];
+
+  meta = opentelemetry-instrumentation.meta // {
+    homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/util/opentelemetry-util-http";
+    description = "Web util for OpenTelemetry";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opentimestamps/default.nix b/nixpkgs/pkgs/development/python-modules/opentimestamps/default.nix
new file mode 100644
index 000000000000..fbd3b2852eed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentimestamps/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, bitcoinlib
+, buildPythonPackage
+, fetchFromGitHub
+, git
+, gitpython
+, pycryptodomex
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "opentimestamps";
+  version = "0.4.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "opentimestamps";
+    repo = "python-opentimestamps";
+    rev = "python-opentimestamps-v${version}";
+    hash = "sha256-clG/5NAPmmmoj4b3LdVwl58DHg1EFMIMu+erx+GT+NE=";
+  };
+
+  propagatedBuildInputs = [
+    bitcoinlib
+    gitpython
+    pycryptodomex
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Remove a failing test which expects the test source file to reside in the
+  # project's Git repo
+  postPatch = ''
+    rm opentimestamps/tests/core/test_git.py
+  '';
+
+  pythonImportsCheck = [
+    "opentimestamps"
+  ];
+
+  meta = with lib; {
+    description = "Create and verify OpenTimestamps proofs";
+    homepage = "https://github.com/opentimestamps/python-opentimestamps";
+    changelog = "https://github.com/opentimestamps/python-opentimestamps/releases/tag/python-opentimestamps-v${version}";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ erikarvstedt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opentracing/default.nix b/nixpkgs/pkgs/development/python-modules/opentracing/default.nix
new file mode 100644
index 000000000000..706c47714afe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentracing/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonAtLeast
+, isPy27
+, futures ? null
+, gevent
+, mock
+, pytestCheckHook
+, tornado
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "opentracing";
+  version = "2.4.0";
+  format = "setuptools";
+
+  # incompatible with asyncio changes in 3.11 and deprecated
+  # https://github.com/opentracing/specification/issues/163
+  disabled = pythonAtLeast "3.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a173117e6ef580d55874734d1fa7ecb6f3655160b8b8974a2a1e98e5ec9c840d";
+  };
+
+  propagatedBuildInputs = lib.optional isPy27 futures;
+
+  nativeCheckInputs = [
+    gevent
+    mock
+    pytestCheckHook
+    six
+    tornado
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/opentracing/opentracing-python";
+    description = "Platform API for OpenTracing";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ rakesh4g ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opentsne/default.nix b/nixpkgs/pkgs/development/python-modules/opentsne/default.nix
new file mode 100644
index 000000000000..9fc3c7fe8143
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opentsne/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, numpy
+, oldest-supported-numpy
+, scipy
+, scikit-learn
+, pytestCheckHook
+, nix-update-script
+, setuptools
+, wheel
+}:
+
+let
+  self = buildPythonPackage rec {
+    pname = "opentsne";
+    version = "1.0.0";
+    format = "pyproject";
+
+    src = fetchFromGitHub {
+      owner = "pavlin-policar";
+      repo = "openTSNE";
+      rev = "v${version}";
+      hash = "sha256-L5Qx6dMJlXF3EaWwlFTQ3dkhGXc5PvQBXYJo+QO+Hxc=";
+    };
+
+    nativeBuildInputs = [
+      cython
+      oldest-supported-numpy
+      setuptools
+      wheel
+    ];
+
+    propagatedBuildInputs = [ numpy scipy scikit-learn ];
+
+    pythonImportsCheck = [ "openTSNE" ];
+    doCheck = false;
+
+    passthru = {
+      updateScript = nix-update-script {};
+      tests.pytest = self.overridePythonAttrs (old: {
+        pname = "${old.pname}-tests";
+        format = "other";
+
+        postPatch = "rm openTSNE -rf";
+
+        doBuild = false;
+        doInstall = false;
+
+        doCheck = true;
+        nativeCheckInputs = [ pytestCheckHook self ];
+      });
+    };
+
+    meta = {
+      description = "Modular Python implementation of t-Distributed Stochasitc Neighbor Embedding";
+      homepage = "https://github.com/pavlin-policar/openTSNE";
+      changelog = "https://github.com/pavlin-policar/openTSNE/releases/tag/${version}";
+      license = [ lib.licenses.bsd3 ];
+      maintainers = [ lib.maintainers.lucasew ];
+    };
+  };
+in self
diff --git a/nixpkgs/pkgs/development/python-modules/openusd/default.nix b/nixpkgs/pkgs/development/python-modules/openusd/default.nix
new file mode 100644
index 000000000000..70ae6eb5e08b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openusd/default.nix
@@ -0,0 +1,131 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, writeShellScriptBin
+, cmake
+, doxygen
+, draco
+, graphviz-nox
+, ninja
+, setuptools
+, pyqt6
+, pyopengl
+, jinja2
+, pyside6
+, boost
+, numpy
+, git
+, tbb
+, opensubdiv
+, openimageio
+, opencolorio
+, osl
+, ptex
+, embree
+, alembic
+, openexr
+, flex
+, bison
+, qt6
+, python
+}:
+let
+  # Matches the pyside6-uic implementation
+  # https://code.qt.io/cgit/pyside/pyside-setup.git/tree/sources/pyside-tools/pyside_tool.py?id=e501cad66146a49c7a259579c7bb94bc93a67a08#n82
+  pyside-tools-uic = writeShellScriptBin "pyside6-uic" ''
+    exec ${qt6.qtbase}/libexec/uic -g python "$@"
+  '';
+in
+buildPythonPackage rec {
+  pname = "OpenUSD";
+  version = "23.11";
+  src = fetchFromGitHub {
+    owner = "PixarAnimationStudios";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-5zQrfB14kXs75WbL3s4eyhxELglhLNxU2L2aVXiyVjg=";
+  };
+
+  outputs = ["out" "doc"];
+
+  format = "other";
+
+  propagatedBuildInputs = [
+    setuptools
+    pyqt6
+    pyopengl
+    jinja2
+    pyside6
+    pyside-tools-uic
+    boost
+    numpy
+  ];
+
+  cmakeFlags = [
+    "-DPXR_BUILD_EXAMPLES=OFF"
+    "-DPXR_BUILD_TUTORIALS=OFF"
+    "-DPXR_BUILD_USD_TOOLS=ON"
+    "-DPXR_BUILD_IMAGING=ON"
+    "-DPXR_BUILD_USD_IMAGING=ON"
+    "-DPXR_BUILD_USDVIEW=ON"
+    "-DPXR_BUILD_DOCUMENTATION=ON"
+    "-DPXR_BUILD_PYTHON_DOCUMENTATION=ON"
+    "-DPXR_BUILD_EMBREE_PLUGIN=ON"
+    "-DPXR_BUILD_ALEMBIC_PLUGIN=ON"
+    "-DPXR_ENABLE_OSL_SUPPORT=ON"
+    "-DPXR_BUILD_DRACO_PLUGIN=ON"
+    "-DPXR_BUILD_MONOLITHIC=ON" # Seems to be commonly linked to monolithically
+  ];
+
+  nativeBuildInputs = [
+    cmake
+    ninja
+    git
+    qt6.wrapQtAppsHook
+    doxygen
+    graphviz-nox
+  ];
+  buildInputs = [
+    tbb
+    opensubdiv
+    openimageio
+    opencolorio
+    osl
+    ptex
+    embree
+    alembic.dev
+    openexr
+    flex
+    bison
+    boost
+    draco
+    qt6.qtbase
+    qt6.qtwayland
+  ];
+
+  pythonImportsCheck = [ "pxr" "pxr.Usd" ];
+
+  postInstall = ''
+    # Make python lib properly accessible
+    target_dir=$out/${python.sitePackages}
+    mkdir -p $(dirname $target_dir)
+    mv $out/lib/python $target_dir
+
+    mv $out/docs $doc
+
+    rm $out/share -r # only examples
+    rm $out/tests -r
+  '';
+
+  meta = {
+    description = "Universal Scene Description";
+    longDescription = ''
+      Universal Scene Description (USD) is an efficient, scalable system
+      for authoring, reading, and streaming time-sampled scene description
+      for interchange between graphics applications.
+    '';
+    homepage = "https://openusd.org/";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ shaddydc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openvino/default.nix b/nixpkgs/pkgs/development/python-modules/openvino/default.nix
new file mode 100644
index 000000000000..20f47eb666ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openvino/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, openvino-native
+, numpy
+, python
+}:
+
+buildPythonPackage {
+  pname = "openvino";
+  inherit (openvino-native) version;
+  format = "other";
+
+  src = openvino-native.python;
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/${python.sitePackages}
+    cp -Rv * $out/${python.sitePackages}/
+
+    runHook postInstall
+  '';
+
+  pythonImportsCheck = [
+    "ngraph"
+    "openvino"
+    "openvino.runtime"
+  ];
+
+  meta = with lib; {
+    description = "OpenVINO(TM) Runtime";
+    homepage = "https://github.com/openvinotoolkit/openvino";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openwebifpy/default.nix b/nixpkgs/pkgs/development/python-modules/openwebifpy/default.nix
new file mode 100644
index 000000000000..60f94072681d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openwebifpy/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder
+, requests, zeroconf, wakeonlan
+, python }:
+
+buildPythonPackage rec {
+  pname = "openwebifpy";
+  version = "3.2.7";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0n9vi6b0y8b41fd7m9p361y3qb5m3b9p9d8g4fasqi7yy4mw2hns";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    zeroconf
+    wakeonlan
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} setup.py test
+  '';
+
+  meta = with lib; {
+    description = "Provides a python interface to interact with a device running OpenWebIf";
+    homepage = "https://openwebifpy.readthedocs.io/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/openwrt-luci-rpc/default.nix b/nixpkgs/pkgs/development/python-modules/openwrt-luci-rpc/default.nix
new file mode 100644
index 000000000000..a58d9c08c5cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openwrt-luci-rpc/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchPypi
+, packaging
+, pytestCheckHook
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "openwrt-luci-rpc";
+  version = "1.1.16";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ZvPMJbYCNKMXuTrHwXQvBZ/mMenYTsV1X4COiVxvJGY=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    requests
+    packaging
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "openwrt_luci_rpc" ];
+
+  meta = with lib; {
+    description = "Python module for interacting with the OpenWrt Luci RPC interface";
+    longDescription = ''
+      This module allows you to use the Luci RPC interface to fetch connected devices
+      on your OpenWrt based router. Supports 15.X & 17.X & 18.X or newer releases of
+      OpenWrt.
+    '';
+    homepage = "https://github.com/fbradyirl/openwrt-luci-rpc";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ matt-snider ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/openwrt-ubus-rpc/default.nix b/nixpkgs/pkgs/development/python-modules/openwrt-ubus-rpc/default.nix
new file mode 100644
index 000000000000..14d0909e658e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/openwrt-ubus-rpc/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "openwrt-ubus-rpc";
+  version = "0.0.3";
+
+  src = fetchFromGitHub {
+    owner = "Noltari";
+    repo = "python-ubus-rpc";
+    rev = version;
+    sha256 = "19scncc1w9ar3pw4yrw24akjgm74n2m7y308hzl1i360daf5p21k";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    urllib3
+  ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "openwrt.ubus" ];
+
+  meta = with lib; {
+    description = "Python API for OpenWrt ubus RPC";
+    homepage = "https://github.com/Noltari/python-ubus-rpc";
+    license = with licenses; [ gpl2Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opower/default.nix b/nixpkgs/pkgs/development/python-modules/opower/default.nix
new file mode 100644
index 000000000000..72e83c216699
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opower/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, aiohttp
+, arrow
+, buildPythonPackage
+, fetchFromGitHub
+, pyotp
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "opower";
+  version = "0.0.39";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "tronikos";
+    repo = "opower";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-5JcediHl2TeMhYa6OJqoW5K0SlAjdIrMwj2IHh3qW7I=";
+  };
+
+  pythonRemoveDeps = [
+    # https://github.com/tronikos/opower/pull/4
+    "asyncio"
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    arrow
+    pyotp
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "opower"
+  ];
+
+  meta = with lib; {
+    description = "Module for getting historical and forecasted usage/cost from utilities that use opower.com";
+    homepage = "https://github.com/tronikos/opower";
+    changelog = "https://github.com/tronikos/opower/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opsdroid-get-image-size/default.nix b/nixpkgs/pkgs/development/python-modules/opsdroid-get-image-size/default.nix
new file mode 100644
index 000000000000..edd09d2750e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opsdroid-get-image-size/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "opsdroid-get-image-size";
+  version = "0.2.2";
+  pyproject = true;
+
+  src = fetchPypi {
+    pname = "opsdroid_get_image_size";
+    inherit version;
+    hash = "sha256-Cp2tvsdCZ+/86DF7FRNwx5diGcUWLYcFwQns7nYXkog=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  # test data not included on pypi
+  doCheck = false;
+
+  pythonImportsCheck = [ "get_image_size" ];
+
+  meta = with lib; {
+    description = "Get image width and height given a file path using minimal dependencies";
+    license = licenses.mit;
+    homepage = "https://github.com/opsdroid/image_size";
+    maintainers = with maintainers; [ globin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opt-einsum/default.nix b/nixpkgs/pkgs/development/python-modules/opt-einsum/default.nix
new file mode 100644
index 000000000000..fd51ead5a0e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opt-einsum/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  version = "3.3.0";
+  pname = "opt-einsum";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "opt_einsum";
+    inherit version;
+    hash = "sha256-WfZHX3e7w33PfNdIUZwOxgci6R5jyhFOaIIcDFSkZUk=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "opt_einsum"
+  ];
+
+  meta = with lib; {
+    description = "Optimizing NumPy's einsum function with order optimization and GPU support";
+    homepage = "https://github.com/dgasmith/opt_einsum";
+    license = licenses.mit;
+    maintainers = with maintainers; [ teh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/optax/default.nix b/nixpkgs/pkgs/development/python-modules/optax/default.nix
new file mode 100644
index 000000000000..b693afc4771c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/optax/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, absl-py
+, buildPythonPackage
+, chex
+, fetchFromGitHub
+, jaxlib
+, numpy
+, callPackage
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "optax";
+  version = "0.1.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "deepmind";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-zSMJxagPe2rkhrawJ+TWXUzk6V58IY6MhWmEqLVtOoA=";
+  };
+
+  outputs = [
+    "out"
+    "testsout"
+  ];
+
+  buildInputs = [
+    jaxlib
+  ];
+
+  propagatedBuildInputs = [
+    absl-py
+    chex
+    numpy
+  ];
+
+  postInstall = ''
+    mkdir $testsout
+    cp -R examples $testsout/examples
+  '';
+
+  pythonImportsCheck = [
+    "optax"
+  ];
+
+  # check in passthru.tests.pytest to escape infinite recursion with flax
+  doCheck = false;
+
+  passthru.tests = {
+    pytest = callPackage ./tests.nix { };
+  };
+
+  meta = with lib; {
+    description = "Gradient processing and optimization library for JAX";
+    homepage = "https://github.com/deepmind/optax";
+    changelog = "https://github.com/deepmind/optax/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ndl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/optax/tests.nix b/nixpkgs/pkgs/development/python-modules/optax/tests.nix
new file mode 100644
index 000000000000..1ab548f2f399
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/optax/tests.nix
@@ -0,0 +1,33 @@
+{ buildPythonPackage
+, dm-haiku
+, pytest-xdist
+, pytestCheckHook
+, tensorflow
+, tensorflow-datasets
+, flax
+, optax
+}:
+
+buildPythonPackage {
+  pname = "optax-tests";
+  inherit (optax) version;
+
+  src = optax.testsout;
+
+  dontBuild = true;
+  dontInstall = true;
+
+  nativeCheckInputs = [
+    dm-haiku
+    pytest-xdist
+    pytestCheckHook
+    tensorflow
+    tensorflow-datasets
+    flax
+  ];
+
+  disabledTestPaths = [
+    # See https://github.com/deepmind/optax/issues/323
+    "examples/lookahead_mnist_test.py"
+  ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/optimum/default.nix b/nixpkgs/pkgs/development/python-modules/optimum/default.nix
new file mode 100644
index 000000000000..57b8b3d8475a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/optimum/default.nix
@@ -0,0 +1,115 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, coloredlogs
+, datasets
+, evaluate
+, h5py
+, huggingface-hub
+, numpy
+, onnx
+, onnxruntime
+, packaging
+, protobuf
+, sympy
+, tensorflow
+, tf2onnx
+, timm
+, torch
+, transformers
+}:
+
+buildPythonPackage rec {
+  pname = "optimum";
+  version = "1.14.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "huggingface";
+    repo = "optimum";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-aHolI+vM3sA83elsqxY5yaiZGB+I0okjSdRmjTRaxJI=";
+  };
+
+  propagatedBuildInputs = [
+    coloredlogs
+    datasets
+    huggingface-hub
+    numpy
+    packaging
+    sympy
+    torch
+    transformers
+  ] ++ transformers.optional-dependencies.sentencepiece;
+
+  passthru.optional-dependencies = {
+    onnxruntime = [
+      onnx
+      onnxruntime
+      datasets
+      evaluate
+      protobuf
+    ];
+    exporters = [
+      onnx
+      onnxruntime
+      timm
+    ];
+    exporters-tf = [
+      tensorflow
+      tf2onnx
+      onnx
+      onnxruntime
+      timm
+      h5py
+      numpy
+    ];
+    diffusers = [
+      # diffusers
+    ];
+    intel = [
+      # optimum-intel
+    ];
+    openvino = [
+      # optimum-intel
+    ]; # ++ optimum-intel.optional-dependencies.openvino;
+    nncf = [
+      # optimum-intel
+    ]; # ++ optimum-intel.optional-dependencies.nncf;
+    neural-compressor = [
+      # optimum-intel
+    ]; # ++ optimum-intel.optional-dependencies.neural-compressor;
+    graphcore = [
+      # optimum-graphcore
+    ];
+    habana = [
+      transformers
+      # optimum-habana
+    ];
+    neuron = [
+      # optimum-neuron
+    ]; # ++ optimum-neuron.optional-dependencies.neuron;
+    neuronx = [
+      # optimum-neuron
+    ]; # ++ optimum-neuron.optional-dependencies.neuronx;
+    furiosa = [
+      # optimum-furiosa
+    ];
+  };
+
+  # almost all tests try to connect to https://huggingface.co
+  doCheck = false;
+
+  pythonImportsCheck = [ "optimum" ];
+
+  meta = with lib; {
+    description = "Accelerate training and inference of 🤗 Transformers and 🤗 Diffusers with easy to use hardware optimization tools";
+    homepage = "https://github.com/huggingface/optimum";
+    changelog = "https://github.com/huggingface/optimum/releases/tag/${src.rev}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/optuna/default.nix b/nixpkgs/pkgs/development/python-modules/optuna/default.nix
new file mode 100644
index 000000000000..7a3b3cca06b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/optuna/default.nix
@@ -0,0 +1,142 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, alembic
+, boto3
+, botorch
+, catboost
+, cma
+, cmaes
+, colorlog
+, distributed
+, fakeredis
+, fastai
+, google-cloud-storage
+, lightgbm
+, matplotlib
+, mlflow
+, moto
+, numpy
+, packaging
+, pandas
+, plotly
+, pytest-xdist
+, pytorch-lightning
+, pyyaml
+, redis
+, scikit-learn
+, scikit-optimize
+, scipy
+, setuptools
+, shap
+, sqlalchemy
+, tensorflow
+, torch
+, torchaudio
+, torchvision
+, tqdm
+, wandb
+, wheel
+, xgboost
+}:
+
+buildPythonPackage rec {
+  pname = "optuna";
+  version = "3.4.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "optuna";
+    repo = "optuna";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-WUjO13NxX0FneOPS4nn6aHq48X95r+GJR/Oxir6n8Pk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    alembic
+    colorlog
+    numpy
+    packaging
+    sqlalchemy
+    tqdm
+    pyyaml
+  ];
+
+  passthru.optional-dependencies = {
+    integration = [
+      botorch
+      catboost
+      cma
+      distributed
+      fastai
+      lightgbm
+      mlflow
+      pandas
+      # pytorch-ignite
+      pytorch-lightning
+      scikit-learn
+      scikit-optimize
+      shap
+      tensorflow
+      torch
+      torchaudio
+      torchvision
+      wandb
+      xgboost
+    ];
+    optional = [
+      boto3
+      botorch
+      cmaes
+      google-cloud-storage
+      matplotlib
+      pandas
+      plotly
+      redis
+      scikit-learn
+    ];
+  };
+
+  preCheck = ''
+    export PATH=$out/bin:$PATH
+  '';
+
+  nativeCheckInputs = [
+    fakeredis
+    moto
+    pytest-xdist
+    pytestCheckHook
+    scipy
+  ] ++ fakeredis.optional-dependencies.lua
+    ++ passthru.optional-dependencies.optional;
+
+  pytestFlagsArray = [
+    "-m 'not integration'"
+  ];
+
+  disabledTestPaths = [
+    # require unpackaged kaleido and building it is a bit difficult
+    "tests/visualization_tests"
+  ];
+
+  pythonImportsCheck = [
+    "optuna"
+  ];
+
+  meta = with lib; {
+    description = "A hyperparameter optimization framework";
+    homepage = "https://optuna.org/";
+    changelog = "https://github.com/optuna/optuna/releases/tag/${src.rev}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opuslib/default.nix b/nixpkgs/pkgs/development/python-modules/opuslib/default.nix
new file mode 100644
index 000000000000..d023c570bcbb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opuslib/default.nix
@@ -0,0 +1,52 @@
+{ buildPythonPackage,
+  fetchFromGitHub,
+  fetchpatch,
+  isPy27,
+  libopus,
+  nose,
+  lib, stdenv,
+  substituteAll,
+}:
+
+buildPythonPackage rec {
+  pname = "opuslib";
+  version = "3.0.3";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "orion-labs";
+    repo = pname;
+    rev = "92109c528f9f6c550df5e5325ca0fcd4f86b0909";
+    hash = "sha256-NxmC/4TTIEDVzrfMPN4PcT1JY4QCw8IBMy80XiM/o00=";
+  };
+
+  patches = [
+    # https://github.com/orion-labs/opuslib/pull/22
+    (fetchpatch {
+      name = "fix-variadic-functions-on-aarch64-darwin.patch";
+      url = "https://github.com/orion-labs/opuslib/commit/8aee916e4da4b3183d49cff5a986dc2408076d8d.patch";
+      hash = "sha256-oa1HCFHNS3ejzSf0jxv9NueUKOZgdCtpv+xTrjYW5os=";
+    })
+    # https://github.com/orion-labs/opuslib/pull/25
+    (fetchpatch {
+      name = "fix-tests-when-using-libopus-1.4.patch";
+      url = "https://github.com/orion-labs/opuslib/commit/87a214fc98c1dcae38035e99fe8e279a160c4a52.patch";
+      hash = "sha256-UoOafyTFvWLY7ErtBhkXTZSgbMZFrg5DGxjbhqEI7wo=";
+    })
+    (substituteAll {
+      src = ./opuslib-paths.patch;
+      opusLibPath = "${libopus}/lib/libopus${stdenv.hostPlatform.extensions.sharedLibrary}";
+    })
+  ];
+
+  nativeCheckInputs = [ nose ];
+
+  meta = with lib; {
+    description = "Python bindings to the libopus, IETF low-delay audio codec";
+    homepage = "https://github.com/orion-labs/opuslib";
+    license = licenses.bsd3;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ thelegy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/opuslib/opuslib-paths.patch b/nixpkgs/pkgs/development/python-modules/opuslib/opuslib-paths.patch
new file mode 100644
index 000000000000..fd2cfc8dbde2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opuslib/opuslib-paths.patch
@@ -0,0 +1,26 @@
+diff --git a/opuslib/api/__init__.py b/opuslib/api/__init__.py
+index 323a2a4..4c8a8fe 100644
+--- a/opuslib/api/__init__.py
++++ b/opuslib/api/__init__.py
+@@ -7,20 +7,12 @@
+
+ import ctypes  # type: ignore
+
+-from ctypes.util import find_library  # type: ignore
+-
+ __author__ = 'Никита Кузнецов <self@svartalf.info>'
+ __copyright__ = 'Copyright (c) 2012, SvartalF'
+ __license__ = 'BSD 3-Clause License'
+
+
+-lib_location = find_library('opus')
+-
+-if lib_location is None:
+-    raise Exception(
+-        'Could not find Opus library. Make sure it is installed.')
+-
+-libopus = ctypes.CDLL(lib_location)
++libopus = ctypes.CDLL('@opusLibPath@')
+
+ c_int_pointer = ctypes.POINTER(ctypes.c_int)
+ c_int16_pointer = ctypes.POINTER(ctypes.c_int16)
diff --git a/nixpkgs/pkgs/development/python-modules/opytimark/default.nix b/nixpkgs/pkgs/development/python-modules/opytimark/default.nix
new file mode 100644
index 000000000000..69eb61f795bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/opytimark/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, numpy
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "opytimark";
+  version = "1.0.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "gugarosa";
+    repo = "opytimark";
+    rev = "v${version}";
+    hash = "sha256-T3OFm10gvGrUXAAHOnO0Zv1nWrXPBXSmEWnbJxrWYU0=";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://patch-diff.githubusercontent.com/raw/gugarosa/opytimark/pull/2.patch";
+      hash = "sha256-r/oCKI9Q1nuCZDGHx7UW8j523sFe4EFmguMOJTs/LOU=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # several tests are failing
+  disabledTests = [
+    "test_year"
+    "test_decorator"
+    "test_loader"
+    "cec_benchmark"
+  ];
+
+  pythonImportsCheck = [
+    "opytimark"
+  ];
+
+  meta = with lib; {
+    description = "Library consisting of optimization benchmarking functions";
+    homepage = "https://github.com/gugarosa/opytimark";
+    changelog = "https://github.com/gugarosa/opytimark/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ firefly-cpp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oracledb/default.nix b/nixpkgs/pkgs/development/python-modules/oracledb/default.nix
new file mode 100644
index 000000000000..cdaa5ee907a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oracledb/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, cython_3
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "oracledb";
+  version = "1.4.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-4o7ZBG8nNdwt1bvN82Z/KE44Tg7H7tPus3mPqKfUfjY=";
+  };
+
+  nativeBuildInputs = [
+    cython_3
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  # Checks need an Oracle database
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "oracledb"
+  ];
+
+  meta = with lib; {
+    description = "Python driver for Oracle Database";
+    homepage = "https://oracle.github.io/python-oracledb";
+    changelog = "https://github.com/oracle/python-oracledb/blob/v${version}/doc/src/release_notes.rst";
+    license = with licenses; [ asl20 /* and or */ upl ];
+    maintainers = with maintainers; [ harvidsen ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oralb-ble/default.nix b/nixpkgs/pkgs/development/python-modules/oralb-ble/default.nix
new file mode 100644
index 000000000000..5eb5d0ce83fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oralb-ble/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, bleak-retry-connector
+, bluetooth-data-tools
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, fetchFromGitHub
+, home-assistant-bluetooth
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "oralb-ble";
+  version = "0.17.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-6LnZ+Y68sl0uA5i764n4fFJnPeo+bAi/xgEvTK6LkXY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bleak-retry-connector
+    bluetooth-data-tools
+    bluetooth-sensor-state-data
+    home-assistant-bluetooth
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=oralb_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "oralb_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for Oral B BLE devices";
+    homepage = "https://github.com/Bluetooth-Devices/oralb-ble";
+    changelog = "https://github.com/Bluetooth-Devices/oralb-ble/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/orange-canvas-core/default.nix b/nixpkgs/pkgs/development/python-modules/orange-canvas-core/default.nix
new file mode 100644
index 000000000000..e40a9a03e764
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/orange-canvas-core/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, anyqt
+, cachecontrol
+, commonmark
+, dictdiffer
+, docutils
+, filelock
+, lockfile
+, numpy
+, pytest-qt
+, pytestCheckHook
+, qasync
+, qt5
+, requests-cache
+}:
+
+buildPythonPackage rec {
+  pname = "orange-canvas-core";
+  version = "0.1.35";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xLCwjeNDx9RqxlNkIWMo0Pcrg7akGuu4Rv9oRDgOK18=";
+  };
+
+  propagatedBuildInputs = [
+    anyqt
+    cachecontrol
+    commonmark
+    dictdiffer
+    docutils
+    filelock
+    lockfile
+    numpy
+    qasync
+    requests-cache
+  ];
+
+  pythonImportsCheck = [ "orangecanvas" ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+    export QT_PLUGIN_PATH="${qt5.qtbase.bin}/${qt5.qtbase.qtPluginPrefix}"
+    export QT_QPA_PLATFORM_PLUGIN_PATH="${qt5.qtbase.bin}/lib/qt-${qt5.qtbase.version}/plugins";
+    export QT_QPA_PLATFORM=offscreen
+  '';
+
+  nativeCheckInputs = [
+    pytest-qt
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    "orangecanvas/canvas/items/tests/test_graphicstextitem.py"
+  ];
+
+  meta = {
+    description = "Orange framework for building graphical user interfaces for editing workflows";
+    homepage = "https://github.com/biolab/orange-canvas-core";
+    license = [ lib.licenses.gpl3 ];
+    maintainers = [ lib.maintainers.lucasew ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/orange-widget-base/default.nix b/nixpkgs/pkgs/development/python-modules/orange-widget-base/default.nix
new file mode 100644
index 000000000000..c89a1a8e2ce0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/orange-widget-base/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pyqt5
+, pyqtwebengine
+, matplotlib
+, orange-canvas-core
+, pyqtgraph
+, typing-extensions
+, qt5
+, pytestCheckHook
+, pytest-qt
+, appnope
+}:
+
+buildPythonPackage rec {
+  pname = "orange-widget-base";
+  version = "4.22.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-nV2aBPZzn7K+QECtCVoLLh5smG31zE2G9jFTKlxh9qM=";
+  };
+
+  propagatedBuildInputs = [
+    matplotlib
+    orange-canvas-core
+    pyqt5
+    pyqtgraph
+    pyqtwebengine
+    typing-extensions
+  ] ++ lib.optionals stdenv.isDarwin [
+    appnope
+  ];
+
+  pythonImportsCheck = [ "orangewidget" ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+    export QT_PLUGIN_PATH="${qt5.qtbase.bin}/${qt5.qtbase.qtPluginPrefix}"
+    export QT_QPA_PLATFORM_PLUGIN_PATH="${qt5.qtbase.bin}/lib/qt-${qt5.qtbase.version}/plugins";
+    export QT_QPA_PLATFORM=offscreen
+  '';
+
+  nativeCheckInputs = [
+    pytest-qt
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    "orangewidget/report/tests/test_report.py"
+    "orangewidget/tests/test_widget.py"
+  ];
+
+  meta = {
+    description = "Implementation of the base OWBaseWidget class and utilities for use in Orange Canvas workflows";
+    homepage = "https://github.com/biolab/orange-widget-base";
+    license = [ lib.licenses.gpl3Plus ];
+    maintainers = [ lib.maintainers.lucasew ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/orange3/default.nix b/nixpkgs/pkgs/development/python-modules/orange3/default.nix
new file mode 100644
index 000000000000..1100ae7f6dc6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/orange3/default.nix
@@ -0,0 +1,178 @@
+{ lib
+, baycomp
+, bottleneck
+, buildPythonPackage
+, chardet
+, copyDesktopItems
+, cython
+, fetchFromGitHub
+, fetchurl
+, httpx
+, joblib
+, keyring
+, keyrings-alt
+, makeDesktopItem
+, matplotlib
+, nix-update-script
+, numpy
+, oldest-supported-numpy
+, openpyxl
+, opentsne
+, orange-canvas-core
+, orange-widget-base
+, pandas
+, pyqtgraph
+, pyqtwebengine
+, python
+, python-louvain
+, pythonOlder
+, pyyaml
+, qt5
+, qtconsole
+, recommonmark
+, requests
+, scikit-learn
+, scipy
+, serverfiles
+, setuptools
+, sphinx
+, wheel
+, xlrd
+, xlsxwriter
+}:
+
+let
+  self = buildPythonPackage rec {
+    pname = "orange3";
+    version = "3.36.2";
+
+    disabled = pythonOlder "3.7";
+
+    src = fetchFromGitHub {
+      owner = "biolab";
+      repo = "orange3";
+      rev = "refs/tags/${version}";
+      hash = "sha256-v9lk5vGhBaR2PHZ+Jq0hy1WaCsbeLe+vZlTaHBkfacU=";
+    };
+
+    postPatch = ''
+      substituteInPlace pyproject.toml \
+        --replace "setuptools>=41.0.0,<50.0" "setuptools"
+      sed -i 's;\(scikit-learn\)[^$]*;\1;g' requirements-core.txt
+      sed -i 's;pyqtgraph[^$]*;;g' requirements-gui.txt # TODO: remove after bump with a version greater than 0.13.1
+    '';
+
+    nativeBuildInputs = [
+      copyDesktopItems
+      cython
+      oldest-supported-numpy
+      qt5.wrapQtAppsHook
+      recommonmark
+      setuptools
+      sphinx
+      wheel
+    ];
+
+    enableParallelBuilding = true;
+
+    propagatedBuildInputs = [
+      numpy
+      scipy
+      chardet
+      openpyxl
+      opentsne
+      qtconsole
+      bottleneck
+      matplotlib
+      joblib
+      requests
+      keyring
+      scikit-learn
+      pandas
+      pyqtwebengine
+      serverfiles
+      orange-canvas-core
+      python-louvain
+      xlrd
+      xlsxwriter
+      httpx
+      pyqtgraph
+      orange-widget-base
+      keyrings-alt
+      pyyaml
+      baycomp
+    ];
+
+    # FIXME: ImportError: cannot import name '_variable' from partially initialized module 'Orange.data' (most likely due to a circular import) (/build/source/Orange/data/__init__.py)
+    doCheck = false;
+
+    pythonImportsCheck = [ "Orange" "Orange.data._variable" ];
+
+    desktopItems = [
+      (makeDesktopItem {
+        name = "orange";
+        exec = "orange-canvas";
+        desktopName = "Orange Data Mining";
+        genericName = "Data Mining Suite";
+        comment = "Explore, analyze, and visualize your data";
+        icon = "orange-canvas";
+        mimeTypes = [ "application/x-extension-ows" ];
+        categories = [ "Science" "Education" "ArtificialIntelligence" "DataVisualization" "NumericalAnalysis" "Qt" ];
+        keywords = [ "Machine Learning" "Scientific Visualization" "Statistical Analysis" ];
+      })
+    ];
+
+    postInstall = ''
+      wrapProgram $out/bin/orange-canvas \
+        "${"$"}{qtWrapperArgs[@]}"
+      mkdir -p $out/share/icons/hicolor/{256x256,48x48}/apps
+      cp distribute/icon-256.png $out/share/icons/hicolor/256x256/apps/orange-canvas.png
+      cp distribute/icon-48.png $out/share/icons/hicolor/48x48/apps/orange-canvas.png
+    '';
+
+    passthru = {
+      updateScript = nix-update-script { };
+      tests.unittests = self.overridePythonAttrs (old: {
+        pname = "${old.pname}-tests";
+        format = "other";
+
+        preCheck = ''
+          export HOME=$(mktemp -d)
+          export QT_PLUGIN_PATH="${qt5.qtbase.bin}/${qt5.qtbase.qtPluginPrefix}"
+          export QT_QPA_PLATFORM_PLUGIN_PATH="${qt5.qtbase.bin}/lib/qt-${qt5.qtbase.version}/plugins";
+          export QT_QPA_PLATFORM=offscreen
+
+          rm Orange -rf
+          cp -r ${self}/${python.sitePackages}/Orange .
+          chmod +w -R .
+
+          rm Orange/tests/test_url_reader.py # uses network
+          rm Orange/tests/test_ada_boost.py # broken: The 'base_estimator' parameter of AdaBoostRegressor must be an object implementing 'fit' and 'predict' or a str among {'deprecated'}. Got None instead.
+        '';
+
+        checkPhase = ''
+          runHook preCheck
+          ${python.interpreter} -m unittest -b -v ./Orange/**/test*.py
+          runHook postCheck
+        '';
+
+        postInstall = "";
+
+        doBuild = false;
+        doInstall = false;
+
+        nativeBuildInputs = [ self ] ++ old.nativeBuildInputs;
+      });
+    };
+
+    meta = with lib; {
+      description = "Data mining and visualization toolbox for novice and expert alike";
+      homepage = "https://orangedatamining.com/";
+      changelog = "https://github.com/biolab/orange3/blob/${version}/CHANGELOG.md";
+      license = with licenses; [ gpl3Plus ];
+      maintainers = with maintainers; [ lucasew ];
+      mainProgram = "orange-canvas";
+    };
+  };
+in
+self
diff --git a/nixpkgs/pkgs/development/python-modules/ordered-set/default.nix b/nixpkgs/pkgs/development/python-modules/ordered-set/default.nix
new file mode 100644
index 000000000000..d0ac537171a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ordered-set/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, flit-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ordered-set";
+  version = "4.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-aUqORMh2V8WSku3nKJHrkdNBMfZTFGOqswCRkcdzZKg=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ordered_set"
+  ];
+
+  meta = with lib; {
+    description = "A MutableSet that remembers its order, so that every entry has an index.";
+    homepage = "https://github.com/rspeer/ordered-set";
+    license = licenses.mit;
+    maintainers = with maintainers; [ MostAwesomeDude ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/orderedmultidict/default.nix b/nixpkgs/pkgs/development/python-modules/orderedmultidict/default.nix
new file mode 100644
index 000000000000..f2688d46b2e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/orderedmultidict/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, flake8, six, pythonOlder, importlib-metadata }:
+
+buildPythonPackage rec {
+  pname = "orderedmultidict";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1bc2v0yflsxjyyjx4q9wqx0j3bvzcw9z87d5pz4iqac7bsxhn1q4";
+  };
+
+  nativeCheckInputs = [ flake8 ];
+
+  propagatedBuildInputs = [ six ]
+    ++ lib.optionals (pythonOlder "3.8") [
+      importlib-metadata
+    ];
+
+  meta = with lib; {
+    description = "Ordered Multivalue Dictionary.";
+    homepage = "https://github.com/gruns/orderedmultidict";
+    license = licenses.publicDomain;
+    maintainers = with maintainers; [ vanzef ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/orderedset/default.nix b/nixpkgs/pkgs/development/python-modules/orderedset/default.nix
new file mode 100644
index 000000000000..4141d053ad45
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/orderedset/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "orderedset";
+  version = "2.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0abf19w37kxypsj6v7dz79jj92y1kivjk2zivnrv7rw6bbxwrxdj";
+  };
+
+  meta = with lib; {
+    description = "An Ordered Set implementation in Cython";
+    homepage = "https://pypi.python.org/pypi/orderedset";
+    license = licenses.bsd3;
+    maintainers = [ ];
+    # No support for Python 3.9/3.10
+    # https://github.com/simonpercivall/orderedset/issues/36
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/orjson/default.nix b/nixpkgs/pkgs/development/python-modules/orjson/default.nix
new file mode 100644
index 000000000000..fb81938bc091
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/orjson/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, stdenv
+, pythonOlder
+, rustPlatform
+, fetchFromGitHub
+, buildPythonPackage
+, cffi
+, libiconv
+, numpy
+, psutil
+, pytestCheckHook
+, python-dateutil
+, pytz
+, xxhash
+}:
+
+buildPythonPackage rec {
+  pname = "orjson";
+  version = "3.9.10";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ijl";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-MkcuayNDt7/GcswXoFTvzuaZzhQEQV+V7OfKqgJwVIQ=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-2eRV+oZQvsWWJ4AUTeuE0CHtTHC6jNZiX/y5uXuwvns=";
+  };
+
+  nativeBuildInputs = [
+    cffi
+  ] ++ (with rustPlatform; [
+    cargoSetupHook
+    maturinBuildHook
+  ]);
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    libiconv
+  ];
+
+  nativeCheckInputs = [
+    numpy
+    psutil
+    pytestCheckHook
+    python-dateutil
+    pytz
+    xxhash
+  ];
+
+  pythonImportsCheck = [
+    "orjson"
+  ];
+
+  meta = with lib; {
+    description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy";
+    homepage = "https://github.com/ijl/orjson";
+    changelog = "https://github.com/ijl/orjson/blob/${version}/CHANGELOG.md";
+    license = with licenses; [ asl20 mit ];
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ misuzu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/orm/default.nix b/nixpkgs/pkgs/development/python-modules/orm/default.nix
new file mode 100644
index 000000000000..1b3ed285029f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/orm/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, aiomysql
+, aiosqlite
+, asyncpg
+, buildPythonPackage
+, databases
+, fetchFromGitHub
+, pythonOlder
+, typesystem
+}:
+
+buildPythonPackage rec {
+  pname = "orm";
+  version = "0.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "encode";
+    repo = "orm";
+    rev = version;
+    hash = "sha256-nlKEWdqttFnjBnXutlxTy9oILqFzKHKKPJpTtCUbJ5k=";
+  };
+
+  propagatedBuildInputs = [
+    aiomysql
+    aiosqlite
+    asyncpg
+    databases
+    typesystem
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "typesystem==0.3.1" "typesystem"
+  '';
+
+  # Tests require databases
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "orm"
+  ];
+
+  meta = with lib; {
+    description = "An async ORM";
+    homepage = "https://github.com/encode/orm";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ormar/default.nix b/nixpkgs/pkgs/development/python-modules/ormar/default.nix
new file mode 100644
index 000000000000..e50d9b2788fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ormar/default.nix
@@ -0,0 +1,168 @@
+{ lib
+, aiomysql
+, aiopg
+, aiosqlite
+, asyncpg
+, buildPythonPackage
+, cryptography
+, databases
+, fastapi
+, fetchFromGitHub
+, httpx
+, importlib-metadata
+, mysqlclient
+, nest-asyncio
+, orjson
+, poetry-core
+, psycopg2
+, pydantic
+, pymysql
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, sqlalchemy
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "ormar";
+  version = "0.12.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "collerek";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Yd5ex0bcy61zq5Sn2dKeb98s/CMxUWnyGx6jFWQ3RUs=";
+  };
+
+  pythonRelaxDeps = [
+    "databases"
+    "pydantic"
+    "SQLAlchemy"
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    databases
+    psycopg2
+    pydantic
+    sqlalchemy
+    psycopg2
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+    importlib-metadata
+  ];
+
+  passthru.optional-dependencies = {
+    postgresql = [
+      asyncpg
+    ];
+    postgres = [
+      asyncpg
+    ];
+    aiopg = [
+      aiopg
+    ];
+    mysql = [
+      aiomysql
+    ];
+    sqlite = [
+      aiosqlite
+    ];
+    orjson = [
+      orjson
+    ];
+    crypto = [
+      cryptography
+    ];
+    all = [
+      aiomysql
+      aiopg
+      aiosqlite
+      asyncpg
+      cryptography
+      mysqlclient
+      orjson
+      pymysql
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  checkInputs = [
+    fastapi
+    httpx
+    nest-asyncio
+    pytest-asyncio
+  ] ++ passthru.optional-dependencies.all;
+
+  disabledTestPaths = [
+    "benchmarks/test_benchmark_*.py"
+  ];
+
+  disabledTests = [
+    # TypeError: Object of type bytes is not JSON serializable
+    "test_bulk_operations_with_json"
+    "test_all_endpoints"
+    # Tests require a database
+    "test_model_multiple_instances_of_same_table_in_schema"
+    "test_load_all_multiple_instances_of_same_table_in_schema"
+    "test_filter_groups_with_instances_of_same_table_in_schema"
+    "test_model_multiple_instances_of_same_table_in_schema"
+    "test_right_tables_join"
+    "test_multiple_reverse_related_objects"
+    "test_related_with_defaults"
+    "test_model_creation"
+    "test_default_orders_is_applied_on_related_two_fields"
+    "test_default_orders_is_applied_from_relation"
+    "test_sum_method"
+    "test_count_method "
+    "test_queryset_methods"
+    "test_queryset_update"
+    "test_selecting_subset"
+    "test_selecting_subset_of_through_model"
+    "test_simple_queryset_values"
+    "test_queryset_values_nested_relation"
+    "test_queryset_simple_values_list"
+    "test_queryset_nested_relation_values_list"
+    "test_queryset_nested_relation_subset_of_fields_values_list"
+    "test_m2m_values"
+    "test_nested_m2m"
+    "test_nested_flatten_and_exception"
+    "test_queryset_values_multiple_select_related"
+    "test_querysetproxy_values"
+    "test_querysetproxy_values_list"
+    "test_reverse_many_to_many_cascade"
+    "test_not_saved_raises_error"
+    "test_not_existing_raises_error"
+    "test_assigning_related_objects"
+    "test_quering_of_the_m2m_models"
+    "test_removal_of_the_relations"
+    "test_selecting_related"
+    "test_adding_unsaved_related"
+    "test_removing_unsaved_related"
+    "test_quering_of_related_model_works_but_no_result"
+  ];
+
+  pythonImportsCheck = [
+    "ormar"
+  ];
+
+  meta = with lib; {
+    description = "Async ORM with fastapi in mind and pydantic validation";
+    homepage = "https://github.com/collerek/ormar";
+    changelog = "https://github.com/collerek/ormar/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ andreasfelix ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/orvibo/default.nix b/nixpkgs/pkgs/development/python-modules/orvibo/default.nix
new file mode 100644
index 000000000000..8de932a82f0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/orvibo/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "orvibo";
+  version = "1.1.1";
+
+  src = fetchFromGitHub {
+    owner = "happyleavesaoc";
+    repo = "python-orvibo";
+    rev = version;
+    sha256 = "042prd5yxqvlfija7ii1xn424iv1p7ndhxv6m67ij8cbvspwx356";
+  };
+
+  # Project as no tests
+  doCheck = false;
+  pythonImportsCheck = [ "orvibo" ];
+
+  meta = with lib; {
+    description = "Python client to work with Orvibo devices";
+    homepage = "https://github.com/happyleavesaoc/python-orvibo";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/os-service-types/default.nix b/nixpkgs/pkgs/development/python-modules/os-service-types/default.nix
new file mode 100644
index 000000000000..de138c5a1602
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/os-service-types/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pbr
+, six
+, callPackage
+}:
+
+buildPythonPackage rec {
+  pname = "os-service-types";
+  version = "1.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "31800299a82239363995b91f1ebf9106ac7758542a1e4ef6dc737a5932878c6c";
+  };
+
+  postPatch = ''
+    # only a small portion of the listed packages are actually needed for running the tests
+    # so instead of removing them one by one remove everything
+    rm test-requirements.txt
+  '';
+
+  propagatedBuildInputs = [ pbr six ];
+
+  # check in passthru.tests.pytest to escape infinite recursion with other oslo components
+  doCheck = false;
+
+  passthru.tests = {
+    tests = callPackage ./tests.nix { };
+  };
+
+  pythonImportsCheck = [ "os_service_types" ];
+
+  meta = with lib; {
+    description = "Python library for consuming OpenStack service-types-authority data";
+    homepage = "https://github.com/openstack/os-service-types";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/os-service-types/tests.nix b/nixpkgs/pkgs/development/python-modules/os-service-types/tests.nix
new file mode 100644
index 000000000000..a0996765cb6b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/os-service-types/tests.nix
@@ -0,0 +1,36 @@
+{ buildPythonPackage
+, keystoneauth1
+, os-service-types
+, oslotest
+, requests-mock
+, stestr
+, testscenarios
+}:
+
+buildPythonPackage {
+  pname = "os-service-types-tests";
+  inherit (os-service-types) version src;
+  format = "other";
+
+  postPatch = ''
+    # only a small portion of the listed packages are actually needed for running the tests
+    # so instead of removing them one by one remove everything
+    rm test-requirements.txt
+  '';
+
+  dontBuild = true;
+  dontInstall = true;
+
+  nativeCheckInputs = [
+    os-service-types
+    keystoneauth1
+    oslotest
+    requests-mock
+    stestr
+    testscenarios
+  ];
+
+  checkPhase = ''
+    stestr run
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/osc-lib/default.nix b/nixpkgs/pkgs/development/python-modules/osc-lib/default.nix
new file mode 100644
index 000000000000..2add2f7e98d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/osc-lib/default.nix
@@ -0,0 +1,64 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, cliff
+, oslo-i18n
+, oslo-utils
+, openstacksdk
+, pbr
+, requests-mock
+, simplejson
+, stestr
+}:
+
+buildPythonPackage rec {
+  pname = "osc-lib";
+  version = "2.8.0";
+
+  src = fetchFromGitHub {
+    owner = "openstack";
+    repo = "osc-lib";
+    rev = version;
+    hash = "sha256-ijL/m9BTAgDUjqy77nkl3rDppeUPBycmEqlL6uMruIA=";
+  };
+
+  # fake version to make pbr.packaging happy and not reject it...
+  PBR_VERSION = version;
+
+  nativeBuildInputs = [
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    cliff
+    openstacksdk
+    oslo-i18n
+    oslo-utils
+    simplejson
+  ];
+
+  nativeCheckInputs = [
+    requests-mock
+    stestr
+  ];
+
+  checkPhase = ''
+    # tests parse cli output which slightly changed
+    stestr run -e <(echo "
+      osc_lib.tests.utils.test_tags.TestTagHelps.test_add_tag_filtering_option_to_parser
+      osc_lib.tests.utils.test_tags.TestTagHelps.test_add_tag_option_to_parser_for_create
+      osc_lib.tests.utils.test_tags.TestTagHelps.test_add_tag_option_to_parser_for_set
+      osc_lib.tests.utils.test_tags.TestTagHelps.test_add_tag_option_to_parser_for_unset
+    ")
+  '';
+
+  pythonImportsCheck = [ "osc_lib" ];
+
+  meta = with lib; {
+    description = "OpenStackClient Library";
+    homepage = "https://github.com/openstack/osc-lib";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/osc/default.nix b/nixpkgs/pkgs/development/python-modules/osc/default.nix
new file mode 100644
index 000000000000..737ea4208472
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/osc/default.nix
@@ -0,0 +1,49 @@
+{ stdenv
+, bashInteractive
+, buildPythonPackage
+, cryptography
+, diffstat
+, fetchFromGitHub
+, lib
+, rpm
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "osc";
+  version = "1.3.1";
+
+  src = fetchFromGitHub {
+    owner = "openSUSE";
+    repo = "osc";
+    rev = version;
+    sha256 = "sha256-pywSXGM3IX3cTr1uJIP7pNGIYE/skMIoJeoaMU75zwc=";
+  };
+
+  buildInputs = [ bashInteractive ]; # needed for bash-completion helper
+  nativeCheckInputs = [ rpm diffstat ];
+  propagatedBuildInputs = [ urllib3 cryptography ];
+
+  postInstall = ''
+    install -D -m444 contrib/osc.fish $out/etc/fish/completions/osc.fish
+    install -D -m555 contrib/osc.complete $out/share/bash-completion/helpers/osc-helper
+    mkdir -p $out/share/bash-completion/completions
+    cat >>$out/share/bash-completion/completions/osc <<EOF
+    test -z "\$BASH_VERSION" && return
+    complete -o default _nullcommand >/dev/null 2>&1 || return
+    complete -r _nullcommand >/dev/null 2>&1         || return
+    complete -o default -C $out/share/bash-completion/helpers/osc-helper osc
+    EOF
+  '';
+
+  preCheck = "HOME=$TOP/tmp";
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    homepage = "https://github.com/openSUSE/osc";
+    description = "opensuse-commander with svn like handling";
+    maintainers = [ maintainers.peti ];
+    license = licenses.gpl2;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oscpy/default.nix b/nixpkgs/pkgs/development/python-modules/oscpy/default.nix
new file mode 100644
index 000000000000..894e884a4de2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oscpy/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchFromGitHub, fetchpatch, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "oscpy";
+  version = "0.6.0";
+
+  src = fetchFromGitHub {
+    owner = "kivy";
+    repo = "oscpy";
+    rev = "v${version}";
+    hash = "sha256-Luj36JLgU9xbBMydeobyf98U5zs5VwWQOPGV7TPXQwA=";
+  };
+
+  patches = [
+    # Fix flaky tests with kivy/oscpy#67 - https://github.com/kivy/oscpy/pull/67
+    (fetchpatch {
+      name = "improve-reliability-of-test_intercept_errors.patch";
+      url = "https://github.com/kivy/oscpy/commit/2bc114a97692aef28f8b84d52d0d5a41554a7d93.patch";
+      hash = "sha256-iT7cB3ChWD1o0Zx7//Czkk8TaU1oTU1pRQWvPeIpeWY=";
+    })
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "oscpy" ];
+
+  meta = with lib; {
+    description = "A modern implementation of OSC for python2/3";
+    license = licenses.mit;
+    homepage = "https://github.com/kivy/oscpy";
+    maintainers = [ maintainers.yurkobb ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oscrypto/default.nix b/nixpkgs/pkgs/development/python-modules/oscrypto/default.nix
new file mode 100644
index 000000000000..92edbdf84eb9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oscrypto/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, stdenv
+, asn1crypto
+, buildPythonPackage
+, fetchFromGitHub
+, openssl
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "oscrypto";
+  version = "1.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "wbond";
+    repo = pname;
+    rev = version;
+    hash = "sha256-CmDypmlc/kb6ONCUggjT1Iqd29xNSLRaGh5Hz36dvOw=";
+  };
+
+  patches = [
+    ./support-openssl-3.0.10.patch
+  ];
+
+  postPatch = ''
+    for file in oscrypto/_openssl/_lib{crypto,ssl}_c{ffi,types}.py; do
+      substituteInPlace $file \
+        --replace "get_library('crypto', 'libcrypto.dylib', '42')" "'${openssl.out}/lib/libcrypto${stdenv.hostPlatform.extensions.sharedLibrary}'" \
+        --replace "get_library('ssl', 'libssl', '44')" "'${openssl.out}/lib/libssl${stdenv.hostPlatform.extensions.sharedLibrary}'"
+    done
+  '';
+
+  propagatedBuildInputs = [
+    asn1crypto
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "oscrypto"
+  ];
+
+  doCheck = !stdenv.isDarwin;
+
+  disabledTests = [
+    # Tests require network access
+    "TLSTests"
+    "TrustListTests"
+  ];
+
+  meta = with lib; {
+    description = "Encryption library for Python";
+    homepage = "https://github.com/wbond/oscrypto";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oscrypto/support-openssl-3.0.10.patch b/nixpkgs/pkgs/development/python-modules/oscrypto/support-openssl-3.0.10.patch
new file mode 100644
index 000000000000..585eb64eaa47
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oscrypto/support-openssl-3.0.10.patch
@@ -0,0 +1,11 @@
+https://github.com/wbond/oscrypto/issues/75
+--- a/oscrypto/_openssl/_libcrypto_cffi.py
++++ b/oscrypto/_openssl/_libcrypto_cffi.py
+@@ -37,1 +37,1 @@
+-version_match = re.search('\\b(\\d\\.\\d\\.\\d[a-z]*)\\b', version_string)
++version_match = re.search('\\b(\\d\\.\\d\\.\\d+[a-z]*)\\b', version_string)
+--- a/oscrypto/_openssl/_libcrypto_ctypes.py
++++ b/oscrypto/_openssl/_libcrypto_ctypes.py
+@@ -40,1 +40,1 @@
+-version_match = re.search('\\b(\\d\\.\\d\\.\\d[a-z]*)\\b', version_string)
++version_match = re.search('\\b(\\d\\.\\d\\.\\d+[a-z]*)\\b', version_string)
diff --git a/nixpkgs/pkgs/development/python-modules/oset/default.nix b/nixpkgs/pkgs/development/python-modules/oset/default.nix
new file mode 100644
index 000000000000..5d8a5f741bdc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oset/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "oset";
+  version = "0.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "017rr1m72s2fh9bmz5vrvc5mshczgzisi5894v9zkvvfr7gdf7sc";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Ordered set";
+    license = licenses.psfl;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oslo-concurrency/default.nix b/nixpkgs/pkgs/development/python-modules/oslo-concurrency/default.nix
new file mode 100644
index 000000000000..e6b7d7b05f3a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oslo-concurrency/default.nix
@@ -0,0 +1,78 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, bash
+, coreutils
+, eventlet
+, fasteners
+, fixtures
+, iana-etc
+, libredirect
+, oslo-config
+, oslo-utils
+, oslotest
+, pbr
+, stestr
+}:
+
+buildPythonPackage rec {
+  pname = "oslo-concurrency";
+  version = "5.2.0";
+
+  src = fetchPypi {
+    pname = "oslo.concurrency";
+    inherit version;
+    hash = "sha256-ihnsV07QV+k9UWdDJgX/h0xLkBelIV/QIaIDTGzVKpI=";
+  };
+
+  postPatch = ''
+    # only a small portion of the listed packages are actually needed for running the tests
+    # so instead of removing them one by one remove everything
+    rm test-requirements.txt
+
+    substituteInPlace oslo_concurrency/tests/unit/test_processutils.py \
+      --replace "/bin/bash" "${bash}/bin/bash" \
+      --replace "/bin/true" "${coreutils}/bin/true" \
+      --replace "/usr/bin/env" "${coreutils}/bin/env" \
+      --replace "/usr/bin/true" "${coreutils}/bin/true"
+  '';
+
+  propagatedBuildInputs = [
+    fasteners
+    oslo-config
+    oslo-utils
+    pbr
+  ];
+
+  # tests hang for unknown reason and time the build out
+  doCheck = false;
+
+  nativeCheckInputs = [
+    eventlet
+    fixtures
+    oslotest
+    stestr
+  ];
+
+  checkPhase = ''
+    echo "nameserver 127.0.0.1" > resolv.conf
+    export NIX_REDIRECTS=/etc/protocols=${iana-etc}/etc/protocols:/etc/resolv.conf=$(realpath resolv.conf)
+    export LD_PRELOAD=${libredirect}/lib/libredirect.so
+
+    stestr run -e <(echo "
+    oslo_concurrency.tests.unit.test_lockutils_eventlet.TestInternalLock.test_fair_lock_with_spawn
+    oslo_concurrency.tests.unit.test_lockutils_eventlet.TestInternalLock.test_fair_lock_with_spawn_n
+    ")
+  '';
+
+  pythonImportsCheck = [ "oslo_concurrency" ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Oslo Concurrency library";
+    homepage = "https://github.com/openstack/oslo.concurrency";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oslo-config/default.nix b/nixpkgs/pkgs/development/python-modules/oslo-config/default.nix
new file mode 100644
index 000000000000..50a544c1d7fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oslo-config/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, debtcollector
+, netaddr
+, oslo-i18n
+, pbr
+, pyyaml
+, requests
+, rfc3986
+, stevedore
+, callPackage
+}:
+
+buildPythonPackage rec {
+  pname = "oslo-config";
+  version = "9.2.0";
+
+  src = fetchPypi {
+    pname = "oslo.config";
+    inherit version;
+    hash = "sha256-/+sBymWmA9VSWQXxqIozGb4Jzixqw3bEMSquwoMJWHg=";
+  };
+
+  postPatch = ''
+    # only a small portion of the listed packages are actually needed for running the tests
+    # so instead of removing them one by one remove everything
+    rm test-requirements.txt
+  '';
+
+  propagatedBuildInputs = [
+    debtcollector
+    netaddr
+    oslo-i18n
+    pbr
+    pyyaml
+    requests
+    rfc3986
+    stevedore
+  ];
+
+  # check in passthru.tests.pytest to escape infinite recursion with other oslo components
+  doCheck = false;
+
+  passthru.tests = {
+    tests = callPackage ./tests.nix {};
+  };
+
+  pythonImportsCheck = [ "oslo_config" ];
+
+  meta = with lib; {
+    description = "Oslo Configuration API";
+    homepage = "https://github.com/openstack/oslo.config";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oslo-config/tests.nix b/nixpkgs/pkgs/development/python-modules/oslo-config/tests.nix
new file mode 100644
index 000000000000..0540760e57a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oslo-config/tests.nix
@@ -0,0 +1,40 @@
+{ buildPythonPackage
+, oslo-config
+, docutils
+, oslo-log
+, oslotest
+, requests-mock
+, sphinx
+, stestr
+, testscenarios
+}:
+
+buildPythonPackage {
+pname = "oslo-config-tests";
+  inherit (oslo-config) version src;
+  format = "other";
+
+  postPatch = ''
+    # only a small portion of the listed packages are actually needed for running the tests
+    # so instead of removing them one by one remove everything
+    rm test-requirements.txt
+  '';
+
+  dontBuild = true;
+  dontInstall = true;
+
+  nativeCheckInputs = [
+    oslo-config
+    docutils
+    oslo-log
+    oslotest
+    requests-mock
+    sphinx
+    stestr
+    testscenarios
+  ];
+
+  checkPhase = ''
+    stestr run
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oslo-context/default.nix b/nixpkgs/pkgs/development/python-modules/oslo-context/default.nix
new file mode 100644
index 000000000000..35664a9041c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oslo-context/default.nix
@@ -0,0 +1,40 @@
+{ lib, buildPythonPackage, fetchPypi, debtcollector, oslotest, stestr, pbr }:
+
+buildPythonPackage rec {
+  pname = "oslo.context";
+  version = "5.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Ly55FxBE79GAfFVxPtLH9AaLGNc9AngZFlxIGbKHz68=";
+  };
+
+  postPatch = ''
+    # only a small portion of the listed packages are actually needed for running the tests
+    # so instead of removing them one by one remove everything
+    rm test-requirements.txt
+  '';
+
+  propagatedBuildInputs = [
+    debtcollector
+    pbr
+  ];
+
+  nativeCheckInputs = [
+    oslotest
+    stestr
+  ];
+
+  checkPhase = ''
+    stestr run
+  '';
+
+  pythonImportsCheck = [ "oslo_context" ];
+
+  meta = with lib; {
+    description = "Oslo Context library";
+    homepage = "https://github.com/openstack/oslo.context";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oslo-db/default.nix b/nixpkgs/pkgs/development/python-modules/oslo-db/default.nix
new file mode 100644
index 000000000000..a8052d4211c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oslo-db/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, alembic
+, oslo-config
+, oslo-context
+, oslo-utils
+, oslotest
+, pbr
+, sqlalchemy
+, sqlalchemy-migrate
+, stestr
+, testresources
+, testscenarios
+}:
+
+buildPythonPackage rec {
+  pname = "oslo-db";
+  version = "14.0.0";
+
+  src = fetchPypi {
+    pname = "oslo.db";
+    inherit version;
+    hash = "sha256-nAipzYOOv/rSHrMBL64AKg93v5Vpb6RNBbG2OiJ+n8E=";
+  };
+
+  nativeBuildInputs = [ pbr ];
+
+  propagatedBuildInputs = [
+    alembic
+    oslo-config
+    oslo-context
+    oslo-utils
+    sqlalchemy
+    sqlalchemy-migrate
+    testresources
+    testscenarios
+  ];
+
+  nativeCheckInputs = [
+    oslotest
+    stestr
+  ];
+
+  checkPhase = ''
+    stestr run
+  '';
+
+  pythonImportsCheck = [ "oslo_db" ];
+
+  meta = with lib; {
+    description = "Oslo Database library";
+    homepage = "https://github.com/openstack/oslo.db";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oslo-i18n/default.nix b/nixpkgs/pkgs/development/python-modules/oslo-i18n/default.nix
new file mode 100644
index 000000000000..e4d0f9f75d93
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oslo-i18n/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, oslotest
+, pbr
+, testscenarios
+, stestr
+}:
+
+buildPythonPackage rec {
+  pname = "oslo-i18n";
+  version = "6.1.0";
+
+  src = fetchPypi {
+    pname = "oslo.i18n";
+    inherit version;
+    hash = "sha256-4rgp8gW/HrYgR1bMNAJ9EZSUti0nH+7oYL+BbKegfq0=";
+  };
+
+  postPatch = ''
+    # only a small portion of the listed packages are actually needed for running the tests
+    # so instead of removing them one by one remove everything
+    rm test-requirements.txt
+  '';
+
+  nativeBuildInputs = [ pbr ];
+
+  nativeCheckInputs = [
+    oslotest
+    stestr
+    testscenarios
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    stestr run -e <(echo "
+    # test counts warnings which no longer matches in python 3.11
+    oslo_i18n.tests.test_message.MessageTestCase.test_translate_message_bad_translation
+    ")
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "oslo_i18n" ];
+
+  meta = with lib; {
+    description = "Oslo i18n library";
+    homepage = "https://github.com/openstack/oslo.i18n";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oslo-log/default.nix b/nixpkgs/pkgs/development/python-modules/oslo-log/default.nix
new file mode 100644
index 000000000000..64df3dc82e47
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oslo-log/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, eventlet
+, oslo-config
+, oslo-context
+, oslo-serialization
+, oslo-utils
+, oslotest
+, pbr
+, pyinotify
+, python-dateutil
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "oslo-log";
+  version = "5.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "oslo.log";
+    inherit version;
+    hash = "sha256-LrNVtYVw8lgR2nb6gUU7h1x8lEoZoj0sMFtKTf670iM=";
+  };
+
+  propagatedBuildInputs = [
+    oslo-config
+    oslo-context
+    oslo-serialization
+    oslo-utils
+    pbr
+    python-dateutil
+  ] ++ lib.optionals stdenv.isLinux [
+    pyinotify
+  ];
+
+  nativeCheckInputs = [
+    eventlet
+    oslotest
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # not compatible with sandbox
+    "test_logging_handle_error"
+    # File which is used doesn't seem not to be present
+    "test_log_config_append_invalid"
+  ];
+
+  pythonImportsCheck = [
+    "oslo_log"
+  ];
+
+  meta = with lib; {
+    description = "oslo.log library";
+    homepage = "https://github.com/openstack/oslo.log";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oslo-serialization/default.nix b/nixpkgs/pkgs/development/python-modules/oslo-serialization/default.nix
new file mode 100644
index 000000000000..1e89c69f7e2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oslo-serialization/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msgpack
+, oslo-utils
+, oslotest
+, pbr
+, pytz
+, stestr
+}:
+
+buildPythonPackage rec {
+  pname = "oslo-serialization";
+  version = "5.2.0";
+
+  src = fetchPypi {
+    pname = "oslo.serialization";
+    inherit version;
+    hash = "sha256-nPAw1hpszh9Hpi1AUPXoPhvRoQGKxnG7GTruB9Fb28I=";
+  };
+
+  postPatch = ''
+    # only a small portion of the listed packages are actually needed for running the tests
+    # so instead of removing them one by one remove everything
+    rm test-requirements.txt
+  '';
+
+  nativeBuildInputs = [ pbr ];
+
+  propagatedBuildInputs = [ msgpack oslo-utils pytz ];
+
+  nativeCheckInputs = [ oslotest stestr ];
+
+  checkPhase = ''
+    stestr run
+  '';
+
+  pythonImportsCheck = [ "oslo_serialization" ];
+
+  meta = with lib; {
+    description = "Oslo Serialization library";
+    homepage = "https://github.com/openstack/oslo.serialization";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oslo-utils/default.nix b/nixpkgs/pkgs/development/python-modules/oslo-utils/default.nix
new file mode 100644
index 000000000000..0d55f870e5fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oslo-utils/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ddt
+, debtcollector
+, eventlet
+, fixtures
+, iso8601
+, netaddr
+, netifaces
+, oslo-i18n
+, oslotest
+, packaging
+, pbr
+, pyparsing
+, pytz
+, stestr
+, testscenarios
+, pyyaml
+, iana-etc
+, libredirect
+}:
+
+buildPythonPackage rec {
+  pname = "oslo-utils";
+  version = "6.2.1";
+
+  src = fetchPypi {
+    pname = "oslo.utils";
+    inherit version;
+    hash = "sha256-EyK6BfoP88Gor8cn/PlF31qoLWWEcn0uBK8Di1roQkQ=";
+  };
+
+  postPatch = ''
+    # only a small portion of the listed packages are actually needed for running the tests
+    # so instead of removing them one by one remove everything
+    rm test-requirements.txt
+  '';
+
+  nativeBuildInputs = [ pbr ];
+
+  propagatedBuildInputs = [
+    debtcollector
+    iso8601
+    netaddr
+    netifaces
+    oslo-i18n
+    packaging
+    pyparsing
+    pytz
+  ];
+
+  nativeCheckInputs = [
+    ddt
+    eventlet
+    fixtures
+    oslotest
+    stestr
+    testscenarios
+    pyyaml
+  ];
+
+  checkPhase = ''
+    echo "nameserver 127.0.0.1" > resolv.conf
+    export NIX_REDIRECTS=/etc/protocols=${iana-etc}/etc/protocols:/etc/resolv.conf=$(realpath resolv.conf)
+    export LD_PRELOAD=${libredirect}/lib/libredirect.so
+
+    stestr run
+  '';
+
+  pythonImportsCheck = [ "oslo_utils" ];
+
+  meta = with lib; {
+    description = "Oslo Utility library";
+    homepage = "https://github.com/openstack/oslo.utils";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oslotest/default.nix b/nixpkgs/pkgs/development/python-modules/oslotest/default.nix
new file mode 100644
index 000000000000..7d89f5778c73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oslotest/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fixtures
+, pbr
+, six
+, subunit
+, callPackage
+}:
+
+buildPythonPackage rec {
+  pname = "oslotest";
+  version = "4.5.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "360ad2c41ba3ad6f059c7c6e7291450d082c2e5dbb0012e839a829978053dfe6";
+  };
+
+  nativeBuildInputs = [ pbr ];
+
+  propagatedBuildInputs = [
+    fixtures
+    six
+    subunit
+  ];
+
+  # check in passthru.tests.pytest to escape infinite recursion with other oslo components
+  doCheck = false;
+
+  passthru.tests = {
+    tests = callPackage ./tests.nix {};
+  };
+
+  pythonImportsCheck = [ "oslotest" ];
+
+  meta = with lib; {
+    description = "Oslo test framework";
+    homepage = "https://github.com/openstack/oslotest";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oslotest/tests.nix b/nixpkgs/pkgs/development/python-modules/oslotest/tests.nix
new file mode 100644
index 000000000000..f80073e1c1bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oslotest/tests.nix
@@ -0,0 +1,30 @@
+{ buildPythonPackage
+, oslo-config
+, oslotest
+, stestr
+}:
+
+buildPythonPackage {
+  pname = "oslotest-tests";
+  inherit (oslotest) version src;
+  format = "other";
+
+  postPatch = ''
+    # only a small portion of the listed packages are actually needed for running the tests
+    # so instead of removing them one by one remove everything
+    rm test-requirements.txt
+  '';
+
+  dontBuild = true;
+  dontInstall = true;
+
+  nativeCheckInputs = [
+    oslotest
+    oslo-config
+    stestr
+  ];
+
+  checkPhase = ''
+    stestr run
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/osmnx/default.nix b/nixpkgs/pkgs/development/python-modules/osmnx/default.nix
new file mode 100644
index 000000000000..fec12037e20b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/osmnx/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, folium
+, gdal
+, geopandas
+, matplotlib
+, networkx
+, numpy
+, pandas
+, pythonOlder
+, rasterio
+, requests
+, rtree
+, scikit-learn
+, scipy
+, shapely
+}:
+
+buildPythonPackage rec {
+  pname = "osmnx";
+  version = "1.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "gboeing";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-17duWrg48Qb4ojYYFX4HBpPLeVgHn1WV84KVATvBnzY=";
+  };
+
+  propagatedBuildInputs = [
+    geopandas
+    matplotlib
+    networkx
+    numpy
+    pandas
+    requests
+    rtree
+    shapely
+    folium
+    scikit-learn
+    scipy
+    gdal
+    rasterio
+  ];
+
+  # Tests require network
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "osmnx"
+  ];
+
+  meta = with lib; {
+    description = "A package to easily download, construct, project, visualize, and analyze complex street networks from OpenStreetMap with NetworkX.";
+    homepage = "https://github.com/gboeing/osmnx";
+    changelog = "https://github.com/gboeing/osmnx/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/osmpythontools/default.nix b/nixpkgs/pkgs/development/python-modules/osmpythontools/default.nix
new file mode 100644
index 000000000000..7545d9c01006
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/osmpythontools/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, beautifulsoup4
+, geojson
+, lxml
+, matplotlib
+, numpy
+, pandas
+, ujson
+, xarray
+}:
+
+buildPythonPackage rec {
+  pname = "osmpythontools";
+  version = "0.3.5";
+
+  src = fetchFromGitHub {
+    owner = "mocnik-science";
+    repo = "osm-python-tools";
+    rev = "v${version}";
+    hash = "sha256-lTDA1Rad9aYI/ymU/0xzdJHmebUGcpVJ0GW7D0Ujdko=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    geojson
+    lxml
+    matplotlib
+    numpy
+    pandas
+    ujson
+    xarray
+  ];
+
+  # tests touch network
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "OSMPythonTools"
+    "OSMPythonTools.api"
+    "OSMPythonTools.data"
+    "OSMPythonTools.element"
+    "OSMPythonTools.nominatim"
+    "OSMPythonTools.overpass"
+  ];
+
+  meta = with lib; {
+    description = "A library to access OpenStreetMap-related services";
+    longDescription = ''
+      The python package OSMPythonTools provides easy access to
+      OpenStreetMap-related services, among them an Overpass endpoint,
+      Nominatim, and the OpenStreetMap editing API.
+    '';
+    homepage = "https://github.com/mocnik-science/osm-python-tools";
+    license = licenses.gpl3Only;
+    changelog = "https://raw.githubusercontent.com/mocnik-science/osm-python-tools/v${version}/version-history.md";
+    maintainers = with maintainers; [ das-g ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ospd/default.nix b/nixpkgs/pkgs/development/python-modules/ospd/default.nix
new file mode 100644
index 000000000000..a9e6ba10d981
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ospd/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, defusedxml
+, deprecated
+, fetchFromGitHub
+, lxml
+, paramiko
+, psutil
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ospd";
+  version = "21.4.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7" || stdenv.isDarwin;
+
+  src = fetchFromGitHub {
+    owner = "greenbone";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-dZgs+G2vJQIKnN9xHcNeNViG7mOIdKb+Ms2AKE+FC4M=";
+  };
+
+  propagatedBuildInputs = [
+    defusedxml
+    deprecated
+    lxml
+    paramiko
+    psutil
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ospd"
+  ];
+
+  meta = with lib; {
+    description = "Framework for vulnerability scanners which support OSP";
+    homepage = "https://github.com/greenbone/ospd";
+    changelog = "https://github.com/greenbone/ospd/releases/tag/v${version}";
+    license = with licenses; [ agpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/osqp/default.nix b/nixpkgs/pkgs/development/python-modules/osqp/default.nix
new file mode 100644
index 000000000000..ac933f65e1c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/osqp/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, cmake
+, cvxopt
+, fetchPypi
+, future
+, numpy
+, pytestCheckHook
+, pythonOlder
+, qdldl
+, scipy
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "osqp";
+  version = "0.6.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-A+Rg5oPsLOD4OTU936PEyP+lCauM9qKyr7tYb6RT4YA=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  dontUseCmakeConfigure = true;
+
+  nativeBuildInputs = [
+    cmake
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    future
+    numpy
+    qdldl
+    scipy
+  ];
+
+  nativeCheckInputs = [
+    cvxopt
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "osqp"
+  ];
+
+  disabledTests = [
+    # Need an unfree license package - mkl
+    "test_issue14"
+  ];
+
+  meta = with lib; {
+    description = "The Operator Splitting QP Solver";
+    longDescription = ''
+      Numerical optimization package for solving problems in the form
+        minimize        0.5 x' P x + q' x
+        subject to      l <= A x <= u
+
+      where x in R^n is the optimization variable
+    '';
+    homepage = "https://osqp.org/";
+    downloadPage = "https://github.com/oxfordcontrol/osqp-python/releases";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oss2/default.nix b/nixpkgs/pkgs/development/python-modules/oss2/default.nix
new file mode 100644
index 000000000000..a62410ecdc42
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oss2/default.nix
@@ -0,0 +1,122 @@
+{ lib
+, aliyun-python-sdk-core
+, aliyun-python-sdk-kms
+, aliyun-python-sdk-sts
+, buildPythonPackage
+, crcmod
+, fetchFromGitHub
+, mock
+, pycryptodome
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "oss2";
+  version = "2.18.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aliyun";
+    repo = "aliyun-oss-python-sdk";
+    rev = "refs/tags/${version}";
+    hash = "sha256-jDSXPVyy8XvPgsGZXsdfavFPptq28pCwr9C63OZvNrY=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    crcmod
+    pycryptodome
+    aliyun-python-sdk-kms
+    aliyun-python-sdk-core
+    six
+  ];
+
+  nativeCheckInputs = [
+    aliyun-python-sdk-sts
+    mock
+    pytestCheckHook
+  ];
+
+  pythonRelaxDeps = true;
+
+  pythonImportsCheck = [
+    "oss2"
+  ];
+
+  disabledTestPaths = [
+    # Tests require network access
+    "tests/test_api_base.py"
+    "tests/test_async_fetch_task.py"
+    "tests/test_bucket_access_monitor.py"
+    "tests/test_bucket_callback_policy.py"
+    "tests/test_bucket_cname.py"
+    "tests/test_bucket_describe_regions.py"
+    "tests/test_bucket_inventory.py"
+    "tests/test_bucket_meta_query.py"
+    "tests/test_bucket_replication.py"
+    "tests/test_bucket_resource_group.py"
+    "tests/test_bucket_style.py"
+    "tests/test_bucket_transfer_acceleration.py"
+    "tests/test_bucket_versioning.py"
+    "tests/test_bucket_worm.py"
+    "tests/test_bucket.py"
+    "tests/test_chinese.py"
+    "tests/test_crc64_combine.py"
+    "tests/test_credentials_provider.py"
+    "tests/test_crypto_multipart.py"
+    "tests/test_crypto_object.py"
+    "tests/test_crypto.py"
+    "tests/test_download.py"
+    "tests/test_exception_ec.py"
+    "tests/test_headers.py"
+    "tests/test_image.py"
+    "tests/test_init.py"
+    "tests/test_iterator.py"
+    "tests/test_lifecycle_versioning.py"
+    "tests/test_list_objects_v2.py"
+    "tests/test_live_channel.py"
+    "tests/test_multipart.py"
+    "tests/test_object_request_payment_versions.py"
+    "tests/test_object_request_payment.py"
+    "tests/test_object_versioning.py"
+    "tests/test_object.py"
+    "tests/test_proxy.py"
+    "tests/test_put_object_chunked.py"
+    "tests/test_qos_info.py"
+    "tests/test_request_payment.py"
+    "tests/test_select_csv_object.py"
+    "tests/test_select_json_object.py"
+    "tests/test_server_side_encryotion.py"
+    "tests/test_sign.py"
+    "tests/test_traffic_limit.py"
+    "tests/test_upload.py"
+    "tests/test_utils.py"
+    "tests/test_website.py"
+  ];
+
+  disabledTests = [
+    "test_crypto_get_compact_deprecated_kms"
+    # RuntimeError
+    "test_crypto_put"
+    # Tests require network access
+    "test_write_get_object_response"
+  ];
+
+  meta = with lib; {
+    description = "Alibaba Cloud OSS SDK for Python";
+    homepage = "https://github.com/aliyun/aliyun-oss-python-sdk";
+    changelog = "https://github.com/aliyun/aliyun-oss-python-sdk/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ossfs/default.nix b/nixpkgs/pkgs/development/python-modules/ossfs/default.nix
new file mode 100644
index 000000000000..9b30afeb4927
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ossfs/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, aiooss2
+, buildPythonPackage
+, fetchFromGitHub
+, fsspec
+, oss2
+, pythonOlder
+, pythonRelaxDepsHook
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "ossfs";
+  version = "2023.8.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "fsspec";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-v6QZgv1QwBrQpCwP/1z6704UNvQyoCrpQGkhTmncbjQ=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  pythonRelaxDeps = [
+    "aiooss2"
+    "fsspec"
+    "oss2"
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    aiooss2
+    fsspec
+    oss2
+  ];
+
+  # Most tests require network access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ossfs"
+  ];
+
+  meta = with lib; {
+    description = "Filesystem for Alibaba Cloud (Aliyun) Object Storage System (OSS)";
+    homepage = "https://github.com/fsspec/ossfs";
+    changelog = "https://github.com/fsspec/ossfs/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/outcome/default.nix b/nixpkgs/pkgs/development/python-modules/outcome/default.nix
new file mode 100644
index 000000000000..66597cb0671e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/outcome/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder
+, attrs
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "outcome";
+  version = "1.2.0";
+  disabled = pythonOlder "3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-b4K9PeRdowPPH3ceyvoWM3UKNYQ2qLtg4Goc63RdJnI=";
+  };
+
+  nativeCheckInputs = [ pytest ];
+  propagatedBuildInputs = [ attrs ];
+  # Has a test dependency on trio, which depends on outcome.
+  doCheck = false;
+
+  meta = {
+    description = "Capture the outcome of Python function calls.";
+    homepage = "https://github.com/python-trio/outcome";
+    license = with lib.licenses; [ mit asl20 ];
+    maintainers = with lib.maintainers; [ catern ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/overly/default.nix b/nixpkgs/pkgs/development/python-modules/overly/default.nix
new file mode 100644
index 000000000000..8fec61e13845
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/overly/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, h11
+, sansio-multipart
+}:
+
+buildPythonPackage rec {
+  pname = "overly";
+  version = "0.1.85";
+
+  disabled = pythonOlder "3.6";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "20a99526c7859acc859e87afd97b5c4916405e7477834f727b49210e478370cb";
+  };
+
+  propagatedBuildInputs = [
+    h11
+    sansio-multipart
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "overly" ];
+
+  meta = {
+    description = "An overly configurable http server for client testing";
+    homepage = "https://github.com/theelous3/overly";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+    broken = stdenv.isDarwin;  # https://github.com/theelous3/overly/issues/2
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/overpy/default.nix b/nixpkgs/pkgs/development/python-modules/overpy/default.nix
new file mode 100644
index 000000000000..37abe9551117
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/overpy/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "overpy";
+  version = "0.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "DinoTools";
+    repo = "python-overpy";
+    rev = version;
+    hash = "sha256-Tl+tzxnPASL4J6D/BYCEWhXe/mI12OVgNT5lyby3s7A=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # Remove pytest-runner
+      url = "https://patch-diff.githubusercontent.com/raw/DinoTools/python-overpy/pull/104.patch";
+      hash = "sha256-ScS0vd2P+wyQGyCQV6/4cUcqoQ+S07tGpEovuz9oBMw=";
+    })
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "overpy"
+  ];
+
+  meta = with lib; {
+    description = "Python Wrapper to access the Overpass API";
+    homepage = "https://github.com/DinoTools/python-overpy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ firefly-cpp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/overrides/default.nix b/nixpkgs/pkgs/development/python-modules/overrides/default.nix
new file mode 100644
index 000000000000..7fc464143081
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/overrides/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "overrides";
+  version = "7.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mkorpela";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-7fbuBcb47BTVxAoKokZmGdIwHSyfyfSiCAZ4XZjWz60=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "overrides"
+  ];
+
+  meta = with lib; {
+    description = "Decorator to automatically detect mismatch when overriding a method";
+    homepage = "https://github.com/mkorpela/overrides";
+    changelog = "https://github.com/mkorpela/overrides/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ovh/default.nix b/nixpkgs/pkgs/development/python-modules/ovh/default.nix
new file mode 100644
index 000000000000..7ac42a4ff0de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ovh/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "ovh";
+  version = "1.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-EI+bWjtHEZPOSkWJx3gvS8y//gugMWl3TrBHKsKO9nk=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ovh"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_config_from_files"
+    "test_config_from_given_config_file"
+    "test_config_from_invalid_ini_file"
+    "test_config_from_only_one_file"
+    "test_endpoints"
+  ];
+
+  meta = with lib; {
+    description = "Thin wrapper around OVH's APIs";
+    homepage = "https://github.com/ovh/python-ovh";
+    changelog = "https://github.com/ovh/python-ovh/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ makefu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ovmfvartool/default.nix b/nixpkgs/pkgs/development/python-modules/ovmfvartool/default.nix
new file mode 100644
index 000000000000..12f65fe86cf3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ovmfvartool/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pyyaml }:
+
+buildPythonPackage rec {
+  pname = "ovmfvartool";
+  version = "unstable-2022-09-04";
+
+  src = fetchFromGitHub {
+    owner = "hlandau";
+    repo = pname;
+    rev = "45e6b1e53967ee6590faae454c076febce096931";
+    hash = "sha256-XbvcE/MXNj5S5N7A7jxdwgEE5yMuB82Xg+PYBsFRIm0=";
+  };
+
+  propagatedBuildInputs = [ pyyaml ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "ovmfvartool" ];
+
+  meta = with lib; {
+    description = "Parse and generate OVMF_VARS.fd from Yaml";
+    homepage = "https://github.com/hlandau/ovmfvartool";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ baloo raitobezarius ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ovoenergy/default.nix b/nixpkgs/pkgs/development/python-modules/ovoenergy/default.nix
new file mode 100644
index 000000000000..1aaf94710311
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ovoenergy/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, incremental
+, pydantic
+, pythonOlder
+, typer
+}:
+
+buildPythonPackage rec {
+  pname = "ovoenergy";
+  version = "1.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "timmo001";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-oeNwBmzlkE8JewSwuFG8OYigyispP4xdwO3s2CAcfW4=";
+  };
+
+  nativeBuildInputs = [
+    incremental
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "typer==0.6.1" "typer"
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+    click
+    pydantic
+    typer
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ovoenergy"
+  ];
+
+  meta = with lib; {
+    description = "Python client for getting data from OVO's API";
+    homepage = "https://github.com/timmo001/ovoenergy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/owslib/default.nix b/nixpkgs/pkgs/development/python-modules/owslib/default.nix
new file mode 100644
index 000000000000..5e5e5a07b9c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/owslib/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, lxml
+, pyproj
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pytz
+, pyyaml
+, requests
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "owslib";
+  version = "0.29.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "geopython";
+    repo = "OWSLib";
+    rev = "refs/tags/${version}";
+    hash = "sha256-yAJXknSsGXcerzaOVSrFO4j5E6B/4/0JfoSxZ+Szmws=";
+  };
+
+  postPatch = ''
+    substituteInPlace tox.ini \
+      --replace " --doctest-modules --doctest-glob 'tests/**/*.txt' --cov-report term-missing --cov owslib" ""
+  '';
+
+  propagatedBuildInputs = [
+    lxml
+    pyproj
+    python-dateutil
+    pytz
+    pyyaml
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "owslib"
+  ];
+
+  preCheck = ''
+    # _pytest.pathlib.ImportPathMismatchError: ('owslib.swe.sensor.sml', '/build/source/build/...
+    export PY_IGNORE_IMPORTMISMATCH=1
+  '';
+
+  disabledTests = [
+    # Tests require network access
+    "test_ows_interfaces_wcs"
+    "test_wfs_110_remotemd"
+    "test_wfs_200_remotemd"
+    "test_wms_130_remotemd"
+    "test_wmts_example_informatievlaanderen"
+    "test_opensearch_creodias"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_ogcapi_processes_pygeoapi"
+    "test_ogcapi_records_pycsw"
+    "test_ogcapi_records_pygeoapi"
+    "test_wms_getfeatureinfo_130"
+  ];
+
+  meta = with lib; {
+    description = "Client for Open Geospatial Consortium web service interface standards";
+    homepage = "https://www.osgeo.org/projects/owslib/";
+    changelog = "https://github.com/geopython/OWSLib/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = teams.geospatial.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/oyaml/default.nix b/nixpkgs/pkgs/development/python-modules/oyaml/default.nix
new file mode 100644
index 000000000000..6e43b4c0e9c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/oyaml/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+  # pythonPackages
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "oyaml";
+  version = "unstable-2021-12-03";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "wimglenn";
+    repo = "oyaml";
+    rev = "d0195070d26bd982f1e4e604bded5510dd035cd7";
+    hash = "sha256-1rSEhiULlAweLDqUFX+JBFxe3iW9kNlRA2zjcG8MYSg=";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "oyaml"
+  ];
+
+  meta = with lib; {
+    description = "Drop-in replacement for PyYAML which preserves dict ordering";
+    homepage = "https://github.com/wimglenn/oyaml";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kamadorueda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/p1monitor/default.nix b/nixpkgs/pkgs/development/python-modules/p1monitor/default.nix
new file mode 100644
index 000000000000..c45af36a8633
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/p1monitor/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "p1monitor";
+  version = "3.0.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "klaasnicolaas";
+    repo = "python-p1monitor";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ZtIY4HvRllqlLlf3j1+RMJuuQuq+BZbMuMn9n/v8H5M=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"0.0.0"' '"${version}"' \
+      --replace 'addopts = "--cov"' ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "p1monitor"
+  ];
+
+  meta = with lib; {
+    description = "Module for interacting with the P1 Monitor";
+    homepage = "https://github.com/klaasnicolaas/python-p1monitor";
+    changelog = "https://github.com/klaasnicolaas/python-p1monitor/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pa-ringbuffer/default.nix b/nixpkgs/pkgs/development/python-modules/pa-ringbuffer/default.nix
new file mode 100644
index 000000000000..066c4a47ae4e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pa-ringbuffer/default.nix
@@ -0,0 +1,20 @@
+{ fetchFromGitHub, buildPythonPackage, lib }:
+
+buildPythonPackage rec {
+  pname = "pa-ringbuffer";
+  version = "0.1.4";
+
+  src = fetchFromGitHub {
+    owner = "spatialaudio";
+    repo = "python-pa-ringbuffer";
+    rev = version;
+    sha256 = "1d4k6z13mc1f88m6wbhfx8hillb7q78n33ws5bmyblsdkv1gx607";
+  };
+
+  meta = {
+    description = "Adds ring buffer functionality";
+    homepage = "https://github.com/spatialaudio/python-pa-ringbuffer";
+    maintainers = with lib.maintainers; [ laikq ];
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/packageurl-python/default.nix b/nixpkgs/pkgs/development/python-modules/packageurl-python/default.nix
new file mode 100644
index 000000000000..dcc49b99af29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/packageurl-python/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "packageurl-python";
+  version = "0.11.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Afv3SkHvhc9BPx7eUpoUEfZYvaZu0i1F0nKArZzrpHE=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "packageurl"
+  ];
+
+  meta = with lib; {
+    description = "Python parser and builder for package URLs";
+    homepage = "https://github.com/package-url/packageurl-python";
+    changelog = "https://github.com/package-url/packageurl-python/blob/v${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ armijnhemel ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/packaging/default.nix b/nixpkgs/pkgs/development/python-modules/packaging/default.nix
new file mode 100644
index 000000000000..0c4678a460ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/packaging/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, pretend
+, pytestCheckHook
+, pythonOlder
+}:
+
+let
+  packaging = buildPythonPackage rec {
+    pname = "packaging";
+    version = "23.1";
+    format = "pyproject";
+
+    disabled = pythonOlder "3.7";
+
+    src = fetchPypi {
+      inherit pname version;
+      hash = "sha256-o5KYDSts/6ZEQxiYvlSwBFFRMZ0efsNPDP7Uh2fdM08=";
+    };
+
+    nativeBuildInputs = [
+      flit-core
+    ];
+
+    nativeCheckInputs = [
+      pytestCheckHook
+      pretend
+    ];
+
+    # Prevent circular dependency with pytest
+    doCheck = false;
+
+    pythonImportsCheck = [ "packaging" ];
+
+    passthru.tests = packaging.overridePythonAttrs (_: { doCheck = true; });
+
+    meta = with lib; {
+      description = "Core utilities for Python packages";
+      homepage = "https://github.com/pypa/packaging";
+      license = with licenses; [ bsd2 asl20 ];
+      maintainers = with maintainers; [ bennofs ];
+    };
+  };
+in
+packaging
diff --git a/nixpkgs/pkgs/development/python-modules/packbits/default.nix b/nixpkgs/pkgs/development/python-modules/packbits/default.nix
new file mode 100644
index 000000000000..561903e8f5fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/packbits/default.nix
@@ -0,0 +1,26 @@
+{ stdenv
+, buildPythonPackage
+, fetchPypi
+, pyparsing
+, six
+, pytest
+, pretend
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "packbits";
+  version = "0.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bc6b370bb34e04ac8cfa835e06c0484380affc6d593adb8009dd6c0f7bfff034";
+  };
+
+  meta = with lib; {
+    description = "PackBits encoder/decoder for Python";
+    homepage = "https://github.com/psd-tools/packbits";
+    license = [ licenses.mit ];
+    maintainers = with maintainers; [ grahamc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/packet-python/default.nix b/nixpkgs/pkgs/development/python-modules/packet-python/default.nix
new file mode 100644
index 000000000000..8c88e6dc6ea7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/packet-python/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "packet-python";
+  version = "1.44.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WVfMELOoml7Hx78jy6TAwlFRLuSQu9dtsb6Khs6/cgI=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest-runner" ""
+  '';
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pythonImportsCheck = [
+    "packet"
+  ];
+
+  meta = with lib; {
+    description = "Python client for the Packet API";
+    homepage = "https://github.com/packethost/packet-python";
+    changelog = "https://github.com/packethost/packet-python/blob/v${version}/CHANGELOG.md";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ dipinhora ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/packvers/default.nix b/nixpkgs/pkgs/development/python-modules/packvers/default.nix
new file mode 100644
index 000000000000..5ec3bd628c3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/packvers/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pretend
+, pyparsing
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "packvers";
+  version = "21.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nexB";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-nCSYL0g7mXi9pGFt24pOXbmmYsaRuB+rRZrygf8DTLE=";
+  };
+
+  propagatedBuildInputs = [
+    pyparsing
+  ];
+
+  nativeCheckInputs = [
+    pretend
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "packvers"
+  ];
+
+  meta = with lib; {
+    description = "Module for version handling of modules";
+    homepage = "https://github.com/nexB/dparse2";
+    changelog = "https://github.com/nexB/packvers/blob/${version}/CHANGELOG.rst";
+    license = with licenses; [ asl20 /* and */ bsd2 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pad4pi/default.nix b/nixpkgs/pkgs/development/python-modules/pad4pi/default.nix
new file mode 100644
index 000000000000..356a599b0d46
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pad4pi/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, rpi-gpio }:
+
+buildPythonPackage rec {
+  pname = "pad4pi";
+  version = "1.1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+oVYlqF5PQAFz4EO1ap6pjmYTLg9xQy6UbQja4utt2Q=";
+  };
+
+  propagatedBuildInputs = [ rpi-gpio ];
+
+  # Checks depend on rpi-gpio which requires to be run on a Raspberry Pi,
+  # therefore it fails on other systems
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/brettmclean/pad4pi";
+    description = "Interrupt-based matrix keypad library for Raspberry Pi";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/paddle-bfloat/default.nix b/nixpkgs/pkgs/development/python-modules/paddle-bfloat/default.nix
new file mode 100644
index 000000000000..a1d6c591fcf2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paddle-bfloat/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pythonAtLeast
+, numpy
+}:
+let
+  pname = "paddle-bfloat";
+  version = "0.1.7";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "paddle_bfloat";
+    inherit version;
+    hash = "sha256-mrjQCtLsXOvqeHHMjuMx65FvMfZ2+wTh1ao9ZJE+9xw=";
+  };
+
+  postPatch = ''
+    sed '1i#include <memory>' -i bfloat16.cc # gcc12
+    # replace deprecated function for python3.11
+    substituteInPlace bfloat16.cc \
+      --replace "Py_TYPE(&NPyBfloat16_Descr) = &PyArrayDescr_Type" "Py_SET_TYPE(&NPyBfloat16_Descr, &PyArrayDescr_Type)"
+  '';
+
+  disabled = pythonOlder "3.9" || pythonAtLeast "3.12";
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  pythonImportsCheck = [ "paddle_bfloat" ];
+
+# upstream has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Paddle numpy bfloat16 package";
+    homepage = "https://pypi.org/project/paddle-bfloat";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/paddle2onnx/default.nix b/nixpkgs/pkgs/development/python-modules/paddle2onnx/default.nix
new file mode 100644
index 000000000000..e358c2ec4986
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paddle2onnx/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, python
+, onnx
+, isPy311
+}:
+let
+  pname = "paddle2onnx";
+  version = "1.1.0";
+  format = "wheel";
+  pyShortVersion = "cp${builtins.replaceStrings ["."] [""] python.pythonVersion}";
+  src = fetchPypi {
+    inherit pname version format;
+    dist = pyShortVersion;
+    python = pyShortVersion;
+    abi = pyShortVersion;
+    platform = "manylinux_2_12_x86_64.manylinux2010_x86_64";
+    hash = "sha256-HI/lIj9ezdCry5fYDi5Pia6hvOjN6/Slm9BMfLeq8AU=";
+  };
+in
+buildPythonPackage {
+  inherit pname version src format;
+
+  disabled = pythonOlder "3.8" || isPy311;
+
+  propagatedBuildInputs = [
+    onnx
+  ];
+
+  meta = with lib; {
+    description = "ONNX Model Exporter for PaddlePaddle";
+    homepage = "https://github.com/PaddlePaddle/Paddle2ONNX";
+    changelog = "https://github.com/PaddlePaddle/Paddle2ONNX/releases/tag/v${version}";
+    license = licenses.asl20;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/paddleocr/default.nix b/nixpkgs/pkgs/development/python-modules/paddleocr/default.nix
new file mode 100644
index 000000000000..4cc4d283a831
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paddleocr/default.nix
@@ -0,0 +1,111 @@
+{ lib
+, buildPythonPackage
+, pythonRelaxDepsHook
+, fetchFromGitHub
+, attrdict
+, beautifulsoup4
+, cython
+, fire
+, fonttools
+, lmdb
+, lxml
+, numpy
+, opencv4
+, openpyxl
+, pdf2docx
+, pillow
+, premailer
+, pyclipper
+, pymupdf
+, python-docx
+, rapidfuzz
+, scikit-image
+, shapely
+, tqdm
+, paddlepaddle
+, lanms-neo
+, polygon3
+}:
+
+let
+  version = "2.7.1";
+in
+buildPythonPackage {
+  pname = "paddleocr";
+  inherit version;
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "PaddlePaddle";
+    repo = "PaddleOCR";
+    rev = "v${version}";
+    hash = "sha256-5Dt4UL+7dwJNjcNnCVi3o8bLCt7/m/M6oh1vPu9rza8=";
+  };
+
+  patches = [
+    # The `ppocr.data.imaug` re-exports the `IaaAugment` and `CopyPaste`
+    # classes. These classes depend on the `imgaug` package which is
+    # unmaintained and has been removed from nixpkgs.
+    #
+    # The image OCR feature of PaddleOCR doesn't use these classes though, so
+    # they work even after stripping the the `IaaAugment` and `CopyPaste`
+    # exports. It probably breaks some of the OCR model creation tooling that
+    # PaddleOCR provides, however.
+    ./remove-import-imaug.patch
+  ];
+
+  nativeBuildInputs = [ pythonRelaxDepsHook ];
+  # trying to relax only pymupdf makes the whole build fail
+  pythonRelaxDeps = true;
+  pythonRemoveDeps = [
+    "imgaug"
+    "visualdl"
+    "opencv-python"
+    "opencv-contrib-python"
+  ];
+
+  propagatedBuildInputs = [
+    attrdict
+    beautifulsoup4
+    cython
+    fire
+    fonttools
+    lmdb
+    lxml
+    numpy
+    opencv4
+    openpyxl
+    pdf2docx
+    pillow
+    premailer
+    pyclipper
+    pymupdf
+    python-docx
+    rapidfuzz
+    scikit-image
+    shapely
+    tqdm
+    paddlepaddle
+    lanms-neo
+    polygon3
+  ];
+
+  # TODO: The tests depend, among possibly other things, on `cudatoolkit`.
+  # But Cudatoolkit fails to install.
+  # preCheck = "export HOME=$TMPDIR";
+  # nativeCheckInputs = with pkgs; [ which cudatoolkit ];
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/PaddlePaddle/PaddleOCR";
+    license = licenses.asl20;
+    description = "Multilingual OCR toolkits based on PaddlePaddle";
+    longDescription = ''
+      PaddleOCR aims to create multilingual, awesome, leading, and practical OCR
+      tools that help users train better models and apply them into practice.
+    '';
+    changelog = "https://github.com/PaddlePaddle/PaddleOCR/releases/tag/v${version}";
+    maintainers = with maintainers; [ happysalada ];
+    platforms = [ "x86_64-linux" "x86_64-darwin" "aarch64-darwin" ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/paddleocr/remove-import-imaug.patch b/nixpkgs/pkgs/development/python-modules/paddleocr/remove-import-imaug.patch
new file mode 100644
index 000000000000..f24156fb6a12
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paddleocr/remove-import-imaug.patch
@@ -0,0 +1,20 @@
+diff --git a/ppocr/data/imaug/__init__.py b/ppocr/data/imaug/__init__.py
+index 121582b4..a6987c75 100644
+--- a/ppocr/data/imaug/__init__.py
++++ b/ppocr/data/imaug/__init__.py
+@@ -16,7 +16,6 @@ from __future__ import division
+ from __future__ import print_function
+ from __future__ import unicode_literals
+ 
+-from .iaa_augment import IaaAugment
+ from .make_border_map import MakeBorderMap
+ from .make_shrink_map import MakeShrinkMap
+ from .random_crop_data import EastRandomCropData, RandomCropImgMask
+@@ -30,7 +29,6 @@ from .rec_img_aug import BaseDataAugmentation, RecAug, RecConAug, RecResizeImg,
+     RFLRecResizeImg, SVTRRecAug
+ from .ssl_img_aug import SSLRotateResize
+ from .randaugment import RandAugment
+-from .copy_paste import CopyPaste
+ from .ColorJitter import ColorJitter
+ from .operators import *
+ from .label_ops import *
diff --git a/nixpkgs/pkgs/development/python-modules/paddlepaddle/binary-hashes.nix b/nixpkgs/pkgs/development/python-modules/paddlepaddle/binary-hashes.nix
new file mode 100644
index 000000000000..5c3c66dddd9a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paddlepaddle/binary-hashes.nix
@@ -0,0 +1,27 @@
+{
+  x86_64-linux = {
+    platform = "manylinux1_x86_64";
+    cpu = {
+      cp39 = "sha256-Yu/FWoMhYp+behAth/jH0FKlf2LJr8TyvL9MBwmuews=";
+      cp310 = "sha256-O7d/5LY2dEMf5gW5WrN3xzIIEi2vT0RWoMeVOk5lATk=";
+    };
+    gpu = {
+      cp39 = "sha256-XHREY27jc+BrVyCJgpMvPVOFiKgPwuiNXPXO3biMLnc=";
+      cp310 = "sha256-oTEBa26o5g6ruuTBgUljjDqign5fXmCn0EnL/0mv+ao=";
+    };
+  };
+  x86_64-darwin = {
+    platform = "macosx_10_9_x86_64";
+    cpu = {
+      cp39 = "sha256-5g9b2gC6uosMpoJiobpj8yToIS6ifAFRvLEqnc/o/QQ=";
+      cp310 = "sha256-2c1hjwNCOOOx9tVfBk+Pyk/pF0m/2tAmRsBH91834eM=";
+    };
+  };
+  aarch64-darwin = {
+    platform = "macosx_11_0_arm64";
+    cpu = {
+      cp39 = "sha256-JhYNTOx1UkuNf/63lHXBDry6FQjPnbIB8jU5jKcyX2k=";
+      cp310 = "sha256-4ltYEYm2OzPBc6D2bQt2dEh6Sz+5m1mMKGGYgQGLSAY=";
+    };
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/paddlepaddle/default.nix b/nixpkgs/pkgs/development/python-modules/paddlepaddle/default.nix
new file mode 100644
index 000000000000..b68c75d0c398
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paddlepaddle/default.nix
@@ -0,0 +1,97 @@
+{ stdenv
+, config
+, lib
+, buildPythonPackage
+, fetchPypi
+, python
+, pythonOlder
+, pythonAtLeast
+, openssl_1_1
+, zlib
+, setuptools
+, cudaSupport ? config.cudaSupport or false
+, cudaPackages_11 ? {}
+, addOpenGLRunpath
+# runtime dependencies
+, httpx
+, numpy
+, protobuf
+, pillow
+, decorator
+, astor
+, paddle-bfloat
+, opt-einsum
+}:
+
+let
+  pname = "paddlepaddle" + lib.optionalString cudaSupport "-gpu";
+  version = "2.5.0";
+  format = "wheel";
+  pyShortVersion = "cp${builtins.replaceStrings ["."] [""] python.pythonVersion}";
+  allHashAndPlatform = import ./binary-hashes.nix;
+  hash = allHashAndPlatform."${stdenv.system}"."${if cudaSupport then "gpu" else "cpu"}"."${pyShortVersion}";
+  platform = allHashAndPlatform."${stdenv.system}".platform;
+  src = fetchPypi ({
+    inherit version format hash platform;
+    pname = builtins.replaceStrings [ "-" ] [ "_" ] pname;
+    dist = pyShortVersion;
+    python = pyShortVersion;
+    abi = pyShortVersion;
+  });
+in
+buildPythonPackage {
+  inherit pname version format src;
+
+  disabled = pythonOlder "3.9" || pythonAtLeast "3.11";
+
+  libraryPath = lib.makeLibraryPath (
+    # TODO: remove openssl_1_1 and zlib, maybe by building paddlepaddle from
+    # source as suggested in the following comment:
+    # https://github.com/NixOS/nixpkgs/pull/243583#issuecomment-1641450848
+    [ openssl_1_1 zlib ] ++ lib.optionals cudaSupport (with cudaPackages_11; [
+      cudatoolkit.lib
+      cudatoolkit.out
+      cudnn
+    ])
+  );
+
+  postFixup = lib.optionalString stdenv.isLinux ''
+    function fixRunPath {
+      p=$(patchelf --print-rpath $1)
+      patchelf --set-rpath "$p:$libraryPath" $1
+      ${lib.optionalString cudaSupport ''
+        addOpenGLRunpath $1
+      ''}
+    }
+    fixRunPath $out/${python.sitePackages}/paddle/fluid/libpaddle.so
+  '';
+
+  nativeBuildInputs = [
+    addOpenGLRunpath
+  ];
+
+  propagatedBuildInputs = [
+    setuptools
+    httpx
+    numpy
+    protobuf
+    pillow
+    decorator
+    astor
+    paddle-bfloat
+    opt-einsum
+  ];
+
+  pythonImportsCheck = [ "paddle" ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "PArallel Distributed Deep LEarning: Machine Learning Framework from Industrial Practice (『飞桨』核心框架,深度学习&机器学习高性能单机、分布式训练和跨平台部署";
+    homepage = "https://github.com/PaddlePaddle/Paddle";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+    platforms = [ "x86_64-linux" ] ++ optionals (!cudaSupport) [ "x86_64-darwin" "aarch64-darwin" ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pagelabels/default.nix b/nixpkgs/pkgs/development/python-modules/pagelabels/default.nix
new file mode 100644
index 000000000000..c17f0ad60dd5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pagelabels/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, pdfrw }:
+
+buildPythonPackage rec {
+  pname = "pagelabels";
+  version = "1.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "07as5kzyvj66bfgvx8bph8gkyj6cgm4lhgxwb78bpdl4m8y8kpma";
+  };
+
+  buildInputs = [ pdfrw ];
+
+  # upstream doesn't contain tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python library to manipulate PDF page labels.";
+    homepage = "https://github.com/lovasoa/pagelabels-py";
+    maintainers = with maintainers; [ teto ];
+    license = licenses.gpl3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/paho-mqtt/default.nix b/nixpkgs/pkgs/development/python-modules/paho-mqtt/default.nix
new file mode 100644
index 000000000000..2712aded5368
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paho-mqtt/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, pytestCheckHook
+, mock
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "paho-mqtt";
+  version = "1.6.1";
+
+  src = fetchFromGitHub {
+    owner = "eclipse";
+    repo = "paho.mqtt.python";
+    rev = "v${version}";
+    hash = "sha256-9nH6xROVpmI+iTKXfwv2Ar1PAmWbEunI3HO0pZyK6Rg=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    six
+  ] ++ lib.optionals (!isPy3k) [
+    mock
+  ];
+
+  doCheck = !stdenv.isDarwin;
+
+  pythonImportsCheck = [
+    "paho.mqtt"
+  ];
+
+  meta = with lib; {
+    description = "MQTT version 3.1.1 client class";
+    homepage = "https://eclipse.org/paho";
+    license = licenses.epl10;
+    maintainers = with maintainers; [ mog dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/palace/default.nix b/nixpkgs/pkgs/development/python-modules/palace/default.nix
new file mode 100644
index 000000000000..60d73bca09f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/palace/default.nix
@@ -0,0 +1,40 @@
+{ lib, buildPythonPackage, fetchFromSourcehut, pythonOlder
+, cmake, cython, alure2, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "palace";
+  version = "0.2.5";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromSourcehut {
+    owner = "~cnx";
+    repo = pname;
+    rev = version;
+    sha256 = "1z0m35y4v1bg6vz680pwdicm9ssryl0q6dm9hfpb8hnifmridpcj";
+  };
+
+  # Nix uses Release CMake configuration instead of what is assumed by palace.
+  postPatch = ''
+    substituteInPlace CMakeLists.txt \
+      --replace IMPORTED_LOCATION_NOCONFIG IMPORTED_LOCATION_RELEASE
+  '';
+
+  dontUseCmakeConfigure = true;
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ cython ];
+  propagatedBuildInputs = [ alure2 ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  doCheck = false; # FIXME: tests need an audio device
+  pythonImportsCheck = [ "palace" ];
+
+  meta = with lib; {
+    description = "Pythonic Audio Library and Codecs Environment";
+    homepage = "https://mcsinyx.gitlab.io/palace";
+    license = licenses.lgpl3Plus;
+    maintainers = [ maintainers.McSinyx ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/palettable/default.nix b/nixpkgs/pkgs/development/python-modules/palettable/default.nix
new file mode 100644
index 000000000000..2f7cb7138c4c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/palettable/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "palettable";
+  version = "3.3.3";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-CU3X2aX8HMpIVHc+XB/GoxWzO9WzqPRwZJKPrK8EkKg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "palettable"
+    "palettable.matplotlib"
+    "palettable.tableau"
+  ];
+
+  meta = with lib; {
+    description = "A library of color palettes";
+    homepage = "https://jiffyclub.github.io/palettable/";
+    changelog = "https://github.com/jiffyclub/palettable/blob/v${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pallets-sphinx-themes/default.nix b/nixpkgs/pkgs/development/python-modules/pallets-sphinx-themes/default.nix
new file mode 100644
index 000000000000..460d99575b9e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pallets-sphinx-themes/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub, sphinx, packaging }:
+
+buildPythonPackage rec {
+  pname = "pallets-sphinx-themes";
+  version = "2.1.1";
+
+  src = fetchFromGitHub {
+    owner = "pallets";
+    repo = "pallets-sphinx-themes";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-Z03rsqkwF2rYaqRZflf5qc5EdHPIEcEcB1ftYIm5DQs=";
+  };
+
+  propagatedBuildInputs = [ packaging sphinx ];
+
+  pythonImportsCheck = [ "pallets_sphinx_themes" ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/pallets/pallets-sphinx-themes";
+    description = "Sphinx theme for Pallets projects";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ kaction ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pamela/default.nix b/nixpkgs/pkgs/development/python-modules/pamela/default.nix
new file mode 100644
index 000000000000..eb1ebff48137
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pamela/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "pamela";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-1LE5/mAOGS4Xaio2gFkgemv/oOeHmHmxP0/LoBY0gb4=";
+  };
+
+  postUnpack = ''
+    substituteInPlace $sourceRoot/pamela.py --replace \
+      'find_library("pam")' \
+      '"${lib.getLib pkgs.pam}/lib/libpam.so"'
+  '';
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "PAM interface using ctypes";
+    homepage = "https://github.com/minrk/pamela";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pamqp/default.nix b/nixpkgs/pkgs/development/python-modules/pamqp/default.nix
new file mode 100644
index 000000000000..62c568e64818
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pamqp/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  version = "3.2.1";
+  pname = "pamqp";
+
+  disabled = pythonOlder "3.7";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "gmr";
+    repo = "pamqp";
+    rev = version;
+    hash = "sha256-zvvRoGMNP4NMy3Etjif5MYUPdRqmQXATbFgxaPp1TaM=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pamqp.base"
+    "pamqp.body"
+    "pamqp.commands"
+    "pamqp.common"
+    "pamqp.decode"
+    "pamqp.encode"
+    "pamqp.exceptions"
+    "pamqp.frame"
+    "pamqp.header"
+    "pamqp.heartbeat"
+  ];
+
+  meta = with lib; {
+    description = "RabbitMQ Focused AMQP low-level library";
+    homepage = "https://github.com/gmr/pamqp";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/panacotta/default.nix b/nixpkgs/pkgs/development/python-modules/panacotta/default.nix
new file mode 100644
index 000000000000..a70add0e9b80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/panacotta/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "panacotta";
+  version = "0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "u1f35c";
+    repo = "python-panacotta";
+    rev = "panacotta-${version}";
+    hash = "sha256-0Ygmj9iRWKvjAuy6j6HjGhl9qJJylfvT5+Uwj44jLgE=";
+  };
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "panacotta"
+  ];
+
+  meta = with lib; {
+    description = "Python API for controlling Panasonic Blu-Ray players";
+    homepage = "https://github.com/u1f35c/python-panacotta";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/panasonic-viera/default.nix b/nixpkgs/pkgs/development/python-modules/panasonic-viera/default.nix
new file mode 100644
index 000000000000..78d726b92a8b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/panasonic-viera/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+, pycryptodome
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "panasonic-viera";
+  version = "0.4.0";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "panasonic_viera";
+    inherit version;
+    sha256 = "baad2db7958ddbc7288d0f1c50a9eeddd8b83f3d30ad14ac3f6c51fe953e0eb6";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    pycryptodome
+    xmltodict
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "panasonic_viera" ];
+
+  meta = {
+    description = "Library to control Panasonic Viera TVs";
+    homepage = "https://github.com/florianholzapfel/panasonic-viera";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pandas-datareader/default.nix b/nixpkgs/pkgs/development/python-modules/pandas-datareader/default.nix
new file mode 100644
index 000000000000..d792c439b581
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pandas-datareader/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pandas
+, lxml
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pandas-datareader";
+  version = "0.10.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9fc3c63d39bc0c10c2683f1c6d503ff625020383e38f6cbe14134826b454d5a6";
+  };
+
+  # Tests are trying to load data over the network
+  doCheck = false;
+  pythonImportsCheck = [ "pandas_datareader" ];
+
+  propagatedBuildInputs = [ pandas lxml requests ];
+
+  meta = with lib; {
+    description = "Up to date remote data access for pandas, works for multiple versions of pandas";
+    homepage = "https://github.com/pydata/pandas-datareader";
+    license= licenses.bsd3;
+    maintainers = with maintainers; [ evax ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pandas-stubs/default.nix b/nixpkgs/pkgs/development/python-modules/pandas-stubs/default.nix
new file mode 100644
index 000000000000..ef387df4f4c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pandas-stubs/default.nix
@@ -0,0 +1,130 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, jinja2
+, matplotlib
+, odfpy
+, openpyxl
+, pandas
+, poetry-core
+, pyarrow
+, pyreadstat
+, pytestCheckHook
+, pythonOlder
+, scipy
+, sqlalchemy
+, tables
+, tabulate
+, types-pytz
+, typing-extensions
+, xarray
+, xlsxwriter
+}:
+
+buildPythonPackage rec {
+  pname = "pandas-stubs";
+  version = "2.0.3.230814";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pandas-dev";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-V/igL+vPJADOL7LwBJljqs2a1BB3vDVYTWXIkK/ImYY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pandas
+    types-pytz
+  ];
+
+  nativeCheckInputs = [
+    jinja2
+    matplotlib
+    odfpy
+    openpyxl
+    pyarrow
+    pyreadstat
+    pytestCheckHook
+    scipy
+    sqlalchemy
+    tables
+    tabulate
+    typing-extensions
+    xarray
+    xlsxwriter
+  ];
+
+  disabledTests = [
+    # AttributeErrors, missing dependencies, error and warning checks
+    "test_aggregate_frame_combinations"
+    "test_aggregate_series_combinations"
+    "test_all_read_without_lxml_dtype_backend"
+    "test_arrow_dtype"
+    "test_attribute_conflict_warning"
+    "test_categorical_conversion_warning"
+    "test_clipboard_iterator"
+    "test_clipboard"
+    "test_closed_file_error"
+    "test_compare_150_changes"
+    "test_crosstab_args"
+    "test_css_warning"
+    "test_data_error"
+    "test_database_error"
+    "test_dummies"
+    "test_from_dummies_args"
+    "test_hdf_context_manager"
+    "test_hdfstore"
+    "test_incompatibility_warning"
+    "test_index_astype"
+    "test_indexing_error"
+    "test_invalid_column_name"
+    "test_isetframe"
+    "test_join"
+    "test_numexpr_clobbering_error"
+    "test_orc_buffer"
+    "test_orc_bytes"
+    "test_orc_columns"
+    "test_orc_path"
+    "test_orc"
+    "test_possible_data_loss_error"
+    "test_possible_precision_loss"
+    "test_pyperclip_exception"
+    "test_quantile_150_changes"
+    "test_read_hdf_iterator"
+    "test_read_sql_via_sqlalchemy_connection"
+    "test_read_sql_via_sqlalchemy_engine"
+    "test_resample_150_changes"
+    "test_reset_index_150_changes"
+    "test_reset_index"
+    "test_rolling_step_method"
+    "test_setting_with_copy_error"
+    "test_setting_with_copy_warning"
+    "test_show_version"
+    "test_specification_error"
+    "test_types_assert_series_equal"
+    "test_types_rank"
+    "test_undefined_variable_error"
+    "test_value_label_type_mismatch"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_plotting" # Fatal Python error: Illegal instruction
+  ];
+
+  pythonImportsCheck = [
+    "pandas"
+  ];
+
+  meta = with lib; {
+    description = "Type annotations for Pandas";
+    homepage = "https://github.com/pandas-dev/pandas-stubs";
+    license = licenses.mit;
+    maintainers = with maintainers; [ malo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pandas/default.nix b/nixpkgs/pkgs/development/python-modules/pandas/default.nix
new file mode 100644
index 000000000000..588dae7b7840
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pandas/default.nix
@@ -0,0 +1,266 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build-system
+, cython
+, meson-python
+, meson
+, oldest-supported-numpy
+, pkg-config
+, versioneer
+, wheel
+
+# propagates
+, numpy
+, python-dateutil
+, pytz
+, tzdata
+
+# optionals
+, beautifulsoup4
+, bottleneck
+, blosc2
+, brotlipy
+, fsspec
+, gcsfs
+, html5lib
+, jinja2
+, lxml
+, matplotlib
+, numba
+, numexpr
+, odfpy
+, openpyxl
+, psycopg2
+, pyarrow
+, pymysql
+, pyqt5
+, pyreadstat
+, python-snappy
+, qtpy
+, s3fs
+, scipy
+, sqlalchemy
+, tables
+, tabulate
+, xarray
+, xlrd
+, xlsxwriter
+, zstandard
+
+# tests
+, adv_cmds
+, glibc
+, glibcLocales
+, hypothesis
+, pytestCheckHook
+, pytest-xdist
+, pytest-asyncio
+, python
+, runtimeShell
+}:
+
+buildPythonPackage rec {
+  pname = "pandas";
+  version = "2.1.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "pandas-dev";
+    repo = "pandas";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-6SgW4BtO7EFnS8P8LL4AGk5EdPwOQ0+is0wXgqsm9w0=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "meson-python==0.13.1" "meson-python>=0.13.1" \
+      --replace "meson==1.2.1" "meson>=1.2.1"
+  '';
+
+  nativeBuildInputs = [
+    cython
+    meson-python
+    meson
+    numpy
+    pkg-config
+    versioneer
+    wheel
+  ]
+  ++ versioneer.optional-dependencies.toml
+  ++ lib.optionals (pythonOlder "3.12") [
+    oldest-supported-numpy
+  ];
+
+  enableParallelBuilding = true;
+
+  propagatedBuildInputs = [
+    numpy
+    python-dateutil
+    pytz
+    tzdata
+  ];
+
+  passthru.optional-dependencies = let
+    extras = {
+      aws = [
+        s3fs
+      ];
+      clipboard = [
+        pyqt5
+        qtpy
+      ];
+      compression = [
+        brotlipy
+        python-snappy
+        zstandard
+      ];
+      computation = [
+        scipy
+        xarray
+      ];
+      excel = [
+        odfpy
+        openpyxl
+        # TODO: pyxlsb
+        xlrd
+        xlsxwriter
+      ];
+      feather = [
+        pyarrow
+      ];
+      fss = [
+        fsspec
+      ];
+      gcp = [
+        gcsfs
+        # TODO: pandas-gqb
+      ];
+      hdf5 = [
+        blosc2
+        tables
+      ];
+      html = [
+        beautifulsoup4
+        html5lib
+        lxml
+      ];
+      mysql = [
+        sqlalchemy
+        pymysql
+      ];
+      output_formatting = [
+        jinja2
+        tabulate
+      ];
+      parquet = [
+        pyarrow
+      ];
+      performance = [
+        bottleneck
+        numba
+        numexpr
+      ];
+      plot = [
+        matplotlib
+      ];
+      postgresql = [
+        sqlalchemy
+        psycopg2
+      ];
+      spss = [
+        pyreadstat
+      ];
+      sql-other = [
+        sqlalchemy
+      ];
+      xml = [
+        lxml
+      ];
+    };
+  in extras // {
+    all = lib.concatLists (lib.attrValues extras);
+  };
+
+  nativeCheckInputs = [
+    glibcLocales
+    hypothesis
+    pytest-asyncio
+    pytest-xdist
+    pytestCheckHook
+  ] ++ lib.optionals (stdenv.isLinux) [
+    # for locale executable
+    glibc
+  ] ++ lib.optionals (stdenv.isDarwin) [
+    # for locale executable
+    adv_cmds
+  ];
+
+  # don't max out build cores, it breaks tests
+  dontUsePytestXdist = true;
+
+  __darwinAllowLocalNetworking = true;
+
+  pytestFlagsArray = [
+    # https://github.com/pandas-dev/pandas/blob/main/test_fast.sh
+    "-m" "'not single_cpu and not slow and not network and not db and not slow_arm'"
+    # https://github.com/pandas-dev/pandas/issues/54907
+    "--no-strict-data-files"
+    "--numprocesses" "4"
+  ];
+
+  disabledTests = [
+    # AssertionError: Did not see expected warning of class 'FutureWarning'
+    "test_parsing_tzlocal_deprecated"
+  ] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
+    # tests/generic/test_finalize.py::test_binops[and_-args4-right] - AssertionError: assert {} == {'a': 1}
+    "test_binops"
+    # These tests are unreliable on aarch64-darwin. See https://github.com/pandas-dev/pandas/issues/38921.
+    "test_rolling"
+  ] ++ lib.optional stdenv.is32bit [
+    # https://github.com/pandas-dev/pandas/issues/37398
+    "test_rolling_var_numerical_issues"
+  ];
+
+  # Tests have relative paths, and need to reference compiled C extensions
+  # so change directory where `import .test` is able to be resolved
+  preCheck = ''
+    export HOME=$TMPDIR
+    export LC_ALL="en_US.UTF-8"
+    cd $out/${python.sitePackages}/pandas
+  ''
+  # TODO: Get locale and clipboard support working on darwin.
+  #       Until then we disable the tests.
+  + lib.optionalString stdenv.isDarwin ''
+    # Fake the impure dependencies pbpaste and pbcopy
+    echo "#!${runtimeShell}" > pbcopy
+    echo "#!${runtimeShell}" > pbpaste
+    chmod a+x pbcopy pbpaste
+    export PATH=$(pwd):$PATH
+  '';
+
+  pythonImportsCheck = [
+    "pandas"
+  ];
+
+  meta = with lib; {
+    # pandas devs no longer test i686, it's commonly broken
+    # broken = stdenv.isi686;
+    changelog = "https://pandas.pydata.org/docs/whatsnew/index.html";
+    description = "Powerful data structures for data analysis, time series, and statistics";
+    downloadPage = "https://github.com/pandas-dev/pandas";
+    homepage = "https://pandas.pydata.org";
+    license = licenses.bsd3;
+    longDescription = ''
+      Flexible and powerful data analysis / manipulation library for
+      Python, providing labeled data structures similar to R data.frame
+      objects, statistical functions, and much more.
+    '';
+    maintainers = with maintainers; [ raskin fridh knedlsepp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pandoc-attributes/default.nix b/nixpkgs/pkgs/development/python-modules/pandoc-attributes/default.nix
new file mode 100644
index 000000000000..d4da8e3cac62
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pandoc-attributes/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, pandocfilters
+}:
+
+buildPythonPackage rec {
+  pname = "pandoc-attributes";
+  version = "0.1.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "69221502dac74f5df1317011ce62c85a83eef5da3b71c63b1908e98224304a8c";
+  };
+
+  propagatedBuildInputs = [
+    pandocfilters
+  ];
+
+  # No tests in pypi source
+  doCheck = false;
+
+  meta = {
+    homepage = "https://github.com/aaren/pandoc-attributes";
+    description = "An Attribute class to be used with pandocfilters";
+    license = lib.licenses.bsd2;
+    maintainers = with lib.maintainers; [ vcanadi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pandoc-xnos/default.nix b/nixpkgs/pkgs/development/python-modules/pandoc-xnos/default.nix
new file mode 100644
index 000000000000..ad2aa6dd43b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pandoc-xnos/default.nix
@@ -0,0 +1,43 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, pandocfilters
+, psutil
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pandoc-xnos";
+  version = "2.5.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "tomduck";
+    repo = pname;
+    rev = version;
+    hash = "sha256-beiGvN0DS6s8wFjcDKozDuwAM2OApX3lTRaUDRUqLeU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pandocfilters
+    psutil
+  ];
+
+  pythonImportsCheck = [
+    "pandocxnos"
+  ];
+
+  # tests need some patching
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Pandoc filter suite providing facilities for cross-referencing in markdown documents";
+    homepage = "https://github.com/tomduck/pandoc-xnos";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ ppenguin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pandocfilters/default.nix b/nixpkgs/pkgs/development/python-modules/pandocfilters/default.nix
new file mode 100644
index 000000000000..9dac79bea743
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pandocfilters/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  version = "1.5.0";
+  pname = "pandocfilters";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38";
+  };
+
+  # No tests available
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A python module for writing pandoc filters, with a collection of examples";
+    homepage = "https://github.com/jgm/pandocfilters";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/panel/default.nix b/nixpkgs/pkgs/development/python-modules/panel/default.nix
new file mode 100644
index 000000000000..7fe1be6f7458
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/panel/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonRelaxDepsHook
+, bleach
+, bokeh
+, param
+, pyviz-comms
+, markdown
+, pyct
+, requests
+, setuptools
+, tqdm
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "panel";
+  version = "1.2.3";
+
+  format = "wheel";
+
+  # We fetch a wheel because while we can fetch the node
+  # artifacts using npm, the bundling invoked in setup.py
+  # tries to fetch even more artifacts
+  src = fetchPypi {
+    inherit pname version format;
+    hash = "sha256-CAW6z0phPohpFjv4D1DlmomDiv52vb5qBatWN/Mmg/c=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    "bokeh"
+  ];
+
+  propagatedBuildInputs = [
+    bleach
+    bokeh
+    markdown
+    param
+    pyct
+    pyviz-comms
+    requests
+    setuptools
+    tqdm
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [
+    "panel"
+  ];
+
+  # infinite recursion in test dependencies (hvplot)
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A high level dashboarding library for python visualization libraries";
+    homepage = "https://github.com/holoviz/panel";
+    changelog = "https://github.com/holoviz/panel/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/panflute/default.nix b/nixpkgs/pkgs/development/python-modules/panflute/default.nix
new file mode 100644
index 000000000000..981e52a07c09
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/panflute/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, fetchPypi
+, click
+, pyyaml
+, buildPythonPackage
+, pythonOlder
+}:
+
+buildPythonPackage rec{
+  pname = "panflute";
+  version = "2.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zv2d/EjM2XMqU9tXYQcB0igG2jl6ipflzI3AcLVYZco=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    pyyaml
+  ];
+
+  pythonImportsCheck = [
+    "panflute"
+  ];
+
+  meta = with lib; {
+    description = "Pythonic alternative to John MacFarlane's pandocfilters, with extra helper functions";
+    homepage = "http://scorreia.com/software/panflute";
+    changelog = "https://github.com/sergiocorreia/panflute/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ synthetica ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/papermill/default.nix b/nixpkgs/pkgs/development/python-modules/papermill/default.nix
new file mode 100644
index 000000000000..d5c2f3018d30
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/papermill/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, ansiwrap
+, azure-datalake-store
+, azure-storage-blob
+, boto3
+, buildPythonPackage
+, click
+, entrypoints
+, fetchPypi
+, gcsfs
+, nbclient
+, nbformat
+, pyarrow
+, pygithub
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, requests
+, tenacity
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "papermill";
+  version = "2.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-b4+KmwazlnfyB8CRAMjThrz1kvDLvdqfD1DoFEVpdic=";
+  };
+
+  propagatedBuildInputs = [
+    ansiwrap
+    click
+    pyyaml
+    nbformat
+    nbclient
+    tqdm
+    requests
+    entrypoints
+    tenacity
+  ];
+
+  passthru.optional-dependencies = {
+    azure = [
+      azure-datalake-store
+      azure-storage-blob
+    ];
+    gcs = [
+      gcsfs
+    ];
+    github = [
+      pygithub
+    ];
+    hdfs = [
+      pyarrow
+    ];
+    s3 = [
+      boto3
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  # The test suite depends on cloud resources azure/aws
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "papermill"
+  ];
+
+  meta = with lib; {
+    description = "Parametrize and run Jupyter and interact with notebooks";
+    homepage = "https://github.com/nteract/papermill";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/papis-python-rofi/default.nix b/nixpkgs/pkgs/development/python-modules/papis-python-rofi/default.nix
new file mode 100644
index 000000000000..3d3ce9a002b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/papis-python-rofi/default.nix
@@ -0,0 +1,21 @@
+{ buildPythonPackage, lib, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "papis-python-rofi";
+  version = "1.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "358e24f5fb0a86de6f15d5168753ad4cbb97e52b36b1bd7abbad4053aeb6f621";
+  };
+
+  # No tests existing
+  doCheck = false;
+
+  meta = {
+    description = "A Python module to make simple GUIs with Rofi";
+    homepage = "https://github.com/alejandrogallo/python-rofi";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.nico202 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/papis/default.nix b/nixpkgs/pkgs/development/python-modules/papis/default.nix
new file mode 100644
index 000000000000..34980fb0c1ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/papis/default.nix
@@ -0,0 +1,121 @@
+{ lib
+, stdenv
+, arxiv2bib
+, beautifulsoup4
+, bibtexparser
+, buildPythonPackage
+, chardet
+, click
+, colorama
+, configparser
+, dominate
+, fetchFromGitHub
+, filetype
+, habanero
+, isbnlib
+, lxml
+, prompt-toolkit
+, pygments
+, pyparsing
+, pytestCheckHook
+, python-doi
+, python-slugify
+, pythonAtLeast
+, pythonOlder
+, pyyaml
+, requests
+, stevedore
+, tqdm
+, typing-extensions
+, whoosh
+}:
+
+buildPythonPackage rec {
+  pname = "papis";
+  version = "0.13";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "papis";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-iRrf37hq+9D01JRaQIqg7yTPbLX6I0ZGnzG3r1DX464=";
+  };
+
+  propagatedBuildInputs = [
+    arxiv2bib
+    beautifulsoup4
+    bibtexparser
+    chardet
+    click
+    colorama
+    configparser
+    dominate
+    filetype
+    habanero
+    isbnlib
+    lxml
+    prompt-toolkit
+    pygments
+    pyparsing
+    python-doi
+    python-slugify
+    pyyaml
+    requests
+    stevedore
+    tqdm
+    typing-extensions
+    whoosh
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=papis" ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  pytestFlagsArray = [
+    "papis tests"
+  ];
+
+  disabledTestPaths = [
+    "tests/downloaders"
+    "papis/downloaders/usenix.py"
+  ];
+
+  disabledTests = [
+    "get_document_url"
+    "match"
+    "test_doi_to_data"
+    "test_downloader_getter"
+    "test_general"
+    "test_get_config_dirs"
+    "test_get_data"
+    "test_valid_dblp_key"
+    "test_validate_arxivid"
+    "test_yaml"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_default_opener"
+  ];
+
+  pythonImportsCheck = [
+    "papis"
+  ];
+
+  meta = with lib; {
+    description = "Powerful command-line document and bibliography manager";
+    homepage = "https://papis.readthedocs.io/";
+    changelog = "https://github.com/papis/papis/blob/v${version}/CHANGELOG.md";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ nico202 teto marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/para/default.nix b/nixpkgs/pkgs/development/python-modules/para/default.nix
new file mode 100644
index 000000000000..e1f3f828120f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/para/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "para";
+  version = "0.0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-RsMjKunY6p2IbP0IzdESiSICvthkX0C2JVWXukz+8hc=";
+  };
+
+  nativeCheckInputs = [
+    nose
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "para" ];
+
+  meta = with lib; {
+    description = "A set utilities that ake advantage of python's 'multiprocessing' module to distribute CPU-intensive tasks";
+    homepage = "https://pypi.org/project/para";
+    license = licenses.mit;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/param/default.nix b/nixpkgs/pkgs/development/python-modules/param/default.nix
new file mode 100644
index 000000000000..a37cf7c7f03d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/param/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "param";
+  version = "1.13.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "holoviz";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-5b3UTzb7OXBwcyYyDVCGLUpWxNOYZ3cv8Gfw+x7jsBI=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # Version is not set properly
+    substituteInPlace setup.py \
+      --replace 'version=get_setup_version("param"),' 'version="${version}",'
+  '';
+
+  pythonImportsCheck = [
+    "param"
+  ];
+
+  meta = with lib; {
+    description = "Declarative Python programming using Parameters";
+    homepage = "https://param.holoviz.org/";
+    changelog = "https://github.com/holoviz/param/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/parameter-expansion-patched/default.nix b/nixpkgs/pkgs/development/python-modules/parameter-expansion-patched/default.nix
new file mode 100644
index 000000000000..19149d8db241
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parameter-expansion-patched/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "parameter-expansion-patched";
+  version = "0.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/128ifveWC8zNlYtGWtxB3HpK6p7bVk1ahSwhaC2dAs=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "parameter_expansion"
+  ];
+
+  meta = with lib; {
+    description = "POSIX parameter expansion in Python";
+    homepage = "https://github.com/nexB/parameter_expansion_patched";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/parameterized/default.nix b/nixpkgs/pkgs/development/python-modules/parameterized/default.nix
new file mode 100644
index 000000000000..fb08e07ec04b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parameterized/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "parameterized";
+  version = "0.9.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-f8kFJyzvpPNkwaNCnLvpwPmLeTmI77W/kKrIDwjbCbE=";
+  };
+
+  postPatch = ''
+    # broken with pytest 7
+    # https://github.com/wolever/parameterized/issues/167
+    substituteInPlace parameterized/test.py \
+      --replace 'assert_equal(missing, [])' ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  checkInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "parameterized/test.py"
+  ];
+
+  pythonImportsCheck = [
+    "parameterized"
+  ];
+
+  meta = with lib; {
+    description = "Parameterized testing with any Python test framework";
+    homepage = "https://github.com/wolever/parameterized";
+    changelog = "https://github.com/wolever/parameterized/blob/v${version}/CHANGELOG.txt";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/parametrize-from-file/default.nix b/nixpkgs/pkgs/development/python-modules/parametrize-from-file/default.nix
new file mode 100644
index 000000000000..79a073af9955
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parametrize-from-file/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, pytestCheckHook
+, numpy
+, decopatch
+, more-itertools
+, nestedtext
+, pyyaml
+, tidyexc
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "parametrize-from-file";
+  version = "0.18.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "parametrize_from_file";
+    hash = "sha256-mYE8J7XWlvCS2H3kt0bB8dyPHFDqmW8NiH9UCrNccAU=";
+  };
+
+  # patch out coveralls since it doesn't provide us value
+  preBuild = ''
+    sed -i '/coveralls/d' ./pyproject.toml
+
+    substituteInPlace pyproject.toml \
+      --replace "more_itertools~=8.10" "more_itertools"
+  '';
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  nativeCheckInputs = [
+    numpy
+    pytestCheckHook
+  ];
+
+  propagatedBuildInputs = [
+    decopatch
+    more-itertools
+    nestedtext
+    pyyaml
+    tidyexc
+    toml
+  ];
+
+  pythonImportsCheck = [
+    "parametrize_from_file"
+  ];
+
+  disabledTests = [
+    # https://github.com/kalekundert/parametrize_from_file/issues/19
+    "test_load_suite_params_err"
+  ];
+
+  meta = with lib; {
+    description = "Read unit test parameters from config files";
+    homepage = "https://github.com/kalekundert/parametrize_from_file";
+    changelog = "https://github.com/kalekundert/parametrize_from_file/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jpetrucciani ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/paramiko/default.nix b/nixpkgs/pkgs/development/python-modules/paramiko/default.nix
new file mode 100644
index 000000000000..278bb0583e35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paramiko/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, bcrypt
+, buildPythonPackage
+, cryptography
+, fetchpatch
+, fetchPypi
+, gssapi
+, icecream
+, invoke
+, mock
+, pyasn1
+, pynacl
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "paramiko";
+  version = "3.3.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ajd3qWGshtvvN1xfW41QAUoaltD9fwVKQ7yIATSw/3c=";
+  };
+
+  patches = [
+    # Fix usage of dsa keys
+    # https://github.com/paramiko/paramiko/pull/1606/
+    (fetchpatch {
+      url = "https://github.com/paramiko/paramiko/commit/18e38b99f515056071fb27b9c1a4f472005c324a.patch";
+      hash = "sha256-bPDghPeLo3NiOg+JwD5CJRRLv2VEqmSx1rOF2Tf8ZDA=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    bcrypt
+    cryptography
+    pyasn1
+    six
+  ] ++ passthru.optional-dependencies.ed25519; # remove on 3.0 update
+
+  passthru.optional-dependencies = {
+    gssapi = [ pyasn1 gssapi ];
+    ed25519 = [ pynacl bcrypt ];
+    invoke = [ invoke ];
+  };
+
+  nativeCheckInputs = [
+    icecream
+    mock
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  disabledTestPaths = [
+    # disable tests that require pytest-relaxed, which is broken
+    "tests/test_client.py"
+    "tests/test_ssh_gss.py"
+  ];
+
+  pythonImportsCheck = [
+    "paramiko"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    homepage = "https://github.com/paramiko/paramiko/";
+    changelog = "https://github.com/paramiko/paramiko/blob/${version}/sites/www/changelog.rst";
+    description = "Native Python SSHv2 protocol library";
+    license = licenses.lgpl21Plus;
+    longDescription = ''
+      Library for making SSH2 connections (client or server). Emphasis is
+      on using SSH2 as an alternative to SSL for making secure connections
+      between python scripts. All major ciphers and hash methods are
+      supported. SFTP client and server mode are both supported too.
+    '';
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/paramz/default.nix b/nixpkgs/pkgs/development/python-modules/paramz/default.nix
new file mode 100644
index 000000000000..1f2ddb3d8cfd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paramz/default.nix
@@ -0,0 +1,40 @@
+{ lib, buildPythonPackage, fetchpatch, fetchPypi, numpy, scipy, six, decorator, nose }:
+
+buildPythonPackage rec {
+  pname = "paramz";
+  version = "0.9.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0917211c0f083f344e7f1bc997e0d713dbc147b6380bc19f606119394f820b9a";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "remove-deprecated-numpy-uses";
+      url = "https://github.com/sods/paramz/pull/38/commits/a5a0be15b12c5864b438d870b519ad17cc72cd12.patch";
+      hash = "sha256-vj/amEXL9QJ7VdqJmyhv/lj8n+yuiZEARQBYWw6lgBA=";
+    })
+    (fetchpatch {
+      name = "_raveled_index_for.patch";
+      url = "https://github.com/sods/paramz/pull/40/commits/dd68a81cfd28edb48354c6a9b493ef711f00fb5b.patch";
+      hash = "sha256-nbnW3lYJDT1WXko3Y28YyELhO0QIAA1Tx0CJ57T1Nq0=";
+    })
+  ];
+
+  propagatedBuildInputs = [ numpy scipy six decorator ];
+  nativeCheckInputs = [ nose ];
+
+  pythonImportsCheck = [ "paramz" ];
+
+  checkPhase = ''
+      nosetests -v paramz/tests
+  '';
+
+  meta = with lib; {
+    description = "Parameterization framework for parameterized model creation and handling";
+    homepage = "https://github.com/sods/paramz";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/paranoid-crypto/default.nix b/nixpkgs/pkgs/development/python-modules/paranoid-crypto/default.nix
new file mode 100644
index 000000000000..f4ee6d2fe0b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paranoid-crypto/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, absl-py
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, fpylll
+, gmpy
+, protobuf
+, pybind11
+, pytestCheckHook
+, pythonOlder
+, scipy
+, sympy
+}:
+
+buildPythonPackage rec {
+  pname = "paranoid-crypto";
+  version = "unstable-20220819";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = "paranoid_crypto";
+    # https://github.com/google/paranoid_crypto/issues/11
+    rev = "8abccc1619748b93979d1c26234b90d26e88a12e";
+    hash = "sha256-4yF7WAFAGGhvWTV/y5dGVA/+9r1dqrXU/0/6Edgw3ow=";
+  };
+
+  nativeBuildInputs = [
+    protobuf
+    pybind11
+  ];
+
+  propagatedBuildInputs = [
+    absl-py
+    cryptography
+    gmpy
+    scipy
+    sympy
+    protobuf
+  ];
+
+  nativeCheckInputs = [
+    fpylll
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "protobuf==3.20.*" "protobuf"
+  '';
+
+  disabledTestPaths = [
+    # Import issue
+    "paranoid_crypto/lib/randomness_tests/"
+  ];
+
+  pythonImportsCheck = [
+    "paranoid_crypto"
+  ];
+
+  meta = with lib; {
+    description = "Library contains checks for well known weaknesses on cryptographic artifacts";
+    homepage = "https://github.com/google/paranoid_crypto";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/parfive/default.nix b/nixpkgs/pkgs/development/python-modules/parfive/default.nix
new file mode 100644
index 000000000000..c30dc40891bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parfive/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, aiofiles
+, aioftp
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pytest-asyncio
+, pytest-localserver
+, pytest-socket
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "parfive";
+  version = "2.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-kIIR+cXLUtyLJ5YmhyCV88zhXahok/U7QXbezt3PyF0=";
+  };
+
+  buildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    aioftp
+    aiohttp
+    tqdm
+  ];
+
+  nativeCheckInputs = [
+    aiofiles
+    pytest-asyncio
+    pytest-localserver
+    pytest-socket
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Requires network access
+    "test_ftp"
+    "test_ftp_pasv_command"
+    "test_ftp_http"
+  ];
+
+  pythonImportsCheck = [
+    "parfive"
+  ];
+
+  meta = with lib; {
+    description = "A HTTP and FTP parallel file downloader";
+    homepage = "https://parfive.readthedocs.io/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/parquet/default.nix b/nixpkgs/pkgs/development/python-modules/parquet/default.nix
new file mode 100644
index 000000000000..89503526654e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parquet/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, python-snappy
+, thriftpy2
+}:
+
+buildPythonPackage rec {
+  pname = "parquet";
+  version = "1.3.1";
+
+  src = fetchFromGitHub {
+    owner = "jcrobak";
+    repo = "parquet-python";
+    rev = "v${version}";
+    sha256 = "1ahvg4dz9fzi4vdm9jmslq3v3jahjj17fdcc5fljgcw6h9yxyl2r";
+  };
+
+  propagatedBuildInputs = [
+    python-snappy
+    thriftpy2
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Fails with AttributeError
+    "test_bson"
+    "testFromExample"
+  ];
+
+  pythonImportsCheck = [ "thriftpy2" ];
+
+  meta = with lib; {
+    description = "Python implementation of the parquet columnar file format";
+    homepage = "https://github.com/jcrobak/parquet-python";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/parse-type/default.nix b/nixpkgs/pkgs/development/python-modules/parse-type/default.nix
new file mode 100644
index 000000000000..e7ebfb5c63e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parse-type/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, parse
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "parse-type";
+  version = "0.6.2";
+
+  src = fetchFromGitHub {
+    owner = "jenisys";
+    repo = "parse_type";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-dunvcSi+nN5VruvRUPIEpkyUsmeS+kIYDfS8ibDR96s=";
+  };
+
+  propagatedBuildInputs = [
+    parse
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace "--metadata PACKAGE_UNDER_TEST parse_type" "" \
+      --replace "--metadata PACKAGE_VERSION ${version}" "" \
+      --replace "--html=build/testing/report.html --self-contained-html" "" \
+      --replace "--junit-xml=build/testing/report.xml" ""
+  '';
+
+  pythonImportsCheck = [ "parse_type" ];
+
+  meta = with lib; {
+    description = "Simplifies to build parse types based on the parse module";
+    homepage = "https://github.com/jenisys/parse_type";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ alunduil ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/parse/default.nix b/nixpkgs/pkgs/development/python-modules/parse/default.nix
new file mode 100644
index 000000000000..7956a2971b51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parse/default.nix
@@ -0,0 +1,32 @@
+{ lib, fetchFromGitHub
+, buildPythonPackage
+, setuptools
+, pytestCheckHook
+}:
+buildPythonPackage rec {
+  pname = "parse";
+  version = "1.19.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "r1chardj0n3s";
+    repo = "parse";
+    rev = "refs/tags/${version}";
+    hash = "sha256-f08SlkGnwhSh0ajTKFqBAGGFvLj8nWBZVb6uClbRaP4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/r1chardj0n3s/parse";
+    description = "parse() is the opposite of format()";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ alunduil ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/parsedatetime/default.nix b/nixpkgs/pkgs/development/python-modules/parsedatetime/default.nix
new file mode 100644
index 000000000000..fab03550fd1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parsedatetime/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, future
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "parsedatetime";
+  version = "2.6";
+  disabled = isPy27; # no longer compatible with icu package
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4cb368fbb18a0b7231f4d76119165451c8d2e35951455dfee97c62a87b04d455";
+  };
+
+  propagatedBuildInputs = [ future ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pytestFlagsArray = [ "tests/Test*.py" ];
+
+  disabledTests = [
+    # https://github.com/bear/parsedatetime/issues/263
+    "testDate3ConfusedHourAndYear"
+    # https://github.com/bear/parsedatetime/issues/215
+    "testFloat"
+  ];
+
+  pythonImportsCheck = [ "parsedatetime" ];
+
+  meta = with lib; {
+    description = "Parse human-readable date/time text";
+    homepage = "https://github.com/bear/parsedatetime";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/parsedmarc/default.nix b/nixpkgs/pkgs/development/python-modules/parsedmarc/default.nix
new file mode 100644
index 000000000000..576b54860557
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parsedmarc/default.nix
@@ -0,0 +1,107 @@
+{ lib
+, azure-identity
+, azure-monitor-ingestion
+, boto3
+, buildPythonPackage
+, dateparser
+, dnspython
+, elasticsearch
+, elasticsearch-dsl
+, expiringdict
+, fetchPypi
+, fetchurl
+, geoip2
+, google-api-core
+, google-api-python-client
+, google-auth
+, google-auth-httplib2
+, google-auth-oauthlib
+, hatchling
+, imapclient
+, kafka-python
+, lxml
+, mailsuite
+, msgraph-core
+, nixosTests
+, publicsuffixlist
+, pythonOlder
+, requests
+, tqdm
+, urllib3
+, xmltodict
+}:
+
+let
+  dashboard = fetchurl {
+    url = "https://raw.githubusercontent.com/domainaware/parsedmarc/77331b55c54cb3269205295bd57d0ab680638964/grafana/Grafana-DMARC_Reports.json";
+    sha256 = "0wbihyqbb4ndjg79qs8088zgrcg88km8khjhv2474y7nzjzkf43i";
+  };
+in
+buildPythonPackage rec {
+  pname = "parsedmarc";
+  version = "8.6.4";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ibxSp1M85WngQKdjlRC4JvLxn0rEn9oVkid/V4iD6zY=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "elasticsearch<7.14.0" "elasticsearch"
+  '';
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    azure-identity
+    azure-monitor-ingestion
+    boto3
+    dateparser
+    dnspython
+    elasticsearch
+    elasticsearch-dsl
+    expiringdict
+    geoip2
+    google-api-core
+    google-api-python-client
+    google-auth
+    google-auth-httplib2
+    google-auth-oauthlib
+    imapclient
+    kafka-python
+    lxml
+    mailsuite
+    msgraph-core
+    publicsuffixlist
+    requests
+    tqdm
+    urllib3
+    xmltodict
+  ];
+
+  # no tests on PyPI, no tags on GitHub
+  # https://github.com/domainaware/parsedmarc/issues/426
+  doCheck = false;
+
+  pythonImportsCheck = [ "parsedmarc" ];
+
+  passthru = {
+    inherit dashboard;
+    tests = nixosTests.parsedmarc;
+  };
+
+  meta = with lib; {
+    changelog = "https://github.com/domainaware/parsedmarc/blob/master/CHANGELOG.md#${lib.replaceStrings [ "." ] [ "" ] version}";
+    description = "Python module and CLI utility for parsing DMARC reports";
+    homepage = "https://domainaware.github.io/parsedmarc/";
+    mainProgram = "parsedmarc";
+    maintainers = with maintainers; [ talyz ];
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/parsel/default.nix b/nixpkgs/pkgs/development/python-modules/parsel/default.nix
new file mode 100644
index 000000000000..5a779aab12b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parsel/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, cssselect
+, fetchPypi
+, jmespath
+, lxml
+, packaging
+, psutil
+, pytestCheckHook
+, pythonOlder
+, w3lib
+}:
+
+buildPythonPackage rec {
+  pname = "parsel";
+  version = "1.8.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-r/KOaMmz8akB2ypOPxWNhICjhyTXMo7nUcGk4cGAHjk=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner",' ""
+  '';
+
+  propagatedBuildInputs = [
+    cssselect
+    jmespath
+    lxml
+    packaging
+    w3lib
+  ];
+
+  nativeCheckInputs = [
+    psutil
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "parsel"
+  ];
+
+  meta = with lib; {
+    description = "Python library to extract data from HTML and XML using XPath and CSS selectors";
+    homepage = "https://github.com/scrapy/parsel";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/parsimonious/default.nix b/nixpkgs/pkgs/development/python-modules/parsimonious/default.nix
new file mode 100644
index 000000000000..b156321cefec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parsimonious/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, regex
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "parsimonious";
+  version = "0.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-goFgDaGA7IrjVCekq097gr/sHj0eUvgMtg6oK5USUBw=";
+  };
+
+  propagatedBuildInputs = [
+    regex
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # test_benchmarks.py tests are actually benchmarks and may fail due to
+    # something being unexpectedly slow on a heavily loaded build machine
+    "test_lists_vs_dicts"
+    "test_call_vs_inline"
+    "test_startswith_vs_regex"
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "regex>=2022.3.15" "regex"
+  '';
+
+  pythonImportsCheck = [
+    "parsimonious"
+    "parsimonious.grammar"
+    "parsimonious.nodes"
+  ];
+
+  meta = with lib; {
+    description = "Arbitrary-lookahead parser";
+    homepage = "https://github.com/erikrose/parsimonious";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/parsley/default.nix b/nixpkgs/pkgs/development/python-modules/parsley/default.nix
new file mode 100644
index 000000000000..17e05b6027f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parsley/default.nix
@@ -0,0 +1,22 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "Parsley";
+  version = "1.3";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0hcd41bl07a8sx7nmx12p16xprnblc4phxkawwmmy78n8y6jfi4l";
+  };
+  # Tests fail although the package works just fine.  Unfortunately
+  # the tests as run by the upstream CI server travis.org are broken.
+  doCheck = false;
+  meta = with lib; {
+    license = licenses.mit;
+    homepage = "https://launchpad.net/parsley";
+    description = "A parser generator library based on OMeta, and other useful parsing tools.";
+    maintainers = with maintainers; [ seppeljordan ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/parso/default.nix b/nixpkgs/pkgs/development/python-modules/parso/default.nix
new file mode 100644
index 000000000000..fe31d7d74671
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parso/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pythonAtLeast
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "parso";
+  version = "0.8.3";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jAe+KQu1nwNYiRWSHinopQACrK8s3F+g4BFPkXCfr6A=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  disabledTests = lib.optionals (pythonAtLeast "3.10") [
+    # python changed exception message format in 3.10, 3.10 not yet supported
+    "test_python_exception_matches"
+  ];
+
+  meta = with lib; {
+    description = "A Python Parser";
+    homepage = "https://parso.readthedocs.io/en/latest/";
+    changelog = "https://github.com/davidhalter/parso/blob/master/CHANGELOG.rst";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/parsy/default.nix b/nixpkgs/pkgs/development/python-modules/parsy/default.nix
new file mode 100644
index 000000000000..07e9bfb2be76
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parsy/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "parsy";
+  version = "2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    repo = "parsy";
+    owner = "python-parsy";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-/Bu3xZUpXI4WiYJKKWTJTdSFq8pwC1PFDw0Kr8s3Fe8=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "parsy"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/python-parsy/parsy";
+    description = "Easy-to-use parser combinators, for parsing in pure Python";
+    changelog = "https://github.com/python-parsy/parsy/blob/v${version}/docs/history.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ milibopp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/partd/default.nix b/nixpkgs/pkgs/development/python-modules/partd/default.nix
new file mode 100644
index 000000000000..52e76646875e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/partd/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pytest
+, locket
+, numpy
+, pandas
+, pyzmq
+, toolz
+}:
+
+buildPythonPackage rec {
+  pname = "partd";
+  version = "1.4.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-qg/zXbvMgHrjdNtWMy9MGzm0b2e/KXX1FR4LQYau0NU=";
+  };
+
+  nativeCheckInputs = [ pytest ];
+
+  propagatedBuildInputs = [ locket numpy pandas pyzmq toolz ];
+
+  checkPhase = ''
+    rm partd/tests/test_zmq.py # requires network & fails
+    py.test -k "not test_serialize"
+  '';
+
+  meta = {
+    description = "Appendable key-value storage";
+    license = with lib.licenses; [ bsd3 ];
+    homepage = "https://github.com/dask/partd/";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/particle/default.nix b/nixpkgs/pkgs/development/python-modules/particle/default.nix
new file mode 100644
index 000000000000..69eabb7cf57f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/particle/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, attrs
+, buildPythonPackage
+, deprecated
+, fetchFromGitHub
+, fetchPypi
+, hatch-vcs
+, hatchling
+, hepunits
+, pandas
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, tabulate
+}:
+
+buildPythonPackage rec {
+  pname = "particle";
+  version = "0.23.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2BD4/CfeuOf9ZBdAF9lgfVBSIknAlzoACOWA+T2xF1A=";
+  };
+
+  postPatch = ''
+    # Disable benchmark tests, so we won't need pytest-benchmark and pytest-cov
+    # as dependencies
+    substituteInPlace pyproject.toml \
+      --replace '"--benchmark-disable",' ""
+  '';
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    deprecated
+    hepunits
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    tabulate
+    pandas
+  ];
+
+  pythonImportsCheck = [
+    "particle"
+  ];
+
+  disabledTestPaths = [
+    "tests/particle/test_performance.py"
+  ];
+
+  meta = with lib; {
+    description = "Package to deal with particles, the PDG particle data table and others";
+    homepage = "https://github.com/scikit-hep/particle";
+    changelog = "https://github.com/scikit-hep/particle/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ doronbehar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/parts/default.nix b/nixpkgs/pkgs/development/python-modules/parts/default.nix
new file mode 100644
index 000000000000..126cabfc8f67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parts/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "parts";
+  version = "1.7.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-TbcFgWKKgHXFyi1NqwVy1ITGHESb4ZusivOpFWazN1s=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "parts"
+  ];
+
+  meta = with lib; {
+    description = "Library for common list functions related to partitioning lists";
+    homepage = "https://github.com/lapets/parts";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/parver/default.nix b/nixpkgs/pkgs/development/python-modules/parver/default.nix
new file mode 100644
index 000000000000..b18d7db34766
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/parver/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, attrs
+, pytestCheckHook
+, hypothesis
+, pretend
+, arpeggio
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "parver";
+  version = "0.5";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uf3h5ruc6fB+COnEvqjYglxeeOGKAFLQLgK/lRfrR3c=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    arpeggio
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    hypothesis
+    pretend
+  ];
+
+  meta = with lib; {
+    description = "Allows parsing and manipulation of PEP 440 version numbers";
+    homepage = "https://github.com/RazerM/parver";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pasimple/default.nix b/nixpkgs/pkgs/development/python-modules/pasimple/default.nix
new file mode 100644
index 000000000000..6dc52b210158
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pasimple/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pulseaudio
+}:
+
+buildPythonPackage rec {
+  pname = "pasimple";
+  version = "0.0.2";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "henrikschnor";
+    repo = "pasimple";
+    rev = "v${version}";
+    hash = "sha256-Z271FdBCqPFcQzVqGidL74nO85rO9clNvP4czAHmdEw=";
+  };
+
+  postPatch = ''
+    substituteInPlace pasimple/pa_simple.py --replace \
+      "_libpulse_simple = ctypes.CDLL('libpulse-simple.so.0')" \
+      "_libpulse_simple = ctypes.CDLL('${lib.getLib pulseaudio}/lib/libpulse-simple.so.0')"
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  pythonImportsCheck = [
+    "pasimple"
+    "pasimple.pa_simple"
+  ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A python wrapper for the \"PulseAudio simple API\". Supports playing and recording audio via PulseAudio and PipeWire";
+    homepage = "https://github.com/henrikschnor/pasimple";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/passlib/default.nix b/nixpkgs/pkgs/development/python-modules/passlib/default.nix
new file mode 100644
index 000000000000..cf264c504353
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/passlib/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, argon2-cffi
+, bcrypt
+, cryptography
+, pytestCheckHook
+, pythonOlder
+, pytest-xdist
+}:
+
+buildPythonPackage rec {
+  pname = "passlib";
+  version = "1.7.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3v1Q9ytlxUAqssVzgwppeOXyAq0NmEeTyN3ixBUuvgQ";
+  };
+
+  passthru.optional-dependencies = {
+    argon2 = [ argon2-cffi ];
+    bcrypt = [ bcrypt ];
+    totp = [ cryptography ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-xdist
+  ] ++ passthru.optional-dependencies.argon2
+  ++ passthru.optional-dependencies.bcrypt
+  ++ passthru.optional-dependencies.totp;
+
+  pythonImportsCheck = [
+    "passlib"
+  ];
+
+  disabledTests = [
+    # timming sensitive
+    "test_dummy_verify"
+    "test_encrypt_cost_timing"
+    # These tests fail because they don't expect support for algorithms provided through libxcrypt
+    "test_82_crypt_support"
+  ];
+
+  pytestFlagsArray = [
+    # hashing algorithms we don't support anymore
+    "--deselect=passlib/tests/test_handlers.py::des_crypt_os_crypt_test::test_82_crypt_support"
+    "--deselect=passlib/tests/test_handlers.py::md5_crypt_os_crypt_test::test_82_crypt_support"
+    "--deselect=passlib/tests/test_handlers.py::sha256_crypt_os_crypt_test::test_82_crypt_support"
+  ];
+
+  meta = with lib; {
+    description = "A password hashing library for Python";
+    homepage = "https://foss.heptapod.net/python-libs/passlib";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/paste/default.nix b/nixpkgs/pkgs/development/python-modules/paste/default.nix
new file mode 100644
index 000000000000..3a8ec63f3e9a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paste/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, setuptools
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "paste";
+  version = "3.7.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "cdent";
+    repo = "paste";
+    rev = "refs/tags/${version}";
+    hash = "sha256-xp8FU4MR79/leBSJvSk8J2GdWW32AW2I5i3Y6DsRPLw=";
+  };
+
+  postPatch = ''
+    patchShebangs tests/cgiapp_data/
+  '';
+
+  propagatedBuildInputs = [
+    setuptools
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    # needs to be modified after Sat, 1 Jan 2005 12:00:00 GMT
+    touch tests/urlparser_data/secured.txt
+  '';
+
+  pythonNamespaces = [
+    "paste"
+  ];
+
+  meta = with lib; {
+    description = "Tools for using a Web Server Gateway Interface stack";
+    homepage = "https://pythonpaste.readthedocs.io/";
+    changelog = "https://github.com/cdent/paste/blob/${version}/docs/news.txt";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pastedeploy/default.nix b/nixpkgs/pkgs/development/python-modules/pastedeploy/default.nix
new file mode 100644
index 000000000000..749d3574d701
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pastedeploy/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pastedeploy";
+  version = "3.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Pylons";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-8MNeOcYPEYAfghZN/K/1v/tAAdgz/fCvuVnBoru+81Q=";
+  };
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace " --cov" ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "paste.deploy"
+  ];
+
+  meta = with lib; {
+    description = "Load, configure, and compose WSGI applications and servers";
+    homepage = "https://github.com/Pylons/pastedeploy";
+    changelog = "https://github.com/Pylons/pastedeploy/blob/${version}/docs/news.rst";
+    license = licenses.mit;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pastel/default.nix b/nixpkgs/pkgs/development/python-modules/pastel/default.nix
new file mode 100644
index 000000000000..ed91aaf40077
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pastel/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, pytest }:
+
+buildPythonPackage rec {
+  pname = "pastel";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d";
+  };
+
+  nativeCheckInputs = [ pytest ];
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/sdispater/pastel";
+    description = "Bring colors to your terminal";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jakewaksbaum ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pastescript/default.nix b/nixpkgs/pkgs/development/python-modules/pastescript/default.nix
new file mode 100644
index 000000000000..27933066c7b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pastescript/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, python
+, pytestCheckHook
+, six
+, paste
+, pastedeploy
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pastescript";
+  version = "3.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "PasteScript";
+    inherit version;
+    hash = "sha256-3eyAGhOsZn4JTt3ij5AhLN6nvcmhjUNxsI9abvfS66I=";
+  };
+
+  propagatedBuildInputs = [
+    paste
+    pastedeploy
+    six
+  ];
+
+  # test suite seems to unset PYTHONPATH
+  doCheck = false;
+
+  nativeCheckInputs = [
+    nose
+    pytestCheckHook
+  ];
+
+  pythonNamespaces = [
+    "paste"
+  ];
+
+  disabledTestPaths = [
+    "appsetup/testfiles"
+  ];
+
+  pythonImportsCheck = [
+    "paste.script"
+    "paste.deploy"
+    "paste.util"
+  ];
+
+  meta = with lib; {
+    description = "A pluggable command-line frontend, including commands to setup package file layouts";
+    homepage = "https://github.com/cdent/pastescript/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/patator/default.nix b/nixpkgs/pkgs/development/python-modules/patator/default.nix
new file mode 100644
index 000000000000..62f75cf37cab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/patator/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, ajpy
+, buildPythonPackage
+, cx_oracle
+, dnspython
+, fetchPypi
+, impacket
+, ipy
+, mysqlclient
+, paramiko
+, psycopg2
+, pyasn1
+, pycrypto
+, pycurl
+, pyopenssl
+, pysnmp
+, pysqlcipher3
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "patator";
+  version = "1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VQ7JPyQOY9X/7LVAvTwftoOegt4KyfERgu38HfmsYDM=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace psycopg2-binary psycopg2
+  '';
+
+  propagatedBuildInputs = [
+    ajpy
+    cx_oracle
+    dnspython
+    impacket
+    ipy
+    mysqlclient
+    paramiko
+    psycopg2
+    pyasn1
+    pycrypto
+    pycurl
+    pyopenssl
+    pysnmp
+    pysqlcipher3
+  ];
+
+  # tests require docker-compose and vagrant
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Multi-purpose brute-forcer";
+    homepage = "https://github.com/lanjelot/patator";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ y0no ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/patch-ng/default.nix b/nixpkgs/pkgs/development/python-modules/patch-ng/default.nix
new file mode 100644
index 000000000000..126155722f4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/patch-ng/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  version = "1.17.4"; # note: `conan` package may require a hardcoded one
+  pname = "patch-ng";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1kja1nn08w0k8k6j4kad48k581hh9drvjjb8x60v9j13sxdvqyk2";
+  };
+
+  meta = with lib; {
+    description = "Library to parse and apply unified diffs.";
+    homepage = "https://github.com/conan-io/python-patch";
+    license = licenses.mit;
+    maintainers = with maintainers; [ HaoZeke ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/patch/default.nix b/nixpkgs/pkgs/development/python-modules/patch/default.nix
new file mode 100644
index 000000000000..ed11b3a4b52f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/patch/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchzip
+}:
+
+buildPythonPackage rec {
+  version = "1.16";
+  pname = "patch";
+
+  src = fetchzip {
+    url = "mirror://pypi/p/${pname}/${pname}-${version}.zip";
+    sha256 = "1nj55hvyvzax4lxq7vkyfbw91pianzr3hp7ka7j12pgjxccac50g";
+    stripRoot = false;
+  };
+
+  # No tests included in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A library to parse and apply unified diffs";
+    homepage = "https://github.com/techtonik/python-patch/";
+    license = licenses.mit;
+    maintainers = [ maintainers.igsha ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/path-and-address/default.nix b/nixpkgs/pkgs/development/python-modules/path-and-address/default.nix
new file mode 100644
index 000000000000..a01c798615cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/path-and-address/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+}:
+
+buildPythonPackage rec {
+  version = "2.0.1";
+  pname = "path-and-address";
+
+  src = fetchFromGitHub {
+    owner = "joeyespo";
+    repo = "path-and-address";
+    rev = "v${version}";
+    sha256 = "0b0afpsaim06mv3lhbpm8fmawcraggc11jhzr6h72kdj1cqjk5h6";
+  };
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    description = "Functions for server CLI applications used by humans";
+    homepage = "https://github.com/joeyespo/path-and-address";
+    license = licenses.mit;
+    maintainers = with maintainers; [ koral];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/path/default.nix b/nixpkgs/pkgs/development/python-modules/path/default.nix
new file mode 100644
index 000000000000..ee0329c4050d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/path/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, appdirs
+, buildPythonPackage
+, fetchPypi
+, packaging
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "path";
+  version = "16.7.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-K0d/WIcDPzy+oc/YVT7mpqSY6yVAoZ9KoIKCKq3Oowo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # creates a file, checks when it was last accessed/modified
+    # AssertionError: assert 1650036414.0 == 1650036414.960688
+    "test_utime"
+  ];
+
+  pythonImportsCheck = [
+    "path"
+  ];
+
+  meta = with lib; {
+    description = "Object-oriented file system path manipulation";
+    homepage = "https://github.com/jaraco/path";
+    changelog = "https://github.com/jaraco/path/blob/v${version}/NEWS.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pathable/default.nix b/nixpkgs/pkgs/development/python-modules/pathable/default.nix
new file mode 100644
index 000000000000..789162b1fe52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pathable/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "pathable";
+  version = "0.4.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "p1c2u";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-4QRFjbeaggoEPVGAmSY+qVMNW0DKqarNfRXaH6B58ew=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    sed -i "/--cov/d" pyproject.toml
+  '';
+
+  pythonImportsCheck = [
+    "pathable"
+  ];
+
+  meta = with lib; {
+    description = "Library for object-oriented paths";
+    homepage = "https://github.com/p1c2u/pathable";
+    changelog = "https://github.com/p1c2u/pathable/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pathlib/default.nix b/nixpkgs/pkgs/development/python-modules/pathlib/default.nix
new file mode 100644
index 000000000000..6bf24b8f15ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pathlib/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, unittestCheckHook
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "pathlib";
+  version = "1.0.1";
+  disabled = pythonAtLeast "3.4"; # Was added to std library in Python 3.4
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "17zajiw4mjbkkv6ahp3xf025qglkj0805m9s41c45zryzj6p2h39";
+  };
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  meta = {
+    description = "Object-oriented filesystem paths";
+    homepage = "https://pathlib.readthedocs.org/";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pathlib2/default.nix b/nixpkgs/pkgs/development/python-modules/pathlib2/default.nix
new file mode 100644
index 000000000000..b844a1528b5c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pathlib2/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, pythonOlder
+, scandir ? null
+, glibcLocales
+, mock
+, typing
+}:
+
+buildPythonPackage rec {
+  pname = "pathlib2";
+  version = "2.3.7.post1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-n+DtrYmLg8DD4ZnIQrJ+0hZkXS4Xd1ey3Wc4TUETxkE=";
+  };
+
+  propagatedBuildInputs = [ six ]
+    ++ lib.optionals (pythonOlder "3.5") [ scandir typing ];
+  nativeCheckInputs = [ glibcLocales ]
+    ++ lib.optional (pythonOlder "3.3") mock;
+
+  preCheck = ''
+    export LC_ALL="en_US.UTF-8"
+  '';
+
+  meta = with lib; {
+    description = "This module offers classes representing filesystem paths with semantics appropriate for different operating systems.";
+    homepage = "https://pypi.org/project/pathlib2/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pathos/default.nix b/nixpkgs/pkgs/development/python-modules/pathos/default.nix
new file mode 100644
index 000000000000..cf9d9eaa48ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pathos/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, dill
+, fetchFromGitHub
+, multiprocess
+, pox
+, ppft
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pathos";
+  version = "0.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "uqfoundation";
+    repo = pname;
+    rev = "refs/tags/pathos-${version}";
+    hash = "sha256-uQv1t3TRbvoQv86wNOdc5k0cgKt9kvnw5/DGbbbE46w=";
+  };
+
+  propagatedBuildInputs = [
+    dill
+    pox
+    ppft
+    multiprocess
+  ];
+
+  # Require network
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pathos"
+  ];
+
+  meta = with lib; {
+    description = "Parallel graph management and execution in heterogeneous computing";
+    homepage = "https://pathos.readthedocs.io/";
+    changelog = "https://github.com/uqfoundation/pathos/releases/tag/pathos-${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pathspec/default.nix b/nixpkgs/pkgs/development/python-modules/pathspec/default.nix
new file mode 100644
index 000000000000..5b97cea17b79
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pathspec/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, flit-core
+, unittestCheckHook
+
+# for passthru.tests
+, awsebcli
+, black
+, hatchling
+, yamllint
+}:
+
+buildPythonPackage rec {
+  pname = "pathspec";
+  version = "0.11.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-4NjQrC8S2mGVbrIwa2n5RptC9N6w88tu1HuczpmWztM=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  pythonImportsCheck = [
+    "pathspec"
+  ];
+
+  checkInputs = [
+    unittestCheckHook
+  ];
+
+  passthru.tests = {
+    inherit awsebcli black hatchling yamllint;
+  };
+
+  meta = {
+    description = "Utility library for gitignore-style pattern matching of file paths";
+    homepage = "https://github.com/cpburnz/python-path-specification";
+    changelog = "https://github.com/cpburnz/python-pathspec/blob/v${version}/CHANGES.rst";
+    license = lib.licenses.mpl20;
+    maintainers = with lib.maintainers; [ copumpkin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pathtools/default.nix b/nixpkgs/pkgs/development/python-modules/pathtools/default.nix
new file mode 100644
index 000000000000..86c2aeb88dc0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pathtools/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pathtools";
+  version = "0.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1h7iam33vwxk8bvslfj4qlsdprdnwf8bvzhqh3jq5frr391cadbw";
+  };
+
+  meta = with lib; {
+    description = "Pattern matching and various utilities for file systems paths";
+    homepage = "https://github.com/gorakhargosh/pathtools";
+    license = licenses.mit;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pathvalidate/default.nix b/nixpkgs/pkgs/development/python-modules/pathvalidate/default.nix
new file mode 100644
index 000000000000..31ec1f003144
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pathvalidate/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pathvalidate";
+  version = "3.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QmlwIm4kGZ/ZDZOZXSI8Hii9qWfN9DcHVaFM33KiqO4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  # Requires `pytest-md-report`, causing infinite recursion.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pathvalidate"
+  ];
+
+  meta = with lib; {
+    description = "Library to sanitize/validate a string such as filenames/file-paths/etc";
+    homepage = "https://github.com/thombashi/pathvalidate";
+    changelog = "https://github.com/thombashi/pathvalidate/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ oxalica ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pathy/default.nix b/nixpkgs/pkgs/development/python-modules/pathy/default.nix
new file mode 100644
index 000000000000..c5fc0852b868
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pathy/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, google-cloud-storage
+, mock
+, pytestCheckHook
+, pythonOlder
+, smart-open
+, typer
+}:
+
+buildPythonPackage rec {
+  pname = "pathy";
+  version = "0.10.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-tFGF0G+bGMbTNG06q4gauWh0VT9mHuiMzS5gJG4QPCI=";
+  };
+
+  propagatedBuildInputs = [
+    google-cloud-storage
+    smart-open
+    typer
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Exclude tests that require provider credentials
+    "pathy/_tests/test_clients.py"
+    "pathy/_tests/test_gcs.py"
+    "pathy/_tests/test_s3.py"
+  ];
+
+  pythonImportsCheck = [
+    "pathy"
+  ];
+
+  meta = with lib; {
+    description = "A Path interface for local and cloud bucket storage";
+    homepage = "https://github.com/justindujardin/pathy";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ melling ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/patiencediff/default.nix b/nixpkgs/pkgs/development/python-modules/patiencediff/default.nix
new file mode 100644
index 000000000000..00d551885677
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/patiencediff/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "patiencediff";
+  version = "0.2.14";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "breezy-team";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-KTOESjaj8fMxJZ7URqg6UMpiQppqZAlk4IPWEw4/Nvw=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "patiencediff"
+  ];
+
+  meta = with lib; {
+    description = "C implementation of patiencediff algorithm for Python";
+    homepage = "https://github.com/breezy-team/patiencediff";
+    changelog = "https://github.com/breezy-team/patiencediff/releases/tag/v${version}";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ wildsebastian ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/patool/default.nix b/nixpkgs/pkgs/development/python-modules/patool/default.nix
new file mode 100644
index 000000000000..9d31fa9e93ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/patool/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+, p7zip
+, cabextract
+, zip
+, lzip
+, zpaq
+, gnutar
+, unar  # Free alternative to unrar
+, gnugrep
+, diffutils
+, file
+, gzip
+, bzip2
+, xz
+}:
+
+let
+  compression-utilities = [
+    p7zip
+    gnutar
+    unar
+    cabextract
+    zip
+    lzip
+    zpaq
+    gzip
+    gnugrep
+    diffutils
+    bzip2
+    file
+    xz
+  ];
+in
+buildPythonPackage rec {
+  pname = "patool";
+  version = "2.0.0";
+  format = "setuptools";
+
+  #pypi doesn't have test data
+  src = fetchFromGitHub {
+    owner = "wummel";
+    repo = pname;
+    rev = "upstream/${version}";
+    hash = "sha256-Hjpifsi5Q1eoe/MFWuQBDyjoXi/aUG4VN84yNMkAZaE=";
+  };
+
+  postPatch = ''
+    substituteInPlace patoolib/util.py \
+      --replace "path = None" 'path = os.environ["PATH"] + ":${lib.makeBinPath compression-utilities}"'
+  '';
+
+  nativeCheckInputs = [ pytestCheckHook ] ++ compression-utilities;
+
+  disabledTests = [
+    "test_unzip"
+    "test_unzip_file"
+    "test_zip"
+    "test_zip_file"
+  ];
+
+  meta = with lib; {
+    description = "portable archive file manager";
+    homepage = "https://wummel.github.io/patool/";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ marius851000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/patrowl4py/default.nix b/nixpkgs/pkgs/development/python-modules/patrowl4py/default.nix
new file mode 100644
index 000000000000..22f2f1ab145d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/patrowl4py/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, attrs
+, buildPythonPackage
+, certifi
+, chardet
+, fetchFromGitHub
+, idna
+, iniconfig
+, more-itertools
+, packaging
+, pluggy
+, py
+, pyparsing
+, python-slugify
+, requests
+, six
+, text-unidecode
+, toml
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "patrowl4py";
+  version = "1.1.9";
+
+  src = fetchFromGitHub {
+    owner = "Patrowl";
+    repo = "Patrowl4py";
+    rev = version;
+    hash = "sha256-ZGvntLbXIWmL0WoT+kQoNT6gDPgsSKwHQQjYlarvnKo=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    certifi
+    chardet
+    idna
+    iniconfig
+    more-itertools
+    packaging
+    pluggy
+    py
+    pyparsing
+    python-slugify
+    requests
+    six
+    text-unidecode
+    toml
+    urllib3
+  ];
+
+  # Tests require network access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "patrowl4py"
+  ];
+
+  meta = with lib; {
+    description = "Python API Client for PatrOwl";
+    homepage = "https://github.com/Patrowl/Patrowl4py";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/patsy/default.nix b/nixpkgs/pkgs/development/python-modules/patsy/default.nix
new file mode 100644
index 000000000000..f9020c0c1678
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/patsy/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, six
+, numpy
+, scipy # optional, allows spline-related features (see patsy's docs)
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "patsy";
+  version = "0.5.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vcGAAYdeMZvJHIEsHrahC+S7E8uB63Y/RmF53KO2cnc=";
+  };
+
+  propagatedBuildInputs = [
+    six
+    numpy
+    scipy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "patsy"
+  ];
+
+  meta = {
+    description = "A Python package for describing statistical models";
+    homepage = "https://github.com/pydata/patsy";
+    license = lib.licenses.bsd2;
+    maintainers = with lib.maintainers; [ ilya-kolpakov ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/paver/default.nix b/nixpkgs/pkgs/development/python-modules/paver/default.nix
new file mode 100644
index 000000000000..d46d6eaa2934
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paver/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, cogapp
+, fetchPypi
+, mock
+, nose
+, pytestCheckHook
+, pythonOlder
+, six
+, virtualenv
+}:
+
+buildPythonPackage rec {
+  pname = "paver";
+  version = "1.3.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Paver";
+    inherit version;
+    hash = "sha256-0+ZJiIFIWrdQ7+QMUniYKpNDvGJ+E3sRrc7WJ3GTCMc=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkInputs = [
+    cogapp
+    mock
+    nose
+    pytestCheckHook
+    virtualenv
+  ];
+
+  pythonImportsCheck = [
+    "paver"
+  ];
+
+  disabledTestPaths = [
+    # Test depends on distutils
+    "paver/tests/test_setuputils.py"
+  ];
+
+  meta = with lib; {
+    description = "A Python-based build/distribution/deployment scripting tool";
+    homepage = "https://github.com/paver/paver";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ lovek323 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/paypal-checkout-serversdk/default.nix b/nixpkgs/pkgs/development/python-modules/paypal-checkout-serversdk/default.nix
new file mode 100644
index 000000000000..711056008c9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paypal-checkout-serversdk/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# propagates
+, paypalhttp
+
+# tersts
+, pytestCheckHook
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "paypal-checkout-serversdk";
+  version = "1.0.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "paypal";
+    repo = "Checkout-Python-SDK";
+    rev = "refs/tags/${version}";
+    hash = "sha256-04ojNJeqVMdhnGpeCD+wzgKGLI22tVvrMW3gF/SH7KU=";
+  };
+
+  postPatch = ''
+    # outdated python2 samples
+    rm -rf sample
+  '';
+
+  propagatedBuildInputs = [
+    paypalhttp
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  disabledTests = [
+    # network tests
+    "testOrdersPatchTest"
+    "testOrdersCreateTest"
+    "testOrderGetRequestTest"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/paypal/Checkout-Python-SDK/releases/tag/${version}";
+    description = "Python SDK for Checkout RESTful APIs";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/paypalhttp/default.nix b/nixpkgs/pkgs/development/python-modules/paypalhttp/default.nix
new file mode 100644
index 000000000000..25c6aa1ba878
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/paypalhttp/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# propagates
+, pyopenssl
+, requests
+, six
+
+# tests
+, pytestCheckHook
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "paypalhttp";
+  version = "1.0.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "paypal";
+    repo = "paypalhttp_python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-3ihcpYtpcejPkiyf4g4jveyNU6flQB2sv9EZ5Pd7tUc=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    six
+    pyopenssl
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/paypal/paypalhttp_python/releases/tag/${version}";
+    description = "PayPalHttp is a generic HTTP Client";
+    homepage = "https://github.com/paypal/paypalhttp_python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pbkdf2/default.nix b/nixpkgs/pkgs/development/python-modules/pbkdf2/default.nix
new file mode 100644
index 000000000000..8f489ca24b9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pbkdf2/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "pbkdf2";
+  version = "1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0yb99rl2mbsaamj571s1mf6vgniqh23v98k4632150hjkwv9fqxc";
+  };
+
+  # ImportError: No module named test
+  doCheck = false;
+
+  meta = with lib; {
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pbr/default.nix b/nixpkgs/pkgs/development/python-modules/pbr/default.nix
new file mode 100644
index 000000000000..13b61c89232e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pbr/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, callPackage
+}:
+
+buildPythonPackage rec {
+  pname = "pbr";
+  version = "5.11.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rvxRZ1sLUz1Wu1/RyMbAUi/jGJZnmILhxMY9XkoPzLM=";
+  };
+
+  # importlib-metadata could be added here if it wouldn't cause an infinite recursion
+  propagatedBuildInputs = [ setuptools ];
+
+  # check in passthru.tests.pytest to escape infinite recursion with fixtures
+  doCheck = false;
+
+  passthru.tests = {
+    tests = callPackage ./tests.nix { };
+  };
+
+  pythonImportsCheck = [ "pbr" ];
+
+  meta = with lib; {
+    description = "Python Build Reasonableness";
+    homepage = "https://github.com/openstack/pbr";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pbr/tests.nix b/nixpkgs/pkgs/development/python-modules/pbr/tests.nix
new file mode 100644
index 000000000000..05266a0eb7df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pbr/tests.nix
@@ -0,0 +1,50 @@
+{ buildPythonPackage
+, build
+, git
+, gnupg
+, pbr
+, sphinx
+, stestr
+, testresources
+, testscenarios
+, virtualenv
+}:
+
+buildPythonPackage {
+  pname = "pbr";
+  inherit (pbr) version src;
+  format = "other";
+
+  postPatch = ''
+    # only a small portion of the listed packages are actually needed for running the tests
+    # so instead of removing them one by one remove everything
+    rm test-requirements.txt
+  '';
+
+  dontBuild = true;
+  dontInstall = true;
+  preConfigure = ''
+    pythonOutputDistPhase() { touch $dist; }
+  '';
+
+  nativeCheckInputs = [
+    pbr
+    build
+    git
+    gnupg
+    sphinx
+    stestr
+    testresources
+    testscenarios
+    virtualenv
+  ];
+
+  checkPhase = ''
+    stestr run -e <(echo "
+    pbr.tests.test_core.TestCore.test_console_script_develop
+    pbr.tests.test_core.TestCore.test_console_script_install
+    pbr.tests.test_wsgi.TestWsgiScripts.test_with_argument
+    pbr.tests.test_wsgi.TestWsgiScripts.test_wsgi_script_run
+    ")
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pc-ble-driver-py/default.nix b/nixpkgs/pkgs/development/python-modules/pc-ble-driver-py/default.nix
new file mode 100644
index 000000000000..61072507e294
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pc-ble-driver-py/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, boost
+, buildPythonPackage
+, cmake
+, cryptography
+, fetchFromGitHub
+, git
+, pc-ble-driver
+, pythonAtLeast
+, pythonOlder
+, scikit-build
+, setuptools
+, swig
+, wrapt
+}:
+
+buildPythonPackage rec {
+  pname = "pc-ble-driver-py";
+  version = "0.17.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "NordicSemiconductor";
+    repo = "pc-ble-driver-py";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-brC33ar2Jq3R2xdrklvVsQKf6pcnKwD25PO4TIvXgTg=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    swig
+    git
+    setuptools
+    scikit-build
+  ];
+
+  buildInputs = [
+    boost
+    pc-ble-driver
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    wrapt
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  # doCheck tries to write to the global python directory to install things
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pc_ble_driver_py"
+  ];
+
+  meta = with lib; {
+    description = "Bluetooth Low Energy nRF5 SoftDevice serialization";
+    homepage = "https://github.com/NordicSemiconductor/pc-ble-driver-py";
+    changelog = "https://github.com/NordicSemiconductor/pc-ble-driver-py/releases/tag/v${version}";
+    license = licenses.unfreeRedistributable;
+    maintainers = with maintainers; [ gebner ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pcapy-ng/default.nix b/nixpkgs/pkgs/development/python-modules/pcapy-ng/default.nix
new file mode 100644
index 000000000000..da490bd304eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pcapy-ng/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchFromGitHub
+, libpcap
+, pkgconfig
+, pytestCheckHook
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pcapy-ng";
+  version = "1.0.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "stamparm";
+    repo = pname;
+    rev = version;
+    hash = "sha256-6LA2n7Kv0MiZcqUJpi0lDN4Q+GcOttYw7hJwVqK/DU0=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    pkgconfig
+  ];
+
+  buildInputs = [
+    libpcap
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    cd tests
+  '';
+
+  pythonImportsCheck = [
+    "pcapy"
+  ];
+
+  doCheck = pythonOlder "3.10";
+
+  pytestFlagsArray = [
+    "pcapytests.py"
+  ];
+
+  meta = with lib; {
+    description = "Module to interface with the libpcap packet capture library";
+    homepage = "https://github.com/stamparm/pcapy-ng/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pcbnew-transition/default.nix b/nixpkgs/pkgs/development/python-modules/pcbnew-transition/default.nix
new file mode 100644
index 000000000000..2ac478308cda
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pcbnew-transition/default.nix
@@ -0,0 +1,39 @@
+{ pythonOlder
+, buildPythonPackage
+, fetchPypi
+, lib
+, kicad
+, versioneer
+}:
+buildPythonPackage rec {
+  pname = "pcbnewTransition";
+  version = "0.3.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3CJUG1kd63Lg0r9HpJRIvttHS5s2EuZRoxeXrqsJ/kQ=";
+  };
+
+  propagatedBuildInputs = [
+    kicad
+  ];
+
+  nativeBuildInputs = [
+    versioneer
+  ];
+
+  pythonImportsCheck = [
+    "pcbnewTransition"
+  ];
+
+  meta = with lib; {
+    description = "Library that allows you to support both, KiCad 5, 6 and 7 in your plugins";
+    homepage = "https://github.com/yaqwsx/pcbnewTransition";
+    changelog = "https://github.com/yaqwsx/pcbnewTransition/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jfly matusf ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pcodedmp/default.nix b/nixpkgs/pkgs/development/python-modules/pcodedmp/default.nix
new file mode 100644
index 000000000000..c87cebe0f23b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pcodedmp/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pcodedmp";
+  version = "1.2.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bontchev";
+    repo = pname;
+    rev = version;
+    hash = "sha256-SYOFGMvrzxDPMACaCvqwU28Mh9LEuvFBGvAph4X+geo=";
+  };
+
+  postPatch = ''
+    # Circular dependency
+    substituteInPlace setup.py \
+      --replace "'oletools>=0.54'," ""
+  '';
+
+  # Module doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pcodedmp"
+  ];
+
+  meta = with lib; {
+    description = "Python VBA p-code disassembler";
+    homepage = "https://github.com/bontchev/pcodedmp";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pcpp/default.nix b/nixpkgs/pkgs/development/python-modules/pcpp/default.nix
new file mode 100644
index 000000000000..0985d32afb55
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pcpp/default.nix
@@ -0,0 +1,24 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "pcpp";
+  version = "1.30";
+
+  src = fetchFromGitHub {
+    owner = "ned14";
+    repo = "pcpp";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-Fs+CMV4eRKcB+KdV93ncgcqaMnO5etnMY/ivmSJh3Wc=";
+    fetchSubmodules = true;
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/ned14/pcpp";
+    description = "A C99 preprocessor written in pure Python";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ rakesh4g ];
+ };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pdb2pqr/default.nix b/nixpkgs/pkgs/development/python-modules/pdb2pqr/default.nix
new file mode 100644
index 000000000000..e7d6e462c622
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdb2pqr/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pythonRelaxDepsHook
+, mmcif-pdbx
+, numpy
+, propka
+, requests
+, docutils
+, pytestCheckHook
+, pandas
+, testfixtures
+}:
+
+buildPythonPackage rec {
+  pname = "pdb2pqr";
+  version = "3.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wFak5tKOsPYRflBW8viWEjM6Cku5JkWB6mWVyINYh1g=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    "docutils"
+  ];
+
+  propagatedBuildInputs = [
+    mmcif-pdbx
+    numpy
+    propka
+    requests
+    docutils
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pandas
+    testfixtures
+  ];
+
+  disabledTests = [
+    # these tests have network access
+    "test_short_pdb"
+    "test_basic_cif"
+    "test_long_pdb"
+    "test_ligand_biomolecule"
+    "test_log_output_in_pqr_location"
+    "test_propka_apo"
+    "test_propka_pka"
+    "test_basic"
+  ];
+
+  pythonImportsCheck = [
+    "pdb2pqr"
+  ];
+
+  meta = with lib; {
+    description = "Software for determining titration states, adding missing atoms, and assigning charges/radii to biomolecules";
+    homepage = "https://www.poissonboltzmann.org/";
+    changelog = "https://github.com/Electrostatics/pdb2pqr/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pdbfixer/default.nix b/nixpkgs/pkgs/development/python-modules/pdbfixer/default.nix
new file mode 100644
index 000000000000..9b0f0bfe86aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdbfixer/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, wheel
+, numpy
+, openmm
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pdbfixer";
+  version = "1.9";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "openmm";
+    repo = "pdbfixer";
+    rev = version;
+    hash = "sha256-ZXQWdNQyoVgjpZj/Wimcfwcbxk3CIvg3n5S1glNYUP4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    openmm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export PATH=$out/bin:$PATH
+  '';
+
+  disabledTests = [
+    # require network access
+    "test_build_and_simulate"
+    "test_mutate_1"
+    "test_mutate_2"
+    "test_mutate_3_fails"
+    "test_mutate_4_fails"
+    "test_mutate_5_fails"
+    "test_mutate_multiple_copies_of_chain_A"
+    "test_pdbid"
+    "test_url"
+  ];
+
+  pythonImportsCheck = [ "pdbfixer" ];
+
+  meta = with lib; {
+    description = "PDBFixer fixes problems in PDB files";
+    homepage = "https://github.com/openmm/pdbfixer";
+    changelog = "https://github.com/openmm/pdbfixer/releases/tag/${src.rev}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+    mainProgram = "pdbfixer";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pdf2docx/default.nix b/nixpkgs/pkgs/development/python-modules/pdf2docx/default.nix
new file mode 100644
index 000000000000..e337bf292fcf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdf2docx/default.nix
@@ -0,0 +1,76 @@
+{ stdenv
+, lib
+, fetchFromGitHub
+, python
+, buildPythonPackage
+, pythonRelaxDepsHook
+, imagemagick
+, pip
+, pytestCheckHook
+, pymupdf
+, fire
+, fonttools
+, numpy
+, opencv4
+, tkinter
+, python-docx
+}:
+let
+  version = "0.5.6";
+in
+buildPythonPackage {
+  pname = "pdf2docx";
+  inherit version;
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "dothinking";
+    repo = "pdf2docx";
+    rev = "v${version}";
+    hash = "sha256-NrT4GURQIJbqnHstfJrPzwLXT9c2oGBi4QJ6eGIFwu4=";
+  };
+
+  nativeBuildInputs = [
+    pip
+    pythonRelaxDepsHook
+    imagemagick
+  ];
+
+  pythonRemoveDeps = [ "opencv-python" ];
+
+  preBuild = "echo '${version}' > version.txt";
+
+  propagatedBuildInputs = [
+    tkinter
+    pymupdf
+    fire
+    fonttools
+    numpy
+    opencv4
+    python-docx
+  ];
+
+  postInstall = lib.optionalString stdenv.isLinux ''
+    # on linux the icon file can only be xbm format
+    convert $out/${python.sitePackages}/pdf2docx/gui/icon.ico \
+      $out/${python.sitePackages}/pdf2docx/gui/icon.xbm
+    substituteInPlace $out/${python.sitePackages}/pdf2docx/gui/App.py \
+      --replace 'icon.ico' 'icon.xbm' \
+      --replace 'iconbitmap(icon_path)' "iconbitmap(f'@{icon_path}')"
+  '';
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pytestFlagsArray = [ "-v" "./test/test.py::TestConversion" ];
+
+  # Test fails due to "RuntimeError: cannot find builtin font with name 'Arial'":
+  disabledTests = [ "test_unnamed_fonts" ];
+
+  meta = with lib; {
+    description = "Convert PDF to DOCX";
+    homepage = "https://github.com/dothinking/pdf2docx";
+    changelog = "https://github.com/dothinking/pdf2docx/releases/tag/v${version}";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pdf2image/default.nix b/nixpkgs/pkgs/development/python-modules/pdf2image/default.nix
new file mode 100644
index 000000000000..19353e781a67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdf2image/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pillow
+, poppler_utils
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pdf2image";
+  version = "1.16.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-dCCIEMLO9NnjR3abjmKlIwOYLdtPLf10THq0uUCuKH4=";
+  };
+
+  postPatch = ''
+    # Only replace first match in file
+    sed -i '0,/poppler_path=None/s||poppler_path="${poppler_utils}/bin"|' pdf2image/pdf2image.py
+  '';
+
+  propagatedBuildInputs = [
+    pillow
+  ];
+
+  pythonImportsCheck = [
+    "pdf2image"
+  ];
+
+  meta = with lib; {
+    description = "Module that wraps the pdftoppm utility to convert PDF to PIL Image object";
+    homepage = "https://github.com/Belval/pdf2image";
+    changelog = "https://github.com/Belval/pdf2image/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gerschtli ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pdfkit/default.nix b/nixpkgs/pkgs/development/python-modules/pdfkit/default.nix
new file mode 100644
index 000000000000..73d09c755ac5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdfkit/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pdfkit";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "992f821e1e18fc8a0e701ecae24b51a2d598296a180caee0a24c0af181da02a9";
+  };
+
+  # tests are not distributed
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/pdfkit";
+    description = "Wkhtmltopdf python wrapper to convert html to pdf using the webkit rendering engine and qt";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pdfminer-six/default.nix b/nixpkgs/pkgs/development/python-modules/pdfminer-six/default.nix
new file mode 100644
index 000000000000..cd378941b151
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdfminer-six/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, cryptography
+, charset-normalizer
+, pythonOlder
+, typing-extensions
+, pytestCheckHook
+, ocrmypdf
+}:
+
+buildPythonPackage rec {
+  pname = "pdfminer-six";
+  version = "20221105";
+  format = "setuptools";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "pdfminer";
+    repo = "pdfminer.six";
+    rev = version;
+    hash = "sha256-OyEeQBuYfj4iEcRt2/daSaUfTOjCVSCyHW2qffal+Bk=";
+  };
+
+  propagatedBuildInputs = [
+    charset-normalizer
+    cryptography
+  ] ++ lib.optionals (pythonOlder "3.8") [ typing-extensions ];
+
+  postInstall = ''
+    for file in $out/bin/*.py; do
+      ln $file ''${file//.py/}
+    done
+  '';
+
+  postPatch = ''
+    # Version is not stored in repo, gets added by a GitHub action after tag is created
+    # https://github.com/pdfminer/pdfminer.six/pull/727
+    substituteInPlace pdfminer/__init__.py --replace "__VERSION__" ${version}
+  '';
+
+  pythonImportsCheck = [
+    "pdfminer"
+    "pdfminer.high_level"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  passthru = {
+    tests = {
+      inherit ocrmypdf;
+    };
+  };
+
+  meta = with lib; {
+    description = "PDF parser and analyzer";
+    homepage = "https://github.com/pdfminer/pdfminer.six";
+    license = licenses.mit;
+    maintainers = with maintainers; [ psyanticy marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pdfplumber/default.nix b/nixpkgs/pkgs/development/python-modules/pdfplumber/default.nix
new file mode 100644
index 000000000000..2138d7181978
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdfplumber/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, jupyterlab
+, nbexec
+, pandas
+, pandas-stubs
+, pdfminer-six
+, pillow
+, pytest-parallel
+, pytestCheckHook
+, pythonOlder
+, types-pillow
+, wand
+}:
+
+buildPythonPackage rec {
+  pname = "pdfplumber";
+  version = "0.10.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jsvine";
+    repo = "pdfplumber";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-fd/4I6jjc0Wz2+XHGXAGg0Am3Dmw9R2ZX7nymIj/UnA=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=pdfplumber --cov-report xml:coverage.xml --cov-report term" ""
+  '';
+
+  propagatedBuildInputs = [
+    pdfminer-six
+    pillow
+    wand
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  nativeCheckInputs = [
+    jupyterlab
+    nbexec
+    pandas
+    pandas-stubs
+    pytest-parallel
+    pytestCheckHook
+    types-pillow
+  ];
+
+  pythonImportsCheck = [
+    "pdfplumber"
+  ];
+
+  disabledTests = [
+    # flaky
+    "test__repr_png_"
+  ];
+
+  disabledTestPaths = [
+    # Tests requires pypdfium2
+    "tests/test_display.py"
+    # Tests require Ghostscript
+    "tests/test_repair.py"
+  ];
+
+  meta = with lib; {
+    description = "Plumb a PDF for detailed information about each char, rectangle, line, et cetera — and easily extract text and tables";
+    homepage = "https://github.com/jsvine/pdfplumber";
+    changelog = "https://github.com/jsvine/pdfplumber/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pdfrw/default.nix b/nixpkgs/pkgs/development/python-modules/pdfrw/default.nix
new file mode 100644
index 000000000000..5cc619ef6a47
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdfrw/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "pdfrw";
+  version = "0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1x1yp63lg3jxpg9igw8lh5rc51q353ifsa1bailb4qb51r54kh0d";
+  };
+
+  # tests require the extra download of github.com/pmaupin/static_pdfs
+  doCheck = false;
+
+  meta = with lib; {
+    description = "pdfrw is a pure Python library that reads and writes PDFs.";
+    homepage = "https://github.com/pmaupin/pdfrw";
+    maintainers = with maintainers; [ teto ];
+    license =  licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pdftotext/default.nix b/nixpkgs/pkgs/development/python-modules/pdftotext/default.nix
new file mode 100644
index 000000000000..efb26fa4955d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdftotext/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, poppler }:
+
+buildPythonPackage rec {
+  pname = "pdftotext";
+  version = "2.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2a9aa89bc62022408781b39d188fabf5a3ad1103b6630f32c4e27e395f7966ee";
+  };
+
+  buildInputs = [ poppler ];
+
+  meta = with lib; {
+    description = "Simple PDF text extraction";
+    homepage = "https://github.com/jalan/pdftotext";
+    license = licenses.mit;
+    maintainers = with maintainers; [ erikarvstedt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pdfx/default.nix b/nixpkgs/pkgs/development/python-modules/pdfx/default.nix
new file mode 100644
index 000000000000..1ee1cb4804df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdfx/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pdfminer-six, chardet, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "pdfx";
+  version = "1.4.1";
+
+  src = fetchFromGitHub {
+    owner = "metachris";
+    repo = "pdfx";
+    rev = "v${version}";
+    hash = "sha256-POpP6XwcqwvImrtIiDjpnHoNE0MKapuPjxojo+ocBK0=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "chardet==4.0.0" "chardet" \
+      --replace "pdfminer.six==20201018" "pdfminer.six"
+  '';
+
+  propagatedBuildInputs = [ pdfminer-six chardet ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    inherit (src.meta) homepage;
+    description = "Extract references (pdf, url, doi, arxiv) and metadata from a PDF";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pdm-backend/default.nix b/nixpkgs/pkgs/development/python-modules/pdm-backend/default.nix
new file mode 100644
index 000000000000..0572a1e633b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdm-backend/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+
+# propagates
+, importlib-metadata
+
+# tests
+, editables
+, git
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pdm-backend";
+  version = "2.1.6";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pdm-project";
+    repo = "pdm-backend";
+    rev = "refs/tags/${version}";
+    hash = "sha256-ZEci8VeKYuORs9iAzaEqrtVBh9fMWHlLsFH1e5PRLwA=";
+  };
+
+  env.PDM_BUILD_SCM_VERSION = version;
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.10") [
+    importlib-metadata
+  ];
+
+  pythonImportsCheck = [
+    "pdm.backend"
+  ];
+
+  nativeCheckInputs = [
+    editables
+    git
+    pytestCheckHook
+    setuptools
+  ];
+
+  preCheck = ''
+    unset PDM_BUILD_SCM_VERSION
+  '';
+
+  setupHook = ./setup-hook.sh;
+
+  meta = with lib; {
+    homepage = "https://github.com/pdm-project/pdm-backend";
+    changelog = "https://github.com/pdm-project/pdm-backend/releases/tag/${version}";
+    description = "Yet another PEP 517 backend.";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pdm-backend/setup-hook.sh b/nixpkgs/pkgs/development/python-modules/pdm-backend/setup-hook.sh
new file mode 100644
index 000000000000..aca0c555c76c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdm-backend/setup-hook.sh
@@ -0,0 +1,8 @@
+version-pretend-hook() {
+  echo "Setting PDM_BUILD_SCM_VERSION to $version"
+  export PDM_BUILD_SCM_VERSION=$version
+}
+
+if [ -z "${dontSetPdmBackendVersion-}" ]; then
+  preBuildHooks+=(version-pretend-hook)
+fi
diff --git a/nixpkgs/pkgs/development/python-modules/pdm-pep517/default.nix b/nixpkgs/pkgs/development/python-modules/pdm-pep517/default.nix
new file mode 100644
index 000000000000..be5573a0055c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdm-pep517/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, git
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pdm-pep517";
+  version = "1.1.4";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-f0kSHnC0Lcopb6yWIhDdLaB6OVdfxWcxN61mFjOyzz8=";
+  };
+
+  preCheck = ''
+    HOME=$TMPDIR
+
+    git config --global user.name nobody
+    git config --global user.email nobody@example.com
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    git
+    setuptools
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pdm-project/pdm-pep517";
+    description = "Yet another PEP 517 backend.";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pdoc/default.nix b/nixpkgs/pkgs/development/python-modules/pdoc/default.nix
new file mode 100644
index 000000000000..621c2842e70c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdoc/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, jinja2
+, pygments
+, markupsafe
+, astunparse
+, pytestCheckHook
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "pdoc";
+  version = "14.1.0";
+  disabled = pythonOlder "3.8";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "mitmproxy";
+    repo = "pdoc";
+    rev = "v${version}";
+    hash = "sha256-LQXhdzocw01URrmpDayK9rpsArvM/E44AE8Eok9DBwk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    jinja2
+    pygments
+    markupsafe
+  ] ++ lib.optional (pythonOlder "3.9") astunparse;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    hypothesis
+  ];
+  disabledTestPaths = [
+    # "test_snapshots" tries to match generated output against stored snapshots,
+    # which are highly sensitive to dep versions.
+    "test/test_snapshot.py"
+  ];
+
+  pytestFlagsArray = [
+    ''-m "not slow"'' # skip slow tests
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [ "pdoc" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/mitmproxy/pdoc/blob/${src.rev}/CHANGELOG.md";
+    homepage = "https://pdoc.dev/";
+    description = "API Documentation for Python Projects";
+    license = licenses.unlicense;
+    maintainers = with maintainers; [ pbsds ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pdoc3/default.nix b/nixpkgs/pkgs/development/python-modules/pdoc3/default.nix
new file mode 100644
index 000000000000..1c3e5ef08af6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdoc3/default.nix
@@ -0,0 +1,55 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pythonOlder
+, mako
+, markdown
+, setuptools-git
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pdoc3";
+  version = "0.10.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XyLnvLlpAGc44apCGcdaMvNMLWLUbcnS+y0+CwKH5Lc=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # test_Class_params fails in 0.10.0
+      # https://github.com/pdoc3/pdoc/issues/355
+      url = "https://github.com/pdoc3/pdoc/commit/4aa70de2221a34a3003a7e5f52a9b91965f0e359.patch";
+      hash = "sha256-W7Dy516cA+Oj0ZCTQBB6MJ+fCTBeLRp+aW8nANdxSx8=";
+    })
+    # https://github.com/pdoc3/pdoc/issues/400
+    (fetchpatch {
+      name = "fix-test-for-python310.patch";
+      url = "https://github.com/pdoc3/pdoc/commit/80af5d40d3ca39e2701c44941c1003ae6a280799.patch";
+      hash = "sha256-69Cn+BY7feisSHugONIF/PRgEDEfnvnS/RBHWv1P8/w=";
+      excludes = [".github/workflows/ci.yml"];
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools-git
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    mako
+    markdown
+  ];
+
+  meta = with lib; {
+    description = "Auto-generate API documentation for Python projects.";
+    homepage = "https://pdoc3.github.io/pdoc/";
+    license = with licenses; [ agpl3Plus ];
+    maintainers = with maintainers; [ catern ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pdunehd/default.nix b/nixpkgs/pkgs/development/python-modules/pdunehd/default.nix
new file mode 100644
index 000000000000..e3ae53ecb85e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pdunehd/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pdunehd";
+  version = "1.3.3";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "valentinalexeev";
+    repo = "pdunehd";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-8CL7ZQ+tV0CKdqWWiPDbo6Q5d1iIj/vNbYshdjUpYSw=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "pdunehd" ];
+
+  meta = with lib; {
+    description = "Python wrapper for Dune HD media player API";
+    homepage = "https://github.com/valentinalexeev/pdunehd";
+    changelog = "https://github.com/valentinalexeev/pdunehd/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/peaqevcore/default.nix b/nixpkgs/pkgs/development/python-modules/peaqevcore/default.nix
new file mode 100644
index 000000000000..d9c344e6e72c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/peaqevcore/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "peaqevcore";
+  version = "19.5.20";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-atrrPU9aQvpbI3JYdsnGkdRpq3SRuBJpezF1qc1USB0=";
+  };
+
+  postPatch = ''
+    sed -i "/extras_require/d" setup.py
+  '';
+
+  # Tests are not shipped and source is not tagged
+  # https://github.com/elden1337/peaqev-core/issues/4
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "peaqevcore"
+  ];
+
+  meta = with lib; {
+    description = "Library for interacting with Peaqev car charging";
+    homepage = "https://github.com/elden1337/peaqev-core";
+    changelog = "https://github.com/elden1337/peaqev-core/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pebble/default.nix b/nixpkgs/pkgs/development/python-modules/pebble/default.nix
new file mode 100644
index 000000000000..5cdc198bc792
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pebble/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pebble";
+  version = "5.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Pebble";
+    inherit version;
+    hash = "sha256-b3rfK97UQUvdNWLV9NVnvZT/EB5yav+HimZXW8mcEis=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  doCheck = !stdenv.isDarwin;
+
+  pythonImportsCheck = [
+    "pebble"
+  ];
+
+  meta = with lib; {
+    description = "API to manage threads and processes within an application";
+    homepage = "https://github.com/noxdafox/pebble";
+    changelog = "https://github.com/noxdafox/pebble/releases/tag/${version}";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ orivej ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pecan/default.nix b/nixpkgs/pkgs/development/python-modules/pecan/default.nix
new file mode 100644
index 000000000000..1de099579de3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pecan/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, logutils
+, mako
+, webob
+, webtest
+, pythonOlder
+, pytestCheckHook
+, genshi
+, gunicorn
+, jinja2
+, sqlalchemy
+, virtualenv
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pecan";
+  version = "1.5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-YGMnLV+GB3P7tLSyrhsJ2oyVQGLvhxFQwGz9sjkdk1U=";
+  };
+
+  propagatedBuildInputs = [
+    logutils
+    mako
+    webob
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    genshi
+    gunicorn
+    jinja2
+    sqlalchemy
+    virtualenv
+    webtest
+  ];
+
+  pytestFlagsArray = [
+    "--pyargs pecan"
+  ];
+
+  pythonImportsCheck = [
+    "pecan"
+  ];
+
+  meta = with lib; {
+    changelog = "https://pecan.readthedocs.io/en/latest/changes.html";
+    description = "WSGI object-dispatching web framework";
+    homepage = "https://www.pecanpy.org/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ applePrincess ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/peco/default.nix b/nixpkgs/pkgs/development/python-modules/peco/default.nix
new file mode 100644
index 000000000000..961b0c623d92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/peco/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pydantic
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "peco";
+  version = "0.0.29";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zL0tBTwm+l5eyxlWr2xoE+nLpMfUKri1/yD+WgTUqHQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pydantic
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "peco"
+  ];
+
+  meta = with lib; {
+    description = "Library for interacting with the PECO outage map";
+    homepage = "https://github.com/IceBotYT/peco-outage-api";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/peewee-migrate/default.nix b/nixpkgs/pkgs/development/python-modules/peewee-migrate/default.nix
new file mode 100644
index 000000000000..dc7cefd00c0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/peewee-migrate/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build-system
+, poetry-core
+
+# runtime
+, click
+, peewee
+
+# tests
+, psycopg2
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "peewee-migrate";
+  version = "1.12.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "klen";
+    repo = "peewee_migrate";
+    rev = "refs/tags/${version}";
+    hash = "sha256-jxM2cvlDsoiUlVoxdS3wpUKlwMveMraiR431A8kIdgI=";
+  };
+
+  postPatch = ''
+    sed -i '/addopts/d' pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    peewee
+    click
+  ];
+
+  pythonImportsCheck = [
+    "peewee_migrate"
+  ];
+
+  nativeCheckInputs = [
+    psycopg2
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    #  sqlite3.OperationalError: error in table order after drop column...
+    "test_migrator"
+  ];
+
+  meta = with lib; {
+    description = "Simple migration engine for Peewee";
+    homepage = "https://github.com/klen/peewee_migrate";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/peewee/default.nix b/nixpkgs/pkgs/development/python-modules/peewee/default.nix
new file mode 100644
index 000000000000..deeccfe69881
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/peewee/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, apsw
+, buildPythonPackage
+, cython
+, fetchFromGitHub
+, flask
+, python
+, sqlite
+, withMysql ? false
+, mysql-connector
+, withPostgres ? false
+, psycopg2
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "peewee";
+  version = "3.17.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "coleifer";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-QbbwC55q/BjMGtm3fH8HPd0aETMzLAFwVYFvOS/4dqA=";
+  };
+
+  buildInputs = [
+    sqlite
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    apsw
+  ] ++ lib.optionals withPostgres [
+    psycopg2
+  ] ++ lib.optionals withMysql [
+    mysql-connector
+  ];
+
+  nativeCheckInputs = [
+    flask
+  ];
+
+  doCheck = withPostgres;
+
+  checkPhase = ''
+    rm -r playhouse # avoid using the folder in the cwd
+    ${python.interpreter} runtests.py
+  '';
+
+  pythonImportsCheck = [
+    "peewee"
+  ];
+
+  meta = with lib; {
+    description = "Python ORM with support for various database implementation";
+    homepage = "http://peewee-orm.com";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pefile/default.nix b/nixpkgs/pkgs/development/python-modules/pefile/default.nix
new file mode 100644
index 000000000000..55bd8c0cc07d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pefile/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, future
+, fetchFromGitHub
+, setuptools-scm
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pefile";
+  version = "2023.2.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "erocarrera";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-lD8GpNl+cVNYTZUKFRF1/2kDwEbn/ekRBNBTYuFmFW0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    future
+  ];
+
+  # Test data encrypted
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pefile"
+  ];
+
+  meta = with lib; {
+    description = "Multi-platform Python module to parse and work with Portable Executable (aka PE) files";
+    homepage = "https://github.com/erocarrera/pefile";
+    changelog = "https://github.com/erocarrera/pefile/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ pamplemousse ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/peft/default.nix b/nixpkgs/pkgs/development/python-modules/peft/default.nix
new file mode 100644
index 000000000000..bab37b5b7d79
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/peft/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, numpy
+, packaging
+, psutil
+, pyyaml
+, torch
+, transformers
+, accelerate
+}:
+
+buildPythonPackage rec {
+  pname = "peft";
+  version = "0.6.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "huggingface";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-hqXHU6PHn2jkWBRRCRuGIGjSCUc6jfUaHgrn3glTwlE=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  propagatedBuildInputs = [
+    numpy
+    packaging
+    psutil
+    pyyaml
+    torch
+    transformers
+    accelerate
+  ];
+
+  doCheck = false;  # tries to download pretrained models
+  pythonImportsCheck = [
+    "peft"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/huggingface/peft";
+    description = "State-of-the art parameter-efficient fine tuning";
+    changelog = "https://github.com/huggingface/peft/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pegen/default.nix b/nixpkgs/pkgs/development/python-modules/pegen/default.nix
new file mode 100644
index 000000000000..2a7a3062741f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pegen/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pegen";
+  version = "0.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "we-like-parsers";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-P4zX8za9lBlXhNPkQe9p136ggZEJh6fHfBr+DQKvtTg=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pegen"
+  ];
+
+  disabledTests = lib.optionals (pythonAtLeast "3.11") [
+    # https://github.com/we-like-parsers/pegen/issues/89
+    "test_invalid_def_stmt"
+  ];
+
+  meta = with lib; {
+    description = "Library to generate PEG parsers";
+    homepage = "https://github.com/we-like-parsers/pegen";
+    changelog = "https://github.com/we-like-parsers/pegen/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pelican/default.nix b/nixpkgs/pkgs/development/python-modules/pelican/default.nix
new file mode 100644
index 000000000000..8fedf5c694b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pelican/default.nix
@@ -0,0 +1,114 @@
+{ lib
+, beautifulsoup4
+, blinker
+, buildPythonPackage
+, docutils
+, feedgenerator
+, fetchFromGitHub
+, git
+, glibcLocales
+, jinja2
+, lxml
+, markdown
+, markupsafe
+, mock
+, pytestCheckHook
+, pandoc
+, pillow
+, pygments
+, python-dateutil
+, pythonOlder
+, pytz
+, rich
+, pytest-xdist
+, six
+, typogrify
+, unidecode
+}:
+
+buildPythonPackage rec {
+  pname = "pelican";
+  version = "4.8.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "getpelican";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-T+XBRBfroG1gh9ZHU7V5wsgnI1xuNTXYAe6g5Xk8Qyg=";
+    # Remove unicode file names which leads to different checksums on HFS+
+    # vs. other filesystems because of unicode normalisation.
+    postFetch = ''
+      rm -r $out/pelican/tests/output/custom_locale/posts
+    '';
+  };
+
+  buildInputs = [
+    glibcLocales
+    pandoc
+    git
+    mock
+    markdown
+    typogrify
+  ];
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    blinker
+    docutils
+    feedgenerator
+    jinja2
+    lxml
+    markupsafe
+    pillow
+    pygments
+    python-dateutil
+    pytz
+    rich
+    six
+    unidecode
+  ];
+
+  nativeCheckInputs = [
+    pytest-xdist
+    pytestCheckHook
+    pandoc
+  ];
+
+  postPatch = ''
+    substituteInPlace pelican/tests/test_pelican.py \
+      --replace "'git'" "'${git}/bin/git'"
+  '';
+
+  pytestFlagsArray = [
+    # DeprecationWarning: 'jinja2.Markup' is deprecated and...
+    "-W ignore::DeprecationWarning"
+  ];
+
+  disabledTests = [
+    # AssertionError
+    "test_basic_generation_works"
+    "test_custom_generation_works"
+    "test_custom_locale_generation_works"
+  ];
+
+  LC_ALL = "en_US.UTF-8";
+
+  # We only want to patch shebangs in /bin, and not those
+  # of the project scripts that are created by Pelican.
+  # See https://github.com/NixOS/nixpkgs/issues/30116
+  dontPatchShebangs = true;
+
+  postFixup = ''
+    patchShebangs $out/bin
+  '';
+
+  pythonImportsCheck = [ "pelican" ];
+
+  meta = with lib; {
+    description = "Static site generator that requires no database or server-side logic";
+    homepage = "https://getpelican.com/";
+    license = licenses.agpl3;
+    maintainers = with maintainers; [ offline prikhi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pem/default.nix b/nixpkgs/pkgs/development/python-modules/pem/default.nix
new file mode 100644
index 000000000000..f4608995dd73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pem/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, certifi
+, cryptography
+, fetchFromGitHub
+, hatch-fancy-pypi-readme
+, hatch-vcs
+, hatchling
+, pretend
+, pyopenssl
+, pytestCheckHook
+, pythonOlder
+, twisted
+}:
+
+buildPythonPackage rec {
+  pname = "pem";
+  version = "23.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "hynek";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-rVYlnvISGugh9qvf3mdrIyELmeOUU4g6291HeoMkoQc=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    hatchling
+    hatch-fancy-pypi-readme
+    hatch-vcs
+  ];
+
+  nativeCheckInputs = [
+    certifi
+    cryptography
+    pretend
+    pyopenssl
+    pytestCheckHook
+    twisted
+  ] ++ twisted.optional-dependencies.tls;
+
+  pythonImportsCheck = [
+    "pem"
+  ];
+
+  meta = with lib; {
+    description = "Easy PEM file parsing in Python";
+    homepage = "https://pem.readthedocs.io/";
+    changelog = "https://github.com/hynek/pem/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nyanotech ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pencompy/default.nix b/nixpkgs/pkgs/development/python-modules/pencompy/default.nix
new file mode 100644
index 000000000000..b2648e36e5a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pencompy/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pencompy";
+  version = "0.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-PjALTsk0Msv3g8M6k0v6ftzDAuFKyIPSpfvT8S3YL48=";
+  };
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pencompy"
+  ];
+
+  meta = with lib; {
+    description = "Library for interacting with Pencom relay boards";
+    homepage = "https://github.com/dubnom/pencompy";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pendulum/default.nix b/nixpkgs/pkgs/development/python-modules/pendulum/default.nix
new file mode 100644
index 000000000000..cdc7ab035ed3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pendulum/default.nix
@@ -0,0 +1,36 @@
+{ lib, fetchPypi, buildPythonPackage, pythonOlder
+, python-dateutil
+, importlib-metadata
+, poetry-core
+, pytzdata
+, typing
+}:
+
+buildPythonPackage rec {
+  pname = "pendulum";
+  version = "2.1.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207";
+  };
+
+  preBuild = ''
+    export HOME=$TMPDIR
+  '';
+
+  nativeBuildInputs = [ poetry-core ];
+  propagatedBuildInputs = [ python-dateutil pytzdata ]
+  ++ lib.optional (pythonOlder "3.5") typing
+  ++ lib.optionals (pythonOlder "3.8") [ importlib-metadata ];
+
+  # No tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python datetimes made easy";
+    homepage = "https://github.com/sdispater/pendulum";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pep440/default.nix b/nixpkgs/pkgs/development/python-modules/pep440/default.nix
new file mode 100644
index 000000000000..0faa3c324b37
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pep440/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pep440";
+  version = "0.1.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WLNyRswrE/7hyio8CSyzcE0h7PYhpb27Fo5E5pf20E0=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Don't run CLI tests
+    "tests/test_cli.py"
+  ];
+
+  pythonImportsCheck = [
+    "pep440"
+  ];
+
+  meta = with lib; {
+    description = "Python module to check whether versions number match PEP 440";
+    homepage = "https://github.com/Carreau/pep440";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pep517/default.nix b/nixpkgs/pkgs/development/python-modules/pep517/default.nix
new file mode 100644
index 000000000000..470c67d6ae07
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pep517/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, tomli
+, pythonOlder
+, importlib-metadata
+, zipp
+, pytestCheckHook
+, setuptools
+, testpath
+, mock
+, pip
+}:
+
+buildPythonPackage rec {
+  pname = "pep517";
+  version = "0.13.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Gy+i/9OTi7S+/+XWFGy8sr2plqWk2p8xq//Ysk4Hsxc=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    tomli
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata zipp
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    setuptools
+    testpath
+    mock
+    pip
+  ];
+
+  disabledTests = [
+    "test_setup_py"
+    "test_issue_104"
+  ];
+
+  preCheck = ''
+    rm pytest.ini # wants flake8
+    rm tests/test_meta.py # wants to run pip
+  '';
+
+  meta = {
+    description = "Wrappers to build Python packages using PEP 517 hooks";
+    license = lib.licenses.mit;
+    homepage = "https://github.com/pypa/pep517";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pep8-naming/default.nix b/nixpkgs/pkgs/development/python-modules/pep8-naming/default.nix
new file mode 100644
index 000000000000..5fd696523d84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pep8-naming/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flake8
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pep8-naming";
+  version = "0.13.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "PyCQA";
+    repo = pname;
+    rev = version;
+    hash = "sha256-l7zZUOMWyTxnTbkFkzfABY/eVMKnv0kNJ0UPzJo0W1Y=";
+  };
+
+  propagatedBuildInputs = [
+    flake8
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} run_tests.py
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "pep8ext_naming"
+  ];
+
+  meta = with lib; {
+    description = "Check PEP-8 naming conventions, plugin for flake8";
+    homepage = "https://github.com/PyCQA/pep8-naming";
+    changelog = "https://github.com/PyCQA/pep8-naming/blob/${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ eadwu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pep8/default.nix b/nixpkgs/pkgs/development/python-modules/pep8/default.nix
new file mode 100644
index 000000000000..cc0e546b957c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pep8/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pep8";
+  version = "1.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fe249b52e20498e59e0b5c5256aa52ee99fc295b26ec9eaa85776ffdb9fe6374";
+  };
+
+  # FAIL: test_checkers_testsuite (testsuite.test_all.Pep8TestCase)
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://pep8.readthedocs.org/";
+    description = "Python style guide checker";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/peppercorn/default.nix b/nixpkgs/pkgs/development/python-modules/peppercorn/default.nix
new file mode 100644
index 000000000000..310cc565b21f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/peppercorn/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "peppercorn";
+  version = "0.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ip4bfwcpwkq9hz2dai14k2cyabvwrnvcvrcmzxmqm04g8fnimwn";
+  };
+
+  meta = with lib; {
+    description = "A library for converting a token stream into a data structure for use in web form posts";
+    homepage = "https://docs.pylonsproject.org/projects/peppercorn/en/latest/";
+    maintainers = with maintainers; [ domenkozar ];
+    platforms = platforms.all;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/percol/default.nix b/nixpkgs/pkgs/development/python-modules/percol/default.nix
new file mode 100644
index 000000000000..58e7aff5601d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/percol/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub, cmigemo }:
+
+buildPythonPackage rec {
+  pname = "percol";
+  version = "unstable-2019-07-24";
+
+  src = fetchFromGitHub {
+    owner = "mooz";
+    repo = "percol";
+    rev = "4b28037e328da3d0fe8165c11b800cbaddcb525e";
+    sha256 = "07sq3517wzn04j2dzlmczmcvx3w6r7xnzz3634zgf1zi6dbr2a3g";
+  };
+
+  propagatedBuildInputs = [ cmigemo ];
+
+  # package has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "percol" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mooz/percol";
+    description = "Adds flavor of interactive filtering to the traditional pipe concept of shell";
+    license = licenses.mit;
+    maintainers = with maintainers; [ koral ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/perfplot/default.nix b/nixpkgs/pkgs/development/python-modules/perfplot/default.nix
new file mode 100644
index 000000000000..1dfc78ffca46
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/perfplot/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, matplotlib
+, matplotx
+, numpy
+, rich
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "perfplot";
+  version = "0.10.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nschloe";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-bu6eYQukhLE8sLkS3PbqTgXOqJFXJYXTcXAhmjaq48g=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    matplotlib
+    matplotx
+    numpy
+    rich
+  ];
+
+  # This variable is needed to suppress the "Trace/BPT trap: 5" error in Darwin's checkPhase.
+  # Not sure of the details, but we can avoid it by changing the matplotlib backend during testing.
+  env.MPLBACKEND = lib.optionalString stdenv.isDarwin "Agg";
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "perfplot"
+  ];
+
+  meta = with lib; {
+    description = "Performance plots for Python code snippets";
+    homepage = "https://github.com/nschloe/perfplot";
+    changelog = "https://github.com/nschloe/perfplot/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/periodictable/default.nix b/nixpkgs/pkgs/development/python-modules/periodictable/default.nix
new file mode 100644
index 000000000000..6f0a8245ade5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/periodictable/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, numpy
+, pyparsing
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "periodictable";
+  version = "1.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-fFAcn3PXex+yjLUehbKEKcLESpnOPRJ0iUVkxy1xJgM=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    pyparsing
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "periodictable"
+  ];
+
+  meta = with lib; {
+    description = "Extensible periodic table of the elements";
+    homepage = "https://github.com/pkienzle/periodictable";
+    license = licenses.publicDomain;
+    maintainers = with maintainers; [ rprospero ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/periodiq/default.nix b/nixpkgs/pkgs/development/python-modules/periodiq/default.nix
new file mode 100644
index 000000000000..5ed6a028aa38
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/periodiq/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitLab
+, poetry-core
+, dramatiq
+, pendulum
+, setuptools
+, pytest-mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "periodiq";
+  version = "0.12.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitLab {
+    owner = "bersace";
+    repo = "periodiq";
+    rev = "v${version}";
+    hash = "sha256-Ar0n+Wi1OUtRdhVxrU7Nz4je8ylaHgPZbXE0a30hzU0=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'poetry>=0.12' 'poetry-core' \
+      --replace 'poetry.masonry.api' 'poetry.core.masonry.api'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    dramatiq
+    pendulum
+    setuptools
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook pytest-mock ];
+
+  pytestFlagsArray = [ "tests/unit" ];
+
+  pythonImportsCheck = [ "periodiq" ];
+
+  meta = with lib; {
+    description = "Simple Scheduler for Dramatiq Task Queue";
+    homepage = "https://pypi.org/project/periodiq/";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ traxys ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/permissionedforms/default.nix b/nixpkgs/pkgs/development/python-modules/permissionedforms/default.nix
new file mode 100644
index 000000000000..db4f02bef915
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/permissionedforms/default.nix
@@ -0,0 +1,39 @@
+{ buildPythonPackage
+, django
+, django-modelcluster
+, fetchFromGitHub
+, lib
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "permissionedforms";
+  version = "0.1";
+
+  src = fetchFromGitHub {
+    repo = "django-permissionedforms";
+    owner = "wagtail";
+    rev = "v${version}";
+    sha256 = "sha256-DQzPGmh5UEVpGWnW3IrEVPkZZ8mdiW9J851Ej4agTDc=";
+  };
+
+  propagatedBuildInputs = [
+    django
+  ];
+
+  checkInputs = [ django-modelcluster ];
+
+  checkPhase = ''
+    ${python.interpreter} runtests.py
+  '';
+
+  pythonImportsCheck = [ "permissionedforms" ];
+
+  meta = with lib; {
+    description = "A Django extension for creating forms that vary according to user permissions";
+    homepage = "https://github.com/wagtail/permissionedforms";
+    changelog = "https://github.com/wagtail/permissionedforms/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ sephi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/persim/default.nix b/nixpkgs/pkgs/development/python-modules/persim/default.nix
new file mode 100644
index 000000000000..869fb6146f2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/persim/default.nix
@@ -0,0 +1,78 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, deprecated
+, hopcroftkarp
+, joblib
+, matplotlib
+, numpy
+, scikit-learn
+, scipy
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "persim";
+  version = "0.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-p6Vumfr+vRDr0D9PnEZItp9vNlCLIb59HpBg1KdyHGE=";
+  };
+
+  propagatedBuildInputs = [
+    deprecated
+    hopcroftkarp
+    joblib
+    matplotlib
+    numpy
+    scikit-learn
+    scipy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    # specifically needed for darwin
+    export HOME=$(mktemp -d)
+    mkdir -p $HOME/.matplotlib
+    echo "backend: ps" > $HOME/.matplotlib/matplotlibrc
+  '';
+
+  pythonImportsCheck = [
+    "persim"
+  ];
+
+  disabledTests = lib.optionals (pythonAtLeast "3.10") [
+    # AttributeError: module 'collections' has no attribute 'Iterable'
+    "test_empyt_diagram_list"
+    "test_empty_diagram_list"
+    "test_fit_diagram"
+    "test_integer_diagrams"
+    "test_lists_of_lists"
+    "test_mixed_pairs"
+    "test_multiple_diagrams"
+    "test_n_pixels"
+    # https://github.com/scikit-tda/persim/issues/67
+    "test_persistenceimager"
+    # ValueError: setting an array element with a sequence
+    "test_exact_critical_pairs"
+  ];
+
+  meta = with lib; {
+    description = "Distances and representations of persistence diagrams";
+    homepage = "https://persim.scikit-tda.org";
+    changelog = "https://github.com/scikit-tda/persim/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/persist-queue/default.nix b/nixpkgs/pkgs/development/python-modules/persist-queue/default.nix
new file mode 100644
index 000000000000..6d29659f8ffd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/persist-queue/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, nose2
+, msgpack
+, cbor2
+}:
+
+buildPythonPackage rec {
+  pname = "persist-queue";
+  version = "0.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-4ZONOsbZthaSwRX43crajZox8iUGeCWF45WIpB7Ppao=";
+  };
+
+  disabled = pythonOlder "3.6";
+
+  nativeCheckInputs = [
+    nose2
+    msgpack
+    cbor2
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    # Don't run MySQL tests, as they require a MySQL server running
+    rm persistqueue/tests/test_mysqlqueue.py
+
+    nose2
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "persistqueue" ];
+
+  meta = with lib; {
+    description = "Thread-safe disk based persistent queue in Python";
+    homepage = "https://github.com/peter-wangxu/persist-queue";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ huantian ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/persistent/default.nix b/nixpkgs/pkgs/development/python-modules/persistent/default.nix
new file mode 100644
index 000000000000..efe366123bdf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/persistent/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, cffi
+, fetchPypi
+, zope_interface
+, sphinx
+, manuel
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "persistent";
+  version = "5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-l8zC+ibMm9zDvh/GWqT08or+UgTC1P0kpnRFkI23Rps=";
+  };
+
+  nativeBuildInputs = [
+    sphinx
+    manuel
+  ];
+
+  propagatedBuildInputs = [
+    zope_interface
+    cffi
+  ];
+
+  pythonImportsCheck = [
+    "persistent"
+  ];
+
+  meta = with lib; {
+    description = "Automatic persistence for Python objects";
+    homepage = "https://github.com/zopefoundation/persistent/";
+    changelog = "https://github.com/zopefoundation/persistent/blob/${version}/CHANGES.rst";
+    license = licenses.zpl21;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/persisting-theory/default.nix b/nixpkgs/pkgs/development/python-modules/persisting-theory/default.nix
new file mode 100644
index 000000000000..0555e53e4740
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/persisting-theory/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "persisting-theory";
+  version = "1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-D4QPoiJHvKpRQJTafzsmxgI1lCmrEtLNiL4GtJozYpA=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "persisting_theory" ];
+
+  meta = with lib; {
+    homepage = "https://code.agate.blue/agate/persisting-theory";
+    description = "Automate data discovering and access inside a list of packages";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ mmai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pescea/default.nix b/nixpkgs/pkgs/development/python-modules/pescea/default.nix
new file mode 100644
index 000000000000..415fcd5a09a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pescea/default.nix
@@ -0,0 +1,61 @@
+{ stdenv
+, lib
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pescea";
+  version = "1.0.12";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "lazdavila";
+    repo = pname;
+    # https://github.com/lazdavila/pescea/issues/4
+    rev = "a3dd7deedc64205e24adbc4ff406a2f6aed3b240";
+    hash = "sha256-5TkFrGaSkQOORhf5a7SjkzggFLPyqe9k3M0B4ljhWTQ=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # https://github.com/lazdavila/pescea/pull/1
+    substituteInPlace setup.py \
+      --replace '"asyncio",' ""
+  '';
+
+  disabledTests = [
+    # AssertionError: assert <State.BUSY: 'BusyWaiting'>...
+    "test_updates_while_busy"
+    # Test requires network access
+    "test_flow_control"
+  ];
+
+  pythonImportsCheck = [
+    "pescea"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Python interface to Escea fireplaces";
+    homepage = "https://github.com/lazdavila/pescea";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pex/default.nix b/nixpkgs/pkgs/development/python-modules/pex/default.nix
new file mode 100644
index 000000000000..9d067789b3ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pex/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pex";
+  version = "2.1.153";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-idIhtaEjmX1FX2Kgaks3IjNZz76jCUdR/9w1Q1BHu4c=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  # A few more dependencies I don't want to handle right now...
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pex"
+  ];
+
+  meta = with lib; {
+    description = "Python library and tool for generating .pex (Python EXecutable) files";
+    homepage = "https://github.com/pantsbuild/pex";
+    changelog = "https://github.com/pantsbuild/pex/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ copumpkin phaer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pexif/default.nix b/nixpkgs/pkgs/development/python-modules/pexif/default.nix
new file mode 100644
index 000000000000..a31d80eed052
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pexif/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pexif";
+  version = "0.15";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "45a3be037c7ba8b64bbfc48f3586402cc17de55bb9d7357ef2bc99954a18da3f";
+  };
+
+  meta = with lib; {
+    description = "A module for editing JPEG EXIF data";
+    homepage = "http://www.benno.id.au/code/pexif/";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pexpect/default.nix b/nixpkgs/pkgs/development/python-modules/pexpect/default.nix
new file mode 100644
index 000000000000..40d61aec5c52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pexpect/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ptyprocess
+}:
+
+buildPythonPackage (rec {
+  pname = "pexpect";
+  version = "4.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c";
+  };
+
+  # Wants to run pythonin a subprocess
+  doCheck = false;
+
+  propagatedBuildInputs = [ ptyprocess ];
+
+  meta = with lib; {
+    homepage = "http://www.noah.org/wiki/Pexpect";
+    description = "Automate interactive console applications such as ssh, ftp, etc";
+    license = licenses.mit;
+    maintainers = with maintainers; [ zimbatm ];
+
+    longDescription = ''
+      Pexpect is similar to the Don Libes "Expect" system, but Pexpect
+      as a different interface that is easier to understand. Pexpect
+      is basically a pattern matching system. It runs programs and
+      watches output. When output matches a given pattern Pexpect can
+      respond as if a human were typing responses. Pexpect can be used
+      for automation, testing, and screen scraping. Pexpect can be
+      used for automating interactive console applications such as
+      ssh, ftp, passwd, telnet, etc. It can also be used to control
+      web applications via "lynx", "w3m", or some other text-based web
+      browser. Pexpect is pure Python. Unlike other Expect-like
+      modules for Python Pexpect does not require TCL or Expect nor
+      does it require C extensions to be compiled. It should work on
+      any platform that supports the standard Python pty module.
+    '';
+  };
+})
diff --git a/nixpkgs/pkgs/development/python-modules/pfzy/default.nix b/nixpkgs/pkgs/development/python-modules/pfzy/default.nix
new file mode 100644
index 000000000000..48c084495a69
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pfzy/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pfzy";
+  version = "0.3.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "kazhala";
+    repo = "pfzy";
+    rev = "refs/tags/${version}";
+    hash = "sha256-+Ba/yLUfT0SPPAJd+pKyjSvNrVpEwxW3xEKFx4JzpYk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  pythonImportsCheck = [
+    "pfzy"
+  ];
+
+  meta = with lib; {
+    description = "Python port of the fzy fuzzy string matching algorithm";
+    homepage = "https://github.com/kazhala/pfzy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pg8000/default.nix b/nixpkgs/pkgs/development/python-modules/pg8000/default.nix
new file mode 100644
index 000000000000..ee580829bbe0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pg8000/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, importlib-metadata
+, passlib
+, python-dateutil
+, pythonOlder
+, scramp
+, setuptools
+, versioningit
+}:
+
+buildPythonPackage rec {
+  pname = "pg8000";
+  version = "1.30.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wEKA5mocz7UWbbXBZBZMLhuPYq+u3/0hFFGlMproSik=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    versioningit
+  ];
+
+  propagatedBuildInputs = [
+    passlib
+    python-dateutil
+    scramp
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  # Tests require a running PostgreSQL instance
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pg8000"
+  ];
+
+  meta = with lib; {
+    description = "Python driver for PostgreSQL";
+    homepage = "https://github.com/tlocke/pg8000";
+    changelog = "https://github.com/tlocke/pg8000#release-notes";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ domenkozar ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pgcli/default.nix b/nixpkgs/pkgs/development/python-modules/pgcli/default.nix
new file mode 100644
index 000000000000..8f7f1e96effe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pgcli/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, cli-helpers
+, click
+, configobj
+, prompt-toolkit
+, psycopg
+, pygments
+, sqlparse
+, pgspecial
+, setproctitle
+, keyring
+, pendulum
+, pytestCheckHook
+, sshtunnel
+, mock
+}:
+
+# this is a pythonPackage because of the ipython line magics in pgcli.magic
+# integrating with ipython-sql
+buildPythonPackage rec {
+  pname = "pgcli";
+  version = "4.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8v7qIJnOGtXoqdXZOw7a9g3GHpeyG3XpHZcjk5zlO9I=";
+  };
+
+  propagatedBuildInputs = [
+    cli-helpers
+    click
+    configobj
+    prompt-toolkit
+    psycopg
+    pygments
+    sqlparse
+    pgspecial
+    setproctitle
+    keyring
+    pendulum
+    sshtunnel
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook mock ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [ "test_application_name_db_uri" ];
+
+  meta = with lib; {
+    description = "Command-line interface for PostgreSQL";
+    longDescription = ''
+      Rich command-line interface for PostgreSQL with auto-completion and
+      syntax highlighting.
+    '';
+    homepage = "https://pgcli.com";
+    changelog = "https://github.com/dbcli/pgcli/raw/v${version}/changelog.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ dywedir SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pglast/default.nix b/nixpkgs/pkgs/development/python-modules/pglast/default.nix
new file mode 100644
index 000000000000..4edaa22bb16d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pglast/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pglast";
+  version = "5.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-yz6Q+Vt7ZuT9NaxuQQA+BH7U6Efaim7No6GJmnOQo1o=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=pglast --cov-report term-missing" ""
+  '';
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  # pytestCheckHook doesn't work
+  # ImportError: cannot import name 'parse_sql' from 'pglast'
+  checkPhase = ''
+    pytest
+  '';
+
+  pythonImportsCheck = [
+    "pglast"
+    "pglast.parser"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/lelit/pglast";
+    description = "PostgreSQL Languages AST and statements prettifier";
+    changelog = "https://github.com/lelit/pglast/blob/v${version}/CHANGES.rst";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ marsam ];
+    mainProgram = "pgpp";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pgmpy/default.nix b/nixpkgs/pkgs/development/python-modules/pgmpy/default.nix
new file mode 100644
index 000000000000..e9ca2003fa81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pgmpy/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+# build inputs
+, networkx
+, numpy
+, scipy
+, scikit-learn
+, pandas
+, pyparsing
+, torch
+, statsmodels
+, tqdm
+, joblib
+, opt-einsum
+# check inputs
+, pytestCheckHook
+, pytest-cov
+, coverage
+, mock
+, black
+}:
+let
+  pname = "pgmpy";
+  version = "0.1.24";
+  # optional-dependencies = {
+  #   all = [ daft ];
+  # };
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pgmpy";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-IMlo4SBxO9sPoZl0rQGc3FcvvIN/V/WZz+1BD7aBfzs=";
+  };
+
+  propagatedBuildInputs = [
+    networkx
+    numpy
+    scipy
+    scikit-learn
+    pandas
+    pyparsing
+    torch
+    statsmodels
+    tqdm
+    joblib
+    opt-einsum
+  ];
+
+  disabledTests = [
+    "test_to_daft" # requires optional dependency daft
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    # xdoctest
+    pytest-cov
+    coverage
+    mock
+    black
+  ];
+
+  meta = with lib; {
+    description = "Python Library for learning (Structure and Parameter), inference (Probabilistic and Causal), and simulations in Bayesian Networks";
+    homepage = "https://github.com/pgmpy/pgmpy";
+    changelog = "https://github.com/pgmpy/pgmpy/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pgpdump/default.nix b/nixpkgs/pkgs/development/python-modules/pgpdump/default.nix
new file mode 100644
index 000000000000..e952ced742c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pgpdump/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pgpdump";
+  version = "1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0s4nh8h7qsdj2yf29bspjs1zvxd4lcd11r6g11dp7fppgf2h0iqw";
+  };
+
+  # Disabling check because of: https://github.com/toofishes/python-pgpdump/issues/18
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python library for parsing PGP packets";
+    homepage = "https://github.com/toofishes/python-pgpdump";
+    license = licenses.bsd3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pgpy/default.nix b/nixpkgs/pkgs/development/python-modules/pgpy/default.nix
new file mode 100644
index 000000000000..fc9c0c656961
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pgpy/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, pythonOlder
+, fetchFromGitHub
+, buildPythonPackage
+, setuptools
+, pyasn1
+, cryptography
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pgpy";
+  version = "0.6.0";
+
+  disabled = pythonOlder "3.6";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "SecurityInnovation";
+    repo = "PGPy";
+    rev = "v${version}";
+    hash = "sha256-47YiHNxmjyCOYHHUV3Zyhs3Att9HZtCXYfbN34ooTxU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pyasn1
+    cryptography
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/SecurityInnovation/PGPy";
+    description = "Pretty Good Privacy for Python";
+    longDescription = ''
+      PGPy is a Python library for implementing Pretty Good Privacy into Python
+      programs, conforming to the OpenPGP specification per RFC 4880.
+    '';
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ eadwu dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pgsanity/default.nix b/nixpkgs/pkgs/development/python-modules/pgsanity/default.nix
new file mode 100644
index 000000000000..4660461e91c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pgsanity/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, python
+, fetchPypi
+, buildPythonPackage
+, postgresql
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pgsanity";
+  version = "0.2.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "de0bbd6fe4f98bf5139cb5f466eac2e2abaf5a7b050b9e4867b87bf360873173";
+  };
+
+  nativeCheckInputs = [ unittestCheckHook postgresql ];
+  propagatedBuildInputs = [ postgresql ];
+
+  meta = with lib; {
+    homepage = "https://github.com/markdrago/pgsanity";
+    description = "Checks the syntax of Postgresql SQL files";
+    longDescription = ''
+      PgSanity checks the syntax of Postgresql SQL files by
+      taking a file that has a list of bare SQL in it,
+      making that file look like a C file with embedded SQL,
+      run it through ecpg and
+      let ecpg report on the syntax errors of the SQL.
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ nalbyuites ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pgspecial/default.nix b/nixpkgs/pkgs/development/python-modules/pgspecial/default.nix
new file mode 100644
index 000000000000..1a86bce72969
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pgspecial/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, psycopg
+, click
+, configobj
+, sqlparse
+}:
+
+buildPythonPackage rec {
+  pname = "pgspecial";
+  version = "2.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-o4I5zZYfrDPObaNcRm11istvlCkBWY19905bgv5vVjY=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    sqlparse
+    psycopg
+  ];
+
+  nativeCheckInputs = [
+    configobj
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # requires a postgresql server
+    "test_slash_dp_pattern_schema"
+  ];
+
+  meta = with lib; {
+    description = "Meta-commands handler for Postgres Database";
+    homepage = "https://github.com/dbcli/pgspecial";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pgvector/default.nix b/nixpkgs/pkgs/development/python-modules/pgvector/default.nix
new file mode 100644
index 000000000000..383029504b54
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pgvector/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, asyncpg
+, buildPythonPackage
+, django
+, fetchFromGitHub
+, numpy
+, peewee
+, postgresql
+, postgresqlTestHook
+, psycopg
+, psycopg2
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, sqlalchemy
+, sqlmodel
+}:
+
+buildPythonPackage rec {
+  pname = "pgvector";
+  version = "0.2.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pgvector";
+    repo = "pgvector-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-XKoaEwLW59pV4Dwis7p2L65XoO2zUEa1kXxz6Lgs2d8=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    asyncpg
+    django
+    peewee
+    (postgresql.withPackages (p: with p; [ pgvector ]))
+    postgresqlTestHook
+    psycopg
+    psycopg2
+    pytest-asyncio
+    pytestCheckHook
+    sqlalchemy
+    sqlmodel
+  ];
+
+  env = {
+    PGDATABASE = "pgvector_python_test";
+    postgresqlEnableTCP = 1;
+    postgresqlTestUserOptions = "LOGIN SUPERUSER";
+  };
+
+  pythonImportsCheck = [ "pgvector" ];
+
+  meta = with lib; {
+    description = "Pgvector support for Python";
+    homepage = "https://github.com/pgvector/pgvector-python";
+    changelog = "https://github.com/pgvector/pgvector-python/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/phe/default.nix b/nixpkgs/pkgs/development/python-modules/phe/default.nix
new file mode 100644
index 000000000000..fa4c43c59c90
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phe/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, isPyPy, isPy3k, click, gmpy2, numpy } :
+
+let
+  pname = "phe";
+  version = "1.5.0";
+in
+
+buildPythonPackage {
+  inherit pname version;
+
+  # https://github.com/n1analytics/python-paillier/issues/51
+  disabled = isPyPy || ! isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-mS+3CR0kJ/DZczlG+PNQrN1NHQEgV/Kq02S6eflwM5w=";
+  };
+
+  buildInputs = [ click gmpy2 numpy ];
+
+  # 29/233 tests fail
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A library for Partially Homomorphic Encryption in Python";
+    homepage = "https://github.com/n1analytics/python-paillier";
+    license = licenses.gpl3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/phik/default.nix b/nixpkgs/pkgs/development/python-modules/phik/default.nix
new file mode 100644
index 000000000000..bbc26de99cf7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phik/default.nix
@@ -0,0 +1,99 @@
+{ lib
+, buildPythonPackage
+, cmake
+, fetchFromGitHub
+, joblib
+, jupyter
+, jupyter-client
+, matplotlib
+, nbconvert
+, ninja
+, numba
+, numpy
+, pandas
+, pybind11
+, pytestCheckHook
+, pythonOlder
+, scikit-build
+, scipy
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "phik";
+  version = "0.12.3";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "KaveIO";
+    repo = "PhiK";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-9o3EDhgmne2J1QfzjjNQc1mUcyCzoVrCnWXqjWkiZU0=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    ninja
+    scikit-build
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    joblib
+    numpy
+    scipy
+    pandas
+    matplotlib
+    numba
+    pybind11
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    nbconvert
+    jupyter
+    jupyter-client
+  ];
+
+  # Uses setuptools to drive build process
+  dontUseCmakeConfigure = true;
+
+  pythonImportsCheck = [
+    "phik"
+  ];
+
+  postInstall = ''
+    rm -r $out/bin
+  '';
+
+  preCheck = ''
+    # import from $out
+    rm -r phik
+  '';
+
+  disabledTests = [
+    # TypeError: 'numpy.float64' object cannot be interpreted as an integer
+    # https://github.com/KaveIO/PhiK/issues/73
+    "test_significance_matrix_hybrid"
+    "test_significance_matrix_mc"
+  ];
+
+  disabledTestPaths = [
+    # Don't test integrations
+    "tests/phik_python/integration/"
+  ];
+
+  meta = with lib; {
+    description = "Phi_K correlation analyzer library";
+    longDescription = ''
+      Phi_K is a new and practical correlation coefficient based on several refinements to
+      Pearson’s hypothesis test of independence of two variables.
+    '';
+    homepage = "https://phik.readthedocs.io/";
+    changelog = "https://github.com/KaveIO/PhiK/blob/${version}/CHANGES.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ melsigl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/phone-modem/default.nix b/nixpkgs/pkgs/development/python-modules/phone-modem/default.nix
new file mode 100644
index 000000000000..635d1ce2d850
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phone-modem/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, aioserial
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "phone-modem";
+  version = "0.1.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "phone_modem";
+    inherit version;
+    hash = "sha256-7NahK9l67MdT/dDVXsq+y0Z4cZxZ/WUW2kPpE4Wz6j0=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "aioserial==1.3.0" "aioserial"
+  '';
+
+  propagatedBuildInputs = [
+    aioserial
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "phone_modem" ];
+
+  meta = with lib; {
+    description = "Python module for receiving caller ID and call rejection";
+    homepage = "https://github.com/tkdrob/phone_modem";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/phonemizer/backend-paths.patch b/nixpkgs/pkgs/development/python-modules/phonemizer/backend-paths.patch
new file mode 100644
index 000000000000..4b9f1fb4a70b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phonemizer/backend-paths.patch
@@ -0,0 +1,18 @@
+diff --git a/phonemizer/backend/espeak/wrapper.py b/phonemizer/backend/espeak/wrapper.py
+index 84a79f5..8abcae1 100644
+--- a/phonemizer/backend/espeak/wrapper.py
++++ b/phonemizer/backend/espeak/wrapper.py
+@@ -143,12 +143,7 @@ class EspeakWrapper:
+                     f'is not a readable file')
+             return library.resolve()
+ 
+-        library = (
+-                ctypes.util.find_library('espeak-ng') or
+-                ctypes.util.find_library('espeak'))
+-        if not library:  # pragma: nocover
+-            raise RuntimeError(
+-                'failed to find espeak library')
++        library = '@libespeak@'
+         return library
+ 
+     def _fetch_version_and_path(self):
diff --git a/nixpkgs/pkgs/development/python-modules/phonemizer/default.nix b/nixpkgs/pkgs/development/python-modules/phonemizer/default.nix
new file mode 100644
index 000000000000..2e8dcb85570b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phonemizer/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, stdenv
+, substituteAll
+, buildPythonPackage
+, fetchPypi
+, joblib
+, segments
+, attrs
+, dlinfo
+, typing-extensions
+, espeak-ng
+, pytestCheckHook
+, pytest-cov
+}:
+
+buildPythonPackage rec {
+  pname = "phonemizer";
+  version = "3.2.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Bo+F+FqKmtxjijeHrqyvcaU+R1eLEtdzwJdDNQDNiSs=";
+  };
+
+  postPatch = ''
+    sed -i '/pytest-runner/d' setup.py
+  '';
+
+  patches = [
+    (substituteAll {
+      src = ./backend-paths.patch;
+      libespeak = "${lib.getLib espeak-ng}/lib/libespeak-ng${stdenv.hostPlatform.extensions.sharedLibrary}";
+      # FIXME package festival
+    })
+  ];
+
+  propagatedBuildInputs = [
+    joblib
+    segments
+    attrs
+    dlinfo
+    typing-extensions
+  ];
+
+  # We tried to package festival, but were unable to get the backend running,
+  # so let's disable related tests.
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/bootphon/phonemizer";
+    changelog = "https://github.com/bootphon/phonemizer/blob/v${version}/CHANGELOG.md";
+    description = "Simple text to phones converter for multiple languages";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/phonenumbers/default.nix b/nixpkgs/pkgs/development/python-modules/phonenumbers/default.nix
new file mode 100644
index 000000000000..0942dd0662c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phonenumbers/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "phonenumbers";
+  version = "8.13.20";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vys1qAbTeXnlNhEJQp2kbZoEflnZr5hjnXM8g059qyI=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests/*.py"
+  ];
+
+  pythonImportsCheck = [
+    "phonenumbers"
+  ];
+
+  meta = with lib; {
+    description = "Python module for handling international phone numbers";
+    homepage = "https://github.com/daviddrysdale/python-phonenumbers";
+    changelog = "https://github.com/daviddrysdale/python-phonenumbers/blob/v${version}/python/HISTORY.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fadenb ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/phonopy/default.nix b/nixpkgs/pkgs/development/python-modules/phonopy/default.nix
new file mode 100644
index 000000000000..9007c3eec672
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phonopy/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pyyaml
+, matplotlib
+, h5py
+, scipy
+, spglib
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "phonopy";
+  version = "2.20.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-peL50b1u+tBRxt/U2SloRvS9LTeMXEjrF5F3ZWhJmZ4=";
+  };
+
+  propagatedBuildInputs = [
+    h5py
+    matplotlib
+    numpy
+    pyyaml
+    scipy
+    spglib
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # prevent pytest from importing local directory
+  preCheck = ''
+    rm -r phonopy
+  '';
+
+  pythonImportsCheck = [
+    "phonopy"
+  ];
+
+  meta = with lib; {
+    description = "Modulefor phonon calculations at harmonic and quasi-harmonic levels";
+    homepage = "https://phonopy.github.io/phonopy/";
+    changelog = "https://github.com/phonopy/phonopy/blob/v${version}/doc/changelog.md";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/phpserialize/default.nix b/nixpkgs/pkgs/development/python-modules/phpserialize/default.nix
new file mode 100644
index 000000000000..9323fe6a264f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phpserialize/default.nix
@@ -0,0 +1,21 @@
+{lib, buildPythonPackage, fetchPypi}:
+
+buildPythonPackage rec {
+  pname = "phpserialize";
+  version = "1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "19qgkb9z4zjbjxlpwh2w6pxkz2j3iymnydi69jl0jg905lqjsrxz";
+  };
+
+  # project does not have tests at the moment
+  doCheck = false;
+
+  meta = {
+    description = "A port of the serialize and unserialize functions of PHP to Python";
+    homepage = "https://github.com/mitsuhiko/phpserialize";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/phx-class-registry/default.nix b/nixpkgs/pkgs/development/python-modules/phx-class-registry/default.nix
new file mode 100644
index 000000000000..0e14d34151a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/phx-class-registry/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "class-registry";
+  version = "4.0.6";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "todofixthis";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-kSEHgzBgnAq5rMv2HbmGl+9CUzsmzUzPQWr+5q8mcsA=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "class_registry"
+  ];
+
+  meta = with lib; {
+    description = "Factory and registry pattern for Python classes";
+    homepage = "https://class-registry.readthedocs.io/en/latest/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kevincox ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pi1wire/default.nix b/nixpkgs/pkgs/development/python-modules/pi1wire/default.nix
new file mode 100644
index 000000000000..6d3debdcaa2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pi1wire/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pi1wire";
+  version = "0.3.0";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "ushiboy";
+    repo = "pi1wire";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-l/5w71QsAW4BvILOaLdUVvQ8xxUm1ZTzUESRFzUgtic=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_find_all_sensors" # flaky
+  ];
+
+  pythonImportsCheck = [ "pi1wire" ];
+
+  meta = with lib; {
+    description = "1Wire Sensor Library for Raspberry PI";
+    homepage = "https://github.com/ushiboy/pi1wire";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/piano-transcription-inference/default.nix b/nixpkgs/pkgs/development/python-modules/piano-transcription-inference/default.nix
new file mode 100644
index 000000000000..be46384649be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/piano-transcription-inference/default.nix
@@ -0,0 +1,79 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, fetchurl
+, librosa
+, matplotlib
+, mido
+, torch
+, torchlibrosa
+}:
+
+buildPythonPackage rec {
+  pname = "piano-transcription-inference";
+  version = "0.0.5";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-nbhuSkXuWrekFxwdNHaspuag+3K1cKwq90IpATBpWPY=";
+  };
+
+  checkpoint = fetchurl {
+    name = "piano-transcription-inference.pth";
+    # The download url can be found in
+    # https://github.com/qiuqiangkong/piano_transcription_inference/blob/master/piano_transcription_inference/inference.py
+    url = "https://zenodo.org/record/4034264/files/CRNN_note_F1%3D0.9677_pedal_F1%3D0.9186.pth?download=1";
+    hash = "sha256-w/qXMHJb9Kdi8cFLyAzVmG6s2gGwJvWkolJc1geHYUE=";
+  };
+
+  propagatedBuildInputs = [
+    librosa
+    matplotlib
+    mido
+    torch
+    torchlibrosa
+  ];
+
+  patches = [
+    # Fix run against librosa 0.10.0
+    # https://github.com/qiuqiangkong/piano_transcription_inference/pull/14
+    (fetchpatch {
+      url = "https://github.com/qiuqiangkong/piano_transcription_inference/commit/b2d448916be771cd228f709c23c474942008e3e8.patch";
+      hash = "sha256-8O4VtFij//k3fhcbMRz4J8Iz4AdOPLkuk3UTxuCSy8U=";
+    })
+    (fetchpatch {
+      url = "https://github.com/qiuqiangkong/piano_transcription_inference/commit/61443632dc5ea69a072612b6fa3f7da62c96b72c.patch";
+      hash = "sha256-I9+Civ95BnPUX0WQhTU/pGQruF5ctIgkIdxCK+xO3PE=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace piano_transcription_inference/inference.py --replace \
+      "checkpoint_path='{}/piano_transcription_inference_data/note_F1=0.9677_pedal_F1=0.9186.pth'.format(str(Path.home()))" \
+      "checkpoint_path='$out/share/checkpoint.pth'"
+  '';
+
+  postInstall = ''
+    mkdir "$out/share"
+    ln -s "${checkpoint}" "$out/share/checkpoint.pth"
+  '';
+
+  # Project has no tests.
+  # In order to make pythonImportsCheck work, NUMBA_CACHE_DIR env var need to
+  # be set to a writable dir (https://github.com/numba/numba/issues/4032#issuecomment-488102702).
+  # pythonImportsCheck has no pre* hook, use checkPhase to wordaround that.
+  checkPhase = ''
+    export NUMBA_CACHE_DIR="$(mktemp -d)"
+  '';
+  pythonImportsCheck = [ "piano_transcription_inference" ];
+
+  meta = with lib; {
+    description = "A piano transcription inference package";
+    homepage = "https://github.com/qiuqiangkong/piano_transcription_inference";
+    license = licenses.mit;
+    maintainers = with maintainers; [ azuwis ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/piccata/default.nix b/nixpkgs/pkgs/development/python-modules/piccata/default.nix
new file mode 100644
index 000000000000..b43c5fd4b446
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/piccata/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "piccata";
+  version = "2.0.2";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "NordicSemiconductor";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Vuhwt+esTkvyEIRVYaRGvNMTAXVWBBv/6lpaxN5RrBA=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # No communication possible in the sandbox
+    "test_client_server_communication"
+  ];
+
+  pythonImportsCheck = [
+    "piccata"
+  ];
+
+  meta = with lib; {
+    description = "Simple CoAP (RFC7252) toolkit";
+    homepage = "https://github.com/NordicSemiconductor/piccata";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gebner ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/piccolo-theme/default.nix b/nixpkgs/pkgs/development/python-modules/piccolo-theme/default.nix
new file mode 100644
index 000000000000..3b68065a23b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/piccolo-theme/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, sphinx }:
+
+buildPythonPackage rec {
+  pname = "piccolo-theme";
+  version = "0.18.0";
+
+  src = fetchPypi {
+    pname = "piccolo_theme";
+    inherit version;
+    hash = "sha256-tEgYrQaVcWZadmhV6JRuXnk8m9oJLNSfb0hA309bX1U=";
+  };
+
+  propagatedBuildInputs = [
+    sphinx
+  ];
+
+  pythonImportsCheck = [ "piccolo_theme" ];
+
+  meta = with lib; {
+    description = "Clean and modern Sphinx theme";
+    homepage = "https://piccolo-theme.readthedocs.io";
+    license = with licenses; [ mit asl20 ];
+    maintainers = with maintainers; [ loicreynier ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pick/default.nix b/nixpkgs/pkgs/development/python-modules/pick/default.nix
new file mode 100644
index 000000000000..9292ffd76fdf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pick/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pick";
+  version = "2.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "wong2";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Py+D03bXnVsIwvYwjl0IMeH33ZPJW5TuJ3tU79MMsCw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pick"
+  ];
+
+  meta = with lib; {
+    description = "Module to create curses-based interactive selection list in the terminal";
+    homepage = "https://github.com/wong2/pick";
+    changelog = "https://github.com/wong2/pick/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pickleshare/default.nix b/nixpkgs/pkgs/development/python-modules/pickleshare/default.nix
new file mode 100644
index 000000000000..381f03bdce5c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pickleshare/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, path
+, pathlib2
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  version = "0.7.5";
+  pname = "pickleshare";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca";
+  };
+
+  propagatedBuildInputs = [ path ]
+    ++ lib.optional (pythonOlder "3.4") pathlib2;
+
+  # No proper test suite
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Tiny 'shelve'-like database with concurrency support";
+    homepage = "https://github.com/vivainio/pickleshare";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/picobox/default.nix b/nixpkgs/pkgs/development/python-modules/picobox/default.nix
new file mode 100644
index 000000000000..176c86e84f07
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/picobox/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, flask
+, hatchling
+, hatch-vcs
+, isPy27
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "picobox";
+  version = "3.0.0";
+
+  format = "pyproject";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "ikalnytskyi";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-LQiSurL+eFRJ9iQheoo66o44BlfBtAatk8deuMFROcc=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    hatchling
+    hatch-vcs
+  ];
+
+  nativeCheckInputs = [
+    flask
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "picobox"
+  ];
+
+  meta = with lib; {
+    description = "Opinionated dependency injection framework";
+    homepage = "https://github.com/ikalnytskyi/picobox";
+    license = licenses.mit;
+    maintainers = with maintainers; [ flokli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/picos/default.nix b/nixpkgs/pkgs/development/python-modules/picos/default.nix
new file mode 100644
index 000000000000..a5af53c1b8cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/picos/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitLab
+, numpy
+, cvxopt
+, python
+, networkx
+}:
+
+buildPythonPackage rec {
+  pname = "picos";
+  version = "2.0";
+
+  src = fetchFromGitLab {
+    owner = "picos-api";
+    repo = "picos";
+    rev = "v${version}";
+    sha256 = "1k65iq791k5r08gh2kc6iz0xw1wyzqik19j6iam8ip732r7jm607";
+  };
+
+  # Needed only for the tests
+  nativeCheckInputs = [
+    networkx
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    cvxopt
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} test.py
+  '';
+
+  meta = with lib; {
+    description = "A Python interface to conic optimization solvers";
+    homepage = "https://gitlab.com/picos-api/picos";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ tobiasBora ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/picosvg/default.nix b/nixpkgs/pkgs/development/python-modules/picosvg/default.nix
new file mode 100644
index 000000000000..f543b61b2bc9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/picosvg/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, absl-py
+, lxml
+, skia-pathops
+, pytestCheckHook
+}:
+buildPythonPackage rec {
+  pname = "picosvg";
+  version = "0.22.1";
+
+  src = fetchFromGitHub {
+    owner = "googlefonts";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-jG1rfamegnX8GXDwqkGFBFzUeycRLDObJvGbxNk6OpM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    absl-py
+    lxml
+    skia-pathops
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # a few tests are failing on aarch64
+  doCheck = !stdenv.isAarch64;
+
+  meta = with lib; {
+    description = "Tool to simplify SVGs";
+    homepage = "https://github.com/googlefonts/picosvg";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ _999eagle ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pid/default.nix b/nixpkgs/pkgs/development/python-modules/pid/default.nix
new file mode 100644
index 000000000000..f4ce57b3a20d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pid/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "pid";
+  version = "3.0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0e33670e83f6a33ebb0822e43a609c3247178d4a375ff50a4689e266d853eb66";
+  };
+
+  buildInputs = [ nose ];
+
+  # No tests included
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Pidfile featuring stale detection and file-locking";
+    homepage = "https://github.com/trbs/pid/";
+    license = licenses.asl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/piep/default.nix b/nixpkgs/pkgs/development/python-modules/piep/default.nix
new file mode 100644
index 000000000000..691733bfb6df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/piep/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, pygments
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  version = "0.10.0";
+  pname = "piep";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-aM7KQJZr1P0Hs2ReyRj2ItGUo+fRJ+TU3lLAU2Mu8KA=";
+  };
+
+  propagatedBuildInputs = [ pygments ];
+  nativeCheckInputs = [ nose ];
+
+  meta = with lib; {
+    description = "Bringing the power of python to stream editing";
+    homepage = "https://github.com/timbertson/piep";
+    maintainers = with maintainers; [ timbertson ];
+    license = licenses.gpl3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/piexif/default.nix b/nixpkgs/pkgs/development/python-modules/piexif/default.nix
new file mode 100644
index 000000000000..329989232fa4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/piexif/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchFromGitHub, fetchpatch, pillow }:
+
+buildPythonPackage rec {
+  pname = "piexif";
+  version = "1.1.3";
+
+  # patch does not apply to PyPI sdist due to different line endings
+  src = fetchFromGitHub {
+    owner = "hMatoba";
+    repo = "Piexif";
+    rev = version;
+    sha256 = "1akmaxq1cjr8wghwaaql1bd3sajl8psshl58lprgfsigrvnklp8b";
+  };
+
+  patches = [
+    # Fix tests with Pillow >= 7.2.0: https://github.com/hMatoba/Piexif/pull/109
+    (fetchpatch {
+      url = "https://github.com/hMatoba/Piexif/commit/5209b53e9689ce28dcd045f384633378d619718f.patch";
+      sha256 = "0ak571jf76r1vszp2g3cd5c16fz2zkbi43scayy933m5qdrhd8g1";
+    })
+  ];
+
+  # Pillow needed for unit tests
+  nativeCheckInputs = [ pillow ];
+
+  meta = with lib; {
+    description = "Simplify Exif manipulations with Python";
+    homepage = "https://github.com/hMatoba/Piexif";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pijuice/default.nix b/nixpkgs/pkgs/development/python-modules/pijuice/default.nix
new file mode 100644
index 000000000000..59f898f7906f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pijuice/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, smbus-cffi
+, urwid
+}:
+
+buildPythonPackage rec {
+  pname = "pijuice";
+  version = "1.7";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "PiSupply";
+    repo = "PiJuice";
+    # Latest commit that fixes using the library against python 3.9 by renaming
+    # isAlive() to is_alive(). The former function was removed in python 3.9.
+    rev = "e2dca1f8dcfa12e009952a882c0674a545d193d6";
+    sha256 = "07Jr7RSjqI8j0tT0MNAjrN1sjF1+mI+V0vtKInvtxj8=";
+  };
+
+  patches = [
+    # The pijuice_cli.cli file doesn't have a shebang as the first line of the
+    # script. Without it, the pythonWrapPrograms hook will not wrap the program.
+    # Add a python shebang here so that the the hook is triggered.
+    ./patch-shebang.diff
+  ];
+
+  PIJUICE_BUILD_BASE = 1;
+  PIJUICE_VERSION = version;
+
+  preBuild = ''
+    cd Software/Source
+  '';
+
+  propagatedBuildInputs = [ smbus-cffi urwid ];
+
+  # Remove the following files from the package:
+  #
+  # pijuice_cli - A precompiled ELF binary that is a setuid wrapper for calling
+  #               pijuice_cli.py
+  #
+  # pijuiceboot - a precompiled ELF binary for flashing firmware. Not needed for
+  #               the python library.
+  #
+  # pijuice_sys.py - A program that acts as a system daemon for monitoring the
+  #                  pijuice.
+  preFixup = ''
+    rm $out/bin/pijuice_cli
+    rm $out/bin/pijuice_sys.py
+    rm $out/bin/pijuiceboot
+    mv $out/bin/pijuice_cli.py $out/bin/pijuice_cli
+  '';
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Library and resources for PiJuice HAT for Raspberry Pi";
+    homepage = "https://github.com/PiSupply/PiJuice";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ hexagonal-sun ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pijuice/patch-shebang.diff b/nixpkgs/pkgs/development/python-modules/pijuice/patch-shebang.diff
new file mode 100644
index 000000000000..eb899c9a5bde
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pijuice/patch-shebang.diff
@@ -0,0 +1,9 @@
+diff --git a/Software/Source/src/pijuice_cli.py b/Software/Source/src/pijuice_cli.py
+index c366fee..37af383 100644
+--- a/Software/Source/src/pijuice_cli.py
++++ b/Software/Source/src/pijuice_cli.py
+@@ -1,3 +1,4 @@
++#!/usr/bin/python3
+ # This python script to be executed as user pijuice by the setuid program pijuice_cli 
+ # Python 3 only
+ #
diff --git a/nixpkgs/pkgs/development/python-modules/pika-pool/default.nix b/nixpkgs/pkgs/development/python-modules/pika-pool/default.nix
new file mode 100644
index 000000000000..051fdef8fe7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pika-pool/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi
+, pika
+}:
+
+buildPythonPackage rec {
+  pname = "pika-pool";
+  version = "0.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f3985888cc2788cdbd293a68a8b5702a9c955db6f7b8b551aeac91e7f32da397";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "pika >=0.9,<0.11" "pika"
+  '';
+
+  # Tests require database connections
+  doCheck = false;
+
+  propagatedBuildInputs = [ pika ];
+  meta = with lib; {
+    homepage = "https://github.com/bninja/pika-pool";
+    license = licenses.bsdOriginal;
+    description = "Pools for pikas.";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pika/default.nix b/nixpkgs/pkgs/development/python-modules/pika/default.nix
new file mode 100644
index 000000000000..ead9239f5cde
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pika/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, setuptools
+
+# dependencies
+, gevent
+, twisted
+, tornado
+
+# tests
+, nose2
+, mock
+
+}:
+
+buildPythonPackage rec {
+  pname = "pika";
+  version = "1.3.2";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pika";
+    repo = "pika";
+    rev = "refs/tags/${version}";
+    hash = "sha256-60Z+y3YXazUghfnOy4e7HzM18iju5m5OEt4I3Wg6ty4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    gevent
+    tornado
+    twisted
+  ];
+
+  nativeCheckInputs = [
+    nose2
+    mock
+  ];
+
+  postPatch = ''
+    # don't stop at first test failure
+    # don't run acceptance tests because they access the network
+    # don't report test coverage
+    substituteInPlace nose2.cfg \
+      --replace "stop = 1" "stop = 0" \
+      --replace "tests=tests/unit,tests/acceptance" "tests=tests/unit" \
+      --replace "with-coverage = 1" "with-coverage = 0"
+  '';
+
+  doCheck = false; # tests require rabbitmq instance, unsure how to skip
+
+  checkPhase = ''
+    runHook preCheck
+
+    PIKA_TEST_TLS=true nose2 -v
+
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    changelog = "https://github.com/pika/pika/releases/tag/${version}";
+    description = "Pure-Python implementation of the AMQP 0-9-1 protocol";
+    downloadPage = "https://github.com/pika/pika";
+    homepage = "https://pika.readthedocs.org";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pikepdf/default.nix b/nixpkgs/pkgs/development/python-modules/pikepdf/default.nix
new file mode 100644
index 000000000000..0891ad28ec3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pikepdf/default.nix
@@ -0,0 +1,94 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, hypothesis
+, pythonOlder
+, jbig2dec
+, deprecation
+, lxml
+, mupdf
+, packaging
+, pillow
+, psutil
+, pybind11
+, pytest-xdist
+, pytestCheckHook
+, python-dateutil
+, python-xmp-toolkit
+, qpdf
+, setuptools
+, substituteAll
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pikepdf";
+  version = "8.4.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pikepdf";
+    repo = "pikepdf";
+    rev = "v${version}";
+    # The content of .git_archival.txt is substituted upon tarball creation,
+    # which creates indeterminism if master no longer points to the tag.
+    # See https://github.com/jbarlow83/OCRmyPDF/issues/841
+    postFetch = ''
+      rm "$out/.git_archival.txt"
+    '';
+    hash = "sha256-48tb5bhmBdKVjMld07303qIi5C16yaf+5TpRPVC6EQk=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./paths.patch;
+      jbig2dec = "${lib.getBin jbig2dec}/bin/jbig2dec";
+      mudraw = "${lib.getBin mupdf}/bin/mudraw";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "shims_enabled = not cflags_defined" "shims_enabled = False"
+  '';
+
+  buildInputs = [
+    qpdf
+  ];
+
+  nativeBuildInputs = [
+    pybind11
+    setuptools
+    wheel
+  ];
+
+  nativeCheckInputs = [
+    attrs
+    hypothesis
+    pytest-xdist
+    psutil
+    pytestCheckHook
+    python-dateutil
+    python-xmp-toolkit
+  ];
+
+  propagatedBuildInputs = [
+    deprecation
+    lxml
+    packaging
+    pillow
+  ];
+
+  pythonImportsCheck = [ "pikepdf" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pikepdf/pikepdf";
+    description = "Read and write PDFs with Python, powered by qpdf";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ kiwi dotlambda ];
+    changelog = "https://github.com/pikepdf/pikepdf/blob/${src.rev}/docs/releasenotes/version${lib.versions.major version}.rst";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pikepdf/paths.patch b/nixpkgs/pkgs/development/python-modules/pikepdf/paths.patch
new file mode 100644
index 000000000000..43e472f5598a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pikepdf/paths.patch
@@ -0,0 +1,35 @@
+diff --git a/src/pikepdf/_methods.py b/src/pikepdf/_methods.py
+index 2a170c6..5ee3ba1 100644
+--- a/src/pikepdf/_methods.py
++++ b/src/pikepdf/_methods.py
+@@ -80,7 +80,7 @@ def _mudraw(buffer, fmt) -> bytes:
+         tmp_in.flush()
+ 
+         proc = run(
+-            ['mudraw', '-F', fmt, '-o', '-', tmp_in.name],
++            ['@mudraw@', '-F', fmt, '-o', '-', tmp_in.name],
+             capture_output=True,
+             check=True,
+         )
+diff --git a/src/pikepdf/jbig2.py b/src/pikepdf/jbig2.py
+index 28c596b..aff3565 100644
+--- a/src/pikepdf/jbig2.py
++++ b/src/pikepdf/jbig2.py
+@@ -28,7 +28,7 @@ def _extract_jbig2_bytes(jbig2: bytes, jbig2_globals: bytes) -> bytes:
+         output_path = Path(tmpdir) / "outfile"
+
+         args = [
+-            "jbig2dec",
++            "@jbig2dec@",
+             "--embedded",
+             "--format",
+             "png",
+@@ -88,7 +88,7 @@ class JBIG2Decoder(JBIG2DecoderInterface):
+     def _version(self) -> Version:
+         try:
+             proc = run(
+-                ['jbig2dec', '--version'], stdout=PIPE, check=True, encoding='ascii'
++                ['@jbig2dec@', '--version'], stdout=PIPE, check=True, encoding='ascii'
+             )
+         except (CalledProcessError, FileNotFoundError) as e:
+             raise DependencyError("jbig2dec - not installed or not found") from e
diff --git a/nixpkgs/pkgs/development/python-modules/pilkit/default.nix b/nixpkgs/pkgs/development/python-modules/pilkit/default.nix
new file mode 100644
index 000000000000..76f6238349a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pilkit/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pillow
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pilkit";
+  version = "3.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "matthewwithanm";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-NmD9PFCkz3lz4AnGoQUpkt35q0zvDVm+kx7lVDFBcHk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pillow
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace tox.ini \
+      --replace " --cov --cov-report term-missing:skip-covered" ""
+    substituteInPlace pilkit/processors/resize.py \
+      --replace "Image.ANTIALIAS" "Image.Resampling.LANCZOS"
+  '';
+
+  pythonImportsCheck = [
+    "pilkit"
+  ];
+
+  meta = with lib; {
+    description = "A collection of utilities and processors for the Python Imaging Library";
+    homepage = "https://github.com/matthewwithanm/pilkit/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pillow-heif/default.nix b/nixpkgs/pkgs/development/python-modules/pillow-heif/default.nix
new file mode 100644
index 000000000000..1d0505e22ed5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pillow-heif/default.nix
@@ -0,0 +1,93 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, cmake
+, nasm
+
+# native dependencies
+, libheif
+, libaom
+, libde265
+, x265
+
+# dependencies
+, pillow
+
+# tests
+, opencv4
+, numpy
+, pympler
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pillow-heif";
+  version = "0.13.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "bigcat88";
+    repo = "pillow_heif";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-GbOW29rGpLMS7AfShuO6UCzcspdHtFS7hyNKori0otI=";
+  };
+
+  postPatch = ''
+    sed -i '/addopts/d' pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    cmake
+    nasm
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  buildInputs = [
+    libaom
+    libde265
+    libheif
+    x265
+  ];
+
+  propagatedBuildInputs = [
+    pillow
+  ];
+
+  pythonImportsCheck = [
+    "pillow_heif"
+  ];
+
+  nativeCheckInputs = [
+    opencv4
+    numpy
+    pympler
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # https://github.com/bigcat88/pillow_heif/issues/89
+    # not reproducible in nixpkgs
+    "test_opencv_crash"
+  ] ++ lib.optionals (stdenv.isLinux && stdenv.isAarch64) [
+    # RuntimeError: Encoder plugin generated an error: Unsupported bit depth: Bit depth not supported by x265
+    "test_open_heif_compare_non_standard_modes_data"
+    "test_open_save_disable_16bit"
+    "test_save_bgr_16bit_to_10_12_bit"
+    "test_save_bgra_16bit_to_10_12_bit"
+    "test_premultiplied_alpha"
+    "test_hdr_save"
+    "test_I_color_modes_to_10_12_bit"
+  ];
+
+  meta = {
+    changelog = "https://github.com/bigcat88/pillow_heif/releases/tag/v${version}";
+    description = "Python library for working with HEIF images and plugin for Pillow";
+    homepage = "https://github.com/bigcat88/pillow_heif";
+    license = with lib.licenses; [ bsd3 lgpl3 ];
+    maintainers = with lib.maintainers; [ dandellion ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pillow-simd/default.nix b/nixpkgs/pkgs/development/python-modules/pillow-simd/default.nix
new file mode 100644
index 000000000000..55842f20019d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pillow-simd/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, isPyPy, isPy3k
+, olefile, freetype, libjpeg, zlib, libtiff, libwebp, libxcrypt, tcl, lcms2
+, libxcb, tk, libX11, openjpeg, libimagequant, pyroma, numpy, defusedxml
+, pytestCheckHook, setuptools
+}@args:
+
+import ../pillow/generic.nix (rec {
+  pname = "Pillow-SIMD";
+  # check for release version on https://pypi.org/project/Pillow-SIMD/#history
+  # does not match the latest pillow release version!
+  version = "9.0.0.post1";
+  format = "setuptools";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "uploadcare";
+    repo = "pillow-simd";
+    rev = "v${version}";
+    hash = "sha256-qTZYhgHjVMXqoYl3mG1xVrFaWrPidSY8HlyFQizV27Y=";
+  };
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    homepage = "https://python-pillow.github.io/pillow-perf/";
+    description = "The friendly PIL fork - SIMD version";
+    longDescription = ''
+      Pillow-SIMD is "following" Pillow. Pillow-SIMD versions are 100% compatible drop-in replacements for Pillow of the same version.
+
+      SIMD stands for "single instruction, multiple data" and its essence is in performing the same operation on multiple data points simultaneously by using multiple processing elements. Common CPU SIMD instruction sets are MMX, SSE-SSE4, AVX, AVX2, AVX512, NEON.
+
+      Currently, Pillow-SIMD can be compiled with SSE4 (default) or AVX2 support.
+    '';
+    license = licenses.hpnd;
+    maintainers = with maintainers; [ ];
+  };
+} // args )
diff --git a/nixpkgs/pkgs/development/python-modules/pillow/default.nix b/nixpkgs/pkgs/development/python-modules/pillow/default.nix
new file mode 100644
index 000000000000..3b5dffb42cf0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pillow/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, isPyPy
+, defusedxml, olefile, freetype, libjpeg, zlib, libtiff, libwebp, libxcrypt, tcl, lcms2, tk, libX11
+, libxcb, openjpeg, libimagequant, pyroma, numpy, pytestCheckHook, setuptools
+# for passthru.tests
+, imageio, matplotlib, pilkit, pydicom, reportlab
+}@args:
+
+import ./generic.nix (rec {
+  pname = "pillow";
+  version = "10.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "Pillow";
+    inherit version;
+    hash = "sha256-5r+N5sNu2WyG6jtuHVJzxT9G71GKBiRkzX713Sz5Ljg=";
+  };
+
+  passthru.tests = {
+    inherit imageio matplotlib pilkit pydicom reportlab;
+  };
+
+  meta = with lib; {
+    homepage = "https://python-pillow.org/";
+    description = "The friendly PIL fork (Python Imaging Library)";
+    longDescription = ''
+      The Python Imaging Library (PIL) adds image processing
+      capabilities to your Python interpreter.  This library
+      supports many file formats, and provides powerful image
+      processing and graphics capabilities.
+    '';
+    license = licenses.hpnd;
+    maintainers = with maintainers; [ goibhniu prikhi ];
+  };
+} // args )
diff --git a/nixpkgs/pkgs/development/python-modules/pillow/generic.nix b/nixpkgs/pkgs/development/python-modules/pillow/generic.nix
new file mode 100644
index 000000000000..5186e8a476bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pillow/generic.nix
@@ -0,0 +1,82 @@
+{ pname
+, version
+, disabled
+, src
+, patches ? []
+, meta
+, passthru ? {}
+, ...
+}@args:
+
+with args;
+
+buildPythonPackage rec {
+  inherit pname version format src meta passthru patches;
+
+  # Disable imagefont tests, because they don't work well with infinality:
+  # https://github.com/python-pillow/Pillow/issues/1259
+  postPatch = ''
+    rm Tests/test_imagefont.py
+  '';
+
+  disabledTests = [
+    # Code quality mismathch 9 vs 10
+    "test_pyroma"
+
+    # pillow-simd
+    "test_roundtrip"
+    "test_basic"
+    "test_custom_metadata"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # Disable darwin tests which require executables: `iconutil` and `screencapture`
+    "test_grab"
+    "test_grabclipboard"
+    "test_save"
+  ];
+
+  propagatedBuildInputs = [ olefile ]
+    ++ lib.optionals (lib.versionAtLeast version "8.2.0") [ defusedxml ];
+
+  nativeCheckInputs = [ pytestCheckHook pyroma numpy ];
+
+  nativeBuildInputs = [ setuptools ];
+
+  buildInputs = [ freetype libjpeg openjpeg libimagequant zlib libtiff libwebp libxcrypt tcl lcms2 ]
+    ++ lib.optionals (lib.versionAtLeast version "7.1.0") [ libxcb ]
+    ++ lib.optionals (isPyPy) [ tk libX11 ];
+
+  # NOTE: we use LCMS_ROOT as WEBP root since there is not other setting for webp.
+  # NOTE: The Pillow install script will, by default, add paths like /usr/lib
+  # and /usr/include to the search paths. This can break things when building
+  # on a non-NixOS system that has some libraries installed that are not
+  # installed in Nix (for example, Arch Linux has jpeg2000 but Nix doesn't
+  # build Pillow with this support). We patch the `disable_platform_guessing`
+  # setting here, instead of passing the `--disable-platform-guessing`
+  # command-line option, since the command-line option doesn't work when we run
+  # tests.
+  preConfigure = let
+    libinclude' = pkg: ''"${pkg.out}/lib", "${pkg.out}/include"'';
+    libinclude = pkg: ''"${pkg.out}/lib", "${pkg.dev}/include"'';
+  in ''
+    sed -i "setup.py" \
+        -e 's|^FREETYPE_ROOT =.*$|FREETYPE_ROOT = ${libinclude freetype}|g ;
+            s|^JPEG_ROOT =.*$|JPEG_ROOT = ${libinclude libjpeg}|g ;
+            s|^JPEG2K_ROOT =.*$|JPEG2K_ROOT = ${libinclude openjpeg}|g ;
+            s|^IMAGEQUANT_ROOT =.*$|IMAGEQUANT_ROOT = ${libinclude' libimagequant}|g ;
+            s|^ZLIB_ROOT =.*$|ZLIB_ROOT = ${libinclude zlib}|g ;
+            s|^LCMS_ROOT =.*$|LCMS_ROOT = ${libinclude lcms2}|g ;
+            s|^TIFF_ROOT =.*$|TIFF_ROOT = ${libinclude libtiff}|g ;
+            s|^TCL_ROOT=.*$|TCL_ROOT = ${libinclude' tcl}|g ;
+            s|self\.disable_platform_guessing = None|self.disable_platform_guessing = True|g ;'
+    export LDFLAGS="$LDFLAGS -L${libwebp}/lib"
+    export CFLAGS="$CFLAGS -I${libwebp}/include"
+  '' + lib.optionalString (lib.versionAtLeast version "7.1.0") ''
+    export LDFLAGS="$LDFLAGS -L${libxcb}/lib"
+    export CFLAGS="$CFLAGS -I${libxcb.dev}/include"
+  '' + lib.optionalString stdenv.isDarwin ''
+    # Remove impurities
+    substituteInPlace setup.py \
+      --replace '"/Library/Frameworks",' "" \
+      --replace '"/System/Library/Frameworks"' ""
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pillowfight/default.nix b/nixpkgs/pkgs/development/python-modules/pillowfight/default.nix
new file mode 100644
index 000000000000..b0a8d6d913c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pillowfight/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "pillowfight";
+  version = "0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4923f4d1e78be15f19f03a608fb34ba9cb71bf5205de3c9fe7461c49078167a7";
+  };
+
+  propagatedBuildInputs = [ pillow ];
+
+  meta = with lib; {
+    description = "Eases the transition from PIL to Pillow for Python packages";
+    homepage = "https://github.com/beanbaginc/pillowfight";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pims/default.nix b/nixpkgs/pkgs/development/python-modules/pims/default.nix
new file mode 100644
index 000000000000..5de3ec424f60
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pims/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, imageio
+, numpy
+, pytestCheckHook
+, pythonOlder
+, scikit-image
+, slicerator
+}:
+
+buildPythonPackage rec {
+  pname = "pims";
+  version = "0.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "soft-matter";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-QdllA1QTSJ8vWaSJ0XoUanX53sb4RaOmdXBCFEsoWMU=";
+  };
+
+  propagatedBuildInputs = [
+    slicerator
+    imageio
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    scikit-image
+  ];
+
+  pythonImportsCheck = [
+    "pims"
+  ];
+
+  pytestFlagsArray = [
+    "-W"
+    "ignore::Warning"
+  ];
+
+  disabledTests = [
+    # NotImplementedError: Do not know how to deal with infinite readers
+    "TestVideo_ImageIO"
+  ];
+
+  disabledTestPaths = [
+    # AssertionError: Tuples differ: (377, 505, 4) != (384, 512, 4)
+    "pims/tests/test_display.py"
+  ];
+
+  meta = with lib; {
+    description = "Module to load video and sequential images in various formats";
+    homepage = "https://github.com/soft-matter/pims";
+    changelog = "https://github.com/soft-matter/pims/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pinboard/default.nix b/nixpkgs/pkgs/development/python-modules/pinboard/default.nix
new file mode 100644
index 000000000000..8f177dab8bc3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pinboard/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchFromGitHub }:
+
+buildPythonPackage rec {
+  pname = "pinboard";
+  version = "2.1.8";
+
+  src = fetchFromGitHub {
+    owner = "lionheart";
+    repo = pname;
+    rev = version;
+    sha256 = "0ppc3vwv48ahqx6n5c7d7066zhi31cjdik0ma9chq6fscq2idgdf";
+  };
+
+  # tests require an API key
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A Python wrapper for Pinboard.in";
+    maintainers = with maintainers; [ djanatyn ];
+    license = licenses.asl20;
+    homepage = "https://github.com/lionheart/pinboard.py";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pinecone-client/default.nix b/nixpkgs/pkgs/development/python-modules/pinecone-client/default.nix
new file mode 100644
index 000000000000..62fb96fb31aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pinecone-client/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pyyaml
+, python-dateutil
+, urllib3
+, tqdm
+, dnspython
+, requests
+, typing-extensions
+, loguru
+}:
+buildPythonPackage rec {
+  pname = "pinecone-client";
+  version = "2.2.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-LBzB1mSLK+ZulE2y/6WRZqN7kWTRE1rVJdnNix4pgWg=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    pyyaml
+    python-dateutil
+    urllib3
+    tqdm
+    dnspython
+    requests
+    typing-extensions
+    loguru
+  ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://www.pinecone.io/";
+    description = "The Pinecone python client";
+    license = licenses.mit;
+    maintainers = with maintainers; [happysalada];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ping3/default.nix b/nixpkgs/pkgs/development/python-modules/ping3/default.nix
new file mode 100644
index 000000000000..c5dd49ba0d59
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ping3/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, setuptools
+, wheel
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "ping3";
+  version = "4.0.4";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-HqEqz2dS1GZmFjQf18Y5PGZM/8UQxpPvBvc2+yZ6E7o=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  pythonImportsCheck = [ "ping3" ];
+
+  meta = with lib; {
+    description = "A pure python3 version of ICMP ping implementation using raw socket";
+    homepage = "https://pypi.org/project/ping3";
+    license = licenses.mit;
+    maintainers = with maintainers; [ siraben ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pint-pandas/default.nix b/nixpkgs/pkgs/development/python-modules/pint-pandas/default.nix
new file mode 100644
index 000000000000..6cc7cd22a97d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pint-pandas/default.nix
@@ -0,0 +1,49 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, wheel
+, pint
+, pandas
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pint-pandas";
+  version = "0.4";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "hgrecco";
+    repo = "pint-pandas";
+    rev = version;
+    hash = "sha256-FuH6wksSCkkL2AyQN46hwTnfeAZFwkWRl6KEEhsxmUY=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    pint
+    pandas
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Pandas support for pint";
+    license = licenses.bsd3;
+    homepage = "https://github.com/hgrecco/pint-pandas";
+    maintainers = with maintainers; [ doronbehar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pint/default.nix b/nixpkgs/pkgs/development/python-modules/pint/default.nix
new file mode 100644
index 000000000000..9252a2a5fbe1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pint/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+# build-system
+, setuptools
+, setuptools-scm
+
+# propagates
+, typing-extensions
+
+# tests
+, pytestCheckHook
+, pytest-subtests
+, numpy
+, matplotlib
+, uncertainties
+}:
+
+buildPythonPackage rec {
+  pname = "pint";
+  version = "0.22";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "Pint";
+    hash = "sha256-LROfarvPMBbK19POwFcH/pCKxPmc9Zrt/W7mZ7emRDM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-subtests
+    numpy
+    matplotlib
+    uncertainties
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  disabledTests = [
+    # https://github.com/hgrecco/pint/issues/1825
+    "test_equal_zero_nan_NP"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/hgrecco/pint/blob/${version}/CHANGES";
+    description = "Physical quantities module";
+    license = licenses.bsd3;
+    homepage = "https://github.com/hgrecco/pint/";
+    maintainers = with maintainers; [ doronbehar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pip-api/default.nix b/nixpkgs/pkgs/development/python-modules/pip-api/default.nix
new file mode 100644
index 000000000000..48edbf2480dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pip-api/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pip
+, pretend
+, pytestCheckHook
+, pythonOlder
+, virtualenv
+}:
+
+buildPythonPackage rec {
+  pname = "pip-api";
+  version = "0.0.30";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-oF3yx6qbcVc3S89Cc1RCAaDHuuYKnGW8+E85We84lvM=";
+  };
+
+  propagatedBuildInputs = [
+    pip
+  ];
+
+  nativeCheckInputs = [
+    pretend
+    pytestCheckHook
+    virtualenv
+  ];
+
+  pythonImportsCheck = [
+    "pip_api"
+  ];
+
+  disabledTests = [
+    "test_hash"
+    "test_hash_default_algorithm_is_256"
+    "test_installed_distributions"
+    "test_invoke_install"
+    "test_invoke_uninstall"
+    "test_isolation"
+  ];
+
+  meta = with lib; {
+    description = "Importable pip API";
+    homepage = "https://github.com/di/pip-api";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pip-requirements-parser/default.nix b/nixpkgs/pkgs/development/python-modules/pip-requirements-parser/default.nix
new file mode 100644
index 000000000000..21d0679ce8ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pip-requirements-parser/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, packaging
+, pyparsing
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pip-requirements-parser";
+  version = "32.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "nexB";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-UMrwDXxk+sD3P2jk7s95y4OX6DRBjWWZZ8IhkR6tnZ4=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  dontConfigure = true;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+    pyparsing
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pip_requirements_parser"
+  ];
+
+  disabledTests = [
+    "test_RequirementsFile_to_dict"
+    "test_RequirementsFile_dumps_unparse"
+    "test_legacy_version_is_deprecated"
+  ];
+
+  meta = with lib; {
+    description = "Module to parse pip requirements";
+    homepage = "https://github.com/nexB/pip-requirements-parser";
+    changelog = "https://github.com/nexB/pip-requirements-parser/blob/v${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pip-tools/default.nix b/nixpkgs/pkgs/development/python-modules/pip-tools/default.nix
new file mode 100644
index 000000000000..1871ce74dd73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pip-tools/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, build
+, click
+, fetchPypi
+, pep517
+, pip
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+, tomli
+, tomli-w
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pip-tools";
+  version = "7.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jpyZEn/gJMAltGoLLRXHvUfxjzMibPczDTVJNmP8HR0=";
+  };
+
+  patches = [ ./fix-setup-py-bad-syntax-detection.patch ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    build
+    click
+    pep517
+    pip
+    setuptools
+    wheel
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytest-xdist
+    pytestCheckHook
+    tomli-w
+  ];
+
+  preCheck = lib.optionalString (stdenv.isDarwin && stdenv.isAarch64) ''
+    # https://github.com/python/cpython/issues/74570#issuecomment-1093748531
+    export no_proxy='*';
+  '';
+
+  disabledTests = [
+    # Tests require network access
+    "network"
+    "test_direct_reference_with_extras"
+    "test_local_duplicate_subdependency_combined"
+    "test_bad_setup_file"
+    # Assertion error
+    "test_compile_recursive_extras"
+  ];
+
+  pythonImportsCheck = [
+    "piptools"
+  ];
+
+  meta = with lib; {
+    description = "Keeps your pinned dependencies fresh";
+    homepage = "https://github.com/jazzband/pip-tools/";
+    changelog = "https://github.com/jazzband/pip-tools/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ zimbatm ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pip-tools/fix-setup-py-bad-syntax-detection.patch b/nixpkgs/pkgs/development/python-modules/pip-tools/fix-setup-py-bad-syntax-detection.patch
new file mode 100644
index 000000000000..6a88222139e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pip-tools/fix-setup-py-bad-syntax-detection.patch
@@ -0,0 +1,21 @@
+diff --color -ru a/piptools/scripts/compile.py b/piptools/scripts/compile.py
+--- a/piptools/scripts/compile.py	2022-06-30 11:24:26.000000000 +0200
++++ b/piptools/scripts/compile.py	2022-08-01 13:40:58.392515765 +0200
+@@ -6,7 +6,7 @@
+ from typing import IO, Any, BinaryIO, List, Optional, Tuple, Union, cast
+ 
+ import click
+-from build import BuildBackendException
++from build import BuildException
+ from build.util import project_wheel_metadata
+ from click.utils import LazyFile, safecall
+ from pip._internal.commands import create_command
+@@ -421,7 +421,7 @@
+                 metadata = project_wheel_metadata(
+                     os.path.dirname(os.path.abspath(src_file))
+                 )
+-            except BuildBackendException as e:
++            except (BuildException,StopIteration) as e:
+                 log.error(str(e))
+                 log.error(f"Failed to parse {os.path.abspath(src_file)}")
+                 sys.exit(2)
diff --git a/nixpkgs/pkgs/development/python-modules/pip/default.nix b/nixpkgs/pkgs/development/python-modules/pip/default.nix
new file mode 100644
index 000000000000..484a15e85876
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pip/default.nix
@@ -0,0 +1,96 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, installShellFiles
+, mock
+, scripttest
+, setuptools
+, virtualenv
+, wheel
+, pretend
+, pytest
+
+# docs
+, sphinx
+
+# coupled downsteam dependencies
+, pip-tools
+}:
+
+buildPythonPackage rec {
+  pname = "pip";
+  version = "23.2.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pypa";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-mUlzfYmq1FE3X1/2o7sYJzMgwHRI4ib4EMhpg83VvrI=";
+  };
+
+  postPatch = ''
+    # Remove vendored Windows PE binaries
+    # Note: These are unused but make the package unreproducible.
+    find -type f -name '*.exe' -delete
+  '';
+
+  nativeBuildInputs = [
+    installShellFiles
+    setuptools
+    wheel
+
+    # docs
+    sphinx
+  ];
+
+  outputs = [
+    "out"
+    "man"
+  ];
+
+  # pip uses a custom sphinx extension and unusual conf.py location, mimic the internal build rather than attempting
+  # to fit sphinxHook see https://github.com/pypa/pip/blob/0778c1c153da7da457b56df55fb77cbba08dfb0c/noxfile.py#L129-L148
+  postBuild = ''
+    cd docs
+
+    # remove references to sphinx extentions only required for html doc generation
+    # sphinx.ext.intersphinx requires network connection or packaged object.inv files for python and pypug
+    # sphinxcontrib.towncrier is not currently packaged
+    for ext in sphinx.ext.intersphinx sphinx_copybutton sphinx_inline_tabs sphinxcontrib.towncrier myst_parser; do
+      substituteInPlace html/conf.py --replace '"'$ext'",' ""
+    done
+
+    PYTHONPATH=$src/src:$PYTHONPATH sphinx-build -v \
+      -d build/doctrees/man \
+      -c html \
+      -d build/doctrees/man \
+      -b man \
+      man \
+      build/man
+    cd ..
+  '';
+
+  nativeCheckInputs = [ mock scripttest virtualenv pretend pytest ];
+
+  # Pip wants pytest, but tests are not distributed
+  doCheck = false;
+
+  postInstall = ''
+    installManPage docs/build/man/*
+
+    installShellCompletion --cmd pip \
+      --bash <($out/bin/pip completion --bash --no-cache-dir) \
+      --fish <($out/bin/pip completion --fish --no-cache-dir) \
+      --zsh <($out/bin/pip completion --zsh --no-cache-dir)
+  '';
+
+  passthru.tests = { inherit pip-tools; };
+
+  meta = {
+    description = "The PyPA recommended tool for installing Python packages";
+    license = with lib.licenses; [ mit ];
+    homepage = "https://pip.pypa.io/";
+    changelog = "https://pip.pypa.io/en/stable/news/#v${lib.replaceStrings [ "." ] [ "-" ] version}";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pipdate/default.nix b/nixpkgs/pkgs/development/python-modules/pipdate/default.nix
new file mode 100644
index 000000000000..172401620a59
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pipdate/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, appdirs
+, buildPythonPackage
+, fetchPypi
+, importlib-metadata
+, packaging
+, pythonOlder
+, requests
+, rich
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pipdate";
+  version = "0.5.6";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-G2t+wsVGj7cDbsnWss7XqKU421WqygPzAZkhbTu9Jks=";
+  };
+
+  nativeBuildInputs = [
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    appdirs
+    packaging
+    requests
+    rich
+    setuptools
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  # Tests require network access and pythonImportsCheck requires configuration file
+  doCheck = false;
+
+  meta = with lib; {
+    description = "pip update helpers";
+    homepage = "https://github.com/nschloe/pipdate";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pipdeptree/default.nix b/nixpkgs/pkgs/development/python-modules/pipdeptree/default.nix
new file mode 100644
index 000000000000..7e15814fa684
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pipdeptree/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, diff-cover
+, graphviz
+, hatchling
+, hatch-vcs
+, pytest-mock
+, pytestCheckHook
+, pip
+, virtualenv
+}:
+
+buildPythonPackage rec {
+  pname = "pipdeptree";
+  version = "2.13.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "tox-dev";
+    repo = "pipdeptree";
+    rev = "refs/tags/${version}";
+    hash = "sha256-rlnJmGe9LYwIJxV02IjiKtT1iS1O9ik8dAfjsPHsa8U=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    hatchling
+    hatch-vcs
+  ];
+
+  propagatedBuildInputs = [
+    pip
+  ];
+
+  passthru.optional-dependencies = {
+    graphviz = [
+      graphviz
+    ];
+  };
+
+  nativeCheckInputs = [
+    diff-cover
+    pytest-mock
+    pytestCheckHook
+    virtualenv
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "pipdeptree"
+  ];
+
+  disabledTests = [
+    # Don't run console tests
+    "test_console"
+  ];
+
+  meta = with lib; {
+    description = "Command line utility to show dependency tree of packages";
+    homepage = "https://github.com/tox-dev/pipdeptree";
+    changelog = "https://github.com/tox-dev/pipdeptree/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ charlesbaynham ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pipenv-poetry-migrate/default.nix b/nixpkgs/pkgs/development/python-modules/pipenv-poetry-migrate/default.nix
new file mode 100644
index 000000000000..1359096853ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pipenv-poetry-migrate/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, poetry-core
+, tomlkit
+, typer
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pipenv-poetry-migrate";
+  version = "0.5.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "yhino";
+    repo = "pipenv-poetry-migrate";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-b1ONVJzwvpuLKAtv2Rk3uUNt85mMChfGrlM+CpPACUw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    setuptools # for pkg_resources
+    tomlkit
+    typer
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "This is simple migration script, migrate pipenv to poetry";
+    homepage = "https://github.com/yhino/pipenv-poetry-migrate";
+    changelog = "https://github.com/yhino/pipenv-poetry-migrate/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/piper-phonemize/default.nix b/nixpkgs/pkgs/development/python-modules/piper-phonemize/default.nix
new file mode 100644
index 000000000000..cd09567a61e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/piper-phonemize/default.nix
@@ -0,0 +1,34 @@
+{ buildPythonPackage
+, onnxruntime-native
+, piper-phonemize-native
+, pybind11
+, setuptools
+}:
+
+buildPythonPackage {
+  inherit (piper-phonemize-native) pname version src;
+  format = "pyproject";
+
+  nativeBuildInputs = [
+    pybind11
+    setuptools
+  ];
+
+  buildInputs = [
+    onnxruntime-native
+    piper-phonemize-native
+    piper-phonemize-native.espeak-ng
+  ];
+
+  pythonImportsCheck = [
+    "piper_phonemize"
+  ];
+
+  # no tests
+  doCheck = false;
+
+  meta = {
+    description = "Phonemization libary used by Piper text to speech system";
+    inherit (piper-phonemize-native.meta) homepage license maintainers;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pipx/default.nix b/nixpkgs/pkgs/development/python-modules/pipx/default.nix
new file mode 100644
index 000000000000..ef4e789249ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pipx/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, argcomplete
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, importlib-metadata
+, packaging
+, pip
+, platformdirs
+, pytestCheckHook
+, pythonOlder
+, userpath
+}:
+
+buildPythonPackage rec {
+  pname = "pipx";
+  version = "1.2.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "pipxproject";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-eNZJXznKgamGR9yrswrrLEqUTxFhLGxWTkYbi13bebY=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    argcomplete
+    packaging
+    platformdirs
+    userpath
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  pytestFlagsArray = [
+    "--ignore=tests/test_install_all_packages.py"
+    # start local pypi server and use in tests
+    "--net-pypiserver"
+  ];
+
+  disabledTests = [
+    # disable tests which are difficult to emulate due to shell manipulations
+    "path_warning"
+    "script_from_internet"
+    "ensure_null_pythonpath"
+    # disable tests, which require internet connection
+    "install"
+    "inject"
+    "ensure_null_pythonpath"
+    "missing_interpreter"
+    "cache"
+    "internet"
+    "run"
+    "runpip"
+    "upgrade"
+    "suffix"
+    "legacy_venv"
+    "determination"
+    "json"
+    "test_list_short"
+  ];
+
+  meta = with lib; {
+    description = "Install and run Python applications in isolated environments";
+    homepage = "https://github.com/pipxproject/pipx";
+    changelog = "https://github.com/pypa/pipx/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ yshym ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pivy/default.nix b/nixpkgs/pkgs/development/python-modules/pivy/default.nix
new file mode 100644
index 000000000000..9d0b7f65f636
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pivy/default.nix
@@ -0,0 +1,49 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pkgs, qtbase, qmake, soqt }:
+
+buildPythonPackage rec {
+  pname = "pivy";
+  version = "0.6.8";
+
+  src = fetchFromGitHub {
+    owner = "coin3d";
+    repo = "pivy";
+    rev = "refs/tags/${version}";
+    hash = "sha256-y72nzZAelyRDR2JS73/0jo2x/XiDZpsERPZV3gzIhAI=";
+  };
+
+  dontUseCmakeConfigure = true;
+
+  nativeBuildInputs = with pkgs; [
+    swig qmake cmake
+  ];
+
+  buildInputs = with pkgs; with xorg; [
+    coin3d soqt qtbase
+    libGLU libGL
+    libXi libXext libSM libICE libX11
+  ];
+
+  env.NIX_CFLAGS_COMPILE = toString [
+    "-I${qtbase.dev}/include/QtCore"
+    "-I${qtbase.dev}/include/QtGui"
+    "-I${qtbase.dev}/include/QtOpenGL"
+    "-I${qtbase.dev}/include/QtWidgets"
+  ];
+
+  dontUseQmakeConfigure = true;
+  dontWrapQtApps =true;
+  doCheck = false;
+
+  postPatch = ''
+    substituteInPlace distutils_cmake/CMakeLists.txt --replace \$'{SoQt_INCLUDE_DIRS}' \
+      \$'{Coin_INCLUDE_DIR}'\;\$'{SoQt_INCLUDE_DIRS}'
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/coin3d/pivy/";
+    description = "A Python binding for Coin";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ gebner ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pixcat/default.nix b/nixpkgs/pkgs/development/python-modules/pixcat/default.nix
new file mode 100644
index 000000000000..90fdae5dcf03
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pixcat/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, blessed
+, docopt
+, pillow
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pixcat";
+  version = "0.1.4";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "657c8fe04513caecccd6086b347aa4b85db6b4c0f761b162cb9cd789abe7abb6";
+  };
+
+  propagatedBuildInputs = [
+    blessed
+    docopt
+    pillow
+    requests
+  ];
+
+  pythonImportsCheck = [ "pixcat" ];
+
+  meta = with lib; {
+    description = "Display images on a kitty terminal with optional resizing";
+    homepage = "https://github.com/mirukan/pixcat";
+    license = licenses.lgpl3;
+    maintainers = [ maintainers.tilcreator ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pixel-ring/default.nix b/nixpkgs/pkgs/development/python-modules/pixel-ring/default.nix
new file mode 100644
index 000000000000..c88715270bd7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pixel-ring/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, wheel
+, pyusb
+, spidev
+}:
+
+buildPythonPackage rec {
+  pname = "pixel-ring";
+  version = "0.1.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "respeaker";
+    repo = "pixel_ring";
+    rev = version;
+    hash = "sha256-J9kScjD6Xon0YWGxFU881bIbjmDpY7cnWzJ8G0SOKaw=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    pyusb
+    spidev
+  ];
+
+  dontUsePythonImportsCheck = true; # requires SPI access
+
+  doCheck = false; # no tests
+
+  meta = with lib; {
+    description = "RGB LED library for ReSpeaker 4 Mic Array, ReSpeaker V2 & ReSpeaker USB 6+1 Mic Array";
+    homepage = "https://github.com/respeaker/pixel_ring/tree/master";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pixelmatch/default.nix b/nixpkgs/pkgs/development/python-modules/pixelmatch/default.nix
new file mode 100644
index 000000000000..b6a7b74701cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pixelmatch/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchgit
+, pillow
+, poetry-core
+, pytest-benchmark
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pixelmatch";
+  version = "0.2.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  # Test fixtures are stored in LFS
+  src = fetchgit {
+    url = "https://github.com/whtsky/pixelmatch-py";
+    rev = "v${version}";
+    hash = "sha256-/zRQhwz+HjT0Hs4CunsqHxHWEtoIH9qMBowRb0Pps6Y=";
+    fetchLFS = true;
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pillow
+    pytest-benchmark
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--benchmark-disable"
+  ];
+
+  pythonImportsCheck = [
+    "pixelmatch"
+  ];
+
+  meta = with lib; {
+    description = "Pixel-level image comparison library";
+    homepage = "https://github.com/whtsky/pixelmatch-py";
+    license = licenses.isc;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pkce/default.nix b/nixpkgs/pkgs/development/python-modules/pkce/default.nix
new file mode 100644
index 000000000000..ecd128744d07
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pkce/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pkce";
+  version = "1.0.3";
+
+  src = fetchFromGitHub {
+    owner = "RomeoDespres";
+    repo = pname;
+    rev = version;
+    hash = "sha256-dOHCu0pDXk9LM4Yobaz8GAfVpBd8rXlty+Wfhx+WPME=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "pkce" ];
+
+  meta = with lib; {
+    description = "Python module to work with PKCE";
+    homepage = "https://github.com/RomeoDespres/pkce";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pkg-about/default.nix b/nixpkgs/pkgs/development/python-modules/pkg-about/default.nix
new file mode 100644
index 000000000000..2c1e92c75d84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pkg-about/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, importlib-metadata
+, importlib-resources
+, setuptools
+, packaging
+, tomli
+}:
+
+buildPythonPackage rec {
+  pname = "pkg-about";
+  version = "1.0.8";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "pkg_about";
+    inherit version;
+    extension = "zip";
+    hash = "sha256-mb43XbKypgilagXLW33kP8wXxioNsfLtl6AEnOI1WlA=";
+  };
+
+  # tox is listed in build requirements but not actually used to build
+  # keeping it as a requirement breaks the build unnecessarily
+  postPatch = ''
+    sed  -i "/requires/s/, 'tox>=3.25.1'//"  pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    packaging
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    importlib-metadata
+    importlib-resources
+    packaging
+    setuptools
+    tomli
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pkg_about"
+  ];
+
+  meta = with lib; {
+    description = "Python metadata sharing at runtime";
+    homepage = "https://github.com/karpierz/pkg_about/";
+    changelog = "https://github.com/karpierz/pkg_about/blob/${version}/CHANGES.rst";
+    license = licenses.zlib;
+    maintainers = [ teams.ororatech ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pkgconfig/default.nix b/nixpkgs/pkgs/development/python-modules/pkgconfig/default.nix
new file mode 100644
index 000000000000..89fc2fd32f74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pkgconfig/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, poetry-core
+, pkg-config
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pkgconfig";
+  version = "1.5.5";
+  format = "pyproject";
+
+  inherit (pkg-config)
+    setupHooks
+    wrapperName
+    suffixSalt
+    targetPrefix
+    baseBinName
+    ;
+
+  src = fetchFromGitHub {
+    owner = "matze";
+    repo = "pkgconfig";
+    rev = "v${version}";
+    hash = "sha256-uuLUGRNLCR3NS9g6OPCI+qG7tPWsLhI3OE5WmSI3vm8=";
+  };
+
+  postPatch = ''
+    substituteInPlace pkgconfig/pkgconfig.py \
+      --replace "pkg_config_exe = os.environ.get('PKG_CONFIG', None) or 'pkg-config'" "pkg_config_exe = '${pkg-config}/bin/${pkg-config.targetPrefix}pkg-config'"
+
+    # those pc files are missing and pkg-config validates that they exist
+    substituteInPlace data/fake-openssl.pc \
+      --replace "Requires: libssl libcrypto" ""
+  '';
+
+  nativeBuildInputs = [ poetry-core ];
+
+  # ModuleNotFoundError: No module named 'distutils'
+  # https://github.com/matze/pkgconfig/issues/64
+  doCheck = pythonOlder "3.12";
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "pkgconfig" ];
+
+  meta = with lib; {
+    description = "Interface Python with pkg-config";
+    homepage = "https://github.com/matze/pkgconfig";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pkginfo/default.nix b/nixpkgs/pkgs/development/python-modules/pkginfo/default.nix
new file mode 100644
index 000000000000..9fd8fa40dc79
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pkginfo/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pkginfo";
+  version = "1.9.6";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-j9WJbocYpDcvDqnMnZb2QXybmG4jpNEW3aJrYswp0EY=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pkginfo"
+  ];
+
+  meta = with lib; {
+    description = "Query metadatdata from sdists, bdists or installed packages";
+    homepage = "https://pythonhosted.org/pkginfo/";
+    longDescription = ''
+      This package provides an API for querying the distutils metadata
+      written in the PKG-INFO file inside a source distriubtion (an sdist)
+      or a binary distribution (e.g., created by running bdist_egg). It can
+      also query the EGG-INFO directory of an installed distribution, and the
+      *.egg-info stored in a “development checkout” (e.g, created by running
+      setup.py develop).
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pkginfo2/default.nix b/nixpkgs/pkgs/development/python-modules/pkginfo2/default.nix
new file mode 100644
index 000000000000..08eee37498bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pkginfo2/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pkginfo2";
+  version = "30.0.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nexB";
+    repo = "pkginfo2";
+    rev = "v${version}";
+    hash = "sha256-E9EyaN3ncf/34vvvhRe0rwV28VrjqJo79YFgXq2lKWU=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pkginfo2"
+  ];
+
+  meta = with lib; {
+    description = "Query metadatdata from sdists, bdists or installed packages";
+    homepage = "https://github.com/nexB/pkginfo2";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pkgutil-resolve-name/default.nix b/nixpkgs/pkgs/development/python-modules/pkgutil-resolve-name/default.nix
new file mode 100644
index 000000000000..ddb610b53bcf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pkgutil-resolve-name/default.nix
@@ -0,0 +1,45 @@
+{ buildPythonPackage
+, fetchPypi
+, fetchpatch
+, lib
+, nix-update-script
+, pythonOlder
+, flit-core
+}:
+buildPythonPackage rec {
+  pname = "pkgutil-resolve-name";
+  version = "1.3.10";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "pkgutil_resolve_name";
+    inherit version;
+    hash = "sha256-NX1snmp1VlPP14iTgXwIU682XdUeyX89NYqBk3O70XQ=";
+  };
+
+  patches = [
+    # Raise flit-core version constrains
+    (fetchpatch { # https://github.com/graingert/pkgutil-resolve-name/pull/5
+      url = "https://github.com/graingert/pkgutil-resolve-name/commit/042834290c735fa836bb308ce9e93c9f64d67cbe.patch";
+      hash = "sha256-M1rcrkdFcoFa3IncPnJaRhnXbelyk56QnMGtmgB6bvk=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  passthru.updateScript = nix-update-script { };
+
+  meta = {
+    homepage = "https://pypi.org/project/pkgutil_resolve_name/";
+    description = "A backport of Python 3.9’s pkgutil.resolve_name.";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ yajo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pkuseg/default.nix b/nixpkgs/pkgs/development/python-modules/pkuseg/default.nix
new file mode 100644
index 000000000000..474d66dafc63
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pkuseg/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, pythonAtLeast
+, cython
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "pkuseg";
+  version = "0.0.25";
+
+  disabled = !isPy3k || pythonAtLeast "3.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "148yp0l7h8cflxag62pc1iwj5b5liyljnaxwfjaiqwl96vwjn0fx";
+  };
+
+  # Does not seem to have actual tests, but unittest discover
+  # recognizes some non-tests as tests and fails.
+  doCheck = false;
+
+  nativeBuildInputs = [ cython ];
+
+  propagatedBuildInputs = [ numpy ];
+
+  pythonImportsCheck = [ "pkuseg" ];
+
+  meta = with lib; {
+    description = "Toolkit for multi-domain Chinese word segmentation";
+    homepage = "https://github.com/lancopku/pkuseg-python";
+    license = licenses.unfree;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pkutils/default.nix b/nixpkgs/pkgs/development/python-modules/pkutils/default.nix
new file mode 100644
index 000000000000..e3957533ea99
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pkutils/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose3
+, pythonOlder
+, pythonRelaxDepsHook
+, semver
+}:
+
+buildPythonPackage rec {
+  pname = "pkutils";
+  version = "3.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "reubano";
+    repo = "pkutils";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-AK+xX+LPz6IVLZedsqMUm7G28ue0s3pXgIzxS4EHHLE=";
+  };
+
+  pythonRelaxDeps = [
+    "semver"
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    semver
+  ];
+
+  nativeCheckInputs = [
+    nose3
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    nosetests
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "pkutils"
+  ];
+
+  meta = with lib; {
+    description = "A Python packaging utility library";
+    homepage = "https://github.com/reubano/pkutils/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plac/default.nix b/nixpkgs/pkgs/development/python-modules/plac/default.nix
new file mode 100644
index 000000000000..a1822fe5157d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plac/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "plac";
+  version = "1.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ialbert";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-BH6NKbDMhlNuo+orIEweABNSVZv1K9VrZBrCIs6H6BU=";
+  };
+
+  # tests are broken, see https://github.com/ialbert/plac/issues/74
+  doCheck = false;
+
+  checkPhase = ''
+    runHook preCheck
+
+    ${python.interpreter} doc/test_plac.py
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "plac"
+  ];
+
+  meta = with lib; {
+    description = "Parsing the Command Line the Easy Way";
+    homepage = "https://github.com/micheles/plac";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plaid-python/default.nix b/nixpkgs/pkgs/development/python-modules/plaid-python/default.nix
new file mode 100644
index 000000000000..1fcff9e47803
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plaid-python/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nulltype
+, python-dateutil
+, urllib3
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "plaid-python";
+  version = "18.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-1OV/oybxZXF2kjLoSA2KyQaTR91jqEWstpELSlUIg2o=";
+  };
+
+  propagatedBuildInputs = [
+    nulltype
+    python-dateutil
+    urllib3
+  ];
+
+  # Tests require a Client IP
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "plaid"
+  ];
+
+  meta = with lib; {
+    description = "Python client library for the Plaid API and Link";
+    homepage = "https://github.com/plaid/plaid-python";
+    changelog = "https://github.com/plaid/plaid-python/blob/master/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bhipple ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plantuml-markdown/default.nix b/nixpkgs/pkgs/development/python-modules/plantuml-markdown/default.nix
new file mode 100644
index 000000000000..7ba83b6b9fbc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plantuml-markdown/default.nix
@@ -0,0 +1,70 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, plantuml
+, markdown
+, requests
+, six
+, runCommand
+, writeText
+, plantuml-markdown
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "plantuml-markdown";
+  version = "3.9.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mikitex70";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-k4Xs1w/26QAfNdJY6P1gpJkBzg/tWi7vDFKZi7naVHo=";
+  };
+
+  propagatedBuildInputs = [
+    plantuml
+    markdown
+    requests
+    six
+  ];
+
+  # The package uses a custom script that downloads a certain version of plantuml for testing.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "plantuml_markdown"
+  ];
+
+  passthru.tests.example-doc =
+    let
+      exampleDoc = writeText "plantuml-markdown-example-doc.md" ''
+        ```plantuml
+          Bob -> Alice: Hello
+        ```
+      '';
+    in
+    runCommand "plantuml-markdown-example-doc"
+      {
+        nativeBuildInputs = [ plantuml-markdown ];
+      } ''
+      markdown_py -x plantuml_markdown ${exampleDoc} > $out
+
+      ! grep -q "Error" $out
+    '';
+
+  meta = with lib; {
+    description = "PlantUML plugin for Python-Markdown";
+    longDescription = ''
+      This plugin implements a block extension which can be used to specify a PlantUML
+      diagram which will be converted into an image and inserted in the document.
+    '';
+    homepage = "https://github.com/mikitex70/plantuml-markdown";
+    changelog = "https://github.com/mikitex70/plantuml-markdown/releases/tag/${version}";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ nikstur ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plantuml/default.nix b/nixpkgs/pkgs/development/python-modules/plantuml/default.nix
new file mode 100644
index 000000000000..b9d7c15f8346
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plantuml/default.nix
@@ -0,0 +1,36 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+  # Runtime dependencies
+, httplib2
+, six
+}:
+
+buildPythonPackage {
+  pname = "plantuml";
+  version = "0.3.0";
+
+  src = fetchFromGitHub {
+    owner = "dougn";
+    repo = "python-plantuml";
+    rev = "93e1aac25b17d896b0d05d0a1aa352c7bd11dd31";
+    hash = "sha256-aPXPqoKlu8VLi0Jn84brG7v3qM9L18Ut4sabYYGb3qQ=";
+  };
+
+  propagatedBuildInputs = [
+    httplib2
+    six
+  ];
+
+  # Project does not contain a test suite
+  doCheck = false;
+
+  pythonImportsCheck = [ "plantuml" ];
+
+  meta = with lib; {
+    description = "Python interface to a plantuml web service instead of having to run java locally";
+    homepage = "https://github.com/dougn/python-plantuml";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ nikstur ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plaster-pastedeploy/default.nix b/nixpkgs/pkgs/development/python-modules/plaster-pastedeploy/default.nix
new file mode 100644
index 000000000000..9e6263351daa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plaster-pastedeploy/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, plaster
+, pastedeploy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "plaster-pastedeploy";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    pname = "plaster_pastedeploy";
+    inherit version;
+    hash = "sha256-viYubS5BpyZIddqi/ihQy7BhVyi83JKCj9xyc244FBI=";
+  };
+
+  propagatedBuildInputs = [ plaster pastedeploy ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "PasteDeploy binding to the plaster configuration loader";
+    homepage = "https://github.com/Pylons/plaster_pastedeploy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plaster/default.nix b/nixpkgs/pkgs/development/python-modules/plaster/default.nix
new file mode 100644
index 000000000000..f3ba127b0a92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plaster/default.nix
@@ -0,0 +1,19 @@
+{ buildPythonPackage, fetchPypi
+, pytest, pytest-cov
+}:
+
+buildPythonPackage rec {
+  pname = "plaster";
+  version = "1.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+L78VL+MEUfBCrQCl+yEwmdvotTqXW9STZQ2qAB075g=";
+  };
+
+  checkPhase = ''
+    py.test
+  '';
+
+  nativeCheckInputs = [ pytest pytest-cov ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/platformdirs/default.nix b/nixpkgs/pkgs/development/python-modules/platformdirs/default.nix
new file mode 100644
index 000000000000..777ba72bcc2c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/platformdirs/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, appdirs
+, buildPythonPackage
+, fetchFromGitHub
+, hatch-vcs
+, hatchling
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "platformdirs";
+  version = "3.10.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Ytilbs29oxuwLfoKTXNQxlh8qBF39F2ZRK8imd57A1w=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    hatchling
+    hatch-vcs
+  ];
+
+  nativeCheckInputs = [
+    appdirs
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "platformdirs"
+  ];
+
+  meta = with lib; {
+    description = "Module for determining appropriate platform-specific directories";
+    homepage = "https://platformdirs.readthedocs.io/";
+    changelog = "https://github.com/platformdirs/platformdirs/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/playsound/default.nix b/nixpkgs/pkgs/development/python-modules/playsound/default.nix
new file mode 100644
index 000000000000..799bf70457bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/playsound/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "playsound";
+  version = "1.3.0";
+
+  src = fetchFromGitHub {
+    owner = "TaylorSMarks";
+    repo = "playsound";
+    rev = "v${version}";
+    sha256 = "0jbq641lmb0apq4fy6r2zyag8rdqgrz8c4wvydzrzmxrp6yx6wyd";
+  };
+
+  doCheck = false;
+
+  pythonImportsCheck = [ "playsound" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/TaylorSMarks/playsound";
+    description = "Pure Python, cross platform, single function module with no dependencies for playing sounds";
+    license = licenses.mit;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ luc65r ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/playwright/default.nix b/nixpkgs/pkgs/development/python-modules/playwright/default.nix
new file mode 100644
index 000000000000..575ffeff5a6b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/playwright/default.nix
@@ -0,0 +1,108 @@
+{ lib
+, auditwheel
+, buildPythonPackage
+, git
+, greenlet
+, fetchFromGitHub
+, pyee
+, python
+, pythonOlder
+, setuptools
+, setuptools-scm
+, playwright-driver
+}:
+
+let
+  driver = playwright-driver;
+in
+buildPythonPackage rec {
+  pname = "playwright";
+  # run ./pkgs/development/python-modules/playwright/update.sh to update
+  version = "1.40.0";
+  pyproject = true;
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "microsoft";
+    repo = "playwright-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+gq/aFq/rQpl04LbaZXGxL35iIX1Wi/motYg5jwv91I=";
+  };
+
+  patches = [
+    # This patches two things:
+    # - The driver location, which is now a static package in the Nix store.
+    # - The setup script, which would try to download the driver package from
+    #   a CDN and patch wheels so that they include it. We don't want this
+    #   we have our own driver build.
+    ./driver-location.patch
+  ];
+
+  postPatch = ''
+    # if setuptools_scm is not listing files via git almost all python files are excluded
+    export HOME=$(mktemp -d)
+    git init .
+    git add -A .
+    git config --global user.email "nixpkgs"
+    git config --global user.name "nixpkgs"
+    git commit -m "workaround setuptools-scm"
+
+    substituteInPlace setup.py \
+      --replace "setuptools-scm==8.0.4" "setuptools-scm" \
+      --replace "wheel==0.41.2" "wheel"
+
+    substituteInPlace pyproject.toml \
+      --replace 'requires = ["setuptools==68.2.2", "setuptools-scm==8.0.4", "wheel==0.41.2", "auditwheel==5.4.0"]' \
+                'requires = ["setuptools", "setuptools-scm", "wheel", "auditwheel"]' \
+      --replace 'version_file = "playwright/_repo_version.py"' ""
+    # FIXME version_file is available in setuptools-scm>=8.0.0
+    echo "__version__ = version = '${version}'" > playwright/_repo_version.py
+
+    # Skip trying to download and extract the driver.
+    # This is done manually in postInstall instead.
+    substituteInPlace setup.py \
+      --replace "self._download_and_extract_local_driver(base_wheel_bundles)" ""
+
+    # Set the correct driver path with the help of a patch in patches
+    substituteInPlace playwright/_impl/_driver.py \
+      --replace "@driver@" "${driver}/bin/playwright"
+  '';
+
+
+  nativeBuildInputs = [ git setuptools-scm setuptools auditwheel ];
+
+  propagatedBuildInputs = [
+    greenlet
+    pyee
+  ];
+
+  postInstall = ''
+    ln -s ${driver} $out/${python.sitePackages}/playwright/driver
+  '';
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  # Skip tests because they require network access.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "playwright"
+  ];
+
+  passthru = {
+    inherit driver;
+    tests = {
+      driver = playwright-driver;
+      browsers = playwright-driver.browsers;
+    };
+    updateScript = ./update.sh;
+  };
+
+  meta = with lib; {
+    description = "Python version of the Playwright testing and automation library";
+    homepage = "https://github.com/microsoft/playwright-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ techknowlogick yrd ];
+    platforms = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/playwright/driver-location.patch b/nixpkgs/pkgs/development/python-modules/playwright/driver-location.patch
new file mode 100644
index 000000000000..a7f79840c65d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/playwright/driver-location.patch
@@ -0,0 +1,47 @@
+diff --git a/playwright/_impl/_driver.py b/playwright/_impl/_driver.py
+index f3b911f..d00e509 100644
+--- a/playwright/_impl/_driver.py
++++ b/playwright/_impl/_driver.py
+@@ -23,11 +23,7 @@ from playwright._repo_version import version
+ 
+ 
+ def compute_driver_executable() -> Path:
+-    package_path = Path(inspect.getfile(playwright)).parent
+-    platform = sys.platform
+-    if platform == "win32":
+-        return package_path / "driver" / "playwright.cmd"
+-    return package_path / "driver" / "playwright.sh"
++   return Path("@driver@")
+ 
+ 
+ if sys.version_info.major == 3 and sys.version_info.minor == 7:
+diff --git a/setup.py b/setup.py
+index 3487a6a..05112c2 100644
+--- a/setup.py
++++ b/setup.py
+@@ -141,25 +141,8 @@ class PlaywrightBDistWheelCommand(BDistWheelCommand):
+         base_wheel_location: str = glob.glob(os.path.join(self.dist_dir, "*.whl"))[0]
+         without_platform = base_wheel_location[:-7]
+         for wheel_bundle in wheels:
+-            download_driver(wheel_bundle["zip_name"])
+-            zip_file = (
+-                f"driver/playwright-{driver_version}-{wheel_bundle['zip_name']}.zip"
+-            )
+-            with zipfile.ZipFile(zip_file, "r") as zip:
+-                extractall(zip, f"driver/{wheel_bundle['zip_name']}")
+             wheel_location = without_platform + wheel_bundle["wheel"]
+             shutil.copy(base_wheel_location, wheel_location)
+-            with zipfile.ZipFile(wheel_location, "a") as zip:
+-                driver_root = os.path.abspath(f"driver/{wheel_bundle['zip_name']}")
+-                for dir_path, _, files in os.walk(driver_root):
+-                    for file in files:
+-                        from_path = os.path.join(dir_path, file)
+-                        to_path = os.path.relpath(from_path, driver_root)
+-                        zip.write(from_path, f"playwright/driver/{to_path}")
+-                zip.writestr(
+-                    "playwright/driver/README.md",
+-                    f"{wheel_bundle['wheel']} driver package",
+-                )
+         os.remove(base_wheel_location)
+         if InWheel:
+             for whlfile in glob.glob(os.path.join(self.dist_dir, "*.whl")):
diff --git a/nixpkgs/pkgs/development/python-modules/playwright/update.sh b/nixpkgs/pkgs/development/python-modules/playwright/update.sh
new file mode 100755
index 000000000000..23c327608865
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/playwright/update.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i bash -p curl gnused nix-prefetch common-updater-scripts node2nix jq
+set -euo pipefail
+
+root="$(dirname "$(readlink -f "$0")")"
+driver_file="$root/../../web/playwright/driver.nix"
+playwright_test="$root/../../web/playwright-test"
+
+version=$(curl ${GITHUB_TOKEN:+" -u \":$GITHUB_TOKEN\""} -s https://api.github.com/repos/microsoft/playwright-python/releases/latest | jq -r '.tag_name | sub("^v"; "")')
+
+# Most of the time, this should be the latest stable release of the Node-based
+# Playwright version, but that isn't a guarantee, so this needs to be specified
+# as well:
+setup_py_url="https://github.com/microsoft/playwright-python/raw/v${version}/setup.py"
+driver_version=$(curl -Ls "$setup_py_url" | grep '^driver_version =' | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+')
+
+fetch_driver_arch() {
+  nix-prefetch-url "https://playwright.azureedge.net/builds/driver/playwright-${driver_version}-${1}.zip"
+}
+
+replace_sha() {
+  sed -i "s|$1 = \".\{44,52\}\"|$1 = \"$2\"|" "$driver_file"
+}
+
+# Replace SHAs for the driver downloads
+replace_sha "x86_64-linux" "$(fetch_driver_arch "linux")"
+replace_sha "x86_64-darwin" "$(fetch_driver_arch "mac")"
+replace_sha "aarch64-linux" "$(fetch_driver_arch "linux-arm64")"
+replace_sha "aarch64-darwin" "$(fetch_driver_arch "mac-arm64")"
+
+# Update the version stamps
+sed -i "s/version =\s*\"[^\$]*\"/version = \"$driver_version\"/" "$driver_file"
+sed -i "s/\"@playwright\/test\": \"[^\$]*\"/\"@playwright\/test\": \"$driver_version\"/" "$playwright_test/node-packages.json"
+(cd "$playwright_test"; node2nix -i node-packages.json)
+update-source-version playwright "$version" --rev="v$version"
diff --git a/nixpkgs/pkgs/development/python-modules/pleroma-bot/default.nix b/nixpkgs/pkgs/development/python-modules/pleroma-bot/default.nix
new file mode 100644
index 000000000000..65dd403c21da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pleroma-bot/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, requests-mock
+, oauthlib
+, requests-oauthlib
+, requests
+, pyaml
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pleroma-bot";
+  version = "0.8.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "robertoszek";
+    repo = pname;
+    rev = version;
+    hash = "sha256-vJxblpf3NMSyYMHeWG7vHP5AeluTtMtVxOsHgvGDHeA=";
+  };
+
+  propagatedBuildInputs = [
+    pyaml
+    requests
+    requests-oauthlib
+    oauthlib
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pythonImportsCheck = [
+    "pleroma_bot"
+  ];
+
+  meta = with lib; {
+    description = "Bot for mirroring one or multiple Twitter accounts in Pleroma/Mastodon";
+    homepage = "https://robertoszek.github.io/pleroma-bot/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ robertoszek ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plexapi/default.nix b/nixpkgs/pkgs/development/python-modules/plexapi/default.nix
new file mode 100644
index 000000000000..47ce92cc68f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plexapi/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, tqdm
+, websocket-client
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "plexapi";
+  version = "4.15.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pkkid";
+    repo = "python-plexapi";
+    rev = "refs/tags/${version}";
+    hash = "sha256-VU1HVAxAOraTd4VQIqG/MLkw77xciCICIh1zbzGn/dQ=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    tqdm
+    websocket-client
+  ];
+
+  # Tests require a running Plex instance
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "plexapi"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for the Plex API";
+    homepage = "https://github.com/pkkid/python-plexapi";
+    changelog = "https://github.com/pkkid/python-plexapi/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ colemickens ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plexauth/default.nix b/nixpkgs/pkgs/development/python-modules/plexauth/default.nix
new file mode 100644
index 000000000000..c7c9c2ba5dbd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plexauth/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchFromGitHub, aiohttp, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "plexauth";
+  version = "0.0.6";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "jjlawren";
+    repo = "python-plexauth";
+    rev = "v${version}";
+    sha256 = "1wy6syz3cgfw28zvigh2br4jabg8rzpi5l0bhfb6vjjc7aam13ag";
+  };
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  # package does not include tests
+  doCheck = false;
+
+  # at least guarantee the module can be imported
+  pythonImportsCheck = [
+    "plexauth"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jjlawren/python-plexauth/";
+    description = "Handles the authorization flow to obtain tokens from Plex.tv via external redirection";
+    license = licenses.mit;
+    maintainers = with maintainers; [ colemickens ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plexwebsocket/default.nix b/nixpkgs/pkgs/development/python-modules/plexwebsocket/default.nix
new file mode 100644
index 000000000000..eaaed97c01b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plexwebsocket/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "plexwebsocket";
+  version = "0.0.14";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jjlawren";
+    repo = "python-plexwebsocket";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-gT9RWpaR33ROs6ttjH2joNPi99Ng94Tp/R9eZY1eGZk=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Package does not include tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "plexwebsocket"
+  ];
+
+  meta = with lib; {
+    description = "Library to react to events issued over Plex websockets";
+    homepage = "https://github.com/jjlawren/python-plexwebsocket/";
+    changelog = "https://github.com/jjlawren/python-plexwebsocket/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ colemickens ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plone-testing/default.nix b/nixpkgs/pkgs/development/python-modules/plone-testing/default.nix
new file mode 100644
index 000000000000..13114dd78456
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plone-testing/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, zope_testing
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "plone.testing";
+  version = "8.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "39bc23bbb59b765702090ad61fe579f8bd9fe1f005f4dd1c2988a5bd1a71faf0";
+  };
+
+  propagatedBuildInputs = [ six setuptools zope_testing ];
+
+  # Huge amount of testing dependencies (including Zope2)
+  doCheck = false;
+
+  meta = {
+    description = "Testing infrastructure for Zope and Plone projects";
+    homepage = "https://github.com/plone/plone.testing";
+    license = lib.licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plotext/default.nix b/nixpkgs/pkgs/development/python-modules/plotext/default.nix
new file mode 100644
index 000000000000..8c6d0b39985c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plotext/default.nix
@@ -0,0 +1,30 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "plotext";
+  version = "5.2.8";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "piccolomo";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-V7N7p5RxLKYLmJeojikYJ/tT/IpVGzG3ZPVvUisDAVs=";
+  };
+
+  # Package does not have a conventional test suite that can be run with either
+  # `pytestCheckHook` or the standard setuptools testing situation.
+  doCheck = false;
+
+  pythonImportsCheck = [ "plotext" ];
+
+  meta = with lib; {
+    description = "Plotting directly in the terminal";
+    homepage = "https://github.com/piccolomo/plotext";
+    license = licenses.mit;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plotly/default.nix b/nixpkgs/pkgs/development/python-modules/plotly/default.nix
new file mode 100644
index 000000000000..4698a84cefb1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plotly/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytz
+, requests
+, six
+, tenacity
+}:
+
+buildPythonPackage rec {
+  pname = "plotly";
+  version = "5.16.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-KVrCXt6xjIk6u3Hcrc6gdbeP1v3wfO5CF6ThAJZnkls=";
+  };
+
+  propagatedBuildInputs = [
+    pytz
+    requests
+    six
+    tenacity
+  ];
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python plotting library for collaborative, interactive, publication-quality graphs";
+    homepage = "https://plot.ly/python/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plotnine/default.nix b/nixpkgs/pkgs/development/python-modules/plotnine/default.nix
new file mode 100644
index 000000000000..241dced9f7e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plotnine/default.nix
@@ -0,0 +1,87 @@
+{ lib
+, adjusttext
+, buildPythonPackage
+, fetchPypi
+, geopandas
+, matplotlib
+, mizani
+, pandas
+, patsy
+, pytestCheckHook
+, pythonOlder
+, scikit-misc
+, scipy
+, setuptools-scm
+, statsmodels
+}:
+
+buildPythonPackage rec {
+  pname = "plotnine";
+  version = "0.12.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-o43LNgf8ADweWa4MnVNdrngXZQ0cvC5W5W5bPeiN/pk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=plotnine --cov-report=xml" ""
+  '';
+
+  propagatedBuildInputs = [
+    matplotlib
+    mizani
+    pandas
+    patsy
+    scipy
+    statsmodels
+  ];
+
+  nativeCheckInputs = [
+    adjusttext
+    geopandas
+    pytestCheckHook
+    scikit-misc
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  pythonImportsCheck = [
+    "plotnine"
+  ];
+
+  disabledTestPaths = [
+    # Assertion Errors
+    "tests/test_theme.py"
+    "tests/test_scale_internals.py"
+    "tests/test_scale_labelling.py"
+    "tests/test_position.py"
+    "tests/test_geom_text_label.py"
+    "tests/test_geom_smooth.py"
+    "tests/test_geom_segment.py"
+    "tests/test_geom_ribbon_area.py"
+    "tests/test_geom_map.py"
+    "tests/test_facets.py"
+    "tests/test_facet_labelling.py"
+    "tests/test_coords.py"
+    "tests/test_annotation_logticks.py"
+  ];
+
+  meta = with lib; {
+    description = "Grammar of graphics for python";
+    homepage = "https://plotnine.readthedocs.io/";
+    changelog = "https://github.com/has2k1/plotnine/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pluggy/default.nix b/nixpkgs/pkgs/development/python-modules/pluggy/default.nix
new file mode 100644
index 000000000000..1128d1c69eaf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pluggy/default.nix
@@ -0,0 +1,42 @@
+{ buildPythonPackage
+, lib
+, fetchFromGitHub
+, setuptools-scm
+, pythonOlder
+, importlib-metadata
+, callPackage
+}:
+
+buildPythonPackage rec {
+  pname = "pluggy";
+  version = "1.3.0";
+
+  disabled = pythonOlder "3.8";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pytest-dev";
+    repo = "pluggy";
+    rev = "refs/tags/${version}";
+    hash = "sha256-jLasnqmATIOoheGu90Wo1+iTCwslYzNOKckqHIZDJec=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  # To prevent infinite recursion with pytest
+  doCheck = false;
+  passthru.tests = {
+    pytest = callPackage ./tests.nix { };
+  };
+
+  meta = {
+    changelog = "https://github.com/pytest-dev/pluggy/blob/${src.rev}/CHANGELOG.rst";
+    description = "Plugin and hook calling mechanisms for Python";
+    homepage = "https://github.com/pytest-dev/pluggy";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pluggy/tests.nix b/nixpkgs/pkgs/development/python-modules/pluggy/tests.nix
new file mode 100644
index 000000000000..dc6e16e7b2d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pluggy/tests.nix
@@ -0,0 +1,20 @@
+{ buildPythonPackage
+, pluggy
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  pname = "pluggy-tests";
+  inherit (pluggy) version;
+  format = "other";
+
+  inherit (pluggy) src;
+
+  dontBuild = true;
+  dontInstall = true;
+
+  nativeCheckInputs = [
+    pluggy
+    pytestCheckHook
+  ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pluginbase/default.nix b/nixpkgs/pkgs/development/python-modules/pluginbase/default.nix
new file mode 100644
index 000000000000..f90b4b415300
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pluginbase/default.nix
@@ -0,0 +1,25 @@
+{ lib, fetchPypi, buildPythonPackage, pytest }:
+
+buildPythonPackage rec {
+  version = "1.0.1";
+  pname = "pluginbase";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ff6c33a98fce232e9c73841d787a643de574937069f0d18147028d70d7dee287";
+  };
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    cd tests
+    PYTHONPATH=.. pytest
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/mitsuhiko/pluginbase";
+    description = "A support library for building plugins sytems in Python";
+    license = licenses.bsd3;
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plugincode/default.nix b/nixpkgs/pkgs/development/python-modules/plugincode/default.nix
new file mode 100644
index 000000000000..6e49474cc63d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plugincode/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, setuptools-scm
+, click
+, commoncode
+, pluggy
+, pytestCheckHook
+, pytest-xdist
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "plugincode";
+  version = "32.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QTLZOxdVJxxuImydouIET/YuvLhztelY1mqN3enzRfo=";
+  };
+
+  dontConfigure = true;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    click
+    commoncode
+    pluggy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-xdist
+  ];
+
+  pythonImportsCheck = [
+    "plugincode"
+  ];
+
+  disabledTests = [
+    # We don't want black as an input
+    "test_skeleton_codestyle"
+  ];
+
+  meta = with lib; {
+    description = "Library that provides plugin functionality for ScanCode toolkit";
+    homepage = "https://github.com/nexB/plugincode";
+    changelog = "https://github.com/nexB/plugincode/blob/v${version}/CHANGELOG.rst";
+    license = licenses.asl20;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plugnplay/default.nix b/nixpkgs/pkgs/development/python-modules/plugnplay/default.nix
new file mode 100644
index 000000000000..a0eda76e4ddf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plugnplay/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+buildPythonPackage rec {
+  pname = "plugnplay";
+  version = "0.5.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "877e2d2500a45aaf31e5175f9f46182088d3e2d64c1c6b9ff6c778ae0ee594c8";
+  };
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "plugnplay"
+  ];
+
+  meta = with lib; {
+    description = "A Generic plug-in system for python applications";
+    homepage = "https://github.com/daltonmatos/plugnplay";
+    license = licenses.gpl2Only;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plugwise/default.nix b/nixpkgs/pkgs/development/python-modules/plugwise/default.nix
new file mode 100644
index 000000000000..14e77c816b88
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plugwise/default.nix
@@ -0,0 +1,68 @@
+ { lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, crcmod
+, defusedxml
+, fetchFromGitHub
+, freezegun
+, jsonpickle
+, munch
+, pyserial
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pytz
+, semver
+}:
+
+buildPythonPackage rec {
+  pname = "plugwise";
+  version = "0.35.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = "python-plugwise";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-eHJQXLiuWmJo/Eo4B8gEo44rwpPA7ASjxKSmdu6Tv9M=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    crcmod
+    defusedxml
+    munch
+    pyserial
+    python-dateutil
+    pytz
+    semver
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    jsonpickle
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "plugwise"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Python module for Plugwise Smiles, Stretch and USB stick";
+    homepage = "https://github.com/plugwise/python-plugwise";
+    changelog = "https://github.com/plugwise/python-plugwise/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plum-py/default.nix b/nixpkgs/pkgs/development/python-modules/plum-py/default.nix
new file mode 100644
index 000000000000..721786e608d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plum-py/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, baseline
+, buildPythonPackage
+, fetchFromGitLab
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "plum-py";
+  version = "0.8.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitLab {
+    owner = "dangass";
+    repo = "plum";
+    rev = "refs/tags/${version}";
+    hash = "sha256-gZSRqijKdjqOZe1+4aeycpCPsh6HC5sRbyVjgK+g4wM=";
+  };
+
+  postPatch = ''
+    # Drop broken version specifier
+    sed -i "/python_requires =/d" setup.cfg
+  '';
+
+  nativeCheckInputs = [
+    baseline
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "plum"
+  ];
+
+  pytestFlagsArray = [
+    "tests"
+  ];
+
+  disabledTestPaths = [
+    # tests enum.IntFlag behaviour which has been disallowed in python 3.11.6
+    # https://gitlab.com/dangass/plum/-/issues/150
+    "tests/flag/test_flag_invalid.py"
+  ];
+
+  meta = with lib; {
+    description = "Classes and utilities for packing/unpacking bytes";
+    homepage = "https://plum-py.readthedocs.io/";
+    changelog = "https://gitlab.com/dangass/plum/-/blob/${version}/docs/release_notes.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dnr ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plumbum/default.nix b/nixpkgs/pkgs/development/python-modules/plumbum/default.nix
new file mode 100644
index 000000000000..e6ffa43b3293
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plumbum/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, hatch-vcs
+, openssh
+, ps
+, psutil
+, pytest-mock
+, pytest-timeout
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "plumbum";
+  version = "1.8.2";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "tomerfiliba";
+    repo = "plumbum";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-b8JcGRHiZSv/ViyEogpLgGXOMHHSC+cjWT0FqhkolcA=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"--cov-config=setup.cfg", ' ""
+  '';
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    hatchling
+    hatch-vcs
+  ];
+
+  nativeCheckInputs = [
+    openssh
+    ps
+    psutil
+    pytest-mock
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TMP
+  '';
+
+  disabledTests = [
+    # broken in nix env
+    "test_change_env"
+    "test_dictlike"
+    "test_local"
+    # incompatible with pytest 7
+    "test_incorrect_login"
+  ];
+
+  disabledTestPaths = [
+    # incompatible with pytest7
+    # https://github.com/tomerfiliba/plumbum/issues/594
+    "tests/test_remote.py"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/tomerfiliba/plumbum/releases/tag/v${version}";
+    description = " Plumbum: Shell Combinators ";
+    homepage = " https://github.com/tomerfiliba/plumbum ";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plux/default.nix b/nixpkgs/pkgs/development/python-modules/plux/default.nix
new file mode 100644
index 000000000000..567aff8f51b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plux/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+, setuptools
+, stevedore
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "plux";
+  version = "1.4.0";
+  format = "pyproject";
+
+  # Tests are not available from PyPi
+  src = fetchFromGitHub {
+    owner = "localstack";
+    repo = "plux";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-AybMHkCUNJsL51XwiskkIltEtqZ27fGHrpyct8IUjmo=";
+  };
+
+  patches = [
+    # https://github.com/localstack/plux/pull/8
+    (fetchpatch {
+      name = "remove-pytest-runner.patch";
+      url = "https://github.com/localstack/plux/commit/3cda22e51f43a86304d0dedd7e554b21aa82c8b0.patch";
+      hash = "sha256-ZFHUTkUYFSTgKbx+c74JQzre0la+hFW9gNOxOehvVoE=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    stevedore
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "plugin.core" ];
+
+  meta = with lib; {
+    description = "Dynamic code loading framework for building pluggable Python distributions";
+    homepage = "https://github.com/localstack/plux";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ply/default.nix b/nixpkgs/pkgs/development/python-modules/ply/default.nix
new file mode 100644
index 000000000000..e177ce709171
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ply/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "ply";
+  version = "3.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} test/testlex.py
+    ${python.interpreter} test/testyacc.py
+  '';
+
+  # Test suite appears broken
+  doCheck = false;
+
+  meta = {
+    homepage = "http://www.dabeaz.com/ply/";
+    description = "PLY (Python Lex-Yacc), an implementation of the lex and yacc parsing tools for Python";
+    longDescription = ''
+      PLY is an implementation of lex and yacc parsing tools for Python.
+      In a nutshell, PLY is nothing more than a straightforward lex/yacc
+      implementation.  Here is a list of its essential features: It's
+      implemented entirely in Python; It uses LR-parsing which is
+      reasonably efficient and well suited for larger grammars; PLY
+      provides most of the standard lex/yacc features including support for
+      empty productions, precedence rules, error recovery, and support for
+      ambiguous grammars; PLY is straightforward to use and provides very
+      extensive error checking; PLY doesn't try to do anything more or less
+      than provide the basic lex/yacc functionality.  In other words, it's
+      not a large parsing framework or a component of some larger system.
+    '';
+    license = lib.licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plyer/default.nix b/nixpkgs/pkgs/development/python-modules/plyer/default.nix
new file mode 100644
index 000000000000..5b8bc870b838
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plyer/default.nix
@@ -0,0 +1,51 @@
+{ stdenv, lib, buildPythonPackage, fetchFromGitHub, fetchpatch, keyring, mock, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "plyer";
+  version = "2.1.0";
+
+  src = fetchFromGitHub {
+    owner = "kivy";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-7Icb2MVj5Uit86lRHxal6b7y9gIJ3UT2HNqpA9DYWVE=";
+  };
+
+  postPatch = ''
+    rm -r examples
+    # remove all the wifi stuff. Depends on a python wifi module that has not been updated since 2016
+    find -iname "wifi*" -exec rm {} \;
+    substituteInPlace plyer/__init__.py \
+      --replace "wifi = Proxy('wifi', facades.Wifi)" "" \
+      --replace "'wifi', " ""
+    substituteInPlace plyer/facades/__init__.py \
+      --replace "from plyer.facades.wifi import Wifi" ""
+  '';
+
+  propagatedBuildInputs = [ keyring ];
+
+  nativeCheckInputs = [ mock pytestCheckHook ];
+
+  pytestFlagsArray = [ "plyer/tests" ];
+  disabledTests = [
+    # assumes dbus is not installed, it fails and is not very robust.
+    "test_notification_notifysend"
+    # fails during nix-build, but I am not able to explain why.
+    # The test and the API under test do work outside the nix build.
+    "test_uniqueid"
+  ];
+  preCheck = ''
+    HOME=$(mktemp -d)
+    mkdir -p $HOME/.config/ $HOME/Pictures
+  '';
+
+  pythonImportsCheck = [ "plyer" ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Plyer is a platform-independent api to use features commonly found on various platforms";
+    homepage = "https://github.com/kivy/plyer";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rski ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plyfile/default.nix b/nixpkgs/pkgs/development/python-modules/plyfile/default.nix
new file mode 100644
index 000000000000..20495ba0dd01
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plyfile/default.nix
@@ -0,0 +1,21 @@
+{ lib, fetchPypi, buildPythonPackage, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "plyfile";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-TOrt8e2Ss6Jrdm/IxWzaG5sjkOwpmxbe3i5f1FCXJho=";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  meta = with lib; {
+    description = "NumPy-based text/binary PLY file reader/writer for Python";
+    homepage    = "https://github.com/dranjan/python-plyfile";
+    maintainers = with maintainers; [ abbradar ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plyplus/default.nix b/nixpkgs/pkgs/development/python-modules/plyplus/default.nix
new file mode 100644
index 000000000000..4b9f1a9a0841
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plyplus/default.nix
@@ -0,0 +1,21 @@
+{ lib, fetchPypi, buildPythonPackage, ply, isPy3k }:
+buildPythonPackage rec {
+  pname = "PlyPlus";
+  version = "0.7.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0g3flgfm3jpb2d8v9z0qmbwca5gxdqr10cs3zvlfhv5cs06ahpnp";
+  };
+
+  propagatedBuildInputs = [ ply ];
+
+  doCheck = !isPy3k;
+
+  meta = {
+    homepage = "https://github.com/erezsh/plyplus";
+    description = "A general-purpose parser built on top of PLY";
+    maintainers = with lib.maintainers; [ twey ];
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/plyvel/default.nix b/nixpkgs/pkgs/development/python-modules/plyvel/default.nix
new file mode 100644
index 000000000000..2d412c12d16e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/plyvel/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pkgs
+, pytest
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "plyvel";
+  version = "1.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zZGOCzFpCrzT0gKodCyvlRqy/hVz3nr3HDhFaEf5ICs=";
+  };
+
+  buildInputs = [ pkgs.leveldb ] ++ lib.optional isPy3k pytest;
+
+  # no tests for python2
+  doCheck = isPy3k;
+
+  meta = with lib; {
+    description = "Fast and feature-rich Python interface to LevelDB";
+    platforms = platforms.unix;
+    homepage = "https://github.com/wbolster/plyvel";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pmdarima/default.nix b/nixpkgs/pkgs/development/python-modules/pmdarima/default.nix
new file mode 100644
index 000000000000..f1d152decc1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pmdarima/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, joblib
+, numpy
+, pandas
+, scikit-learn
+, scipy
+, statsmodels
+, urllib3
+, pythonOlder
+, python
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pmdarima";
+  version = "2.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "alkaline-ml";
+    repo = "pmdarima";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-LHwPgQRB/vP3hBM8nqafoCrN3ZSRIMWLzqTqDOETOEc=";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  propagatedBuildInputs = [
+    joblib
+    numpy
+    pandas
+    scikit-learn
+    scipy
+    statsmodels
+    urllib3
+  ];
+
+  # Make sure we're running the tests for the actually installed
+  # package, so that cython's compiled files are available.
+  preCheck = ''
+    cd $out/lib/${python.libPrefix}/site-packages
+  '';
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  disabledTests= [
+    # touches internet
+    "test_load_from_web"
+  ];
+
+  pythonImportsCheck = [ "pmdarima" ];
+
+  meta = with lib; {
+    description = "A statistical library designed to fill the void in Python's time series analysis capabilities, including the equivalent of R's auto.arima function";
+    homepage = "https://github.com/alkaline-ml/pmdarima";
+    changelog = "https://github.com/alkaline-ml/pmdarima/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pmdsky-debug-py/default.nix b/nixpkgs/pkgs/development/python-modules/pmdsky-debug-py/default.nix
new file mode 100644
index 000000000000..8a8b89e60455
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pmdsky-debug-py/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+}:
+
+#This package is auto-generated. It could totally be possible to generate it from upstream, but seems unecessary
+buildPythonPackage rec {
+  pname = "pmdsky-debug-py";
+  version = "8.0.4";
+  pyproject = true;
+  # SkyTemple specifically require this version. This is used when patching the binary,
+  # and risk to be a bit problematic if using the latest version, given it doesn’t follow semver.
+
+  src = fetchFromGitHub {
+    owner = "SkyTemple";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-D81vXhYGxwvy26PvicniCLiS58LmrSP9ppzXKRzQSJc=";
+  };
+
+  prePatch = "cd src";
+
+  nativeBuildInputs = [ setuptools ];
+
+  meta = with lib; {
+    description = "Autogenerated and statically check-able pmdsky-debug symbol definitions for Python";
+    homepage = "https://github.com/SkyTemple/pmdsky-debug-py";
+    license = licenses.mit;
+    maintainers = with maintainers; [ marius851000 xfix ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pmsensor/default.nix b/nixpkgs/pkgs/development/python-modules/pmsensor/default.nix
new file mode 100644
index 000000000000..1d64852f281e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pmsensor/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyserial
+}:
+
+buildPythonPackage rec {
+  pname = "pmsensor";
+  version = "0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7fc03aafb791ca70d847c9ab97cf181bc7d8f7345efb4b0c3f66c07b9c7dee69";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pmsensor.co2sensor"
+    "pmsensor.serial_pm"
+  ];
+
+  meta = with lib; {
+    description = "Library to read data from environment sensors";
+    homepage = "https://github.com/open-homeautomation/pmsensor";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pmw/default.nix b/nixpkgs/pkgs/development/python-modules/pmw/default.nix
new file mode 100644
index 000000000000..de33eecf0886
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pmw/default.nix
@@ -0,0 +1,24 @@
+{ lib , buildPythonPackage , fetchPypi, tkinter }:
+
+buildPythonPackage rec {
+  pname = "pmw";
+  version = "2.1.1";
+
+  src = fetchPypi {
+    pname = "Pmw";
+    inherit version;
+    hash = "sha256-lIQSRXz8zwx3XdCOCRP7APkIlqM8eXN9VxxzEq6vVcY=";
+  };
+
+  propagatedBuildInputs = [ tkinter ];
+
+  # Disable tests due to their xserver requirement
+  doCheck = false;
+
+  meta = {
+    description = "A toolkit for building high-level compound widgets in Python using the Tkinter module";
+    homepage = "https://pmw.sourceforge.net/";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ mounium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pnglatex/default.nix b/nixpkgs/pkgs/development/python-modules/pnglatex/default.nix
new file mode 100644
index 000000000000..579eb523d10c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pnglatex/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, poppler_utils, netpbm }:
+
+buildPythonPackage rec {
+
+  pname = "pnglatex";
+  version = "1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-CZUGDUkmttO0BzFYbGFSNMPkWzFC/BW4NmAeOwz4Y9M=";
+  };
+
+  propagatedBuildInputs = [
+    poppler_utils
+    netpbm
+  ];
+
+  # There are no tests
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/MaT1g3R/pnglatex";
+    description = "a small program that converts LaTeX snippets to png";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pocket/default.nix b/nixpkgs/pkgs/development/python-modules/pocket/default.nix
new file mode 100644
index 000000000000..e5a2d464bde8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pocket/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pocket";
+  version = "0.3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1fc9vc5nyzf1kzmnrs18dmns7nn8wjfrg7br1w4c5sgs35mg2ywh";
+  };
+
+  buildInputs = [ requests ];
+
+  meta = with lib; {
+    description = "Wrapper for the pocket API";
+    homepage    = "https://github.com/tapanpandita/pocket";
+    license     = licenses.bsd3;
+    maintainers = with maintainers; [ ericsagnes ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/podcastparser/default.nix b/nixpkgs/pkgs/development/python-modules/podcastparser/default.nix
new file mode 100644
index 000000000000..d844a19f902e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/podcastparser/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "podcastparser";
+  version = "0.6.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "gpodder";
+    repo = "podcastparser";
+    rev = "refs/tags/${version}";
+    hash = "sha256-P9wVyxTO0nz/DfuBhCE+VjhH1uYx4jBd30Ca26yBzbo=";
+  };
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace "--cov=podcastparser --cov-report html --doctest-modules" ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "podcastparser"
+  ];
+
+  meta = with lib; {
+    description = "Module to parse podcasts";
+    homepage = "http://gpodder.org/podcastparser/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/podcats/default.nix b/nixpkgs/pkgs/development/python-modules/podcats/default.nix
new file mode 100644
index 000000000000..48504c8a3ee2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/podcats/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub, flask, mutagen }:
+
+buildPythonPackage rec {
+  pname = "podcats";
+  version = "0.5.0";
+
+  src = fetchFromGitHub {
+    owner = "jakubroztocil";
+    repo = "podcats";
+    rev = "v${version}";
+    sha256 = "0zjdgry5n209rv19kj9yaxy7c7zq5gxr488izrgs4sc75vdzz8xc";
+  };
+
+  patchPhase = ''
+    substituteInPlace podcats.py \
+      --replace 'debug=True' 'debug=True, use_reloader=False'
+  '';
+
+  propagatedBuildInputs = [ flask mutagen ];
+
+  meta = {
+    description = "Application that generates RSS feeds for podcast episodes from local audio files";
+    homepage = "https://github.com/jakubroztocil/podcats";
+    license = lib.licenses.bsd2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/podman/default.nix b/nixpkgs/pkgs/development/python-modules/podman/default.nix
new file mode 100644
index 000000000000..b3ba05351ea2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/podman/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fixtures
+, pytestCheckHook
+, pythonOlder
+, pyxdg
+, requests
+, requests-mock
+, rich
+, setuptools
+, tomli
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "podman";
+  version = "4.8.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "containers";
+    repo = "podman-py";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-lw8ZW1Uh6pbL5Z15NBBgKFm1143rEyFdecBHsSwBYVo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pyxdg
+    requests
+    rich
+    tomli
+    urllib3
+  ];
+
+  nativeCheckInputs = [
+    fixtures
+    pytestCheckHook
+    requests-mock
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  pythonImportsCheck = [
+    "podman"
+  ];
+
+  disabledTests = [
+    # Integration tests require a running container setup
+    "AdapterIntegrationTest"
+    "ContainersIntegrationTest"
+    "ImagesIntegrationTest"
+    "ManifestsIntegrationTest"
+    "NetworksIntegrationTest"
+    "PodsIntegrationTest"
+    "SecretsIntegrationTest"
+    "SystemIntegrationTest"
+    "VolumesIntegrationTest"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for Podman's RESTful API";
+    homepage = "https://github.com/containers/podman-py";
+    changelog = "https://github.com/containers/podman-py/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+    mainProgram = "podman";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/poetry-core/default.nix b/nixpkgs/pkgs/development/python-modules/poetry-core/default.nix
new file mode 100644
index 000000000000..fc8da7447ffb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/poetry-core/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pythonOlder
+, build
+, git
+, pytest-mock
+, pytestCheckHook
+, setuptools
+, tomli-w
+, virtualenv
+}:
+
+buildPythonPackage rec {
+  pname = "poetry-core";
+  version = "1.7.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "python-poetry";
+    repo = pname;
+    rev = version;
+    hash = "sha256-OfY2zc+5CgOrgbiPVnvMdT4h1S7Aek8S7iThl6azmsk=";
+  };
+
+  nativeCheckInputs = [
+    build
+    git
+    pytest-mock
+    pytestCheckHook
+    setuptools
+    tomli-w
+    virtualenv
+  ];
+
+  # Requires git history to work correctly
+  disabledTests = [
+    "default_with_excluded_data"
+    "default_src_with_excluded_data"
+  ];
+
+  pythonImportsCheck = [
+    "poetry.core"
+  ];
+
+  # Allow for package to use pep420's native namespaces
+  pythonNamespaces = [
+    "poetry"
+  ];
+
+  env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.cc.isClang "-Wno-int-conversion";
+
+  meta = with lib; {
+    changelog = "https://github.com/python-poetry/poetry-core/blob/${src.rev}/CHANGELOG.md";
+    description = "Core utilities for Poetry";
+    homepage = "https://github.com/python-poetry/poetry-core/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/poetry-dynamic-versioning/default.nix b/nixpkgs/pkgs/development/python-modules/poetry-dynamic-versioning/default.nix
new file mode 100644
index 000000000000..9c6440cd4c32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/poetry-dynamic-versioning/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, dunamai
+, fetchFromGitHub
+, jinja2
+, poetry-core
+, poetry
+, pytestCheckHook
+, pythonOlder
+, tomlkit
+}:
+
+buildPythonPackage rec {
+  pname = "poetry-dynamic-versioning";
+  version = "1.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mtkennerly";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-BGAo3c0TzyhIiDtZjoEP+Eeu51WJB3Wg71poFMWJ+VM=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    dunamai
+    jinja2
+    tomlkit
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    poetry
+  ];
+
+  # virtualenv: error: argument dest: the destination . is not write-able at /
+  doCheck = false;
+
+  disabledTests = [
+    # these require .git, but leaveDotGit = true doesn't help
+    "test__get_version__defaults"
+    "test__get_version__format_jinja"
+    # these expect to be able to run the poetry cli which fails in test hook
+    "test_integration"
+  ];
+
+  pythonImportsCheck = [
+    "poetry_dynamic_versioning"
+  ];
+
+  setupHook = ./setup-hook.sh;
+
+  meta = with lib; {
+    description = "Plugin for Poetry to enable dynamic versioning based on VCS tags";
+    homepage = "https://github.com/mtkennerly/poetry-dynamic-versioning";
+    changelog = "https://github.com/mtkennerly/poetry-dynamic-versioning/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/poetry-dynamic-versioning/setup-hook.sh b/nixpkgs/pkgs/development/python-modules/poetry-dynamic-versioning/setup-hook.sh
new file mode 100644
index 000000000000..1e1befa8eb16
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/poetry-dynamic-versioning/setup-hook.sh
@@ -0,0 +1,8 @@
+version-pretend-hook() {
+  echo "Setting POETRY_DYNAMIC_VERSIONING_BYPASS to $version"
+  export POETRY_DYNAMIC_VERSIONING_BYPASS=$version
+}
+
+if [ -z "${dontBypassPoetryDynamicVersioning-}" ]; then
+  preBuildHooks+=(version-pretend-hook)
+fi
diff --git a/nixpkgs/pkgs/development/python-modules/poetry-semver/default.nix b/nixpkgs/pkgs/development/python-modules/poetry-semver/default.nix
new file mode 100644
index 000000000000..8c0c11f99efd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/poetry-semver/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "poetry-semver";
+  version = "0.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2Am2Eqons5vy0PydMbT0gJsOlyZGxfGc+kbHJbdjiBA=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "A semantic versioning library for Python.";
+    homepage = "https://github.com/python-poetry/semver";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/polarizationsolver/default.nix b/nixpkgs/pkgs/development/python-modules/polarizationsolver/default.nix
new file mode 100644
index 000000000000..d7385bd9f642
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/polarizationsolver/default.nix
@@ -0,0 +1,44 @@
+{ buildPythonPackage
+, lib
+, fetchFromGitLab
+, python
+, numpy
+, scipy
+, periodictable
+, fields
+}:
+
+buildPythonPackage rec {
+  pname = "polarizationsolver";
+  version = "unstable-2021-11-02";
+
+  src = fetchFromGitLab {
+    owner = "reinholdt";
+    repo = pname;
+    rev = "00424ac4d1862257a55e4b16543f63ace3fe8c22";
+    hash = "sha256-LACf8Xw+o/uJ3+PD/DE/o7nwKY7fv3NyYbpjCrTTnBU=";
+  };
+
+  # setup.py states version="dev", which is not a valid version string for setuptools
+  # There has never been a formal stable release, so let's say 0.0 here.
+  postPatch = ''
+    substituteInPlace ./setup.py --replace 'version="dev",' 'version="0.0",'
+  '';
+
+  propagatedBuildInputs = [
+    numpy
+    periodictable
+    scipy
+  ];
+
+  nativeCheckInputs = [ fields ];
+
+  pythonImportsCheck = [ "polarizationsolver" ];
+
+  meta = with lib; {
+    description = "Multipole moment solver for quantum chemistry and polarisable embedding";
+    homepage = "https://gitlab.com/reinholdt/polarizationsolver";
+    license = licenses.gpl3Plus;
+    maintainers = [ maintainers.sheepforce ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/polars/Cargo.lock b/nixpkgs/pkgs/development/python-modules/polars/Cargo.lock
new file mode 100644
index 000000000000..b9ba1326cf62
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/polars/Cargo.lock
@@ -0,0 +1,3167 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "addr2line"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
+dependencies = [
+ "gimli",
+]
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "adler32"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
+
+[[package]]
+name = "ahash"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd7d5a2cecb58716e47d67d5703a249964b14c7be1ec3cad3affc295b2d1c35d"
+dependencies = [
+ "cfg-if",
+ "getrandom",
+ "once_cell",
+ "version_check",
+ "zerocopy",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "alloc-no-stdlib"
+version = "2.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3"
+
+[[package]]
+name = "alloc-stdlib"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece"
+dependencies = [
+ "alloc-no-stdlib",
+]
+
+[[package]]
+name = "allocator-api2"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5"
+
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "argminmax"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "202108b46429b765ef483f8a24d5c46f48c14acfdacc086dd4ab6dddf6bcdbd2"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "array-init-cursor"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf7d0a018de4f6aa429b9d33d69edf69072b1c5b1cb8d3e4a5f7ef898fc3eb76"
+
+[[package]]
+name = "arrow-format"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07884ea216994cdc32a2d5f8274a8bee979cfe90274b83f86f440866ee3132c7"
+dependencies = [
+ "planus",
+ "serde",
+]
+
+[[package]]
+name = "async-stream"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51"
+dependencies = [
+ "async-stream-impl",
+ "futures-core",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "async-stream-impl"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.36",
+]
+
+[[package]]
+name = "async-trait"
+version = "0.1.73"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.36",
+]
+
+[[package]]
+name = "atoi"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "avro-schema"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5281855b39aba9684d2f47bf96983fbfd8f1725f12fabb0513a8ab879647bbd"
+dependencies = [
+ "crc",
+ "fallible-streaming-iterator",
+ "libflate",
+ "serde",
+ "serde_json",
+ "snap",
+]
+
+[[package]]
+name = "backtrace"
+version = "0.3.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
+dependencies = [
+ "addr2line",
+ "cc",
+ "cfg-if",
+ "libc",
+ "miniz_oxide",
+ "object",
+ "rustc-demangle",
+]
+
+[[package]]
+name = "base64"
+version = "0.21.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bitflags"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "brotli"
+version = "3.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68"
+dependencies = [
+ "alloc-no-stdlib",
+ "alloc-stdlib",
+ "brotli-decompressor",
+]
+
+[[package]]
+name = "brotli-decompressor"
+version = "2.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744"
+dependencies = [
+ "alloc-no-stdlib",
+ "alloc-stdlib",
+]
+
+[[package]]
+name = "built"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b99c4cdc7b2c2364182331055623bdf45254fcb679fea565c40c3c11c101889a"
+dependencies = [
+ "cargo-lock",
+ "chrono",
+ "git2",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"
+
+[[package]]
+name = "bytemuck"
+version = "1.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6"
+dependencies = [
+ "bytemuck_derive",
+]
+
+[[package]]
+name = "bytemuck_derive"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.36",
+]
+
+[[package]]
+name = "bytes"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
+
+[[package]]
+name = "cargo-lock"
+version = "9.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e11c675378efb449ed3ce8de78d75d0d80542fc98487c26aba28eb3b82feac72"
+dependencies = [
+ "semver",
+ "serde",
+ "toml",
+ "url",
+]
+
+[[package]]
+name = "cc"
+version = "1.0.83"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
+dependencies = [
+ "jobserver",
+ "libc",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "chrono"
+version = "0.4.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "num-traits",
+ "serde",
+ "windows-targets",
+]
+
+[[package]]
+name = "chrono-tz"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1369bc6b9e9a7dfdae2055f6ec151fe9c554a9d23d357c0237cee2e25eaabb7"
+dependencies = [
+ "chrono",
+ "chrono-tz-build",
+ "phf",
+]
+
+[[package]]
+name = "chrono-tz-build"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2f5ebdc942f57ed96d560a6d1a459bae5851102a25d5bf89dc04ae453e31ecf"
+dependencies = [
+ "parse-zoneinfo",
+ "phf",
+ "phf_codegen",
+]
+
+[[package]]
+name = "ciborium"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926"
+dependencies = [
+ "ciborium-io",
+ "ciborium-ll",
+ "serde",
+]
+
+[[package]]
+name = "ciborium-io"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656"
+
+[[package]]
+name = "ciborium-ll"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b"
+dependencies = [
+ "ciborium-io",
+ "half",
+]
+
+[[package]]
+name = "cmake"
+version = "0.1.50"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "comfy-table"
+version = "7.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ab77dbd8adecaf3f0db40581631b995f312a8a5ae3aa9993188bb8f23d83a5b"
+dependencies = [
+ "crossterm",
+ "strum",
+ "strum_macros 0.24.3",
+ "unicode-width",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
+
+[[package]]
+name = "crc"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23"
+dependencies = [
+ "crc-catalog",
+]
+
+[[package]]
+name = "crc-catalog"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403"
+
+[[package]]
+name = "crc32fast"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
+dependencies = [
+ "cfg-if",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7"
+dependencies = [
+ "autocfg",
+ "cfg-if",
+ "crossbeam-utils",
+ "memoffset",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-queue"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crossterm"
+version = "0.26.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a84cda67535339806297f1b331d6dd6320470d2a0fe65381e79ee9e156dd3d13"
+dependencies = [
+ "bitflags 1.3.2",
+ "crossterm_winapi",
+ "libc",
+ "mio",
+ "parking_lot",
+ "signal-hook",
+ "signal-hook-mio",
+ "winapi",
+]
+
+[[package]]
+name = "crossterm_winapi"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "doc-comment"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
+
+[[package]]
+name = "dyn-clone"
+version = "1.0.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbfc4744c1b8f2a09adc0e55242f60b1af195d88596bd8700be74418c056c555"
+
+[[package]]
+name = "either"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
+
+[[package]]
+name = "encoding_rs"
+version = "0.8.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "enum_dispatch"
+version = "0.3.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f33313078bb8d4d05a2733a94ac4c2d8a0df9a2b84424ebf4f33bfc224a890e"
+dependencies = [
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.36",
+]
+
+[[package]]
+name = "equivalent"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+
+[[package]]
+name = "ethnum"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c8ff382b2fa527fb7fb06eeebfc5bbb3f17e3cc6b9d70b006c41daa8824adac"
+
+[[package]]
+name = "fallible-streaming-iterator"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a"
+
+[[package]]
+name = "fast-float"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95765f67b4b18863968b4a1bd5bb576f732b29a4a28c7cd84c09fa3e2875f33c"
+
+[[package]]
+name = "flate2"
+version = "1.0.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010"
+dependencies = [
+ "crc32fast",
+ "libz-ng-sys",
+ "miniz_oxide",
+]
+
+[[package]]
+name = "float-cmp"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "foreign_vec"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee1b05cbd864bcaecbd3455d6d967862d446e4ebfc3c2e5e5b9841e53cba6673"
+
+[[package]]
+name = "form_urlencoded"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652"
+dependencies = [
+ "percent-encoding",
+]
+
+[[package]]
+name = "futures"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"
+
+[[package]]
+name = "futures-macro"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.36",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e"
+
+[[package]]
+name = "futures-task"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"
+
+[[package]]
+name = "futures-util"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
+dependencies = [
+ "cfg-if",
+ "js-sys",
+ "libc",
+ "wasi",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "gimli"
+version = "0.28.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"
+
+[[package]]
+name = "git2"
+version = "0.17.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b989d6a7ca95a362cf2cfc5ad688b3a467be1f87e480b8dad07fee8c79b0044"
+dependencies = [
+ "bitflags 1.3.2",
+ "libc",
+ "libgit2-sys",
+ "log",
+ "url",
+]
+
+[[package]]
+name = "glob"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
+
+[[package]]
+name = "h2"
+version = "0.3.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http",
+ "indexmap 1.9.3",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "half"
+version = "1.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7"
+
+[[package]]
+name = "halfbrown"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5681137554ddff44396e5f149892c769d45301dd9aa19c51602a89ee214cb0ec"
+dependencies = [
+ "hashbrown 0.13.2",
+ "serde",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
+[[package]]
+name = "hashbrown"
+version = "0.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e"
+dependencies = [
+ "ahash",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a"
+dependencies = [
+ "ahash",
+ "allocator-api2",
+ "rayon",
+]
+
+[[package]]
+name = "heck"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+
+[[package]]
+name = "hermit-abi"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7"
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
+[[package]]
+name = "home"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb"
+dependencies = [
+ "windows-sys",
+]
+
+[[package]]
+name = "http"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "http-body"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
+dependencies = [
+ "bytes",
+ "http",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "httparse"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+
+[[package]]
+name = "httpdate"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
+
+[[package]]
+name = "humantime"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
+
+[[package]]
+name = "hyper"
+version = "0.14.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "socket2 0.4.9",
+ "tokio",
+ "tower-service",
+ "tracing",
+ "want",
+]
+
+[[package]]
+name = "hyper-rustls"
+version = "0.24.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97"
+dependencies = [
+ "futures-util",
+ "http",
+ "hyper",
+ "rustls",
+ "tokio",
+ "tokio-rustls",
+]
+
+[[package]]
+name = "iana-time-zone"
+version = "0.1.57"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "idna"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+dependencies = [
+ "autocfg",
+ "hashbrown 0.12.3",
+]
+
+[[package]]
+name = "indexmap"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d"
+dependencies = [
+ "equivalent",
+ "hashbrown 0.14.0",
+ "serde",
+]
+
+[[package]]
+name = "indoc"
+version = "2.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8"
+
+[[package]]
+name = "inventory"
+version = "0.3.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1be380c410bf0595e94992a648ea89db4dd3f3354ba54af206fd2a68cf5ac8e"
+
+[[package]]
+name = "ipnet"
+version = "2.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6"
+
+[[package]]
+name = "itertools"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
+
+[[package]]
+name = "itoap"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9028f49264629065d057f340a86acb84867925865f73bbf8d47b4d149a7e88b8"
+
+[[package]]
+name = "jemalloc-sys"
+version = "0.5.4+5.3.0-patched"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac6c1946e1cea1788cbfde01c993b52a10e2da07f4bac608228d1bed20bfebf2"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "jemallocator"
+version = "0.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0de374a9f8e63150e6f5e8a60cc14c668226d7a347d8aee1a45766e3c4dd3bc"
+dependencies = [
+ "jemalloc-sys",
+ "libc",
+]
+
+[[package]]
+name = "jobserver"
+version = "0.1.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "js-sys"
+version = "0.3.64"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "jsonpath_lib"
+version = "0.3.0"
+source = "git+https://github.com/ritchie46/jsonpath?branch=improve_compiled#24eaf0b4416edff38a4d1b6b17bc4b9f3f047b4b"
+dependencies = [
+ "log",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "lexical"
+version = "6.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7aefb36fd43fef7003334742cbf77b243fcd36418a1d1bdd480d613a67968f6"
+dependencies = [
+ "lexical-core",
+]
+
+[[package]]
+name = "lexical-core"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46"
+dependencies = [
+ "lexical-parse-float",
+ "lexical-parse-integer",
+ "lexical-util",
+ "lexical-write-float",
+ "lexical-write-integer",
+]
+
+[[package]]
+name = "lexical-parse-float"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f"
+dependencies = [
+ "lexical-parse-integer",
+ "lexical-util",
+ "static_assertions",
+]
+
+[[package]]
+name = "lexical-parse-integer"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9"
+dependencies = [
+ "lexical-util",
+ "static_assertions",
+]
+
+[[package]]
+name = "lexical-util"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc"
+dependencies = [
+ "static_assertions",
+]
+
+[[package]]
+name = "lexical-write-float"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862"
+dependencies = [
+ "lexical-util",
+ "lexical-write-integer",
+ "static_assertions",
+]
+
+[[package]]
+name = "lexical-write-integer"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446"
+dependencies = [
+ "lexical-util",
+ "static_assertions",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.148"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b"
+
+[[package]]
+name = "libflate"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ff4ae71b685bbad2f2f391fe74f6b7659a34871c08b210fdc039e43bee07d18"
+dependencies = [
+ "adler32",
+ "crc32fast",
+ "libflate_lz77",
+]
+
+[[package]]
+name = "libflate_lz77"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a52d3a8bfc85f250440e4424db7d857e241a3aebbbe301f3eb606ab15c39acbf"
+dependencies = [
+ "rle-decode-fast",
+]
+
+[[package]]
+name = "libgit2-sys"
+version = "0.15.2+1.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a80df2e11fb4a61f4ba2ab42dbe7f74468da143f1a75c74e11dee7c813f694fa"
+dependencies = [
+ "cc",
+ "libc",
+ "libz-sys",
+ "pkg-config",
+]
+
+[[package]]
+name = "libloading"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d580318f95776505201b28cf98eb1fa5e4be3b689633ba6a3e6cd880ff22d8cb"
+dependencies = [
+ "cfg-if",
+ "windows-sys",
+]
+
+[[package]]
+name = "libm"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4"
+
+[[package]]
+name = "libmimalloc-sys"
+version = "0.1.35"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3979b5c37ece694f1f5e51e7ecc871fdb0f517ed04ee45f88d15d6d553cb9664"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "libz-ng-sys"
+version = "1.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3dd9f43e75536a46ee0f92b758f6b63846e594e86638c61a9251338a65baea63"
+dependencies = [
+ "cmake",
+ "libc",
+]
+
+[[package]]
+name = "libz-sys"
+version = "1.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "lock_api"
+version = "0.4.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
+
+[[package]]
+name = "lz4"
+version = "1.24.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e9e2dd86df36ce760a60f6ff6ad526f7ba1f14ba0356f8254fb6905e6494df1"
+dependencies = [
+ "libc",
+ "lz4-sys",
+]
+
+[[package]]
+name = "lz4-sys"
+version = "1.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "matrixmultiply"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "090126dc04f95dc0d1c1c91f61bdd474b3930ca064c1edc8a849da2c6cbe1e77"
+dependencies = [
+ "autocfg",
+ "rawpointer",
+]
+
+[[package]]
+name = "memchr"
+version = "2.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c"
+
+[[package]]
+name = "memmap2"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f49388d20533534cd19360ad3d6a7dadc885944aa802ba3995040c5ec11288c6"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "memoffset"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "mimalloc"
+version = "0.1.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa01922b5ea280a911e323e4d2fd24b7fe5cc4042e0d2cda3c40775cdc4bdc9c"
+dependencies = [
+ "libmimalloc-sys",
+]
+
+[[package]]
+name = "mime"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+
+[[package]]
+name = "miniz_oxide"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
+dependencies = [
+ "adler",
+]
+
+[[package]]
+name = "mio"
+version = "0.8.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2"
+dependencies = [
+ "libc",
+ "log",
+ "wasi",
+ "windows-sys",
+]
+
+[[package]]
+name = "multiversion"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2c7b9d7fe61760ce5ea19532ead98541f6b4c495d87247aff9826445cf6872a"
+dependencies = [
+ "multiversion-macros",
+ "target-features",
+]
+
+[[package]]
+name = "multiversion-macros"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26a83d8500ed06d68877e9de1dde76c1dbb83885dcdbda4ef44ccbc3fbda2ac8"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+ "target-features",
+]
+
+[[package]]
+name = "ndarray"
+version = "0.15.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32"
+dependencies = [
+ "matrixmultiply",
+ "num-complex",
+ "num-integer",
+ "num-traits",
+ "rawpointer",
+]
+
+[[package]]
+name = "now"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d89e9874397a1f0a52fc1f197a8effd9735223cb2390e9dcc83ac6cd02923d0"
+dependencies = [
+ "chrono",
+]
+
+[[package]]
+name = "ntapi"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "num-complex"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2"
+dependencies = [
+ "autocfg",
+ "libm",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "numpy"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef41cbb417ea83b30525259e30ccef6af39b31c240bda578889494c5392d331"
+dependencies = [
+ "libc",
+ "ndarray",
+ "num-complex",
+ "num-integer",
+ "num-traits",
+ "pyo3",
+ "rustc-hash",
+]
+
+[[package]]
+name = "object"
+version = "0.32.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "object_store"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d359e231e5451f4f9fa889d56e3ce34f8724f1a61db2107739359717cf2bbf08"
+dependencies = [
+ "async-trait",
+ "base64",
+ "bytes",
+ "chrono",
+ "futures",
+ "humantime",
+ "hyper",
+ "itertools",
+ "parking_lot",
+ "percent-encoding",
+ "quick-xml",
+ "rand",
+ "reqwest",
+ "ring",
+ "rustls-pemfile",
+ "serde",
+ "serde_json",
+ "snafu",
+ "tokio",
+ "tracing",
+ "url",
+ "walkdir",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+
+[[package]]
+name = "parking_lot"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-targets",
+]
+
+[[package]]
+name = "parquet-format-safe"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1131c54b167dd4e4799ce762e1ab01549ebb94d5bdd13e6ec1b467491c378e1f"
+dependencies = [
+ "async-trait",
+ "futures",
+]
+
+[[package]]
+name = "parse-zoneinfo"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41"
+dependencies = [
+ "regex",
+]
+
+[[package]]
+name = "percent-encoding"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
+
+[[package]]
+name = "phf"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc"
+dependencies = [
+ "phf_shared",
+]
+
+[[package]]
+name = "phf_codegen"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a"
+dependencies = [
+ "phf_generator",
+ "phf_shared",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0"
+dependencies = [
+ "phf_shared",
+ "rand",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b"
+dependencies = [
+ "siphasher",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
+
+[[package]]
+name = "planus"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc1691dd09e82f428ce8d6310bd6d5da2557c82ff17694d2a32cad7242aea89f"
+dependencies = [
+ "array-init-cursor",
+]
+
+[[package]]
+name = "polars"
+version = "0.34.2"
+dependencies = [
+ "getrandom",
+ "polars-core",
+ "polars-io",
+ "polars-lazy",
+ "polars-ops",
+ "polars-sql",
+ "polars-time",
+ "version_check",
+]
+
+[[package]]
+name = "polars-algo"
+version = "0.34.2"
+dependencies = [
+ "polars-core",
+ "polars-lazy",
+ "polars-ops",
+]
+
+[[package]]
+name = "polars-arrow"
+version = "0.34.2"
+dependencies = [
+ "ahash",
+ "arrow-format",
+ "atoi",
+ "avro-schema",
+ "bytemuck",
+ "chrono",
+ "chrono-tz",
+ "dyn-clone",
+ "either",
+ "ethnum",
+ "foreign_vec",
+ "futures",
+ "getrandom",
+ "hashbrown 0.14.0",
+ "lexical-core",
+ "lz4",
+ "multiversion",
+ "num-traits",
+ "polars-error",
+ "rustc_version",
+ "serde",
+ "simdutf8",
+ "streaming-iterator",
+ "strength_reduce",
+ "zstd",
+]
+
+[[package]]
+name = "polars-core"
+version = "0.34.2"
+dependencies = [
+ "ahash",
+ "bitflags 2.4.0",
+ "bytemuck",
+ "chrono",
+ "chrono-tz",
+ "comfy-table",
+ "either",
+ "hashbrown 0.14.0",
+ "indexmap 2.0.0",
+ "itoap",
+ "ndarray",
+ "num-traits",
+ "once_cell",
+ "polars-arrow",
+ "polars-error",
+ "polars-row",
+ "polars-utils",
+ "rand",
+ "rand_distr",
+ "rayon",
+ "regex",
+ "serde",
+ "serde_json",
+ "smartstring",
+ "thiserror",
+ "version_check",
+ "xxhash-rust",
+]
+
+[[package]]
+name = "polars-error"
+version = "0.34.2"
+dependencies = [
+ "arrow-format",
+ "avro-schema",
+ "object_store",
+ "regex",
+ "simdutf8",
+ "thiserror",
+]
+
+[[package]]
+name = "polars-ffi"
+version = "0.34.2"
+dependencies = [
+ "polars-arrow",
+ "polars-core",
+]
+
+[[package]]
+name = "polars-io"
+version = "0.34.2"
+dependencies = [
+ "ahash",
+ "async-trait",
+ "bytes",
+ "chrono",
+ "chrono-tz",
+ "fast-float",
+ "flate2",
+ "futures",
+ "home",
+ "itoa",
+ "lexical",
+ "lexical-core",
+ "memchr",
+ "memmap2",
+ "num-traits",
+ "object_store",
+ "once_cell",
+ "percent-encoding",
+ "polars-arrow",
+ "polars-core",
+ "polars-error",
+ "polars-json",
+ "polars-parquet",
+ "polars-time",
+ "polars-utils",
+ "rayon",
+ "regex",
+ "reqwest",
+ "ryu",
+ "serde",
+ "serde_json",
+ "simd-json",
+ "simdutf8",
+ "smartstring",
+ "tokio",
+ "tokio-util",
+ "url",
+]
+
+[[package]]
+name = "polars-json"
+version = "0.34.2"
+dependencies = [
+ "ahash",
+ "chrono",
+ "fallible-streaming-iterator",
+ "hashbrown 0.14.0",
+ "indexmap 2.0.0",
+ "itoa",
+ "num-traits",
+ "polars-arrow",
+ "polars-error",
+ "polars-utils",
+ "ryu",
+ "simd-json",
+ "streaming-iterator",
+]
+
+[[package]]
+name = "polars-lazy"
+version = "0.34.2"
+dependencies = [
+ "ahash",
+ "bitflags 2.4.0",
+ "futures",
+ "glob",
+ "once_cell",
+ "polars-arrow",
+ "polars-core",
+ "polars-io",
+ "polars-json",
+ "polars-ops",
+ "polars-pipe",
+ "polars-plan",
+ "polars-time",
+ "polars-utils",
+ "pyo3",
+ "rayon",
+ "smartstring",
+ "tokio",
+ "version_check",
+]
+
+[[package]]
+name = "polars-ops"
+version = "0.34.2"
+dependencies = [
+ "ahash",
+ "argminmax",
+ "base64",
+ "bytemuck",
+ "chrono",
+ "chrono-tz",
+ "either",
+ "hashbrown 0.14.0",
+ "hex",
+ "indexmap 2.0.0",
+ "jsonpath_lib",
+ "memchr",
+ "num-traits",
+ "polars-arrow",
+ "polars-core",
+ "polars-error",
+ "polars-json",
+ "polars-utils",
+ "rand",
+ "rand_distr",
+ "rayon",
+ "regex",
+ "serde",
+ "serde_json",
+ "smartstring",
+ "version_check",
+]
+
+[[package]]
+name = "polars-parquet"
+version = "0.34.2"
+dependencies = [
+ "ahash",
+ "async-stream",
+ "base64",
+ "brotli",
+ "ethnum",
+ "flate2",
+ "futures",
+ "lz4",
+ "num-traits",
+ "parquet-format-safe",
+ "polars-arrow",
+ "polars-error",
+ "polars-utils",
+ "seq-macro",
+ "simdutf8",
+ "snap",
+ "streaming-decompression",
+ "zstd",
+]
+
+[[package]]
+name = "polars-pipe"
+version = "0.34.2"
+dependencies = [
+ "crossbeam-channel",
+ "crossbeam-queue",
+ "enum_dispatch",
+ "hashbrown 0.14.0",
+ "num-traits",
+ "polars-arrow",
+ "polars-core",
+ "polars-io",
+ "polars-ops",
+ "polars-plan",
+ "polars-row",
+ "polars-utils",
+ "rayon",
+ "smartstring",
+ "tokio",
+ "version_check",
+]
+
+[[package]]
+name = "polars-plan"
+version = "0.34.2"
+dependencies = [
+ "ahash",
+ "bytemuck",
+ "chrono",
+ "chrono-tz",
+ "ciborium",
+ "libloading",
+ "once_cell",
+ "percent-encoding",
+ "polars-arrow",
+ "polars-core",
+ "polars-ffi",
+ "polars-io",
+ "polars-ops",
+ "polars-parquet",
+ "polars-time",
+ "polars-utils",
+ "pyo3",
+ "rayon",
+ "regex",
+ "serde",
+ "smartstring",
+ "strum_macros 0.25.2",
+ "version_check",
+]
+
+[[package]]
+name = "polars-row"
+version = "0.34.2"
+dependencies = [
+ "polars-arrow",
+ "polars-error",
+ "polars-utils",
+]
+
+[[package]]
+name = "polars-sql"
+version = "0.34.2"
+dependencies = [
+ "polars-arrow",
+ "polars-core",
+ "polars-error",
+ "polars-lazy",
+ "polars-plan",
+ "rand",
+ "serde",
+ "serde_json",
+ "sqlparser",
+]
+
+[[package]]
+name = "polars-time"
+version = "0.34.2"
+dependencies = [
+ "atoi",
+ "chrono",
+ "chrono-tz",
+ "now",
+ "once_cell",
+ "polars-arrow",
+ "polars-core",
+ "polars-error",
+ "polars-ops",
+ "polars-utils",
+ "regex",
+ "serde",
+ "smartstring",
+]
+
+[[package]]
+name = "polars-utils"
+version = "0.34.2"
+dependencies = [
+ "ahash",
+ "bytemuck",
+ "hashbrown 0.14.0",
+ "indexmap 2.0.0",
+ "num-traits",
+ "once_cell",
+ "polars-error",
+ "rayon",
+ "smartstring",
+ "sysinfo",
+ "version_check",
+]
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.67"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "py-polars"
+version = "0.19.12"
+dependencies = [
+ "ahash",
+ "built",
+ "ciborium",
+ "either",
+ "jemallocator",
+ "lexical-core",
+ "libc",
+ "mimalloc",
+ "ndarray",
+ "numpy",
+ "once_cell",
+ "polars",
+ "polars-algo",
+ "polars-core",
+ "polars-error",
+ "polars-lazy",
+ "polars-ops",
+ "polars-parquet",
+ "polars-plan",
+ "pyo3",
+ "pyo3-built",
+ "serde_json",
+ "smartstring",
+ "thiserror",
+]
+
+[[package]]
+name = "pyo3"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04e8453b658fe480c3e70c8ed4e3d3ec33eb74988bd186561b0cc66b85c3bc4b"
+dependencies = [
+ "cfg-if",
+ "indoc",
+ "inventory",
+ "libc",
+ "memoffset",
+ "parking_lot",
+ "pyo3-build-config",
+ "pyo3-ffi",
+ "pyo3-macros",
+ "unindent",
+]
+
+[[package]]
+name = "pyo3-build-config"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a96fe70b176a89cff78f2fa7b3c930081e163d5379b4dcdf993e3ae29ca662e5"
+dependencies = [
+ "once_cell",
+ "target-lexicon",
+]
+
+[[package]]
+name = "pyo3-built"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be6d574e0f8cab2cdd1eeeb640cbf845c974519fa9e9b62fa9c08ecece0ca5de"
+
+[[package]]
+name = "pyo3-ffi"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "214929900fd25e6604661ed9cf349727c8920d47deff196c4e28165a6ef2a96b"
+dependencies = [
+ "libc",
+ "pyo3-build-config",
+]
+
+[[package]]
+name = "pyo3-macros"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dac53072f717aa1bfa4db832b39de8c875b7c7af4f4a6fe93cdbf9264cf8383b"
+dependencies = [
+ "proc-macro2",
+ "pyo3-macros-backend",
+ "quote",
+ "syn 2.0.36",
+]
+
+[[package]]
+name = "pyo3-macros-backend"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7774b5a8282bd4f25f803b1f0d945120be959a36c72e08e7cd031c792fdfd424"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.36",
+]
+
+[[package]]
+name = "quick-xml"
+version = "0.28.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ce5e73202a820a31f8a0ee32ada5e21029c81fd9e3ebf668a40832e4219d9d1"
+dependencies = [
+ "memchr",
+ "serde",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "rand_distr"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31"
+dependencies = [
+ "num-traits",
+ "rand",
+]
+
+[[package]]
+name = "rawpointer"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
+
+[[package]]
+name = "rayon"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1"
+dependencies = [
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed"
+dependencies = [
+ "crossbeam-deque",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+dependencies = [
+ "bitflags 1.3.2",
+]
+
+[[package]]
+name = "regex"
+version = "1.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"
+
+[[package]]
+name = "reqwest"
+version = "0.11.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1"
+dependencies = [
+ "base64",
+ "bytes",
+ "encoding_rs",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "hyper",
+ "hyper-rustls",
+ "ipnet",
+ "js-sys",
+ "log",
+ "mime",
+ "once_cell",
+ "percent-encoding",
+ "pin-project-lite",
+ "rustls",
+ "rustls-pemfile",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "tokio",
+ "tokio-rustls",
+ "tokio-util",
+ "tower-service",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "wasm-streams",
+ "web-sys",
+ "webpki-roots",
+ "winreg",
+]
+
+[[package]]
+name = "ring"
+version = "0.16.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"
+dependencies = [
+ "cc",
+ "libc",
+ "once_cell",
+ "spin",
+ "untrusted",
+ "web-sys",
+ "winapi",
+]
+
+[[package]]
+name = "rle-decode-fast"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3582f63211428f83597b51b2ddb88e2a91a9d52d12831f9d08f5e624e8977422"
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+
+[[package]]
+name = "rustc-hash"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
+
+[[package]]
+name = "rustc_version"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
+dependencies = [
+ "semver",
+]
+
+[[package]]
+name = "rustls"
+version = "0.21.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8"
+dependencies = [
+ "log",
+ "ring",
+ "rustls-webpki",
+ "sct",
+]
+
+[[package]]
+name = "rustls-pemfile"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2"
+dependencies = [
+ "base64",
+]
+
+[[package]]
+name = "rustls-webpki"
+version = "0.101.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "45a27e3b59326c16e23d30aeb7a36a24cc0d29e71d68ff611cdfb4a01d013bed"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "rustversion"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
+
+[[package]]
+name = "ryu"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
+[[package]]
+name = "sct"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "semver"
+version = "1.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "seq-macro"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4"
+
+[[package]]
+name = "serde"
+version = "1.0.188"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.188"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.36",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.107"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65"
+dependencies = [
+ "indexmap 2.0.0",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_spanned"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "serde_urlencoded"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
+dependencies = [
+ "form_urlencoded",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "signal-hook"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801"
+dependencies = [
+ "libc",
+ "signal-hook-registry",
+]
+
+[[package]]
+name = "signal-hook-mio"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af"
+dependencies = [
+ "libc",
+ "mio",
+ "signal-hook",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "simd-json"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0f07a84c7456b901b8dd2c1d44caca8b0fd2c2616206ee5acc9d9da61e8d9ec"
+dependencies = [
+ "ahash",
+ "getrandom",
+ "halfbrown",
+ "lexical-core",
+ "once_cell",
+ "serde",
+ "serde_json",
+ "simdutf8",
+ "value-trait",
+]
+
+[[package]]
+name = "simdutf8"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a"
+
+[[package]]
+name = "siphasher"
+version = "0.3.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
+
+[[package]]
+name = "slab"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9"
+
+[[package]]
+name = "smartstring"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29"
+dependencies = [
+ "autocfg",
+ "serde",
+ "static_assertions",
+ "version_check",
+]
+
+[[package]]
+name = "snafu"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4de37ad025c587a29e8f3f5605c00f70b98715ef90b9061a815b9e59e9042d6"
+dependencies = [
+ "doc-comment",
+ "snafu-derive",
+]
+
+[[package]]
+name = "snafu-derive"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "990079665f075b699031e9c08fd3ab99be5029b96f3b78dc0709e8f77e4efebf"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "snap"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e9f0ab6ef7eb7353d9119c170a436d1bf248eea575ac42d19d12f4e34130831"
+
+[[package]]
+name = "socket2"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "socket2"
+version = "0.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e"
+dependencies = [
+ "libc",
+ "windows-sys",
+]
+
+[[package]]
+name = "spin"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
+
+[[package]]
+name = "sqlparser"
+version = "0.38.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0272b7bb0a225320170c99901b4b5fb3a4384e255a7f2cc228f61e2ba3893e75"
+dependencies = [
+ "log",
+]
+
+[[package]]
+name = "static_assertions"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
+[[package]]
+name = "streaming-decompression"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf6cc3b19bfb128a8ad11026086e31d3ce9ad23f8ea37354b31383a187c44cf3"
+dependencies = [
+ "fallible-streaming-iterator",
+]
+
+[[package]]
+name = "streaming-iterator"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520"
+
+[[package]]
+name = "strength_reduce"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82"
+
+[[package]]
+name = "strum"
+version = "0.24.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f"
+
+[[package]]
+name = "strum_macros"
+version = "0.24.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "rustversion",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "strum_macros"
+version = "0.25.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad8d03b598d3d0fff69bf533ee3ef19b8eeb342729596df84bcc7e1f96ec4059"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "rustversion",
+ "syn 2.0.36",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.36"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91e02e55d62894af2a08aca894c6577281f76769ba47c94d5756bec8ac6e7373"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "sysinfo"
+version = "0.29.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a18d114d420ada3a891e6bc8e96a2023402203296a47cdd65083377dad18ba5"
+dependencies = [
+ "cfg-if",
+ "core-foundation-sys",
+ "libc",
+ "ntapi",
+ "once_cell",
+ "winapi",
+]
+
+[[package]]
+name = "target-features"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06f6b473c37f9add4cf1df5b4d66a8ef58ab6c895f1a3b3f949cf3e21230140e"
+
+[[package]]
+name = "target-lexicon"
+version = "0.12.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a"
+
+[[package]]
+name = "thiserror"
+version = "1.0.48"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.48"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.36",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+
+[[package]]
+name = "tokio"
+version = "1.32.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9"
+dependencies = [
+ "backtrace",
+ "bytes",
+ "libc",
+ "mio",
+ "num_cpus",
+ "pin-project-lite",
+ "socket2 0.5.4",
+ "tokio-macros",
+ "windows-sys",
+]
+
+[[package]]
+name = "tokio-macros"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.36",
+]
+
+[[package]]
+name = "tokio-rustls"
+version = "0.24.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
+dependencies = [
+ "rustls",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.7.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "toml"
+version = "0.7.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257"
+dependencies = [
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "toml_edit",
+]
+
+[[package]]
+name = "toml_datetime"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.19.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
+dependencies = [
+ "indexmap 2.0.0",
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "winnow",
+]
+
+[[package]]
+name = "tower-service"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
+
+[[package]]
+name = "tracing"
+version = "0.1.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
+dependencies = [
+ "cfg-if",
+ "pin-project-lite",
+ "tracing-attributes",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-attributes"
+version = "0.1.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.36",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-width"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
+
+[[package]]
+name = "unindent"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce"
+
+[[package]]
+name = "untrusted"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
+
+[[package]]
+name = "url"
+version = "2.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "percent-encoding",
+]
+
+[[package]]
+name = "value-trait"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09a5b6c8ceb01263b969cac48d4a6705134d490ded13d889e52c0cfc80c6945e"
+dependencies = [
+ "float-cmp",
+ "halfbrown",
+ "itoa",
+ "ryu",
+]
+
+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "walkdir"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee"
+dependencies = [
+ "same-file",
+ "winapi-util",
+]
+
+[[package]]
+name = "want"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
+dependencies = [
+ "try-lock",
+]
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.36",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03"
+dependencies = [
+ "cfg-if",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.36",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1"
+
+[[package]]
+name = "wasm-streams"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7"
+dependencies = [
+ "futures-util",
+ "js-sys",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+]
+
+[[package]]
+name = "web-sys"
+version = "0.3.64"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "webpki-roots"
+version = "0.25.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc"
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "windows"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+
+[[package]]
+name = "winnow"
+version = "0.5.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "winreg"
+version = "0.50.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1"
+dependencies = [
+ "cfg-if",
+ "windows-sys",
+]
+
+[[package]]
+name = "xxhash-rust"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9828b178da53440fa9c766a3d2f73f7cf5d0ac1fe3980c1e5018d899fd19e07b"
+
+[[package]]
+name = "zerocopy"
+version = "0.7.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c19fae0c8a9efc6a8281f2e623db8af1db9e57852e04cde3e754dd2dc29340f"
+dependencies = [
+ "zerocopy-derive",
+]
+
+[[package]]
+name = "zerocopy-derive"
+version = "0.7.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc56589e9ddd1f1c28d4b4b5c773ce232910a6bb67a70133d61c9e347585efe9"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.36",
+]
+
+[[package]]
+name = "zstd"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bffb3309596d527cfcba7dfc6ed6052f1d39dfbd7c867aa2e865e4a449c10110"
+dependencies = [
+ "zstd-safe",
+]
+
+[[package]]
+name = "zstd-safe"
+version = "7.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43747c7422e2924c11144d5229878b98180ef8b06cca4ab5af37afc8a8d8ea3e"
+dependencies = [
+ "zstd-sys",
+]
+
+[[package]]
+name = "zstd-sys"
+version = "2.0.8+zstd.1.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+]
diff --git a/nixpkgs/pkgs/development/python-modules/polars/default.nix b/nixpkgs/pkgs/development/python-modules/polars/default.nix
new file mode 100644
index 000000000000..991a3a3684cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/polars/default.nix
@@ -0,0 +1,91 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, rustPlatform
+, cmake
+, libiconv
+, fetchFromGitHub
+, typing-extensions
+, jemalloc
+, rust-jemalloc-sys
+, darwin
+}:
+let
+  pname = "polars";
+  version = "0.19.12";
+  rootSource = fetchFromGitHub {
+    owner = "pola-rs";
+    repo = "polars";
+    rev = "refs/tags/py-${version}";
+    hash = "sha256-6tn3Q6oZfMjgQ5l5xCFnGimLSDLOjTWCW5uEbi6yFZY=";
+  };
+  rust-jemalloc-sys' = rust-jemalloc-sys.override {
+    jemalloc = jemalloc.override {
+      disableInitExecTls = true;
+    };
+  };
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+  src = rootSource;
+
+  # Cargo.lock file is sometimes behind actual release which throws an error,
+  # thus the `sed` command
+  # Make sure to check that the right substitutions are made when updating the package
+  preBuild = ''
+    cd py-polars
+    #sed -i 's/version = "0.18.0"/version = "${version}"/g' Cargo.lock
+  '';
+
+  cargoDeps = rustPlatform.importCargoLock {
+    lockFile = ./Cargo.lock;
+    outputHashes = {
+      "jsonpath_lib-0.3.0" = "sha256-NKszYpDGG8VxfZSMbsTlzcMGFHBOUeFojNw4P2wM3qk=";
+    };
+  };
+  cargoRoot = "py-polars";
+
+  # Revisit this whenever package or Rust is upgraded
+  RUSTC_BOOTSTRAP = 1;
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.11") [ typing-extensions ];
+
+  dontUseCmakeConfigure = true;
+
+  nativeBuildInputs = [
+    # needed for libz-ng-sys
+    # TODO: use pkgs.zlib-ng
+    cmake
+  ] ++ (with rustPlatform; [
+    cargoSetupHook
+    maturinBuildHook
+  ]);
+
+  buildInputs = [
+    rust-jemalloc-sys'
+  ] ++ lib.optionals stdenv.isDarwin [
+    libiconv
+    darwin.apple_sdk.frameworks.Security
+  ];
+
+  pythonImportsCheck = [ "polars" ];
+  # nativeCheckInputs = [
+  #   pytestCheckHook
+  #   fixtures
+  #   graphviz
+  #   matplotlib
+  #   networkx
+  #   numpy
+  #   pydot
+  # ];
+
+  meta = with lib; {
+    description = "Fast multi-threaded DataFrame library in Rust | Python | Node.js ";
+    homepage = "https://github.com/pola-rs/polars";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/polib/default.nix b/nixpkgs/pkgs/development/python-modules/polib/default.nix
new file mode 100644
index 000000000000..c96b90b6c521
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/polib/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "polib";
+  version = "1.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8++Urv7W4YPjQqiiaa4fxHQroZMYatdvF1k4Yh2/wms=";
+  };
+
+  # error: invalid command 'test'
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A library to manipulate gettext files (po and mo files)";
+    homepage = "https://bitbucket.org/izi/polib/";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/policy-sentry/default.nix b/nixpkgs/pkgs/development/python-modules/policy-sentry/default.nix
new file mode 100644
index 000000000000..26db669e94ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/policy-sentry/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, requests
+, schema
+}:
+
+buildPythonPackage rec {
+  pname = "policy-sentry";
+  version = "0.12.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "salesforce";
+    repo = "policy_sentry";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Kha5fq5l1yXWjDZq9GFKk3gYRtrEyiCFjbEAdYGPSa8=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    click
+    requests
+    pyyaml
+    schema
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "policy_sentry"
+  ];
+
+  meta = with lib; {
+    description = "Python module for generating IAM least privilege policies";
+    homepage = "https://github.com/salesforce/policy_sentry";
+    changelog = "https://github.com/salesforce/policy_sentry/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/policyuniverse/default.nix b/nixpkgs/pkgs/development/python-modules/policyuniverse/default.nix
new file mode 100644
index 000000000000..082fe4ec1965
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/policyuniverse/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "policyuniverse";
+  version = "1.5.1.20230817";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-eSCJYZWvFjIwY18aXO4JWPVgA++MQh+AXsgfE0+ApXw=";
+  };
+
+  # Tests are not shipped and there are no GitHub tags
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "policyuniverse"
+  ];
+
+  meta = with lib; {
+    description = "Parse and Process AWS IAM Policies, Statements, ARNs and wildcards";
+    homepage = "https://github.com/Netflix-Skunkworks/policyuniverse";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/polling/default.nix b/nixpkgs/pkgs/development/python-modules/polling/default.nix
new file mode 100644
index 000000000000..ee8165858933
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/polling/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, wheel
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "polling";
+  version = "0.3.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "justiniso";
+    repo = "polling";
+    rev = "v${version}";
+    hash = "sha256-Qy2QxCWzAjZMJ6yxZiDT/80I2+rLimoG8/SYxq960Tk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  pythonImportsCheck = [
+    "polling"
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Powerful polling utility in Python";
+    homepage = "https://github.com/justiniso/polling";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/polygon3/default.nix b/nixpkgs/pkgs/development/python-modules/polygon3/default.nix
new file mode 100644
index 000000000000..e8bb253202bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/polygon3/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage {
+  pname = "polygon3";
+  version = "3.0.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "jraedler";
+    repo = "Polygon3";
+    rev = "7b2091f77741fa1d94251979bc4a4f2676b4d2d1";
+    hash = "sha256-jXtjEzjWwMoVgrHWsK8brSN6TQRxIPRjUaRiLBXYLcI=";
+  };
+
+  # malloc error on running the tests
+  #  python3.10(30620,0x115b74600) malloc: *** error for object 0x10d6db580: pointer being freed was not allocated
+  # > python3.10(30620,0x115b74600) malloc: *** set a breakpoint in malloc_error_break to debug
+  # > /nix/store/vbi8rnz0k3jyh4h4g16bbkchdd8mnxw7-setuptools-check-hook/nix-support/setup-hook: line 4: 30620 Abort trap: 6           /nix/store/5cxanhipcbfxnrqgw2qsr3zqr4z711bj-python3-3.10.12/bin/python3.10 nix_run_setup test
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Polygon is a python package that handles polygonal shapes in 2D";
+    homepage = "https://github.com/jraedler/Polygon3";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/polyline/default.nix b/nixpkgs/pkgs/development/python-modules/polyline/default.nix
new file mode 100644
index 000000000000..5ab360ae7e37
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/polyline/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "polyline";
+  version = "2.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "frederickjansen";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-e9ZDqcS3MaMlXi2a2JHI6NtRPqIV7rjsucGXEH6V8LA=";
+  };
+
+  patches = [
+    # https://github.com/frederickjansen/polyline/pull/15
+    (fetchpatch {
+      name = "relax-build-dependencies.patch";
+      url = "https://github.com/frederickjansen/polyline/commit/cb9fc80606c33dbbcaa0d94de25ae952358443b6.patch";
+      hash = "sha256-epg2pZAG+9QuICa1ms+/EO2DDmYEz+KEtxxnvG7rsWY=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=polyline --cov-report term-missing" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "polyline"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of Google's Encoded Polyline Algorithm Format";
+    longDescription = ''
+      polyline is a Python implementation of Google's Encoded Polyline Algorithm Format. It is
+      essentially a port of https://github.com/mapbox/polyline.
+    '';
+    homepage = "https://github.com/frederickjansen/polyline";
+    changelog = "https://github.com/frederickjansen/polyline/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ersin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pomegranate/default.nix b/nixpkgs/pkgs/development/python-modules/pomegranate/default.nix
new file mode 100644
index 000000000000..57d6dd0b9ab6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pomegranate/default.nix
@@ -0,0 +1,40 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, scipy
+, cython
+, networkx
+, joblib
+, pandas
+, nose
+, pyyaml
+}:
+
+
+buildPythonPackage rec {
+  pname = "pomegranate";
+  version = "1.0.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    repo = pname;
+    owner = "jmschrei";
+    # no tags for recent versions: https://github.com/jmschrei/pomegranate/issues/974
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-EnxKlRRfsOIDLAhYOq7bUSbI/NvPoSyYCZ9D5VCXFGQ=";
+  };
+
+  propagatedBuildInputs = [ numpy scipy cython networkx joblib pyyaml ];
+
+  nativeCheckInputs = [ pandas nose ];  # as of 0.13.5, it depends explicitly on nose, rather than pytest.
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Probabilistic and graphical models for Python, implemented in cython for speed";
+    homepage = "https://github.com/jmschrei/pomegranate";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rybern ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pomegranate/disable-failed-on-nextworkx-2.6.patch b/nixpkgs/pkgs/development/python-modules/pomegranate/disable-failed-on-nextworkx-2.6.patch
new file mode 100644
index 000000000000..484ca4f9cbc8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pomegranate/disable-failed-on-nextworkx-2.6.patch
@@ -0,0 +1,26 @@
+Test started failing after upgrading networkx 2.5.1 -> 2.6.2:
+    https://github.com/jmschrei/pomegranate/issues/939
+
+Failures look benigh.
+--- a/tests/test_bayesian_network.py
++++ b/tests/test_bayesian_network.py
+@@ -1057,7 +1057,8 @@ def test_exact_structure_learning_exclude_edges():
+         assert_not_equal(model.structure[-2], (d-1,))
+         assert_equal(model.structure[-2], (1,))
+ 
+-def test_exact_dp_structure_learning_exclude_edges():
++# disabled for https://github.com/jmschrei/pomegranate/issues/939
++def disabled_exact_dp_structure_learning_exclude_edges():
+     for X in datasets:
+         X = X.copy()
+         X[:,1] = X[:,-1]
+@@ -1139,7 +1140,8 @@ def test_constrained_parents_structure_learning_exclude_edges():
+     assert_equal(model.structure[7], (2,))
+     assert_equal(model.structure[4], (0,))
+ 
+-def test_constrained_slap_structure_learning_exclude_edges():
++# disabled for https://github.com/jmschrei/pomegranate/issues/939
++def disabled_constrained_slap_structure_learning_exclude_edges():
+     for X in datasets:
+         X = X.copy()
+         X[:,1] = X[:,-1]
diff --git a/nixpkgs/pkgs/development/python-modules/pontos/default.nix b/nixpkgs/pkgs/development/python-modules/pontos/default.nix
new file mode 100644
index 000000000000..70cf9bc721dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pontos/default.nix
@@ -0,0 +1,86 @@
+{ lib
+, buildPythonPackage
+, colorful
+, fetchFromGitHub
+, git
+, httpx
+, lxml
+, packaging
+, poetry-core
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, semver
+, rich
+, tomlkit
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "pontos";
+  version = "23.9.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "greenbone";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-HRIGS2B6tc4qaOMTud5/uhEr1k7puqJUugDj1WuacqU=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    colorful
+    httpx
+    lxml
+    packaging
+    python-dateutil
+    semver
+    rich
+    typing-extensions
+    tomlkit
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ] ++ httpx.optional-dependencies.http2;
+
+  nativeCheckInputs = [
+    git
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "PrepareTestCase"
+    # Signing fails
+    "test_find_no_signing_key"
+    "test_find_signing_key"
+    "test_find_unreleased_information"
+    # CLI test fails
+    "test_missing_cmd"
+    "test_update_file_changed"
+    # Network access
+    "test_fail_sign_on_upload_fail"
+    "test_successfully_sign"
+    # calls git log, but our fetcher removes .git
+    "test_git_error"
+    # Tests require git executable
+    "test_github_action_output"
+    "test_initial_release"
+  ];
+
+  pythonImportsCheck = [
+    "pontos"
+  ];
+
+  meta = with lib; {
+    description = "Collection of Python utilities, tools, classes and functions";
+    homepage = "https://github.com/greenbone/pontos";
+    changelog = "https://github.com/greenbone/pontos/releases/tag/v${version}";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pony/default.nix b/nixpkgs/pkgs/development/python-modules/pony/default.nix
new file mode 100644
index 000000000000..892cb0829baf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pony/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "pony";
+  version = "0.7.17";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8" || pythonAtLeast "3.12";
+
+  src = fetchFromGitHub {
+    owner = "ponyorm";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-wBqw+YHKlxYplgsYL1pbkusHyPfCaVPcH/Yku6WDYbE=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests are outdated
+    "test_method"
+  ];
+
+  pythonImportsCheck = [
+    "pony"
+  ];
+
+  meta = with lib; {
+    description = "Library for advanced object-relational mapping";
+    homepage = "https://ponyorm.org/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ d-goldin xvapx ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ponywhoosh/default.nix b/nixpkgs/pkgs/development/python-modules/ponywhoosh/default.nix
new file mode 100644
index 000000000000..589be17b0163
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ponywhoosh/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, pony, whoosh }:
+
+buildPythonPackage rec {
+  pname = "ponywhoosh";
+  version = "1.7.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1mggj9d265hra4z67qyla686qvl0cf79655cszi136gh9hqlibv9";
+  };
+
+  propagatedBuildInputs = [
+    pony
+    whoosh
+  ];
+
+  meta = with lib; {
+    homepage = "https://pythonhosted.org/ponywhoosh/";
+    description = "Make your database over PonyORM searchable";
+    license = licenses.mit;
+    maintainers = with maintainers; [ alexarice ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pooch/default.nix b/nixpkgs/pkgs/development/python-modules/pooch/default.nix
new file mode 100644
index 000000000000..b8ba613ba350
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pooch/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchPypi
+, setuptools
+, setuptools-scm
+, wheel
+, pytestCheckHook
+, packaging
+, platformdirs
+, requests
+, tqdm
+, paramiko
+, xxhash
+}:
+
+buildPythonPackage rec {
+  pname = "pooch";
+  version = "1.7.0";
+  format = "pyproject";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8XShBBtkR/Du+IYPdtF/YO0vhX3A76OHp/CCKK8F2Zg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+    platformdirs
+    requests
+  ];
+
+  passthru = {
+    optional-dependencies = {
+      progress = [ tqdm ];
+      sftp = [ paramiko ];
+      xxhash = [ xxhash ];
+    };
+  };
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # tries to touch network
+  disabledTests = [
+    "check_availability"
+    "decompress"
+    "downloader"
+    "extractprocessor_fails"
+    "integration"
+    "pooch_corrupted"
+    "pooch_custom_url"
+    "pooch_download"
+    "pooch_logging_level"
+    "pooch_update"
+    "processor"
+    "test_fetch"
+    "test_load_registry_from_doi"
+    "test_retrieve"
+    "test_stream_download"
+
+  ];
+
+  meta = with lib; {
+    description = "A friend to fetch your data files.";
+    homepage = "https://github.com/fatiando/pooch";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ GuillaumeDesforges ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pook/default.nix b/nixpkgs/pkgs/development/python-modules/pook/default.nix
new file mode 100644
index 000000000000..79d3eebf93e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pook/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, furl
+, jsonschema
+, nose
+, pytestCheckHook
+, pythonOlder
+, requests
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "pook";
+  version = "1.1.1";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "h2non";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-nLeJAAsJUKFAetZSAQmOtXP+3ZRHvCTFAzycSkK+kiI=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    furl
+    jsonschema
+    requests
+    xmltodict
+  ];
+
+  nativeCheckInputs = [
+    nose
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pook"
+  ];
+
+  meta = with lib; {
+    description = "HTTP traffic mocking and testing made simple in Python";
+    homepage = "https://github.com/h2non/pook";
+    changelog = "https://github.com/h2non/pook/blob/v${version}/History.rst";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/poolsense/default.nix b/nixpkgs/pkgs/development/python-modules/poolsense/default.nix
new file mode 100644
index 000000000000..53d142299707
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/poolsense/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "poolsense";
+  version = "0.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WCyuhk77QNJAiuzccrb2u0mfc81LYrYSSq9atgO0LdE=";
+  };
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "poolsense" ];
+
+  meta = with lib; {
+    description = "Python module to access PoolSense device";
+    homepage = "https://github.com/haemishkyd/poolsense";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/poppler-qt5/default.nix b/nixpkgs/pkgs/development/python-modules/poppler-qt5/default.nix
new file mode 100644
index 000000000000..06c0e7a6e6ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/poppler-qt5/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, fetchPypi
+, sip
+, qtbase
+, qmake
+, pyqt5
+, pyqt-builder
+, poppler
+, pkg-config
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "python-poppler-qt5";
+  version = "21.3.0";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-tHfohB8OoOCf2rby8wXPON+XfZ4ULlaTo3RgXXXdb+A=";
+  };
+
+
+  buildInputs = [ qtbase.dev poppler pyqt-builder ];
+  nativeBuildInputs = [ pkg-config qmake sip setuptools ];
+  propagatedBuildInputs = [ pyqt5.dev ];
+
+  format = "pyproject";
+  dontConfigure = true;
+
+  postPatch = ''
+    cat <<EOF >> pyproject.toml
+    [tool.sip.bindings.Poppler-Qt5]
+    include-dirs = ["${poppler.dev}/include/poppler"]
+    EOF
+  '';
+
+  # no tests, just bindings for `poppler_qt5`
+  doCheck = false;
+  pythonImportsCheck = [ "popplerqt5" ];
+
+  dontWrapQtApps = true;
+
+  meta = with lib; {
+    homepage = "https://github.com/frescobaldi/python-poppler-qt5";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/port-for/default.nix b/nixpkgs/pkgs/development/python-modules/port-for/default.nix
new file mode 100644
index 000000000000..9efcd9acfaff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/port-for/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "port-for";
+  version = "0.7.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "kmike";
+    repo = "port-for";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-/45TQ2crmTupRgL9hgZGw5IvFKywezSIHqHFbeAkMoo=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+  pythonImportsCheck = [ "port_for" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/kmike/port-for";
+    description = "Command-line utility and library that helps with TCP port managment";
+    changelog = "https://github.com/kmike/port-for/blob/v${version}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/portalocker/default.nix b/nixpkgs/pkgs/development/python-modules/portalocker/default.nix
new file mode 100644
index 000000000000..34845722ce4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/portalocker/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, redis
+}:
+
+buildPythonPackage rec {
+  pname = "portalocker";
+  version = "2.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Ay6B1TSojsFzbQP3gLoHPwR6BsR4sG4pN0hvM06VXFE=";
+  };
+
+  propagatedBuildInputs = [
+    redis
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_combined" # no longer compatible with setuptools>=58
+  ];
+
+  pythonImportsCheck = [
+    "portalocker"
+  ];
+
+  meta = with lib; {
+    description = "A library to provide an easy API to file locking";
+    homepage = "https://github.com/WoLpH/portalocker";
+    license = licenses.psfl;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/portend/default.nix b/nixpkgs/pkgs/development/python-modules/portend/default.nix
new file mode 100644
index 000000000000..73356631615f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/portend/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchPypi
+, pythonOlder
+, pytestCheckHook, setuptools-scm, tempora  }:
+
+buildPythonPackage rec {
+  pname = "portend";
+  version = "3.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-UlCjUsGclZ12fKyHi4Kdk+XcdiWlFDOZoqANxmKP+3I=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ tempora ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [
+    "portend"
+  ];
+
+  # Some of the tests use localhost networking.
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Monitor TCP ports for bound or unbound states";
+    homepage = "https://github.com/jaraco/portend";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/portpicker/default.nix b/nixpkgs/pkgs/development/python-modules/portpicker/default.nix
new file mode 100644
index 000000000000..2595e20622d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/portpicker/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, psutil
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "portpicker";
+  version = "1.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vVB/1vlvZe4CeB8uZ06dxsmbv6bjw5mS45FiBMnUMfo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    psutil
+  ];
+
+  pythonImportsCheck = [
+    "portpicker"
+  ];
+
+  meta = with lib; {
+    description = "Library to choose unique available network ports";
+    homepage = "https://github.com/google/python_portpicker";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/posix_ipc/default.nix b/nixpkgs/pkgs/development/python-modules/posix_ipc/default.nix
new file mode 100644
index 000000000000..58f13f20cf03
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/posix_ipc/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "posix-ipc";
+  version = "1.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "osvenskan";
+    repo = "posix_ipc";
+    rev = "rel${version}";
+    hash = "sha256-xK5CkThqVFVMIxBtgUfHIRNRfmBxKa/DWBYQg7QHl/M=";
+  };
+
+  pythonImportsCheck = [
+    "posix_ipc"
+  ];
+
+  meta = with lib; {
+    description = "POSIX IPC primitives (semaphores, shared memory and message queues)";
+    homepage = "https://github.com/osvenskan/posix_ipc";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/posthog/default.nix b/nixpkgs/pkgs/development/python-modules/posthog/default.nix
new file mode 100644
index 000000000000..0f20800ece0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/posthog/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+# build inputs
+, requests
+, six
+, monotonic
+, backoff
+, python-dateutil
+# check inputs
+, pytestCheckHook
+, mock
+, freezegun
+}:
+let
+  pname = "posthog";
+  version = "3.0.2";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "PostHog";
+    repo = "posthog-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-QASqjphAWtYuIyhbFTYwv1gD+rXvrmp5W0Te4MFn1AA=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    six
+    monotonic
+    backoff
+    python-dateutil
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+    freezegun
+  ];
+
+  pythonImportsCheck = [
+    "posthog"
+  ];
+
+  disabledTests = [
+    "test_load_feature_flags_wrong_key"
+    # Tests require network access
+    "test_request"
+    "test_upload"
+  ];
+
+  meta = with lib; {
+    description = "Official PostHog python library";
+    homepage = "https://github.com/PostHog/posthog-python";
+    changelog = "https://github.com/PostHog/posthog-python/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pot/default.nix b/nixpkgs/pkgs/development/python-modules/pot/default.nix
new file mode 100644
index 000000000000..90aac0fef677
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pot/default.nix
@@ -0,0 +1,122 @@
+{ lib
+, autograd
+, buildPythonPackage
+, fetchFromGitHub
+, cupy
+, cvxopt
+, cython
+, oldest-supported-numpy
+, matplotlib
+, numpy
+, tensorflow
+, pymanopt
+, pytestCheckHook
+, pythonOlder
+, scikit-learn
+, scipy
+, enableDimensionalityReduction ? false
+, enableGPU ? false
+}:
+
+buildPythonPackage rec {
+  pname = "pot";
+  version = "0.9.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "PythonOT";
+    repo = "POT";
+    rev = version;
+    hash = "sha256-D61/dqO16VvcQx4FG1beKR4y1OQHndwCizaugNaUe4g=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    oldest-supported-numpy
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+  ] ++ lib.optionals enableGPU [
+    cupy
+  ] ++ lib.optionals enableDimensionalityReduction [
+    autograd
+    pymanopt
+  ];
+
+  nativeCheckInputs = [
+    cvxopt
+    matplotlib
+    numpy
+    tensorflow
+    scikit-learn
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --cov-report= --cov=ot" "" \
+      --replace " --durations=20" "" \
+      --replace " --junit-xml=junit-results.xml" ""
+
+    # we don't need setup.py to find the macos sdk for us
+    sed -i '/sdk_path/d' setup.py
+  '';
+
+  # need to run the tests with the built package next to the test directory
+  preCheck = ''
+    pushd build/lib.*
+    ln -s -t . "$OLDPWD/test"
+  '';
+
+  postCheck = ''
+    popd
+  '';
+
+  disabledTests = [
+    # GPU tests are always skipped because of sandboxing
+    "warnings"
+    # Fixture is not available
+    "test_conditional_gradient"
+    "test_convert_between_backends"
+    "test_emd_backends"
+    "test_emd_emd2_types_devices"
+    "test_emd1d_type_devices"
+    "test_emd2_backends"
+    "test_factored_ot_backends"
+    "test_free_support_barycenter_backends"
+    "test_func_backends"
+    "test_generalized_conditional_gradient"
+    "test_line_search_armijo"
+    "test_loss_dual"
+    "test_max_sliced_backend"
+    "test_plan_dual"
+    "test_random_backends"
+    "test_sliced_backend"
+    "test_to_numpy"
+    "test_wasserstein_1d_type_devices"
+    "test_wasserstein"
+    "test_weak_ot_bakends"
+    # TypeError: Only integers, slices...
+    "test_emd1d_device_tf"
+  ];
+
+  disabledTestPaths = lib.optionals (!enableDimensionalityReduction) [
+    "test/test_dr.py"
+  ];
+
+  pythonImportsCheck = [
+    "ot"
+    "ot.lp"
+  ];
+
+  meta = with lib; {
+    description = "Python Optimal Transport Library";
+    homepage = "https://pythonot.github.io/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ yl3dy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/potentials/default.nix b/nixpkgs/pkgs/development/python-modules/potentials/default.nix
new file mode 100644
index 000000000000..4cad316d2a66
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/potentials/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, bibtexparser
+, buildPythonPackage
+, cdcs
+, datamodeldict
+, fetchPypi
+, habanero
+, ipywidgets
+, lxml
+, matplotlib
+, numpy
+, pandas
+, pytestCheckHook
+, pythonOlder
+, requests
+, scipy
+, unidecode
+, xmltodict
+, yabadaba
+}:
+
+buildPythonPackage rec {
+  version = "0.3.7";
+  pname = "potentials";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vkrNVRf9ntYSpf8nXmAmGjc+sQ4iFllisYHd9s+uQv0=";
+  };
+
+  propagatedBuildInputs = [
+    bibtexparser
+    cdcs
+    datamodeldict
+    habanero
+    ipywidgets
+    lxml
+    matplotlib
+    numpy
+    pandas
+    requests
+    scipy
+    unidecode
+    xmltodict
+    yabadaba
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "potentials"
+  ];
+
+  meta = with lib; {
+    description = "Python API database tools for accessing the NIST Interatomic Potentials Repository";
+    homepage = "https://github.com/usnistgov/potentials";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/potr/default.nix b/nixpkgs/pkgs/development/python-modules/potr/default.nix
new file mode 100644
index 000000000000..671010bb9009
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/potr/default.nix
@@ -0,0 +1,20 @@
+{ lib, fetchPypi, buildPythonPackage, pycrypto }:
+
+buildPythonPackage rec {
+  pname = "python-potr";
+  version = "1.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f95b9a7feaf8e3a6aaa898609f8a2ada55518cf52fc09152775c4c59c99b8ea6";
+  };
+
+  propagatedBuildInputs = [ pycrypto ];
+
+  meta = with lib; {
+    description = "A pure Python OTR implementation";
+    homepage = "http://python-otr.pentabarf.de/";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/power/default.nix b/nixpkgs/pkgs/development/python-modules/power/default.nix
new file mode 100644
index 000000000000..18784f88ba15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/power/default.nix
@@ -0,0 +1,26 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "power";
+  version = "1.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7d7d60ec332acbe3a7d00379b45e39abf650bf7ee311d61da5ab921f52f060f0";
+  };
+
+  # Tests can't work because there is no power information available.
+  doCheck = false;
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Cross-platform system power status information";
+    homepage = "https://github.com/Kentzo/Power";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/powerline-mem-segment/default.nix b/nixpkgs/pkgs/development/python-modules/powerline-mem-segment/default.nix
new file mode 100644
index 000000000000..7bc38f2227ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/powerline-mem-segment/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, psutil
+}:
+
+buildPythonPackage rec {
+  pname = "powerline-mem-segment";
+  version = "2.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0507zw7g449zk7dcq56adcdp71inbqfdmp6y5yk4x4j7kkp6pii9";
+  };
+
+  propagatedBuildInputs = [ psutil ];
+
+  pythonImportsCheck = [ "powerlinemem" ];
+
+  meta = with lib; {
+    description = "Segment for Powerline showing the current memory usage in percent or absolute values.";
+    homepage = "https://github.com/mKaloer/powerline_mem_segment";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ thomasjm ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/powerline/default.nix b/nixpkgs/pkgs/development/python-modules/powerline/default.nix
new file mode 100644
index 000000000000..c7e0c8565c0a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/powerline/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, socat
+, psutil
+, python-hglib
+, pygit2
+, pyuv
+, i3ipc
+, stdenv
+}:
+
+# TODO: bzr support is missing because nixpkgs switched to `breezy`
+
+buildPythonPackage rec {
+  version  = "2.8.3";
+  pname = "powerline";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-UIx9/IZg6Wv596wHzQb0CO6zwmQXUaFEPKBojo2LXmA=";
+  };
+
+  propagatedBuildInputs = [
+    socat
+    psutil
+    python-hglib
+    pygit2
+    pyuv
+  ] ++ lib.optionals (!stdenv.isDarwin) [ i3ipc ];
+
+  # tests are travis-specific
+  doCheck = false;
+
+  postInstall = ''
+    install -dm755 "$out/share/fonts/OTF/"
+    install -dm755 "$out/etc/fonts/conf.d"
+    install -m644 "font/PowerlineSymbols.otf" "$out/share/fonts/OTF/PowerlineSymbols.otf"
+    install -m644 "font/10-powerline-symbols.conf" "$out/etc/fonts/conf.d/10-powerline-symbols.conf"
+
+    install -dm755 "$out/share/fish/vendor_functions.d"
+    install -m644 "powerline/bindings/fish/powerline-setup.fish" "$out/share/fish/vendor_functions.d/powerline-setup.fish"
+
+    cp -ra powerline/bindings/{bash,shell,tcsh,tmux,vim,zsh} $out/share/
+    rm $out/share/*/*.py
+  '';
+
+  meta = {
+    homepage    = "https://github.com/powerline/powerline";
+    description = "The ultimate statusline/prompt utility";
+    license     = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pox/default.nix b/nixpkgs/pkgs/development/python-modules/pox/default.nix
new file mode 100644
index 000000000000..f1f7647defba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pox/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pox";
+  version = "0.3.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-4c7WbyoMkqWM82Rrx8y4tHc9QIhLdvhe7aBnBHSHFmc=";
+  };
+
+  # Test sare failing the sandbox
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pox"
+  ];
+
+  meta = with lib; {
+    description = "Utilities for filesystem exploration and automated builds";
+    homepage = "https://pox.readthedocs.io/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/poyo/default.nix b/nixpkgs/pkgs/development/python-modules/poyo/default.nix
new file mode 100644
index 000000000000..b7963258f338
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/poyo/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  version = "0.5.0";
+  pname = "poyo";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1pflivs6j22frz0v3dqxnvc8yb8fb52g11lqr88z0i8cg2m5csg2";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/hackebrot/poyo";
+    description = "A lightweight YAML Parser for Python";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ppdeep/default.nix b/nixpkgs/pkgs/development/python-modules/ppdeep/default.nix
new file mode 100644
index 000000000000..bbb5c3fc923c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ppdeep/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "ppdeep";
+  version = "20200505";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1zx1h0ff0wjjkgd0dzjv31i6ag09jw2p9vcssc1iplp60awlpixc";
+  };
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "ppdeep" ];
+
+  meta = with lib; {
+    description = "Python library for computing fuzzy hashes (ssdeep)";
+    homepage = "https://github.com/elceef/ppdeep";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ppft/default.nix b/nixpkgs/pkgs/development/python-modules/ppft/default.nix
new file mode 100644
index 000000000000..cd801f497a8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ppft/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, python
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "ppft";
+  version = "1.7.6.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-qzRDaBTi8YI481aI/YabJkGy0tjcoiuNJG9nAd/JVMg=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  # darwin seems to hang
+  doCheck = !stdenv.isDarwin;
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m ppft.tests
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "ppft"
+  ];
+
+  meta = with lib; {
+    description = "Distributed and parallel Python";
+    homepage = "https://ppft.readthedocs.io/";
+    changelog = "https://github.com/uqfoundation/ppft/releases/tag/ppft-${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pplpy/default.nix b/nixpkgs/pkgs/development/python-modules/pplpy/default.nix
new file mode 100644
index 000000000000..333c0df0a274
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pplpy/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, gmp
+, mpfr
+, libmpc
+, ppl
+, cython
+, cysignals
+, gmpy2
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "pplpy";
+  version = "0.8.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-23o7Vx1u8FP3UTeXXpR8OhweRaMLq5Dq8hW05cwVeX4=";
+  };
+
+  buildInputs = [
+    gmp
+    mpfr
+    libmpc
+    ppl
+  ];
+
+  nativeBuildInputs = [
+    sphinx # docbuild, called by make
+  ];
+
+  propagatedBuildInputs = [
+    cython
+    cysignals
+    gmpy2
+  ];
+
+  outputs = [ "out" "doc" ];
+
+  postBuild = ''
+    # Find the build result in order to put it into PYTHONPATH. The doc
+    # build needs to import pplpy.
+    build_result="$PWD/$( find build/ -type d -name 'lib.*' | head -n1 )"
+
+    echo "Building documentation"
+    PYTHONPATH="$build_result:$PYTHONPATH" make -C docs html
+  '';
+
+  postInstall = ''
+    mkdir -p "$doc/share/doc"
+    mv docs/build/html "$doc/share/doc/pplpy"
+  '';
+
+  meta = with lib; {
+    description = "A Python wrapper for ppl";
+    homepage = "https://gitlab.com/videlec/pplpy";
+    maintainers = teams.sage.members;
+    license = licenses.gpl3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pprintpp/default.nix b/nixpkgs/pkgs/development/python-modules/pprintpp/default.nix
new file mode 100644
index 000000000000..b72eeeebce47
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pprintpp/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, nose
+, parameterized
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pprintpp";
+  version = "0.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6oJhCOLH9J3G1mx1KXPD/JdJFCp5jWslTh4wHP28ZAM=";
+  };
+
+  patches = [
+    # Replace nose-parameterized with parameterized, https://github.com/wolever/pprintpp/pull/21
+    (fetchpatch {
+      url = "https://github.com/wolever/pprintpp/commit/873217674cc824b4c1cfdad4867c560c60e8d806.patch";
+      hash = "sha256-Y+2yVUkDHkwo49ynNHYXVXJpX4DfVYJ0CWKgzFX/HWc=";
+    })
+    # Remove "U" move from open(), https://github.com/wolever/pprintpp/pull/31
+    (fetchpatch {
+      name = "remove-u.patch";
+      url = "https://github.com/wolever/pprintpp/commit/deec5e5efad562fc2f9084abfe249ed0c7dd65fa.patch";
+      hash = "sha256-I84pnY/KyCIPPI9q0uvj64t8oPeMkgVTPEBRANkZNa4=";
+    })
+  ];
+
+  nativeCheckInputs = [
+    nose
+    parameterized
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} test.py
+  '';
+
+  pythonImportsCheck = [
+    "pprintpp"
+  ];
+
+  meta = with lib; {
+    description = "A drop-in replacement for pprint that's actually pretty";
+    homepage = "https://github.com/wolever/pprintpp";
+    changelog = "https://github.com/wolever/pprintpp/blob/${version}/CHANGELOG.txt";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ jakewaksbaum ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pproxy/default.nix b/nixpkgs/pkgs/development/python-modules/pproxy/default.nix
new file mode 100644
index 000000000000..0673a3f8dba3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pproxy/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, isPy27
+, buildPythonPackage
+, fetchFromGitHub
+, pycryptodome
+, uvloop
+}:
+
+buildPythonPackage rec {
+  pname = "pproxy";
+  version = "2.3.7";
+
+  disabled = isPy27;
+
+  # doesn't use tagged releases. Tests not in PyPi versioned releases
+  src = fetchFromGitHub {
+    owner = "qwj";
+    repo = "python-proxy";
+    rev = "7fccf8dd62204f34b0aa3a70fc568fd6ddff7728";
+    sha256 = "1sl2i0kymnbsk49ina81yjnkxjy09541f7pmic8r6rwsv1s87skc";
+  };
+
+  propagatedBuildInputs = [
+    pycryptodome
+    uvloop
+  ];
+
+  pythonImportsCheck = [ "pproxy" ];
+  disabledTests = [ "api_server" "api_client" ];  # try to connect to outside Internet, so disabled
+  # test suite doesn't use test runner. so need to run ``python ./tests/*``
+  checkPhase = ''
+    shopt -s extglob
+    for f in ./tests/!(${builtins.concatStringsSep "|" disabledTests}).py ; do
+      echo "***Testing $f***"
+      eval "python $f"
+    done
+  '';
+
+  meta = with lib; {
+    description = "Proxy server that can tunnel among remote servers by regex rules";
+    homepage = "https://github.com/qwj/python-proxy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ppscore/default.nix b/nixpkgs/pkgs/development/python-modules/ppscore/default.nix
new file mode 100644
index 000000000000..b87e0e4c9839
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ppscore/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pandas
+, pytestCheckHook
+, pythonOlder
+, scikit-learn
+}:
+
+buildPythonPackage rec {
+  pname = "ppscore";
+  version = "1.3.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "8080labs";
+    repo = "ppscore";
+    rev = "refs/tags/${version}";
+    hash = "sha256-gJStsL8fN17kvXO8EH/NHGIBelPknJzYw5WEvHsFooU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pandas
+    scikit-learn
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ppscore"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of the Predictive Power Score (PPS)";
+    homepage = "https://github.com/8080labs/ppscore/";
+    changelog = "https://github.com/8080labs/ppscore/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ evax ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pq/default.nix b/nixpkgs/pkgs/development/python-modules/pq/default.nix
new file mode 100644
index 000000000000..320c264acaac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pq/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "pq";
+  version = "1.9.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-1krw77ij69EbLg5mKmQmxeHpn38uRG9EOboGmRk+StY=";
+  };
+
+  # tests require running postgresql cluster
+  doCheck = false;
+  pythonImportsCheck = [ "pq" ];
+
+  meta = with lib; {
+    description = "PQ is a transactional queue for PostgreSQL";
+    homepage = "https://github.com/malthe/pq/";
+    license = licenses.bsd3;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/prance/default.nix b/nixpkgs/pkgs/development/python-modules/prance/default.nix
new file mode 100644
index 000000000000..1fffa8cde714
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prance/default.nix
@@ -0,0 +1,84 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, chardet
+, click
+, flex
+, packaging
+, pyicu
+, requests
+, ruamel-yaml
+, setuptools-scm
+, six
+, swagger-spec-validator
+, pytestCheckHook
+, openapi-spec-validator
+}:
+
+buildPythonPackage rec {
+  pname = "prance";
+  version = "23.06.21.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "RonnyPfannschmidt";
+    repo = pname;
+    rev = "v${version}";
+    fetchSubmodules = true;
+    hash = "sha256-p+LZbQal4DPeMp+eJ2O83rCaL+QIUDcU34pZhYdN4bE=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=prance --cov-report=term-missing --cov-fail-under=90" ""
+  '';
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    chardet
+    packaging
+    requests
+    ruamel-yaml
+    six
+  ];
+
+  passthru.optional-dependencies = {
+    cli = [ click ];
+    flex = [ flex ];
+    icu = [ pyicu ];
+    osv = [ openapi-spec-validator ];
+    ssv = [ swagger-spec-validator ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.flatten (lib.attrValues passthru.optional-dependencies);
+
+  # Disable tests that require network
+  disabledTestPaths = [
+    "tests/test_convert.py"
+  ];
+  disabledTests = [
+    "test_convert_defaults"
+    "test_convert_output"
+    "test_fetch_url_http"
+    "test_openapi_spec_validator_validate_failure"
+  ];
+  pythonImportsCheck = [ "prance" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/RonnyPfannschmidt/prance/blob/${src.rev}/CHANGES.rst";
+    description = "Resolving Swagger/OpenAPI 2.0 and 3.0.0 Parser";
+    homepage = "https://github.com/RonnyPfannschmidt/prance";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/praw/default.nix b/nixpkgs/pkgs/development/python-modules/praw/default.nix
new file mode 100644
index 000000000000..0243ef1bd1b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/praw/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, betamax
+, betamax-matchers
+, betamax-serializers
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, prawcore
+, pytestCheckHook
+, pythonOlder
+, requests-toolbelt
+, update_checker
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "praw";
+  version = "7.7.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "praw-dev";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-L7wTHD/ypXVc8GMfl9u16VNb9caLJoXpaMEIzaVVUgo=";
+  };
+
+  propagatedBuildInputs = [
+    mock
+    prawcore
+    update_checker
+    websocket-client
+  ];
+
+  nativeCheckInputs = [
+    betamax
+    betamax-serializers
+    betamax-matchers
+    pytestCheckHook
+    requests-toolbelt
+  ];
+
+  disabledTestPaths = [
+    # tests requiring network
+    "tests/integration"
+  ];
+
+  pythonImportsCheck = [
+    "praw"
+  ];
+
+  meta = with lib; {
+    description = "Python Reddit API wrapper";
+    homepage = "https://praw.readthedocs.org/";
+    changelog = "https://github.com/praw-dev/praw/blob/v${version}/CHANGES.rst";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/prawcore/default.nix b/nixpkgs/pkgs/development/python-modules/prawcore/default.nix
new file mode 100644
index 000000000000..6231ff2b8127
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prawcore/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, betamax
+, betamax-matchers
+, betamax-serializers
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, mock
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-toolbelt
+, testfixtures
+}:
+
+buildPythonPackage rec {
+  pname = "prawcore";
+  version = "2.4.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "praw-dev";
+    repo = "prawcore";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-tECZRx6VgyiJDKHvj4Rf1sknFqUhz3sDFEsAMOeB7/g=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    testfixtures
+    mock
+    betamax
+    betamax-serializers
+    betamax-matchers
+    requests-toolbelt
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # tests requiring network
+    "tests/integration"
+  ];
+
+  pythonImportsCheck = [
+    "prawcore"
+  ];
+
+  meta = with lib; {
+    description = "Low-level communication layer for PRAW";
+    homepage = "https://praw.readthedocs.org/";
+    changelog = "https://github.com/praw-dev/prawcore/blob/v${version}/CHANGES.rst";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/prayer-times-calculator/default.nix b/nixpkgs/pkgs/development/python-modules/prayer-times-calculator/default.nix
new file mode 100644
index 000000000000..e60bc33383d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prayer-times-calculator/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "prayer-times-calculator";
+  version = "0.0.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "uchagani";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-T+rXJy+9haepF6TKSoOjb6o75YQwQnzAaWRtLMwfGOw=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "prayer_times_calculator"
+  ];
+
+  meta = with lib; {
+    description = "Python client for the Prayer Times API";
+    homepage = "https://github.com/uchagani/prayer-times-calculator";
+    changelog = "https://github.com/uchagani/prayer-times-calculator/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pre-commit-hooks/default.nix b/nixpkgs/pkgs/development/python-modules/pre-commit-hooks/default.nix
new file mode 100644
index 000000000000..aa8722e56ff4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pre-commit-hooks/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, git
+, pytestCheckHook
+, pythonOlder
+, ruamel-yaml
+, tomli
+}:
+
+buildPythonPackage rec {
+  pname = "pre-commit-hooks";
+  version = "4.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pre-commit";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-EiPGdrpD4e9izRNJCjHRp+gR+ClzFtLjs6P57WXDs7I=";
+  };
+
+  propagatedBuildInputs = [
+    ruamel-yaml
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  nativeCheckInputs = [
+    git
+    pytestCheckHook
+  ];
+
+  # Note: this is not likely to ever work on Darwin
+  # https://github.com/pre-commit/pre-commit-hooks/pull/655
+  doCheck = !stdenv.isDarwin;
+
+  # the tests require a functional git installation which requires a valid HOME
+  # directory.
+  preCheck = ''
+    export HOME="$(mktemp -d)"
+
+    git config --global user.name "Nix Builder"
+    git config --global user.email "nix-builder@nixos.org"
+    git init .
+  '';
+
+  pythonImportsCheck = [
+    "pre_commit_hooks"
+  ];
+
+  meta = with lib; {
+    description = "Some out-of-the-box hooks for pre-commit";
+    homepage = "https://github.com/pre-commit/pre-commit-hooks";
+    changelog = "https://github.com/pre-commit/pre-commit-hooks/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kalbasit ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/precis-i18n/default.nix b/nixpkgs/pkgs/development/python-modules/precis-i18n/default.nix
new file mode 100644
index 000000000000..87a91743b674
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/precis-i18n/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "precis-i18n";
+  version = "1.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "byllyfish";
+    repo = "precis_i18n";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-0Z8JbakShuB8FFGl3NS8VFpHAQgr2P900HVxUafAmyU=";
+  };
+
+  pythonImportsCheck = [
+    "precis_i18n"
+  ];
+
+  meta = with lib; {
+    description = "Internationalized usernames and passwords";
+    homepage = "https://github.com/byllyfish/precis_i18n";
+    changelog = "https://github.com/byllyfish/precis_i18n/blob/v${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/prefixed/default.nix b/nixpkgs/pkgs/development/python-modules/prefixed/default.nix
new file mode 100644
index 000000000000..9b0efcad461e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prefixed/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "prefixed";
+  version = "0.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-C1TRXmAuuK9Kwxsdsho36pXOWJDgdBuw3Z3tSTzvu+k=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "prefixed"
+  ];
+
+  meta = with lib; {
+    description = "Prefixed alternative numeric library";
+    homepage = "https://github.com/Rockhopper-Technologies/prefixed";
+    changelog = "https://github.com/Rockhopper-Technologies/prefixed/releases/tag/${version}";
+    license = with licenses; [ mpl20 ];
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/preggy/default.nix b/nixpkgs/pkgs/development/python-modules/preggy/default.nix
new file mode 100644
index 000000000000..cddca33b84ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/preggy/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, six, unidecode, nose, yanc }:
+
+buildPythonPackage rec {
+  pname = "preggy";
+  version = "1.4.4";
+
+  propagatedBuildInputs = [ six unidecode ];
+  nativeCheckInputs = [ nose yanc ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "25ba803afde4f35ef543a60915ced2e634926235064df717c3cb3e4e3eb4670c";
+  };
+
+  checkPhase = ''
+    nosetests .
+  '';
+
+  meta = with lib; {
+    description = "Assertion library for Python";
+    homepage = "http://heynemann.github.io/preggy/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/premailer/default.nix b/nixpkgs/pkgs/development/python-modules/premailer/default.nix
new file mode 100644
index 000000000000..21214b5fe752
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/premailer/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27,
+  cssselect, cssutils, lxml, mock, nose, requests, cachetools
+}:
+
+buildPythonPackage rec {
+  pname = "premailer";
+  version = "3.10.0";
+  disabled = isPy27; # no longer compatible with urllib
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d1875a8411f5dc92b53ef9f193db6c0f879dc378d618e0ad292723e388bfe4c2";
+  };
+
+  buildInputs = [ mock nose ];
+  propagatedBuildInputs = [ cachetools cssselect cssutils lxml requests ];
+
+  meta = {
+    description = "Turns CSS blocks into style attributes ";
+    homepage = "https://github.com/peterbe/premailer";
+    license = lib.licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/preprocess-cancellation/default.nix b/nixpkgs/pkgs/development/python-modules/preprocess-cancellation/default.nix
new file mode 100644
index 000000000000..dc571f076fe3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/preprocess-cancellation/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, setuptools
+, shapely
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "preprocess-cancellation";
+  version = "0.2.0";
+  disabled = pythonOlder "3.6"; # >= 3.6
+  format = "pyproject";
+
+  # No tests in PyPI
+  src = fetchFromGitHub {
+    owner = "kageurufu";
+    repo = "cancelobject-preprocessor";
+    rev = version;
+    hash = "sha256-mn3/etXA5dkL+IsyxwD4/XjU/t4/roYFVyqQxlLOoOI=";
+  };
+
+  patches = [
+    ./pep-621.patch
+  ];
+
+  postPatch = ''
+    sed -i "/^addopts/d" pyproject.toml
+
+    # setuptools 61 compatibility
+    # error: Multiple top-level packages discovered in a flat-layout: ['STLs', 'GCode'].
+    mkdir tests
+    mv GCode STLs test_* tests
+    substituteInPlace tests/test_preprocessor.py \
+      --replace "./GCode" "./tests/GCode"
+    substituteInPlace tests/test_preprocessor_with_shapely.py \
+      --replace "./GCode" "./tests/GCode"
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    shapely
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "preprocess_cancellation" ];
+
+  meta = with lib; {
+    description = "Klipper GCode Preprocessor for Object Cancellation";
+    homepage = "https://github.com/kageurufu/cancelobject-preprocessor";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ zhaofengli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/preprocess-cancellation/pep-621.patch b/nixpkgs/pkgs/development/python-modules/preprocess-cancellation/pep-621.patch
new file mode 100644
index 000000000000..48d8db33d465
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/preprocess-cancellation/pep-621.patch
@@ -0,0 +1,20 @@
+diff --git a/pyproject.toml b/pyproject.toml
+index da1376e..88298a7 100644
+--- a/pyproject.toml
++++ b/pyproject.toml
+@@ -1,11 +1,11 @@
+-[tool.poetry]

++[project]

+ name = "preprocess_cancellation"

+ version = "0.2.0"

+ description = "GCode processor to add klipper cancel-object markers"

+ readme = "README.md"

+-authors = ["Franklyn Tackitt <im@frank.af>"]

+-repository = "https://github.com/kageurufu/cancelobject-preprocessor"

+-license = "GPL-3.0-only"

++authors = [ { name = "Franklyn Tackitt", email = "im@frank.af" } ]

++urls.repository = "https://github.com/kageurufu/cancelobject-preprocessor"

++license.text = "GPL-3.0-only"

+ 

+ [tool.poetry.urls]

+ "Bug Tracker" = "https://github.com/kageurufu/cancelobject-preprocessor/issues"

diff --git a/nixpkgs/pkgs/development/python-modules/preshed/default.nix b/nixpkgs/pkgs/development/python-modules/preshed/default.nix
new file mode 100644
index 000000000000..e0d37c51a2b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/preshed/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, cymem
+, cython
+, python
+, fetchPypi
+, murmurhash
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "preshed";
+  version = "3.0.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-chhjxSRP/NJlGtCSiVGix8d7EC9OEaJRrYXTfudiFmA=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    cymem
+    murmurhash
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Tests have import issues with 3.0.8
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "preshed"
+  ];
+
+  meta = with lib; {
+    description = "Cython hash tables that assume keys are pre-hashed";
+    homepage = "https://github.com/explosion/preshed";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pretend/default.nix b/nixpkgs/pkgs/development/python-modules/pretend/default.nix
new file mode 100644
index 000000000000..231b953923e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pretend/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pretend";
+  version = "1.0.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "alex";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-OqMfeIMFNBBLq6ejR3uOCIHZ9aA4zew7iefVlAsy1JQ=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pretend"
+  ];
+
+  meta = with lib; {
+    description = "Module for stubbing";
+    homepage = "https://github.com/alex/pretend";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/prettytable/default.nix b/nixpkgs/pkgs/development/python-modules/prettytable/default.nix
new file mode 100644
index 000000000000..b0efbcb373d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prettytable/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatch-vcs
+, hatchling
+, pytest-lazy-fixture
+, pytestCheckHook
+, pythonOlder
+, wcwidth
+}:
+
+buildPythonPackage rec {
+  pname = "prettytable";
+  version = "3.8.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "jazzband";
+    repo = "prettytable";
+    rev = "refs/tags/${version}";
+    hash= "sha256-JnxUjUosQJgprIbA9szSfw1Fi21Qc4WljoRAQv4x5YM=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    wcwidth
+  ];
+
+  nativeCheckInputs = [
+    pytest-lazy-fixture
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "prettytable"
+  ];
+
+  meta = with lib; {
+    description = "Display tabular data in a visually appealing ASCII table format";
+    homepage = "https://github.com/jazzband/prettytable";
+    changelog = "https://github.com/jazzband/prettytable/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/primecountpy/default.nix b/nixpkgs/pkgs/development/python-modules/primecountpy/default.nix
new file mode 100644
index 000000000000..c2ad9ca512b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/primecountpy/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, primecount
+, cython
+, cysignals
+}:
+
+buildPythonPackage rec {
+  pname = "primecountpy";
+  version = "0.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "78fe7cc32115f0669a45d7c90faaf39f7ce3939e39e2e7e5f14c17fe4bff0676";
+  };
+
+  buildInputs = [ primecount ];
+
+  propagatedBuildInputs = [ cython cysignals ];
+
+  # depends on pytest-cython for "pytest --doctest-cython"
+  doCheck = false;
+
+  pythonImportsCheck = [ "primecountpy" ];
+
+  meta = with lib; {
+    description = "Cython interface for C++ primecount library";
+    homepage = "https://github.com/dimpase/primecountpy/";
+    maintainers = teams.sage.members;
+    license = licenses.gpl3Only;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/primer3/default.nix b/nixpkgs/pkgs/development/python-modules/primer3/default.nix
new file mode 100644
index 000000000000..f4495d9b2c14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/primer3/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, gcc
+, click
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "primer3";
+  version = "2.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "libnano";
+    repo = "primer3-py";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-WYn88Xv7WSc67TfYCq+i05tG8aKtWLUgc6axntvLF+8=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ] ++ lib.optionals stdenv.isDarwin [
+    gcc
+  ];
+
+  nativeCheckInputs = [
+    click
+    pytestCheckHook
+  ];
+  # We are not sure why exactly this is need. It seems `pytestCheckHook`
+  # doesn't find extension modules installed in $out/${python.sitePackages},
+  # and the tests rely upon them. This was initially reported upstream at
+  # https://github.com/libnano/primer3-py/issues/120 and we investigate this
+  # downstream at: https://github.com/NixOS/nixpkgs/issues/255262.
+  preCheck = ''
+    python setup.py build_ext --inplace
+  '';
+
+  pythonImportsCheck = [
+    "primer3"
+  ];
+
+  meta = with lib; {
+    description = "Oligo analysis and primer design";
+    homepage = "https://github.com/libnano/primer3-py";
+    changelog = "https://github.com/libnano/primer3-py/blob/v${version}/CHANGES";
+    license = with licenses; [ gpl2Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/priority/default.nix b/nixpkgs/pkgs/development/python-modules/priority/default.nix
new file mode 100644
index 000000000000..8f12f7f2144e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/priority/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, hypothesis
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "priority";
+  version = "2.0.0";
+  format = "setuptools";
+  disabled = pythonOlder "3.6.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c965d54f1b8d0d0b19479db3924c7c36cf672dbf2aec92d43fbdaf4492ba18c0";
+  };
+
+  pythonImportsCheck = [
+     "priority"
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A pure-Python implementation of the HTTP/2 priority tree";
+    homepage = "https://github.com/python-hyper/priority/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ qyliss ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/prison/default.nix b/nixpkgs/pkgs/development/python-modules/prison/default.nix
new file mode 100644
index 000000000000..d70808d97218
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prison/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, six
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "prison";
+  version = "0.1.3";
+
+  src = fetchFromGitHub {
+    owner = "betodealmeida";
+    repo = "python-rison";
+    rev = version;
+    hash = "sha256-qor40vUQeTdlO3vwug3GGNX5vkNaF0H7EWlRdsY4bvc=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    nose
+  ];
+
+  meta = with lib; {
+    description = "Rison encoder/decoder";
+    homepage = "https://github.com/betodealmeida/python-rison";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/proboscis/default.nix b/nixpkgs/pkgs/development/python-modules/proboscis/default.nix
new file mode 100644
index 000000000000..a2a1d04ebe0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/proboscis/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, nose }:
+
+buildPythonPackage rec {
+  pname = "proboscis";
+  version = "1.2.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b822b243a7c82030fce0de97bdc432345941306d2c24ef227ca561dd019cd238";
+  };
+
+  propagatedBuildInputs = [ nose ];
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A Python test framework that extends Python's built-in unittest module and Nose with features from TestNG";
+    homepage = "https://pypi.python.org/pypi/proboscis";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/process-tests/default.nix b/nixpkgs/pkgs/development/python-modules/process-tests/default.nix
new file mode 100644
index 000000000000..5f50b2a4d180
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/process-tests/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "process-tests";
+  version = "2.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a3747ad947bdfc93e5c986bdb17a6d718f3f26e8577a0807a00962f29e26deba";
+  };
+
+  # No tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Tools for testing processes";
+    license = licenses.bsd2;
+    homepage = "https://github.com/ionelmc/python-process-tests";
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/procmon-parser/default.nix b/nixpkgs/pkgs/development/python-modules/procmon-parser/default.nix
new file mode 100644
index 000000000000..b45d72f3d07d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/procmon-parser/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, construct
+, fetchFromGitHub
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "procmon-parser";
+  version = "0.3.13";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "eronnen";
+    repo = "procmon-parser";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-XkMf3MQK4WFRLl60XHDG/j2gRHAiz7XL9MmC6SRg9RE=";
+  };
+
+  propagatedBuildInputs = [
+    construct
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    python-dateutil
+  ];
+
+  pythonImportsCheck = [
+    "procmon_parser"
+  ];
+
+  meta = with lib; {
+    description = "Parser to process monitor file formats";
+    homepage = "https://github.com/eronnen/procmon-parser/";
+    changelog = "https://github.com/eronnen/procmon-parser/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/prodict/default.nix b/nixpkgs/pkgs/development/python-modules/prodict/default.nix
new file mode 100644
index 000000000000..e3cc7564ef8b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prodict/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, lib
+}:
+
+buildPythonPackage rec {
+  pname   = "prodict";
+  version = "0.8.6";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ramazanpolat";
+    repo = pname;
+    rev = version;
+    hash = "sha256-c46JEQFg4KRwerqpMSgh6+tYRpKTOX02Lzsq4/meS3o=";
+  };
+
+  # make setuptools happy on case-sensitive filesystems
+  postPatch = ''if [[ ! -f README.md ]]; then mv README.MD README.md; fi'';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "prodict" ];
+
+  meta = {
+    description = "Access Python dictionary as a class with type hinting and autocompletion";
+    homepage = "https://github.com/ramazanpolat/prodict";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/proglog/default.nix b/nixpkgs/pkgs/development/python-modules/proglog/default.nix
new file mode 100644
index 000000000000..d22951ac7e2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/proglog/default.nix
@@ -0,0 +1,19 @@
+{ lib, fetchPypi, buildPythonPackage, tqdm }:
+
+buildPythonPackage rec {
+  pname = "proglog";
+  version = "0.1.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ZYwoycguTK6y8l9Ij/+c6s4i+NabFdDByG1kJ15N2rQ=";
+  };
+
+  propagatedBuildInputs = [ tqdm ];
+
+  meta = with lib; {
+    description = "Logs and progress bars manager for Python";
+    homepage = "https://github.com/Edinburgh-Genome-Foundry/Proglog";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/progress/default.nix b/nixpkgs/pkgs/development/python-modules/progress/default.nix
new file mode 100644
index 000000000000..192841994ec8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/progress/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+}:
+
+buildPythonPackage rec {
+  version = "1.6";
+  pname = "progress";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c9c86e98b5c03fa1fe11e3b67c1feda4788b8d0fe7336c2ff7d5644ccfba34cd";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} test_progress.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/verigak/progress/";
+    description = "Easy to use progress bars";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/progressbar/default.nix b/nixpkgs/pkgs/development/python-modules/progressbar/default.nix
new file mode 100644
index 000000000000..68967ecf6533
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/progressbar/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "progressbar";
+  version = "2.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5d81cb529da2e223b53962afd6c8ca0f05c6670e40309a7219eacc36af9b6c63";
+  };
+
+  # invalid command 'test'
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/progressbar";
+    description = "Text progressbar library for python";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/progressbar2/default.nix b/nixpkgs/pkgs/development/python-modules/progressbar2/default.nix
new file mode 100644
index 000000000000..349757bcffb0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/progressbar2/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, freezegun
+, pytestCheckHook
+, python-utils
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "progressbar2";
+  version = "4.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-E5OSL8tkWYlErUV1afvrSzrBie9Qta25zvMoTofjlM4=";
+  };
+
+  postPatch = ''
+    sed -i "/-cov/d" pytest.ini
+  '';
+
+  propagatedBuildInputs = [
+    python-utils
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "progressbar"
+  ];
+
+  meta = with lib; {
+    description = "Text progressbar library";
+    homepage = "https://progressbar-2.readthedocs.io/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ashgillman ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/progressbar33/default.nix b/nixpkgs/pkgs/development/python-modules/progressbar33/default.nix
new file mode 100644
index 000000000000..a483a6001f00
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/progressbar33/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "progressbar33";
+  version = "2.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1zvf6zs5hzrc03p9nfs4p16vhilqikycvv1yk0pxn8s07fdhvzji";
+  };
+
+  # no tests implemented
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/progressbar33";
+    description = "Text progressbar library for python";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ twey ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/prometheus-client/default.nix b/nixpkgs/pkgs/development/python-modules/prometheus-client/default.nix
new file mode 100644
index 000000000000..b3e1e12400c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prometheus-client/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "prometheus-client";
+  version = "0.17.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "prometheus";
+    repo = "client_python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ag9gun47Ar0Sw3ZGIXAHjtv4GdhX8x51UVkgwdQ8A+s=";
+  };
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "prometheus_client"
+  ];
+
+  meta = with lib; {
+    description = "Prometheus instrumentation library for Python applications";
+    homepage = "https://github.com/prometheus/client_python";
+    changelog = "https://github.com/prometheus/client_python/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/prometheus-flask-exporter/default.nix b/nixpkgs/pkgs/development/python-modules/prometheus-flask-exporter/default.nix
new file mode 100644
index 000000000000..4b845b3789be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prometheus-flask-exporter/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, prometheus-client
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "prometheus-flask-exporter";
+  version = "0.22.4";
+
+  src = fetchFromGitHub {
+    owner = "rycus86";
+    repo = "prometheus_flask_exporter";
+    rev = version;
+    hash = "sha256-GAQ80J7at8Apqu+DUMN3+rLi/lrNv5Y7w/DKpUN2iu8=";
+  };
+
+  propagatedBuildInputs = [ flask prometheus-client ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  pytestFlagsArray = [ "tests/" ];
+
+  meta = with lib; {
+    description = "Prometheus exporter for Flask applications";
+    homepage = "https://github.com/rycus86/prometheus_flask_exporter";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lbpdt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/prometheus-pandas/default.nix b/nixpkgs/pkgs/development/python-modules/prometheus-pandas/default.nix
new file mode 100644
index 000000000000..ff7cadd8f58b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prometheus-pandas/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, numpy
+, pandas
+}:
+
+buildPythonPackage rec {
+  pname = "prometheus-pandas";
+  version = "0.3.3";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-1eaTmNui3cAisKEhBMEpOv+UndJZwb4GGK2M76xiy7k=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    pandas
+  ];
+
+  # There are no tests. :(
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "prometheus_pandas"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/dcoles/prometheus-pandas";
+    license = licenses.mit;
+    description = "Pandas integration for Prometheus";
+    maintainers = with maintainers; [ viktornordling ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/promise/default.nix b/nixpkgs/pkgs/development/python-modules/promise/default.nix
new file mode 100644
index 000000000000..a9c4c416b7fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/promise/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, mock
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "promise";
+  version = "2.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "syrusakbary";
+    repo = "promise";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-5s6GMANSO4UpLOP/HAQxuNFSBSjPgvJCB9R1dOoKuJ4=";
+  };
+
+  patches = [
+    # Convert @asyncio.coroutine to async def, https://github.com/syrusakbary/promise/pull/99
+    (fetchpatch {
+      name = "use-async-def.patch";
+      url = "https://github.com/syrusakbary/promise/commit/3cde549d30b38dcff81b308e18c7f61783003791.patch";
+      hash = "sha256-XCbTo6RCv75nNrpbK3TFdV0h7tBJ0QK+WOAR8S8w9as=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace tests/test_extra.py \
+      --replace "assert_exc.traceback[-1].path.strpath" "str(assert_exc.traceback[-1].path)"
+  '';
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    "tests/test_benchmark.py"
+  ];
+
+  pythonImportsCheck = [
+    "promise"
+  ];
+
+  meta = with lib; {
+    description = "Ultra-performant Promise implementation in Python";
+    homepage = "https://github.com/syrusakbary/promise";
+    changelog = "https://github.com/syrusakbary/promise/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kamadorueda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/prompt-toolkit/1.nix b/nixpkgs/pkgs/development/python-modules/prompt-toolkit/1.nix
new file mode 100644
index 000000000000..f92ceeb86fff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prompt-toolkit/1.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, docopt
+, six
+, wcwidth
+, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "prompt-toolkit";
+  version = "1.0.18";
+
+  src = fetchPypi {
+    pname = "prompt_toolkit";
+    inherit version;
+    sha256 = "dd4fca02c8069497ad931a2d09914c6b0d1b50151ce876bc15bde4c747090126";
+  };
+
+  propagatedBuildInputs = [ docopt six wcwidth pygments ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  disabledTests = [
+    "test_pathcompleter_can_expanduser"
+  ];
+
+  meta = with lib; {
+    description = "Python library for building powerful interactive command lines";
+    longDescription = ''
+      prompt_toolkit could be a replacement for readline, but it can be
+      much more than that. It is cross-platform, everything that you build
+      with it should run fine on both Unix and Windows systems. Also ships
+      with a nice interactive Python shell (called ptpython) built on top.
+    '';
+    homepage = "https://github.com/jonathanslenders/python-prompt-toolkit";
+    maintainers = with maintainers; [ ];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/prompt-toolkit/default.nix b/nixpkgs/pkgs/development/python-modules/prompt-toolkit/default.nix
new file mode 100644
index 000000000000..2869c042d2d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prompt-toolkit/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, six
+, wcwidth
+}:
+
+buildPythonPackage rec {
+  pname = "prompt-toolkit";
+  version = "3.0.39";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "prompt_toolkit";
+    inherit version;
+    hash = "sha256-BFBa3mh9wm3EKEsa0ZqDvi8q/oPnqCis4McvOh33Kqw=";
+  };
+
+  propagatedBuildInputs = [
+    six
+    wcwidth
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # tests/test_completion.py:206: AssertionError
+    # https://github.com/prompt-toolkit/python-prompt-toolkit/issues/1657
+    "test_pathcompleter_can_expanduser"
+  ];
+
+  pythonImportsCheck = [
+    "prompt_toolkit"
+  ];
+
+  meta = with lib; {
+    description = "Python library for building powerful interactive command lines";
+    longDescription = ''
+      prompt_toolkit could be a replacement for readline, but it can be
+      much more than that. It is cross-platform, everything that you build
+      with it should run fine on both Unix and Windows systems. Also ships
+      with a nice interactive Python shell (called ptpython) built on top.
+    '';
+    homepage = "https://github.com/jonathanslenders/python-prompt-toolkit";
+    changelog = "https://github.com/prompt-toolkit/python-prompt-toolkit/blob/${version}/CHANGELOG";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/prompthub-py/default.nix b/nixpkgs/pkgs/development/python-modules/prompthub-py/default.nix
new file mode 100644
index 000000000000..0f1fbe5427b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prompthub-py/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, pyyaml
+, requests
+}:
+let
+  pname = "prompthub-py";
+  version = "4.0.0";
+in
+buildPythonPackage {
+  inherit version pname;
+  format = "pyproject";
+
+  # Pypi source package doesn't contain tests
+  src = fetchFromGitHub {
+    owner = "deepset-ai";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-FA4IfhHViSL1u4pgd7jh40rEcS0BldSFDwCPG5irk1g=";
+  };
+
+  disabled = pythonOlder "3.8";
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pyyaml
+    requests
+  ];
+
+  meta = with lib; {
+    description = "A simple client to fetch prompts from Prompt Hub using its REST API.";
+    homepage = "https://github.com/deepset-ai/prompthub-py";
+    changelog = "https://github.com/deepset-ai/prompthub-py/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/property-manager/default.nix b/nixpkgs/pkgs/development/python-modules/property-manager/default.nix
new file mode 100644
index 000000000000..451d6f79091b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/property-manager/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchFromGitHub, humanfriendly, verboselogs, coloredlogs, pytest, pytest-cov }:
+
+buildPythonPackage rec {
+  pname = "property-manager";
+  version = "3.0";
+
+  src = fetchFromGitHub {
+    owner = "xolox";
+    repo = "python-property-manager";
+    rev = version;
+    sha256 = "1v7hjm7qxpgk92i477fjhpcnjgp072xgr8jrgmbrxfbsv4cvl486";
+  };
+
+  propagatedBuildInputs = [ coloredlogs humanfriendly verboselogs ];
+  nativeCheckInputs = [ pytest pytest-cov ];
+
+  meta = with lib; {
+    description = "Useful property variants for Python programming";
+    homepage = "https://github.com/xolox/python-property-manager";
+    license = licenses.mit;
+    maintainers = with maintainers; [ eyjhb ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/prophet/default.nix b/nixpkgs/pkgs/development/python-modules/prophet/default.nix
new file mode 100644
index 000000000000..5a8e2dfc1fc6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prophet/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+
+, cmdstanpy
+, numpy
+, matplotlib
+, pandas
+, holidays
+, tqdm
+, importlib-resources
+
+, dask
+, distributed
+
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "prophet";
+  version = "1.1.5";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "facebook";
+    repo = "prophet";
+    rev = version;
+    hash = "sha256-liTg5Hm+FPpRQajBnnJKBh3JPGyu0Hflntf0isj1FiQ=";
+  };
+
+  sourceRoot = "source/python";
+
+  env.PROPHET_REPACKAGE_CMDSTAN = "false";
+
+  nativeBuildInputs = [ setuptools ];
+
+  propagatedBuildInputs = [
+    cmdstanpy
+    numpy
+    matplotlib
+    pandas
+    holidays
+    tqdm
+    importlib-resources
+  ];
+
+  passthru.optional-dependencies.parallel = [ dask distributed ] ++ dask.optional-dependencies.dataframe;
+
+  preCheck = ''
+    # use the generated files from $out for testing
+    mv prophet/tests .
+    rm -r prophet
+  '';
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "prophet" ];
+
+  meta = {
+    changelog = "https://github.com/facebook/prophet/releases/tag/${src.rev}";
+    description = "A tool for producing high quality forecasts for time series data that has multiple seasonality with linear or non-linear growth";
+    homepage = "https://facebook.github.io/prophet/";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ tomasajt ];
+    platforms = lib.platforms.linux; # cmdstanpy doesn't currently build on darwin
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/propka/default.nix b/nixpkgs/pkgs/development/python-modules/propka/default.nix
new file mode 100644
index 000000000000..0894e05a9886
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/propka/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "propka";
+  version = "3.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jensengroup";
+    repo = "propka";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-NbvrlapBALGbUyBqdqDcDG/igDf/xqxC35DzVUrbHlo=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "propka"
+  ];
+
+  meta = with lib; {
+    description = "A predictor of the pKa values of ionizable groups in proteins and protein-ligand complexes based in the 3D structure";
+    homepage = "https://github.com/jensengroup/propka";
+    changelog = "https://github.com/jensengroup/propka/releases/tag/v${version}";
+    license = licenses.lgpl21Only;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/protego/default.nix b/nixpkgs/pkgs/development/python-modules/protego/default.nix
new file mode 100644
index 000000000000..7ff0690f3a58
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/protego/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "protego";
+  version = "0.3.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "Protego";
+    hash = "sha256-BCKL/95Ma8ujHPZSm6LP1uG3CAj9wdLLQwG+ayjWxWg=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "protego" ];
+
+  meta = with lib; {
+    description = "A pure-Python robots.txt parser with support for modern conventions";
+    homepage = "https://github.com/scrapy/protego";
+    changelog = "https://github.com/scrapy/protego/blob/${version}/CHANGELOG.rst";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/proto-plus/default.nix b/nixpkgs/pkgs/development/python-modules/proto-plus/default.nix
new file mode 100644
index 000000000000..d75842e507a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/proto-plus/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, protobuf
+, googleapis-common-protos
+, pytestCheckHook
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "proto-plus";
+  version = "1.22.3";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/c0JcTy9QkgHQNL+KcmQ9/vYhaZ+/DKKqL5u4+n3ams=";
+  };
+
+  propagatedBuildInputs = [ protobuf ];
+
+  nativeCheckInputs = [ pytestCheckHook pytz googleapis-common-protos ];
+
+  pythonImportsCheck = [ "proto" ];
+
+  meta = with lib; {
+    description = "Beautiful, idiomatic protocol buffers in Python";
+    homepage = "https://github.com/googleapis/proto-plus-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ruuda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/protobuf/3.nix b/nixpkgs/pkgs/development/python-modules/protobuf/3.nix
new file mode 100644
index 000000000000..d9e3cce5f918
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/protobuf/3.nix
@@ -0,0 +1,90 @@
+{ buildPackages
+, buildPythonPackage
+, fetchpatch
+, isPyPy
+, lib
+, protobuf
+, pytestCheckHook
+, pythonAtLeast
+, tzdata
+}:
+
+assert lib.versionAtLeast protobuf.version "3.21" -> throw "Protobuf 3.20 or older required";
+
+buildPythonPackage {
+  inherit (protobuf) pname src;
+
+  version = protobuf.version;
+
+  sourceRoot = "${protobuf.src.name}/python";
+
+  patches = lib.optionals (pythonAtLeast "3.11") [
+    (fetchpatch {
+      name = "support-python311.patch";
+      url = "https://github.com/protocolbuffers/protobuf/commit/2206b63c4649cf2e8a06b66c9191c8ef862ca519.diff";
+      stripLen = 1; # because sourceRoot above
+      hash = "sha256-3GaoEyZIhS3QONq8LEvJCH5TdO9PKnOgcQF0GlEiwFo=";
+    })
+  ];
+
+  prePatch = ''
+    if [[ "$(<../version.json)" != *'"python": "'"$version"'"'* ]]; then
+      echo "Python library version mismatch. Derivation version: $version, actual: $(<../version.json)"
+      exit 1
+    fi
+  '';
+
+  # Remove the line in setup.py that forces compiling with C++14. Upstream's
+  # CMake build has been updated to support compiling with other versions of
+  # C++, but the Python build has not. Without this, we observe compile-time
+  # errors using GCC.
+  #
+  # Fedora appears to do the same, per this comment:
+  #
+  #   https://github.com/protocolbuffers/protobuf/issues/12104#issuecomment-1542543967
+  #
+  postPatch = ''
+    sed -i "/extra_compile_args.append('-std=c++14')/d" setup.py
+  '';
+
+  nativeBuildInputs = lib.optional isPyPy tzdata;
+
+  buildInputs = [ protobuf ];
+
+  propagatedNativeBuildInputs = [
+    # For protoc of the same version.
+    buildPackages."protobuf${lib.versions.major protobuf.version}_${lib.versions.minor protobuf.version}"
+  ];
+
+  setupPyGlobalFlags = [ "--cpp_implementation" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals isPyPy [
+    # error message differs
+    "testInvalidTimestamp"
+    # requires tracemalloc which pypy does not implement
+    # https://foss.heptapod.net/pypy/pypy/-/issues/3048
+    "testUnknownFieldsNoMemoryLeak"
+    # assertion is not raised for some reason
+    "testStrictUtf8Check"
+  ];
+
+  pythonImportsCheck = [
+    "google.protobuf"
+    "google.protobuf.internal._api_implementation" # Verify that --cpp_implementation worked
+  ];
+
+  passthru = {
+    inherit protobuf;
+  };
+
+  meta = with lib; {
+    description = "Protocol Buffers are Google's data interchange format";
+    homepage = "https://developers.google.com/protocol-buffers/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ knedlsepp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/protobuf/default.nix b/nixpkgs/pkgs/development/python-modules/protobuf/default.nix
new file mode 100644
index 000000000000..3a42754de778
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/protobuf/default.nix
@@ -0,0 +1,118 @@
+{ buildPackages
+, buildPythonPackage
+, fetchpatch
+, isPyPy
+, lib
+, numpy
+, protobuf
+, pytestCheckHook
+, pythonAtLeast
+, substituteAll
+, tzdata
+}:
+
+assert lib.versionOlder protobuf.version "21" -> throw "Protobuf 21 or newer required";
+
+let
+  protobufVersionMajor = lib.versions.major protobuf.version;
+  protobufVersionMinor = lib.versions.minor protobuf.version;
+in
+buildPythonPackage {
+  inherit (protobuf) pname src;
+
+  # protobuf 21 corresponds with its python library 4.21
+  version = "4.${protobufVersionMajor}.${protobufVersionMinor}";
+
+  sourceRoot = "${protobuf.src.name}/python";
+
+  patches = lib.optionals (lib.versionAtLeast protobuf.version "22") [
+    # Replace the vendored abseil-cpp with nixpkgs'
+    (substituteAll {
+      src = ./use-nixpkgs-abseil-cpp.patch;
+      abseil_cpp_include_path = "${lib.getDev protobuf.abseil-cpp}/include";
+    })
+  ]
+  ++ lib.optionals (pythonAtLeast "3.11" && lib.versionOlder protobuf.version "22") [
+    (fetchpatch {
+      name = "support-python311.patch";
+      url = "https://github.com/protocolbuffers/protobuf/commit/2206b63c4649cf2e8a06b66c9191c8ef862ca519.diff";
+      stripLen = 1; # because sourceRoot above
+      hash = "sha256-3GaoEyZIhS3QONq8LEvJCH5TdO9PKnOgcQF0GlEiwFo=";
+    })
+  ];
+
+  prePatch = ''
+    if [[ "$(<../version.json)" != *'"python": "'"$version"'"'* ]]; then
+      echo "Python library version mismatch. Derivation version: $version, actual: $(<../version.json)"
+      exit 1
+    fi
+  '';
+
+  # Remove the line in setup.py that forces compiling with C++14. Upstream's
+  # CMake build has been updated to support compiling with other versions of
+  # C++, but the Python build has not. Without this, we observe compile-time
+  # errors using GCC.
+  #
+  # Fedora appears to do the same, per this comment:
+  #
+  #   https://github.com/protocolbuffers/protobuf/issues/12104#issuecomment-1542543967
+  #
+  postPatch = ''
+    sed -i "/extra_compile_args.append('-std=c++14')/d" setup.py
+  '';
+
+  nativeBuildInputs = lib.optional isPyPy tzdata;
+
+  buildInputs = [ protobuf ];
+
+  propagatedNativeBuildInputs = [
+    # For protoc of the same version.
+    buildPackages."protobuf_${protobufVersionMajor}"
+  ];
+
+  setupPyGlobalFlags = [ "--cpp_implementation" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.optionals (lib.versionAtLeast protobuf.version "22") [
+    numpy
+  ];
+
+  disabledTests = lib.optionals isPyPy [
+    # error message differs
+    "testInvalidTimestamp"
+    # requires tracemalloc which pypy does not implement
+    # https://foss.heptapod.net/pypy/pypy/-/issues/3048
+    "testUnknownFieldsNoMemoryLeak"
+    # assertion is not raised for some reason
+    "testStrictUtf8Check"
+  ];
+
+  disabledTestPaths = lib.optionals (lib.versionAtLeast protobuf.version "23") [
+    # The following commit (I think) added some internal test logic for Google
+    # that broke generator_test.py. There is a new proto file that setup.py is
+    # not generating into a .py file. However, adding this breaks a bunch of
+    # conflict detection in descriptor_test.py that I don't understand. So let's
+    # just disable generator_test.py for now.
+    #
+    #   https://github.com/protocolbuffers/protobuf/commit/5abab0f47e81ac085f0b2d17ec3b3a3b252a11f1
+    #
+    "google/protobuf/internal/generator_test.py"
+  ];
+
+  pythonImportsCheck = [
+    "google.protobuf"
+    "google.protobuf.internal._api_implementation" # Verify that --cpp_implementation worked
+  ];
+
+  passthru = {
+    inherit protobuf;
+  };
+
+  meta = with lib; {
+    description = "Protocol Buffers are Google's data interchange format";
+    homepage = "https://developers.google.com/protocol-buffers/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ knedlsepp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/protobuf/use-nixpkgs-abseil-cpp.patch b/nixpkgs/pkgs/development/python-modules/protobuf/use-nixpkgs-abseil-cpp.patch
new file mode 100644
index 000000000000..cbc92bb76ab8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/protobuf/use-nixpkgs-abseil-cpp.patch
@@ -0,0 +1,13 @@
+diff --git a/setup.py b/setup.py
+index e65631013..d511c2996 100755
+--- a/setup.py
++++ b/setup.py
+@@ -412,7 +412,7 @@ if __name__ == '__main__':
+         Extension(
+             'google.protobuf.pyext._message',
+             glob.glob('google/protobuf/pyext/*.cc'),
+-            include_dirs=['.', '../src', '../third_party/abseil-cpp'],
++            include_dirs=['.', '../src', '@abseil_cpp_include_path@'],
+             libraries=libraries,
+             extra_objects=extra_objects,
+             extra_link_args=message_extra_link_args,
diff --git a/nixpkgs/pkgs/development/python-modules/protobuf3-to-dict/default.nix b/nixpkgs/pkgs/development/python-modules/protobuf3-to-dict/default.nix
new file mode 100644
index 000000000000..ffc21c1428fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/protobuf3-to-dict/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, protobuf, six }:
+
+buildPythonPackage rec {
+  pname = "protobuf3-to-dict";
+  version = "0.1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0nibblvj3n20zvq6d73zalbjqjby0w8ji5mim7inhn7vb9dw4hhy";
+  };
+
+  doCheck = false;
+
+  pythonImportsCheck = [ "protobuf_to_dict" ];
+
+  propagatedBuildInputs = [ protobuf six ];
+
+  meta = with lib; {
+    description = "A teeny Python library for creating Python dicts from protocol buffers and the reverse";
+    homepage = "https://github.com/kaporzhu/protobuf-to-dict";
+    license = licenses.publicDomain;
+    maintainers = with maintainers; [ nequissimus ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/proton-client/0001-OpenSSL-path-fix.patch b/nixpkgs/pkgs/development/python-modules/proton-client/0001-OpenSSL-path-fix.patch
new file mode 100644
index 000000000000..7e97b2da5d3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/proton-client/0001-OpenSSL-path-fix.patch
@@ -0,0 +1,41 @@
+From 48da17d61e38657dfb10f2ac642fd3e6a45ee607 Mon Sep 17 00:00:00 2001
+From: "P. R. d. O" <d.ol.rod@tutanota.com>
+Date: Wed, 27 Apr 2022 14:29:53 -0600
+Subject: [PATCH] OpenSSL path fix
+
+---
+ proton/srp/_ctsrp.py | 12 ++----------
+ 1 file changed, 2 insertions(+), 10 deletions(-)
+
+diff --git a/proton/srp/_ctsrp.py b/proton/srp/_ctsrp.py
+index e19f184..af359c5 100644
+--- a/proton/srp/_ctsrp.py
++++ b/proton/srp/_ctsrp.py
+@@ -24,22 +24,14 @@ from .util import PM_VERSION, SRP_LEN_BYTES, SALT_LEN_BYTES, hash_password
+ dlls = list()
+ 
+ platform = sys.platform
+-if platform == 'darwin':
+-    dlls.append(ctypes.cdll.LoadLibrary('libssl.dylib'))
+-elif 'win' in platform:
++if 'win' in platform:
+     for d in ('libeay32.dll', 'libssl32.dll', 'ssleay32.dll'):
+         try:
+             dlls.append(ctypes.cdll.LoadLibrary(d))
+         except Exception:
+             pass
+ else:
+-    try:
+-        dlls.append(ctypes.cdll.LoadLibrary('libssl.so.10'))
+-    except OSError:
+-        try:
+-            dlls.append(ctypes.cdll.LoadLibrary('libssl.so.1.0.0'))
+-        except OSError:
+-            dlls.append(ctypes.cdll.LoadLibrary('libssl.so'))
++    dlls.append(ctypes.cdll.LoadLibrary('@openssl@/lib/libssl@ext@'))
+ 
+ 
+ class BIGNUM_Struct(ctypes.Structure):
+-- 
+2.35.1
+
diff --git a/nixpkgs/pkgs/development/python-modules/proton-client/default.nix b/nixpkgs/pkgs/development/python-modules/proton-client/default.nix
new file mode 100644
index 000000000000..ae29bf631a51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/proton-client/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, substituteAll
+, bcrypt
+, pyopenssl
+, python-gnupg
+, pytestCheckHook
+, requests
+, openssl
+}:
+
+buildPythonPackage rec {
+  pname = "proton-client";
+  version = "0.7.1";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ProtonMail";
+    repo = "proton-python-client";
+    rev = version;
+    hash = "sha256-mhPq9O/LCu3+E1jKlaJmrI8dxbA9BIwlc34qGwoxi5g=";
+  };
+
+  propagatedBuildInputs = [
+    bcrypt
+    pyopenssl
+    python-gnupg
+    requests
+  ];
+
+  buildInputs = [ openssl ];
+
+  patches = [
+    # Patches library by fixing the openssl path
+    (substituteAll {
+      src = ./0001-OpenSSL-path-fix.patch;
+      openssl = openssl.out;
+      ext = stdenv.hostPlatform.extensions.sharedLibrary;
+    })
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  disabledTests = [
+    #ValueError: Invalid modulus
+    "test_modulus_verification"
+  ];
+
+  pythonImportsCheck = [ "proton" ];
+
+  meta = with lib; {
+    description = "Python Proton client module";
+    homepage = "https://github.com/ProtonMail/proton-python-client";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ wolfangaukang ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/protonup-ng/default.nix b/nixpkgs/pkgs/development/python-modules/protonup-ng/default.nix
new file mode 100644
index 000000000000..f79285ce96a7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/protonup-ng/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, pythonOlder, fetchPypi, requests, configparser }:
+
+buildPythonPackage rec {
+  pname = "protonup-ng";
+  version = "0.2.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rys9Noa3+w4phttfcI1OGEDfHMy8s80bm8kM8TzssQA=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "argparse" ""
+  '';
+
+  propagatedBuildInputs = [ requests configparser ];
+
+  doCheck = false; # protonup does not have any tests
+  pythonImportsCheck = [ "protonup" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/cloudishBenne/protonup-ng";
+    description = "CLI program and API to automate the installation and update of GloriousEggroll's Proton-GE";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ Madouura ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/protonvpn-nm-lib/0001-Patching-GIRepository.patch b/nixpkgs/pkgs/development/python-modules/protonvpn-nm-lib/0001-Patching-GIRepository.patch
new file mode 100644
index 000000000000..bb34dff0b5a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/protonvpn-nm-lib/0001-Patching-GIRepository.patch
@@ -0,0 +1,22 @@
+From 2867f022aad754fe54d95222b3ae52f6e7f14c2f Mon Sep 17 00:00:00 2001
+From: "P. R. d. O" <d.ol.rod@tutanota.com>
+Date: Wed, 27 Apr 2022 21:49:12 -0600
+Subject: [PATCH] Patching GIRepository
+
+---
+ protonvpn_nm_lib/__init__.py | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/protonvpn_nm_lib/__init__.py b/protonvpn_nm_lib/__init__.py
+index e69de29..00b95f4 100644
+--- a/protonvpn_nm_lib/__init__.py
++++ b/protonvpn_nm_lib/__init__.py
+@@ -0,0 +1,5 @@
++import gi
++gi.require_version('GIRepository', '2.0')
++from gi.repository import GIRepository
++repo = GIRepository.Repository.get_default()
++repo.prepend_search_path('@networkmanager_path@')
+-- 
+2.35.1
+
diff --git a/nixpkgs/pkgs/development/python-modules/protonvpn-nm-lib/default.nix b/nixpkgs/pkgs/development/python-modules/protonvpn-nm-lib/default.nix
new file mode 100644
index 000000000000..dee0b8cc6a85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/protonvpn-nm-lib/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, substituteAll
+, dbus-python
+, distro
+, jinja2
+, keyring
+, proton-client
+, pygobject3
+, pyxdg
+, systemd
+, ncurses
+, networkmanager
+, pkgs-systemd
+, python
+, xdg-utils
+, makeWrapper
+}:
+
+buildPythonPackage rec {
+  pname = "protonvpn-nm-lib";
+  version = "3.16.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ProtonVPN";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-n3jfBHMYqyQZgvFFJcylNbTWZ3teuqhdelTfpNrwWuA=";
+  };
+
+  propagatedBuildInputs = [
+    dbus-python
+    distro
+    jinja2
+    keyring
+    proton-client
+    pygobject3
+    pyxdg
+    systemd
+    ncurses
+    networkmanager
+    pkgs-systemd
+    xdg-utils
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./0001-Patching-GIRepository.patch;
+      networkmanager_path = "${networkmanager}/lib/girepository-1.0";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace protonvpn_nm_lib/core/dbus/dbus_reconnect.py \
+      --replace "exec_start = python_interpreter_path + \" \" + python_service_path" "exec_start = \"$out/bin/protonvpn_reconnector.py\""
+  '';
+
+  postInstall = ''
+    makeWrapper ${python.interpreter} $out/bin/protonvpn_reconnector.py \
+      --add-flags $out/${python.sitePackages}/protonvpn_nm_lib/daemon/dbus_daemon_reconnector.py \
+      --prefix PYTHONPATH : "$PYTHONPATH"
+  '';
+
+  # Checks cannot be run in the sandbox
+  # "Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory"
+  doCheck = false;
+
+  pythonImportsCheck = [ "protonvpn_nm_lib" ];
+
+  meta = with lib; {
+    description = "ProtonVPN NetworkManager Library intended for every ProtonVPN service user";
+    homepage = "https://github.com/ProtonVPN/protonvpn-nm-lib";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ wolfangaukang ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/prov/default.nix b/nixpkgs/pkgs/development/python-modules/prov/default.nix
new file mode 100644
index 000000000000..91b7e412b581
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prov/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, lxml
+, networkx
+, python-dateutil
+, rdflib
+, pydot
+}:
+
+buildPythonPackage rec {
+  pname = "prov";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b6438f2195ecb9f6e8279b58971e02bc51814599b5d5383366eef91d867422ee";
+  };
+
+  propagatedBuildInputs = [
+    lxml
+    networkx
+    python-dateutil
+    rdflib
+  ];
+
+  nativeCheckInputs = [
+    pydot
+  ];
+
+  # Multiple tests are out-dated and failing
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "prov"
+  ];
+
+  meta = with lib; {
+    description = "Python library for W3C Provenance Data Model (PROV)";
+    homepage = "https://github.com/trungdong/prov";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ashgillman ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/prox-tv/default.nix b/nixpkgs/pkgs/development/python-modules/prox-tv/default.nix
new file mode 100644
index 000000000000..869ac7457c76
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/prox-tv/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, blas
+, lapack
+, buildPythonPackage
+, cffi
+, fetchFromGitHub
+, nose
+, numpy
+, stdenv
+}:
+
+buildPythonPackage {
+  pname = "prox-tv";
+  version = "3.3.0";
+
+  src = fetchFromGitHub {
+    owner = "albarji";
+    repo = "proxTV";
+    rev = "e621585d5aaa7983fbee68583f7deae995d3bafb";
+    sha256 = "0mlrjbb5rw78dgijkr3bspmsskk6jqs9y7xpsgs35i46dvb327q5";
+  };
+
+  nativeCheckInputs = [
+    nose
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    cffi
+  ];
+
+  # this test is known to fail on darwin
+  checkPhase = ''
+    nosetests --exclude=test_tvp_1d ${lib.optionalString stdenv.isDarwin " --exclude=test_tv2_1d"}
+  '';
+
+  propagatedNativeBuildInputs = [ cffi ];
+
+  buildInputs = [ blas lapack ];
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    homepage = "https://github.com/albarji/proxTV";
+    description = "A toolbox for fast Total Variation proximity operators";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ multun ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/proxmoxer/default.nix b/nixpkgs/pkgs/development/python-modules/proxmoxer/default.nix
new file mode 100644
index 000000000000..98063a560472
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/proxmoxer/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, paramiko
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-toolbelt
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "proxmoxer";
+  version = "2.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-kwD6yJhVTaVAAUVA6k4r6HZy4w+MPDF7DfJBS8wGE/c=";
+  };
+
+  propagatedBuildInputs = [
+    paramiko
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests-toolbelt
+    responses
+  ];
+
+  disabledTestPaths = [
+    # Tests require openssh_wrapper which is outdated and not available
+    "tests/test_openssh.py"
+  ];
+
+  pythonImportsCheck = [
+    "proxmoxer"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for Proxmox API v2";
+    homepage = "https://github.com/proxmoxer/proxmoxer";
+    changelog = "https://github.com/proxmoxer/proxmoxer/releases/tag/${version}";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/proxy-db/default.nix b/nixpkgs/pkgs/development/python-modules/proxy-db/default.nix
new file mode 100644
index 000000000000..1a6781b763f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/proxy-db/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+, six
+, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "proxy-db";
+  version = "0.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Nekmo";
+    repo = "proxy-db";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-NdbvK2sJKKoWNYsuBaCMWtKEvuMhgyKXcKZXQgTC4bY=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    click
+    requests
+    six
+    sqlalchemy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests-mock
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  pythonImportsCheck = [
+    "proxy_db"
+  ];
+
+  meta = with lib; {
+    description = "Module to manage proxies in a local database";
+    homepage = "https://github.com/Nekmo/proxy-db/";
+    changelog = "https://github.com/Nekmo/proxy-db/blob/v${version}/HISTORY.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/proxy-py/default.nix b/nixpkgs/pkgs/development/python-modules/proxy-py/default.nix
new file mode 100644
index 000000000000..7c88211f5d27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/proxy-py/default.nix
@@ -0,0 +1,101 @@
+{ lib
+, stdenv
+, bash
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, gnumake
+, httpx
+, openssl
+, paramiko
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, typing-extensions
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "proxy-py";
+  version = "2.4.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "abhinavsingh";
+    repo = "proxy.py";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-dA7a9RicBFCSf6IoGX/CdvI8x/xMOFfNtyuvFn9YmHI=";
+  };
+
+  patches = [
+    # this patch is so that the one following it applies cleanly
+    # https://github.com/abhinavsingh/proxy.py/pull/1209
+    (fetchpatch {
+      name = "update-build-dependencies.patch";
+      url = "https://github.com/abhinavsingh/proxy.py/commit/2e535360ce5ed9734f2c00dc6aefe5ebd281cea5.patch";
+      hash = "sha256-eR3R4M7jwQMnY5ob0V6G71jXcrkV7YZvo1JOUG4gnrY=";
+    })
+    # https://github.com/abhinavsingh/proxy.py/pull/1345
+    (fetchpatch {
+      name = "remove-setuptools-scm-git-archive-dependency.patch";
+      url = "https://github.com/abhinavsingh/proxy.py/commit/027bfa6b912745f588d272f1a1082f6ca416f815.patch";
+      hash = "sha256-O2LlSrSrB3u2McAZRY+KviuU7Hv1tOuf0n+D/H4BWvI=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace Makefile \
+    --replace "SHELL := /bin/bash" "SHELL := ${bash}/bin/bash"
+    substituteInPlace pytest.ini \
+      --replace "-p pytest_cov" "" \
+      --replace "--no-cov-on-fail" ""
+    sed -i "/--cov/d" pytest.ini
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    paramiko
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    httpx
+    openssl
+    gnumake
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  disabledTests = [
+    # Test requires network access
+    "test_http2_via_proxy"
+    # Tests run into a timeout
+    "integration"
+  ];
+
+  pythonImportsCheck = [
+    "proxy"
+  ];
+
+  meta = with lib; {
+    description = "Python proxy framework";
+    homepage = "https://github.com/abhinavsingh/proxy.py";
+    changelog = "https://github.com/abhinavsingh/proxy.py/releases/tag/v${version}";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/proxy-tools/default.nix b/nixpkgs/pkgs/development/python-modules/proxy-tools/default.nix
new file mode 100644
index 000000000000..beb91a433388
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/proxy-tools/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "proxy-tools";
+  version = "0.1.0";
+  pyproject = true;
+
+  src = fetchPypi {
+    pname = "proxy_tools";
+    inherit version;
+    hash = "sha256-zLN1H1KcBH4tilhEDYayBTA88P6BRveE0cvNlPCigBA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  # no tests in pypi
+  doCheck = false;
+  pythonImportsCheck = [ "proxy_tools" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jtushman/proxy_tools";
+    description = "Simple (hopefuly useful) Proxy (as in the GoF design pattern) implementation for Python";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ jojosch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/psautohint/default.nix b/nixpkgs/pkgs/development/python-modules/psautohint/default.nix
new file mode 100644
index 000000000000..f2b5735083b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/psautohint/default.nix
@@ -0,0 +1,62 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder
+, fonttools
+, lxml, fs # for fonttools extras
+, setuptools-scm
+, pytestCheckHook, pytest-cov, pytest-xdist
+, runAllTests ? false, psautohint # for passthru.tests
+}:
+
+buildPythonPackage rec {
+  pname = "psautohint";
+  version = "2.4.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "adobe-type-tools";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "125nx7accvbk626qlfar90va1995kp9qfrz6a978q4kv2kk37xai";
+    fetchSubmodules = true; # data dir for tests
+  };
+
+  postPatch = ''
+    echo '#define PSAUTOHINT_VERSION "${version}"' > libpsautohint/src/version.h
+    sed -i '/use_scm_version/,+3d' setup.py
+    sed -i '/setup(/a \     version="${version}",' setup.py
+  '';
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ fonttools lxml fs ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-cov
+    pytest-xdist
+  ];
+  disabledTests = lib.optionals (!runAllTests) [
+    # Slow tests, reduces test time from ~5 mins to ~30s
+    "test_mmufo"
+    "test_flex_ufo"
+    "test_ufo"
+    "test_flex_otf"
+    "test_multi_outpath"
+    "test_mmhint"
+    "test_otf"
+    # flaky tests (see https://github.com/adobe-type-tools/psautohint/issues/385)
+    "test_hashmap_old_version"
+    "test_hashmap_no_version"
+  ];
+
+  passthru.tests = {
+    fullTestsuite = psautohint.override { runAllTests = true; };
+  };
+
+  meta = with lib; {
+    description = "Script to normalize the XML and other data inside of a UFO";
+    homepage = "https://github.com/adobe-type-tools/psautohint";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.sternenseemann ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pscript/default.nix b/nixpkgs/pkgs/development/python-modules/pscript/default.nix
new file mode 100644
index 000000000000..76af30e2c125
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pscript/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, nodejs
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pscript";
+  version = "0.7.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "flexxui";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-AhVI+7FiWyH+DfAXnau4aAHJAJtsWEpmnU90ey2z35o=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    nodejs
+  ];
+
+  preCheck = ''
+    # do not execute legacy tests
+    rm -rf pscript_legacy
+  '';
+
+  pythonImportsCheck = [
+    "pscript"
+  ];
+
+  meta = with lib; {
+    description = "Python to JavaScript compiler";
+    homepage = "https://pscript.readthedocs.io";
+    changelog = "https://github.com/flexxui/pscript/blob/v${version}/docs/releasenotes.rst";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ matthiasbeyer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/psd-tools/default.nix b/nixpkgs/pkgs/development/python-modules/psd-tools/default.nix
new file mode 100644
index 000000000000..efc6aa6d742c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/psd-tools/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, docopt
+, pillow
+, scikit-image
+, aggdraw
+, pytestCheckHook
+, ipython
+, cython
+}:
+
+buildPythonPackage rec {
+  pname = "psd-tools";
+  version = "1.9.28";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "psd-tools";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+oxXuZaHkLPuMIsiFOkvW6VLuGxpV7YKs6Gxp/lexVQ=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    aggdraw
+    docopt
+    ipython
+    pillow
+    scikit-image
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "psd_tools"
+  ];
+
+  meta = with lib; {
+    description = "Python package for reading Adobe Photoshop PSD files";
+    homepage = "https://github.com/kmike/psd-tools";
+    changelog = "https://github.com/psd-tools/psd-tools/blob/v${version}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/psrpcore/default.nix b/nixpkgs/pkgs/development/python-modules/psrpcore/default.nix
new file mode 100644
index 000000000000..8608c19c8dcd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/psrpcore/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, xmldiff
+}:
+
+buildPythonPackage rec {
+  pname = "psrpcore";
+  version = "0.2.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jborean93";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-6d5HQJEH/x+V0rpmQkprMlH1n151KyUF6d4tM9W5TFs=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    xmldiff
+  ];
+
+  pythonImportsCheck = [
+    "psrpcore"
+  ];
+
+  meta = with lib; {
+    description = "Library for the PowerShell Remoting Protocol (PSRP)";
+    homepage = "https://github.com/jborean93/psrpcore";
+    changelog = "https://github.com/jborean93/psrpcore/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/psutil-home-assistant/default.nix b/nixpkgs/pkgs/development/python-modules/psutil-home-assistant/default.nix
new file mode 100644
index 000000000000..9ea18d7853b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/psutil-home-assistant/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, psutil
+, pytestCheckHook
+}:
+
+
+buildPythonPackage rec {
+  pname = "psutil-home-assistant";
+  version = "0.0.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = "psutil-home-assistant";
+    rev = "refs/tags/${version}";
+    hash = "sha256-6bj1aaa/JYZFVwUAJfxISRoldgTmumCG8WrlKhkb6kM=";
+  };
+
+  propagatedBuildInputs = [
+    psutil
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/home-assistant-libs/psutil-home-assistant/releases/tag/${version}";
+    description = "Wrapper of psutil that removes reliance on globals";
+    homepage = "https://github.com/home-assistant-libs/psutil-home-assistant";
+    license = licenses.asl20;
+    maintainers = teams.home-assistant.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/psutil/default.nix b/nixpkgs/pkgs/development/python-modules/psutil/default.nix
new file mode 100644
index 000000000000..a08ff4c7a697
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/psutil/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, CoreFoundation
+, fetchPypi
+, IOKit
+, pytestCheckHook
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "psutil";
+  version = "5.9.6";
+  format = "setuptools";
+
+  inherit stdenv;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5Lkt3NfdTN0/kAGA6h4QSTLHvOI0+4iXbio7KWRBIlo=";
+  };
+
+  buildInputs =
+    # workaround for https://github.com/NixOS/nixpkgs/issues/146760
+    lib.optionals (stdenv.isDarwin && stdenv.isx86_64) [
+      CoreFoundation
+    ] ++ lib.optionals stdenv.isDarwin [
+      IOKit
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Segfaults on darwin:
+  # https://github.com/giampaolo/psutil/issues/1715
+  doCheck = !stdenv.isDarwin;
+
+  # In addition to the issues listed above there are some that occure due to
+  # our sandboxing which we can work around by disabling some tests:
+  # - cpu_times was flaky on darwin
+  # - the other disabled tests are likely due to sanboxing (missing specific errors)
+  pytestFlagsArray = [
+    # Note: $out must be referenced as test import paths are relative
+    "$out/${python.sitePackages}/psutil/tests/test_system.py"
+  ];
+
+  disabledTests = [
+    # Some of the tests have build-system hardware-based impurities (like
+    # reading temperature sensor values).  Disable them to avoid the failures
+    # that sometimes result.
+    "cpu_freq"
+    "cpu_times"
+    "disk_io_counters"
+    "sensors_battery"
+    "sensors_temperatures"
+    "user"
+    "test_disk_partitions" # problematic on Hydra's Linux builders, apparently
+  ];
+
+  pythonImportsCheck = [
+    "psutil"
+  ];
+
+  meta = with lib; {
+    description = "Process and system utilization information interface";
+    homepage = "https://github.com/giampaolo/psutil";
+    changelog = "https://github.com/giampaolo/psutil/blob/release-${version}/HISTORY.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/psychrolib/default.nix b/nixpkgs/pkgs/development/python-modules/psychrolib/default.nix
new file mode 100644
index 000000000000..cda0523b9698
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/psychrolib/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "psychrolib";
+  version = "2.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "psychrometrics";
+    repo = "psychrolib";
+    rev = "refs/tags/${version}";
+    hash = "sha256-OkjoYIakF7NXluNTaJnUHk5cI5t8GnpqrbqHYwnLOts=";
+  };
+
+  sourceRoot = "${src.name}/src/python";
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "psychrolib"
+  ];
+
+  meta = with lib; {
+    description = "Library of psychrometric functions to calculate thermodynamic properties";
+    homepage = "https://github.com/psychrometrics/psychrolib";
+    changelog = "https://github.com/psychrometrics/psychrolib/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/psycopg/ctypes.patch b/nixpkgs/pkgs/development/python-modules/psycopg/ctypes.patch
new file mode 100644
index 000000000000..a76d38f85e80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/psycopg/ctypes.patch
@@ -0,0 +1,46 @@
+diff --git a/psycopg/psycopg/pq/_pq_ctypes.py b/psycopg/psycopg/pq/_pq_ctypes.py
+index 4f9d00fb..24b90ef6 100644
+--- a/psycopg/psycopg/pq/_pq_ctypes.py
++++ b/psycopg/psycopg/pq/_pq_ctypes.py
+@@ -11,14 +11,10 @@ from ctypes import Structure, CFUNCTYPE, POINTER
+ from ctypes import c_char, c_char_p, c_int, c_size_t, c_ubyte, c_uint, c_void_p
+ from typing import List, Optional, Tuple
+ 
+-from .misc import find_libpq_full_path
+ from ..errors import NotSupportedError
+ 
+-libname = find_libpq_full_path()
+-if not libname:
+-    raise ImportError("libpq library not found")
+ 
+-pq = ctypes.cdll.LoadLibrary(libname)
++pq = ctypes.cdll.LoadLibrary("@libpq@")
+ 
+ 
+ class FILE(Structure):
+@@ -28,9 +24,7 @@ class FILE(Structure):
+ FILE_ptr = POINTER(FILE)
+ 
+ if sys.platform == "linux":
+-    libcname = ctypes.util.find_library("c")
+-    assert libcname
+-    libc = ctypes.cdll.LoadLibrary(libcname)
++    libc = ctypes.cdll.LoadLibrary("@libc@")
+ 
+     fdopen = libc.fdopen
+     fdopen.argtypes = (c_int, c_char_p)
+diff --git a/tests/fix_pq.py b/tests/fix_pq.py
+index 6811a26c..c1829c82 100644
+--- a/tests/fix_pq.py
++++ b/tests/fix_pq.py
+@@ -51,9 +51,7 @@ def libpq():
+         from psycopg.pq.misc import find_libpq_full_path
+ 
+         # Not available when testing the binary package
+-        libname = find_libpq_full_path()
+-        assert libname, "libpq libname not found"
+-        return ctypes.pydll.LoadLibrary(libname)
++        return ctypes.pydll.LoadLibrary("@libpq@")
+     except Exception as e:
+         if pq.__impl__ == "binary":
+             pytest.skip(f"can't load libpq for testing: {e}")
diff --git a/nixpkgs/pkgs/development/python-modules/psycopg/default.nix b/nixpkgs/pkgs/development/python-modules/psycopg/default.nix
new file mode 100644
index 000000000000..b73c74ca0ae3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/psycopg/default.nix
@@ -0,0 +1,232 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, fetchurl
+, pythonOlder
+, substituteAll
+
+# build
+, postgresql
+, setuptools
+
+# propagates
+, backports-zoneinfo
+, typing-extensions
+
+# psycopg-c
+, cython_3
+, tomli
+
+# docs
+, furo
+, shapely
+, sphinxHook
+, sphinx-autodoc-typehints
+
+# tests
+, anyio
+, pproxy
+, pytest-randomly
+, pytestCheckHook
+, postgresqlTestHook
+}:
+
+let
+  pname = "psycopg";
+  version = "3.1.13";
+
+  src = fetchFromGitHub {
+    owner = "psycopg";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-N+x8RErlId1uBgXZjBBjtPxqJXGuXZEl78DKVKjhy9w=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./ctypes.patch;
+      libpq = "${postgresql.lib}/lib/libpq${stdenv.hostPlatform.extensions.sharedLibrary}";
+      libc = "${stdenv.cc.libc}/lib/libc.so.6";
+    })
+
+    (fetchpatch {
+      # fix environment variables leaking into test environment
+      # https://github.com/psycopg/psycopg/pull/683
+      # https://github.com/psycopg/psycopg/issues/681
+      url = "https://github.com/psycopg/psycopg/commit/f060855aa6126e811de243c7213d2caff9c88123.patch";
+      hash = "sha256-QsFxK8Qasw9kbNCUUCqbOHaf53kT5NONlr28vGoPda0=";
+    })
+  ];
+
+  baseMeta = {
+    changelog = "https://github.com/psycopg/psycopg/blob/${version}/docs/news.rst#current-release";
+    homepage = "https://github.com/psycopg/psycopg";
+    license = lib.licenses.lgpl3Plus;
+    maintainers = with lib.maintainers; [ hexa ];
+  };
+
+  psycopg-c = buildPythonPackage {
+    pname = "${pname}-c";
+    inherit version src;
+    format = "pyproject";
+
+    # apply patches to base repo
+    inherit patches;
+
+    # move into source root after patching
+    postPatch = ''
+      cd psycopg_c
+    '';
+
+    nativeBuildInputs = [
+      cython_3
+      postgresql
+      setuptools
+      tomli
+    ];
+
+    # tested in psycopg
+    doCheck = false;
+
+    meta = baseMeta // {
+      description = "C optimisation distribution for Psycopg";
+    };
+  };
+
+  psycopg-pool = buildPythonPackage {
+    pname = "${pname}-pool";
+    inherit version src;
+    format = "setuptools";
+
+    # apply patches to base repo
+    inherit patches;
+
+    # move into source root after patching
+    postPatch = ''
+      cd psycopg_pool
+    '';
+
+    propagatedBuildInputs = [
+      typing-extensions
+    ];
+
+    # tested in psycopg
+    doCheck = false;
+
+    meta = baseMeta // {
+      description = "Connection Pool for Psycopg";
+    };
+  };
+
+in
+
+buildPythonPackage rec {
+  inherit pname version src;
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  outputs = [
+    "out"
+    "doc"
+  ];
+
+  sphinxRoot = "../docs";
+
+  # Introduce this file necessary for the docs build via environment var
+  LIBPQ_DOCS_FILE = fetchurl {
+    url = "https://raw.githubusercontent.com/postgres/postgres/REL_14_STABLE/doc/src/sgml/libpq.sgml";
+    hash = "sha256-yn09fR9+7zQni8SvTG7BUmYRD7MK7u2arVAznWz2oAw=";
+  };
+
+  inherit patches;
+
+  # only move to sourceRoot after patching, makes patching easier
+  postPatch = ''
+    cd psycopg
+  '';
+
+  nativeBuildInputs = [
+    furo
+    setuptools
+    shapely
+    sphinx-autodoc-typehints
+    sphinxHook
+  ];
+
+  propagatedBuildInputs = [
+    psycopg-c
+    typing-extensions
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    backports-zoneinfo
+  ];
+
+  pythonImportsCheck = [
+    "psycopg"
+    "psycopg_c"
+    "psycopg_pool"
+  ];
+
+  passthru.optional-dependencies = {
+    c = [ psycopg-c ];
+    pool = [ psycopg-pool ];
+  };
+
+  nativeCheckInputs = [
+    anyio
+    pproxy
+    pytest-randomly
+    pytestCheckHook
+    postgresql
+  ]
+  ++ lib.optional (stdenv.isLinux) postgresqlTestHook
+  ++ passthru.optional-dependencies.c
+  ++ passthru.optional-dependencies.pool;
+
+  env = {
+    postgresqlEnableTCP = 1;
+    PGUSER = "psycopg";
+    PGDATABASE = "psycopg";
+  };
+
+  preCheck = ''
+    cd ..
+  '' + lib.optionalString (stdenv.isLinux) ''
+    export PSYCOPG_TEST_DSN="host=/build/run/postgresql user=$PGUSER"
+  '';
+
+  disabledTests = [
+    # don't depend on mypy for tests
+    "test_version"
+    "test_package_version"
+  ];
+
+  disabledTestPaths = [
+    # Network access
+    "tests/test_dns.py"
+    "tests/test_dns_srv.py"
+    # Mypy typing test
+    "tests/test_typing.py"
+    "tests/crdb/test_typing.py"
+  ];
+
+  pytestFlagsArray = [
+    "-o" "cache_dir=$TMPDIR"
+    "-m" "'not timing'"
+  ];
+
+  postCheck = ''
+    cd ${pname}
+  '';
+
+  passthru = {
+    c = psycopg-c;
+    pool = psycopg-pool;
+  };
+
+  meta = baseMeta // {
+    description = "PostgreSQL database adapter for Python";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/psycopg2/default.nix b/nixpkgs/pkgs/development/python-modules/psycopg2/default.nix
new file mode 100644
index 000000000000..43a06e5a9e4d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/psycopg2/default.nix
@@ -0,0 +1,66 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, pythonOlder
+, isPyPy
+, fetchPypi
+, postgresql
+, openssl
+, sphinxHook
+, sphinx-better-theme
+, buildPackages
+}:
+
+buildPythonPackage rec {
+  pname = "psycopg2";
+  version = "2.9.7";
+  format = "setuptools";
+
+  # Extension modules don't work well with PyPy. Use psycopg2cffi instead.
+  # c.f. https://github.com/NixOS/nixpkgs/pull/104151#issuecomment-729750892
+  disabled = pythonOlder "3.6" || isPyPy;
+
+  outputs = [ "out" "doc" ];
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8AzDW9cRnx/tF7hb0QB4VRlN3iy9jeAauOuxdIdECtg=";
+  };
+
+  postPatch = ''
+    # Preferably upstream would not depend on pg_config because config scripts are incompatible with cross-compilation, however postgresql's pc file is lacking information.
+    # some linker flags are added but the linker ignores them because they're incompatible
+    # https://github.com/psycopg/psycopg2/blob/89005ac5b849c6428c05660b23c5a266c96e677d/setup.py
+    substituteInPlace setup.py \
+      --replace "self.pg_config_exe = self.build_ext.pg_config" 'self.pg_config_exe = "${lib.getExe' buildPackages.postgresql "pg_config"}"'
+  '';
+
+  nativeBuildInputs = [
+    sphinxHook
+    sphinx-better-theme
+  ];
+
+  buildInputs = [
+    postgresql
+  ] ++ lib.optionals stdenv.isDarwin [
+    openssl
+  ];
+
+  sphinxRoot = "doc/src";
+
+  # Requires setting up a PostgreSQL database
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "psycopg2"
+  ];
+
+  disallowedReferences = lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [ buildPackages.postgresql ];
+
+  meta = with lib; {
+    description = "PostgreSQL database adapter for the Python programming language";
+    homepage = "https://www.psycopg.org";
+    license = with licenses; [ lgpl3Plus zpl20 ];
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/psycopg2cffi/default.nix b/nixpkgs/pkgs/development/python-modules/psycopg2cffi/default.nix
new file mode 100644
index 000000000000..a504c8484ab2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/psycopg2cffi/default.nix
@@ -0,0 +1,39 @@
+{ buildPythonPackage, cffi, fetchFromGitHub, lib, postgresql, pytestCheckHook, six }:
+
+buildPythonPackage rec {
+  pname = "psycopg2cffi";
+  version = "2.8.1";
+
+  # NB: This is a fork.
+  # The original repo exists at https://github.com/chtd/psycopg2cffi, however
+  # this is mostly unmaintained and does not build for PyPy. Given that the
+  # whole point of this cffi alternative to psycopg2 is to use it with PyPy, I
+  # chose to use a working fork instead, which was linked in the relevant issue:
+  # https://github.com/chtd/psycopg2cffi/issues/113#issuecomment-730548574
+  #
+  # If/when these changes get merged back upstream we should revert to using the
+  # original source as opposed to the fork.
+  src = fetchFromGitHub {
+    owner = "Omegapol";
+    repo = pname;
+    rev = "c202b25cd861d5e8f0f55c329764ff1da9f020c0";
+    sha256 = "09hsnjkix1c0vlhmfvrp8pchpnz2ya4xrchyq15czj527nx2dmy2";
+  };
+
+  nativeBuildInputs = [ postgresql ];
+  propagatedBuildInputs = [ six cffi ];
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  # NB: The tests need a postgres instance running to test against, and so we
+  # disable them.
+  doCheck = false;
+
+  pythonImportsCheck = [ "psycopg2cffi" ];
+
+  meta = with lib; {
+    description = "An implementation of the psycopg2 module using cffi";
+    homepage = "https://pypi.org/project/psycopg2cffi/";
+    license = with licenses; [ lgpl3Plus ];
+    maintainers = with maintainers; [ lovesegfault ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/psygnal/default.nix b/nixpkgs/pkgs/development/python-modules/psygnal/default.nix
new file mode 100644
index 000000000000..36ae22a67b68
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/psygnal/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatch-vcs
+, hatchling
+, mypy-extensions
+, numpy
+, pydantic
+, pytestCheckHook
+, pythonOlder
+, toolz
+, typing-extensions
+, wrapt
+}:
+
+buildPythonPackage rec {
+  pname = "psygnal";
+  version = "0.9.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pyapp-kit";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-eDfGWmTKJrkkzRy1I3wl3WYPCxtPHSRzqAoOiO7QQ9Y=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  buildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    mypy-extensions
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    numpy
+    pydantic
+    pytestCheckHook
+    toolz
+    wrapt
+  ];
+
+  pythonImportsCheck = [
+    "psygnal"
+  ];
+
+  meta = with lib; {
+    description = "Implementation of Qt Signals";
+    homepage = "https://github.com/pyapp-kit/psygnal";
+    changelog = "https://github.com/pyapp-kit/psygnal/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ SomeoneSerge ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ptable/default.nix b/nixpkgs/pkgs/development/python-modules/ptable/default.nix
new file mode 100644
index 000000000000..169f08fb3594
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ptable/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchFromGitHub, nose }:
+
+buildPythonPackage {
+  pname = "ptable";
+  version = "unstable-2019-06-14";
+
+  # https://github.com/kxxoling/PTable/issues/27
+  src = fetchFromGitHub {
+    owner = "kxxoling";
+    repo = "PTable";
+    rev = "bcfdb92811ae1f39e1065f31544710bf87d3bc21";
+    sha256 = "1cj314rp6irlvr0a2c4xffsm2idsb0hzwr38vzz6z3kbhphcb63i";
+  };
+
+  nativeCheckInputs = [ nose ];
+
+  checkPhase = ''
+    nosetests --with-coverage --cover-package=prettytable --cover-min-percentage=75
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/kxxoling/PTable";
+    description = "A simple Python library designed to make it quick and easy to represent tabular data in visually appealing ASCII tables";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.mmahut ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ptest/default.nix b/nixpkgs/pkgs/development/python-modules/ptest/default.nix
new file mode 100644
index 000000000000..2a4180a4cbed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ptest/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "ptest";
+  version =  "1.7.4";
+
+  src = fetchFromGitHub {
+    owner = "KarlGong";
+    repo = pname;
+    rev = version + "-release";
+    sha256 = "0v1zpfjagjlvdmgv6d502nmb7s996wadvpzg93i651s64rrlwq4s";
+  };
+
+  meta = with lib; {
+    description = "Test classes and test cases using decorators, execute test cases by command line, and get clear reports";
+    homepage = "https://pypi.python.org/pypi/ptest";
+    license = licenses.asl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ptpython/default.nix b/nixpkgs/pkgs/development/python-modules/ptpython/default.nix
new file mode 100644
index 000000000000..355171856fbd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ptpython/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, appdirs
+, black
+, importlib-metadata
+, isPy3k
+, jedi
+, prompt-toolkit
+, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "ptpython";
+  version = "3.0.23";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-n8m+wsxRvEAAwSJNjFYkHOikBrPUnsjcJm94zTzQS6Q=";
+  };
+
+  propagatedBuildInputs = [
+    appdirs
+    black # yes, this is in install_requires
+    jedi
+    prompt-toolkit
+    pygments
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  # no tests to run
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ptpython"
+  ];
+
+  meta = with lib; {
+    description = "An advanced Python REPL";
+    homepage = "https://github.com/prompt-toolkit/ptpython";
+    changelog = "https://github.com/prompt-toolkit/ptpython/blob/${version}/CHANGELOG";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ mlieberman85 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ptyprocess/default.nix b/nixpkgs/pkgs/development/python-modules/ptyprocess/default.nix
new file mode 100644
index 000000000000..496f8161e792
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ptyprocess/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "ptyprocess";
+  version = "0.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220";
+  };
+
+  patches = [
+    # Remove after https://github.com/pexpect/ptyprocess/pull/64 is merged.
+    (fetchpatch {
+      url = "https://github.com/pexpect/ptyprocess/commit/40c1ccf3432a6787be1801ced721540e34c6cd87.patch";
+      hash = "sha256-IemngBqBq3QRCmVscWtsuXHiFgvTOJIIB9SyAvsqHd0=";
+    })
+  ];
+
+  meta = {
+    description = "Run a subprocess in a pseudo terminal";
+    homepage = "https://github.com/pexpect/ptyprocess";
+    license = lib.licenses.isc;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/publicsuffix/default.nix b/nixpkgs/pkgs/development/python-modules/publicsuffix/default.nix
new file mode 100644
index 000000000000..3f86abf0ea14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/publicsuffix/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "publicsuffix";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "22ce1d65ab6af5e9b2122e2443facdb93fb5c4abf24138099cb10fe7989f43b6";
+  };
+
+
+  # disable test_fetch and the doctests (which also invoke fetch)
+  postPatch = ''
+    sed -i -e "/def test_fetch/i\\
+    \\t@unittest.skip('requires internet')" -e "/def additional_tests():/,+1d" tests.py
+  '';
+
+  meta = with lib; {
+    description = "Allows to get the public suffix of a domain name";
+    homepage = "https://pypi.python.org/pypi/publicsuffix/";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/publicsuffix2/default.nix b/nixpkgs/pkgs/development/python-modules/publicsuffix2/default.nix
new file mode 100644
index 000000000000..915c1d98cee9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/publicsuffix2/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchFromGitHub }:
+let
+  tagVersion = "2.2019-12-21";
+in
+buildPythonPackage {
+  pname = "publicsuffix2";
+  # tags have dashes, while the library version does not
+  # see https://github.com/nexB/python-publicsuffix2/issues/12
+  version = lib.replaceStrings ["-"] [""] tagVersion;
+
+  src = fetchFromGitHub {
+    owner = "nexB";
+    repo = "python-publicsuffix2";
+    rev = "release-${tagVersion}";
+    sha256 = "1dkvfvl0izq9hqzilnw8ipkbgjs9xyad9p21i3864hzinbh0wp9r";
+  };
+
+  postPatch = ''
+    # only used to update the interal publicsuffix list
+    substituteInPlace setup.py \
+      --replace "'requests >= 2.7.0'," ""
+  '';
+
+  pythonImportsCheck = [ "publicsuffix2" ];
+
+  meta = with lib; {
+    description = "Get a public suffix for a domain name using the Public Suffix List";
+    homepage = "https://github.com/nexB/python-publicsuffix2";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/publicsuffixlist/default.nix b/nixpkgs/pkgs/development/python-modules/publicsuffixlist/default.nix
new file mode 100644
index 000000000000..ad60d8e79f85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/publicsuffixlist/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pandoc
+, pytestCheckHook
+, pythonOlder
+, requests
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "publicsuffixlist";
+  version = "0.10.0.20231122";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-0CrHVPoQTS3I9ZPvf/4wWQX4vYn5vAeWUxNanjnbF60=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  passthru.optional-dependencies = {
+    update = [
+      requests
+    ];
+    readme = [
+      pandoc
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "publicsuffixlist"
+  ];
+
+  pytestFlagsArray = [
+    "publicsuffixlist/test.py"
+  ];
+
+  meta = with lib; {
+    description = "Public Suffix List parser implementation";
+    homepage = "https://github.com/ko-zu/psl";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pubnub/default.nix b/nixpkgs/pkgs/development/python-modules/pubnub/default.nix
new file mode 100644
index 000000000000..4a6ae8af2322
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pubnub/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, busypie
+, cbor2
+, fetchFromGitHub
+, pycryptodomex
+, pytestCheckHook
+, pytest-vcr
+, pytest-asyncio
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pubnub";
+  version = "7.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = "python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-J6vwdOI/GM/K0TxRwIgkXibNAc+n9wVCpmMkzMhBepw=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    cbor2
+    pycryptodomex
+    requests
+  ];
+
+  nativeCheckInputs = [
+    busypie
+    pytest-asyncio
+    pytest-vcr
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Tests require network access
+    "tests/integrational"
+    "tests/manual"
+    "tests/functional/push"
+  ];
+
+  disabledTests = [
+    "test_subscribe"
+    "test_handshaking"
+  ];
+
+  pythonImportsCheck = [
+    "pubnub"
+  ];
+
+  meta = with lib; {
+    description = "Python-based APIs for PubNub";
+    homepage = "https://github.com/pubnub/python";
+    changelog = "https://github.com/pubnub/python/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pubnubsub-handler/default.nix b/nixpkgs/pkgs/development/python-modules/pubnubsub-handler/default.nix
new file mode 100644
index 000000000000..32ad2a8e1b8d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pubnubsub-handler/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pubnub
+, pycryptodomex
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pubnubsub-handler";
+  version = "1.0.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256:1c44x19zi709sazgl060nkqa7vbaf3iyhwcnwdykhsbipvp6bscy";
+  };
+
+  propagatedBuildInputs = [
+    pubnub
+    pycryptodomex
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "pubnubsubhandler" ];
+
+  meta = with lib; {
+    description = "PubNub subscription between PubNub and Home Assistant";
+    homepage = "https://github.com/w1ll1am23/pubnubsub-handler";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pudb/default.nix b/nixpkgs/pkgs/development/python-modules/pudb/default.nix
new file mode 100644
index 000000000000..347d11341e14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pudb/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jedi
+, pygments
+, urwid
+, urwid-readline
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pudb";
+  version = "2023.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Fd88YDq6h6kYpmbvjhv2P3ZCOMw1ids8W3pfGwHqLwM=";
+  };
+
+  propagatedBuildInputs = [
+    jedi
+    pygments
+    urwid
+    urwid-readline
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  pythonImportsCheck = [
+    "pudb"
+  ];
+
+  meta = with lib; {
+    description = "A full-screen, console-based Python debugger";
+    homepage = "https://github.com/inducer/pudb";
+    changelog = "https://github.com/inducer/pudb/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pulp/default.nix b/nixpkgs/pkgs/development/python-modules/pulp/default.nix
new file mode 100644
index 000000000000..816af17c69fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pulp/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, amply
+, buildPythonPackage
+, fetchFromGitHub
+, pyparsing
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pulp";
+  version = "2.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "coin-or";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-j0f6OiscJyTqPNyLp0qWRjCGLWuT3HdU1S/sxpnsiMo=";
+  };
+
+  propagatedBuildInputs = [
+    amply
+    pyparsing
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pulp"
+  ];
+
+  disabledTests = [
+    # The solver is not available
+    "PULP_CBC_CMDTest"
+    "test_examples"
+  ];
+
+  meta = with lib; {
+    description = "Module to generate  generate MPS or LP files";
+    homepage = "https://github.com/coin-or/pulp";
+    license = licenses.mit;
+    maintainers = with maintainers; [ teto ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pulsectl-asyncio/default.nix b/nixpkgs/pkgs/development/python-modules/pulsectl-asyncio/default.nix
new file mode 100644
index 000000000000..54500916e884
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pulsectl-asyncio/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pulsectl
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pulsectl-asyncio";
+  version = "1.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mhthies";
+    repo = "pulsectl-asyncio";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Uc8iUo9THWNPRRsvJxfw++41cnKrANe/Fk6e8bgLSkc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    pulsectl
+  ];
+
+  # Tests require a running pulseaudio instance
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pulsectl_asyncio"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings library for PulseAudio";
+    homepage = "https://github.com/mhthies/pulsectl-asyncio";
+    changelog = "https://github.com/mhthies/pulsectl-asyncio/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pulsectl/default.nix b/nixpkgs/pkgs/development/python-modules/pulsectl/default.nix
new file mode 100644
index 000000000000..bddb4b686b2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pulsectl/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchPypi, libpulseaudio, glibc, substituteAll, stdenv, pulseaudio, unittestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "pulsectl";
+  version = "23.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6RHTmOrwU5zzxjtCFzV7UaPRt+SlBgfRWRzytJ9dLGo=";
+  };
+
+  patches = [
+    # substitute library paths for libpulse and librt
+    (substituteAll {
+      src = ./library-paths.patch;
+      libpulse = "${libpulseaudio.out}/lib/libpulse${stdenv.hostPlatform.extensions.sharedLibrary}";
+      librt = "${glibc.out}/lib/librt${stdenv.hostPlatform.extensions.sharedLibrary}";
+    })
+  ];
+
+  pythonImportsCheck = [
+    "pulsectl"
+  ];
+
+  nativeCheckInputs = [ unittestCheckHook pulseaudio ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  meta = with lib; {
+    description = "Python high-level interface and ctypes-based bindings for PulseAudio (libpulse)";
+    homepage = "https://github.com/mk-fg/python-pulse-control";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pulsectl/library-paths.patch b/nixpkgs/pkgs/development/python-modules/pulsectl/library-paths.patch
new file mode 100644
index 000000000000..5840e515258d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pulsectl/library-paths.patch
@@ -0,0 +1,22 @@
+diff --git a/pulsectl/_pulsectl.py b/pulsectl/_pulsectl.py
+index 4422ddf..3fb2f39 100644
+--- a/pulsectl/_pulsectl.py
++++ b/pulsectl/_pulsectl.py
+@@ -31,7 +31,7 @@ else:
+ 		if not hasattr(mono_time, 'ts'):
+ 			class timespec(Structure):
+ 				_fields_ = [('tv_sec', c_long), ('tv_nsec', c_long)]
+-			librt = CDLL('librt.so.1', use_errno=True)
++			librt = CDLL('@librt@', use_errno=True)
+ 			mono_time.get = librt.clock_gettime
+ 			mono_time.get.argtypes = [c_int, POINTER(timespec)]
+ 			mono_time.ts = timespec
+@@ -625,7 +625,7 @@ class LibPulse(object):
+ 
+ 
+ 	def __init__(self):
+-		p = CDLL(ctypes.util.find_library('libpulse') or 'libpulse.so.0')
++		p = CDLL('@libpulse@')
+ 
+ 		self.funcs = dict()
+ 		for k, spec in self.func_defs.items():
diff --git a/nixpkgs/pkgs/development/python-modules/pulumi-aws/default.nix b/nixpkgs/pkgs/development/python-modules/pulumi-aws/default.nix
new file mode 100644
index 000000000000..dd053d439070
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pulumi-aws/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, parver
+, pulumi
+, pythonOlder
+, semver
+}:
+
+buildPythonPackage rec {
+  pname = "pulumi-aws";
+  # Version is independant of pulumi's.
+  version = "6.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pulumi";
+    repo = "pulumi-aws";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-W3gfHCbScAZ/j6gNzrPwhcmrYoTXi+0BuSEzjOKSo4M=";
+  };
+
+  sourceRoot = "${src.name}/sdk/python";
+
+  propagatedBuildInputs = [
+    parver
+    pulumi
+    semver
+  ];
+
+  # Checks require cloud resources
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pulumi_aws"
+  ];
+
+  meta = with lib; {
+    description = "Pulumi python amazon web services provider";
+    homepage = "https://github.com/pulumi/pulumi-aws";
+    changelog = "https://github.com/pulumi/pulumi-aws/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pulumi/default.nix b/nixpkgs/pkgs/development/python-modules/pulumi/default.nix
new file mode 100644
index 000000000000..b6f1ed005540
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pulumi/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, protobuf
+, dill
+, grpcio
+, pulumi
+, isPy27
+, semver
+, pip
+, pytestCheckHook
+, pyyaml
+, six
+}:
+buildPythonPackage rec {
+  inherit (pulumi) version src;
+
+  pname = "pulumi";
+
+  disabled = isPy27;
+
+  propagatedBuildInputs = [
+    semver
+    protobuf
+    dill
+    grpcio
+    pyyaml
+    six
+  ];
+
+  nativeCheckInputs = [
+    pip
+    pulumi.pkgs.pulumi-language-python
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "test/"
+  ];
+
+  sourceRoot = "${src.name}/sdk/python/lib";
+
+  # we apply the modifications done in the pulumi/sdk/python/Makefile
+  # but without the venv code
+  postPatch = ''
+    cp ../../README.md .
+    substituteInPlace setup.py \
+      --replace "3.0.0" "${version}" \
+      --replace "grpcio~=1.59" "grpcio" \
+      --replace "semver~=2.13" "semver"
+  '';
+
+  # Allow local networking in tests on Darwin
+  __darwinAllowLocalNetworking = true;
+
+  # Verify that the version substitution works
+  preCheck = ''
+    pip show "${pname}" | grep "Version: ${version}" > /dev/null \
+      || (echo "ERROR: Version substitution seems to be broken"; exit 1)
+  '';
+
+  pythonImportsCheck = [ "pulumi" ];
+
+  meta = with lib; {
+    description = "Modern Infrastructure as Code. Any cloud, any language";
+    homepage = "https://github.com/pulumi/pulumi";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ teto ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pure-cdb/default.nix b/nixpkgs/pkgs/development/python-modules/pure-cdb/default.nix
new file mode 100644
index 000000000000..ea25ba2f595f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pure-cdb/default.nix
@@ -0,0 +1,26 @@
+{ lib, fetchFromGitHub, buildPythonPackage, pythonOlder, flake8 }:
+
+buildPythonPackage rec {
+  pname = "pure-cdb";
+  version = "4.0.0";
+  disabled = pythonOlder "3.4";
+
+  # Archive on pypi has no tests.
+  src = fetchFromGitHub {
+    owner = "bbayles";
+    repo = "python-pure-cdb";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-7zxQO+oTZJhXfM2yijGXchLixiQRuFTOSESVlEc+T0s=";
+  };
+
+  nativeCheckInputs = [ flake8 ];
+
+  pythonImportsCheck = [ "cdblib" ];
+
+  meta = with lib; {
+    description = "Python library for working with constant databases";
+    homepage = "https://python-pure-cdb.readthedocs.io/en/latest";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kaction ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pure-eval/default.nix b/nixpkgs/pkgs/development/python-modules/pure-eval/default.nix
new file mode 100644
index 000000000000..f21f4d7fe4cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pure-eval/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools-scm
+, toml
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pure_eval";
+  version = "0.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "alexmojaki";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-9N+UcgAv30s4ctgsBrOHiix4BoXhKPgxH/GOz/NIFdU=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  buildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    toml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pure_eval"
+  ];
+
+  meta = with lib; {
+    description = "Safely evaluate AST nodes without side effects";
+    homepage = "https://github.com/alexmojaki/pure_eval";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gebner ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pure-pcapy3/default.nix b/nixpkgs/pkgs/development/python-modules/pure-pcapy3/default.nix
new file mode 100644
index 000000000000..ad405c593853
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pure-pcapy3/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pure-pcapy3";
+  version = "1.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uZ5F8W1K1BDrXrvH1dOeNT1+2n6G8K1S5NxcRaez6pI=";
+  };
+
+  pythonImportsCheck = [
+    "pure_pcapy"
+  ];
+
+  meta = with lib; {
+    description = "Reimplementation of pcapy";
+    homepage = "https://github.com/rcloran/pure-pcapy-3";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pure-protobuf/default.nix b/nixpkgs/pkgs/development/python-modules/pure-protobuf/default.nix
new file mode 100644
index 000000000000..c2d7f7e3d8ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pure-protobuf/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools-scm
+, toml
+, pytestCheckHook
+, pytest-benchmark
+, hatch-vcs
+, hatchling
+}:
+
+buildPythonPackage rec {
+  pname = "pure-protobuf";
+  version = "2.3.0";
+
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "eigenein";
+    repo = "protobuf";
+    rev = "refs/tags/${version}";
+    hash = "sha256-nJ3F8dUrqMeWqTV9ErGqrMvofJwBKwNUDfxWIqFh4nY=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-benchmark
+  ];
+
+  pythonImportsCheck = [
+    "pure_protobuf"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of Protocol Buffers with dataclass-based schemas";
+    homepage = "https://github.com/eigenein/protobuf";
+    changelog = "https://github.com/eigenein/protobuf/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ chuangzhu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pure-python-adb-homeassistant/default.nix b/nixpkgs/pkgs/development/python-modules/pure-python-adb-homeassistant/default.nix
new file mode 100644
index 000000000000..8e40d182212d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pure-python-adb-homeassistant/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+buildPythonPackage rec {
+  pname = "pure-python-adb-homeassistant";
+  version = "0.1.7.dev0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xXXEp8oYGcJLTfoBDUSZrIHSgDvB2EHbVMHoG4Hk+t8=";
+  };
+
+  # Disable tests as they require docker, docker-compose and a dedicated
+  # android emulator
+  doCheck = false;
+
+  pythonImportsCheck = [ "adb_messenger" ];
+
+  meta = with lib; {
+    description = "Python implementation of the ADB client";
+    homepage = "https://github.com/JeffLIrion/pure-python-adb";
+    license = licenses.mit;
+    maintainers = [ maintainers.makefu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pure-python-adb/default.nix b/nixpkgs/pkgs/development/python-modules/pure-python-adb/default.nix
new file mode 100644
index 000000000000..31ec5d509118
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pure-python-adb/default.nix
@@ -0,0 +1,45 @@
+{ aiofiles
+, buildPythonPackage
+, fetchPypi
+, lib
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pure-python-adb";
+  version = "0.3.0.dev0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0kdr7w2fhgjpcf1k3l6an9im583iqkr6v8hb4q1zw30nh3bqkk0f";
+  };
+
+  passthru.optional-dependencies = {
+    async = [
+      aiofiles
+    ];
+  };
+
+  doCheck = pythonOlder "3.10"; # all tests result in RuntimeError on 3.10
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ]
+  ++ passthru.optional-dependencies.async;
+
+  pythonImportsCheck = [
+    "ppadb.client"
+  ] ++ lib.optionals doCheck [
+    "ppadb.client_async"
+  ];
+
+  meta = with lib; {
+    description = "Pure python implementation of the adb client";
+    homepage = "https://github.com/Swind/pure-python-adb";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jamiemagee ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/puremagic/default.nix b/nixpkgs/pkgs/development/python-modules/puremagic/default.nix
new file mode 100644
index 000000000000..ad4037a6c580
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/puremagic/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "puremagic";
+  version = "1.15";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "cdgriffith";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-WnqDrVPTlNxz3SDt1wLdZmxtj0Vh6gLHDJlYGEHHxsg=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "puremagic"
+  ];
+
+  meta = with lib; {
+    description = "Implementation of magic file detection";
+    homepage = "https://github.com/cdgriffith/puremagic";
+    changelog = "https://github.com/cdgriffith/puremagic/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ globin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/purepng/default.nix b/nixpkgs/pkgs/development/python-modules/purepng/default.nix
new file mode 100644
index 000000000000..156f5d4bc222
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/purepng/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, python
+, fetchFromGitHub
+, fetchpatch
+, cython ? null
+, numpy ? null
+}:
+
+buildPythonPackage {
+  pname = "purepng";
+  version = "0.2.0";
+
+  src = fetchFromGitHub {
+    owner = "Scondo";
+    repo = "purepng";
+    rev = "449aa00e97a8d7b8a200eb9048056d4da600a345";
+    sha256 = "105p7sxn2f21icfnqpah69mnd74r31szj330swbpz53k7gr6nlsv";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "fix-py37-stopiteration-in-generators.patch";
+      url = "https://github.com/Scondo/purepng/pull/28/commits/62d71dfc2be9ffdc4b3e5f642af0281a8ce8f946.patch";
+      sha256 = "1ag0pji3p012hmj8kadcd0vydv9702188c0isizsi964qcl4va6m";
+    })
+  ];
+  patchFlags = [ "-p1" "-d" "code" ];
+
+  # cython is optional - if not supplied, the "pure python" implementation will be used
+  nativeBuildInputs = [ cython ];
+
+  # numpy is optional - if not supplied, tests simply have less coverage
+  nativeCheckInputs = [ numpy ];
+
+  postPatch = ''
+    substituteInPlace code/test_png.py \
+      --replace numpy.bool bool
+  '';
+
+  # checkPhase begins by deleting source dir to force test execution against installed version
+  checkPhase = ''
+    runHook preCheck
+
+    rm -r code/png
+    ${python.interpreter} code/test_png.py
+
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Pure Python library for PNG image encoding/decoding";
+    homepage = "https://github.com/scondo/purepng";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ris ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/purl/default.nix b/nixpkgs/pkgs/development/python-modules/purl/default.nix
new file mode 100644
index 000000000000..6c180222e88e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/purl/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "purl";
+  version = "1.6";
+
+  src = fetchFromGitHub {
+    owner = "codeinthehole";
+    repo = "purl";
+    rev = version;
+    hash = "sha256-Jb3JRW/PtQ7NlO4eQ9DmTPu/sjvFTg2mztphoIF79gc=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "purl"
+  ];
+
+  meta = with lib; {
+    description = "Immutable URL class for easy URL-building and manipulation";
+    homepage = "https://github.com/codeinthehole/purl";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/push-receiver/default.nix b/nixpkgs/pkgs/development/python-modules/push-receiver/default.nix
new file mode 100644
index 000000000000..c8ab6b64eccf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/push-receiver/default.nix
@@ -0,0 +1,35 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, appdirs
+, http-ece
+, oscrypto
+, protobuf
+}:
+
+buildPythonPackage rec {
+  pname = "push-receiver";
+  version = "0.1.1";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "push_receiver";
+    hash = "sha256-Tknmra39QfA+OgrRxzKDLbkPucW8zgdHqz5FGQnzYOw=";
+  };
+
+  propagatedBuildInputs = [
+    appdirs # required for running the bundled example
+    http-ece # required for listening for new message
+    oscrypto
+    protobuf
+  ];
+
+  pythonImportsCheck = [ "push_receiver" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Francesco149/push_receiver";
+    description = "Subscribe to GCM/FCM and receive notifications";
+    license = licenses.unlicense;
+    maintainers = with maintainers; [ veehaitch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pushbullet-py/default.nix b/nixpkgs/pkgs/development/python-modules/pushbullet-py/default.nix
new file mode 100644
index 000000000000..472f4dcc5853
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pushbullet-py/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, websocket-client
+, python-magic
+, cryptography
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pushbullet-py";
+  version = "0.12.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "917883e1af4a0c979ce46076b391e0243eb8fe0a81c086544bcfa10f53e5ae64";
+  };
+
+  propagatedBuildInputs = [ cryptography requests websocket-client python-magic ];
+
+  preCheck = ''
+    export PUSHBULLET_API_KEY=""
+  '';
+  nativeCheckInputs = [ pytestCheckHook ];
+  disabledTests = [
+    "test_auth_fail"
+    "test_auth_success"
+    "test_decryption"
+  ];
+
+  meta = with lib; {
+    description = "A simple python client for pushbullet.com";
+    homepage = "https://github.com/randomchars/pushbullet.py";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pushover-complete/default.nix b/nixpkgs/pkgs/development/python-modules/pushover-complete/default.nix
new file mode 100644
index 000000000000..33741f9f2924
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pushover-complete/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, requests
+, six
+, pytestCheckHook
+, pythonOlder
+, requests-toolbelt
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "pushover-complete";
+  version = "1.1.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    pname = "pushover_complete";
+    inherit version;
+    sha256 = "8a8f867e1f27762a28a0832c33c6003ca54ee04c935678d124b4c071f7cf5a1f";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests-toolbelt
+    responses
+  ];
+
+  pythonImportsCheck = [ "pushover_complete" ];
+
+  meta = with lib; {
+    description = "A Python package for interacting with *all* aspects of the Pushover API";
+    homepage = "https://github.com/scolby33/pushover_complete";
+    license = licenses.mit;
+    maintainers = [ maintainers.mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pvextractor/default.nix b/nixpkgs/pkgs/development/python-modules/pvextractor/default.nix
new file mode 100644
index 000000000000..efee87277cb5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pvextractor/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, astropy
+, qtpy
+, pyqt6
+, pyqt-builder
+, setuptools
+, setuptools-scm
+, scipy
+, matplotlib
+, spectral-cube
+, pytestCheckHook
+, pytest-astropy
+}:
+
+buildPythonPackage rec {
+  pname = "pvextractor";
+  version = "0.4";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "radio-astro-tools";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-TjwoTtoGWU6C6HdFuS+gJj69PUnfchPHs7UjFqwftVQ=";
+  };
+
+  buildInputs = [ pyqt-builder ];
+  nativeBuildInputs = [ setuptools setuptools-scm ];
+  propagatedBuildInputs = [
+    astropy
+    scipy
+    matplotlib
+    pyqt6
+    qtpy
+    spectral-cube
+  ];
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  # collecting ... qt.qpa.xcb: could not connect to display
+  # qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
+  doCheck = false;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-astropy
+  ];
+
+  pythonImportsCheck = [ "pvextractor" ];
+
+  meta = with lib; {
+    homepage = "http://pvextractor.readthedocs.io";
+    description = "Position-velocity diagram extractor";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ifurther ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pvlib/default.nix b/nixpkgs/pkgs/development/python-modules/pvlib/default.nix
new file mode 100644
index 000000000000..683295edbc7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pvlib/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, h5py
+, numpy
+, pandas
+, pytestCheckHook
+, pytest-mock
+, pytest-remotedata
+, pytest-rerunfailures
+, pytest-timeout
+, pythonOlder
+, pytz
+, requests
+, requests-mock
+, scipy
+, setuptools
+, setuptools-scm
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pvlib";
+  version = "0.10.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi{
+    inherit pname version;
+    hash = "sha256-gCOFP2heAtzpe38j1ljOz1yR1P8pRZ0eILVK8Kd3tFc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    h5py
+    numpy
+    pandas
+    pytz
+    requests
+    scipy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+    pytest-remotedata
+    pytest-rerunfailures
+    pytest-timeout
+    requests-mock
+  ];
+
+  pythonImportsCheck = [
+    "pvlib"
+  ];
+
+  meta = with lib; {
+    homepage = "https://pvlib-python.readthedocs.io";
+    description = "Simulate the performance of photovoltaic energy systems";
+    changelog = "https://pvlib-python.readthedocs.io/en/v${version}/whatsnew.html";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pvo/default.nix b/nixpkgs/pkgs/development/python-modules/pvo/default.nix
new file mode 100644
index 000000000000..6963d3700013
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pvo/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pydantic
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "pvo";
+  version = "2.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-pvoutput";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-SvsrvGwIAlj/8hdk90+rxigVrx6n3YInvF/4eux2H04=";
+  };
+
+  postPatch = ''
+    # Upstream doesn't set a version for the pyproject.toml
+    substituteInPlace pyproject.toml \
+      --replace "0.0.0" "${version}" \
+      --replace "--cov" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pydantic
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pvo"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interact with the PVOutput API";
+    homepage = "https://github.com/frenck/python-pvoutput";
+    changelog = "https://github.com/frenck/python-pvoutput/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pweave/default.nix b/nixpkgs/pkgs/development/python-modules/pweave/default.nix
new file mode 100644
index 000000000000..bea63909ab5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pweave/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, matplotlib
+, pkgs
+, nbconvert
+, markdown
+, isPy3k
+, ipykernel
+}:
+
+buildPythonPackage rec {
+  pname = "pweave";
+  version = "0.30.3";
+
+  src = fetchPypi {
+    pname = "Pweave";
+    inherit version;
+    sha256 = "5e5298d90e06414a01f48e0d6aa4c36a70c5f223d929f2a9c7e2d388451c7357";
+  };
+
+  disabled = !isPy3k;
+
+  buildInputs = [ mock pkgs.glibcLocales ];
+  propagatedBuildInputs = [ ipykernel matplotlib nbconvert markdown ];
+
+  # fails due to trying to run CSS as test
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Scientific reports with embedded python computations with reST, LaTeX or markdown";
+    homepage = "https://mpastell.com/pweave/";
+    license = licenses.bsd3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pwntools/default.nix b/nixpkgs/pkgs/development/python-modules/pwntools/default.nix
new file mode 100644
index 000000000000..32c8b966ad58
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pwntools/default.nix
@@ -0,0 +1,88 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, debugger
+, fetchPypi
+, mako
+, packaging
+, pysocks
+, pygments
+, ropgadget
+, capstone
+, colored-traceback
+, paramiko
+, pip
+, psutil
+, pyelftools
+, pyserial
+, python-dateutil
+, requests
+, rpyc
+, tox
+, unicorn
+, intervaltree
+, installShellFiles
+}:
+
+let
+  debuggerName = lib.strings.getName debugger;
+in
+buildPythonPackage rec {
+  pname = "pwntools";
+  version = "4.11.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7hnjX721t0YzKcJ75R+tEfUI6E9bxMYXUEtI56GDZP0=";
+  };
+
+  postPatch = ''
+    # Upstream hardcoded the check for the command `gdb-multiarch`;
+    # Forcefully use the provided debugger, as `gdb` (hence `pwndbg`) is built with multiarch in `nixpkgs`.
+    sed -i 's/gdb-multiarch/${debuggerName}/' pwnlib/gdb.py
+  '';
+
+  nativeBuildInputs = [
+    installShellFiles
+  ];
+
+  propagatedBuildInputs = [
+    mako
+    packaging
+    pysocks
+    pygments
+    ropgadget
+    capstone
+    colored-traceback
+    paramiko
+    pip
+    psutil
+    pyelftools
+    pyserial
+    python-dateutil
+    requests
+    rpyc
+    tox
+    unicorn
+    intervaltree
+  ];
+
+  doCheck = false; # no setuptools tests for the package
+
+  postInstall = ''
+    installShellCompletion --bash extra/bash_completion.d/shellcraft
+  '';
+
+  postFixup = lib.optionalString (!stdenv.isDarwin) ''
+    mkdir -p "$out/bin"
+    makeWrapper "${debugger}/bin/${debuggerName}" "$out/bin/pwntools-gdb"
+  '';
+
+  meta = with lib; {
+    description = "CTF framework and exploit development library";
+    homepage = "https://pwntools.com";
+    changelog = "https://github.com/Gallopsled/pwntools/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bennofs kristoff3r pamplemousse ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pxml/default.nix b/nixpkgs/pkgs/development/python-modules/pxml/default.nix
new file mode 100644
index 000000000000..5ef283a26ccc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pxml/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, pythonAtLeast
+, buildPythonPackage
+, fetchPypi
+, blessings
+, six
+, nose
+, coverage
+}:
+
+buildPythonPackage rec {
+  pname = "pxml";
+  version = "0.2.13";
+  disabled = pythonAtLeast "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0c9zzfv6ciyf9qm7556wil45xxgykg1cj8isp1b88gimwcb2hxg4";
+  };
+
+  propagatedBuildInputs = [ blessings six ];
+  nativeCheckInputs = [ nose coverage ];
+
+  # test_prefixedWhitespace fails due to a python3 StringIO issue requiring
+  # bytes rather than str
+  checkPhase = ''
+    nosetests -e 'test_prefixedWhitespace'
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/metagriffin/pxml";
+    description = ''A python library and command-line tool to "prettify" and colorize XML.'';
+    maintainers = with maintainers; [ glittershark ];
+    license = licenses.gpl3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-air-control-exporter/default.nix b/nixpkgs/pkgs/development/python-modules/py-air-control-exporter/default.nix
new file mode 100644
index 000000000000..446edb4221eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-air-control-exporter/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchPypi
+, flask
+, isPy27
+, nixosTests
+, prometheus-client
+, py-air-control
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "py-air-control-exporter";
+  version = "0.3.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0cwhcyyjzc6wlj7jp5h7fcj1hl03wzrz1if3sg205kh2hfrzzlqq";
+  };
+
+  propagatedBuildInputs = [
+    click
+    flask
+    prometheus-client
+    py-air-control
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "py_air_control_exporter" ];
+
+  passthru.tests = { inherit (nixosTests.prometheus-exporters) py-air-control; };
+
+  meta = with lib; {
+    description = "Exports Air Quality Metrics to Prometheus";
+    homepage = "https://github.com/urbas/py-air-control-exporter";
+    license = licenses.mit;
+    maintainers = with maintainers; [ urbas ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-air-control/default.nix b/nixpkgs/pkgs/development/python-modules/py-air-control/default.nix
new file mode 100644
index 000000000000..77b61123d9e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-air-control/default.nix
@@ -0,0 +1,27 @@
+{ buildPythonPackage, coapthon3, fetchFromGitHub, isPy27, lib, pycryptodomex }:
+
+buildPythonPackage rec {
+  pname = "py-air-control";
+  version = "2.1.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "rgerganov";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0mkggl5hwmj90djxbbz4svim6iv7xl8k324cb4rlc75p5rgcdwmh";
+  };
+
+  propagatedBuildInputs = [ pycryptodomex coapthon3 ];
+
+  # tests sometimes hang forever on tear-down
+  doCheck = false;
+  pythonImportsCheck = [ "pyairctrl" ];
+
+  meta = with lib; {
+    inherit (src.meta) homepage;
+    description = "Command Line App for Controlling Philips Air Purifiers.";
+    license = licenses.mit;
+    maintainers = with maintainers; [ urbas ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-bip39-bindings/Cargo.lock b/nixpkgs/pkgs/development/python-modules/py-bip39-bindings/Cargo.lock
new file mode 100644
index 000000000000..4cf61e525a2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-bip39-bindings/Cargo.lock
@@ -0,0 +1,758 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "anyhow"
+version = "1.0.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800"
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "block-buffer"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b"
+dependencies = [
+ "block-padding",
+ "byte-tools",
+ "byteorder",
+ "generic-array 0.12.4",
+]
+
+[[package]]
+name = "block-buffer"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
+dependencies = [
+ "generic-array 0.14.6",
+]
+
+[[package]]
+name = "block-padding"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5"
+dependencies = [
+ "byte-tools",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535"
+
+[[package]]
+name = "byte-tools"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7"
+
+[[package]]
+name = "byteorder"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crypto-mac"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5"
+dependencies = [
+ "generic-array 0.12.4",
+ "subtle 1.0.0",
+]
+
+[[package]]
+name = "crypto-mac"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab"
+dependencies = [
+ "generic-array 0.14.6",
+ "subtle 2.4.1",
+]
+
+[[package]]
+name = "digest"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5"
+dependencies = [
+ "generic-array 0.12.4",
+]
+
+[[package]]
+name = "digest"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
+dependencies = [
+ "generic-array 0.14.6",
+]
+
+[[package]]
+name = "fake-simd"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
+
+[[package]]
+name = "generic-array"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd"
+dependencies = [
+ "typenum",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.14.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
+dependencies = [
+ "cfg-if",
+ "js-sys",
+ "libc",
+ "wasi",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "hmac"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5dcb5e64cda4c23119ab41ba960d1e170a774c8e4b9d9e6a9bc18aabf5e59695"
+dependencies = [
+ "crypto-mac 0.7.0",
+ "digest 0.8.1",
+]
+
+[[package]]
+name = "hmac"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840"
+dependencies = [
+ "crypto-mac 0.8.0",
+ "digest 0.9.0",
+]
+
+[[package]]
+name = "indoc"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306"
+
+[[package]]
+name = "js-sys"
+version = "0.3.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.139"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79"
+
+[[package]]
+name = "lock_api"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "memoffset"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.17.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
+
+[[package]]
+name = "opaque-debug"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
+
+[[package]]
+name = "opaque-debug"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
+
+[[package]]
+name = "parking_lot"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-sys",
+]
+
+[[package]]
+name = "pbkdf2"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9"
+dependencies = [
+ "byteorder",
+ "crypto-mac 0.7.0",
+]
+
+[[package]]
+name = "pbkdf2"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd"
+dependencies = [
+ "crypto-mac 0.8.0",
+]
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.51"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "py-bip39-bindings"
+version = "0.1.11"
+dependencies = [
+ "hmac 0.7.1",
+ "pbkdf2 0.3.0",
+ "pyo3",
+ "sha2 0.8.2",
+ "tiny-bip39",
+]
+
+[[package]]
+name = "pyo3"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06a3d8e8a46ab2738109347433cb7b96dffda2e4a218b03ef27090238886b147"
+dependencies = [
+ "cfg-if",
+ "indoc",
+ "libc",
+ "memoffset",
+ "parking_lot",
+ "pyo3-build-config",
+ "pyo3-ffi",
+ "pyo3-macros",
+ "unindent",
+]
+
+[[package]]
+name = "pyo3-build-config"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75439f995d07ddfad42b192dfcf3bc66a7ecfd8b4a1f5f6f046aa5c2c5d7677d"
+dependencies = [
+ "once_cell",
+ "target-lexicon",
+]
+
+[[package]]
+name = "pyo3-ffi"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "839526a5c07a17ff44823679b68add4a58004de00512a95b6c1c98a6dcac0ee5"
+dependencies = [
+ "libc",
+ "pyo3-build-config",
+]
+
+[[package]]
+name = "pyo3-macros"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd44cf207476c6a9760c4653559be4f206efafb924d3e4cbf2721475fc0d6cc5"
+dependencies = [
+ "proc-macro2",
+ "pyo3-macros-backend",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "pyo3-macros-backend"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc1f43d8e30460f36350d18631ccf85ded64c059829208fe680904c65bcd0a4c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
+dependencies = [
+ "getrandom",
+ "libc",
+ "rand_chacha",
+ "rand_core",
+ "rand_hc",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
+dependencies = [
+ "rand_core",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "rustc-hash"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "sha2"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69"
+dependencies = [
+ "block-buffer 0.7.3",
+ "digest 0.8.1",
+ "fake-simd",
+ "opaque-debug 0.2.3",
+]
+
+[[package]]
+name = "sha2"
+version = "0.9.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800"
+dependencies = [
+ "block-buffer 0.9.0",
+ "cfg-if",
+ "cpufeatures",
+ "digest 0.9.0",
+ "opaque-debug 0.3.0",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
+
+[[package]]
+name = "subtle"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee"
+
+[[package]]
+name = "subtle"
+version = "2.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601"
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "synstructure"
+version = "0.12.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "unicode-xid",
+]
+
+[[package]]
+name = "target-lexicon"
+version = "0.12.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae9980cab1db3fceee2f6c6f643d5d8de2997c58ee8d25fb0cc8a9e9e7348e5"
+
+[[package]]
+name = "thiserror"
+version = "1.0.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tiny-bip39"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffc59cb9dfc85bb312c3a78fd6aa8a8582e310b0fa885d5bb877f6dcc601839d"
+dependencies = [
+ "anyhow",
+ "hmac 0.8.1",
+ "once_cell",
+ "pbkdf2 0.4.0",
+ "rand",
+ "rustc-hash",
+ "sha2 0.9.9",
+ "thiserror",
+ "unicode-normalization",
+ "wasm-bindgen",
+ "zeroize",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+
+[[package]]
+name = "typenum"
+version = "1.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
+
+[[package]]
+name = "unindent"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1766d682d402817b5ac4490b3c3002d91dfa0d22812f341609f97b08757359c"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "wasi"
+version = "0.9.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d"
+
+[[package]]
+name = "windows-sys"
+version = "0.45.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd"
+
+[[package]]
+name = "zeroize"
+version = "1.5.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f"
+dependencies = [
+ "zeroize_derive",
+]
+
+[[package]]
+name = "zeroize_derive"
+version = "1.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "synstructure",
+]
diff --git a/nixpkgs/pkgs/development/python-modules/py-bip39-bindings/default.nix b/nixpkgs/pkgs/development/python-modules/py-bip39-bindings/default.nix
new file mode 100644
index 000000000000..7de906d4256f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-bip39-bindings/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, fetchFromGitHub
+, fetchpatch
+, buildPythonPackage
+, pythonOlder
+, pytestCheckHook
+, rustPlatform
+, stdenv
+, libiconv }:
+
+buildPythonPackage rec {
+  pname = "py-bip39-bindings";
+  version = "0.1.11";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "polkascan";
+    repo = "py-bip39-bindings";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-3/KBPUFVFkJifunGWJeAHLnY08KVTb8BHCFzDqKWH18=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "update-to-latest-maturin-and-pyo3.patch";
+      url = "https://github.com/polkascan/py-bip39-bindings/commit/f05cced028b43b59cfa67e17fbf0f337bdd3aa8d.patch";
+      hash = "sha256-/pFNSFtYyKiOoIDVqEWdZCbQxFZ7FIcvAHY2m5STlEc=";
+    })
+  ];
+
+  cargoDeps = rustPlatform.importCargoLock {
+    lockFile = ./Cargo.lock;
+  };
+
+  postPatch = ''
+    cp ${./Cargo.lock} Cargo.lock
+  '';
+
+  nativeBuildInputs = with rustPlatform; [
+    cargoSetupHook
+    maturinBuildHook
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests.py"
+  ];
+
+  pythonImportsCheck = [
+    "bip39"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for the tiny-bip39 library";
+    homepage = "https://github.com/polkascan/py-bip39-bindings";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ stargate01 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-canary/default.nix b/nixpkgs/pkgs/development/python-modules/py-canary/default.nix
new file mode 100644
index 000000000000..7e0200abea3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-canary/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "py-canary";
+  version = "0.5.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "snjoetw";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-873XAf0jOX5pjrNRELEcTWCauk80FUYxTu7G7jc3MHE=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pythonImportsCheck = [
+    "canary"
+  ];
+
+  disabledTests = [
+    # Test requires network access
+    "test_location_with_motion_entry"
+  ];
+
+  meta = with lib; {
+    description = "Python package for Canary Security Camera";
+    homepage = "https://github.com/snjoetw/py-canary";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-cid/default.nix b/nixpkgs/pkgs/development/python-modules/py-cid/default.nix
new file mode 100644
index 000000000000..9e34693eb021
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-cid/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, base58
+, py-multibase
+, py-multicodec
+, morphys
+, py-multihash
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "py-cid";
+  version = "0.3.0";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "ipld";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-aN7ee25ghKKa90+FoMDCdGauToePc5AzDLV3tONvh4U=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "base58>=1.0.2,<2.0" "base58>=1.0.2" \
+      --replace "py-multihash>=0.2.0,<1.0.0" "py-multihash>=0.2.0" \
+      --replace "'pytest-runner'," ""
+  '';
+
+  propagatedBuildInputs = [
+    base58
+    py-multibase
+    py-multicodec
+    morphys
+    py-multihash
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    hypothesis
+  ];
+
+  pythonImportsCheck = [ "cid" ];
+
+  meta = with lib; {
+    description = "Self-describing content-addressed identifiers for distributed systems implementation in Python";
+    homepage = "https://github.com/ipld/py-cid";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Luflosi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-cpuinfo/default.nix b/nixpkgs/pkgs/development/python-modules/py-cpuinfo/default.nix
new file mode 100644
index 000000000000..68301c0e499f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-cpuinfo/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, sysctl
+}:
+
+buildPythonPackage rec {
+  pname = "py-cpuinfo";
+  version = "9.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+     owner = "workhorsy";
+     repo = pname;
+     rev = "v${version}";
+     hash = "sha256-Q5u0guAqDVhf6bvJTzNvCpWbIzjxxAjE7s0OuXj9T4Q=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # On Darwin sysctl is used to read CPU information.
+  postPatch = lib.optionalString stdenv.isDarwin ''
+    substituteInPlace cpuinfo/cpuinfo.py \
+      --replace "len(_program_paths('sysctl')) > 0" "True" \
+      --replace "_run_and_get_stdout(['sysctl'" "_run_and_get_stdout(['${sysctl}/bin/sysctl'"
+  '';
+
+  pythonImportsCheck = [
+    "cpuinfo"
+  ];
+
+  meta = with lib; {
+    description = "Get CPU info with pure Python";
+    longDescription = ''
+      Py-cpuinfo gets CPU info with pure Python and should work without any
+      extra programs or libraries, beyond what your OS provides. It does not
+      require any compilation (C/C++, assembly, etc.) to use and works with
+      Python.
+    '';
+    homepage = "https://github.com/workhorsy/py-cpuinfo";
+    changelog = "https://github.com/workhorsy/py-cpuinfo/blob/v${version}/ChangeLog";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-deprecate/default.nix b/nixpkgs/pkgs/development/python-modules/py-deprecate/default.nix
new file mode 100644
index 000000000000..4684b51d79a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-deprecate/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, scikit-learn
+}:
+
+let
+  pname = "py-deprecate";
+  version = "0.3.2";
+in
+buildPythonPackage {
+  inherit pname version;
+
+  src = fetchFromGitHub {
+    owner = "Borda";
+    repo = "pyDeprecate";
+    rev = "v${version}";
+    hash = "sha256-84RmQvLxwtLPQk3hX7Q6eeJeejhrO3t+mc95W1E85Fg=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    scikit-learn
+  ];
+
+  pythonImportsCheck = [ "deprecate" ];
+
+  meta = with lib; {
+    description = "A module for marking deprecated functions or classes and re-routing to the new successors' instance. Used by torchmetrics";
+    homepage = "https://borda.github.io/pyDeprecate/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [
+      SomeoneSerge
+    ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/py-desmume/default.nix b/nixpkgs/pkgs/development/python-modules/py-desmume/default.nix
new file mode 100644
index 000000000000..1ed79995b4ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-desmume/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, alsa-lib
+, buildPythonPackage
+, fetchFromGitHub
+, gitpython
+, libpcap
+, meson
+, ninja
+, openal
+, pillow
+, pkg-config
+, pygobject3
+, pythonOlder
+, SDL2
+, soundtouch
+}:
+
+buildPythonPackage rec {
+  pname = "py-desmume";
+  version = "0.0.5.post0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "SkyTemple";
+    repo = pname;
+    rev = version;
+    hash = "sha256-q6E7J7e0yXt+jo1KNqqAw2cG/Us+Tw0dLfTqAKWfAlc=";
+    fetchSubmodules = true;
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+  ];
+
+  buildInputs = [
+    alsa-lib
+    gitpython
+    libpcap
+    openal
+    SDL2
+    soundtouch
+  ];
+
+  propagatedBuildInputs = [
+    pillow
+    pygobject3
+  ];
+
+  hardeningDisable = [
+    "format"
+  ];
+
+  doCheck = false; # there are no tests
+
+  pythonImportsCheck = [
+    "desmume"
+  ];
+
+  meta = with lib; {
+    description = "Python library to interface with DeSmuME, the Nintendo DS emulator";
+    homepage = "https://github.com/SkyTemple/py-desmume";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ marius851000 xfix ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-dmidecode/default.nix b/nixpkgs/pkgs/development/python-modules/py-dmidecode/default.nix
new file mode 100644
index 000000000000..d48fe7411d79
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-dmidecode/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, dmidecode
+, fetchPypi
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "py-dmidecode";
+  version = "0.1.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "py_dmidecode";
+    inherit version;
+    hash = "sha256-nMy/jOlg7yUPfGF27MN0NyVM0vuTIBuJTV2GKNP13UA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    dmidecode
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dmidecode"
+  ];
+
+  meta = with lib; {
+    description = "Python library that parses the output of dmidecode";
+    homepage = "https://github.com/zaibon/py-dmidecode/";
+    changelog = "https://github.com/zaibon/py-dmidecode/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ davidtwco ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-dormakaba-dkey/default.nix b/nixpkgs/pkgs/development/python-modules/py-dormakaba-dkey/default.nix
new file mode 100644
index 000000000000..405c1e61cad6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-dormakaba-dkey/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, bleak
+, bleak-retry-connector
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, fetchpatch
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "py-dormakaba-dkey";
+  version = "1.0.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "emontnemery";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-kS99du9EZwki6J2q+nI44rx/AWIPtq7wXR/61ZcyUSM=";
+  };
+
+  patches = [
+    # https://github.com/emontnemery/py-dormakaba-dkey/pull/45
+    (fetchpatch {
+      name = "relax-setuptools-dependency.patch";
+      url = "https://github.com/emontnemery/py-dormakaba-dkey/commit/cfda4be71d39f2cfd1c0d4f7fff9018050c57f1a.patch";
+      hash = "sha256-JGsaLQNbUfz0uK/MeGnR2XTJDs4RnTOEg7BavfDPArg=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    bleak
+    bleak-retry-connector
+    cryptography
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "py_dormakaba_dkey"
+  ];
+
+  meta = with lib; {
+    description = "Library to interact with a Dormakaba dkey lock";
+    homepage = "https://github.com/emontnemery/py-dormakaba-dkey";
+    changelog = "https://github.com/emontnemery/py-dormakaba-dkey/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-ecc/default.nix b/nixpkgs/pkgs/development/python-modules/py-ecc/default.nix
new file mode 100644
index 000000000000..9a7d1c3720c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-ecc/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cached-property
+, eth-typing
+, eth-utils
+, mypy-extensions
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "py-ecc";
+  version = "6.0.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ethereum";
+    repo = "py_ecc";
+    rev = "v${version}";
+    hash = "sha256-638otYA3e/Ld4mcM69yrqHQnGoK/Sfl/UA9FWnjgO/U=";
+  };
+
+  propagatedBuildInputs = [
+    cached-property
+    eth-typing
+    eth-utils
+    mypy-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "py_ecc" ];
+
+  meta = with lib; {
+    description = "ECC pairing and bn_128 and bls12_381 curve operations";
+    homepage = "https://github.com/ethereum/py_ecc";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-eth-sig-utils/default.nix b/nixpkgs/pkgs/development/python-modules/py-eth-sig-utils/default.nix
new file mode 100644
index 000000000000..8ede11e35903
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-eth-sig-utils/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, eth-abi
+, py-ecc
+, pycryptodome
+, python
+, rlp
+}:
+
+buildPythonPackage rec {
+  pname = "py-eth-sig-utils";
+  version = "0.4.0";
+
+  src = fetchFromGitHub {
+    owner = "rmeissner";
+    repo = "py-eth-sig-utils";
+    rev = "v${version}";
+    hash = "sha256-PNvEHH5w2ptntRGzqWrqlbIzJJsT60OXg/Dh5f6Wq9k=";
+  };
+
+  propagatedBuildInputs = [
+    eth-abi
+    py-ecc
+    pycryptodome
+    rlp
+  ];
+
+  # lots of: isinstance() arg 2 must be a type or tuple of types
+  doCheck = false;
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest
+  '';
+
+  pythonImportsCheck = [ "py_eth_sig_utils" ];
+
+  meta = with lib; {
+    description = "Collection of functions to generate hashes for signing on Ethereum";
+    homepage = "https://github.com/rmeissner/py-eth-sig-utils";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+    # TODO: upstream is stale and doesn't not work with the new `eth-abi` package any more.
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-expression-eval/default.nix b/nixpkgs/pkgs/development/python-modules/py-expression-eval/default.nix
new file mode 100644
index 000000000000..6aee63effb34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-expression-eval/default.nix
@@ -0,0 +1,24 @@
+{ lib,
+  buildPythonPackage,
+  fetchFromGitHub,
+}:
+
+buildPythonPackage rec {
+  pname = "py-expression-eval";
+  version = "0.3.14";
+
+  src = fetchFromGitHub {
+    owner = "axiacore";
+    repo = "py-expression-eval";
+    rev = "v${version}";
+    sha256 = "YxhZd8V6ofphcNdcbBbrT5mc37O9c6W1mfhsvFVC+KM=";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/AxiaCore/py-expression-eval/";
+    description = "Python Mathematical Expression Evaluator";
+    platforms = platforms.linux;
+    license = licenses.mit;
+    maintainers = with maintainers; [ cynerd ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-libzfs/default.nix b/nixpkgs/pkgs/development/python-modules/py-libzfs/default.nix
new file mode 100644
index 000000000000..d148e539d3ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-libzfs/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, zfs
+}:
+
+buildPythonPackage rec {
+  pname = "py-libzfs";
+  version = "22.12.4.2";
+
+  src = fetchFromGitHub {
+    owner = "truenas";
+    repo = pname;
+    rev = "TS-${version}";
+    hash = "sha256-vBLbjP1gQEQNsTLc2W6uRzCFHQXZp+jGiwE0Pe8VTuw=";
+  };
+
+  nativeBuildInputs = [ cython ];
+  buildInputs = [ zfs ];
+
+  # Passing CFLAGS in configureFlags does not work, see https://github.com/truenas/py-libzfs/issues/107
+  postPatch = lib.optionalString stdenv.isLinux ''
+    substituteInPlace configure \
+      --replace \
+        'CFLAGS="-DCYTHON_FALLTHROUGH"' \
+        'CFLAGS="-DCYTHON_FALLTHROUGH -I${zfs.dev}/include/libzfs -I${zfs.dev}/include/libspl"' \
+      --replace 'zof=false' 'zof=true'
+  '';
+
+  pythonImportsCheck = [ "libzfs" ];
+
+  meta = with lib; {
+    description = "Python libzfs bindings";
+    homepage = "https://github.com/truenas/py-libzfs";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ chuangzhu ];
+    # The project also supports macOS (OpenZFS on OSX, O3X), FreeBSD and OpenSolaris
+    # I don't have a machine to test out, thus only packaged for Linux
+    platforms = platforms.linux;
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/py-lru-cache/default.nix b/nixpkgs/pkgs/development/python-modules/py-lru-cache/default.nix
new file mode 100644
index 000000000000..d2057d2cf980
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-lru-cache/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "py-lru-cache";
+  version = "0.1.4";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "py_lru_cache";
+    sha256 = "1w3a8l3ckl1zz0f2vlfrawl9a402r458p7xzhy4sgq8k9rl37pq2";
+  };
+
+  meta = with lib; {
+    description = "An in-memory LRU cache for python";
+    homepage = "https://github.com/stucchio/Python-LRU-cache";
+    license = licenses.gpl3;
+    maintainers = [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-multiaddr/default.nix b/nixpkgs/pkgs/development/python-modules/py-multiaddr/default.nix
new file mode 100644
index 000000000000..b631dbdc316c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-multiaddr/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, varint
+, base58
+, netaddr
+, idna
+, py-cid
+, py-multicodec
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "py-multiaddr";
+  version = "0.0.9";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "multiformats";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-cGM7iYQPP+UOkbTxRhzuED0pkcydFCO8vpx9wTc0/HI=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "'pytest-runner'," ""
+  '';
+
+  propagatedBuildInputs = [
+    varint
+    base58
+    netaddr
+    idna
+    py-cid
+    py-multicodec
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "multiaddr" ];
+
+  meta = with lib; {
+    description = "Composable and future-proof network addresses";
+    homepage = "https://github.com/multiformats/py-multiaddr";
+    license = with licenses; [ mit asl20 ];
+    maintainers = with maintainers; [ Luflosi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-multibase/default.nix b/nixpkgs/pkgs/development/python-modules/py-multibase/default.nix
new file mode 100644
index 000000000000..50f1d9e9b376
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-multibase/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, morphys
+, pytestCheckHook
+, python-baseconv
+, pythonOlder
+, six
+}:
+buildPythonPackage rec {
+  pname = "py-multibase";
+  version = "1.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-0oog78u2Huwo9VgnoL8ynHzqgP/9kzrsrqauhDEmf+Q=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "[pytest]" "" \
+      --replace "python_classes = *TestCase" ""
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'," ""
+  '';
+
+  propagatedBuildInputs = [
+    morphys
+    python-baseconv
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "multibase"
+  ];
+
+  meta = with lib; {
+    description = "Module for distinguishing base encodings and other simple string encodings";
+    homepage = "https://github.com/multiformats/py-multibase";
+    changelog = "https://github.com/multiformats/py-multibase/blob/v${version}/HISTORY.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rakesh4g ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-multicodec/default.nix b/nixpkgs/pkgs/development/python-modules/py-multicodec/default.nix
new file mode 100644
index 000000000000..21f396d9c2a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-multicodec/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, morphys
+, pytestCheckHook
+, pythonOlder
+, six
+, varint
+}:
+
+buildPythonPackage rec {
+  pname = "py-multicodec";
+  version = "0.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "multiformats";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-2aK+bfhqCMqSO+mtrHIfNQmQpQHpwd7yHseI/3O7Sp4=";
+  };
+
+  # Error when not substituting:
+  # Failed: [pytest] section in setup.cfg files is no longer supported, change to [tool:pytest] instead.
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "[pytest]" "[tool:pytest]"
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'," ""
+  '';
+
+  propagatedBuildInputs = [
+    morphys
+    six
+    varint
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "multicodec"
+  ];
+
+  meta = with lib; {
+    description = "Compact self-describing codecs";
+    homepage = "https://github.com/multiformats/py-multicodec";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Luflosi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-multihash/default.nix b/nixpkgs/pkgs/development/python-modules/py-multihash/default.nix
new file mode 100644
index 000000000000..9ae0d1a1d3db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-multihash/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, base58
+, buildPythonPackage
+, fetchFromGitHub
+, morphys
+, pytestCheckHook
+, pythonOlder
+, six
+, varint
+}:
+
+buildPythonPackage rec {
+  pname = "py-multihash";
+  version = "2.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.4";
+
+  src = fetchFromGitHub {
+    owner = "multiformats";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-z1lmSypGCMFWJNzNgV9hx/IStyXbpd5jvrptFpewuOA=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner', " ""
+  '';
+
+  propagatedBuildInputs = [
+    base58
+    morphys
+    six
+    varint
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "multihash"
+  ];
+
+  meta = with lib; {
+    description = "Self describing hashes - for future proofing";
+    homepage = "https://github.com/multiformats/py-multihash";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rakesh4g ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-nextbusnext/default.nix b/nixpkgs/pkgs/development/python-modules/py-nextbusnext/default.nix
new file mode 100644
index 000000000000..090883bad3d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-nextbusnext/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "py-nextbusnext";
+  version = "1.0.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ViViDboarder";
+    repo = "py_nextbus";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-5zD8AKb4/4x4cVA922OlzSOXlg3F6QCcr16agEQkUWM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "py_nextbus"
+  ];
+
+  meta = with lib; {
+    description = "Minimalistic Python client for the NextBus public API";
+    homepage = "https://github.com/ViViDboarder/py_nextbus";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-nightscout/default.nix b/nixpkgs/pkgs/development/python-modules/py-nightscout/default.nix
new file mode 100644
index 000000000000..3330b68c949e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-nightscout/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "py-nightscout";
+  version = "1.3.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "marciogranzotto";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0kslmm3wrxhm307nqmjmq8i8vy1x6mjaqlgba0hgvisj6b4hx65k";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    pytz
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+
+  pythonImportsCheck = [
+    "py_nightscout"
+  ];
+
+  meta = with lib; {
+    description = "Python library that provides an interface to Nightscout";
+    homepage = "https://github.com/marciogranzotto/py-nightscout";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-partiql-parser/default.nix b/nixpkgs/pkgs/development/python-modules/py-partiql-parser/default.nix
new file mode 100644
index 000000000000..fd2fb808bb43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-partiql-parser/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, sure
+}:
+
+buildPythonPackage rec {
+  pname = "py-partiql-parser";
+  version = "0.4.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "getmoto";
+    repo = "py-partiql-parser";
+    rev = "refs/tags/${version}";
+    hash = "sha256-EV5Md7dAkHcBbfF4DhmUHwKxjlXI4Jbb1VryeOwRTWo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    sure
+  ];
+
+  pythonImportsCheck = [
+    "py_partiql_parser"
+  ];
+
+  meta = with lib; {
+    description = "A tokenizer/parser/executor for the PartiQL-language";
+    homepage = "https://github.com/getmoto/py-partiql-parser";
+    changelog = "https://github.com/getmoto/py-partiql-parser/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ centromere ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-pdf-parser/default.nix b/nixpkgs/pkgs/development/python-modules/py-pdf-parser/default.nix
new file mode 100644
index 000000000000..93ffeacb08a7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-pdf-parser/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, docopt
+, fetchPypi
+, pdfminer-six
+, pythonOlder
+, pythonRelaxDepsHook
+, setuptools
+, wand
+}:
+
+buildPythonPackage rec {
+  pname = "py-pdf-parser";
+  version = "0.12.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-nMEmzQVz1LR4omHyxhvrjBXDQQE23S62T0wxZeMnXhg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    docopt
+    pdfminer-six
+    wand
+  ];
+
+  pythonRelaxDeps = [
+    "docopt"
+    "pdfminer.six"
+    "wand"
+  ];
+
+  # needs pyvoronoi, which isn't packaged yet
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "py_pdf_parser"
+    "py_pdf_parser.loaders"
+  ];
+
+  meta = with lib; {
+    description = "A tool to help extracting information from structured PDFs";
+    homepage = "https://github.com/jstockwin/py-pdf-parser";
+    changelog = "https://github.com/jstockwin/py-pdf-parser/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-radix-sr/default.nix b/nixpkgs/pkgs/development/python-modules/py-radix-sr/default.nix
new file mode 100644
index 000000000000..da14d8a95799
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-radix-sr/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "py-radix-sr";
+  version = "1.0.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "SEKOIA-IO";
+    repo = "py-radix";
+    rev = "v${version}";
+    hash = "sha256-aHV+NvPR4Gyk6bEpCftgBylis9rU7BWLpBMatjP4QmE=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "name='py-radix'" "name='py-radix-sr'"
+  '';
+
+  pythonImportsCheck = [ "radix" ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Python radix tree for IPv4 and IPv6 prefix matching";
+    homepage = "https://github.com/SEKOIA-IO/py-radix";
+    license = with licenses; [ isc bsdOriginal ];
+    maintainers = teams.wdz.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-serializable/default.nix b/nixpkgs/pkgs/development/python-modules/py-serializable/default.nix
new file mode 100644
index 000000000000..028d61f745a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-serializable/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, defusedxml
+, fetchFromGitHub
+, lxml
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, xmldiff
+}:
+
+buildPythonPackage rec {
+  pname = "py-serializable";
+  version = "0.15.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "madpah";
+    repo = "serializable";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-U01XRT6XS0Uxpk+2pYOGAkZiZ5kogMBtcuEU1OJpSMo=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    defusedxml
+  ];
+
+  nativeCheckInputs = [
+    lxml
+    pytestCheckHook
+    xmldiff
+  ];
+
+  pythonImportsCheck = [
+    "serializable"
+  ];
+
+  disabledTests = [
+    # AssertionError: '<ns0[155 chars]itle>The Phoenix
+    "test_serializable_no_defaultNS"
+    "test_serializable_with_defaultNS"
+  ];
+
+  meta = with lib; {
+    description = "Pythonic library to aid with serialisation and deserialisation to/from JSON and XML";
+    homepage = "https://github.com/madpah/serializable";
+    changelog = "https://github.com/madpah/serializable/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-sneakers/default.nix b/nixpkgs/pkgs/development/python-modules/py-sneakers/default.nix
new file mode 100644
index 000000000000..62174c3dfc26
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-sneakers/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "py-sneakers";
+  version = "1.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bIhkYTzRe4uM0kbNhbDTr6TiaOEBSiCSkPJKKCivDZY=";
+  };
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "py_sneakers"
+  ];
+
+  meta = with lib; {
+    description = "Library to emulate the Sneakers movie effect";
+    homepage = "https://github.com/aenima-x/py-sneakers";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-sonic/default.nix b/nixpkgs/pkgs/development/python-modules/py-sonic/default.nix
new file mode 100644
index 000000000000..a3e7cd503608
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-sonic/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "py-sonic";
+  version = "1.0.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-9ho0F5kf74pCsLujwLt+pU+Ikxu70/kk+WP7lnD7CiE=";
+  };
+
+  # package has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "libsonic" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/crustymonkey/py-sonic";
+    description = "A python wrapper library for the Subsonic REST API";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ wenngle ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-sr25519-bindings/default.nix b/nixpkgs/pkgs/development/python-modules/py-sr25519-bindings/default.nix
new file mode 100644
index 000000000000..c001344a293b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-sr25519-bindings/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, fetchFromGitHub
+, fetchpatch
+, buildPythonPackage
+, pythonOlder
+, pytestCheckHook
+, rustPlatform
+, stdenv
+, py-bip39-bindings
+, libiconv }:
+
+buildPythonPackage rec {
+  pname = "py-sr25519-bindings";
+  version = "unstable-2023-03-15";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "polkascan";
+    repo = "py-sr25519-bindings";
+    rev = "9127501235bf291d7f14f00ec373d0a5000a32cb";
+    hash = "sha256-mxNmiFvMbV9WQhGNIQXxTkOcJHYs0vyOPM6Nd5367RE=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-7fDlEYWOiRVpG3q0n3ZSS1dfNCOh0/4pX/PbcDBvoMI=";
+  };
+
+  nativeBuildInputs = with rustPlatform; [
+    cargoSetupHook
+    maturinBuildHook
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    py-bip39-bindings
+  ];
+
+  pytestFlagsArray = [
+    "tests.py"
+  ];
+
+  pythonImportsCheck = [
+    "sr25519"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for sr25519 library";
+    homepage = "https://github.com/polkascan/py-sr25519-bindings";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ onny stargate01 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-stringmatching/default.nix b/nixpkgs/pkgs/development/python-modules/py-stringmatching/default.nix
new file mode 100644
index 000000000000..b5bdffca7590
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-stringmatching/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, pytestCheckHook
+, numpy
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "py-stringmatching";
+  version = "0.4.3";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "py_stringmatching";
+    inherit version;
+    hash = "sha256-khubsWOzEN80HDOCORMgT3sMqfajGfW0UUCDAL03je4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    cd $out
+  '';
+
+  pythonImportsCheck = [
+    "py_stringmatching"
+  ];
+
+  meta = with lib; {
+    description = "Python string matching library including string tokenizers and string similarity measures";
+    homepage = "https://github.com/anhaidgroup/py_stringmatching";
+    changelog = "https://github.com/anhaidgroup/py_stringmatching/blob/v${version}/CHANGES.txt";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-synologydsm-api/default.nix b/nixpkgs/pkgs/development/python-modules/py-synologydsm-api/default.nix
new file mode 100644
index 000000000000..a8019318e538
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-synologydsm-api/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "py-synologydsm-api";
+  version = "2.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "mib1185";
+    repo = "py-synologydsm-api";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-lSNdwM+b91XWILKjGsi73Tu29spOdnFznuE7ELg+mhw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "synology_dsm"
+  ];
+
+  meta = with lib; {
+    description = "Python API for Synology DSM";
+    homepage = "https://github.com/mib1185/py-synologydsm-api";
+    changelog = "https://github.com/mib1185/py-synologydsm-api/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ uvnikita ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-tes/default.nix b/nixpkgs/pkgs/development/python-modules/py-tes/default.nix
new file mode 100644
index 000000000000..6fba131e0713
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-tes/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, future
+, python-dateutil
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "py-tes";
+  version = "0.4.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ohsu-comp-bio";
+    repo = pname;
+    rev = version;
+    hash = "sha256-HZeyCQHiqfdquWQD5axS73JDjDMUieONwm5VyA+vTFk=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    future
+    python-dateutil
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pythonImportsCheck = [
+    "tes"
+  ];
+
+  meta = with lib; {
+    description = "Python SDK for the GA4GH Task Execution API";
+    homepage = "https://github.com/ohsu-comp-bio/py-tes";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-tree-sitter/default.nix b/nixpkgs/pkgs/development/python-modules/py-tree-sitter/default.nix
new file mode 100644
index 000000000000..f8c1997220a7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-tree-sitter/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "py-tree-sitter";
+  version = "0.20.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "tree-sitter";
+    repo = "py-tree-sitter";
+    rev = "v${version}";
+    hash = "sha256-mdV5zGvVI1MltmOD1BtXxsKB/yigk8d56WwLlX6Uizg=";
+    fetchSubmodules = true;
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  pythonImportsCheck = [ "tree_sitter" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/tree-sitter/py-tree-sitter";
+    description = "Python bindings for tree-sitter";
+    license = licenses.mit;
+    maintainers = with maintainers; [ siraben ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-ubjson/default.nix b/nixpkgs/pkgs/development/python-modules/py-ubjson/default.nix
new file mode 100644
index 000000000000..5cb8cfc40220
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-ubjson/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "py-ubjson";
+  version = "0.16.1";
+
+  src = fetchFromGitHub {
+    owner = "Iotic-Labs";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1frn97xfa88zrfmpnvdk1pc03yihlchhph99bhjayvzlfcrhm5v3";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [ "test/test.py" ];
+
+  pythonImportsCheck = [ "ubjson" ];
+
+  meta = with lib; {
+    description = "Universal Binary JSON draft-12 serializer for Python";
+    homepage = "https://github.com/Iotic-Labs/py-ubjson";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-vapid/default.nix b/nixpkgs/pkgs/development/python-modules/py-vapid/default.nix
new file mode 100644
index 000000000000..111e702455d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-vapid/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flake8
+, mock
+, nose
+, pytest
+, cryptography
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "py-vapid";
+  version = "1.9.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BmSreJl0LvKyhzl6TUYe9pHtDML1hyBRKNjPYX/9uRk=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  nativeCheckInputs = [
+    flake8
+    mock
+    nose
+    pytest
+  ];
+
+  meta = with lib; {
+    description = "Library for VAPID header generation";
+    homepage = "https://github.com/mozilla-services/vapid";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py-zabbix/default.nix b/nixpkgs/pkgs/development/python-modules/py-zabbix/default.nix
new file mode 100644
index 000000000000..b39a706c6538
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py-zabbix/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "py-zabbix";
+  version = "1.1.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "adubkov";
+    repo = "py-zabbix";
+    rev = "refs/tags/${version}";
+    hash = "sha256-aPQc188pszfDQvNtsGYlRLHS5CG5VyqptSoe4/GJVvE=";
+  };
+
+  patches = [
+    # Remove Python2 comp, https://github.com/adubkov/py-zabbix/pull/154
+    (fetchpatch {
+      name = "no-more-py2.patch";
+      url = "https://github.com/adubkov/py-zabbix/commit/8deedb860f52870fbeacc54a40341520702341e2.patch";
+      hash = "sha256-Af7pnCZIObC0ZQLaamBK1pTAVAFs/Mh7+og5jAKqk4s=";
+    })
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyzabbix"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interact with Zabbix";
+    homepage = "https://github.com/adubkov/py-zabbix";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py/default.nix b/nixpkgs/pkgs/development/python-modules/py/default.nix
new file mode 100644
index 000000000000..c1cf60ca4d77
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, setuptools-scm }:
+
+buildPythonPackage rec {
+  pname = "py";
+  version = "1.11.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719";
+  };
+
+  # Circular dependency on pytest
+  doCheck = false;
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  pythonImportsCheck = [
+    "py"
+  ];
+
+  meta = with lib; {
+    description = "Library with cross-python path, ini-parsing, io, code, log facilities";
+    homepage = "https://py.readthedocs.io/";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py17track/default.nix b/nixpkgs/pkgs/development/python-modules/py17track/default.nix
new file mode 100644
index 000000000000..6294b6b1c066
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py17track/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, aiohttp
+, aresponses
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "py17track";
+  version = "2021.12.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = pname;
+    rev = version;
+    hash = "sha256-T0Jjdu6QC8rTqZwe4cdsBbs0hQXUY6CkrImCgYwWL9o=";
+  };
+
+  patches = [
+    # This patch removes references to setuptools and wheel that are no longer
+    # necessary and changes poetry to poetry-core, so that we don't need to add
+    # unnecessary nativeBuildInputs.
+    #
+    #   https://github.com/bachya/py17track/pull/80
+    #
+    (fetchpatch {
+      name = "clean-up-build-dependencies.patch";
+      url = "https://github.com/bachya/py17track/commit/3b52394759aa50c62e2a56581e30cdb94003e2f1.patch";
+      hash = "sha256-iLgklhEZ61rrdzQoO6rp1HGZcqLsqGNitwIiPNLNHQ4=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    attrs
+    pytz
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Ignore the examples directory as the files are prefixed with test_
+    "examples/"
+  ];
+
+  pythonImportsCheck = [
+    "py17track"
+  ];
+
+  meta = with lib; {
+    description = "Python library to track package info from 17track.com";
+    homepage = "https://github.com/bachya/py17track";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py2bit/default.nix b/nixpkgs/pkgs/development/python-modules/py2bit/default.nix
new file mode 100644
index 000000000000..7699ccab3a2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py2bit/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "py2bit";
+  version = "0.3.0";
+
+  checkInput = [ pytest ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1vw2nvw1yrl7ikkqsqs1pg239yr5nspvd969r1x9arms1k25a1a5";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/deeptools/py2bit";
+    description = "File access to 2bit files";
+    longDescription = ''
+        A python extension, written in C, for quick access to 2bit files. The extension uses lib2bit for file access.
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ scalavision ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py3buddy/default.nix b/nixpkgs/pkgs/development/python-modules/py3buddy/default.nix
new file mode 100644
index 000000000000..b8a25480799b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py3buddy/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv
+, fetchFromGitHub
+, python
+, pyusb
+}:
+
+stdenv.mkDerivation rec {
+  pname = "py3buddy";
+  version = "unstable-2019-09-29";
+
+  src = fetchFromGitHub {
+    owner = "armijnhemel";
+    repo = pname;
+    rev = "2b28908454645117368ca56df67548c93f4e0b03";
+    sha256 = "12ar4kbplavndarkrbibxi5i607f5sfia5myscvalqy78lc33798";
+  };
+
+  propagatedBuildInputs = [ pyusb ];
+
+  dontConfigure = true;
+  dontBuild = true;
+  dontCheck = true;
+
+  installPhase = ''
+    install -D py3buddy.py $out/${python.sitePackages}/py3buddy.py
+  '';
+
+  postInstall = ''
+    install -D 99-ibuddy.rules $out/lib/udev/rules.d/99-ibuddy.rules
+  '';
+
+  meta = with lib; {
+    description = "Code to work with the iBuddy MSN figurine";
+    homepage = "https://github.com/armijnhemel/py3buddy";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py3dns/default.nix b/nixpkgs/pkgs/development/python-modules/py3dns/default.nix
new file mode 100644
index 000000000000..12297b9a6f78
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py3dns/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "py3dns";
+  version = "3.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1r25f0ys5p37bhld7m7n4gb0lrysaym3w318w2f8bncq7r3d81qz";
+  };
+
+  preConfigure = ''
+    sed -i \
+      -e '/import DNS/d' \
+      -e 's/DNS.__version__/"${version}"/g' \
+      setup.py
+  '';
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python 3 DNS library";
+    homepage = "https://launchpad.net/py3dns";
+    license = licenses.psfl;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py3exiv2/default.nix b/nixpkgs/pkgs/development/python-modules/py3exiv2/default.nix
new file mode 100644
index 000000000000..e8c5c6cd1516
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py3exiv2/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, stdenv
+, boost
+, buildPythonPackage
+, exiv2
+, fetchPypi
+, libcxx
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "py3exiv2";
+  version = "0.12.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-crI+X3YMRzPPmpGNsI2U+9bZgwcR0qTowJuPNFY/Ooo=";
+  };
+
+  buildInputs = [
+    boost
+    exiv2
+  ];
+
+  # Work around Python distutils compiling C++ with $CC (see issue #26709)
+  env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.isDarwin "-I${lib.getDev libcxx}/include/c++/v1";
+
+  pythonImportsCheck = [
+    "pyexiv2"
+  ];
+
+  # Tests are not shipped
+  doCheck = false;
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Python binding to the library exiv2";
+    homepage = "https://launchpad.net/py3exiv2";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ vinymeuh ];
+    platforms = with platforms; linux ++ darwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py3nvml/default.nix b/nixpkgs/pkgs/development/python-modules/py3nvml/default.nix
new file mode 100644
index 000000000000..3cd3b122d867
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py3nvml/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "py3nvml";
+  version = "0.2.7";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Ce4dBFmKbmZOJEZfgEzjv+EZpv21Ni3xwWj4qpKfvXM=";
+  };
+
+  propagatedBuildInputs = [
+    xmltodict
+  ];
+
+  pythonImportsCheck = [ "py3nvml" ];
+
+  meta = with lib; {
+    description = "Python 3 Bindings for the NVIDIA Management Library";
+    homepage = "https://pypi.org/project/py3nvml/";
+    license = with licenses; [ bsd3 bsd2 ];
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py3rijndael/default.nix b/nixpkgs/pkgs/development/python-modules/py3rijndael/default.nix
new file mode 100644
index 000000000000..74a91b6ee2f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py3rijndael/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+let
+  pname = "py3rijndael";
+  version = "0.3.3";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-tmVaPr/zoQVA6u0EnoeI7qOsk9a3GzpqwrACJLvs6ag=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Rijndael algorithm library";
+    homepage = "https://github.com/meyt/py3rijndael";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py3status/default.nix b/nixpkgs/pkgs/development/python-modules/py3status/default.nix
new file mode 100644
index 000000000000..45ac825c6a56
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py3status/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, acpi
+, alsa-utils
+, coreutils
+, dbus-python
+, fetchPypi
+, file
+, hatchling
+, i3
+, i3ipc
+, libnotify
+, lm_sensors
+, procps
+, pydbus
+, pygobject3
+, pyserial
+, pytz
+, requests
+, setuptools
+, tzlocal
+, xorg
+}:
+
+buildPythonPackage rec {
+  pname = "py3status";
+  version = "3.54";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xRiXFCILZeiNYJMIJ8Qxga71/7WXeTUsdnRvfvDzpCY=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    pytz
+    requests
+    tzlocal
+    i3ipc
+    pydbus
+    pygobject3
+    pyserial
+    setuptools
+    dbus-python
+    file
+  ];
+
+  prePatch = ''
+    sed -i -e "s|'file|'${file}/bin/file|" py3status/parse_config.py
+    sed -i -e "s|\[\"acpi\"|\[\"${acpi}/bin/acpi\"|" py3status/modules/battery_level.py
+    sed -i -e "s|notify-send|${libnotify}/bin/notify-send|" py3status/modules/battery_level.py
+    sed -i -e "s|/usr/bin/whoami|${coreutils}/bin/whoami|" py3status/modules/external_script.py
+    sed -i -e "s|'amixer|'${alsa-utils}/bin/amixer|" py3status/modules/volume_status.py
+    sed -i -e "s|'i3-nagbar|'${i3}/bin/i3-nagbar|" py3status/modules/pomodoro.py
+    sed -i -e "s|'free|'${procps}/bin/free|" py3status/modules/sysdata.py
+    sed -i -e "s|'sensors|'${lm_sensors}/bin/sensors|" py3status/modules/sysdata.py
+    sed -i -e "s|'setxkbmap|'${xorg.setxkbmap}/bin/setxkbmap|" py3status/modules/keyboard_layout.py
+    sed -i -e "s|'xset|'${xorg.xset}/bin/xset|" py3status/modules/keyboard_layout.py
+  '';
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Extensible i3status wrapper";
+    homepage = "https://github.com/ultrabug/py3status";
+    changelog = "https://github.com/ultrabug/py3status/blob/${version}/CHANGELOG";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py4j/default.nix b/nixpkgs/pkgs/development/python-modules/py4j/default.nix
new file mode 100644
index 000000000000..7365db7cd300
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py4j/default.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage, fetchPypi, lib }:
+
+buildPythonPackage rec {
+  pname = "py4j";
+
+  version = "0.10.9.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-C25TFbs62lz2KsZR0Qe7LrwC3vPe6dlUjjuqxkTqjbs=";
+  };
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Py4J enables Python programs running in a Python interpreter to dynamically access Java objects in a Java Virtual Machine. Methods are called as if the Java objects resided in the Python interpreter and Java collections can be accessed through standard Python collection methods. Py4J also enables Java programs to call back Python objects.";
+    homepage = "https://www.py4j.org/";
+    sourceProvenance = with sourceTypes; [
+      fromSource
+      binaryBytecode
+    ];
+    license = licenses.bsd3;
+    maintainers = [ maintainers.shlevy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py65/default.nix b/nixpkgs/pkgs/development/python-modules/py65/default.nix
new file mode 100644
index 000000000000..5748b8c16938
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py65/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "py65";
+  version = "1.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "mnaberez";
+    repo = "py65";
+    rev = "refs/tags/${version}";
+    hash = "sha256-WLs3TAZovuphWZIvMvM3CZnqg1aZfMF4Yrqw46k+bLA=";
+  };
+
+  postPatch = ''
+    substituteInPlace py65/tests/test_monitor.py \
+          --replace "test_argv_rom" "dont_test_argv_rom" \
+          --replace "test_argv_combination_rom_mpu" "dont_test_argv_combination_rom_mpu"
+  '';
+
+  meta = {
+    homepage = "https://py65.readthedocs.io/";
+    description = "Emulate 6502-based microcomputer systems in Python";
+    longDescription = ''
+      Py65 includes a program called Py65Mon that functions as a machine
+      language monitor. This kind of program is sometimes also called a
+      debugger. Py65Mon provides a command line with many convenient commands
+      for interacting with the simulated 6502-based system.
+    '';
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ AndersonTorres tomasajt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyTelegramBotAPI/default.nix b/nixpkgs/pkgs/development/python-modules/pyTelegramBotAPI/default.nix
new file mode 100644
index 000000000000..94bf1eef12d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyTelegramBotAPI/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, aiohttp
+, aioredis
+, buildPythonPackage
+, coloredlogs
+, fastapi
+, fetchFromGitHub
+, pillow
+, psutil
+, pytestCheckHook
+, pythonOlder
+, redis
+, requests
+, ujson
+, uvicorn
+, watchdog
+}:
+
+buildPythonPackage rec {
+  pname = "pytelegrambotapi";
+  version = "4.14.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "eternnoir";
+    repo = "pyTelegramBotAPI";
+    rev = "refs/tags/${version}";
+    hash = "sha256-R52j4JnoM0nlZvlcDox2Wz3WjTEstNaqbg8SPiPHD4c=";
+  };
+
+  passthru.optional-dependencies = {
+    json = [
+      ujson
+    ];
+    PIL = [
+      pillow
+    ];
+    redis = [
+      redis
+    ];
+    aioredis = [
+      aioredis
+    ];
+    aiohttp = [
+      aiohttp
+    ];
+    fastapi = [
+      fastapi
+    ];
+    uvicorn = [
+      uvicorn
+    ];
+    psutil = [
+      psutil
+    ];
+    coloredlogs = [
+      coloredlogs
+    ];
+    watchdog = [
+      watchdog
+    ];
+  };
+
+  checkInputs = [
+    pytestCheckHook
+    requests
+  ] ++ passthru.optional-dependencies.watchdog
+  ++ passthru.optional-dependencies.aiohttp;
+
+  pythonImportsCheck = [
+    "telebot"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation for the Telegram Bot API";
+    homepage = "https://github.com/eternnoir/pyTelegramBotAPI";
+    changelog = "https://github.com/eternnoir/pyTelegramBotAPI/releases/tag/${version}";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ das_j ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/py_scrypt/default.nix b/nixpkgs/pkgs/development/python-modules/py_scrypt/default.nix
new file mode 100644
index 000000000000..5ecedd0d4c5c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/py_scrypt/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, openssl
+}:
+
+buildPythonPackage rec {
+  pname = "scrypt";
+  version = "0.8.20";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-DSJsHGdE+y4wizkUEGabHfXP6CY3/8te1Im/grLS63g=";
+  };
+
+  buildInputs = [ openssl ];
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Bindings for scrypt key derivation function library";
+    homepage = "https://pypi.python.org/pypi/scrypt";
+    maintainers = [];
+    license = licenses.bsd2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyacaia-async/default.nix b/nixpkgs/pkgs/development/python-modules/pyacaia-async/default.nix
new file mode 100644
index 000000000000..7d69f39ceb1e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyacaia-async/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, bleak
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pyacaia-async";
+  version = "0.0.10";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    pname = "pyacaia_async";
+    inherit version;
+    hash = "sha256-hmzsZIIZsswUvy9AMgfXNC2v6H8Wvgdk9Qa4PoYmhCU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    bleak
+  ];
+
+  # Module has no tests in PyPI releases
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyacaia_async"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with Acaia scales";
+    homepage = "https://github.com/zweckj/pyacaia_async";
+    license = with licenses; [ gpl3Only mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyacoustid/default.nix b/nixpkgs/pkgs/development/python-modules/pyacoustid/default.nix
new file mode 100644
index 000000000000..6bfa6900e78a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyacoustid/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, audioread
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "pyacoustid";
+  version = "1.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-X09IcZHBnruQgnCxt7UpfxMtozKxVouWqRRXTAee0Xc=";
+  };
+
+  propagatedBuildInputs = [ requests audioread ];
+
+  postPatch = ''
+    sed -i \
+        -e '/^FPCALC_COMMAND *=/s|=.*|= "${pkgs.chromaprint}/bin/fpcalc"|' \
+        acoustid.py
+  '';
+
+  # package has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "acoustid" ];
+
+  meta = with lib; {
+    description = "Bindings for Chromaprint acoustic fingerprinting";
+    homepage = "https://github.com/sampsyo/pyacoustid";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyads/default.nix b/nixpkgs/pkgs/development/python-modules/pyads/default.nix
new file mode 100644
index 000000000000..bdedb2392af7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyads/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, adslib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyads";
+  version = "3.3.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "stlehmann";
+    repo = pname;
+    rev = version;
+    hash = "sha256-eNouFJQDgp56fgkA7wZKfosKWOKU6OvXRjFwjCMvZqI=";
+  };
+
+  buildInputs = [
+    adslib
+  ];
+
+  patchPhase = ''
+    substituteInPlace pyads/pyads_ex.py \
+      --replace "ctypes.CDLL(adslib)" "ctypes.CDLL(\"${adslib}/lib/adslib.so\")"
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyads"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for TwinCAT ADS library";
+    homepage = "https://github.com/MrLeeh/pyads";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jamiemagee ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyaehw4a1/default.nix b/nixpkgs/pkgs/development/python-modules/pyaehw4a1/default.nix
new file mode 100644
index 000000000000..0aa37cbae1e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyaehw4a1/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "pyaehw4a1";
+  version = "0.3.9";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "bannhead";
+    repo = "pyaehw4a1";
+    rev = "v${version}";
+    sha256 = "0grs7kiyhzlwqzmw2yxkkglnwjfpimgwxbgp0047rlp3k8md7sjv";
+  };
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "pyaehw4a1" ];
+
+  meta = with lib; {
+    description = "Python interface for Hisense AEH-W4A1 module";
+    homepage = "https://github.com/bannhead/pyaehw4a1";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyaes/default.nix b/nixpkgs/pkgs/development/python-modules/pyaes/default.nix
new file mode 100644
index 000000000000..2674211479fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyaes/default.nix
@@ -0,0 +1,17 @@
+{ lib, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "pyaes";
+  version = "1.6.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "02c1b1405c38d3c370b085fb952dd8bea3fadcee6411ad99f312cc129c536d8f";
+  };
+
+  meta = {
+    description = "Pure-Python AES";
+    license = lib.licenses.mit;
+    homepage = "https://github.com/ricmoo/pyaes";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyaftership/default.nix b/nixpkgs/pkgs/development/python-modules/pyaftership/default.nix
new file mode 100644
index 000000000000..7c1c76c4adb5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyaftership/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, aiohttp
+, aresponses
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyaftership";
+  version = "23.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ludeeus";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-njlDScmxIYWxB4EL9lOSGCXqZDzP999gI9EkpcZyFlE=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # Upstream is releasing with the help of a CI to PyPI, GitHub releases
+    # are not in their focus
+    substituteInPlace setup.py \
+      --replace 'version="main",' 'version="${version}",'
+  '';
+
+  pythonImportsCheck = [
+    "pyaftership"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper package for the AfterShip API";
+    homepage = "https://github.com/ludeeus/pyaftership";
+    changelog = "https://github.com/ludeeus/pyaftership/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jamiemagee ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyahocorasick/default.nix b/nixpkgs/pkgs/development/python-modules/pyahocorasick/default.nix
new file mode 100644
index 000000000000..b490f883d4cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyahocorasick/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyahocorasick";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "WojciechMula";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Ugl7gHyubXpxe4aots2e9stLuQAZEWsrlDuAHdSC0SA=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ahocorasick"
+  ];
+
+  meta = with lib; {
+    description = "Python module implementing Aho-Corasick algorithm";
+    longDescription = ''
+      This Python module is a fast and memory efficient library for exact or
+      approximate multi-pattern string search meaning that you can find multiple
+      key strings occurrences at once in some input text.
+    '';
+    homepage = "https://github.com/WojciechMula/pyahocorasick";
+    changelog = "https://github.com/WojciechMula/pyahocorasick/blob/${version}/CHANGELOG.rst";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyairnow/default.nix b/nixpkgs/pkgs/development/python-modules/pyairnow/default.nix
new file mode 100644
index 000000000000..f425eaeaa17c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyairnow/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-aiohttp
+, poetry-core
+, pytest-asyncio
+, pytest-cov
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyairnow";
+  version = "1.2.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "asymworks";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-aab+3xrEiCjysa+DzXWelQwz8V2tr74y8v0NpDZiuTk=";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytest-asyncio
+    pytest-aiohttp
+    pytest-cov
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pyairnow" ];
+
+  meta = with lib; {
+    description = "Python wrapper for EPA AirNow Air Quality API";
+    homepage = "https://github.com/asymworks/pyairnow";
+    changelog = "https://github.com/asymworks/pyairnow/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyairvisual/default.nix b/nixpkgs/pkgs/development/python-modules/pyairvisual/default.nix
new file mode 100644
index 000000000000..2e3f3f6fabd6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyairvisual/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, certifi
+, fetchFromGitHub
+, numpy
+, poetry-core
+, pygments
+, pysmb
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyairvisual";
+  version = "2023.11.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = "pyairvisual";
+    rev = "refs/tags/${version}";
+    hash = "sha256-69lLw+ZYQ4hfD6xsfq1DVTWCnbp7e+qexuW3osDUejg=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml --replace \
+      'certifi = ">=2023.07.22"' \
+      'certifi = "*"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    certifi
+    numpy
+    pygments
+    pysmb
+  ];
+
+  # this lets tests bind to localhost in sandbox mode on macOS
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Ignore the examples directory as the files are prefixed with test_.
+    "examples/"
+  ];
+
+  pythonImportsCheck = [
+    "pyairvisual"
+  ];
+
+  meta = with lib; {
+    description = "Python library for interacting with AirVisual";
+    homepage = "https://github.com/bachya/pyairvisual";
+    changelog = "https://github.com/bachya/pyairvisual/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyalgotrade/default.nix b/nixpkgs/pkgs/development/python-modules/pyalgotrade/default.nix
new file mode 100644
index 000000000000..680a8f6f8307
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyalgotrade/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, matplotlib
+, numpy
+, python-dateutil
+, pytz
+, requests
+, retrying
+, scipy
+, six
+, tornado
+, tweepy
+, ws4py
+}:
+
+buildPythonPackage rec {
+  pname = "pyalgotrade";
+  version = "0.20";
+
+  src = fetchPypi {
+    pname = "PyAlgoTrade";
+    inherit version;
+    sha256 = "7927c87af202869155280a93ff6ee934bb5b46cdb1f20b70f7407337f8541cbd";
+  };
+
+  propagatedBuildInputs = [
+    matplotlib numpy python-dateutil pytz requests
+    retrying scipy six tornado tweepy ws4py
+  ];
+
+  # no tests in PyPI tarball
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python Algorithmic Trading";
+    homepage = "http://gbeced.github.io/pyalgotrade/";
+    license = licenses.asl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyamg/default.nix b/nixpkgs/pkgs/development/python-modules/pyamg/default.nix
new file mode 100644
index 000000000000..4180edaebde3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyamg/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, scipy
+, pytest
+, python
+, pybind11
+, setuptools-scm
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyamg";
+  version = "5.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XwSKAXQzQ64NTIYjBgBzhs+5sURTxHrf2tJ363mkbVA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    pytest
+    pybind11
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    # The `pyamg` directory in PWD doesn't have the compiled Cython modules in it, but has higher import priority compared to the properly built and installed `pyamg`.
+    # It's easier to just remove the package directory in PWD.
+    rm -r pyamg
+    ${python.interpreter} -c "import pyamg; pyamg.test()"
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "pyamg"
+    "pyamg.amg_core.evolution_strength"
+  ];
+
+  meta = with lib; {
+    description = "Algebraic Multigrid Solvers in Python";
+    homepage = "https://github.com/pyamg/pyamg";
+    changelog = "https://github.com/pyamg/pyamg/blob/v${version}/changelog.md";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyaml/default.nix b/nixpkgs/pkgs/development/python-modules/pyaml/default.nix
new file mode 100644
index 000000000000..a0a898b97062
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyaml/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyyaml
+, unidecode
+}:
+
+buildPythonPackage rec {
+  pname = "pyaml";
+  version = "23.9.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Kyw5AXtxihJ775+WvFX4lBTZYIdmaNaYgKrmb0upiVc=";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    unidecode
+  ];
+
+  pythonImportsCheck = [ "pyaml" ];
+
+  meta = with lib; {
+    description = "PyYAML-based module to produce pretty and readable YAML-serialized data";
+    homepage = "https://github.com/mk-fg/pretty-yaml";
+    license = licenses.wtfpl;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyannotate/default.nix b/nixpkgs/pkgs/development/python-modules/pyannotate/default.nix
new file mode 100644
index 000000000000..053844d71fe9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyannotate/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mypy-extensions
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "pyannotate";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BO1YBLqzgVPVmB/JLYPc9qIog0U3aFYfBX53flwFdZk=";
+  };
+
+  propagatedBuildInputs = [
+    six
+    mypy-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyannotate_runtime"
+    "pyannotate_tools"
+  ];
+
+  meta = with lib; {
+    description = "Auto-generate PEP-484 annotations";
+    homepage = "https://github.com/dropbox/pyannotate";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyarlo/default.nix b/nixpkgs/pkgs/development/python-modules/pyarlo/default.nix
new file mode 100644
index 000000000000..63c766ffb5bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyarlo/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, requests
+, requests-mock
+, sseclient-py
+}:
+
+buildPythonPackage rec {
+  pname = "pyarlo";
+  version = "0.2.4";
+
+  src = fetchFromGitHub {
+    owner = "tchellomello";
+    repo = "python-arlo";
+    rev = version;
+    sha256 = "0pp7y2llk4xnf6zh57j5xas0gw5zqm42qaqssd8p4qa3g5rds8k3";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    sseclient-py
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+    requests-mock
+  ];
+
+  pythonImportsCheck = [ "pyarlo" ];
+
+  meta = with lib; {
+    description = "Python library to work with Netgear Arlo cameras";
+    homepage = "https://github.com/tchellomello/python-arlo";
+    license = with licenses; [ lgpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyarr/default.nix b/nixpkgs/pkgs/development/python-modules/pyarr/default.nix
new file mode 100644
index 000000000000..2da0b65e5bed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyarr/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, types-requests
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyarr";
+  version = "5.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jlcc9Kj1MYSsnvJkKZXXWWJVDx3KIuojjbGtl8kDUpw=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    types-requests
+  ];
+
+  pythonImportsCheck = [ "pyarr" ];
+
+  meta = with lib; {
+    description = "Python client for Servarr API's (Sonarr, Radarr, Readarr, Lidarr)";
+    homepage = "https://github.com/totaldebug/pyarr";
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyarrow/default.nix b/nixpkgs/pkgs/development/python-modules/pyarrow/default.nix
new file mode 100644
index 000000000000..90fae9e2722c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyarrow/default.nix
@@ -0,0 +1,173 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, python
+, pythonAtLeast
+, pythonOlder
+, arrow-cpp
+, cffi
+, cloudpickle
+, cmake
+, cython
+, fsspec
+, hypothesis
+, numpy
+, pandas
+, pytestCheckHook
+, pytest-lazy-fixture
+, pkg-config
+, scipy
+, fetchpatch
+, setuptools-scm
+}:
+
+let
+  zero_or_one = cond: if cond then 1 else 0;
+in
+
+buildPythonPackage rec {
+  pname = "pyarrow";
+  inherit (arrow-cpp) version src;
+
+  disabled = pythonOlder "3.7";
+
+  sourceRoot = "apache-arrow-${version}/python";
+
+  nativeBuildInputs = [
+    cmake
+    cython
+    pkg-config
+    setuptools-scm
+  ];
+
+  buildInputs = [ arrow-cpp ];
+
+  propagatedBuildInputs = [
+    cffi
+    cloudpickle
+    fsspec
+    numpy
+    scipy
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pandas
+    pytestCheckHook
+    pytest-lazy-fixture
+  ];
+
+  PYARROW_BUILD_TYPE = "release";
+
+  PYARROW_WITH_DATASET = zero_or_one true;
+  PYARROW_WITH_FLIGHT = zero_or_one arrow-cpp.enableFlight;
+  PYARROW_WITH_HDFS = zero_or_one true;
+  PYARROW_WITH_PARQUET = zero_or_one true;
+  PYARROW_WITH_PARQUET_ENCRYPTION = zero_or_one true;
+  # Plasma is deprecated since arrow 10.0.0
+  PYARROW_WITH_PLASMA = zero_or_one false;
+  PYARROW_WITH_S3 = zero_or_one arrow-cpp.enableS3;
+  PYARROW_WITH_GCS = zero_or_one arrow-cpp.enableGcs;
+  PYARROW_BUNDLE_ARROW_CPP_HEADERS = zero_or_one false;
+
+  PYARROW_CMAKE_OPTIONS = [
+    "-DCMAKE_INSTALL_RPATH=${ARROW_HOME}/lib"
+  ];
+
+  ARROW_HOME = arrow-cpp;
+  PARQUET_HOME = arrow-cpp;
+
+  ARROW_TEST_DATA = lib.optionalString doCheck arrow-cpp.ARROW_TEST_DATA;
+
+  doCheck = true;
+
+  dontUseCmakeConfigure = true;
+
+  __darwinAllowLocalNetworking = true;
+
+  preBuild = ''
+    export PYARROW_PARALLEL=$NIX_BUILD_CORES
+  '';
+
+  postInstall = ''
+    # copy the pyarrow C++ header files to the appropriate location
+    pyarrow_include="$out/${python.sitePackages}/pyarrow/include"
+    mkdir -p "$pyarrow_include/arrow/python"
+    find "$PWD/pyarrow/src/arrow" -type f -name '*.h' -exec cp {} "$pyarrow_include/arrow/python" \;
+  '';
+
+  pytestFlagsArray = [
+    # A couple of tests are missing fixture imports, luckily pytest offers a
+    # clean solution.
+    "--fixtures pyarrow/tests/conftest.py"
+    # Deselect a single test because pyarrow prints a 2-line error message where
+    # only a single line is expected. The additional line of output comes from
+    # the glog library which is an optional dependency of arrow-cpp that is
+    # enabled in nixpkgs.
+    # Upstream Issue: https://issues.apache.org/jira/browse/ARROW-11393
+    "--deselect=pyarrow/tests/test_memory.py::test_env_var"
+    # these tests require access to s3 via the internet
+    "--deselect=pyarrow/tests/test_fs.py::test_resolve_s3_region"
+    "--deselect=pyarrow/tests/test_fs.py::test_s3_real_aws"
+    "--deselect=pyarrow/tests/test_fs.py::test_s3_real_aws_region_selection"
+    "--deselect=pyarrow/tests/test_fs.py::test_s3_options"
+    # Flaky test
+    "--deselect=pyarrow/tests/test_flight.py::test_roundtrip_errors"
+    "--deselect=pyarrow/tests/test_pandas.py::test_threaded_pandas_import"
+    # Flaky test, works locally but not on Hydra
+    "--deselect=pyarrow/tests/test_csv.py::TestThreadedCSVTableRead::test_cancellation"
+    # expects arrow-cpp headers to be bundled
+    "--deselect=pyarrow/tests/test_cpp_internals.py::test_pyarrow_include"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # Requires loopback networking
+    "--deselect=pyarrow/tests/test_ipc.py::test_socket_"
+    "--deselect=pyarrow/tests/test_flight.py::test_never_sends_data"
+    "--deselect=pyarrow/tests/test_flight.py::test_large_descriptor"
+    "--deselect=pyarrow/tests/test_flight.py::test_large_metadata_client"
+    "--deselect=pyarrow/tests/test_flight.py::test_none_action_side_effect"
+    # fails to compile
+    "--deselect=pyarrow/tests/test_cython.py::test_cython_api"
+  ] ++ lib.optionals (pythonAtLeast "3.11") [
+    # Repr output is printing number instead of enum name so these tests fail
+    "--deselect=pyarrow/tests/test_fs.py::test_get_file_info"
+  ] ++ lib.optionals stdenv.isLinux [
+    # this test requires local networking
+    "--deselect=pyarrow/tests/test_fs.py::test_filesystem_from_uri_gcs"
+  ];
+
+  disabledTests = [ "GcsFileSystem" ];
+
+  dontUseSetuptoolsCheck = true;
+
+  preCheck = ''
+    shopt -s extglob
+    rm -r pyarrow/!(conftest.py|tests)
+    mv pyarrow/conftest.py pyarrow/tests/parent_conftest.py
+    substituteInPlace pyarrow/tests/conftest.py --replace ..conftest .parent_conftest
+  '' + lib.optionalString stdenv.isDarwin ''
+    # OSError: [Errno 24] Too many open files
+    ulimit -n 1024
+  '';
+
+  pythonImportsCheck = [
+    "pyarrow"
+  ] ++ map (module: "pyarrow.${module}") [
+    "compute"
+    "csv"
+    "dataset"
+    "feather"
+    "flight"
+    "fs"
+    "hdfs"
+    "json"
+    "parquet"
+  ];
+
+  meta = with lib; {
+    description = "A cross-language development platform for in-memory data";
+    homepage = "https://arrow.apache.org/";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ veprbl cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyasn/default.nix b/nixpkgs/pkgs/development/python-modules/pyasn/default.nix
new file mode 100644
index 000000000000..026b5fdff683
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyasn/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi, fetchFromGitHub, python, }:
+
+buildPythonPackage rec {
+  pname = "pyasn";
+  version = "1.6.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-otVfs+5HlHYJ9QIRylsLrEEahvPJNfuSyksLirfGaP8=";
+  };
+
+  datasrc = fetchFromGitHub {
+    owner = "hadiasghari";
+    repo = "pyasn";
+    rev = version;
+    hash = "sha256-R7Vi1Mn44Mg3HQLDk9O43MkXXwbLRr/jjVKSHJvgYj0";
+  };
+
+  postInstall = ''
+    install -dm755 $out/${python.sitePackages}/pyasn/data
+    cp $datasrc/data/* $out/${python.sitePackages}/pyasn/data
+  '';
+
+  doCheck = false; # Tests require internet connection which wont work
+
+  pythonImportsCheck = [ "pyasn" ];
+
+  meta = with lib; {
+    description = "Offline IP address to Autonomous System Number lookup module";
+    homepage = "https://github.com/hadiasghari/pyasn";
+    license = with licenses; [ bsdOriginal mit ];
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyasn1-modules/default.nix b/nixpkgs/pkgs/development/python-modules/pyasn1-modules/default.nix
new file mode 100644
index 000000000000..7a0735269897
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyasn1-modules/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyasn1
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyasn1-modules";
+  version = "0.3.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pyasn1";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-AAS1VuppCIxgswpLSHFAc6q9cyJBLpdDuU9D1KU13vg=";
+  };
+
+  propagatedBuildInputs = [
+    pyasn1
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyasn1_modules"
+  ];
+
+  meta = with lib; {
+    description = "A collection of ASN.1-based protocols modules";
+    homepage = "https://github.com/pyasn1/pyasn1-modules";
+    changelog = "https://github.com/pyasn1/pyasn1-modules/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyasn1/default.nix b/nixpkgs/pkgs/development/python-modules/pyasn1/default.nix
new file mode 100644
index 000000000000..3888f66d776a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyasn1/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyasn1";
+  version = "0.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-l7cpDKaOYqgyVY7Dl28Vy/kRv118cDnYuGHCoOzmn94=";
+  };
+
+  pythonImportsCheck = [
+    "pyasn1"
+  ];
+
+  meta = with lib; {
+    description = "Generic ASN.1 library for Python";
+    homepage = "https://pyasn1.readthedocs.io";
+    changelog = "https://github.com/etingof/pyasn1/blob/master/CHANGES.rst";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyatag/default.nix b/nixpkgs/pkgs/development/python-modules/pyatag/default.nix
new file mode 100644
index 000000000000..47cbf5b6c797
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyatag/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pyatag";
+  version = "0.3.7.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "MatsNl";
+    repo = "pyatag";
+    rev = "refs/tags/${version}";
+    hash = "sha256-3h9mpopTbEULCx7rcEt/I/ZnUA0L/fJ7Y3L5h/6EuC4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyatag"
+    "pyatag.discovery"
+  ];
+
+  meta = with lib; {
+    description = "Python module to talk to Atag One";
+    homepage = "https://github.com/MatsNl/pyatag";
+    changelog = "https://github.com/MatsNl/pyatag/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyathena/default.nix b/nixpkgs/pkgs/development/python-modules/pyathena/default.nix
new file mode 100644
index 000000000000..6bb98d07f345
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyathena/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, boto3
+, botocore
+, buildPythonPackage
+, fastparquet
+, fetchPypi
+, fsspec
+, pandas
+, poetry-core
+, pyarrow
+, pythonOlder
+, sqlalchemy
+, tenacity
+}:
+
+buildPythonPackage rec {
+  pname = "pyathena";
+  version = "3.0.10";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-HvmD1Hi8GCwuox11v0/VdVQlmF5dpPjhgSNfLScz5TY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    boto3
+    botocore
+    fsspec
+    tenacity
+  ];
+
+  passthru.optional-dependencies = {
+    pandas = [
+      pandas
+    ];
+    sqlalchemy = [
+      sqlalchemy
+    ];
+    arrow = [
+      pyarrow
+    ];
+    fastparquet = [
+      fastparquet
+    ];
+  };
+
+  # Nearly all tests depend on a working AWS Athena instance,
+  # therefore deactivating them.
+  # https://github.com/laughingman7743/PyAthena/#testing
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyathena"
+  ];
+
+  meta = with lib; {
+    description = "Python DB API 2.0 (PEP 249) client for Amazon Athena";
+    homepage = "https://github.com/laughingman7743/PyAthena/";
+    changelog = "https://github.com/laughingman7743/PyAthena/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ turion ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyatmo/default.nix b/nixpkgs/pkgs/development/python-modules/pyatmo/default.nix
new file mode 100644
index 000000000000..5c37066ae9d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyatmo/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, oauthlib
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-oauthlib
+, requests-mock
+, setuptools-scm
+, time-machine
+}:
+
+buildPythonPackage rec {
+  pname = "pyatmo";
+  version = "7.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "jabesq";
+    repo = "pyatmo";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-rAmSxayXljOJchiMtSOgnotzQmapK2n86HwNi9HJX68=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    oauthlib
+    requests
+    requests-oauthlib
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+    requests-mock
+    time-machine
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "oauthlib~=3.1" "oauthlib" \
+      --replace "requests~=2.24" "requests"
+  '';
+
+  pythonImportsCheck = [
+    "pyatmo"
+  ];
+
+  meta = with lib; {
+    description = "Simple API to access Netatmo weather station data";
+    homepage = "https://github.com/jabesq/pyatmo";
+    changelog = "https://github.com/jabesq/pyatmo/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ delroth ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyatome/default.nix b/nixpkgs/pkgs/development/python-modules/pyatome/default.nix
new file mode 100644
index 000000000000..efc0a8ba554b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyatome/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, simplejson
+, fake-useragent
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyatome";
+  version = "0.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "pyAtome";
+    inherit version;
+    hash = "sha256-DGkgW6emh/esZa/alUjBbpLXlU4EVIPkysn9a0LgcJ4=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    simplejson
+    fake-useragent
+  ];
+
+  # No tests in PyPI tarballs
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyatome"
+  ];
+
+  meta = with lib; {
+    description = "Python module to get energy consumption data from Atome";
+    homepage = "https://github.com/baqs/pyAtome";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ uvnikita ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyatspi/default.nix b/nixpkgs/pkgs/development/python-modules/pyatspi/default.nix
new file mode 100644
index 000000000000..fb7fedeaefc5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyatspi/default.nix
@@ -0,0 +1,47 @@
+{ lib, fetchurl, pkg-config, buildPythonPackage, isPy3k, at-spi2-core, pygobject3, gnome, python }:
+
+buildPythonPackage rec {
+  pname = "pyatspi";
+  version = "2.46.0";
+  format = "other";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "1FSJzz1HqhULGjXolJs7MQNfjCB15YjSa278Yllwxi4=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [
+    at-spi2-core
+    pygobject3
+  ];
+
+  configureFlags = [
+    "PYTHON=${python.pythonOnBuildForHost.interpreter}"
+  ];
+
+  postPatch = ''
+    # useless python existence check for us
+    substituteInPlace configure \
+      --replace '&& ! which' '&& false'
+  '';
+
+  disabled = !isPy3k;
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = pname;
+      attrPath = "python3.pkgs.${pname}";
+      versionPolicy = "odd-unstable";
+    };
+  };
+
+  meta = with lib; {
+    description = "Python client bindings for D-Bus AT-SPI";
+    homepage = "https://wiki.linuxfoundation.org/accessibility/d-bus";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ jtojnar ];
+    platforms = with platforms; unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyatv/default.nix b/nixpkgs/pkgs/development/python-modules/pyatv/default.nix
new file mode 100644
index 000000000000..b5785dfd3f2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyatv/default.nix
@@ -0,0 +1,119 @@
+{ lib
+, buildPythonPackage
+, aiohttp
+, async-timeout
+, chacha20poly1305-reuseable
+, cryptography
+, deepdiff
+, fetchFromGitHub
+, ifaddr
+, mediafile
+, miniaudio
+, protobuf
+, pydantic
+, pyfakefs
+, pytest-aiohttp
+, pytest-asyncio
+, pytest-httpserver
+, pytest-timeout
+, pytestCheckHook
+, pythonRelaxDepsHook
+, pythonOlder
+, requests
+, setuptools
+, srptools
+, stdenv
+, tabulate
+, zeroconf
+}:
+
+buildPythonPackage rec {
+  pname = "pyatv";
+  version = "0.14.4";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "postlund";
+    repo = "pyatv";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-w3WOlZFfuCmekUsr8msi2LXTm6j8/Bk49L3MiYF7lOM=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest-runner" ""
+  '';
+
+  pythonRelaxDeps = [
+    "aiohttp"
+    "async_timeout"
+    "bitarray"
+    "chacha20poly1305-reuseable"
+    "cryptography"
+    "ifaddr"
+    "mediafile"
+    "miniaudio"
+    "protobuf"
+    "requests"
+    "srptools"
+    "zeroconf"
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    chacha20poly1305-reuseable
+    cryptography
+    ifaddr
+    mediafile
+    miniaudio
+    protobuf
+    pydantic
+    requests
+    srptools
+    tabulate
+    zeroconf
+  ];
+
+  nativeCheckInputs = [
+    deepdiff
+    pyfakefs
+    pytest-aiohttp
+    pytest-asyncio
+    pytest-httpserver
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals (stdenv.isDarwin) [
+    # tests/protocols/raop/test_raop_functional.py::test_stream_retransmission[raop_properties2-2-True] - assert False
+    "test_stream_retransmission"
+  ];
+
+  disabledTestPaths = [
+    # Test doesn't work in the sandbox
+    "tests/protocols/companion/test_companion_auth.py"
+    "tests/protocols/mrp/test_mrp_auth.py"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [
+    "pyatv"
+  ];
+
+  meta = with lib; {
+    description = "Python client library for the Apple TV";
+    homepage = "https://github.com/postlund/pyatv";
+    changelog = "https://github.com/postlund/pyatv/blob/v${version}/CHANGES.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyaudio/default.nix b/nixpkgs/pkgs/development/python-modules/pyaudio/default.nix
new file mode 100644
index 000000000000..048acc08e43d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyaudio/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "PyAudio";
+  version = "0.2.13";
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JrzMgeQkPRwP9Uh+a0gd5jKfzWXHk2XCZ87zjzY6K1Y=";
+  };
+
+  buildInputs = [ pkgs.portaudio ];
+
+  meta = with lib; {
+    description = "Python bindings for PortAudio";
+    homepage = "https://people.csail.mit.edu/hubert/pyaudio/";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyaussiebb/default.nix b/nixpkgs/pkgs/development/python-modules/pyaussiebb/default.nix
new file mode 100644
index 000000000000..1fcb88c0c77e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyaussiebb/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, loguru
+, pydantic
+, poetry-core
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyaussiebb";
+  version = "0.0.18";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "yaleman";
+    repo = "aussiebb";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-tEdddVsLFCHRvyLCctDakioiop2xWaJlfGE16P1ukHc=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    requests
+    loguru
+    pydantic
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'requests = "^2.27.1"' 'requests = "*"'
+  '';
+
+  # Tests require credentials and requests-testing
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aussiebb"
+  ];
+
+  meta = with lib; {
+    description = "Module for interacting with the Aussie Broadband APIs";
+    homepage = "https://github.com/yaleman/aussiebb";
+    changelog = "https://github.com/yaleman/pyaussiebb/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyautogui/default.nix b/nixpkgs/pkgs/development/python-modules/pyautogui/default.nix
new file mode 100644
index 000000000000..8443284964ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyautogui/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mouseinfo
+, pygetwindow
+, pymsgbox
+, pyperclip
+, pyscreeze
+, pytweening
+, tkinter
+, xlib
+, xvfb-run
+, scrot
+}:
+buildPythonPackage rec {
+  pname = "pyautogui";
+  version = "0.9.53";
+
+  src = fetchFromGitHub {
+    owner = "asweigart";
+    repo = "pyautogui";
+    rev = "5e4acb870f2e7ce0ea1927cc5188bc2f5ab7bbbc";
+    hash = "sha256-R9tcTqxUaqw63FLOGFRaO/Oz6kD7V6MPHdQ8A29NdXw=";
+  };
+
+  nativeCheckInputs = [ xvfb-run scrot ];
+  checkPhase = ''
+    xvfb-run python -c 'import pyautogui'
+    # The tests depend on some specific things that xvfb cant provide, like keyboard and mouse
+    # xvfb-run python -m unittest tests.test_pyautogui
+  '';
+
+  patches = [
+    # https://github.com/asweigart/pyautogui/issues/598
+    ./fix-locateOnWindow-and-xlib.patch
+  ];
+
+  propagatedBuildInputs = [
+    mouseinfo
+    pygetwindow
+    pymsgbox
+    xlib
+    tkinter
+    pyperclip
+    pyscreeze
+    pytweening
+  ];
+
+  meta = with lib; {
+    description = "PyAutoGUI lets Python control the mouse and keyboard, and other GUI automation tasks.";
+    homepage = "https://github.com/asweigart/pyautogui";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ lucasew ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyautogui/fix-locateOnWindow-and-xlib.patch b/nixpkgs/pkgs/development/python-modules/pyautogui/fix-locateOnWindow-and-xlib.patch
new file mode 100644
index 000000000000..ef0c02892238
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyautogui/fix-locateOnWindow-and-xlib.patch
@@ -0,0 +1,30 @@
+diff --git a/pyautogui/__init__.py b/pyautogui/__init__.py
+index ec7d097..443b146 100644
+--- a/pyautogui/__init__.py
++++ b/pyautogui/__init__.py
+@@ -216,9 +216,9 @@ try:
+ 
+     @raisePyAutoGUIImageNotFoundException
+     def locateOnWindow(*args, **kwargs):
+-        return pyscreeze.locateOnWindow(*args, **kwargs)
++        return pyscreeze.locateOnScreen(*args, **kwargs)
+ 
+-    locateOnWindow.__doc__ = pyscreeze.locateOnWindow.__doc__
++    locateOnWindow.__doc__ = pyscreeze.locateOnScreen.__doc__
+ 
+ 
+ except ImportError:
+diff --git a/setup.py b/setup.py
+index 196394d..6d90a88 100644
+--- a/setup.py
++++ b/setup.py
+@@ -29,8 +29,7 @@ setup(
+     test_suite='tests',
+     install_requires=['pyobjc-core;platform_system=="Darwin"',
+                       'pyobjc;platform_system=="Darwin"',
+-                      'python3-Xlib;platform_system=="Linux" and python_version>="3.0"',
+-                      'python-xlib;platform_system=="Linux" and python_version<"3.0"',
++                      'python-xlib;platform_system=="Linux"',
+                       'pymsgbox',
+                       'PyTweening>=1.0.1',
+                       'pyscreeze>=0.1.21',
diff --git a/nixpkgs/pkgs/development/python-modules/pyavm/default.nix b/nixpkgs/pkgs/development/python-modules/pyavm/default.nix
new file mode 100644
index 000000000000..ec95e2de171f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyavm/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, astropy
+, astropy-helpers
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "pyavm";
+  version = "0.9.5";
+
+  src = fetchPypi {
+    pname = "PyAVM";
+    inherit version;
+    hash = "sha256-gV78ypvYwohHmdjP3lN5F97PfmxuV91tvw5gsYeZ7i8=";
+  };
+
+  propagatedBuildInputs = [
+    astropy-helpers
+  ];
+
+  nativeCheckInputs = [
+    astropy
+    pillow
+    pytestCheckHook
+  ];
+
+  # Disable automatic update of the astropy-helper module
+  postPatch = ''
+    substituteInPlace setup.cfg --replace "auto_use = True" "auto_use = False"
+  '';
+
+  pythonImportsCheck = [ "pyavm" ];
+
+  meta = with lib; {
+    description = "Simple pure-python AVM meta-data handling";
+    homepage = "https://astrofrog.github.io/pyavm/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ smaret ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyaxmlparser/default.nix b/nixpkgs/pkgs/development/python-modules/pyaxmlparser/default.nix
new file mode 100644
index 000000000000..99aef4c985af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyaxmlparser/default.nix
@@ -0,0 +1,25 @@
+{ buildPythonPackage, lib, lxml, click, fetchFromGitHub, pytestCheckHook, asn1crypto }:
+
+buildPythonPackage rec {
+  version = "0.3.27";
+  pname = "pyaxmlparser";
+
+  src = fetchFromGitHub {
+    owner = "appknox";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-NtAsO/I1jDEv676yhAgLguQnB/kHdAqPoLt2QFWbvmw=";
+  };
+
+  propagatedBuildInputs = [ asn1crypto click lxml ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Python3 Parser for Android XML file and get Application Name without using Androguard";
+    homepage = "https://github.com/appknox/pyaxmlparser";
+    # Files from Androguard are licensed ASL 2.0
+    license = with licenses; [ mit asl20 ];
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pybalboa/default.nix b/nixpkgs/pkgs/development/python-modules/pybalboa/default.nix
new file mode 100644
index 000000000000..38435c6d22b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybalboa/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "pybalboa";
+  version = "1.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "garbled1";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-7vjdRGnEnMf32pZwoKRxX16hxkyf0CXlncpbBJMQtfI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pybalboa"
+  ];
+
+  meta = with lib; {
+    description = " Python module to interface with a Balboa Spa";
+    homepage = "https://github.com/garbled1/pybalboa";
+    changelog = "https://github.com/garbled1/pybalboa/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pybars3/default.nix b/nixpkgs/pkgs/development/python-modules/pybars3/default.nix
new file mode 100644
index 000000000000..ad7294fd6358
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybars3/default.nix
@@ -0,0 +1,38 @@
+{ python3
+, fetchPypi
+, lib
+, pymeta3
+, buildPythonPackage
+}:
+buildPythonPackage rec {
+  pname = "pybars3";
+  version = "0.9.7";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ashH6QXlO5xbk2rxEskQR14nv3Z/efRSjBb5rx7A4lI=";
+  };
+
+  propagatedBuildInputs = [
+    pymeta3
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python3.interpreter} tests.py
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "pybars"
+  ];
+
+  meta = with lib; {
+    description = "Handlebars.js template support for Python 3 and 2";
+    homepage = "https://github.com/wbond/pybars3";
+    changelog = "https://github.com/wbond/pybars3/releases/tag/${version}";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ jfly matusf ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pybase64/default.nix b/nixpkgs/pkgs/development/python-modules/pybase64/default.nix
new file mode 100644
index 000000000000..d94cdf524d20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybase64/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pybase64";
+  version = "1.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-I0CC/dcDnLdQxkTi03/Ck+c0XqOl8nmrrC9PyWLZuZY=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pybase64"
+  ];
+
+  meta = with lib; {
+    description = "Fast Base64 encoding/decoding";
+    homepage = "https://github.com/mayeut/pybase64";
+    changelog = "https://github.com/mayeut/pybase64/releases/tag/v${version}";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pybids/default.nix b/nixpkgs/pkgs/development/python-modules/pybids/default.nix
new file mode 100644
index 000000000000..ec62c32a1079
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybids/default.nix
@@ -0,0 +1,63 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, fetchpatch
+, formulaic
+, click
+, num2words
+, numpy
+, scipy
+, pandas
+, nibabel
+, patsy
+, bids-validator
+, sqlalchemy
+, pytestCheckHook
+, versioneer
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  version = "0.16.3";
+  pname = "pybids";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-EOJ5NQyNFMpgLA1EaaXkv3/zk+hkPIMaVGrnNba4LMM=";
+  };
+
+  nativeBuildInputs = [ pythonRelaxDepsHook ];
+
+  pythonRelaxDeps = [ "sqlalchemy" ];
+
+  propagatedBuildInputs = [
+    click
+    formulaic
+    num2words
+    numpy
+    scipy
+    pandas
+    nibabel
+    patsy
+    bids-validator
+    sqlalchemy
+    versioneer
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [ "bids" ];
+  disabledTests = [
+    # looks for missing data:
+    "test_config_filename"
+    # regression associated with formulaic >= 0.6.0
+    # (see https://github.com/bids-standard/pybids/issues/1000)
+    "test_split"
+  ];
+
+  meta = with lib; {
+    description = "Python tools for querying and manipulating BIDS datasets";
+    homepage = "https://github.com/bids-standard/pybids";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pybigwig/default.nix b/nixpkgs/pkgs/development/python-modules/pybigwig/default.nix
new file mode 100644
index 000000000000..efbc350530e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybigwig/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, pytestCheckHook
+, pythonOlder
+, zlib
+}:
+
+buildPythonPackage rec {
+  pname = "pybigwig";
+  version = "0.3.22";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "deeptools";
+    repo = "pyBigWig";
+    rev = "refs/tags/${version}";
+    hash = "sha256-wJC5eXIC9PNlbCtmq671WuoIJVkh3aX7K6WArJWjyFg=";
+  };
+
+  buildInputs = [
+    zlib
+  ];
+
+  nativeCheckInputs = [
+    numpy
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyBigWig"
+  ];
+
+  pytestFlagsArray = [
+    "pyBigWigTest/test*.py"
+  ];
+
+  disabledTests = [
+    # Test file is donwloaded from GitHub
+    "testAll"
+    "testBigBed"
+    "testFoo"
+    "testNumpyValues"
+  ];
+
+  meta = with lib; {
+    description = "File access to bigBed files, and read and write access to bigWig files";
+    longDescription = ''
+      A Python extension, written in C, for quick access to bigBed files
+      and access to and creation of bigWig files. This extension uses
+      libBigWig for local and remote file access.
+    '';
+    homepage = "https://github.com/deeptools/pyBigWig";
+    changelog = "https://github.com/deeptools/pyBigWig/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ scalavision ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pybind11/default.nix b/nixpkgs/pkgs/development/python-modules/pybind11/default.nix
new file mode 100644
index 000000000000..9eeb40225cab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybind11/default.nix
@@ -0,0 +1,125 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, cmake
+, boost
+, eigen
+, python
+, catch
+, numpy
+, pytestCheckHook
+, libxcrypt
+, makeSetupHook
+}: let
+  setupHook = makeSetupHook {
+    name = "pybind11-setup-hook";
+    substitutions = {
+      out = placeholder "out";
+      pythonInterpreter = python.pythonOnBuildForHost.interpreter;
+      pythonIncludeDir = "${python}/include/python${python.pythonVersion}";
+      pythonSitePackages = "${python}/${python.sitePackages}";
+    };
+  } ./setup-hook.sh;
+
+  # clang 16 defaults to C++17, which results in the use of aligned allocations by pybind11.
+  # libc++ supports aligned allocations via `posix_memalign`, which is available since 10.6,
+  # but clang has a check hard-coded requiring 10.13 because that’s when Apple first shipped a
+  # support for C++17 aligned allocations on macOS.
+  # Tell clang we’re targeting 10.13 on x86_64-darwin while continuing to use the default SDK.
+  stdenv' = if stdenv.isDarwin && stdenv.isx86_64
+    then python.stdenv.override (oldStdenv: {
+      buildPlatform = oldStdenv.buildPlatform // { darwinMinVersion = "10.13"; };
+      targetPlatform = oldStdenv.targetPlatform // { darwinMinVersion = "10.13"; };
+      hostPlatform = oldStdenv.hostPlatform // { darwinMinVersion = "10.13"; };
+    })
+    else python.stdenv;
+in buildPythonPackage rec {
+  pname = "pybind11";
+  version = "2.11.1";
+
+  src = fetchFromGitHub {
+    owner = "pybind";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-sO/Fa+QrAKyq2EYyYMcjPrYI+bdJIrDoj6L3JHoDo3E=";
+  };
+
+  postPatch = ''
+    sed -i "/^timeout/d" pyproject.toml
+  '';
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = lib.optionals (pythonOlder "3.9") [ libxcrypt ];
+  propagatedBuildInputs = [ setupHook ];
+
+  stdenv = stdenv';
+
+  dontUseCmakeBuildDir = true;
+
+  # Don't build tests if not needed, read the doInstallCheck value at runtime
+  preConfigure = ''
+    if [ -n "$doInstallCheck" ]; then
+      cmakeFlagsArray+=("-DBUILD_TESTING=ON")
+    fi
+  '';
+
+  cmakeFlags = [
+    "-DBoost_INCLUDE_DIR=${lib.getDev boost}/include"
+    "-DEIGEN3_INCLUDE_DIR=${lib.getDev eigen}/include/eigen3"
+  ] ++ lib.optionals (python.isPy3k && !stdenv.cc.isClang) [
+    "-DPYBIND11_CXX_STANDARD=-std=c++17"
+  ];
+
+  postBuild = ''
+    # build tests
+    make -j $NIX_BUILD_CORES
+  '';
+
+  postInstall = ''
+    make install
+    # Symlink the CMake-installed headers to the location expected by setuptools
+    mkdir -p $out/include/${python.libPrefix}
+    ln -sf $out/include/pybind11 $out/include/${python.libPrefix}/pybind11
+  '';
+
+  nativeCheckInputs = [
+    catch
+    numpy
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # require dependencies not available in nixpkgs
+    "tests/test_embed/test_trampoline.py"
+    "tests/test_embed/test_interpreter.py"
+    # numpy changed __repr__ output of numpy dtypes
+    "tests/test_numpy_dtypes.py"
+    # no need to test internal packaging
+    "tests/extra_python_package/test_files.py"
+    # tests that try to parse setuptools stdout
+    "tests/extra_setuptools/test_setuphelper.py"
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # expects KeyError, gets RuntimeError
+    # https://github.com/pybind/pybind11/issues/4243
+    "test_cross_module_exception_translator"
+  ];
+
+  hardeningDisable = lib.optional stdenv.hostPlatform.isMusl "fortify";
+
+  meta = with lib; {
+    homepage = "https://github.com/pybind/pybind11";
+    changelog = "https://github.com/pybind/pybind11/blob/${src.rev}/docs/changelog.rst";
+    description = "Seamless operability between C++11 and Python";
+    longDescription = ''
+      Pybind11 is a lightweight header-only library that exposes
+      C++ types in Python and vice versa, mainly to create Python
+      bindings of existing C++ code.
+    '';
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ yuriaisaka dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pybind11/setup-hook.sh b/nixpkgs/pkgs/development/python-modules/pybind11/setup-hook.sh
new file mode 100644
index 000000000000..a86eed36f1ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybind11/setup-hook.sh
@@ -0,0 +1,12 @@
+# Tell the pybind11 CMake module where to find host platform Python. This is
+# required when cross-compiling.
+pybind11CMakeFlags () {
+  cmakeFlagsArray+=(
+    '-DPYBIND11_PYTHONLIBS_OVERWRITE=OFF'
+    '-DPYTHON_EXECUTABLE=@pythonInterpreter@'
+    '-DPYTHON_INCLUDE_DIR=@pythonIncludeDir@'
+    '-DPYTHON_SITE_PACKAGES=@pythonSitePackages@'
+  )
+}
+
+preConfigureHooks+=(pybind11CMakeFlags)
diff --git a/nixpkgs/pkgs/development/python-modules/pybindgen/default.nix b/nixpkgs/pkgs/development/python-modules/pybindgen/default.nix
new file mode 100644
index 000000000000..a7a5de92e9e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybindgen/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, pygccxml
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pybindgen";
+  version = "0.22.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "PyBindGen";
+    inherit version;
+    hash = "sha256-jH8iORpJqEUY9aKtBuOlseg50Q402nYxUZyKKPy6N2Q=";
+  };
+
+  buildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pygccxml
+  ];
+
+  pythonImportsCheck = [
+    "pybindgen"
+  ];
+
+  # Fails to import module 'cxxfilt' from pygccxml on Py3k
+  doCheck = (!isPy3k);
+
+  meta = with lib; {
+    description = "Python Bindings Generator";
+    homepage = "https://github.com/gjcarneiro/pybindgen";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ teto ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyblackbird/default.nix b/nixpkgs/pkgs/development/python-modules/pyblackbird/default.nix
new file mode 100644
index 000000000000..e710ccb21480
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyblackbird/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+, pyserial-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyblackbird";
+  version = "0.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "koolsb";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-+ehzrr+RrwFKOOuxBq3+mwnuMPxZFV4QTZG1IRgsbLc=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+    pyserial-asyncio
+  ];
+
+  # Test setup try to create a serial port
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyblackbird"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation for Monoprice Blackbird units";
+    homepage = "https://github.com/koolsb/pyblackbird";
+    changelog = "https://github.com/koolsb/pyblackbird/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pybloom-live/default.nix b/nixpkgs/pkgs/development/python-modules/pybloom-live/default.nix
new file mode 100644
index 000000000000..0499350a7c82
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybloom-live/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, bitarray
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, wheel
+, xxhash
+}:
+
+buildPythonPackage rec {
+  pname = "pybloom-live";
+  version = "4.0.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "pybloom_live";
+    inherit version;
+    hash = "sha256-mVRcXTsFvTiLVJHja4I7cGgwpoa6GLTBkGPQjeUyERA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    bitarray
+    xxhash
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pybloom_live"
+  ];
+
+  meta = with lib; {
+    description = "A Probabilistic data structure";
+    homepage = "https://github.com/joseph-fox/python-bloomfilter";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pybluez/default.nix b/nixpkgs/pkgs/development/python-modules/pybluez/default.nix
new file mode 100644
index 000000000000..55262a07a4ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybluez/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, bluez
+, gattlib
+}:
+
+buildPythonPackage rec {
+  pname = "pybluez";
+  version = "unstable-2022-01-28";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "5096047f90a1f6a74ceb250aef6243e144170f92";
+    hash = "sha256-GA58DfCFaVzZQA1HYpGQ68bznrt4SX1ojyOVn8hyCGo=";
+  };
+
+  buildInputs = [
+    bluez
+  ];
+
+  propagatedBuildInputs = [
+    gattlib
+  ];
+
+  # there are no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "bluetooth"
+    "bluetooth.ble"
+  ];
+
+  meta = with lib; {
+    description = "Bluetooth Python extension module";
+    homepage = "https://github.com/pybluez/pybluez";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ leenaars ];
+    broken = stdenv.isDarwin; # requires pyobjc-core, pyobjc-framework-Cocoa
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pybotvac/default.nix b/nixpkgs/pkgs/development/python-modules/pybotvac/default.nix
new file mode 100644
index 000000000000..a104e1e1aeb7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybotvac/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+, requests-oauthlib
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "pybotvac";
+  version = "0.0.24";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-SXIs9AUXWm1H49MVDT4z6msNPaW5sAU20rcsWZ7ERdU=";
+  };
+
+  patches = [
+    ./urllib3-2.0-compat.patch
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    requests-oauthlib
+    voluptuous
+  ];
+
+  # Module no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pybotvac"
+  ];
+
+  meta = with lib; {
+    description = "Python module for interacting with Neato Botvac Connected vacuum robots";
+    homepage = "https://github.com/stianaske/pybotvac";
+    changelog = "https://github.com/stianaske/pybotvac/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pybotvac/urllib3-2.0-compat.patch b/nixpkgs/pkgs/development/python-modules/pybotvac/urllib3-2.0-compat.patch
new file mode 100644
index 000000000000..8b6ef4e91cc3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybotvac/urllib3-2.0-compat.patch
@@ -0,0 +1,21 @@
+diff --git a/pybotvac/robot.py b/pybotvac/robot.py
+index f87546f..e9a61de 100644
+--- a/pybotvac/robot.py
++++ b/pybotvac/robot.py
+@@ -6,7 +6,6 @@ from datetime import datetime, timezone
+ from email.utils import format_datetime

+ 

+ import requests

+-import urllib3

+ from voluptuous import (

+     ALLOW_EXTRA,

+     All,

+@@ -21,8 +20,6 @@ from voluptuous import (
+ from .exceptions import NeatoRobotException, NeatoUnsupportedDevice

+ from .neato import Neato  # For default Vendor argument

+ 

+-# Disable warning due to SubjectAltNameWarning in certificate

+-urllib3.disable_warnings(urllib3.exceptions.SubjectAltNameWarning)

+ 

+ _LOGGER = logging.getLogger(__name__)

+ 

diff --git a/nixpkgs/pkgs/development/python-modules/pybox2d/default.nix b/nixpkgs/pkgs/development/python-modules/pybox2d/default.nix
new file mode 100644
index 000000000000..c7a8e7d83ebf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybox2d/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, swig
+}:
+
+buildPythonPackage rec {
+  pname = "pybox2d";
+  version = "2.3.10";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "pybox2d";
+    repo = "pybox2d";
+    rev = "refs/tags/${version}";
+    hash = "sha256-yjLFvsg8GQLxjN1vtZM9zl+kAmD4+eS/vzRkpj0SCjY=";
+  };
+
+  nativeBuildInputs = [
+    swig
+  ];
+
+  # We need to build the package explicitly a first time so that the library/Box2D/Box2D.py file
+  # gets generated.
+  # After that, the default behavior will succeed at installing the package.
+  preBuild = ''
+    python setup.py build
+  '';
+
+  pythonImportsCheck = [
+    "Box2D"
+    "Box2D._Box2D"
+  ];
+
+  # Tests need to start GUI windows.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "2D Game Physics for Python";
+    homepage = "https://github.com/pybox2d/pybox2d";
+    license = licenses.zlib;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pybravia/default.nix b/nixpkgs/pkgs/development/python-modules/pybravia/default.nix
new file mode 100644
index 000000000000..b738d3adf01e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybravia/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pybravia";
+  version = "0.3.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Drafteed";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Ux9EereKKbgaVQORliW6J5FSBlytLM+m4PVFBk+OW6k=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pybravia"
+  ];
+
+  meta = with lib; {
+    description = "Library for remote control of Sony Bravia TVs 2013 and newer";
+    homepage = "https://github.com/Drafteed/pybravia";
+    changelog = "https://github.com/Drafteed/pybravia/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pybrowserid/default.nix b/nixpkgs/pkgs/development/python-modules/pybrowserid/default.nix
new file mode 100644
index 000000000000..23906cbd2e4e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybrowserid/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi
+, requests, mock }:
+
+buildPythonPackage rec {
+  pname = "PyBrowserID";
+  version = "0.14.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1qvi79kfb8x9kxkm5lw2mp42hm82cpps1xknmsb5ghkwx1lpc8kc";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  nativeCheckInputs = [ mock ];
+
+  meta = with lib; {
+    description = "Python library for the BrowserID Protocol";
+    homepage    = "https://github.com/mozilla/PyBrowserID";
+    license     = licenses.mpl20;
+    maintainers = with maintainers; [ ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/pybtex-docutils/default.nix b/nixpkgs/pkgs/development/python-modules/pybtex-docutils/default.nix
new file mode 100644
index 000000000000..b2c05f73bc63
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybtex-docutils/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, docutils
+, fetchPypi
+, pybtex
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pybtex-docutils";
+  version = "1.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-On69+StZPgDowcU4qpogvKXZLYQjESRxWsyWTVHZPGs=";
+  };
+
+  buildInputs = [
+    docutils
+    pybtex
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pybtex_docutils"
+  ];
+
+  meta = with lib; {
+    description = "A docutils backend for pybtex";
+    homepage = "https://github.com/mcmtroffaes/pybtex-docutils";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pybtex/default.nix b/nixpkgs/pkgs/development/python-modules/pybtex/default.nix
new file mode 100644
index 000000000000..2e178163c105
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybtex/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, latexcodec
+, pyyaml
+, setuptools
+}:
+
+buildPythonPackage rec {
+  version = "0.24.0";
+  pname = "pybtex";
+
+  doCheck = false;
+  pythonImportsCheck = [ "pybtex" ];
+
+  propagatedBuildInputs = [
+    latexcodec
+    pyyaml
+    setuptools
+  ];
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "818eae35b61733e5c007c3fcd2cfb75ed1bc8b4173c1f70b56cc4c0802d34755";
+  };
+
+  meta = with lib; {
+    homepage = "https://pybtex.org/";
+    description = "A BibTeX-compatible bibliography processor written in Python";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pybullet/default.nix b/nixpkgs/pkgs/development/python-modules/pybullet/default.nix
new file mode 100644
index 000000000000..4e9e848070f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybullet/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, libGLU, libGL
+, xorg
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "pybullet";
+  version = "3.2.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-G8ua+4eghr4bLeGPCE0f2rgZTaG/cfJkdDyia6o5w1E=";
+  };
+
+  buildInputs = [
+    libGLU libGL
+    xorg.libX11
+  ];
+
+  propagatedBuildInputs =  [ numpy ];
+
+  patches = [
+    # make sure X11 and OpenGL can be found at runtime
+    ./static-libs.patch
+  ];
+
+  meta = with lib; {
+    description = "Open-source software for robot simulation, integrated with OpenAI Gym";
+    homepage = "https://pybullet.org/";
+    license = licenses.zlib;
+    maintainers = with maintainers; [ timokau ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pybullet/static-libs.patch b/nixpkgs/pkgs/development/python-modules/pybullet/static-libs.patch
new file mode 100644
index 000000000000..8b58e3659e05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pybullet/static-libs.patch
@@ -0,0 +1,13 @@
+diff --git a/setup.py b/setup.py
+index 6f7bd7589..321fc6ab0 100644
+--- a/setup.py
++++ b/setup.py
+@@ -465,6 +465,8 @@ print("-----")
+ 
+ extensions = []
+ 
++libraries += [ "X11", "GL" ] # statically link x11 and opengl
++
+ pybullet_ext = Extension(
+     "pybullet",
+     sources=sources,
diff --git a/nixpkgs/pkgs/development/python-modules/pycairo/default.nix b/nixpkgs/pkgs/development/python-modules/pycairo/default.nix
new file mode 100644
index 000000000000..6aa58056cad9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycairo/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, pythonOlder
+, fetchFromGitHub
+, meson
+, ninja
+, buildPythonPackage
+, pytestCheckHook
+, pkg-config
+, cairo
+, libxcrypt
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "pycairo";
+  version = "1.24.0";
+
+  disabled = pythonOlder "3.6";
+
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "pygobject";
+    repo = "pycairo";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-eAE0YPZAV90MP6g1V1T80suaRV15ts38kYt6Djb78Xk=";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+  ];
+
+  buildInputs = [
+    cairo
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    libxcrypt
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  mesonFlags = [
+    # This is only used for figuring out what version of Python is in
+    # use, and related stuff like figuring out what the install prefix
+    # should be, but it does need to be able to execute Python code.
+    "-Dpython=${python.pythonOnBuildForHost.interpreter}"
+  ];
+
+  meta = with lib; {
+    description = "Python 3 bindings for cairo";
+    homepage = "https://pycairo.readthedocs.io/";
+    license = with licenses; [ lgpl21Only mpl11 ];
+    platforms = lib.platforms.linux ++ lib.platforms.darwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycangjie/default.nix b/nixpkgs/pkgs/development/python-modules/pycangjie/default.nix
new file mode 100644
index 000000000000..5fd7e130c248
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycangjie/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, fetchFromGitHub
+, bash
+, autoconf
+, automake
+, libtool
+, pkg-config
+, libcangjie
+, sqlite
+, buildPythonPackage
+, cython
+}:
+
+buildPythonPackage {
+  pname = "pycangjie";
+  version = "unstable-2015-05-03";
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "Cangjians";
+    repo = "pycangjie";
+    rev = "361bb413203fd43bab624d98edf6f7d20ce6bfd3";
+    hash = "sha256-sS0Demzm89WtEIN4Efz0OTsUQ/c3gIX+/koekQGOca4=";
+  };
+
+  nativeBuildInputs = [ pkg-config libtool autoconf automake cython ];
+  buildInputs = [ libcangjie sqlite ];
+
+  preConfigure = ''
+    find . -name '*.sh' -exec sed -e 's@#!/bin/bash@${bash}/bin/bash@' -i '{}' ';'
+    sed -i 's@/usr@${libcangjie}@' tests/__init__.py
+  '';
+
+  configureScript = "./autogen.sh";
+
+  doCheck = true;
+
+  meta = with lib; {
+    description = "Python wrapper to libcangjie";
+    homepage = "http://cangjians.github.io/projects/pycangjie/";
+    license = licenses.lgpl3Plus;
+    maintainers = [ maintainers.linquize ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycapnp/default.nix b/nixpkgs/pkgs/development/python-modules/pycapnp/default.nix
new file mode 100644
index 000000000000..b18fa3b3fc7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycapnp/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, capnproto
+, cython
+, fetchFromGitHub
+, isPy27
+, isPyPy
+, pkgconfig
+}:
+
+buildPythonPackage rec {
+  pname = "pycapnp";
+  version = "1.1.0";
+  disabled = isPyPy || isPy27;
+
+  src = fetchFromGitHub {
+    owner = "capnproto";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1xi6df93ggkpmwckwbi356v7m32zv5qry8s45hvsps66dz438kmi";
+  };
+
+  nativeBuildInputs = [ cython pkgconfig ];
+
+  buildInputs = [ capnproto ];
+
+  # Tests depend on schema_capnp which fails to generate
+  doCheck = false;
+
+  pythonImportsCheck = [ "capnp" ];
+
+  meta = with lib; {
+    homepage = "https://capnproto.github.io/pycapnp/";
+    maintainers = with maintainers; [ ];
+    license = licenses.bsd2;
+    # No support for capnproto 1.0 yet
+    # https://github.com/capnproto/pycapnp/issues/323
+    broken = lib.versionAtLeast capnproto.version "1.0";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycaption/default.nix b/nixpkgs/pkgs/development/python-modules/pycaption/default.nix
new file mode 100644
index 000000000000..db90dcce9492
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycaption/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, beautifulsoup4
+, lxml
+, cssutils
+, nltk
+, pytest-lazy-fixture
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pycaption";
+  version = "2.2.0";
+
+  disabled = pythonOlder "3.6";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-W/sD/Nh2k1z7YvFVnQB9dGa1bXoCTb4QrPk/1mi4Hdk=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    lxml
+    cssutils
+  ];
+
+  passthru.optional-dependencies = {
+    transcript = [ nltk ];
+  };
+
+  nativeCheckInputs = [
+    pytest-lazy-fixture
+    pytestCheckHook
+  ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    changelog = "https://github.com/pbs/pycaption/blob/${version}/docs/changelog.rst";
+    description = "Closed caption converter";
+    homepage = "https://github.com/pbs/pycaption";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycardano/default.nix b/nixpkgs/pkgs/development/python-modules/pycardano/default.nix
new file mode 100644
index 000000000000..118e4ed66b5e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycardano/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+# Python deps
+, blockfrost-python
+, cachetools
+, cbor2
+, cose
+, ecpy
+, frozendict
+, frozenlist
+, mnemonic
+, poetry-core
+, pprintpp
+, pynacl
+, setuptools
+, typeguard
+, websocket-client
+}:
+
+let
+  cose_0_9_dev8 = cose.overridePythonAttrs (old: rec {
+    version = "0.9.dev8";
+    src = (old.src.override {
+      rev = "v${version}";
+      hash = "sha256-/jwq2C2nvHInsgPG4jZCr+XsvlUJdYewAkasrUPVaHM=";
+    });
+    pythonImportsCheck = [ "cose" ];
+  });
+
+in buildPythonPackage rec {
+  pname = "pycardano";
+  version = "0.10.0";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "Python-Cardano";
+    repo = "pycardano";
+    rev = "v${version}";
+    hash = "sha256-LP/W8IC2del476fGFq10VMWwMrbAoCCcZOngA8unBM0=";
+  };
+
+  propagatedBuildInputs = [
+    blockfrost-python
+    cachetools
+    cbor2
+    cose_0_9_dev8
+    ecpy
+    frozendict
+    frozenlist
+    mnemonic
+    poetry-core
+    pprintpp
+    pynacl
+    setuptools
+    typeguard
+    websocket-client
+  ];
+
+  pythonImportsCheck = [ "pycardano" ];
+
+  meta = with lib; {
+    description = "A lightweight Cardano library in Python";
+    homepage = "https://github.com/Python-Cardano/pycardano";
+    license = licenses.mit;
+    maintainers = with maintainers; [ t4ccer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycares/default.nix b/nixpkgs/pkgs/development/python-modules/pycares/default.nix
new file mode 100644
index 000000000000..84a7cbe1ba42
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycares/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, aiodns
+, buildPythonPackage
+, c-ares
+, cffi
+, fetchPypi
+, idna
+, pythonOlder
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "pycares";
+  version = "4.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xUJpb22sl46dmRkjhHRaZfgKfZRQUBFR5KdWPgYBDUU=";
+  };
+
+  buildInputs = [
+    c-ares
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+    idna
+  ];
+
+  propagatedNativeBuildInputs = [
+    cffi
+  ];
+
+  # Requires network access
+  doCheck = false;
+
+  passthru.tests = {
+    inherit aiodns tornado;
+  };
+
+  pythonImportsCheck = [
+    "pycares"
+  ];
+
+  meta = with lib; {
+    description = "Python interface for c-ares";
+    homepage = "https://github.com/saghul/pycares";
+    changelog = "https://github.com/saghul/pycares/releases/tag/pycares-${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycarwings2/default.nix b/nixpkgs/pkgs/development/python-modules/pycarwings2/default.nix
new file mode 100644
index 000000000000..0158e2c01856
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycarwings2/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, iso8601
+, requests
+, pycryptodome
+}:
+
+buildPythonPackage rec {
+  pname = "pycarwings2";
+  version = "2.14";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "filcole";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-kqj/NZXqgPUsOnnzMPmIlICHek7RBxksmL3reNBK+bo=";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+    iso8601
+    requests
+    pycryptodome
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'" ""
+    substituteInPlace setup.cfg \
+      --replace " --flake8 --cov=pycarwings2 --cache-clear --ignore=venv --verbose" ""
+  '';
+
+  disabledTests = [
+    # Test requires network access
+    "test_bad_password"
+  ];
+
+  pythonImportsCheck = [
+    "pycarwings2"
+  ];
+
+  meta = with lib; {
+    description = "Python library for interacting with the NissanConnect EV";
+    homepage = "https://github.com/filcole/pycarwings2";
+    changelog = "https://github.com/filcole/pycarwings2/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycatch22/default.nix b/nixpkgs/pkgs/development/python-modules/pycatch22/default.nix
new file mode 100644
index 000000000000..c82088d9adbe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycatch22/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pandas
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pycatch22";
+  version = "0.4.4";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "DynamicsAndNeuralSystems";
+    repo = "pycatch22";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-l41LLo9k075EL8rV48bwa4Yw12XuqNJSDYtd9kyqS3U=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pandas
+  ];
+
+  # This packages does not have real tests
+  # But we can run this file as smoketest
+  checkPhase = ''
+    runHook preCheck
+
+    python tests/testing.py
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "pycatch22"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of catch22";
+    homepage = "https://github.com/DynamicsAndNeuralSystems/pycatch22";
+    changelog = "https://github.com/DynamicsAndNeuralSystems/pycatch22/releases/tag/v${version}";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycategories/default.nix b/nixpkgs/pkgs/development/python-modules/pycategories/default.nix
new file mode 100644
index 000000000000..6586f598ca0a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycategories/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, callPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pycategories";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vXDstelOdlnlZOoVPwx2cykdw3xSbCRoAPwI1sU3gJk=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'," ""
+    substituteInPlace setup.cfg \
+      --replace "--cov-report term --cov=categories" ""
+  '';
+
+  # Is private because the author states it's unmaintained
+  # and shouldn't be used in production code
+  propagatedBuildInputs = [ (callPackage ./infix.nix { }) ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Implementation of some concepts from category theory";
+    homepage = "https://gitlab.com/danielhones/pycategories";
+    changelog = "https://gitlab.com/danielhones/pycategories/-/blob/v${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dmvianna ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycategories/infix.nix b/nixpkgs/pkgs/development/python-modules/pycategories/infix.nix
new file mode 100644
index 000000000000..f3b4d2548181
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycategories/infix.nix
@@ -0,0 +1,23 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "infix";
+  version = "1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a1bfdcf875bc072f41e426d0673f2e3017750743bb90cc725fffb292eb09648c";
+  };
+
+  # No tests
+  doCheck = false;
+
+  meta = {
+    homepage = "https://github.com/borntyping/python-infix";
+    description = "A decorator that allows functions to be used as infix functions";
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycddl/default.nix b/nixpkgs/pkgs/development/python-modules/pycddl/default.nix
new file mode 100644
index 000000000000..9cd2d1fab202
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycddl/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, pythonOlder
+, fetchPypi
+, buildPythonPackage
+, rustPlatform
+, pytestCheckHook
+, psutil
+, cbor2
+}:
+
+buildPythonPackage rec {
+  pname = "pycddl";
+  version = "0.5.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-LdecJPSov2Y/QI4MWb20DcF0EtMuDO0VwiQDUeD55GI=";
+  };
+
+  nativeBuildInputs = with rustPlatform; [ maturinBuildHook cargoSetupHook ];
+
+  postPatch = ''
+    # We don't place pytest-benchmark in the closure because we have no
+    # intention of running the benchmarks.  Make sure pip doesn't fail as a
+    # result of it being missing by removing it from the requirements list.
+    sed -i -e /pytest-benchmark/d requirements-dev.txt
+
+    # Now that we've gotten rid of pytest-benchmark we need to get rid of the
+    # benchmarks too, otherwise they fail at import time due to the missing
+    # dependency.
+    rm tests/test_benchmarks.py
+  '';
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-FJET2Xb1cq4aePFhPXpp2oEPIOtpugYWNFAa2Dj0F6Y=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook psutil cbor2 ];
+  pythonImportsCheck = [ "pycddl" ];
+
+  meta = with lib; {
+    description = "Python bindings for the Rust cddl crate";
+    homepage = "https://gitlab.com/tahoe-lafs/pycddl";
+    changelog = "https://gitlab.com/tahoe-lafs/pycddl/-/tree/v${version}#release-notes";
+    license = licenses.mit;
+    maintainers = [ maintainers.exarkun ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycdio/default.nix b/nixpkgs/pkgs/development/python-modules/pycdio/default.nix
new file mode 100644
index 000000000000..fb298e62eff9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycdio/default.nix
@@ -0,0 +1,46 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, nose
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "pycdio";
+  version = "2.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "61734db8c554b7b1a2cb2da2e2c15d3f9f5973a57cfb06f8854c38029004a9f8";
+  };
+
+  prePatch = ''
+    substituteInPlace setup.py \
+      --replace 'library_dirs=library_dirs' 'library_dirs=[dir.decode("utf-8") for dir in library_dirs]' \
+      --replace 'include_dirs=include_dirs' 'include_dirs=[dir.decode("utf-8") for dir in include_dirs]' \
+      --replace 'runtime_library_dirs=runtime_lib_dirs' 'runtime_library_dirs=[dir.decode("utf-8") for dir in runtime_lib_dirs]'
+  '';
+
+  preConfigure = ''
+    patchShebangs .
+  '';
+
+  nativeBuildInputs = [ nose pkgs.pkg-config pkgs.swig ];
+  buildInputs = [ setuptools pkgs.libcdio ]
+    ++ lib.optional stdenv.isDarwin pkgs.libiconv;
+
+  # Run tests using nosetests but first need to install the binaries
+  # to the root source directory where they can be found.
+  checkPhase = ''
+    ./setup.py install_lib -d .
+    nosetests
+  '';
+
+  meta = with lib; {
+    homepage = "https://www.gnu.org/software/libcdio/";
+    description = "Wrapper around libcdio (CD Input and Control library)";
+    license = licenses.gpl3Plus;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycec/default.nix b/nixpkgs/pkgs/development/python-modules/pycec/default.nix
new file mode 100644
index 000000000000..58da1c55b934
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycec/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, libcec
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pycec";
+  version = "0.5.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "konikvranik";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-H18petSiUdftZN8Q3fPmfSJA3OZks+gI+FAq9LwkRsk=";
+  };
+
+  propagatedBuildInputs = [
+    libcec
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pycec"
+  ];
+
+  meta = with lib; {
+    description = "Python modules to access HDMI CEC devices";
+    homepage = "https://github.com/konikvranik/pycec/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycep-parser/default.nix b/nixpkgs/pkgs/development/python-modules/pycep-parser/default.nix
new file mode 100644
index 000000000000..9231fbdf47f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycep-parser/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, assertpy
+, buildPythonPackage
+, fetchFromGitHub
+, lark
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, regex
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "pycep-parser";
+  version = "0.4.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "gruebel";
+    repo = "pycep";
+    rev = "refs/tags/${version}";
+    hash = "sha256-qogUjj/GwMGwFEin+xJCSOCf5Ut8bgsFakyoMhkyKgU=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    lark
+    regex
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    assertpy
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pycep"
+  ];
+
+  meta = with lib; {
+    description = "Python based Bicep parser";
+    homepage = "https://github.com/gruebel/pycep";
+    changelog = "https://github.com/gruebel/pycep/blob/${version}/CHANGELOG.md";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycfdns/default.nix b/nixpkgs/pkgs/development/python-modules/pycfdns/default.nix
new file mode 100644
index 000000000000..e1af0553f5d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycfdns/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "pycfdns";
+  version = "2.0.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "ludeeus";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-f6kxYX/dg16OWYpw29dH4Z26ncLZCYyHKGc4fzoCld0=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'version="master",' 'version="${version}",'
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pycfdns"
+  ];
+
+  meta = with lib; {
+    description = "Python module for updating Cloudflare DNS A records";
+    homepage = "https://github.com/ludeeus/pycfdns";
+    changelog = "https://github.com/ludeeus/pycfdns/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycflow2dot/default.nix b/nixpkgs/pkgs/development/python-modules/pycflow2dot/default.nix
new file mode 100644
index 000000000000..db1ac8fabb2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycflow2dot/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cflow
+, graphviz
+, pydot
+, networkx
+, which
+}:
+
+buildPythonPackage rec {
+  pname = "pycflow2dot";
+  version = "0.2.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1zm8x2pd0q6zza0fw7hg9g1qvybfnjq6ql9b8mh2fc45l7l25655";
+  };
+
+  propagatedBuildInputs = [
+    cflow
+    graphviz
+    pydot
+    networkx
+    which
+  ];
+
+  pythonImportsCheck = [ "pycflow2dot" ];
+  checkPhase = ''
+    cd tests
+    export PATH=$out/bin:$PATH
+    make all
+  '';
+
+  meta = with lib; {
+    description = "Layout C call graphs from cflow using GraphViz dot";
+    homepage    = "https://github.com/johnyf/pycflow2dot";
+    license     = licenses.gpl3Plus;
+    maintainers = with maintainers; [ evils ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycfmodel/default.nix b/nixpkgs/pkgs/development/python-modules/pycfmodel/default.nix
new file mode 100644
index 000000000000..f6173a18966d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycfmodel/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, pydantic
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pycfmodel";
+  version = "0.21.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Skyscanner";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-nQIZ9fwk8CdqJawYsU5qiu9xxhi9X0IxhlPohHUDTL8=";
+  };
+
+  propagatedBuildInputs = [
+    pydantic
+  ];
+
+  nativeCheckInputs = [
+    httpx
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Test require network access
+    "test_cloudformation_actions"
+    "test_auxiliar_cast"
+    "test_valid_es_domain_from_aws_documentation_examples_resource_can_be_built"
+    "test_valid_opensearch_domain_from_aws_documentation_examples_resource_can_be_built"
+    "test_resolve_booleans_different_properties_for_generic_resource"
+  ];
+
+  pythonImportsCheck = [
+    "pycfmodel"
+  ];
+
+  meta = with lib; {
+    description = "Model for Cloud Formation scripts";
+    homepage = "https://github.com/Skyscanner/pycfmodel";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pychannels/default.nix b/nixpkgs/pkgs/development/python-modules/pychannels/default.nix
new file mode 100644
index 000000000000..d498fba21c2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pychannels/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pychannels";
+  version = "1.2.3";
+
+  src = fetchFromGitHub {
+    owner = "fancybits";
+    repo = pname;
+    rev = version;
+    hash = "sha256-E+VL4mJ2KxS5bJZc3Va+wvyVjT55LJz+1wHkxDRa85s=";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # Project has not published tests yet
+  doCheck = false;
+  pythonImportsCheck = [ "pychannels" ];
+
+  meta = with lib; {
+    description = "Python library for interacting with the Channels app";
+    homepage = "https://github.com/fancybits/pychannels";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pychart/default.nix b/nixpkgs/pkgs/development/python-modules/pychart/default.nix
new file mode 100644
index 000000000000..f020361474a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pychart/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27 }:
+
+buildPythonPackage rec {
+  pname = "pychart";
+  version = "1.39";
+
+  disabled = ! isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "882650928776a7ca72e67054a9e0ac98f78645f279c0cfb5910db28f03f07c2e";
+  };
+
+  meta = with lib; {
+    description = "Library for creating high quality encapsulated Postscript, PDF, PNG, or SVG charts";
+    homepage = "https://pypi.python.org/pypi/PyChart";
+    license = licenses.gpl2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pychm/default.nix b/nixpkgs/pkgs/development/python-modules/pychm/default.nix
new file mode 100644
index 000000000000..e9cc2c319fff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pychm/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, chmlib
+}:
+
+buildPythonPackage rec {
+  pname = "pychm";
+  version = "0.8.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0wpn9ijlsmrpyiwg3drmgz4dms1i1i347adgqw37bkrh3vn6yq16";
+  };
+
+  buildInputs = [ chmlib ];
+
+  pythonImportsCheck = [ "chm" ];
+
+  meta = with lib; {
+    description = "Library to manipulate Microsoft HTML Help (CHM) files";
+    homepage = "https://github.com/dottedmag/pychm";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ alexshpilkin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pychromecast/default.nix b/nixpkgs/pkgs/development/python-modules/pychromecast/default.nix
new file mode 100644
index 000000000000..32ca267d4449
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pychromecast/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, casttube
+, fetchPypi
+, pythonOlder
+, protobuf
+, requests
+, zeroconf
+}:
+
+buildPythonPackage rec {
+  pname = "pychromecast";
+  version = "13.0.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "PyChromecast";
+    inherit version;
+    hash = "sha256-5LdSPbE3+N4F7tzGFUETtoUyhIYpRCtEjCM0+slmpEc=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "protobuf>=3.19.1,<4" "protobuf>=3.19.1"
+  '';
+
+  propagatedBuildInputs = [
+    casttube
+    protobuf
+    requests
+    zeroconf
+  ];
+
+  # no tests available
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pychromecast"
+  ];
+
+  meta = with lib; {
+    description = "Library for Python to communicate with the Google Chromecast";
+    homepage = "https://github.com/home-assistant-libs/pychromecast";
+    changelog = "https://github.com/home-assistant-libs/pychromecast/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ abbradar ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycketcasts/default.nix b/nixpkgs/pkgs/development/python-modules/pycketcasts/default.nix
new file mode 100644
index 000000000000..e7cc9fe856ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycketcasts/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python-magic
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pycketcasts";
+  version = "1.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nwithan8";
+    repo = pname;
+    rev = version;
+    hash = "sha256-O4j89fE7fYPthhCH8b2gGskkelEA4mU6GvSbKIl+4Mk=";
+  };
+
+  propagatedBuildInputs = [
+    python-magic
+    requests
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pycketcasts"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with PocketCast's unofficial API";
+    homepage = "https://github.com/nwithan8/pycketcasts";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyclimacell/default.nix b/nixpkgs/pkgs/development/python-modules/pyclimacell/default.nix
new file mode 100644
index 000000000000..0f8c84a0163a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyclimacell/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "pyclimacell";
+  version = "0.18.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "raman325";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-jWHjnebg4Aar48gid7bB7XYXOQtSqbmVmASsZd0YoPc=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    pytz
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pyclimacell" ];
+
+  meta = with lib; {
+    description = "Python client for ClimaCell API";
+    homepage = "https://github.com/raman325/pyclimacell";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyclip/default.nix b/nixpkgs/pkgs/development/python-modules/pyclip/default.nix
new file mode 100644
index 000000000000..c9819b523ad9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyclip/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, pytest
+, pythonOlder
+, xclip
+, xvfb-run
+}:
+
+buildPythonPackage rec {
+  pname = "pyclip";
+  version = "0.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "spyoungtech";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-0nOkNgT8XCwtXI9JZntkhoMspKQU602rTKBFajVKBoM=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace docs/README.md README.md
+  '';
+
+  nativeCheckInputs = [
+    pytest
+  ] ++ lib.optionals stdenv.isLinux [
+    xclip
+    xvfb-run
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${lib.optionalString stdenv.isLinux "xvfb-run -s '-screen 0 800x600x24'"} pytest tests
+    runHook postCheck
+  '';
+
+  meta = {
+    broken = stdenv.isDarwin;
+    description = "Cross-platform clipboard utilities supporting both binary and text data";
+    homepage = "https://github.com/spyoungtech/pyclip";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ mcaju ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyclipper/default.nix b/nixpkgs/pkgs/development/python-modules/pyclipper/default.nix
new file mode 100644
index 000000000000..45e5ff27ee55
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyclipper/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, setuptools-scm
+, cython
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyclipper";
+  version = "1.3.0.post5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fonttools";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-FKpP+tgJFzhij3wDQsAgwrTNnny7lgmN+tlSQ9JgG+Q=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+    cython
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyclipper"
+  ];
+
+  meta = with lib; {
+    description = "Cython wrapper for clipper library";
+    homepage = "https://github.com/fonttools/pyclipper";
+    license = licenses.mit;
+    maintainers = with maintainers; [ matthuszagh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycm/default.nix b/nixpkgs/pkgs/development/python-modules/pycm/default.nix
new file mode 100644
index 000000000000..58570c177902
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycm/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, matplotlib
+, numpy
+, pytestCheckHook
+, pythonOlder
+, seaborn
+}:
+
+buildPythonPackage rec {
+  pname = "pycm";
+  version = "4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "sepandhaghighi";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-GyH06G7bArFBTzV/Sx/KmoJvcoed0sswW7qGqsSULHo=";
+  };
+
+  propagatedBuildInputs = [
+    matplotlib
+    numpy
+    seaborn
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # Remove a trivial dependency on the author's `art` Python ASCII art library
+    rm pycm/__main__.py
+    # Also depends on python3Packages.notebook
+    rm Otherfiles/notebook_check.py
+    substituteInPlace setup.py \
+      --replace '=get_requires()' '=[]'
+  '';
+
+  # https://github.com/sepandhaghighi/pycm/issues/488
+  pytestFlagsArray = [ "Test" ];
+
+  pythonImportsCheck = [
+    "pycm"
+  ];
+
+  meta = with lib; {
+    description = "Multiclass confusion matrix library";
+    homepage = "https://pycm.io";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycmarkgfm/default.nix b/nixpkgs/pkgs/development/python-modules/pycmarkgfm/default.nix
new file mode 100644
index 000000000000..79700a7bdc7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycmarkgfm/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27, cffi, pytest }:
+
+buildPythonPackage rec {
+  pname = "pycmarkgfm";
+  version = "1.2.1";
+  format = "setuptools";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-oPklCB54aHn33ewTiSlXgx38T0RzLure5OzGuFwsLNo=";
+  };
+
+  propagatedNativeBuildInputs = [ cffi ];
+
+  propagatedBuildInputs = [ cffi ];
+
+  # I would gladly use pytestCheckHook, but pycmarkgfm relies on a native
+  # extension (cmark.so, built through setup.py), and pytestCheckHook runs
+  # pytest in an environment that does not contain this extension, which fails.
+  # cmarkgfm has virtually the same build setup as this package, and uses the
+  # same trick: pkgs/development/python-modules/cmarkgfm/default.nix
+  nativeCheckInputs = [ pytest ];
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/zopieux/pycmarkgfm";
+    description = "Bindings to GitHub's Flavored Markdown (cmark-gfm), with enhanced support for task lists";
+    changelog = "https://github.com/zopieux/pycmarkgfm/raw/v${version}/CHANGELOG.md";
+    platforms = platforms.linux ++ platforms.darwin;
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ zopieux ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycocotools/default.nix b/nixpkgs/pkgs/development/python-modules/pycocotools/default.nix
new file mode 100644
index 000000000000..6cba9e71a756
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycocotools/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cython
+, matplotlib
+}:
+
+buildPythonPackage rec {
+  pname = "pycocotools";
+  version = "2.0.7";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2ot4FRlu6/Ctq/Z/zEWRJsvGSYu8arH9FEw3FGXYaHk=";
+  };
+
+  propagatedBuildInputs = [
+    cython
+    matplotlib
+  ];
+
+  pythonImportsCheck = [
+    "pycocotools.coco"
+    "pycocotools.cocoeval"
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Official APIs for the MS-COCO dataset";
+    homepage = "https://github.com/cocodataset/cocoapi/tree/master/PythonAPI";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ piegames ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycodestyle/default.nix b/nixpkgs/pkgs/development/python-modules/pycodestyle/default.nix
new file mode 100644
index 000000000000..250537774c2a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycodestyle/default.nix
@@ -0,0 +1,44 @@
+{ buildPythonPackage
+, pythonOlder
+, fetchPypi
+, lib
+, python
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pycodestyle";
+  version = "2.11.0";
+
+  disabled = pythonOlder "3.6";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JZvMF4V9ios7SiMnMkt55fAgoTwWB0Zw+cjI+HLqdtA=";
+  };
+
+  pythonImportsCheck = [
+    "pycodestyle"
+  ];
+
+  nativCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # https://github.com/PyCQA/pycodestyle/blob/2.11.0/tox.ini#L16
+  postCheck = ''
+    ${python.interpreter} -m pycodestyle --statistics pycodestyle.py
+  '';
+
+  meta = with lib; {
+    changelog = "https://github.com/PyCQA/pycodestyle/blob/${version}/CHANGES.txt";
+    description = "Python style guide checker";
+    homepage = "https://pycodestyle.pycqa.org/";
+    license = licenses.mit;
+    maintainers = with maintainers; [
+      kamadorueda
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycognito/default.nix b/nixpkgs/pkgs/development/python-modules/pycognito/default.nix
new file mode 100644
index 000000000000..a66c0ef49117
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycognito/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, boto3
+, buildPythonPackage
+, envs
+, fetchFromGitHub
+, isPy27
+, freezegun
+, mock
+, moto
+, pytestCheckHook
+, python-jose
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "pycognito";
+  version = "2023.5.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "pvizeli";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-2Aqid2bd5BAnWQ+Wtji0zXjLAmSpyJNGqJ0VroGi6lY=";
+  };
+
+  propagatedBuildInputs = [
+    boto3
+    envs
+    python-jose
+    requests
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    mock
+    moto
+    pytestCheckHook
+    requests-mock
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'python-jose[cryptography]' 'python-jose'
+  '';
+
+  pytestFlagsArray = [ "tests.py" ];
+
+  disabledTests = [
+    # requires network access
+    "test_srp_requests_http_auth"
+  ];
+
+  pythonImportsCheck = [ "pycognito" ];
+
+  meta = with lib; {
+    description = "Python class to integrate Boto3's Cognito client so it is easy to login users. With SRP support";
+    homepage = "https://github.com/pvizeli/pycognito";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycoin/default.nix b/nixpkgs/pkgs/development/python-modules/pycoin/default.nix
new file mode 100644
index 000000000000..249d19f69f54
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycoin/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, gnupg
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pycoin";
+  version = "0.92.20230326";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-DYXwATRHw1ay9swLuQOtB+5LcoBe4TtAKWzQgxESwN8=";
+  };
+
+  propagatedBuildInputs = [ setuptools ];
+
+  postPatch = ''
+    substituteInPlace ./pycoin/cmds/tx.py --replace '"gpg"' '"${gnupg}/bin/gpg"'
+  '';
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  dontUseSetuptoolsCheck = true;
+
+  # Disable tests depending on online services
+  disabledTests = [
+    "ServicesTest"
+    "test_tx_pay_to_opcode_list_txt"
+    "test_tx_fetch_unspent"
+    "test_tx_with_gpg"
+  ];
+
+  meta = with lib; {
+    description = "Utilities for Bitcoin and altcoin addresses and transaction manipulation";
+    homepage = "https://github.com/richardkiss/pycoin";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nyanloutre ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycollada/default.nix b/nixpkgs/pkgs/development/python-modules/pycollada/default.nix
new file mode 100644
index 000000000000..24f4d26fe02d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycollada/default.nix
@@ -0,0 +1,25 @@
+{ lib, fetchPypi, buildPythonPackage, numpy, python-dateutil }:
+
+buildPythonPackage rec {
+  pname = "pycollada";
+  version = "0.7.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "70a2630ed499bdab718c0e61a3e6ae3698130d7e4654e89cdecde51bfdaea56f";
+  };
+
+  propagatedBuildInputs = [ numpy python-dateutil ];
+
+  # Some tests fail because they refer to test data files that don't exist
+  # (upstream packaging issue)
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python library for reading and writing collada documents";
+    homepage = "http://pycollada.github.io/";
+    license = licenses.bsd3;
+    platforms = with platforms; linux ++ darwin;
+    maintainers = with maintainers; [ bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycomfoconnect/default.nix b/nixpkgs/pkgs/development/python-modules/pycomfoconnect/default.nix
new file mode 100644
index 000000000000..a325583648ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycomfoconnect/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, protobuf
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pycomfoconnect";
+  version = "0.5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "michaelarnauts";
+    repo = "comfoconnect";
+    rev = "refs/tags/${version}";
+    hash = "sha256-I/0vCgSEi6mgYg1fMH4Ha7PoonewtqYYsvXZT8y4rJE=";
+  };
+
+  propagatedBuildInputs = [
+    protobuf
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pycomfoconnect"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interact with ComfoAir Q350/450/600 units";
+    homepage = "https://github.com/michaelarnauts/comfoconnect";
+    changelog = "https://github.com/michaelarnauts/comfoconnect/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycomposefile/default.nix b/nixpkgs/pkgs/development/python-modules/pycomposefile/default.nix
new file mode 100644
index 000000000000..e7707c763a20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycomposefile/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, pyyaml
+, twine
+}:
+
+buildPythonPackage rec {
+  pname = "pycomposefile";
+  version = "0.0.30";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "tar.gz";
+    hash = "sha256-GQopIO8F+G5iDz4NF2GTHCpXo4uqKHdHIzffacihylM=";
+  };
+
+  nativeBuildInput = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pyyaml
+    twine
+  ];
+
+  doCheck = false; # tests are broken
+
+  meta = with lib; {
+    description = "Python library for structured deserialization of Docker Compose files";
+    homepage = "https://github.com/smurawski/pycomposefile";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mdarocha ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycontracts/default.nix b/nixpkgs/pkgs/development/python-modules/pycontracts/default.nix
new file mode 100644
index 000000000000..2a90bef72567
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycontracts/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi
+, nose, pyparsing, decorator, six, future }:
+
+buildPythonPackage rec {
+  pname = "PyContracts";
+  version = "1.8.14";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "03q5m595ysjrc9h57m7prrca6b9l4yrzvdijnzxnhd61p7jzbh49";
+  };
+
+  buildInputs = [ nose ];
+  propagatedBuildInputs = [ pyparsing decorator six future ];
+
+  meta = with lib; {
+    description = "Allows to declare constraints on function parameters and return values";
+    homepage = "https://pypi.python.org/pypi/PyContracts";
+    license = licenses.lgpl2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycontrol4/default.nix b/nixpkgs/pkgs/development/python-modules/pycontrol4/default.nix
new file mode 100644
index 000000000000..e45c448bba0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycontrol4/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, aiohttp
+, xmltodict
+, python-socketio
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "pycontrol4";
+  version = "1.1.2";
+
+  disabled = pythonOlder "3.6";
+
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "lawtancool";
+    repo = "pyControl4";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-oKKc9s3/fO7cFMjOeKtpvEwmfglxI2lxlN3EIva7zR8=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "python-socketio>=4,<5" "python-socketio>=4"
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    xmltodict
+    python-socketio
+    websocket-client
+  ];
+
+  # tests access network
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyControl4.account"
+    "pyControl4.alarm"
+    "pyControl4.director"
+    "pyControl4.light"
+  ];
+
+  meta = with lib; {
+    description = "Python 3 asyncio package for interacting with Control4 systems";
+    homepage = "https://github.com/lawtancool/pyControl4";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycookiecheat/default.nix b/nixpkgs/pkgs/development/python-modules/pycookiecheat/default.nix
new file mode 100644
index 000000000000..4a539f5ee191
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycookiecheat/default.nix
@@ -0,0 +1,77 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, keyring
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, playwright
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pycookiecheat";
+  version = "0.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "n8henrie";
+    repo = "pycookiecheat";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-mSc5FqMM8BICVEdSdsIny9Bnk6qCRekPk4RkBusDoVA=";
+  };
+
+  pythonRelaxDeps = [
+    "cryptography"
+    "keyring"
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    keyring
+  ];
+
+  nativeCheckInputs = [
+    playwright
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pycookiecheat"
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  disabledTests = [
+    # Tests want to use playwright executable
+    "test_no_cookies"
+    "test_fake_cookie"
+    "test_firefox_cookies"
+    "test_load_firefox_cookie_db"
+    "test_firefox_no_cookies"
+    "test_firefox_get_default_profile"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_slack_config"
+  ];
+
+  meta = with lib; {
+    description = "Borrow cookies from your browser's authenticated session for use in Python scripts";
+    homepage = "https://github.com/n8henrie/pycookiecheat";
+    changelog = "https://github.com/n8henrie/pycookiecheat/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycoolmasternet-async/default.nix b/nixpkgs/pkgs/development/python-modules/pycoolmasternet-async/default.nix
new file mode 100644
index 000000000000..d8aa5760d5d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycoolmasternet-async/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pycoolmasternet-async";
+  version = "0.1.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "OnFreund";
+    repo = "pycoolmasternet-async";
+    rev = "v${version}";
+    hash = "sha256-7RYKZWs8SCXCBgjbiTLSRUPujeraxiOE6MHENPmhimg=";
+  };
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pycoolmasternet_async"
+  ];
+
+  meta = with lib; {
+    description = "Python library to control CoolMasterNet HVAC bridges over asyncio";
+    homepage = "https://github.com/OnFreund/pycoolmasternet-async";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycosat/default.nix b/nixpkgs/pkgs/development/python-modules/pycosat/default.nix
new file mode 100644
index 000000000000..9fc633c6808b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycosat/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pycosat";
+  version = "0.6.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "4c99874946a7e939bb941bbb019dd2c20e6068e3107c91366e7779c69d70e0ed";
+  };
+
+  meta = {
+    description = "Bindings to picosat SAT solver";
+    homepage = "https://github.com/ContinuumIO/pycosat";
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycotap/default.nix b/nixpkgs/pkgs/development/python-modules/pycotap/default.nix
new file mode 100644
index 000000000000..652f3c1b1dcb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycotap/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "pycotap";
+  version = "1.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Z0NV8BMAvgPff4cXhOSYZSwtiawZzXfujmFlJjSi+Do=";
+  };
+
+  meta = with lib; {
+    description = "Test runner for unittest that outputs TAP results to stdout";
+    homepage = "https://el-tramo.be/pycotap";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mwolfe ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycountry/default.nix b/nixpkgs/pkgs/development/python-modules/pycountry/default.nix
new file mode 100644
index 000000000000..95f74e68bd81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycountry/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pycountry";
+  version = "22.3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-shY6JGxYWJTYCPGHg+GRN8twoMGPs2dI3AH8bxCcFkY=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pycountry"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/flyingcircusio/pycountry";
+    description = "ISO country, subdivision, language, currency and script definitions and their translations";
+    license = licenses.lgpl2;
+    maintainers = with maintainers; [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycparser/default.nix b/nixpkgs/pkgs/development/python-modules/pycparser/default.nix
new file mode 100644
index 000000000000..edc6744f672c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycparser/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, unittestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "pycparser";
+  version = "2.21";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206";
+  };
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  unittestFlagsArray = [ "-s" "tests" ];
+
+  meta = with lib; {
+    description = "C parser in Python";
+    homepage = "https://github.com/eliben/pycparser";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycrc/default.nix b/nixpkgs/pkgs/development/python-modules/pycrc/default.nix
new file mode 100644
index 000000000000..ca65f784038a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycrc/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "PyCRC";
+  version = "1.21";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d3b0e788b501f48ae2ff6eeb34652343c9095e4356a65df217ed29b51e4045b6";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/cristianav/PyCRC";
+    description = "Python libraries for CRC calculations (it supports CRC-16, CRC-32, CRC-CCITT, etc)";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ guibou ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycritty/default.nix b/nixpkgs/pkgs/development/python-modules/pycritty/default.nix
new file mode 100644
index 000000000000..726e47bf1fb8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycritty/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder, pyyaml }:
+
+buildPythonPackage rec {
+  pname = "pycritty";
+  version = "0.4.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Lh2zAEJTyzI8dJTNuyaf7gzhySMpui+CF9qRiubwFhE=";
+  };
+
+  postPatch = ''
+    # remove custom install
+    substituteInPlace setup.py \
+      --replace "'install': PostInstallHook," ""
+  '';
+
+  propagatedBuildInputs = [ pyyaml ];
+
+  # The package does not include any tests to run
+  doCheck = false;
+
+  pythonImportsCheck = [ "pycritty" ];
+
+  meta = with lib; {
+    description = "A CLI tool for changing your alacritty configuration on the fly";
+    homepage = "https://github.com/antoniosarosi/pycritty";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jperras ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycron/default.nix b/nixpkgs/pkgs/development/python-modules/pycron/default.nix
new file mode 100644
index 000000000000..7aa8afee1088
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycron/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchFromGitHub, udatetime, pytz, pendulum, nose
+, delorean, coveralls, arrow
+}:
+
+buildPythonPackage rec {
+  pname = "pycron";
+  version = "3.0.0";
+
+  src = fetchFromGitHub {
+    owner = "kipe";
+    repo = pname;
+    rev = version;
+    sha256 = "12hkqrdfg3jbqkmck8i00ssyaw1c4hhvdhjxkmh2gm9pd99z5bpv";
+  };
+
+  nativeCheckInputs = [ arrow coveralls delorean nose pendulum pytz udatetime ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  pythonImportsCheck = [ "pycron" ];
+
+  meta = with lib; {
+    description = "Simple cron-like parser for Python, which determines if current datetime matches conditions";
+    license = licenses.mit;
+    homepage = "https://github.com/kipe/pycron";
+    maintainers = with maintainers; [ globin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycrypto/default.nix b/nixpkgs/pkgs/development/python-modules/pycrypto/default.nix
new file mode 100644
index 000000000000..364a218aaa1b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycrypto/default.nix
@@ -0,0 +1,28 @@
+{ buildPythonPackage, pycryptodome }:
+
+# This is a dummy package providing the drop-in replacement pycryptodome.
+# https://github.com/NixOS/nixpkgs/issues/21671
+
+buildPythonPackage rec {
+  pname = "pycrypto";
+  version = pycryptodome.version;
+
+  # Cannot build wheel otherwise (zip 1980 issue)
+  SOURCE_DATE_EPOCH=315532800;
+
+  # We need to have a dist-info folder, so let's create one with setuptools
+  unpackPhase = ''
+    echo "from setuptools import setup; setup(name='${pname}', version='${version}', install_requires=['pycryptodome'])" > setup.py
+  '';
+
+  propagatedBuildInputs = [ pycryptodome ];
+
+  # Our dummy has no tests
+  doCheck = false;
+
+  meta = {
+    homepage = "https://www.pycrypto.org/";
+    description = "Drop-in replacement for pycrypto using pycryptodome";
+    platforms = pycryptodome.meta.platforms;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycryptodome/default.nix b/nixpkgs/pkgs/development/python-modules/pycryptodome/default.nix
new file mode 100644
index 000000000000..47e90eb8726a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycryptodome/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, callPackage
+, fetchFromGitHub
+, gmp
+}:
+
+let
+  test-vectors = callPackage ./vectors.nix { };
+in
+buildPythonPackage rec {
+  pname = "pycryptodome";
+  version = "3.18.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Legrandin";
+    repo = "pycryptodome";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-6oXXy18KlSjfyZhfMnIgnu34u/9sG0TPYvPJ8ovTqMA=";
+  };
+
+  postPatch = ''
+    substituteInPlace lib/Crypto/Math/_IntegerGMP.py \
+      --replace 'load_lib("gmp"' 'load_lib("${gmp}/lib/libgmp.so.10"'
+  '';
+
+  nativeCheckInputs = [
+    test-vectors
+  ];
+
+  pythonImportsCheck = [
+    "Crypto"
+  ];
+
+  meta = with lib; {
+    description = "Self-contained cryptographic library";
+    homepage = "https://github.com/Legrandin/pycryptodome";
+    changelog = "https://github.com/Legrandin/pycryptodome/blob/v${version}/Changelog.rst";
+    license = with licenses; [ bsd2 /* and */ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycryptodome/vectors.nix b/nixpkgs/pkgs/development/python-modules/pycryptodome/vectors.nix
new file mode 100644
index 000000000000..89df4507867e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycryptodome/vectors.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pycryptodome-test-vectors";
+  version = "1.0.10";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-oqgHWAw0Xrc22eAuY6+Q/H90tL9Acz6V0EJp060hH2Q=";
+    extension = "zip";
+  };
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pycryptodome_test_vectors"
+  ];
+
+  meta = with lib; {
+    description = "Test vectors for PyCryptodome cryptographic library";
+    homepage = "https://www.pycryptodome.org/";
+    license = with licenses; [ bsd2 /* and */ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycryptodomex/default.nix b/nixpkgs/pkgs/development/python-modules/pycryptodomex/default.nix
new file mode 100644
index 000000000000..9d476ea4728c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycryptodomex/default.nix
@@ -0,0 +1,13 @@
+{ pycryptodome }:
+
+(pycryptodome.overrideAttrs (oldAttrs: rec {
+  pname = "pycryptodomex";
+
+  postPatch = ''
+    touch .separate_namespace
+  '';
+
+  pythonImportsCheck = [
+    "Cryptodome"
+  ];
+}))
diff --git a/nixpkgs/pkgs/development/python-modules/pycsdr/default.nix b/nixpkgs/pkgs/development/python-modules/pycsdr/default.nix
new file mode 100644
index 000000000000..3ee5b1449a63
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycsdr/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub, csdr }:
+
+buildPythonPackage rec {
+  pname = "pycsdr";
+  version = "0.18.0";
+
+  src = fetchFromGitHub {
+    owner = "jketterl";
+    repo = "pycsdr";
+    rev = version;
+    hash = "sha256-OyfcXCcbvOOhBUkbAba3ayPzpH5z2nJWHbR6GcrCMy8=";
+  };
+
+  propagatedBuildInputs = [ csdr ];
+
+  # has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "pycsdr" ];
+
+  meta = {
+    homepage = "https://github.com/jketterl/pycsdr";
+    description = "bindings for the csdr library";
+    license = lib.licenses.gpl3Only;
+    maintainers = lib.teams.c3d2.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyct/default.nix b/nixpkgs/pkgs/development/python-modules/pyct/default.nix
new file mode 100644
index 000000000000..1aed69b85fe6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyct/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, param
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyct";
+  version = "0.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3Z9KxcvY43w1LAQDYGLTxfZ+/sdtQEdh7xawy/JqpqA=";
+  };
+
+  propagatedBuildInputs = [
+    param
+    pyyaml
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyct"
+  ];
+
+  meta = with lib; {
+    description = "ClI for Python common tasks for users";
+    homepage = "https://github.com/pyviz/pyct";
+    changelog = "https://github.com/pyviz-dev/pyct/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyctr/default.nix b/nixpkgs/pkgs/development/python-modules/pyctr/default.nix
new file mode 100644
index 000000000000..7f1a8d6d01b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyctr/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pycryptodomex
+}:
+
+buildPythonPackage rec {
+  pname = "pyctr";
+  version = "0.7.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-SnCps5nzrl+dkbloRbjhaOGDzKOsi8OHX2JXgoJ/XG0=";
+  };
+
+  propagatedBuildInputs = [
+    pycryptodomex
+  ];
+
+  pythonImportsCheck = [
+    "pyctr"
+  ];
+
+  meta = with lib; {
+    description = "Python library to interact with Nintendo 3DS files";
+    homepage = "https://github.com/ihaveamac/pyctr";
+    changelog = "https://github.com/ihaveamac/pyctr/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rileyinman ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycuda/compyte.nix b/nixpkgs/pkgs/development/python-modules/pycuda/compyte.nix
new file mode 100644
index 000000000000..cfa685c1ac9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycuda/compyte.nix
@@ -0,0 +1,21 @@
+{ mkDerivation
+, fetchFromGitHub
+}:
+
+mkDerivation {
+  pname = "compyte";
+  version = "git-20150817";
+
+  src = fetchFromGitHub {
+    owner = "inducer";
+    repo = "compyte";
+    rev = "ac1c71d46428c14aa1bd1c09d7da19cd0298d5cc";
+    sha256 = "1980h017qi52b7fqwm75m481xs2napgdd3fbrzkfc29k085cbign";
+  };
+
+  installPhase = ''
+    mkdir -p $out
+    cp -r * $out
+  '';
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycuda/default.nix b/nixpkgs/pkgs/development/python-modules/pycuda/default.nix
new file mode 100644
index 000000000000..8c2005c0cc2c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycuda/default.nix
@@ -0,0 +1,84 @@
+{ buildPythonPackage
+, addOpenGLRunpath
+, fetchPypi
+, fetchFromGitHub
+, mako
+, boost
+, numpy
+, pytools
+, pytest
+, decorator
+, appdirs
+, six
+, cudaPackages
+, python
+, mkDerivation
+, lib
+}:
+let
+  compyte = import ./compyte.nix {
+    inherit mkDerivation fetchFromGitHub;
+  };
+
+  inherit (cudaPackages) cudatoolkit;
+in
+buildPythonPackage rec {
+  pname = "pycuda";
+  version = "2023.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-F1/2dfDPEOOOmtwD7V3z7Y2Kv32lE0yNzOx1LooKPpE=";
+  };
+
+  preConfigure = with lib.versions; ''
+    ${python.pythonOnBuildForHost.interpreter} configure.py --boost-inc-dir=${boost.dev}/include \
+                          --boost-lib-dir=${boost}/lib \
+                          --no-use-shipped-boost \
+                          --boost-python-libname=boost_python${major python.version}${minor python.version} \
+                          --cuda-root=${cudatoolkit}
+  '';
+
+  postInstall = ''
+    ln -s ${compyte} $out/${python.sitePackages}/pycuda/compyte
+  '';
+
+  postFixup = ''
+    find $out/lib -type f \( -name '*.so' -or -name '*.so.*' \) | while read lib; do
+      echo "setting opengl runpath for $lib..."
+      addOpenGLRunpath "$lib"
+    done
+  '';
+
+  # Requires access to libcuda.so.1 which is provided by the driver
+  doCheck = false;
+
+  checkPhase = ''
+    py.test
+  '';
+
+  nativeBuildInputs = [
+    addOpenGLRunpath
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    pytools
+    pytest
+    decorator
+    appdirs
+    six
+    cudatoolkit
+    compyte
+    python
+    mako
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/inducer/pycuda/";
+    description = "CUDA integration for Python.";
+    license = licenses.mit;
+    maintainers = with maintainers; [ artuuge ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycups/default.nix b/nixpkgs/pkgs/development/python-modules/pycups/default.nix
new file mode 100644
index 000000000000..9f2d182fb5c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycups/default.nix
@@ -0,0 +1,22 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, cups, libiconv }:
+
+buildPythonPackage rec {
+  pname = "pycups";
+  version = "2.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-V0NM5fYlSOsSlJyoIX8Gb07rIaXWq4sTRx3ONQ44DJA=";
+  };
+
+  buildInputs = [ cups ] ++ lib.optional stdenv.isDarwin libiconv;
+
+  # Wants to connect to CUPS
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python bindings for libcups";
+    homepage = "http://cyberelk.net/tim/software/pycups/";
+    license = with licenses; [ gpl2Plus ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycurl/default.nix b/nixpkgs/pkgs/development/python-modules/pycurl/default.nix
new file mode 100644
index 000000000000..fb4aacf3b83d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycurl/default.nix
@@ -0,0 +1,86 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, isPyPy
+, fetchPypi
+, pythonOlder
+, curl
+, openssl
+, bottle
+, pytestCheckHook
+, flaky
+}:
+
+buildPythonPackage rec {
+  pname = "pycurl";
+  version = "7.45.2";
+  disabled = isPyPy || (pythonOlder "3.5"); # https://github.com/pycurl/pycurl/issues/208
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VzBZC+AnE2Slvd2eJFycwPtxDEy6y92VJkoxItIyJMo=";
+  };
+
+  preConfigure = ''
+    substituteInPlace setup.py --replace '--static-libs' '--libs'
+    export PYCURL_SSL_LIBRARY=openssl
+  '';
+
+  buildInputs = [
+    curl
+    openssl
+  ];
+
+  nativeBuildInputs = [
+    curl
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    bottle
+    pytestCheckHook
+    flaky
+  ];
+
+  pytestFlagsArray = [
+    # don't pick up the tests directory below examples/
+    "tests"
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  disabledTests = [
+    # tests that require network access
+    "test_keyfunction"
+    "test_keyfunction_bogus_return"
+    # OSError: tests/fake-curl/libcurl/with_openssl.so: cannot open shared object file: No such file or directory
+    "test_libcurl_ssl_openssl"
+    # OSError: tests/fake-curl/libcurl/with_nss.so: cannot open shared object file: No such file or directory
+    "test_libcurl_ssl_nss"
+    # OSError: tests/fake-curl/libcurl/with_gnutls.so: cannot open shared object file: No such file or directory
+    "test_libcurl_ssl_gnutls"
+    # AssertionError: assert 'crypto' in ['curl']
+    "test_ssl_in_static_libs"
+    # tests that require curl with http3Support
+    "test_http_version_3"
+    # https://github.com/pycurl/pycurl/issues/819
+    "test_multi_socket_select"
+    # https://github.com/pycurl/pycurl/issues/729
+    "test_multi_socket_action"
+    # https://github.com/pycurl/pycurl/issues/822
+    "test_request_with_verifypeer"
+  ] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
+    # Fatal Python error: Segmentation fault
+    "cadata_test"
+  ];
+
+  meta = with lib; {
+    homepage = "http://pycurl.io/";
+    description = "Python Interface To The cURL library";
+    license = with licenses; [ lgpl2Only mit ];
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycxx/default.nix b/nixpkgs/pkgs/development/python-modules/pycxx/default.nix
new file mode 100644
index 000000000000..c0cf0ac0dc13
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycxx/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchurl, python }:
+
+buildPythonPackage rec {
+  pname = "pycxx";
+  version = "7.1.4";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/cxx/CXX/PyCXX%20V${version}/pycxx-${version}.tar.gz";
+    sha256 = "MUMU+/qsm92WENYFxfjQsSuR8/nE/asYG8HgIbaAaz0=";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  postInstall = ''
+    mkdir -p $dev/include
+    mv $out/include/${python.libPrefix}*/CXX/ $dev/include/CXX/
+    mv $out/CXX $dev/src
+    sed -i "s|Src|$dev/src|" $dev/src/cxxextensions.c $dev/src/cxxsupport.cxx
+  '';
+
+  meta = with lib; {
+    description = "set of classes to help create extensions of Python in the C++ language";
+    homepage = "https://sourceforge.net/projects/cxx/";
+    maintainers = with maintainers; [ freezeboy ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pycyphal/default.nix b/nixpkgs/pkgs/development/python-modules/pycyphal/default.nix
new file mode 100644
index 000000000000..b5516bc144e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pycyphal/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, can
+, cobs
+, libpcap
+, nunavut
+, numpy
+, pyserial
+}:
+
+buildPythonPackage rec {
+  pname = "pycyphal";
+  version = "1.15.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-KVX+DwcJp1sjpcG1Utl9me1LwWDZPof+O6hoUt1xlXA=";
+  };
+
+  propagatedBuildInputs = [
+    can
+    cobs
+    libpcap
+    numpy
+    nunavut
+    pyserial
+  ];
+
+  # Can't seem to run the tests on nix
+  doCheck = false;
+  pythonImportsCheck = [
+    "pycyphal"
+  ];
+
+  meta = with lib; {
+    description = "A full-featured implementation of the Cyphal protocol stack in Python";
+    longDescription = ''
+      Cyphal is an open technology for real-time intravehicular distributed computing and communication based on modern networking standards (Ethernet, CAN FD, etc.).
+    '';
+    homepage = "https://opencyphal.org/";
+    license = licenses.mit;
+    maintainers = [ teams.ororatech ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydaikin/default.nix b/nixpkgs/pkgs/development/python-modules/pydaikin/default.nix
new file mode 100644
index 000000000000..eb1029837435
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydaikin/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromBitbucket
+, freezegun
+, netifaces
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "pydaikin";
+  version = "2.11.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromBitbucket {
+    owner = "mustang51";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-IBrd4PH8EzVVVFQtJdJ8bTMLEzfh7MYMe79yuCrhmww=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    netifaces
+    urllib3
+  ];
+
+  doCheck = false; # tests fail and upstream does not seem to run them either
+
+  nativeCheckInputs = [
+    freezegun
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pydaikin"
+  ];
+
+  meta = with lib; {
+    description = "Python Daikin HVAC appliances interface";
+    homepage = "https://bitbucket.org/mustang51/pydaikin";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydal/default.nix b/nixpkgs/pkgs/development/python-modules/pydal/default.nix
new file mode 100644
index 000000000000..18fd4dc70b4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydal/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pydal";
+  version = "20230521.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-EEeKYeYnxbjLdpH39+v3IQhFSFMWST0310DCl/ttGEU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests/*.py"
+    # these tests already seem to be broken on the upstream
+    "--deselect=tests/nosql.py::TestFields::testRun"
+    "--deselect=tests/nosql.py::TestSelect::testGroupByAndDistinct"
+    "--deselect=tests/nosql.py::TestExpressions::testOps"
+    "--deselect=tests/nosql.py::TestExpressions::testRun"
+    "--deselect=tests/nosql.py::TestImportExportUuidFields::testRun"
+    "--deselect=tests/nosql.py::TestConnection::testRun"
+    "--deselect=tests/validation.py::TestValidateAndInsert::testRun"
+    "--deselect=tests/validation.py::TestValidateUpdateInsert::testRun"
+    "--deselect=tests/validators.py::TestValidators::test_IS_IN_DB"
+  ];
+
+  pythonImportsCheck = ["pydal"];
+
+  meta = with lib; {
+    description = "Python Database Abstraction Layer";
+    homepage = "https://github.com/web2py/pydal";
+    license = with licenses; [ bsd3 ] ;
+    maintainers = with maintainers; [ wamserma ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydanfossair/default.nix b/nixpkgs/pkgs/development/python-modules/pydanfossair/default.nix
new file mode 100644
index 000000000000..5ce5ebffeaad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydanfossair/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "pydanfossair";
+  version = "0.2.0";
+
+  src = fetchFromGitHub {
+    owner = "JonasPed";
+    repo = "pydanfoss-air";
+    rev = "v${version}";
+    hash = "sha256-WTRiEQbd3wwNAz1gk0rS3khy6lg61rcGZQTMlBc0uO8=";
+  };
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "pydanfossair" ];
+
+  meta = with lib; {
+    description = "Python interface for Danfoss Air HRV systems";
+    homepage = "https://github.com/JonasPed/pydanfoss-air";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydantic-core/01-remove-benchmark-flags.patch b/nixpkgs/pkgs/development/python-modules/pydantic-core/01-remove-benchmark-flags.patch
new file mode 100644
index 000000000000..a5c27e469a92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydantic-core/01-remove-benchmark-flags.patch
@@ -0,0 +1,18 @@
+diff --git a/pyproject.toml b/pyproject.toml
+index 1602e32..507048d 100644
+--- a/pyproject.toml
++++ b/pyproject.toml
+@@ -72,13 +72,6 @@ filterwarnings = [
+ ]
+ timeout = 30
+ xfail_strict = true
+-# min, max, mean, stddev, median, iqr, outliers, ops, rounds, iterations
+-addopts = [
+-    '--benchmark-columns', 'min,mean,stddev,outliers,rounds,iterations',
+-    '--benchmark-group-by', 'group',
+-    '--benchmark-warmup', 'on',
+-    '--benchmark-disable',  # this is enable by `make benchmark` when you actually want to run benchmarks
+-]
+ 
+ [tool.coverage.run]
+ source = ['pydantic_core']
diff --git a/nixpkgs/pkgs/development/python-modules/pydantic-core/default.nix b/nixpkgs/pkgs/development/python-modules/pydantic-core/default.nix
new file mode 100644
index 000000000000..6e273aaef4c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydantic-core/default.nix
@@ -0,0 +1,87 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, cargo
+, rustPlatform
+, rustc
+, libiconv
+, typing-extensions
+, pytestCheckHook
+, hypothesis
+, pytest-timeout
+, pytest-mock
+, dirty-equals
+}:
+
+let
+  pydantic-core = buildPythonPackage rec {
+    pname = "pydantic-core";
+    version = "2.6.3";
+    format = "pyproject";
+
+    src = fetchFromGitHub {
+      owner = "pydantic";
+      repo = "pydantic-core";
+      rev = "refs/tags/v${version}";
+      hash = "sha256-bEVACTlzELXPoCtEHMR1s87KJn/qnE0lO1O4RmdjmPM=";
+    };
+
+    patches = [
+      ./01-remove-benchmark-flags.patch
+    ];
+
+    cargoDeps = rustPlatform.fetchCargoTarball {
+      inherit src;
+      name = "${pname}-${version}";
+      hash = "sha256-h9SmMLg/W11h/SQz8Te5OoCKdyG6Fctc5ftqbVQFSwU=";
+    };
+
+    nativeBuildInputs = [
+      cargo
+      rustPlatform.cargoSetupHook
+      rustPlatform.maturinBuildHook
+      rustc
+      typing-extensions
+    ];
+
+    buildInputs = lib.optionals stdenv.isDarwin [
+      libiconv
+    ];
+
+    propagatedBuildInputs = [
+      typing-extensions
+    ];
+
+    pythonImportsCheck = [ "pydantic_core" ];
+
+    # escape infinite recursion with pydantic via dirty-equals
+    doCheck = false;
+    passthru.tests.pytest = pydantic-core.overrideAttrs { doCheck = true; };
+
+    nativeCheckInputs = [
+      pytestCheckHook
+      hypothesis
+      pytest-timeout
+      dirty-equals
+      pytest-mock
+    ];
+
+    disabledTests = [
+      # RecursionError: maximum recursion depth exceeded while calling a Python object
+      "test_recursive"
+    ];
+
+    disabledTestPaths = [
+      # no point in benchmarking in nixpkgs build farm
+      "tests/benchmarks"
+    ];
+
+    meta = with lib; {
+      description = "Core validation logic for pydantic written in rust";
+      homepage = "https://github.com/pydantic/pydantic-core";
+      license = licenses.mit;
+      maintainers = with maintainers; [ blaggacao ];
+    };
+  };
+in pydantic-core
diff --git a/nixpkgs/pkgs/development/python-modules/pydantic-extra-types/default.nix b/nixpkgs/pkgs/development/python-modules/pydantic-extra-types/default.nix
new file mode 100644
index 000000000000..539873a1a4be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydantic-extra-types/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, pydantic
+, phonenumbers
+, pycountry
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pydantic-extra-types";
+  version = "2.1.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pydantic";
+    repo = "pydantic-extra-types";
+    rev = "v${version}";
+    hash = "sha256-QPBOHIssTsWQlEg2WRpLRKrB6zmae43EExnPn5P4oAY=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    pydantic
+  ];
+
+  passthru.optional-dependencies = {
+    all = [
+      phonenumbers
+      pycountry
+    ];
+  };
+
+  pythonImportsCheck = [ "pydantic_extra_types" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.all;
+
+  pytestFlagsArray = [
+    "-W" "ignore::DeprecationWarning"
+  ];
+
+  meta = with lib; {
+    description = "Extra Pydantic types";
+    homepage = "https://github.com/pydantic/pydantic-extra-types";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydantic-scim/default.nix b/nixpkgs/pkgs/development/python-modules/pydantic-scim/default.nix
new file mode 100644
index 000000000000..9441bcc0eb84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydantic-scim/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pydantic
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pydantic-scim";
+  version = "0.0.8";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "chalk-ai";
+    repo = "pydantic-scim";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Hbc94v/+slXRGDKKbMui8WPwn28/1XcKvHkbLebWtj0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'version=get_version(),' 'version="${version}",'
+  '';
+
+  propagatedBuildInputs = [
+    pydantic
+  ] ++ pydantic.optional-dependencies.email;
+
+  pythonImportsCheck = [
+    "pydanticscim"
+  ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Pydantic types for SCIM";
+    homepage = "https://github.com/chalk-ai/pydantic-scim";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydantic-settings/default.nix b/nixpkgs/pkgs/development/python-modules/pydantic-settings/default.nix
new file mode 100644
index 000000000000..c27bb5f27576
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydantic-settings/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, pydantic
+, python-dotenv
+, pytestCheckHook
+, pytest-examples
+, pytest-mock
+}:
+
+buildPythonPackage rec {
+  pname = "pydantic-settings";
+  version = "2.0.3";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pydantic";
+    repo = "pydantic-settings";
+    rev = "v${version}";
+    hash = "sha256-3V6daCibvVr8RKo2o+vHC++QgIYKAOyRg11ATrCzM5Y=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    pydantic
+    python-dotenv
+  ];
+
+  pythonImportsCheck = [ "pydantic_settings" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-examples
+    pytest-mock
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  meta = with lib; {
+    description = "Settings management using pydantic";
+    homepage = "https://github.com/pydantic/pydantic-settings";
+    license = licenses.mit;
+    broken = lib.versionOlder pydantic.version "2.0.0";
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydantic/default.nix b/nixpkgs/pkgs/development/python-modules/pydantic/default.nix
new file mode 100644
index 000000000000..4384e51db22b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydantic/default.nix
@@ -0,0 +1,132 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, autoflake
+, cython
+, devtools
+, email-validator
+, fetchFromGitHub
+, fetchpatch
+, pytest-mock
+, pytestCheckHook
+, python-dotenv
+, pythonAtLeast
+, pythonOlder
+, pyupgrade
+, typing-extensions
+# dependencies for building documentation.
+# docs fail to build in Darwin sandbox: https://github.com/samuelcolvin/pydantic/issues/4245
+, withDocs ? (stdenv.hostPlatform == stdenv.buildPlatform && !stdenv.isDarwin && pythonAtLeast "3.10")
+, ansi2html
+, markdown-include
+, mike
+, mkdocs
+, mkdocs-exclude
+, mkdocs-material
+, mdx-truly-sane-lists
+, sqlalchemy
+, ujson
+, orjson
+, hypothesis
+, libxcrypt
+}:
+
+buildPythonPackage rec {
+  pname = "pydantic";
+  version = "1.10.12";
+  format = "setuptools";
+
+  outputs = [
+    "out"
+  ] ++ lib.optionals withDocs [
+    "doc"
+  ];
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pydantic";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-3XnbPGU90wLCPEryFAOky6Iy73Dvgzzh+GbOKW8hZ4U=";
+  };
+
+  postPatch = ''
+    sed -i '/flake8/ d' Makefile
+  '';
+
+  buildInputs = lib.optionals (pythonOlder "3.9") [
+    libxcrypt
+  ];
+
+  nativeBuildInputs = [
+    cython
+  ] ++ lib.optionals withDocs [
+    # dependencies for building documentation
+    autoflake
+    ansi2html
+    markdown-include
+    mdx-truly-sane-lists
+    mike
+    mkdocs
+    mkdocs-exclude
+    mkdocs-material
+    sqlalchemy
+    ujson
+    orjson
+    hypothesis
+  ];
+
+  propagatedBuildInputs = [
+    devtools
+    pyupgrade
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = {
+    dotenv = [
+      python-dotenv
+    ];
+    email = [
+      email-validator
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+  ] ++ lib.flatten (lib.attrValues passthru.optional-dependencies);
+
+  pytestFlagsArray = [
+    # https://github.com/pydantic/pydantic/issues/4817
+    "-W" "ignore::pytest.PytestReturnNotNoneWarning"
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  # Must include current directory into PYTHONPATH, since documentation
+  # building process expects "import pydantic" to work.
+  preBuild = lib.optionalString withDocs ''
+    PYTHONPATH=$PWD:$PYTHONPATH make docs
+  '';
+
+  # Layout documentation in same way as "sphinxHook" does.
+  postInstall = lib.optionalString withDocs ''
+    mkdir -p $out/share/doc/$name
+    mv ./site $out/share/doc/$name/html
+  '';
+
+  enableParallelBuilding = true;
+
+  pythonImportsCheck = [ "pydantic" ];
+
+  meta = with lib; {
+    description = "Data validation and settings management using Python type hinting";
+    homepage = "https://github.com/pydantic/pydantic";
+    changelog = "https://github.com/pydantic/pydantic/blob/v${version}/HISTORY.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ wd15 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydash/0001-Only-build-unit-tests.patch b/nixpkgs/pkgs/development/python-modules/pydash/0001-Only-build-unit-tests.patch
new file mode 100644
index 000000000000..56a5ff391194
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydash/0001-Only-build-unit-tests.patch
@@ -0,0 +1,30 @@
+From 2fe7a445bafedee2c43050e40697d8b0fd7f7b30 Mon Sep 17 00:00:00 2001
+From: Maximilian Bosch <maximilian@mbosch.me>
+Date: Fri, 19 Mar 2021 19:37:34 +0100
+Subject: [PATCH] Only build unit-tests
+
+---
+ setup.cfg | 7 -------
+ 1 file changed, 7 deletions(-)
+
+diff --git a/setup.cfg b/setup.cfg
+index 2c2f49f..a5ec152 100644
+--- a/setup.cfg
++++ b/setup.cfg
+@@ -83,13 +83,6 @@ force_sort_within_sections = true
+ junit_family = xunit2
+ addopts =
+     --verbose
+-    --doctest-modules
+-    --no-cov-on-fail
+-    --cov-fail-under=100
+-    --cov-report=term-missing
+-    --cov-report=xml:build/coverage/coverage.xml
+-    --cov-report=html:build/coverage
+-    --junitxml=build/testresults/junit.xml
+ 
+ [coverage:run]
+ omit =
+-- 
+2.29.3
+
diff --git a/nixpkgs/pkgs/development/python-modules/pydash/default.nix b/nixpkgs/pkgs/development/python-modules/pydash/default.nix
new file mode 100644
index 000000000000..14e7ffdfcd6e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydash/default.nix
@@ -0,0 +1,48 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, invoke
+, mock
+, pytestCheckHook
+, pythonOlder
+, sphinx-rtd-theme
+}:
+
+buildPythonPackage rec {
+  pname = "pydash";
+  version = "5.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "dgilland";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-VbuRzKwPMh5S4GZQYnh0sZOBi4LNFjMuol95tMC43b0=";
+  };
+
+  nativeCheckInputs = [
+    invoke
+    mock
+    sphinx-rtd-theme
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    sed -i "/--cov/d" setup.cfg
+    sed -i "/--no-cov/d" setup.cfg
+  '';
+
+  pythonImportsCheck = [
+    "pydash"
+  ];
+
+  meta = with lib; {
+    description = "Python utility libraries for doing stuff in a functional way";
+    homepage = "https://pydash.readthedocs.io";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ma27 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydata-google-auth/default.nix b/nixpkgs/pkgs/development/python-modules/pydata-google-auth/default.nix
new file mode 100644
index 000000000000..f24f2e78470b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydata-google-auth/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, google-auth
+, google-auth-oauthlib
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pydata-google-auth";
+  version = "1.8.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    repo = pname;
+    owner = "pydata";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Wo+tXbzOuz/cW8GuWoSxLA/Lr2S9NMdePa8tIV39mbY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    google-auth
+    google-auth-oauthlib
+  ];
+
+  # tests require network access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pydata_google_auth"
+  ];
+
+  meta = with lib; {
+    description = "Helpers for authenticating to Google APIs";
+    homepage = "https://github.com/pydata/pydata-google-auth";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydata-sphinx-theme/default.nix b/nixpkgs/pkgs/development/python-modules/pydata-sphinx-theme/default.nix
new file mode 100644
index 000000000000..8310d2fe21ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydata-sphinx-theme/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, sphinx
+, accessible-pygments
+, beautifulsoup4
+, docutils
+, packaging
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "pydata-sphinx-theme";
+  version = "0.14.4";
+
+  format = "wheel";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit version format;
+    dist = "py3";
+    python = "py3";
+    pname = "pydata_sphinx_theme";
+    hash = "sha256-rBUgH0wuLnBCsMrYswJRQzwfkr52Ldzv20rmiBHZGNk=";
+  };
+
+  propagatedBuildInputs = [
+    sphinx
+    accessible-pygments
+    beautifulsoup4
+    docutils
+    packaging
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [
+    "pydata_sphinx_theme"
+  ];
+
+  meta = with lib; {
+    description = "Bootstrap-based Sphinx theme from the PyData community";
+    homepage = "https://github.com/pydata/pydata-sphinx-theme";
+    changelog = "https://github.com/pydata/pydata-sphinx-theme/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydateinfer/default.nix b/nixpkgs/pkgs/development/python-modules/pydateinfer/default.nix
new file mode 100644
index 000000000000..a2fb97236dfd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydateinfer/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, unittestCheckHook
+, pytz
+, pyyaml
+, argparse
+}:
+
+buildPythonPackage rec {
+  pname = "pydateinfer";
+  version = "0.3.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "wdm0006";
+    repo = "dateinfer";
+    rev = "${version},"; # yes the comma is required, this is correct name of git tag
+    hash = "sha256-0gy7wfT/uMTmpdIF2OPGVeUh+4yqJSI2Ebif0Lf/DLM=";
+  };
+
+  propagatedBuildInputs = [
+    pytz
+  ];
+
+  preCheck = "cd dateinfer";
+  nativeCheckInputs = [
+    unittestCheckHook
+    pyyaml
+    argparse
+  ];
+  pythonImportsCheck = [ "dateinfer" ];
+
+  meta = with lib; {
+    description = "Infers date format from examples";
+    homepage = "https://pypi.org/project/pydateinfer/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydbus/default.nix b/nixpkgs/pkgs/development/python-modules/pydbus/default.nix
new file mode 100644
index 000000000000..fc8965fd3538
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydbus/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pygobject3
+}:
+
+buildPythonPackage rec {
+  pname = "pydbus";
+  version = "0.6.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "LEW21";
+    repo = "pydbus";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-F1KKXG+7dWlEbToqtF3G7wU0Sco7zH5NqzlL58jyDGw=";
+  };
+
+  postPatch = ''
+    substituteInPlace pydbus/_inspect3.py \
+      --replace "getargspec" "getfullargspec"
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pygobject3
+  ];
+
+  pythonImportsCheck = [
+    "pydbus"
+    "pydbus.generic"
+  ];
+
+  doCheck = false; # requires a working dbus setup
+
+  meta = {
+    homepage = "https://github.com/LEW21/pydbus";
+    description = "Pythonic DBus library";
+    license = lib.licenses.lgpl2Plus;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydeck/default.nix b/nixpkgs/pkgs/development/python-modules/pydeck/default.nix
new file mode 100644
index 000000000000..da009608b678
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydeck/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ipykernel
+, ipywidgets
+, jinja2
+, jupyter
+, numpy
+, pandas
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, traitlets
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pydeck";
+  version = "0.8.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-B+3egz98/O9nSRJDURlap9zSRmPUkJ/XiY29C2+8Aew=";
+  };
+
+  nativeBuildInputs = [
+    jinja2
+    jupyter
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    jinja2
+    numpy
+  ];
+
+  passthru.optional-dependencies = {
+    carto = [
+      # pydeck-carto
+    ];
+    jupyter = [
+      ipykernel
+      ipywidgets
+      traitlets
+    ];
+  };
+
+  pythonImportsCheck = [ "pydeck" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pandas
+  ] ++ passthru.optional-dependencies.jupyter;
+
+  # tries to start a jupyter server
+  disabledTests = [ "test_nbconvert" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/visgl/deck.gl/tree/master/bindings/pydeck";
+    description = "Large-scale interactive data visualization in Python";
+    maintainers = with maintainers; [ creator54 ];
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydeconz/default.nix b/nixpkgs/pkgs/development/python-modules/pydeconz/default.nix
new file mode 100644
index 000000000000..9a322790f865
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydeconz/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, orjson
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pydeconz";
+  version = "114";
+  pyproject = true;
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "Kane610";
+    repo = "deconz";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-XN6di3pxB7lhZ5TQnyHr7nKA0STBi0CVzGnhvRDsbFY=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov=pydeconz --cov-report term-missing" "" \
+      --replace "setuptools==" "setuptools>=" \
+      --replace "wheel==" "wheel>="
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    orjson
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pydeconz"
+  ];
+
+  meta = with lib; {
+    description = "Python library wrapping the Deconz REST API";
+    homepage = "https://github.com/Kane610/deconz";
+    changelog = "https://github.com/Kane610/deconz/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydelijn/default.nix b/nixpkgs/pkgs/development/python-modules/pydelijn/default.nix
new file mode 100644
index 000000000000..728160fe8d1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydelijn/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "pydelijn";
+  version = "1.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-xyBq2h3ipUarkjCXq9GIbY7bhsf9729aQwHde3o5K6g=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    pytz
+  ];
+
+  postPatch = ''
+    # Remove with next release
+    substituteInPlace setup.py \
+      --replace "async_timeout>=3.0.1,<4.0" "async_timeout>=3.0.1"
+    # https://github.com/bollewolle/pydelijn/pull/11
+    substituteInPlace pydelijn/common.py \
+      --replace ", loop=self.loop" ""
+  '';
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pydelijn"
+  ];
+
+  meta = with lib; {
+    description = "Python package to retrieve realtime data of passages at stops of De Lijn";
+    homepage = "https://github.com/bollewolle/pydelijn";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydenticon/default.nix b/nixpkgs/pkgs/development/python-modules/pydenticon/default.nix
new file mode 100644
index 000000000000..44913e1de476
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydenticon/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pillow
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "pydenticon";
+  version = "0.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2ef363cdd6f4f0193ce62257486027e36884570f6140bbde51de72df321b77f1";
+  };
+
+  propagatedBuildInputs = [ pillow mock ];
+
+  meta = with lib; {
+    homepage = "https://github.com/azaghal/pydenticon";
+    description = "Library for generating identicons. Port of Sigil (https://github.com/cupcake/sigil) with enhancements";
+    license = licenses.bsd0;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydeps/default.nix b/nixpkgs/pkgs/development/python-modules/pydeps/default.nix
new file mode 100644
index 000000000000..f84123163ccf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydeps/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, graphviz
+, stdlib-list
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "pydeps";
+  version = "1.12.17";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "thebjorn";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-DVSZeNuDz/y0jh/HimV+jFgNFevMhUKOu6EhZytMMqQ=";
+  };
+
+  buildInputs = [
+    graphviz
+  ];
+
+  propagatedBuildInputs = [
+    graphviz
+    stdlib-list
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pyyaml
+    toml
+  ];
+
+  postPatch = ''
+    # Path is hard-coded
+    substituteInPlace pydeps/dot.py \
+      --replace "dot -Gstart=1" "${lib.makeBinPath [ graphviz ]}/dot -Gstart=1"
+  '';
+
+  disabledTests = [
+    # Would require to have additional modules available
+    "test_find_package_names"
+  ];
+
+  pythonImportsCheck = [
+    "pydeps"
+  ];
+
+  meta = with lib; {
+    description = "Python module dependency visualization";
+    homepage = "https://github.com/thebjorn/pydeps";
+    changelog = "https://github.com/thebjorn/pydeps/releases/tag/v${version}";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydes/default.nix b/nixpkgs/pkgs/development/python-modules/pydes/default.nix
new file mode 100644
index 000000000000..0bceaeceaa37
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydes/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub, python }:
+
+buildPythonPackage rec {
+  pname = "pydes";
+  version = "unstable-2019-01-08";
+
+  src = fetchFromGitHub {
+    owner = "twhiteman";
+    repo = "pyDes";
+    rev = "e988a5ffc9abb8010fc75dba54904d1c5dbe83db";
+    sha256 = "0sic8wbyk5azb4d4m6zbc96lfqcw8s2pzcv9nric5yqc751613ww";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} test_pydes.py
+  '';
+
+  pythonImportsCheck = [ "pyDes" ];
+
+  meta = with lib; {
+    description = "A pure python module which implements the DES and Triple-DES encryption algorithms";
+    homepage = "https://github.com/twhiteman/pyDes";
+    license = licenses.mit;
+    maintainers = with maintainers; [ j0hax ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydevccu/default.nix b/nixpkgs/pkgs/development/python-modules/pydevccu/default.nix
new file mode 100644
index 000000000000..81364bd203ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydevccu/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pydevccu";
+  version = "0.1.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "danielperna84";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-wzltcerAGh/QfHGg+M7Hlw4SfDEg23K2plSyrmz/m7E=";
+  };
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pydevccu"
+  ];
+
+  meta = with lib; {
+    description = "HomeMatic CCU XML-RPC Server with fake devices";
+    homepage = "https://github.com/danielperna84/pydevccu";
+    changelog = "https://github.com/danielperna84/pydevccu/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydevd/default.nix b/nixpkgs/pkgs/development/python-modules/pydevd/default.nix
new file mode 100644
index 000000000000..8ee2f8d98acf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydevd/default.nix
@@ -0,0 +1,79 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, numpy
+, psutil
+, pytestCheckHook
+, pythonOlder
+, trio
+, untangle
+}:
+
+buildPythonPackage rec {
+  pname = "pydevd";
+  version = "2.9.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "fabioz";
+    repo = "PyDev.Debugger";
+    rev = "pydev_debugger_${lib.replaceStrings ["."] ["_"] version}";
+    hash = "sha256-TDU/V7kY7zVxiP4OVjGqpsRVYplpkgCly2qAOqhZONo=";
+  };
+
+  patches = [
+    # https://github.com/fabioz/PyDev.Debugger/pull/258
+    (fetchpatch {
+      name = "numpy-1.25-test-compatibility.patch";
+      url = "https://github.com/fabioz/PyDev.Debugger/commit/6f637d951cda62dc2202a2c7b6af526c4d1e8a00.patch";
+      hash = "sha256-DLzZZwQHtqGZGA8nsBLNQqamuI4xUfQ89Gd21sJa9/s=";
+    })
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    numpy
+    psutil
+    pytestCheckHook
+    trio
+    untangle
+  ];
+
+  disabledTests = [
+    # Require network connection
+    "test_completion_sockets_and_messages"
+    "test_path_translation"
+    "test_attach_to_pid_no_threads"
+    "test_attach_to_pid_halted"
+    "test_remote_debugger_threads"
+    "test_path_translation_and_source_reference"
+    "test_attach_to_pid"
+    "test_terminate"
+    "test_gui_event_loop_custom"
+    # AssertionError: assert '/usr/bin/' == '/usr/bin'
+    # https://github.com/fabioz/PyDev.Debugger/issues/227
+    "test_to_server_and_to_client"
+    # AssertionError pydevd_tracing.set_trace_to_threads(tracing_func) == 0
+    "test_tracing_other_threads"
+    "test_tracing_basic"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_multiprocessing_simple"
+    "test_evaluate_exception_trace"
+  ];
+
+  pythonImportsCheck = [
+    "pydevd"
+  ];
+
+  meta = with lib; {
+    description = "PyDev.Debugger (used in PyDev, PyCharm and VSCode Python)";
+    homepage = "https://github.com/fabioz/PyDev.Debugger";
+    license = licenses.epl10;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydevtool/default.nix b/nixpkgs/pkgs/development/python-modules/pydevtool/default.nix
new file mode 100644
index 000000000000..c9a0d67fcebf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydevtool/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, fetchPypi
+, setuptools
+, buildPythonPackage
+, doit
+}:
+
+buildPythonPackage rec {
+  pname = "pydevtool";
+  version = "0.3.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JeO6Tz0zzKwz7iuXdZlYSNSemzGLehRkd/tdUveG/Io=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    doit
+  ];
+
+  pythonImportsCheck = [
+    "pydevtool"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pydoit/pydevtool";
+    description = "CLI dev tools powered by pydoit";
+    license = licenses.mit;
+    maintainers = with maintainers; [ doronbehar ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydexcom/default.nix b/nixpkgs/pkgs/development/python-modules/pydexcom/default.nix
new file mode 100644
index 000000000000..3a2243541291
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydexcom/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, requests
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pydexcom";
+  version = "0.3.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "gagebenne";
+    repo = "pydexcom";
+    rev = "refs/tags/${version}";
+    hash = "sha256-46+Ml73F6EUbMwRJB93FD+No/g65RJwnCnFzH4Pb5ek=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Tests are interacting with the Dexcom API
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pydexcom"
+  ];
+
+  meta = with lib; {
+    description = "Python API to interact with Dexcom Share service";
+    homepage = "https://github.com/gagebenne/pydexcom";
+    changelog = "https://github.com/gagebenne/pydexcom/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydicom-seg/default.nix b/nixpkgs/pkgs/development/python-modules/pydicom-seg/default.nix
new file mode 100644
index 000000000000..52708208d4c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydicom-seg/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pythonOlder
+, pytestCheckHook
+, pythonRelaxDepsHook
+, poetry-core
+, jsonschema
+, numpy
+, pydicom
+, simpleitk
+}:
+
+buildPythonPackage rec {
+  pname = "pydicom-seg";
+  version = "0.4.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "razorx89";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-2Y3fZHKfZqdp5EU8HfVsmJ5JFfVGZuAR7+Kj7qaTiPM=";
+    fetchSubmodules = true;
+  };
+
+  patches = [
+    # https://github.com/razorx89/pydicom-seg/pull/54
+    (fetchpatch {
+      name = "replace-poetry-with-poetry-core.patch";
+      url = "https://github.com/razorx89/pydicom-seg/commit/ac91eaefe3b0aecfe745869972c08de5350d2b61.patch";
+      hash = "sha256-xBOVjWZPjyQ8gSj6JLe9B531e11TI3FUFFtL+IelZOM=";
+    })
+  ];
+
+  pythonRelaxDeps = [
+    "jsonschema"
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    jsonschema
+    numpy
+    pydicom
+    simpleitk
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pydicom_seg"
+  ];
+
+  meta = with lib; {
+    description = "Medical segmentation file reading and writing";
+    homepage = "https://github.com/razorx89/pydicom-seg";
+    changelog = "https://github.com/razorx89/pydicom-seg/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydicom/default.nix b/nixpkgs/pkgs/development/python-modules/pydicom/default.nix
new file mode 100644
index 000000000000..ddb4482ef3e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydicom/default.nix
@@ -0,0 +1,84 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, numpy
+, pillow
+, setuptools
+}:
+
+let
+  pname = "pydicom";
+  version = "2.4.3";
+
+  src = fetchFromGitHub {
+    owner = "pydicom";
+    repo = "pydicom";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-PF4iA/FPxPYD8OfgWqKRndwi2vURuzh6tlEwduxs/3E=";
+  };
+
+  # Pydicom needs pydicom-data to run some tests. If these files aren't downloaded
+  # before the package creation, it'll try to download during the checkPhase.
+  test_data = fetchFromGitHub {
+    owner = "pydicom";
+    repo = "pydicom-data";
+    rev = "cbb9b2148bccf0f550e3758c07aca3d0e328e768";
+    hash = "sha256-nF/j7pfcEpWHjjsqqTtIkW8hCEbuQ3J4IxpRk0qc1CQ=";
+  };
+
+in
+buildPythonPackage {
+  inherit pname version src;
+  disabled = pythonOlder "3.6";
+
+  format = "setuptools";
+
+  patches = [
+    # backport of https://github.com/pydicom/pydicom/commit/2513a20cc41743a42bdb86f4cbb4873899b7823c
+    ./pillow-10.1.0-compat.patch
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    pillow
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Setting $HOME to prevent pytest to try to create a folder inside
+  # /homeless-shelter which is read-only.
+  # Linking pydicom-data dicom files to $HOME/.pydicom/data
+  preCheck = ''
+    export HOME=$TMP/test-home
+    mkdir -p $HOME/.pydicom/
+    ln -s ${test_data}/data_store/data $HOME/.pydicom/data
+  '';
+
+  disabledTests = [
+    # tries to remove a dicom inside $HOME/.pydicom/data/ and download it again
+    "test_fetch_data_files"
+  ] ++ lib.optionals stdenv.isAarch64 [
+    # https://github.com/pydicom/pydicom/issues/1386
+    "test_array"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # flaky, hard to reproduce failure outside hydra
+    "test_time_check"
+  ];
+
+  pythonImportsCheck = [
+    "pydicom"
+  ];
+
+  meta = with lib; {
+    description = "Python package for working with DICOM files";
+    homepage = "https://pydicom.github.io";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydicom/pillow-10.1.0-compat.patch b/nixpkgs/pkgs/development/python-modules/pydicom/pillow-10.1.0-compat.patch
new file mode 100644
index 000000000000..2599f955f7dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydicom/pillow-10.1.0-compat.patch
@@ -0,0 +1,29 @@
+diff --git a/pydicom/pixel_data_handlers/pillow_handler.py b/pydicom/pixel_data_handlers/pillow_handler.py
+index ff781025d..a44eb9a41 100644
+--- a/pydicom/pixel_data_handlers/pillow_handler.py
++++ b/pydicom/pixel_data_handlers/pillow_handler.py
+@@ -119,18 +119,12 @@ def _decompress_single_frame(
+     # space prior to compression, setting the value of "mode" to YCbCr
+     # signals Pillow to not apply any color transformation upon
+     # decompression.
+-    if (transfer_syntax in PillowJPEGTransferSyntaxes and
+-            photometric_interpretation == 'RGB'):
+-        if 'adobe_transform' not in image.info:
+-            color_mode = 'YCbCr'
+-            image.tile = [(
+-                'jpeg',
+-                image.tile[0][1],
+-                image.tile[0][2],
+-                (color_mode, ''),
+-            )]
+-            image.mode = color_mode
+-            image.rawmode = color_mode
++    if (
++        transfer_syntax in PillowJPEGTransferSyntaxes
++        and photometric_interpretation == 'RGB'
++        and "adobe_transform" not in image.info
++    ):
++        image.draft("YCbCr", image.size)
+     return image
+ 
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/pydigiham/default.nix b/nixpkgs/pkgs/development/python-modules/pydigiham/default.nix
new file mode 100644
index 000000000000..8ae69c9bf5dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydigiham/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchFromGitHub, python, digiham, csdr, pycsdr, codecserver }:
+
+buildPythonPackage rec {
+  pname = "pydigiham";
+  version = "0.6.0";
+
+  src = fetchFromGitHub {
+    owner = "jketterl";
+    repo = "pydigiham";
+    rev = version;
+    hash = "sha256-kiEvQl3SuDnHI4Fh97AarsszHGFt7tbWBvBRW84Qv18=";
+  };
+
+  propagatedBuildInputs = [ digiham ];
+  buildInputs = [ codecserver pycsdr ];
+  # make pycsdr header files available
+  preBuild = ''
+    ln -s ${pycsdr}/include/${python.libPrefix}/pycsdr src/pycsdr
+  '';
+
+  # has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "digiham" ];
+
+  meta = {
+    homepage = "https://github.com/jketterl/pydigiham";
+    description = "bindings for the csdr library";
+    license = lib.licenses.gpl3Only;
+    maintainers = lib.teams.c3d2.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydiscourse/default.nix b/nixpkgs/pkgs/development/python-modules/pydiscourse/default.nix
new file mode 100644
index 000000000000..f897509c182e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydiscourse/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "pydiscourse";
+  version = "1.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pydiscourse";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-BvVKOfc/PiAnkEnH5jsd8/0owr+ZvJIz/tpZx6K0fP0=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pythonImportsCheck = [
+    "pydiscourse"
+  ];
+
+  meta = with lib; {
+    description = "A Python library for working with Discourse";
+    homepage = "https://github.com/pydiscourse/pydiscourse";
+    changelog = "https://github.com/pydiscourse/pydiscourse/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Dettorer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydiscovergy/default.nix b/nixpkgs/pkgs/development/python-modules/pydiscovergy/default.nix
new file mode 100644
index 000000000000..3c87b6b6f3a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydiscovergy/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, authlib
+, buildPythonPackage
+, dataclasses-json
+, fetchFromGitHub
+, httpx
+, marshmallow
+, pytest-httpx
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, pytz
+, respx
+}:
+
+buildPythonPackage rec {
+  pname = "pydiscovergy";
+  version = "2.0.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "jpbede";
+    repo = "pydiscovergy";
+    rev = "refs/tags/${version}";
+    hash = "sha256-u2G+o/vhPri7CPSnekC8rUo/AvuvePpG51MR+FdH2XA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    authlib
+    dataclasses-json
+    httpx
+    marshmallow
+    pytz
+  ];
+
+  nativeCheckInputs = [
+    pytest-httpx
+    pytestCheckHook
+    respx
+  ];
+
+  pythonImportsCheck = [
+    "pydiscovergy"
+  ];
+
+  meta = with lib; {
+    description = "Async Python 3 library for interacting with the Discovergy API";
+    homepage = "https://github.com/jpbede/pydiscovergy";
+    changelog = "https://github.com/jpbede/pydiscovergy/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydispatcher/default.nix b/nixpkgs/pkgs/development/python-modules/pydispatcher/default.nix
new file mode 100644
index 000000000000..ad39feabd07d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydispatcher/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  version = "2.0.7";
+  pname = "pydispatcher";
+
+  src = fetchPypi {
+    pname = "PyDispatcher";
+    inherit version;
+    hash = "sha256-t3fGrQgNwbrXSkwp1qRpFPpnAaxw+UsNZvvP3mL1vjE=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    homepage = "https://pydispatcher.sourceforge.net/";
+    description = "Signal-registration and routing infrastructure for use in multiple contexts";
+    license = licenses.bsd3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydmd/default.nix b/nixpkgs/pkgs/development/python-modules/pydmd/default.nix
new file mode 100644
index 000000000000..d77caf7e4ad0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydmd/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, future
+, matplotlib
+, numpy
+, pytestCheckHook
+, pythonOlder
+, scipy
+, ezyrb
+}:
+
+buildPythonPackage rec {
+  pname = "pydmd";
+  version = "0.4.0.post2302";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "mathLab";
+    repo = "PyDMD";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-EYVmaxwOxje3KVrNbvsjwRqQBD7Rje/JK+qB1F7EqA0=";
+  };
+
+  propagatedBuildInputs = [
+    future
+    matplotlib
+    numpy
+    scipy
+    ezyrb
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    # test suite takes over 100 vCPU hours, just run small subset of it.
+    # TODO: Add a passthru.tests with all tests
+    "tests/test_dmdbase.py"
+  ];
+
+  pythonImportsCheck = [
+    "pydmd"
+  ];
+
+  meta = with lib; {
+    description = "Python Dynamic Mode Decomposition";
+    homepage = "https://mathlab.github.io/PyDMD/";
+    changelog = "https://github.com/mathLab/PyDMD/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ yl3dy ];
+    broken = stdenv.hostPlatform.isAarch64;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydocstyle/default.nix b/nixpkgs/pkgs/development/python-modules/pydocstyle/default.nix
new file mode 100644
index 000000000000..62905e2a0865
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydocstyle/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, snowballstemmer
+, tomli
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pydocstyle";
+  version = "6.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "PyCQA";
+    repo = "pydocstyle";
+    rev = "refs/tags/${version}";
+    hash = "sha256-MjRrnWu18f75OjsYIlOLJK437X3eXnlW8WkkX7vdS6k=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'version = "0.0.0-dev"' 'version = "${version}"'
+  '';
+
+  propagatedBuildInputs = [
+    snowballstemmer
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  passthru.optional-dependencies.toml = [
+    tomli
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.toml;
+
+  disabledTestPaths = [
+    "src/tests/test_integration.py" # runs pip install
+  ];
+
+  meta = with lib; {
+    description = "Python docstring style checker";
+    homepage = "https://github.com/PyCQA/pydocstyle";
+    changelog = "https://github.com/PyCQA/pydocstyle/blob/${version}/docs/release_notes.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dzabraev ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydocumentdb/default.nix b/nixpkgs/pkgs/development/python-modules/pydocumentdb/default.nix
new file mode 100644
index 000000000000..7a78730d39b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydocumentdb/default.nix
@@ -0,0 +1,33 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, six
+, requests
+}:
+
+buildPythonPackage rec {
+  version = "2.3.5";
+  pname = "pydocumentdb";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1e6f072ae516fc061c9442f8ca470463b53dc626f0f6a86ff3a803293f4b50dd";
+  };
+
+  # https://github.com/Azure/azure-cosmos-python/issues/183
+  preBuild = ''
+    touch changelog.md
+  '';
+
+  propagatedBuildInputs = [ six requests ];
+
+  # requires an active Azure Cosmos service
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Azure Cosmos DB API";
+    homepage = "https://github.com/Azure/azure-cosmos-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydoods/default.nix b/nixpkgs/pkgs/development/python-modules/pydoods/default.nix
new file mode 100644
index 000000000000..ff0872e42377
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydoods/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pydoods";
+  version = "1.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1brpcfj1iy9mhf2inla4gi681zlh7g4qvhr6vrprk6r693glpn3x";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "pydoods" ];
+
+  meta = with lib; {
+    description = "Python wrapper for the DOODS service";
+    homepage = "https://github.com/snowzach/pydoods";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydot/default.nix b/nixpkgs/pkgs/development/python-modules/pydot/default.nix
new file mode 100644
index 000000000000..ac965f8404e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydot/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, substituteAll
+, graphviz
+, python
+, pytestCheckHook
+, chardet
+, pythonOlder
+, pyparsing
+}:
+
+buildPythonPackage rec {
+  pname = "pydot";
+  version = "1.4.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "248081a39bcb56784deb018977e428605c1c758f10897a339fce1dd728ff007d";
+  };
+
+  propagatedBuildInputs = [
+    pyparsing
+  ];
+
+  nativeCheckInputs = [
+    chardet
+    pytestCheckHook
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./hardcode-graphviz-path.patch;
+      inherit graphviz;
+    })
+  ];
+
+  postPatch = ''
+    # test_graphviz_regression_tests also fails upstream: https://github.com/pydot/pydot/pull/198
+    substituteInPlace test/pydot_unittest.py \
+      --replace "test_graphviz_regression_tests" "no_test_graphviz_regression_tests" \
+    # Patch path for pytestCheckHook
+    substituteInPlace test/pydot_unittest.py \
+      --replace "shapefile_dir = os.path.join(test_dir, 'from-past-to-future')" "shapefile_dir = 'test/from-past-to-future'" \
+      --replace "path = os.path.join(test_dir, TESTS_DIR_1)" "path = os.path.join('test/', TESTS_DIR_1)"
+  '';
+
+  pytestFlagsArray = [
+    "test/pydot_unittest.py"
+  ];
+
+  disabledTests = [
+    "test_exception_msg"
+    # Hash mismatch
+    "test_my_regression_tests"
+  ];
+
+  pythonImportsCheck = [
+    "pydot"
+  ];
+
+  meta = with lib; {
+    description = "Allows to create both directed and non directed graphs from Python";
+    homepage = "https://github.com/erocarrera/pydot";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydot/hardcode-graphviz-path.patch b/nixpkgs/pkgs/development/python-modules/pydot/hardcode-graphviz-path.patch
new file mode 100644
index 000000000000..e862f1e7c2c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydot/hardcode-graphviz-path.patch
@@ -0,0 +1,13 @@
+diff --git a/pydot.py b/pydot.py
+index 3c7da4d..582c5bc 100644
+--- a/pydot.py
++++ b/pydot.py
+@@ -124,7 +124,7 @@ def call_graphviz(program, arguments, working_dir, **kwargs):
+         'LD_LIBRARY_PATH': os.environ.get('LD_LIBRARY_PATH', ''),
+     }
+ 
+-    program_with_args = [program, ] + arguments
++    program_with_args = ['@graphviz@/bin/' + program, ] + arguments
+ 
+     process = subprocess.Popen(
+         program_with_args,
diff --git a/nixpkgs/pkgs/development/python-modules/pydrawise/default.nix b/nixpkgs/pkgs/development/python-modules/pydrawise/default.nix
new file mode 100644
index 000000000000..dc36f149a9b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydrawise/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, aiohttp
+, aioresponses
+, apischema
+, buildPythonPackage
+, fetchFromGitHub
+, freezegun
+, gql
+, graphql-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, requests
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pydrawise";
+  version = "2023.11.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "dknowles2";
+    repo = "pydrawise";
+    rev = "refs/tags/${version}";
+    hash = "sha256-gKOyTvdETGzKlpU67UKaHYTIvnAX9znHIynP3BiVbt4=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    apischema
+    gql
+    graphql-core
+    requests
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    freezegun
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pydrawise"
+  ];
+
+  meta = with lib; {
+    description = "Library for interacting with Hydrawise sprinkler controllers through the GraphQL API";
+    homepage = "https://github.com/dknowles2/pydrawise";
+    changelog = "https://github.com/dknowles2/pydrawise/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydrive2/default.nix b/nixpkgs/pkgs/development/python-modules/pydrive2/default.nix
new file mode 100644
index 000000000000..ddeb72bfbdf9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydrive2/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, google-api-python-client
+, oauth2client
+, pyopenssl
+, pyyaml
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pydrive2";
+  version = "1.17.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "PyDrive2";
+    inherit version;
+    hash = "sha256-aP6pNDR7thK3qEiBHUgUnbhAvPtfpNeothYbLSrf7HA=";
+  };
+
+  propagatedBuildInputs = [
+    google-api-python-client
+    oauth2client
+    pyopenssl
+    pyyaml
+  ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pydrive2"
+  ];
+
+  meta = with lib; {
+    description = "Google Drive API Python wrapper library";
+    homepage = "https://github.com/iterative/PyDrive2";
+    changelog = "https://github.com/iterative/PyDrive2/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ sei40kr ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydroid-ipcam/default.nix b/nixpkgs/pkgs/development/python-modules/pydroid-ipcam/default.nix
new file mode 100644
index 000000000000..7013c70cdf5e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydroid-ipcam/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "pydroid-ipcam";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-toY3eVJdB5rbRuwkXMizpQUxUTo4Y1tWKFCZZuiYaGI=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pydroid_ipcam"
+  ];
+
+  meta = with lib; {
+    description = "Python library for Android IP Webcam";
+    homepage = "https://github.com/home-assistant-libs/pydroid-ipcam";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydruid/default.nix b/nixpkgs/pkgs/development/python-modules/pydruid/default.nix
new file mode 100644
index 000000000000..9ede441bd817
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydruid/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+  # required dependencies
+, requests
+, setuptools
+  # optional dependencies
+, pandas
+, tornado
+, sqlalchemy
+  # test dependencies
+, pycurl
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pydruid";
+  version = "0.6.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    repo = pname;
+    owner = "druid-io";
+    rev = "refs/tags/${version}";
+    hash = "sha256-9+xomjSwWDVHkret/mqAZKWOPFRMvVB3CWtFPzrT81k=";
+  };
+
+  # patch out the CLI because it doesn't work with newer versions of pygments
+  postPatch = ''
+    substituteInPlace setup.py --replace '"console_scripts": ["pydruid = pydruid.console:main"],' ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pycurl
+  ] ++ lib.flatten (lib.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "pydruid"
+  ];
+
+  passthru = {
+    optional-dependencies = {
+      pandas = [ pandas ];
+      async = [ tornado ];
+      sqlalchemy = [ sqlalchemy ];
+      # druid has a `cli` extra, but it doesn't work with nixpkgs pygments
+    };
+  };
+
+  meta = with lib; {
+    description = "Simple API to create, execute, and analyze Druid queries";
+    homepage = "https://github.com/druid-io/pydruid";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydsdl/default.nix b/nixpkgs/pkgs/development/python-modules/pydsdl/default.nix
new file mode 100644
index 000000000000..b3dfed8c6cac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydsdl/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+ buildPythonPackage rec {
+  pname = "pydsdl";
+  version = "1.18.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "OpenCyphal";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-sn7KoJmJbr7Y+N9PAXyhJnts/hW+Gi06nrHj5VIDZMU=";
+  };
+
+  # allow for writable directory for darwin
+  preBuild = ''
+    export HOME=$TMPDIR
+  '';
+
+  # Module doesn't contain tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pydsdl"
+  ];
+
+  meta = with lib; {
+    description = "Library to process Cyphal DSDL";
+    longDescription = ''
+      PyDSDL is a Cyphal DSDL compiler front-end implemented in Python. It accepts
+      a DSDL namespace at the input and produces a well-annotated abstract syntax
+      tree (AST) at the output, evaluating all constant expressions in the process.
+      All DSDL features defined in the Cyphal Specification are supported. The
+      library should, in theory, work on any platform and with any Python
+      implementation.
+    '';
+    homepage = "https://pydsdl.readthedocs.io/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ wucke13 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydub/default.nix b/nixpkgs/pkgs/development/python-modules/pydub/default.nix
new file mode 100644
index 000000000000..a7c21329b594
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydub/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+
+# tests
+, ffmpeg-full
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "pydub";
+  version = "0.25.1";
+  format = "setuptools";
+
+  # pypi version doesn't include required data files for tests
+  src = fetchFromGitHub {
+    owner = "jiaaro";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0xskllq66wqndjfmvp58k26cv3w480sqsil6ifwp4gghir7hqc8m";
+  };
+
+  pythonImportsCheck = [
+    "pydub"
+    "pydub.audio_segment"
+    "pydub.playback"
+  ];
+
+  nativeCheckInputs = [
+    ffmpeg-full
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} test/test.py
+  '';
+
+  meta = with lib; {
+    description = "Manipulate audio with a simple and easy high level interface";
+    homepage = "http://pydub.com";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyduke-energy/default.nix b/nixpkgs/pkgs/development/python-modules/pyduke-energy/default.nix
new file mode 100644
index 000000000000..d0342f8cff68
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyduke-energy/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, jsonpickle
+, paho-mqtt
+, pytest-asyncio
+, pytest-timeout
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyduke-energy";
+  version = "1.0.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mjmeli";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-7KkUpsHg3P2cF0bVl3FzyAQwzeaCmg+vzRHlM/TIcNA=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    jsonpickle
+    paho-mqtt
+    python-dateutil
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyduke_energy"
+  ];
+
+  meta = with lib; {
+    description = "Python module for the Duke Energy API";
+    homepage = "https://github.com/mjmeli/pyduke-energy";
+    changelog = "https://github.com/mjmeli/pyduke-energy/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyduotecno/default.nix b/nixpkgs/pkgs/development/python-modules/pyduotecno/default.nix
new file mode 100644
index 000000000000..237570b0e9ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyduotecno/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pyduotecno";
+  version = "2023.11.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Cereal2nd";
+    repo = "pyDuotecno";
+    rev = "refs/tags/${version}";
+    hash = "sha256-gLP5N07msjuQeeyjbCvZK4TrVyZKUCSSKsjNY5Pa9gQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "duotecno"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with Duotecno IP interfaces";
+    homepage = "https://github.com/Cereal2nd/pyDuotecno";
+    changelog = "https://github.com/Cereal2nd/pyDuotecno/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydy/default.nix b/nixpkgs/pkgs/development/python-modules/pydy/default.nix
new file mode 100644
index 000000000000..c7ee5359bee4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydy/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, cython
+, numpy
+, scipy
+, sympy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pydy";
+  version = "0.7.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-aaRinJMGR8v/OVkeSp1hA4+QLOrmDWq50wvA6b/suvk=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    sympy
+  ];
+
+  nativeCheckInputs = [
+    nose
+    cython
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests not fixed yet. Check https://github.com/pydy/pydy/issues/465
+    "test_generate_cse"
+    "test_generate_code_blocks"
+    "test_doprint"
+    "test_OctaveMatrixGenerator"
+  ];
+
+  meta = with lib; {
+    description = "Python tool kit for multi-body dynamics";
+    homepage = "http://pydy.org";
+    license = licenses.bsd3;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pydyf/default.nix b/nixpkgs/pkgs/development/python-modules/pydyf/default.nix
new file mode 100644
index 000000000000..0cf3c5677cdc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pydyf/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, ghostscript
+, pillow
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pydyf";
+  version = "0.8.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sise8BYUG1SUGtZu1OA2p73/OcCzYJk7KDh1w/hU3Zo=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--isort --flake8 --cov --no-cov-on-fail" ""
+  '';
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  nativeCheckInputs = [
+    ghostscript
+    pillow
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pydyf"
+  ];
+
+  meta = with lib; {
+    description = "Low-level PDF generator written in Python and based on PDF specification 1.7";
+    homepage = "https://doc.courtbouillon.org/pydyf/stable/";
+    changelog = "https://github.com/CourtBouillon/pydyf/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ rprecenth ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyeapi/default.nix b/nixpkgs/pkgs/development/python-modules/pyeapi/default.nix
new file mode 100644
index 000000000000..2ca3ff02edd9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyeapi/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, mock
+, netaddr
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyeapi";
+  version = "1.0.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "arista-eosplus";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-GZBoCoAqij54rZezRDF/ihJDQ5T6FFyDSRXGV3//avQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    netaddr
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "test/unit"
+  ];
+
+  pythonImportsCheck = [
+    "pyeapi"
+  ];
+
+  meta = with lib; {
+    description = "Client for Arista eAPI";
+    homepage = "https://github.com/arista-eosplus/pyeapi";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ astro ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyebus/default.nix b/nixpkgs/pkgs/development/python-modules/pyebus/default.nix
new file mode 100644
index 000000000000..8659f0a38e97
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyebus/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, anytree
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyebus";
+  version = "1.4.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6ooOSJAIi8vYmCjDHnbMGQJfPqPmzA5thDSg+iM7T+8=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    anytree
+  ];
+
+  # https://github.com/c0fec0de/pyebus/issues/3
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyebus"
+  ];
+
+  meta = with lib; {
+    description = "Pythonic Interface to EBUS Daemon (ebusd)";
+    homepage = "https://github.com/c0fec0de/pyebus";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyechonest/default.nix b/nixpkgs/pkgs/development/python-modules/pyechonest/default.nix
new file mode 100644
index 000000000000..83820629552f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyechonest/default.nix
@@ -0,0 +1,17 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "pyechonest";
+  version = "9.0.0";
+  disabled = isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1da4b3b8b457232a7eb35b59a48390b3c208759b01d596acaa71e6a172b40495";
+  };
+
+  meta = with lib; {
+    description = "Tap into The Echo Nest's Musical Brain for the best music search, information, recommendations and remix tools on the web";
+    homepage = "https://github.com/echonest/pyechonest";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyeclib/default.nix b/nixpkgs/pkgs/development/python-modules/pyeclib/default.nix
new file mode 100644
index 000000000000..b9061f3a5d2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyeclib/default.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv, buildPythonPackage, fetchFromGitHub, liberasurecode, six }:
+
+buildPythonPackage rec {
+  pname = "pyeclib";
+  version = "unstable-2022-03-11";
+
+  src = fetchFromGitHub {
+    owner = "openstack";
+    repo = "pyeclib";
+    rev = "b50040969a03f7566ffcb468336e875d21486113";
+    hash = "sha256-nYYjocStC0q/MC6pum3J4hlXiu/R5xODwIE97Ho3iEY=";
+  };
+
+  postPatch = ''
+    # patch dlopen call
+    substituteInPlace src/c/pyeclib_c/pyeclib_c.c \
+      --replace "liberasurecode.so" "${liberasurecode}/lib/liberasurecode.so"
+    # python's platform.platform() doesn't return "Darwin" (anymore?)
+    substituteInPlace setup.py \
+      --replace '"Darwin"' '"macOS"'
+  '';
+
+  preBuild = let
+    ldLibraryPathEnvName = if stdenv.isDarwin then "DYLD_LIBRARY_PATH" else "LD_LIBRARY_PATH";
+  in ''
+    # required for the custom _find_library function in setup.py
+    export ${ldLibraryPathEnvName}="${lib.makeLibraryPath [ liberasurecode ]}"
+  '';
+
+  buildInputs = [ liberasurecode ];
+
+  nativeCheckInputs = [ six ];
+
+  pythonImportsCheck = [ "pyeclib" ];
+
+  meta = with lib; {
+    description = "This library provides a simple Python interface for implementing erasure codes.";
+    homepage = "https://github.com/openstack/pyeclib";
+    license = licenses.bsd2;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyecoforest/default.nix b/nixpkgs/pkgs/development/python-modules/pyecoforest/default.nix
new file mode 100644
index 000000000000..2021b4e414b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyecoforest/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, respx
+}:
+
+buildPythonPackage rec {
+  pname = "pyecoforest";
+  version = "0.4.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pjanuario";
+    repo = "pyecoforest";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-C8sFq0vsVsq6irWbRd0eq18tfKu0qRRBZHt23CiDTGU=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov=pyecoforest --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    respx
+  ];
+
+  pythonImportsCheck = [
+    "pyecoforest"
+  ];
+
+  meta = with lib; {
+    description = "Module for interacting with Ecoforest devices";
+    homepage = "https://github.com/pjanuario/pyecoforest";
+    changelog = "https://github.com/pjanuario/pyecoforest/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyeconet/default.nix b/nixpkgs/pkgs/development/python-modules/pyeconet/default.nix
new file mode 100644
index 000000000000..d479564b763b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyeconet/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, paho-mqtt
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pyeconet";
+  version = "0.1.22";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "w1ll1am23";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-R6PA/i35vo253J4yowe2fPRZEqStAqmm98k81KDHLQk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    paho-mqtt
+    aiohttp
+  ];
+
+  # Tests require credentials
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyeconet"
+  ];
+
+  meta = with lib; {
+    description = "Python interface to the EcoNet API";
+    homepage = "https://github.com/w1ll1am23/pyeconet";
+    changelog = "https://github.com/w1ll1am23/pyeconet/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyecowitt/default.nix b/nixpkgs/pkgs/development/python-modules/pyecowitt/default.nix
new file mode 100644
index 000000000000..b5f4a5fadbac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyecowitt/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyecowitt";
+  version = "0.21";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "garbled1";
+    repo = pname;
+    rev = version;
+    sha256 = "5VdVo6j2HZXSCWU4NvfWzyS/KJfVb7N1KSMeu8TvWaQ=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Project thas no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyecowitt"
+  ];
+
+  meta = with lib; {
+    description = "Python module for the EcoWitt Protocol";
+    homepage = "https://github.com/garbled1/pyecowitt";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyedimax/default.nix b/nixpkgs/pkgs/development/python-modules/pyedimax/default.nix
new file mode 100644
index 000000000000..03229b30bddd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyedimax/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyedimax";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1i3gr5vygqh2ryg67sl13aaql7nvf3nbybrg54628r4g7911b5rk";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "pyedimax" ];
+
+  meta = with lib; {
+    description = "Python library for interfacing with the Edimax smart plugs";
+    homepage = "https://github.com/andreipop2005/pyedimax";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyee/default.nix b/nixpkgs/pkgs/development/python-modules/pyee/default.nix
new file mode 100644
index 000000000000..0efcb94259fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyee/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, pytest-asyncio
+, pytest-trio
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+, twisted
+, typing-extensions
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pyee";
+  version = "11.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-J8aCvOYL2txdPiPqzUEB3zKMAoCISj2cB/Ok4+WV3ic=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytest-asyncio
+    pytest-trio
+    pytestCheckHook
+    twisted
+  ];
+
+  pythonImportsCheck = [
+    "pyee"
+  ];
+
+  meta = with lib; {
+    description = "A port of Node.js's EventEmitter to Python";
+    homepage = "https://github.com/jfhbrook/pyee";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kmein ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyefergy/default.nix b/nixpkgs/pkgs/development/python-modules/pyefergy/default.nix
new file mode 100644
index 000000000000..87f2abda0c0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyefergy/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, iso4217
+, pytest-asyncio
+, pythonOlder
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "pyefergy";
+  version = "22.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "tkdrob";
+    repo = pname;
+    rev = version;
+    hash = "sha256-AdoM+PcVoajxhnEfkyN9UuNufChu8XGmZDLNC3mjrps=";
+  };
+
+  postPatch = ''
+    # setuptools.extern.packaging.version.InvalidVersion: Invalid version: 'master'
+    substituteInPlace setup.py \
+      --replace 'version="master",' 'version="${version}",'
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+    iso4217
+    pytz
+  ];
+
+  # Tests require network access
+  doCheck  =false;
+
+  pythonImportsCheck = [
+    "pyefergy"
+  ];
+
+  meta = with lib; {
+    description = "Python API library for Efergy energy meters";
+    homepage = "https://github.com/tkdrob/pyefergy";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyeight/default.nix b/nixpkgs/pkgs/development/python-modules/pyeight/default.nix
new file mode 100644
index 000000000000..3dec94efd3e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyeight/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyeight";
+  version = "0.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mezz64";
+    repo = "pyEight";
+    rev = version;
+    hash = "sha256-JYmhEZQw11qPNV2jZhP+0VFb387kNom70R3C13PM7kc=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyeight"
+  ];
+
+  meta = with lib; {
+    description = "Python library to interface with the Eight Sleep API";
+    homepage = "https://github.com/mezz64/pyEight";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyelftools/default.nix b/nixpkgs/pkgs/development/python-modules/pyelftools/default.nix
new file mode 100644
index 000000000000..817a39cedf9e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyelftools/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyelftools";
+  version = "0.29";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "eliben";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-tPY0C5CoA9hGHeEA/KWQ1RAVT5kqMlAwuWpOSH+KJ9Y=";
+  };
+
+  doCheck = stdenv.hostPlatform.system == "x86_64-linux" && stdenv.hostPlatform.isGnu;
+
+  checkPhase = ''
+    patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" test/external_tools/readelf
+    ${python.interpreter} test/run_all_unittests.py
+    ${python.interpreter} test/run_examples_test.py
+    ${python.interpreter} test/run_readelf_tests.py --parallel
+  '';
+
+  pythonImportsCheck = [
+    "elftools"
+  ];
+
+  meta = with lib; {
+    description = "Python library for analyzing ELF files and DWARF debugging information";
+    homepage = "https://github.com/eliben/pyelftools";
+    changelog = "https://github.com/eliben/pyelftools/blob/v${version}/CHANGES";
+    license = licenses.publicDomain;
+    maintainers = with maintainers; [ igsha pamplemousse ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyemby/default.nix b/nixpkgs/pkgs/development/python-modules/pyemby/default.nix
new file mode 100644
index 000000000000..33180d742e4d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyemby/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "pyemby";
+  version = "1.9";
+
+  src = fetchFromGitHub {
+    owner = "mezz64";
+    repo = pname;
+    rev = version;
+    hash = "sha256-4mOQLfPbRzZzpNLvekJHVKiqdGGKPhW6BpKkyRfk2Pc=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "pyemby" ];
+
+  meta = with lib; {
+    description = "Python library to interface with the Emby API";
+    homepage = "https://github.com/mezz64/pyemby";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyemd/default.nix b/nixpkgs/pkgs/development/python-modules/pyemd/default.nix
new file mode 100644
index 000000000000..72ec80c6b4a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyemd/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, cython
+, oldest-supported-numpy
+, packaging
+, setuptools
+, setuptools-scm
+, wheel
+, numpy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyemd";
+  version = "1.0.0";
+
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-tCta57LRWx1N7mOBDqeYo5IX6Kdre0nA62OoTg/ZAP4=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    numpy
+    oldest-supported-numpy
+    packaging
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A Python wrapper for Ofir Pele and Michael Werman's implementation of the Earth Mover's Distance";
+    homepage = "https://github.com/wmayner/pyemd";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rvl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyenchant/default.nix b/nixpkgs/pkgs/development/python-modules/pyenchant/default.nix
new file mode 100644
index 000000000000..9238e381483a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyenchant/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv
+, buildPythonPackage
+, isPy27
+, fetchPypi
+, enchant2
+}:
+
+buildPythonPackage rec {
+  pname = "pyenchant";
+  version = "3.2.2";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1cf830c6614362a78aab78d50eaf7c6c93831369c52e1bb64ffae1df0341e637";
+  };
+
+  propagatedBuildInputs = [ enchant2 ];
+
+  postPatch = let
+    libext = stdenv.hostPlatform.extensions.sharedLibrary;
+  in ''
+    # Use the $PYENCHANT_LIBRARY_PATH envvar lookup line to hard-code the
+    # location of the nix enchant-2 library into _enchant.py.
+    #
+    # Also, they hardcode a bad path for Darwin in their library search code;
+    # This code should never be hit, but in case it does, we don't want to have
+    # it "accidentally" work by pulling something from /opt.
+    substituteInPlace enchant/_enchant.py                  \
+      --replace 'os.environ.get("PYENCHANT_LIBRARY_PATH")' \
+                "'${enchant2}/lib/libenchant-2${libext}'"  \
+      --replace '/opt/local/lib/' ""
+  '';
+
+  # dictionaries needed for tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "pyenchant: Python bindings for the Enchant spellchecker";
+    homepage = "https://github.com/pyenchant/pyenchant";
+    license = licenses.lgpl21;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyenphase/default.nix b/nixpkgs/pkgs/development/python-modules/pyenphase/default.nix
new file mode 100644
index 000000000000..ce1e74e3ffcc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyenphase/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, awesomeversion
+, buildPythonPackage
+, envoy-utils
+, fetchFromGitHub
+, httpx
+, lxml
+, orjson
+, poetry-core
+, pyjwt
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, respx
+, syrupy
+, tenacity
+}:
+
+buildPythonPackage rec {
+  pname = "pyenphase";
+  version = "1.14.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "pyenphase";
+    repo = "pyenphase";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-cjkmRGieSKynL8cZORp11/ViK8oCBAZXrgbFKumWKaM=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=pyenphase --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    awesomeversion
+    envoy-utils
+    httpx
+    lxml
+    orjson
+    pyjwt
+    tenacity
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    respx
+    syrupy
+  ];
+
+  disabledTests = [
+    # https://github.com/pyenphase/pyenphase/issues/97
+    "test_with_7_x_firmware"
+  ];
+
+  pythonImportsCheck = [
+    "pyenphase"
+  ];
+
+  meta = with lib; {
+    description = "Library to control enphase envoy";
+    homepage = "https://github.com/pyenphase/pyenphase";
+    changelog = "https://github.com/pyenphase/pyenphase/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyenvisalink/default.nix b/nixpkgs/pkgs/development/python-modules/pyenvisalink/default.nix
new file mode 100644
index 000000000000..8ea5a09e0e4b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyenvisalink/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, colorlog
+, fetchPypi
+, pyserial
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyenvisalink";
+  version = "4.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-CQvomHYNMrf0oQjNCcLyisxIV2+3TOgEPzA9seZYsOs=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+    colorlog
+    pyserial
+  ];
+
+  # Tests require an Envisalink device
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyenvisalink"
+  ];
+
+  meta = with lib; {
+    description = "Python interface for Envisalink 2DS/3 Alarm API";
+    homepage = "https://github.com/Cinntax/pyenvisalink";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyephember/default.nix b/nixpkgs/pkgs/development/python-modules/pyephember/default.nix
new file mode 100644
index 000000000000..48cad7bc1954
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyephember/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, paho-mqtt
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyephember";
+  version = "0.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-j3SftxXKs9EZwdio26W5U0y5owH4yTteS4RUmzkZkoE=";
+  };
+
+  propagatedBuildInputs = [
+    paho-mqtt
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyephember"
+  ];
+
+  meta = with lib; {
+    description = "Python client to the EPH Control Systems Ember API";
+    homepage = "https://github.com/ttroy50/pyephember";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyepsg/default.nix b/nixpkgs/pkgs/development/python-modules/pyepsg/default.nix
new file mode 100644
index 000000000000..2e0b2c282a26
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyepsg/default.nix
@@ -0,0 +1,23 @@
+{ buildPythonPackage, lib, fetchPypi, requests }:
+
+buildPythonPackage rec {
+  pname = "pyepsg";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2d08fad1e7a8b47a90a4e43da485ba95705923425aefc4e2a3efa540dbd470d7";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Simple Python interface to epsg.io";
+    license = licenses.lgpl3;
+    homepage = "https://pyepsg.readthedocs.io/en/latest/";
+    maintainers = with maintainers; [ mredaelli ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyerfa/default.nix b/nixpkgs/pkgs/development/python-modules/pyerfa/default.nix
new file mode 100644
index 000000000000..fda4be537d92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyerfa/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, jinja2
+, oldest-supported-numpy
+, setuptools-scm
+, wheel
+, liberfa
+, packaging
+, numpy
+, pytestCheckHook
+, pytest-doctestplus
+}:
+
+buildPythonPackage rec {
+  pname = "pyerfa";
+  format = "pyproject";
+  version = "2.0.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-13+7+lg1DBlMy5nl2TqgXTwrFNWq2LZi2Txq2f/0Hzk=";
+  };
+
+  patches = [
+    # Sort of helps maybe for https://github.com/liberfa/pyerfa/issues/112
+    (fetchpatch {
+      url = "https://github.com/liberfa/pyerfa/commit/4866342b94c5e7344711146f1186a4c3e7534da8.patch";
+      hash = "sha256-uPFFdLYfRweQdeEApBAw6Ulqh31NTQwwmnaU+x/M+C0=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    jinja2
+    oldest-supported-numpy
+    packaging
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+  buildInputs = [
+    liberfa
+  ];
+
+  preBuild = ''
+    export PYERFA_USE_SYSTEM_LIBERFA=1
+  '';
+
+  # See https://github.com/liberfa/pyerfa/issues/112#issuecomment-1721197483
+  NIX_CFLAGS_COMPILE = "-O2";
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-doctestplus
+  ];
+  # Getting circular import errors without this, not clear yet why. This was mentioned to
+  # upstream at: https://github.com/liberfa/pyerfa/issues/112 and downstream at
+  # https://github.com/NixOS/nixpkgs/issues/255262
+  preCheck = ''
+    cd $out
+  '';
+  pythonImportsCheck = [
+    "erfa"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for ERFA routines";
+    longDescription = ''
+        PyERFA is the Python wrapper for the ERFA library (Essential Routines
+        for Fundamental Astronomy), a C library containing key algorithms for
+        astronomy, which is based on the SOFA library published by the
+        International Astronomical Union (IAU). All C routines are wrapped as
+        Numpy universal functions, so that they can be called with scalar or
+        array inputs.
+    '';
+    homepage = "https://github.com/liberfa/pyerfa";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.rmcgibbo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyeverlights/default.nix b/nixpkgs/pkgs/development/python-modules/pyeverlights/default.nix
new file mode 100644
index 000000000000..00b9f8fb0154
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyeverlights/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "pyeverlights";
+  version = "0.1.0";
+
+  src = fetchFromGitHub {
+    owner = "joncar";
+    repo = pname;
+    rev = version;
+    sha256 = "16xpq933j8yydq78fnf4f7ivyw5a45ix4mfycpmm91aj549p6pm0";
+  };
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  # no tests are present
+  doCheck = false;
+  pythonImportsCheck = [ "pyeverlights" ];
+
+  meta = with lib; {
+    description = "Python module for interfacing with an EverLights control box";
+    homepage = "https://github.com/joncar/pyeverlights";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyevilgenius/default.nix b/nixpkgs/pkgs/development/python-modules/pyevilgenius/default.nix
new file mode 100644
index 000000000000..079b1825440a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyevilgenius/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, async-timeout
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyevilgenius";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = version;
+    hash = "sha256-wjC32oq/lW3Z4XB+4SILRKIOuCgBKk1gruOo4uc/4/o=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # Project has no test
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyevilgenius"
+  ];
+
+  meta = with lib; {
+    description = "Python SDK to interact with Evil Genius Labs devices";
+    homepage = "https://github.com/home-assistant-libs/pyevilgenius";
+    changelog = "https://github.com/home-assistant-libs/pyevilgenius/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyevmasm/default.nix b/nixpkgs/pkgs/development/python-modules/pyevmasm/default.nix
new file mode 100644
index 000000000000..bccf243a0a02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyevmasm/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, future
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyevmasm";
+  version = "0.2.3";
+
+  src = fetchFromGitHub {
+    owner = "crytic";
+    repo = pname;
+    rev = version;
+    sha256 = "134q0z0dqzxzr0jw5jr98kp90kx2dl0qw9smykwxdgq555q1l6qa";
+  };
+
+  propagatedBuildInputs = [ future ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Ethereum Virtual Machine (EVM) assembler and disassembler";
+    homepage = "https://github.com/crytic/pyevmasm";
+    changelog = "https://github.com/crytic/pyevmasm/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ arturcygan ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyexcel-io/default.nix b/nixpkgs/pkgs/development/python-modules/pyexcel-io/default.nix
new file mode 100644
index 000000000000..f20e44b1f8d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyexcel-io/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, lml
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "pyexcel-io";
+  version = "0.6.6";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-9ghL8a+l+/TGHPffRDcPpROCGvGIsC4+GbXvtm2Klp8=";
+  };
+
+  propagatedBuildInputs = [
+    lml
+  ];
+
+  # Tests depend on stuff that depends on this.
+  doCheck = false;
+
+  pythonImportsCheck = [ "pyexcel_io" ];
+
+  meta = {
+    description = "One interface to read and write the data in various excel formats, import the data into and export the data from databases";
+    homepage = "http://docs.pyexcel.org/";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyexcel-ods/default.nix b/nixpkgs/pkgs/development/python-modules/pyexcel-ods/default.nix
new file mode 100644
index 000000000000..519d6b4fc0c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyexcel-ods/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyexcel-io
+, odfpy
+, nose
+, pyexcel
+, pyexcel-xls
+, psutil
+}:
+
+buildPythonPackage rec {
+  pname = "pyexcel-ods";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f61b56515fd4ccd4687f0a112422f74ce8535247ad2da49db90038d7e3ed397c";
+  };
+
+  propagatedBuildInputs = [
+    pyexcel-io
+    odfpy
+  ];
+
+  nativeCheckInputs = [
+    nose
+    pyexcel
+    pyexcel-xls
+    psutil
+  ];
+
+  checkPhase = "nosetests";
+
+  meta = {
+    description = "Plug-in to pyexcel providing the capbility to read, manipulate and write data in ods formats using odfpy";
+    homepage = "http://docs.pyexcel.org/";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyexcel-xls/default.nix b/nixpkgs/pkgs/development/python-modules/pyexcel-xls/default.nix
new file mode 100644
index 000000000000..314dca9d0ed2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyexcel-xls/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyexcel-io
+, xlrd
+, xlwt
+, nose
+, pyexcel
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "pyexcel-xls";
+  version = "0.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5ec606ef8667aafbb0c3fbd8242a7c23bf175ee7c10b08f70799b84fb2db84cb";
+  };
+
+  propagatedBuildInputs = [
+    pyexcel-io
+    xlrd
+    xlwt
+  ];
+
+  nativeCheckInputs = [
+    nose
+    pyexcel
+    mock
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "xlrd<2" "xlrd<3"
+  '';
+
+  checkPhase = "nosetests --exclude test_issue_151";
+
+  meta = {
+    description = "A wrapper library to read, manipulate and write data in xls using xlrd and xlwt";
+    homepage = "http://docs.pyexcel.org/";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyexcel/default.nix b/nixpkgs/pkgs/development/python-modules/pyexcel/default.nix
new file mode 100644
index 000000000000..5106df79a2d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyexcel/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, chardet
+, lml
+, pyexcel-io
+, texttable
+}:
+
+buildPythonPackage rec {
+  pname = "pyexcel";
+  version = "0.7.0";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+/Du5dk7ls728ZqfAHA/IsCmTxlyjZG5VCgAmlISlwk=";
+  };
+
+  propagatedBuildInputs = [
+    chardet
+    lml
+    pyexcel-io
+    texttable
+  ];
+
+  pythonImportsCheck = [
+    "pyexcel"
+  ];
+
+  # Tests depend on pyexcel-xls & co. causing circular dependency.
+  # https://github.com/pyexcel/pyexcel/blob/dev/tests/requirements.txt
+  doCheck = false;
+
+  meta = {
+    description = "Single API for reading, manipulating and writing data in csv, ods, xls, xlsx and xlsm files";
+    homepage = "http://docs.pyexcel.org/";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyexploitdb/default.nix b/nixpkgs/pkgs/development/python-modules/pyexploitdb/default.nix
new file mode 100644
index 000000000000..c59205aa3f1a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyexploitdb/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, gitpython
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyexploitdb";
+  version = "0.2.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "pyExploitDb";
+    inherit version;
+    hash = "sha256-q16YB0lLlw9nXohcT20l41Bv40CqshWzE8nVBBSEppE=";
+  };
+
+  propagatedBuildInputs = [
+    gitpython
+    requests
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyExploitDb"
+  ];
+
+  meta = with lib; {
+    description = "Library to fetch the most recent exploit-database";
+    homepage = "https://github.com/GoVanguard/pyExploitDb";
+    changelog = "https://github.com/GoVanguard/pyExploitDb/blob/master/Changelog.txt";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyezviz/default.nix b/nixpkgs/pkgs/development/python-modules/pyezviz/default.nix
new file mode 100644
index 000000000000..5ef572c48175
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyezviz/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, paho-mqtt
+, pandas
+, pycryptodome
+, pythonOlder
+, requests
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "pyezviz";
+  version = "0.2.2.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "baqs";
+    repo = "pyEzviz";
+    rev = "refs/tags/${version}";
+    hash = "sha256-HZLWpoo0luAqqwLA3t7cDh0yVP6znrzMoUg7cuexd28=";
+  };
+
+  propagatedBuildInputs = [
+    paho-mqtt
+    pandas
+    pycryptodome
+    requests
+    xmltodict
+  ];
+
+  # Project has no tests. test_cam_rtsp.py is more a sample for using the module
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyezviz"
+  ];
+
+  meta = with lib; {
+    description = "Python interface for for Ezviz cameras";
+    homepage = "https://github.com/baqs/pyEzviz/";
+    changelog = "https://github.com/BaQs/pyEzviz/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyface/default.nix b/nixpkgs/pkgs/development/python-modules/pyface/default.nix
new file mode 100644
index 000000000000..fd0f1409ca75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyface/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, importlib-metadata
+, importlib-resources
+, setuptools
+, traits
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyface";
+  version = "8.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-fhNhg0e3pkjtIM29T9GlFkj1AQKR815OD/G/cKcgy/g=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    importlib-metadata
+    importlib-resources
+    traits
+  ];
+
+  doCheck = false; # Needs X server
+
+  pythonImportsCheck = [
+    "pyface"
+  ];
+
+  meta = with lib; {
+    description = "Traits-capable windowing framework";
+    homepage = "https://github.com/enthought/pyface";
+    changelog = "https://github.com/enthought/pyface/releases/tag/${version}";
+    maintainers = with maintainers; [ knedlsepp ];
+    license = licenses.bsdOriginal;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyfaidx/default.nix b/nixpkgs/pkgs/development/python-modules/pyfaidx/default.nix
new file mode 100644
index 000000000000..c1d081baaadb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfaidx/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, numpy
+, setuptools
+, setuptools-scm
+, six
+, glibcLocales
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyfaidx";
+  version = "0.7.2.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-O3aTwFLIJpEAD+SpJHXbgv/DtachoSsQ37yHEZxLTTA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    glibcLocales
+    nose
+    numpy
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # FileNotFoundError: [Errno 2] No such file or directory: 'data/genes.fasta.gz'
+    "tests/test_Fasta_bgzip.py"
+  ];
+
+  pythonImportsCheck = [
+    "pyfaidx"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mdshw5/pyfaidx";
+    description = "Python classes for indexing, retrieval, and in-place modification of FASTA files using a samtools compatible index";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jbedo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyfakefs/default.nix b/nixpkgs/pkgs/development/python-modules/pyfakefs/default.nix
new file mode 100644
index 000000000000..912754373f3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfakefs/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  version = "5.2.4";
+  pname = "pyfakefs";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-PgQPN5IIYIag3CGRsF/nCUOOFoqv4ulPzb7444WSCNg=";
+  };
+
+  postPatch = ''
+    # test doesn't work in sandbox
+    substituteInPlace pyfakefs/tests/fake_filesystem_test.py \
+      --replace "test_expand_root" "notest_expand_root"
+    substituteInPlace pyfakefs/tests/fake_os_test.py \
+      --replace "test_path_links_not_resolved" "notest_path_links_not_resolved" \
+      --replace "test_append_mode_tell_linux_windows" "notest_append_mode_tell_linux_windows"
+  '' + (lib.optionalString stdenv.isDarwin ''
+    # this test fails on darwin due to case-insensitive file system
+    substituteInPlace pyfakefs/tests/fake_os_test.py \
+      --replace "test_rename_dir_to_existing_dir" "notest_rename_dir_to_existing_dir"
+  '');
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  # https://github.com/jmcgeheeiv/pyfakefs/issues/581 (OSError: [Errno 9] Bad file descriptor)
+  disabledTests = [ "test_open_existing_pipe" ];
+
+  disabledTestPaths = [
+    # try to import opentimelineio but nixpkgs doesn't have it as of 2023-09-16
+    "pyfakefs/pytest_tests/segfault_test.py"
+  ];
+
+  pythonImportsCheck = [ "pyfakefs" ];
+
+  meta = with lib; {
+    description = "Fake file system that mocks the Python file system modules";
+    homepage = "http://pyfakefs.org/";
+    changelog = "https://github.com/jmcgeheeiv/pyfakefs/blob/master/CHANGES.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ gebner ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyfakewebcam/default.nix b/nixpkgs/pkgs/development/python-modules/pyfakewebcam/default.nix
new file mode 100644
index 000000000000..c130accd40c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfakewebcam/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, numpy, opencv4 }:
+
+buildPythonPackage rec {
+  pname = "pyfakewebcam";
+  version = "0.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "152nglscxmv7600i1i2gahny5z0bybnqgq3npak8npb0lsnwxn1a";
+  };
+
+  propagatedBuildInputs = [ numpy opencv4 ];
+
+  # No tests are available
+  doCheck = false;
+  pythonImportsCheck = [ "pyfakewebcam" ];
+
+  meta = with lib; {
+    description = "A library for writing RGB frames to a fake webcam device on Linux";
+    homepage = "https://github.com/jremmons/pyfakewebcam";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ emilytrau ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyfantom/default.nix b/nixpkgs/pkgs/development/python-modules/pyfantom/default.nix
new file mode 100644
index 000000000000..d27cccfbd8c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfantom/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchgit
+}:
+
+buildPythonPackage {
+  pname = "pyfantom";
+  version = "unstable-2013-12-18";
+
+  src = fetchgit {
+    url = "http://git.ni.fr.eu.org/pyfantom.git";
+    sha256 = "1m53n8bxslq5zmvcf7i1xzsgq5bdsf1z529br5ypmj5bg0s86j4q";
+  };
+
+  # No tests included
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://pyfantom.ni.fr.eu.org/";
+    description = "Wrapper for the LEGO Mindstorms Fantom Driver";
+    license = licenses.gpl2;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyfcm/default.nix b/nixpkgs/pkgs/development/python-modules/pyfcm/default.nix
new file mode 100644
index 000000000000..77ddabe2057e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfcm/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyfcm";
+  version = "1.4.8";
+
+  src = fetchFromGitHub {
+    owner = "olucurious";
+    repo = "pyfcm";
+    rev = version;
+    sha256 = "15q6p21wsjm75ccmzcsgad1w9fgk6189hbrp7pawpxl7l3qxn2p7";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # pyfcm's unit testing suite requires network access
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python client for FCM - Firebase Cloud Messaging (Android, iOS and Web)";
+    homepage = "https://github.com/olucurious/pyfcm";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ldelelis ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyfftw/default.nix b/nixpkgs/pkgs/development/python-modules/pyfftw/default.nix
new file mode 100644
index 000000000000..e47184f9b15c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfftw/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi
+, fftw, fftwFloat, fftwLongDouble, numpy, scipy, cython, dask }:
+
+buildPythonPackage rec {
+  version = "0.13.1";
+  pname = "pyFFTW";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-CRVekKDG0MHy0fNmgYCn3pX7n4P+9RN6ES+wWXjocyA=";
+  };
+
+  preConfigure = ''
+    export LDFLAGS="-L${fftw.out}/lib -L${fftwFloat.out}/lib -L${fftwLongDouble.out}/lib"
+    export CFLAGS="-I${fftw.dev}/include -I${fftwFloat.dev}/include -I${fftwLongDouble.dev}/include"
+  '';
+
+  buildInputs = [ fftw fftwFloat fftwLongDouble];
+
+  propagatedBuildInputs = [ numpy scipy cython dask ];
+
+  # Tests cannot import pyfftw. pyfftw works fine though.
+  doCheck = false;
+  pythonImportsCheck = [ "pyfftw" ];
+
+  meta = with lib; {
+    description = "A pythonic wrapper around FFTW, the FFT library, presenting a unified interface for all the supported transforms";
+    homepage = "http://hgomersall.github.com/pyFFTW/";
+    license = with licenses; [ bsd2 bsd3 ];
+    maintainers = with maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyfibaro/default.nix b/nixpkgs/pkgs/development/python-modules/pyfibaro/default.nix
new file mode 100644
index 000000000000..2f059d19a1b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfibaro/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pyfibaro";
+  version = "0.7.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "rappenze";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-yE9HkAlGj1t90FwmwHDsk3ea2UOl0bG3UtYXxz/SWbI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pythonImportsCheck = [
+    "pyfibaro"
+  ];
+
+  meta = with lib; {
+    description = "Library to access FIBARO Home center";
+    homepage = "https://github.com/rappenze/pyfibaro";
+    changelog = "https://github.com/rappenze/pyfibaro/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyfido/default.nix b/nixpkgs/pkgs/development/python-modules/pyfido/default.nix
new file mode 100644
index 000000000000..d6f5207bce31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfido/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pyfido";
+  version = "2.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-hh2g46GVCkiMHElEP6McY8FdzGNzZV7pgA5DQhodP20=";
+  };
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "pyfido" ];
+
+  meta = with lib; {
+    description = "Python client to get fido account data";
+    homepage = "https://github.com/titilambert/pyfido";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyfiglet/default.nix b/nixpkgs/pkgs/development/python-modules/pyfiglet/default.nix
new file mode 100644
index 000000000000..0b3bdb7f6d34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfiglet/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  version = "1.0.2";
+  pname = "pyfiglet";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-dYeIAYq4+q3cCYTh6gX/Mw08ZL5mPFE8wfEF9qMGbas=";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "FIGlet in pure Python";
+    license     = licenses.gpl2Plus;
+    maintainers = with maintainers; [ thoughtpolice ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyfireservicerota/default.nix b/nixpkgs/pkgs/development/python-modules/pyfireservicerota/default.nix
new file mode 100644
index 000000000000..deda70651a56
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfireservicerota/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytz
+, oauthlib
+, requests
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "pyfireservicerota";
+  version = "0.0.43";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3+QK1BVuWYii0oYT4xXMOYJZmVKrB4EmqE0EkdFlZvE=";
+  };
+
+  propagatedBuildInputs = [
+    pytz
+    oauthlib
+    requests
+    websocket-client
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "pyfireservicerota" ];
+
+  meta = with lib; {
+    description = "Python 3 API wrapper for FireServiceRota/BrandweerRooster";
+    homepage = "https://github.com/cyberjunky/python-fireservicerota";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyflakes/default.nix b/nixpkgs/pkgs/development/python-modules/pyflakes/default.nix
new file mode 100644
index 000000000000..2da0f2698685
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyflakes/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyflakes";
+  version = "3.1.0";
+
+  disabled = pythonOlder "3.8";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-oKrgNMRE2wBxqgd5crpHaNQMgw2VOf1Fv0zT+PaZLvw=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pyflakes" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/PyCQA/pyflakes";
+    changelog = "https://github.com/PyCQA/pyflakes/blob/${version}/NEWS.rst";
+    description = "A simple program which checks Python source files for errors";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyflexit/default.nix b/nixpkgs/pkgs/development/python-modules/pyflexit/default.nix
new file mode 100644
index 000000000000..6f1f582a931d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyflexit/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyflexit";
+  version = "0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Sabesto";
+    repo = pname;
+    rev = version;
+    sha256 = "1ajlqr3z6zj4fyslqzpwpfkvh8xjx94wsznzij0vx0q7jp43bqig";
+  };
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "pyflexit" ];
+
+  meta = with lib; {
+    description = "Python library for Flexit A/C units";
+    homepage = "https://github.com/Sabesto/pyflexit";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyflic/default.nix b/nixpkgs/pkgs/development/python-modules/pyflic/default.nix
new file mode 100644
index 000000000000..ead4b33929d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyflic/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyflic";
+  version = "2.0.3";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "soldag";
+    repo = pname;
+    rev = version;
+    sha256 = "0adf4k191138jmbsfhkhhbgaxcq97d1hr5w48ryxr1fig64sjqy2";
+  };
+
+  # Projec thas no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "pyflic" ];
+
+  meta = with lib; {
+    description = "Python module to interact with Flic buttons";
+    homepage = "https://github.com/soldag/pyflic";
+    license = with licenses; [ cc0 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyflick/default.nix b/nixpkgs/pkgs/development/python-modules/pyflick/default.nix
new file mode 100644
index 000000000000..b6a9c2cf96d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyflick/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, aiohttp
+, python-dateutil
+}:
+
+buildPythonPackage rec {
+  pname = "pyflick";
+  version = "0.0.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "PyFlick";
+    inherit version;
+    sha256 = "705c82d8caedfff19117c8859cc1b4f56e15ab8dbc0d64d63b79d8634007897f";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    python-dateutil
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyflick"
+    "pyflick.authentication"
+  ];
+
+  meta = with lib; {
+    description = "Python API For Flick Electric in New Zealand";
+    homepage = "https://github.com/ZephireNZ/PyFlick";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyfluidsynth/default.nix b/nixpkgs/pkgs/development/python-modules/pyfluidsynth/default.nix
new file mode 100644
index 000000000000..1e837b67129a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfluidsynth/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, wheel
+, numpy
+, fluidsynth
+, stdenv
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "pyfluidsynth";
+  version = "1.3.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "pyFluidSynth";
+    inherit version;
+    hash = "sha256-+i5oOXV4UG6z4rQGuguOP0mHo7V7fJZZRwOnJKB1VfQ=";
+  };
+
+  patches = [
+    # fixes error: Unknown integer parameter 'synth.sample-rate'
+    # https://github.com/nwhitehead/pyfluidsynth/pull/44
+    (fetchpatch {
+      name = "add-fluid-synth-get-status-and-fix-some-typing-bugs.patch";
+      url = "https://github.com/nwhitehead/pyfluidsynth/commit/1b31ca6ab00930dbb515c4cc00bb31a65578b7c0.patch";
+      hash = "sha256-ZCqy7aIv5iAAJrWOD7e538xltj11gy5fakIXnAbUsu8=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  pythonImportsCheck = [ "fluidsynth" ];
+
+  postPatch = ''
+    sed -Ezi fluidsynth.py -e \
+      's|lib = .*\\\n[^\n]*|lib = "${lib.getLib fluidsynth}/lib/libfluidsynth${stdenv.hostPlatform.extensions.sharedLibrary}"|'
+  '';
+
+  meta = with lib; {
+    description = "Python bindings for FluidSynth, a MIDI synthesizer that uses SoundFont instruments";
+    homepage = "https://github.com/nwhitehead/pyfluidsynth";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyflume/default.nix b/nixpkgs/pkgs/development/python-modules/pyflume/default.nix
new file mode 100644
index 000000000000..4a49c8160a25
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyflume/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, pyjwt
+, ratelimit
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "pyflume";
+  version = "0.8.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "ChrisMandich";
+    repo = "PyFlume";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-RtzbAXjMtvKc8vnZIxIJnc6CS+BrYcQgdy5bVaJumg0=";
+  };
+
+  propagatedBuildInputs = [
+    pyjwt
+    ratelimit
+    requests
+  ];
+
+  nativeCheckInputs = [
+    requests-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyflume"
+  ];
+
+  meta = with lib; {
+    description = "Python module to work with Flume sensors";
+    homepage = "https://github.com/ChrisMandich/PyFlume";
+    changelog = "https://github.com/ChrisMandich/PyFlume/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyfma/default.nix b/nixpkgs/pkgs/development/python-modules/pyfma/default.nix
new file mode 100644
index 000000000000..e0934dc34b89
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfma/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, importlib-metadata
+, numpy
+, pybind11
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pyfma";
+  version = "0.1.6";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nschloe";
+    repo = pname;
+    rev = version;
+    sha256 = "12i68jj9n1qj9phjnj6f0kmfhlsd3fqjlk9p6d4gs008azw5m8yn";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  buildInputs = [
+    pybind11
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pyfma" ];
+
+  meta = with lib; {
+    description = "Fused multiply-add for Python";
+    homepage = "https://github.com/nschloe/pyfma";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyfnip/default.nix b/nixpkgs/pkgs/development/python-modules/pyfnip/default.nix
new file mode 100644
index 000000000000..1306c530bb43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfnip/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyfnip";
+  version = "0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0q52rb0kshgbligxjqrwz0v7kgqjbv6jahdb66ndxy93mfr0ig3a";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "pyfnip" ];
+
+  meta = with lib; {
+    description = "Python client to get fido account data";
+    homepage = "https://github.com/juhaniemi/pyfnip";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyfreedompro/default.nix b/nixpkgs/pkgs/development/python-modules/pyfreedompro/default.nix
new file mode 100644
index 000000000000..f5fd102ed7fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfreedompro/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, aiohttp
+}:
+
+buildPythonPackage rec {
+  pname = "pyfreedompro";
+  version = "1.1.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "92812070a0c74761fa0c8cac98ddbe0bca781c8de80e2b08dbd04492e831c172";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "aiohttp" ];
+
+  meta = with lib; {
+    description = "Python library for Freedompro API";
+    homepage = "https://github.com/stefano055415/pyfreedompro";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyfribidi/default.nix b/nixpkgs/pkgs/development/python-modules/pyfribidi/default.nix
new file mode 100644
index 000000000000..dfe5449b2826
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfribidi/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, six
+}:
+
+buildPythonPackage rec {
+  version = "0.12.0";
+  pname = "pyfribidi";
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "64726a4a56783acdc79c6b9b3a15f16e6071077c897a0b999f3b43f744bc621c";
+  };
+
+  patches = lib.optional stdenv.cc.isClang ./pyfribidi-clang.patch;
+
+  propagatedBuildInputs = [ six ];
+
+  meta = with lib; {
+    description = "A simple wrapper around fribidi";
+    homepage = "https://github.com/pediapress/pyfribidi";
+    license = licenses.gpl2;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyfribidi/pyfribidi-clang.patch b/nixpkgs/pkgs/development/python-modules/pyfribidi/pyfribidi-clang.patch
new file mode 100644
index 000000000000..c570843f7e8b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfribidi/pyfribidi-clang.patch
@@ -0,0 +1,17 @@
+diff --git a/pyfribidi.c b/pyfribidi.c
+index 9a0120d..238134a 100644
+--- a/pyfribidi.c
++++ b/pyfribidi.c
+@@ -148,10 +148,11 @@ init_pyfribidi (void)
+ {
+ #if PY_MAJOR_VERSION >= 3
+         PyObject *module = PyModule_Create (&pyfribidi_moduledef);
++        if (module == NULL) return NULL;
+ #else
+         PyObject *module = Py_InitModule ("_pyfribidi", PyfribidiMethods);
++        if (module == NULL) return;
+ #endif
+-	if (module == NULL) return NULL;
+ 
+ 	PyModule_AddIntConstant (module, "RTL", (long) FRIBIDI_TYPE_RTL);
+ 	PyModule_AddIntConstant (module, "LTR", (long) FRIBIDI_TYPE_LTR);
diff --git a/nixpkgs/pkgs/development/python-modules/pyfritzhome/default.nix b/nixpkgs/pkgs/development/python-modules/pyfritzhome/default.nix
new file mode 100644
index 000000000000..5a158aa3e25e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfritzhome/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyfritzhome";
+  version = "0.6.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "hthiery";
+    repo = "python-fritzhome";
+    rev = "refs/tags/${version}";
+    hash = "sha256-BhJkUbTAzMkzWINVoBDG2Vnf4Fd+kX1oBkXWD7UNbTw=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyfritzhome"
+  ];
+
+  meta = with lib; {
+    description = "Python Library to access AVM FRITZ!Box homeautomation";
+    homepage = "https://github.com/hthiery/python-fritzhome";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyfronius/default.nix b/nixpkgs/pkgs/development/python-modules/pyfronius/default.nix
new file mode 100644
index 000000000000..74791d25c0cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfronius/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyfronius";
+  version = "0.7.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nielstron";
+    repo = pname;
+    rev = "release-${version}";
+    hash = "sha256-eWe4nXKW9oP9lqehy6BK7ABaIqP3dgRX6ymW1Okfd9g=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyfronius"
+  ];
+
+  meta = with lib; {
+    description = "Python module to communicate with Fronius Symo";
+    homepage = "https://github.com/nielstron/pyfronius";
+    changelog = "https://github.com/nielstron/pyfronius/releases/tag/release-${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyftdi/default.nix b/nixpkgs/pkgs/development/python-modules/pyftdi/default.nix
new file mode 100644
index 000000000000..f004ac7c88c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyftdi/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+, pythonOlder
+, pyusb
+}:
+
+buildPythonPackage rec {
+  pname = "pyftdi";
+  version = "0.55.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "eblot";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-EEMHY5EKftci72huF5UmJyh2wJAc8uNh/QhGSSAVXIU=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+    pyusb
+  ];
+
+  # Tests require access to the serial port
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyftdi"
+  ];
+
+  meta = with lib; {
+    description = "User-space driver for modern FTDI devices";
+    longDescription = ''
+      PyFtdi aims at providing a user-space driver for popular FTDI devices.
+      This includes UART, GPIO and multi-serial protocols (SPI, I2C, JTAG)
+      bridges.
+    '';
+    homepage = "https://github.com/eblot/pyftdi";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyftgl/default.nix b/nixpkgs/pkgs/development/python-modules/pyftgl/default.nix
new file mode 100644
index 000000000000..90fd79038083
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyftgl/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, boost, freetype, ftgl, libGLU, libGL
+, python
+}:
+
+let
+
+  pythonVersion = with lib.versions; "${major python.version}${minor python.version}";
+
+in
+
+buildPythonPackage rec {
+  pname = "pyftgl";
+  version = "0.4b";
+
+  src = fetchFromGitHub {
+    owner = "umlaeute";
+    repo = "${pname}-${version}";
+    rev = version;
+    sha256 = "12zcjv4cwwjihiaf74kslrdmmk4bs47h7006gyqfwdfchfjdgg4r";
+  };
+
+  postPatch = ''
+    sed -i "s,'boost_python','boost_python${pythonVersion}',g" setup.py
+  '';
+
+  buildInputs = [ boost freetype ftgl libGLU libGL ];
+
+  meta = with lib; {
+    description = "Python bindings for FTGL (FreeType for OpenGL)";
+    license = licenses.gpl2Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyftpdlib/default.nix b/nixpkgs/pkgs/development/python-modules/pyftpdlib/default.nix
new file mode 100644
index 000000000000..2ada48a2be0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyftpdlib/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, psutil
+, pyopenssl
+, pysendfile
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyftpdlib";
+  version = "1.5.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Mj1MQvFAau203xj69oD2TzLAgP9m9sJgkLpZL1v8Sg8=";
+  };
+
+  propagatedBuildInputs = [
+    pysendfile
+  ];
+
+  passthru.optional-dependencies = {
+    ssl = [
+      pyopenssl
+    ];
+  };
+
+  nativeCheckInputs = [
+    mock
+    psutil
+  ];
+
+  # Impure filesystem-related tests cause timeouts
+  # on Hydra: https://hydra.nixos.org/build/84374861
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyftpdlib"
+  ];
+
+  meta = with lib; {
+    description = "Asynchronous FTP server library";
+    homepage = "https://github.com/giampaolo/pyftpdlib/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyfttt/default.nix b/nixpkgs/pkgs/development/python-modules/pyfttt/default.nix
new file mode 100644
index 000000000000..c8b52fce409a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfttt/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi
+, requests }:
+
+buildPythonPackage rec {
+  pname = "pyfttt";
+  version = "0.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "10iq7c9c832ssl2xrvf62xf7znfvqzax6sq8ppsibq6wpb8dlnj5";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # tests need a server to run against
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Package for sending events to the IFTTT Webhooks Channel";
+    homepage = "https://github.com/briandconnelly/pyfttt";
+    maintainers = with maintainers; [ peterhoeg ];
+    license = licenses.bsd2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyfume/default.nix b/nixpkgs/pkgs/development/python-modules/pyfume/default.nix
new file mode 100644
index 000000000000..308f5eeeb529
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfume/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fst-pso
+, numpy
+, pandas
+, pythonOlder
+, scipy
+, simpful
+}:
+
+buildPythonPackage rec {
+  pname = "pyfume";
+  version = "0.2.25";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "pyFUME";
+    inherit version;
+    hash = "sha256-uD1IHFyNd9yv3eyHPZ4pg6X2+rLTY5sYsQysuIXbvfA=";
+  };
+
+  propagatedBuildInputs = [
+    fst-pso
+    numpy
+    pandas
+    scipy
+    simpful
+  ];
+
+  # Module has not test
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyfume"
+  ];
+
+  meta = with lib; {
+    description = "A Python package for fuzzy model estimation";
+    homepage = "https://github.com/CaroFuchs/pyFUME";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyfuse3/default.nix b/nixpkgs/pkgs/development/python-modules/pyfuse3/default.nix
new file mode 100644
index 000000000000..d33938905753
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfuse3/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, cython_3
+, pkg-config
+, setuptools
+, fuse3
+, trio
+, python
+, pytestCheckHook
+, pytest-trio
+, which
+}:
+
+buildPythonPackage rec {
+  pname = "pyfuse3";
+  version = "3.3.0";
+
+  disabled = pythonOlder "3.8";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "libfuse";
+    repo = "pyfuse3";
+    rev = "refs/tags/${version}";
+    hash = "sha256-GLGuTFdTA16XnXKSBD7ET963a8xH9EG/JfPNu6/3DOg=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pkg-config'" "'$(command -v $PKG_CONFIG)'"
+  '';
+
+  nativeBuildInputs = [
+    cython_3
+    pkg-config
+    setuptools
+  ];
+
+  buildInputs = [ fuse3 ];
+
+  propagatedBuildInputs = [ trio ];
+
+  preBuild = ''
+    ${python.pythonOnBuildForHost.interpreter} setup.py build_cython
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-trio
+    which
+    fuse3
+  ];
+
+  # Checks if a /usr/bin directory exists, can't work on NixOS
+  disabledTests = [ "test_listdir" ];
+
+  pythonImportsCheck = [
+    "pyfuse3"
+    "pyfuse3_asyncio"
+  ];
+
+  meta = with lib; {
+    description = "Python 3 bindings for libfuse 3 with async I/O support";
+    homepage = "https://github.com/libfuse/pyfuse3";
+    license = licenses.lgpl2Plus;
+    maintainers = with maintainers; [ nyanloutre dotlambda ];
+    changelog = "https://github.com/libfuse/pyfuse3/blob/${version}/Changes.rst";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyfxa/default.nix b/nixpkgs/pkgs/development/python-modules/pyfxa/default.nix
new file mode 100644
index 000000000000..0df1538c9ced
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfxa/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchPypi
+, grequests
+, hawkauthlib
+, mock
+, pybrowserid
+, pyjwt
+, pytestCheckHook
+, pythonOlder
+, requests
+, responses
+, setuptools
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "pyfxa";
+  version = "0.7.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "PyFxA";
+    inherit version;
+    hash = "sha256-bIXNCM8F9xON7hzyqKHWj9Qot7WtSIkXxwoqdj1lHNs=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    hawkauthlib
+    pybrowserid
+    pyjwt
+    requests
+    setuptools # imports pkg_resources
+    six
+  ];
+
+  nativeCheckInputs = [
+    grequests
+    mock
+    responses
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "fxa"
+  ];
+
+  disabledTestPaths = [
+    # Requires network access
+    "fxa/tests/test_core.py"
+    "fxa/tests/test_oauth.py"
+  ];
+
+  meta = with lib; {
+    description = "Firefox Accounts client library";
+    homepage = "https://github.com/mozilla/PyFxA";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyfzf/default.nix b/nixpkgs/pkgs/development/python-modules/pyfzf/default.nix
new file mode 100644
index 000000000000..3578f863fa48
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyfzf/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fzf
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyfzf";
+  version = "0.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nk412";
+    repo = pname;
+    rev = version;
+    hash = "sha256-w+ZjQGFd/lR2TiTHc2uQSJXORmzJJZXsr9BO4PIw/Co=";
+  };
+
+  propagatedBuildInputs = [
+    fzf
+  ];
+
+  pythonImportsCheck = [
+    "pyfzf"
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Wrapper for fzf";
+    homepage = "https://github.com/nk412/pyfzf";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygal/default.nix b/nixpkgs/pkgs/development/python-modules/pygal/default.nix
new file mode 100644
index 000000000000..6c5de6581d57
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygal/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, lxml
+, cairosvg
+, pyquery
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pygal";
+  version = "3.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-KSP5XS5RWTCqWplyGdzO+/PZK36vX8HJ/ruVsJk1/bI=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace pytest-runner ""
+  '';
+
+  passthru.optional-dependencies = {
+    lxml = [ lxml ];
+    png = [ cairosvg ];
+  };
+
+  nativeCheckInputs = [
+    pyquery
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.png;
+
+  preCheck = ''
+    # necessary on darwin to pass the testsuite
+    export LANG=en_US.UTF-8
+  '';
+
+  meta = with lib; {
+    description = "Sexy and simple python charting";
+    homepage = "http://www.pygal.org";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygame-gui/default.nix b/nixpkgs/pkgs/development/python-modules/pygame-gui/default.nix
new file mode 100644
index 000000000000..3c530d199f81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygame-gui/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, pkgs
+, buildPythonPackage
+, fetchFromGitHub
+, pygame
+, python-i18n
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pygame-gui";
+  version = "069";
+  # nixpkgs-update: no auto update
+
+  src = fetchFromGitHub {
+    owner = "MyreMylar";
+    repo = "pygame_gui";
+    rev = "refs/tags/v_${version}";
+    hash = "sha256-IXU00Us1odbfS7jLPMYuCPv2l/5TUZdYKES7xHs+EWg=";
+  };
+
+  propagatedBuildInputs = [ pygame python-i18n ];
+
+  postPatch = ''
+    substituteInPlace pygame_gui/core/utility.py \
+      --replace "xsel" "${pkgs.xsel}/bin/xsel"
+  '';
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+    export SDL_VIDEODRIVER=dummy
+  '';
+
+  disabledTests = [
+    # Clipboard doesn't exist in test environment
+    "test_process_event_text_ctrl_c"
+    "test_process_event_text_ctrl_v"
+    "test_process_event_text_ctrl_v_nothing"
+    "test_process_event_ctrl_v_over_limit"
+    "test_process_event_ctrl_v_at_limit"
+    "test_process_event_ctrl_v_over_limit_select_range"
+    "test_process_event_text_ctrl_v_select_range"
+    "test_process_event_text_ctrl_a"
+    "test_process_event_text_ctrl_x"
+  ];
+
+  disabledTestPaths = [
+    "tests/test_performance/test_text_performance.py"
+  ];
+
+  meta = with lib; {
+    description = "A GUI system for pygame";
+    homepage = "https://github.com/MyreMylar/pygame_gui";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ emilytrau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygame/default.nix b/nixpkgs/pkgs/development/python-modules/pygame/default.nix
new file mode 100644
index 000000000000..ad506999d595
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygame/default.nix
@@ -0,0 +1,88 @@
+{ stdenv, lib, substituteAll, fetchFromGitHub, buildPythonPackage, python, pkg-config, libX11
+, SDL2, SDL2_image, SDL2_mixer, SDL2_ttf, libpng, libjpeg, portmidi, freetype, fontconfig
+, AppKit
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pygame";
+  version = "2.5.1";
+
+  disabled = pythonOlder "3.6";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/${version}";
+    # Unicode file names lead to different checksums on HFS+ vs. other
+    # filesystems because of unicode normalisation. The documentation
+    # has such files and will be removed.
+    hash = "sha256-0mVbjfNYTfuo8uyd7NFKlneUZMt78mcitQ5nCgPxmFs=";
+    postFetch = "rm -rf $out/docs/reST";
+  };
+
+  patches = [
+    # Patch pygame's dependency resolution to let it find build inputs
+    (substituteAll {
+      src = ./fix-dependency-finding.patch;
+      buildinputs_include = builtins.toJSON (builtins.concatMap (dep: [
+        "${lib.getDev dep}/"
+        "${lib.getDev dep}/include"
+        "${lib.getDev dep}/include/SDL2"
+      ]) buildInputs);
+      buildinputs_lib = builtins.toJSON (builtins.concatMap (dep: [
+        "${lib.getLib dep}/"
+        "${lib.getLib dep}/lib"
+      ]) buildInputs);
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace src_py/sysfont.py \
+      --replace 'path="fc-list"' 'path="${fontconfig}/bin/fc-list"' \
+      --replace /usr/X11/bin/fc-list ${fontconfig}/bin/fc-list
+  '';
+
+  nativeBuildInputs = [
+    pkg-config SDL2
+  ];
+
+  buildInputs = [
+    SDL2 SDL2_image SDL2_mixer SDL2_ttf libpng libjpeg
+    portmidi libX11 freetype
+  ] ++ lib.optionals stdenv.isDarwin [
+    AppKit
+  ];
+
+  preConfigure = ''
+    ${python.pythonOnBuildForHost.interpreter} buildconfig/config.py
+  '';
+
+  env = lib.optionalAttrs stdenv.cc.isClang {
+    NIX_CFLAGS_COMPILE = "-Wno-error=incompatible-function-pointer-types";
+  };
+
+  checkPhase = ''
+    runHook preCheck
+
+    # No audio or video device in test environment
+    export SDL_VIDEODRIVER=dummy
+    export SDL_AUDIODRIVER=disk
+    export SDL_DISKAUDIOFILE=/dev/null
+
+    ${python.interpreter} -m pygame.tests -v --exclude opengl,timing --time_out 300
+
+    runHook postCheck
+  '';
+  pythonImportsCheck = [ "pygame" ];
+
+  meta = with lib; {
+    description = "Python library for games";
+    homepage = "https://www.pygame.org/";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ emilytrau ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygame/fix-dependency-finding.patch b/nixpkgs/pkgs/development/python-modules/pygame/fix-dependency-finding.patch
new file mode 100644
index 000000000000..5e39dff13575
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygame/fix-dependency-finding.patch
@@ -0,0 +1,41 @@
+diff --git a/buildconfig/config_darwin.py b/buildconfig/config_darwin.py
+index 9503ea70..d0d3ab6e 100644
+--- a/buildconfig/config_darwin.py
++++ b/buildconfig/config_darwin.py
+@@ -140,16 +140,8 @@ def main(auto_config=False):
+     ])
+ 
+     print('Hunting dependencies...')
+-    incdirs = ['/usr/local/include', '/opt/homebrew/include']
+-    incdirs.extend(['/usr/local/include/SDL2', '/opt/homebrew/include/SDL2', '/opt/local/include/SDL2'])
+-
+-    incdirs.extend([
+-       #'/usr/X11/include',
+-       '/opt/local/include',
+-       '/opt/local/include/freetype2/freetype']
+-    )
+-    #libdirs = ['/usr/local/lib', '/usr/X11/lib', '/opt/local/lib']
+-    libdirs = ['/usr/local/lib', '/opt/local/lib', '/opt/homebrew/lib']
++    incdirs = @buildinputs_include@
++    libdirs = @buildinputs_lib@
+ 
+     for d in DEPS:
+         if isinstance(d, (list, tuple)):
+diff --git a/buildconfig/config_unix.py b/buildconfig/config_unix.py
+index 3eba5b5c..53cc6233 100644
+--- a/buildconfig/config_unix.py
++++ b/buildconfig/config_unix.py
+@@ -240,11 +240,8 @@ def main(auto_config=False):
+     if not DEPS[0].found:
+         raise RuntimeError('Unable to run "sdl-config". Please make sure a development version of SDL is installed.')
+ 
+-    incdirs = []
+-    libdirs = []
+-    for extrabase in extrabases:
+-        incdirs += [extrabase + d for d in origincdirs]
+-        libdirs += [extrabase + d for d in origlibdirs]
++    incdirs = @buildinputs_include@
++    libdirs = @buildinputs_lib@
+ 
+     for arg in DEPS[0].cflags.split():
+         if arg[:2] == '-I':
diff --git a/nixpkgs/pkgs/development/python-modules/pygame_sdl2/default.nix b/nixpkgs/pkgs/development/python-modules/pygame_sdl2/default.nix
new file mode 100644
index 000000000000..bf123eef02a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygame_sdl2/default.nix
@@ -0,0 +1,49 @@
+{ lib, buildPythonPackage, fetchurl, isPy27, renpy
+, cython, SDL2, SDL2_image, SDL2_ttf, SDL2_mixer, libjpeg, libpng }:
+
+buildPythonPackage rec {
+  pname = "pygame_sdl2";
+  version = "2.1.0";
+  renpy_version = renpy.base_version;
+  name = "${pname}-${version}-${renpy_version}";
+
+  src = fetchurl {
+    url = "https://www.renpy.org/dl/${renpy_version}/pygame_sdl2-${version}-for-renpy-${renpy_version}.tar.gz";
+    hash = "sha256-u9DIFKd+uyphH3ETMJWYqt7YFyeIgBWoXUO3rC+RWjc=";
+  };
+
+  # force rebuild of headers needed for install
+  prePatch = ''
+    rm -rf gen gen3
+  '';
+
+  # Remove build tag which produces invaild version
+  postPatch = ''
+    sed -i '2d' setup.cfg
+  '';
+
+  nativeBuildInputs = [
+    SDL2.dev cython
+  ];
+
+  buildInputs = [
+    SDL2 SDL2_image SDL2_ttf SDL2_mixer
+    libjpeg libpng
+  ];
+
+
+  doCheck = isPy27; # python3 tests are non-functional
+
+  postInstall = ''
+    ( cd "$out"/include/python*/ ;
+      ln -s pygame-sdl2 pygame_sdl2 || true ; )
+  '';
+
+  meta = with lib; {
+    description = "A reimplementation of parts of pygame API using SDL2";
+    homepage    = "https://github.com/renpy/pygame_sdl2";
+    # Some parts are also available under Zlib License
+    license     = licenses.lgpl2;
+    maintainers = with maintainers; [ raskin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygatt/default.nix b/nixpkgs/pkgs/development/python-modules/pygatt/default.nix
new file mode 100644
index 000000000000..0401fa3d4cbe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygatt/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, nose
+, pexpect
+, pyserial
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pygatt";
+  version = "4.0.5";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "peplin";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1zdfxidiw0l8n498sy0l33n90lz49n25x889cx6jamjr7frlcihd";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+  ];
+
+  passthru.optional-dependencies.GATTTOOL = [
+    pexpect
+  ];
+
+  nativeBuildInputs = [
+    # For cross compilation the doCheck is false and therefor the
+    # nativeCheckInputs not included. We have to include nose here, since
+    # setup.py requires nose unconditionally.
+    nose
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ]
+  ++ passthru.optional-dependencies.GATTTOOL;
+
+  postPatch = ''
+    # Not support for Python < 3.4
+    substituteInPlace setup.py --replace "'enum-compat'" ""
+  '';
+
+  pythonImportsCheck = [ "pygatt" ];
+
+  meta = with lib; {
+    description = "Python wrapper the BGAPI for accessing Bluetooth LE Devices";
+    homepage = "https://github.com/peplin/pygatt";
+    license = with licenses; [ asl20 mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygccxml/default.nix b/nixpkgs/pkgs/development/python-modules/pygccxml/default.nix
new file mode 100644
index 000000000000..10336a27549f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygccxml/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, castxml
+, fetchFromGitHub
+, buildPythonPackage
+, llvmPackages
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pygccxml";
+  version = "2.4.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "gccxml";
+    repo = "pygccxml";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-rw99afv68c92LWmKUErB1y0Cts69UEpI0GCxSMvD+B8=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  buildInputs = [
+    castxml
+    llvmPackages.libcxxStdenv
+  ];
+
+  # running the suite is hard, needs to generate xml_generator.cfg
+  # but the format doesn't accept -isystem directives
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python package for easy C++ declarations navigation";
+    homepage = "https://github.com/gccxml/pygccxml";
+    changelog = "https://github.com/CastXML/pygccxml/blob/v${version}/CHANGELOG.md";
+    license = licenses.boost;
+    maintainers = with maintainers; [ teto ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygdbmi/default.nix b/nixpkgs/pkgs/development/python-modules/pygdbmi/default.nix
new file mode 100644
index 000000000000..d1b5b31ed951
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygdbmi/default.nix
@@ -0,0 +1,37 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, gdb
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pygdbmi";
+  version = "0.11.0.0";
+
+  src = fetchFromGitHub {
+    owner = "cs01";
+    repo = "pygdbmi";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-JqEDN8Pg/JttyYQbwkxKkLYuxVnvV45VlClD23eaYyc=";
+  };
+
+  nativeCheckInputs = [ gdb pytest ];
+
+  # tests require gcc for some reason
+  doCheck = !stdenv.hostPlatform.isDarwin;
+
+  postPatch = ''
+    # tries to execute flake8,
+    # which is likely to break on flake8 updates
+    echo "def main(): return 0" > tests/static_tests.py
+  '';
+
+  meta = with lib; {
+    description = "Parse gdb machine interface output with Python";
+    homepage = "https://github.com/cs01/pygdbmi";
+    license = licenses.mit;
+    maintainers = [ maintainers.mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygeoip/default.nix b/nixpkgs/pkgs/development/python-modules/pygeoip/default.nix
new file mode 100644
index 000000000000..b9b588d669ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygeoip/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi
+, nose }:
+
+buildPythonPackage rec {
+  pname = "pygeoip";
+  version = "0.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f22c4e00ddf1213e0fae36dc60b46ee7c25a6339941ec1a975539014c1f9a96d";
+  };
+
+  # requires geoip samples
+  doCheck = false;
+
+  buildInputs = [ nose ];
+
+  meta = with lib; {
+    description = "Pure Python GeoIP API";
+    homepage = "https://github.com/appliedsec/pygeoip";
+    license = licenses.lgpl3Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygeos/default.nix b/nixpkgs/pkgs/development/python-modules/pygeos/default.nix
new file mode 100644
index 000000000000..a31725a1002b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygeos/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, geos
+, pytestCheckHook
+, cython
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "pygeos";
+  version = "0.14";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MPvBf2SEQgC4UTO4hfz7ZVQbh3lTH270+P5GfT+6diM=";
+  };
+
+  nativeBuildInputs = [
+    geos # for geos-config
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  # The cythonized extensions are required to exist in the pygeos/ directory
+  # for the package to function. Therefore override of buildPhase was
+  # necessary.
+  buildPhase = ''
+    ${python.pythonOnBuildForHost.interpreter} setup.py build_ext --inplace
+    ${python.pythonOnBuildForHost.interpreter} setup.py bdist_wheel
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pygeos"
+  ];
+
+  meta = with lib; {
+    description = "Wraps GEOS geometry functions in numpy ufuncs";
+    homepage = "https://github.com/pygeos/pygeos";
+    changelog = "https://github.com/pygeos/pygeos/blob/${version}/CHANGELOG.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ nialov ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygetwindow/default.nix b/nixpkgs/pkgs/development/python-modules/pygetwindow/default.nix
new file mode 100644
index 000000000000..3ffd83ee0026
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygetwindow/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyrect
+}:
+buildPythonPackage rec {
+  pname = "PyGetWindow";
+  version = "0.0.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-F4lDVefSswXNgy1xdwg4QBfBaYqQziT29/vwJC3Qpog=";
+  };
+
+  doCheck = false;
+  # This lib officially only works completely on Windows and partially on MacOS but pyautogui requires it
+  # pythonImportsCheck = [ "pygetwindow" ];
+
+  propagatedBuildInputs = [
+    pyrect
+  ];
+
+  meta = with lib; {
+    description = "A simple, cross-platform module for obtaining GUI information on applications' windows.";
+    homepage = "https://github.com/asweigart/PyGetWindow";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ lucasew ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygit2/default.nix b/nixpkgs/pkgs/development/python-modules/pygit2/default.nix
new file mode 100644
index 000000000000..5505b1c3a83f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygit2/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cacert
+, cached-property
+, cffi
+, fetchPypi
+, isPyPy
+, libgit2
+, pycparser
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pygit2";
+  version = "1.13.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bd43Q2+rFCZK09bLxarj/VVeualoCnv91uVkzXe14rg=";
+  };
+
+  preConfigure = lib.optionalString stdenv.isDarwin ''
+    export DYLD_LIBRARY_PATH="${libgit2}/lib"
+  '';
+
+  buildInputs = [
+    libgit2
+  ];
+
+  propagatedBuildInputs = [
+    cached-property
+    pycparser
+  ] ++ lib.optionals (!isPyPy) [
+    cffi
+  ];
+
+  propagatedNativeBuildInputs = lib.optionals (!isPyPy) [
+    cffi
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Disable tests that require networking
+    "test/test_repository.py"
+    "test/test_credentials.py"
+    "test/test_submodule.py"
+  ];
+
+  # Tests require certificates
+  # https://github.com/NixOS/nixpkgs/pull/72544#issuecomment-582674047
+  SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt";
+
+  pythonImportsCheck = [
+    "pygit2"
+  ];
+
+  meta = with lib; {
+    description = "A set of Python bindings to the libgit2 shared library";
+    homepage = "https://github.com/libgit2/pygit2";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygitguardian/default.nix b/nixpkgs/pkgs/development/python-modules/pygitguardian/default.nix
new file mode 100644
index 000000000000..78dc32f7625b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygitguardian/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, marshmallow
+, marshmallow-dataclass
+, pytestCheckHook
+, pythonOlder
+, requests
+, responses
+, setuptools
+, typing-extensions
+, vcrpy
+}:
+
+buildPythonPackage rec {
+  pname = "pygitguardian";
+  version = "1.11.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "GitGuardian";
+    repo = "py-gitguardian";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Vr0+y3Zi7DsXzm2COOlMqUVjlZMRJkaVxT8QpSePhuA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    marshmallow
+    marshmallow-dataclass
+    requests
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    vcrpy
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "pygitguardian"
+  ];
+
+  disabledTests = [
+    # Tests require an API key
+    "test_compute_sca_files"
+    "test_content_scan_exceptions"
+    "test_content_scan"
+    "test_create_honeytoken"
+    "test_create_jwt"
+    "test_extra_headers"
+    "test_health_check"
+    "test_multi_content_exceptions"
+    "test_multi_content_scan"
+    "test_multiscan_parameters"
+    "test_quota_overview"
+    "test_sca_client_scan_diff"
+    "test_sca_scan_directory_invalid_tar"
+    "test_sca_scan_directory"
+    "test_versions_from_headers"
+  ];
+
+  meta = with lib; {
+    description = "Library to access the GitGuardian API";
+    homepage = "https://github.com/GitGuardian/py-gitguardian";
+    changelog = "https://github.com/GitGuardian/py-gitguardian/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygithub/default.nix b/nixpkgs/pkgs/development/python-modules/pygithub/default.nix
new file mode 100644
index 000000000000..cbfacc2c4f36
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygithub/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, deprecated
+, fetchFromGitHub
+, pynacl
+, typing-extensions
+, pyjwt
+, python-dateutil
+, pythonOlder
+, requests
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pygithub";
+  version = "2.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "PyGithub";
+    repo = "PyGithub";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ysa1RAWuFFQCF6bYwAUVFou7nxCKHLZbUtrUtXiSpPk=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    deprecated
+    pyjwt
+    pynacl
+    python-dateutil
+    requests
+    typing-extensions
+  ] ++ pyjwt.optional-dependencies.crypto;
+
+  # Test suite makes REST calls against github.com
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "github"
+  ];
+
+  meta = with lib; {
+    description = "Python library to access the GitHub API v3";
+    homepage = "https://github.com/PyGithub/PyGithub";
+    changelog = "https://github.com/PyGithub/PyGithub/raw/v${version}/doc/changes.rst";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ jhhuh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyglet/default.nix b/nixpkgs/pkgs/development/python-modules/pyglet/default.nix
new file mode 100644
index 000000000000..393ec9f2e4cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyglet/default.nix
@@ -0,0 +1,111 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, unzip
+, pythonOlder
+, libGL
+, libGLU
+, xorg
+, pytestCheckHook
+, glibc
+, gtk2-x11
+, gdk-pixbuf
+, fontconfig
+, freetype
+, ffmpeg-full
+, openal
+, libpulseaudio
+}:
+
+buildPythonPackage rec {
+  version = "2.0.10";
+  pname = "pyglet";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JCvrGzvWfFvr3+W6EexWtpathrUMbn8qMX+NeDJWuck=";
+    extension = "zip";
+  };
+
+  # find_library doesn't reliably work with nix (https://github.com/NixOS/nixpkgs/issues/7307).
+  # Even naively searching `LD_LIBRARY_PATH` won't work since `libc.so` is a linker script and
+  # ctypes.cdll.LoadLibrary cannot deal with those. Therefore, just hardcode the paths to the
+  # necessary libraries.
+  postPatch = let
+    ext = stdenv.hostPlatform.extensions.sharedLibrary;
+  in ''
+    cat > pyglet/lib.py <<EOF
+    import ctypes
+    def load_library(*names, **kwargs):
+        for name in names:
+            path = None
+            if name == 'GL':
+                path = '${libGL}/lib/libGL${ext}'
+            elif name == 'EGL':
+                path = '${libGL}/lib/libEGL${ext}'
+            elif name == 'GLU':
+                path = '${libGLU}/lib/libGLU${ext}'
+            elif name == 'c':
+                path = '${glibc}/lib/libc${ext}.6'
+            elif name == 'X11':
+                path = '${xorg.libX11}/lib/libX11${ext}'
+            elif name == 'gdk-x11-2.0':
+                path = '${gtk2-x11}/lib/libgdk-x11-2.0${ext}'
+            elif name == 'gdk_pixbuf-2.0':
+                path = '${gdk-pixbuf}/lib/libgdk_pixbuf-2.0${ext}'
+            elif name == 'Xext':
+                path = '${xorg.libXext}/lib/libXext${ext}'
+            elif name == 'fontconfig':
+                path = '${fontconfig.lib}/lib/libfontconfig${ext}'
+            elif name == 'freetype':
+                path = '${freetype}/lib/libfreetype${ext}'
+            elif name[0:2] == 'av' or name[0:2] == 'sw':
+                path = '${ffmpeg-full}/lib/lib' + name + '${ext}'
+            elif name == 'openal':
+                path = '${openal}/lib/libopenal${ext}'
+            elif name == 'pulse':
+                path = '${libpulseaudio}/lib/libpulse${ext}'
+            elif name == 'Xi':
+                path = '${xorg.libXi}/lib/libXi${ext}'
+            elif name == 'Xinerama':
+                path = '${xorg.libXinerama}/lib/libXinerama${ext}'
+            elif name == 'Xxf86vm':
+                path = '${xorg.libXxf86vm}/lib/libXxf86vm${ext}'
+            if path is not None:
+                return ctypes.cdll.LoadLibrary(path)
+        raise Exception("Could not load library {}".format(names))
+    EOF
+  '';
+
+  nativeBuildInputs = [ unzip ];
+
+  # needs GL set up which isn't really possible in a build environment even in headless mode.
+  # tests do run and pass in nix-shell, however.
+  doCheck = false;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export PYGLET_HEADLESS=True
+  '';
+
+  # test list taken from .travis.yml
+  disabledTestPaths = [
+    "tests/base"
+    "tests/interactive"
+    "tests/integration"
+    "tests/unit/text/test_layout.py"
+  ];
+
+  pythonImportsCheck = [ "pyglet" ];
+
+  meta = with lib; {
+    homepage = "http://www.pyglet.org/";
+    description = "A cross-platform windowing and multimedia library";
+    license = licenses.bsd3;
+    platforms = platforms.mesaPlatforms;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyglm/default.nix b/nixpkgs/pkgs/development/python-modules/pyglm/default.nix
new file mode 100644
index 000000000000..f5d0d0aa2162
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyglm/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyglm";
+  version = "2.7.1";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "Zuzu-Typ";
+    repo = "PyGLM";
+    rev = "refs/tags/${version}";
+    hash = "sha256-nCkwYZLibQcmlF1Nvv2I6qi+97ue7Q1HVxpw32G5qpo=";
+    fetchSubmodules = true;
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "glm"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Zuzu-Typ/PyGLM";
+    description = "An OpenGL Mathematics (GLM) library for Python written in C++";
+    changelog = "https://github.com/Zuzu-Typ/PyGLM/releases/tag/${src.rev}";
+    license = licenses.zlib;
+    maintainers = with maintainers; [ sund3RRR ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygls/default.nix b/nixpkgs/pkgs/development/python-modules/pygls/default.nix
new file mode 100644
index 000000000000..34ed59e96061
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygls/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, lsprotocol
+, typeguard
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pygls";
+  version = "1.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "openlawlibrary";
+    repo = "pygls";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-hIr06qzOkObEcrIgFUloAPBJdOtcipl4htpbbUVkbdw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    lsprotocol
+    typeguard
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  # Fixes hanging tests on Darwin
+  __darwinAllowLocalNetworking = true;
+
+  preCheck = lib.optionalString stdenv.isDarwin ''
+    # Darwin issue: OSError: [Errno 24] Too many open files
+    ulimit -n 1024
+  '';
+
+  pythonImportsCheck = [ "pygls" ];
+
+  meta = with lib; {
+    description = "Pythonic generic implementation of the Language Server Protocol";
+    homepage = "https://github.com/openlawlibrary/pygls";
+    changelog = "https://github.com/openlawlibrary/pygls/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ kira-bruneau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygmars/default.nix b/nixpkgs/pkgs/development/python-modules/pygmars/default.nix
new file mode 100644
index 000000000000..e186cd99d98d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygmars/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, setuptools-scm
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pygmars";
+  version = "0.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "nexB";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-PiH1lV1Vt9VTSOB+jep8FHIdk8qnauxj4nP3CIi/m7o=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  postPatch = ''
+    # https://github.com/nexB/pygmars/pull/9
+    substituteInPlace setup.cfg \
+      --replace ">=3.6.*" ">=3.6"
+  '';
+
+  dontConfigure = true;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pygmars"
+  ];
+
+  meta = with lib; {
+    description = "Python lexing and parsing library";
+    homepage = "https://github.com/nexB/pygmars";
+    changelog = "https://github.com/nexB/pygmars/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygments-better-html/default.nix b/nixpkgs/pkgs/development/python-modules/pygments-better-html/default.nix
new file mode 100644
index 000000000000..635707160305
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygments-better-html/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pygments
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "pygments_better_html";
+  version = "0.1.5";
+  disabled = ! isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-SLAe5ubIGEchUNoHCct6CWisBja3WNEfpE48v9CTzPQ=";
+  };
+
+  propagatedBuildInputs = [ pygments ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "pygments_better_html" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Kwpolska/pygments_better_html";
+    description = "Improved line numbering for Pygments’ HTML formatter.";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygments-markdown-lexer/default.nix b/nixpkgs/pkgs/development/python-modules/pygments-markdown-lexer/default.nix
new file mode 100644
index 000000000000..0a88e34005cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygments-markdown-lexer/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "pygments-markdown-lexer";
+  version = "0.1.0.dev39";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "1pzb5wy23q3fhs0rqzasjnw6hdzwjngpakb73i98cn0b8lk8q4jc";
+  };
+
+  propagatedBuildInputs = [ pygments ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/jhermann/pygments-markdown-lexer";
+    description = "Pygments Markdown Lexer – A Markdown lexer for Pygments to highlight Markdown code snippets";
+    license = licenses.asl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygments-style-github/default.nix b/nixpkgs/pkgs/development/python-modules/pygments-style-github/default.nix
new file mode 100644
index 000000000000..918456774f57
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygments-style-github/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, pygments }:
+
+buildPythonPackage rec {
+  pname = "pygments-style-github";
+  version = "0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-D8q9IxR9VMhiQPYhZ4xTyZin3vqg0naRHB8t7wpF9Kc=";
+  };
+
+  # no tests exist on upstream repo
+  doCheck = false;
+
+  propagatedBuildInputs = [ pygments ];
+
+  pythonImportsCheck = [ "pygments_style_github" ];
+
+  meta = with lib; {
+    description = "A port of the github color scheme for pygments";
+    homepage = "https://github.com/hugomaiavieira/pygments-style-github";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ drupol ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygments/default.nix b/nixpkgs/pkgs/development/python-modules/pygments/default.nix
new file mode 100644
index 000000000000..f2b89cbcefd5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygments/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+
+# build-system
+, setuptools
+
+# tests
+, pytestCheckHook
+, wcag-contrast-ratio
+}:
+
+let pygments = buildPythonPackage
+  rec {
+    pname = "pygments";
+    version = "2.16.1";
+    format = "pyproject";
+
+    src = fetchPypi {
+      pname = "Pygments";
+      inherit version;
+      hash = "sha256-Ha/wSUggxpvIlB5AeqIPV3N07og2TuEKmP2+Cuzpbik=";
+    };
+
+    nativeBuildInputs = [
+      setuptools
+    ];
+
+    # circular dependencies if enabled by default
+    doCheck = false;
+
+    nativeCheckInputs = [
+      pytestCheckHook
+      wcag-contrast-ratio
+    ];
+
+    disabledTestPaths = [
+      # 5 lines diff, including one nix store path in 20000+ lines
+      "tests/examplefiles/bash/ltmain.sh"
+    ];
+
+    pythonImportsCheck = [
+      "pygments"
+    ];
+
+    passthru.tests = {
+      check = pygments.overridePythonAttrs (_: { doCheck = true; });
+    };
+
+    meta = with lib; {
+      changelog = "https://github.com/pygments/pygments/releases/tag/${version}";
+      homepage = "https://pygments.org/";
+      description = "A generic syntax highlighter";
+      mainProgram = "pygmentize";
+      license = licenses.bsd2;
+      maintainers = with maintainers; [ ];
+    };
+  };
+in pygments
diff --git a/nixpkgs/pkgs/development/python-modules/pygmo/default.nix b/nixpkgs/pkgs/development/python-modules/pygmo/default.nix
new file mode 100644
index 000000000000..0ce6a2fd3f99
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygmo/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, stdenv
+, toPythonModule
+, fetchFromGitHub
+, cmake
+, boost
+, eigen
+, ipopt
+, nlopt
+, pagmo2
+, python
+, cloudpickle
+, ipyparallel
+, numba
+, numpy
+, pybind11
+}:
+
+toPythonModule (stdenv.mkDerivation rec {
+  pname = "pygmo";
+  version = "2.19.5";
+
+  src = fetchFromGitHub {
+    owner = "esa";
+    repo = "pygmo2";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-szQyw5kYfrQEeXRQzjQ0hzULuzTfmGod6ZxG9PDRj5M=";
+  };
+
+  cmakeFlags = [
+    "-DPYGMO_INSTALL_PATH=${placeholder "out"}/lib/${python.libPrefix}/site-packages"
+  ];
+
+  nativeBuildInputs = [
+    cmake
+  ];
+
+  propagatedBuildInputs = [
+    cloudpickle
+    ipyparallel
+    numba
+    numpy
+    python
+  ];
+
+  buildInputs = [
+    boost
+    eigen
+    ipopt
+    nlopt
+    pagmo2
+    pybind11
+  ];
+
+  doCheck = true;
+
+  meta = with lib; {
+    description = "Parallel optimisation for Python";
+    homepage = "https://github.com/esa/pygmo2";
+    license = licenses.gpl3Plus;
+    maintainers = [ ];
+  };
+})
diff --git a/nixpkgs/pkgs/development/python-modules/pygmt/default.nix b/nixpkgs/pkgs/development/python-modules/pygmt/default.nix
new file mode 100644
index 000000000000..31b9fdd7c3a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygmt/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, stdenv
+, pythonOlder
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, gmt
+, numpy
+, netcdf4
+, pandas
+, packaging
+, xarray
+, pytest-mpl
+, ipython
+, ghostscript
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pygmt";
+  version = "0.10.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "GenericMappingTools";
+    repo = "pygmt";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+bkjqHjJIwk44u226q6xqeGmwMWleyc4lRfMZdDjVBA=";
+  };
+
+  postPatch = ''
+    substituteInPlace pygmt/clib/loading.py \
+      --replace "env.get(\"GMT_LIBRARY_PATH\", \"\")" "env.get(\"GMT_LIBRARY_PATH\", \"${gmt}/lib\")"
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    netcdf4
+    pandas
+    packaging
+    xarray
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mpl
+    ghostscript
+    ipython
+  ];
+
+  # The *entire* test suite requires network access
+  doCheck = false;
+
+  postBuild = ''
+    export HOME=$TMP
+  '';
+
+  pythonImportsCheck = [
+    "pygmt"
+  ];
+
+  meta = with lib; {
+    description = "A Python interface for the Generic Mapping Tools";
+    homepage = "https://github.com/GenericMappingTools/pygmt";
+    license = licenses.bsd3;
+    changelog = "https://github.com/GenericMappingTools/pygmt/releases/tag/v${version}";
+    # pygmt.exceptions.GMTCLibNotFoundError: Error loading the GMT shared library '/nix/store/r3xnnqgl89vrnq0kzxx0bmjwzks45mz8-gmt-6.1.1/lib/libgmt.dylib'
+    broken = stdenv.isDarwin;
+    maintainers = with maintainers; [ sikmir ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygnmi/default.nix b/nixpkgs/pkgs/development/python-modules/pygnmi/default.nix
new file mode 100644
index 000000000000..a5218555b36b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygnmi/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cryptography
+, dictdiffer
+, grpcio
+, protobuf
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pygnmi";
+  version = "0.8.13";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "akarneliuk";
+    repo = "pygnmi";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-NkByimHk1DoBjMMD7ywplo38VxBpp1pnClYUzhtKwY4=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    dictdiffer
+    grpcio
+    protobuf
+  ];
+
+  # almost all tests fail with:
+  # TypeError: expected string or bytes-like object
+  doCheck = false;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pygnmi"
+  ];
+
+  meta = with lib; {
+    description = "Pure Python gNMI client to manage network functions and collect telemetry";
+    homepage = "https://github.com/akarneliuk/pygnmi";
+    changelog = "https://github.com/akarneliuk/pygnmi/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygobject-stubs/default.nix b/nixpkgs/pkgs/development/python-modules/pygobject-stubs/default.nix
new file mode 100644
index 000000000000..9dde5d012225
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygobject-stubs/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pygobject3
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pygobject-stubs";
+  version = "2.10.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pygobject";
+    repo = "pygobject-stubs";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-fz+qzFWl9JJu9CEVkeiV6XUIPDvwWgrfhTo/nj1EH5c=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  # This package does not include any tests.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "PEP 561 Typing Stubs for PyGObject";
+    homepage = "https://github.com/pygobject/pygobject-stubs";
+    changelog = "https://github.com/pygobject/pygobject-stubs/blob/${version}/CHANGELOG.md";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ hacker1024 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygobject/3.nix b/nixpkgs/pkgs/development/python-modules/pygobject/3.nix
new file mode 100644
index 000000000000..89d261d5f8de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygobject/3.nix
@@ -0,0 +1,78 @@
+{ lib
+, stdenv
+, fetchurl
+, buildPythonPackage
+, pkg-config
+, glib
+, gobject-introspection
+, pycairo
+, cairo
+, ncurses
+, meson
+, ninja
+, pythonOlder
+, gnome
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "pygobject";
+  version = "3.46.0";
+
+  outputs = [ "out" "dev" ];
+
+  disabled = pythonOlder "3.8";
+
+  format = "other";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
+    sha256 = "QmAIstrVSMmvHHsDtZ3wRA/eXDPzj7VAaxA6Q9ZTyvw=";
+  };
+
+  depsBuildBuild = [
+    pkg-config
+  ];
+
+  nativeBuildInputs = [
+    pkg-config
+    meson
+    ninja
+    gobject-introspection
+  ];
+
+  buildInputs = [
+    # # .so files link to this
+    glib
+  ] ++ lib.optionals stdenv.isDarwin [
+    ncurses
+  ];
+
+  propagatedBuildInputs = [
+    pycairo
+    cairo
+  ];
+
+  mesonFlags = [
+    # This is only used for figuring out what version of Python is in
+    # use, and related stuff like figuring out what the install prefix
+    # should be, but it does need to be able to execute Python code.
+    "-Dpython=${python.pythonOnBuildForHost.interpreter}"
+  ];
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = pname;
+      attrPath = "python3.pkgs.${pname}3";
+      versionPolicy = "odd-unstable";
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://pygobject.readthedocs.io/";
+    description = "Python bindings for Glib";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ jtojnar ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygogo/default.nix b/nixpkgs/pkgs/development/python-modules/pygogo/default.nix
new file mode 100644
index 000000000000..4a6a89844e6a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygogo/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchFromGitHub
+, pkutils
+  # Check Inputs
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "pygogo";
+  version = "0.13.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "reubano";
+    repo = "pygogo";
+    rev = "v${version}";
+    sha256 = "19rdf4sjrm5lp1vq1bki21a9lrkzz8sgrfwgjdkq4sgy90hn1jn9";
+  };
+
+  nativeBuildInputs = [
+    pkutils
+  ];
+
+  nativeCheckInputs = [
+    nose
+  ];
+
+  postPatch = ''
+    substituteInPlace dev-requirements.txt \
+      --replace "pkutils>=1.0.0,<2.0.0" "pkutils>=1.0.0"
+  '';
+
+  checkPhase = ''
+    runHook preCheck
+    nosetests
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "pygogo"
+  ];
+
+  meta = with lib; {
+    description = "Python logging library";
+    homepage = "https://github.com/reubano/pygogo/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygpgme/default.nix b/nixpkgs/pkgs/development/python-modules/pygpgme/default.nix
new file mode 100644
index 000000000000..ea6364f1125b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygpgme/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+, gpgme
+, isPyPy
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  version = "0.3";
+  pname = "pygpgme";
+
+  # Native code doesn't compile against the C API of Python 3.11:
+  # https://bugs.launchpad.net/pygpgme/+bug/1996122
+  disabled = isPyPy || pythonAtLeast "3.11";
+
+  src = fetchurl {
+    url = "https://launchpad.net/pygpgme/trunk/${version}/+download/${pname}-${version}.tar.gz";
+    sha256 = "5fd887c407015296a8fd3f4b867fe0fcca3179de97ccde90449853a3dfb802e1";
+  };
+
+  # error: invalid command 'test'
+  doCheck = false;
+
+  propagatedBuildInputs = [ gpgme ];
+
+  meta = with lib; {
+    homepage = "https://launchpad.net/pygpgme";
+    description = "A Python wrapper for the GPGME library";
+    license = licenses.lgpl21;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygraphviz/default.nix b/nixpkgs/pkgs/development/python-modules/pygraphviz/default.nix
new file mode 100644
index 000000000000..12876e2a3e02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygraphviz/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, fetchPypi
+, substituteAll
+, graphviz
+, coreutils
+, pkg-config
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pygraphviz";
+  version = "1.11";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-qX61ztJm9FBT67HyxsbSkJFpBQPjpcFL5/kIs3sG8tQ=";
+    extension = "zip";
+  };
+
+  patches = [
+    # pygraphviz depends on graphviz executables and wc being in PATH
+    (substituteAll {
+      src = ./path.patch;
+      path = lib.makeBinPath [ graphviz coreutils ];
+    })
+  ];
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [ graphviz ];
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    runHook preCheck
+    pytest --pyargs pygraphviz
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "pygraphviz" ];
+
+  meta = with lib; {
+    description = "Python interface to Graphviz graph drawing package";
+    homepage = "https://github.com/pygraphviz/pygraphviz";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ matthiasbeyer dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygraphviz/path.patch b/nixpkgs/pkgs/development/python-modules/pygraphviz/path.patch
new file mode 100644
index 000000000000..a895eae77567
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygraphviz/path.patch
@@ -0,0 +1,13 @@
+diff --git a/pygraphviz/agraph.py b/pygraphviz/agraph.py
+index d539ba0..f5bac3f 100644
+--- a/pygraphviz/agraph.py
++++ b/pygraphviz/agraph.py
+@@ -1792,7 +1792,7 @@ class AGraph:
+         if platform.system() == "Windows":
+             name += ".exe"
+ 
+-        paths = os.environ["PATH"]
++        paths = '@path@'
+         for path in paths.split(os.pathsep):
+             match = glob.glob(os.path.join(path, name))
+             if match:
diff --git a/nixpkgs/pkgs/development/python-modules/pygreat/default.nix b/nixpkgs/pkgs/development/python-modules/pygreat/default.nix
new file mode 100644
index 000000000000..92526b465b17
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygreat/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, isPy3k, fetchFromGitHub, future, pyusb }:
+
+buildPythonPackage {
+  pname = "pygreat";
+  version = "2019.5.1.dev0";
+
+  src = fetchFromGitHub {
+    owner = "greatscottgadgets";
+    repo = "libgreat";
+    rev = "14c00b7c8f036f4d467e4b1a324ffa3566b126fa";
+    sha256 = "1h0z83k1k4z8j36z936h61l8j3cjr3wsxr86k91v5c5h93g9dkqh";
+  };
+
+  propagatedBuildInputs = [ future pyusb ];
+
+  disabled = !isPy3k;
+
+  preBuild = ''
+    cd host
+    substituteInPlace setup.py --replace "'backports.functools_lru_cache'" ""
+    substituteInPlace pygreat/comms.py --replace "from backports.functools_lru_cache import lru_cache as memoize_with_lru_cache" "from functools import lru_cache as memoize_with_lru_cache"
+    echo "$version" > ../VERSION
+  '';
+
+  meta = with lib; {
+    description = "Python library for talking with libGreat devices";
+    homepage = "https://greatscottgadgets.com/greatfet/";
+    license = with licenses; [ bsd3 ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygrok/default.nix b/nixpkgs/pkgs/development/python-modules/pygrok/default.nix
new file mode 100644
index 000000000000..7414b0df0df2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygrok/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchFromGitHub, regex, pytest }:
+
+buildPythonPackage rec {
+  pname = "pygrok";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "garyelephant";
+    repo = "pygrok";
+    rev = "v${version}";
+    sha256 = "07487rcmv74srnchh60jp0vg46g086qmpkaj8gxqhp9rj47r1s4m";
+  };
+
+  propagatedBuildInputs = [ regex ];
+
+  nativeCheckInputs =  [ pytest ];
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    maintainers = with maintainers; [ winpat ];
+    description = "A python implementation of jordansissel's grok regular expression library";
+    homepage = "https://github.com/garyelephant/pygrok";
+    license = licenses.mit;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygsl/default.nix b/nixpkgs/pkgs/development/python-modules/pygsl/default.nix
new file mode 100644
index 000000000000..d55ac1d56be7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygsl/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, gsl
+, swig
+, numpy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pygsl";
+  version = "2.3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-F3m85Bs8sONw0Rv0EAOFK6R1DFHfW4dxuzQmXo4PHfM=";
+  };
+
+  nativeBuildInputs = [
+    gsl.dev
+    swig
+  ];
+  buildInputs = [
+    gsl
+  ];
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  preCheck = ''
+    cd tests
+  '';
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = {
+    description = "Python interface for GNU Scientific Library";
+    homepage = "https://github.com/pygsl/pygsl";
+    changelog = "https://github.com/pygsl/pygsl/blob/v${version}/ChangeLog";
+    license = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [ amesgen ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygtail/default.nix b/nixpkgs/pkgs/development/python-modules/pygtail/default.nix
new file mode 100644
index 000000000000..492a36c50a25
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygtail/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchFromGitHub }:
+
+buildPythonPackage rec {
+  pname = "pygtail";
+  version = "0.8.0";
+
+  src = fetchFromGitHub {
+    owner = "bgreenlee";
+    repo = pname;
+    rev = version;
+    sha256 = "1f8qlijiwn10jxg1bsi6q42fznbg8rw039yaxfh6rzbaj2gaxbz1";
+  };
+
+  # remove at next bump, tag is one commit early for 0.8.0
+  postPatch = ''
+    substituteInPlace pygtail/core.py \
+      --replace 0.7.0 0.8.0
+  '';
+
+  meta = with lib; {
+    description = "A library for reading log file lines that have not been read";
+    license = licenses.gpl2Plus;
+    homepage = "https://github.com/bgreenlee/pygtail";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygtfs/default.nix b/nixpkgs/pkgs/development/python-modules/pygtfs/default.nix
new file mode 100644
index 000000000000..aeb65d92556d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygtfs/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, docopt
+, fetchPypi
+, nose
+, pytz
+, pythonOlder
+, setuptools-scm
+, six
+, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "pygtfs";
+  version = "0.1.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-J5vu51OOMabWd8h60PpvvBiCnwQlhEnBywNXxy9hOuA=";
+  };
+
+  postPatch = ''
+    # https://github.com/jarondl/pygtfs/pull/72
+    substituteInPlace setup.py \
+      --replace "pytz>=2012d" "pytz"
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    docopt
+    pytz
+    six
+    sqlalchemy
+  ];
+
+  nativeCheckInputs = [
+    nose
+  ];
+
+  pythonImportsCheck = [
+    "pygtfs"
+  ];
+
+  meta = with lib; {
+    description = "Python module for GTFS";
+    homepage = "https://github.com/jarondl/pygtfs";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygti/default.nix b/nixpkgs/pkgs/development/python-modules/pygti/default.nix
new file mode 100644
index 000000000000..0e0672cb0939
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygti/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools-scm
+, aiohttp
+, pytz
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "pygti";
+  version = "0.9.4";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "vigonotion";
+    repo = "pygti";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-2T4Yw4XEOkv+IWyB4Xa2dPu929VH0tLeUjQ5S8EVXz0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  propagatedBuildInputs = [
+    aiohttp
+    pytz
+    voluptuous
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pygti.auth"
+    "pygti.exceptions"
+    "pygti.gti"
+  ];
+
+  meta = with lib; {
+    description = "Access public transport information in Hamburg, Germany";
+    homepage = "https://github.com/vigonotion/pygti";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygtkspellcheck/default.nix b/nixpkgs/pkgs/development/python-modules/pygtkspellcheck/default.nix
new file mode 100644
index 000000000000..a467ff074643
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygtkspellcheck/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, gobject-introspection
+, gtk3
+, poetry-core
+, pyenchant
+, pygobject3
+}:
+
+buildPythonPackage rec {
+  pname = "pygtkspellcheck";
+  version = "5.0.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rWV/ghoMWHOAmT8ablwOjJSEhtvPqT/UdoZBXL5Nj0s=";
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pyenchant
+    pygobject3
+    gtk3
+  ];
+
+  doCheck = false; # there are no tests
+
+  pythonImportsCheck = [
+    "gtkspellcheck"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/koehlma/pygtkspellcheck";
+    description = "A Python spell-checking library for GtkTextViews based on Enchant";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ xfix ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pygtrie/default.nix b/nixpkgs/pkgs/development/python-modules/pygtrie/default.nix
new file mode 100644
index 000000000000..226112967449
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pygtrie/default.nix
@@ -0,0 +1,15 @@
+{ lib, fetchPypi, buildPythonPackage, ... }:
+buildPythonPackage rec {
+  pname = "pygtrie";
+  version = "2.5.0";
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-IDUUrYJutAPasdLi3dA04NFTS75NvgITuwWT9mvrpOI=";
+  };
+  meta = {
+    homepage = "https://github.com/mina86/pygtrie";
+    description = "Trie data structure implementation";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ kmein ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyhamcrest/default.nix b/nixpkgs/pkgs/development/python-modules/pyhamcrest/default.nix
new file mode 100644
index 000000000000..f9111d7f7408
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhamcrest/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatch-vcs
+, hatchling
+, numpy
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyhamcrest";
+  version = "2.0.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "hamcrest";
+    repo = "PyHamcrest";
+    rev = "refs/tags/V${version}";
+    hash = "sha256-CIkttiijbJCR0zdmwM5JvFogQKYuHUXHJhdyWonHcGk=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'dynamic = ["version"]' 'version = "${version}"'
+  '';
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  nativeCheckInputs = [
+    numpy
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests started failing with numpy 1.24
+    "test_numpy_numeric_type_complex"
+    "test_numpy_numeric_type_float"
+    "test_numpy_numeric_type_int"
+  ];
+
+  pythonImportsCheck = [
+    "hamcrest"
+  ];
+
+  meta = with lib; {
+    description = "Hamcrest framework for matcher objects";
+    homepage = "https://github.com/hamcrest/PyHamcrest";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ alunduil ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyhanko-certvalidator/default.nix b/nixpkgs/pkgs/development/python-modules/pyhanko-certvalidator/default.nix
new file mode 100644
index 000000000000..5e83dc793ca5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhanko-certvalidator/default.nix
@@ -0,0 +1,86 @@
+{ lib
+, aiohttp
+, asn1crypto
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, freezegun
+, oscrypto
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, requests
+, setuptools
+, uritools
+}:
+
+buildPythonPackage rec {
+  pname = "pyhanko-certvalidator";
+  version = "0.23.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "MatthiasValvekens";
+    repo = "certvalidator";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-q2YxncyMHmbRmcoLb68huK02CYiKqF2CFRl8vkUfxg4=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace ', "pytest-runner",' ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    asn1crypto
+    cryptography
+    oscrypto
+    requests
+    uritools
+  ];
+
+  nativeCheckInputs = [
+    aiohttp
+    freezegun
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Requests
+    "tests/test_crl_client.py"
+  ];
+
+  disabledTests = [
+    # Look for nonexisting certificates
+    "test_basic_certificate_validator_tls"
+    # Failed to fetch OCSP response from http://ocsp.digicert.com
+    "test_fetch_ocsp_aiohttp"
+    "test_fetch_ocsp_requests"
+    "test_fetch_ocsp_err_requests"
+    # Unable to build a validation path for the certificate "%s" - no issuer matching "%s" was found
+    "test_revocation_mode_hard_aiohttp_autofetch"
+    # The path could not be validated because no revocation information could be found for intermediate certificate 1
+    "test_revocation_mode_hard"
+    # certificate expired 2022-09-17
+    "test_revocation_mode_soft"
+  ];
+
+  pythonImportsCheck = [
+    "pyhanko_certvalidator"
+  ];
+
+  meta = with lib; {
+    description = "Python library for validating X.509 certificates and paths";
+    homepage = "https://github.com/MatthiasValvekens/certvalidator";
+    changelog = "https://github.com/MatthiasValvekens/certvalidator/blob/v${version}/changelog.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyhanko/0001-Updating-pytest-aiohttp-version.patch b/nixpkgs/pkgs/development/python-modules/pyhanko/0001-Updating-pytest-aiohttp-version.patch
new file mode 100644
index 000000000000..562dc6461ef9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhanko/0001-Updating-pytest-aiohttp-version.patch
@@ -0,0 +1,25 @@
+From 942d4fd37786941bae91b769ef6499a4b4da6843 Mon Sep 17 00:00:00 2001
+From: "P. R. d. O" <d.ol.rod@tutanota.com>
+Date: Sat, 9 Apr 2022 12:40:59 -0600
+Subject: [PATCH] Updating pytest-aiohttp version
+
+---
+ setup.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/setup.py b/setup.py
+index fe33d9a..694fab4 100644
+--- a/setup.py
++++ b/setup.py
+@@ -85,7 +85,7 @@ setup(
+     tests_require=[
+         'pytest>=6.1.1', 'requests-mock>=1.8.0',
+         'freezegun>=1.1.0', 'certomancer~=0.8.1',
+-        'aiohttp~=3.8.0', 'pytest-aiohttp~=0.3.0',
++        'aiohttp~=3.8.0', 'pytest-aiohttp~=1.0.3',
+         'python-pae==0.1.0'
+     ],
+     keywords="signature pdf pades digital-signature pkcs11"
+-- 
+2.35.1
+
diff --git a/nixpkgs/pkgs/development/python-modules/pyhanko/default.nix b/nixpkgs/pkgs/development/python-modules/pyhanko/default.nix
new file mode 100644
index 000000000000..8db7aef6d192
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhanko/default.nix
@@ -0,0 +1,143 @@
+{ lib
+, aiohttp
+, asn1crypto
+, buildPythonPackage
+, certomancer
+, click
+, cryptography
+, defusedxml
+, fetchFromGitHub
+, fonttools
+, freezegun
+, oscrypto
+, pillow
+, pyhanko-certvalidator
+, pytest-aiohttp
+, pytestCheckHook
+, python-barcode
+, python-pae
+, python-pkcs11
+, pythonOlder
+, pytz
+, pyyaml
+, qrcode
+, requests
+, requests-mock
+, setuptools
+, tzlocal
+, uharfbuzz
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pyhanko";
+  version = "0.20.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "MatthiasValvekens";
+    repo = "pyHanko";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-mWhkTVhq3bDkOlhUZIBBqwXUuQCXcFHW1haGOGMywzg=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace ' "pytest-runner",' ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    asn1crypto
+    click
+    cryptography
+    pyhanko-certvalidator
+    pytz
+    pyyaml
+    qrcode
+    requests
+    tzlocal
+  ];
+
+  passthru.optional-dependencies = {
+    extra-pubkey-algs = [
+      oscrypto
+    ];
+    xmp = [
+      defusedxml
+    ];
+    opentype = [
+      fonttools
+      uharfbuzz
+    ];
+    image-support = [
+      pillow
+      python-barcode
+    ];
+    pkcs11 = [
+      python-pkcs11
+    ];
+    async-http = [
+      aiohttp
+    ];
+  };
+
+  nativeCheckInputs = [
+    aiohttp
+    certomancer
+    freezegun
+    python-pae
+    pytest-aiohttp
+    requests-mock
+    pytestCheckHook
+  ] ++ lib.flatten (lib.attrValues passthru.optional-dependencies);
+
+  disabledTestPaths = [
+    # ModuleNotFoundError: No module named 'csc_dummy'
+    "pyhanko_tests/test_csc.py"
+  ];
+
+  disabledTests = [
+    # Most of the test require working with local certificates,
+    # contacting OSCP or performing requests
+    "test_generic_data_sign_legacy"
+    "test_generic_data_sign"
+    "test_cms_v3_sign"
+    "test_detached_cms_with_self_reported_timestamp"
+    "test_detached_cms_with_tst"
+    "test_detached_cms_with_content_tst"
+    "test_detached_cms_with_wrong_content_tst"
+    "test_detached_with_malformed_content_tst"
+    "test_noop_attribute_prov"
+    "test_detached_cades_cms_with_tst"
+    "test_read_qr_config"
+    "test_no_changes_policy"
+    "test_bogus_metadata_manipulation"
+    "test_tamper_sig_obj"
+    "test_signed_file_diff_proxied_objs"
+    "test_pades_revinfo_live"
+    "test_diff_fallback_ok"
+    "test_no_diff_summary"
+    "test_ocsp_embed"
+    "test_ts_fetch_aiohttp"
+    "test_ts_fetch_requests"
+  ];
+
+  pythonImportsCheck = [
+    "pyhanko"
+  ];
+
+  meta = with lib; {
+    description = "Sign and stamp PDF files";
+    homepage = "https://github.com/MatthiasValvekens/pyHanko";
+    changelog = "https://github.com/MatthiasValvekens/pyHanko/blob/v${version}/docs/changelog.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyhaversion/default.nix b/nixpkgs/pkgs/development/python-modules/pyhaversion/default.nix
new file mode 100644
index 000000000000..204b8526d879
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhaversion/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, aiohttp
+, aresponses
+, awesomeversion
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyhaversion";
+  version = "23.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ludeeus";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-HMJqZn0yzN2dP5WTRCbem1Xw8nyH2Hy7oVP4kEKHHAo=";
+  };
+
+  postPatch = ''
+    # Upstream doesn't set a version for the tagged releases
+    substituteInPlace setup.py \
+      --replace "main" ${version}
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+    awesomeversion
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyhaversion"
+  ];
+
+  disabledTests = [
+    # Error fetching version information from HaVersionSource.SUPERVISOR Server disconnected
+    "test_stable_version"
+    "test_etag"
+  ];
+
+  meta = with lib; {
+    description = "Python module to the newest version number of Home Assistant";
+    homepage = "https://github.com/ludeeus/pyhaversion";
+    changelog = "https://github.com/ludeeus/pyhaversion/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ makefu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyhcl/default.nix b/nixpkgs/pkgs/development/python-modules/pyhcl/default.nix
new file mode 100644
index 000000000000..eac566b9037e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhcl/default.nix
@@ -0,0 +1,46 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, lib
+
+# pythonPackages
+, coverage
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pyhcl";
+  version = "0.4.4";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "virtuald";
+    repo = pname;
+    rev = version;
+    sha256 = "0rcpx4vvj2c6wxp31vay7a2xa5p62kabi91vps9plj6710yz29nc";
+  };
+
+  # https://github.com/virtuald/pyhcl/blob/51a7524b68fe21e175e157b8af931016d7a357ad/setup.py#L64
+  configurePhase = ''
+    echo '__version__ = "${version}"' > ./src/hcl/version.py
+  '';
+
+  nativeCheckInputs = [
+    coverage
+    pytest
+  ];
+
+  # https://github.com/virtuald/pyhcl/blob/51a7524b68fe21e175e157b8af931016d7a357ad/tests/run_tests.sh#L4
+  checkPhase = ''
+    coverage run --source hcl -m pytest tests
+  '';
+
+  meta = with lib; {
+    description = "HCL is a configuration language. pyhcl is a python parser for it";
+    homepage = "https://github.com/virtuald/pyhcl";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [
+      kamadorueda
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyheck/Cargo.lock b/nixpkgs/pkgs/development/python-modules/pyheck/Cargo.lock
new file mode 100644
index 000000000000..c98ef0169802
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyheck/Cargo.lock
@@ -0,0 +1,377 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
+dependencies = [
+ "cfg-if",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7"
+dependencies = [
+ "autocfg",
+ "cfg-if",
+ "crossbeam-utils",
+ "memoffset",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "either"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
+
+[[package]]
+name = "heck"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+dependencies = [
+ "unicode-segmentation",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
+
+[[package]]
+name = "indoc"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "47741a8bc60fb26eb8d6e0238bbb26d8575ff623fdc97b1a2c00c050b9684ed8"
+dependencies = [
+ "indoc-impl",
+ "proc-macro-hack",
+]
+
+[[package]]
+name = "indoc-impl"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce046d161f000fffde5f432a0d034d0341dc152643b2598ed5bfce44c4f3a8f0"
+dependencies = [
+ "proc-macro-hack",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "unindent",
+]
+
+[[package]]
+name = "instant"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.147"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
+
+[[package]]
+name = "lock_api"
+version = "0.4.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "memoffset"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+
+[[package]]
+name = "parking_lot"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
+dependencies = [
+ "instant",
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc"
+dependencies = [
+ "cfg-if",
+ "instant",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "winapi",
+]
+
+[[package]]
+name = "paste"
+version = "0.1.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "45ca20c77d80be666aef2b45486da86238fabe33e38306bd3118fe4af33fa880"
+dependencies = [
+ "paste-impl",
+ "proc-macro-hack",
+]
+
+[[package]]
+name = "paste-impl"
+version = "0.1.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d95a7db200b97ef370c8e6de0088252f7e0dfff7d047a28528e47456c0fc98b6"
+dependencies = [
+ "proc-macro-hack",
+]
+
+[[package]]
+name = "proc-macro-hack"
+version = "0.5.20+deprecated"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.63"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "pyheck"
+version = "0.1.5"
+dependencies = [
+ "heck",
+ "pyo3",
+ "rayon",
+]
+
+[[package]]
+name = "pyo3"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d41d50a7271e08c7c8a54cd24af5d62f73ee3a6f6a314215281ebdec421d5752"
+dependencies = [
+ "cfg-if",
+ "indoc",
+ "libc",
+ "parking_lot",
+ "paste",
+ "pyo3-build-config",
+ "pyo3-macros",
+ "unindent",
+]
+
+[[package]]
+name = "pyo3-build-config"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "779239fc40b8e18bc8416d3a37d280ca9b9fb04bda54b98037bb6748595c2410"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "pyo3-macros"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00b247e8c664be87998d8628e86f282c25066165f1f8dda66100c48202fdb93a"
+dependencies = [
+ "pyo3-macros-backend",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "pyo3-macros-backend"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a8c2812c412e00e641d99eeb79dd478317d981d938aa60325dfa7157b607095"
+dependencies = [
+ "proc-macro2",
+ "pyo3-build-config",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rayon"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b"
+dependencies = [
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d"
+dependencies = [
+ "crossbeam-channel",
+ "crossbeam-deque",
+ "crossbeam-utils",
+ "num_cpus",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "smallvec"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0"
+
+[[package]]
+name = "unicode-segmentation"
+version = "1.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
+
+[[package]]
+name = "unindent"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1766d682d402817b5ac4490b3c3002d91dfa0d22812f341609f97b08757359c"
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
diff --git a/nixpkgs/pkgs/development/python-modules/pyheck/default.nix b/nixpkgs/pkgs/development/python-modules/pyheck/default.nix
new file mode 100644
index 000000000000..123ebe3db978
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyheck/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, cargo
+, fetchFromGitHub
+, libiconv
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, rustc
+, rustPlatform
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "pyheck";
+  version = "0.1.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "kevinheavey";
+    repo = "pyheck";
+    rev = "refs/tags/${version}";
+    hash = "sha256-mfXkrCbBaJ0da+taKJvfyU5NS43tYJWqtTUXiCLVoGQ=";
+  };
+
+  cargoDeps = rustPlatform.importCargoLock {
+    lockFile = ./Cargo.lock;
+  };
+
+  postPatch = ''
+    ln -s ${./Cargo.lock} Cargo.lock
+  '';
+
+  nativeBuildInputs = [
+    cargo
+    poetry-core
+    rustc
+    rustPlatform.cargoSetupHook
+    rustPlatform.maturinBuildHook
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyheck"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for heck, the Rust case conversion library";
+    homepage = "https://github.com/kevinheavey/pyheck";
+    changelog = "https://github.com/kevinheavey/pyheck/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyheif/default.nix b/nixpkgs/pkgs/development/python-modules/pyheif/default.nix
new file mode 100644
index 000000000000..828847cf82fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyheif/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cffi
+, libheif
+}:
+
+buildPythonPackage rec {
+  pname = "pyheif";
+  version = "0.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-hqXFF0N51xRrXtGmiJL69yaKE1+39QOaARv7em6QMgA=";
+  };
+
+  propagatedBuildInputs = [ cffi libheif ];
+
+  meta = with lib; {
+    homepage = "https://github.com/carsales/pyheif";
+    description = "Python interface to libheif library";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyheos/default.nix b/nixpkgs/pkgs/development/python-modules/pyheos/default.nix
new file mode 100644
index 000000000000..7a05306fa839
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyheos/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyheos";
+  version = "0.7.2";
+
+  src = fetchFromGitHub {
+    owner = "andrewsayre";
+    repo = "pyheos";
+    rev = version;
+    sha256 = "0rgzg7lnqzzqrjp73c1hj1hq8p0j0msyih3yr4wa2rj81s8ihmby";
+  };
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # accesses network
+    "test_connect_timeout"
+  ];
+
+  pythonImportsCheck = [ "pyheos" ];
+
+  meta = with lib; {
+    description = "Async python library for controlling HEOS devices through the HEOS CLI Protocol";
+    homepage = "https://github.com/andrewsayre/pyheos";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyhepmc/default.nix b/nixpkgs/pkgs/development/python-modules/pyhepmc/default.nix
new file mode 100644
index 000000000000..76197c47c2fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhepmc/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cmake
+, setuptools
+, setuptools-scm
+, numpy
+, pybind11
+, wheel
+, pytestCheckHook
+, pythonOlder
+, graphviz
+}:
+
+buildPythonPackage rec {
+  pname = "pyhepmc";
+  version = "2.13.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "scikit-hep";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-M18Bq6WrAINpgPx5+uh8dufPBxIklRHpbBWUYMC8v10=";
+    fetchSubmodules = true;
+  };
+
+  nativeBuildInputs = [
+    cmake
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  buildInputs = [
+    pybind11
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+  CMAKE_ARGS = [ "-DEXTERNAL_PYBIND11=ON" ];
+
+  preBuild = ''
+    export CMAKE_BUILD_PARALLEL_LEVEL="$NIX_BUILD_CORES"
+  '';
+
+  nativeCheckInputs = [
+    graphviz
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pyhepmc" ];
+
+  meta = with lib; {
+    description = "Easy-to-use Python bindings for HepMC3";
+    homepage = "https://github.com/scikit-hep/pyhepmc";
+    changelog = "https://github.com/scikit-hep/pyhepmc/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/pyhiveapi/default.nix b/nixpkgs/pkgs/development/python-modules/pyhiveapi/default.nix
new file mode 100644
index 000000000000..ec6d51191966
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhiveapi/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, unasync
+, boto3
+, botocore
+, requests
+, aiohttp
+, pyquery
+, loguru
+}:
+
+buildPythonPackage rec {
+  pname = "pyhiveapi";
+  version = "0.5.15";
+
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Pyhass";
+    repo = "Pyhiveapi";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-tR2PCR1qGn4KnqAjEpcRTcVlMEpKCwn5RAm99AXBSnk=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "pre-commit" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    unasync
+  ];
+
+  propagatedBuildInputs = [
+    boto3
+    botocore
+    requests
+    aiohttp
+    pyquery
+    loguru
+  ];
+
+  # tests are not functional yet
+  doCheck = false;
+
+  postBuild = ''
+    # pyhiveapi accesses $HOME upon importing
+    export HOME=$TMPDIR
+  '';
+
+  pythonImportsCheck = [ "pyhiveapi" ];
+
+  meta = with lib; {
+    description = "Python library to interface with the Hive API";
+    homepage = "https://github.com/Pyhass/Pyhiveapi";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyhocon/default.nix b/nixpkgs/pkgs/development/python-modules/pyhocon/default.nix
new file mode 100644
index 000000000000..3d560076865e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhocon/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pyparsing
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyhocon";
+  version = "0.3.60";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "chimpler";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-H460j/DjY1lltapva3l87oyOJVjzUE9Q/oKti3SsUyU=";
+  };
+
+  propagatedBuildInputs = [
+    pyparsing
+    python-dateutil
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pyparsing~=2.0" "pyparsing>=2.0"
+  '';
+
+  pythonImportsCheck = [
+    "pyhocon"
+  ];
+
+  disabledTestPaths = [
+    # pyparsing.exceptions.ParseException: Expected end of text, found '='
+    # https://github.com/chimpler/pyhocon/issues/273
+    "tests/test_tool.py"
+  ];
+
+  disabledTests = [
+    # AssertionError: assert ConfigTree([(...
+    "test_dict_merge"
+    "test_parse_override"
+    "test_include_dict"
+  ];
+
+  meta = with lib; {
+    description = "HOCON parser for Python";
+    homepage = "https://github.com/chimpler/pyhocon/";
+    longDescription = ''
+      A HOCON parser for Python. It additionally provides a tool (pyhocon) to convert
+      any HOCON content into JSON, YAML and properties format.
+    '';
+    license = licenses.asl20;
+    maintainers = with maintainers; [ chreekat ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyhomematic/default.nix b/nixpkgs/pkgs/development/python-modules/pyhomematic/default.nix
new file mode 100644
index 000000000000..e30063e826d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhomematic/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, fetchPypi
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "pyhomematic";
+  version = "0.1.77";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "00d95c21b95a17bc07586f69c976fb343a103adc0954d7b2d56c7160665625cb";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest
+  '';
+
+  pythonImportsCheck = [ "pyhomematic" ];
+
+  meta = with lib; {
+    description = "Python 3 Interface to interact with Homematic devices";
+    homepage = "https://github.com/danielperna84/pyhomematic";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyhomepilot/default.nix b/nixpkgs/pkgs/development/python-modules/pyhomepilot/default.nix
new file mode 100644
index 000000000000..12c395ff954b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhomepilot/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyhomepilot";
+  version = "0.0.3";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "nico0302";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "00gmqx8cwsd15iccnlr8ypgqrdg6nw9ha518cfk7pyp8vhw1ziwy";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "pyhomepilot" ];
+
+  meta = with lib; {
+    description = "Python module to communicate with the Rademacher HomePilot API";
+    homepage = "https://github.com/nico0302/pyhomepilot";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyhomeworks/default.nix b/nixpkgs/pkgs/development/python-modules/pyhomeworks/default.nix
new file mode 100644
index 000000000000..085107c4ad26
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhomeworks/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyhomeworks";
+  version = "0.0.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "Eqbm8274B2hBuF+mREe8lqGhpzZExPJ29jzvwB5RNR8=";
+  };
+
+  # Project has no real tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyhomeworks"
+  ];
+
+  meta = with lib; {
+    description = "Python interface to Lutron Homeworks Series 4/8";
+    homepage = "https://github.com/dubnom/pyhomeworks";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyhs100/default.nix b/nixpkgs/pkgs/development/python-modules/pyhs100/default.nix
new file mode 100644
index 000000000000..fa5f73787af2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhs100/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder
+, click, click-datetime, deprecation
+, pytest, voluptuous }:
+
+buildPythonPackage rec {
+  pname = "pyHS100";
+  version = "0.3.5.2";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "GadgetReactor";
+    repo = pname;
+    rev = version;
+    sha256 = "0z98hzvkp6jmllyd4x4y0f5n6nnxrizw6g5l2clxdn93mifjavp0";
+  };
+
+  propagatedBuildInputs = [
+    click
+    click-datetime
+    deprecation
+  ];
+
+  nativeCheckInputs = [
+    pytest
+    voluptuous
+  ];
+
+  checkPhase = ''
+    py.test pyHS100
+  '';
+
+  meta = with lib; {
+    description = "Python Library to control TPLink Switch (HS100 / HS110)";
+    homepage = "https://github.com/GadgetReactor/pyHS100";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyhumps/default.nix b/nixpkgs/pkgs/development/python-modules/pyhumps/default.nix
new file mode 100644
index 000000000000..b7ed9548e3a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyhumps/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyhumps";
+  version = "3.8.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nficano";
+    repo = "humps";
+    rev = "v${version}";
+    hash = "sha256-ElL/LY2V2Z3efdV5FnDy9dSoBltULrzxsjaOx+7W9Oo=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "humps"
+  ];
+
+  meta = with lib; {
+    description = "Module to convert strings (and dictionary keys) between snake case, camel case and pascal case";
+    homepage = "https://github.com/nficano/humps";
+    license = with licenses; [ unlicense ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyi2cflash/default.nix b/nixpkgs/pkgs/development/python-modules/pyi2cflash/default.nix
new file mode 100644
index 000000000000..7ac3aa5af08e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyi2cflash/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyftdi
+}:
+
+buildPythonPackage rec {
+  pname = "pyi2cflash";
+  version = "0.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1nkazgf7pajz7jym5rfy2df71lyfp4skxqbrg5ch0h4dwjdwllx1";
+  };
+
+  propagatedBuildInputs = [
+    pyftdi
+  ];
+
+  # tests are not shipped with the PyPI source
+  doCheck = false;
+
+  pythonImportsCheck = [ "i2cflash" ];
+
+  meta = with lib; {
+    description = "I2C eeprom device drivers in Python";
+    homepage = "https://github.com/eblot/pyi2cflash";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyialarm/default.nix b/nixpkgs/pkgs/development/python-modules/pyialarm/default.nix
new file mode 100644
index 000000000000..db4bf7eb3c5e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyialarm/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, dicttoxml2
+, fetchFromGitHub
+, pythonOlder
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "pyialarm";
+  version = "2.2.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "RyuzakiKK";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-rOdeYewjoFVbHdNPHN6ZC2g6X5yr84/JFE6tGSDIoRU=";
+  };
+
+  propagatedBuildInputs = [
+    dicttoxml2
+    xmltodict
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyialarm"
+  ];
+
+  meta = with lib; {
+    description = "Python library to interface with Antifurto365 iAlarm systems";
+    homepage = "https://github.com/RyuzakiKK/pyialarm";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyicloud/default.nix b/nixpkgs/pkgs/development/python-modules/pyicloud/default.nix
new file mode 100644
index 000000000000..299918b5a4ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyicloud/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, certifi
+, click
+, keyring
+, keyrings-alt
+, pytz
+, requests
+, six
+, tzlocal
+, pytest-mock
+, pytestCheckHook
+, future
+}:
+
+buildPythonPackage rec {
+  pname = "pyicloud";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "picklepete";
+    repo = pname;
+    rev = version;
+    hash = "sha256-2E1pdHHt8o7CGpdG+u4xy5OyNCueUGVw5CY8oicYd5w=";
+  };
+
+  propagatedBuildInputs = [
+    certifi
+    click
+    future
+    keyring
+    keyrings-alt
+    pytz
+    requests
+    six
+    tzlocal
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    sed -i \
+      -e 's!click>=.*!click!' \
+      -e 's!keyring>=.*!keyring!' \
+      -e 's!keyrings.alt>=.*!keyrings.alt!' \
+      -e 's!tzlocal==.*!tzlocal!' \
+      requirements.txt
+  '';
+
+  meta = with lib; {
+    description = "PyiCloud is a module which allows pythonistas to interact with iCloud webservices";
+    homepage = "https://github.com/picklepete/pyicloud";
+    license = licenses.mit;
+    maintainers = [ maintainers.mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyicu/default.nix b/nixpkgs/pkgs/development/python-modules/pyicu/default.nix
new file mode 100644
index 000000000000..901bec161445
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyicu/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, six
+, icu
+}:
+
+buildPythonPackage rec {
+  pname = "pyicu";
+  version = "2.11";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "PyICU";
+    inherit version;
+    hash = "sha256-OrUxJkz+kTKz0qxdcI2ppGSdJfbmgTcwrIjPBAoIqEQ=";
+  };
+
+  nativeBuildInputs = [ icu ]; # for icu-config, but should be replaced with pkg-config
+  buildInputs = [ icu ];
+  nativeCheckInputs = [ pytestCheckHook six ];
+
+  pythonImportsCheck = [ "icu" ];
+
+  meta = with lib; {
+    homepage = "https://gitlab.pyicu.org/main/pyicu";
+    description = "Python extension wrapping the ICU C++ API";
+    changelog = "https://gitlab.pyicu.org/main/pyicu/-/raw/v${version}/CHANGES";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyimpfuzzy/default.nix b/nixpkgs/pkgs/development/python-modules/pyimpfuzzy/default.nix
new file mode 100644
index 000000000000..18ebf3231e37
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyimpfuzzy/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ssdeep
+, pefile
+}:
+buildPythonPackage rec {
+  pname = "pyimpfuzzy";
+  version = "0.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "da9796df302db4b04a197128637f84988f1882f1e08fdd69bbf9fdc6cfbaf349";
+  };
+
+  buildInputs = [
+    ssdeep
+  ];
+
+  propagatedBuildInputs = [
+    pefile
+  ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyimpfuzzy"
+  ];
+
+  meta = with lib; {
+    description = "A Python module which calculates and compares the impfuzzy (import fuzzy hashing)";
+    homepage = "https://github.com/JPCERTCC/impfuzzy";
+    license = licenses.gpl2Only;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyinfra/default.nix b/nixpkgs/pkgs/development/python-modules/pyinfra/default.nix
new file mode 100644
index 000000000000..d21fcddc42ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyinfra/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, buildPythonPackage
+, click
+, colorama
+, configparser
+, distro
+, fetchFromGitHub
+, fetchpatch
+, gevent
+, jinja2
+, paramiko
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pywinrm
+, pyyaml
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pyinfra";
+  version = "2.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Fizzadar";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-BYd2UYQJD/HsmpnlQjZvjfg17ShPuA3j4rtv6fTQK/A=";
+  };
+
+  patches = [
+    # https://github.com/Fizzadar/pyinfra/pull/1018
+    (fetchpatch {
+      name = "bump-paramiko-major-version.patch";
+      url = "https://github.com/Fizzadar/pyinfra/commit/62a8f081279779c4f1eed246139f615cf5fed642.patch";
+      hash = "sha256-aT9SeSqXOD76LFzf6R/MWTtavcW6fZT7chkVg9aXiBg=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    click
+    colorama
+    configparser
+    distro
+    gevent
+    jinja2
+    paramiko
+    python-dateutil
+    pywinrm
+    pyyaml
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyinfra"
+  ];
+
+  disabledTests = [
+    # Test requires SSH binary
+    "test_load_ssh_config"
+  ];
+
+  meta = with lib; {
+    description = "Python-based infrastructure automation";
+    longDescription = ''
+      pyinfra automates/provisions/manages/deploys infrastructure. It can be used for
+      ad-hoc command execution, service deployment, configuration management and more.
+    '';
+    homepage = "https://pyinfra.com";
+    downloadPage = "https://pyinfra.com/Fizzadar/pyinfra/releases";
+    changelog = "https://github.com/Fizzadar/pyinfra/blob/v${version}/CHANGELOG.md";
+    maintainers = with maintainers; [ totoroot ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyinotify/default.nix b/nixpkgs/pkgs/development/python-modules/pyinotify/default.nix
new file mode 100644
index 000000000000..e5714ec18001
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyinotify/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pyinotify";
+  version = "0.9.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1x3i9wmzw33fpkis203alygfnrkcmq9w1aydcm887jh6frfqm6cw";
+  };
+
+  # No tests distributed
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/seb-m/pyinotify/wiki";
+    description = "Monitor filesystems events on Linux platforms with inotify";
+    license = licenses.mit;
+    platforms = platforms.linux;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyinputevent/default.nix b/nixpkgs/pkgs/development/python-modules/pyinputevent/default.nix
new file mode 100644
index 000000000000..1d4f4cfa7847
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyinputevent/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage {
+  pname = "pyinputevent";
+  version = "2016-10-18";
+
+  src = fetchFromGitHub {
+    owner = "ntzrmtthihu777";
+    repo = "pyinputevent";
+    rev = "d2075fa5db5d8a402735fe788bb33cf9fe272a5b";
+    sha256 = "0rkis0xp8f9jc00x7jb9kbvhdla24z1vl30djqa6wy6fx0cr6sib";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/ntzrmtthihu777/pyinputevent";
+    description = "Python interface to the Input Subsystem's input_event and uinput";
+    license = licenses.bsd3;
+    platforms = platforms.unix;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyinstaller-versionfile/default.nix b/nixpkgs/pkgs/development/python-modules/pyinstaller-versionfile/default.nix
new file mode 100644
index 000000000000..85ab4112e5ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyinstaller-versionfile/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, packaging
+, jinja2
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "pyinstaller-versionfile";
+  version = "2.1.1";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "DudeNr33";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-lz1GuiXU+r8sMld5SsG3qS+FOsWfbvkQmO2bxAR3XcY=";
+  };
+
+  propagatedBuildInputs = [ packaging jinja2 pyyaml ];
+
+  meta = {
+    description = "Create a windows version-file from a simple YAML file that can be used by PyInstaller.";
+    homepage = "https://pypi.org/project/pyinstaller-versionfile/";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyinsteon/default.nix b/nixpkgs/pkgs/development/python-modules/pyinsteon/default.nix
new file mode 100644
index 000000000000..176e9fcd1545
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyinsteon/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, aiofiles
+, aiohttp
+, async-generator
+, buildPythonPackage
+, fetchFromGitHub
+, pypubsub
+, pyserial
+, pyserial-asyncio
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, voluptuous
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pyinsteon";
+  version = "1.5.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-7iiB/a8E8E2TSkGuAWR08ESExDz8DKTMjqp4Xnp3wHU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    aiofiles
+    aiohttp
+    pypubsub
+    pyserial
+    pyserial-asyncio
+    voluptuous
+  ];
+
+  nativeCheckInputs = [
+    async-generator
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyinsteon"
+  ];
+
+  meta = with lib; {
+    description = "Python library to support Insteon home automation projects";
+    longDescription = ''
+      This is a Python package to interface with an Insteon Modem. It has been
+      tested to work with most USB or RS-232 serial based devices such as the
+      2413U, 2412S, 2448A7 and Hub models 2242 and 2245.
+    '';
+    homepage = "https://github.com/pyinsteon/pyinsteon";
+    changelog = "https://github.com/pyinsteon/pyinsteon/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyinstrument/default.nix b/nixpkgs/pkgs/development/python-modules/pyinstrument/default.nix
new file mode 100644
index 000000000000..58fcc8c515ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyinstrument/default.nix
@@ -0,0 +1,43 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pyinstrument";
+  version = "4.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "joerick";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-NSE2mZPbKmvlQbBPx0MoqYfAOjmsf9CllX7dxygZfc4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  # Module import recursion
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyinstrument"
+  ];
+
+  meta = with lib; {
+    description = "Call stack profiler for Python";
+    homepage = "https://github.com/joerick/pyinstrument";
+    changelog = "https://github.com/joerick/pyinstrument/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyintesishome/default.nix b/nixpkgs/pkgs/development/python-modules/pyintesishome/default.nix
new file mode 100644
index 000000000000..6d53d7bc2eb5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyintesishome/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyintesishome";
+  version = "1.8.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jnimmo";
+    repo = "pyIntesisHome";
+    rev = "refs/tags/${version}";
+    hash = "sha256-QgIvIn8I5EtJSNj1FdOI+DPgG7/y2ToQ62dhk7flieo=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyintesishome"
+  ];
+
+  meta = with lib; {
+    description = "Python interface for IntesisHome devices";
+    homepage = "https://github.com/jnimmo/pyIntesisHome";
+    changelog = "https://github.com/jnimmo/pyIntesisHome/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyipma/default.nix b/nixpkgs/pkgs/development/python-modules/pyipma/default.nix
new file mode 100644
index 000000000000..9f74c16a0c06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyipma/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, freezegun
+, mock
+, geopy
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyipma";
+  version = "3.0.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dgomes";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-a6UXc8XLZhSyUb8AxnXoPgiyP004GQfuapRmVeOaFQU=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    geopy
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    freezegun
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyipma"
+  ];
+
+  disabledTestPaths = [
+    # Tests require network access
+    "tests/test_auxiliar.py"
+    "tests/test_location.py"
+    "tests/test_sea_forecast.py"
+  ];
+
+  meta = with lib; {
+    description = "Library to retrieve information from Instituto Português do Mar e Atmosfera";
+    homepage = "https://github.com/dgomes/pyipma";
+    changelog = "https://github.com/dgomes/pyipma/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyipp/default.nix b/nixpkgs/pkgs/development/python-modules/pyipp/default.nix
new file mode 100644
index 000000000000..609e75806678
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyipp/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, aiohttp
+, aresponses
+, awesomeversion
+, backoff
+, buildPythonPackage
+, deepmerge
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "pyipp";
+  version = "0.14.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+   owner = "ctalkington";
+   repo = "python-ipp";
+   rev = version;
+   hash = "sha256-xE0fdT+Ffdf4iOHWZzRa7YWtHt92lFdA/sbwjblMR40=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'version = "0.0.0"' 'version = "${version}"' \
+      --replace "--cov" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    awesomeversion
+    backoff
+    deepmerge
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [
+    "pyipp"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/ctalkington/python-ipp/releases/tag/${version}";
+    description = "Asynchronous Python client for Internet Printing Protocol (IPP)";
+    homepage = "https://github.com/ctalkington/python-ipp";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyiqvia/default.nix b/nixpkgs/pkgs/development/python-modules/pyiqvia/default.nix
new file mode 100644
index 000000000000..de604737ace6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyiqvia/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, aiohttp
+, aresponses
+, backoff
+, certifi
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "pyiqvia";
+  version = "2023.10.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = "pyiqvia";
+    rev = "refs/tags/${version}";
+    hash = "sha256-8eTa2h+1QOL0T13+lg2OzvaQv6CYYKkviQb4J5KPsvM=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    backoff
+    certifi
+    yarl
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Ignore the examples as they are prefixed with test_
+    "examples/"
+  ];
+
+  pythonImportsCheck = [
+    "pyiqvia"
+  ];
+
+  meta = with lib; {
+    description = "Module for working with IQVIA data";
+    longDescription = ''
+      pyiqvia is an async-focused Python library for allergen, asthma, and
+      disease data from the IQVIA family of websites (such as https://pollen.com,
+      https://flustar.com and more).
+    '';
+    homepage = "https://github.com/bachya/pyiqvia";
+    changelog = "https://github.com/bachya/pyiqvia/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyisbn/default.nix b/nixpkgs/pkgs/development/python-modules/pyisbn/default.nix
new file mode 100644
index 000000000000..eec0e4b039ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyisbn/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hypothesis
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyisbn";
+  version = "1.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "06fm9rn31cb4b61hzy63cnwfjpppgyy517k8a04gzcv9g60n7xbh";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov pyisbn --cov-report term-missing --no-cov-on-fail" ""
+  '';
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyisbn"
+  ];
+
+  meta = with lib; {
+    description = "Python module for working with 10- and 13-digit ISBNs";
+    homepage = "https://github.com/JNRowe/pyisbn";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ eigengrau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyisy/default.nix b/nixpkgs/pkgs/development/python-modules/pyisy/default.nix
new file mode 100644
index 000000000000..084155976921
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyisy/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, colorlog
+, fetchFromGitHub
+, python-dateutil
+, pythonOlder
+, requests
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pyisy";
+  version = "3.1.14";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "automicus";
+    repo = "PyISY";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-OvWdKr8RlXRnAUMHSPhJDacvKeRa8QGPmGPQWLG2ouk=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'version_format="{tag}"' 'version="${version}"'
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    colorlog
+    python-dateutil
+    requests
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "pyisy" ];
+
+  meta = with lib; {
+    description = "Python module to talk to ISY994 from UDI";
+    homepage = "https://github.com/automicus/PyISY";
+    changelog = "https://github.com/automicus/PyISY/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyixapi/default.nix b/nixpkgs/pkgs/development/python-modules/pyixapi/default.nix
new file mode 100644
index 000000000000..80111d561b65
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyixapi/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, requests
+, pyjwt
+}:
+
+buildPythonPackage rec {
+  pname = "pyixapi";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-c5a8Ldbzgh8gXuCDYbKk9zR6AoiBF3Y/VQvGlSwXpR4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+  propagatedBuildInputs = [
+    requests
+    pyjwt
+  ];
+
+  pythonImportsCheck = [ "pyixapi" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/peering-manager/pyixapi/";
+    changelog = "https://github.com/peering-manager/pyixapi/releases/tag/${version}";
+    description = "Python API client library for IX-API";
+    license = licenses.asl20;
+    maintainers = teams.wdz.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyjet/default.nix b/nixpkgs/pkgs/development/python-modules/pyjet/default.nix
new file mode 100644
index 000000000000..102ccaf06cf8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyjet/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, pythonOlder, fetchFromGitHub, cython, pytest, importlib-resources, numpy }:
+
+buildPythonPackage rec {
+  pname = "pyjet";
+  version = "1.9.0";
+
+  # tests not included in pypi tarball
+  src = fetchFromGitHub {
+    owner = "scikit-hep";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-0g0fCf0FIwde5Vsc/BJxjgMcs5llpD8JqOgFbMjOooc=";
+  };
+
+  nativeBuildInputs = [ cython ];
+  propagatedBuildInputs = [
+    numpy
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ];
+
+  nativeCheckInputs = [ pytest ];
+  checkPhase = ''
+    mv pyjet _pyjet
+    pytest tests/
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/scikit-hep/pyjet";
+    description = "The interface between FastJet and NumPy";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyjks/default.nix b/nixpkgs/pkgs/development/python-modules/pyjks/default.nix
new file mode 100644
index 000000000000..a05dcadeb84d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyjks/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+
+# pythonPackages
+, pyasn1-modules
+, pycryptodomex
+, twofish
+}:
+
+buildPythonPackage rec {
+  pname = "pyjks";
+  version = "20.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0378cec15fb11b2ed27ba54dad9fd987d48e6f62f49fcff138f5f7a8b312b044";
+  };
+
+  propagatedBuildInputs = [
+    pyasn1-modules
+    pycryptodomex
+    twofish
+  ];
+
+  # Tests assume network connectivity
+  doCheck = false;
+
+  meta = {
+    description = "Pure-Python Java Keystore (JKS) library";
+    homepage = "https://github.com/kurtbrose/pyjks";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [
+      kamadorueda
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyjnius/default.nix b/nixpkgs/pkgs/development/python-modules/pyjnius/default.nix
new file mode 100644
index 000000000000..98496bf4a54b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyjnius/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchPypi
+, jdk
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyjnius";
+  version = "1.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-0qfs5u15vx1/l6T21hMC2fHXZSGCo+TIpp267zE5bmA=";
+  };
+
+  nativeBuildInputs = [
+    jdk
+    cython
+  ];
+
+  pythonImportsCheck = [
+    "jnius"
+  ];
+
+  meta = with lib; {
+    description = "A Python module to access Java classes as Python classes using the Java Native Interface (JNI)";
+    homepage = "https://github.com/kivy/pyjnius";
+    changelog = "https://github.com/kivy/pyjnius/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ifurther ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyjsparser/default.nix b/nixpkgs/pkgs/development/python-modules/pyjsparser/default.nix
new file mode 100644
index 000000000000..227cc14b4e63
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyjsparser/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pytestCheckHook
+, js2py
+}:
+
+let pyjsparser = buildPythonPackage rec {
+  pname = "pyjsparser";
+  version = "2.7.1";
+
+  src = fetchFromGitHub {
+    owner = "PiotrDabkowski";
+    repo = pname;
+    rev = "5465d037b30e334cb0997f2315ec1e451b8ad4c1";
+    hash = "sha256-Hqay9/qsjUfe62U7Q79l0Yy01L2Bnj5xNs6427k3Br8=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook js2py ];
+
+  # escape infinite recursion with js2py
+  doCheck = false;
+
+  passthru.tests = {
+    check = pyjsparser.overridePythonAttrs (_: { doCheck = true; });
+  };
+
+  pythonImportsCheck = [ "pyjsparser" ];
+
+  meta = with lib; {
+    description = "Fast javascript parser (based on esprima.js)";
+    homepage = "https://github.com/PiotrDabkowski/pyjsparser";
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny ];
+  };
+}; in pyjsparser
diff --git a/nixpkgs/pkgs/development/python-modules/pyjwkest/default.nix b/nixpkgs/pkgs/development/python-modules/pyjwkest/default.nix
new file mode 100644
index 000000000000..945cc20528e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyjwkest/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi,
+  future, pycryptodomex, pytest, requests, six
+}:
+
+buildPythonPackage rec {
+  pname = "pyjwkest";
+  version = "1.4.2";
+
+  meta = {
+    description = "Implementation of JWT, JWS, JWE and JWK";
+    homepage = "https://github.com/rohe/pyjwkest";
+    license = lib.licenses.asl20;
+  };
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5560fd5ba08655f29ff6ad1df1e15dc05abc9d976fcbcec8d2b5167f49b70222";
+  };
+
+  buildInputs = [ pytest ];
+  propagatedBuildInputs = [ future pycryptodomex requests six ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyjwt/default.nix b/nixpkgs/pkgs/development/python-modules/pyjwt/default.nix
new file mode 100644
index 000000000000..cef52b754ad6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyjwt/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cryptography
+, pytestCheckHook
+, pythonOlder
+, sphinxHook
+, sphinx-rtd-theme
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "pyjwt";
+  version = "2.8.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "PyJWT";
+    inherit version;
+    hash = "sha256-V+KNFW49XBAIjgxoq7kL+sPfgrQKcb0NqiDGXM1cI94=";
+  };
+
+  postPatch = ''
+    sed -i '/types-cryptography/d' setup.cfg
+  '';
+
+  outputs = [
+    "out"
+    "doc"
+  ];
+
+  nativeBuildInputs = [
+    sphinxHook
+    sphinx-rtd-theme
+    zope_interface
+  ];
+
+  passthru.optional-dependencies.crypto = [
+    cryptography
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ (lib.flatten (lib.attrValues passthru.optional-dependencies));
+
+  disabledTests = [
+    # requires internet connection
+    "test_get_jwt_set_sslcontext_default"
+  ];
+
+  pythonImportsCheck = [ "jwt" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/jpadilla/pyjwt/blob/${version}/CHANGELOG.rst";
+    description = "JSON Web Token implementation in Python";
+    homepage = "https://github.com/jpadilla/pyjwt";
+    license = licenses.mit;
+    maintainers = with maintainers; [ prikhi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pykakasi/default.nix b/nixpkgs/pkgs/development/python-modules/pykakasi/default.nix
new file mode 100644
index 000000000000..385239b5ad52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykakasi/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, deprecated
+, fetchFromGitHub
+, importlib-metadata
+, jaconv
+, py-cpuinfo
+, pytest-benchmark
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pykakasi";
+  version = "2.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "miurahr";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ivlenHPD00bxc0c9G368tfTEckOC3vqDB5kMQzHXbVM==";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    jaconv
+    deprecated
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    py-cpuinfo
+    pytest-benchmark
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # We don't care about benchmarks
+    "test_benchmark"
+    "pytest_benchmark_update_machine_info"
+    "pytest_benchmark_update_json"
+  ];
+
+  pythonImportsCheck = [
+    "pykakasi"
+  ];
+
+  meta = with lib; {
+    description = "Python converter for Japanese Kana-kanji sentences into Kana-Roman";
+    homepage = "https://github.com/miurahr/pykakasi";
+    changelog = "https://github.com/miurahr/pykakasi/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pykaleidescape/default.nix b/nixpkgs/pkgs/development/python-modules/pykaleidescape/default.nix
new file mode 100644
index 000000000000..b11f99b74112
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykaleidescape/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, dnspython
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pykaleidescape";
+  version = "2022.2.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "SteveEasley";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-h5G7wV4Z+sf8Qq4GNFsp8DVDSgQgS0dLGf+DzK/egYM=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    dnspython
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "kaleidescape"
+  ];
+
+  disabledTests = [
+    # Test requires network access
+    "test_resolve_succeeds"
+  ];
+
+  meta = with lib; {
+    description = "Module for controlling Kaleidescape devices";
+    homepage = "https://github.com/SteveEasley/pykaleidescape";
+    changelog = "https://github.com/SteveEasley/pykaleidescape/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pykalman/default.nix b/nixpkgs/pkgs/development/python-modules/pykalman/default.nix
new file mode 100644
index 000000000000..7073e9382d3d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykalman/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, scipy
+, pytestCheckHook
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "pykalman";
+  version = "0.9.5";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gWr0dyDZJKTGAW+nS54sjCEWWgjZFpPDIqF0Ho4H+zg=";
+  };
+
+  patches = [
+    # https://github.com/pykalman/pykalman/issues/83
+    ./fix-masked-arrays-not-supported.patch
+    # python 3.11 issues fix: https://github.com/pykalman/pykalman/pull/101
+    ./fix-p311-issues.patch
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    nose
+  ];
+  pythonImportsCheck = [ "pykalman" ];
+
+  meta = with lib; {
+    description = "An implementation of the Kalman Filter, Kalman Smoother, and EM algorithm in Python";
+    homepage = "https://github.com/pykalman/pykalman";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pykalman/fix-masked-arrays-not-supported.patch b/nixpkgs/pkgs/development/python-modules/pykalman/fix-masked-arrays-not-supported.patch
new file mode 100644
index 000000000000..f6dc6679cc54
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykalman/fix-masked-arrays-not-supported.patch
@@ -0,0 +1,14 @@
+--- a/pykalman/utils.py
++++ b/pykalman/utils.py
+@@ -70,7 +70,10 @@
+             cv_chol = linalg.cholesky(cv + min_covar * np.eye(n_dim),
+                                       lower=True)
+         cv_log_det = 2 * np.sum(np.log(np.diagonal(cv_chol)))
+-        cv_sol = solve_triangular(cv_chol, (X - mu).T, lower=True).T
++        try:
++            cv_sol = solve_triangular(cv_chol, (X - mu).T, lower=True).T
++        except ValueError:
++            cv_sol = np.linalg.solve(cv_chol, (X - mu).T).T
+         log_prob[:, c] = - .5 * (np.sum(cv_sol ** 2, axis=1) + \
+                                      n_dim * np.log(2 * np.pi) + cv_log_det)
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/pykalman/fix-p311-issues.patch b/nixpkgs/pkgs/development/python-modules/pykalman/fix-p311-issues.patch
new file mode 100644
index 000000000000..002c8b893aad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykalman/fix-p311-issues.patch
@@ -0,0 +1,13 @@
+--- a/pykalman/utils.py
++++ b/pykalman/utils_copy.py
+@@ -40,6 +40,10 @@
+ from scipy import linalg
+ 
+ 
++# monkey patch
++if not hasattr(inspect, 'getargspec'):
++    inspect.getargspec = inspect.getfullargspec
++
+ def array1d(X, dtype=None, order=None):
+     """Returns at least 1-d array with data from X"""
+     return np.asarray(np.atleast_1d(X), dtype=dtype, order=order)
diff --git a/nixpkgs/pkgs/development/python-modules/pykdl/default.nix b/nixpkgs/pkgs/development/python-modules/pykdl/default.nix
new file mode 100644
index 000000000000..75f2ab61d283
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykdl/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv, toPythonModule, fetchpatch, cmake, pybind11, orocos-kdl, eigen
+, python }:
+
+toPythonModule (stdenv.mkDerivation {
+  pname = "pykdl";
+  inherit (orocos-kdl) version src;
+
+  sourceRoot = "${orocos-kdl.src.name}/python_orocos_kdl";
+
+  patches = [
+    # Support system pybind11; the vendored copy doesn't support Python 3.11
+    (fetchpatch {
+      url = "https://github.com/orocos/orocos_kinematics_dynamics/commit/e25a13fc5820dbca6b23d10506407bca9bcdd25f.patch";
+      hash = "sha256-NGMVGEYsa7hVX+SgRZgeSm93BqxFR1uiyFvzyF5H0Y4=";
+      stripLen = 1;
+    })
+  ];
+
+  # Fix hardcoded installation path
+  postPatch = ''
+    substituteInPlace CMakeLists.txt \
+      --replace dist-packages site-packages
+  '';
+
+  nativeBuildInputs = [ cmake pybind11 ];
+  buildInputs = [ orocos-kdl eigen ];
+  propagatedBuildInputs = [ python ];
+
+  meta = with lib; {
+    description = "Kinematics and Dynamics Library (Python bindings)";
+    homepage = "https://www.orocos.org/kdl.html";
+    license = licenses.lgpl21Only;
+    maintainers = with maintainers; [ lopsided98 ];
+    platforms = platforms.all;
+  };
+})
diff --git a/nixpkgs/pkgs/development/python-modules/pykdtree/default.nix b/nixpkgs/pkgs/development/python-modules/pykdtree/default.nix
new file mode 100644
index 000000000000..d41b6e625201
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykdtree/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, numpy, pytestCheckHook, openmp }:
+
+buildPythonPackage rec {
+  pname = "pykdtree";
+  version = "1.3.7.post0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7KHWHTPbYh74An62ka6I25xl0ZarpLLMkMGQy5C7UI4=";
+  };
+
+  buildInputs = [ openmp ];
+
+  propagatedBuildInputs = [ numpy ];
+
+  preCheck = ''
+    # make sure we don't import pykdtree from the source tree
+    mv pykdtree tests
+  '';
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "kd-tree implementation for fast nearest neighbour search in Python";
+    homepage = "https://github.com/storpipfugl/pykdtree";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pykeepass/default.nix b/nixpkgs/pkgs/development/python-modules/pykeepass/default.nix
new file mode 100644
index 000000000000..2b482295e422
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykeepass/default.nix
@@ -0,0 +1,40 @@
+{ lib, fetchFromGitHub, buildPythonPackage
+, lxml, pycryptodomex, construct
+, argon2-cffi, python-dateutil
+, python
+}:
+
+buildPythonPackage rec {
+  pname   = "pykeepass";
+  version = "4.0.6";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "libkeepass";
+    repo = "pykeepass";
+    rev = "v${version}";
+    hash = "sha256-832cTVzI/MFdwiw6xWzRG35z3iwqb5Qpf6W6XYBIFWs=";
+  };
+
+  propagatedBuildInputs = [
+    lxml pycryptodomex construct
+    argon2-cffi python-dateutil
+  ];
+
+  propagatedNativeBuildInputs = [ argon2-cffi ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest tests.tests
+  '';
+
+  pythonImportsCheck = [ "pykeepass" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/libkeepass/pykeepass";
+    changelog = "https://github.com/libkeepass/pykeepass/blob/${src.rev}/CHANGELOG.rst";
+    description = "Python library to interact with keepass databases (supports KDBX3 and KDBX4)";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pykerberos/default.nix b/nixpkgs/pkgs/development/python-modules/pykerberos/default.nix
new file mode 100644
index 000000000000..bb16c04bec86
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykerberos/default.nix
@@ -0,0 +1,25 @@
+{ lib, fetchPypi, buildPythonPackage, krb5 }:
+
+buildPythonPackage rec {
+  pname = "pykerberos";
+  version = "1.2.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-nXAevY/FlsmdMVXVukWBO9WQjSbvg7oK3SUO22IqvtQ=";
+  };
+
+  nativeBuildInputs = [ krb5 ]; # for krb5-config
+
+  buildInputs = [ krb5 ];
+
+  # there are no tests
+  doCheck = false;
+  pythonImportsCheck = [ "kerberos" ];
+
+  meta = with lib; {
+    description = "High-level interface to Kerberos";
+    license     = licenses.asl20;
+    maintainers = with maintainers; [ catern ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pykeyatome/default.nix b/nixpkgs/pkgs/development/python-modules/pykeyatome/default.nix
new file mode 100644
index 000000000000..363b078cad32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykeyatome/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fake-useragent
+, fetchFromGitHub
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+, responses
+, simplejson
+}:
+
+buildPythonPackage rec {
+  pname = "pykeyatome";
+  version = "2.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "jugla";
+    repo = "pyKeyAtome";
+    rev = "refs/tags/V${version}";
+    hash = "sha256-zRXUjekawf2/zTSlXqHVB02dDkb6HbU4NN6UBgl2rtg=";
+  };
+
+  propagatedBuildInputs = [
+    fake-useragent
+    requests
+    simplejson
+  ];
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytestCheckHook
+    requests-mock
+    responses
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_consumption"
+    "test_get_live"
+    "test_login"
+    "test_relog_after_session_down"
+  ];
+
+  pythonImportsCheck = [
+    "pykeyatome"
+  ];
+
+  meta = with lib; {
+    description = "Python module to get data from Atome Key";
+    homepage = "https://github.com/jugla/pyKeyAtome";
+    changelog = "https://github.com/jugla/pyKeyAtome/releases/tag/V${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pykira/default.nix b/nixpkgs/pkgs/development/python-modules/pykira/default.nix
new file mode 100644
index 000000000000..c3303902bf6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykira/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pykira";
+  version = "0.1.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MMjmA5N9Ms40eJP9fDDq+LIoPduAnqVrbNLXm+Vl5qw=";
+  };
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pykira"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interact with Kira modules";
+    homepage = "https://github.com/stu-gott/pykira";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pykka/default.nix b/nixpkgs/pkgs/development/python-modules/pykka/default.nix
new file mode 100644
index 000000000000..5bc06fe17091
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykka/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pytest-mock
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "pykka";
+  version = "4.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "jodal";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-SYgT69/AZX/JDm89PwFqrUL9Ll1iHRKEy78BN4QKz9Y=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.10") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+  ];
+
+  pythonImportsCheck = [
+    "pykka"
+  ];
+
+  meta = with lib; {
+    homepage = "https://www.pykka.org/";
+    description = "A Python implementation of the actor model";
+    changelog = "https://github.com/jodal/pykka/releases/tag/v${version}";
+    maintainers = with maintainers; [ marsam ];
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pykmtronic/default.nix b/nixpkgs/pkgs/development/python-modules/pykmtronic/default.nix
new file mode 100644
index 000000000000..67f6da455eb1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykmtronic/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, lxml
+}:
+
+buildPythonPackage rec {
+  pname = "pykmtronic";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8qLyBJp7C93x0PWbgDAtNEDJ5VLNfwZ3DRZfudRCBgo=";
+  };
+
+  propagatedBuildInputs = [ aiohttp lxml ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "pykmtronic" ];
+
+  meta = with lib; {
+    description = "Python client to interface with KM-Tronic web relays";
+    homepage = "https://github.com/dgomes/pykmtronic";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pykodi/default.nix b/nixpkgs/pkgs/development/python-modules/pykodi/default.nix
new file mode 100644
index 000000000000..75dda69262c7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykodi/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+, jsonrpc-async
+, jsonrpc-websocket
+}:
+
+buildPythonPackage rec {
+  pname = "pykodi";
+  version = "0.2.7";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2fFkbZZ3RXMolaaGpkvvVfSYtNNB1bTsoRCin3GnVKM=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    jsonrpc-async
+    jsonrpc-websocket
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pykodi"
+  ];
+
+  meta = with lib; {
+    description = "An async python interface for Kodi over JSON-RPC";
+    homepage = "https://github.com/OnFreund/PyKodi";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sephalon ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pykoplenti/default.nix b/nixpkgs/pkgs/development/python-modules/pykoplenti/default.nix
new file mode 100644
index 000000000000..474b526abdd5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykoplenti/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, prompt-toolkit
+, pycryptodome
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pykoplenti";
+  version = "1.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "stegm";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-XBOKf3i8xywU/1Kzl+VI1Qnkp9ohpSuDX3AnotD32oo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  postPatch = ''
+    # remove with 1.1.0
+    substituteInPlace setup.cfg \
+      --replace 'version = unreleased' 'version = ${version}'
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+    click
+    prompt-toolkit
+    pycryptodome
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "pykoplenti" ];
+
+  meta = with lib; {
+    description = "Python REST client API for Kostal Plenticore Inverters";
+    homepage = "https://github.com/stegm/pykoplenti/";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pykostalpiko/default.nix b/nixpkgs/pkgs/development/python-modules/pykostalpiko/default.nix
new file mode 100644
index 000000000000..13b67271bd51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykostalpiko/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pykostalpiko";
+  version = "1.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Florian7843";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-kmzFsOgmMb8bOkulg7G6vXEPdb0xizh7u5LjnHfEWWQ=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    click
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pykostalpiko"
+  ];
+
+  meta = with lib; {
+    description = "Library and CLI-tool to fetch the data from a Kostal Piko inverter";
+    homepage = "https://github.com/Florian7843/pykostalpiko";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pykrakenapi/default.nix b/nixpkgs/pkgs/development/python-modules/pykrakenapi/default.nix
new file mode 100644
index 000000000000..832658039531
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykrakenapi/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, krakenex
+, pandas
+}:
+
+buildPythonPackage rec {
+  pname = "pykrakenapi";
+  version = "0.3.2";
+
+  disabled = pythonOlder "3.3";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "dominiktraxl";
+    repo = "pykrakenapi";
+    rev = "v${version}";
+    hash = "sha256-sMtNdXM+47iCnDgo33DCD1nx/I+jVX/oG/9aN80LfRg=";
+  };
+
+  propagatedBuildInputs = [
+    krakenex
+    pandas
+  ];
+
+  # tests require network connection
+  doCheck = false;
+
+  pythonImportsCheck = [ "pykrakenapi" ];
+
+  meta = with lib; {
+    description = "Python implementation of the Kraken API";
+    homepage = "https://github.com/dominiktraxl/pykrakenapi";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pykulersky/default.nix b/nixpkgs/pkgs/development/python-modules/pykulersky/default.nix
new file mode 100644
index 000000000000..6c1d9bf00fae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykulersky/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, bleak
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pykulersky";
+  version = "0.5.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "emlove";
+    repo = pname;
+    rev = version;
+    hash = "sha256-coO+WBnv5HT14ym719qr3Plm1JuiaNdAvD1QVPj65oU=";
+  };
+
+  propagatedBuildInputs = [
+    bleak
+    click
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pykulersky"
+  ];
+
+  meta = with lib; {
+    description = "Python module to control Brightech Kuler Sky Bluetooth LED devices";
+    homepage = "https://github.com/emlove/pykulersky";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pykwalify/default.nix b/nixpkgs/pkgs/development/python-modules/pykwalify/default.nix
new file mode 100644
index 000000000000..41d6a0982104
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykwalify/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, python-dateutil
+, docopt
+, fetchPypi
+, pytestCheckHook
+, pyyaml
+, ruamel-yaml
+, testfixtures
+}:
+
+buildPythonPackage rec {
+  version = "1.8.0";
+  pname = "pykwalify";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-eWsq0+1MuZuIMItTP7L1WcMPpu+0+p/aETR/SD0kWIQ=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    docopt
+    pyyaml
+    ruamel-yaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    testfixtures
+  ];
+
+  disabledTests = [
+    "test_multi_file_support"
+  ];
+
+  pythonImportsCheck = [ "pykwalify" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Grokzen/pykwalify";
+    description = "YAML/JSON validation library";
+    longDescription = ''
+      This framework is a port with a lot of added functionality
+      of the Java version of the framework kwalify that can be found at
+      http://www.kuwata-lab.com/kwalify/
+
+      The original source code can be found at
+      http://sourceforge.net/projects/kwalify/files/kwalify-java/0.5.1/
+
+      The source code of the latest release that has been used can be found at
+      https://github.com/sunaku/kwalify.
+      Please note that source code is not the original authors code
+      but a fork/upload of the last release available in Ruby.
+
+      The schema this library is based on and extended from:
+      http://www.kuwata-lab.com/kwalify/ruby/users-guide.01.html#schema
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ siriobalmelli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pykwb/default.nix b/nixpkgs/pkgs/development/python-modules/pykwb/default.nix
new file mode 100644
index 000000000000..5de4abd0306d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pykwb/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyserial
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pykwb";
+  version = "0.0.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-mor2TKhq08w4HzaUaspWOMEFwJaAKjXKoNAaoZJqWPQ=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pykwb"
+  ];
+
+  meta = with lib; {
+    description = "Library for interacting with KWB Easyfire Pellet Central Heating Units";
+    homepage = "https://github.com/bimbar/pykwb";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylacrosse/default.nix b/nixpkgs/pkgs/development/python-modules/pylacrosse/default.nix
new file mode 100644
index 000000000000..f247f42e975b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylacrosse/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, nose
+, pyserial
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pylacrosse";
+  version = "0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "hthiery";
+    repo = "python-lacrosse";
+    rev = "refs/tags/${version}";
+    hash = "sha256-jrkehoPLYbutDfxMBO/vlx4nMylTNs/gtvoBTFHFsDw=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "version = version," "version = '${version}',"
+  '';
+
+  propagatedBuildInputs = [
+    pyserial
+  ];
+
+  nativeCheckInputs = [
+    mock
+    nose
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pylacrosse"
+  ];
+
+  meta = with lib; {
+    description = "Python library for Jeelink LaCrosse";
+    homepage = "https://github.com/hthiery/python-lacrosse";
+    license = with licenses; [ lgpl2Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylama/default.nix b/nixpkgs/pkgs/development/python-modules/pylama/default.nix
new file mode 100644
index 000000000000..e62d356f70ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylama/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, substituteAll
+, git
+, eradicate
+, mccabe
+, mypy
+, pycodestyle
+, pydocstyle
+, pyflakes
+, vulture
+, setuptools
+, isort
+, pylint
+, pytestCheckHook
+}:
+
+let pylama = buildPythonPackage rec {
+  pname = "pylama";
+  version = "8.4.1";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    name = "${pname}-${version}-source";
+    owner = "klen";
+    repo = "pylama";
+    rev = version;
+    hash = "sha256-WOGtZ412tX3YH42JCd5HIngunluwtMmQrOSUZp23LPU=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./paths.patch;
+      git = "${lib.getBin git}/bin/git";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    eradicate
+    mccabe
+    mypy
+    pycodestyle
+    pydocstyle
+    pyflakes
+    setuptools
+    vulture
+  ];
+
+  # escape infinite recursion pylint -> isort -> pylama
+  doCheck = false;
+
+  nativeCheckInputs = [
+    pylint
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TEMP
+  '';
+
+  disabledTests = [
+    "test_quotes" # FIXME package pylama-quotes
+    "test_radon" # FIXME package radon
+  ];
+
+  pythonImportsCheck = [
+    "pylama.main"
+  ];
+
+  passthru.tests = {
+    check = pylama.overridePythonAttrs (_: { doCheck = true; });
+  };
+
+  meta = with lib; {
+    description = "Code audit tool for python";
+    homepage = "https://github.com/klen/pylama";
+    changelog = "https://github.com/klen/pylama/blob/${version}/Changelog";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}; in pylama
diff --git a/nixpkgs/pkgs/development/python-modules/pylama/paths.patch b/nixpkgs/pkgs/development/python-modules/pylama/paths.patch
new file mode 100644
index 000000000000..ab6a4719f354
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylama/paths.patch
@@ -0,0 +1,13 @@
+diff --git a/pylama/hook.py b/pylama/hook.py
+index 029c9dc..9f1a9b9 100644
+--- a/pylama/hook.py
++++ b/pylama/hook.py
+@@ -26,7 +26,7 @@ def run(command: str) -> Tuple[int, List[bytes], List[bytes]]:
+ 
+ def git_hook(error=True):
+     """Run pylama after git commit."""
+-    _, files_modified, _ = run("git diff-index --cached --name-only HEAD")
++    _, files_modified, _ = run("@git@ diff-index --cached --name-only HEAD")
+ 
+     options = parse_options()
+     setup_logger(options)
diff --git a/nixpkgs/pkgs/development/python-modules/pylast/default.nix b/nixpkgs/pkgs/development/python-modules/pylast/default.nix
new file mode 100644
index 000000000000..54fabf00b0b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylast/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flaky
+, hatch-vcs
+, hatchling
+, httpx
+, importlib-metadata
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pylast";
+  version = "5.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pylast";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-6yxsqruosSOJ5LeIBbvuEko4s9qU/ObNZiJD5YH/hvY=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    flaky
+  ];
+
+  pythonImportsCheck = [
+    "pylast"
+  ];
+
+  meta = with lib; {
+    description = "Python interface to last.fm (and compatibles)";
+    homepage = "https://github.com/pylast/pylast";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab rvolosatovs ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylatexenc/default.nix b/nixpkgs/pkgs/development/python-modules/pylatexenc/default.nix
new file mode 100644
index 000000000000..0080ad8293a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylatexenc/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pylatexenc";
+  version = "2.10";
+
+  src = fetchFromGitHub {
+    owner = "phfaist";
+    repo = "pylatexenc";
+    rev = "v${version}";
+    hash = "sha256-3Ho04qrmCtmmrR+BUJNbtdCZcK7lXhUGJjm4yfCTUkM=";
+  };
+
+  pythonImportsCheck = [ "pylatexenc" ];
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Simple LaTeX parser providing latex-to-unicode and unicode-to-latex conversion";
+    homepage = "https://pylatexenc.readthedocs.io";
+    downloadPage = "https://www.github.com/phfaist/pylatexenc/releases";
+    changelog = "https://pylatexenc.readthedocs.io/en/latest/changes/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylaunches/default.nix b/nixpkgs/pkgs/development/python-modules/pylaunches/default.nix
new file mode 100644
index 000000000000..9adf3abfc61e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylaunches/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pytest-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pylaunches";
+  version = "1.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ludeeus";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-bIcnYcbfAwjet3cg97y+ujFfY2916ANk4sw0sZoU59g=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  postPatch = ''
+    # Upstream doesn't set version in the repo
+    substituteInPlace setup.py \
+      --replace 'version="main",' 'version="${version}",' \
+      --replace ', "pytest-runner"' ""
+  '';
+
+  pythonImportsCheck = [
+    "pylaunches"
+  ];
+
+  meta = with lib; {
+    description = "Python module to get information about upcoming space launches";
+    homepage = "https://github.com/ludeeus/pylaunches";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyld/default.nix b/nixpkgs/pkgs/development/python-modules/pyld/default.nix
new file mode 100644
index 000000000000..464065cbc175
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyld/default.nix
@@ -0,0 +1,57 @@
+{ lib, buildPythonPackage, fetchFromGitHub, python, requests }:
+
+let
+
+  json-ld = fetchFromGitHub {
+    owner = "json-ld";
+    repo = "json-ld.org";
+    rev = "843a70e4523d7cd2a4d3f5325586e726eb1b123f";
+    sha256 = "05j0nq6vafclyypxjj30iw898ig0m32nvz0rjdlslx6lawkiwb2a";
+  };
+
+  normalization = fetchFromGitHub {
+    owner = "json-ld";
+    repo = "normalization";
+    rev = "aceeaf224b64d6880189d795bd99c3ffadb5d79e";
+    sha256 = "125q5rllfm8vg9mz8hn7bhvhv2vqpd86kx2kxlk84smh33l8kbyl";
+  };
+
+in
+
+buildPythonPackage rec {
+  pname = "pyld";
+  version = "1.0.5";
+
+  src = fetchFromGitHub {
+    owner = "digitalbazaar";
+    repo = pname;
+    rev = version;
+    sha256 = "0z2vkllw8bvzxripwb6l757r7av5qwhzsiy4061gmlhq8z8gq961";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # Unfortunately PyLD does not pass all testcases in the JSON-LD corpus. We
+  # check for at least a minimum amount of successful tests so we know it's not
+  # getting worse, at least.
+  checkPhase = ''
+    ok_min=401
+
+    if ! ${python.interpreter} tests/runtests.py -d ${json-ld}/test-suite 2>&1 | tee test.out; then
+      ok_count=$(grep -F '... ok' test.out | wc -l)
+      if [[ $ok_count -lt $ok_min ]]; then
+        echo "Less than $ok_min tests passed ($ok_count). Failing the build."
+        exit 1
+      fi
+    fi
+
+    ${python.interpreter} tests/runtests.py -d ${normalization}/tests
+  '';
+
+  meta = with lib; {
+    description = "Python implementation of the JSON-LD API";
+    homepage = "https://github.com/digitalbazaar/pyld";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ apeschar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylddwrap/default.nix b/nixpkgs/pkgs/development/python-modules/pylddwrap/default.nix
new file mode 100644
index 000000000000..d228c1a39ec9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylddwrap/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, icontract
+, pytestCheckHook
+, pythonOlder
+, substituteAll
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "pylddwrap";
+  version = "1.2.2";
+  format = "setuptools";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Parquery";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Gm82VRu8GP52BohQzpMUJfh6q2tiUA2GJWOcG7ymGgg=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./replace_env_with_placeholder.patch;
+      ldd_bin = "${stdenv.cc.bintools.libc_bin}/bin/ldd";
+    })
+  ];
+
+  # Upstream adds some plain text files direct to the package's root directory
+  # https://github.com/Parquery/pylddwrap/blob/master/setup.py#L71
+  postInstall = ''
+    rm -f $out/{LICENSE,README.rst,requirements.txt}
+  '';
+
+  propagatedBuildInputs = [
+    icontract
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  # uses mocked ldd from PATH, but we are patching the source to not look at PATH
+  disabledTests = [
+    "TestAgainstMockLdd"
+    "TestMain"
+  ];
+
+  pythonImportsCheck = [ "lddwrap" ];
+
+  meta = with lib; {
+    description = "Python wrapper around ldd *nix utility to determine shared libraries of a program";
+    homepage = "https://github.com/Parquery/pylddwrap";
+    changelog = "https://github.com/Parquery/pylddwrap/blob/v${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ thiagokokada ];
+    # should work in any Unix platform that uses glibc, except for darwin
+    # since it has its own tool (`otool`)
+    badPlatforms = platforms.darwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylddwrap/replace_env_with_placeholder.patch b/nixpkgs/pkgs/development/python-modules/pylddwrap/replace_env_with_placeholder.patch
new file mode 100644
index 000000000000..676b0c10b4a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylddwrap/replace_env_with_placeholder.patch
@@ -0,0 +1,25 @@
+diff --git a/lddwrap/__init__.py b/lddwrap/__init__.py
+index 1222c97..db8a735 100644
+--- a/lddwrap/__init__.py
++++ b/lddwrap/__init__.py
+@@ -190,10 +190,8 @@ def list_dependencies(path: pathlib.Path,
+         Otherwise specified env is used.
+     :return: list of dependencies
+     """
+-    # We need to use /usr/bin/env since Popen ignores the PATH,
+-    # see https://stackoverflow.com/questions/5658622
+     proc = subprocess.Popen(
+-        ["/usr/bin/env", "ldd", path.as_posix()],
++        ["@ldd_bin@", path.as_posix()],
+         stdout=subprocess.PIPE,
+         stderr=subprocess.PIPE,
+         universal_newlines=True,
+@@ -209,7 +207,7 @@ def list_dependencies(path: pathlib.Path,
+ 
+     if unused:
+         proc_unused = subprocess.Popen(
+-            ["/usr/bin/env", "ldd", "--unused",
++            ["@ldd_bin@", "--unused",
+              path.as_posix()],
+             stdout=subprocess.PIPE,
+             stderr=subprocess.PIPE,
diff --git a/nixpkgs/pkgs/development/python-modules/pyleri/default.nix b/nixpkgs/pkgs/development/python-modules/pyleri/default.nix
new file mode 100644
index 000000000000..98c71d06f55a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyleri/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyleri";
+  version = "1.4.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "cesbit";
+    repo = "pyleri";
+    rev = "refs/tags/${version}";
+    hash = "sha256-52Q2iTrXFNbDzXL0FM+Gypipvo5ciNqAtZa5sKOwQRc=";
+  };
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyleri"
+  ];
+
+  meta = with lib; {
+    description = "Module to parse SiriDB";
+    homepage = "https://github.com/cesbit/pyleri";
+    changelog = "https://github.com/cesbit/pyleri/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylev/default.nix b/nixpkgs/pkgs/development/python-modules/pylev/default.nix
new file mode 100644
index 000000000000..c9c3340db192
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylev/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "pylev";
+  version = "1.4.0";
+
+  src = fetchFromGitHub {
+    owner = "toastdriven";
+    repo = "pylev";
+    rev = "v${version}";
+    sha256 = "0fgxjdnvnvavnxmxxd0fl5jyr2f31g3a26bwyxcpy56mgpd095c1";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest tests
+  '';
+
+  pythonImportsCheck = [ "pylev" ];
+
+  meta = with lib; {
+    description = "Python Levenshtein implementation";
+    homepage = "https://github.com/toastdriven/pylev";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jakewaksbaum ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylgnetcast/default.nix b/nixpkgs/pkgs/development/python-modules/pylgnetcast/default.nix
new file mode 100644
index 000000000000..1e18c9f93aea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylgnetcast/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pylgnetcast";
+  version = "0.3.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Drafteed";
+    repo = "python-lgnetcast";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-UxZ4XM7n0Ryd4D967fXPTA4sqTrZwS8Tj/Q8kNGdk8Q=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pylgnetcast"
+  ];
+
+  meta = with lib; {
+    description = "Python API client for the LG Smart TV running NetCast 3 or 4";
+    homepage = "https://github.com/Drafteed/python-lgnetcast";
+    changelog = "https://github.com/Drafteed/python-lgnetcast/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylibacl/default.nix b/nixpkgs/pkgs/development/python-modules/pylibacl/default.nix
new file mode 100644
index 000000000000..e1280764972d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylibacl/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "pylibacl";
+  version = "0.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-7UludMpUUtXUzr4j3yKepGJzWpZSi5+ijjzh96K+0xo=";
+  };
+
+  # ERROR: testExtended (tests.test_acls.AclExtensions)
+  # IOError: [Errno 0] Error
+  doCheck = false;
+
+  buildInputs = with pkgs; [ acl ];
+
+  meta = {
+    description = "A Python extension module for POSIX ACLs, it can be used to query, list, add, and remove ACLs from files and directories under operating systems that support them";
+    license = lib.licenses.lgpl21Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylibconfig2/default.nix b/nixpkgs/pkgs/development/python-modules/pylibconfig2/default.nix
new file mode 100644
index 000000000000..2cabb78544eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylibconfig2/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, pyparsing }:
+buildPythonPackage rec {
+  pname = "pylibconfig2";
+  version = "0.2.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1iwm11v0ghv2pq2cyvly7gdwrhxsx6iwi581fz46l0snhgcd4sqq";
+  };
+
+  # tests not included in the distribution
+  doCheck = false;
+
+  propagatedBuildInputs = [ pyparsing ];
+
+  meta = with lib; {
+    homepage = "https://github.com/heinzK1X/pylibconfig2";
+    description = "Pure python library for libconfig syntax";
+    license = licenses.gpl3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylibdmtx/default.nix b/nixpkgs/pkgs/development/python-modules/pylibdmtx/default.nix
new file mode 100644
index 000000000000..2152ac54241d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylibdmtx/default.nix
@@ -0,0 +1,47 @@
+{ fetchFromGitHub
+, buildPythonPackage
+, pillow
+, numpy
+, libdmtx
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "pylibdmtx";
+  version = "0.1.10";
+
+  src = fetchFromGitHub {
+    owner = "NaturalHistoryMuseum";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-vNWzhO4V0mj4eItZ0Z5UG9RBCqprIcgMGNyIe1+mXWY=";
+  };
+
+  # Change:
+  # def load():
+  #     """Loads the libdmtx shared library.
+  #
+  # To:
+  # def load():
+  #     return cdll.LoadLibrary("/nix/store/.../lib/libdmtx.so")
+  #     """Loads the libdmtx shared library.
+  postPatch = ''
+    sed -i '\#def load.*#a\    return cdll.LoadLibrary("${libdmtx}/lib/libdmtx.so")' \
+        pylibdmtx/dmtx_library.py
+
+    # Checks that the loader works in various scenarios, but we just
+    # forced it to only work one way.
+    rm pylibdmtx/tests/test_dmtx_library.py
+  '';
+
+  propagatedBuildInputs = [ pillow numpy ];
+
+  pythonImportsCheck = [ "pylibdmtx" ];
+
+  meta = with lib; {
+    description = "Read and write Data Matrix barcodes from Python 2 and 3 using the libdmtx library";
+    homepage = "https://github.com/NaturalHistoryMuseum/pylibdmtx/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ grahamc ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylibftdi/default.nix b/nixpkgs/pkgs/development/python-modules/pylibftdi/default.nix
new file mode 100644
index 000000000000..32f20e278754
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylibftdi/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, libftdi1
+, libusb1
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pylibftdi";
+  version = "0.21.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-634vUFKFJUf0xsRgIqFmX510U0OWORcereVv3ICliDI=";
+  };
+
+  propagatedBuildInputs = [
+    libftdi1
+    libusb1
+  ];
+
+  postPatch = ''
+    substituteInPlace src/pylibftdi/driver.py \
+      --replace "self._load_library('libusb')" "cdll.LoadLibrary('${libusb1.out}/lib/libusb-1.0.so')" \
+      --replace "self._load_library('libftdi')" "cdll.LoadLibrary('${libftdi1.out}/lib/libftdi1.so')"
+  '';
+
+  pythonImportsCheck = [
+    "pylibftdi"
+  ];
+
+  meta = with lib; {
+    description = "Wrapper to Intra2net's libftdi driver for FTDI's USB devices";
+    homepage = "https://pylibftdi.readthedocs.io/";
+    changelog = "https://github.com/codedstructure/pylibftdi/blob/${version}0/CHANGES.txt";
+    license = licenses.mit;
+    maintainers = with maintainers; [ matthuszagh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylibjpeg-libjpeg/default.nix b/nixpkgs/pkgs/development/python-modules/pylibjpeg-libjpeg/default.nix
new file mode 100644
index 000000000000..a9ffc663fcaf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylibjpeg-libjpeg/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, cython
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "pylibjpeg-libjpeg";
+  version = "1.3.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pydicom";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-VmqeoMU8riLpWyC+yKqq56TkruxOie6pjbg+ozivpBk=";
+    fetchSubmodules = true;
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  doCheck = false;  # tests try to import 'libjpeg.data', which errors
+
+  pythonImportsCheck = [
+    "libjpeg"
+  ];
+
+  meta = with lib; {
+    description = "A JPEG, JPEG-LS and JPEG XT plugin for pylibjpeg";
+    homepage = "https://github.com/pydicom/pylibjpeg-libjpeg";
+    changelog = "https://github.com/pydicom/pylibjpeg-libjpeg/releases/tag/v${version}";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyliblo/default.nix b/nixpkgs/pkgs/development/python-modules/pyliblo/default.nix
new file mode 100644
index 000000000000..e56b1dfa3683
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyliblo/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+, isPyPy
+, pythonAtLeast
+, liblo
+, cython
+}:
+
+buildPythonPackage rec {
+  pname = "pyliblo";
+  version = "0.10.0";
+  disabled = isPyPy;
+
+  src = fetchurl {
+    url = "http://das.nasophon.de/download/${pname}-${version}.tar.gz";
+    sha256 = "13vry6xhxm7adnbyj28w1kpwrh0kf7nw83cz1yq74wl21faz2rzw";
+  };
+
+  patches = [
+    (fetchurl {
+      url = "https://git.alpinelinux.org/aports/plain/community/py3-pyliblo/py3.11.patch?id=a7e1eca5533657ddd7e37c43e67e8126e3447258";
+      hash = "sha256-4yCWNQaE/9FHGTVuvNEimBNuViWZ9aSJMcpTOP0fnM0=";
+    })
+  ];
+
+  buildInputs = [ liblo cython ];
+
+  meta = with lib; {
+    homepage = "https://das.nasophon.de/pyliblo/";
+    description = "Python wrapper for the liblo OSC library";
+    license = licenses.lgpl21Only;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylibmc/default.nix b/nixpkgs/pkgs/development/python-modules/pylibmc/default.nix
new file mode 100644
index 000000000000..3cd7a05e54ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylibmc/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, cyrus_sasl
+, fetchPypi
+, libmemcached
+, pythonOlder
+, zlib
+}:
+
+buildPythonPackage rec {
+  pname = "pylibmc";
+  version = "1.6.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7vpGEVU3q61l++LgMqzRs0Y9m/njNa9LCRbfTk0yBuA=";
+  };
+
+  buildInputs = [
+    cyrus_sasl
+    libmemcached
+    zlib
+  ];
+
+  setupPyBuildFlags = [
+    "--with-sasl2"
+  ];
+
+  # Requires an external memcached server running
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pylibmc"
+  ];
+
+  meta = with lib; {
+    description = "Quick and small memcached client for Python";
+    homepage = "http://sendapatch.se/projects/pylibmc/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylink-square/default.nix b/nixpkgs/pkgs/development/python-modules/pylink-square/default.nix
new file mode 100644
index 000000000000..2903c0f8d566
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylink-square/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchPypi
+, mock
+, psutil
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "pylink-square";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "square";
+    repo = "pylink";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-rcM7gvUUfXN5pL9uIihzmOCXA7NKjiMt2GaQaGJxD9M=";
+  };
+
+  propagatedBuildInputs = [
+    psutil
+    six
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pylink"
+  ];
+
+  disabledTests = [
+    # AttributeError: 'called_once_with' is not a valid assertion
+    "test_cp15_register_write_success"
+    "test_jlink_restarted"
+    "test_set_log_file_success"
+  ];
+
+  meta = with lib; {
+    description = "Python interface for the SEGGER J-Link";
+    homepage = "https://github.com/square/pylink";
+    changelog = "https://github.com/square/pylink/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dump_stack ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylint-celery/default.nix b/nixpkgs/pkgs/development/python-modules/pylint-celery/default.nix
new file mode 100644
index 000000000000..6bc7a93049e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylint-celery/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, lib
+
+# pythonPackages
+, pylint-plugin-utils
+}:
+
+buildPythonPackage rec {
+  pname = "pylint-celery";
+  version = "0.3";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "PyCQA";
+    repo = pname;
+    rev = version;
+    sha256 = "05fhwraq12c2724pn4py1bjzy5rmsrb1x68zck73nlp5icba6yap";
+  };
+
+  propagatedBuildInputs = [
+    pylint-plugin-utils
+  ];
+
+  # Testing requires a very old version of pylint, incompatible with other dependencies
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A Pylint plugin to analyze Celery applications";
+    homepage = "https://github.com/PyCQA/pylint-celery";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [
+      kamadorueda
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylint-django/default.nix b/nixpkgs/pkgs/development/python-modules/pylint-django/default.nix
new file mode 100644
index 000000000000..978394e60e27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylint-django/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, django
+, factory-boy
+, fetchFromGitHub
+, pylint-plugin-utils
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pylint-django";
+  version = "2.5.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "PyCQA";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-5xEXjNMkOetRM9NDz0S4DsC6v39YQi34s2s+Fs56hYU=";
+  };
+
+  propagatedBuildInputs = [
+    django
+    pylint-plugin-utils
+  ];
+
+  nativeCheckInputs = [
+    factory-boy
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # AttributeError, AssertionError
+    "external_django_tables2_noerror_meta_class"
+    "external_tastypie_noerror_foreign_key"
+    "func_noerror_model_unicode_lambda"
+    "0001_noerror_initial"
+  ];
+
+  pythonImportsCheck = [
+    "pylint_django"
+  ];
+
+  meta = with lib; {
+    description = "Pylint plugin to analyze Django applications";
+    homepage = "https://github.com/PyCQA/pylint-django";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ kamadorueda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylint-flask/default.nix b/nixpkgs/pkgs/development/python-modules/pylint-flask/default.nix
new file mode 100644
index 000000000000..5077d07a936b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylint-flask/default.nix
@@ -0,0 +1,36 @@
+{ buildPythonPackage
+, fetchPypi
+, isPy3k
+, lib
+
+# pythonPackages
+, pylint-plugin-utils
+}:
+
+buildPythonPackage rec {
+  pname = "pylint-flask";
+  version = "0.6";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "05qmwgkpvaa5k05abqjxfbrfk3wpdqb8ph690z7bzxvb47i7vngl";
+  };
+
+  propagatedBuildInputs = [
+    pylint-plugin-utils
+  ];
+
+  # Tests require a very old version of pylint
+  #   also tests are only available at GitHub, with an old release tag
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A Pylint plugin to analyze Flask applications";
+    homepage = "https://github.com/jschaf/pylint-flask";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [
+      kamadorueda
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylint-plugin-utils/default.nix b/nixpkgs/pkgs/development/python-modules/pylint-plugin-utils/default.nix
new file mode 100644
index 000000000000..a8cff3800960
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylint-plugin-utils/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pylint
+, pytestCheckHook
+, pythonOlder
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "pylint-plugin-utils";
+  version = "0.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "PyCQA";
+    repo = pname;
+    rev = version;
+    hash = "sha256-uDsSSUWdlzuQz6umoYLbIotOYNEnLQu041ZZVMRd2ww=";
+  };
+
+  propagatedBuildInputs = [
+    pylint
+    toml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pylint_plugin_utils"
+  ];
+
+  # https://github.com/PyCQA/pylint-plugin-utils/issues/26
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Utilities and helpers for writing Pylint plugins";
+    homepage = "https://github.com/PyCQA/pylint-plugin-utils";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ kamadorueda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylint-venv/default.nix b/nixpkgs/pkgs/development/python-modules/pylint-venv/default.nix
new file mode 100644
index 000000000000..b12ae73b8c34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylint-venv/default.nix
@@ -0,0 +1,40 @@
+ { lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pylint-venv";
+  version = "3.0.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jgosmann";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-dsVEHJawsTNKVCVmeOa61wOU5GPeyzAU/eUDFrK9PPg=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pylint_venv"
+  ];
+
+  meta = with lib; {
+    description = "Module to make pylint respect virtual environments";
+    homepage = "https://github.com/jgosmann/pylint-venv/";
+    changelog = "https://github.com/jgosmann/pylint-venv/blob/v${version}/CHANGES.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylint/default.nix b/nixpkgs/pkgs/development/python-modules/pylint/default.nix
new file mode 100644
index 000000000000..d4a89aa000bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylint/default.nix
@@ -0,0 +1,138 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pythonOlder
+, astroid
+, dill
+, isort
+, mccabe
+, platformdirs
+, requests
+, setuptools
+, tomli
+, tomlkit
+, typing-extensions
+, gitpython
+, py
+, pytest-timeout
+, pytest-xdist
+, pytestCheckHook
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pylint";
+  version = "2.17.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7.2";
+
+  src = fetchFromGitHub {
+    owner = "pylint-dev";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-cmH6Q6/XJXx8EXDIsik1Aheu9hYGvvlNvWBUCdmC3P8=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "update-setuptools.patch";
+      url = "https://github.com/pylint-dev/pylint/commit/1d029b594aa258fa01570632d001e801f9257d60.patch";
+      hash = "sha256-brQwelZVkSX9h0POH8OJeapZuWZ8p7BY/ZzhYzGbiHY=";
+    })
+    # https://github.com/pylint-dev/pylint/pull/8961
+    (fetchpatch {
+      name = "unpin-setuptools.patch";
+      url = "https://github.com/pylint-dev/pylint/commit/a0ac282d6f8df381cc04adc0a753bec66fc4db63.patch";
+      hash = "sha256-15O72LE2WQK590htNc3jghdbVoGLHUIngERDpqT8pK8=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    astroid
+    dill
+    isort
+    mccabe
+    platformdirs
+    tomlkit
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    gitpython
+    # https://github.com/PyCQA/pylint/blob/main/requirements_test_min.txt
+    py
+    pytest-timeout
+    pytest-xdist
+    pytestCheckHook
+    requests
+    typing-extensions
+  ];
+
+  pytestFlagsArray = [
+    # DeprecationWarning: pyreverse will drop support for resolving and
+    # displaying implemented interfaces in pylint 3.0. The
+    # implementation relies on the '__implements__'  attribute proposed
+    # in PEP 245, which was rejected in 2006.
+    "-W" "ignore::DeprecationWarning"
+    "-v"
+  ];
+
+  dontUseSetuptoolsCheck = true;
+
+  preCheck = ''
+    export HOME=$TEMPDIR
+  '';
+
+  disabledTestPaths = [
+    "tests/benchmark"
+    # tests miss multiple input files
+    # FileNotFoundError: [Errno 2] No such file or directory
+    "tests/pyreverse/test_writer.py"
+  ];
+
+  disabledTests = [
+    # AssertionError when self executing and checking output
+    # expected output looks like it should match though
+    "test_invocation_of_pylint_config"
+    "test_generate_rcfile"
+    "test_generate_toml_config"
+    "test_help_msg"
+    "test_output_of_callback_options"
+    # Failed: DID NOT WARN. No warnings of type (<class 'UserWarning'>,) were emitted. The list of emitted warnings is: [].
+    "test_save_and_load_not_a_linter_stats"
+    # Truncated string expectation mismatch
+    "test_truncated_compare"
+    # AssertionError: assert [('specializa..., 'Ancestor')] == [('aggregatio..., 'Ancestor')]
+    "test_functional_relation_extraction"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_parallel_execution"
+    "test_py3k_jobs_option"
+  ];
+
+  meta = with lib; {
+    homepage = "https://pylint.readthedocs.io/en/stable/";
+    description = "A bug and style checker for Python";
+    longDescription = ''
+      Pylint is a Python static code analysis tool which looks for programming errors,
+      helps enforcing a coding standard, sniffs for code smells and offers simple
+      refactoring suggestions.
+      Pylint is shipped with following additional commands:
+      - pyreverse: an UML diagram generator
+      - symilar: an independent similarities checker
+      - epylint: Emacs and Flymake compatible Pylint
+    '';
+    license = licenses.gpl1Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylion/default.nix b/nixpkgs/pkgs/development/python-modules/pylion/default.nix
new file mode 100644
index 000000000000..10cfd173b66d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylion/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromBitbucket
+, h5py
+, termcolor
+, pexpect
+, jinja2
+, sphinxHook
+, sphinx-rtd-theme
+}:
+
+buildPythonPackage {
+  pname = "pylion";
+  version = "0.5.3";
+  format = "setuptools";
+
+  src = fetchFromBitbucket {
+    owner = "dtrypogeorgos";
+    repo = "pylion";
+    # Version is set in setup.cfg, but not in a git tag / bitbucket release
+    rev = "3e6b96b542b97107c622d66b0be0551c3bd9f948";
+    hash = "sha256-c0UOv2Vlv9wJ6YW+QdHinhpdaclUh3As5TDvyoRhpSI=";
+  };
+
+  # Docs are not available online, besides the article:
+  # http://dx.doi.org/10.1016/j.cpc.2020.107187
+  nativeBuildInputs = [
+    sphinxHook
+    sphinx-rtd-theme
+  ];
+
+  propagatedBuildInputs = [
+    h5py
+    termcolor
+    pexpect
+    jinja2
+  ];
+
+  pythonImportsCheck = [ "pylion" ];
+
+  # Tests fail from some reason - some files seem to be missing from the repo.
+  doCheck = false;
+
+  postInstall = ''
+    mkdir -p $out/share/doc/$name
+    cp -r examples $out/share/doc/$name/examples
+  '';
+
+  meta = with lib; {
+    description = "A LAMMPS wrapper for molecular dynamics simulations of trapped ions";
+    homepage = "https://bitbucket.org/dtrypogeorgos/pylion";
+    license = licenses.mit;
+    maintainers = with maintainers; [ doronbehar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylitterbot/default.nix b/nixpkgs/pkgs/development/python-modules/pylitterbot/default.nix
new file mode 100644
index 000000000000..65a519f0bdff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylitterbot/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, poetry-dynamic-versioning
+, pyjwt
+, pytest-aiohttp
+, pytest-freezegun
+, pytestCheckHook
+, pythonOlder
+, deepdiff
+}:
+
+buildPythonPackage rec {
+  pname = "pylitterbot";
+  version = "2023.4.9";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "natekspencer";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-QsxzwmAdhx0diPJ/bT+DgJSs70YQ77M76rq2opMq/Ew=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    poetry-dynamic-versioning
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    deepdiff
+    pyjwt
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytest-aiohttp
+    pytest-freezegun
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pylitterbot"
+  ];
+
+  meta = with lib; {
+    description = "Modulefor controlling a Litter-Robot";
+    homepage = "https://github.com/natekspencer/pylitterbot";
+    changelog = "https://github.com/natekspencer/pylitterbot/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylnk3/default.nix b/nixpkgs/pkgs/development/python-modules/pylnk3/default.nix
new file mode 100644
index 000000000000..ed50da8b0777
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylnk3/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, twine
+, invoke
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pylnk3";
+  version = "0.4.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "pylnk3";
+    hash = "sha256-yu4BNvYai3iBVNyOfAOsLd5XrcFw8cR4arRyFJHKbpk=";
+  };
+
+   propagatedBuildInputs = [
+     pytest
+     invoke
+  ];
+  # There are no tests in pylnk3.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pylnk3"
+  ];
+
+  meta = with lib; {
+    description = "Python library for reading and writing Windows shortcut files (.lnk)";
+    homepage = "https://github.com/strayge/pylnk";
+    license = with licenses; [ lgpl3Only ];
+    maintainers = with maintainers; [ fedx-sudo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylpsd/default.nix b/nixpkgs/pkgs/development/python-modules/pylpsd/default.nix
new file mode 100644
index 000000000000..b74a7e65aa15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylpsd/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, numpy
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "pylpsd";
+  version = "0.1.4";
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-evPL9vF75S8ATkFwzQjh4pLI/aXGXWwoypCb24nXAN8=";
+  };
+
+  # Tests fail and there are none
+  doCheck = false;
+  pythonImportsCheck = [
+    "pylpsd"
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of the LPSD algorithm for computing power spectral density with logarithmically spaced points.";
+    homepage = "https://github.com/bleykauf/py-lpsd";
+    license = licenses.mit;
+    maintainers = with maintainers; [ doronbehar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylru/default.nix b/nixpkgs/pkgs/development/python-modules/pylru/default.nix
new file mode 100644
index 000000000000..a83f2fd3ad14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylru/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pylru";
+  version = "1.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jlhutch";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-dTYiD+/zt0ZSP+sefYyeD87To1nRXyoFodlBg8pm1YE=";
+  };
+
+  # Check with the next release if tests are ready
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pylru"
+  ];
+
+  meta = with lib; {
+    description = "A least recently used (LRU) cache implementation";
+    homepage = "https://github.com/jlhutch/pylru";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyls-flake8/default.nix b/nixpkgs/pkgs/development/python-modules/pyls-flake8/default.nix
new file mode 100644
index 000000000000..113cf8f24e1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyls-flake8/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flake8
+, python-lsp-server
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyls-flake8";
+  version = "0.4.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "emanspeaks";
+    repo = "pyls-flake8";
+    rev = "v{version}";
+    sha256 = "14wkmwh8mqr826vdzxhvhdwrnx2akzmnbv3ar391qs4imwqfjx3l";
+  };
+
+  propagatedBuildInputs = [ flake8 python-lsp-server ];
+
+  meta = with lib; {
+    homepage = "https://github.com/emanspeaks/pyls-flake8";
+    description = "A Flake8 plugin for the Python LSP Server.";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyls-isort/default.nix b/nixpkgs/pkgs/development/python-modules/pyls-isort/default.nix
new file mode 100644
index 000000000000..8ec10735cadc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyls-isort/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, python-lsp-server, isort
+}:
+
+buildPythonPackage rec {
+  pname = "pyls-isort";
+  version = "0.2.2";
+
+  src = fetchFromGitHub {
+    owner = "paradoxxxzero";
+    repo = "pyls-isort";
+    rev = "v${version}";
+    sha256 = "0xba0aiyjfdi9swjzxk26l94dwlwvn17kkfjfscxl8gvspzsn057";
+  };
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "pyls_isort" ];
+
+  propagatedBuildInputs = [
+    isort python-lsp-server
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/paradoxxxzero/pyls-isort";
+    description = "Isort plugin for python-lsp-server";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyls-memestra/default.nix b/nixpkgs/pkgs/development/python-modules/pyls-memestra/default.nix
new file mode 100644
index 000000000000..62ae057613a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyls-memestra/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, deprecated
+, memestra
+, python-lsp-server
+}:
+
+buildPythonPackage rec {
+  pname = "pyls-memestra";
+  version = "0.0.16";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zMVDd2uB4znw38z3yb0Nt7qQH5dGHTbQBIZO/qo1/t8=";
+  };
+
+  propagatedBuildInputs = [
+    deprecated
+    memestra
+    python-lsp-server
+  ];
+
+  # Tests fail because they rely on writting to read-only files
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyls_memestra"
+  ];
+
+  meta = with lib; {
+    description = "Memestra plugin for the Python Language Server";
+    homepage = "https://github.com/QuantStack/pyls-memestra";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyls-spyder/default.nix b/nixpkgs/pkgs/development/python-modules/pyls-spyder/default.nix
new file mode 100644
index 000000000000..509df2efaf79
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyls-spyder/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python-lsp-server
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyls-spyder";
+  version = "0.4.0";
+
+  src = fetchFromGitHub {
+    owner = "spyder-ide";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "11ajbsia60d4c9s6m6rbvaqp1d69fcdbq6a98lkzkkzv2b9pdhkk";
+  };
+
+  propagatedBuildInputs = [
+    python-lsp-server
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pyls_spyder" ];
+
+  meta = with lib; {
+    description = "Spyder extensions for the python-language-server";
+    homepage = "https://github.com/spyder-ide/pyls-spyder";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylsp-mypy/default.nix b/nixpkgs/pkgs/development/python-modules/pylsp-mypy/default.nix
new file mode 100644
index 000000000000..3a5879633114
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylsp-mypy/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, setuptools
+, mypy
+, pytestCheckHook
+, python-lsp-server
+, pythonOlder
+, tomli
+}:
+
+buildPythonPackage rec {
+  pname = "pylsp-mypy";
+  version = "0.6.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "python-lsp";
+    repo = "pylsp-mypy";
+    rev = "refs/tags/${version}";
+    hash = "sha256-ZsNIw0xjxnU9Ue0C7TlhzVOCOCKEbCa2CsiiqeMb14I=";
+  };
+
+  patches = [
+    # https://github.com/python-lsp/pylsp-mypy/pull/64
+    (fetchpatch {
+      name = "fix-hanging-test.patch";
+      url = "https://github.com/python-lsp/pylsp-mypy/commit/90d28edb474135007804f1e041f88713a95736f9.patch";
+      hash = "sha256-3DVyUXVImRemXCuyoXlYbPJm6p8OnhBdEKmwjx88ets=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    mypy
+    python-lsp-server
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pylsp_mypy"
+  ];
+
+  disabledTests = [
+    # Tests wants to call dmypy
+    "test_option_overrides_dmypy"
+  ];
+
+  meta = with lib; {
+    description = "Mypy plugin for the Python LSP Server";
+    homepage = "https://github.com/python-lsp/pylsp-mypy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylsp-rope/default.nix b/nixpkgs/pkgs/development/python-modules/pylsp-rope/default.nix
new file mode 100644
index 000000000000..1199f40eaeec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylsp-rope/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, rope
+, pytestCheckHook
+, python-lsp-server
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pylsp-rope";
+  version = "0.1.11";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-SKrfmT2vpej8oRCLSlQxMUz4C8eM/91WQA6tnEB1U74=";
+  };
+
+  propagatedBuildInputs = [
+    rope
+    python-lsp-server
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pylsp_rope"
+  ];
+
+  meta = with lib; {
+    description = "Extended refactoring capabilities for Python LSP Server using Rope";
+    homepage = "https://github.com/python-rope/pylsp-rope";
+    license = licenses.mit;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylsqpack/default.nix b/nixpkgs/pkgs/development/python-modules/pylsqpack/default.nix
new file mode 100644
index 000000000000..3c2eba13d2b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylsqpack/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pylsqpack";
+  version = "0.3.17";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-LyB3jblW3H5LGop5ci1XpGUMRZl/tlwTUsv4XreqPOI=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "pylsqpack" ];
+
+  meta = with lib; {
+    description = "Python wrapper for the ls-qpack QPACK library";
+    homepage = "https://github.com/aiortc/pylsqpack";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylti/default.nix b/nixpkgs/pkgs/development/python-modules/pylti/default.nix
new file mode 100644
index 000000000000..69e4af22ccf1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylti/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, httplib2
+, oauth
+, oauth2
+, semantic-version
+, flask
+, httpretty
+, oauthlib
+, pyflakes
+, pytest
+, pytestcache
+, pytest-cov
+, covCore
+, pytest-flakes
+, sphinx
+, mock
+, chalice
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "pylti";
+  version = "0.7.0";
+
+  disabled = !isPy27;
+
+  # There is no need to fix mock. https://github.com/mitodl/pylti/pull/48
+  postPatch = ''
+    substituteInPlace setup.py --replace "mock==1.0.1" "mock"
+  '';
+
+  propagatedBuildInputs = [ httplib2 oauth oauth2 semantic-version ];
+  nativeCheckInputs = [
+    flask httpretty oauthlib pyflakes pytest pytestcache pytest-cov covCore
+    pytest-flakes sphinx mock chalice
+  ];
+
+  src = fetchPypi {
+    pname = "PyLTI";
+    inherit version;
+    sha256 = "80938a235b1ab390f6889a95237d087ea7adde5cc50fcae9c80c49898e8ee78e";
+  };
+
+  meta = {
+    description = "Implementation of IMS LTI interface that works with edX";
+    homepage = "https://github.com/mitodl/pylti";
+    license = lib.licenses.bsdOriginal;
+    maintainers = with lib.maintainers; [ layus ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylutron-caseta/default.nix b/nixpkgs/pkgs/development/python-modules/pylutron-caseta/default.nix
new file mode 100644
index 000000000000..e069e902687f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylutron-caseta/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pylutron-caseta";
+  version = "0.18.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "gurumitts";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-tjmMu7LUne+hLLTXGqHhci9/PZiuQ10mQaARvL2sdIM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-timeout
+    pytestCheckHook
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    async-timeout
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=auto"
+  ];
+
+  pythonImportsCheck = [
+    "pylutron_caseta"
+  ];
+
+  meta = with lib; {
+    description = "Python module o control Lutron Caseta devices";
+    homepage = "https://github.com/gurumitts/pylutron-caseta";
+    changelog = "https://github.com/gurumitts/pylutron-caseta/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylutron/default.nix b/nixpkgs/pkgs/development/python-modules/pylutron/default.nix
new file mode 100644
index 000000000000..dfcc0a05798d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylutron/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pylutron";
+  version = "0.2.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-DKwjBQXC7O/8bFxq5shJJxRV3HYgBeS7tJXg4m3vQMY=";
+  };
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "pylutron" ];
+
+  meta = with lib; {
+    description = "Python library for controlling a Lutron RadioRA 2 system";
+    homepage = "https://github.com/thecynic/pylutron";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylxd/default.nix b/nixpkgs/pkgs/development/python-modules/pylxd/default.nix
new file mode 100644
index 000000000000..bde5935d563e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylxd/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cryptography
+, python-dateutil
+, requests
+, requests-toolbelt
+, requests-unixsocket
+, ws4py
+, ddt
+, mock-services
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pylxd";
+  version = "2.3.1";
+
+  src = fetchFromGitHub {
+    owner = "lxc";
+    repo = "pylxd";
+    rev = version;
+    hash = "sha256-eDRCJYjmBndMnSNuS6HD/2p/KhzqJq2qPAzMk7kC5UM=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    python-dateutil
+    requests
+    requests-toolbelt
+    requests-unixsocket
+    ws4py
+  ];
+
+  nativeCheckInputs = [
+    ddt
+    mock-services
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    "integration"
+    "migration"
+  ];
+
+  pythonImportsCheck = [ "pylxd" ];
+
+  meta = with lib; {
+    description = "A Python library for interacting with the LXD REST API";
+    homepage = "https://pylxd.readthedocs.io/en/latest/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylyrics/default.nix b/nixpkgs/pkgs/development/python-modules/pylyrics/default.nix
new file mode 100644
index 000000000000..a3e651e17766
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylyrics/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi, beautifulsoup4, requests }:
+
+buildPythonPackage rec {
+  pname = "pylyrics";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    pname = "PyLyrics";
+    inherit version;
+    extension = "zip";
+    hash = "sha256-xfNujvDtO0h6kkLONMGfloTkGKW7/9XTZ9wdFgS0zQs=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    requests
+  ];
+
+  pythonImportsCheck = [ "PyLyrics" ];
+
+  # tries to connect to lyrics.wikia.com
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A Pythonic Implementation of lyrics.wikia.com for getting lyrics of songs ";
+    homepage = "https://github.com/geekpradd/PyLyrics";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pylzma/default.nix b/nixpkgs/pkgs/development/python-modules/pylzma/default.nix
new file mode 100644
index 000000000000..78bc24d35d46
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pylzma/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "pylzma";
+  version = "0.5.0";
+
+  # This vendors an old LZMA SDK
+  # After some discussion, it seemed most reasonable to keep it that way
+  # xz, and uefi-firmware-parser also does this
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "074anvhyjgsv2iby2ql1ixfvjgmhnvcwjbdz8gk70xzkzcm1fx5q";
+  };
+
+  pythonImportsCheck = [ "pylzma" ];
+
+  meta = with lib; {
+    homepage = "https://www.joachim-bauch.de/projects/pylzma/";
+    description = "Platform independent python bindings for the LZMA compression library";
+    license = licenses.lgpl21Only;
+    maintainers = with maintainers; [ dandellion ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymacaroons/default.nix b/nixpkgs/pkgs/development/python-modules/pymacaroons/default.nix
new file mode 100644
index 000000000000..c9ffcc0a0702
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymacaroons/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, six, pynacl }:
+
+buildPythonPackage rec {
+  pname = "pymacaroons";
+  version = "0.13.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1e6bba42a5f66c245adf38a5a4006a99dcc06a0703786ea636098667d42903b8";
+  };
+
+  propagatedBuildInputs = [
+    six
+    pynacl
+  ];
+
+  # Tests require an old version of hypothesis
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Macaroon library for Python";
+    homepage = "https://github.com/ecordell/pymacaroons";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymailgunner/default.nix b/nixpkgs/pkgs/development/python-modules/pymailgunner/default.nix
new file mode 100644
index 000000000000..6b1b03cebf34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymailgunner/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pymailgunner";
+  version = "1.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pschmitt";
+    repo = pname;
+    rev = version;
+    hash = "sha256-QKwpW1aeN6OI76Kocow1Zhghq4/fl/cMPexny0MTwQs=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pymailgunner"
+  ];
+
+  meta = with lib; {
+    description = "Library for interacting with Mailgun e-mail service";
+    homepage = "https://github.com/pschmitt/pymailgunner";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymanopt/default.nix b/nixpkgs/pkgs/development/python-modules/pymanopt/default.nix
new file mode 100644
index 000000000000..d6fbdacf4650
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymanopt/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, numpy
+, scipy
+, torch
+, autograd
+, matplotlib
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pymanopt";
+  version = "2.2.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-pDFRYhswcuAHG9pcqvzXIy3Ivhxe5R5Ric7AFRh7MK4=";
+  };
+
+  propagatedBuildInputs = [ numpy scipy torch ];
+  nativeCheckInputs = [ autograd matplotlib pytestCheckHook ];
+
+  preCheck = ''
+    substituteInPlace "tests/conftest.py" \
+      --replace "import tensorflow as tf" ""
+    substituteInPlace "tests/conftest.py" \
+      --replace "tf.random.set_seed(seed)" ""
+  '';
+
+  disabledTestPaths = [
+    "tests/test_examples.py"
+    "tests/backends/test_tensorflow.py"
+    "tests/test_problem.py"
+  ];
+
+  pythonImportsCheck = [ "pymanopt" ];
+
+  meta = {
+    description = "Python toolbox for optimization on Riemannian manifolds with support for automatic differentiation";
+    homepage = "https://www.pymanopt.org/";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ yl3dy ];
+    broken = lib.versionAtLeast scipy.version "1.10.0";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymarshal/default.nix b/nixpkgs/pkgs/development/python-modules/pymarshal/default.nix
new file mode 100644
index 000000000000..57a806c60b4e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymarshal/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, bson
+, pytestCheckHook
+, pyyaml
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pymarshal";
+  version = "2.2.0";
+  disabled = pythonOlder "3.0";
+
+  src = fetchFromGitHub {
+    owner = "stargateaudio";
+    repo = pname;
+    rev = version;
+    hash = "sha256-Ds8JV2mtLRcKXBvPs84Hdj3MxxqpeV5muKCSlAFCj1A=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'" ""
+    substituteInPlace setup.cfg \
+      --replace "--cov=pymarshal --cov-report=html --cov-report=term" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    bson
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    bson
+    pyyaml
+  ];
+
+  pytestFlagsArray = [ "test" ];
+
+  meta = {
+    description = "Python data serialization library";
+    homepage = "https://github.com/stargateaudio/pymarshal";
+    maintainers = with lib.maintainers; [ yuu ];
+    license = lib.licenses.bsd2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymata-express/default.nix b/nixpkgs/pkgs/development/python-modules/pymata-express/default.nix
new file mode 100644
index 000000000000..a4306fb4ed82
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymata-express/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pymata-express";
+  version = "1.21";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "MrYsLab";
+    repo = pname;
+    rev = version;
+    sha256 = "1mibyn84kjahrv3kn51yl5mhkyig4piv6wanggzjflh5nm96bhy8";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "pymata_express" ];
+
+  meta = with lib; {
+    description = "Python Asyncio Arduino Firmata Client";
+    longDescription = ''
+      Pymata-Express is a Python Firmata Protocol client. When used in conjunction
+      with an Arduino Firmata sketch, it permits you to control and monitor Arduino
+      hardware remotely over a serial link.
+    '';
+    homepage = "https://mryslab.github.io/pymata-express/";
+    license = with licenses; [ agpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymatgen/default.nix b/nixpkgs/pkgs/development/python-modules/pymatgen/default.nix
new file mode 100644
index 000000000000..545310ec0ade
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymatgen/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, glibcLocales
+, matplotlib
+, monty
+, networkx
+, numpy
+, palettable
+, pandas
+, plotly
+, pybtex
+, pydispatcher
+, pythonOlder
+, requests
+, ruamel-yaml
+, scipy
+, spglib
+, sympy
+, tabulate
+, uncertainties
+}:
+
+buildPythonPackage rec {
+  pname = "pymatgen";
+  version = "2022.3.29";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "materialsproject";
+    repo = "pymatgen";
+    rev= "v${version}";
+    hash = "sha256-B2piRWx9TfKlGTPOAAGsq2GxyfHIRBVFpk6dxES0WF0=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    glibcLocales
+  ];
+
+  propagatedBuildInputs = [
+    matplotlib
+    monty
+    networkx
+    numpy
+    palettable
+    pandas
+    plotly
+    pybtex
+    pydispatcher
+    requests
+    ruamel-yaml
+    scipy
+    spglib
+    sympy
+    tabulate
+    uncertainties
+  ];
+
+  # Tests are not detected by pytest
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pymatgen"
+  ];
+
+  meta = with lib; {
+    description = "A robust materials analysis code that defines core object representations for structures and molecules";
+    homepage = "https://pymatgen.org/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymatting/01-kdtree-signature.patch b/nixpkgs/pkgs/development/python-modules/pymatting/01-kdtree-signature.patch
new file mode 100644
index 000000000000..2193b260aea1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymatting/01-kdtree-signature.patch
@@ -0,0 +1,13 @@
+diff --git a/tests/test_kdtree.py b/tests/test_kdtree.py
+index 0110083..049fa07 100644
+--- a/tests/test_kdtree.py
++++ b/tests/test_kdtree.py
+@@ -23,7 +23,7 @@ def run_kdtree():
+ 
+     tree = cKDTree(data_points)
+ 
+-    distances2, indices2 = tree.query(query_points, k=k, n_jobs=-1)
++    distances2, indices2 = tree.query(query_points, k=k)
+ 
+     t2 = time.perf_counter()
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/pymatting/default.nix b/nixpkgs/pkgs/development/python-modules/pymatting/default.nix
new file mode 100644
index 000000000000..0d10efd616a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymatting/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numba
+, numpy
+, pillow
+, scipy
+, pytestCheckHook
+,
+}:
+buildPythonPackage rec {
+  pname = "pymatting";
+  version = "1.1.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "pymatting";
+    repo = "pymatting";
+    rev = "v${version}";
+    hash = "sha256-9eRpsWwXAkp6aw1ZWJsUFf0BMIN0UBFc2rW1lltL2cw=";
+  };
+
+  patches = [ ./01-kdtree-signature.patch ];
+
+  propagatedBuildInputs = [
+    numba
+    numpy
+    pillow
+    scipy
+  ];
+
+  pythonImportsCheck = [ "pymatting" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # no access to input data set
+    # see: https://github.com/pymatting/pymatting/blob/master/tests/download_images.py
+    "test_alpha"
+    "test_laplacians"
+    "test_preconditioners"
+    "test_lkm"
+  ];
+
+  meta = with lib; {
+    description = "A Python library for alpha matting";
+    homepage = "https://github.com/pymatting/pymatting";
+    changelog = "https://github.com/pymatting/pymatting/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ blaggacao ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/pymaven-patch/default.nix b/nixpkgs/pkgs/development/python-modules/pymaven-patch/default.nix
new file mode 100644
index 000000000000..602399b2d024
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymaven-patch/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pbr
+, requests
+, six
+, lxml
+, pytestCheckHook
+, pytest-cov
+, mock
+}:
+buildPythonPackage rec {
+  pname = "pymaven-patch";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d55b29bd4aeef3510904a12885eb6856b5bd48f3e29925a123461429f9ad85c0";
+  };
+
+  propagatedBuildInputs = [
+    pbr
+    requests
+    six
+    lxml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-cov
+    mock
+  ];
+
+  pythonImportsCheck = [
+    "pymaven"
+  ];
+
+  meta = with lib; {
+    description = "Python access to maven";
+    homepage = "https://github.com/nexB/pymaven";
+    license = licenses.asl20;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymavlink/default.nix b/nixpkgs/pkgs/development/python-modules/pymavlink/default.nix
new file mode 100644
index 000000000000..374f7d26c9d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymavlink/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, future, lxml }:
+
+buildPythonPackage rec {
+  pname = "pymavlink";
+  version = "2.4.40";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-PWpVKtNEof/54MgRNhrJ2LuCAc9qrK1yJNUW+gN8yzA=";
+  };
+
+  propagatedBuildInputs = [ future lxml ];
+
+  # No tests included in PyPI tarball. We cannot use the GitHub tarball because
+  # we would like to use the same commit of the mavlink messages repo as
+  # included in the PyPI tarball, and there is no easy way to determine what
+  # commit is included.
+  doCheck = false;
+
+  pythonImportsCheck = [ "pymavlink" ];
+
+  meta = with lib; {
+    description = "Python MAVLink interface and utilities";
+    homepage = "https://github.com/ArduPilot/pymavlink";
+    license = with licenses; [ lgpl3Plus mit ];
+    maintainers = with maintainers; [ lopsided98 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymbolic/default.nix b/nixpkgs/pkgs/development/python-modules/pymbolic/default.nix
new file mode 100644
index 000000000000..de9b8e9ae14c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymbolic/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, matchpy
+, pytestCheckHook
+, pythonOlder
+, pytools
+}:
+
+buildPythonPackage rec {
+  pname = "pymbolic";
+  version = "2022.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+Cd2lCuzy3Iyn6Hxqito7AnyN9uReMlc/ckqaup87Ik=";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/inducer/pymbolic/commit/cb3d999e4788dad3edf053387b6064adf8b08e19.patch";
+      excludes = [ ".github/workflows/ci.yml" ];
+      hash = "sha256-P0YjqAo0z0LZMIUTeokwMkfP8vxBXi3TcV4BSFaO1lU=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    pytools
+  ];
+
+  nativeCheckInputs = [
+    matchpy
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # pytest is a test requirement not a run-time one
+      substituteInPlace setup.py \
+        --replace '"pytest>=2.3",' ""
+  '';
+
+  pythonImportsCheck = [
+    "pymbolic"
+  ];
+
+  meta = with lib; {
+    description = "A package for symbolic computation";
+    homepage = "https://documen.tician.de/pymbolic/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymc/default.nix b/nixpkgs/pkgs/development/python-modules/pymc/default.nix
new file mode 100644
index 000000000000..355d8511b6a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymc/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, arviz
+, buildPythonPackage
+, cachetools
+, cloudpickle
+, fastprogress
+, fetchFromGitHub
+, numpy
+, pytensor
+, pythonOlder
+, scipy
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "pymc";
+  version = "5.10.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "pymc-devs";
+    repo = "pymc";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-cjvEP7vkFQKwUPwHw3JWbS8+U8PEaL3c1D2NwV3uLOU=";
+  };
+
+  propagatedBuildInputs = [
+    arviz
+    cachetools
+    cloudpickle
+    fastprogress
+    numpy
+    pytensor
+    scipy
+    typing-extensions
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace ', "pytest-cov"' ""
+  '';
+
+  # The test suite is computationally intensive and test failures are not
+  # indicative for package usability hence tests are disabled by default.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pymc"
+  ];
+
+  meta = with lib; {
+    description = "Bayesian estimation, particularly using Markov chain Monte Carlo (MCMC)";
+    homepage = "https://github.com/pymc-devs/pymc3";
+    changelog = "https://github.com/pymc-devs/pymc/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ nidabdella ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymdown-extensions/default.nix b/nixpkgs/pkgs/development/python-modules/pymdown-extensions/default.nix
new file mode 100644
index 000000000000..f6fea35270e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymdown-extensions/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, pytestCheckHook
+, markdown
+, pyyaml
+, pygments
+
+# for passthru.tests
+, mkdocstrings
+, mkdocs-material
+, mkdocs-mermaid2-plugin
+, hydrus
+}:
+
+let
+  extensions = [
+    "arithmatex"
+    "b64"
+    "betterem"
+    "caret"
+    "critic"
+    "details"
+    "emoji"
+    "escapeall"
+    "extra"
+    "highlight"
+    "inlinehilite"
+    "keys"
+    "magiclink"
+    "mark"
+    "pathconverter"
+    "progressbar"
+    "saneheaders"
+    "smartsymbols"
+    "snippets"
+    "striphtml"
+    "superfences"
+    "tabbed"
+    "tasklist"
+    "tilde"
+  ];
+in
+buildPythonPackage rec {
+  pname = "pymdown-extensions";
+  version = "10.3";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "facelessuser";
+    repo = "pymdown-extensions";
+    rev = "refs/tags/${version}";
+    hash = "sha256-R35R2dHfjcVQbEa2319FEMjPGl1Y5/u2KEHeR0wTYEo=";
+  };
+
+  nativeBuildInputs = [ hatchling ];
+
+  propagatedBuildInputs = [ markdown pygments ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pyyaml
+  ];
+
+  pythonImportsCheck = map (ext: "pymdownx.${ext}") extensions;
+
+  passthru.tests = {
+    inherit mkdocstrings mkdocs-material mkdocs-mermaid2-plugin hydrus;
+  };
+
+  meta = with lib; {
+    description = "Extensions for Python Markdown";
+    homepage = "https://facelessuser.github.io/pymdown-extensions/";
+    license = with licenses; [ mit bsd2 ];
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymdstat/default.nix b/nixpkgs/pkgs/development/python-modules/pymdstat/default.nix
new file mode 100644
index 000000000000..54c209697861
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymdstat/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "pymdstat";
+  version = "0.4.2";
+
+  src = fetchFromGitHub {
+    owner = "nicolargo";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "01hj8vyd9f7610sqvzphpr033rvnazbwvl11gi18ia3yqlnlncp0";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} $src/unitest.py
+  '';
+
+  pythonImportsCheck = [ "pymdstat" ];
+
+  meta = with lib; {
+    description = "A pythonic library to parse Linux /proc/mdstat file";
+    homepage = "https://github.com/nicolargo/pymdstat";
+    maintainers = with maintainers; [ rhoriguchi ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymediainfo/default.nix b/nixpkgs/pkgs/development/python-modules/pymediainfo/default.nix
new file mode 100644
index 000000000000..c65e6d0e1487
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymediainfo/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, stdenv
+, fetchPypi
+, buildPythonPackage
+, libmediainfo
+, setuptools-scm
+, pytest
+, glibcLocales
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pymediainfo";
+  version = "6.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GGoLQalFJPCYTQhcprlFx5olRGW3CX8lYNwMBOjR2KU=";
+  };
+
+  postPatch = ''
+    substituteInPlace pymediainfo/__init__.py \
+      --replace "libmediainfo.0.dylib" \
+                "${libmediainfo}/lib/libmediainfo.0${stdenv.hostPlatform.extensions.sharedLibrary}" \
+      --replace "libmediainfo.dylib" \
+                "${libmediainfo}/lib/libmediainfo${stdenv.hostPlatform.extensions.sharedLibrary}" \
+      --replace "libmediainfo.so.0" \
+                "${libmediainfo}/lib/libmediainfo${stdenv.hostPlatform.extensions.sharedLibrary}.0"
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    glibcLocales
+    pytest
+  ];
+
+  checkPhase = ''
+    export LC_ALL=en_US.UTF-8
+    py.test -k 'not test_parse_url' tests
+  '';
+
+  pythonImportsCheck = [
+    "pymediainfo"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for the mediainfo library";
+    homepage = "https://github.com/sbraz/pymediainfo";
+    changelog = "https://github.com/sbraz/pymediainfo/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymediaroom/default.nix b/nixpkgs/pkgs/development/python-modules/pymediaroom/default.nix
new file mode 100644
index 000000000000..364063f78628
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymediaroom/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "pymediaroom";
+  version = "0.6.5.4";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-CZh2knpLT7xt5s6+kTQ4Mq9LcpKgWvgdFCkPtMucJTM=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+    xmltodict
+  ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "pymediaroom" ];
+
+  meta = with lib; {
+    description = "Python Remote Control for Mediaroom STB";
+    homepage = "https://github.com/dgomes/pymediaroom";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymedio/default.nix b/nixpkgs/pkgs/development/python-modules/pymedio/default.nix
new file mode 100644
index 000000000000..36673b071e61
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymedio/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, cryptography
+, nibabel
+, numpy
+, pydicom
+, simpleitk
+}:
+
+buildPythonPackage rec {
+  pname = "pymedio";
+  version = "0.2.14";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "jcreinhold";
+    repo = "pymedio";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-x3CHoWASDrUoCXfj73NF+0Y/3Mb31dK2Lh+o4OD9ryk=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    cryptography
+    nibabel
+    pydicom
+    simpleitk
+  ];
+
+  pythonImportsCheck = [
+    "pymedio"
+  ];
+
+  meta = with lib; {
+    description = "Read medical image files into Numpy arrays";
+    homepage = "https://github.com/jcreinhold/pymedio";
+    changelog = "https://github.com/jcreinhold/pymedio/blob/v${version}/HISTORY.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymeeus/default.nix b/nixpkgs/pkgs/development/python-modules/pymeeus/default.nix
new file mode 100644
index 000000000000..92451d351a91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymeeus/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, pytest }:
+
+buildPythonPackage rec {
+  pname = "PyMeeus";
+  version = "0.5.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VI9xhr2LlsvAac9kmo6ON33OSax0SGcJhJ/mOpnK1oQ=";
+  };
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    pytest .
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/architest/pymeeus";
+    description = "Library of astronomical algorithms";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymelcloud/default.nix b/nixpkgs/pkgs/development/python-modules/pymelcloud/default.nix
new file mode 100644
index 000000000000..ad4e529c528a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymelcloud/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, aiohttp
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pymelcloud";
+  version = "2.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "vilppuvuorinen";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1q6ny58cn9qy86blxbk6l2iklab7y11b734l7yb1bp35dmy27w26";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  doCheck = pythonOlder "3.11"; # asynctest is unsupported on python3.11
+
+  nativeCheckInputs = [
+    asynctest
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pymelcloud"
+  ];
+
+  meta = with lib; {
+    description = "Python module for interacting with MELCloud";
+    homepage = "https://github.com/vilppuvuorinen/pymelcloud";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymemcache/default.nix b/nixpkgs/pkgs/development/python-modules/pymemcache/default.nix
new file mode 100644
index 000000000000..68925fe7f4a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymemcache/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, faker
+, fetchFromGitHub
+, mock
+, six
+, pytestCheckHook
+, pythonOlder
+, zstd
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "pymemcache";
+  version = "4.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pinterest";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-WgtHhp7lE6StoOBfSy9+v3ODe/+zUC7lGrc2S4M68+M=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    faker
+    mock
+    pytestCheckHook
+    zstd
+  ];
+
+  postPatch = ''
+    sed -i "/--cov/d" setup.cfg
+  '';
+
+  disabledTests = [
+    # python-memcached is not available (last release in 2017)
+    "TestClientSocketConnect"
+  ] ++ lib.optionals stdenv.is32bit [
+    # test_compressed_complex is broken on 32-bit platforms
+    # this can be removed on the next version bump
+    # see also https://github.com/pinterest/pymemcache/pull/480
+    "test_compressed_complex"
+  ];
+
+  pythonImportsCheck = [
+    "pymemcache"
+  ];
+
+  meta = with lib; {
+    description = "Python memcached client";
+    homepage = "https://pymemcache.readthedocs.io/";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymemoize/default.nix b/nixpkgs/pkgs/development/python-modules/pymemoize/default.nix
new file mode 100644
index 000000000000..9fdb8bbc2651
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymemoize/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, django
+}:
+
+buildPythonPackage rec {
+  pname = "pymemoize";
+  version = "1.0.3";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "PyMemoize";
+    sha256 = "0yqr60hm700zph6nv8wb6yp2s0i08mahxvw98bvkmw5ijbsviiq7";
+  };
+
+  nativeCheckInputs = [ django ];
+
+  # django.core.exceptions.ImproperlyConfigured: Requested settings, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Simple Python cache and memoizing module";
+    homepage = "https://github.com/mikeboers/PyMemoize";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ mmai ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/pyment/default.nix b/nixpkgs/pkgs/development/python-modules/pyment/default.nix
new file mode 100644
index 000000000000..fbf2c93fde60
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyment/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "pyment";
+  version = "0.3.3";
+
+  src = fetchPypi {
+    pname = "Pyment";
+    inherit version;
+    sha256 = "951a4c52d6791ccec55bc739811169eed69917d3874f5fe722866623a697f39d";
+  };
+
+  # Tests are not included in PyPI tarball
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/dadadel/pyment";
+    description = "Create, update or convert docstrings in existing Python files, managing several styles";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ jethro ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymeta3/default.nix b/nixpkgs/pkgs/development/python-modules/pymeta3/default.nix
new file mode 100644
index 000000000000..f0350c4153b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymeta3/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+}:
+buildPythonPackage rec {
+  pname = "pymeta3";
+  version = "0.5.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "PyMeta3";
+    hash = "sha256-GL2jJtmpu/WHv8DuC8loZJZNeLBnKIvPVdTZhoHQW8s=";
+  };
+
+  doCheck = false; # Tests do not support Python3
+
+  pythonImportsCheck = [
+    "pymeta"
+  ];
+
+  meta = with lib; {
+    description = "Pattern-matching language based on OMeta for Python 3 and 2";
+    homepage = "https://github.com/wbond/pymeta3";
+    changelog = "https://github.com/wbond/pymeta3/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jfly matusf ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymetar/default.nix b/nixpkgs/pkgs/development/python-modules/pymetar/default.nix
new file mode 100644
index 000000000000..7742a8890455
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymetar/default.nix
@@ -0,0 +1,30 @@
+{ lib, python, buildPythonPackage, isPy3k, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "pymetar";
+  version = "1.4";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "48dbe6c4929961021cb61e49bb9e0605b54c4b61b9fb9ade51076705a08ecd54";
+  };
+
+  checkPhase = ''
+    cd testing/smoketest
+    tar xzf reports.tgz
+    mkdir logs
+    patchShebangs runtests.sh
+    substituteInPlace runtests.sh --replace "break" "exit 1"  # fail properly
+    export PYTHONPATH="$PYTHONPATH:$out/${python.sitePackages}"
+    ./runtests.sh
+  '';
+
+  meta = with lib; {
+    description = "A command-line tool to show the weather report by a given station ID";
+    homepage = "https://github.com/klausman/pymetar";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ erosennin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymeteireann/default.nix b/nixpkgs/pkgs/development/python-modules/pymeteireann/default.nix
new file mode 100644
index 000000000000..711392b4a30f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymeteireann/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pytz
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "pymeteireann";
+  version = "2021.8.0";
+
+  src = fetchFromGitHub {
+    owner = "DylanGore";
+    repo = "PyMetEireann";
+    rev = version;
+    sha256 = "1xcfb3f2a2q99i8anpdzq8s743jgkk2a3rpar48b2dhs7l15rbsd";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    pytz
+    xmltodict
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "meteireann" ];
+
+  meta = with lib; {
+    description = "Python module to communicate with the Met Éireann Public Weather Forecast API";
+    homepage = "https://github.com/DylanGore/PyMetEireann/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymeteoclimatic/default.nix b/nixpkgs/pkgs/development/python-modules/pymeteoclimatic/default.nix
new file mode 100644
index 000000000000..463acc3f9d95
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymeteoclimatic/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, fetchFromGitHub
+, lxml
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pymeteoclimatic";
+  version = "0.0.6";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "adrianmo";
+    repo = pname;
+    rev = version;
+    sha256 = "0ys0d6jy7416gbsd0pqgvm5ygzn36pjdaklqi4q56vsb13zn7y0h";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    lxml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "meteoclimatic" ];
+
+  meta = with lib; {
+    description = "Python wrapper around the Meteoclimatic service";
+    homepage = "https://github.com/adrianmo/pymeteoclimatic";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymetno/default.nix b/nixpkgs/pkgs/development/python-modules/pymetno/default.nix
new file mode 100644
index 000000000000..4e16030d9575
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymetno/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, async-timeout
+, xmltodict
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pymetno";
+  version = "0.12.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "PyMetno";
+    rev = "refs/tags/${version}";
+    hash = "sha256-wRSUIaonjjucLM+A4GsF9Lrq2vZYCquEvblbmjKYpQE=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    xmltodict
+  ];
+
+  pythonImportsCheck = [
+    "metno"
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A library to communicate with the met.no API";
+    homepage = "https://github.com/Danielhiversen/pyMetno/";
+    changelog = "https://github.com/Danielhiversen/pyMetno/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ flyfloh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymfy/default.nix b/nixpkgs/pkgs/development/python-modules/pymfy/default.nix
new file mode 100644
index 000000000000..5600db81b1d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymfy/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpretty
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-oauthlib
+}:
+
+buildPythonPackage rec {
+  pname = "pymfy";
+  version = "0.11.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tetienne";
+    repo = "somfy-open-api";
+    rev = "v${version}";
+    sha256 = "0wpjwjmywfyqgwvfa5kwcjpaljc32qa088kk88nl9nqdvc31mzhv";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    requests-oauthlib
+  ];
+
+  nativeCheckInputs = [
+    httpretty
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pymfy"
+  ];
+
+  meta = with lib; {
+    description = "Python client for the Somfy Open API";
+    homepage = "https://github.com/tetienne/somfy-open-api";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymicrobot/default.nix b/nixpkgs/pkgs/development/python-modules/pymicrobot/default.nix
new file mode 100644
index 000000000000..7d2a583891fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymicrobot/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, bleak
+, bleak-retry-connector
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pymicrobot";
+  version = "0.0.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    pname = "PyMicroBot";
+    inherit version;
+    hash = "sha256-dhhRHXdck7hJGkXQpkiMulLsnMluZ5ADZ9L8cNm6dFs=";
+  };
+
+  propagatedBuildInputs = [
+    bleak
+    bleak-retry-connector
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "microbot"
+  ];
+
+  meta = with lib; {
+    description = "Library to communicate with MicroBot";
+    homepage = "https://github.com/spycle/pyMicroBot/";
+    changelog = "https://github.com/spycle/pyMicroBot/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymilter/default.nix b/nixpkgs/pkgs/development/python-modules/pymilter/default.nix
new file mode 100644
index 000000000000..0724161bf423
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymilter/default.nix
@@ -0,0 +1,40 @@
+{ lib, python, buildPythonPackage, fetchFromGitHub, libmilter, bsddb3, pydns, iana-etc, libredirect }:
+
+buildPythonPackage rec {
+  pname = "pymilter";
+  version = "1.0.5";
+
+  src = fetchFromGitHub {
+    owner = "sdgathman";
+    repo = pname;
+    rev = "${pname}-${version}";
+    hash = "sha256-gZUWEDVZfDRiOOdG3lpiQldHxm/93l8qYVOHOEpHhzQ=";
+  };
+
+  buildInputs = [ libmilter ];
+  propagatedBuildInputs = [ bsddb3 pydns ];
+
+  preBuild = ''
+    sed -i 's/import thread/import _thread as thread/' Milter/greylist.py
+  '';
+
+  # requires /etc/resolv.conf
+  # testpolicy: requires makemap (#100419)
+  #   using exec -a makemap smtpctl results in "unknown group smtpq"
+  preCheck = ''
+    echo "nameserver 127.0.0.1" > resolv.conf
+    export NIX_REDIRECTS=/etc/protocols=${iana-etc}/etc/protocols:/etc/resolv.conf=$(realpath resolv.conf)
+    export LD_PRELOAD=${libredirect}/lib/libredirect.so
+    sed -i '/testpolicy/d' test.py
+    rm testpolicy.py
+  '';
+
+  pythonImportsCheck = [ "Milter" ];
+
+  meta = with lib; {
+    homepage = "http://bmsi.com/python/milter.html";
+    description = "Python bindings for libmilter api";
+    maintainers = with maintainers; [ yorickvp ];
+    license = licenses.gpl2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymilvus/default.nix b/nixpkgs/pkgs/development/python-modules/pymilvus/default.nix
new file mode 100644
index 000000000000..b1605fac01b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymilvus/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, buildPythonPackage
+, environs
+, fetchFromGitHub
+, gitpython
+, grpcio
+, grpcio-testing
+, mmh3
+, pandas
+, pytestCheckHook
+, python
+, pythonOlder
+, pythonRelaxDepsHook
+, scikit-learn
+, setuptools-scm
+, ujson
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pymilvus";
+  version = "2.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "milvus-io";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-hp00iUT1atyTQk532z7VAajpfvtnKE8W2la9MW7NxoE=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  pythonRelaxDeps = [
+    "grpcio"
+  ];
+
+  nativeBuildInputs = [
+    gitpython
+    pythonRelaxDepsHook
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    environs
+    grpcio
+    mmh3
+    pandas
+    ujson
+  ];
+
+  nativeCheckInputs = [
+    grpcio-testing
+    pytestCheckHook
+    scikit-learn
+  ];
+
+  pythonImportsCheck = [
+    "pymilvus"
+  ];
+
+  disabledTests = [
+    "test_get_commit"
+  ];
+
+  meta = with lib; {
+    description = "Python SDK for Milvus";
+    homepage = "https://github.com/milvus-io/pymilvus";
+    changelog = "https://github.com/milvus-io/pymilvus/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymitv/default.nix b/nixpkgs/pkgs/development/python-modules/pymitv/default.nix
new file mode 100644
index 000000000000..bc53a9e79a2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymitv/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pymitv";
+  version = "1.5.0";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-0n4IS5W3nvYwKdl6FVf4upRrFDGdYHohsaXadFy8d8w=";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # Projec thas no tests
+  doCheck = false;
+  pythonImportsCheck = [ "pymitv" ];
+
+  meta = with lib; {
+    description = "Python client the Mi Tv 3";
+    homepage = "https://github.com/simse/pymitv";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymodbus/default.nix b/nixpkgs/pkgs/development/python-modules/pymodbus/default.nix
new file mode 100644
index 000000000000..539502db35b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymodbus/default.nix
@@ -0,0 +1,90 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, prompt-toolkit
+, pygments
+, pyserial
+, pytest-asyncio
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, redis
+, setuptools
+, sqlalchemy
+, twisted
+, typer
+}:
+
+buildPythonPackage rec {
+  pname = "pymodbus";
+  version = "3.5.4";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pymodbus-dev";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-IgGDYNIRS39t8vHkJSGnDGCTKxpeIYZyedLzyS5pOI0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  passthru.optional-dependencies = {
+    repl = [
+      aiohttp
+      typer
+      prompt-toolkit
+      pygments
+      click
+    ] ++ typer.optional-dependencies.all;
+    serial = [
+      pyserial
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-xdist
+    pytestCheckHook
+    redis
+    sqlalchemy
+    twisted
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  preCheck = ''
+    pushd test
+  '';
+
+  postCheck = ''
+    popd
+  '';
+
+  pythonImportsCheck = [
+    "pymodbus"
+  ];
+
+  disabledTests = [
+    # Tests often hang
+    "test_connected"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of the Modbus protocol";
+    longDescription = ''
+      Pymodbus is a full Modbus protocol implementation using twisted,
+      torndo or asyncio for its asynchronous communications core. It can
+      also be used without any third party dependencies if a more
+      lightweight project is needed.
+    '';
+    homepage = "https://github.com/pymodbus-dev/pymodbus";
+    changelog = "https://github.com/pymodbus-dev/pymodbus/releases/tag/v${version}";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymongo-inmemory/default.nix b/nixpkgs/pkgs/development/python-modules/pymongo-inmemory/default.nix
new file mode 100644
index 000000000000..f0930c8c54c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymongo-inmemory/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pymongo
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pymongo-inmemory";
+  version = "0.4.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "kaizendorks";
+    repo = "pymongo_inmemory";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-h6/yKvAHqvw0L3Z1+PUQi36Ja6yvFiaX7Cn5Ypcg1Zs=";
+  };
+
+  postPatch = ''
+    # move cache location from nix store to home
+    substituteInPlace pymongo_inmemory/context.py \
+      --replace \
+        'CACHE_FOLDER = path.join(path.dirname(__file__), "..", ".cache")' \
+        'CACHE_FOLDER = os.environ.get("XDG_CACHE_HOME", os.environ["HOME"] + "/.cache") + "/pymongo-inmemory"'
+
+    # fix a broken assumption arising from the above fix
+    substituteInPlace pymongo_inmemory/_utils.py \
+      --replace \
+        'os.mkdir(current_path)' \
+        'os.makedirs(current_path)'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pymongo
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # new test with insufficient monkey patching, try to remove on next bump
+    "tests/unit/test_mongod.py"
+  ];
+
+  preCheck = ''
+    export HOME="$(mktemp -d)"
+  '';
+
+  pythonImportsCheck = [
+    "pymongo_inmemory"
+  ];
+
+  meta = {
+    homepage = "https://github.com/kaizendorks/pymongo_inmemory";
+    description = "A mongo mocking library with an ephemeral MongoDB running in memory";
+    maintainers = with lib.maintainers; [ pbsds ];
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymongo/default.nix b/nixpkgs/pkgs/development/python-modules/pymongo/default.nix
new file mode 100644
index 000000000000..bb6196f775a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymongo/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, dnspython
+}:
+
+buildPythonPackage rec {
+  pname = "pymongo";
+  version = "4.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-aB8lLkOz7wVMqRYWNfgbcw9NjK3Siz8rIAT1py+FOYI=";
+  };
+
+  propagatedBuildInputs = [
+    dnspython
+  ];
+
+  # Tests call a running mongodb instance
+  doCheck = false;
+
+  pythonImportsCheck = [ "pymongo" ];
+
+  meta = with lib; {
+    description = "Python driver for MongoDB";
+    homepage = "https://github.com/mongodb/mongo-python-driver";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymoo/default.nix b/nixpkgs/pkgs/development/python-modules/pymoo/default.nix
new file mode 100644
index 000000000000..637bd4dc17b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymoo/default.nix
@@ -0,0 +1,105 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+, writeText
+, autograd
+, cma
+, cython
+, deprecated
+, dill
+, matplotlib
+, nbformat
+, notebook
+, numba
+, numpy
+, pandas
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "pymoo";
+  version = "0.6.0.1";
+
+  src = fetchFromGitHub {
+    owner = "anyoptimization";
+    repo = "pymoo";
+    rev = version;
+    hash = "sha256-+qtW7hfSo266n1SRzAgHIu99W5Sl+NYbKOHXv/JI9IA=";
+  };
+
+  pymoo_data = fetchFromGitHub {
+    owner = "anyoptimization";
+    repo = "pymoo-data";
+    rev = "33f61a78182ceb211b95381dd6d3edee0d2fc0f3";
+    hash = "sha256-iGWPepZw3kJzw5HKV09CvemVvkvFQ38GVP+BAryBSs0=";
+  };
+
+  patches = [
+    # https://github.com/anyoptimization/pymoo/pull/407
+    (fetchpatch {
+      url = "https://github.com/anyoptimization/pymoo/commit/be57ece64275469daece1e8ef12b2b6ee05362c9.diff";
+      hash = "sha256-BLPrUqNbAsAecfYahESEJF6LD+kehUYmkTvl/nvyqII=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "cma==3.2.2" "cma" \
+      --replace "'alive-progress'," ""
+
+    substituteInPlace pymoo/util/display/display.py \
+      --replace "from pymoo.util.display.progress import ProgressBar" "" \
+      --replace "ProgressBar() if progress else None" \
+                "print('Missing alive_progress needed for progress=True!') if progress else None"
+  '';
+
+  nativeBuildInputs = [
+    cython
+  ];
+  propagatedBuildInputs = [
+    autograd
+    cma
+    deprecated
+    dill
+    matplotlib
+    numpy
+    scipy
+  ];
+
+  doCheck = true;
+  preCheck = ''
+    substituteInPlace pymoo/config.py \
+      --replace "https://raw.githubusercontent.com/anyoptimization/pymoo-data/main/" \
+                "file://$pymoo_data/"
+  '';
+  nativeCheckInputs = [
+    pytestCheckHook
+    nbformat
+    notebook
+    numba
+  ];
+  # Select some lightweight tests
+  pytestFlagsArray = [
+    "-m 'not long'"
+  ];
+  disabledTests = [
+    # ModuleNotFoundError: No module named 'pymoo.cython.non_dominated_sorting'
+    "test_fast_non_dominated_sorting"
+    "test_efficient_non_dominated_sort"
+  ];
+  # Avoid crashing sandboxed build on macOS
+  MATPLOTLIBRC=writeText "" ''
+    backend: Agg
+  '';
+
+  pythonImportsCheck = [ "pymoo" ];
+
+  meta = with lib; {
+    description = "Multi-objective Optimization in Python";
+    homepage = "https://pymoo.org/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymorphy2/default.nix b/nixpkgs/pkgs/development/python-modules/pymorphy2/default.nix
new file mode 100644
index 000000000000..5195840c3119
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymorphy2/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, isPy3k
+, dawg-python
+, docopt
+, pymorphy2-dicts-ru
+}:
+
+buildPythonPackage rec {
+  pname = "pymorphy2";
+  version = "0.9.1";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-hsRHFX3uLrI0HvvkU44SgadUdWuhqjLad6iWFMWLVgw=";
+  };
+
+  propagatedBuildInputs = [
+    dawg-python
+    docopt
+    pymorphy2-dicts-ru
+  ];
+
+  pythonImportsCheck = [ "pymorphy2" ];
+
+  meta = with lib; {
+    description = "Morphological analyzer/inflection engine for Russian and Ukrainian";
+    homepage = "https://github.com/kmike/pymorphy2";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymorphy2/dicts-ru.nix b/nixpkgs/pkgs/development/python-modules/pymorphy2/dicts-ru.nix
new file mode 100644
index 000000000000..ac1f9f980bef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymorphy2/dicts-ru.nix
@@ -0,0 +1,23 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+}:
+
+buildPythonPackage rec {
+  pname = "pymorphy2-dicts-ru";
+  version = "2.4.417127.4579844";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-eMrQOtymBQIavTh6Oy61FchRuG6UaCoe8jVKLHT8wZY=";
+  };
+
+  pythonImportsCheck = [ "pymorphy2_dicts_ru" ];
+
+  meta = with lib; {
+    description = "Russian dictionaries for pymorphy2";
+    homepage = "https://github.com/kmike/pymorphy2-dicts/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymorphy3/default.nix b/nixpkgs/pkgs/development/python-modules/pymorphy3/default.nix
new file mode 100644
index 000000000000..2ef0e9629bd5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymorphy3/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, dawg-python
+, docopt
+, pytestCheckHook
+, pymorphy3-dicts-ru
+, pymorphy3-dicts-uk
+}:
+
+buildPythonPackage rec {
+  pname = "pymorphy3";
+  version = "1.2.1";
+
+  src = fetchFromGitHub {
+    owner = "no-plagiarism";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-JTRG+UtNXnS9GFUrgHNVCktb3HdH98wDFgzDPp6oVcQ=";
+  };
+
+  propagatedBuildInputs = [
+    dawg-python
+    docopt
+    pymorphy3-dicts-ru
+    pymorphy3-dicts-uk
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pymorphy3" ];
+
+  meta = with lib; {
+    description = "Morphological analyzer/inflection engine for Russian and Ukrainian";
+    homepage = "https://github.com/no-plagiarism/pymorphy3";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jboy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymorphy3/dicts-ru.nix b/nixpkgs/pkgs/development/python-modules/pymorphy3/dicts-ru.nix
new file mode 100644
index 000000000000..db32d092a30c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymorphy3/dicts-ru.nix
@@ -0,0 +1,26 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+}:
+
+buildPythonPackage rec {
+  pname = "pymorphy3-dicts-ru";
+  version = "2.4.417150.4580142";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Oas3nUypBbr+1Q9a/Do95vlkNgV3b7yrxNMIjU7TgrA=";
+  };
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "pymorphy3_dicts_ru" ];
+
+  meta = with lib; {
+    description = "Russian dictionaries for pymorphy3";
+    homepage = "https://github.com/no-plagiarism/pymorphy3-dicts";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jboy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymorphy3/dicts-uk.nix b/nixpkgs/pkgs/development/python-modules/pymorphy3/dicts-uk.nix
new file mode 100644
index 000000000000..036bf452b893
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymorphy3/dicts-uk.nix
@@ -0,0 +1,26 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+}:
+
+buildPythonPackage rec {
+  pname = "pymorphy3-dicts-uk";
+  version = "2.4.1.1.1663094765";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-s5RaNBNuGTgGzeZXuicdiKYHYedRN8E9E4qNFCqNEqw=";
+  };
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "pymorphy3_dicts_uk" ];
+
+  meta = with lib; {
+    description = "Ukrainian dictionaries for pymorphy3";
+    homepage = "https://github.com/no-plagiarism/pymorphy3-dicts";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jboy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pympler/default.nix b/nixpkgs/pkgs/development/python-modules/pympler/default.nix
new file mode 100644
index 000000000000..463de728aea2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pympler/default.nix
@@ -0,0 +1,60 @@
+{ lib, stdenv
+, bottle
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, pytestCheckHook
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "Pympler";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "993f1a3599ca3f4fcd7160c7545ad06310c9e12f70174ae7ae8d4e25f6c5d3fa";
+  };
+
+  patches = [
+    # Fixes a TypeError on Python 3.11
+    # (see https://github.com/pympler/pympler/issues/148)
+    # https://github.com/pympler/pympler/pull/149
+    (fetchpatch {
+      name = "${pname}-python-3.11-compat.patch";
+      url = "https://github.com/pympler/pympler/commit/0fd8ad8da39207bd0dcb28bdac0407e04744c965.patch";
+      hash = "sha256-6MK0AuhVhQkUzlk29HUh1+mSbfsVTBJ1YBtYNIFhh7U=";
+    })
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # There is a version of bottle bundled with Pympler, but it is broken on
+  # Python 3.11. Fortunately, Pympler will preferentially import an external
+  # bottle if it is available, so we make it an explicit dependency.
+  propagatedBuildInputs = [
+    bottle
+  ];
+
+  disabledTests = [
+    # 'AssertionError: 'function (test.muppy.test_summary.func)' != 'function (muppy.test_summary.func)'
+    # https://github.com/pympler/pympler/issues/134
+    "test_repr_function"
+  ] ++ lib.optionals (pythonAtLeast "3.11") [
+    # https://github.com/pympler/pympler/issues/148
+    "test_findgarbage"
+    "test_get_tree"
+    "test_prune"
+  ];
+
+  doCheck = stdenv.hostPlatform.isLinux;
+
+  meta = with lib; {
+    description = "Tool to measure, monitor and analyze memory behavior";
+    homepage = "https://pythonhosted.org/Pympler/";
+    license = licenses.asl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymsgbox/default.nix b/nixpkgs/pkgs/development/python-modules/pymsgbox/default.nix
new file mode 100644
index 000000000000..a04923c18140
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymsgbox/default.nix
@@ -0,0 +1,24 @@
+{ lib, fetchPypi, buildPythonPackage, tkinter }:
+
+buildPythonPackage rec {
+  pname = "PyMsgBox";
+  version = "1.0.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-IZQifei/96PW2lQYSHBaFV3LsqBu4SDZ8oCh1/USY/8=";
+  };
+
+  propagatedBuildInputs = [ tkinter ];
+
+  # Finding tests fails
+  doCheck = false;
+  pythonImportsCheck = [ "pymsgbox" ];
+
+  meta = with lib; {
+    description = "A simple, cross-platform, pure Python module for JavaScript-like message boxes";
+    homepage = "https://github.com/asweigart/PyMsgBox";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymsteams/default.nix b/nixpkgs/pkgs/development/python-modules/pymsteams/default.nix
new file mode 100644
index 000000000000..3672ce628575
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymsteams/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pymsteams";
+  version = "0.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rveachkc";
+    repo = pname;
+    rev = version;
+    hash = "sha256-H1AEjUnEK+seKsnFnHpn1/aHxXcbyz67NbzhlGDtbk4=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Tests require network access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pymsteams"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interact with Microsoft Teams";
+    homepage = "https://github.com/rveachkc/pymsteams";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymumble/default.nix b/nixpkgs/pkgs/development/python-modules/pymumble/default.nix
new file mode 100644
index 000000000000..2a59f3f9499b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymumble/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, opuslib
+, protobuf
+, pytestCheckHook
+, pycrypto
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pymumble";
+  version = "1.6.1"; # Don't upgrade to 1.7, version was yanked
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "azlux";
+    repo = "pymumble";
+    rev = "refs/tags/${version}";
+    hash = "sha256-+sT5pqdm4A2rrUcUUmvsH+iazg80+/go0zM1vr9oeuE=";
+  };
+
+  postPatch = ''
+    # Changes all `library==x.y.z` statements to just `library`
+    # So that we aren't constrained to a specific version
+    sed -i 's/\(.*\)==.*/\1/' requirements.txt
+  '';
+
+  propagatedBuildInputs = [
+    opuslib
+    protobuf
+  ];
+
+  nativeCheckInputs = [
+    pycrypto
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pymumble_py3"
+    "pymumble_py3.constants"
+  ];
+
+  meta = with lib; {
+    description = "Library to create mumble bots";
+    homepage = "https://github.com/azlux/pymumble";
+    changelog = "https://github.com/azlux/pymumble/releases/tag/${version}";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ thelegy infinisil ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymunk/default.nix b/nixpkgs/pkgs/development/python-modules/pymunk/default.nix
new file mode 100644
index 000000000000..f649f9bba0ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymunk/default.nix
@@ -0,0 +1,57 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, python
+, cffi
+, pytestCheckHook
+, pythonOlder
+, ApplicationServices
+}:
+
+buildPythonPackage rec {
+  pname = "pymunk";
+  version = "6.5.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-AV6upaZcnbKmQm9tTItRB6LpckappjdHvMH/awn/KeE=";
+  };
+
+  propagatedBuildInputs = [
+    cffi
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    ApplicationServices
+  ];
+
+  preBuild = ''
+    ${python.pythonOnBuildForHost.interpreter} setup.py build_ext --inplace
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "pymunk/tests"
+  ];
+
+  pythonImportsCheck = [
+    "pymunk"
+  ];
+
+  meta = with lib; {
+    description = "2d physics library";
+    homepage = "https://www.pymunk.org";
+    changelog = "https://github.com/viblo/pymunk/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ emilytrau ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymupdf/default.nix b/nixpkgs/pkgs/development/python-modules/pymupdf/default.nix
new file mode 100644
index 000000000000..1c21e6b90c1a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymupdf/default.nix
@@ -0,0 +1,97 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+, python
+, swig
+, mupdf
+, freetype
+, harfbuzz
+, openjpeg
+, jbig2dec
+, libjpeg_turbo
+, gumbo
+, memstreamHook
+, fonttools
+}:
+
+let
+  # PyMuPDF needs the C++ bindings generated
+  mupdf-cxx = mupdf.override { enableOcr = true; enableCxx = true; enablePython = true; python3 = python; };
+in buildPythonPackage rec {
+  pname = "pymupdf";
+  version = "1.23.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pymupdf";
+    repo = "PyMuPDF";
+    rev = version;
+    hash = "sha256-60KT5+EGP+s7HD4UIeaf9x2QVNU9IUbC5WKEJbrIBCI=";
+  };
+
+  nativeBuildInputs = [
+    pytestCheckHook
+    swig
+  ];
+
+  buildInputs = [
+    freetype
+    harfbuzz
+    openjpeg
+    jbig2dec
+    libjpeg_turbo
+    gumbo
+  ] ++ lib.optionals (stdenv.system == "x86_64-darwin") [
+    memstreamHook
+  ];
+
+  propagatedBuildInputs = [
+    mupdf-cxx
+  ];
+
+  env = {
+    # force using system MuPDF (must be defined in environment and empty)
+    PYMUPDF_SETUP_MUPDF_BUILD = "";
+    # provide MuPDF paths
+    PYMUPDF_MUPDF_LIB = "${lib.getLib mupdf-cxx}/lib";
+    PYMUPDF_MUPDF_INCLUDE = "${lib.getDev mupdf-cxx}/include";
+  };
+
+  # TODO: manually add mupdf rpath until upstream fixes it
+  postInstall = lib.optionalString stdenv.isDarwin ''
+    for lib in */*.so $out/${python.sitePackages}/*/*.so; do
+      install_name_tool -add_rpath ${lib.getLib mupdf-cxx}/lib "$lib"
+    done
+  '';
+
+  checkInputs = [
+    fonttools
+  ];
+
+  disabledTests = [
+    # fails for indeterminate reasons
+    "test_color_count"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # darwin does not support OCR right now
+    "test_tesseract"
+  ];
+
+  pythonImportsCheck = [
+    "fitz"
+    "fitz_new"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for MuPDF's rendering library";
+    homepage = "https://github.com/pymupdf/PyMuPDF";
+    changelog = "https://github.com/pymupdf/PyMuPDF/releases/tag/${version}";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ teto ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymvglive/default.nix b/nixpkgs/pkgs/development/python-modules/pymvglive/default.nix
new file mode 100644
index 000000000000..f80a92063195
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymvglive/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, requests }:
+
+buildPythonPackage rec {
+  pname = "pymvglive";
+  version = "1.1.4";
+
+  src = fetchPypi {
+    pname = "PyMVGLive";
+    inherit version;
+    sha256 = "0sh4xm74im9qxzpbrlc5h1vnpgvpybnpvdcav1iws0b561zdr08c";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  meta = with lib; {
+    description = "get live-data from mvg-live.de";
+    homepage = "https://github.com/pc-coholic/PyMVGLive";
+    license = licenses.free;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymysensors/default.nix b/nixpkgs/pkgs/development/python-modules/pymysensors/default.nix
new file mode 100644
index 000000000000..58bdf10ab5b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymysensors/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, awesomeversion
+, buildPythonPackage
+, click
+, crcmod
+, fetchFromGitHub
+, getmac
+, intelhex
+, paho-mqtt
+, pyserial
+, pyserial-asyncio
+, pytest-sugar
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "pymysensors";
+  version = "0.24.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "theolind";
+    repo = pname;
+    rev = version;
+    hash = "sha256-3t9YrSJf02kc5CuTqPBc/qNJV7yy7Vke4WqhtuOaAYo=";
+  };
+
+  propagatedBuildInputs = [
+    awesomeversion
+    click
+    crcmod
+    getmac
+    intelhex
+    pyserial
+    pyserial-asyncio
+    voluptuous
+  ];
+
+  passthru.optional-dependencies = {
+    mqtt-client = [
+      paho-mqtt
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytest-sugar
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "mysensors"
+  ];
+
+  meta = with lib; {
+    description = "Python API for talking to a MySensors gateway";
+    homepage = "https://github.com/theolind/pymysensors";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymysql/default.nix b/nixpkgs/pkgs/development/python-modules/pymysql/default.nix
new file mode 100644
index 000000000000..888b5b9d309c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymysql/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cryptography
+}:
+
+buildPythonPackage rec {
+  pname = "PyMySQL";
+  version = "1.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "816927a350f38d56072aeca5dfb10221fe1dc653745853d30a216637f5d7ad36";
+  };
+
+  propagatedBuildInputs = [ cryptography ];
+
+  # Wants to connect to MySQL
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Pure Python MySQL Client";
+    homepage = "https://github.com/PyMySQL/PyMySQL";
+    license = licenses.mit;
+    maintainers = [ maintainers.kalbasit ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymysqlsa/default.nix b/nixpkgs/pkgs/development/python-modules/pymysqlsa/default.nix
new file mode 100644
index 000000000000..49b5a49193de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymysqlsa/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pymysql
+, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "pymysql-sa";
+  version = "1.0";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "pymysql_sa";
+    sha256 = "a2676bce514a29b2d6ab418812259b0c2f7564150ac53455420a20bd7935314a";
+  };
+
+  propagatedBuildInputs = [ pymysql sqlalchemy ];
+
+  meta = with lib; {
+    description = "PyMySQL dialect for SQL Alchemy";
+    homepage = "https://pypi.python.org/pypi/pymysql_sa";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pymystem3/default.nix b/nixpkgs/pkgs/development/python-modules/pymystem3/default.nix
new file mode 100644
index 000000000000..b8aa6469b7f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pymystem3/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, isPy3k
+, requests
+, flake8
+, mock
+, pytest
+, mystem
+}:
+
+buildPythonPackage rec {
+  pname = "pymystem3";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "15gv78m17g958gfka6rr3rg230g6b5ssgk8bfpsp7k2iajhxdbhs";
+  };
+
+  propagatedBuildInputs = [ requests ];
+  nativeCheckInputs = [ flake8 mock pytest ];
+  doCheck = isPy3k; # fails on linting
+
+  postPatch = ''
+    sed -i 's#^_mystem_info = .*#_mystem_info = ["${mystem}/bin", "${mystem}/bin/mystem"]#' pymystem3/constants.py
+  '';
+
+  meta = with lib; {
+    description = "Python wrapper for the Yandex MyStem 3.1 morpholocial analyzer of the Russian language";
+    homepage = "https://github.com/nlpub/pymystem3";
+    license = licenses.mit;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynac/default.nix b/nixpkgs/pkgs/development/python-modules/pynac/default.nix
new file mode 100644
index 000000000000..a6df8cb036d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynac/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+}:
+
+buildPythonPackage {
+  pname = "pynac";
+  version = "0.2";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/project/pynac/pynac/pynac-0.2/pynac-0.2.tar.gz";
+    sha256 = "0avzqqcxl54karjmla9jbsyid98mva36lxahwmrsx5h40ys2ggxp";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/se-esss-litterbox/Pynac";
+    description = "A Python wrapper around the Dynac charged particle simulator";
+    license = licenses.gpl3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynacl/default.nix b/nixpkgs/pkgs/development/python-modules/pynacl/default.nix
new file mode 100644
index 000000000000..bd92adf25011
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynacl/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, sphinxHook
+, pythonOlder
+, libsodium
+, cffi
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "pynacl";
+  version = "1.5.0";
+  outputs = [ "out" "doc" ];
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "PyNaCl";
+    sha256 = "8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba";
+  };
+
+  nativeBuildInputs = [
+    sphinxHook
+  ];
+
+  buildInputs = [
+    libsodium
+  ];
+
+  propagatedNativeBuildInputs = [
+    cffi
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  SODIUM_INSTALL = "system";
+
+  pythonImportsCheck = [
+    "nacl"
+  ];
+
+  meta = with lib; {
+    description = "Python binding to the Networking and Cryptography (NaCl) library";
+    homepage = "https://github.com/pyca/pynacl/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynamecheap/default.nix b/nixpkgs/pkgs/development/python-modules/pynamecheap/default.nix
new file mode 100644
index 000000000000..84c13b9d1caa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynamecheap/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "PyNamecheap";
+  version = "0.0.3";
+
+  propagatedBuildInputs = [ requests ];
+
+  # Tests require access to api.sandbox.namecheap.com
+  doCheck = false;
+
+  src = fetchFromGitHub {
+    owner = "Bemmu";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1g1cd2yc6rpdsc5ax7s93y5nfkf91gcvbgcaqyl9ida6srd9hr97";
+  };
+
+  meta = with lib; {
+    description = "Namecheap API client in Python.";
+    homepage = "https://github.com/Bemmu/PyNamecheap";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynamodb/default.nix b/nixpkgs/pkgs/development/python-modules/pynamodb/default.nix
new file mode 100644
index 000000000000..8f75abea64fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynamodb/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, blinker
+, botocore
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-mock
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, requests
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "pynamodb";
+  version = "5.5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pynamodb";
+    repo = "PynamoDB";
+    rev = "refs/tags/${version}";
+    hash = "sha256-VZHEXAuHGn10EMkyd8hibipu6tw5JvOP4XwdB+xdjN8=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    botocore
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = {
+    signal = [
+      blinker
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.signal;
+
+  pythonImportsCheck = [
+    "pynamodb"
+  ];
+
+  disabledTests = [
+    # Tests requires credentials or network access
+    "test_binary_attribute_update"
+    "test_binary_set_attribute_update"
+    "test_connection_integration"
+    "test_make_api_call__happy_path"
+    "test_model_integration"
+    "test_sign_request"
+    "test_table_integration"
+    "test_transact"
+  ];
+
+  meta = with lib; {
+    description = "Interface for Amazon’s DynamoDB";
+    longDescription = ''
+      DynamoDB is a great NoSQL service provided by Amazon, but the API is
+      verbose. PynamoDB presents you with a simple, elegant API.
+    '';
+    homepage = "http://jlafon.io/pynamodb.html";
+    changelog = "https://github.com/pynamodb/PynamoDB/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynanoleaf/default.nix b/nixpkgs/pkgs/development/python-modules/pynanoleaf/default.nix
new file mode 100644
index 000000000000..9fab8f7b31c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynanoleaf/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, requests }:
+
+buildPythonPackage rec {
+  pname = "pynanoleaf";
+  version = "0.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "32a083759c4f99e019e0013670487841f8edf807c7a07742a971fa18707072a7";
+  };
+
+  disabled = !isPy3k;
+
+  propagatedBuildInputs = [ requests ];
+
+  # pynanoleaf does not contain tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pynanoleaf"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Oro/pynanoleaf";
+    description = "A Python3 wrapper for the Nanoleaf API, capable of controlling both Nanoleaf Aurora and Nanoleaf Canvas";
+    license = licenses.mit;
+    maintainers = with maintainers; [ oro ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pync/default.nix b/nixpkgs/pkgs/development/python-modules/pync/default.nix
new file mode 100644
index 000000000000..9dd31aa725b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pync/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, python-dateutil
+, pkgs
+, which
+}:
+
+buildPythonPackage rec {
+  version  = "2.0.3";
+  pname = "pync";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "38b9e61735a3161f9211a5773c5f5ea698f36af4ff7f77fa03e8d1ff0caa117f";
+  };
+
+  nativeCheckInputs = [ which ];
+  propagatedBuildInputs = [ python-dateutil ];
+
+  preInstall = lib.optionalString stdenv.isDarwin ''
+    sed -i 's|^\([ ]*\)self.bin_path.*$|\1self.bin_path = "${pkgs.terminal-notifier}/bin/terminal-notifier"|' build/lib/pync/TerminalNotifier.py
+  '';
+
+  meta = with lib; {
+    description = "Python Wrapper for Mac OS 10.8 Notification Center";
+    homepage    = "https://pypi.python.org/pypi/pync";
+    license     = licenses.mit;
+    platforms   = platforms.darwin;
+    maintainers = with maintainers; [ lovek323 ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynello/default.nix b/nixpkgs/pkgs/development/python-modules/pynello/default.nix
new file mode 100644
index 000000000000..a7a75d7c5ddd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynello/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python-dateutil
+, pythonOlder
+, requests
+, requests-oauthlib
+}:
+
+buildPythonPackage rec {
+  pname = "pynello";
+  version = "2.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "pschmitt";
+    repo = pname;
+    rev = version;
+    hash = "sha256-sUy37sEPEMyFYFVBzFVdcg31nZAyC+Ricm4LqxmjuQQ=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    requests
+    requests-oauthlib
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pynello"
+  ];
+
+  meta = with lib; {
+    description = "Python library for nello.io intercoms";
+    homepage = "https://github.com/pschmitt/pynello";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynest2d/default.nix b/nixpkgs/pkgs/development/python-modules/pynest2d/default.nix
new file mode 100644
index 000000000000..694459bf0050
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynest2d/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchFromGitHub, python, cmake
+, libnest2d, sip_4, clipper }:
+
+buildPythonPackage rec {
+  version = "4.12.0";
+  pname = "pynest2d";
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "Ultimaker";
+    repo = "pynest2d";
+    rev = version;
+    hash = "sha256-QQdTDhO4i9NVhegGTmdEQSNv3gooaZzTX/Rv86h3GEo=";
+  };
+
+  propagatedBuildInputs = [ libnest2d sip_4 clipper ];
+  nativeBuildInputs = [ cmake ];
+
+  CLIPPER_PATH = "${clipper.out}";
+
+  postPatch = ''
+     sed -i 's#''${Python3_SITEARCH}#${placeholder "out"}/${python.sitePackages}#' cmake/SIPMacros.cmake
+   '';
+
+  meta = with lib; {
+    description = "Python bindings for libnest2d";
+    homepage = "https://github.com/Ultimaker/pynest2d";
+    license = licenses.lgpl3;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynetbox/default.nix b/nixpkgs/pkgs/development/python-modules/pynetbox/default.nix
new file mode 100644
index 000000000000..c61063058a3d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynetbox/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, requests
+, six
+, pytestCheckHook
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "pynetbox";
+  version = "7.2.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "netbox-community";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-rYqwZIqcNeSpXsICL8WGLJ3Tcnwnnm6gvRBEJ/5iE/Q=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pyyaml
+  ];
+
+  disabledTestPaths = [
+    # requires docker for integration test
+    "tests/integration"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/netbox-community/pynetbox/releases/tag/v${version}";
+    description = "API client library for Netbox";
+    homepage = "https://github.com/netbox-community/pynetbox";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynetdicom/default.nix b/nixpkgs/pkgs/development/python-modules/pynetdicom/default.nix
new file mode 100644
index 000000000000..4a78f020f3b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynetdicom/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pydicom
+, pyfakefs
+, pytestCheckHook
+, sqlalchemy
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pynetdicom";
+  version = "2.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pydicom";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-/JWQUtFBW4uqCbs/nUxj1pRBfTCXV4wcqTkqvzpdFrM=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "fix-python-3.11-test-attribute-errors";
+      url = "https://github.com/pydicom/pynetdicom/pull/754/commits/2126bd932d6dfb3f07045eb9400acb7eaa1b3069.patch";
+      hash = "sha256-t6Lg0sTZSWIE5q5pkBvEoHDQ+cklDn8SgNBcFk1myp4=";
+     })
+  ];
+
+  propagatedBuildInputs = [
+    pydicom
+  ];
+
+  nativeCheckInputs = [
+    pyfakefs
+    pytestCheckHook
+    sqlalchemy
+  ];
+
+  disabledTests = [
+    # Some tests needs network capabilities
+    "test_str_types_empty"
+    "test_associate_reject"
+    "TestAEGoodAssociation"
+    "TestEchoSCP"
+    "TestEchoSCPCLI"
+    "TestEventHandlingAcceptor"
+    "TestEventHandlingRequestor"
+    "TestFindSCP"
+    "TestFindSCPCLI"
+    "TestGetSCP"
+    "TestGetSCPCLI"
+    "TestMoveSCP"
+    "TestMoveSCPCLI"
+    "TestPrimitive_N_GET"
+    "TestQRGetServiceClass"
+    "TestQRMoveServiceClass"
+    "TestSearch"
+    "TestState"
+    "TestStorageServiceClass"
+    "TestStoreSCP"
+    "TestStoreSCPCLI"
+    "TestStoreSCU"
+    "TestStoreSCUCLI"
+  ];
+
+  disabledTestPaths = [
+    # Ignore apps tests
+    "pynetdicom/apps/tests/"
+  ];
+
+  pythonImportsCheck = [
+    "pynetdicom"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of the DICOM networking protocol";
+    homepage = "https://github.com/pydicom/pynetdicom";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+    # Tests are not passing on Darwin/Aarch64, thus it's assumed that it doesn't work
+    broken = stdenv.isDarwin || stdenv.isAarch64;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynetgear/default.nix b/nixpkgs/pkgs/development/python-modules/pynetgear/default.nix
new file mode 100644
index 000000000000..1a20de636537
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynetgear/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pynetgear";
+  version = "0.10.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "MatMaul";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-5Lj2cK/SOGgaPu8dI9X3Leg4dPAY7tdIHCzFnNaube8=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  pythonImportsCheck = [
+    "pynetgear"
+  ];
+
+  # Tests don't pass
+  # https://github.com/MatMaul/pynetgear/issues/109
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Module for interacting with Netgear wireless routers";
+    homepage = "https://github.com/MatMaul/pynetgear";
+    changelog = "https://github.com/MatMaul/pynetgear/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyngo/default.nix b/nixpkgs/pkgs/development/python-modules/pyngo/default.nix
new file mode 100644
index 000000000000..91d39a4ab0a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyngo/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, hatchling
+
+# dependencies
+, django
+, pydantic
+, typing-extensions
+
+# tests
+, django-stubs
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "pyngo";
+  version = "1.6.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "yezz123";
+    repo = "pyngo";
+    rev = version;
+    hash = "sha256-qOY1ILMDqSguLnbhuu5JJVMvG3uA08Lv2fB70TgrKqI=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    django
+    pydantic
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [ "pyngo" ];
+
+  nativeCheckInputs = [
+    django-stubs
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/yezz123/pyngo/releases/tag/${version}";
+    description = "Pydantic model support for Django & Django-Rest-Framework";
+    homepage = "https://github.com/yezz123/pyngo";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyngrok/default.nix b/nixpkgs/pkgs/development/python-modules/pyngrok/default.nix
new file mode 100644
index 000000000000..bd3931e4f1dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyngrok/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "pyngrok";
+  version = "7.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wTK0DnsZBbB9nHMe8hUQjMl3sbv0RaFGiU4NSJshPrY=";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+  ];
+
+  pythonImportsCheck = [ "pyngrok" ];
+
+  meta = with lib; {
+    description = "A Python wrapper for ngrok";
+    homepage = "https://github.com/alexdlaird/pyngrok";
+    changelog = "https://github.com/alexdlaird/pyngrok/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ wegank ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynina/default.nix b/nixpkgs/pkgs/development/python-modules/pynina/default.nix
new file mode 100644
index 000000000000..73e611d0f501
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynina/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pynina";
+  version = "0.3.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "PyNINA";
+    inherit version;
+    hash = "sha256-6HJ78tKl6If/ezwOrGl3VEYO4eMh/6cZq2j2AMBr0I8=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pynina"
+  ];
+
+  meta = with lib; {
+    description = "Python API wrapper to retrieve warnings from the german NINA app";
+    homepage = "https://gitlab.com/DeerMaximum/pynina";
+    changelog = "https://gitlab.com/DeerMaximum/pynina/-/releases/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynisher/default.nix b/nixpkgs/pkgs/development/python-modules/pynisher/default.nix
new file mode 100644
index 000000000000..6c7f1c0f59a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynisher/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, psutil
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "pynisher";
+  version = "1.0.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-hlN5uUlgmcipQqmr22rB245oEXOUe5WB9jWo7MXXViE=";
+  };
+
+  propagatedBuildInputs = [
+    psutil
+    typing-extensions
+  ];
+
+  # No tests in the Pypi archive
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pynisher"
+  ];
+
+  meta = with lib; {
+    description = "Module intended to limit a functions resources";
+    homepage = "https://github.com/automl/pynisher";
+    changelog = "https://github.com/automl/pynisher/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynmea2/default.nix b/nixpkgs/pkgs/development/python-modules/pynmea2/default.nix
new file mode 100644
index 000000000000..859b12647460
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynmea2/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "pynmea2";
+  version = "1.19.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Hap5uTJ5+IfRwjXlzFx54yZEVkE4zkaYmrD0ovyXDXw=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "pynmea2" ];
+
+  meta = {
+    homepage = "https://github.com/Knio/pynmea2";
+    description = "Python library for the NMEA 0183 protcol";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ oxzi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynndescent/default.nix b/nixpkgs/pkgs/development/python-modules/pynndescent/default.nix
new file mode 100644
index 000000000000..fb796ab6c331
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynndescent/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, importlib-metadata
+, joblib
+, llvmlite
+, numba
+, scikit-learn
+, scipy
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pynndescent";
+  version = "0.5.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XV3Gg8A+9V/j3faThZcgyhj4XG5uW7C08UhwJ41SiK0=";
+  };
+
+  patches = [
+    # https://github.com/lmcinnes/pynndescent/pull/224
+    (fetchpatch {
+      url = "https://github.com/lmcinnes/pynndescent/commit/86e0d716a3a4d5f4e6a0a3c2952f6fe339524e96.patch";
+      hash = "sha256-dfnT5P9Qsn/nSAr4Ysqo/olbLLfoZXvBRz33yzhN3J4=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    joblib
+    llvmlite
+    numba
+    scikit-learn
+    scipy
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # numpy.core._exceptions._UFuncNoLoopError
+    "test_sparse_nn_descent_query_accuracy_angular"
+    "test_nn_descent_query_accuracy_angular"
+    "test_alternative_distances"
+    # scipy: ValueError: Unknown Distance Metric: wminkowski
+    # https://github.com/scikit-learn/scikit-learn/pull/21741
+    "test_weighted_minkowski"
+  ];
+
+  pythonImportsCheck = [
+    "pynndescent"
+  ];
+
+  meta = with lib; {
+    description = "Nearest Neighbor Descent";
+    homepage = "https://github.com/lmcinnes/pynndescent";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynobo/default.nix b/nixpkgs/pkgs/development/python-modules/pynobo/default.nix
new file mode 100644
index 000000000000..783415a2c2fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynobo/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pynobo";
+  version = "1.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "echoromeo";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-LJS4NJM+f+j53YzH8LradBDzHAsOprd4F7nH1cfC3B0=";
+  };
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pynobo"
+  ];
+
+  meta = with lib; {
+    description = "Python TCP/IP interface for Nobo Hub/Nobo Energy Control devices";
+    homepage = "https://github.com/echoromeo/pynobo";
+    changelog = "https://github.com/echoromeo/pynobo/releases/tag/v${version}";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynput/default.nix b/nixpkgs/pkgs/development/python-modules/pynput/default.nix
new file mode 100644
index 000000000000..88c46532d997
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynput/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, setuptools
+, setuptools-lint
+, sphinx
+
+# dependencies
+, xlib
+, evdev
+, darwin
+, six
+
+ # tests
+, unittestCheckHook
+ }:
+
+buildPythonPackage rec {
+  pname = "pynput";
+  version = "1.7.6";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "moses-palmer";
+    repo = "pynput";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-gRq4LS9NvPL98N0Jk09Z0GfoHS09o3zM284BEWS+NW4=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'sphinx >=1.3.1'" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-lint
+    sphinx
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ] ++ lib.optionals stdenv.isLinux [
+    evdev
+    xlib
+  ] ++ lib.optionals stdenv.isDarwin (with darwin.apple_sdk.frameworks; [
+    ApplicationServices
+    Quartz
+  ]);
+
+  doCheck = false; # requires running X server
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "A library to control and monitor input devices";
+    homepage = "https://github.com/moses-palmer/pynput";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ nickhu ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/pynrrd/default.nix b/nixpkgs/pkgs/development/python-modules/pynrrd/default.nix
new file mode 100644
index 000000000000..7d36e42da70d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynrrd/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, numpy
+, nptyping
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "pynrrd";
+  version = "1.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mhe";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-R/bUItF2BaKTFdMNBHFJKq0jSX6z49e8CGXENUn07SU=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    nptyping
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [
+    "nrrd"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mhe/pynrrd";
+    description = "Simple pure-Python reader for NRRD files";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynuki/default.nix b/nixpkgs/pkgs/development/python-modules/pynuki/default.nix
new file mode 100644
index 000000000000..67c35da58218
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynuki/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pynacl
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pynuki";
+  version = "1.6.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pschmitt";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-I0eAhgThSBEmJF6mYw+0Bh1kCUqEMFnCx+4n7l3Hf14=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pynacl
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pynuki"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for nuki.io bridges";
+    homepage = "https://github.com/pschmitt/pynuki";
+    changelog = "https://github.com/pschmitt/pynuki/releases/tag/${version}";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynut2/default.nix b/nixpkgs/pkgs/development/python-modules/pynut2/default.nix
new file mode 100644
index 000000000000..11313dcadc69
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynut2/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pynut2";
+  version = "2.1.2";
+
+  src = fetchFromGitHub {
+    owner = "mezz64";
+    repo = "python-nut2";
+    rev = version;
+    sha256 = "1lg7n1frndfgw73s0ssl1h7kc6zxm7fpiwlc6v6d60kxzaj1dphx";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  pythonImportsCheck = [ "pynut2.nut2" ];
+
+  # tests are unmaintained and broken
+  doCheck = false;
+
+  meta = with lib; {
+    description = "API overhaul of PyNUT, a Python library to allow communication with NUT (Network UPS Tools) servers.";
+    homepage = "https://github.com/mezz64/python-nut2";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = [ maintainers.luker ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynvim-pp/default.nix b/nixpkgs/pkgs/development/python-modules/pynvim-pp/default.nix
new file mode 100644
index 000000000000..0f69b51e65de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynvim-pp/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pynvim
+, setuptools
+}:
+
+buildPythonPackage {
+  pname = "pynvim-pp";
+  version = "unstable-2023-08-03";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "ms-jpq";
+    repo = "pynvim_pp";
+    rev = "40d0f6053ddbba61f53505eebb0290cfb661661b";
+    hash = "sha256-4jeYE9HL+PQZuJq5nyf9CgL4UrRWm3ifLL/vfygLOwc=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  propagatedBuildInputs = [ pynvim ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ms-jpq/pynvim_pp";
+    description = "Dependency to chadtree and coq_nvim plugins";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynvim/default.nix b/nixpkgs/pkgs/development/python-modules/pynvim/default.nix
new file mode 100644
index 000000000000..2ce6e83315a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynvim/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, msgpack
+, greenlet
+, pythonOlder
+, isPyPy
+}:
+
+buildPythonPackage rec {
+  pname = "pynvim";
+  version = "0.4.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-OnlTeL3l6AkvvrOhqZvpxhPSaFVC8dsOXG/UZ+7Vbf8=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace " + pytest_runner" ""
+  '';
+
+  propagatedBuildInputs = [
+    msgpack
+  ] ++ lib.optionals (!isPyPy) [
+    greenlet
+  ];
+
+  # Tests require pkgs.neovim which we cannot add because of circular dependency
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pynvim"
+  ];
+
+  meta = with lib; {
+    description = "Python client for Neovim";
+    homepage = "https://github.com/neovim/pynvim";
+    changelog = "https://github.com/neovim/pynvim/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynvml/0001-locate-libnvidia-ml.so.1-on-NixOS.patch b/nixpkgs/pkgs/development/python-modules/pynvml/0001-locate-libnvidia-ml.so.1-on-NixOS.patch
new file mode 100644
index 000000000000..48727de2516a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynvml/0001-locate-libnvidia-ml.so.1-on-NixOS.patch
@@ -0,0 +1,17 @@
+diff --git a/pynvml/nvml.py b/pynvml/nvml.py
+index 56d908f..1de0b97 100644
+--- a/pynvml/nvml.py
++++ b/pynvml/nvml.py
+@@ -1475,7 +1475,11 @@ def _LoadNvmlLibrary():
+                             nvmlLib = CDLL(os.path.join(os.getenv("ProgramFiles", "C:/Program Files"), "NVIDIA Corporation/NVSMI/nvml.dll"))
+                     else:
+                         # assume linux
+-                        nvmlLib = CDLL("libnvidia-ml.so.1")
++                        try:
++                            nvmlLib = CDLL("libnvidia-ml.so.1")
++                        except OSError:
++                            # assume NixOS
++                            nvmlLib = CDLL("@driverLink@/lib/libnvidia-ml.so.1")
+                 except OSError as ose:
+                     _nvmlCheckReturn(NVML_ERROR_LIBRARY_NOT_FOUND)
+                 if (nvmlLib == None):
diff --git a/nixpkgs/pkgs/development/python-modules/pynvml/default.nix b/nixpkgs/pkgs/development/python-modules/pynvml/default.nix
new file mode 100644
index 000000000000..c3f75acfc569
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynvml/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, substituteAll
+, pythonOlder
+, cudatoolkit
+, addOpenGLRunpath
+}:
+
+buildPythonPackage rec {
+  pname = "pynvml";
+  version = "11.5.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-0CeyG5WxCIufwngRf59ht8Z/jjOnh+n4P3NfD3GsMtA=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./0001-locate-libnvidia-ml.so.1-on-NixOS.patch;
+      inherit (addOpenGLRunpath) driverLink;
+    })
+  ];
+
+  propagatedBuildInputs = [ cudatoolkit ];
+
+  doCheck = false;  # no tests in PyPi dist
+  pythonImportsCheck = [ "pynvml" "pynvml.smi" ];
+
+  meta = with lib; {
+    description = "Python bindings for the NVIDIA Management Library";
+    homepage = "https://www.nvidia.com";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynws/default.nix b/nixpkgs/pkgs/development/python-modules/pynws/default.nix
new file mode 100644
index 000000000000..d2dd95f42451
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynws/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, freezegun
+, metar
+, pytest-aiohttp
+, pytest-asyncio
+, pytest-cov
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pynws";
+  version = "1.6.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "MatthewFlamm";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-x56kfnmdVV0Fc7XSI60rrtEl4k3uzpIdZxTofUbkUHU=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    metar
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    pytest-aiohttp
+    pytest-asyncio
+    pytest-cov
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pynws" ];
+
+  meta = with lib; {
+    description = "Python library to retrieve data from NWS/NOAA";
+    homepage = "https://github.com/MatthewFlamm/pynws";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynx584/default.nix b/nixpkgs/pkgs/development/python-modules/pynx584/default.nix
new file mode 100644
index 000000000000..e5f3a81218da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynx584/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, mock
+, prettytable
+, pyserial
+, pytestCheckHook
+, pythonOlder
+, requests
+, stevedore
+}:
+
+buildPythonPackage rec {
+  pname = "pynx584";
+  version = "0.8.1";
+  disabled = pythonOlder "3.6";
+
+
+  src = fetchFromGitHub {
+    owner = "kk7ds";
+    repo = pname;
+    rev = version;
+    hash = "sha256-nF8+LbKqy/GrnPpykS5wEQMPoFYxi40pfM3Ys/UXCeo=";
+  };
+
+  propagatedBuildInputs = [
+    flask
+    prettytable
+    pyserial
+    requests
+    stevedore
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "nx584" ];
+
+  meta = with lib; {
+    description = "Python package for communicating to NX584/NX8E interfaces";
+    homepage = "https://github.com/kk7ds/pynx584";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pynzb/default.nix b/nixpkgs/pkgs/development/python-modules/pynzb/default.nix
new file mode 100644
index 000000000000..3f1cca75dc15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pynzb/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "pynzb";
+  version = "0.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0735b3889a1174bbb65418ee503629d3f5e4a63f04b16f46ffba18253ec3ef17";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest -s pynzb -t .
+  '';
+
+  # Can't get them working
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/ericflo/pynzb";
+    description = "Unified API for parsing NZB files";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyobihai/default.nix b/nixpkgs/pkgs/development/python-modules/pyobihai/default.nix
new file mode 100644
index 000000000000..1038c162556a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyobihai/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, defusedxml
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyobihai";
+  version = "1.4.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ejpenney";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-tDPu/ceH7+7AnxokADDfl+G56B0+ri8RxXxXEyWa61Q=";
+  };
+
+  propagatedBuildInputs = [
+    defusedxml
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyobihai"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with Obihai devices";
+    homepage = "https://github.com/ejpenney/pyobihai";
+    changelog = "https://github.com/ejpenney/pyobihai/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyocd/default.nix b/nixpkgs/pkgs/development/python-modules/pyocd/default.nix
new file mode 100644
index 000000000000..19980b7c0ca2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyocd/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, capstone
+, cmsis-pack-manager
+, colorama
+, importlib-metadata
+, importlib-resources
+, intelhex
+, intervaltree
+, lark
+, natsort
+, prettytable
+, pyelftools
+, pylink-square
+, pyusb
+, pyyaml
+, setuptools
+, setuptools-scm
+, typing-extensions
+, stdenv
+, hidapi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyocd";
+  version = "0.36.0";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-k3eCrMna/wVNUPt8b3iM2UqE+A8LhfJarKuZ3Jgihkg=";
+  };
+
+  patches = [
+    # https://github.com/pyocd/pyOCD/pull/1332
+    (fetchpatch {
+      name = "libusb-package-optional.patch";
+      url = "https://github.com/pyocd/pyOCD/commit/0b980cf253e3714dd2eaf0bddeb7172d14089649.patch";
+      hash = "sha256-B2+50VntcQELeakJbCeJdgI1iBU+h2NkXqba+LRYa/0=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "libusb-package>=1.0,<2.0" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    capstone
+    cmsis-pack-manager
+    colorama
+    importlib-metadata
+    importlib-resources
+    intelhex
+    intervaltree
+    lark
+    natsort
+    prettytable
+    pyelftools
+    pylink-square
+    pyusb
+    pyyaml
+    typing-extensions
+  ] ++ lib.optionals (!stdenv.isLinux) [
+    hidapi
+  ];
+
+  pythonImportsCheck = [
+    "pyocd"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/pyocd/pyOCD/releases/tag/v${version}";
+    description = "Python library for programming and debugging Arm Cortex-M microcontrollers";
+    downloadPage = "https://github.com/pyocd/pyOCD";
+    homepage = "https://pyocd.io";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ frogamic sbruder ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyocr/default.nix b/nixpkgs/pkgs/development/python-modules/pyocr/default.nix
new file mode 100644
index 000000000000..8dc1ee0f8780
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyocr/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, fetchFromGitLab
+, buildPythonPackage
+, pillow
+, tesseract
+, cuneiform
+, isPy3k
+, substituteAll
+, pytestCheckHook
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pyocr";
+  version = "0.8.5";
+  disabled = !isPy3k;
+  format = "pyproject";
+
+  # Don't fetch from PYPI because it doesn't contain tests.
+  src = fetchFromGitLab {
+    domain = "gitlab.gnome.org";
+    group = "World";
+    owner = "OpenPaperwork";
+    repo = "pyocr";
+    rev = version;
+    hash = "sha256-gE0+qbHCwpDdxXFY+4rjVU2FbUSfSVrvrVMcWUk+9FU=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./paths.patch;
+      inherit cuneiform tesseract;
+    })
+  ];
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  propagatedBuildInputs = [ pillow ];
+
+  nativeBuildInputs = [ setuptools setuptools-scm ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    inherit (src.meta) homepage;
+    changelog = "https://gitlab.gnome.org/World/OpenPaperwork/pyocr/-/blob/${version}/ChangeLog";
+    description = "A Python wrapper for Tesseract and Cuneiform";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ symphorien ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyocr/paths.patch b/nixpkgs/pkgs/development/python-modules/pyocr/paths.patch
new file mode 100644
index 000000000000..c3c802c20649
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyocr/paths.patch
@@ -0,0 +1,357 @@
+commit cfc05af26b571e9ca09e9c709c0fb8934e9e46dd
+Author: Guillaume Girol <symphorien+git@xlumurb.eu>
+Date:   Sat Aug 20 17:48:01 2022 +0200
+
+    Fix finding tesseract and cuneiform
+
+diff --git a/src/pyocr/cuneiform.py b/src/pyocr/cuneiform.py
+index 2e5b717..35647e2 100644
+--- a/src/pyocr/cuneiform.py
++++ b/src/pyocr/cuneiform.py
+@@ -25,13 +25,9 @@ from . import builders
+ from .error import CuneiformError
+ 
+ 
+-# CHANGE THIS IF CUNEIFORM IS NOT IN YOUR PATH, OR IS NAMED DIFFERENTLY
+-CUNEIFORM_CMD = 'cuneiform'
++CUNEIFORM_CMD = '@cuneiform@/bin/cuneiform'
+ 
+-CUNEIFORM_DATA_POSSIBLE_PATHS = [
+-    "/usr/local/share/cuneiform",
+-    "/usr/share/cuneiform",
+-]
++CUNEIFORM_DATA_POSSIBLE_PATHS = ['@cuneiform@/share/cuneiform']
+ 
+ LANGUAGES_LINE_PREFIX = "Supported languages: "
+ LANGUAGES_SPLIT_RE = re.compile("[^a-z]")
+diff --git a/src/pyocr/libtesseract/tesseract_raw.py b/src/pyocr/libtesseract/tesseract_raw.py
+index 1edec8c..434a336 100644
+--- a/src/pyocr/libtesseract/tesseract_raw.py
++++ b/src/pyocr/libtesseract/tesseract_raw.py
+@@ -2,7 +2,6 @@ import ctypes
+ import locale
+ import logging
+ import os
+-import sys
+ 
+ from ..error import TesseractError
+ 
+@@ -10,51 +9,16 @@ from ..error import TesseractError
+ logger = logging.getLogger(__name__)
+ 
+ TESSDATA_PREFIX = os.getenv('TESSDATA_PREFIX', None)
+-libnames = []
++if TESSDATA_PREFIX is None:
++    TESSDATA_PREFIX = '@tesseract@/share/tessdata'
++    os.environ['TESSDATA_PREFIX'] = TESSDATA_PREFIX
++
++
+ # 70 is the minimum credible dpi for tesseract and force it to compute an
+ # estimate of the image dpi
+ DPI_DEFAULT = 70
+ 
+-
+-if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):
+-    # Pyinstaller integration
+-    libnames += [os.path.join(sys._MEIPASS, "libtesseract-4.dll")]
+-    libnames += [os.path.join(sys._MEIPASS, "libtesseract-3.dll")]
+-    tessdata = os.path.join(sys._MEIPASS, "data")
+-    if not os.path.exists(os.path.join(tessdata, "tessdata")):
+-        logger.warning(
+-            "Running from container, but no tessdata ({}) found !".format(
+-                tessdata
+-            )
+-        )
+-    else:
+-        TESSDATA_PREFIX = os.path.join(tessdata, "tessdata")
+-
+-
+-if sys.platform[:3] == "win":  # pragma: no cover
+-    libnames += [
+-        # Jflesch> Don't they have the equivalent of LD_LIBRARY_PATH on
+-        # Windows ?
+-        "../vs2010/DLL_Release/libtesseract302.dll",
+-        # prefer the most recent first
+-        "libtesseract305.dll",
+-        "libtesseract304.dll",
+-        "libtesseract303.dll",
+-        "libtesseract302.dll",
+-        "libtesseract400.dll",  # Tesseract 4 is still in alpha stage
+-        "libtesseract.dll",
+-        "C:\\Program Files (x86)\\Tesseract-OCR\\libtesseract-4.dll",
+-        "C:\\Program Files (x86)\\Tesseract-OCR\\libtesseract-3.dll",
+-    ]
+-else:
+-    libnames += [
+-        "libtesseract.so.5",
+-        "libtesseract.so.4",
+-        "libtesseract.so.3",
+-        "libtesseract.5.dylib",
+-        "libtesseract.4.dylib",
+-    ]
+-
++libnames = [ "@tesseract@/lib/libtesseract.so" ]
+ 
+ g_libtesseract = None
+ 
+@@ -367,12 +331,12 @@ def init(lang=None):
+     try:
+         if lang:
+             lang = lang.encode("utf-8")
+-        prefix = None
+-        if TESSDATA_PREFIX:  # pragma: no cover
+-            prefix = TESSDATA_PREFIX.encode("utf-8")
++
++        prefix = TESSDATA_PREFIX
++
+         g_libtesseract.TessBaseAPIInit3(
+             ctypes.c_void_p(handle),
+-            ctypes.c_char_p(prefix),
++            ctypes.c_char_p(prefix.encode('utf-8')),
+             ctypes.c_char_p(lang)
+         )
+         g_libtesseract.TessBaseAPISetVariable(
+diff --git a/src/pyocr/tesseract.py b/src/pyocr/tesseract.py
+index 0fe0d20..c1fdd27 100644
+--- a/src/pyocr/tesseract.py
++++ b/src/pyocr/tesseract.py
+@@ -28,8 +28,7 @@ from .builders import DigitBuilder  # backward compatibility
+ from .error import TesseractError  # backward compatibility
+ from .util import digits_only
+ 
+-# CHANGE THIS IF TESSERACT IS NOT IN YOUR PATH, OR IS NAMED DIFFERENTLY
+-TESSERACT_CMD = 'tesseract.exe' if os.name == 'nt' else 'tesseract'
++TESSERACT_CMD = '@tesseract@/bin/tesseract'
+ 
+ TESSDATA_EXTENSION = ".traineddata"
+ 
+diff --git a/tests/test_cuneiform.py b/tests/test_cuneiform.py
+index b76e93c..266f6b2 100644
+--- a/tests/test_cuneiform.py
++++ b/tests/test_cuneiform.py
+@@ -21,7 +21,7 @@ class TestCuneiform(BaseTest):
+         # XXX is it useful?
+         which.return_value = True
+         self.assertTrue(cuneiform.is_available())
+-        which.assert_called_once_with("cuneiform")
++        which.assert_called_once_with("@cuneiform@/bin/cuneiform")
+ 
+     @patch("subprocess.Popen")
+     def test_version(self, popen):
+@@ -54,7 +54,7 @@ class TestCuneiform(BaseTest):
+         self.assertIn("eng", langs)
+         self.assertIn("fra", langs)
+         popen.assert_called_once_with(
+-            ["cuneiform", "-l"],
++            ["@cuneiform@/bin/cuneiform", "-l"],
+             stdout=subprocess.PIPE, stderr=subprocess.STDOUT
+         )
+ 
+@@ -110,7 +110,7 @@ class TestCuneiformTxt(BaseTest):
+         output = cuneiform.image_to_string(self.image)
+         self.assertEqual(output, self._get_file_content("text").strip())
+         popen.assert_called_once_with(
+-            ["cuneiform", "-f", "text", "-o", self.tmp_filename, "-"],
++            ["@cuneiform@/bin/cuneiform", "-f", "text", "-o", self.tmp_filename, "-"],
+             stdin=subprocess.PIPE, stdout=subprocess.PIPE,
+             stderr=subprocess.STDOUT
+         )
+@@ -126,7 +126,7 @@ class TestCuneiformTxt(BaseTest):
+                                            builder=self.builder)
+         self.assertEqual(output, self._get_file_content("text").strip())
+         popen.assert_called_once_with(
+-            ["cuneiform", "-l", "fra", "-f", "text", "-o", self.tmp_filename,
++            ["@cuneiform@/bin/cuneiform", "-l", "fra", "-f", "text", "-o", self.tmp_filename,
+              "-"],
+             stdin=subprocess.PIPE, stdout=subprocess.PIPE,
+             stderr=subprocess.STDOUT
+@@ -143,7 +143,7 @@ class TestCuneiformTxt(BaseTest):
+                                            builder=self.builder)
+         self.assertEqual(output, self._get_file_content("text").strip())
+         popen.assert_called_once_with(
+-            ["cuneiform", "-f", "text", "-o", self.tmp_filename, "-"],
++            ["@cuneiform@/bin/cuneiform", "-f", "text", "-o", self.tmp_filename, "-"],
+             stdin=subprocess.PIPE, stdout=subprocess.PIPE,
+             stderr=subprocess.STDOUT
+         )
+@@ -174,7 +174,7 @@ class TestCuneiformTxt(BaseTest):
+         output = cuneiform.image_to_string(image, builder=self.builder)
+         self.assertEqual(output, self._get_file_content("text").strip())
+         popen.assert_called_once_with(
+-            ["cuneiform", "-f", "text", "-o", self.tmp_filename, "-"],
++            ["@cuneiform@/bin/cuneiform", "-f", "text", "-o", self.tmp_filename, "-"],
+             stdin=subprocess.PIPE, stdout=subprocess.PIPE,
+             stderr=subprocess.STDOUT
+         )
+@@ -230,7 +230,7 @@ class TestCuneiformWordBox(BaseTest):
+         output = cuneiform.image_to_string(self.image,
+                                            builder=self.builder)
+         popen.assert_called_once_with(
+-            ["cuneiform", "-f", "hocr", "-o", self.tmp_filename, "-"],
++            ["@cuneiform@/bin/cuneiform", "-f", "hocr", "-o", self.tmp_filename, "-"],
+             stdin=subprocess.PIPE, stdout=subprocess.PIPE,
+             stderr=subprocess.STDOUT
+         )
+@@ -284,7 +284,7 @@ class TestCuneiformLineBox(BaseTest):
+         output = cuneiform.image_to_string(self.image,
+                                            builder=self.builder)
+         popen.assert_called_once_with(
+-            ["cuneiform", "-f", "hocr", "-o", self.tmp_filename, "-"],
++            ["@cuneiform@/bin/cuneiform", "-f", "hocr", "-o", self.tmp_filename, "-"],
+             stdin=subprocess.PIPE, stdout=subprocess.PIPE,
+             stderr=subprocess.STDOUT
+         )
+diff --git a/tests/test_libtesseract.py b/tests/test_libtesseract.py
+index cc31a50..890c02c 100644
+--- a/tests/test_libtesseract.py
++++ b/tests/test_libtesseract.py
+@@ -167,7 +167,8 @@ class TestLibTesseractRaw(BaseTest):
+             args = libtess.TessBaseAPIInit3.call_args[0]
+             self.assertEqual(len(args), 3)
+             self.assertEqual(args[0].value, self.handle)
+-            self.assertEqual(args[1].value, None)
++            # we hardcode tesseract data, so we don't get None
++            #self.assertEqual(args[1].value, None)
+             self.assertEqual(args[2].value, lang.encode() if lang else None)
+ 
+             self.assertEqual(
+@@ -203,7 +204,8 @@ class TestLibTesseractRaw(BaseTest):
+             args = libtess.TessBaseAPIInit3.call_args[0]
+             self.assertEqual(len(args), 3)
+             self.assertEqual(args[0].value, self.handle)
+-            self.assertEqual(args[1].value, None)
++            # we hardcode tesseract data, so we don't get None
++            #self.assertEqual(args[1].value, None)
+             self.assertEqual(args[2].value, lang.encode() if lang else None)
+ 
+             self.assertEqual(
+diff --git a/tests/test_tesseract.py b/tests/test_tesseract.py
+index 823818f..2ee5fb4 100644
+--- a/tests/test_tesseract.py
++++ b/tests/test_tesseract.py
+@@ -37,7 +37,7 @@ class TestTesseract(BaseTest):
+     def test_available(self, which):
+         which.return_value = True
+         self.assertTrue(tesseract.is_available())
+-        which.assert_called_once_with("tesseract")
++        which.assert_called_once_with("@tesseract@/bin/tesseract")
+ 
+     @patch("subprocess.Popen")
+     def test_version_error(self, popen):
+@@ -163,7 +163,7 @@ class TestTesseract(BaseTest):
+         for lang in ("eng", "fra", "jpn", "osd"):
+             self.assertIn(lang, langs)
+         popen.assert_called_once_with(
+-            ["tesseract", "--list-langs"],
++            ["@tesseract@/bin/tesseract", "--list-langs"],
+             startupinfo=None, creationflags=0,
+             stdout=subprocess.PIPE, stderr=subprocess.STDOUT
+         )
+@@ -178,7 +178,7 @@ class TestTesseract(BaseTest):
+         self.assertEqual(te.exception.status, 1)
+         self.assertEqual("unable to get languages", te.exception.message)
+         popen.assert_called_once_with(
+-            ["tesseract", "--list-langs"],
++            ["@tesseract@/bin/tesseract", "--list-langs"],
+             startupinfo=None, creationflags=0,
+             stdout=subprocess.PIPE, stderr=subprocess.STDOUT
+         )
+@@ -255,7 +255,7 @@ class TestTesseract(BaseTest):
+         self.assertEqual(status, 0)
+         self.assertEqual(error, message)
+         popen.assert_called_once_with(
+-            ["tesseract", "input.bmp", "output"],
++            ["@tesseract@/bin/tesseract", "input.bmp", "output"],
+             cwd=tmpdir,
+             startupinfo=None,
+             creationflags=0,
+@@ -278,7 +278,7 @@ class TestTesseract(BaseTest):
+         self.assertEqual(status, 0)
+         self.assertEqual(error, message)
+         popen.assert_called_with(
+-            ["tesseract", "input2.bmp", "output2", "-l", "fra", "--psm", "3"],
++            ["@tesseract@/bin/tesseract", "input2.bmp", "output2", "-l", "fra", "--psm", "3"],
+             cwd=tmpdir,
+             startupinfo=None,
+             creationflags=0,
+@@ -309,7 +309,7 @@ class TestTesseract(BaseTest):
+             self.assertEqual(result["angle"], 90)
+             self.assertEqual(result["confidence"], 9.30)
+             popen.assert_called_once_with(
+-                ["tesseract", "input.bmp", "stdout", "--psm", "0"],
++                ["@tesseract@/bin/tesseract", "input.bmp", "stdout", "--psm", "0"],
+                 stdin=subprocess.PIPE,
+                 shell=False,
+                 startupinfo=None,
+@@ -345,7 +345,7 @@ class TestTesseract(BaseTest):
+             self.assertEqual(result["angle"], 90)
+             self.assertEqual(result["confidence"], 9.30)
+             popen.assert_called_once_with(
+-                ["tesseract", "input.bmp", "stdout", "--psm", "0"],
++                ["@tesseract@/bin/tesseract", "input.bmp", "stdout", "--psm", "0"],
+                 stdin=subprocess.PIPE,
+                 shell=False,
+                 startupinfo=None,
+@@ -378,7 +378,7 @@ class TestTesseract(BaseTest):
+             self.assertEqual(result["angle"], 90)
+             self.assertEqual(result["confidence"], 9.30)
+             popen.assert_called_once_with(
+-                ["tesseract", "input.bmp", "stdout",
++                ["@tesseract@/bin/tesseract", "input.bmp", "stdout",
+                  "--psm", "0", "-l", "osd"],
+                 stdin=subprocess.PIPE,
+                 shell=False,
+@@ -406,7 +406,7 @@ class TestTesseract(BaseTest):
+             with self.assertRaises(tesseract.TesseractError) as te:
+                 tesseract.detect_orientation(self.image)
+             popen.assert_called_once_with(
+-                ["tesseract", "input.bmp", "stdout", "--psm", "0"],
++                ["@tesseract@/bin/tesseract", "input.bmp", "stdout", "--psm", "0"],
+                 stdin=subprocess.PIPE,
+                 shell=False,
+                 startupinfo=None,
+@@ -440,7 +440,7 @@ class TestTesseract(BaseTest):
+             with self.assertRaises(tesseract.TesseractError) as te:
+                 tesseract.detect_orientation(self.image)
+             popen.assert_called_once_with(
+-                ["tesseract", "input.bmp", "stdout", "--psm", "0"],
++                ["@tesseract@/bin/tesseract", "input.bmp", "stdout", "--psm", "0"],
+                 stdin=subprocess.PIPE,
+                 shell=False,
+                 startupinfo=None,
+@@ -474,7 +474,7 @@ class TestTesseract(BaseTest):
+             self.assertEqual(result["angle"], 90)
+             self.assertEqual(result["confidence"], 9.30)
+             popen.assert_called_once_with(
+-                ["tesseract", "input.bmp", "stdout", "-psm", "0"],
++                ["@tesseract@/bin/tesseract", "input.bmp", "stdout", "-psm", "0"],
+                 stdin=subprocess.PIPE,
+                 shell=False,
+                 startupinfo=None,
+@@ -507,7 +507,7 @@ class TestTesseract(BaseTest):
+             self.assertEqual(result["angle"], 90)
+             self.assertEqual(result["confidence"], 9.30)
+             popen.assert_called_once_with(
+-                ["tesseract", "input.bmp", "stdout", "-psm", "0", "-l", "fra"],
++                ["@tesseract@/bin/tesseract", "input.bmp", "stdout", "-psm", "0", "-l", "fra"],
+                 stdin=subprocess.PIPE,
+                 shell=False,
+                 startupinfo=None,
+@@ -534,7 +534,7 @@ class TestTesseract(BaseTest):
+             with self.assertRaises(tesseract.TesseractError) as te:
+                 tesseract.detect_orientation(self.image)
+             popen.assert_called_once_with(
+-                ["tesseract", "input.bmp", "stdout", "-psm", "0"],
++                ["@tesseract@/bin/tesseract", "input.bmp", "stdout", "-psm", "0"],
+                 stdin=subprocess.PIPE,
+                 shell=False,
+                 startupinfo=None,
+@@ -568,7 +568,7 @@ class TestTesseract(BaseTest):
+             with self.assertRaises(tesseract.TesseractError) as te:
+                 tesseract.detect_orientation(self.image)
+             popen.assert_called_once_with(
+-                ["tesseract", "input.bmp", "stdout", "-psm", "0"],
++                ["@tesseract@/bin/tesseract", "input.bmp", "stdout", "-psm", "0"],
+                 stdin=subprocess.PIPE,
+                 shell=False,
+                 startupinfo=None,
diff --git a/nixpkgs/pkgs/development/python-modules/pyoctoprintapi/default.nix b/nixpkgs/pkgs/development/python-modules/pyoctoprintapi/default.nix
new file mode 100644
index 000000000000..0b6bb48857bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyoctoprintapi/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# propagated
+, aiohttp
+
+# tests
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+let
+  pname = "pyoctoprintapi";
+  version = "0.1.12";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "rfleming71";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Jf/zYnBHVl3TYxFy9Chy6qNH/eCroZkmUOEWfd62RIo=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  pythonImportsCheck = [
+    "pyoctoprintapi"
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Simple async wrapper around the Octoprint API";
+    homepage = "https://github.com/rfleming71/pyoctoprintapi";
+    changelog = "https://github.com/rfleming71/pyoctoprintapi/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers= with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyodbc/default.nix b/nixpkgs/pkgs/development/python-modules/pyodbc/default.nix
new file mode 100644
index 000000000000..d8cf1f260da2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyodbc/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, pythonOlder
+, unixODBC
+}:
+
+buildPythonPackage rec {
+  pname = "pyodbc";
+  version = "4.0.39";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7" || isPyPy; # use pypypdbc instead
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5Si7cN1tYpnuQphokl3whm4+kZx3K57/ecjheSDY8RY=";
+  };
+
+  nativeBuildInputs = [
+    unixODBC  # for odbc_config
+  ];
+
+  buildInputs = [
+    unixODBC
+  ];
+
+  # Tests require a database server
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyodbc"
+  ];
+
+  meta = with lib; {
+    description = "Python ODBC module to connect to almost any database";
+    homepage = "https://github.com/mkleehammer/pyodbc";
+    changelog = "https://github.com/mkleehammer/pyodbc/releases/tag/${version}";
+    license = licenses.mit;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyogg/default.nix b/nixpkgs/pkgs/development/python-modules/pyogg/default.nix
new file mode 100644
index 000000000000..3edf3768956f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyogg/default.nix
@@ -0,0 +1,36 @@
+{ stdenv, lib, fetchPypi, buildPythonPackage, libvorbis, flac, libogg, libopus, opusfile, substituteAll }:
+
+buildPythonPackage rec {
+    pname = "PyOgg";
+    version = "0.6.9a1";
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "0xabqwyknpvfc53s7il5pq6b07fcaqvz5bi5vbs3pbaw8602qvim";
+    };
+
+    buildInputs = [ libvorbis flac libogg libopus ];
+    propagatedBuidInputs = [ libvorbis flac libogg libopus opusfile ];
+    # There are no tests in this package.
+    doCheck = false;
+    patchFlags = [ "-p1" "--binary" ]; # patch has dos style eol
+    patches = [
+      (substituteAll {
+        src = ./pyogg-paths.patch;
+        flacLibPath="${flac.out}/lib/libFLAC${stdenv.hostPlatform.extensions.sharedLibrary}";
+        oggLibPath="${libogg}/lib/libogg${stdenv.hostPlatform.extensions.sharedLibrary}";
+        vorbisLibPath="${libvorbis}/lib/libvorbis${stdenv.hostPlatform.extensions.sharedLibrary}";
+        vorbisFileLibPath="${libvorbis}/lib/libvorbisfile${stdenv.hostPlatform.extensions.sharedLibrary}";
+        vorbisEncLibPath="${libvorbis}/lib/libvorbisenc${stdenv.hostPlatform.extensions.sharedLibrary}";
+        opusLibPath="${libopus}/lib/libopus${stdenv.hostPlatform.extensions.sharedLibrary}";
+        opusFileLibPath="${opusfile}/lib/libopusfile${stdenv.hostPlatform.extensions.sharedLibrary}";
+      })
+    ];
+
+  meta = {
+    description = "Xiph.org's Ogg Vorbis, Opus and FLAC for Python";
+    homepage = "https://github.com/Zuzu-Typ/PyOgg";
+    license = lib.licenses.publicDomain;
+    maintainers = with lib.maintainers; [ pmiddend ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyogg/pyogg-paths.patch b/nixpkgs/pkgs/development/python-modules/pyogg/pyogg-paths.patch
new file mode 100644
index 000000000000..c7f1933878b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyogg/pyogg-paths.patch
@@ -0,0 +1,79 @@
+diff --git a/pyogg/flac.py b/pyogg/flac.py

+index 37cc788..9fb7e95 100644

+--- a/pyogg/flac.py

++++ b/pyogg/flac.py

+@@ -49,7 +49,7 @@ __here = os.getcwd()

+ libflac = None

+ 

+ try:

+-    libflac = ExternalLibrary.load("FLAC", tests = [lambda lib: hasattr(lib, "FLAC__EntropyCodingMethodTypeString")])

++    libflac = ctypes.CDLL('@flacLibPath@')

+ except ExternalLibraryError:

+     pass

+ except:

+diff --git a/pyogg/ogg.py b/pyogg/ogg.py

+index 7264774..2702e24 100644

+--- a/pyogg/ogg.py

++++ b/pyogg/ogg.py

+@@ -54,7 +54,7 @@ __here = os.getcwd()

+ libogg = None

+ 

+ try:

+-    libogg = ExternalLibrary.load("ogg", tests = [lambda lib: hasattr(lib, "oggpack_writeinit")])

++    libogg = ctypes.CDLL('@oggLibPath@')

+ except ExternalLibraryError:

+     pass

+ except:

+diff --git a/pyogg/opus.py b/pyogg/opus.py

+index 81e73da..640e59c 100644

+--- a/pyogg/opus.py

++++ b/pyogg/opus.py

+@@ -130,7 +130,7 @@ __here = os.getcwd()

+ libopus = None

+ 

+ try:

+-    libopus = ExternalLibrary.load("opus", tests = [lambda lib: hasattr(lib, "opus_encoder_get_size")])

++    libopus = ctypes.CDLL('@opusLibPath@')

+ except ExternalLibraryError:

+     pass

+ except:

+@@ -139,7 +139,7 @@ except:

+ libopusfile = None

+ 

+ try:

+-    libopusfile = ExternalLibrary.load("opusfile", tests = [lambda lib: hasattr(lib, "opus_head_parse")])

++    libopusfile = ctypes.CDLL('@opusFileLibPath@')

+ except ExternalLibraryError:

+     pass

+ except:

+diff --git a/pyogg/vorbis.py b/pyogg/vorbis.py

+index a8e4792..6f44d2d 100644

+--- a/pyogg/vorbis.py

++++ b/pyogg/vorbis.py

+@@ -52,7 +52,7 @@ __here = os.getcwd()

+ libvorbis = None

+ 

+ try:

+-    libvorbis = ExternalLibrary.load("vorbis", tests = [lambda lib: hasattr(lib, "vorbis_info_init")])

++    libvorbis = ctypes.CDLL('@vorbisLibPath@')

+ except ExternalLibraryError:

+     pass

+ except:

+@@ -61,7 +61,7 @@ except:

+ libvorbisfile = None

+ 

+ try:

+-    libvorbisfile = ExternalLibrary.load("vorbisfile", tests = [lambda lib: hasattr(lib, "ov_clear")])

++    libvorbisfile = ctypes.CDLL('@vorbisFileLibPath@')

+ except ExternalLibraryError:

+     pass

+ except:

+@@ -70,7 +70,7 @@ except:

+ libvorbisenc = None

+ 

+ try:

+-    libvorbisenc = ExternalLibrary.load("vorbisenc", tests = [lambda lib: hasattr(lib, "vorbis_encode_init")])

++    libvorbisenc = ctypes.CDLL('@vorbisEncLibPath@')

+ except ExternalLibraryError:

+     pass

+ except:

diff --git a/nixpkgs/pkgs/development/python-modules/pyombi/default.nix b/nixpkgs/pkgs/development/python-modules/pyombi/default.nix
new file mode 100644
index 000000000000..912c076ae358
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyombi/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyombi";
+  version = "0.1.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ykbmdc2v05ly9q358j7g73ma9fsqdlclc8i0k1yd0bn7219icpx";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "pyombi" ];
+
+  meta = with lib; {
+    description = "Python module to retrieve information from Ombi";
+    homepage = "https://github.com/larssont/pyombi";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyomo/default.nix b/nixpkgs/pkgs/development/python-modules/pyomo/default.nix
new file mode 100644
index 000000000000..9e0de7f3915d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyomo/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, parameterized
+, ply
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyomo";
+  version = "6.6.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    repo = "pyomo";
+    owner = "pyomo";
+    rev = "refs/tags/${version}";
+    hash = "sha256-hh2sfWOUp3ac75NEuTrw3YkvS7hXpzJp39v6cfrhNiQ=";
+  };
+
+  propagatedBuildInputs = [
+    ply
+  ];
+
+  nativeCheckInputs = [
+    parameterized
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyomo"
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  disabledTestPaths = [
+    # Don't test the documentation and the examples
+    "doc/"
+    "examples/"
+    # Tests don't work properly in the sandbox
+    "pyomo/environ/tests/test_environ.py"
+  ];
+
+  disabledTests = [
+    # Test requires lsb_release
+    "test_get_os_version"
+  ];
+
+  meta = with lib; {
+    description = "Python Optimization Modeling Objects";
+    homepage = "http://pyomo.org";
+    changelog = "https://github.com/Pyomo/pyomo/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyopencl/default.nix b/nixpkgs/pkgs/development/python-modules/pyopencl/default.nix
new file mode 100644
index 000000000000..9f33457730f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyopencl/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, stdenv
+, fetchPypi
+, buildPythonPackage
+, appdirs
+, cffi
+, decorator
+, mako
+, mesa_drivers
+, numpy
+, ocl-icd
+, oldest-supported-numpy
+, opencl-headers
+, platformdirs
+, pybind11
+, pytest
+, pytestCheckHook
+, pytools
+, setuptools
+, six
+, wheel
+}:
+
+let
+  os-specific-buildInputs =
+    if stdenv.isDarwin then [ mesa_drivers.dev ] else [ ocl-icd ];
+in buildPythonPackage rec {
+  pname = "pyopencl";
+  version = "2023.1.4";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-IgF078qQDp1d5a7yqht3pvJVBQHekrA1qRATrq5NTF4=";
+  };
+
+  nativeBuildInputs = [
+    oldest-supported-numpy
+    setuptools
+    wheel
+  ];
+
+  buildInputs = [ opencl-headers pybind11 ] ++ os-specific-buildInputs;
+
+  propagatedBuildInputs = [
+    appdirs
+    cffi
+    decorator
+    mako
+    numpy
+    platformdirs
+    pytools
+    six
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  preBuild = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  # gcc: error: pygpu_language_opencl.cpp: No such file or directory
+  doCheck = false;
+
+  pythonImportsCheck = [ "pyopencl" ];
+
+  meta = with lib; {
+    description = "Python wrapper for OpenCL";
+    homepage = "https://github.com/pyopencl/pyopencl";
+    license = licenses.mit;
+    maintainers = [ maintainers.fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyopengl-accelerate/default.nix b/nixpkgs/pkgs/development/python-modules/pyopengl-accelerate/default.nix
new file mode 100644
index 000000000000..f85e825f2645
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyopengl-accelerate/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, pythonAtLeast
+, fetchPypi
+, cython_3
+, numpy
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pyopengl-accelerate";
+  version = "3.1.7";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "PyOpenGL-accelerate";
+    inherit version;
+    hash = "sha256-KxI2ISc6k59/0uwidUHjmfm11OgV1prgvbG2xwopNoA=";
+  };
+
+  nativeBuildInputs = [
+    cython_3
+    numpy
+    setuptools
+    wheel
+  ];
+
+  meta = {
+    description = "This set of C (Cython) extensions provides acceleration of common operations for slow points in PyOpenGL 3.x";
+    homepage = "https://pyopengl.sourceforge.net/";
+    maintainers = with lib.maintainers; [ laikq ];
+    license = lib.licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyopengl/default.nix b/nixpkgs/pkgs/development/python-modules/pyopengl/default.nix
new file mode 100644
index 000000000000..428bd4084ae0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyopengl/default.nix
@@ -0,0 +1,77 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchPypi
+, pkgs
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "pyopengl";
+  version = "3.1.6";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "PyOpenGL";
+    inherit version;
+    hash = "sha256-jqbIdzkn7adAW//G9buTvoFWmnsFyMrFDNlOlp3OXic=";
+  };
+
+  propagatedBuildInputs = [ pillow ];
+
+  patchPhase = let
+    ext = stdenv.hostPlatform.extensions.sharedLibrary; in lib.optionalString (!stdenv.isDarwin) ''
+    # Theses lines are patching the name of dynamic libraries
+    # so pyopengl can find them at runtime.
+    substituteInPlace OpenGL/platform/glx.py \
+      --replace "'GL'" "'${pkgs.libGL}/lib/libGL${ext}'" \
+      --replace "'GLU'" "'${pkgs.libGLU}/lib/libGLU${ext}'" \
+      --replace "'glut'" "'${pkgs.freeglut}/lib/libglut${ext}'" \
+      --replace "'GLESv1_CM'," "'${pkgs.libGL}/lib/libGLESv1_CM${ext}'," \
+      --replace "'GLESv2'," "'${pkgs.libGL}/lib/libGLESv2${ext}',"
+    substituteInPlace OpenGL/platform/egl.py \
+      --replace "('OpenGL','GL')" "('${pkgs.libGL}/lib/libOpenGL${ext}', '${pkgs.libGL}/lib/libGL${ext}')" \
+      --replace "'GLU'," "'${pkgs.libGLU}/lib/libGLU${ext}'," \
+      --replace "'glut'," "'${pkgs.freeglut}/lib/libglut${ext}'," \
+      --replace "'GLESv1_CM'," "'${pkgs.libGL}/lib/libGLESv1_CM${ext}'," \
+      --replace "'GLESv2'," "'${pkgs.libGL}/lib/libGLESv2${ext}'," \
+      --replace "'EGL'," "'${pkgs.libGL}/lib/libEGL${ext}',"
+    substituteInPlace OpenGL/platform/darwin.py \
+      --replace "'OpenGL'," "'${pkgs.libGL}/lib/libGL${ext}'," \
+      --replace "'GLUT'," "'${pkgs.freeglut}/lib/libglut${ext}',"
+    # TODO: patch 'gle' in OpenGL/platform/egl.py
+  '' + ''
+    # https://github.com/NixOS/nixpkgs/issues/76822
+    # pyopengl introduced a new "robust" way of loading libraries in 3.1.4.
+    # The later patch of the filepath does not work anymore because
+    # pyopengl takes the "name" (for us: the path) and tries to add a
+    # few suffix during its loading phase.
+    # The following patch put back the "name" (i.e. the path) in the
+    # list of possible files.
+    substituteInPlace OpenGL/platform/ctypesloader.py \
+      --replace "filenames_to_try = []" "filenames_to_try = [name]"
+  '';
+
+  # Need to fix test runner
+  # Tests have many dependencies
+  # Extension types could not be found.
+  # Should run test suite from $out/${python.sitePackages}
+  doCheck = false; # does not affect pythonImportsCheck
+
+  # OpenGL looks for libraries during import, making this a somewhat decent test of the flaky patching above.
+  pythonImportsCheck = "OpenGL";
+
+  meta = with lib; {
+    homepage = "https://pyopengl.sourceforge.net/";
+    description = "PyOpenGL, the Python OpenGL bindings";
+    longDescription = ''
+      PyOpenGL is the cross platform Python binding to OpenGL and
+      related APIs.  The binding is created using the standard (in
+      Python 2.5) ctypes library, and is provided under an extremely
+      liberal BSD-style Open-Source license.
+    '';
+    license = licenses.bsd3;
+    platforms = platforms.mesaPlatforms;
+  };
+
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyopenssl/default.nix b/nixpkgs/pkgs/development/python-modules/pyopenssl/default.nix
new file mode 100644
index 000000000000..bc841cc2fd4e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyopenssl/default.nix
@@ -0,0 +1,100 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, openssl
+, cryptography
+, pytestCheckHook
+, pretend
+, sphinxHook
+, sphinx-rtd-theme
+, flaky
+}:
+
+buildPythonPackage rec {
+  pname = "pyopenssl";
+  version = "23.2.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "pyOpenSSL";
+    inherit version;
+    hash = "sha256-J2+TH1WkUufeppxxc+mE6ypEB85BPJGKo0tV+C+bi6w=";
+  };
+
+  outputs = [
+    "out"
+    "dev"
+    "doc"
+  ];
+
+  nativeBuildInputs = [
+    openssl
+    sphinxHook
+    sphinx-rtd-theme
+  ];
+
+  postPatch = ''
+    # remove cryptography pin
+    sed -i "/cryptography/ s/,<[0-9]*//g" setup.py
+  '';
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  nativeCheckInputs = [
+    flaky
+    pretend
+    pytestCheckHook
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  preCheck = ''
+    export LANG="en_US.UTF-8"
+  '';
+
+  disabledTests = [
+    # https://github.com/pyca/pyopenssl/issues/692
+    # These tests, we disable always.
+    "test_set_default_verify_paths"
+    "test_fallback_default_verify_paths"
+    # https://github.com/pyca/pyopenssl/issues/768
+    "test_wantWriteError"
+    # https://github.com/pyca/pyopenssl/issues/1043
+    "test_alpn_call_failure"
+  ] ++ lib.optionals (lib.hasPrefix "libressl" openssl.meta.name) [
+    # https://github.com/pyca/pyopenssl/issues/791
+    # These tests, we disable in the case that libressl is passed in as openssl.
+    "test_op_no_compression"
+    "test_npn_advertise_error"
+    "test_npn_select_error"
+    "test_npn_client_fail"
+    "test_npn_success"
+    "test_use_certificate_chain_file_unicode"
+    "test_use_certificate_chain_file_bytes"
+    "test_add_extra_chain_cert"
+    "test_set_session_id_fail"
+    "test_verify_with_revoked"
+    "test_set_notAfter"
+    "test_set_notBefore"
+  ] ++ lib.optionals (lib.versionAtLeast (lib.getVersion openssl.name) "1.1") [
+    # these tests are extremely tightly wed to the exact output of the openssl cli tool, including exact punctuation.
+    "test_dump_certificate"
+    "test_dump_privatekey_text"
+    "test_dump_certificate_request"
+    "test_export_text"
+  ] ++ lib.optionals stdenv.is32bit [
+    # https://github.com/pyca/pyopenssl/issues/974
+    "test_verify_with_time"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper around the OpenSSL library";
+    homepage = "https://github.com/pyca/pyopenssl";
+    changelog = "https://github.com/pyca/pyopenssl/blob/${version}/CHANGELOG.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyopenuv/default.nix b/nixpkgs/pkgs/development/python-modules/pyopenuv/default.nix
new file mode 100644
index 000000000000..c57fd7f12276
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyopenuv/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, aiohttp
+, aresponses
+, backoff
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyopenuv";
+  version = "2023.11.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = "pyopenuv";
+    rev = "refs/tags/${version}";
+    hash = "sha256-qlyKLovM0h3iWvhGecaFPswnchZXPNkr0PbSqK2UW0c=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    backoff
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Ignore the examples as they are prefixed with test_
+    "examples/"
+  ];
+
+  pythonImportsCheck = [
+    "pyopenuv"
+  ];
+
+  meta = with lib; {
+    description = "Python API to retrieve data from openuv.io";
+    homepage = "https://github.com/bachya/pyopenuv";
+    changelog = "https://github.com/bachya/pyopenuv/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyopnsense/default.nix b/nixpkgs/pkgs/development/python-modules/pyopnsense/default.nix
new file mode 100644
index 000000000000..a1df192ac223
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyopnsense/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fixtures
+, mock
+, pbr
+, pytestCheckHook
+, pythonOlder
+, requests
+, testtools
+}:
+
+buildPythonPackage rec {
+  pname = "pyopnsense";
+  version = "0.4.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3DKlVrOtMa55gTu557pgojRpdgrO5pEZ3L+9gKoW9yg=";
+  };
+
+  propagatedBuildInputs = [
+    pbr
+    requests
+  ];
+
+  nativeCheckInputs = [
+    fixtures
+    mock
+    pytestCheckHook
+    testtools
+  ];
+
+  pythonImportsCheck = [
+    "pyopnsense"
+  ];
+
+  meta = with lib; {
+    description = "Python client for the OPNsense API";
+    homepage = "https://github.com/mtreinish/pyopnsense";
+    changelog = "https://github.com/mtreinish/pyopnsense/releases/tag/${version}";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyoppleio/default.nix b/nixpkgs/pkgs/development/python-modules/pyoppleio/default.nix
new file mode 100644
index 000000000000..f0d11d86c7c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyoppleio/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, crc16
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyoppleio";
+  version = "1.0.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-S1w3pPqhX903kkXUq9ALz0+zRvNGOimLughRRVKjV8E=";
+  };
+
+  propagatedBuildInputs = [
+    crc16
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyoppleio"
+  ];
+
+  meta = with lib; {
+    description = "Library for interacting with OPPLE lights";
+    homepage = "https://github.com/jedmeng/python-oppleio";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyorthanc/default.nix b/nixpkgs/pkgs/development/python-modules/pyorthanc/default.nix
new file mode 100644
index 000000000000..f164e91b7b9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyorthanc/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, pythonRelaxDepsHook
+, poetry-core
+, httpx
+, pydicom
+}:
+
+buildPythonPackage rec {
+  pname = "pyorthanc";
+  version = "1.13.1";
+  disabled = pythonOlder "3.8";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "gacou54";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-LahLR+LbppcPKs0gPT2lEP48XG6pbGMvCBW/EwAIFDQ=";
+  };
+
+  nativeBuildInputs = [ pythonRelaxDepsHook poetry-core ];
+
+  propagatedBuildInputs = [ httpx pydicom ];
+
+  pythonRelaxDeps = [
+    "httpx"
+  ];
+
+  doCheck = false;  # requires orthanc server (not in Nixpkgs)
+
+  pythonImportsCheck = [
+    "pyorthanc"
+  ];
+
+  meta = with lib; {
+    description = "Python library that wraps the Orthanc REST API";
+    homepage = "https://github.com/gacou54/pyorthanc";
+    changelog = "https://github.com/gacou54/pyorthanc/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyosf/default.nix b/nixpkgs/pkgs/development/python-modules/pyosf/default.nix
new file mode 100644
index 000000000000..3a23d687b8e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyosf/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyosf";
+  version = "1.0.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "psychopy";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Yhb6HSnLdFzWouse/RKZ8SIbMia/hhD8TAovdqmvd7o=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner', " ""
+  '';
+
+  preBuild = "export HOME=$TMP";
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Tests require network access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyosf"
+  ];
+
+  meta = with lib; {
+    description = "Pure Python library for simple sync with Open Science Framework";
+    homepage = "https://github.com/psychopy/pyosf";
+    changelog = "https://github.com/psychopy/pyosf/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyosmium/default.nix b/nixpkgs/pkgs/development/python-modules/pyosmium/default.nix
new file mode 100644
index 000000000000..40090532fea1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyosmium/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, cmake
+, libosmium
+, protozero
+, boost
+, expat
+, bzip2
+, zlib
+, pybind11
+, shapely
+, pythonOlder
+, isPyPy
+, lz4
+, requests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyosmium";
+  version = "3.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6" || isPyPy;
+
+  src = fetchFromGitHub {
+    owner = "osmcode";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+YJQGPQm2FGOPhNzlXX2GM+ad4QdipJhwViOKGHtqBk=";
+  };
+
+  patches = [
+    # Compatibility with recent pybind versions
+    (fetchpatch {
+      url = "https://github.com/osmcode/pyosmium/commit/31b1363389b423f49e14140ce868ecac83e92f69.patch";
+      hash = "sha256-maBuwzyZ4/wVLLGVr4gZFZDKvJckUXiBluxZRPGETag=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    cmake
+  ];
+
+  buildInputs = [
+    libosmium
+    protozero
+    boost
+    expat
+    bzip2
+    zlib
+    pybind11
+    lz4
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  preBuild = "cd ..";
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    shapely
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for libosmium";
+    homepage = "https://osmcode.org/pyosmium";
+    changelog = "https://github.com/osmcode/pyosmium/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ sikmir ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyotgw/default.nix b/nixpkgs/pkgs/development/python-modules/pyotgw/default.nix
new file mode 100644
index 000000000000..71ef391cb49f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyotgw/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial-asyncio
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyotgw";
+  version = "2.1.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "mvn23";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-XIwBGjvIulKLmYZIorKIJwoHTNOIYYX8US2Na8MZ2LA=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial-asyncio
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyotgw"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interact the OpenTherm Gateway";
+    homepage = "https://github.com/mvn23/pyotgw";
+    changelog = "https://github.com/mvn23/pyotgw/blob/${version}/CHANGELOG.md";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyotp/default.nix b/nixpkgs/pkgs/development/python-modules/pyotp/default.nix
new file mode 100644
index 000000000000..df209f092bc5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyotp/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyotp";
+  version = "2.9.0";
+  disabled = pythonOlder "3.7";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NGtmQuDb3eO0/1qTC2ZMqCq/oRY1btSMxCx9ZZDTb2M=";
+  };
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pyotp" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/pyauth/pyotp/blob/v${version}/Changes.rst";
+    description = "Python One Time Password Library";
+    homepage = "https://github.com/pyauth/pyotp";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyoutbreaksnearme/default.nix b/nixpkgs/pkgs/development/python-modules/pyoutbreaksnearme/default.nix
new file mode 100644
index 000000000000..0c07a12fc1f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyoutbreaksnearme/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, certifi
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, ujson
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "pyoutbreaksnearme";
+  version = "2023.10.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = "pyoutbreaksnearme";
+    rev = "refs/tags/${version}";
+    hash = "sha256-G+/ooNhiYOaV0kjfr8Z1d31XxRYFArQnt1oIuMQfXdY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    certifi
+    ujson
+    yarl
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Ignore the examples directory as the files are prefixed with test_.
+    "examples/"
+  ];
+
+  pythonImportsCheck = [
+    "pyoutbreaksnearme"
+  ];
+
+  meta = with lib; {
+    description = "Library for retrieving data from for Outbreaks Near Me";
+    homepage = "https://github.com/bachya/pyoutbreaksnearme";
+    changelog = "https://github.com/bachya/pyoutbreaksnearme/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyoverkiz/default.nix b/nixpkgs/pkgs/development/python-modules/pyoverkiz/default.nix
new file mode 100644
index 000000000000..af384e0a228c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyoverkiz/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, aiohttp
+, attrs
+, backoff
+, backports-strenum
+, boto3
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pyhumps
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, warrant-lite
+}:
+
+buildPythonPackage rec {
+  pname = "pyoverkiz";
+  version = "1.13.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "iMicknl";
+    repo = "python-overkiz-api";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-OvzK7NHRcv/UGLLZ60yNBNdK/J21iFh8myCvdBec+7Q=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'pyhumps = "^3.0.2,!=3.7.3"' 'pyhumps = "^3.0.2"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    attrs
+    backoff
+    backports-strenum
+    boto3
+    pyhumps
+    warrant-lite
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyoverkiz"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with the Somfy TaHoma API or other OverKiz APIs";
+    homepage = "https://github.com/iMicknl/python-overkiz-api";
+    changelog = "https://github.com/iMicknl/python-overkiz-api/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyowm/default.nix b/nixpkgs/pkgs/development/python-modules/pyowm/default.nix
new file mode 100644
index 000000000000..d95cda12d600
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyowm/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, geojson
+, pysocks
+, pythonOlder
+, requests
+, pytestCheckHook
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyowm";
+  version = "3.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "csparpa";
+    repo = pname;
+    rev = version;
+    hash = "sha256-cSOhm3aDksLBChZzgw1gjUjLQkElR2/xGFMOb9K9RME=";
+  };
+
+  pythonRelaxDeps = [
+    "geojson"
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    geojson
+    pysocks
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Run only tests which don't require network access
+  pytestFlagsArray = [
+    "tests/unit"
+  ];
+
+  pythonImportsCheck = [
+    "pyowm"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper around the OpenWeatherMap web API";
+    homepage = "https://pyowm.readthedocs.io/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyownet/default.nix b/nixpkgs/pkgs/development/python-modules/pyownet/default.nix
new file mode 100644
index 000000000000..9a368c26087e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyownet/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pyownet";
+  version = "0.10.0.post1";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4f2fa4471c2f806b35090bdc6c092305c6eded3ff3736f8b586d35bdb157de62";
+  };
+
+  postPatch = ''
+    sed -i '/use_2to3/d' setup.py
+  '';
+
+  # tests access network
+  doCheck = false;
+
+  pythonImportsCheck = [ "pyownet.protocol" ];
+
+  meta = with lib; {
+    description = "Python OWFS client library (owserver protocol)";
+    homepage = "https://github.com/miccoli/pyownet";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyp/default.nix b/nixpkgs/pkgs/development/python-modules/pyp/default.nix
new file mode 100644
index 000000000000..b9bcb978be85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyp/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, coreutils
+, pythonOlder
+, astunparse
+, flit-core
+, jq
+, bc
+}:
+
+buildPythonPackage rec {
+  pname = "pyp";
+  version = "1.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "hauntsaninja";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-A1Ip41kxH17BakHEWEuymfa24eBEl5FIHAWL+iZFM4I=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.9") [
+    astunparse
+  ];
+
+  preCheck = ''
+    export PATH=$out/bin:$PATH
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    coreutils
+    jq
+    bc
+  ];
+
+  pythonImportsCheck = [
+    "pyp"
+  ];
+
+  meta = with lib; {
+    description = "Easily run Python at the shell! Magical, but never mysterious";
+    homepage = "https://github.com/hauntsaninja/pyp";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rmcgibbo ];
+   };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypandoc/default.nix b/nixpkgs/pkgs/development/python-modules/pypandoc/default.nix
new file mode 100644
index 000000000000..ad81b8e7f068
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypandoc/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pandoc
+, pandocfilters
+, poetry-core
+, pythonOlder
+, substituteAll
+, texliveSmall
+}:
+
+buildPythonPackage rec {
+  pname = "pypandoc";
+  version = "1.10";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "JessicaTegner";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256:05m585l4sipjzpkrv4yj5s7w45yxhxlym55lkhnavsshlvisinkz";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./static-pandoc-path.patch;
+      pandoc = "${lib.getBin pandoc}/bin/pandoc";
+      pandocVersion = pandoc.version;
+    })
+    ./skip-tests.patch
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    texliveSmall
+    pandocfilters
+  ];
+
+  pythonImportsCheck = [
+    "pypandoc"
+  ];
+
+  meta = with lib; {
+    description = "Thin wrapper for pandoc";
+    homepage = "https://github.com/JessicaTegner/pypandoc";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sternenseemann bennofs ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypandoc/skip-tests.patch b/nixpkgs/pkgs/development/python-modules/pypandoc/skip-tests.patch
new file mode 100644
index 000000000000..b7788f5d46e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypandoc/skip-tests.patch
@@ -0,0 +1,12 @@
+diff --git a/tests.py b/tests.py
+index 704f049..ef68728 100755
+--- a/tests.py
++++ b/tests.py
+@@ -225,6 +225,7 @@ class TestPypandoc(unittest.TestCase):
+             received = pypandoc.convert_file(file_url, 'rst')
+             self.assertEqualExceptForNewlineEnd(expected, received)
+ 
++    @unittest.skip("no network access during checkPhase")
+     def test_basic_conversion_from_http_url(self):
+         url = 'https://raw.githubusercontent.com/bebraw/pypandoc/master/README.md'
+         received = pypandoc.convert_file(url, 'html')
diff --git a/nixpkgs/pkgs/development/python-modules/pypandoc/static-pandoc-path.patch b/nixpkgs/pkgs/development/python-modules/pypandoc/static-pandoc-path.patch
new file mode 100644
index 000000000000..cff02b01b35d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypandoc/static-pandoc-path.patch
@@ -0,0 +1,12 @@
+diff --git a/pypandoc/__init__.py b/pypandoc/__init__.py
+index b8f4e9a..295e182 100644
+--- a/pypandoc/__init__.py
++++ b/pypandoc/__init__.py
+@@ -771,5 +771,5 @@ def clean_pandocpath_cache():
+     __pandoc_path = None
+ 
+ 
+-__version = None
+-__pandoc_path = None
++__version = "@pandocVersion@"
++__pandoc_path = "@pandoc@"
diff --git a/nixpkgs/pkgs/development/python-modules/pyparser/default.nix b/nixpkgs/pkgs/development/python-modules/pyparser/default.nix
new file mode 100644
index 000000000000..8e4deafd542c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyparser/default.nix
@@ -0,0 +1,27 @@
+{ buildPythonPackage, lib, fetchFromBitbucket
+, parse
+}:
+
+buildPythonPackage rec {
+  pname = "pyparser";
+  version = "1.0";
+
+  # Missing tests on Pypi
+  src = fetchFromBitbucket {
+    owner = "rw_grim";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0aplb4zdpgbpmaw9qj0vr7qip9q5w7sl1m1lp1nc9jmjfij9i0hf";
+  };
+
+  postPatch = "sed -i 's/parse==/parse>=/' requirements.txt";
+
+  propagatedBuildInputs = [ parse ];
+
+  meta = {
+    description = "Simple library that makes it easier to parse files";
+    homepage = "https://bitbucket.org/rw_grim/pyparser";
+    license = lib.licenses.gpl3;
+    maintainers = [ lib.maintainers.nico202 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyparsing/default.nix b/nixpkgs/pkgs/development/python-modules/pyparsing/default.nix
new file mode 100644
index 000000000000..e621a80d7acd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyparsing/default.nix
@@ -0,0 +1,53 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, flit-core
+, jinja2
+, pytestCheckHook
+, railroad-diagrams
+, pyparsing
+}:
+
+buildPythonPackage rec {
+  pname = "pyparsing";
+  version = "3.0.9";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pyparsing";
+    repo = pname;
+    rev = "pyparsing_${version}";
+    hash = "sha256-aCRyJQyLf8qQ6NO41q+HC856TjIHzIt0vyVBLV+3teE=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  # circular dependencies with pytest if enabled by default
+  doCheck = false;
+  nativeCheckInputs = [
+    jinja2
+    pytestCheckHook
+    railroad-diagrams
+  ];
+
+  pythonImportsCheck = [ "pyparsing" ];
+
+  passthru.tests = {
+    check = pyparsing.overridePythonAttrs (_: { doCheck = true; });
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/pyparsing/pyparsing";
+    description = "Python library for creating PEG parsers";
+    longDescription = ''
+      The pyparsing module is an alternative approach to creating and executing
+      simple grammars, vs. the traditional lex/yacc approach, or the use of
+      regular expressions. The pyparsing module provides a library of classes
+      that client code uses to construct the grammar directly in Python code.
+   '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ kamadorueda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyparted/default.nix b/nixpkgs/pkgs/development/python-modules/pyparted/default.nix
new file mode 100644
index 000000000000..84d8439a5360
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyparted/default.nix
@@ -0,0 +1,49 @@
+{ lib, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, isPyPy
+, pkgs
+, python
+, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyparted";
+  version = "3.13.0";
+  disabled = isPyPy;
+
+  src = fetchFromGitHub {
+    repo = pname;
+    owner = "dcantrell";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-AiUCCrEbDD0OxrvXs1YN3/1IE7SuVasC2YCirIG58iU=";
+  };
+
+  postPatch = ''
+    sed -i -e 's|mke2fs|${pkgs.e2fsprogs}/bin/mke2fs|' tests/baseclass.py
+    sed -i -e '
+      s|e\.path\.startswith("/tmp/temp-device-")|"temp-device-" in e.path|
+    ' tests/test__ped_ped.py
+  '' + lib.optionalString stdenv.isi686 ''
+    # remove some integers in this test case which overflow on 32bit systems
+    sed -i -r -e '/class *UnitGetSizeTestCase/,/^$/{/[0-9]{11}/d}' \
+      tests/test__ped_ped.py
+  '';
+
+  preConfigure = ''
+    PATH="${pkgs.parted}/sbin:$PATH"
+  '';
+
+  nativeBuildInputs = [ pkgs.pkg-config ];
+  nativeCheckInputs = [ six pytestCheckHook ];
+  propagatedBuildInputs = [ pkgs.parted ];
+
+  meta = with lib; {
+    homepage = "https://github.com/dcantrell/pyparted/";
+    description = "Python interface for libparted";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ lsix ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypass/default.nix b/nixpkgs/pkgs/development/python-modules/pypass/default.nix
new file mode 100644
index 000000000000..9c497b3e3b50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypass/default.nix
@@ -0,0 +1,84 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, click
+, colorama
+, enum34
+, fetchPypi
+, git
+, gnugrep
+, gnupg
+, nose
+, pbr
+, pexpect
+, pythonAtLeast
+, pythonOlder
+, substituteAll
+, tree
+, xclip
+}:
+
+# Use the `pypass` top-level attribute, if you're interested in the
+# application
+buildPythonPackage rec {
+  pname = "pypass";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1nm4mj7pd7gz4ghic6b3wrnd1b59hd1f0axavdabfl79wy511l7r";
+  };
+
+  # Set absolute nix store paths to the executables that pypass uses
+  patches = [
+    (substituteAll {
+      src = ./mark-executables.patch;
+      git_exec = "${git}/bin/git";
+      grep_exec = "${gnugrep}/bin/grep";
+      gpg_exec = "${gnupg}/bin/gpg2";
+      tree_exec = "${tree}/bin/tree";
+      xclip_exec = "${xclip}/bin/xclip";
+    })
+  ];
+
+  # Remove enum34 requirement if Python >= 3.4
+  postPatch = lib.optionalString (pythonAtLeast "3.4") ''
+    substituteInPlace requirements.txt --replace "enum34" ""
+  '';
+
+  nativeBuildInputs = [ pbr ];
+
+  propagatedBuildInputs = [
+    click
+    colorama
+    pexpect
+  ] ++ lib.optional (pythonOlder "3.4") enum34;
+
+  nativeCheckInputs = [ nose ];
+
+  # Configuration so that the tests work
+  preCheck = ''
+    HOME=$TEMP ${git}/bin/git config --global user.email "nix-builder@nixos.org"
+    HOME=$TEMP ${git}/bin/git config --global user.name "Nix Builder"
+    HOME=$TEMP ${git}/bin/git config --global pull.ff only
+    HOME=$TEMP make setup_gpg
+  '';
+
+  # Run tests but exclude the test that uses clipboard as I wasn't able to make
+  # it work - probably the X clipboard just doesn't work in the build
+  # environment..
+  checkPhase = ''
+    runHook preCheck
+    HOME=$TEMP GNUPGHOME=pypass/tests/gnupg nosetests -v --exclude=test_show_clip .
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Password manager pass in Python";
+    homepage = "https://github.com/aviau/python-pass";
+    license = licenses.gpl3Plus;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypass/mark-executables.patch b/nixpkgs/pkgs/development/python-modules/pypass/mark-executables.patch
new file mode 100644
index 000000000000..9bde97c5110c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypass/mark-executables.patch
@@ -0,0 +1,255 @@
+diff --git a/Makefile b/Makefile
+index 1ef67c8..d49031a 100644
+--- a/Makefile
++++ b/Makefile
+@@ -16,5 +16,5 @@ test: kill build
+ setup_gpg: pypass/tests/gnupg
+ pypass/tests/gnupg: pypass/tests/test_key_sec.asc pypass/tests/test_ownertrust.txt
+ 	mkdir -m 700 -p pypass/tests/gnupg
+-	GNUPGHOME=pypass/tests/gnupg gpg --allow-secret-key-import --import pypass/tests/test_key_sec.asc
+-	GNUPGHOME=pypass/tests/gnupg gpg --import-ownertrust pypass/tests/test_ownertrust.txt
++	GNUPGHOME=pypass/tests/gnupg @gpg_exec@ --allow-secret-key-import --import pypass/tests/test_key_sec.asc
++	GNUPGHOME=pypass/tests/gnupg @gpg_exec@ --import-ownertrust pypass/tests/test_ownertrust.txt
+diff --git a/pypass/command.py b/pypass/command.py
+index 4616a5f..a72cf5d 100644
+--- a/pypass/command.py
++++ b/pypass/command.py
+@@ -173,7 +173,7 @@ def show(config, path, clip):
+     if clip:
+         xclip = subprocess.Popen(
+             [
+-                'xclip',
++                '@xclip_exec@',
+                 '-selection', 'clipboard'
+             ],
+             stdin=subprocess.PIPE
+@@ -206,7 +206,7 @@ def connect(config, path):
+ def ls(config, subfolder):
+     tree = subprocess.Popen(
+         [
+-            'tree',
++            '@tree_exec@',
+             '-C',
+             '-l',
+             '--noreport',
+@@ -239,7 +239,7 @@ def find(config, search_terms):
+ 
+     tree = subprocess.Popen(
+         [
+-            'tree',
++            '@tree_exec@',
+             '-C',
+             '-l',
+             '--noreport',
+@@ -273,7 +273,7 @@ def grep(config, search_string):
+             config['password_store'].get_decrypted_password(password)
+ 
+         grep = subprocess.Popen(
+-            ['grep', '-e', search_string],
++            ['@grep_exec@', '-e', search_string],
+             stdout=subprocess.PIPE,
+             stdin=subprocess.PIPE
+         )
+@@ -397,7 +397,7 @@ def git(config, commands):
+     else:
+         subprocess.call(
+             [
+-                'git',
++                '@git_exec@',
+                 '--git-dir=%s' % config['password_store'].git_dir,
+                 '--work-tree=%s' % config['password_store'].path,
+             ] + command_list,
+diff --git a/pypass/passwordstore.py b/pypass/passwordstore.py
+index 9de0376..8cf20a4 100644
+--- a/pypass/passwordstore.py
++++ b/pypass/passwordstore.py
+@@ -26,18 +26,7 @@ import re
+ from .entry_type import EntryType
+ 
+ # Find the right gpg binary
+-if subprocess.call(
+-        ['which', 'gpg2'],
+-        stdout=subprocess.PIPE,
+-        stderr=subprocess.PIPE) == 0:
+-    GPG_BIN = 'gpg2'
+-elif subprocess.call(
+-        ['which', 'gpg'],
+-        stdout=subprocess.PIPE,
+-        stderr=subprocess.PIPE) == 0:
+-    GPG_BIN = 'gpg'
+-else:
+-    raise Exception("Could not find GPG")
++GPG_BIN = '@gpg_exec@'
+ 
+ 
+ class PasswordStore(object):
+@@ -215,7 +204,7 @@ class PasswordStore(object):
+             # Init git repo
+             subprocess.call(
+                 [
+-                    "git",
++                    "@git_exec@",
+                     "--git-dir=%s" % git_dir,
+                     "--work-tree=%s" % git_work_tree,
+                     "init", path
+@@ -226,7 +215,7 @@ class PasswordStore(object):
+             # Add remote repo
+             subprocess.call(
+                 [
+-                    "git",
++                    "@git_exec@",
+                     "--git-dir=%s" % git_dir,
+                     "--work-tree=%s" % git_work_tree,
+                     "remote",
+@@ -241,7 +230,7 @@ class PasswordStore(object):
+             # TODO: add parameters for remote and branch ?
+             subprocess.call(
+                 [
+-                    "git",
++                    "@git_exec@",
+                     "--git-dir=%s" % git_dir,
+                     "--work-tree=%s" % git_work_tree,
+                     "pull",
+@@ -272,7 +261,7 @@ class PasswordStore(object):
+ 
+         subprocess.call(
+             [
+-                'git',
++                '@git_exec@',
+                 "--git-dir=%s" % self.git_dir,
+                 "--work-tree=%s" % self.path,
+                 'init',
+@@ -298,7 +287,7 @@ class PasswordStore(object):
+ 
+         subprocess.call(
+             [
+-                'git',
++                '@git_exec@',
+                 "--git-dir=%s" % self.git_dir,
+                 "--work-tree=%s" % self.path,
+                 'config',
+@@ -311,7 +300,7 @@ class PasswordStore(object):
+ 
+         subprocess.call(
+             [
+-                'git',
++                '@git_exec@',
+                 "--git-dir=%s" % self.git_dir,
+                 "--work-tree=%s" % self.path,
+                 'config',
+@@ -326,7 +315,7 @@ class PasswordStore(object):
+ 
+         subprocess.call(
+             [
+-                'git',
++                '@git_exec@',
+                 "--git-dir=%s" % self.git_dir,
+                 "--work-tree=%s" % self.path,
+                 'add',
+@@ -338,7 +327,7 @@ class PasswordStore(object):
+         if message:
+             subprocess.call(
+                 [
+-                    'git',
++                    '@git_exec@',
+                     "--git-dir=%s" % self.git_dir,
+                     "--work-tree=%s" % self.path,
+                     'commit',
+@@ -350,7 +339,7 @@ class PasswordStore(object):
+         else:
+             subprocess.call(
+                 [
+-                    'git',
++                    '@git_exec@',
+                     "--git-dir=%s" % self.git_dir,
+                     "--work-tree=%s" % self.path,
+                     'commit'
+diff --git a/pypass/tests/test_command.py b/pypass/tests/test_command.py
+index 4966b34..960a8ed 100644
+--- a/pypass/tests/test_command.py
++++ b/pypass/tests/test_command.py
+@@ -127,7 +127,7 @@ class TestCommand(unittest.TestCase):
+ 
+         # Check if the password is in the clipoard
+         xclip = subprocess.Popen(
+-            ['xclip', '-o', '-selection', 'clipboard'],
++            ['@xclip_exec@', '-o', '-selection', 'clipboard'],
+             stdout=subprocess.PIPE)
+         xclip.wait()
+         self.assertEqual(xclip.stdout.read().decode('utf8'), 'clipme999')
+@@ -301,7 +301,7 @@ class TestCommand(unittest.TestCase):
+         # git init should set diff.gpg.binary to True
+         diff_gpg_binary = subprocess.Popen(
+             [
+-                'git',
++                '@git_exec@',
+                 '--git-dir=%s' % os.path.join(self.dir, '.git'),
+                 '--work-tree=%s' % self.dir,
+                 'config',
+@@ -317,7 +317,7 @@ class TestCommand(unittest.TestCase):
+         # git init should set diff.gpg.textconv to 'gpg -d'
+         gpg = subprocess.Popen(
+             [
+-                'git',
++                '@git_exec@',
+                 '--git-dir=%s' % os.path.join(self.dir, '.git'),
+                 '--work-tree=%s' % self.dir,
+                 'config',
+@@ -337,7 +337,7 @@ class TestCommand(unittest.TestCase):
+ 
+         subprocess.Popen(
+             [
+-                'git',
++                '@git_exec@',
+                 '--git-dir=%s' % origin_git_dir,
+                 '--work-tree=%s' % origin_dir,
+                 'init',
+@@ -350,7 +350,7 @@ class TestCommand(unittest.TestCase):
+ 
+         subprocess.call(
+             [
+-                'git',
++                '@git_exec@',
+                 '--git-dir=%s' % origin_git_dir,
+                 '--work-tree=%s' % origin_dir,
+                 'add', 'test_git_init_clone.gpg',
+@@ -359,7 +359,7 @@ class TestCommand(unittest.TestCase):
+ 
+         subprocess.call(
+             [
+-                'git',
++                '@git_exec@',
+                 '--git-dir=%s' % origin_git_dir,
+                 '--work-tree=%s' % origin_dir,
+                 'commit',
+diff --git a/pypass/tests/test_passwordstore.py b/pypass/tests/test_passwordstore.py
+index 6decc5f..ceb5181 100644
+--- a/pypass/tests/test_passwordstore.py
++++ b/pypass/tests/test_passwordstore.py
+@@ -171,7 +171,7 @@ class TestPasswordStore(unittest.TestCase):
+ 
+         subprocess.Popen(
+             [
+-                'git',
++                '@git_exec@',
+                 '--git-dir=%s' % os.path.join(origin_dir, '.git'),
+                 '--work-tree=%s' % origin_dir,
+                 'init',
+@@ -184,7 +184,7 @@ class TestPasswordStore(unittest.TestCase):
+ 
+         subprocess.Popen(
+             [
+-                'git',
++                '@git_exec@',
+                 '--git-dir=%s' % os.path.join(origin_dir, '.git'),
+                 '--work-tree=%s' % origin_dir,
+                 'add', 'test_git_init_clone.gpg',
+@@ -193,7 +193,7 @@ class TestPasswordStore(unittest.TestCase):
+ 
+         subprocess.Popen(
+             [
+-                'git',
++                '@git_exec@',
+                 '--git-dir=%s' % os.path.join(origin_dir, '.git'),
+                 '--work-tree=%s' % origin_dir,
+                 'commit',
diff --git a/nixpkgs/pkgs/development/python-modules/pypblib/default.nix b/nixpkgs/pkgs/development/python-modules/pypblib/default.nix
new file mode 100644
index 000000000000..4cf8d5fc7b65
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypblib/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "pypblib";
+  version = "0.0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0qlhykm9flj6cv3v0b9q40gy21yz0lnp0wxlxvb3ijkpy45r7pbi";
+  };
+
+  pythonImportsCheck = [ "pypblib" ];
+
+  meta = with lib; {
+    homepage = "https://pypi.org/project/pypblib/";
+    description = "PBLib Python3 Bindings";
+    license = licenses.mit;
+    maintainers = [ maintainers.marius851000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypca/default.nix b/nixpkgs/pkgs/development/python-modules/pypca/default.nix
new file mode 100644
index 000000000000..86adb4e3e14a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypca/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, colorlog
+, fetchPypi
+, pythonOlder
+, pyserial
+}:
+
+buildPythonPackage rec {
+  pname = "pypca";
+  version = "0.0.13";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0y0p2rm22x21mykipiv42fjc79b0969qsbhk3cqkrdnqwh5psbdl";
+  };
+
+  propagatedBuildInputs = [
+    colorlog
+    pyserial
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "pypca" ];
+
+  meta = with lib; {
+    description = "Python library for interacting with the PCA 301 smart plugs";
+    homepage = "https://github.com/majuss/pypca";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypcap/default.nix b/nixpkgs/pkgs/development/python-modules/pypcap/default.nix
new file mode 100644
index 000000000000..ef973625ec74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypcap/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, dpkt
+, fetchFromGitHub
+, libpcap
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pypcap";
+  version = "1.3.0";
+
+  src = fetchFromGitHub {
+    owner = "pynetwork";
+    repo = pname;
+    # No release was tagged and PyPI doesn't contain tests.
+    rev = "968859f0ffb5b7c990506dffe82457b7de23a026";
+    hash = "sha256-NfyEC3qEBm6TjebcDIsoz8tJWaJ625ZFPfx7AMyynWE=";
+  };
+
+  postPatch = ''
+    # Add the path to libpcap in the nix-store
+    substituteInPlace setup.py --replace "('/usr', sys.prefix)" "'${libpcap}'"
+    # Remove coverage from test run
+    sed -i "/--cov/d" setup.cfg
+  '';
+
+  buildInputs = [ libpcap ];
+
+  nativeCheckInputs = [
+    dpkt
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [ "tests" ];
+
+  pythonImportsCheck = [ "pcap" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pynetwork/pypcap";
+    description = "Simplified object-oriented Python wrapper for libpcap";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ oxzi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypck/default.nix b/nixpkgs/pkgs/development/python-modules/pypck/default.nix
new file mode 100644
index 000000000000..3eef4a86ce8f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypck/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pytest-asyncio
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pypck";
+  version = "0.7.17";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "alengwenus";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Vlt4+fRULb9mB0ceRmc7MJ50DnF9DAJPHA8iCbNVvcE=";
+  };
+
+  patches = [
+    # https://github.com/alengwenus/pypck/pull/109
+    (fetchpatch {
+      name = "relax-setuptools-dependency.patch";
+      url = "https://github.com/alengwenus/pypck/commit/17023ebe8082120b1eec086842ca809ec6e9df2b.patch";
+      hash = "sha256-kTu1+IwDrcdqelyK/vfhxw8MQBis5I1jag7YTytKQhs=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=auto"
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    "test_connection_lost"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [
+    "pypck"
+  ];
+
+  meta = with lib; {
+    description = "LCN-PCK library written in Python";
+    homepage = "https://github.com/alengwenus/pypck";
+    changelog = "https://github.com/alengwenus/pypck/releases/tag/${version}";
+    license = with licenses; [ epl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypdf/default.nix b/nixpkgs/pkgs/development/python-modules/pypdf/default.nix
new file mode 100644
index 000000000000..df58a17aee20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypdf/default.nix
@@ -0,0 +1,99 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build-system
+, flit-core
+
+# docs
+, sphinxHook
+, sphinx-rtd-theme
+, myst-parser
+
+# propagates
+, typing-extensions
+
+# optionals
+, cryptography
+, pillow
+
+# tests
+, pytestCheckHook
+, pytest-timeout
+}:
+
+buildPythonPackage rec {
+  pname = "pypdf";
+  version = "3.16.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "py-pdf";
+    repo = "pypdf";
+    rev = "refs/tags/${version}";
+    # fetch sample files used in tests
+    fetchSubmodules = true;
+    hash = "sha256-vE5ujknMpufBuwWqtjkLegTRe4eDAvBVPCVM6It2pHQ=";
+  };
+
+  outputs = [
+    "out"
+    "doc"
+  ];
+
+  nativeBuildInputs = [
+    flit-core
+
+    # docs
+    sphinxHook
+    sphinx-rtd-theme
+    myst-parser
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--disable-socket" ""
+  '';
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.10") [
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = rec {
+    full = crypto ++ image;
+    crypto = [
+      cryptography
+    ];
+    image = [
+      pillow
+    ];
+  };
+
+  pythonImportsCheck = [
+    "pypdf"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-timeout
+  ] ++ passthru.optional-dependencies.full;
+
+  pytestFlagsArray = [
+    # don't access the network
+    "-m" "'not enable_socket'"
+  ];
+
+  disabledTests = [
+    # requires fpdf2 which we don't package yet
+    "test_compression"
+  ];
+
+  meta = with lib; {
+    description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files";
+    homepage = "https://github.com/py-pdf/pypdf";
+    changelog = "https://github.com/py-pdf/pypdf/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypdf2/default.nix b/nixpkgs/pkgs/development/python-modules/pypdf2/default.nix
new file mode 100644
index 000000000000..9708ee4c6925
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypdf2/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, pythonOlder
+, typing-extensions
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "PyPDF2";
+  version = "3.0.1";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-p0QI9pumJx9xuTUu9O0D3FOjGqQE0ptdMfU7/s/uFEA=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.10") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  pythonImportsCheck = [
+    "PyPDF2"
+  ];
+
+  meta = with lib; {
+    description = "A Pure-Python library built as a PDF toolkit";
+    homepage = "https://pypdf2.readthedocs.io/";
+    changelog = "https://github.com/py-pdf/PyPDF2/raw/${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ desiderius vrthra ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypdf3/default.nix b/nixpkgs/pkgs/development/python-modules/pypdf3/default.nix
new file mode 100644
index 000000000000..0ac738f513a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypdf3/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, glibcLocales
+, python
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "pypdf3";
+  version = "1.0.6";
+
+  src = fetchPypi {
+    pname = "PyPDF3";
+    inherit version;
+    hash = "sha256-yUbzJzQZ43JY415yJz9JkEqxVyPYenYcERXvmXmfjF8=";
+  };
+
+  LC_ALL = "en_US.UTF-8";
+  buildInputs = [ glibcLocales ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest tests/*.py
+  '';
+
+  propagatedBuildInputs = [
+    tqdm
+  ];
+
+  meta = with lib; {
+    description = "A Pure-Python library built as a PDF toolkit";
+    homepage = "https://github.com/sfneal/PyPDF3";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ambroisie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypeg2/default.nix b/nixpkgs/pkgs/development/python-modules/pypeg2/default.nix
new file mode 100644
index 000000000000..8b630f743d19
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypeg2/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  version = "2.15.2";
+  pname = "pypeg2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0v8ziaam2r637v94ra4dbjw6jzxz99gs5x4i585kgag1v204yb9b";
+  };
+
+  checkPhase = ''
+    # The tests assume that test_xmlast does not run before test_pyPEG2.
+    python -m unittest pypeg2.test.test_pyPEG2 pypeg2.test.test_xmlast
+  '';
+
+  #https://bitbucket.org/fdik/pypeg/issues/36/test-failures-on-py35
+  doCheck = !isPy3k;
+
+  meta = with lib; {
+    description = "PEG parser interpreter in Python";
+    homepage = "http://fdik.org/pyPEG";
+    license = licenses.gpl2;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypemicro/default.nix b/nixpkgs/pkgs/development/python-modules/pypemicro/default.nix
new file mode 100644
index 000000000000..6accd0e94343
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypemicro/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, autoPatchelfHook }:
+
+buildPythonPackage rec {
+  pname = "pypemicro";
+  version = "0.1.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-KE085u9yIPsuEr41GNWwHFm6KAHggvqGqP9ChGRoLE0=";
+  };
+
+  pythonImportsCheck = [ "pypemicro" ];
+
+  # tests are neither pytest nor unittest compatible and require a device
+  # connected via USB
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python interface for PEMicro debug probes";
+    homepage = "https://github.com/NXPmicro/pypemicro";
+    license = with licenses; [ bsd3 unfree ]; # it includes shared libraries for which no license is available (https://github.com/NXPmicro/pypemicro/issues/10)
+    maintainers = with maintainers; [ frogamic sbruder ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyperclip/default.nix b/nixpkgs/pkgs/development/python-modules/pyperclip/default.nix
new file mode 100644
index 000000000000..127301752d65
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyperclip/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, stdenv
+, python
+}:
+
+buildPythonPackage rec {
+  version = "1.8.2";
+  pname = "pyperclip";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "105254a8b04934f0bc84e9c24eb360a591aaf6535c9def5f29d92af107a9bf57";
+  };
+
+  # No such file or directory: 'pbcopy'
+  doCheck = !stdenv.isDarwin;
+
+  checkPhase = ''
+    ${python.interpreter} tests/test_pyperclip.py
+  '';
+
+  pythonImportsCheck = [ "pyperclip" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/asweigart/pyperclip";
+    license = licenses.bsd3;
+    description = "Cross-platform clipboard module";
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyperf/default.nix b/nixpkgs/pkgs/development/python-modules/pyperf/default.nix
new file mode 100644
index 000000000000..16ff853422bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyperf/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, psutil
+, unittestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pyperf";
+  version = "2.6.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ZNj63OanT0ePKYMsHqoqBIVmVev/FyktUjf8gxfDo8U=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    psutil
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  unittestFlagsArray = [
+    "-s"
+    "pyperf/tests/"
+    "-v"
+  ];
+
+  pythonImportsCheck = [
+    "pyperf"
+  ];
+
+  meta = with lib; {
+    description = "Python module to generate and modify perf";
+    homepage = "https://pyperf.readthedocs.io/";
+    changelog = "https://github.com/psf/pyperf/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyperscan/default.nix b/nixpkgs/pkgs/development/python-modules/pyperscan/default.nix
new file mode 100644
index 000000000000..954da379d7ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyperscan/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, rustPlatform
+, pytestCheckHook
+, libiconv
+, vectorscan
+}:
+
+buildPythonPackage rec {
+  pname = "pyperscan";
+  version = "0.2.2";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "vlaci";
+    repo = "pyperscan";
+    rev = "v${version}";
+    hash = "sha256-ioNGEmWy+lEzazF1RzMFS06jYLNYll3QSlWAF0AoU7Y=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-2zppyxJ+XaI/JCkp7s27/jgtSbwxnI4Yil5KT8WgrVI=";
+  };
+
+  nativeBuildInputs = with rustPlatform; [
+    bindgenHook
+    cargoSetupHook
+    maturinBuildHook
+  ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  buildInputs = [ vectorscan ] ++ lib.optional stdenv.isDarwin libiconv;
+
+  # Disable default features to use the system vectorscan library instead of a vendored one.
+  maturinBuildFlags = [ "--no-default-features" ];
+
+  pythonImportsCheck = [ "pyperscan" ];
+
+  meta = with lib; {
+    description = "a hyperscan binding for Python, which supports vectorscan";
+    homepage = "https://github.com/vlaci/pyperscan";
+    platforms = platforms.unix;
+    license = with licenses; [ asl20 /* or */ mit ];
+    maintainers = with maintainers; [ tnias vlaci ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyphen/default.nix b/nixpkgs/pkgs/development/python-modules/pyphen/default.nix
new file mode 100644
index 000000000000..a1e4b81c6ae2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyphen/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyphen";
+  version = "0.14.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WWyLO+HBpwQRul9lF9nM/jCDx1iuK5SkXycHNG2OZvo=";
+  };
+
+  nativeBuildInputs = [
+    flit
+  ];
+
+  preCheck = ''
+    sed -i '/addopts/d' pyproject.toml
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyphen"
+  ];
+
+  meta = with lib; {
+    description = "Module to hyphenate text";
+    homepage = "https://github.com/Kozea/Pyphen";
+    changelog = "https://github.com/Kozea/Pyphen/releases/tag/${version}";
+    license = with licenses; [gpl2 lgpl21 mpl20];
+    maintainers = with maintainers; [ rvl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyphotonfile/default.nix b/nixpkgs/pkgs/development/python-modules/pyphotonfile/default.nix
new file mode 100644
index 000000000000..7a350bd3b13f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyphotonfile/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pillow
+, numpy
+}:
+let
+  version = "0.2.1";
+in
+buildPythonPackage {
+  pname = "pyphotonfile";
+  inherit version;
+  propagatedBuildInputs = [ pillow numpy ];
+
+  src = fetchFromGitHub {
+    owner = "fookatchu";
+    repo = "pyphotonfile";
+    rev = "v${version}";
+    sha256 = "1hh1fcn7q3kyk2413pjs18xnxvzrchrisbpj2cd59jrdp0qzgv2s";
+  };
+
+  meta = with lib; {
+    maintainers = [ maintainers.cab404 ];
+    license = licenses.gpl3Plus;
+    description = "Library for reading and writing files for the Anycubic Photon 3D-Printer";
+    homepage = "https://github.com/fookatchu/pyphotonfile";
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypika/default.nix b/nixpkgs/pkgs/development/python-modules/pypika/default.nix
new file mode 100644
index 000000000000..ab2105ecee1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypika/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, parameterized
+, unittestCheckHook
+}:
+buildPythonPackage rec {
+  pname = "pypika";
+  version = "0.48.9";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "kayak";
+    repo = "pypika";
+    rev = "v${version}";
+    hash = "sha256-9HKT1xRu23F5ptiKhIgIR8srLIcpDzpowBNuYOhqMU0=";
+  };
+
+  pythonImportsCheck = ["pypika"];
+
+  nativeCheckInputs = [
+    parameterized
+    unittestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A python SQL query builder";
+    homepage = "https://github.com/kayak/pypika";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ blaggacao ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/pypillowfight/default.nix b/nixpkgs/pkgs/development/python-modules/pypillowfight/default.nix
new file mode 100644
index 000000000000..1fc4198ebeb6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypillowfight/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildPythonPackage, fetchFromGitLab, nose, pillow
+, isPy3k, isPyPy
+}:
+buildPythonPackage rec {
+  pname = "pypillowfight";
+  version = "0.3.0";
+
+  src = fetchFromGitLab {
+    domain = "gitlab.gnome.org";
+    group = "World";
+    owner = "OpenPaperwork";
+    repo = "libpillowfight";
+    rev = version;
+    sha256 = "096242v425mlqqj5g1giy59p7grxp05g78w6bk37vzph98jrgv3w";
+  };
+
+  prePatch = ''
+    echo '#define INTERNAL_PILLOWFIGHT_VERSION "${version}"' > src/pillowfight/_version.h
+  '';
+
+  # Disable tests because they're designed to only work on Debian:
+  # https://github.com/jflesch/libpillowfight/issues/2#issuecomment-268259174
+  doCheck = false;
+
+  # Python 2.x is not supported, see:
+  # https://github.com/jflesch/libpillowfight/issues/1
+  disabled = !isPy3k && !isPyPy;
+
+  # This is needed by setup.py regardless of whether tests are enabled.
+  buildInputs = [ nose ];
+  propagatedBuildInputs = [ pillow ];
+
+  meta = with lib; {
+    description = "Library containing various image processing algorithms";
+    inherit (src.meta) homepage;
+    license = licenses.gpl3Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypinyin/default.nix b/nixpkgs/pkgs/development/python-modules/pypinyin/default.nix
new file mode 100644
index 000000000000..8175214d68d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypinyin/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pypinyin";
+  version = "0.49.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mozillazg";
+    repo = "python-pinyin";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-4XiPkx7tYD5PQVyeJ/nvxrRzWmeLp9JfY1B853IEE7U=";
+  };
+
+  postPatch = ''
+    substituteInPlace pytest.ini --replace \
+      "--cov-report term-missing" ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests"
+  ];
+
+  meta = with lib; {
+    description = "Chinese Characters to Pinyin - 汉字转拼音";
+    homepage = "https://github.com/mozillazg/python-pinyin";
+    changelog = "https://github.com/mozillazg/python-pinyin/blob/v${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypiserver/default.nix b/nixpkgs/pkgs/development/python-modules/pypiserver/default.nix
new file mode 100644
index 000000000000..f598eb4df90a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypiserver/default.nix
@@ -0,0 +1,91 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, passlib
+, pip
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-git
+, twine
+, watchdog
+, webtest
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pypiserver";
+  version = "2.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Eh/3URt7pcJhoDDLRP8iHyjlPsE5E9M/0Hixqi5YNdg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-git
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    pip
+  ];
+
+  passthru.optional-dependencies = {
+    passlib = [
+      passlib
+    ];
+    cache = [
+      watchdog
+    ];
+  };
+
+  __darwinAllowLocalNetworking = true;
+
+  # Tests need these permissions in order to use the FSEvents API on macOS.
+  sandboxProfile = ''
+    (allow mach-lookup (global-name "com.apple.FSEvents"))
+  '';
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  nativeCheckInputs = [
+    pip
+    pytestCheckHook
+    setuptools
+    twine
+    webtest
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  disabledTests = [
+    # Fails to install the package
+    "test_hash_algos"
+    "test_pip_install_authed_succeeds"
+    "test_pip_install_open_succeeds"
+  ];
+
+  disabledTestPaths = [
+    # Test requires docker service running
+    "docker/test_docker.py"
+  ];
+
+  pythonImportsCheck = [
+    "pypiserver"
+  ];
+
+  meta = with lib; {
+    description = "Minimal PyPI server for use with pip/easy_install";
+    homepage = "https://github.com/pypiserver/pypiserver";
+    changelog = "https://github.com/pypiserver/pypiserver/releases/tag/v${version}";
+    license = with licenses; [ mit zlib ];
+    maintainers = with maintainers; [ austinbutler ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypitoken/default.nix b/nixpkgs/pkgs/development/python-modules/pypitoken/default.nix
new file mode 100644
index 000000000000..59a3be31094c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypitoken/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, jsonschema
+, poetry-core
+, pymacaroons
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "pypitoken";
+  version = "7.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ewjoachim";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-1SUR6reZywgFpSdD49E5PjEDNrlvsHH4TK6SkXStUws=";
+  };
+
+  postPatch = ''
+    sed -i "/--cov/d" setup.cfg
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pymacaroons
+    jsonschema
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pypitoken"
+  ];
+
+  meta = with lib; {
+    description = "Library for generating and manipulating PyPI tokens";
+    homepage = "https://pypitoken.readthedocs.io/";
+    changelog = "https://github.com/ewjoachim/pypitoken/releases/tag/6.0.3${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyplaato/default.nix b/nixpkgs/pkgs/development/python-modules/pyplaato/default.nix
new file mode 100644
index 000000000000..f070340f9290
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyplaato/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+, python-dateutil
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyplaato";
+  version = "0.0.18";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-HZF3Yxb/dTQSVzTkdAbfeD1Zyf8jFHoF3nt6OcdCnAM=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    python-dateutil
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyplaato"
+  ];
+
+  meta = with lib; {
+    description = "Python API client for fetching Plaato data";
+    homepage = "https://github.com/JohNan/pyplaato";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyplatec/default.nix b/nixpkgs/pkgs/development/python-modules/pyplatec/default.nix
new file mode 100644
index 000000000000..209c0d587eb5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyplatec/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "PyPlatec";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0kqx33flcrrlipccmqs78d14pj5749bp85b6k5fgaq2c7yzz02jg";
+  };
+
+  env.NIX_CFLAGS_COMPILE = "-std=c++11";
+
+  meta = with lib; {
+    description = "Library to simulate plate tectonics with Python bindings";
+    homepage    = "https://github.com/Mindwerks/plate-tectonics";
+    license     = licenses.lgpl3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypng/default.nix b/nixpkgs/pkgs/development/python-modules/pypng/default.nix
new file mode 100644
index 000000000000..c79ec4f92a0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypng/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pypng";
+  version = "0.0.21";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "drj11";
+    repo = "pypng";
+    rev = "refs/tags/${pname}-${version}";
+    hash = "sha256-JU1GCSTm2s6Kczn6aRcF5DizPJVpizNtnAMJxTBi9vo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  pythonImportsCheck = [ "png" ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Pure Python library for PNG image encoding/decoding";
+    homepage = "https://github.com/drj11/pypng";
+    license = licenses.mit;
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypoint/default.nix b/nixpkgs/pkgs/development/python-modules/pypoint/default.nix
new file mode 100644
index 000000000000..20b4ba6d0a7a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypoint/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, authlib
+, httpx
+}:
+
+buildPythonPackage rec {
+  pname = "pypoint";
+  version = "2.3.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "fredrike";
+    repo = "pypoint";
+    rev = "v${version}";
+    hash = "sha256-tQ5rQs6ECn9O9dVXKWhmy9BBpOzgqSmwpmbIRbJn2CQ=";
+  };
+
+  propagatedBuildInputs = [
+    authlib
+    httpx
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pypoint"
+  ];
+
+  meta = with lib; {
+    description = "Python module for communicating with Minut Point";
+    homepage = "https://github.com/fredrike/pypoint";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypoolstation/default.nix b/nixpkgs/pkgs/development/python-modules/pypoolstation/default.nix
new file mode 100644
index 000000000000..6203e88cbf61
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypoolstation/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, aiohttp
+, backoff
+, buildPythonPackage
+, fetchPypi
+, importlib-metadata
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pypoolstation";
+  version = "0.5.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-hszGCA2DDGQSh37lxp8G0bqHliH/+i2so5imDyzyOJw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    backoff
+    importlib-metadata
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pypoolstation"
+  ];
+
+  meta = with lib; {
+    description = "Python library to interact the the Poolstation platform";
+    homepage = "https://github.com/cibernox/PyPoolstation";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyppeteer/default.nix b/nixpkgs/pkgs/development/python-modules/pyppeteer/default.nix
new file mode 100644
index 000000000000..1cfb6d85680f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyppeteer/default.nix
@@ -0,0 +1,95 @@
+{ lib
+, appdirs
+, buildPythonPackage
+, certifi
+, fetchFromGitHub
+, importlib-metadata
+, poetry-core
+, pyee
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, syncer
+, tqdm
+, urllib3
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "pyppeteer";
+  version = "1.0.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = version;
+    hash = "sha256-izMaWtJdkLHMQbyq7o7n46xB8dOHXZ5uO0UXt+twjL4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    appdirs
+    certifi
+    importlib-metadata
+    pyee
+    tqdm
+    urllib3
+    websockets
+  ];
+
+  nativeCheckInputs = [
+    syncer
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'pyee = "^8.1.0"' 'pyee = "*"' \
+      --replace 'websockets = "^9.1"' 'websockets = "*"'
+  '';
+
+  disabledTestPaths = [
+    # Requires network access
+    "tests/test_browser.py"
+    "tests/test_browser_context.py"
+    "tests/test_connection.py"
+    "tests/test_coverage.py"
+    "tests/test_dialog.py"
+    "tests/test_element_handle.py"
+    "tests/test_execution_context.py"
+    "tests/test_frame.py"
+    "tests/test_input.py"
+    "tests/test_launcher.py"
+    "tests/test_network.py"
+    "tests/test_page.py"
+    "tests/test_pyppeteer.py"
+    "tests/test_target.py"
+    "tests/test_tracing.py"
+    "tests/test_worker.py"
+  ];
+
+  disabledTests = [
+    # Requires network access
+    "TestScreenShot"
+    "TestBrowserCrash"
+    "TestPDF"
+  ];
+
+  pythonImportsCheck = [
+    "pyppeteer"
+  ];
+
+  meta = with lib; {
+    description = "Headless chrome/chromium automation library (unofficial port of puppeteer)";
+    homepage = "https://github.com/pyppeteer/pyppeteer";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kmein ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyprecice/default.nix b/nixpkgs/pkgs/development/python-modules/pyprecice/default.nix
new file mode 100644
index 000000000000..ebc8c4234375
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyprecice/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchFromGitHub
+, mpi4py
+, numpy
+, precice
+, pkgconfig
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyprecice";
+  version = "2.5.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "precice";
+    repo = "python-bindings";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Nau4ytOSv5WOly/hbHO2M6Rgx1ileJrzfCfNJFnwVaw=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    pkgconfig
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    mpi4py
+    precice
+  ];
+
+  # Disable Test because everything depends on open mpi which requires network
+  doCheck = false;
+
+  # Do not use pythonImportsCheck because this will also initialize mpi which requires a network interface
+
+  meta = with lib; {
+    description = "Python language bindings for preCICE";
+    homepage = "https://github.com/precice/python-bindings";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ Scriptkiddi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypresence/default.nix b/nixpkgs/pkgs/development/python-modules/pypresence/default.nix
new file mode 100644
index 000000000000..e400956aaf49
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypresence/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "pypresence";
+  version = "4.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-phkaOvM6lmfypO8BhVd8hrli7nCqgmQ8Rydopv7R+/M=";
+  };
+
+  doCheck = false; # tests require internet connection
+  pythonImportsCheck = [ "pypresence" ];
+
+  meta = with lib; {
+    homepage = "https://qwertyquerty.github.io/pypresence/html/index.html";
+    description = "Discord RPC client written in Python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ xfix ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyprind/default.nix b/nixpkgs/pkgs/development/python-modules/pyprind/default.nix
new file mode 100644
index 000000000000..4dc25322863d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyprind/default.nix
@@ -0,0 +1,28 @@
+{ lib, fetchPypi, buildPythonPackage
+, psutil
+, pytest }:
+
+buildPythonPackage rec {
+  pname = "PyPrind";
+  version = "2.11.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e37dcab6e1a9c8e0a7f0fce65fde7a79e2deda1c75aa015910a49e2137b54cbf";
+  };
+
+  buildInputs = [ psutil ];
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test tests
+  '';
+
+  meta = with lib; {
+    description = "Python Progress Bar and Percent Indicator Utility";
+    homepage = "https://github.com/rasbt/pyprind";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyprof2calltree/default.nix b/nixpkgs/pkgs/development/python-modules/pyprof2calltree/default.nix
new file mode 100644
index 000000000000..77f24e3e15e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyprof2calltree/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchFromGitHub }:
+
+buildPythonPackage rec {
+  pname = "pyprof2calltree";
+  version = "1.4.5";
+
+  # Fetch from GitHub because the PyPi packaged version does not
+  # include all test files.
+  src = fetchFromGitHub {
+    owner = "pwaller";
+    repo = "pyprof2calltree";
+    rev = "v" + version;
+    sha256 = "0akighssiswfhi5285rrj37am6flg3ip17c34bayq3r8yyk1iciy";
+  };
+
+  meta = with lib; {
+    description = "Help visualize profiling data from cProfile with kcachegrind and qcachegrind";
+    homepage = "https://github.com/pwaller/pyprof2calltree";
+    changelog = "https://github.com/pwaller/pyprof2calltree/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sfrijters ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyproj/001.proj.patch b/nixpkgs/pkgs/development/python-modules/pyproj/001.proj.patch
new file mode 100644
index 000000000000..38061b61addf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyproj/001.proj.patch
@@ -0,0 +1,48 @@
+diff --git a/pyproj/datadir.py b/pyproj/datadir.py
+index df625fee..a2beb06c 100644
+--- a/pyproj/datadir.py
++++ b/pyproj/datadir.py
+@@ -70,7 +70,7 @@ def get_data_dir() -> str:
+     global _VALIDATED_PROJ_DATA
+     if _VALIDATED_PROJ_DATA is not None:
+         return _VALIDATED_PROJ_DATA
+-    internal_datadir = Path(__file__).absolute().parent / "proj_dir" / "share" / "proj"
++    internal_datadir = Path("@proj@/share/proj")
+     proj_lib_dirs = os.environ.get("PROJ_DATA", os.environ.get("PROJ_LIB", ""))
+     prefix_datadir = Path(sys.prefix, "share", "proj")
+     conda_windows_prefix_datadir = Path(sys.prefix, "Library", "share", "proj")
+diff --git a/setup.py b/setup.py
+index 71fb52cd..7984a68a 100644
+--- a/setup.py
++++ b/setup.py
+@@ -13,7 +13,7 @@ from setuptools import Extension, setup
+ PROJ_MIN_VERSION = parse_version("8.2.0")
+ CURRENT_FILE_PATH = Path(__file__).absolute().parent
+ BASE_INTERNAL_PROJ_DIR = Path("proj_dir")
+-INTERNAL_PROJ_DIR = CURRENT_FILE_PATH / "pyproj" / BASE_INTERNAL_PROJ_DIR
++INTERNAL_PROJ_DIR = Path("@proj@")
+ PROJ_VERSION_SEARCH = re.compile(r".*Rel\.\s+(?P<version>\d+\.\d+\.\d+).*")
+ 
+ 
+@@ -163,7 +163,7 @@ def get_extension_modules():
+     # By default we'll try to get options PROJ_DIR or the local version of proj
+     proj_dir = get_proj_dir()
+     library_dirs = get_proj_libdirs(proj_dir)
+-    include_dirs = get_proj_incdirs(proj_dir)
++    include_dirs = get_proj_incdirs(Path("@projdev@"))
+ 
+     proj_version = get_proj_version(proj_dir)
+     check_proj_version(proj_version)
+diff --git a/test/test_cli.py b/test/test_cli.py
+index 7a696de7..1b9b777b 100644
+--- a/test/test_cli.py
++++ b/test/test_cli.py
+@@ -14,7 +14,7 @@ from pyproj.sync import _load_grid_geojson
+ from test.conftest import grids_available, proj_env, tmp_chdir
+ 
+ PYPROJ_CLI_ENDPONTS = pytest.mark.parametrize(
+-    "input_command", [["pyproj"], [sys.executable, "-m", "pyproj"]]
++    "input_command", [[sys.executable, "-m", "pyproj"]]
+ )
+ 
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/pyproj/default.nix b/nixpkgs/pkgs/development/python-modules/pyproj/default.nix
new file mode 100644
index 000000000000..576688accc07
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyproj/default.nix
@@ -0,0 +1,110 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, proj
+, pythonOlder
+, substituteAll
+, cython
+, pytestCheckHook
+, mock
+, certifi
+, numpy
+, shapely
+, pandas
+, xarray
+}:
+
+buildPythonPackage rec {
+  pname = "pyproj";
+  version = "3.6.1";
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "pyproj4";
+    repo = "pyproj";
+    rev = "refs/tags/${version}";
+    hash = "sha256-ynAhu89VpvtQJRkIeVyffQHhd+OvWSiZzaI/7nd6fXA=";
+  };
+
+  # force pyproj to use ${proj}
+  patches = [
+    (substituteAll {
+      src = ./001.proj.patch;
+      proj = proj;
+      projdev = proj.dev;
+    })
+  ];
+
+  nativeBuildInputs = [ cython ];
+  buildInputs = [ proj ];
+
+  propagatedBuildInputs = [
+     certifi
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+    numpy
+    shapely
+    pandas
+    xarray
+  ];
+
+  preCheck = ''
+    # import from $out
+    rm -r pyproj
+  '';
+
+  disabledTestPaths = [
+    "test/test_doctest_wrapper.py"
+    "test/test_datadir.py"
+  ];
+
+  disabledTests = [
+    # The following tests try to access network and end up with a URLError
+    "test__load_grid_geojson_old_file"
+    "test_get_transform_grid_list"
+    "test_get_transform_grid_list__area_of_use"
+    "test_get_transform_grid_list__bbox__antimeridian"
+    "test_get_transform_grid_list__bbox__out_of_bounds"
+    "test_get_transform_grid_list__contains"
+    "test_get_transform_grid_list__file"
+    "test_get_transform_grid_list__source_id"
+    "test_sync__area_of_use__list"
+    "test_sync__bbox__list"
+    "test_sync__bbox__list__exclude_world_coverage"
+    "test_sync__download_grids"
+    "test_sync__file__list"
+    "test_sync__source_id__list"
+    "test_sync_download"
+    "test_sync_download__directory"
+    "test_sync_download__system_directory"
+    "test_transformer_group__download_grids"
+  ];
+
+  pythonImportsCheck = [
+    "pyproj"
+    "pyproj.crs"
+    "pyproj.transformer"
+    "pyproj.geod"
+    "pyproj.proj"
+    "pyproj.database"
+    "pyproj.list"
+    "pyproj.datadir"
+    "pyproj.network"
+    "pyproj.sync"
+    "pyproj.enums"
+    "pyproj.aoi"
+    "pyproj.exceptions"
+  ];
+
+  meta = with lib; {
+    description = "Python interface to PROJ library";
+    homepage = "https://github.com/pyproj4/pyproj";
+    changelog = "https://github.com/pyproj4/pyproj/blob/${src.rev}/docs/history.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; teams.geospatial.members ++ [ lsix dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyproject-api/default.nix b/nixpkgs/pkgs/development/python-modules/pyproject-api/default.nix
new file mode 100644
index 000000000000..4ba62fc1e310
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyproject-api/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build time
+, hatchling
+, hatch-vcs
+
+# runtime
+, packaging
+, toml
+, tomli
+
+# docs
+, sphinxHook
+, furo
+, sphinx-autodoc-typehints
+
+# tests
+, pytest-mock
+, pytestCheckHook
+, setuptools
+, virtualenv
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pyproject-api";
+  version = "1.6.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "tox-dev";
+    repo = "pyproject-api";
+    rev = "refs/tags/${version}";
+    hash = "sha256-XQD+36NP2zKUp/QRlgKhwzfMYBh6GVlCYXURXs2qeO8=";
+  };
+
+  outputs = [
+    "out"
+    "doc"
+  ];
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    hatchling
+    hatch-vcs
+
+    # docs
+    sphinxHook
+    furo
+    sphinx-autodoc-typehints
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+    setuptools
+    virtualenv
+    wheel
+  ];
+
+  disabledTests = [
+    # requires eol python2 interpreter
+    "test_can_build_on_python_2"
+  ];
+
+  pythonImportsCheck = [
+    "pyproject_api"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/tox-dev/pyproject-api/releases/tag/${version}";
+    description = "API to interact with the python pyproject.toml based projects";
+    homepage = "https://github.com/tox-dev/pyproject-api";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyproject-hooks/default.nix b/nixpkgs/pkgs/development/python-modules/pyproject-hooks/default.nix
new file mode 100644
index 000000000000..3624b5f02edb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyproject-hooks/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, pyproject-hooks
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, testpath
+, tomli
+}:
+
+buildPythonPackage rec {
+  pname = "pyproject-hooks";
+  version = "1.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi rec {
+    pname = "pyproject_hooks";
+    inherit version;
+    hash = "sha256-8nGymLl/WVXVP7ErcsH7GUjCLBprcLMVxUztrKAmTvU=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  # We need to disable tests because this package is part of the bootstrap chain
+  # and its test dependencies cannot be built yet when this is being built.
+  doCheck = false;
+
+  passthru.tests = {
+    pytest = buildPythonPackage {
+      pname = "${pname}-pytest";
+      inherit version;
+      format = "other";
+
+      dontBuild = true;
+      dontInstall = true;
+
+      nativeCheckInputs = [
+        pyproject-hooks
+        pytestCheckHook
+        setuptools
+        testpath
+      ];
+
+      disabledTests = [
+        # fail to import setuptools
+        "test_setup_py"
+        "test_issue_104"
+      ];
+    };
+  };
+
+  pythonImportsCheck = [
+    "pyproject_hooks"
+  ];
+
+  meta = with lib; {
+    description = "Low-level library for calling build-backends in `pyproject.toml`-based project ";
+    homepage = "https://github.com/pypa/pyproject-hooks";
+    changelog = "https://github.com/pypa/pyproject-hooks/blob/v${version}/docs/changelog.rst";
+    license = licenses.mit;
+    maintainers = teams.python.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyproject-metadata/default.nix b/nixpkgs/pkgs/development/python-modules/pyproject-metadata/default.nix
new file mode 100644
index 000000000000..0111ad3e52d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyproject-metadata/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, packaging
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, tomli
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pyproject-metadata";
+  version = "0.7.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi rec {
+    inherit pname version;
+    hash = "sha256-CpTxixCLmyHzomo9VB8FbDTtyxfchyoUShVhj+1672c=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  # Many broken tests, and missing test files
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyproject_metadata"
+  ];
+
+  meta = with lib; {
+    description = "PEP 621 metadata parsing";
+    homepage = "https://github.com/FFY00/python-pyproject-metadata";
+    changelog = "https://github.com/FFY00/python-pyproject-metadata/blob/${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyprosegur/default.nix b/nixpkgs/pkgs/development/python-modules/pyprosegur/default.nix
new file mode 100644
index 000000000000..3eba1a1df3b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyprosegur/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, aiofiles
+, aiohttp
+, backoff
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyprosegur";
+  version = "0.0.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dgomes";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-FTCQ2noxodFKN7qXdc7DG3Zt4j/pR6DeuWIs0GtGRy8=";
+  };
+
+  propagatedBuildInputs = [
+    aiofiles
+    aiohttp
+    backoff
+    click
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyprosegur"
+  ];
+
+  meta = with lib; {
+    description = "Python module to communicate with Prosegur Residential Alarms";
+    homepage = "https://github.com/dgomes/pyprosegur";
+    changelog = "https://github.com/dgomes/pyprosegur/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyprusalink/default.nix b/nixpkgs/pkgs/development/python-modules/pyprusalink/default.nix
new file mode 100644
index 000000000000..97fff5b0687c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyprusalink/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pyprusalink";
+  version = "1.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-XRtbb7kceiqi8pioTWStRo0drCtQfy1t62jCMihlIec=";
+  };
+
+  patches = [
+    # https://github.com/home-assistant-libs/pyprusalink/pull/55
+    (fetchpatch {
+      name = "unpin-setuptools-dependency.patch";
+      url = "https://github.com/home-assistant-libs/pyprusalink/commit/8efc3229c491a1763456f0f4017251d5789c6d0a.patch";
+      hash = "sha256-kTu1+IwDrcdqelyK/vfhxw8MQBis5I1jag7YTytKQhs=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Module doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyprusalink"
+  ];
+
+  meta = with lib; {
+    description = "Library to communicate with PrusaLink ";
+    homepage = "https://github.com/home-assistant-libs/pyprusalink";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypsrp/default.nix b/nixpkgs/pkgs/development/python-modules/pypsrp/default.nix
new file mode 100644
index 000000000000..1dd8c57a260d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypsrp/default.nix
@@ -0,0 +1,87 @@
+{ lib
+, asyncssh
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, gssapi
+, httpcore
+, httpx
+, krb5
+, psrpcore
+, psutil
+, pyspnego
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, requests
+, requests-credssp
+, xmldiff
+}:
+
+buildPythonPackage rec {
+  pname = "pypsrp";
+  version = "0.8.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jborean93";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Pwfc9e39sYPdcHN1cZtxxGEglEYzPp4yOYLD5/4SSiU=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    httpcore
+    httpx
+    psrpcore
+    pyspnego
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+    pyyaml
+    xmldiff
+  ];
+
+  passthru.optional-dependencies = {
+    credssp = [
+      requests-credssp
+    ];
+    kerberos = [
+      # pyspnego[kerberos] will have those two dependencies
+      gssapi
+      krb5
+    ];
+    named_pipe = [
+      psutil
+    ];
+    ssh = [
+      asyncssh
+    ];
+  };
+
+  pythonImportsCheck = [
+    "pypsrp"
+  ];
+
+  disabledTests = [
+    # TypeError: Backend.load_rsa_private_numbers() missing 1 required...
+    "test_psrp_pshost_ui_mocked_methods"
+    "test_psrp_key_exchange_timeout"
+    "test_psrp_multiple_commands"
+  ];
+
+  meta = with lib; {
+    description = "PowerShell Remoting Protocol Client library";
+    homepage = "https://github.com/jborean93/pypsrp";
+    changelog = "https://github.com/jborean93/pypsrp/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyptlib/default.nix b/nixpkgs/pkgs/development/python-modules/pyptlib/default.nix
new file mode 100644
index 000000000000..9f9f99884b98
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyptlib/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "pyptlib";
+  version = "0.0.6";
+  disabled = isPyPy || isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "01y6vbwncqb0hxlnin6whd9wrrm5my4qzjhk76fnix78v7ip515r";
+  };
+
+  doCheck = false;  # No such file or directory errors on 32bit
+
+  meta = with lib; {
+    homepage = "https://pypi.org/project/pyptlib/";
+    description = "A python implementation of the Pluggable Transports for Circumvention specification for Tor";
+    license = licenses.bsd2;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypubsub/default.nix b/nixpkgs/pkgs/development/python-modules/pypubsub/default.nix
new file mode 100644
index 000000000000..db473a293895
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypubsub/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy27, pytest }:
+
+buildPythonPackage rec {
+  pname = "pypubsub";
+  version = "4.0.3";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "schollii";
+    repo = "pypubsub";
+    rev = "v4.0.3";
+    sha256 = "02j74w28wzmdvxkk8i561ywjgizjifq3hgcl080yj0rvkd3wivlb";
+  };
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    cd tests/suite
+    py.test
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/schollii/pypubsub";
+    description = "Python 3 publish-subcribe library";
+    longDescription = ''
+     Provides a publish-subscribe API to facilitate event-based or
+     message-based  architecture in a single-process application. It is pure
+     Python  and works on Python 3.3+. It is centered on the notion of a topic;
+     senders publish messages of a given topic, and listeners subscribe to
+     messages of a given topic, all inside the same process. The package also
+     supports a variety of advanced features that facilitate debugging and
+     maintaining topics and messages in larger desktop- or server-based
+     applications.
+    '';
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ tfmoraes ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypugjs/default.nix b/nixpkgs/pkgs/development/python-modules/pypugjs/default.nix
new file mode 100644
index 000000000000..cf2a413a04d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypugjs/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, charset-normalizer
+, django
+, fetchFromGitHub
+, jinja2
+, mako
+, nose
+, pyramid
+, pyramid-mako
+, pytestCheckHook
+, six
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "pypugjs";
+  version = "5.9.12";
+
+  src = fetchFromGitHub {
+    owner = "kakulukia";
+    repo = "pypugjs";
+    rev = "v${version}";
+    hash = "sha256-6tIhKCa8wg01gNFygCS6GdUHfbWBu7wOZeMkCExRR34=";
+  };
+
+  propagatedBuildInputs = [ six charset-normalizer ];
+
+  nativeCheckInputs = [
+    django
+    jinja2
+    mako
+    nose
+    tornado
+    pyramid
+    pyramid-mako
+    pytestCheckHook
+  ];
+
+  pytestCheckFlags = [
+    "pypugjs/testsuite"
+  ];
+
+  meta = with lib; {
+    description = "PugJS syntax template adapter for Django, Jinja2, Mako and Tornado templates";
+    homepage = "https://github.com/kakulukia/pypugjs";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lopsided98 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypykatz/default.nix b/nixpkgs/pkgs/development/python-modules/pypykatz/default.nix
new file mode 100644
index 000000000000..4a93fb19c1f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypykatz/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, aesedb
+, aiosmb
+, aiowinreg
+, buildPythonPackage
+, fetchPypi
+, minidump
+, minikerberos
+, msldap
+, pythonOlder
+, winsspi
+}:
+
+buildPythonPackage rec {
+  pname = "pypykatz";
+  version = "0.6.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Xni2cYI+ByTFSDvuWHDU97KljwMe3aT7P+VIir6ktks=";
+  };
+
+  propagatedBuildInputs = [
+    aesedb
+    aiosmb
+    aiowinreg
+    minikerberos
+    msldap
+    winsspi
+    minidump
+  ];
+
+  # Project doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pypykatz"
+  ];
+
+  meta = with lib; {
+    description = "Mimikatz implementation in Python";
+    homepage = "https://github.com/skelsec/pypykatz";
+    changelog = "https://github.com/skelsec/pypykatz/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pypytools/default.nix b/nixpkgs/pkgs/development/python-modules/pypytools/default.nix
new file mode 100644
index 000000000000..ecc86e4fe2f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pypytools/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, freezegun
+, numpy
+, py
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pypytools";
+  version = "0.6.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-oUDAU+TRwLroNfQGYusAQKdRkHcazysqiDLfp77v5Sk=";
+  };
+
+  propagatedBuildInputs = [
+    py
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    numpy
+    py
+    pytestCheckHook
+  ];
+
+  patches = [
+    # Support for later Python releases, https://github.com/antocuni/pypytools/pull/2
+    (fetchpatch {
+      name = "support-later-python.patch";
+      url = "https://github.com/antocuni/pypytools/commit/c6aed496ec35a6ef7ce9e95084849eebc16bafef.patch";
+      hash = "sha256-YoYRZmgueQmxRtGaeP4zEVxuA0U7TB0PmoYHHVI7ICQ=";
+    })
+  ];
+
+  pythonImportsCheck = [
+    "pypytools"
+  ];
+
+  disabledTests = lib.optionals (pythonAtLeast "3.11") [
+    # https://github.com/antocuni/pypytools/issues/4
+    "test_clonefunc"
+  ];
+
+  meta = with lib; {
+    description = "Collection of tools to use PyPy-specific features";
+    homepage = "https://github.com/antocuni/pypytools";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyqldb/default.nix b/nixpkgs/pkgs/development/python-modules/pyqldb/default.nix
new file mode 100644
index 000000000000..5d072364ea3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqldb/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchFromGitHub, boto3, amazon-ion, ionhash, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "pyqldb";
+  version = "3.2.3";
+
+  src = fetchFromGitHub {
+    owner = "awslabs";
+    repo = "amazon-qldb-driver-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-TyIXvk3ZJn5J2SBFDTPJpSnGFOFheXIqR2daL5npOk8=";
+  };
+
+  propagatedBuildInputs = [ boto3 amazon-ion ionhash ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  preCheck = ''
+    export AWS_DEFAULT_REGION=us-east-1
+  '';
+
+  pytestFlagsArray = [ "tests/unit" ];
+
+  pythonImportsCheck = [ "pyqldb" ];
+
+  meta = with lib; {
+    description = "Python driver for Amazon QLDB";
+    homepage = "https://github.com/awslabs/amazon-qldb-driver-python";
+    license = licenses.asl20;
+    maintainers = [ maintainers.terlar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyqrcode/default.nix b/nixpkgs/pkgs/development/python-modules/pyqrcode/default.nix
new file mode 100644
index 000000000000..7cb0a94eb74a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqrcode/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "PyQRCode";
+  version = "1.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fdbf7634733e56b72e27f9bce46e4550b75a3a2c420414035cae9d9d26b234d5";
+  };
+
+  # No tests in PyPI tarball
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A QR code generator written purely in Python with SVG, EPS, PNG and terminal output";
+    homepage = "https://github.com/mnooner256/pyqrcode";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyqt-builder/default.nix b/nixpkgs/pkgs/development/python-modules/pyqt-builder/default.nix
new file mode 100644
index 000000000000..345b5aa13a1e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqt-builder/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, packaging
+, setuptools
+, sip
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pyqt-builder";
+  version = "1.15.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "PyQt-builder";
+    inherit version;
+    hash = "sha256-dGz+g8A+v/RFjUeKHAZxR5Dvk+RY7NWii8KDe6yI63Q=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [ packaging sip ];
+
+  pythonImportsCheck = [ "pyqtbuild" ];
+
+  # There aren't tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "PEP 517 compliant build system for PyQt";
+    homepage = "https://pypi.org/project/PyQt-builder/";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ nrdxp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyqt-builder/use-sip-distinfo-from-path.patch b/nixpkgs/pkgs/development/python-modules/pyqt-builder/use-sip-distinfo-from-path.patch
new file mode 100644
index 000000000000..43b2d7367e96
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqt-builder/use-sip-distinfo-from-path.patch
@@ -0,0 +1,20 @@
+diff --git a/pyqtbuild/builder.py b/pyqtbuild/builder.py
+index 3f35a7f..58701dd 100644
+--- a/pyqtbuild/builder.py
++++ b/pyqtbuild/builder.py
+@@ -51,15 +51,6 @@ class QmakeBuilder(Builder):
+         """ Set default values for user options that haven't been set yet. """
+ 
+         if tool in Option.BUILD_TOOLS:
+-            # A PEP 517 frontend will set PATH so that sip-distinfo is found on
+-            # it.  However for our own frontends we want to use the version
+-            # corresponding to the frontend (and, anyway, the frontend may not
+-            # be on PATH).
+-            if tool != 'pep517':
+-                self._sip_distinfo = os.path.join(
+-                        os.path.abspath(os.path.dirname(sys.argv[0])),
+-                        self._sip_distinfo)
+-
+             # Check we have a qmake.
+             if self.qmake is None:
+                 self.qmake = self._find_exe('qmake')
diff --git a/nixpkgs/pkgs/development/python-modules/pyqt/5.x.nix b/nixpkgs/pkgs/development/python-modules/pyqt/5.x.nix
new file mode 100644
index 000000000000..c514b9f83584
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqt/5.x.nix
@@ -0,0 +1,203 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, setuptools
+, isPy27
+, fetchPypi
+, pkg-config
+, dbus
+, lndir
+, dbus-python
+, sip
+, pyqt5_sip
+, pyqt-builder
+, libsForQt5
+, enableVerbose ? true
+, withConnectivity ? false
+, withMultimedia ? false
+, withWebKit ? false
+, withWebSockets ? false
+, withLocation ? false
+, withSerialPort ? false
+, withTools ? false
+, pkgsBuildTarget
+, buildPackages
+, dbusSupport ? !stdenv.isDarwin
+}:
+
+buildPythonPackage rec {
+  pname = "PyQt5";
+  version = "5.15.9";
+  format = "pyproject";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3EHoQBqQ3D4raStBG9VJKrVZrieidCTu1L05FVZOxMA=";
+  };
+
+  patches = [
+    # Fix some wrong assumptions by ./project.py
+    # TODO: figure out how to send this upstream
+    ./pyqt5-fix-dbus-mainloop-support.patch
+    # confirm license when installing via pyqt5_sip
+    ./pyqt5-confirm-license.patch
+  ];
+
+  postPatch =
+  # be more verbose
+  ''
+    cat >> pyproject.toml <<EOF
+  '' + lib.optionalString enableVerbose ''
+    [tool.sip.project]
+    verbose = true
+  ''
+  # Due to bug in SIP .whl name generation we have to bump minimal macos sdk upto 11.0 for
+  # aarch64-darwin. This patch can be removed once SIP will fix it in upstream,
+  # see https://github.com/NixOS/nixpkgs/pull/186612#issuecomment-1214635456.
+  + lib.optionalString (stdenv.isDarwin && stdenv.isAarch64) ''
+    minimum-macos-version = "11.0"
+  '' + ''
+    EOF
+  ''
+
+  # pyqt-builder tries to compile *and run* these programs.  This
+  # is really sad because the only thing they do is print out a
+  # flag based on whether or not some compile-time symbol was
+  # defined.  This could all be done without having to *execute*
+  # cross-compiled programs!
+  #
+  # Here is the complete list of things checked:
+  #
+  # QT_NO_PRINTDIALOG                                                           => PyQt_PrintDialog
+  # QT_NO_PRINTER                                                               => PyQt_Printer
+  # QT_NO_PRINTPREVIEWDIALOG                                                    => PyQt_PrintPreviewDialog
+  # QT_NO_PRINTPREVIEWWIDGET                                                    => PyQt_PrintPreviewWidget
+  # QT_NO_SSL                                                                   => PyQt_SSL
+  # QT_SHARED || QT_DLL                                                         => shared (otherwise static)
+  # QT_NO_PROCESS                                                               => PyQt_Process
+  # QT_NO_FPU || Q_PROCESSOR_ARM || Q_OS_WINCE                                  => PyQt_qreal_double
+  # sizeof (qreal) != sizeof (double)                                           => PyQt_qreal_double
+  # !Q_COMPILER_CONSTEXPR !Q_COMPILER_UNIFORM_INIT                              => PyQt_CONSTEXPR
+  # QT_NO_ACCESSIBILITY                                                         => PyQt_Accessibility
+  # QT_NO_OPENGL                                                                => PyQt_OpenGL PyQt_Desktop_OpenGL
+  # defined(QT_OPENGL_ES) || defined(QT_OPENGL_ES_2) || defined(QT_OPENGL_ES_3) => PyQt_Desktop_OpenGL
+  # QT_NO_RAWFONT                                                               => PyQt_RawFont
+  # QT_NO_SESSIONMANAGER                                                        => PyQt_SessionManager
+  #
+  + lib.optionalString (!(stdenv.buildPlatform.canExecute stdenv.hostPlatform)) ''
+    rm config-tests/cfgtest_QtCore.cpp
+    rm config-tests/cfgtest_QtGui.cpp
+    rm config-tests/cfgtest_QtNetwork.cpp
+    rm config-tests/cfgtest_QtPrintSupport.cpp
+  '';
+
+  enableParallelBuilding = true;
+  # HACK: paralellize compilation of make calls within pyqt's setup.py
+  # pkgs/stdenv/generic/setup.sh doesn't set this for us because
+  # make gets called by python code and not its build phase
+  # format=pyproject means the pip-build-hook hook gets used to build this project
+  # pkgs/development/interpreters/python/hooks/pip-build-hook.sh
+  # does not use the enableParallelBuilding flag
+  postUnpack = ''
+    export MAKEFLAGS+="''${enableParallelBuilding:+-j$NIX_BUILD_CORES}"
+  '';
+
+  # tons of warnings from subpackages, no point in playing whack-a-mole
+  env = lib.optionalAttrs (!enableVerbose) {
+    NIX_CFLAGS_COMPILE = "-w";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  dontWrapQtApps = true;
+
+  nativeBuildInputs = [
+    pkg-config
+  ] ++ lib.optionals (stdenv.buildPlatform == stdenv.hostPlatform) [
+    libsForQt5.qmake
+  ] ++ [
+    setuptools
+    lndir
+    sip
+  ] ++ (with pkgsBuildTarget.targetPackages.libsForQt5; [
+  ] ++ lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [
+    qmake
+  ] ++ [
+    qtbase
+    qtsvg
+    qtdeclarative
+    qtwebchannel
+  ]
+    ++ lib.optional withConnectivity qtconnectivity
+    ++ lib.optional withMultimedia qtmultimedia
+    ++ lib.optional withWebKit qtwebkit
+    ++ lib.optional withWebSockets qtwebsockets
+    ++ lib.optional withLocation qtlocation
+    ++ lib.optional withSerialPort qtserialport
+    ++ lib.optional withTools qttools
+  );
+
+  buildInputs = with libsForQt5; [
+    dbus
+  ] ++ lib.optionals (stdenv.buildPlatform == stdenv.hostPlatform) [
+    qtbase
+  ] ++ [
+    qtsvg
+    qtdeclarative
+    pyqt-builder
+  ]
+    ++ lib.optional withConnectivity qtconnectivity
+    ++ lib.optional withWebKit qtwebkit
+    ++ lib.optional withWebSockets qtwebsockets
+    ++ lib.optional withLocation qtlocation
+    ++ lib.optional withSerialPort qtserialport
+    ++ lib.optional withTools qttools
+  ;
+
+  propagatedBuildInputs = [
+    dbus-python
+    pyqt5_sip
+  ];
+
+  passthru = {
+    inherit sip pyqt5_sip;
+    multimediaEnabled = withMultimedia;
+    webKitEnabled = withWebKit;
+    WebSocketsEnabled = withWebSockets;
+    connectivityEnabled = withConnectivity;
+    locationEnabled = withLocation;
+    serialPortEnabled = withSerialPort;
+    toolsEnabled = withTools;
+  };
+
+  dontConfigure = true;
+
+  # Checked using pythonImportsCheck
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "PyQt5"
+    "PyQt5.QtCore"
+    "PyQt5.QtQml"
+    "PyQt5.QtWidgets"
+    "PyQt5.QtGui"
+  ]
+    ++ lib.optional withWebSockets "PyQt5.QtWebSockets"
+    ++ lib.optional withWebKit "PyQt5.QtWebKit"
+    ++ lib.optional withMultimedia "PyQt5.QtMultimedia"
+    ++ lib.optional withConnectivity "PyQt5.QtBluetooth"
+    ++ lib.optional withLocation "PyQt5.QtPositioning"
+    ++ lib.optional withSerialPort "PyQt5.QtSerialPort"
+    ++ lib.optional withTools "PyQt5.QtDesigner"
+  ;
+
+  meta = with lib; {
+    description = "Python bindings for Qt5";
+    homepage    = "https://riverbankcomputing.com/";
+    license     = licenses.gpl3Only;
+    platforms   = platforms.mesaPlatforms;
+    maintainers = with maintainers; [ sander ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyqt/6.x.nix b/nixpkgs/pkgs/development/python-modules/pyqt/6.x.nix
new file mode 100644
index 000000000000..641b12f4e50d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqt/6.x.nix
@@ -0,0 +1,148 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pkg-config
+, dbus
+, lndir
+, setuptools
+, dbus-python
+, sip
+, pyqt6-sip
+, pyqt-builder
+, qt6Packages
+, pythonOlder
+, withMultimedia ? true
+, withWebSockets ? true
+, withLocation ? true
+# Not currently part of PyQt6
+#, withConnectivity ? true
+, withPrintSupport ? true
+, cups
+}:
+
+buildPythonPackage rec {
+  pname = "PyQt6";
+  version = "6.5.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-FIfuc1D5/7ZtYKtBdlGSUsKzcXYsvo+DQP2VH2OAEoA=";
+  };
+
+  patches = [
+    # Fix some wrong assumptions by ./project.py
+    # TODO: figure out how to send this upstream
+    # FIXME: make a version for PyQt6?
+    # ./pyqt5-fix-dbus-mainloop-support.patch
+    # confirm license when installing via pyqt6_sip
+    ./pyqt5-confirm-license.patch
+  ];
+
+  # be more verbose
+  postPatch = ''
+    cat >> pyproject.toml <<EOF
+    [tool.sip.project]
+    verbose = true
+    EOF
+  '';
+
+  enableParallelBuilding = true;
+  # HACK: paralellize compilation of make calls within pyqt's setup.py
+  # pkgs/stdenv/generic/setup.sh doesn't set this for us because
+  # make gets called by python code and not its build phase
+  # format=pyproject means the pip-build-hook hook gets used to build this project
+  # pkgs/development/interpreters/python/hooks/pip-build-hook.sh
+  # does not use the enableParallelBuilding flag
+  postUnpack = ''
+    export MAKEFLAGS+="''${enableParallelBuilding:+-j$NIX_BUILD_CORES}"
+  '';
+
+  outputs = [ "out" "dev" ];
+
+  dontWrapQtApps = true;
+
+  nativeBuildInputs = with qt6Packages; [
+    pkg-config
+    lndir
+    sip
+    qtbase
+    qtsvg
+    qtdeclarative
+    qtwebchannel
+    qmake
+    qtquick3d
+    qtquicktimeline
+  ]
+  # ++ lib.optional withConnectivity qtconnectivity
+  ++ lib.optional withMultimedia qtmultimedia
+  ++ lib.optional withWebSockets qtwebsockets
+  ++ lib.optional withLocation qtlocation
+  ;
+
+  buildInputs = with qt6Packages; [
+    dbus
+    qtbase
+    qtsvg
+    qtdeclarative
+    pyqt-builder
+    qtquick3d
+    qtquicktimeline
+  ]
+  # ++ lib.optional withConnectivity qtconnectivity
+  ++ lib.optional withWebSockets qtwebsockets
+  ++ lib.optional withLocation qtlocation
+  ;
+
+  propagatedBuildInputs = [
+    dbus-python
+    pyqt6-sip
+    setuptools
+  ]
+  # ld: library not found for -lcups
+  ++ lib.optionals (withPrintSupport && stdenv.isDarwin) [
+    cups
+  ];
+
+  passthru = {
+    inherit sip pyqt6-sip;
+    multimediaEnabled = withMultimedia;
+    WebSocketsEnabled = withWebSockets;
+  };
+
+  dontConfigure = true;
+
+  # Checked using pythonImportsCheck, has no tests
+  doCheck = true;
+
+  pythonImportsCheck = [
+    "PyQt6"
+    "PyQt6.QtCore"
+    "PyQt6.QtQml"
+    "PyQt6.QtWidgets"
+    "PyQt6.QtGui"
+    "PyQt6.QtQuick"
+  ]
+  ++ lib.optional withWebSockets "PyQt6.QtWebSockets"
+  ++ lib.optional withMultimedia "PyQt6.QtMultimedia"
+  # ++ lib.optional withConnectivity "PyQt6.QtConnectivity"
+  ++ lib.optional withLocation "PyQt6.QtPositioning"
+  ;
+
+  # fix build with qt 6.6
+  env.NIX_CFLAGS_COMPILE = toString ([
+    "-fpermissive"
+  ]
+  ++ lib.optional (stdenv.isDarwin) "-Wno-address-of-temporary");
+
+  meta = with lib; {
+    description = "Python bindings for Qt6";
+    homepage = "https://riverbankcomputing.com/";
+    license = licenses.gpl3Only;
+    platforms = platforms.mesaPlatforms;
+    maintainers = with maintainers; [ LunNova ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyqt/pyqt5-confirm-license.patch b/nixpkgs/pkgs/development/python-modules/pyqt/pyqt5-confirm-license.patch
new file mode 100644
index 000000000000..9587e5ced28d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqt/pyqt5-confirm-license.patch
@@ -0,0 +1,13 @@
+diff --git a/projectepy b/project.py
+--- a/project.py
++++ b/project.py
+@@ -163,8 +163,7 @@
+ 
+         # Automatically confirm the license if there might not be a command
+         # line option to do so.
+-        if tool == 'pep517':
+-            self.confirm_license = True
++        self.confirm_license = True
+ 
+         self._check_license()
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/pyqt/pyqt5-fix-dbus-mainloop-support.patch b/nixpkgs/pkgs/development/python-modules/pyqt/pyqt5-fix-dbus-mainloop-support.patch
new file mode 100644
index 000000000000..2f559dcfe6a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqt/pyqt5-fix-dbus-mainloop-support.patch
@@ -0,0 +1,80 @@
+From 944d5467e1655aac20a14325631df6daccaf5804 Mon Sep 17 00:00:00 2001
+From: Jan Tojnar <jtojnar@gmail.com>
+Date: Sun, 3 Mar 2019 01:13:46 +0100
+Subject: [PATCH] Fix building on Nix
+
+./configure.py tries to find dbus-python header in dbus-1 includedir
+obtained from pkg-config or from --dbus flag. Unfortunately, when supplied,
+it also uses the flag for locating dbus-1 headers. This fails on Nix,
+since every package is installed into its own immutable tree so we cannot
+use a single directory for both dbus-python and dbus-1. We can fix this by
+using pkg-config for finding dbus-python headers too.
+
+Additionally, the build system also tries to install the dbus support module
+to dbus-python tree. Often, it is possible to handle this in pkgconfig as well [1]
+but unfortunately, dbus-python does not export the moduledir in its pc file
+so I have decided to solve this with an extra configure flag.
+
+[1]: https://www.bassi.io/articles/2018/03/15/pkg-config-and-paths/
+---
+ configure.py | 13 +++++++++++--
+ 1 file changed, 11 insertions(+), 2 deletions(-)
+
+diff --git a/configure.py b/configure.py
+index c6663e4..65e7da7 100644
+--- a/configure.py
++++ b/configure.py
+@@ -905,6 +905,9 @@ class TargetConfiguration:
+         if opts.pydbusincdir is not None:
+             self.pydbus_inc_dir = opts.pydbusincdir
+ 
++        if opts.pydbusmoduledir is not None:
++            self.pydbus_module_dir = opts.pydbusmoduledir
++
+         if opts.pyuicinterpreter is not None:
+             self.pyuic_interpreter = opts.pyuicinterpreter
+ 
+@@ -1191,6 +1194,11 @@ def create_optparser(target_config):
+             metavar="DIR",
+             help="the directory containing the dbus/dbus-python.h header is "
+             "DIR [default: supplied by pkg-config]")
++    g.add_option("--dbus-moduledir", dest='pydbusmoduledir', type='string',
++            default=None, action='callback', callback=store_abspath,
++            metavar="DIR",
++            help="the directory where dbus support module will be installed to"
++            "DIR [default: obtained from dbus.mainloop python module]")
+     p.add_option_group(g)
+ 
+     # Installation.
+@@ -2277,7 +2285,7 @@ def check_dbus(target_config, verbose):
+ 
+     inform("Checking to see if the dbus support module should be built...")
+ 
+-    cmd = 'pkg-config --cflags-only-I --libs dbus-1'
++    cmd = 'pkg-config --cflags-only-I --libs dbus-1 dbus-python'
+ 
+     if verbose:
+         sys.stdout.write(cmd + "\n")
+@@ -2307,7 +2315,8 @@ def check_dbus(target_config, verbose):
+         inform("The Python dbus module doesn't seem to be installed.")
+         return
+ 
+-    target_config.pydbus_module_dir = dbus.mainloop.__path__[0]
++    if target_config.pydbus_module_dir == '':
++        target_config.pydbus_module_dir = dbus.mainloop.__path__[0]
+ 
+     # Try and find dbus-python.h.  We don't use pkg-config because it is broken
+     # for dbus-python (at least for versions up to and including v0.81.0).
+diff --git a/project.py b/project.py
+index fe9fbce..9ae1ca1 100644
+--- a/project.py
++++ b/project.py
+@@ -261,7 +261,7 @@ del find_qt
+         dbus_lib_dirs = []
+         dbus_libs = []
+ 
+-        args = ['pkg-config', '--cflags-only-I', '--libs dbus-1']
++        args = ['pkg-config', '--cflags-only-I', '--libs dbus-1', 'dbus-python']
+ 
+         for line in self.read_command_pipe(args, fatal=False):
+             for flag in line.strip().split():
diff --git a/nixpkgs/pkgs/development/python-modules/pyqt/pyqt6-sip.nix b/nixpkgs/pkgs/development/python-modules/pyqt/pyqt6-sip.nix
new file mode 100644
index 000000000000..f9b9bc308c80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqt/pyqt6-sip.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pyqt6-sip";
+  version = "13.6.0";
+
+  src = fetchPypi {
+    pname = "PyQt6_sip";
+    inherit version;
+    hash = "sha256-JIbhWIBxlD1PZle6CQltyf/9IyKtLDAEHnjqPwN7V3g=";
+  };
+
+  # There is no test code and the check phase fails with:
+  # > error: could not create 'PyQt5/sip.cpython-38-x86_64-linux-gnu.so': No such file or directory
+  doCheck = false;
+  pythonImportsCheck = [ "PyQt6.sip" ];
+
+  meta = with lib; {
+    description = "Python bindings for Qt5";
+    homepage = "https://www.riverbankcomputing.com/software/sip/";
+    license = licenses.gpl3Only;
+    platforms = platforms.mesaPlatforms;
+    maintainers = with maintainers; [ LunNova ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyqt/sip.nix b/nixpkgs/pkgs/development/python-modules/pyqt/sip.nix
new file mode 100644
index 000000000000..ea8a518afd0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqt/sip.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pyqt5-sip";
+  version = "12.11.0";
+
+  src = fetchPypi {
+    pname = "PyQt5_sip";
+    inherit version;
+    hash = "sha256-tHEP2FtX7e9xbMVfrkW/1b+sb8e6kQNvHcw/Mxyg6zk=";
+  };
+
+  # There is no test code and the check phase fails with:
+  # > error: could not create 'PyQt5/sip.cpython-38-x86_64-linux-gnu.so': No such file or directory
+  doCheck = false;
+  pythonImportsCheck = ["PyQt5.sip"];
+
+  meta = with lib; {
+    description = "Python bindings for Qt5";
+    homepage    = "https://www.riverbankcomputing.com/software/sip/";
+    license     = licenses.gpl3Only;
+    platforms   = platforms.mesaPlatforms;
+    maintainers = with maintainers; [ sander ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyqt3d/default.nix b/nixpkgs/pkgs/development/python-modules/pyqt3d/default.nix
new file mode 100644
index 000000000000..c6129a08680e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqt3d/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pyqt5
+, pyqt-builder
+, python
+, pythonOlder
+, qt3d
+, setuptools
+, sip
+}:
+
+buildPythonPackage rec {
+  pname = "pyqt3d";
+  version = "5.15.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "PyQt3D";
+    inherit version;
+    hash = "sha256-fWxtVc2PwiGzE8mVwPhymjdxFJJvA3f46QEdRevziBw=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "[tool.sip.project]" "[tool.sip.project]''\nsip-include-dirs = [\"${pyqt5}/${python.sitePackages}/PyQt5/bindings\"]"
+  '';
+
+  outputs = [ "out" "dev" ];
+
+  enableParallelBuilding = true;
+  # HACK: paralellize compilation of make calls within pyqt's setup.py
+  # pkgs/stdenv/generic/setup.sh doesn't set this for us because
+  # make gets called by python code and not its build phase
+  # format=pyproject means the pip-build-hook hook gets used to build this project
+  # pkgs/development/interpreters/python/hooks/pip-build-hook.sh
+  # does not use the enableParallelBuilding flag
+  preBuild = ''
+    export MAKEFLAGS+="''${enableParallelBuilding:+-j$NIX_BUILD_CORES}"
+  '';
+
+  dontWrapQtApps = true;
+
+  nativeBuildInputs = [
+    sip
+    qt3d
+    setuptools
+    pyqt-builder
+  ];
+
+  buildInputs = [
+    qt3d
+  ];
+
+  propagatedBuildInputs = [
+    pyqt5
+  ];
+
+  dontConfigure = true;
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "PyQt5.Qt3DCore"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for the Qt 3D framework";
+    homepage = "https://riverbankcomputing.com/";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ panicgh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyqt5-stubs/default.nix b/nixpkgs/pkgs/development/python-modules/pyqt5-stubs/default.nix
new file mode 100644
index 000000000000..505c64253971
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqt5-stubs/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, pyqt5
+, pyqt3d
+, pyqtchart
+, pyqtdatavisualization
+, pyqtwebengine
+}:
+
+buildPythonPackage rec {
+  pname = "PyQt5-stubs";
+  version = "5.15.6.0";
+  format = "setuptools";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "python-qt-tools";
+    repo = "PyQt5-stubs";
+    rev = version;
+    hash = "sha256-qWnvlHnFRy8wbZJ28C0pYqAxod623Epe5z5FZufheDc=";
+  };
+  postPatch = ''
+    # pulls in a dependency to mypy, but we don't want to run linters
+    rm tests/test_stubs.py
+  '' + lib.optionalString (!pyqt5.connectivityEnabled) ''
+    rm tests/qflags/test_QtBluetooth_*
+    rm tests/qflags/test_QtNfc_*
+  '' + lib.optionalString (!pyqt5.locationEnabled) ''
+    rm tests/qflags/test_QtLocation_*
+    rm tests/qflags/test_QtPositioning_*
+  '' + lib.optionalString (!pyqt5.multimediaEnabled) ''
+    rm tests/qflags/test_QtMultimedia_*
+  '' + lib.optionalString (!pyqt5.serialPortEnabled) ''
+    rm tests/qflags/test_QtSerialPort_*
+  '' + lib.optionalString (!pyqt5.toolsEnabled) ''
+    rm tests/qflags/test_QtDesigner_*
+  '';
+
+  pythonImportsCheck = [
+    "PyQt5-stubs"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pyqt5
+    pyqt3d
+    pyqtchart
+    pyqtdatavisualization
+    pyqtwebengine
+  ];
+
+  meta = with lib; {
+    description = "Stubs for PyQt5 ";
+    homepage = "https://github.com/python-qt-tools/PyQt5-stubs";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ _999eagle ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyqt6-charts.nix b/nixpkgs/pkgs/development/python-modules/pyqt6-charts.nix
new file mode 100644
index 000000000000..6d2a110c8890
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqt6-charts.nix
@@ -0,0 +1,77 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sip
+, pyqt-builder
+, qt6Packages
+, pythonOlder
+, pyqt6
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "PyQt6_Charts";
+  version = "6.5.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-b/APZbJRf5m/EG3dKMdvPKNE+R7PW6aBkeIKLZACSWI=";
+  };
+
+  # fix include path and increase verbosity
+  postPatch = ''
+    sed -i \
+      '/\[tool.sip.project\]/a\
+      verbose = true\
+      sip-include-dirs = [\"${pyqt6}/${python.sitePackages}/PyQt6/bindings\"]' \
+      pyproject.toml
+  '';
+
+  enableParallelBuilding = true;
+  # HACK: paralellize compilation of make calls within pyqt's setup.py
+  # pkgs/stdenv/generic/setup.sh doesn't set this for us because
+  # make gets called by python code and not its build phase
+  # format=pyproject means the pip-build-hook hook gets used to build this project
+  # pkgs/development/interpreters/python/hooks/pip-build-hook.sh
+  # does not use the enableParallelBuilding flag
+  preBuild = ''
+    export MAKEFLAGS+="''${enableParallelBuilding:+-j$NIX_BUILD_CORES}"
+  '';
+
+  dontWrapQtApps = true;
+
+  nativeBuildInputs = with qt6Packages; [
+    qtcharts
+    sip
+    qmake
+    pyqt-builder
+  ];
+
+  buildInputs = with qt6Packages; [
+    qtcharts
+  ];
+
+  propagatedBuildInputs = [
+    pyqt6
+  ];
+
+  dontConfigure = true;
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "PyQt6.QtCharts"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for Qt6 QtCharts";
+    homepage = "https://riverbankcomputing.com/";
+    license = licenses.gpl3Only;
+    platforms = platforms.mesaPlatforms;
+    maintainers = with maintainers; [ dandellion ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyqt6-webengine.nix b/nixpkgs/pkgs/development/python-modules/pyqt6-webengine.nix
new file mode 100644
index 000000000000..d3b70a02f77d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqt6-webengine.nix
@@ -0,0 +1,89 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pkg-config
+, lndir
+, sip
+, pyqt-builder
+, qt6Packages
+, pythonOlder
+, pyqt6
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "PyQt6_WebEngine";
+  version = "6.5.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-i6nbVsTBgaKi+rFnPKNeW2PcaRE/CFAn3cQ8cQttbuk=";
+  };
+
+  # fix include path and increase verbosity
+  postPatch = ''
+    sed -i \
+      '/\[tool.sip.project\]/a\
+      verbose = true\
+      sip-include-dirs = [\"${pyqt6}/${python.sitePackages}/PyQt6/bindings\"]' \
+      pyproject.toml
+  '';
+
+  enableParallelBuilding = true;
+  # HACK: paralellize compilation of make calls within pyqt's setup.py
+  # pkgs/stdenv/generic/setup.sh doesn't set this for us because
+  # make gets called by python code and not its build phase
+  # format=pyproject means the pip-build-hook hook gets used to build this project
+  # pkgs/development/interpreters/python/hooks/pip-build-hook.sh
+  # does not use the enableParallelBuilding flag
+  postUnpack = ''
+    export MAKEFLAGS+=" -j$NIX_BUILD_CORES"
+  '';
+
+  outputs = [ "out" "dev" ];
+
+  dontWrapQtApps = true;
+
+  nativeBuildInputs = with qt6Packages; [
+    pkg-config
+    lndir
+    sip
+    qtwebengine
+    qmake
+    pyqt-builder
+  ];
+
+  buildInputs = with qt6Packages; [
+    qtwebengine
+  ];
+
+  propagatedBuildInputs = [
+    pyqt6
+  ];
+
+  passthru = {
+    inherit sip;
+  };
+
+  dontConfigure = true;
+
+  # Checked using pythonImportsCheck, has no tests
+  doCheck = true;
+
+  pythonImportsCheck = [
+    "PyQt6.QtWebEngineCore"
+    "PyQt6.QtWebEngineQuick"
+    "PyQt6.QtWebEngineWidgets"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for Qt6 WebEngine";
+    homepage = "https://riverbankcomputing.com/";
+    license = licenses.gpl3Only;
+    platforms = platforms.mesaPlatforms;
+    maintainers = with maintainers; [ LunNova nrdxp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyqtchart/default.nix b/nixpkgs/pkgs/development/python-modules/pyqtchart/default.nix
new file mode 100644
index 000000000000..3f95fe791574
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqtchart/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pyqt5
+, pyqt-builder
+, python
+, pythonOlder
+, qtcharts
+, setuptools
+, sip
+}:
+
+buildPythonPackage rec {
+  pname = "pyqtchart";
+  version = "5.15.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "PyQtChart";
+    inherit version;
+    hash = "sha256-JpF5b+kqKUphdZKlxcNeeF3JH3dZ3vnrItp532N2Izk=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "[tool.sip.project]" "[tool.sip.project]''\nsip-include-dirs = [\"${pyqt5}/${python.sitePackages}/PyQt5/bindings\"]"
+  '';
+
+  outputs = [ "out" "dev" ];
+
+  enableParallelBuilding = true;
+  # HACK: paralellize compilation of make calls within pyqt's setup.py
+  # pkgs/stdenv/generic/setup.sh doesn't set this for us because
+  # make gets called by python code and not its build phase
+  # format=pyproject means the pip-build-hook hook gets used to build this project
+  # pkgs/development/interpreters/python/hooks/pip-build-hook.sh
+  # does not use the enableParallelBuilding flag
+  preBuild = ''
+    export MAKEFLAGS+="''${enableParallelBuilding:+-j$NIX_BUILD_CORES}"
+  '';
+
+  dontWrapQtApps = true;
+
+  nativeBuildInputs = [
+    sip
+    qtcharts
+    setuptools
+    pyqt-builder
+  ];
+
+  buildInputs = [
+    qtcharts
+  ];
+
+  propagatedBuildInputs = [
+    pyqt5
+  ];
+
+  dontConfigure = true;
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "PyQt5.QtChart"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for the Qt Charts library";
+    homepage = "https://riverbankcomputing.com/";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ panicgh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyqtdatavisualization/default.nix b/nixpkgs/pkgs/development/python-modules/pyqtdatavisualization/default.nix
new file mode 100644
index 000000000000..1561e9d4be51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqtdatavisualization/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pyqt5
+, pyqt-builder
+, python
+, pythonOlder
+, qtdatavis3d
+, setuptools
+, sip
+}:
+
+buildPythonPackage rec {
+  pname = "pyqtdatavisualization";
+  version = "5.15.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "PyQtDataVisualization";
+    inherit version;
+    hash = "sha256-iSf496pwhX7wDFHj379vg92fOFX0FuDVMVknYcu53H8=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "[tool.sip.project]" "[tool.sip.project]''\nsip-include-dirs = [\"${pyqt5}/${python.sitePackages}/PyQt5/bindings\"]"
+  '';
+
+  outputs = [ "out" "dev" ];
+
+  enableParallelBuilding = true;
+  # HACK: paralellize compilation of make calls within pyqt's setup.py
+  # pkgs/stdenv/generic/setup.sh doesn't set this for us because
+  # make gets called by python code and not its build phase
+  # format=pyproject means the pip-build-hook hook gets used to build this project
+  # pkgs/development/interpreters/python/hooks/pip-build-hook.sh
+  # does not use the enableParallelBuilding flag
+  preBuild = ''
+    export MAKEFLAGS+="''${enableParallelBuilding:+-j$NIX_BUILD_CORES}"
+  '';
+
+  dontWrapQtApps = true;
+
+  nativeBuildInputs = [
+    sip
+    qtdatavis3d
+    setuptools
+    pyqt-builder
+  ];
+
+  buildInputs = [
+    qtdatavis3d
+  ];
+
+  propagatedBuildInputs = [
+    pyqt5
+  ];
+
+  dontConfigure = true;
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "PyQt5.QtDataVisualization"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for the Qt Data Visualization library";
+    homepage = "https://riverbankcomputing.com/";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ panicgh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyqtgraph/default.nix b/nixpkgs/pkgs/development/python-modules/pyqtgraph/default.nix
new file mode 100644
index 000000000000..9e8a876213e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqtgraph/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, scipy
+, numpy
+, pyqt5
+, pyopengl
+, qt5
+, pytestCheckHook
+, freefont_ttf
+, makeFontsConf
+, setuptools
+}:
+
+let
+  fontsConf = makeFontsConf {
+    fontDirectories = [ freefont_ttf ];
+  };
+in
+buildPythonPackage rec {
+  pname = "pyqtgraph";
+  version = "0.13.3";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pyqtgraph";
+    repo = "pyqtgraph";
+    rev = "refs/tags/pyqtgraph-${version}";
+    hash = "sha256-kFTNhv8pgIRSJX0ePmp1I0+MGfCaW8b86baIYZ2bZQM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    pyqt5
+    scipy
+    pyopengl
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  preCheck = ''
+    export QT_PLUGIN_PATH="${qt5.qtbase.bin}/${qt5.qtbase.qtPluginPrefix}"
+    export QT_QPA_PLATFORM=offscreen
+    export DYLD_FRAMEWORK_PATH=/System/Library/Frameworks
+    export FONTCONFIG_FILE=${fontsConf}
+  '';
+
+  pytestFlagsArray = [
+    # we only want to run unittests
+    "tests"
+  ];
+
+  disabledTests = lib.optionals (!stdenv.hostPlatform.isx86) [
+    # small precision-related differences on other architectures,
+    # upstream doesn't consider it serious.
+    # https://github.com/pyqtgraph/pyqtgraph/issues/2110
+    "test_PolyLineROI"
+  ] ++ lib.optionals (stdenv.isLinux && stdenv.isAarch64) [
+    # https://github.com/pyqtgraph/pyqtgraph/issues/2645
+    "test_rescaleData"
+  ];
+
+  meta = with lib; {
+    description = "Scientific Graphics and GUI Library for Python";
+    homepage = "https://www.pyqtgraph.org/";
+    changelog = "https://github.com/pyqtgraph/pyqtgraph/blob/master/CHANGELOG";
+    license = licenses.mit;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ koral ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyqtwebengine/default.nix b/nixpkgs/pkgs/development/python-modules/pyqtwebengine/default.nix
new file mode 100644
index 000000000000..9dc076a5e8d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqtwebengine/default.nix
@@ -0,0 +1,93 @@
+{ lib, stdenv, pythonPackages, fetchPypi, pkg-config
+, qmake, qtbase, qtsvg, qtwebengine, qtwebchannel, qtdeclarative
+, wrapQtAppsHook
+, darwin
+, buildPackages
+}:
+
+let
+  inherit (pythonPackages) buildPythonPackage python isPy27 pyqt5 sip pyqt-builder;
+  inherit (darwin) autoSignDarwinBinariesHook;
+in buildPythonPackage (rec {
+  pname = "PyQtWebEngine";
+  version = "5.15.4";
+  format = "pyproject";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "06fc35hzg346a9c86dk7vzm1fakkgzn5l52jfq3bix3587sjip6f";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "[tool.sip.project]" "[tool.sip.project]''\nsip-include-dirs = [\"${pyqt5}/${python.sitePackages}/PyQt5/bindings\"]"
+  '';
+
+  outputs = [ "out" "dev" ];
+
+  nativeBuildInputs = [
+    pkg-config
+    qmake
+  ] ++ lib.optionals (stdenv.buildPlatform == stdenv.hostPlatform) [
+    sip
+  ] ++ lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [
+    python.pythonOnBuildForHost.pkgs.sip
+  ] ++ [
+    qtbase
+    qtsvg
+    qtwebengine
+    pyqt-builder
+    pythonPackages.setuptools
+  ] ++ lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [
+    qtdeclarative
+  ] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
+    autoSignDarwinBinariesHook
+  ];
+
+  buildInputs = [
+    sip
+    qtbase
+    qtsvg
+    qtwebengine
+  ] ++ lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [
+    qtwebchannel
+    qtdeclarative
+  ];
+
+  propagatedBuildInputs = [ pyqt5 ];
+
+  dontWrapQtApps = true;
+
+  # Avoid running qmake, which is in nativeBuildInputs
+  dontConfigure = true;
+
+  # Checked using pythonImportsCheck
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "PyQt5.QtWebEngine"
+    "PyQt5.QtWebEngineWidgets"
+  ];
+
+  enableParallelBuilding = true;
+
+  passthru = {
+    inherit wrapQtAppsHook;
+  };
+
+  meta = with lib; {
+    description = "Python bindings for Qt5";
+    homepage    = "http://www.riverbankcomputing.co.uk";
+    license     = licenses.gpl3;
+    hydraPlatforms = lib.lists.intersectLists qtwebengine.meta.platforms platforms.mesaPlatforms;
+  };
+} // lib.optionalAttrs (stdenv.buildPlatform != stdenv.hostPlatform) {
+  # TODO: figure out why the env hooks aren't adding these inclusions automatically
+  env.NIX_CFLAGS_COMPILE =
+    lib.concatStringsSep " " [
+      "-I${lib.getDev qtbase}/include/QtPrintSupport/"
+      "-I${lib.getDev qtwebchannel}/include/QtWebChannel/"
+    ];
+})
diff --git a/nixpkgs/pkgs/development/python-modules/pyqtwebengine/fix-build-with-qt-514.patch b/nixpkgs/pkgs/development/python-modules/pyqtwebengine/fix-build-with-qt-514.patch
new file mode 100644
index 000000000000..1ae911c14817
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqtwebengine/fix-build-with-qt-514.patch
@@ -0,0 +1,31 @@
+diff --git a/sip/QtWebEngineWidgets/qwebenginecertificateerror.sip b/sip/QtWebEngineWidgets/qwebenginecertificateerror.sip
+index 5fb508f..7a4654a 100644
+--- a/sip/QtWebEngineWidgets/qwebenginecertificateerror.sip
++++ b/sip/QtWebEngineWidgets/qwebenginecertificateerror.sip
+@@ -48,7 +48,7 @@ public:
+ %If (QtWebEngine_5_8_0 -)
+         CertificateTransparencyRequired,
+ %End
+-%If (QtWebEngine_5_14_0 -)
++%If (QtWebEngine_5_15_0 -)
+         CertificateKnownInterceptionBlocked,
+ %End
+     };
+diff --git a/sip/QtWebEngineWidgets/qwebenginepage.sip b/sip/QtWebEngineWidgets/qwebenginepage.sip
+index 0dcbed2..9aa3443 100644
+--- a/sip/QtWebEngineWidgets/qwebenginepage.sip
++++ b/sip/QtWebEngineWidgets/qwebenginepage.sip
+@@ -663,10 +663,10 @@ signals:
+ %End
+
+ public:
+-%If (QtWebEngine_5_14_0 -)
++%If (QtWebEngine_5_15_0 -)
+     qint64 renderProcessPid() const;
+ %End
+-%If (QtWebEngine_5_14_0 -)
++%If (QtWebEngine_5_15_0 -)
+     void renderProcessPidChanged(qint64 pid);
+ %End
+ };
+
diff --git a/nixpkgs/pkgs/development/python-modules/pyquaternion/default.nix b/nixpkgs/pkgs/development/python-modules/pyquaternion/default.nix
new file mode 100644
index 000000000000..512038a8acc6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyquaternion/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "pyquaternion";
+  version = "0.9.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sfYa8hnLL+lmtft5oZISTy5jo/end6w8rfKVexqBvqg=";
+  };
+
+  # The VERSION.txt file is required for setup.py
+  # See: https://github.com/KieranWynn/pyquaternion/blob/master/setup.py#L14-L15
+  postPatch = ''
+    echo "${version}" > VERSION.txt
+  '';
+
+  propagatedBuildInputs = [ numpy ];
+
+  nativeCheckInputs = [ nose ];
+  pythonImportsCheck = [ "pyquaternion" ];
+
+  meta = with lib; {
+    description = "Library for representing and using quaternions.";
+    homepage = "http://kieranwynn.github.io/pyquaternion/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lucasew ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyquery/default.nix b/nixpkgs/pkgs/development/python-modules/pyquery/default.nix
new file mode 100644
index 000000000000..699bcd0fbc59
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyquery/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, cssselect
+, fetchPypi
+, lxml
+, pytestCheckHook
+, pythonOlder
+, requests
+, webob
+, webtest
+}:
+
+buildPythonPackage rec {
+  pname = "pyquery";
+  version = "2.0.0";
+  disabled = pythonOlder "3.7";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lj6NTpAmL/bY3sBy6pcoXcN0ovacrXd29AgqvPah2K4=";
+  };
+
+  # https://github.com/gawel/pyquery/issues/248
+  postPatch = ''
+    substituteInPlace tests/test_pyquery.py \
+      --replace test_selector_html skip_test_selector_html
+  '';
+
+  propagatedBuildInputs = [
+    cssselect
+    lxml
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [ "pyquery" ];
+
+  checkInputs = [
+    pytestCheckHook
+    requests
+    webob
+    (webtest.overridePythonAttrs (_: {
+      # circular dependency
+      doCheck = false;
+    }))
+  ];
+
+  pytestFlagsArray = [
+    # requires network
+    "--deselect=tests/test_pyquery.py::TestWebScrappingEncoding::test_get"
+  ];
+
+  meta = with lib; {
+    description = "A jquery-like library for Python";
+    homepage = "https://github.com/gawel/pyquery";
+    changelog = "https://github.com/gawel/pyquery/blob/${version}/CHANGES.rst";
+    license = licenses.bsd0;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyquil/default.nix b/nixpkgs/pkgs/development/python-modules/pyquil/default.nix
new file mode 100644
index 000000000000..c822014dd843
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyquil/default.nix
@@ -0,0 +1,122 @@
+{ lib
+, buildPythonPackage
+, deprecated
+, fetchFromGitHub
+, importlib-metadata
+, ipython
+, lark
+, networkx
+, numpy
+, poetry-core
+, pytest-asyncio
+, pytest-freezegun
+, pytest-httpx
+, pytest-mock
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, pythonRelaxDepsHook
+, qcs-api-client
+, respx
+, retry
+, rpcq
+, scipy
+, tenacity
+, types-deprecated
+, types-python-dateutil
+, types-retry
+}:
+
+buildPythonPackage rec {
+  pname = "pyquil";
+  version = "3.5.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rigetti";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-GQ7vzuUu0PCeLkqKWUSNJyJ01wseOwNL2jJaVTNGF9s=";
+  };
+
+  pythonRelaxDeps = [
+    "lark"
+    "networkx"
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    deprecated
+    lark
+    networkx
+    numpy
+    qcs-api-client
+    retry
+    rpcq
+    scipy
+    tenacity
+    types-deprecated
+    types-python-dateutil
+    types-retry
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  checkInputs = [
+    pytest-asyncio
+    pytest-freezegun
+    pytest-httpx
+    pytest-mock
+    respx
+    ipython
+  ];
+
+  disabledTestPaths = [
+    # Tests require network access
+    "test/e2e/"
+    "test/unit/test_api.py"
+    "test/unit/test_engagement_manager.py"
+    "test/unit/test_operator_estimation.py"
+    "test/unit/test_wavefunction_simulator.py"
+    "test/unit/test_compatibility_v2_operator_estimation.py"
+    "test/unit/test_compatibility_v2_quantum_computer.py"
+    "test/unit/test_compatibility_v2_qvm.py"
+    "test/unit/test_quantum_computer.py"
+    "test/unit/test_qvm.py"
+    "test/unit/test_reference_wavefunction.py"
+    # Out-dated
+    "test/unit/test_qpu_client.py"
+    "test/unit/test_qvm_client.py"
+    "test/unit/test_reference_density.py"
+  ];
+
+  disabledTests = [
+    "test_compile_with_quilt_calibrations"
+    "test_sets_timeout_on_requests"
+    # sensitive to lark parser output
+    "test_memory_commands"
+    "test_classical"
+  ];
+
+  pythonImportsCheck = [
+    "pyquil"
+  ];
+
+  meta = with lib; {
+    description = "Python library for creating Quantum Instruction Language (Quil) programs";
+    homepage = "https://github.com/rigetti/pyquil";
+    changelog = "https://github.com/rigetti/pyquil/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyqvrpro/default.nix b/nixpkgs/pkgs/development/python-modules/pyqvrpro/default.nix
new file mode 100644
index 000000000000..f170050954f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqvrpro/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-vcr
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, requests
+, untangle
+}:
+
+buildPythonPackage rec {
+  pname = "pyqvrpro";
+  version = "0.52";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "oblogic7";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-lOd2AqnrkexNqT/usmJts5NW7vJtV8CRsliYgkhgRaU=";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+    requests
+    untangle
+  ];
+
+  nativeCheckInputs = [
+    pytest-vcr
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyqvrpro"
+  ];
+
+  meta = with lib; {
+    description = "Module for interfacing with QVR Pro API";
+    homepage = "https://github.com/oblogic7/pyqvrpro";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyqwikswitch/default.nix b/nixpkgs/pkgs/development/python-modules/pyqwikswitch/default.nix
new file mode 100644
index 000000000000..20a5d59833db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyqwikswitch/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, attrs
+, requests
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "pyqwikswitch";
+  version = "0.94";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-IpyWz+3EMr0I+xULBJJhBgdnQHNPJIM1SqKFLpszhQc=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    requests
+  ];
+
+  pythonImportsCheck = [
+    "pyqwikswitch"
+    "pyqwikswitch.threaded"
+  ];
+
+  doCheck = false; # no tests in sdist
+
+  meta = with lib; {
+    description = "QwikSwitch USB Modem API binding for Python";
+    homepage = "https://github.com/kellerza/pyqwikswitch";
+    license = licenses.mit;
+    maintainers = teams.home-assistant.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyrabbit2/default.nix b/nixpkgs/pkgs/development/python-modules/pyrabbit2/default.nix
new file mode 100644
index 000000000000..0f88c0afb7ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrabbit2/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyrabbit2";
+  version = "1.0.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d27160cb35c096f0072df57307233d01b117a451236e136604a8e51be6f106c0";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  meta = with lib; {
+    description = "A Pythonic interface to the RabbitMQ Management HTTP API";
+    homepage = "https://github.com/deslum/pyrabbit2";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyrad/default.nix b/nixpkgs/pkgs/development/python-modules/pyrad/default.nix
new file mode 100644
index 000000000000..8a7074888716
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrad/default.nix
@@ -0,0 +1,60 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, lib
+, poetry-core
+, netaddr
+, six
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyrad";
+  version = "2.4";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pyradius";
+    repo = pname;
+    rev = version;
+    hash = "sha256-oqgkE0xG/8cmLeRZdGoHkaHbjtByeJwzBJwEdxH8oNY=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # Migrate to poetry-core
+      url = "https://github.com/pyradius/pyrad/commit/a4b70067dd6269e14a2f9530d820390a8a454231.patch";
+      hash = "sha256-1We9wrVY3Or3GLIKK6hZvEjVYv6JOaahgP9zOMvgErE=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    netaddr
+    six
+  ];
+
+  preCheck = ''
+    substituteInPlace tests/testServer.py \
+      --replace "def testBind(self):" "def dontTestBind(self):" \
+      --replace "def testBindv6(self):" "def dontTestBindv6(self):"
+  '';
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyrad"
+  ];
+
+  meta = with lib; {
+    description = "Python RADIUS Implementation";
+    homepage = "https://github.com/pyradius/pyrad";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyradiomics/default.nix b/nixpkgs/pkgs/development/python-modules/pyradiomics/default.nix
new file mode 100644
index 000000000000..606f542f8f96
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyradiomics/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, numpy
+, pykwalify
+, pywavelets
+, setuptools
+, simpleitk
+, six
+, versioneer
+}:
+
+buildPythonPackage rec {
+  pname = "pyradiomics";
+  version = "3.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "AIM-Harvard";
+    repo = "pyradiomics";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-/qFNN63Bbq4DUZDPmwUGj1z5pY3ujsbqFJpVXbO+b8E=";
+    name = "pyradiomics";
+  };
+
+  nativeBuildInputs = [ setuptools versioneer ];
+
+  propagatedBuildInputs = [
+    numpy
+    pykwalify
+    pywavelets
+    simpleitk
+    six
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  preCheck = ''
+    rm -rf radiomics
+  '';
+  # tries to access network at collection time:
+  disabledTestPaths = [ "tests/test_wavelet.py" ];
+  # various urllib download errors and (probably related) missing feature errors:
+  disabledTests = [
+    "brain1_shape2D-original_shape2D"
+    "brain2_shape2D-original_shape2D"
+    "breast1_shape2D-original_shape2D"
+    "lung1_shape2D-original_shape2D"
+    "lung2_shape2D-original_shape2D"
+  ];
+  # note the above elements of disabledTests are patterns, not exact tests,
+  # so simply setting `disabledTests` does not suffice:
+  pytestFlagsArray = [
+    "-k '${toString (lib.intersperse "and" (lib.forEach disabledTests (t: "not ${t}")))}'"
+  ];
+
+  pythonImportsCheck = [
+    "radiomics"
+  ];
+
+  meta = with lib; {
+    homepage = "https://pyradiomics.readthedocs.io";
+    description = "Extraction of Radiomics features from 2D and 3D images and binary masks";
+    changelog = "https://github.com/AIM-Harvard/pyradiomics/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyradios/default.nix b/nixpkgs/pkgs/development/python-modules/pyradios/default.nix
new file mode 100644
index 000000000000..8f9b96e5d12a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyradios/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, appdirs
+, requests
+, setuptools
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyradios";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Uqg/owmf2popAhyanAUIdSWpXAGCWkQja4P944BpNhc=";
+  };
+
+  propagatedBuildInputs = [
+    appdirs
+    requests
+    setuptools
+  ];
+
+  # Tests and pythonImportsCheck require network access
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python client for the https://api.radio-browser.info";
+    homepage = "https://github.com/andreztz/pyradios";
+    license = licenses.mit;
+    maintainers = with maintainers; [ infinisil ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyrainbird/default.nix b/nixpkgs/pkgs/development/python-modules/pyrainbird/default.nix
new file mode 100644
index 000000000000..44d4e83794fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrainbird/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, aiohttp-retry
+, buildPythonPackage
+, fetchFromGitHub
+, freezegun
+, ical
+, parameterized
+, pycryptodome
+, pydantic
+, pytest-aiohttp
+, pytest-asyncio
+, pytest-golden
+, pytest-mock
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pyyaml
+, requests
+, requests-mock
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "pyrainbird";
+  version = "4.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "allenporter";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-OcCg6Q+FJnmrYf70uNLWTg/tfWVJpiQlnyKfREcP2YM=";
+  };
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace "--cov=pyrainbird --cov-report=term-missing" ""
+
+    substituteInPlace setup.cfg \
+      --replace "pycryptodome>=3.16.0" "pycryptodome"
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp-retry
+    ical
+    pycryptodome
+    pydantic
+    python-dateutil
+    pyyaml
+    requests
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    freezegun
+    parameterized
+    pytest-aiohttp
+    pytest-asyncio
+    pytest-golden
+    pytest-mock
+    pytestCheckHook
+    requests-mock
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "pyrainbird"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with Rainbird controllers";
+    homepage = "https://github.com/allenporter/pyrainbird";
+    changelog = "https://github.com/allenporter/pyrainbird/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyramid-beaker/default.nix b/nixpkgs/pkgs/development/python-modules/pyramid-beaker/default.nix
new file mode 100644
index 000000000000..4a9fd61f2616
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid-beaker/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, pytest, beaker, pyramid }:
+
+buildPythonPackage rec {
+  pname = "pyramid-beaker";
+  version = "0.8";
+
+  src = fetchPypi {
+    pname = "pyramid_beaker";
+    inherit version;
+    sha256 = "0hflx3qkcdml1mwpq53sz46s7jickpfn0zy0ns2c7j445j66bp3p";
+  };
+
+  checkPhase = ''
+    # https://github.com/Pylons/pyramid_beaker/issues/29
+    py.test -k 'not test_includeme' pyramid_beaker/tests.py
+  '';
+
+  nativeCheckInputs = [ pytest ];
+
+  propagatedBuildInputs = [ beaker pyramid ];
+
+  meta = with lib; {
+    description = "Beaker session factory backend for Pyramid";
+    homepage = "https://docs.pylonsproject.org/projects/pyramid_beaker/en/latest/";
+    # idk, see https://github.com/Pylons/pyramid_beaker/blob/master/LICENSE.txt
+    # license = licenses.mpl20;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyramid-chameleon/default.nix b/nixpkgs/pkgs/development/python-modules/pyramid-chameleon/default.nix
new file mode 100644
index 000000000000..69862bdfe554
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid-chameleon/default.nix
@@ -0,0 +1,55 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, chameleon
+, fetchpatch
+, fetchPypi
+, pyramid
+, pytestCheckHook
+, setuptools
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "pyramid-chameleon";
+  version = "0.3";
+
+  src = fetchPypi {
+    pname = "pyramid_chameleon";
+    inherit version;
+    hash = "sha256-0XZ5KlDrAV14ZbRL2bJKe9BIn6mlzrvRe54FBIzvkBc=";
+  };
+
+  patches = [
+    # https://github.com/Pylons/pyramid_chameleon/pull/25
+    ./test-renderers-pyramid-import.patch
+    # Compatibility with pyramid 2, https://github.com/Pylons/pyramid_chameleon/pull/34
+    (fetchpatch {
+      name = "support-later-limiter.patch";
+      url = "https://github.com/Pylons/pyramid_chameleon/commit/36348bf4c01f52c3461e7ba4d20b1edfc54dba50.patch";
+      hash = "sha256-cPS7JhcS8nkBS1T0OdZke25jvWHT0qkPFjyPUDKHBGU=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    chameleon
+    pyramid
+    setuptools
+    zope_interface
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyramid_chameleon"
+  ];
+
+  meta = with lib; {
+    description = "Chameleon template compiler for pyramid";
+    homepage = "https://github.com/Pylons/pyramid_chameleon";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyramid-chameleon/test-renderers-pyramid-import.patch b/nixpkgs/pkgs/development/python-modules/pyramid-chameleon/test-renderers-pyramid-import.patch
new file mode 100644
index 000000000000..635ed3510fc7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid-chameleon/test-renderers-pyramid-import.patch
@@ -0,0 +1,11 @@
+--- a/pyramid_chameleon/tests/test_renderers.py
++++ b/pyramid_chameleon/tests/test_renderers.py
+@@ -258,7 +258,7 @@ class TestChameleonRendererLookup(unittest.TestCase):
+         self.assertRaises(ValueError, lookup.__call__, info)
+ 
+     def test___call__spec_alreadyregistered(self):
+-        from pyramid import tests
++        from pyramid_chameleon import tests
+         module_name = tests.__name__
+         relpath = 'test_renderers.py'
+         spec = '%s:%s' % (module_name, relpath)
diff --git a/nixpkgs/pkgs/development/python-modules/pyramid-exclog/default.nix b/nixpkgs/pkgs/development/python-modules/pyramid-exclog/default.nix
new file mode 100644
index 000000000000..c54ff94ff167
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid-exclog/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyramid
+}:
+
+buildPythonPackage rec {
+  pname = "pyramid-exclog";
+  version = "1.1";
+
+  src = fetchPypi {
+    pname = "pyramid_exclog";
+    inherit version;
+    hash = "sha256-Tl2rYH/GifNfB9w4nG9UIqAQz0O6kujCED/4iZnPKDw=";
+  };
+
+  propagatedBuildInputs = [ pyramid ];
+
+  pythonImportsCheck = [ "pyramid_exclog" ];
+
+  meta = with lib; {
+    description = "A package which logs to a Python logger when an exception is raised by a Pyramid application";
+    homepage = "https://docs.pylonsproject.org/";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyramid-jinja2/default.nix b/nixpkgs/pkgs/development/python-modules/pyramid-jinja2/default.nix
new file mode 100644
index 000000000000..801ad816641b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid-jinja2/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, webtest
+, markupsafe
+, jinja2
+, pytestCheckHook
+, zope-deprecation
+, pyramid
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyramid-jinja2";
+  version = "2.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "pyramid_jinja2";
+    inherit version;
+    hash = "sha256-8nEGnZ6ay6x622kSGQqEj2M49+V6+68+lSN/6DzI9NI=";
+  };
+
+  propagatedBuildInputs = [
+    markupsafe
+    jinja2
+    pyramid
+    zope-deprecation
+  ];
+
+  nativeCheckInputs = [
+    webtest
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --cov" ""
+  '';
+
+  pythonImportsCheck = [
+    "pyramid_jinja2"
+  ];
+
+  disabledTests = [
+    # AssertionError: Lists differ: ['pyramid_jinja2-2.10',...
+    "test_it_relative_to_package"
+    # AssertionError: False is not true
+    "test_options"
+  ];
+
+  meta = with lib; {
+    description = "Jinja2 template bindings for the Pyramid web framework";
+    homepage = "https://github.com/Pylons/pyramid_jinja2";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyramid-mako/default.nix b/nixpkgs/pkgs/development/python-modules/pyramid-mako/default.nix
new file mode 100644
index 000000000000..d55eee1a37f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid-mako/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, webtest
+, pyramid
+, mako
+}:
+
+buildPythonPackage rec {
+  pname = "pyramid-mako";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0066c863441f1c3ddea60cee1ccc50d00a91a317a8052ca44131da1a12a840e2";
+  };
+
+  patches = [
+    # Fix tests with pyramid >= 2.0
+    # https://github.com/Pylons/pyramid_mako/pull/54
+    (fetchpatch {
+      url = "https://github.com/Pylons/pyramid_mako/commit/c0f9e7e0146a7f94e35a9401b1519ac8b7765f5b.patch";
+      sha256 = "15swfm0a07bdl32s85426rmjh72jwfasjcrl849ppg035z75q9fx";
+    })
+  ];
+
+  buildInputs = [ webtest ];
+  propagatedBuildInputs = [ pyramid mako ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Pylons/pyramid_mako";
+    description = "Mako template bindings for the Pyramid web framework";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyramid-multiauth/default.nix b/nixpkgs/pkgs/development/python-modules/pyramid-multiauth/default.nix
new file mode 100644
index 000000000000..c70e7f0b0b64
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid-multiauth/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyramid
+, unittestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pyramid-multiauth";
+  version = "1.0.1";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "mozilla-services";
+    repo = "pyramid_multiauth";
+    rev = "refs/tags/${version}";
+    hash = "sha256-+Aa+Vc4qCqDe/W5m/RBpYAyOMJkBv+ZGSqElJlkHqs4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pyramid
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/mozilla-services/pyramid_multiauth/releases/tag/${version}";
+    description = "Authentication policy for Pyramid that proxies to a stack of other authentication policies";
+    homepage = "https://github.com/mozilla-services/pyramid_multiauth";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyramid/default.nix b/nixpkgs/pkgs/development/python-modules/pyramid/default.nix
new file mode 100644
index 000000000000..0589fd0401a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyramid/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, webtest
+, zope-component
+, hupper
+, pastedeploy
+, plaster
+, plaster-pastedeploy
+, repoze_lru
+, translationstring
+, venusian
+, webob
+, zope-deprecation
+, zope_interface
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyramid";
+  version = "2.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NyE4pzjkIWU1zHbczm7d1aGqypUTDyNU+4NCZMBvGN4=";
+  };
+
+  propagatedBuildInputs = [
+    hupper
+    pastedeploy
+    plaster
+    plaster-pastedeploy
+    repoze_lru
+    translationstring
+    venusian
+    webob
+    zope-deprecation
+    zope_interface
+  ];
+
+  nativeCheckInputs = [
+    webtest
+    zope-component
+  ];
+
+  pythonImportsCheck = [
+    "pyramid"
+  ];
+
+  meta = with lib; {
+    description = "Python web framework";
+    homepage = "https://trypyramid.com/";
+    changelog = "https://github.com/Pylons/pyramid/blob/${version}/CHANGES.rst";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyrate-limiter/default.nix b/nixpkgs/pkgs/development/python-modules/pyrate-limiter/default.nix
new file mode 100644
index 000000000000..3aa0d42e2d50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrate-limiter/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "pyrate-limiter";
+  version = "2.10.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "vutran1710";
+    repo = "PyrateLimiter";
+    rev = "v${version}";
+    hash = "sha256-CPusPeyTS+QyWiMHsU0ii9ZxPuizsqv0wQy3uicrDw0=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  pythonImportsCheck = [
+    "pyrate_limiter"
+  ];
+
+  meta = with lib; {
+    description = "Python Rate-Limiter using Leaky-Bucket Algorimth Family";
+    homepage = "https://github.com/vutran1710/PyrateLimiter";
+    changelog = "https://github.com/vutran1710/PyrateLimiter/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kranzes ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyrdfa3/default.nix b/nixpkgs/pkgs/development/python-modules/pyrdfa3/default.nix
new file mode 100644
index 000000000000..398da024053a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrdfa3/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, isPy27
+, rdflib
+, html5lib
+}:
+
+buildPythonPackage rec {
+  pname = "pyrdfa3";
+  version = "3.5.3";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit version;
+    pname = "pyRdfa3";
+    hash = "sha256-FXZjqSuH3zRbb2m94jXf9feXiRYI4S/h5PqNrWhxMa4=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "CVE-2022-4396.patch";
+      url = "https://github.com/RDFLib/pyrdfa3/commit/ffd1d62dd50d5f4190013b39cedcdfbd81f3ce3e.patch";
+      hash = "sha256-prRrOwylYcEqKLr/8LIpyJ5Yyt+6+HTUqH5sQXU8tqc=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'html = pyRdfa.rdflibparsers:StructuredDataParser'" "'html = pyRdfa.rdflibparsers:StructuredDataParser'," \
+      --replace "'hturtle = pyRdfa.rdflibparsers:HTurtleParser'" "'hturtle = pyRdfa.rdflibparsers:HTurtleParser',"
+  '';
+
+  propagatedBuildInputs = [
+    rdflib
+    html5lib
+  ];
+
+  # Does not work with python3
+  doCheck = false;
+
+  pythonImportsCheck = [ "pyRdfa" ];
+
+  meta = with lib; {
+    description = "RDFa 1.1 distiller/parser library";
+    homepage = "https://www.w3.org/2012/pyRdfa/";
+    license = licenses.w3c;
+    maintainers = with maintainers; [ ambroisie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyre-extensions/default.nix b/nixpkgs/pkgs/development/python-modules/pyre-extensions/default.nix
new file mode 100644
index 000000000000..24bc9312de86
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyre-extensions/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+# build inputs
+, typing-extensions
+, typing-inspect
+}:
+let
+  pname = "pyre-extensions";
+  version = "0.0.30";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-unkjxIbgia+zehBiOo9K6C1zz/QkJtcRxIrwcOW8MbI=";
+  };
+
+  propagatedBuildInputs = [
+    typing-extensions
+    typing-inspect
+  ];
+
+  pythonImportsCheck = [ "pyre_extensions" ];
+
+  meta = with lib; {
+    description = "This module defines extensions to the standard “typing” module that are supported by the Pyre typechecker";
+    homepage = "https://pypi.org/project/pyre-extensions";
+    license = licenses.mit;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyreaderwriterlock/default.nix b/nixpkgs/pkgs/development/python-modules/pyreaderwriterlock/default.nix
new file mode 100644
index 000000000000..378be471aef0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyreaderwriterlock/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+
+  # propagates
+, typing-extensions
+
+  # tests
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyReaderWriterLock";
+  version = "1.0.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "elarivie";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-8FC+4aDgGpF1BmOdlkFtMy7OfWdSmvn9fjKXSmmeJlg=";
+  };
+
+  propagatedBuildInputs = [ typing-extensions ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [ "readerwriterlock" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/elarivie/pyReaderWriterLock/blob/master/CHANGELOG.md";
+    description = "Implementation of the Readers-writers problem";
+    homepage = "https://github.com/elarivie/pyReaderWriterLock";
+    license = licenses.mit;
+    maintainers = with maintainers; [ MayNiklas ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyreadstat/default.nix b/nixpkgs/pkgs/development/python-modules/pyreadstat/default.nix
new file mode 100644
index 000000000000..7372e88482ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyreadstat/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cython_3
+, fetchFromGitHub
+, libiconv
+, pandas
+, python
+, pythonOlder
+, readstat
+, zlib
+}:
+
+buildPythonPackage rec {
+  pname = "pyreadstat";
+  version = "1.2.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Roche";
+    repo = "pyreadstat";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-npzriBrp/ex0noH6EAmWnFyHzVkOKvQ68J578NujMHA=";
+  };
+
+  nativeBuildInputs = [
+    cython_3
+  ];
+
+  buildInputs = [
+    zlib
+  ] ++ lib.optionals stdenv.isDarwin [
+    libiconv
+  ];
+
+  propagatedBuildInputs = [
+    readstat
+    pandas
+  ];
+
+  pythonImportsCheck = [
+    "pyreadstat"
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  checkPhase = ''
+    runHook preCheck
+
+    ${python.interpreter} tests/test_basic.py
+
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Module to read SAS, SPSS and Stata files into pandas data frames";
+    homepage = "https://github.com/Roche/pyreadstat";
+    changelog = "https://github.com/Roche/pyreadstat/blob/v${version}/change_log.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ swflint ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyrect/default.nix b/nixpkgs/pkgs/development/python-modules/pyrect/default.nix
new file mode 100644
index 000000000000..ac0b6b598d80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrect/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pygame
+}:
+
+buildPythonPackage rec {
+  pname = "pyrect";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    pname = "PyRect";
+    inherit version;
+    hash = "sha256-9lFV9t+bkptnyv+9V8CUfFrlRJ07WA0XgHS/+0egm3g=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook pygame ];
+
+  preCheck = ''
+    export LC_ALL="en_US.UTF-8"
+  '';
+
+  pythonImportsCheck = [ "pyrect" ];
+
+  meta = with lib; {
+    description = "Simple module with a Rect class for Pygame-like rectangular areas";
+    homepage = "https://github.com/asweigart/pyrect";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ lucasew ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyregion/default.nix b/nixpkgs/pkgs/development/python-modules/pyregion/default.nix
new file mode 100644
index 000000000000..6f1affd9063e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyregion/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+# needed to build
+, cython
+, oldest-supported-numpy
+, setuptools
+, setuptools-scm
+, wheel
+# needed to run
+, astropy
+, numpy
+, pyparsing
+# needed to check
+, pytestCheckHook
+, pytest-astropy
+}:
+
+buildPythonPackage rec {
+  pname = "pyregion";
+  version = "2.2.0";
+  pyproject = true;
+
+  # pypi src contains cython-produced .c files which don't compile
+  # with python3.9
+  src = fetchFromGitHub {
+    owner = "astropy";
+    repo = pname;
+    rev = version;
+    hash = "sha256-r2STKnZwNvonXATrQ5q9NVD9QftlWI1RWl4F+GZSxVg=";
+  };
+
+  env = {
+    SETUPTOOLS_SCM_PRETEND_VERSION = version;
+  } // lib.optionalAttrs stdenv.cc.isClang {
+    # Try to remove on next update.  generated code returns a NULL in a
+    # function where an int is expected.
+    NIX_CFLAGS_COMPILE = "-Wno-error=int-conversion";
+  };
+
+  propagatedBuildInputs = [
+    astropy
+    numpy
+    pyparsing
+  ];
+
+  nativeBuildInputs = [
+    cython
+    oldest-supported-numpy
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook pytest-astropy ];
+
+  # Tests must be run in the build directory
+  preCheck = ''
+    pushd build/lib.*
+  '';
+  postCheck = ''
+    popd
+  '';
+
+  meta = with lib; {
+    changelog = "https://github.com/astropy/pyregion/blob/${version}/CHANGES.rst";
+    description = "Python parser for ds9 region files";
+    homepage = "https://github.com/astropy/pyregion";
+    license = licenses.mit;
+    maintainers = [ maintainers.smaret ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyrender/default.nix b/nixpkgs/pkgs/development/python-modules/pyrender/default.nix
new file mode 100644
index 000000000000..eb1d5d17ee47
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrender/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, fetchpatch
+, freetype-py
+, imageio
+, networkx
+, numpy
+, pillow
+, pyglet
+, pyopengl
+, scipy
+, six
+, trimesh
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyrender";
+  version = "0.1.45";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "mmatl";
+    repo = "pyrender";
+    rev = "refs/tags/${version}";
+    hash = "sha256-V2G8QWXMxFDQpT4XDOJhIFI2V9VhDQCaXYBb/QVLxgM=";
+  };
+
+  patches = [
+    (fetchpatch { # yet to be tagged
+      name = "relax-pyopengl.patch";
+      url = "https://github.com/mmatl/pyrender/commit/7c613e8aed7142df9ff40767a8f10b7a19b6255c.patch";
+      hash = "sha256-SXRV9RC3PfQGjjIQ+n97HZrSDPae3rAHnTBiHXSFLaY=";
+    })
+  ];
+
+  # trimesh too new
+  # issue: https://github.com/mmatl/pyrender/issues/203
+  # mega pr: https://github.com/mmatl/pyrender/pull/216
+  # relevant pr commit: https://github.com/mmatl/pyrender/pull/216/commits/5069aeb957addff8919f05dc9be4040f55bff329
+  # the commit does not apply as a patch when cherry picked, hence the substituteInPlace
+  postPatch = ''
+    substituteInPlace tests/unit/test_meshes.py \
+      --replace \
+        "bm = trimesh.load('tests/data/WaterBottle.glb').dump()[0]" \
+        'bm = trimesh.load("tests/data/WaterBottle.glb").geometry["WaterBottle"]'
+  '';
+
+  propagatedBuildInputs = [
+    freetype-py
+    imageio
+    networkx
+    numpy
+    pillow
+    pyglet
+    pyopengl
+    scipy
+    six
+    trimesh
+  ];
+
+  env.PYOPENGL_PLATFORM = "egl"; # enables headless rendering during check
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # does not work inside sandbox, no GPU
+    "tests/unit/test_offscreen.py"
+  ];
+
+  pythonImportsCheck = [ "pyrender" ];
+
+  meta = with lib; {
+    homepage = "https://pyrender.readthedocs.io/en/latest/";
+    description = "Easy-to-use glTF 2.0-compliant OpenGL renderer for visualization of 3D scenes";
+    license = licenses.mit;
+    maintainers = with maintainers; [ pbsds ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyrevolve/default.nix b/nixpkgs/pkgs/development/python-modules/pyrevolve/default.nix
new file mode 100644
index 000000000000..d60b2164051c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrevolve/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, contexttimer
+, setuptools
+, versioneer
+, cython
+, numpy
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyrevolve";
+  version = "2.2.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "devitocodes";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-z1G8DXG06Capd87x02zqrtYyBrX4xmJP94t4bgaR2PE=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace ', "flake8"' ""
+  '';
+
+  nativeBuildInputs = [
+    cython
+    setuptools
+    versioneer
+  ];
+
+  propagatedBuildInputs = [
+    contexttimer
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    rm -rf pyrevolve
+  '';
+
+  pythonImportsCheck = [
+    "pyrevolve"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/devitocodes/pyrevolve";
+    changelog = "https://github.com/devitocodes/pyrevolve/releases/tag/v${version}";
+    description = "Python library to manage checkpointing for adjoints";
+    license = licenses.epl10;
+    maintainers = with maintainers; [ atila ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyrfc3339/default.nix b/nixpkgs/pkgs/development/python-modules/pyrfc3339/default.nix
new file mode 100644
index 000000000000..9885d4f5443f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrfc3339/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytz
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "pyRFC3339";
+  version = "1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "06jv7ar7lpvvk0dixzwdr3wgm0g1lipxs429s2z7knwwa7hwpf41";
+  };
+
+  propagatedBuildInputs = [ pytz ];
+  buildInputs = [ nose ];
+
+  meta = with lib; {
+    description = "Generate and parse RFC 3339 timestamps";
+    homepage = "https://github.com/kurtraschke/pyRFC3339";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyrfxtrx/default.nix b/nixpkgs/pkgs/development/python-modules/pyrfxtrx/default.nix
new file mode 100644
index 000000000000..a3bbd94663c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrfxtrx/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyrfxtrx";
+  version = "0.30.1";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "pyRFXtrx";
+    rev = "refs/tags/${version}";
+    hash = "sha256-sxxGu1ON5fhUCaONYJdsUFHraTh5NAdXzj7Cai9k5yc=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # https://github.com/Danielhiversen/pyRFXtrx/issues/130
+    "tests/test_rollertrol.py"
+  ];
+
+  meta = with lib; {
+    description = "Library to communicate with the RFXtrx family of devices";
+    homepage = "https://github.com/Danielhiversen/pyRFXtrx";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyric/default.nix b/nixpkgs/pkgs/development/python-modules/pyric/default.nix
new file mode 100644
index 000000000000..8ee447f0f0c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyric/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyric";
+  version = "0.1.6.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "PyRIC";
+    inherit version;
+    hash = "sha256-tTmwHK/r0kBsAAl/lFJeoPjs0d2S93MfQ+rA7xbCzMk=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "__version__ = '0.0.3'" "__version__ = '${version}'"
+  '';
+
+  # Tests are outdated
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyric"
+  ];
+
+  meta = with lib; {
+    description = "Python Radio Interface Controller";
+    homepage = "https://github.com/wraith-wireless/PyRIC";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyrisco/default.nix b/nixpkgs/pkgs/development/python-modules/pyrisco/default.nix
new file mode 100644
index 000000000000..0233d2d0d1c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrisco/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyrisco";
+  version = "0.5.8";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "OnFreund";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-PQ1h9UVQ2DQMInxdAaLES7uDWAxwDra+YfAmz5jjV6g=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyrisco"
+  ];
+
+  meta = with lib; {
+    description = "Python interface to Risco alarm systems through Risco Cloud";
+    homepage = "https://github.com/OnFreund/pyrisco";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyrituals/default.nix b/nixpkgs/pkgs/development/python-modules/pyrituals/default.nix
new file mode 100644
index 000000000000..b73ca1862735
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrituals/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pyrituals";
+  version = "0.0.6";
+  format = "pyproject";
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "milanmeu";
+    repo = pname;
+    rev = version;
+    sha256 = "0ynjz7khp67bwxjp580w3zijxr9yn44nmnbvkxjxq9scyb2mjf6g";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "pyrituals" ];
+
+  meta = with lib; {
+    description = "Python wrapper for the Rituals Perfume Genie API";
+    homepage = "https://github.com/milanmeu/pyrituals";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyrmvtransport/default.nix b/nixpkgs/pkgs/development/python-modules/pyrmvtransport/default.nix
new file mode 100644
index 000000000000..888ad2f43ceb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrmvtransport/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pythonOlder
+, flit
+, async-timeout
+, lxml
+, httpx
+, pytestCheckHook
+, pytest-asyncio
+, pytest-httpx
+}:
+
+buildPythonPackage rec {
+  pname = "pyrmvtransport";
+  version = "0.3.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "cgtobi";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-nFxGEyO+wyRzPayjjv8WNIJ+XIWbVn0dyyjQKHiyr40=";
+  };
+
+  nativeBuildInputs = [
+    flit
+  ];
+
+  propagatedBuildInputs = [
+    async-timeout
+    httpx
+    lxml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+    pytest-httpx
+  ];
+
+  patches = [
+    # Can be removed with next release, https://github.com/cgtobi/PyRMVtransport/pull/55
+    (fetchpatch {
+      name = "update-tests.patch";
+      url = "https://github.com/cgtobi/PyRMVtransport/commit/fe93b3d9d625f9ccf8eb7b0c39e0ff41c72d2e77.patch";
+      hash = "sha256-t+GP5VG1S86vVSsisl85ZHBtOqxIi7QS83DA+HgRet4=";
+    })
+  ];
+
+  pythonImportsCheck = [
+    "RMVtransport"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/cgtobi/PyRMVtransport";
+    description = "Get transport information from opendata.rmv.de";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyro-api/default.nix b/nixpkgs/pkgs/development/python-modules/pyro-api/default.nix
new file mode 100644
index 000000000000..aaf4571900b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyro-api/default.nix
@@ -0,0 +1,23 @@
+{ buildPythonPackage, fetchPypi, lib }:
+
+buildPythonPackage rec {
+  version = "0.1.2";
+  pname = "pyro-api";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "a1b900d9580aa1c2fab3b123ab7ff33413744da7c5f440bd4aadc4d40d14d920";
+  };
+
+  pythonImportsCheck = [ "pyroapi" ];
+
+  # tests require pyro-ppl which depends on this package
+  doCheck = false;
+
+  meta = {
+    description = "Generic API for dispatch to Pyro backends.";
+    homepage = "http://pyro.ai";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ georgewhewell ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyro-ppl/default.nix b/nixpkgs/pkgs/development/python-modules/pyro-ppl/default.nix
new file mode 100644
index 000000000000..9dbd71e83acf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyro-ppl/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, graphviz
+, jupyter
+, matplotlib
+, networkx
+, opt-einsum
+, pandas
+, pillow
+, pyro-api
+, pythonOlder
+, torch
+, scikit-learn
+, seaborn
+, torchvision
+, tqdm
+, wget
+}:
+
+buildPythonPackage rec {
+  pname = "pyro-ppl";
+  version = "1.8.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit version pname;
+    hash = "sha256-ANL03ailPmbZVRJNxuSektz1cM071waCUJHbdk2TzQc=";
+  };
+
+  propagatedBuildInputs = [
+    pyro-api
+    torch
+    networkx
+    opt-einsum
+    tqdm
+  ];
+
+  passthru.optional-dependencies = {
+    extras = [
+      graphviz
+      jupyter
+      # lap
+      matplotlib
+      pandas
+      pillow
+      scikit-learn
+      seaborn
+      torchvision
+      # visdom
+      wget
+    ];
+  };
+
+  # pyro not shipping tests do simple smoke test instead
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyro"
+    "pyro.distributions"
+    "pyro.infer"
+    "pyro.optim"
+  ];
+
+  meta = with lib; {
+    description = "Library for probabilistic modeling and inference";
+    homepage = "http://pyro.ai";
+    changelog = "https://github.com/pyro-ppl/pyro/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ teh georgewhewell ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyro4/default.nix b/nixpkgs/pkgs/development/python-modules/pyro4/default.nix
new file mode 100644
index 000000000000..7b0c8229c899
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyro4/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, cloudpickle
+, dill
+, fetchPypi
+, msgpack
+, pytestCheckHook
+, pythonAtLeast
+, serpent
+}:
+
+buildPythonPackage rec {
+  pname = "pyro4";
+  version = "4.82";
+  format = "setuptools";
+
+  # No support Python >= 3.11
+  # https://github.com/irmen/Pyro4/issues/246
+  disabled = pythonAtLeast "3.11";
+
+  src = fetchPypi {
+    pname = "Pyro4";
+    inherit version;
+    hash = "sha256-UR9bCATpLdd9wzrfnJR3h+P56cWpaxIWLwVXp8TOIfs=";
+  };
+
+  propagatedBuildInputs = [
+    serpent
+  ];
+
+  buildInputs = [
+    dill
+    cloudpickle
+    msgpack
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # add testsupport.py to PATH
+  preCheck = ''
+    PYTHONPATH=tests/PyroTests:$PYTHONPATH
+  '';
+
+  disabledTestPaths = [
+    # ignore network related tests, which fail in sandbox
+    "tests/PyroTests/test_naming.py"
+  ];
+
+  disabledTests = [
+    "StartNSfunc"
+    "Broadcast"
+    "GetIP"
+  ];
+
+  # otherwise the tests hang the build
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [
+    "Pyro4"
+  ];
+
+  meta = with lib; {
+    description = "Distributed object middleware for Python (RPC)";
+    homepage = "https://github.com/irmen/Pyro4";
+    changelog = "https://github.com/irmen/Pyro4/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyro5/default.nix b/nixpkgs/pkgs/development/python-modules/pyro5/default.nix
new file mode 100644
index 000000000000..eacf7436cda6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyro5/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, serpent
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyro5";
+  version = "5.15";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "Pyro5";
+    inherit version;
+    hash = "sha256-gsPfyYYLSfiXso/yT+ZxbIQWcsYAr4/kDQ46f6yaP14=";
+  };
+
+  propagatedBuildInputs = [
+    serpent
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Ignore network related tests, which fail in sandbox
+    "StartNSfunc"
+    "Broadcast"
+    "GetIP"
+    "TestNameServer"
+    "TestBCSetup"
+  ] ++ lib.optionals stdenv.hostPlatform.isDarwin [
+    "Socket"
+  ];
+
+  pythonImportsCheck = [
+    "Pyro5"
+  ];
+
+  meta = with lib; {
+    description = "Distributed object middleware for Python (RPC)";
+    homepage = "https://github.com/irmen/Pyro5";
+    changelog = "https://github.com/irmen/Pyro5/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyrogram/default.nix b/nixpkgs/pkgs/development/python-modules/pyrogram/default.nix
new file mode 100644
index 000000000000..c947cbaaa4eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrogram/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pyaes
+, pysocks
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "pyrogram";
+  version = "2.0.106";
+
+  disabled = pythonOlder "3.7";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "pyrogram";
+    repo = "pyrogram";
+    rev = "v${version}";
+    hash = "sha256-W/t3v5q0s+ba0Uly+JUaJl75uDQGeFaj2zDKGRMIMow=";
+  };
+
+  propagatedBuildInputs = [
+    pyaes
+    pysocks
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  pythonImportsCheck = [
+    "pyrogram"
+    "pyrogram.errors"
+    "pyrogram.types"
+  ];
+
+  meta = with lib; {
+    description = "Telegram MTProto API Client Library and Framework for Python";
+    homepage = "https://github.com/pyrogram/pyrogram";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyroma/default.nix b/nixpkgs/pkgs/development/python-modules/pyroma/default.nix
new file mode 100644
index 000000000000..9d2c220c472f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyroma/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, docutils
+, python
+, pygments
+, setuptools
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyroma";
+  version = "3.2";
+
+  src = fetchFromGitHub {
+    owner = "regebro";
+    repo = pname;
+    rev = version;
+    sha256 = "0ln9w984n48nyxwzd1y48l6b18lnv52radcyizaw56lapcgxrzdr";
+  };
+
+  propagatedBuildInputs = [
+    docutils
+    pygments
+    setuptools
+    requests
+  ];
+
+  # https://github.com/regebro/pyroma/blob/3.2/Makefile#L23
+  # PyPITest requires network access
+  checkPhase = ''
+    ${python.interpreter} -m unittest -k 'not PyPITest' pyroma.tests
+  '';
+
+  pythonImportsCheck = [ "pyroma" ];
+
+  meta = with lib; {
+    description = "Test your project's packaging friendliness";
+    homepage = "https://github.com/regebro/pyroma";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kamadorueda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyroute2/default.nix b/nixpkgs/pkgs/development/python-modules/pyroute2/default.nix
new file mode 100644
index 000000000000..48ad5bb08e94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyroute2/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, importlib-metadata
+, mitogen
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pyroute2";
+  version = "0.7.9";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-tp2C8UCwd0MX17pA9sX6HXVQmLo/PrYZmC0W51DcYxo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    mitogen
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  # Requires root privileges, https://github.com/svinota/pyroute2/issues/778
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyroute2"
+    "pyroute2.common"
+    "pyroute2.config"
+    "pyroute2.ethtool"
+    "pyroute2.ipdb"
+    "pyroute2.ipset"
+    "pyroute2.ndb"
+    "pyroute2.nftables"
+    "pyroute2.nslink"
+    "pyroute2.protocols"
+  ];
+
+  meta = with lib; {
+    description = "Python Netlink library";
+    homepage = "https://github.com/svinota/pyroute2";
+    changelog = "https://github.com/svinota/pyroute2/blob/${version}/CHANGELOG.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab mic92 ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyrr/default.nix b/nixpkgs/pkgs/development/python-modules/pyrr/default.nix
new file mode 100644
index 000000000000..4f7eb6623195
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrr/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, multipledispatch
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "pyrr";
+  version = "unstable-2022-07-22";
+
+  src = fetchFromGitHub {
+    owner = "adamlwgriffiths";
+    repo = "Pyrr";
+    rev = "f6c8698c48a75f3fb7ad0d47d0ce80a04f87ba2f";
+    hash = "sha256-u9O52MQskZRzw0rBH6uPdXdikWLJe7wyBZGNKIFA4BA=";
+  };
+
+  propagatedBuildInputs = [ multipledispatch numpy ];
+
+  meta = with lib; {
+    description = "3D mathematical functions using NumPy";
+    homepage = "https://github.com/adamlwgriffiths/Pyrr/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ c0deaddict ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyrsistent/default.nix b/nixpkgs/pkgs/development/python-modules/pyrsistent/default.nix
new file mode 100644
index 000000000000..37de5033477f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrsistent/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, six
+, pytestCheckHook
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "pyrsistent";
+  version = "0.19.3";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GimUdzcGu7SZXDGpe8lPFBgxSSO9EEjG2WSDcEA3ZEA=";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  nativeCheckInputs = [ pytestCheckHook hypothesis ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'pytest<5' 'pytest' \
+      --replace 'hypothesis<5' 'hypothesis'
+  '';
+
+  pythonImportsCheck = [ "pyrsistent" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/tobgu/pyrsistent/";
+    description = "Persistent/Functional/Immutable data structures";
+    license = licenses.mit;
+    maintainers = with maintainers; [ desiderius ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyrss2gen/default.nix b/nixpkgs/pkgs/development/python-modules/pyrss2gen/default.nix
new file mode 100644
index 000000000000..00c823475a63
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrss2gen/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pyrss2gen";
+  version = "1.1";
+
+  src = fetchPypi {
+    pname = "PyRSS2Gen";
+    inherit version;
+    sha256 = "1rvf5jw9hknqz02rp1vg8abgb1lpa0bc65l7ylmlillqx7bswq3r";
+  };
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "http://www.dalkescientific.om/Python/PyRSS2Gen.html";
+    description = "Library for generating RSS 2.0 feeds";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyrtlsdr/default.nix b/nixpkgs/pkgs/development/python-modules/pyrtlsdr/default.nix
new file mode 100644
index 000000000000..fdd89c28460b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyrtlsdr/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, rtl-sdr
+, setuptools
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyrtlsdr";
+  version = "0.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+z5YO6BzuGHo4LxeYvZvBzZekUf102SR3krWLyPkU2I=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  postPatch = ''
+    sed "s|driver_files =.*|driver_files = ['${rtl-sdr}/lib/librtlsdr.so']|" -i rtlsdr/librtlsdr.py
+  '';
+
+  # No tests that can be used.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python wrapper for librtlsdr (a driver for Realtek RTL2832U based SDR's)";
+    homepage = "https://github.com/roger-/pyrtlsdr";
+    changelog = "https://github.com/pyrtlsdr/pyrtlsdr/releases/tag/v${version}";
+    license = licenses.gpl3Plus;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysabnzbd/default.nix b/nixpkgs/pkgs/development/python-modules/pysabnzbd/default.nix
new file mode 100644
index 000000000000..e77b8cd68188
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysabnzbd/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+}:
+
+buildPythonPackage rec {
+  pname = "pysabnzbd";
+  version = "1.1.1";
+
+  src = fetchFromGitHub {
+    owner = "jeradM";
+    repo = "pysabnzbd";
+    rev = "8e6cd1869c8cc99a4560ea1b178f0a1efd89e460"; # tag is missing
+    hash = "sha256-Ubl+kdcjMm1A7pa3Q5G+fFBwPIxA375Ci04/vVyUl+A=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "pysabnzbd" ];
+
+  meta = {
+    description = "Python wrapper for SABnzbd API";
+    homepage = "https://github.com/jeradM/pysabnzbd";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysaj/default.nix b/nixpkgs/pkgs/development/python-modules/pysaj/default.nix
new file mode 100644
index 000000000000..15f8dd0fccf0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysaj/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, lxml
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysaj";
+  version = "0.0.16";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fredericvl";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-7mN6GPRbXfEUfCrCrCs71SSt4x2Ch2y3a5rfXnuwVA0=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    lxml
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pysaj"
+  ];
+
+  meta = with lib; {
+    description = "Library to communicate with SAJ inverters";
+    homepage = "https://github.com/fredericvl/pysaj";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysam/default.nix b/nixpkgs/pkgs/development/python-modules/pysam/default.nix
new file mode 100644
index 000000000000..108e2dab9124
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysam/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, bzip2
+, bcftools
+, curl
+, cython
+, htslib
+, libdeflate
+, xz
+, pytestCheckHook
+, samtools
+, zlib
+}:
+
+buildPythonPackage rec {
+  pname   = "pysam";
+  version = "0.21.0";
+
+  # Fetching from GitHub instead of PyPi cause the 0.13 src release on PyPi is
+  # missing some files which cause test failures.
+  # Tracked at: https://github.com/pysam-developers/pysam/issues/616
+  src = fetchFromGitHub {
+    owner = "pysam-developers";
+    repo = "pysam";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-C4/AJwcUyLoUEUEnsATLHJb5F8mltP8X2XfktYu0OTo=";
+  };
+
+  nativeBuildInputs = [ samtools ];
+
+  buildInputs = [
+    bzip2
+    curl
+    libdeflate
+    xz
+    zlib
+  ];
+
+  propagatedBuildInputs = [ cython ];
+
+  # Use nixpkgs' htslib instead of the bundled one
+  # See https://pysam.readthedocs.io/en/latest/installation.html#external
+  # NOTE that htslib should be version compatible with pysam
+  preBuild = ''
+    export HTSLIB_MODE=shared
+    export HTSLIB_LIBRARY_DIR=${htslib}/lib
+    export HTSLIB_INCLUDE_DIR=${htslib}/include
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    bcftools
+    htslib
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+    make -C tests/pysam_data
+    make -C tests/cbcf_data
+    make -C tests/tabix_data
+    rm -rf pysam
+  '';
+
+  pythonImportsCheck = [
+    "pysam"
+    "pysam.bcftools"
+    "pysam.libchtslib"
+    "pysam.libcutils"
+    "pysam.libcvcf"
+  ];
+
+  meta = with lib; {
+    description = "A python module for reading, manipulating and writing genome data sets";
+    homepage = "https://pysam.readthedocs.io/";
+    maintainers = with maintainers; [ unode ];
+    license = licenses.mit;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysaml2/default.nix b/nixpkgs/pkgs/development/python-modules/pysaml2/default.nix
new file mode 100644
index 000000000000..b8ace412614c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysaml2/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, defusedxml
+, fetchFromGitHub
+, importlib-resources
+, poetry-core
+, pyasn1
+, pymongo
+, pyopenssl
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pytz
+, requests
+, responses
+, setuptools
+, substituteAll
+, xmlschema
+, xmlsec
+}:
+
+buildPythonPackage rec {
+  pname = "pysaml2";
+  version = "7.4.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "IdentityPython";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-f8qd1Mfy32CYH9/PshfMMBviDg7OhOPlwz69bPjlYbg=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./hardcode-xmlsec1-path.patch;
+      inherit xmlsec;
+    })
+  ];
+
+  postPatch = ''
+    # Fix failing tests on systems with 32bit time_t
+    sed -i 's/2999\(-.*T\)/2029\1/g' tests/*.xml
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    defusedxml
+    pyopenssl
+    python-dateutil
+    pytz
+    requests
+    setuptools
+    xmlschema
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+  ];
+
+  nativeCheckInputs = [
+    pyasn1
+    pymongo
+    pytestCheckHook
+    responses
+  ];
+
+  disabledTests = [
+    # Disabled tests try to access the network
+    "test_load_extern_incommon"
+    "test_load_remote_encoding"
+    "test_load_external"
+    "test_conf_syslog"
+  ];
+
+  pythonImportsCheck = [
+    "saml2"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of SAML Version 2 Standard";
+    homepage = "https://github.com/IdentityPython/pysaml2";
+    changelog = "https://github.com/IdentityPython/pysaml2/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysaml2/hardcode-xmlsec1-path.patch b/nixpkgs/pkgs/development/python-modules/pysaml2/hardcode-xmlsec1-path.patch
new file mode 100644
index 000000000000..ba932803275d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysaml2/hardcode-xmlsec1-path.patch
@@ -0,0 +1,39 @@
+diff --git a/src/saml2/sigver.py b/src/saml2/sigver.py
+index 59fe2dee..0c24fbcc 100644
+--- a/src/saml2/sigver.py
++++ b/src/saml2/sigver.py
+@@ -165,33 +165,7 @@ def get_xmlsec_binary(paths=None):
+     :return: full name of the xmlsec1 binary found. If no binaries are
+         found then an exception is raised.
+     """
+-    if os.name == "posix":
+-        bin_name = ["xmlsec1"]
+-    elif os.name == "nt":
+-        bin_name = ["xmlsec.exe", "xmlsec1.exe"]
+-    else:  # Default !?
+-        bin_name = ["xmlsec1"]
+-
+-    if paths:
+-        for bname in bin_name:
+-            for path in paths:
+-                fil = os.path.join(path, bname)
+-                try:
+-                    if os.lstat(fil):
+-                        return fil
+-                except OSError:
+-                    pass
+-
+-    for path in os.environ["PATH"].split(os.pathsep):
+-        for bname in bin_name:
+-            fil = os.path.join(path, bname)
+-            try:
+-                if os.lstat(fil):
+-                    return fil
+-            except OSError:
+-                pass
+-
+-    raise SigverError(f"Cannot find {bin_name}")
++    return '@xmlsec@/bin/xmlsec1'
+ 
+ 
+ def _get_xmlsec_cryptobackend(path=None, search_paths=None):
diff --git a/nixpkgs/pkgs/development/python-modules/pysatochip/default.nix b/nixpkgs/pkgs/development/python-modules/pysatochip/default.nix
new file mode 100644
index 000000000000..4547fa827b72
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysatochip/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, certifi
+, cryptography
+, ecdsa
+, pyaes
+, pyopenssl
+, pyscard
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysatochip";
+  version = "0.14.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+Z3D6ITZouhLbEotvJ9MDfg6QOhjGVKrLi1QL1kOdkE=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "cryptography==3.3.2" "cryptography" \
+      --replace "ecdsa==0.15" "ecdsa" \
+      --replace "pyopenssl==20.0.0" "pyopenssl"
+  '';
+
+  propagatedBuildInputs = [ cryptography ecdsa pyaes pyopenssl pyscard ];
+
+  nativeCheckInputs = [ certifi ];
+
+  pythonImportsCheck = [ "pysatochip" ];
+
+  meta = with lib; {
+    description = "Simple python library to communicate with a Satochip hardware wallet";
+    homepage = "https://github.com/Toporin/pysatochip";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ oxalica ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysbd/default.nix b/nixpkgs/pkgs/development/python-modules/pysbd/default.nix
new file mode 100644
index 000000000000..684846a0ceb5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysbd/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, tqdm
+, spacy
+}:
+
+buildPythonPackage rec {
+  pname = "pysbd";
+  version = "0.3.4";
+  disabled = pythonOlder "3.5";
+
+  # provides no sdist on pypi
+  src = fetchFromGitHub {
+    owner = "nipunsadvilkar";
+    repo = "pySBD";
+    rev = "v${version}";
+    sha256 = "12p7qm237z56hw4zr03n8rycgfymhki2m9c4w3ib0mvqq122a5dp";
+  };
+
+  nativeCheckInputs = [ tqdm spacy ];
+
+  doCheck = false; # requires pyconll and blingfire
+
+  pythonImportsCheck = [ "pysbd" ];
+
+  meta = with lib; {
+    description = "Pysbd (Python Sentence Boundary Disambiguation) is a rule-based sentence boundary detection that works out-of-the-box across many languages";
+    homepage = "https://github.com/nipunsadvilkar/pySBD";
+    license = licenses.mit;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysc2/default.nix b/nixpkgs/pkgs/development/python-modules/pysc2/default.nix
new file mode 100644
index 000000000000..10040928ad24
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysc2/default.nix
@@ -0,0 +1,63 @@
+{ buildPythonPackage
+, lib
+, fetchFromGitHub
+, absl-py
+, enum34
+, future
+, mock
+, mpyq
+, numpy
+, portpicker
+, protobuf
+, pygame
+, s2clientprotocol
+, six
+, websocket-client
+, sc2-headless
+}:
+
+buildPythonPackage {
+  pname = "PySC2";
+  version = "1.2";
+
+  src = fetchFromGitHub {
+    owner = "deepmind";
+    repo = "pysc2";
+    rev = "39f84b01d662eb58b3d95791f59208c210afd4e7";
+    sha256 = "0dfbc2krd2rys1ji75ng2nl0ki8nhnylxljcp287bfb8qyz2m25p";
+  };
+
+  patches = [
+    ./fix-setup-for-py3.patch
+    ./parameterize-runconfig-sc2path.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace "./pysc2/run_configs/platforms.py" \
+      --subst-var-by 'sc2path' '${sc2-headless}'
+  '';
+
+  propagatedBuildInputs = [
+    absl-py
+    enum34
+    future
+    mock
+    mpyq
+    numpy
+    portpicker
+    protobuf
+    pygame
+    s2clientprotocol
+    six
+    websocket-client
+    sc2-headless
+  ];
+
+  meta = {
+    description = "Starcraft II environment and library for training agents.";
+    homepage = "https://github.com/deepmind/pysc2";
+    license = lib.licenses.asl20;
+    platforms = lib.platforms.linux;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysc2/fix-setup-for-py3.patch b/nixpkgs/pkgs/development/python-modules/pysc2/fix-setup-for-py3.patch
new file mode 100644
index 000000000000..b1a2b4e2350a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysc2/fix-setup-for-py3.patch
@@ -0,0 +1,64 @@
+diff --git a/setup.py b/setup.py
+index 020768f..13c2b67 100755
+--- a/setup.py
++++ b/setup.py
+@@ -17,6 +17,8 @@ from __future__ import absolute_import
+ from __future__ import division
+ from __future__ import print_function
+ 
++import sys
++
+ from setuptools import setup
+ 
+ description = """PySC2 - StarCraft II Learning Environment
+@@ -36,6 +38,27 @@ some initial research results using the environment.
+ Read the README at https://github.com/deepmind/pysc2 for more information.
+ """
+ 
++requires = [
++    'absl-py>=0.1.0',
++    'future',
++    'mock',
++    'mpyq',
++    'numpy>=1.10',
++    'portpicker>=1.2.0',
++    'protobuf>=2.6',
++    'pygame',
++    's2clientprotocol>=3.19.0.58400.0',
++    'six',
++    'websocket-client',
++]
++
++if sys.version_info[0] == 2:
++    requires.append('futures')
++
++if (sys.version_info[0] == 2
++        or (sys.version_info[0] == 3 and sys.version_info[1] < 4)):
++    requires.append('enum34')
++
+ setup(
+     name='PySC2',
+     version='1.2',
+@@ -56,21 +79,7 @@ setup(
+         'pysc2.run_configs',
+         'pysc2.tests',
+     ],
+-    install_requires=[
+-        'absl-py>=0.1.0',
+-        'enum34',
+-        'future',
+-        'futures',
+-        'mock',
+-        'mpyq',
+-        'numpy>=1.10',
+-        'portpicker>=1.2.0',
+-        'protobuf>=2.6',
+-        'pygame',
+-        's2clientprotocol>=3.19.0.58400.0',
+-        'six',
+-        'websocket-client',
+-    ],
++    install_requires=requires,
+     entry_points={
+         'console_scripts': [
+             'pysc2_agent = pysc2.bin.agent:entry_point',
diff --git a/nixpkgs/pkgs/development/python-modules/pysc2/parameterize-runconfig-sc2path.patch b/nixpkgs/pkgs/development/python-modules/pysc2/parameterize-runconfig-sc2path.patch
new file mode 100644
index 000000000000..be667503d47c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysc2/parameterize-runconfig-sc2path.patch
@@ -0,0 +1,18 @@
+diff --git a/pysc2/run_configs/platforms.py b/pysc2/run_configs/platforms.py
+index 5cd84f9..1923cb7 100644
+--- a/pysc2/run_configs/platforms.py
++++ b/pysc2/run_configs/platforms.py
+@@ -119,12 +119,9 @@ class Linux(LocalBase):
+   """Config to run on Linux."""
+ 
+   def __init__(self):
+-    base_dir = os.environ.get("SC2PATH", "~/StarCraftII")
++    base_dir = os.environ.get("SC2PATH", "@sc2path@")
+     base_dir = os.path.expanduser(base_dir)
+     env = copy.deepcopy(os.environ)
+-    env["LD_LIBRARY_PATH"] = ":".join(filter(None, [
+-        os.environ.get("LD_LIBRARY_PATH"),
+-        os.path.join(base_dir, "Libs/")]))
+     super(Linux, self).__init__(base_dir, "SC2_x64", env=env)
+ 
+   @classmethod
diff --git a/nixpkgs/pkgs/development/python-modules/pyscard/default.nix b/nixpkgs/pkgs/development/python-modules/pyscard/default.nix
new file mode 100644
index 000000000000..6e7a1ec29cbe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyscard/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, setuptools
+, pkg-config
+, swig
+, pcsclite
+, PCSC
+, pytestCheckHook
+}:
+
+let
+  # Package does not support configuring the pcsc library.
+  withApplePCSC = stdenv.isDarwin;
+in
+
+buildPythonPackage rec {
+  version = "2.0.7";
+  pname = "pyscard";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "LudovicRousseau";
+    repo = "pyscard";
+    rev = "refs/tags/${version}";
+    hash = "sha256-nkDI1OPQ4SsNhWkg53ZTsG7j0+mvpkJI7dsyaOl1a/8=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    swig
+  ] ++ lib.optionals (!withApplePCSC) [
+    pkg-config
+  ];
+
+  buildInputs = if withApplePCSC then [ PCSC ] else [ pcsclite ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch =
+    if withApplePCSC then ''
+      substituteInPlace smartcard/scard/winscarddll.c \
+        --replace "/System/Library/Frameworks/PCSC.framework/PCSC" \
+                  "${PCSC}/Library/Frameworks/PCSC.framework/PCSC"
+    '' else ''
+      substituteInPlace setup.py --replace "pkg-config" "$PKG_CONFIG"
+      substituteInPlace smartcard/scard/winscarddll.c \
+        --replace "libpcsclite.so.1" \
+                  "${lib.getLib pcsclite}/lib/libpcsclite${stdenv.hostPlatform.extensions.sharedLibrary}"
+    '';
+
+  preCheck = ''
+    # remove src module, so tests use the installed module instead
+    rm -r smartcard
+  '';
+
+  meta = with lib; {
+    homepage = "https://pyscard.sourceforge.io/";
+    description = "Smartcard library for python";
+    license = licenses.lgpl21;
+    maintainers = with maintainers; [ layus ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyscf/default.nix b/nixpkgs/pkgs/development/python-modules/pyscf/default.nix
new file mode 100644
index 000000000000..784978b7ca47
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyscf/default.nix
@@ -0,0 +1,103 @@
+{ buildPythonPackage
+, lib
+, fetchFromGitHub
+, cmake
+, blas
+, libcint
+, libxc
+, xcfun
+, cppe
+, h5py
+, numpy
+, scipy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyscf";
+  version = "2.4.0";
+
+  src = fetchFromGitHub {
+    owner = "pyscf";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-+dZsXiLqqyRWr1eOEVSHZ1KMM760hrDaT07ylZUcGmo=";
+  };
+
+  # setup.py calls Cmake and passes the arguments in CMAKE_CONFIGURE_ARGS to cmake.
+  nativeBuildInputs = [ cmake ];
+  dontUseCmakeConfigure = true;
+  preConfigure = ''
+    export CMAKE_CONFIGURE_ARGS="-DBUILD_LIBCINT=0 -DBUILD_LIBXC=0 -DBUILD_XCFUN=0"
+    PYSCF_INC_DIR="${libcint}:${libxc}:${xcfun}";
+  '';
+
+  buildInputs = [
+    blas
+    libcint
+    libxc
+    xcfun
+  ];
+
+  propagatedBuildInputs = [
+    cppe
+    h5py
+    numpy
+    scipy
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [ "pyscf" ];
+  preCheck = ''
+    # Set config used by tests to ensure reproducibility
+    echo 'pbc_tools_pbc_fft_engine = "NUMPY"' > pyscf/pyscf_config.py
+    export OMP_NUM_THREADS=1
+    ulimit -s 20000
+    export PYSCF_CONFIG_FILE=$(pwd)/pyscf/pyscf_config.py
+  '';
+
+  # Numerically slightly off tests
+  disabledTests = [
+    "test_tdhf_singlet"
+    "test_ab_hf"
+    "test_ea"
+    "test_bz"
+    "h2o_vdz"
+    "test_mc2step_4o4e"
+    "test_ks_noimport"
+    "test_jk_hermi0"
+    "test_j_kpts"
+    "test_k_kpts"
+    "test_lda"
+    "high_cost"
+    "skip"
+    "call_in_background"
+    "libxc_cam_beta_bug"
+    "test_finite_diff_rks_eph"
+    "test_finite_diff_uks_eph"
+    "test_finite_diff_roks_grad"
+    "test_finite_diff_df_roks_grad"
+    "test_frac_particles"
+    "test_nosymm_sa4_newton"
+    "test_pipek"
+    "test_n3_cis_ewald"
+    "test_veff"
+    "test_collinear_kgks_gga"
+  ];
+
+  pytestFlagsArray = [
+    "--ignore=pyscf/pbc/tdscf"
+    "--ignore=pyscf/pbc/gw"
+    "--ignore-glob=*_slow.*py"
+    "--ignore-glob=*_kproxy_.*py"
+    "--ignore-glob=test_proxy.py"
+  ];
+
+  meta = with lib; {
+    description = "Python-based simulations of chemistry framework";
+    homepage = "https://github.com/pyscf/pyscf";
+    license = licenses.asl20;
+    platforms = [ "x86_64-linux" "x86_64-darwin" ];
+    maintainers = [ maintainers.sheepforce ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyschedule/default.nix b/nixpkgs/pkgs/development/python-modules/pyschedule/default.nix
new file mode 100644
index 000000000000..7ee23f34e093
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyschedule/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pulp
+}:
+
+buildPythonPackage rec {
+  pname = "pyschedule";
+  version = "0.2.34";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6bba9e9ea07906ce2dfe3cd847c1822b137f6b13e9f975c50b347312fd98e110";
+  };
+
+  propagatedBuildInputs = [
+    pulp
+  ];
+
+  # tests not included with pypi release (in examples)
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Formulate and solve resource-constrained scheduling problems";
+    homepage = "https://github.com/timnon/pyschedule";
+    license = licenses.asl20;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyschemes/default.nix b/nixpkgs/pkgs/development/python-modules/pyschemes/default.nix
new file mode 100644
index 000000000000..384e375ecbde
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyschemes/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "pyschemes";
+  version = "unstable-2017-11-08";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "spy16";
+    repo = pname;
+    rev = "ca6483d13159ba65ba6fc2f77b90421c40f2bbf2";
+    hash = "sha256-PssucudvlE8mztwVme70+h+2hRW/ri9oV9IZayiZhdU=";
+  };
+
+  patches = [
+    # Fix python 3.10 compatibility. Tracked upstream in
+    # https://github.com/spy16/pyschemes/pull/6
+    (fetchpatch {
+      url = "https://github.com/spy16/pyschemes/commit/23011128c6c22838d4fca9e00fd322a20bb566c4.patch";
+      hash = "sha256-vDaWxMrn2aC2wmd035EWRZ3cd/XME81z/BWG0f2T9jc=";
+    })
+  ];
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pyschemes" ];
+
+  meta = with lib; {
+    description = "A library for validating data structures in Python";
+    homepage = "https://github.com/spy16/pyschemes";
+    license = licenses.wtfpl;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyschlage/default.nix b/nixpkgs/pkgs/development/python-modules/pyschlage/default.nix
new file mode 100644
index 000000000000..8cedcfb434ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyschlage/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pycognito
+, pytestCheckHook
+, pythonOlder
+, requests
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pyschlage";
+  version = "2023.11.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dknowles2";
+    repo = "pyschlage";
+    rev = "refs/tags/${version}";
+    hash = "sha256-18kVXGpklfvCGOy2jBOG9BAAzE0ZVQ3LONjiwo9YnjU=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    pycognito
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyschlage"
+  ];
+
+  meta = with lib; {
+    description = "Library for interacting with Schlage Encode WiFi locks";
+    homepage = "https://github.com/dknowles2/pyschlage";
+    changelog = "https://github.com/dknowles2/pyschlage/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyscreenshot/default.nix b/nixpkgs/pkgs/development/python-modules/pyscreenshot/default.nix
new file mode 100644
index 000000000000..f04b85a9d003
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyscreenshot/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, easyprocess
+, entrypoint2
+, jeepney
+, mss
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "pyscreenshot";
+  version = "3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-jA6T8K72amv+Vahqv87WvTlq5LT2zB428EoorSYlWU0=";
+  };
+
+  propagatedBuildInputs = [
+    easyprocess
+    entrypoint2
+    pillow
+  ] ++ lib.optionals (isPy3k) [
+    jeepney
+    mss
+  ];
+
+  # recursive dependency on pyvirtualdisplay
+  doCheck = false;
+
+  pythonImportsCheck = [ "pyscreenshot" ];
+
+  meta = with lib; {
+    description = "python screenshot";
+    homepage = "https://github.com/ponty/pyscreenshot";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyscreeze/default.nix b/nixpkgs/pkgs/development/python-modules/pyscreeze/default.nix
new file mode 100644
index 000000000000..4d09929bf0e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyscreeze/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pillow
+, xlib
+, xvfb-run
+, scrot
+}:
+buildPythonPackage rec {
+  pname = "PyScreeze";
+  version = "0.1.26";
+
+  src = fetchFromGitHub {
+    owner = "asweigart";
+    repo = "pyscreeze";
+    rev = "28ab707dceecbdd135a9491c3f8effd3a69680af";
+    hash = "sha256-gn3ydjf/msdhIhngGlhK+jhEyFy0qGeDr58E7kM2YZs=";
+  };
+
+  pythonImportsCheck = [ "pyscreeze" ];
+  nativeCheckInputs = [ scrot xlib xvfb-run ];
+  checkPhase = ''
+    python -m unittest tests.test_pillow_unavailable
+    xvfb-run python -m unittest tests.test_pyscreeze
+  '';
+
+  propagatedBuildInputs = [
+    pillow
+  ];
+
+  meta = with lib; {
+    description = "PyScreeze is a simple, cross-platform screenshot module for Python 2 and 3.";
+    homepage = "https://github.com/asweigart/pyscreeze";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ lucasew ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyscrypt/default.nix b/nixpkgs/pkgs/development/python-modules/pyscrypt/default.nix
new file mode 100644
index 000000000000..372f6db08324
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyscrypt/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, python }:
+
+buildPythonPackage rec {
+  pname = "pyscrypt";
+  version = "1.6.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1sd5pd5fpcdnpp4h58kdnvkf0s3afh4ssfqky2ap6z0gy6ax3zds";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} tests/run-tests-hash.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/ricmoo/pyscrypt/";
+    description = "Pure-Python implementation of Scrypt PBKDF and scrypt file format library";
+    license = licenses.mit;
+    maintainers = with maintainers; [ valodim ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyscss/default.nix b/nixpkgs/pkgs/development/python-modules/pyscss/default.nix
new file mode 100644
index 000000000000..21b0f169cd79
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyscss/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, six
+, enum34
+, pathlib
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyScss";
+  version = "1.4.0";
+
+  src = fetchFromGitHub {
+    repo = "pyScss";
+    owner = "Kronuz";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-z0y4z+/JE6rZWHAvps/taDZvutyVhxxs2gMujV5rNu4=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  propagatedBuildInputs = [ six ]
+    ++ lib.optionals (pythonOlder "3.4") [ enum34 pathlib ];
+
+  # Test suite is broken.
+  # See https://github.com/Kronuz/pyScss/issues/415
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A Scss compiler for Python";
+    homepage = "https://pyscss.readthedocs.org/en/latest/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysdcp/default.nix b/nixpkgs/pkgs/development/python-modules/pysdcp/default.nix
new file mode 100644
index 000000000000..b6b1798f7ae1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysdcp/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysdcp";
+  version = "1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "pySDCP";
+    inherit version;
+    sha256 = "07396lsn610izaravqc6j5f6m0wjrzgc0d1r9dwqzj15g5zfc7wm";
+  };
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "pysdcp" ];
+
+  meta = with lib; {
+    description = "Python library to control SONY projectors";
+    homepage = "https://github.com/Galala7/pySDCP";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysdl2/PySDL2-dll.patch b/nixpkgs/pkgs/development/python-modules/pysdl2/PySDL2-dll.patch
new file mode 100644
index 000000000000..9b8374a0f051
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysdl2/PySDL2-dll.patch
@@ -0,0 +1,102 @@
+diff --git a/sdl2/dll.py b/sdl2/dll.py
+index 2413329..f460bf6 100644
+--- a/sdl2/dll.py
++++ b/sdl2/dll.py
+@@ -235,7 +235,7 @@ class DLL(object):
+     """Function wrapper around the different DLL functions. Do not use or
+     instantiate this one directly from your user code.
+     """
+-    def __init__(self, libinfo, libnames, path=None):
++    def __init__(self, libinfo, libfile):
+         self._dll = None
+         self._deps = None
+         self._libname = libinfo
+@@ -247,11 +247,7 @@ class DLL(object):
+             "SDL2_image": (2, 0, 1),
+             "SDL2_gfx": (1, 0, 3)
+         }
+-        foundlibs = _findlib(libnames, path)
+-        dllmsg = "PYSDL2_DLL_PATH: %s" % (os.getenv("PYSDL2_DLL_PATH") or "unset")
+-        if len(foundlibs) == 0:
+-            raise RuntimeError("could not find any library for %s (%s)" %
+-                               (libinfo, dllmsg))
++        foundlibs = [ libfile ]
+         for libfile in foundlibs:
+             try:
+                 self._dll = CDLL(libfile)
+@@ -276,9 +272,6 @@ class DLL(object):
+                                (foundlibs, libinfo))
+         if _using_ms_store_python():
+             self._deps = _preload_deps(libinfo, self._libfile)
+-        if path is not None and sys.platform in ("win32",) and \
+-            path in self._libfile:
+-            os.environ["PATH"] = "%s;%s" % (path, os.environ["PATH"])
+ 
+     def bind_function(self, funcname, args=None, returns=None, added=None):
+         """Binds the passed argument and return value types to the specified
+@@ -359,7 +352,7 @@ class DLL(object):
+ # Once the DLL class is defined, try loading the main SDL2 library
+ 
+ try:
+-    dll = DLL("SDL2", ["SDL2", "SDL2-2.0", "SDL2-2.0.0"], os.getenv("PYSDL2_DLL_PATH"))
++    dll = DLL("SDL2", "@sdl2@")
+ except RuntimeError as exc:
+     raise ImportError(exc)
+ 
+diff --git a/sdl2/sdlgfx.py b/sdl2/sdlgfx.py
+index 015eeaf..d6ce52f 100644
+--- a/sdl2/sdlgfx.py
++++ b/sdl2/sdlgfx.py
+@@ -27,8 +27,7 @@ __all__ = [
+ 
+ 
+ try:
+-    dll = DLL("SDL2_gfx", ["SDL2_gfx", "SDL2_gfx-1.0"],
+-              os.getenv("PYSDL2_DLL_PATH"))
++    dll = DLL("SDL2_gfx", "@sdl2_gfx@")
+ except RuntimeError as exc:
+     raise ImportError(exc)
+ 
+diff --git a/sdl2/sdlimage.py b/sdl2/sdlimage.py
+index a702136..dcdea51 100644
+--- a/sdl2/sdlimage.py
++++ b/sdl2/sdlimage.py
+@@ -30,9 +30,7 @@ __all__ = [
+ 
+ 
+ try:
+-    dll = DLL(
+-        "SDL2_image", ["SDL2_image", "SDL2_image-2.0"], os.getenv("PYSDL2_DLL_PATH")
+-    )
++    dll = DLL("SDL2_image", "@sdl2_image@")
+ except RuntimeError as exc:
+     raise ImportError(exc)
+ 
+diff --git a/sdl2/sdlmixer.py b/sdl2/sdlmixer.py
+index 5f2163c..23d95b0 100644
+--- a/sdl2/sdlmixer.py
++++ b/sdl2/sdlmixer.py
+@@ -50,8 +50,7 @@ __all__ = [
+ ]
+ 
+ try:
+-    dll = DLL("SDL2_mixer", ["SDL2_mixer", "SDL2_mixer-2.0"],
+-              os.getenv("PYSDL2_DLL_PATH"))
++    dll = DLL("SDL2_mixer", "@sdl2_mixer@")
+ except RuntimeError as exc:
+     raise ImportError(exc)
+ 
+diff --git a/sdl2/sdlttf.py b/sdl2/sdlttf.py
+index 7c5f7db..61814cd 100644
+--- a/sdl2/sdlttf.py
++++ b/sdl2/sdlttf.py
+@@ -41,8 +41,7 @@ __all__ = [
+ 
+ 
+ try:
+-    dll = DLL("SDL2_ttf", ["SDL2_ttf", "SDL2_ttf-2.0"],
+-              os.getenv("PYSDL2_DLL_PATH"))
++    dll = DLL("SDL2_ttf", "@sdl2_ttf@")
+ except RuntimeError as exc:
+     raise ImportError(exc)
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/pysdl2/default.nix b/nixpkgs/pkgs/development/python-modules/pysdl2/default.nix
new file mode 100644
index 000000000000..64b9b97d4a35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysdl2/default.nix
@@ -0,0 +1,42 @@
+{ stdenv, lib, substituteAll, fetchPypi, buildPythonPackage, SDL2, SDL2_ttf, SDL2_image, SDL2_gfx, SDL2_mixer }:
+
+buildPythonPackage rec {
+  pname = "PySDL2";
+  version = "0.9.15";
+
+  # The tests use OpenGL using find_library, which would have to be
+  # patched; also they seem to actually open X windows and test stuff
+  # like "screensaver disabling", which would have to be cleverly
+  # sandboxed. Disable for now.
+  doCheck = false;
+  pythonImportsCheck = [ "sdl2" ];
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-kIp946iMKyKiwhppkXxTIVKJW9GkkFJ6Jw7hTK1A5kc=";
+  };
+
+  # Deliberately not in propagated build inputs; users can decide
+  # which library they want to include.
+  buildInputs = [ SDL2_ttf SDL2_image SDL2_gfx SDL2_mixer ];
+  propagatedBuildInputs = [ SDL2 ];
+  patches = [
+    (substituteAll ({
+      src = ./PySDL2-dll.patch;
+    } // builtins.mapAttrs (_: pkg: "${pkg}/lib/lib${pkg.pname}${stdenv.hostPlatform.extensions.sharedLibrary}") {
+      # substituteAll keys must start lowercase
+      sdl2 = SDL2;
+      sdl2_ttf = SDL2_ttf;
+      sdl2_image = SDL2_image;
+      sdl2_gfx = SDL2_gfx;
+      sdl2_mixer = SDL2_mixer;
+    }))
+  ];
+
+  meta = {
+    description = "A wrapper around the SDL2 library and as such similar to the discontinued PySDL project";
+    homepage = "https://github.com/marcusva/py-sdl2";
+    license = lib.licenses.publicDomain;
+    maintainers = with lib.maintainers; [ pmiddend ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysecuritas/default.nix b/nixpkgs/pkgs/development/python-modules/pysecuritas/default.nix
new file mode 100644
index 000000000000..7579e014b69c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysecuritas/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "pysecuritas";
+  version = "0.1.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "W3DLZCXUH9y5NPipFEu6URmKN+oVXMgeDF1rfKtxRng=";
+  };
+
+  propagatedBuildInputs = [
+    xmltodict
+    requests
+  ];
+
+  # Project doesn't ship tests with PyPI releases
+  # https://github.com/Cebeerre/pysecuritas/issues/13
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pysecuritas"
+  ];
+
+  meta = with lib; {
+    description = "Python client to access Securitas Direct Mobile API";
+    homepage = "https://github.com/Cebeerre/pysecuritas";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysendfile/default.nix b/nixpkgs/pkgs/development/python-modules/pysendfile/default.nix
new file mode 100644
index 000000000000..d2a73bb72820
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysendfile/default.nix
@@ -0,0 +1,30 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "pysendfile";
+  version = "2.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "05qf0m32isflln1zjgxlpw0wf469lj86vdwwqyizp1h94x5l22ji";
+  };
+
+  checkPhase = ''
+    # this test takes too long
+    sed -i 's/test_big_file/noop/' test/test_sendfile.py
+    ${python.executable} test/test_sendfile.py
+  '';
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    homepage = "https://github.com/giampaolo/pysendfile";
+    description = "A Python interface to sendfile(2)";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysensibo/default.nix b/nixpkgs/pkgs/development/python-modules/pysensibo/default.nix
new file mode 100644
index 000000000000..43d19bbc3862
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysensibo/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysensibo";
+  version = "1.0.36";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lsHKwFzfkGWuUiZGkt9zwjNDDU7i6gcqcEsi5SQqsSQ=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # No tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pysensibo"
+  ];
+
+  meta = with lib; {
+    description = "Module for interacting with Sensibo";
+    homepage = "https://github.com/andrey-git/pysensibo";
+    changelog = "https://github.com/andrey-git/pysensibo/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysensors/default.nix b/nixpkgs/pkgs/development/python-modules/pysensors/default.nix
new file mode 100644
index 000000000000..0c8e32440209
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysensors/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, unittestCheckHook, fetchFromGitHub, lm_sensors }:
+buildPythonPackage {
+  version = "2017-07-13";
+  pname = "pysensors";
+
+  # note that https://pypi.org/project/PySensors/ is a different project
+  src = fetchFromGitHub {
+    owner = "bastienleonard";
+    repo = "pysensors";
+    rev = "ef46fc8eb181ecb8ad09b3d80bc002d23d9e26b3";
+    sha256 = "1xvbxnkz55fk5fpr514263c7s7s9r8hgrw4ybfaj5a0mligmmrfm";
+  };
+
+  buildInputs = [ lm_sensors ];
+
+  # Tests are disable because they fail on `aarch64-linux`, probably
+  # due to sandboxing
+  doCheck = false;
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  unittestFlagsArray = [ "-s" "tests" ];
+
+  meta = with lib; {
+    maintainers = with maintainers; [ guibou ];
+    description = "Easy hardware health monitoring in Python for Linux systems";
+    homepage = "https://pysensors.readthedocs.org";
+    license = licenses.bsd2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysequoia/default.nix b/nixpkgs/pkgs/development/python-modules/pysequoia/default.nix
new file mode 100644
index 000000000000..4e48f1c49dd1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysequoia/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pkg-config
+, rustPlatform
+, cargo
+, rustc
+, bzip2
+, nettle
+, openssl
+, pcsclite
+, stdenv
+, darwin
+, libiconv
+}:
+
+buildPythonPackage rec {
+  pname = "pysequoia";
+  version = "0.1.20";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-KavsLp17e4ckX11B0pefiQ1Hma/O9x0VY/uVPiJm4Fs=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-7Lw6gR6o2HJ/zyG4b0wz4nmU2AIIAhyK9zaQ6w+/RgE=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+    rustPlatform.bindgenHook
+    rustPlatform.cargoSetupHook
+    rustPlatform.maturinBuildHook
+    cargo
+    rustc
+  ];
+
+  buildInputs = [
+    bzip2
+    nettle
+    openssl
+    pcsclite
+  ] ++ lib.optionals stdenv.isDarwin [
+    darwin.apple_sdk.frameworks.CoreFoundation
+    darwin.apple_sdk.frameworks.Security
+    libiconv
+  ];
+
+  pythonImportsCheck = [ "pysequoia" ];
+
+  meta = with lib; {
+    description = "This library provides OpenPGP facilities in Python through the Sequoia PGP library";
+    downloadPage = "https://codeberg.org/wiktor/pysequoia";
+    homepage = "https://sequoia-pgp.gitlab.io/pysequoia";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ doronbehar ];
+    # Broken since the 0.1.20 update according to ofborg. The errors are not clear...
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyserial-asyncio-fast/default.nix b/nixpkgs/pkgs/development/python-modules/pyserial-asyncio-fast/default.nix
new file mode 100644
index 000000000000..d935b2c17155
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyserial-asyncio-fast/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, setuptools
+, wheel
+
+# dependencies
+, pyserial
+
+# tests
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "pyserial-asyncio-fast";
+  version = "0.11";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = "pyserial-asyncio-fast";
+    rev = version;
+    hash = "sha256-B1CLk7ggI7l+DaMDlnMjl2tfh+evvaf1nxzBpmqMBZk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    pyserial
+  ];
+
+  pythonImportsCheck = [
+    "serial_asyncio_fast"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  meta = with lib; {
+    description = "Fast asyncio extension package for pyserial that implements eager writes";
+    homepage = "https://github.com/bdraco/pyserial-asyncio-fast";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyserial-asyncio/default.nix b/nixpkgs/pkgs/development/python-modules/pyserial-asyncio/default.nix
new file mode 100644
index 000000000000..34bfacb9c0c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyserial-asyncio/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pyserial
+}:
+
+buildPythonPackage rec {
+  pname = "pyserial-asyncio";
+  version = "0.6";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-tgMpI+BenXXsF6WvmphCnEbSg5rfr4BgTVLg+qzXoy8=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [
+    "serial_asyncio"
+  ];
+
+  meta = with lib; {
+    description = "Asyncio extension package for pyserial";
+    homepage = "https://github.com/pyserial/pyserial-asyncio";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyserial/001-rfc2217-only-negotiate-on-value-change.patch b/nixpkgs/pkgs/development/python-modules/pyserial/001-rfc2217-only-negotiate-on-value-change.patch
new file mode 100644
index 000000000000..6bd40bd935d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyserial/001-rfc2217-only-negotiate-on-value-change.patch
@@ -0,0 +1,42 @@
+From c8b35f4b871d00e3020f525425517548bed9f6ad Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= <u.kleine-koenig@pengutronix.de>
+Date: Sun, 9 Sep 2018 20:13:27 +0200
+Subject: [PATCH] serial/rfc2217: only subnegotiate on value change
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This was suggested and is a direct copy of Uwe Kleine König's patch
+from [1].
+
+[1]: https://github.com/pyserial/pyserial/issues/376#issuecomment-418885211
+Signed-off-by: Rouven Czerwinski <r.czerwinski@pengutronix.de>
+---
+ serial/rfc2217.py | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+diff --git a/serial/rfc2217.py b/serial/rfc2217.py
+index d962c1e8..2148512d 100644
+--- a/serial/rfc2217.py
++++ b/serial/rfc2217.py
+@@ -330,11 +330,15 @@ def set(self, value):
+         the client needs to know if the change is performed he has to check the
+         state of this object.
+         """
+-        self.value = value
+-        self.state = REQUESTED
+-        self.connection.rfc2217_send_subnegotiation(self.option, self.value)
+-        if self.connection.logger:
+-            self.connection.logger.debug("SB Requesting {} -> {!r}".format(self.name, self.value))
++        if value != self.value:
++            self.value = value
++            self.state = REQUESTED
++            self.connection.rfc2217_send_subnegotiation(self.option, self.value)
++            if self.connection.logger:
++                self.connection.logger.debug("SB Requesting {} -> {!r}".format(self.name, self.value))
++        else:
++            if self.connection.logger:
++                self.connection.logger.debug("SB Requesting {} -> {!r} (skipped)".format(self.name, self.value))
+
+     def is_ready(self):
+         """\
diff --git a/nixpkgs/pkgs/development/python-modules/pyserial/002-rfc2217-timeout-setter-for-rfc2217.patch b/nixpkgs/pkgs/development/python-modules/pyserial/002-rfc2217-timeout-setter-for-rfc2217.patch
new file mode 100644
index 000000000000..39410dee1640
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyserial/002-rfc2217-timeout-setter-for-rfc2217.patch
@@ -0,0 +1,42 @@
+From a3698dc952fce0d07628133e987b7b43ed6e1157 Mon Sep 17 00:00:00 2001
+From: Rouven Czerwinski <rouven@czerwinskis.de>
+Date: Sun, 9 Sep 2018 20:08:40 +0200
+Subject: [PATCH] serial/rfc2217: add timeout.setter for rfc2217
+
+Add a new setter method for the timeout property which does not invoke
+the port reconfiguration.
+This is a direct copy of the SerialBase timeout property without the port
+reconfiguration.
+
+Signed-off-by: Rouven Czerwinski <r.czerwinski@pengutronix.de>
+---
+ serial/rfc2217.py | 17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+diff --git a/serial/rfc2217.py b/serial/rfc2217.py
+index d962c1e8..12615cf3 100644
+--- a/serial/rfc2217.py
++++ b/serial/rfc2217.py
+@@ -722,5 +722,22 @@ def cd(self):
+             raise portNotOpenError
+         return bool(self.get_modem_state() & MODEMSTATE_MASK_CD)
+
++    @property
++    def timeout(self):
++        """Get the current timeout setting."""
++        return self._timeout
++
++    @timeout.setter
++    def timeout(self, timeout):
++        """Change timeout setting."""
++        if timeout is not None:
++            try:
++                timeout + 1     # test if it's a number, will throw a TypeError if not...
++            except TypeError:
++                raise ValueError("Not a valid timeout: {!r}".format(timeout))
++            if timeout < 0:
++                raise ValueError("Not a valid timeout: {!r}".format(timeout))
++        self._timeout = timeout
++
+     # - - - platform specific - - -
+     # None so far
diff --git a/nixpkgs/pkgs/development/python-modules/pyserial/default.nix b/nixpkgs/pkgs/development/python-modules/pyserial/default.nix
new file mode 100644
index 000000000000..a515c5acfcd1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyserial/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, unittestCheckHook
+, pythonOlder
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "pyserial";
+  version = "3.5";
+  format = "setuptools";
+
+  # Supports Python 2.7 and 3.4+
+  disabled = isPy3k && pythonOlder "3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-PHfgFBcN//vYFub/wgXphC77EL6fWOwW0+hnW0klzds=";
+  };
+
+  patches = [
+    ./001-rfc2217-only-negotiate-on-value-change.patch
+    ./002-rfc2217-timeout-setter-for-rfc2217.patch
+  ];
+
+  doCheck = !stdenv.hostPlatform.isDarwin; # broken on darwin
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  unittestFlagsArray = [ "-s" "test" ];
+
+  pythonImportsCheck = [
+    "serial"
+  ];
+
+  meta = with lib; {
+    description = "Python serial port extension";
+    homepage = "https://github.com/pyserial/pyserial";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ makefu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysftp/default.nix b/nixpkgs/pkgs/development/python-modules/pysftp/default.nix
new file mode 100644
index 000000000000..3333a30bd1ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysftp/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, paramiko
+}:
+
+buildPythonPackage rec {
+  pname = "pysftp";
+  version = "0.2.9";
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0jl5qix5cxzrv4lb8rfpjkpcghbkacnxkb006ikn7mkl5s05mxgv";
+  };
+
+  propagatedBuildInputs = [ paramiko ];
+
+  meta = with lib; {
+    homepage = "https://bitbucket.org/dundeemt/pysftp";
+    description = "A friendly face on SFTP";
+    license = licenses.mit;
+    longDescription = ''
+      A simple interface to SFTP. The module offers high level abstractions
+      and task based routines to handle your SFTP needs. Checkout the Cook
+      Book, in the docs, to see what pysftp can do for you.
+    '';
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyshark/default.nix b/nixpkgs/pkgs/development/python-modules/pyshark/default.nix
new file mode 100644
index 000000000000..523da7030662
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyshark/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, stdenv
+, appdirs
+, buildPythonPackage
+, fetchFromGitHub
+, lxml
+, packaging
+, py
+, pytestCheckHook
+, pythonOlder
+, termcolor
+, wireshark-cli
+}:
+
+buildPythonPackage rec {
+  pname = "pyshark";
+  version = "0.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "KimiNewt";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-kzJDzUK6zknUyXPdKc4zMvWim4C5NQCSJSS45HI6hKM=";
+  };
+
+  # `stripLen` does not seem to work here
+  patchFlags = [ "-p2" ];
+
+  sourceRoot = "${src.name}/src";
+
+  # propagate wireshark, so pyshark can find it when used
+  propagatedBuildInputs = [
+    appdirs
+    lxml
+    packaging
+    py
+    termcolor
+    wireshark-cli
+  ];
+
+  nativeCheckInputs = [
+    py
+    pytestCheckHook
+    wireshark-cli
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  disabledTests = [
+    # flaky
+    # KeyError: 'Packet of index 0 does not exist in capture'
+    "test_getting_packet_summary"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # fails on darwin
+    # _pickle.PicklingError: logger cannot be pickled
+    "test_iterate_empty_psml_capture"
+  ];
+
+  pythonImportsCheck = [
+    "pyshark"
+  ];
+
+  pytestFlagsArray = [
+    "../tests/"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for tshark, allowing Python packet parsing using Wireshark dissectors";
+    homepage = "https://github.com/KimiNewt/pyshark/";
+    changelog = "https://github.com/KimiNewt/pyshark/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyshp/default.nix b/nixpkgs/pkgs/development/python-modules/pyshp/default.nix
new file mode 100644
index 000000000000..280e4cb7675b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyshp/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyshp";
+  version = "2.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "GeospatialPython";
+    repo = pname;
+    rev = version;
+    hash = "sha256-yfxhgk8a1rdpGVkE1sjJqT6tiFLimhu2m2SjGxLI6wo=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "shapefile"
+  ];
+
+  disabledTests = [
+    # Requires network access
+    "test_reader_url"
+  ];
+
+  meta = with lib; {
+    description = "Python read/write support for ESRI Shapefile format";
+    homepage = "https://github.com/GeospatialPython/pyshp";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysiaalarm/default.nix b/nixpkgs/pkgs/development/python-modules/pysiaalarm/default.nix
new file mode 100644
index 000000000000..6956aca6826d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysiaalarm/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, dataclasses-json
+, pycryptodome
+, setuptools-scm
+, pytest-asyncio
+, pytest-cases
+, pytestCheckHook
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "pysiaalarm";
+  version = "3.1.1";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-q42bsBeAwU9lt7wtYGFJv23UBND+aMXZJlSWyTfZDQE=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "==" ">="
+    substituteInPlace pytest.ini \
+      --replace "--cov pysiaalarm --cov-report term-missing" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dataclasses-json
+    pycryptodome
+    pytz
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-cases
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pysiaalarm"
+    "pysiaalarm.aio"
+  ];
+
+  meta = with lib; {
+    description = "Python package for creating a client that talks with SIA-based alarm systems";
+    homepage = "https://github.com/eavanvalkenburg/pysiaalarm";
+    changelog = "https://github.com/eavanvalkenburg/pysiaalarm/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyside2-tools/default.nix b/nixpkgs/pkgs/development/python-modules/pyside2-tools/default.nix
new file mode 100644
index 000000000000..66d0fa51f211
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyside2-tools/default.nix
@@ -0,0 +1,52 @@
+{ wrapPython, python, lib, stdenv, cmake, qt5,
+  shiboken2, pyside2 }:
+
+stdenv.mkDerivation {
+  pname = "pyside2-tools";
+
+  inherit (pyside2) version src;
+
+  patches = [
+    # Upstream has a crazy build system only geared towards producing binary
+    # wheels distributed via pypi.  For this, they copy the `uic` and `rcc`
+    # binaries to the wheel.
+    ./remove_hacky_binary_copying.patch
+  ];
+
+  postPatch = ''
+    cd sources/pyside2-tools
+  '';
+
+  nativeBuildInputs = [ cmake wrapPython ];
+  propagatedBuildInputs = [ shiboken2 pyside2 ];
+  buildInputs = [ python qt5.qtbase ];
+
+  cmakeFlags = [
+    "-DBUILD_TESTS=OFF"
+  ];
+
+  dontWrapQtApps = true;
+
+  # The upstream build system consists of a `setup.py` whichs builds three
+  # different python libraries and calls cmake as a subprocess.  We call cmake
+  # directly because that's easier to get working.  However, the `setup.py`
+  # build also creates a few wrapper scripts, which we replicate here:
+  postInstall = ''
+    rm $out/bin/pyside_tool.py
+
+    for tool in uic rcc; do
+      makeWrapper "$(command -v $tool)" $out/bin/pyside2-$tool --add-flags "-g python"
+    done
+  '';
+
+  postFixup = ''
+    wrapPythonPrograms
+  '';
+
+  meta = with lib; {
+    description = "PySide2 development tools";
+    license = licenses.gpl2;
+    homepage = "https://wiki.qt.io/Qt_for_Python";
+    maintainers = with maintainers; [ gebner ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyside2-tools/remove_hacky_binary_copying.patch b/nixpkgs/pkgs/development/python-modules/pyside2-tools/remove_hacky_binary_copying.patch
new file mode 100644
index 000000000000..19dd8aaf101c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyside2-tools/remove_hacky_binary_copying.patch
@@ -0,0 +1,50 @@
+--- pyside-setup-opensource-src-5.14.2/sources/pyside2-tools/CMakeLists.txt~	2020-07-17 10:51:14.498291075 +0200
++++ pyside-setup-opensource-src-5.14.2/sources/pyside2-tools/CMakeLists.txt	2020-07-17 10:52:20.165336508 +0200
+@@ -46,47 +46,6 @@
+     set(EXE_EXT "")
+ endif()
+ 
+-set(TOOLS_PATH "${_qt5Core_install_prefix}/bin")
+-set(UIC_PATH "${TOOLS_PATH}/uic${EXE_EXT}")
+-set(RCC_PATH "${TOOLS_PATH}/rcc${EXE_EXT}")
+-if (APPLE)
+-    set(DESIGNER_PATH "${TOOLS_PATH}/Designer.app")
+-else()
+-    set(DESIGNER_PATH "${TOOLS_PATH}/designer${EXE_EXT}")
+-endif()
+-
+-install(FILES "${UIC_PATH}"
+-        DESTINATION bin
+-        PERMISSIONS
+-        OWNER_EXECUTE OWNER_WRITE OWNER_READ
+-        GROUP_EXECUTE GROUP_READ
+-        WORLD_EXECUTE WORLD_READ)
+-
+-install(FILES "${RCC_PATH}"
+-        DESTINATION bin
+-        PERMISSIONS
+-        OWNER_EXECUTE OWNER_WRITE OWNER_READ
+-        GROUP_EXECUTE GROUP_READ
+-        WORLD_EXECUTE WORLD_READ)
+-
+-if (EXISTS ${DESIGNER_PATH})
+-    if (APPLE)
+-        install(DIRECTORY "${DESIGNER_PATH}"
+-                DESTINATION bin
+-                FILE_PERMISSIONS
+-                OWNER_EXECUTE OWNER_WRITE OWNER_READ
+-                GROUP_EXECUTE GROUP_READ
+-                WORLD_EXECUTE WORLD_READ)
+-    else()
+-        install(FILES "${DESIGNER_PATH}"
+-                DESTINATION bin
+-                PERMISSIONS
+-                OWNER_EXECUTE OWNER_WRITE OWNER_READ
+-                GROUP_EXECUTE GROUP_READ
+-                WORLD_EXECUTE WORLD_READ)
+-    endif()
+-endif()
+-
+ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake"
+                "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
+                IMMEDIATE @ONLY)
diff --git a/nixpkgs/pkgs/development/python-modules/pyside2/default.nix b/nixpkgs/pkgs/development/python-modules/pyside2/default.nix
new file mode 100644
index 000000000000..1d4cf2ce6038
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyside2/default.nix
@@ -0,0 +1,78 @@
+{ python
+, pythonAtLeast
+, disabledIf
+, fetchurl
+, lib
+, stdenv
+, cmake
+, libxcrypt
+, ninja
+, qt5
+, shiboken2
+}:
+stdenv.mkDerivation rec {
+  pname = "pyside2";
+  version = "5.15.11";
+
+  src = fetchurl {
+    url = "https://download.qt.io/official_releases/QtForPython/pyside2/PySide2-${version}-src/pyside-setup-opensource-src-${version}.tar.xz";
+    sha256 = "sha256-2lZ807eFTSegtK/j6J3osvmLem1XOTvlbx/BP3cPryk=";
+  };
+
+  patches = [
+    ./dont_ignore_optional_modules.patch
+  ];
+
+  postPatch = ''
+    cd sources/pyside2
+  '';
+
+  cmakeFlags = [
+    "-DBUILD_TESTS=OFF"
+    "-DPYTHON_EXECUTABLE=${python.interpreter}"
+  ];
+
+  env.NIX_CFLAGS_COMPILE = "-I${qt5.qtdeclarative.dev}/include/QtQuick/${qt5.qtdeclarative.version}/QtQuick";
+
+  nativeBuildInputs = [ cmake ninja qt5.qmake python ];
+
+  buildInputs = (with qt5; [
+    qtbase
+    qtxmlpatterns
+    qtmultimedia
+    qttools
+    qtx11extras
+    qtlocation
+    qtscript
+    qtwebsockets
+    qtwebengine
+    qtwebchannel
+    qtcharts
+    qtsensors
+    qtsvg
+    qt3d
+  ]) ++ (with python.pkgs; [
+    setuptools
+  ]) ++ (lib.optionals (python.pythonOlder "3.9") [
+    # see similar issue: 202262
+    # libxcrypt is required for crypt.h for building older python modules
+    libxcrypt
+  ]);
+
+  propagatedBuildInputs = [ shiboken2 ];
+
+  dontWrapQtApps = true;
+
+  postInstall = ''
+    cd ../../..
+    ${python.pythonOnBuildForHost.interpreter} setup.py egg_info --build-type=pyside2
+    cp -r PySide2.egg-info $out/${python.sitePackages}/
+  '';
+
+  meta = with lib; {
+    description = "LGPL-licensed Python bindings for Qt";
+    license = licenses.lgpl21;
+    homepage = "https://wiki.qt.io/Qt_for_Python";
+    maintainers = with maintainers; [ gebner ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyside2/dont_ignore_optional_modules.patch b/nixpkgs/pkgs/development/python-modules/pyside2/dont_ignore_optional_modules.patch
new file mode 100644
index 000000000000..c9f17bea71b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyside2/dont_ignore_optional_modules.patch
@@ -0,0 +1,11 @@
+--- pyside-setup-opensource-src-5.14.2/sources/cmake_helpers/helpers.cmake~	2020-07-17 10:29:30.555285529 +0200
++++ pyside-setup-opensource-src-5.14.2/sources/cmake_helpers/helpers.cmake	2020-07-17 10:29:49.817003683 +0200
+@@ -139,7 +139,7 @@
+     # If the module was found, and also the module path is the same as the
+     # Qt5Core base path, we will generate the list with the modules to be installed
+     set(looked_in_message ". Looked in: ${${_name_dir}}")
+-    if("${${_name_found}}" AND (("${found_basepath}" GREATER "0") OR ("${found_basepath}" EQUAL "0")))
++    if("${${_name_found}}")
+         message(STATUS "${module_state} module ${name} found (${ARGN})${looked_in_message}")
+         # record the shortnames for the tests
+         list(APPEND all_module_shortnames ${shortname})
diff --git a/nixpkgs/pkgs/development/python-modules/pyside6/default.nix b/nixpkgs/pkgs/development/python-modules/pyside6/default.nix
new file mode 100644
index 000000000000..5a484637768b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyside6/default.nix
@@ -0,0 +1,86 @@
+{ lib
+, stdenv
+, cmake
+, ninja
+, python
+, moveBuildTree
+, shiboken6
+}:
+
+stdenv.mkDerivation rec {
+  pname = "pyside6";
+
+  inherit (shiboken6) version src;
+
+  sourceRoot = "pyside-setup-everywhere-src-${lib.removeSuffix ".0" version}/sources/${pname}";
+
+  # FIXME: cmake/Macros/PySideModules.cmake supposes that all Qt frameworks on macOS
+  # reside in the same directory as QtCore.framework, which is not true for Nix.
+  postPatch = lib.optionalString stdenv.isLinux ''
+    # Don't ignore optional Qt modules
+    substituteInPlace cmake/PySideHelpers.cmake \
+      --replace \
+        'string(FIND "''${_module_dir}" "''${_core_abs_dir}" found_basepath)' \
+        'set (found_basepath 0)'
+  '';
+
+  nativeBuildInputs = [
+    cmake
+    ninja
+    python
+  ] ++ lib.optionals stdenv.isDarwin [
+    moveBuildTree
+  ];
+
+  buildInputs = with python.pkgs.qt6; [
+    # required
+    qtbase
+    python.pkgs.ninja
+    python.pkgs.packaging
+    python.pkgs.setuptools
+  ] ++ lib.optionals stdenv.isLinux [
+    # optional
+    qt3d
+    qtcharts
+    qtconnectivity
+    qtdatavis3d
+    qtdeclarative
+    qthttpserver
+    qtmultimedia
+    qtnetworkauth
+    qtquick3d
+    qtremoteobjects
+    qtscxml
+    qtsensors
+    qtspeech
+    qtsvg
+    qttools
+    qtwebchannel
+    qtwebengine
+    qtwebsockets
+  ];
+
+  propagatedBuildInputs = [
+    shiboken6
+  ];
+
+  cmakeFlags = [
+    "-DBUILD_TESTS=OFF"
+  ];
+
+  dontWrapQtApps = true;
+
+  postInstall = ''
+    cd ../../..
+    ${python.pythonOnBuildForHost.interpreter} setup.py egg_info --build-type=pyside6
+    cp -r PySide6.egg-info $out/${python.sitePackages}/
+  '';
+
+  meta = with lib; {
+    description = "Python bindings for Qt";
+    license = with licenses; [ lgpl3Only gpl2Only gpl3Only ];
+    homepage = "https://wiki.qt.io/Qt_for_Python";
+    maintainers = with maintainers; [ gebner Enzime ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysigma-backend-elasticsearch/default.nix b/nixpkgs/pkgs/development/python-modules/pysigma-backend-elasticsearch/default.nix
new file mode 100644
index 000000000000..e6b55788735a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysigma-backend-elasticsearch/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pysigma
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pysigma-backend-elasticsearch";
+  version = "1.0.9";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "SigmaHQ";
+    repo = "pySigma-backend-elasticsearch";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-OZaUKEEvgEIukEcAHB9ci/XWCU+h1CvQTU3gwWBOBkY=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=sigma --cov-report term --cov-report xml:cov.xml" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pysigma
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests
+  ];
+
+  pythonImportsCheck = [
+    "sigma.backends.elasticsearch"
+  ];
+
+  disabledTests = [
+    # Tests requires network access
+    "test_connect_lucene"
+  ];
+
+  meta = with lib; {
+    description = "Library to support Elasticsearch for pySigma";
+    homepage = "https://github.com/SigmaHQ/pySigma-backend-elasticsearch";
+    changelog = "https://github.com/SigmaHQ/pySigma-backend-elasticsearch/releases/tag/v${version}";
+    license = with licenses; [ lgpl21Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysigma-backend-insightidr/default.nix b/nixpkgs/pkgs/development/python-modules/pysigma-backend-insightidr/default.nix
new file mode 100644
index 000000000000..1fef60d8acf5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysigma-backend-insightidr/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pysigma
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "pysigma-backend-insightidr";
+  version = "0.2.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "SigmaHQ";
+    repo = "pySigma-backend-insightidr";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-B42MADteF0+GC/CPJPLaTGdGcQjC8KEsK9u3tBmtObg=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    pysigma
+  ];
+
+  pythonRelaxDeps = [
+    "pysigma"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sigma.backends.insight_idr"
+    "sigma.pipelines.insight_idr"
+  ];
+
+  meta = with lib; {
+    description = "Library to support the Rapid7 InsightIDR backend for pySigma";
+    homepage = "https://github.com/SigmaHQ/pySigma-backend-insightidr";
+    license = with licenses; [ lgpl21Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysigma-backend-opensearch/default.nix b/nixpkgs/pkgs/development/python-modules/pysigma-backend-opensearch/default.nix
new file mode 100644
index 000000000000..3fdfd2bfdd6d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysigma-backend-opensearch/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pysigma
+, pysigma-backend-elasticsearch
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pysigma-backend-opensearch";
+  version = "1.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "SigmaHQ";
+    repo = "pySigma-backend-opensearch";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-g3kGaNq07yMu3mnRDeZB3Ck8wwzK3HcOIzkl36cNOs8=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=sigma --cov-report term --cov-report xml:cov.xml" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pysigma
+    pysigma-backend-elasticsearch
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests
+  ];
+
+  pythonImportsCheck = [
+    "sigma.backends.opensearch"
+  ];
+
+  disabledTests = [
+    # Tests requires network access
+    "test_connect_lucene"
+  ];
+
+  meta = with lib; {
+    description = "Library to support OpenSearch for pySigma";
+    homepage = "https://github.com/SigmaHQ/pySigma-backend-opensearch";
+    changelog = "https://github.com/SigmaHQ/pySigma-backend-opensearch/releases/tag/v${version}";
+    license = with licenses; [ lgpl21Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysigma-backend-qradar/default.nix b/nixpkgs/pkgs/development/python-modules/pysigma-backend-qradar/default.nix
new file mode 100644
index 000000000000..7f4a467b3b02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysigma-backend-qradar/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pysigma
+, pysigma-pipeline-sysmon
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pysigma-backend-qradar";
+  version = "0.3.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "nNipsx-Sec";
+    repo = "pySigma-backend-qradar";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-VymaxX+iqrRlf+WEt4xqEvNt5kg8xI5O/MoYahayu0o=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pysigma
+  ];
+
+  nativeCheckInputs = [
+    pysigma-pipeline-sysmon
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'pysigma = "^0.7.2"' 'pysigma = "*"'
+  '';
+
+  pythonImportsCheck = [
+    "sigma.backends.qradar"
+  ];
+
+  meta = with lib; {
+    description = "Library to support Qradar for pySigma";
+    homepage = "https://github.com/nNipsx-Sec/pySigma-backend-qradar";
+    changelog = "https://github.com/nNipsx-Sec/pySigma-backend-qradar/releases/tag/v${version}";
+    license = with licenses; [ lgpl21Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysigma-backend-splunk/default.nix b/nixpkgs/pkgs/development/python-modules/pysigma-backend-splunk/default.nix
new file mode 100644
index 000000000000..bf939afd646c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysigma-backend-splunk/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pysigma
+, pysigma-pipeline-sysmon
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysigma-backend-splunk";
+  version = "1.0.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "SigmaHQ";
+    repo = "pySigma-backend-splunk";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ZDRHCzNLwBx8cugNVSkk7lZhE7MzariX0OS4pHv0f1s=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pysigma
+  ];
+
+  nativeCheckInputs = [
+    pysigma-pipeline-sysmon
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sigma.backends.splunk"
+  ];
+
+  meta = with lib; {
+    description = "Library to support Splunk for pySigma";
+    homepage = "https://github.com/SigmaHQ/pySigma-backend-splunk";
+    license = with licenses; [ lgpl21Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysigma-pipeline-crowdstrike/default.nix b/nixpkgs/pkgs/development/python-modules/pysigma-pipeline-crowdstrike/default.nix
new file mode 100644
index 000000000000..7b16c695e97f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysigma-pipeline-crowdstrike/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pysigma
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysigma-pipeline-crowdstrike";
+  version = "1.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "SigmaHQ";
+    repo = "pySigma-pipeline-crowdstrike";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-koXoBb3iyODQyjOmXSeEvVhYtrxpQtVb2HVqYBFkKrs=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pysigma
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sigma.pipelines.crowdstrike"
+  ];
+
+  meta = with lib; {
+    description = "Library to support CrowdStrike pipeline for pySigma";
+    homepage = "https://github.com/SigmaHQ/pySigma-pipeline-crowdstrike";
+    license = with licenses; [ lgpl21Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysigma-pipeline-sysmon/default.nix b/nixpkgs/pkgs/development/python-modules/pysigma-pipeline-sysmon/default.nix
new file mode 100644
index 000000000000..9b02a38cb18b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysigma-pipeline-sysmon/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pysigma
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysigma-pipeline-sysmon";
+  version = "1.0.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "SigmaHQ";
+    repo = "pySigma-pipeline-sysmon";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-5CDwevzD6R1nIcID6C5PV+i6pwY2CLakRC6NUXtmPs8=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pysigma
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sigma.pipelines.sysmon"
+  ];
+
+  meta = with lib; {
+    description = "Library to support Sysmon pipeline for pySigma";
+    homepage = "https://github.com/SigmaHQ/pySigma-pipeline-sysmon";
+    license = with licenses; [ lgpl21Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysigma-pipeline-windows/default.nix b/nixpkgs/pkgs/development/python-modules/pysigma-pipeline-windows/default.nix
new file mode 100644
index 000000000000..b6f47d9f4a44
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysigma-pipeline-windows/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pysigma
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysigma-pipeline-windows";
+  version = "1.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "SigmaHQ";
+    repo = "pySigma-pipeline-windows";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-279+nP5IeZiIjKNhJ2adbcJSDzcu7yqIB5JNFK5CPF0=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pysigma
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sigma.pipelines.windows"
+  ];
+
+  meta = with lib; {
+    description = "Library to support Windows service pipeline for pySigma";
+    homepage = "https://github.com/SigmaHQ/pySigma-pipeline-windows";
+    changelog = "https://github.com/SigmaHQ/pySigma-pipeline-windows/releases/tag/v${version}";
+    license = with licenses; [ lgpl21Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysigma/default.nix b/nixpkgs/pkgs/development/python-modules/pysigma/default.nix
new file mode 100644
index 000000000000..d80e23d269ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysigma/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, jinja2
+, packaging
+, poetry-core
+, pyparsing
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, pyyaml
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pysigma";
+  version = "0.10.9";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "SigmaHQ";
+    repo = "pySigma";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-zKV2yDLhoRTvlDZ/bwEyJhtE6hx1IAgKNI37J31nQo8=";
+  };
+
+  pythonRelaxDeps = [
+    "packaging"
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    jinja2
+    packaging
+    pyparsing
+    pyyaml
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests require network connection
+    "test_sigma_plugin_directory_default"
+    "test_sigma_plugin_installation"
+  ];
+
+  pythonImportsCheck = [
+    "sigma"
+  ];
+
+  meta = with lib; {
+    description = "Library to parse and convert Sigma rules into queries";
+    homepage = "https://github.com/SigmaHQ/pySigma";
+    changelog = "https://github.com/SigmaHQ/pySigma/releases/tag/v${version}";
+    license = with licenses; [ lgpl21Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysignalclirestapi/default.nix b/nixpkgs/pkgs/development/python-modules/pysignalclirestapi/default.nix
new file mode 100644
index 000000000000..0e033ad99ff8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysignalclirestapi/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, requests
+, future
+}:
+
+buildPythonPackage rec {
+  pname = "pysignalclirestapi";
+  version = "0.3.21";
+
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "bbernhard";
+    repo = "pysignalclirestapi";
+    rev = version;
+    hash = "sha256-CAZ6UgGz7ZDXlQlngi+hEhczOphvAT/Yl9vLqnrS1Qc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    future
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "pysignalclirestapi" ];
+
+  meta = with lib; {
+    description = "Small python library for the Signal Cli REST API";
+    homepage = "https://github.com/bbernhard/pysignalclirestapi";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysigset/default.nix b/nixpkgs/pkgs/development/python-modules/pysigset/default.nix
new file mode 100644
index 000000000000..43c8e81f5aa7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysigset/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "pysigset";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "13ef98b058489ff572b6667c38970a544699895c0844cb3ac2494e3a59ac51e6";
+  };
+
+  meta = with lib; {
+    description = "Provides access to sigprocmask(2) and friends and convenience wrappers to python application developers wanting to SIG_BLOCK and SIG_UNBLOCK signals";
+    homepage = "https://github.com/ossobv/pysigset";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ dzabraev ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysim/default.nix b/nixpkgs/pkgs/development/python-modules/pysim/default.nix
new file mode 100644
index 000000000000..37e7591c3778
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysim/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pytestCheckHook
+, pytest-asyncio
+, colorlog
+, smpp_pdu
+, pyscard
+, packaging
+, gsm0338
+, bidict
+, jsonpath-ng
+, termcolor
+, pyyaml
+, pycryptodomex
+, construct
+, pyserial
+, pytlv
+, cmd2
+}:
+
+buildPythonPackage {
+  pname = "pysim";
+  version = "unstable-2023-08-13";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "osmocom";
+    repo = "pysim";
+    rev = "09ff0e2b433b7143d5b40b4494744569b805e554";
+    hash = "sha256-7IwIovGR0GcS1bidSqoytmombK6NkLSVAfKB2teW2JU=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace 'smpp.pdu @ git+https://github.com/hologram-io/smpp.pdu' 'smpp.pdu'
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    bidict
+    cmd2
+    colorlog
+    construct
+    gsm0338
+    jsonpath-ng
+    packaging
+    pycryptodomex
+    pyscard
+    pyserial
+    pytlv
+    pyyaml
+    smpp_pdu
+    termcolor
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pySim" ];
+
+  meta = with lib; {
+    description = "A python tool to program SIMs / USIMs / ISIMs.";
+    homepage = "https://github.com/osmocom/pysim";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ flokli janik ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysimplegui/default.nix b/nixpkgs/pkgs/development/python-modules/pysimplegui/default.nix
new file mode 100644
index 000000000000..c5c71810a938
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysimplegui/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, tkinter
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysimplegui";
+  version = "4.60.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "PySimpleGUI";
+    inherit version;
+    hash = "sha256-MQFNHMXu8Tc9fpNWT/JgRmJkXMd0qTmx8BqiU+f514s=";
+  };
+
+  propagatedBuildInputs = [
+    tkinter
+  ];
+
+  pythonImportsCheck = [
+    "PySimpleGUI"
+  ];
+
+  meta = with lib; {
+    description = "Python GUIs for Humans";
+    homepage = "https://github.com/PySimpleGUI/PySimpleGUI";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ lucasew ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysimplesoap/default.nix b/nixpkgs/pkgs/development/python-modules/pysimplesoap/default.nix
new file mode 100644
index 000000000000..14bb929936de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysimplesoap/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, fetchDebianPatch
+, fetchPypi
+, buildPythonPackage
+, m2crypto
+, nix-update-script
+}:
+
+buildPythonPackage rec {
+  pname = "pysimplesoap";
+  version = "1.16.2";
+
+  passthru.updateScript = nix-update-script { };
+
+  src = fetchPypi {
+    pname = "PySimpleSOAP";
+    inherit version;
+    hash = "sha256-sbv00NCt/5tlIZfWGqG3ZzGtYYhJ4n0o/lyyUJFtZ+E=";
+  };
+
+  propagatedBuildInputs = [
+    m2crypto
+  ];
+
+  # Patches necessary for Python 3 compatibility plus bugfixes
+  patches = map (args: fetchDebianPatch ({
+    inherit pname version;
+    debianRevision = "5";
+  } // args)) [
+    # Merged upstream: f5f96210e1483f81cb5c582a6619e3ec4b473027
+    { patch = "Add-quotes-to-SOAPAction-header-in-SoapClient.patch";
+      hash = "sha256-xA8Wnrpr31H8wy3zHSNfezFNjUJt1HbSXn3qUMzeKc0="; }
+    # Merged upstream: ad03a21cafab982eed321553c4bfcda1755182eb
+    { patch = "fix-httplib2-version-check.patch";
+      hash = "sha256-zUeF3v0N/eMyRVRH3tQLfuUfMKOD/B/aqEwFh/7HxH4="; }
+    { patch = "reorder-type-check-to-avoid-a-TypeError.patch";
+      hash = "sha256-2p5Cqvh0SPfJ8B38wb/xq7jWGYgpI9pavA6qkMUb6hA="; }
+    # Merged upstream: 033e5899e131a2c1bdf7db5852f816f42aac9227
+    { patch = "Support-integer-values-in-maxOccurs-attribute.patch";
+      hash = "sha256-IZ0DP7io+ihcnB5547cR53FAdnpRLR6z4J5KsNrkfaI="; }
+    { patch = "PR204.patch";
+      hash = "sha256-JlxeTnKDFxvEMFBthZsaYRbNOoBvLJhBnXCRoiL/nVw="; }
+  ] ++ [ ./stringIO.patch ];
+
+  meta = with lib; {
+    description = "Python simple and lightweight SOAP Library";
+    homepage = "https://github.com/pysimplesoap/pysimplesoap";
+    license = licenses.lgpl3Plus;
+
+    # I don't directly use this, only needed it as a dependency of debianbts
+    #  so co-maintainers would be welcome.
+    maintainers = [ maintainers.nicoo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysimplesoap/stringIO.patch b/nixpkgs/pkgs/development/python-modules/pysimplesoap/stringIO.patch
new file mode 100644
index 000000000000..8ecad11b9a74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysimplesoap/stringIO.patch
@@ -0,0 +1,31 @@
+diff --git i/pysimplesoap/c14n.py w/pysimplesoap/c14n.py
+index 5749e49..297592e 100644
+--- i/pysimplesoap/c14n.py
++++ w/pysimplesoap/c14n.py
+@@ -55,11 +55,8 @@ except:
+     class XMLNS:
+         BASE = "http://www.w3.org/2000/xmlns/"
+         XML = "http://www.w3.org/XML/1998/namespace"
+-try:
+-    import cStringIO
+-    StringIO = cStringIO
+-except ImportError:
+-    import StringIO
++
++from io import StringIO
+ 
+ _attrs = lambda E: (E.attributes and E.attributes.values()) or []
+ _children = lambda E: E.childNodes or []
+diff --git i/pysimplesoap/xmlsec.py w/pysimplesoap/xmlsec.py
+index 2f96df7..053149f 100644
+--- i/pysimplesoap/xmlsec.py
++++ w/pysimplesoap/xmlsec.py
+@@ -15,7 +15,7 @@ from __future__ import print_function
+ import base64
+ import hashlib
+ import os
+-from cStringIO import StringIO
++from io import StringIO
+ from M2Crypto import BIO, EVP, RSA, X509, m2
+ 
+ # if lxml is not installed, use c14n.py native implementation
diff --git a/nixpkgs/pkgs/development/python-modules/pysingleton/default.nix b/nixpkgs/pkgs/development/python-modules/pysingleton/default.nix
new file mode 100644
index 000000000000..22e4ade4a882
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysingleton/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pysingleton";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5776e7a4ba0bab26709da604f4e648c5814385fef34010723db3da0d41b0dbcc";
+  };
+
+  pythonImportsCheck = [ "singleton" ];
+
+  # No tests in the Pypi package.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Provides a decorator to create thread-safe singleton classes";
+    homepage = "https://github.com/timofurrer/pysingleton";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kalbasit ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyskyqhub/default.nix b/nixpkgs/pkgs/development/python-modules/pyskyqhub/default.nix
new file mode 100644
index 000000000000..216e998a4902
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyskyqhub/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyskyqhub";
+  version = "0.1.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "RogerSelwyn";
+    repo = "skyq_hub";
+    rev = version;
+    hash = "sha256-yXqtABbsCh1yb96lsEA0gquikVenGLCo6J93AeXAC8k=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Tests require phyiscal hardware
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyskyqhub"
+  ];
+
+  meta = with lib; {
+    description = "Python module for accessing SkyQ Hub";
+    homepage = "https://github.com/RogerSelwyn/skyq_hub";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyskyqremote/default.nix b/nixpkgs/pkgs/development/python-modules/pyskyqremote/default.nix
new file mode 100644
index 000000000000..27be3381ae4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyskyqremote/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, requests
+, websocket-client
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "pyskyqremote";
+  version = "0.3.26";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "RogerSelwyn";
+    repo = "skyq_remote";
+    rev = "refs/tags/${version}";
+    hash = "sha256-aMgUwgKHgR+NQvRxiUV7GaXehjDIlJJJHwSmHDmzK08=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    websocket-client
+    xmltodict
+  ];
+
+  # Project has no tests, only a test script which looks like anusage example
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyskyqremote"
+  ];
+
+  meta = with lib; {
+    description = "Python module for accessing SkyQ boxes";
+    homepage = "https://github.com/RogerSelwyn/skyq_remote";
+    changelog = "https://github.com/RogerSelwyn/skyq_remote/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyslim/default.nix b/nixpkgs/pkgs/development/python-modules/pyslim/default.nix
new file mode 100644
index 000000000000..f21dc7b354e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyslim/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, pythonOlder
+, msprime
+, numpy
+, tskit
+}:
+
+buildPythonPackage rec {
+  pname = "pyslim";
+  version = "1.0.4";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-valAhPEVZNv/IYe85a88SGE+2/9O1omvBywz/HeeRco=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    msprime
+    tskit
+    numpy
+  ];
+
+  # Requires non-packaged software SLiM
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyslim"
+  ];
+
+  meta = with lib; {
+    description = "Tools for dealing with tree sequences coming to and from SLiM";
+    homepage = "https://github.com/tskit-dev/pyslim";
+    license = licenses.mit;
+    maintainers = with maintainers; [ alxsimon ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyslurm/default.nix b/nixpkgs/pkgs/development/python-modules/pyslurm/default.nix
new file mode 100644
index 000000000000..c960cfedfdde
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyslurm/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, pythonOlder
+, fetchFromGitHub
+, fetchpatch
+, buildPythonPackage
+, cython
+, slurm
+}:
+
+buildPythonPackage rec {
+  pname = "pyslurm";
+  version = "23.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    repo = "pyslurm";
+    owner = "PySlurm";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-M8seh5pkw2OTiDU4O96D0Lg3+FrlB2w4ehy53kSxyoU=";
+  };
+
+  patches = [ (fetchpatch {
+    name = "remove-undeclared-KILL_JOB_ARRAY";
+    url = "https://github.com/PySlurm/pyslurm/commit/f7a7d8beb8ceb4e4c1b248bab2ebb995dcae77e2.patch";
+    hash = "sha256-kQLGiGzAhqP8Z6pObz9vdTRdITd12w7KuUDXsfyLIU8=";
+  })];
+
+  buildInputs = [ cython slurm ];
+
+  setupPyBuildFlags = [ "--slurm-lib=${lib.getLib slurm}/lib" "--slurm-inc=${lib.getDev slurm}/include" ];
+
+  # Test cases need /etc/slurm/slurm.conf and require a working slurm installation
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/PySlurm/pyslurm";
+    description = "Python bindings to Slurm";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ bhipple ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysma/default.nix b/nixpkgs/pkgs/development/python-modules/pysma/default.nix
new file mode 100644
index 000000000000..973969e3d136
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysma/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, aiohttp
+, attrs
+, buildPythonPackage
+, fetchPypi
+, jmespath
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysma";
+  version = "0.7.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zlCGEcG5tmgEXhSMDLKj0/imT1iHBqlp1O1QhmPrJcA=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    attrs
+    jmespath
+  ];
+
+  # pypi does not contain tests and GitHub archive not available
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pysma"
+  ];
+
+  meta = with lib; {
+    description = "Python library for interacting with SMA Solar's WebConnect";
+    homepage = "https://github.com/kellerza/pysma";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysmappee/default.nix b/nixpkgs/pkgs/development/python-modules/pysmappee/default.nix
new file mode 100644
index 000000000000..ae9d5fa98304
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysmappee/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, cachetools
+, fetchFromGitHub
+, paho-mqtt
+, pythonOlder
+, pytz
+, requests
+, requests-oauthlib
+, schedule
+}:
+
+buildPythonPackage rec {
+  pname = "pysmappee";
+  version = "0.2.29";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "smappee";
+    repo = pname;
+    rev = version;
+    hash = "sha256-Ffi55FZsZUKDcS4qV46NpRK3VP6axzrL2BO+hYW7J9E=";
+  };
+
+  propagatedBuildInputs = [
+    cachetools
+    paho-mqtt
+    pytz
+    requests
+    requests-oauthlib
+    schedule
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pysmappee"
+  ];
+
+  meta = with lib; {
+    description = "Python Library for the Smappee dev API";
+    homepage = "https://github.com/smappee/pysmappee";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysmart/default.nix b/nixpkgs/pkgs/development/python-modules/pysmart/default.nix
new file mode 100644
index 000000000000..3edc3b57cc4d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysmart/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, chardet
+, humanfriendly
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, smartmontools
+}:
+
+buildPythonPackage rec {
+  pname = "pysmart";
+  version = "1.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "truenas";
+    repo = "py-SMART";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-1k+5XnIT/AfZmzKUxkyU/uc0eW05CvugpY6OdJCoALc=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  postPatch = ''
+    substituteInPlace pySMART/utils.py \
+      --replace "which('smartctl')" '"${smartmontools}/bin/smartctl"'
+  '';
+
+  propagatedBuildInputs = [
+    chardet
+    humanfriendly
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pySMART"
+  ];
+
+  meta = with lib; {
+    description = "Wrapper for smartctl (smartmontools)";
+    homepage = "https://github.com/truenas/py-SMART";
+    changelog = "https://github.com/truenas/py-SMART/blob/v${version}/CHANGELOG.md";
+    license = licenses.lgpl21Only;
+    maintainers = with maintainers; [ nyanloutre ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysmartapp/default.nix b/nixpkgs/pkgs/development/python-modules/pysmartapp/default.nix
new file mode 100644
index 000000000000..e404ef905de1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysmartapp/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpsig
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysmartapp";
+  version = "0.3.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "andrewsayre";
+    repo = pname;
+    rev = version;
+    hash = "sha256-RiRGOO5l5hcHllyDDGLtQHr51JOTZhAa/wK8BfMqmAY=";
+  };
+
+  propagatedBuildInputs = [
+    httpsig
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pysmartapp"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation to work with SmartApp lifecycle events";
+    homepage = "https://github.com/andrewsayre/pysmartapp";
+    changelog = "https://github.com/andrewsayre/pysmartapp/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysmartdl/default.nix b/nixpkgs/pkgs/development/python-modules/pysmartdl/default.nix
new file mode 100644
index 000000000000..b5c052bdfaa7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysmartdl/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pysmartdl";
+  version = "1.3.4";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "iTaybb";
+    repo = "pySmartDL";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Etyv3xCB1cGozWDsskygwcTHJfC+V5hvqBNQAF8SIMM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # touch the network
+    "test_basic_auth"
+    "test_custom_headers"
+    "test_download"
+    "test_hash"
+    "test_mirrors"
+    "test_pause_unpause"
+    "test_speed_limiting"
+    "test_stop"
+    "test_timeout"
+    "test_unicode"
+  ];
+
+  pythonImportsCheck = [
+    "pySmartDL"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/iTaybb/pySmartDL";
+    description = "A Smart Download Manager for Python";
+    changelog = "https://github.com/iTaybb/pySmartDL/blob/${src.rev}/ChangeLog.txt";
+    license = licenses.unlicense;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysmartthings/default.nix b/nixpkgs/pkgs/development/python-modules/pysmartthings/default.nix
new file mode 100644
index 000000000000..369cd6ecea6e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysmartthings/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysmartthings";
+  version = "0.7.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "andrewsayre";
+    repo = pname;
+    rev = version;
+    hash = "sha256-r+f2+vEXJdQGDlbs/MhraFgEmsAf32PU282blLRLjzc=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "aiohttp>=3.8.0,<4.0.0" "aiohttp<=4.0.0"
+  '';
+
+  pythonImportsCheck = [
+    "pysmartthings"
+  ];
+
+  meta = with lib; {
+    description = "Python library for interacting with the SmartThings cloud API";
+    homepage = "https://github.com/andrewsayre/pysmartthings";
+    changelog = "https://github.com/andrewsayre/pysmartthings/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysmb/default.nix b/nixpkgs/pkgs/development/python-modules/pysmb/default.nix
new file mode 100644
index 000000000000..67f468a508f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysmb/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyasn1
+, pythonOlder
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "pysmb";
+  version = "1.2.9.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "miketeo";
+    repo = "pysmb";
+    rev = "refs/tags/pysmb-${version}";
+    hash = "sha256-psV6fYymE6k2YqxOvFM2s7JTG51fI5pSqmkZnvfmprw=";
+  };
+
+  propagatedBuildInputs = [
+    pyasn1
+    tqdm
+  ];
+
+  # Tests require Network Connectivity and a server up and running
+  # https://github.com/miketeo/pysmb/blob/master/python3/tests/README_1st.txt
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "nmb"
+    "smb"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/miketeo/pysmb/releases/tag/pysmb-${version}";
+    description = "Experimental SMB/CIFS library written in Python to support file sharing between Windows and Linux machines";
+    homepage = "https://miketeo.net/wp/index.php/projects/pysmb";
+    license = licenses.zlib;
+    maintainers = with maintainers; [ kamadorueda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysmbc/default.nix b/nixpkgs/pkgs/development/python-modules/pysmbc/default.nix
new file mode 100644
index 000000000000..83465ab859a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysmbc/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, samba
+, pkg-config
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysmbc";
+  version = "1.0.25.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-IvFxXfglif2cxCU/6rOQtO8Lq/FPZFE82NB7N4mWMiY=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  buildInputs = [
+    samba
+  ];
+
+  # Tests would require a local SMB server
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "smbc"
+  ];
+
+  meta = with lib; {
+    description = "libsmbclient binding for Python";
+    homepage = "https://github.com/hamano/pysmbc";
+    license = with licenses; [ gpl2Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysmf/default.nix b/nixpkgs/pkgs/development/python-modules/pysmf/default.nix
new file mode 100644
index 000000000000..2fc1637d22a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysmf/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, pkg-config, libsmf, glib, pytest, cython }:
+
+buildPythonPackage rec {
+  pname = "pysmf";
+  version = "0.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "10i7vvvdx6c3gl4afsgnpdanwgzzag087zs0fxvfipnqknazj806";
+  };
+
+  postUnpack = ''
+    rm $sourceRoot/src/smf.c
+  '';
+
+  nativeBuildInputs = [ pkg-config pytest cython ];
+  buildInputs = [ libsmf glib ];
+
+  meta = with lib; {
+    homepage = "https://das.nasophon.de/pysmf/";
+    description = "Python extension module for reading and writing Standard MIDI Files, based on libsmf.";
+    license = licenses.bsd2;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysmi/default.nix b/nixpkgs/pkgs/development/python-modules/pysmi/default.nix
new file mode 100644
index 000000000000..7b96b97f0bb9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysmi/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ply
+}:
+
+buildPythonPackage rec {
+  version = "0.3.4";
+  pname = "pysmi";
+
+ src = fetchPypi {
+    inherit pname version;
+    sha256 = "bd15a15020aee8376cab5be264c26330824a8b8164ed0195bd402dd59e4e8f7c";
+  };
+
+  propagatedBuildInputs = [ ply ];
+
+  # Tests require pysnmp, which in turn requires pysmi => infinite recursion
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "http://pysmi.sf.net";
+    description = "SNMP SMI/MIB Parser";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ koral ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysml/default.nix b/nixpkgs/pkgs/development/python-modules/pysml/default.nix
new file mode 100644
index 000000000000..67dae25bdd02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysml/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, async-timeout
+, bitstring
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pyserial-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysml";
+  version = "0.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mtdcr";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-BtOx/kqPuvaaIyh/2/X5pW5BRvpsnMUMr1u6iZzbkt4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    async-timeout
+    bitstring
+    pyserial-asyncio
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sml"
+  ];
+
+  meta = with lib; {
+    description = "Python library for EDL21 smart meters using Smart Message Language (SML)";
+    homepage = "https://github.com/mtdcr/pysml";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysmt/default.nix b/nixpkgs/pkgs/development/python-modules/pysmt/default.nix
new file mode 100644
index 000000000000..6a08234312ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysmt/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysmt";
+  version = "0.9.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pysmt";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-cE+WmKzggYof/olxQb5M7xPsBONr39KdjOTG4ofYPUM=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pysmt"
+  ];
+
+  meta = with lib; {
+    description = "Python library for SMT formulae manipulation and solving";
+    homepage = "https://github.com/pysmt/pysmt";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysnmp-pyasn1/default.nix b/nixpkgs/pkgs/development/python-modules/pysnmp-pyasn1/default.nix
new file mode 100644
index 000000000000..d962615e7adb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysnmp-pyasn1/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pysnmp-pyasn1";
+  version = "1.1.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pysnmp";
+    repo = "pyasn1";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-W74aWMqGlat+aZfhbP1cTKRz7SomHdGwfK5yJwxgyqI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyasn1"
+  ];
+
+  meta = with lib; {
+    description = "Python ASN.1 encoder and decoder";
+    homepage = "https://github.com/pysnmp/pyasn1";
+    changelog = "https://github.com/pysnmp/pyasn1/releases/tag/v${version}";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysnmp-pysmi/default.nix b/nixpkgs/pkgs/development/python-modules/pysnmp-pysmi/default.nix
new file mode 100644
index 000000000000..1a9cab98915d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysnmp-pysmi/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, ply
+, poetry-core
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pysnmp-pysmi";
+  version = "1.1.10";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pysnmp";
+    repo = "pysmi";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ZfN0nU9IurBEjSZijC2E4UoLIM54mBFgv7rcI1v/a4Q=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    ply
+    requests
+  ];
+
+  # Circular dependency with pysnmplib
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pysmi"
+  ];
+
+  meta = with lib; {
+    description = "SNMP MIB parser";
+    homepage = "https://github.com/pysnmp/pysmi";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysnmp/default.nix b/nixpkgs/pkgs/development/python-modules/pysnmp/default.nix
new file mode 100644
index 000000000000..0b0e298d5d00
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysnmp/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyasn1
+, pycryptodomex
+, pysmi
+}:
+
+buildPythonPackage rec {
+  pname = "pysnmp";
+  version = "4.4.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1acbfvpbr45i137s00mbhh21p71ywjfw3r8z0ybcmjjqz7rbwg8c";
+  };
+
+  patches = [ ./setup.py-Fix-the-setuptools-version-check.patch ];
+
+  # NameError: name 'mibBuilder' is not defined
+  doCheck = false;
+
+  propagatedBuildInputs = [ pyasn1 pycryptodomex pysmi ];
+
+  meta = with lib; {
+    homepage = "http://snmplabs.com/pysnmp/index.html";
+    description = "A pure-Python SNMPv1/v2c/v3 library";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ primeos koral ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysnmp/setup.py-Fix-the-setuptools-version-check.patch b/nixpkgs/pkgs/development/python-modules/pysnmp/setup.py-Fix-the-setuptools-version-check.patch
new file mode 100644
index 000000000000..784ddd3f3427
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysnmp/setup.py-Fix-the-setuptools-version-check.patch
@@ -0,0 +1,27 @@
+From 5f843f7c8554e2feab7f57d8718231408196fd80 Mon Sep 17 00:00:00 2001
+From: Michael Weiss <dev.primeos@gmail.com>
+Date: Fri, 1 Nov 2019 18:47:14 +0100
+Subject: [PATCH] setup.py: Fix the setuptools version check
+
+This broke the Nix build after setuptools.__version__ changed from
+"41.2.0" to "41.4.0.post20191022".
+---
+ setup.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/setup.py b/setup.py
+index 0d987d5c..4f625d7c 100644
+--- a/setup.py
++++ b/setup.py
+@@ -63,7 +63,7 @@ try:
+ 
+     setup, Command = setuptools.setup, setuptools.Command
+ 
+-    observed_version = [int(x) for x in setuptools.__version__.split('.')]
++    observed_version = [int(x) for x in setuptools.__version__.split('.')[0:3]]
+     required_version = [36, 2, 0]
+ 
+     # NOTE(etingof): require fresh setuptools to build proper wheels
+-- 
+2.23.0
+
diff --git a/nixpkgs/pkgs/development/python-modules/pysnmplib/default.nix b/nixpkgs/pkgs/development/python-modules/pysnmplib/default.nix
new file mode 100644
index 000000000000..587bb4762716
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysnmplib/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pycryptodomex
+, pysnmp-pyasn1
+, pysnmp-pysmi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysnmplib";
+  version = "5.0.23";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pysnmp";
+    repo = "pysnmp";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-1h87fqaWMJN25SOD0xOkP3PFm1GPK99sT0o6ILCFVUI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pysnmp-pysmi
+    pysnmp-pyasn1
+    pycryptodomex
+  ];
+
+  # Module has no test, examples are used for testing
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pysnmp"
+  ];
+
+  meta = with lib; {
+    description = "Implementation of v1/v2c/v3 SNMP engine";
+    homepage = "https://github.com/pysnmp/pysnmp";
+    changelog = "https://github.com/pysnmp/pysnmp/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysnooper/default.nix b/nixpkgs/pkgs/development/python-modules/pysnooper/default.nix
new file mode 100644
index 000000000000..9cebc9d7bc7a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysnooper/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysnooper";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "PySnooper";
+    hash = "sha256-gQZp4WKiUKBm2GYuVzrbxa93DpN8W1V48ou3NV0chZs=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pysnooper"
+  ];
+
+  meta = with lib; {
+    description = "A poor man's debugger for Python";
+    homepage = "https://github.com/cool-RR/PySnooper";
+    license = licenses.mit;
+    maintainers = with maintainers; [ seqizz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysnooz/default.nix b/nixpkgs/pkgs/development/python-modules/pysnooz/default.nix
new file mode 100644
index 000000000000..4ff2513685f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysnooz/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, bleak
+, bleak-retry-connector
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, events
+, fetchFromGitHub
+, freezegun
+, home-assistant-bluetooth
+, poetry-core
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, transitions
+}:
+
+buildPythonPackage rec {
+  pname = "pysnooz";
+  version = "0.10.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "AustinBrunkhorst";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-jOXmaJprU35sdNRrBBx/YUyiDyyaE1qodWksXkTSEe0=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'transitions = "^0.8.11"' 'transitions = ">=0.8.11"' \
+      --replace 'Events = "^0.4"' 'Events = ">=0.4"' \
+      --replace " --cov=pysnooz --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bleak
+    bleak-retry-connector
+    bluetooth-sensor-state-data
+    events
+    home-assistant-bluetooth
+    transitions
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pysnooz"
+  ];
+
+  meta = with lib; {
+    description = "Library to control SNOOZ white noise machines";
+    homepage = "https://github.com/AustinBrunkhorst/pysnooz";
+    changelog = "https://github.com/AustinBrunkhorst/pysnooz/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysnow/default.nix b/nixpkgs/pkgs/development/python-modules/pysnow/default.nix
new file mode 100644
index 000000000000..52613d602d82
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysnow/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, brotli
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, httpretty
+, ijson
+, poetry-core
+, python-magic
+, pytz
+, pytestCheckHook
+, requests-oauthlib
+}:
+
+buildPythonPackage rec {
+  pname = "pysnow";
+  version = "0.7.16";
+  format = "pyproject";
+
+
+  src = fetchFromGitHub {
+    owner = "rbw";
+    repo = pname;
+    rev = version;
+    hash = "sha256-nKOPCkS2b3ObmBnk/7FTv4o4vwUX+tOtZI5OQQ4HSTY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    brotli
+    ijson
+    python-magic
+    pytz
+    requests-oauthlib
+  ];
+
+  nativeCheckInputs = [
+    httpretty
+    pytestCheckHook
+  ];
+
+  patches = [
+    # Switch to peotry-core, https://github.com/rbw/pysnow/pull/183
+    (fetchpatch {
+      name = "switch-to-poetry-core.patch";
+      url = "https://github.com/rbw/pysnow/commit/f214a203432b329df5317f3a25b2c0d9b55a9029.patch";
+      hash = "sha256-ViRR+9WStlaQwyrLGk/tMOUAcEMY+kB61ZEKGMQJ30o=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'ijson = "^2.5.1"' 'ijson = "*"' \
+      --replace 'pytz = "^2019.3"' 'pytz = "*"' \
+      --replace 'oauthlib = "^3.1.0"' 'oauthlib = "*"'
+  '';
+
+  pythonImportsCheck = [
+    "pysnow"
+  ];
+
+  meta = with lib; {
+    description = "ServiceNow HTTP client library written in Python";
+    homepage = "https://github.com/rbw/pysnow";
+    license = licenses.mit;
+    maintainers = with maintainers; [ almac ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysocks/default.nix b/nixpkgs/pkgs/development/python-modules/pysocks/default.nix
new file mode 100644
index 000000000000..70fb74ab4ddf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysocks/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pysocks";
+  version = "1.7.1";
+
+  src = fetchPypi {
+    pname = "PySocks";
+    inherit version;
+    sha256 = "184sg65mbmih6ljblfsxcmq5js5l7dj3gpn618w9q5dy3rbh921z";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "SOCKS module for Python";
+    license     = licenses.bsd3;
+    maintainers = with maintainers; [ thoughtpolice ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysol-cards/default.nix b/nixpkgs/pkgs/development/python-modules/pysol-cards/default.nix
new file mode 100644
index 000000000000..5759b47005b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysol-cards/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, six, random2 }:
+
+buildPythonPackage rec {
+  pname = "pysol-cards";
+  version = "0.14.3";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "pysol_cards";
+    hash = "sha256-sPv9OGFb/G/XVdq1hQWprhYtDaGGbCXKkUGTi1gj8GE=";
+  };
+
+  propagatedBuildInputs = [ six random2 ];
+
+  meta = with lib; {
+    description = "Generates Solitaire deals";
+    homepage = "https://github.com/shlomif/pysol_cards";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mwolfe ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysolcast/default.nix b/nixpkgs/pkgs/development/python-modules/pysolcast/default.nix
new file mode 100644
index 000000000000..f4121a53e794
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysolcast/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isodate
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, requests
+, responses
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "pysolcast";
+  version = "2.0.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "mcaulifn";
+    repo = "solcast";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-jLhM47o6LvkPux0kusOrRk4TDS6VLWE0QMEiQxlBCwo=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    isodate
+    pyyaml
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "pysolcast"
+  ];
+
+  meta = with lib; {
+    description = "Python library for interacting with the Solcast API";
+    homepage = "https://github.com/mcaulifn/solcast";
+    changelog = "https://github.com/mcaulifn/solcast/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysolr/default.nix b/nixpkgs/pkgs/development/python-modules/pysolr/default.nix
new file mode 100644
index 000000000000..1e2e3d5dbf6c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysolr/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, setuptools-scm, requests, mock }:
+
+buildPythonPackage rec {
+  pname = "pysolr";
+  version = "3.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1rj5jmscvxjwcmlfi6hmkj44l4x6n3ln5p7d8d18j566hzmmzw3f";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ requests ];
+
+  nativeCheckInputs = [ mock ];
+
+  doCheck = false; # requires network access
+
+  meta = with lib; {
+    description = "Lightweight Python wrapper for Apache Solr";
+    homepage = "https://github.com/toastdriven/pysolr/";
+    license = licenses.bsd3;
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/pysoma/default.nix b/nixpkgs/pkgs/development/python-modules/pysoma/default.nix
new file mode 100644
index 000000000000..ebb87a4612a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysoma/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysoma";
+  version = "0.0.13";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-1bS9zafuqxwcuqpM/AA3ZjNbFpxBNXtoHYFsQOWmLXQ=";
+  };
+
+  # Project has no test
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "api"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for the HTTP API provided by SOMA Connect";
+    homepage = "https://pypi.org/project/pysoma";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysonos/default.nix b/nixpkgs/pkgs/development/python-modules/pysonos/default.nix
new file mode 100644
index 000000000000..778b862ac2cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysonos/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, xmltodict
+, ifaddr
+, requests
+
+  # Test dependencies
+, pytestCheckHook
+, mock
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "pysonos";
+  version = "0.0.54";
+
+  disabled = !isPy3k;
+
+  # pypi package is missing test fixtures
+  src = fetchFromGitHub {
+    owner = "amelchio";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-gBOknYHL5nQWFVhCbLN0Ah+1fovcNY4P2myryZnUadk=";
+  };
+
+  propagatedBuildInputs = [
+    ifaddr
+    requests
+    xmltodict
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+    requests-mock
+  ];
+
+  disabledTests = [
+    "test_desc_from_uri" # test requires network access
+  ];
+
+  meta = with lib; {
+    description = "A SoCo fork with fixes for Home Assistant";
+    homepage = "https://github.com/amelchio/pysonos";
+    license = licenses.mit;
+    maintainers = with maintainers; [ juaningan ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyspark/default.nix b/nixpkgs/pkgs/development/python-modules/pyspark/default.nix
new file mode 100644
index 000000000000..b735601681db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyspark/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pandas
+, py4j
+, pyarrow
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyspark";
+  version = "3.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-1Bqbdr0qyjcKYQDQdcAp4iukTFlAknh36UNaOpxWZVg=";
+  };
+
+  # pypandoc is broken with pandoc2, so we just lose docs.
+  postPatch = ''
+    sed -i "s/'pypandoc'//" setup.py
+
+    substituteInPlace setup.py \
+      --replace py4j== 'py4j>='
+  '';
+
+  propagatedBuildInputs = [
+    py4j
+  ];
+
+  passthru.optional-dependencies = {
+    ml = [
+      numpy
+    ];
+    mllib = [
+      numpy
+    ];
+    sql = [
+      numpy
+      pandas
+      pyarrow
+    ];
+  };
+
+  # Tests assume running spark instance
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyspark"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for Apache Spark";
+    homepage = "https://github.com/apache/spark/tree/master/python";
+    sourceProvenance = with sourceTypes; [
+      fromSource
+      binaryBytecode
+    ];
+    license = licenses.asl20;
+    maintainers = with maintainers; [ shlevy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyspcwebgw/default.nix b/nixpkgs/pkgs/development/python-modules/pyspcwebgw/default.nix
new file mode 100644
index 000000000000..8ac514d7fa5c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyspcwebgw/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, aiohttp
+, aioresponses
+, asynccmd
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyspcwebgw";
+  version = "0.7.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "mbrrg";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-gdIrbr25GXaX26B1f7u0NKbqqnAC2tmMFZspzW6I4HI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    asynccmd
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=auto"
+  ];
+
+  pythonImportsCheck = [ "pyspcwebgw" ];
+
+  meta = with lib; {
+    description = "Python module for the SPC Web Gateway REST API";
+    homepage = "https://github.com/mbrrg/pyspcwebgw";
+    changelog = "https://github.com/pyspcwebgw/pyspcwebgw/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyspellchecker/default.nix b/nixpkgs/pkgs/development/python-modules/pyspellchecker/default.nix
new file mode 100644
index 000000000000..f4cc258d3ead
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyspellchecker/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyspellchecker";
+  version = "0.7.2";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "barrust";
+    repo = "pyspellchecker";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-DV2JxUKTCVJRRLmi+d5dMloCgpYwC5uyI1o34L26TxA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Pure python spell checking";
+    homepage = "https://github.com/barrust/pyspellchecker";
+    license = licenses.mit;
+    maintainers = with maintainers; [ zendo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyspf/default.nix b/nixpkgs/pkgs/development/python-modules/pyspf/default.nix
new file mode 100644
index 000000000000..74e264b9da09
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyspf/default.nix
@@ -0,0 +1,25 @@
+{ lib, python, buildPythonPackage, fetchFromGitHub, pydns }:
+
+buildPythonPackage rec {
+  pname = "pyspf";
+  version = "2.0.14";
+
+  src = fetchFromGitHub {
+    owner = "sdgathman";
+    repo = pname;
+    rev = "pyspf-${version}";
+    sha256 = "0bmimlmwrq9glnjc4i6pwch30n3y5wyqmkjfyayxqxkfrixqwydi";
+  };
+
+  propagatedBuildInputs = [ pydns ];
+
+  # requires /etc/resolv.conf to exist
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "http://bmsi.com/python/milter.html";
+    description = "Python API for Sendmail Milters (SPF)";
+    maintainers = with maintainers; [ abbradar ];
+    license = licenses.gpl2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyspice/default.nix b/nixpkgs/pkgs/development/python-modules/pyspice/default.nix
new file mode 100644
index 000000000000..0119c38099cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyspice/default.nix
@@ -0,0 +1,53 @@
+{ lib, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, libngspice
+, numpy
+, ply
+, scipy
+, pyyaml
+, cffi
+, requests
+, matplotlib
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "PySpice";
+  version = "1.5";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d28448accad98959e0f5932af8736e90a1f3f9ff965121c6881d24cdfca23d22";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+    requests
+    pyyaml
+    cffi
+    matplotlib
+    numpy
+    ply
+    scipy
+    libngspice
+  ];
+
+  doCheck = false;
+  pythonImportsCheck = [ "PySpice" ];
+
+  postPatch = ''
+    substituteInPlace PySpice/Spice/NgSpice/Shared.py --replace \
+        "ffi.dlopen(self.library_path)" \
+        "ffi.dlopen('${libngspice}/lib/libngspice${stdenv.hostPlatform.extensions.sharedLibrary}')"
+  '';
+
+  meta = with lib; {
+    description = "Simulate electronic circuit using Python and the Ngspice / Xyce simulators";
+    homepage = "https://github.com/FabriceSalvaire/PySpice";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ matthuszagh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyspiflash/default.nix b/nixpkgs/pkgs/development/python-modules/pyspiflash/default.nix
new file mode 100644
index 000000000000..fcab563b5ab3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyspiflash/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyftdi
+}:
+
+buildPythonPackage rec {
+  pname = "pyspiflash";
+  version = "0.6.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ifnw1qm4nssb03af93qw6vpa92rmyc2hisw9m4043pm9ryqcmpc";
+  };
+
+  propagatedBuildInputs = [
+    pyftdi
+  ];
+
+  # tests are not shipped with the PyPI source
+  doCheck = false;
+
+  pythonImportsCheck = [ "spiflash" ];
+
+  meta = with lib; {
+    description = "SPI data flash device drivers in Python";
+    homepage = "https://github.com/eblot/pyspiflash";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyspinel/default.nix b/nixpkgs/pkgs/development/python-modules/pyspinel/default.nix
new file mode 100644
index 000000000000..69c06b8876d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyspinel/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyspinel";
+  version = "unstable-2021-08-19";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "openthread";
+    repo = pname;
+    rev = "50d104e29eacd92d229f0b7179ec1067f5851c17";
+    sha256 = "0s2r00zb909cq3dd28i91qbl0nz8cga3g98z84gq5jqkjpiy8269";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+  ];
+
+  # Tests are out-dated
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "spinel"
+  ];
+
+  meta = with lib; {
+    description = "Interface to the OpenThread Network Co-Processor (NCP)";
+    homepage = "https://github.com/openthread/pyspinel";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ gebner ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyspnego/default.nix b/nixpkgs/pkgs/development/python-modules/pyspnego/default.nix
new file mode 100644
index 000000000000..910796165340
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyspnego/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, gssapi
+, krb5
+, ruamel-yaml
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, glibcLocales
+}:
+
+buildPythonPackage rec {
+  pname = "pyspnego";
+  version = "0.9.2";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jborean93";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-A0vVpEI8TKelZ96dIqSc01SX1gU3pDUVSOV6jap2WtU=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    gssapi
+    krb5
+    ruamel-yaml
+  ];
+
+  nativeCheckInputs = [
+    glibcLocales
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # struct.error: unpack requires a buffer of 1 bytes
+    "test_credssp_invalid_client_authentication"
+  ];
+
+  LC_ALL = "en_US.UTF-8";
+
+  pythonImportsCheck = [ "spnego" ];
+
+  meta = with lib; {
+    description = "Python SPNEGO authentication library";
+    homepage = "https://github.com/jborean93/pyspnego";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysptk/default.nix b/nixpkgs/pkgs/development/python-modules/pysptk/default.nix
new file mode 100644
index 000000000000..36d86db14450
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysptk/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cython
+, decorator
+, fetchPypi
+, numpy
+, pytestCheckHook
+, pythonOlder
+, scipy
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "pysptk";
+  version = "0.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QUgBA/bchWTaJ54u/ubcRfoVcDeV77wSnHOjkgfVauE=";
+  };
+
+  PYSPTK_BUILD_VERSION = 0;
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    decorator
+    numpy
+    scipy
+    six
+  ];
+
+  # Tests are not part of the PyPI releases
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pysptk"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Wrapper for Speech Signal Processing Toolkit (SPTK)";
+    homepage = "https://pysptk.readthedocs.io/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hyphon81 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyspx/default.nix b/nixpkgs/pkgs/development/python-modules/pyspx/default.nix
new file mode 100644
index 000000000000..b8e3cb49df6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyspx/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, cffi
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pyspx";
+  version = "0.5.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sphincs";
+    repo = "pyspx";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-hMZ7JZoo5RdUwQYpGjtZznH/O6rBUXv+svfOAI0cjqs=";
+    fetchSubmodules = true;
+  };
+
+  nativeBuildInputs = [
+    cffi
+    setuptools
+    wheel
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyspx"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for SPHINCS";
+    homepage = "https://github.com/sphincs/pyspx";
+    changelog = "https://github.com/sphincs/pyspx/releases/tag/v${version}";
+    license = licenses.cc0;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysqlcipher3/default.nix b/nixpkgs/pkgs/development/python-modules/pysqlcipher3/default.nix
new file mode 100644
index 000000000000..7441689895cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysqlcipher3/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder, sqlcipher }:
+
+buildPythonPackage rec {
+  pname = "pysqlcipher3";
+  version = "1.2.0";
+
+  disabled = pythonOlder "3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-PIAzgSZVlH6/KagJrFEGsrxpvgJ06szva1j0WAyNBsU=";
+  };
+
+  buildInputs = [ sqlcipher ];
+
+  pythonImportsCheck = [ "pysqlcipher3" ];
+
+  meta = with lib; {
+    description = "Python 3 bindings for SQLCipher";
+    homepage = "https://github.com/rigglemania/pysqlcipher3/";
+    license = licenses.zlib;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysqlitecipher/default.nix b/nixpkgs/pkgs/development/python-modules/pysqlitecipher/default.nix
new file mode 100644
index 000000000000..6eaa1d13eb7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysqlitecipher/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, cryptography
+, onetimepad
+}:
+
+buildPythonPackage rec {
+  pname = "pysqlitecipher";
+  version = "0.22";
+
+  disabled = pythonOlder "3.6";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "daff63ca2719fbd698aa10f64493c4b31fb67877a8e8dbb8090e9c03a1b1a9e4";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    onetimepad
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "pysqlitecipher" ];
+
+  meta = {
+    description = "Lightweight and easy to use sqlite wrapper with built-in encryption system";
+    homepage = "Ghttps://github.com/harshnative/pysqlitecipher";
+    license = lib.licenses.gpl3Only;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysqueezebox/default.nix b/nixpkgs/pkgs/development/python-modules/pysqueezebox/default.nix
new file mode 100644
index 000000000000..7c9425a9d02a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysqueezebox/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysqueezebox";
+  version = "0.7.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "rajlaud";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-WnL9Va3uaWlUHVBtit4v+XdYOFmPpxG91mAHEGwI+7c=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pysqueezebox"
+  ];
+
+  disabledTestPaths = [
+    # Tests require network access
+    "tests/test_integration.py"
+  ];
+
+  meta = with lib; {
+    description = "Asynchronous library to control Logitech Media Server";
+    homepage = "https://github.com/rajlaud/pysqueezebox";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ nyanloutre ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysrim/default.nix b/nixpkgs/pkgs/development/python-modules/pysrim/default.nix
new file mode 100644
index 000000000000..d00c430e3cc5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysrim/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pythonOlder
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "pysrim";
+  version = "0.5.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-raCI9z9+GjvwhSBugeD4PticHQsjp4ns0LoKJQckrug=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner', " ""
+  '';
+
+  propagatedBuildInputs = [
+    numpy
+    pyyaml
+  ];
+
+  # Tests require git lfs download of repository
+  doCheck = false;
+
+  # pythonImportsCheck does not work
+  # TypeError: load() missing 1 required positional argument: 'Loader'
+
+  meta = with lib; {
+    description = "Srim Automation of Tasks via Python";
+    homepage = "https://gitlab.com/costrouc/pysrim";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysrt/default.nix b/nixpkgs/pkgs/development/python-modules/pysrt/default.nix
new file mode 100644
index 000000000000..ff48960f815b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysrt/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, chardet
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "pysrt";
+  version = "1.1.2";
+
+  src = fetchFromGitHub {
+    owner = "byroot";
+    repo = "pysrt";
+    rev = "v${version}";
+    sha256 = "1f5hxyzlh5mdvvi52qapys9qcinffr6ghgivb6k4jxa92cbs3mfg";
+  };
+
+  nativeCheckInputs = [ nose ];
+  checkPhase = ''
+    nosetests -v
+  '';
+
+  propagatedBuildInputs = [ chardet ];
+
+  meta = with lib; {
+    homepage = "https://github.com/byroot/pysrt";
+    license = licenses.gpl3;
+    description = "Python library used to edit or create SubRip files";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyssim/default.nix b/nixpkgs/pkgs/development/python-modules/pyssim/default.nix
new file mode 100644
index 000000000000..b69bf47c96d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyssim/default.nix
@@ -0,0 +1,44 @@
+{ lib, buildPythonPackage, fetchFromGitHub, numpy, scipy, pillow, fetchpatch }:
+
+buildPythonPackage rec {
+  pname = "pyssim";
+  version = "0.6";
+
+  propagatedBuildInputs = [ numpy scipy pillow ];
+
+  # PyPI tarball doesn't contain test images so let's use GitHub
+  src = fetchFromGitHub {
+    owner = "jterrace";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-VvxQTvDTDms6Ccyclbf9P0HEQksl5atPPzHuH8yXTmc=";
+  };
+
+  patches = [
+    # "Replace Image.ANTIALIAS with Image.LANCZOS"
+    # Image.ANTIALIAS has been removed in Pillow 10.0.0,
+    # the version currently in nixpkgs,
+    # and Image.LANCZOS is a drop-in since Pillow 2.7.0.
+    # https://github.com/jterrace/pyssim/pull/45
+    (fetchpatch {
+      url = "https://github.com/jterrace/pyssim/commit/db4296c12ca9c027eb9cd61b52195a78dfcc6711.patch";
+      hash = "sha256-wNp47EFtjXv6jIFX25IErXg83ksmGRNFKNeMFS+tP6s=";
+    })
+  ];
+
+  # Tests are copied from .travis.yml
+  checkPhase = ''
+    $out/bin/pyssim test-images/test1-1.png test-images/test1-1.png | grep 1
+    $out/bin/pyssim test-images/test1-1.png test-images/test1-2.png | grep 0.998
+    $out/bin/pyssim test-images/test1-1.png "test-images/*" | grep -E " 1| 0.998| 0.672| 0.648" | wc -l | grep 4
+    $out/bin/pyssim --cw --width 128 --height 128 test-images/test1-1.png test-images/test1-1.png | grep 1
+    $out/bin/pyssim --cw --width 128 --height 128 test-images/test3-orig.jpg test-images/test3-rot.jpg | grep 0.938
+  '';
+
+  meta = with lib; {
+    description = "Module for computing Structured Similarity Image Metric (SSIM) in Python";
+    homepage = "https://github.com/jterrace/pyssim";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pystache/default.nix b/nixpkgs/pkgs/development/python-modules/pystache/default.nix
new file mode 100644
index 000000000000..5cb51640b51d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pystache/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, unittestCheckHook
+, fetchPypi
+, pythonOlder
+, glibcLocales
+}:
+
+buildPythonPackage rec {
+  pname = "pystache";
+  version = "0.6.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-nyONWgbxiEPg1JHY5OKS3AP+1qVMsKXDS+N6P6qXMXQ=";
+  };
+
+  LC_ALL = "en_US.UTF-8";
+
+  buildInputs = [
+    glibcLocales
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pystache"
+  ];
+
+  meta = with lib; {
+    description = "A framework-agnostic, logic-free templating system inspired by ctemplate and et";
+    homepage = "https://github.com/defunkt/pystache";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pystardict/default.nix b/nixpkgs/pkgs/development/python-modules/pystardict/default.nix
new file mode 100644
index 000000000000..4e5cbd64e4b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pystardict/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pystardict";
+  version = "0.8";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "lig";
+    repo = "pystardict";
+    rev = version;
+    hash = "sha256-YrZpIhyxfA3G7rP0SJ+EvzGwAXlne80AYilkj6cIDnA=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  propagatedBuildInputs = [ six ];
+
+  nativeBuildInputs = [ setuptools setuptools-scm ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "pystardict" ];
+
+  meta = with lib; {
+    description =
+      "Library for manipulating StarDict dictionaries from within Python";
+    homepage = "https://github.com/lig/pystardict";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ thornycrackers ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pystemd/default.nix b/nixpkgs/pkgs/development/python-modules/pystemd/default.nix
new file mode 100644
index 000000000000..ff4c6f669223
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pystemd/default.nix
@@ -0,0 +1,41 @@
+{ stdenv
+, buildPythonPackage
+, lib
+, python
+, fetchPypi
+, systemd
+, lxml
+, psutil
+, pytest
+, mock
+, pkg-config }:
+
+buildPythonPackage rec {
+  pname = "pystemd";
+  version = "0.13.2";
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Tc+ksTpVaFxJ09F8EGMeyhjDN3D2Yxb47yM3uJUcwUQ=";
+  };
+
+  disabled = python.pythonOlder "3.4";
+
+  buildInputs = [ systemd ];
+
+  nativeBuildInputs = [ pkg-config ];
+
+  nativeCheckInputs = [ lxml mock psutil pytest ];
+
+  checkPhase = "pytest tests";
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64);
+    description = ''
+      Thin Cython-based wrapper on top of libsystemd, focused on exposing the
+      dbus API via sd-bus in an automated and easy to consume way
+    '';
+    homepage = "https://github.com/facebookincubator/pystemd/";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ flokli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pystemmer/default.nix b/nixpkgs/pkgs/development/python-modules/pystemmer/default.nix
new file mode 100644
index 000000000000..0df510e0b55d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pystemmer/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, python
+, fetchPypi
+, fetchFromGitHub
+, fetchpatch
+, buildPythonPackage
+, cython
+, libstemmer
+ }:
+
+buildPythonPackage rec {
+  pname = "pystemmer";
+  version = "2.2.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "snowballstem";
+    repo = "pystemmer";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-bJVFeO7XP+aZ2nowQiuws5ziL/FmS1eaOllW6QxA70U=";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  patches = [
+    (fetchpatch {
+      # Allow building with system libstemmer
+      url = "https://github.com/snowballstem/pystemmer/commit/2f52b4b2ff113fe6c33cebe14ed4fd4388bb1742.patch";
+      hash = "sha256-JqR/DUmABgWaq23CNjoKSasL0mNhM2QuU986mouK6A8=";
+    })
+    (fetchpatch {
+      # Fix doctests
+      url = "https://github.com/snowballstem/pystemmer/commit/b2826f19fe8ba65238b5f3b4cee7096a698f048e.patch";
+      hash = "sha256-VTZydjYaJJ/KoHD4KbON36kZnkuAyO51H0Oeg6VXTqg=";
+    })
+  ];
+
+  postConfigure = ''
+    export PYSTEMMER_SYSTEM_LIBSTEMMER="${lib.getDev libstemmer}/include"
+  '';
+
+  env.NIX_CFLAGS_COMPILE = toString [
+    "-I${lib.getDev libstemmer}/include"
+  ];
+
+  NIX_CFLAGS_LINK = [
+    "-L${libstemmer}/lib"
+  ];
+
+  pythonImportsCheck = [
+    "Stemmer"
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} runtests.py
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Snowball stemming algorithms, for information retrieval";
+    homepage = "http://snowball.tartarus.org/";
+    license = licenses.mit;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pystray/default.nix b/nixpkgs/pkgs/development/python-modules/pystray/default.nix
new file mode 100644
index 000000000000..a6d073dbd669
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pystray/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pillow
+, xlib
+, six
+, xvfb-run
+, setuptools
+, gobject-introspection
+, pygobject3
+, gtk3
+, libayatana-appindicator
+}:
+
+buildPythonPackage rec {
+  pname = "pystray";
+  version = "0.19.2";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "moses-palmer";
+    repo = "pystray";
+    rev = "v${version}";
+    hash = "sha256-8B178MSe4ujlnGBmQhIu+BoAh1doP9V5cL0ermLQTvs=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'sphinx >=1.3.1'" ""
+  '';
+
+  nativeBuildInputs = [
+    gobject-introspection
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pillow
+    xlib
+    six
+    pygobject3
+    gtk3
+    libayatana-appindicator
+  ];
+
+  nativeCheckInputs = [
+    xvfb-run
+  ];
+
+  checkPhase = ''
+    rm tests/icon_tests.py # test needs user input
+
+    xvfb-run -s '-screen 0 800x600x24' python setup.py test
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/moses-palmer/pystray";
+    description = "This library allows you to create a system tray icon";
+    license = with licenses; [ gpl3Plus lgpl3Plus ];
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ jojosch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysubs2/default.nix b/nixpkgs/pkgs/development/python-modules/pysubs2/default.nix
new file mode 100644
index 000000000000..3ae2de440750
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysubs2/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pysubs2";
+  version = "1.6.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "tkarabela";
+    repo = pname;
+    rev =  version;
+    hash = "sha256-0bW9aB6ERRQK3psqeU0Siyi/8drEGisAp8UtTfOKlp0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pysubs2"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/tkarabela/pysubs2";
+    description = "A Python library for editing subtitle files";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Benjamin-L ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysuez/default.nix b/nixpkgs/pkgs/development/python-modules/pysuez/default.nix
new file mode 100644
index 000000000000..34f6de519266
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysuez/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysuez";
+  version = "0.2.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ooii";
+    repo = "pySuez";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Xgd0E/oFO2yyytBjuwr1vDJfKWC0Iw8P6GStCuCni/g=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pysuez"
+  ];
+
+  meta = with lib; {
+    description = "Module to get water consumption data from Suez";
+    homepage = "https://github.com/ooii/pySuez";
+    changelog = "https://github.com/ooii/pySuez/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysvg-py3/default.nix b/nixpkgs/pkgs/development/python-modules/pysvg-py3/default.nix
new file mode 100644
index 000000000000..6f9ba796132e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysvg-py3/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "pysvg-py3";
+  version = "0.2.2-post3";
+
+  src = fetchFromGitHub {
+    owner = "alorence";
+    repo = pname;
+    rev = version;
+    sha256 = "1slync0knpcjgl4xpym8w4249iy6vmrwbarpnbjzn9xca8g1h2f0";
+  };
+
+  checkPhase = ''
+    runHook preCheck
+    mkdir testoutput
+    ${python.interpreter} sample/tutorial.py
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "pysvg" ];
+
+  meta = {
+    homepage = "https://github.com/alorence/pysvg-py3";
+    description = "Creating SVG with Python";
+    license = lib.licenses.bsd2;
+    maintainers = with lib.maintainers; [ davidak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysvn/default.nix b/nixpkgs/pkgs/development/python-modules/pysvn/default.nix
new file mode 100644
index 000000000000..92d76cb06dcd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysvn/default.nix
@@ -0,0 +1,85 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchurl
+, isPy3k
+, python
+, apr
+, aprutil
+, bash
+, e2fsprogs
+, expat
+, gcc
+, glibcLocales
+, neon
+, openssl
+, pycxx
+, subversion
+}:
+
+buildPythonPackage rec {
+  pname = "pysvn";
+  version = "1.9.20";
+  format = "other";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/project/pysvn/pysvn/V${version}/pysvn-${version}.tar.gz";
+    hash = "sha256-LbAz+KjEY3nkSJAzJNwlnSRYoWr4i1ITRUPV3ZBH7cc=";
+  };
+
+  patches = [
+    ./replace-python-first.patch
+  ];
+
+  buildInputs = [ bash subversion apr aprutil expat neon openssl ]
+    ++ lib.optionals stdenv.isLinux [ e2fsprogs ]
+    ++ lib.optionals stdenv.isDarwin [ gcc ];
+
+  preConfigure = ''
+    cd Source
+    ${python.pythonOnBuildForHost.interpreter} setup.py backport
+    ${python.pythonOnBuildForHost.interpreter} setup.py configure \
+      --apr-inc-dir=${apr.dev}/include \
+      --apu-inc-dir=${aprutil.dev}/include \
+      --pycxx-dir=${pycxx.dev}/include \
+      --svn-inc-dir=${subversion.dev}/include/subversion-1 \
+      --pycxx-src-dir=${pycxx.dev}/src \
+      --apr-lib-dir=${apr.out}/lib \
+      --svn-lib-dir=${subversion.out}/lib \
+      --svn-bin-dir=${subversion.out}/bin
+  '';
+
+  nativeCheckInputs = [ glibcLocales ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    # It is not only shebangs, some tests also write scripts dynamically
+    # so it is easier to simply search and replace
+    sed -i "s|/bin/bash|${bash}/bin/bash|" ../Tests/test-*.sh
+    make -C ../Tests
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "pysvn" ];
+
+  installPhase = ''
+    dest=$(toPythonPath $out)/pysvn
+    mkdir -p $dest
+    cp pysvn/__init__.py $dest/
+    cp pysvn/_pysvn*.so $dest/
+    mkdir -p $out/share/doc
+    mv -v ../Docs $out/share/doc/pysvn-${version}
+    rm -v $out/share/doc/pysvn-${version}/generate_cpp_docs_from_html_docs.py
+  '';
+
+  meta = with lib; {
+    description = "Python bindings for Subversion";
+    homepage = "https://pysvn.sourceforge.io/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+    # g++: command not found
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysvn/replace-python-first.patch b/nixpkgs/pkgs/development/python-modules/pysvn/replace-python-first.patch
new file mode 100644
index 000000000000..9ec4ce826e3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysvn/replace-python-first.patch
@@ -0,0 +1,13 @@
+Index: Extension/Tests/benchmark_diff.py
+===================================================================
+--- Extension/Tests/benchmark_diff.py	(revision 2093)
++++ Extension/Tests/benchmark_diff.py	(working copy)
+@@ -115,7 +115,7 @@
+ 
+         if self.python:
+             python_re = LiteralCaseBlindSearch( self.python )
+-            self.replacement_list.append(
++            self.replacement_list.insert(0,
+                  (python_re,            '<PYTHON>') )
+ 
+         if self.svn_bin:
diff --git a/nixpkgs/pkgs/development/python-modules/pyswitchbee/default.nix b/nixpkgs/pkgs/development/python-modules/pyswitchbee/default.nix
new file mode 100644
index 000000000000..9fb94a5a0597
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyswitchbee/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, awesomeversion
+, buildPythonPackage
+, aiohttp
+, fetchFromGitHub
+, setuptools
+, pythonOlder
+, packaging
+}:
+
+buildPythonPackage rec {
+  pname = "pyswitchbee";
+  version = "1.8.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "jafar-atili";
+    repo = "pySwitchbee";
+    rev = "refs/tags/${version}";
+    hash = "sha256-bMxWrapFX689yvC6+9NUunEtTe79+QNauFa1ZjG9ON4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    awesomeversion
+    packaging
+  ];
+
+  # Module doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "switchbee"
+  ];
+
+  meta = with lib; {
+    description = "Library to control SwitchBee smart home device";
+    homepage = "https://github.com/jafar-atili/pySwitchbee/";
+    changelog = "https://github.com/jafar-atili/pySwitchbee/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyswitchbot/default.nix b/nixpkgs/pkgs/development/python-modules/pyswitchbot/default.nix
new file mode 100644
index 000000000000..5a99cbb62ee7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyswitchbot/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, async-timeout
+, bleak
+, bleak-retry-connector
+, boto3
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pyopenssl
+, pythonOlder
+, pytestCheckHook
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyswitchbot";
+  version = "0.41.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "pySwitchbot";
+    rev = "refs/tags/${version}";
+    hash = "sha256-n4hTS3LnS8AOr1VNSqcVYul/qiTiLvI2bsOJJLbKA3E=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+    bleak
+    bleak-retry-connector
+    boto3
+    cryptography
+    pyopenssl
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # mismatch in expected data structure
+    "test_parse_advertisement_data_curtain"
+  ];
+
+  pythonImportsCheck = [
+    "switchbot"
+  ];
+
+  meta = with lib; {
+    description = "Python library to control Switchbot IoT devices";
+    homepage = "https://github.com/Danielhiversen/pySwitchbot";
+    changelog = "https://github.com/Danielhiversen/pySwitchbot/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysychonaut/default.nix b/nixpkgs/pkgs/development/python-modules/pysychonaut/default.nix
new file mode 100644
index 000000000000..ae05070e76d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysychonaut/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, requests, requests-cache, beautifulsoup4 }:
+
+buildPythonPackage rec {
+  pname = "PySychonaut";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1wgk445gmi0x7xmd8qvnyxy1ka0n72fr6nrhzdm29q6687dqyi7h";
+  };
+
+  preConfigure = ''
+    substituteInPlace setup.py --replace "bs4" "beautifulsoup4"
+  '';
+
+  propagatedBuildInputs = [ requests requests-cache beautifulsoup4 ];
+
+  # No tests available
+  doCheck = false;
+  pythonImportsCheck = [ "pysychonaut" ];
+
+  meta = with lib; {
+    description = "Unofficial python api for Erowid, PsychonautWiki and AskTheCaterpillar";
+    homepage = "https://github.com/OpenJarbas/PySychonaut";
+    maintainers = [ maintainers.ivar ];
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysyncobj/default.nix b/nixpkgs/pkgs/development/python-modules/pysyncobj/default.nix
new file mode 100644
index 000000000000..d5623fff6313
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysyncobj/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pysyncobj";
+  version = "0.3.12";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bakwc";
+    repo = "PySyncObj";
+    rev = "refs/tags/${version}";
+    hash = "sha256-ZWzvvv13g/iypm+MIl5q0Y8ekqzZEY5upSTPk3MFTPI=";
+  };
+
+  # Tests require network features
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pysyncobj"
+  ];
+
+  meta = with lib; {
+    description = "Python library for replicating your class";
+    homepage = "https://github.com/bakwc/PySyncObj";
+    changelog = "https://github.com/bakwc/PySyncObj/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pysyncthru/default.nix b/nixpkgs/pkgs/development/python-modules/pysyncthru/default.nix
new file mode 100644
index 000000000000..d5761bebee7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pysyncthru/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, isPy27
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, demjson3
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "pysyncthru";
+  version = "0.7.10";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "nielstron";
+    repo = "pysyncthru";
+    rev = "release-${version}";
+    sha256 = "1c29w2ldrnq0vxr9cfa2pjhwdvrpw393c84khgg2y56jrkbidq53";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    demjson3
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest
+  '';
+
+  pythonImportsCheck = [ "pysyncthru" ];
+
+  meta = with lib; {
+    description = "Automated JSON API based communication with Samsung SyncThru Web Service";
+    homepage = "https://github.com/nielstron/pysyncthru";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytabix/default.nix b/nixpkgs/pkgs/development/python-modules/pytabix/default.nix
new file mode 100644
index 000000000000..fb2e622eac9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytabix/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, fetchPypi
+, zlib
+}:
+
+buildPythonPackage rec {
+  pname = "pytabix";
+  version = "0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ldp5r4ggskji6qx4bp2qxy2vrvb3fam03ksn0gq2hdxgrlg2x07";
+  };
+
+  buildInputs = [ zlib ];
+
+  doCheck = !isPy3k;
+  preCheck = ''
+    substituteInPlace test/test.py \
+      --replace 'test_remote_file' 'dont_test_remote_file'
+  '';
+  pythonImportsCheck = [ "tabix" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/slowkow/pytabix";
+    description = "Python interface for tabix";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ris ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytablewriter/default.nix b/nixpkgs/pkgs/development/python-modules/pytablewriter/default.nix
new file mode 100644
index 000000000000..8b37c75e9c24
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytablewriter/default.nix
@@ -0,0 +1,130 @@
+{ lib
+, buildPythonPackage
+, dataproperty
+, dominate
+, elasticsearch
+, fetchFromGitHub
+, loguru
+, mbstrdecoder
+, pandas
+, pathvalidate
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, setuptools
+, simplejson
+, tabledata
+, tcolorpy
+, toml
+, typepy
+, xlsxwriter
+, xlwt
+}:
+
+buildPythonPackage rec {
+  pname = "pytablewriter";
+  version = "1.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "thombashi";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-b3YzDqNATaT/FFG4/x9EGlYlhXKPvgNB2xnm0bzvLJQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    dataproperty
+    mbstrdecoder
+    pathvalidate
+    tabledata
+    tcolorpy
+    typepy
+  ];
+
+  passthru.optional-dependencies = {
+    all = [
+      dominate
+      elasticsearch
+      loguru
+      pandas
+      # pytablereader
+      pyyaml
+      simplejson
+      toml
+      xlsxwriter
+      xlwt
+    ];
+    es = [
+      elasticsearch
+    ];
+    es8 = [
+      elasticsearch
+    ];
+    excel = [
+      xlwt
+      xlsxwriter
+    ];
+    html = [
+      dominate
+    ];
+    logging = [
+      loguru
+    ];
+    # from = [
+    #   pytablereader
+    # ];
+    pandas = [
+      pandas
+    ];
+    # sqlite = [
+    #   simplesqlite
+    # ];
+    # theme = [
+    #   pytablewriter-altrow-theme
+    # ];
+    toml = [
+      toml
+    ];
+    yaml = [
+      pyyaml
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "pathvalidate"
+  ];
+
+  disabledTests = [
+    # Circular dependency
+    "test_normal_from_file"
+    "test_normal_from_text"
+    "test_normal_clear_theme"
+    # Test compares CLI output
+    "test_normal"
+  ];
+
+  disabledTestPaths = [
+    "test/writer/binary/test_excel_writer.py"
+    "test/writer/binary/test_sqlite_writer.py"
+    "test/writer/test_elasticsearch_writer.py"
+  ];
+
+  meta = with lib; {
+    description = "A library to write a table in various formats";
+    homepage = "https://github.com/thombashi/pytablewriter";
+    changelog = "https://github.com/thombashi/pytablewriter/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ genericnerdyusername ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytado/default.nix b/nixpkgs/pkgs/development/python-modules/pytado/default.nix
new file mode 100644
index 000000000000..8575fceadc4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytado/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytado";
+  version = "0.17.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "wmalgadey";
+    repo = "PyTado";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-w1qtSEpnZCs7+M/0Gywz9AeMxUzz2csHKm9SxBKzmz4=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "PyTado"
+  ];
+
+  meta = with lib; {
+    description = "Python binding for Tado web API";
+    homepage = "https://github.com/wmalgadey/PyTado";
+    changelog = "https://github.com/wmalgadey/PyTado/releases/tag/${version}";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytaglib/default.nix b/nixpkgs/pkgs/development/python-modules/pytaglib/default.nix
new file mode 100644
index 000000000000..a3fd95133a66
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytaglib/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, taglib
+, cython
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytaglib";
+  version = "2.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "supermihi";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-b3ODsG5rdSJ1Tq/0DARf99gHgWWGaArBFAjqeK3mvsY=";
+  };
+
+  buildInputs = [
+    cython
+    taglib
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "taglib"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for the Taglib audio metadata library";
+    homepage = "https://github.com/supermihi/pytaglib";
+    changelog = "https://github.com/supermihi/pytaglib/blob/v${version}/CHANGELOG.md";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ mrkkrp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytankerkoenig/default.nix b/nixpkgs/pkgs/development/python-modules/pytankerkoenig/default.nix
new file mode 100644
index 000000000000..0a6403107ab8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytankerkoenig/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pytankerkoenig";
+  version = "0.0.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "021fg1a4n3527fz86zxfbsi0jrk0dnai1y92q6hwh5za68lrs710";
+  };
+
+  # Tests require an API key and network access
+  doCheck = false;
+  pythonImportsCheck = [ "pytankerkoenig" ];
+
+  meta = with lib; {
+    description = "Python module to get fuel data from tankerkoenig.de";
+    homepage = "https://github.com/ultrara1n/pytankerkoenig";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytap2/default.nix b/nixpkgs/pkgs/development/python-modules/pytap2/default.nix
new file mode 100644
index 000000000000..d78a7b364779
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytap2/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, nettools
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytap2";
+  version = "2.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "johnthagen";
+    repo = "pytap2";
+    rev = "v${version}";
+    hash = "sha256-GN8yFnS7HVgIP73/nVtYnwwhCBI9doGHLGSOaFiWIdw=";
+  };
+
+  propagatedBuildInputs = [
+    nettools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytap2"
+  ];
+
+  meta = with lib; {
+    description = "Object-oriented wrapper around the Linux Tun/Tap device";
+    homepage = "https://github.com/johnthagen/pytap2";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytapo/default.nix b/nixpkgs/pkgs/development/python-modules/pytapo/default.nix
new file mode 100644
index 000000000000..2d4c8286d610
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytapo/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+# propagates
+, pycryptodome
+, requests
+, rtp
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "pytapo";
+  version = "3.3.16";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-omeJUF4bY/FfXMmBvpVo3dr7B/pUy8YXt0DPaSe3VkA=";
+  };
+
+  propagatedBuildInputs = [
+    pycryptodome
+    requests
+    rtp
+    urllib3
+  ];
+
+  pythonImportsCheck = [
+    "pytapo"
+  ];
+
+  # Tests require actual hardware
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python library for communication with Tapo Cameras";
+    homepage = "https://github.com/JurajNyiri/pytapo";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fleaz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytautulli/default.nix b/nixpkgs/pkgs/development/python-modules/pytautulli/default.nix
new file mode 100644
index 000000000000..5d2c51675c43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytautulli/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytautulli";
+  version = "23.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ludeeus";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-5wE8FjLFu1oQkVqnWsbp253dsQ1/QGWC6hHSIFwLajY=";
+  };
+
+  postPatch = ''
+    # Upstream is releasing with the help of a CI to PyPI, GitHub releases
+    # are not in their focus
+    substituteInPlace setup.py \
+      --replace 'version="main",' 'version="${version}",'
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  checkInputs = [
+    aresponses
+    pytest-asyncio
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=auto"
+  ];
+
+  pythonImportsCheck = [
+    "pytautulli"
+  ];
+
+  meta = with lib; {
+    description = "Python module to get information from Tautulli";
+    homepage = "https://github.com/ludeeus/pytautulli";
+    changelog = "https://github.com/ludeeus/pytautulli/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyte/default.nix b/nixpkgs/pkgs/development/python-modules/pyte/default.nix
new file mode 100644
index 000000000000..d74ec8652827
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyte/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, wcwidth
+}:
+
+buildPythonPackage rec {
+  pname = "pyte";
+  version = "0.8.1";
+
+  src = fetchFromGitHub {
+    owner = "selectel";
+    repo = pname;
+    rev = version;
+    hash = "sha256-gLvsW4ou6bGq9CxT6XdX+r2ViMk7z+aejemrdLwJb3M=";
+  };
+
+  postPatch = ''
+    # Remove pytest-runner dependency since it is not supported in the NixOS
+    # sandbox
+    sed -i '/pytest-runner/d' setup.py
+  '';
+
+  propagatedBuildInputs = [ wcwidth ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "pyte" ];
+
+  meta = with lib; {
+    description = "Simple VTXXX-compatible linux terminal emulator";
+    homepage = "https://github.com/selectel/pyte";
+    license = licenses.lgpl3;
+    maintainers = with maintainers; [ flokli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytenable/default.nix b/nixpkgs/pkgs/development/python-modules/pytenable/default.nix
new file mode 100644
index 000000000000..5d1efa486fb5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytenable/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, buildPythonPackage
+, defusedxml
+, fetchFromGitHub
+, marshmallow
+, pytest-datafiles
+, pytest-vcr
+, pytestCheckHook
+, python-box
+, python-dateutil
+, pythonOlder
+, requests
+, requests-pkcs12
+, responses
+, restfly
+, semver
+, setuptools
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "pytenable";
+  version = "1.4.14";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tenable";
+    repo = "pyTenable";
+    rev = "refs/tags/${version}";
+    hash = "sha256-EZ6W7DTcmZWjP2BmopU2G3S/82juGG+/ht5Fd8G0W1A=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    defusedxml
+    marshmallow
+    python-box
+    python-dateutil
+    requests
+    restfly
+    semver
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytest-datafiles
+    pytest-vcr
+    pytestCheckHook
+    requests-pkcs12
+    responses
+  ];
+
+  disabledTestPaths = [
+    # Disable tests that requires network access
+    "tests/io/"
+  ];
+
+  disabledTests = [
+    # Disable tests that requires a Docker container
+    "test_uploads_docker_push_name_typeerror"
+    "test_uploads_docker_push_tag_typeerror"
+    "test_uploads_docker_push_cs_name_typeerror"
+    "test_uploads_docker_push_cs_tag_typeerror"
+    # Test requires network access
+    "test_assets_list_vcr"
+    "test_events_list_vcr"
+  ];
+
+  pythonImportsCheck = [
+    "tenable"
+  ];
+
+  meta = with lib; {
+    description = "Python library for the Tenable.io and TenableSC API";
+    homepage = "https://github.com/tenable/pyTenable";
+    changelog = "https://github.com/tenable/pyTenable/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytensor/default.nix b/nixpkgs/pkgs/development/python-modules/pytensor/default.nix
new file mode 100644
index 000000000000..c109a707d24d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytensor/default.nix
@@ -0,0 +1,102 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, versioneer
+, cons
+, etuples
+, filelock
+, logical-unification
+, minikanren
+, numpy
+, scipy
+, typing-extensions
+, jax
+, jaxlib
+, numba
+, numba-scipy
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, tensorflow-probability
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "pytensor";
+  version = "2.18.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "pymc-devs";
+    repo = "pytensor";
+    rev = "refs/tags/rel-${version}";
+    hash = "sha256-8bt6ps5bwT+Atr6JgQMxe234bL/ZriYlURUdX0sC1kk=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "versioneer[toml]==0.28" "versioneer[toml]"
+  '';
+
+  nativeBuildInputs = [
+    cython
+    versioneer
+  ];
+
+  propagatedBuildInputs = [
+    cons
+    etuples
+    filelock
+    logical-unification
+    minikanren
+    numpy
+    scipy
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    jax
+    jaxlib
+    numba
+    numba-scipy
+    pytest-mock
+    pytestCheckHook
+    tensorflow-probability
+  ];
+
+  preBuild = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  pythonImportsCheck = [
+    "pytensor"
+  ];
+
+  disabledTests = [
+    # benchmarks (require pytest-benchmark):
+    "test_elemwise_speed"
+    "test_fused_elemwise_benchmark"
+    "test_logsumexp_benchmark"
+    "test_scan_multiple_output"
+    "test_vector_taps_benchmark"
+  ];
+
+  disabledTestPaths = [
+    # Don't run the most compute-intense tests
+    "tests/scan/"
+    "tests/tensor/"
+    "tests/sparse/sandbox/"
+  ];
+
+  meta = with lib; {
+    description = "Python library to define, optimize, and efficiently evaluate mathematical expressions involving multi-dimensional arrays";
+    homepage = "https://github.com/pymc-devs/pytensor";
+    changelog = "https://github.com/pymc-devs/pytensor/releases";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bcdarwin ];
+    broken = (stdenv.isLinux && stdenv.isAarch64);
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytesseract/default.nix b/nixpkgs/pkgs/development/python-modules/pytesseract/default.nix
new file mode 100644
index 000000000000..77dd73e30155
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytesseract/default.nix
@@ -0,0 +1,52 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, packaging
+, pillow
+, tesseract
+, substituteAll
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pytesseract";
+  version = "0.3.13";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "madmaze";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-gQMeck6ojlIwyiOCBBhzHHrjQfBMelVksVGd+fyxWZk=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./tesseract-binary.patch;
+      drv = tesseract;
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  buildInputs = [
+    tesseract
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+    pillow
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    homepage = "https://pypi.org/project/pytesseract/";
+    license = licenses.asl20;
+    description = "A Python wrapper for Google Tesseract";
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytesseract/tesseract-binary.patch b/nixpkgs/pkgs/development/python-modules/pytesseract/tesseract-binary.patch
new file mode 100644
index 000000000000..78dfacb94ab3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytesseract/tesseract-binary.patch
@@ -0,0 +1,13 @@
+diff --git a/pytesseract/pytesseract.py b/pytesseract/pytesseract.py
+index 132f59b..f161e5c 100755
+--- a/pytesseract/pytesseract.py
++++ b/pytesseract/pytesseract.py
+@@ -23,7 +23,7 @@ except ImportError:
+     import Image
+ 
+ 
+-tesseract_cmd = 'tesseract'
++tesseract_cmd = '@drv@/bin/tesseract'
+ 
+ numpy_installed = find_loader('numpy') is not None
+ if numpy_installed:
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-aio/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-aio/default.nix
new file mode 100644
index 000000000000..322de9c8746f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-aio/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, anyio
+, buildPythonPackage
+, curio
+, fetchFromGitHub
+, hypothesis
+, pytest
+, pytestCheckHook
+, pythonOlder
+, sniffio
+, trio
+, trio-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-aio";
+  version = "1.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "klen";
+    repo = "pytest-aio";
+    rev = "refs/tags/${version}";
+    hash = "sha256-BIVorMRWyboKFZCiELoBh/1oxSpdV263zfLce1fNVhU=";
+  };
+
+  postPatch = ''
+    sed -i '/addopts/d' setup.cfg
+  '';
+
+  buildInputs = [
+    pytest
+  ];
+
+  nativeCheckInputs = [
+    anyio
+    curio
+    hypothesis
+    pytestCheckHook
+    sniffio
+    trio
+    trio-asyncio
+  ];
+
+  pythonImportsCheck = [
+    "pytest_aio"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/klen/pytest-aio";
+    description = "Pytest plugin for aiohttp support";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-aiohttp/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-aiohttp/default.nix
new file mode 100644
index 000000000000..9cd6ec0491a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-aiohttp/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, wheel
+, aiohttp
+, pytest
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-aiohttp";
+  version = "1.0.5";
+
+  format = "pyproject";
+
+  __darwinAllowLocalNetworking = true;
+
+  src = fetchFromGitHub {
+    owner = "aio-libs";
+    repo = "pytest-aiohttp";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-UACf0frMTOAgSsXQ0oqROHKR1zn4OfLPhd9MwBK002Y=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pytest-asyncio
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/aio-libs/pytest-aiohttp/";
+    changelog = "https://github.com/aio-libs/pytest-aiohttp/blob/${src.rev}/CHANGES.rst";
+    description = "Pytest plugin for aiohttp support";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-annotate/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-annotate/default.nix
new file mode 100644
index 000000000000..2c70cbd320f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-annotate/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pyannotate
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-annotate";
+  version = "1.0.5";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-CSaTIPjSGHKCR0Nvet6W8zzz/oWEC0BjIULZ+JaMH9A=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    pyannotate
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest>=3.2.0,<7.0.0" "pytest>=3.2.0"
+  '';
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pytest_annotate"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Generate PyAnnotate annotations from your pytest tests";
+    homepage = "https://github.com/kensho-technologies/pytest-annotate";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-ansible/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-ansible/default.nix
new file mode 100644
index 000000000000..3b1def125e0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-ansible/default.nix
@@ -0,0 +1,95 @@
+{ lib
+, stdenv
+, ansible-core
+, buildPythonPackage
+, coreutils
+, fetchFromGitHub
+, pytest
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-ansible";
+  version = "4.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "ansible";
+    repo = "pytest-ansible";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-51DQ+NwD454XaYLuRxriuWRZ8uTSX3ZpadXdxs7FspQ=";
+  };
+
+  postPatch = ''
+    substituteInPlace tests/conftest.py inventory \
+      --replace '/usr/bin/env' '${coreutils}/bin/env'
+  '';
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    ansible-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  pytestFlagsArray = [
+    "tests/"
+  ];
+
+  disabledTests = [
+    # Host unreachable in the inventory
+    "test_become"
+    # [Errno -3] Temporary failure in name resolution
+    "test_connection_failure_v2"
+    "test_connection_failure_extra_inventory_v2"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # These tests fail in the Darwin sandbox
+    "test_ansible_facts"
+    "test_func"
+    "test_param_override_with_marker"
+  ];
+
+  disabledTestPaths = [
+    # Test want s to execute pytest in a subprocess
+    "tests/integration/test_molecule.py"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # These tests fail in the Darwin sandbox
+    "tests/test_adhoc.py"
+    "tests/test_adhoc_result.py"
+  ];
+
+  pythonImportsCheck = [
+    "pytest_ansible"
+  ];
+
+  meta = with lib; {
+    description = "Plugin for pytest to simplify calling ansible modules from tests or fixtures";
+    homepage = "https://github.com/jlaska/pytest-ansible";
+    changelog = "https://github.com/ansible-community/pytest-ansible/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ tjni ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-arraydiff/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-arraydiff/default.nix
new file mode 100644
index 000000000000..7984a390a688
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-arraydiff/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pytest
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-arraydiff";
+  version = "0.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "714149beffd0dfa085477c65791c1139b619602b049536353ce1a91397fb3bd2";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  # The tests requires astropy, which itself requires pytest-arraydiff
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pytest_arraydiff"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin to help with comparing array output from tests";
+    homepage = "https://github.com/astrofrog/pytest-arraydiff";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-astropy-header/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-astropy-header/default.nix
new file mode 100644
index 000000000000..43f2edfc30ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-astropy-header/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pytest
+, pytest-cov
+, pytestCheckHook
+, numpy
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-astropy-header";
+  version = "0.2.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "77891101c94b75a8ca305453b879b318ab6001b370df02be2c0b6d1bb322db10";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    numpy
+  ];
+
+  meta = with lib; {
+    description = "Plugin to add diagnostic information to the header of the test output";
+    homepage = "https://astropy.org";
+    license = licenses.bsd3;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-astropy/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-astropy/default.nix
new file mode 100644
index 000000000000..5e1f9223019a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-astropy/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, attrs
+, hypothesis
+, pytest
+, pytest-arraydiff
+, pytest-astropy-header
+, pytest-cov
+, pytest-doctestplus
+, pytest-filter-subpackage
+, pytest-mock
+, pytest-openfiles
+, pytest-remotedata
+, setuptools-scm
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-astropy";
+  version = "0.10.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-hePGbO7eTOZo9HOzzzd/yyqjxI4k8oqqN3roYATM4hE=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    hypothesis
+    pytest-arraydiff
+    pytest-astropy-header
+    pytest-cov
+    pytest-doctestplus
+    pytest-filter-subpackage
+    pytest-mock
+    pytest-openfiles
+    pytest-remotedata
+  ];
+
+  # pytest-astropy is a meta package that only propagates requirements
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Meta-package containing dependencies for testing";
+    homepage = "https://astropy.org";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-asyncio/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-asyncio/default.nix
new file mode 100644
index 000000000000..96179595a9ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-asyncio/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, callPackage
+, fetchFromGitHub
+, flaky
+, hypothesis
+, pytest
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-asyncio";
+  version = "0.21.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pytest-dev";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Wpo8MpCPGiXrckT2x5/yBYtGlzso/L2urG7yGc7SPkA=";
+  };
+
+  outputs = [
+    "out"
+    "testout"
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  postInstall = ''
+    mkdir $testout
+    cp -R tests $testout/tests
+  '';
+
+  doCheck = false;
+  passthru.tests.pytest = callPackage ./tests.nix {};
+
+  pythonImportsCheck = [
+    "pytest_asyncio"
+  ];
+
+  meta = with lib; {
+    description = "Library for testing asyncio code with pytest";
+    homepage = "https://github.com/pytest-dev/pytest-asyncio";
+    changelog = "https://github.com/pytest-dev/pytest-asyncio/blob/v${version}/docs/source/reference/changelog.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-asyncio/tests.nix b/nixpkgs/pkgs/development/python-modules/pytest-asyncio/tests.nix
new file mode 100644
index 000000000000..7fd26c85488d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-asyncio/tests.nix
@@ -0,0 +1,30 @@
+{ buildPythonPackage
+, flaky
+, hypothesis
+, pytest-asyncio
+, pytest-trio
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  pname = "pytest-asyncio-tests";
+  inherit (pytest-asyncio) version;
+
+  format = "other";
+
+  src = pytest-asyncio.testout;
+
+  dontBuild = true;
+  dontInstall = true;
+
+  propagatedBuildInputs = [
+    pytest-asyncio
+  ];
+
+  nativeCheckInputs = [
+    flaky
+    hypothesis
+    pytest-trio
+    pytestCheckHook
+  ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-base-url/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-base-url/default.nix
new file mode 100644
index 000000000000..a6aa15890b85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-base-url/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, poetry-core
+, pytest
+, pytest-localserver
+, requests
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-base-url";
+  version = "2.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pytest-dev";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-v6pLejWNeb9Do6x2EJqmLKj8DNqcMtmYIs+7iDYsbjk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-localserver
+  ];
+
+  pytestFlagsArray = [
+    "tests"
+  ];
+
+  disabledTests = [
+    # should be xfail? or mocking doesn't work
+    "test_url_fails"
+  ];
+
+  pythonImportsCheck = [
+    "pytest_base_url"
+  ];
+
+  meta = with lib; {
+    description = "pytest plugin for URL based tests";
+    homepage = "https://github.com/pytest-dev/pytest-base-url";
+    changelog = "https://github.com/pytest-dev/pytest-base-url/blob/v${version}/CHANGES.rst";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ sephi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-bdd/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-bdd/default.nix
new file mode 100644
index 000000000000..b5b558a0faf5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-bdd/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, mako
+, parse
+, parse-type
+, poetry-core
+, pytest
+, pytestCheckHook
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-bdd";
+  version = "6.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pytest-dev";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-+76jIgfDQPdIoesTr1+QUu8wmOnrdf4KT+TJr9F2Hqk=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "remove-setuptools.patch";
+      url = "https://github.com/pytest-dev/pytest-bdd/commit/5d8eda3a30b47d3bd27849884a851adafca765cb.patch";
+      hash = "sha256-G2WHaRKlQ9HINufh8wl7+ly7HfDGobMLzzlbwDwd+o8=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    mako
+    parse
+    parse-type
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export PATH=$PATH:$out/bin
+  '';
+
+  pythonImportsCheck = [
+    "pytest_bdd"
+  ];
+
+  meta = with lib; {
+    description = "BDD library for the pytest";
+    homepage = "https://github.com/pytest-dev/pytest-bdd";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jm2dev ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-benchmark/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-benchmark/default.nix
new file mode 100644
index 000000000000..f9011b6d721b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-benchmark/default.nix
@@ -0,0 +1,94 @@
+{ lib
+, aspectlib
+, buildPythonPackage
+, elasticsearch
+, elastic-transport
+, fetchFromGitHub
+, fetchpatch
+, freezegun
+, git
+, mercurial
+, py-cpuinfo
+, pygal
+, pytest
+, pytestCheckHook
+, pytest-xdist
+, pythonOlder
+, isPy311
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-benchmark";
+  version = "4.0.0";
+
+  disabled = pythonOlder "3.7";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "ionelmc";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-f9Ty4+5PycraxoLUSa9JFusV5Cot6bBWKfOGHZIRR3o=";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/ionelmc/pytest-benchmark/commit/728752d2976ef53fde7e40beb3e55f09cf4d4736.patch";
+      hash = "sha256-WIQADCLey5Y79UJUj9J5E02HQ0O86xBh/3IeGLpVrWI=";
+    })
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    py-cpuinfo
+  ];
+
+  passthru.optional-dependencies = {
+    aspect = [ aspectlib ];
+    histogram = [ pygal ];
+    elasticsearch = [ elasticsearch ];
+  };
+
+  pythonImportsCheck = [
+    "pytest_benchmark"
+  ];
+
+  nativeCheckInputs = [
+    elastic-transport
+    freezegun
+    git
+    mercurial
+    pytestCheckHook
+    pytest-xdist
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  preCheck = ''
+    export PATH="$out/bin:$PATH"
+  '';
+
+  disabledTests = [
+    # AttributeError: 'PluginImportFixer' object has no attribute 'find_spec'
+    "test_compare_1"
+    "test_compare_2"
+    "test_regression_checks"
+    "test_rendering"
+  ]
+  # tests are broken in 3.11
+  # https://github.com/ionelmc/pytest-benchmark/issues/231
+  ++ lib.optionals isPy311 [
+    "test_abort_broken"
+    "test_clonefunc"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/ionelmc/pytest-benchmark/blob/${src.rev}/CHANGELOG.rst";
+    description = "Pytest fixture for benchmarking code";
+    homepage = "https://github.com/ionelmc/pytest-benchmark";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-black/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-black/default.nix
new file mode 100644
index 000000000000..918d53c4fa7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-black/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi
+, black
+, pytest
+, setuptools-scm
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-black";
+  version = "0.3.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1d339b004f764d6cd0f06e690f6dd748df3d62e6fe1a692d6a5500ac2c5b75a5";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [ black toml ];
+
+  # does not contain tests
+  doCheck = false;
+  pythonImportsCheck = [ "pytest_black" ];
+
+  meta = with lib; {
+    description = "A pytest plugin to enable format checking with black";
+    homepage = "https://github.com/shopkeep/pytest-black";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-cases/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-cases/default.nix
new file mode 100644
index 000000000000..c1813c6994c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-cases/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, makefun
+, decopatch
+, pythonOlder
+, pytest
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-cases";
+  version = "3.6.14";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-dFXmylelRMG/3YtWrOCMHBzkxlcqiquPG9NR3CWhC2s=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    decopatch
+    makefun
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "pytest-runner" ""
+  '';
+
+  # Tests have dependencies (pytest-harvest, pytest-steps) which
+  # are not available in Nixpkgs. Most of the packages (decopatch,
+  # makefun, pytest-*) have circular dependencies.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pytest_cases"
+  ];
+
+  meta = with lib; {
+    description = "Separate test code from test cases in pytest";
+    homepage = "https://github.com/smarie/python-pytest-cases";
+    changelog = "https://github.com/smarie/python-pytest-cases/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-catchlog/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-catchlog/default.nix
new file mode 100644
index 000000000000..58b69c4ce560
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-catchlog/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, pytest, unzip }:
+
+buildPythonPackage rec {
+  pname = "pytest-catchlog";
+  version = "1.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1w7wxh27sbqwm4jgwrjr9c2gy384aca5jzw9c0wzhl0pmk2mvqab";
+    extension = "zip";
+  };
+
+  nativeBuildInputs = [ unzip ];
+  buildInputs = [ pytest ];
+  checkPhase = "make test";
+
+  # Requires pytest < 3.1
+  doCheck = false;
+
+  meta = with lib; {
+    license = licenses.mit;
+    homepage = "https://pypi.python.org/pypi/pytest-catchlog/";
+    description = "py.test plugin to catch log messages. This is a fork of pytest-capturelog.";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-celery/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-celery/default.nix
new file mode 100644
index 000000000000..0af07db4ec1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-celery/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchFromGitHub, flit-core }:
+
+buildPythonPackage rec {
+  pname = "pytest-celery";
+  version = "0.1.0";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "celery";
+    repo = "pytest-celery";
+    rev = "v${version}";
+    hash = "sha256-vzWwkOS3BLOInaFDk+PegvEmC88ZZ1sG1CmHwhn7r9w=";
+  };
+
+  postPatch = ''
+    # avoid infinite recursion with celery
+    substituteInPlace pyproject.toml \
+      --replace '"celery >= 4.4.0"' ""
+  '';
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  # This package has nothing to test or import.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Pytest plugin to enable celery.contrib.pytest";
+    homepage = "https://github.com/celery/pytest-celery";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-check/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-check/default.nix
new file mode 100644
index 000000000000..7b7189e78684
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-check/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, pytest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-check";
+  version = "2.2.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "pytest_check";
+    inherit version;
+    hash = "sha256-eufpnpDxJ9PQLSnAKostlbWofbPTDczRaen9ZsRP2+g=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    pytest
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "pytest plugin allowing multiple failures per test";
+    homepage = "https://github.com/okken/pytest-check";
+    license = licenses.mit;
+    maintainers = [ maintainers.flokli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-cid/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-cid/default.nix
new file mode 100644
index 000000000000..eea7a6ead0ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-cid/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, flit-core
+, py-cid
+, pytestCheckHook
+, pytest-cov
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-cid";
+  version = "1.1.2";
+  format = "pyproject";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "ntninja";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-dcL/i5+scmdXh7lfE8+32w9PdHWf+mkunJL1vpJ5+Co=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "pytest >= 5.0, < 7.0" "pytest >= 5.0"
+  '';
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    py-cid
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-cov
+  ];
+
+  pythonImportsCheck = [ "pytest_cid" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ntninja/pytest-cid";
+    description = "A simple wrapper around py-cid for easily writing tests involving CIDs in datastructures";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ Luflosi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-click/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-click/default.nix
new file mode 100644
index 000000000000..ffc13ca9eb58
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-click/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytest
+, click
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-click";
+  version = "1.1.0";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "Stranger6667";
+    repo = "pytest-click";
+    rev = "v${version}";
+    hash = "sha256-A/RF+SgPu2yYF3eHEFiZwKJW2VwQ185Ln6S3wn2cS0k=";
+  };
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "pytest plugin for click";
+    homepage = "https://github.com/Stranger6667/pytest-click";
+    changelog = "https://github.com/Stranger6667/pytest-click/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-console-scripts/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-console-scripts/default.nix
new file mode 100644
index 000000000000..5170a7a902ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-console-scripts/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, mock
+, fetchPypi
+, pytestCheckHook
+, python
+, pythonOlder
+, setuptools-scm
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-console-scripts";
+  version = "1.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WoJu2EzAr6IC655EOB19di973ajgwj+feafx9Ez0qJU=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # Patch the shebang of a script generated during test.
+    substituteInPlace tests/test_run_scripts.py \
+      --replace "#!/usr/bin/env python" "#!${python.interpreter}"
+  '';
+
+  pythonImportsCheck = [
+    "pytest_console_scripts"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin for testing console scripts";
+    longDescription = ''
+      Pytest-console-scripts is a pytest plugin for running python scripts from within tests.
+      It's quite similar to subprocess.run(), but it also has an in-process mode, where the scripts are executed by the interpreter that's running pytest (using some amount of sandboxing).
+    '';
+    homepage = "https://github.com/kvas-it/pytest-console-scripts";
+    license = licenses.mit;
+    maintainers = with maintainers; [ AluisioASG ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-cov/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-cov/default.nix
new file mode 100644
index 000000000000..7df529a83738
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-cov/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, coverage
+, toml
+, tomli
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-cov";
+  version = "4.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-OQSxPfv+xH8AO453/VtYnNEZBKId3xqzimTyBNahDvY=";
+  };
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [ coverage toml tomli ];
+
+  # xdist related tests fail with the following error
+  # OSError: [Errno 13] Permission denied: 'py/_code'
+  doCheck = false;
+  checkPhase = ''
+    # allow to find the module helper during the test run
+    export PYTHONPATH=$PYTHONPATH:$PWD/tests
+    py.test tests
+  '';
+
+  pythonImportsCheck = [ "pytest_cov" ];
+
+  meta = with lib; {
+    description = "Plugin for coverage reporting with support for both centralised and distributed testing, including subprocesses and multiprocessing";
+    homepage = "https://github.com/pytest-dev/pytest-cov";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-cram/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-cram/default.nix
new file mode 100644
index 000000000000..44322ef2d1b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-cram/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi, pytest, cram, bash }:
+
+buildPythonPackage rec {
+  version = "0.2.2";
+  pname = "pytest-cram";
+
+  nativeCheckInputs = [ pytest ];
+  propagatedBuildInputs = [ cram ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0405ymmrsv6ii2qhq35nxfjkb402sdb6d13xnk53jql3ybgmiqq0";
+    extension = "tar.gz";
+  };
+
+  postPatch = ''
+    substituteInPlace pytest_cram/tests/test_options.py \
+      --replace "/bin/bash" "${bash}/bin/bash"
+  '';
+
+  # Remove __init__.py from tests folder, otherwise pytest raises an error that
+  # the imported and collected modules are different.
+  checkPhase = ''
+    rm pytest_cram/tests/__init__.py
+    pytest pytest_cram/ --ignore=pytest_cram/tests/test_examples.py
+  '';
+
+  meta = {
+    description = "Test command-line applications with pytest and cram";
+    homepage = "https://github.com/tbekolay/pytest-cram";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-datadir/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-datadir/default.nix
new file mode 100644
index 000000000000..90b7e6f55e2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-datadir/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-datadir";
+  version = "1.5.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "gabrielcnr";
+    repo = "pytest-datadir";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-sRLqL+8Jf5Kz+qscuG3hClUuPA+33PQa+ob1ht/7CJE=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "pytest_datadir" ];
+
+  meta = with lib; {
+    description = "Pytest plugin for manipulating test data directories and files";
+    homepage = "https://github.com/gabrielcnr/pytest-datadir";
+    changelog = "https://github.com/gabrielcnr/pytest-datadir/blob/v${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kira-bruneau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-datafiles/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-datafiles/default.nix
new file mode 100644
index 000000000000..314231942089
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-datafiles/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, py
+, pytest
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-datafiles";
+  version = "3.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "omarkohl";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-YFD8M5TG6VtLRX04R3u0jtYDDlaK32D4ArWxS6x2b/E=";
+  };
+
+  buildInputs = [
+    py
+    pytest
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytest_datafiles"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin to create a tmpdir containing predefined files/directories";
+    homepage = "https://github.com/omarkohl/pytest-datafiles";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-dependency/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-dependency/default.nix
new file mode 100644
index 000000000000..8cecd7f7f0bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-dependency/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-dependency";
+  version = "0.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wqiSkGGSZj+FAwpquRME5QjlRs3f5VfWktYexXodlGs=";
+  };
+
+  patches = [
+    # Fix build with pytest >= 6.2.0, https://github.com/RKrahl/pytest-dependency/pull/51
+    (fetchpatch {
+      url = "https://github.com/RKrahl/pytest-dependency/commit/0930889a13e2b9baa7617f05dc9b55abede5209d.patch";
+      hash = "sha256-xRreoIz8+yW0mAUb4FvKVlPjALzMAZDmdpbmDKRISE0=";
+    })
+  ];
+
+  buildInputs = [ pytest ];
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/RKrahl/pytest-dependency";
+    description = "Manage dependencies of tests";
+    license = licenses.asl20;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-describe/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-describe/default.nix
new file mode 100644
index 000000000000..a7c389202ee9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-describe/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+
+# build
+, pytest
+
+# tests
+, pytestCheckHook
+}:
+
+let
+  pname = "pytest-describe";
+  version = "2.1.0";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BjDJWsSUKrjc2OdmI2+GQ2tJhIltsMBZ/CNP72b+lzI=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Describe-style plugin for the pytest framework";
+    homepage = "https://github.com/pytest-dev/pytest-describe";
+    changelog = "https://github.com/pytest-dev/pytest-describe/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-django/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-django/default.nix
new file mode 100644
index 000000000000..f78a637a5b8a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-django/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, django
+, setuptools-scm
+, django-configurations
+, pytest-xdist
+, six
+}:
+buildPythonPackage rec {
+  pname = "pytest-django";
+  version = "4.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d9076f759bb7c36939dbdd5ae6633c18edfc2902d1a69fdbefd2426b970ce6c2";
+  };
+
+  nativeBuildInputs = [ pytest setuptools-scm ];
+  nativeCheckInputs = [ pytest django-configurations pytest-xdist six ];
+  propagatedBuildInputs = [ django ];
+
+  # Complicated. Requires Django setup.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "py.test plugin for testing of Django applications";
+    homepage = "https://pytest-django.readthedocs.org/en/latest/";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-doctestplus/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-doctestplus/default.nix
new file mode 100644
index 000000000000..d4f5a3c5c5ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-doctestplus/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, packaging
+, pytest
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-doctestplus";
+  version = "1.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-9lBEDcrt4T7W19pzv7SsWF1AqAREujVC0+buzbJ11J8=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    numpy
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # ERROR: usage: __main__.py [options] [file_or_dir] [file_or_dir] [...]
+    # __main__.py: error: unrecognized arguments: --remote-data
+    "test_remote_data_url"
+    "test_remote_data_float_cmp"
+    "test_remote_data_ignore_whitespace"
+    "test_remote_data_ellipsis"
+    "test_remote_data_requires"
+    "test_remote_data_ignore_warnings"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin with advanced doctest features";
+    homepage = "https://astropy.org";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-dotenv/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-dotenv/default.nix
new file mode 100644
index 000000000000..05e5da7ffdd5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-dotenv/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, pytest, python-dotenv }:
+
+buildPythonPackage rec {
+  pname = "pytest-dotenv";
+  version = "0.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "LcbDrG2HZMccbSgE6QLQ/4EPoZaS6V/hOK78mxqnNzI=";
+  };
+
+  buildInputs = [ pytest ];
+  propagatedBuildInputs = [ python-dotenv ];
+
+  nativeCheckInputs = [ pytest ];
+
+  meta = with lib; {
+    description = "A pytest plugin that parses environment files before running tests";
+    homepage = "https://github.com/quiqua/pytest-dotenv";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cleeyv ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-emoji/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-emoji/default.nix
new file mode 100644
index 000000000000..1700c34fb37a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-emoji/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-emoji";
+  version = "0.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "hackebrot";
+    repo = "pytest-emoji";
+    rev = "refs/tags/${version}";
+    hash = "sha256-GuKBbIIODDnMi9YMX3zR4Jc3cbK+Zibj1ZeWvYkUY24=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytest_emoji"
+  ];
+
+  disabledTests = [
+    # Test scompare CLI output
+    "test_emoji_disabled_by_default_verbose"
+    "test_emoji_enabled_verbose"
+    "test_emoji_enabled_custom_verbose"
+  ];
+
+  meta = with lib; {
+    description = "A pytest plugin that adds emojis to test result report";
+    homepage = "https://github.com/hackebrot/pytest-emoji";
+    changelog = "https://github.com/hackebrot/pytest-emoji/releases/tag/0.2.0";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-env/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-env/default.nix
new file mode 100644
index 000000000000..92ed531c6fbf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-env/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hatch-vcs
+, hatchling
+, pytest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-env";
+  version = "1.0.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "pytest_env";
+    inherit version;
+    hash = "sha256-YD/iFujgOl0TSYnLQTF8Waq+8BPSJQxxuGSrB5j75vY=";
+  };
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin used to set environment variables";
+    homepage = "https://github.com/MobileDynasty/pytest-env";
+    license = licenses.mit;
+    maintainers = with maintainers; [ erikarvstedt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-error-for-skips/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-error-for-skips/default.nix
new file mode 100644
index 000000000000..7ed7972792a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-error-for-skips/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-error-for-skips";
+  version = "2.0.2";
+
+  src = fetchFromGitHub {
+    owner = "jankatins";
+    repo = pname;
+    rev = version;
+    sha256 = "04i4jd3bg4lgn2jfh0a0dzg3ml9b2bjv2ndia6b64w96r3r4p3qr";
+  };
+
+  buildInputs = [ pytest ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "pytest_error_for_skips" ];
+
+  meta = with lib; {
+    description = "Pytest plugin to treat skipped tests a test failures";
+    homepage = "https://github.com/jankatins/pytest-error-for-skips";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-examples/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-examples/default.nix
new file mode 100644
index 000000000000..3ac626a3f997
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-examples/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, black
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, pytest
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, ruff
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-examples";
+  version = "0.0.10";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pydantic";
+    repo = "pytest-examples";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-jCxOGDJlFkMH9VtaaPsE5zt+p3Z/mrVzhdNSI51/nVM=";
+  };
+
+  postPatch = ''
+    # ruff binary is used directly, the ruff Python package is not needed
+    substituteInPlace pytest_examples/lint.py \
+      --replace "'ruff'" "'${ruff}/bin/ruff'"
+  '';
+
+  pythonRemoveDeps = [
+    "ruff"
+  ];
+
+  nativeBuildInputs = [
+    hatchling
+    pythonRelaxDepsHook
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    black
+    ruff
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytest_examples"
+  ];
+
+  disabledTests = [
+    # Test fails with latest ruff v0.1.2
+    # See https://github.com/pydantic/pytest-examples/issues/26
+    "test_ruff_error"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin for testing examples in docstrings and markdown files";
+    homepage = "https://github.com/pydantic/pytest-examples";
+    changelog = "https://github.com/pydantic/pytest-examples/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-expect/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-expect/default.nix
new file mode 100644
index 000000000000..dfd498c6b1e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-expect/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, pytest
+, u-msgpack-python
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-expect";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "36b4462704450798197d090809a05f4e13649d9cba9acdc557ce9517da1fd847";
+  };
+
+  buildInputs = [ pytest ];
+  propagatedBuildInputs = [ u-msgpack-python six ];
+
+  # Tests in neither the archive nor the repo
+  doCheck = false;
+
+  meta = {
+    description = "py.test plugin to store test expectations and mark tests based on them";
+    homepage = "https://github.com/gsnedders/pytest-expect";
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-factoryboy/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-factoryboy/default.nix
new file mode 100644
index 000000000000..349ccf311dde
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-factoryboy/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, poetry-core
+
+# unpropagated
+, pytest
+
+# propagated
+, inflection
+, factory-boy
+, typing-extensions
+
+# tests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-factoryboy";
+  version = "2.5.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pytest-dev";
+    repo = "pytest-factoryboy";
+    rev = version;
+    sha256 = "sha256-zxgezo2PRBKs0mps0qdKWtBygunzlaxg8s9BoBaU1Ig=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    factory-boy
+    inflection
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [
+    "pytest_factoryboy"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--ignore=docs"
+  ];
+
+  meta = with lib; {
+    description = "Integration of factory_boy into the pytest runner";
+    homepage = "https://pytest-factoryboy.readthedocs.io/en/latest/";
+    maintainers = with maintainers; [ winpat ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-filter-subpackage/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-filter-subpackage/default.nix
new file mode 100644
index 000000000000..054170408be6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-filter-subpackage/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pytest-cov
+, pytest-doctestplus
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-filter-subpackage";
+  version = "0.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-H66jZxeAPlJFiNbBCdJtINOzRCLo1qloEnWJd9ygF4I=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    pytest-doctestplus
+    pytest-cov
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # missing some files
+  disabledTests = [
+    "with_rst"
+  ];
+
+  meta = with lib; {
+    description = "Meta-package containing dependencies for testing";
+    homepage = "https://github.com/astropy/pytest-filter-subpackage";
+    changelog = "https://github.com/astropy/pytest-filter-subpackage/blob/v${version}/CHANGES.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-fixture-config/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-fixture-config/default.nix
new file mode 100644
index 000000000000..32392f8f14ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-fixture-config/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi
+, setuptools-git, pytest }:
+
+buildPythonPackage rec {
+  pname = "pytest-fixture-config";
+  version = "1.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "13i1qpz22w3x4dmw8vih5jdnbqfqvl7jiqs0dg764s0zf8bp98a1";
+  };
+
+  nativeBuildInputs = [ setuptools-git ];
+
+  buildInputs = [ pytest ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Simple configuration objects for Py.test fixtures. Allows you to skip tests when their required config variables aren’t set.";
+    homepage = "https://github.com/manahl/pytest-plugins";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ryansydnor ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-flake8/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-flake8/default.nix
new file mode 100644
index 000000000000..fab7bab0ba94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-flake8/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, fetchpatch
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, flake8
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-flake8";
+  version = "1.1.1";
+
+  disabled = pythonOlder "3.7";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ba4f243de3cb4c2486ed9e70752c80dd4b636f7ccb27d4eba763c35ed0cd316e";
+  };
+
+  patches = [
+    # https://github.com/tholo/pytest-flake8/issues/87
+    # https://github.com/tholo/pytest-flake8/pull/88
+    (fetchpatch {
+      url = "https://github.com/tholo/pytest-flake8/commit/976e6180201f7808a3007c8c5903a1637b18c0c8.patch";
+      hash = "sha256-Hbcpz4fTXtXRnIWuKuDhOVpGx9H1sdQRKqxadk2s+uE=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    flake8
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = {
+    description = "py.test plugin for efficiently checking PEP8 compliance";
+    homepage = "https://github.com/tholo/pytest-flake8";
+    maintainers = with lib.maintainers; [ jluttine ];
+    license = lib.licenses.bsd2;
+    broken = lib.versionAtLeast flake8.version "6.0.0";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-flakes/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-flakes/default.nix
new file mode 100644
index 000000000000..ae92c18766a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-flakes/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder
+, pytest
+, pyflakes
+}:
+
+buildPythonPackage rec {
+  # upstream has abandoned project in favor of pytest-flake8
+  # retaining package to not break other packages
+  pname = "pytest-flakes";
+  version = "4.0.5";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "953134e97215ae31f6879fbd7368c18d43f709dc2fab5b7777db2bb2bac3a924";
+  };
+
+  buildInputs = [ pytest ];
+  propagatedBuildInputs = [ pyflakes ];
+  nativeCheckInputs = [ pytest ];
+
+  # no longer passes
+  doCheck = false;
+  pythonImportsCheck = [ "pytest_flakes" ];
+  # disable one test case that looks broken
+  checkPhase = ''
+    py.test test_flakes.py -k 'not test_syntax_error'
+  '';
+
+  meta = with lib; {
+    license = licenses.mit;
+    homepage = "https://pypi.python.org/pypi/pytest-flakes";
+    description = "pytest plugin to check source code with pyflakes";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-flask/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-flask/default.nix
new file mode 100644
index 000000000000..428e0c5c3e01
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-flask/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, flask
+, pytest
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-flask";
+  version = "1.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WL4cl7Ibo8TUfgp2ketBAHdIUGw2v1EAT3jfEGkfqV4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    flask
+    werkzeug
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytest_flask"
+  ];
+
+  pytestFlagsArray = lib.optionals stdenv.isDarwin [
+    "--ignore=tests/test_live_server.py"
+  ];
+
+  meta = with lib; {
+    description = "A set of pytest fixtures to test Flask applications";
+    homepage = "https://pytest-flask.readthedocs.io/";
+    changelog = "https://github.com/pytest-dev/pytest-flask/blob/${version}/docs/changelog.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ vanschelven ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-forked/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-forked/default.nix
new file mode 100644
index 000000000000..e4727abadb7c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-forked/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, wheel
+, py
+, pytest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-forked";
+  version = "1.6.0";
+
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pytest-dev";
+    repo = "pytest-forked";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-owkGwF5WQ17/CXwTsIYJ2AgktekRB4qhtsDxR0LCI/k=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    py
+  ];
+
+  nativeCheckInputs = [
+    py
+    pytestCheckHook
+  ];
+
+  setupHook = ./setup-hook.sh;
+
+  meta = {
+    changelog = "https://github.com/pytest-dev/pytest-forked/blob/${src.rev}/CHANGELOG.rst";
+    description = "Run tests in isolated forked subprocesses";
+    homepage = "https://github.com/pytest-dev/pytest-forked";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-forked/setup-hook.sh b/nixpkgs/pkgs/development/python-modules/pytest-forked/setup-hook.sh
new file mode 100644
index 000000000000..e613feadf834
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-forked/setup-hook.sh
@@ -0,0 +1,25 @@
+pytestForkedHook() {
+    pytestFlagsArray+=(
+        "--forked"
+    )
+
+    # Using --forked on darwin leads to crashes when fork safety is
+    # enabled. This often happens when urllib tries to request proxy
+    # settings on MacOS through `urllib.request.getproxies()`
+    # - https://github.com/python/cpython/issues/77906
+    if [[ "$OSTYPE" == "darwin"* ]]; then
+        export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
+    fi
+}
+
+# the flags should be added before pytestCheckHook runs so
+# until we have dependency mechanism in generic builder, we need to use this ugly hack.
+
+if [ -z "${dontUsePytestForked-}" ] && [ -z "${dontUsePytestCheck-}" ]; then
+    if [[ " ${preDistPhases:-} " =~ " pytestCheckPhase " ]]; then
+        preDistPhases+=" "
+        preDistPhases="${preDistPhases/ pytestCheckPhase / pytestForkedHook pytestCheckPhase }"
+    else
+        preDistPhases+=" pytestForkedHook"
+    fi
+fi
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-freezegun/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-freezegun/default.nix
new file mode 100644
index 000000000000..95ccd9b77cd4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-freezegun/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, freezegun
+, pytest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-freezegun";
+  version = "0.4.2";
+
+  src = fetchFromGitHub {
+    owner = "ktosiek";
+    repo = "pytest-freezegun";
+    rev = version;
+    sha256 = "10c4pbh03b4s1q8cjd75lr0fvyf9id0zmdk29566qqsmaz28npas";
+  };
+
+  patches = [
+    (fetchpatch {
+      # https://github.com/ktosiek/pytest-freezegun/pull/38
+      name = "pytest-freezegun-drop-distutils.patch";
+      url = "https://github.com/ktosiek/pytest-freezegun/commit/03d7107a877e8f07617f931a379f567d89060085.patch";
+      hash = "sha256-/7GTQdidVbE2LT5hwxjEc2dr+aWr6TX1131U4KMQhns=";
+    })
+  ];
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [
+    freezegun
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Wrap tests with fixtures in freeze_time";
+    homepage = "https://github.com/ktosiek/pytest-freezegun";
+    license = licenses.mit;
+    maintainers = [ maintainers.mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-freezer/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-freezer/default.nix
new file mode 100644
index 000000000000..d7381c44a680
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-freezer/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, freezegun
+, pytest
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-freezer";
+  version = "0.4.8";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "pytest-dev";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Eak6LNoyu2wvZbPaBBUO0UkyB9vni8YbsADGK0as7Cg=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    freezegun
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytest_freezer"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin providing a fixture interface for spulec/freezegun";
+    homepage = "https://github.com/pytest-dev/pytest-freezer";
+    changelog = "https://github.com/pytest-dev/pytest-freezer/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-golden/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-golden/default.nix
new file mode 100644
index 000000000000..dede2e30b9fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-golden/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, atomicwrites
+, buildPythonPackage
+, fetchFromGitHub
+  #, hatchling
+, ruamel-yaml
+, poetry-core
+, 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=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "poetry>=0.12" poetry-core \
+      --replace poetry.masonry.api poetry.core.masonry.api
+  '';
+
+  pythonRelaxDeps = [
+    "testfixtures"
+  ];
+
+  nativeBuildInputs = [
+    # hatchling used for > 0.2.2
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    atomicwrites
+    ruamel-yaml
+    testfixtures
+  ];
+
+  nativeCheckInputs = [
+    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/nixpkgs/pkgs/development/python-modules/pytest-grpc/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-grpc/default.nix
new file mode 100644
index 000000000000..da106064a804
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-grpc/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, grpcio
+, pytest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-grpc";
+  version = "0.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-C9JoP/00GZRE1wfAqwGXCyLgr7umyx3bbVeMhev+Cb0=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    grpcio
+  ];
+
+  meta = with lib; {
+    description = "pytest plugin for grpc";
+    homepage = "https://github.com/MobileDynasty/pytest-env";
+    license = licenses.mit;
+    maintainers = teams.deshaw.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-helpers-namespace/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-helpers-namespace/default.nix
new file mode 100644
index 000000000000..7ac3fdc47f28
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-helpers-namespace/default.nix
@@ -0,0 +1,33 @@
+{ buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, isPy27
+, lib
+, setuptools
+, setuptools-declarative-requirements
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-helpers-namespace";
+  version = "2021.12.29";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "792038247e0021beb966a7ea6e3a70ff5fcfba77eb72c6ec8fd6287af871c35b";
+  };
+
+  nativeBuildInputs = [ setuptools setuptools-declarative-requirements setuptools-scm ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "pytest_helpers_namespace" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/saltstack/pytest-helpers-namespace";
+    description = "PyTest Helpers Namespace";
+    license = licenses.asl20;
+    maintainers = [ maintainers.kiwi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-html/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-html/default.nix
new file mode 100644
index 000000000000..3375a7a0a0bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-html/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildNpmPackage
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, hatch-vcs
+, hatchling
+, jinja2
+, pytest
+, pytest-metadata
+}:
+let
+  pname = "pytest-html";
+  version = "4.0.2";
+
+  src = fetchPypi {
+    pname = "pytest_html";
+    inherit version;
+    hash = "sha256-iGgrno5ROSRyVGpwohObJ9a8GDSkr9PkHaM8nZ+R5KQ=";
+  };
+
+  web-assets = buildNpmPackage {
+    pname = "${pname}-web-assets";
+    inherit version src;
+
+    npmDepsHash = "sha256-aRod+SzVSb4bqEJzthfl/mH+DpbIe+j2+dNtrrhO2xU=";
+
+    installPhase = ''
+      runHook preInstall
+
+      install -Dm644 src/pytest_html/resources/{app.js,style.css} -t $out/lib
+
+      runHook postInstall
+    '';
+  };
+in
+
+buildPythonPackage {
+  inherit pname version src;
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+  buildInputs = [ pytest web-assets ];
+  propagatedBuildInputs = [ jinja2 pytest-metadata ];
+
+  env.HATCH_BUILD_NO_HOOKS = true;
+
+  preBuild = ''
+    install -Dm644 ${web-assets}/lib/{app.js,style.css} -t src/pytest_html/resources
+  '';
+
+  # tests require network access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pytest_html"
+  ];
+
+  meta = with lib; {
+    description = "Plugin for generating HTML reports";
+    homepage = "https://github.com/pytest-dev/pytest-html";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ mpoquet ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-httpbin/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-httpbin/default.nix
new file mode 100644
index 000000000000..db94f2b6e163
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-httpbin/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpbin
+, pytest
+, pytestCheckHook
+, pythonOlder
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-httpbin";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "kevin1024";
+    repo = "pytest-httpbin";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-tq9nz2na94HkLACt7xB1MUanh9/JOoe2vyEm5sAq0/4=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    httpbin
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests
+  ];
+
+  disabledTests = [
+    # incompatible with flask 2.3
+    "test_redirect_location_is_https_for_secure_server"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [
+    "pytest_httpbin"
+  ];
+
+  meta = with lib; {
+    description = "Test your HTTP library against a local copy of httpbin.org";
+    homepage = "https://github.com/kevin1024/pytest-httpbin";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-httpserver/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-httpserver/default.nix
new file mode 100644
index 000000000000..01ef1025904e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-httpserver/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, requests
+, toml
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-httpserver";
+  version = "1.0.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "csernazs";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-bjysG+7niSUBl8YMWR8pr7oOz9GDbSfq3PeloYBkq3s=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    werkzeug
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests
+    toml
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  disabledTests = [
+    "test_wait_raise_assertion_false" # racy
+  ];
+
+  pythonImportsCheck = [
+    "pytest_httpserver"
+  ];
+
+  meta = with lib; {
+    description = "HTTP server for pytest to test HTTP clients";
+    homepage = "https://www.github.com/csernazs/pytest-httpserver";
+    changelog = "https://github.com/csernazs/pytest-httpserver/blob/${version}/CHANGES.rst";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-httpx/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-httpx/default.nix
new file mode 100644
index 000000000000..dbcfafc0a5fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-httpx/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, pytest
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-httpx";
+  version = "0.25.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Colin-b";
+    repo = "pytest_httpx";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-8cuXsHyS9OaYXzKXgwan+mBFocyr39B9G8wr8I1pmg4=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  pythonRelaxDeps = [
+    "httpx"
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytest_httpx"
+  ];
+
+  meta = with lib; {
+    description = "Send responses to httpx";
+    homepage = "https://github.com/Colin-b/pytest_httpx";
+    changelog = "https://github.com/Colin-b/pytest_httpx/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-image-diff/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-image-diff/default.nix
new file mode 100644
index 000000000000..cbe607d0648e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-image-diff/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, python3
+, buildPythonPackage
+, fetchFromGitHub
+, typing-extensions
+, diffimg
+, imgdiff
+, pytestCheckHook
+, recommonmark
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-image-diff";
+  version = "0.0.11";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Apkawa";
+    repo = "pytest-image-diff";
+    rev = "v${version}";
+    hash = "sha256-7GBwxm0YQNN/Gq1yyBIxCEYbM7hmOFa9kUsfbBKQtBQ=";
+  };
+
+  propagatedBuildInputs = [
+    typing-extensions
+    diffimg
+    imgdiff
+  ];
+
+  pythonImportsCheck = [ "pytest_image_diff" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    recommonmark
+  ];
+
+  meta = with lib; {
+    description = "Pytest helps for compare images and regression";
+    homepage = "https://github.com/Apkawa/pytest-image-diff";
+    license = licenses.mit;
+    maintainers = with maintainers; [ evils ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-instafail/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-instafail/default.nix
new file mode 100644
index 000000000000..3b237105d4c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-instafail/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-instafail";
+  version = "0.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-M6YG9+DI5kbcO/7g1eOkt7eO98NhaM+h89k698pwbJ4=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytest_instafail"
+  ];
+
+  meta = with lib; {
+    description = "pytest plugin that shows failures and errors instantly instead of waiting until the end of test session";
+    homepage = "https://github.com/pytest-dev/pytest-instafail";
+    changelog = "https://github.com/pytest-dev/pytest-instafail/blob/v${version}/CHANGES.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jacg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-isort/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-isort/default.nix
new file mode 100644
index 000000000000..6298d18ed0d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-isort/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, importlib-metadata
+, isort
+, poetry-core
+, pytest
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-isort";
+  version = "3.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "stephrdev";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-1oCVIi0sXwac4AufScJJRsfvBwaBAwlMBRNqLcUXEh4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    isort
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytest_isort"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin to perform isort checks (import ordering)";
+    homepage = "https://github.com/moccu/pytest-isort/";
+    changelog = "https://github.com/stephrdev/pytest-isort/blob/${version}/CHANGELOG.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-json-report/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-json-report/default.nix
new file mode 100644
index 000000000000..f3b556699e8b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-json-report/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, pytest-metadata
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-json-report";
+  version = "1.5.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "numirias";
+    repo = "pytest-json-report";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-hMB/atDuo7CjwhHFUOxVfgJ7Qp4AA9J428iv7hyQFcs=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    pytest-metadata
+  ];
+
+  nativeCheckInputs = [
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # pytest-flaky is not available at the moment
+    "test_bug_31"
+    "test_environment_via_metadata_plugin"
+  ];
+
+  pythonImportsCheck = [
+    "pytest_jsonreport"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin to report test results as JSON";
+    homepage = "https://github.com/numirias/pytest-json-report";
+    changelog = "https://github.com/numirias/pytest-json-report/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-jupyter/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-jupyter/default.nix
new file mode 100644
index 000000000000..6f5f6484a570
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-jupyter/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build
+, hatchling
+, pytest
+
+# runtime
+, jupyter-core
+
+# optionals
+, jupyter-client
+, ipykernel
+, jupyter-server
+, nbformat
+
+# tests
+, pytest-timeout
+, pytestCheckHook
+}:
+
+let self = buildPythonPackage rec {
+  pname = "pytest-jupyter";
+  version = "0.7.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "jupyter-server";
+    repo = "pytest-jupyter";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ZocpIBHnXTvQdjWU8yVhGK49I+FFct+teDhghiMnvW0=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    jupyter-core
+  ];
+
+  passthru.optional-dependencies = rec {
+    client = [
+      jupyter-client
+      ipykernel
+    ];
+    server = [
+      jupyter-server
+      nbformat
+    ] ++ client;
+  };
+
+  doCheck = false; # infinite recursion with jupyter-server
+
+  nativeCheckInputs = [
+    pytest-timeout
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  passthru.tests = {
+    check = self.overridePythonAttrs (_: { doCheck = false; });
+  };
+
+  meta = with lib; {
+    changelog = "https://github.com/jupyter-server/pytest-jupyter/releases/tag/v${version}";
+    description = "pytest plugin for testing Jupyter core libraries and extensions";
+    homepage = "https://github.com/jupyter-server/pytest-jupyter";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+};
+in self
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-lazy-fixture/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-lazy-fixture/default.nix
new file mode 100644
index 000000000000..8f41c5c55b9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-lazy-fixture/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-lazy-fixture";
+  version = "0.6.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1b0hmnsxw4s2wf9pks8dg6dfy5cx3zcbzs8517lfccxsfizhqz8f";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Helps to use fixtures in pytest.mark.parametrize";
+    homepage = "https://github.com/pytest-dev/pytest-repeat";
+    license = licenses.mit;
+    maintainers = with maintainers; [ tobim ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-localserver/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-localserver/default.nix
new file mode 100644
index 000000000000..4ab9c74be35e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-localserver/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, aiosmtpd
+, buildPythonPackage
+, fetchPypi
+, werkzeug
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-localserver";
+  version = "0.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XZDOfQhddB51n6hU29LnxbVXMh1pUXmJTrQOIQ6i/zA=";
+  };
+
+  propagatedBuildInputs = [
+    aiosmtpd
+    werkzeug
+  ];
+
+  # all tests access network: does not work in sandbox
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pytest_localserver"
+  ];
+
+  meta = with lib; {
+    description = "Plugin for the pytest testing framework to test server connections locally";
+    homepage = "https://github.com/pytest-dev/pytest-localserver";
+    changelog = "https://github.com/pytest-dev/pytest-localserver/blob/v${version}/CHANGES";
+    license = licenses.mit;
+    maintainers = with maintainers; [ siriobalmelli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-logdog/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-logdog/default.nix
new file mode 100644
index 000000000000..f9bd63d8ee66
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-logdog/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-logdog";
+  version = "0.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ods";
+    repo = pname;
+    rev = version;
+    hash = "sha256-Tmoq+KAGzn0MMj29rukDfAc4LSIwC8DoMTuBAppV32I=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytest_logdog"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin to test logging";
+    homepage = "https://github.com/ods/pytest-logdog";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-md-report/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-md-report/default.nix
new file mode 100644
index 000000000000..0b0f892c7f6c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-md-report/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytablewriter
+, pytest
+, tcolorpy
+, typepy
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-md-report";
+  version = "0.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8qLcbMhD+mTLH5veweAg56G067H4AnDQIjywINwJaCE=";
+  };
+
+  propagatedBuildInputs = [
+    pytablewriter
+    tcolorpy
+    typepy
+  ];
+
+  buildInputs = [ pytest ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "pytest_md_report" ];
+
+  meta = with lib; {
+    description = "A pytest plugin to make a test results report with Markdown table format";
+    homepage = "https://github.com/thombashi/pytest-md-report";
+    changelog = "https://github.com/thombashi/pytest-md-report/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rrbutani ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-metadata/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-metadata/default.nix
new file mode 100644
index 000000000000..7b4a285e3552
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-metadata/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hatch-vcs
+, hatchling
+, pytest
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-metadata";
+  version = "3.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "pytest_metadata";
+    inherit version;
+    hash = "sha256-dpqcZdKIS9WDvGJrCs53rRXb4C3ZGpEG1H/UbZwlaco=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+    hatch-vcs
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Plugin for accessing test session metadata";
+    homepage = "https://github.com/pytest-dev/pytest-metadata";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ mpoquet ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-mock/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-mock/default.nix
new file mode 100644
index 000000000000..260c71ac71ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-mock/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, fetchpatch
+, pytest
+, pytest-asyncio
+, pytestCheckHook
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-mock";
+  version = "3.11.1";
+
+  disabled = pythonOlder "3.7";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-f2sSVgKsbXQ+Ujrgv6ceGml6L1U0BkUoxv+EwvfC/H8=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pytest_mock" ];
+
+  meta = with lib; {
+    description = "Thin wrapper around the mock package for easier use with pytest";
+    homepage = "https://github.com/pytest-dev/pytest-mock";
+    changelog = "https://github.com/pytest-dev/pytest-mock/blob/v${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-mockito/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-mockito/default.nix
new file mode 100644
index 000000000000..279b04b83e0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-mockito/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, mockito
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-mockito";
+  version = "0.0.4";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "kaste";
+    repo = "pytest-mockito";
+    rev = version;
+    hash = "sha256-vY/i1YV1lo4mZvnxsXBOyaq31YTiF0BY6PTVwdVX10I=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    mockito
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = {
+    description = "Base fixtures for mockito";
+    homepage = "https://github.com/kaste/pytest-mockito";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-mockservers/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-mockservers/default.nix
new file mode 100644
index 000000000000..d524457ebbb4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-mockservers/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, aiohttp
+, pytest
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-mockservers";
+  version = "0.6.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Gr1N";
+    repo = pname;
+    rev = version;
+    hash = "sha256-Mb3wSbambC1h+lFI+fafwZzm78IvADNAsF/Uw60DFHc=";
+  };
+
+  patches = [
+    # https://github.com/Gr1N/pytest-mockservers/pull/75
+    (fetchpatch {
+      name = "use-poetry-core.patch";
+      url = "https://github.com/Gr1N/pytest-mockservers/commit/c7731186a4e12851ab1c15ab56e652bb48ed59c4.patch";
+      hash = "sha256-/5X3xjJwt2gs3t6f/6n1QZ+CTBq/5+cQE+MgNWyz+Hs=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pytest-asyncio
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytest_mockservers"
+  ];
+
+  meta = with lib; {
+    description = "A set of fixtures to test your requests to HTTP/UDP servers";
+    homepage = "https://github.com/Gr1N/pytest-mockservers";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-mpl/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-mpl/default.nix
new file mode 100644
index 000000000000..63b64f233199
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-mpl/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, pytest
+, jinja2
+, matplotlib
+, nose
+, pillow
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-mpl";
+  version = "0.16.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-LVcWgRJOj/X04rnA0EfTfQSZ1rbY8vSaG1DN2ZMQRGk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION=version;
+
+  propagatedBuildInputs = [
+    jinja2
+    matplotlib
+    nose
+    pillow
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+
+  disabledTests = [
+    # Broken since b6e98f18950c2b5dbdc725c1181df2ad1be19fee
+    "test_hash_fails"
+    "test_hash_missing"
+  ];
+
+  disabledTestPaths = [
+    # Following are broken since at least a1548780dbc79d76360580691dc1bb4af4e837f6
+    "tests/subtests/test_subtest.py"
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+    mkdir -p $HOME/.config/matplotlib
+    echo "backend: ps" > $HOME/.config/matplotlib/matplotlibrc
+    ln -s $HOME/.config/matplotlib $HOME/.matplotlib
+  '';
+
+  meta = with lib; {
+    description = "Pytest plugin to help with testing figures output from Matplotlib";
+    homepage = "https://github.com/matplotlib/pytest-mpl";
+    license = licenses.bsd3;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-mypy-plugins/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-mypy-plugins/default.nix
new file mode 100644
index 000000000000..f4c809218fb0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-mypy-plugins/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, decorator
+, fetchFromGitHub
+, jinja2
+, jsonschema
+, mypy
+, packaging
+, pytest
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, regex
+, tomlkit
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-mypy-plugins";
+  version = "3.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "typeddjango";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-kIA2tVOsKsav4tRqZiWCMcRgbRnxAEo7SpmxC2pt9B0=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    decorator
+    jinja2
+    jsonschema
+    mypy
+    packaging
+    pyyaml
+    regex
+    tomlkit
+  ];
+
+  pythonImportsCheck = [
+    "pytest_mypy_plugins"
+  ];
+
+  nativeCheckInputs = [
+    mypy
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export PATH="$PATH:$out/bin";
+  '';
+
+  disabledTestPaths = [
+    "pytest_mypy_plugins/tests/test_explicit_configs.py"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin for testing mypy types, stubs, and plugins";
+    homepage = "https://github.com/TypedDjango/pytest-mypy-plugins";
+    changelog = "https://github.com/typeddjango/pytest-mypy-plugins/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SomeoneSerge ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-mypy/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-mypy/default.nix
new file mode 100644
index 000000000000..8514fbb7202a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-mypy/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, filelock
+, pytest
+, mypy
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-mypy";
+  version = "0.10.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+EWPZCMj8Toso+LmFQn3dnlmtSe02K3M1QMsPntP09s=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [ mypy filelock ];
+
+  # does not contain tests
+  doCheck = false;
+  pythonImportsCheck = [ "pytest_mypy" ];
+
+  meta = with lib; {
+    description = "Mypy static type checker plugin for Pytest";
+    homepage = "https://github.com/dbader/pytest-mypy";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-openfiles/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-openfiles/default.nix
new file mode 100644
index 000000000000..ac7936c0146e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-openfiles/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pytest
+, pytestCheckHook
+, psutil
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-openfiles";
+  version = "0.5.0";
+  disabled = isPy27; # abandoned
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "179c2911d8aee3441fee051aba08e0d9b4dab61b829ae4811906d5c49a3b0a58";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [
+    psutil
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Pytest plugin for detecting inadvertent open file handles";
+    homepage = "https://astropy.org";
+    license = licenses.bsd3;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-order/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-order/default.nix
new file mode 100644
index 000000000000..389ce90eddce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-order/default.nix
@@ -0,0 +1,36 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, pytest
+, pytest-xdist
+, pytest-dependency
+, pytest-mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-order";
+  version = "1.2.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lE+GttRBqnsdqA+AHGq2W4S766Ry0KehLrQ7omZQEBo=";
+  };
+
+  buildInputs = [ pytest ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-xdist
+    pytest-dependency
+    pytest-mock
+  ];
+
+  meta = {
+    description = "Pytest plugin that allows you to customize the order in which your tests are run";
+    homepage = "https://github.com/pytest-dev/pytest-order";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.jacg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-parallel/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-parallel/default.nix
new file mode 100644
index 000000000000..0bc2070ce354
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-parallel/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+# build inputs
+, tblib
+, pytest
+, py
+}:
+let
+  pname = "pytest-parallel";
+  version = "0.1.1";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "kevlened";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-ddpoWBTf7Zor569p6uOMjHSTx3Qa551f4mSwyTLDdBU=";
+  };
+
+  propagatedBuildInputs = [
+    tblib
+    pytest
+    py
+  ];
+
+  meta = with lib; {
+    description = "A pytest plugin for parallel and concurrent testing";
+    homepage = "https://github.com/kevlened/pytest-parallelt";
+    changelog = "https://github.com/kevlened/pytest-parallel/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-param-files/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-param-files/default.nix
new file mode 100644
index 000000000000..55923b5ed266
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-param-files/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, ruamel-yaml
+, pytest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-param-files";
+  version = "0.6.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "chrisjsewell";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-hgEEfKf9Kmah5WDNHoFWQJKLOs9Z5BDHiebXCdDc1zE=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    ruamel-yaml
+  ];
+
+  pythonImportsCheck = [
+    "pytest_param_files"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Package to generate parametrized pytests from external files";
+    homepage = "https://github.com/chrisjsewell/pytest-param-files";
+    license = licenses.mit;
+    maintainers = with maintainers; [ loicreynier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-playwright/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-playwright/default.nix
new file mode 100644
index 000000000000..3e27b075efa7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-playwright/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, playwright
+, playwright-driver
+, pytest
+, pytest-base-url
+, pytestCheckHook
+, python-slugify
+, pythonOlder
+, setuptools-scm
+, django
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-playwright";
+  version = "0.4.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "microsoft";
+    repo = "playwright-pytest";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-5qjfZGDM1OqXXNyj81O49ClKKGiAPdgyZZu6TgpskGs=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    playwright
+    pytest-base-url
+    python-slugify
+  ];
+
+  # Most of the tests rely on network access, or on unavailable browsers such as
+  # msedge, chrome or webkit
+  doCheck = false;
+
+  preCheck = ''
+    export PLAYWRIGHT_BROWSERS_PATH=${playwright-driver.browsers}
+  '';
+
+  pythonImportsCheck = [
+    "pytest_playwright"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin to write end-to-end browser tests with Playwright";
+    homepage = "https://github.com/microsoft/playwright-pytest";
+    changelog = "https://github.com/microsoft/playwright-pytest/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ sephi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-plt/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-plt/default.nix
new file mode 100644
index 000000000000..4893635c220e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-plt/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, matplotlib
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-plt";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-IkTNlierFXIG9WSVUfVoirfQ6z7JOYlCaa5NhnBSuxc=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    matplotlib
+  ];
+
+  meta = with lib; {
+    description = "provides fixtures for quickly creating Matplotlib plots in your tests";
+    homepage = "https://www.nengo.ai/pytest-plt/";
+    changelog = "https://github.com/nengo/pytest-plt/blob/master/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = [ maintainers.doronbehar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-postgresql/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-postgresql/default.nix
new file mode 100644
index 000000000000..6eed5ef6ad2c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-postgresql/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, setuptools
+, mirakuru
+, port-for
+, psycopg
+, pytest
+, postgresql
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-postgresql";
+  version = "5.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ClearcodeHQ";
+    repo = "pytest-postgresql";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-uWKp9yxTdlswoDPMlhx+2mF1cdhFzhGYKGHdXPGlz+w=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml  \
+      --replace "--cov" ""  \
+      --replace "--max-worker-restart=0" ""
+    sed -i 's#/usr/lib/postgresql/.*/bin/pg_ctl#${postgresql}/bin/pg_ctl#' pytest_postgresql/plugin.py
+  '';
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [
+    mirakuru
+    port-for
+    psycopg
+    setuptools  # requires 'pkg_resources' at runtime
+  ];
+
+  nativeCheckInputs = [
+    postgresql
+    pytestCheckHook
+  ];
+  pytestFlagsArray = [
+    "-p"
+    "no:postgresql"
+  ];
+  disabledTestPaths = [ "tests/docker/test_noproc_docker.py" ];  # requires Docker
+  disabledTests = [
+    # permissions issue running pg as Nixbld user
+    "test_executor_init_with_password"
+    # "ValueError: Pytest terminal summary report not found"
+    "test_postgres_options_config_in_cli"
+    "test_postgres_options_config_in_ini"
+  ];
+  pythonImportsCheck = [
+    "pytest_postgresql"
+    "pytest_postgresql.executor"
+  ];
+
+
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/pytest-postgresql";
+    description = "Pytest plugin that enables you to test code on a temporary PostgreSQL database";
+    changelog = "https://github.com/ClearcodeHQ/pytest-postgresql/blob/v${version}/CHANGES.rst";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-pudb/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-pudb/default.nix
new file mode 100644
index 000000000000..cc3e0db8570f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-pudb/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pytest
+, pudb
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-pudb";
+  version = "0.7.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "wronglink";
+    repo = "pytest-pudb";
+    # Repo missing tags for releases https://github.com/wronglink/pytest-pudb/issues/24
+    rev = "a6b3d2f4d35e558d72bccff472ecde9c9d9c69e5";
+    hash = "sha256-gI9p6sXCQaQjWBXaHJCFli6lBh8+pr+KPhz50fv1F7A=";
+  };
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [ pudb ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "pytest_pudb" ];
+
+  meta = with lib; {
+    description = "Pytest PuDB debugger integration";
+    homepage = "https://github.com/wronglink/pytest-pudb";
+    license = licenses.mit;
+    maintainers = with maintainers; [ thornycrackers ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-pylint/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-pylint/default.nix
new file mode 100644
index 000000000000..c989948afd8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-pylint/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pylint
+, pytest
+, pytestCheckHook
+, pythonOlder
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-pylint";
+  version = "0.21.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-iHZLjh1c+hiAkkjgzML8BQNfCMNfCwIi3c/qHDxOVT4=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest-runner" ""
+  '';
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    pylint
+    toml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytest_pylint"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin to check source code with pylint";
+    homepage = "https://github.com/carsongee/pytest-pylint";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-pytestrail/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-pytestrail/default.nix
new file mode 100644
index 000000000000..9378454cfc38
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-pytestrail/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, pytest
+, testrail-api
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-pytestrail";
+  version = "0.10.5";
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  src = fetchFromGitHub {
+    owner = "tolstislon";
+    repo = "pytest-pytestrail";
+    rev = version;
+    sha256 = "sha256-y34aRxQ8mu6b6GBRMFVzn1shMVc7TumdjRS3daMEZJM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    testrail-api
+  ];
+
+  # all tests require network accesss
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pytest_pytestrail"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin for interaction with TestRail";
+    homepage = "https://github.com/tolstislon/pytest-pytestrail";
+    changelog = "https://github.com/tolstislon/pytest-pytestrail/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ aanderse ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-qt/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-qt/default.nix
new file mode 100644
index 000000000000..96f751935403
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-qt/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, pytest
+, pyqt5
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-qt";
+  version = "4.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-AKF7WG3VMLbXqTmZI6QEicpKmjCXGQERdfVdxrXcj0E=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  nativeCheckInputs = [
+    pyqt5
+  ];
+
+  pythonImportsCheck = [
+    "pytestqt"
+  ];
+
+  # Tests require X server
+  doCheck = false;
+
+  meta = with lib; {
+    description = "pytest support for PyQt and PySide applications";
+    homepage = "https://github.com/pytest-dev/pytest-qt";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-quickcheck/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-quickcheck/default.nix
new file mode 100644
index 000000000000..a5e11c66a71a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-quickcheck/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pytestCheckHook
+, pytest-flakes
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-quickcheck";
+  version = "0.9.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-UFF8ldnaImXU6al4kGjf720mbwXE6Nut9VlvNVrMVoY=";
+  };
+
+  propagatedBuildInputs = [
+    pytest
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-flakes
+  ];
+
+  meta = with lib; {
+    license = licenses.asl20;
+    homepage = "https://pypi.python.org/pypi/pytest-quickcheck";
+    description = "pytest plugin to generate random data inspired by QuickCheck";
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-raises/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-raises/default.nix
new file mode 100644
index 000000000000..1b7beb74c594
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-raises/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-raises";
+  version = "0.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Lemmons";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-wmtWPWwe1sFbWSYxs5ZXDUZM1qvjRGMudWdjQeskaz0=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytest_raises"
+  ];
+
+  disabledTests = [
+    # Failed: nomatch: '*::test_pytest_mark_raises_unexpected_exception FAILED*'
+    # https://github.com/Lemmons/pytest-raises/issues/30
+    "test_pytest_mark_raises_unexpected_exception"
+    "test_pytest_mark_raises_unexpected_match"
+    "test_pytest_mark_raises_parametrize"
+  ];
+
+  meta = with lib; {
+    description = "An implementation of pytest.raises as a pytest.mark fixture";
+    homepage = "https://github.com/Lemmons/pytest-raises";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-raisesregexp/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-raisesregexp/default.nix
new file mode 100644
index 000000000000..78b99714378f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-raisesregexp/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi
+, py, pytest }:
+
+buildPythonPackage rec {
+  pname = "pytest-raisesregexp";
+  version = "2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b54372494fc1f11388b1b9348aeb36b69609699eb8f46e0e010afc733d78236a";
+  };
+
+  buildInputs = [ py pytest ];
+
+  # https://github.com/kissgyorgy/pytest-raisesregexp/pull/3
+  prePatch = ''
+    sed -i '3i\import io' setup.py
+    substituteInPlace setup.py --replace "long_description=open('README.rst').read()," "long_description=io.open('README.rst', encoding='utf-8').read(),"
+  '';
+
+  meta = with lib; {
+    description = "Simple pytest plugin to look for regex in Exceptions";
+    homepage = "https://github.com/Walkman/pytest_raisesregexp";
+    license = with licenses; [ mit ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-raisin/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-raisin/default.nix
new file mode 100644
index 000000000000..2da96d21c9ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-raisin/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-raisin";
+  version = "0.4";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "wimglenn";
+    repo = "pytest-raisin";
+    rev = "v${version}";
+    hash = "sha256-BI0SWy671DYDTPH4iO811ku6SzpH4ho7eQFUA8PmxW8=";
+  };
+
+  nativeBuildInputs = [
+    flit
+  ];
+
+  propagatedBuildInputs = [
+    pytest
+  ];
+
+  # tests cause circular pytest-raisin already registered with pytest error
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Plugin enabling the use of exception instances with pytest.raises context";
+    homepage = "https://github.com/wimglenn/pytest-raisin";
+    license = licenses.mit;
+    maintainers = with maintainers; [ aadibajpai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-random-order/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-random-order/default.nix
new file mode 100644
index 000000000000..153bd7da3a7e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-random-order/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytest
+}:
+
+buildPythonPackage rec {
+  version = "1.1.0";
+  pname = "pytest-random-order";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2+beu5NTp6+YTMnt2+s1d91Nu8wVKaeePSH2jtm0VgU=";
+  };
+
+  disabled = pythonOlder "3.5";
+
+  buildInputs = [ pytest ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jbasko/pytest-random-order";
+    description = "Randomise the order of tests with some control over the randomness";
+    license = licenses.mit;
+    maintainers = [ maintainers.prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-randomly/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-randomly/default.nix
new file mode 100644
index 000000000000..5549f89334a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-randomly/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, factory-boy
+, faker
+, fetchFromGitHub
+, importlib-metadata
+, numpy
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-randomly";
+  version = "3.13.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    repo = pname;
+    owner = "pytest-dev";
+    rev = version;
+    hash = "sha256-bxbW22Nf/0hfJYSiz3xdrNCzrb7vZwuVvSIrWl0Bkv4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.10") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    factory-boy
+    faker
+    numpy
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  # needs special invocation, copied from tox.ini
+  pytestFlagsArray = [
+    "-p"
+    "no:randomly"
+  ];
+
+  pythonImportsCheck = [
+    "pytest_randomly"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/pytest-dev/pytest-randomly/blob/${version}/CHANGELOG.rst";
+    description = "Pytest plugin to randomly order tests and control random.seed";
+    homepage = "https://github.com/pytest-dev/pytest-randomly";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sternenseemann ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-recording/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-recording/default.nix
new file mode 100644
index 000000000000..7a53cbbba882
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-recording/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+# install dependencies
+, pytest
+, vcrpy
+# test dependencies
+, hatchling
+, pytestCheckHook
+, pytest-httpbin
+, pytest-mock
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-recording";
+  version = "0.13.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "kiwicom";
+    repo = "pytest-recording";
+    rev = "v${version}";
+    hash = "sha256-SCHdzii6GYVWVY7MW/IW6CNZMuu5h/jXEj49P0jvhoE=";
+  };
+
+  buildInputs = [
+    hatchling
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    vcrpy
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  checkInputs = [
+    pytestCheckHook
+    pytest-httpbin
+    pytest-mock
+    requests
+  ];
+
+  disabledTests = [
+    "test_block_network_with_allowed_hosts"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # Missing socket.AF_NETLINK
+    "test_other_socket"
+  ];
+
+  pytestFlagsArray = [
+    "tests"
+  ];
+
+  pythonImportsCheck = [
+    "pytest_recording"
+  ];
+
+  meta = with lib; {
+    description = "A pytest plugin that allows you recording of network interactions via VCR.py";
+    homepage = "https://github.com/kiwicom/pytest-recording";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jbgosselin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-regressions/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-regressions/default.nix
new file mode 100644
index 000000000000..e804a0482dc1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-regressions/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, matplotlib
+, numpy
+, pandas
+, pillow
+, pytest
+, pytest-datadir
+, pytestCheckHook
+, pyyaml
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-regressions";
+  version = "2.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gYx4hMHP87q/ie67AsvCezB4VrGYVCfCTVLLgSoQb9k=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    pandas
+    pillow
+    pytest-datadir
+    pyyaml
+  ];
+
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    matplotlib
+  ];
+
+  pythonImportsCheck = [
+    "pytest_regressions"
+    "pytest_regressions.plugin"
+  ];
+
+  meta = with lib; {
+    description = "Pytest fixtures to write regression tests";
+    longDescription = ''
+      pytest-regressions makes it simple to test general data, images,
+      files, and numeric tables by saving expected data in a data
+      directory (courtesy of pytest-datadir) that can be used to verify
+      that future runs produce the same data.
+    '';
+    homepage = "https://github.com/ESSS/pytest-regressions";
+    license = licenses.mit;
+    maintainers = with maintainers; [ AluisioASG ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-relaxed/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-relaxed/default.nix
new file mode 100644
index 000000000000..84f7edb2b6e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-relaxed/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, decorator
+, fetchPypi
+, invocations
+, invoke
+, pytest
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-relaxed";
+  version = "2.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-U6c3Lj/qpSdAm7QDU/gTxZt2Dl2L1H5vb88YfF2W3Qw=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    decorator
+  ];
+
+  nativeCheckInputs = [
+    invocations
+    invoke
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests"
+  ];
+
+  pythonImportsCheck = [
+    "pytest_relaxed"
+  ];
+
+  meta = with lib; {
+    homepage = "https://pytest-relaxed.readthedocs.io/";
+    description = "Relaxed test discovery/organization for pytest";
+    changelog = "https://github.com/bitprophet/pytest-relaxed/blob/${version}/docs/changelog.rst";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-remotedata/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-remotedata/default.nix
new file mode 100644
index 000000000000..bc8c89caacc1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-remotedata/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-remotedata";
+  version = "0.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-viHFWONNfBGw9q61CVbAlSC//NArf86cb46FMaQBocg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # These tests require a network connection
+    "tests/test_strict_check.py"
+  ];
+
+  pythonImportsCheck = [
+    "pytest_remotedata"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin for controlling remote data access";
+    homepage = "https://github.com/astropy/pytest-remotedata";
+    changelog = "https://github.com/astropy/pytest-remotedata/blob/v${version}/CHANGES.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-repeat/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-repeat/default.nix
new file mode 100644
index 000000000000..7db1992d5f85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-repeat/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-repeat";
+  version = "0.9.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-eWc0Ra6ZruMzuBHH0AN660CPkzuImDdf8vT/8eO6aGs=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytest_repeat"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin for repeating tests";
+    homepage = "https://github.com/pytest-dev/pytest-repeat";
+    changelog = "https://github.com/pytest-dev/pytest-repeat/blob/v${version}/CHANGES.rst";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-rerunfailures/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-rerunfailures/default.nix
new file mode 100644
index 000000000000..f030960df655
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-rerunfailures/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, setuptools
+, packaging
+, pytest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-rerunfailures";
+  version = "12.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-eE9GL6h/6b33gdACfYVrR6S/5sEq8Qj2vYhwV6kXtI4=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  buildInputs = [ pytest ];
+  propagatedBuildInputs = [ packaging ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Pytest plugin to re-run tests to eliminate flaky failures";
+    homepage = "https://github.com/pytest-dev/pytest-rerunfailures";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ das-g ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-resource-path/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-resource-path/default.nix
new file mode 100644
index 000000000000..f82e5a661e41
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-resource-path/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, colorama
+, pytest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-resource-path";
+  version = "1.3.0";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "yukihiko-shinoda";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1siv3pk4fsabz254fdzr7c0pxy124habnbw4ym66pfk883fr96g2";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "pytest-runner" ""
+  '';
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    colorama
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytest_resource_path"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin to provide path for uniform access to test resources";
+    homepage = "https://github.com/yukihiko-shinoda/pytest-resource-path";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-reverse/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-reverse/default.nix
new file mode 100644
index 000000000000..567b5b13683b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-reverse/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pytest
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-reverse";
+  version = "1.7.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "adamchainz";
+    repo = "pytest-reverse";
+    rev = version;
+    hash = "sha256-r0aSbUgArHQkpaXUvMT6oyOxEliQRtSGuDt4IILzhH4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  buildInputs = [ pytest ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "pytest_reverse" ];
+
+  meta = with lib; {
+    description = "Pytest plugin to reverse test order";
+    homepage = "https://github.com/adamchainz/pytest-reverse";
+    changelog = "https://github.com/adamchainz/pytest-reverse/blob/${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-runner/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-runner/default.nix
new file mode 100644
index 000000000000..ddea7f405bcf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-runner/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-runner";
+  version = "6.0.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-tNhTYu0ptMNIZ43nl99Djw8FCUl924xkcJbAKm2HtoU=";
+  };
+
+  postPatch = ''
+    rm pytest.ini
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+    pytest
+  ];
+
+  checkPhase = ''
+    py.test tests
+  '';
+
+  # Fixture not found
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Invoke py.test as distutils command with dependency resolution";
+    homepage = "https://github.com/pytest-dev/pytest-runner";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-server-fixtures/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-server-fixtures/default.nix
new file mode 100644
index 000000000000..7de68cadbb1e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-server-fixtures/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi
+, pytest, pytest-shutil, pytest-fixture-config, psutil
+, requests, future, retry }:
+
+buildPythonPackage rec {
+  pname = "pytest-server-fixtures";
+  version = "1.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "07vdv3y89qzv89ws0y48h92yplqsx208b9cizx80w644dazb398g";
+  };
+
+  buildInputs = [ pytest ];
+  propagatedBuildInputs = [ pytest-shutil pytest-fixture-config psutil requests future retry ];
+
+  # RuntimeError: Unable to find a free server number to start Xvfb
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Extensible server fixures for py.test";
+    homepage  = "https://github.com/manahl/pytest-plugins";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-services/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-services/default.nix
new file mode 100644
index 000000000000..41890215025c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-services/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, requests
+, psutil
+, pytest
+, setuptools-scm
+, toml
+, zc_lockfile
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-services";
+  version = "2.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2da740487d08ea63dfdf718f5d4ba11e590c99ddf5481549edebf7a3a42ca536";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+    toml
+  ];
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [
+    requests
+    psutil
+    zc_lockfile
+  ];
+
+  # no tests in PyPI tarball
+  doCheck = false;
+
+  pythonImportsCheck = [ "pytest_services" ];
+
+  meta = with lib; {
+    description = "Services plugin for pytest testing framework";
+    homepage = "https://github.com/pytest-dev/pytest-services";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-shutil/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-shutil/default.nix
new file mode 100644
index 000000000000..480c15b87c36
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-shutil/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, isPyPy
+, buildPythonPackage
+, fetchPypi
+
+# build
+, pytest
+
+# runtime
+, setuptools-git
+, mock
+, path
+, execnet
+, termcolor
+, six
+
+# tests
+, cmdline
+, pytestCheckHook
+ }:
+
+buildPythonPackage rec {
+  pname = "pytest-shutil";
+  version = "1.7.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2BZSYd5251CFBcNB2UwCsRPclj8nRUOrynTb+r0CEmE=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "contextlib2" 'contextlib2;python_version<"3"' \
+      --replace "path.py" "path"
+  '';
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    setuptools-git
+    mock
+    path
+    execnet
+    termcolor
+    six
+  ];
+
+  nativeCheckInputs = [
+    cmdline
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_pretty_formatter"
+  ] ++ lib.optionals isPyPy [
+    "test_run"
+    "test_run_integration"
+  ];
+
+  meta = with lib; {
+    description = "A goodie-bag of unix shell and environment tools for py.test";
+    homepage = "https://github.com/manahl/pytest-plugins";
+    maintainers = with maintainers; [ ryansydnor ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-snapshot/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-snapshot/default.nix
new file mode 100644
index 000000000000..7047eef03eef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-snapshot/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, packaging
+, pytest
+, setuptools-scm
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-snapshot";
+  version = "0.9.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "joseph-roitman";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-0PZu9wL29iEppLxxbl4D0E4WfOHe61KUUld003cRBRU=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytest_snapshot"
+  ];
+
+  meta = with lib; {
+    description = "A plugin to enable snapshot testing with pytest";
+    homepage = "https://github.com/joseph-roitman/pytest-snapshot/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-socket/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-socket/default.nix
new file mode 100644
index 000000000000..67ee191b85cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-socket/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest
+, pythonOlder
+, setuptoolsBuildHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-socket";
+  version = "0.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "miketheman";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-RPHpqknjpuAMXYg4nFOtLp8CXh10/w0RuO/bseTBN5o=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  # pytest-socket require network for majority of tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pytest_socket"
+  ];
+
+  meta = with lib; {
+    description = "Pytest Plugin to disable socket calls during tests";
+    homepage = "https://github.com/miketheman/pytest-socket";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-spec/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-spec/default.nix
new file mode 100644
index 000000000000..4a73084bd452
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-spec/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest
+, pytestCheckHook
+, pytest-describe
+, pytest-cov
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-spec";
+  version = "unstable-2023-06-04";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "pchomik";
+    repo = "pytest-spec";
+    rev = "e16e0550dd6bc557411e4312b7b42d53b26e69ef";
+    hash = "sha256-dyDUdZJU4E4y1yCzunAX2c48Qv6ogu0b60U/5YbJvIU=";
+  };
+
+  postPatch = ''
+    sed -i '/addopts/d' setup.cfg
+    # TODO: upstream
+    substituteInPlace pyproject.toml \
+        --replace "poetry>=0.12" "poetry-core" \
+        --replace "poetry.masonry.api" "poetry.core.masonry.api"
+  '';
+
+  nativeBuildInputs = [ poetry-core ];
+
+  buildInputs = [ pytest ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-describe
+  ];
+
+  pytestFlagsArray = [ "--spec" ];
+
+  pythonImportsCheck = [ "pytest_spec" ];
+
+  meta = {
+    description = "A pytest plugin to display test execution output like a SPECIFICATION";
+    homepage = "https://github.com/pchomik/pytest-spec";
+    license = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [ tomasajt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-subprocess/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-subprocess/default.nix
new file mode 100644
index 000000000000..d3ea76b8a1bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-subprocess/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytest
+, pytestCheckHook
+, docutils
+, pygments
+, pytest-rerunfailures
+, pytest-asyncio
+, anyio
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-subprocess";
+  version = "1.5.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "aklajnert";
+    repo = "pytest-subprocess";
+    rev = "refs/tags/${version}";
+    hash = "sha256-u9d9RhbikOyknMWs18j2efYJb9YdHsQrp31LfcbudoA=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    docutils
+    pygments
+    pytest-rerunfailures
+    pytest-asyncio
+    anyio
+  ];
+
+  meta = with lib; {
+    description = "A plugin to fake subprocess for pytest";
+    homepage = "https://github.com/aklajnert/pytest-subprocess";
+    changelog = "https://github.com/aklajnert/pytest-subprocess/blob/${version}/HISTORY.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-subtesthack/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-subtesthack/default.nix
new file mode 100644
index 000000000000..775b3cc55251
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-subtesthack/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, pytest }:
+
+buildPythonPackage rec {
+  pname = "pytest-subtesthack";
+  version = "0.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-67UEIDycAf3TedKvp0dofct7HtG+H8DD9Tmy3oEnYgA=";
+  };
+
+  buildInputs = [ pytest ];
+
+  # no upstream test
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Terrible plugin to set up and tear down fixtures within the test function itself";
+    homepage = "https://github.com/untitaker/pytest-subtesthack";
+    license = licenses.publicDomain;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-subtests/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-subtests/default.nix
new file mode 100644
index 000000000000..b391ece3556a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-subtests/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-subtests";
+  version = "0.11.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-UYZciEV1RfUftyARlC8KPGkB7p4ky/ttG53BNIuvvjc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytest_subtests"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin for unittest subTest() support and subtests fixture";
+    homepage = "https://github.com/pytest-dev/pytest-subtests";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-sugar/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-sugar/default.nix
new file mode 100644
index 000000000000..e916e0e00516
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-sugar/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, termcolor
+, pytest
+, packaging
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-sugar";
+  version = "0.9.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8edMGr+lX3JBz3CIAytuN4Vm8WuTjz8IkF4s9ElO3UY=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    termcolor
+    packaging
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A plugin that changes the default look and feel of pytest";
+    homepage = "https://github.com/Frozenball/pytest-sugar";
+    changelog = "https://github.com/Teemu/pytest-sugar/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-tap/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-tap/default.nix
new file mode 100644
index 000000000000..32b12ddcc236
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-tap/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytest
+, tappy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-tap";
+  version = "3.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "python-tap";
+    repo = "pytest-tap";
+    rev = "v${version}";
+    sha256 = "R0RSdKTyJYGq+x0+ut4pJEywTGNgGp/ps36ZaH5dyY4=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    tappy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Fixed in 4ed0138bf659c348b6dfb8bb701ae1989625d3d8 and hopefully in next release
+    "test_unittest_expected_failure"
+  ];
+
+  pythonImportsCheck = [
+    "pytest_tap"
+  ];
+
+  meta = with lib; {
+    description = "Test Anything Protocol (TAP) reporting plugin for pytest";
+    homepage = "https://github.com/python-tap/pytest-tap";
+    changelog = "https://github.com/python-tap/pytest-tap/blob/v${version}/docs/releases.rst";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ cynerd ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-test-utils/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-test-utils/default.nix
new file mode 100644
index 000000000000..cf2322d39a8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-test-utils/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, wheel
+, pytestCheckHook
+, pytest
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-test-utils";
+  version = "0.0.8";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "iterative";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-5gB+hnJR2+NQd/n7RGrX1bzfKt8Np7IbWw61SZgNVJY=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytest_test_utils"
+  ];
+
+  meta = with lib; {
+    description = "Pytest utilities for tests";
+    homepage = "https://github.com/iterative/pytest-test-utils";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-testinfra/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-testinfra/default.nix
new file mode 100644
index 000000000000..3f2cbf8d874a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-testinfra/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools-scm
+, ansible-core
+, paramiko
+, pytestCheckHook
+, pytest-xdist
+, pywinrm
+, salt
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-testinfra";
+  version = "10.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-L7fQGFRYqbpmn/FNDdvsizkAxr3j+2+tmwlzdM5Kt30=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    ansible-core
+    paramiko
+    pytestCheckHook
+    pytest-xdist
+    pywinrm
+    salt
+  ];
+
+  # markers don't get added when docker is not available (leads to warnings):
+  # https://github.com/pytest-dev/pytest-testinfra/blob/9.0.0/test/conftest.py#L223
+  preCheck = ''
+    export HOME=$(mktemp -d)
+    sed -i '54imarkers = \
+    \ttestinfra_hosts(host_selector): mark test to run on selected hosts \
+    \tdestructive: mark test as destructive \
+    \tskip_wsl: skip test on WSL, no systemd support' setup.cfg
+  '';
+
+  # docker is required for all disabled tests
+  disabledTests = [
+    # test/test_backends.py
+    "test_command"
+    "test_encoding"
+    "test_ansible_any_error_fatal"
+    "test_user_connection"
+    "test_sudo"
+    "test_docker_encoding"
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    # broken because salt package only built for python 3.11
+    "test_backend_importables"
+  ];
+
+  disabledTestPaths = [
+    "test/test_modules.py"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin for testing your infrastructure";
+    homepage = "https://github.com/pytest-dev/pytest-testinfra";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hulr ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-testmon/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-testmon/default.nix
new file mode 100644
index 000000000000..3c0b0ec629b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-testmon/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, coverage
+, fetchFromGitHub
+, poetry-core
+, pytest
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-testmon";
+  version = "2.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "tarpas";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-M4636yqzChRI37UdGPOZTjj8POLdrOoJtzmECtZZi4k=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    coverage
+  ];
+
+  # The project does not include tests since version 1.3.0
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "testmon"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plug-in which automatically selects and re-executes only tests affected by recent changes";
+    homepage = "https://github.com/tarpas/pytest-testmon/";
+    changelog = "https://github.com/tarpas/pytest-testmon/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dmvianna ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-timeout/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-timeout/default.nix
new file mode 100644
index 000000000000..9064b4283ba8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-timeout/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pytestCheckHook
+, pexpect
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-timeout";
+  version = "2.1.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wHygdATGEvirviIpSyPDaOLlEEtSHBeQGVVh834aw9k=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pexpect
+  ];
+
+  disabledTests = [
+    "test_suppresses_timeout_when_pdb_is_entered"
+    # Remove until https://github.com/pytest-dev/pytest/pull/7207 or similar
+    "test_suppresses_timeout_when_debugger_is_entered"
+  ];
+
+  pytestFlagsArray = [
+    "-ra"
+  ];
+
+  pythonImportsCheck = [
+    "pytest_timeout"
+  ];
+
+  meta = with lib; {
+    description = "Pytest plugin to abort hanging tests";
+    homepage = "https://github.com/pytest-dev/pytest-timeout/";
+    changelog = "https://github.com/pytest-dev/pytest-timeout/#changelog";
+    license = licenses.mit;
+    maintainers = with maintainers; [ makefu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-tornado/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-tornado/default.nix
new file mode 100644
index 000000000000..b1e46802b450
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-tornado/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, pytest
+, tornado
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-tornado";
+  version = "0.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1cgisd7lb9q2hf55558cbn5jfhv65vsgk46ykgidzf9kqcq1kymr";
+  };
+
+  # package has no tests
+  doCheck = false;
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [ tornado ];
+
+  meta = with lib; {
+    description = "A py.test plugin providing fixtures and markers to simplify testing of asynchronous tornado applications.";
+    homepage =  "https://github.com/eugeniy/pytest-tornado";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-tornasync/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-tornasync/default.nix
new file mode 100644
index 000000000000..9fca8d860262
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-tornasync/default.nix
@@ -0,0 +1,41 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy27
+, pytest, tornado }:
+
+buildPythonPackage rec {
+  pname = "pytest-tornasync";
+  version = "0.6.0.post2";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "eukaryote";
+    repo = pname;
+    # upstream does not keep git tags in sync with pypy releases
+    # https://github.com/eukaryote/pytest-tornasync/issues/9
+    rev = "c5f013f1f727f1ca1fcf8cc748bba7f4a2d79e56";
+    sha256 = "04cg1cfrr55dbi8nljkpcsc103i5c6p0nr46vjr0bnxgkxx03x36";
+  };
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [
+    tornado
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytest
+    tornado
+  ];
+
+  checkPhase = ''
+    pytest test
+  '';
+
+  meta = with lib; {
+    description = "py.test plugin for testing Python 3.5+ Tornado code";
+    homepage = "https://github.com/eukaryote/pytest-tornasync";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-trio/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-trio/default.nix
new file mode 100644
index 000000000000..872e9dc8fc0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-trio/default.nix
@@ -0,0 +1,44 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder
+, trio, async-generator, hypothesis, outcome, pytest }:
+
+buildPythonPackage rec {
+  pname = "pytest-trio";
+  version = "0.8.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "python-trio";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-gUH35Yk/pBD2EdCEt8D0XQKWU8BwmX5xtAW10qRhoYk=";
+  };
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [
+    trio
+    async-generator
+    outcome
+  ];
+
+  nativeCheckInputs = [
+    pytest
+    hypothesis
+  ];
+
+  # broken with pytest 5 and 6
+  doCheck = false;
+  checkPhase = ''
+    rm pytest.ini
+    PYTHONPATH=$PWD:$PYTHONPATH pytest
+  '';
+
+  pythonImportsCheck = [ "pytest_trio" ];
+
+  meta = with lib; {
+    description = "Pytest plugin for trio";
+    homepage = "https://github.com/python-trio/pytest-trio";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-twisted/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-twisted/default.nix
new file mode 100644
index 000000000000..198d21083e27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-twisted/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, greenlet
+, pytest
+, decorator
+, twisted
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-twisted";
+  version = "1.14.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-IJv1pkUs+/th3o8BWQLBTsgSZACRFQcHS7LuTOjf4xM=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    decorator
+    greenlet
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    twisted
+  ];
+
+  pythonImportsCheck = [
+    "pytest_twisted"
+  ];
+
+  meta = with lib; {
+    description = "A twisted plugin for py.test";
+    homepage = "https://github.com/pytest-dev/pytest-twisted";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-unordered/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-unordered/default.nix
new file mode 100644
index 000000000000..b47536983e6a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-unordered/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-unordered";
+  version = "0.5.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "utapyngo";
+    repo = "pytest-unordered";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-51UJjnGBO7qBvQlY8F0B29n8+EO2aa3DF3WOwcjZzSo=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytest_unordered"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/utapyngo/pytest-unordered/blob/v${version}/CHANGELOG.md";
+    description = "Test equality of unordered collections in pytest";
+    homepage = "https://github.com/utapyngo/pytest-unordered";
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-vcr/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-vcr/default.nix
new file mode 100644
index 000000000000..3887261ba5b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-vcr/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, vcrpy
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-vcr";
+  version = "1.0.2";
+
+  src = fetchFromGitHub {
+    owner = "ktosiek";
+    repo = pname;
+    rev = version;
+    sha256 = "1i6fin91mklvbi8jzfiswvwf1m91f43smpj36a17xrzk4gisfs6i";
+  };
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [
+    vcrpy
+   ];
+
+  # Tests are using an obsolete attribute 'config'
+  # https://github.com/ktosiek/pytest-vcr/issues/43
+  doCheck = false;
+  pythonImportsCheck = [ "pytest_vcr" ];
+
+  meta = with lib; {
+    description = "Integration VCR.py into pytest";
+    homepage = "https://github.com/ktosiek/pytest-vcr";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-virtualenv/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-virtualenv/default.nix
new file mode 100644
index 000000000000..0feb637f4b50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-virtualenv/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi
+, pytest, pytest-cov, mock, cmdline, pytest-fixture-config, pytest-shutil, virtualenv }:
+
+buildPythonPackage rec {
+  pname = "pytest-virtualenv";
+  version = "1.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "03w2zz3crblj1p6i8nq17946hbn3zqp9z7cfnifw47hi4a4fww12";
+  };
+
+  nativeCheckInputs = [ pytest pytest-cov mock cmdline ];
+  propagatedBuildInputs = [ pytest-fixture-config pytest-shutil virtualenv ];
+  checkPhase = "py.test tests/unit ";
+
+  nativeBuildInputs = [ pytest ];
+
+  meta = with lib; {
+    description = "Create a Python virtual environment in your test that cleans up on teardown. The fixture has utility methods to install packages and list what’s installed.";
+    homepage = "https://github.com/manahl/pytest-plugins";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ryansydnor ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-voluptuous/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-voluptuous/default.nix
new file mode 100644
index 000000000000..ce1081e5febf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-voluptuous/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, pytestCheckHook
+, pythonOlder
+, six
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-voluptuous";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "F-Secure";
+    repo = "pytest-voluptuous";
+    rev = "refs/tags/${version}";
+    hash = "sha256-xdj4qCSSJQI9Rb1WyUYrAg1I5wQ5o6IJyIjJAafP/LY=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    voluptuous
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    six
+  ];
+
+  pythonImportsCheck = [
+    "pytest_voluptuous"
+  ];
+
+  pytestFlagsArray = [
+    "tests/test_plugin.py"
+  ];
+
+  meta = with lib; {
+    description = "A pytest plugin for asserting data against voluptuous schema";
+    homepage = "https://github.com/F-Secure/pytest-voluptuous";
+    changelog = "https://github.com/F-Secure/pytest-voluptuous/blob/${version}/CHANGELOG.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-warnings/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-warnings/default.nix
new file mode 100644
index 000000000000..d088bde8b0c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-warnings/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi, pytest }:
+
+buildPythonPackage rec {
+  pname = "pytest-warnings";
+  version = "0.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5939f76fe04ad18297e53af0c9fb38aca1ec74db807bd40ad72733603adbbc7d";
+  };
+
+  buildInputs = [ pytest ];
+
+  meta = {
+    description = "Plugin to list Python warnings in pytest report";
+    homepage = "https://github.com/fschulze/pytest-warnings";
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-watch/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-watch/default.nix
new file mode 100644
index 000000000000..077b3eca6bfa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-watch/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, docopt
+, colorama
+, pytest
+, watchdog
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-watch";
+  version = "4.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "06136f03d5b361718b8d0d234042f7b2f203910d8568f63df2f866b547b3d4b9";
+  };
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [ colorama docopt watchdog ];
+
+  # No Tests
+  doCheck = false;
+  pythonImportsCheck = [ "pytest_watch" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/joeyespo/pytest-watch";
+    description = "Local continuous test runner with pytest and watchdog";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dmvianna ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-xdist/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-xdist/default.nix
new file mode 100644
index 000000000000..5c260f432161
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-xdist/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools-scm
+, pytestCheckHook
+, filelock
+, execnet
+, pytest
+, psutil
+, setproctitle
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-xdist";
+  version = "3.3.1";
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-1e4FIOsbe8ylCmClGKt6dweZKBLFeBmPi0T9+seOjJM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    execnet
+  ];
+
+  nativeCheckInputs = [
+    filelock
+    pytestCheckHook
+  ];
+
+  passthru.optional-dependencies = {
+    psutil = [ psutil ];
+    setproctitle = [ setproctitle ];
+  };
+
+  pytestFlagsArray = [
+    # pytest can already use xdist at this point
+    "--numprocesses=$NIX_BUILD_CORES"
+  ];
+
+  # access file system
+  disabledTests = [
+    "test_distribution_rsyncdirs_example"
+    "test_rsync_popen_with_path"
+    "test_popen_rsync_subdir"
+    "test_rsync_report"
+    "test_init_rsync_roots"
+    "test_rsyncignore"
+    # flakey
+    "test_internal_errors_propagate_to_controller"
+  ];
+
+  setupHook = ./setup-hook.sh;
+
+  meta = with lib; {
+    changelog = "https://github.com/pytest-dev/pytest-xdist/blob/v${version}/CHANGELOG.rst";
+    description = "Pytest xdist plugin for distributed testing and loop-on-failing modes";
+    homepage = "https://github.com/pytest-dev/pytest-xdist";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-xdist/setup-hook.sh b/nixpkgs/pkgs/development/python-modules/pytest-xdist/setup-hook.sh
new file mode 100644
index 000000000000..4c6473cea64d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-xdist/setup-hook.sh
@@ -0,0 +1,17 @@
+pytestXdistHook() {
+    pytestFlagsArray+=(
+        "--numprocesses=$NIX_BUILD_CORES"
+    )
+}
+
+# the flags should be added before pytestCheckHook runs so
+# until we have dependency mechanism in generic builder, we need to use this ugly hack.
+
+if [ -z "${dontUsePytestXdist-}" ] && [ -z "${dontUsePytestCheck-}" ]; then
+    if [[ " ${preDistPhases:-} " =~ " pytestCheckPhase " ]]; then
+        preDistPhases+=" "
+        preDistPhases="${preDistPhases/ pytestCheckPhase / pytestXdistHook pytestCheckPhase }"
+    else
+        preDistPhases+=" pytestXdistHook"
+    fi
+fi
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-xprocess/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-xprocess/default.nix
new file mode 100644
index 000000000000..734acd5f8f4e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-xprocess/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, psutil
+, py
+, pytest
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-xprocess";
+  version = "0.22.2";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WZ7iW5OOjyWeGNnFtNY4SIT4pqKMpR7tMtDZUmvc93w=";
+  };
+
+  postPatch = ''
+    # Remove test QoL package from install_requires
+    substituteInPlace setup.py \
+      --replace "'pytest-cache', " ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    psutil
+    py
+  ];
+
+  # There's no tests in repo
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Pytest external process plugin";
+    homepage = "https://github.com/pytest-dev";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest-xvfb/default.nix b/nixpkgs/pkgs/development/python-modules/pytest-xvfb/default.nix
new file mode 100644
index 000000000000..0b555274c90a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest-xvfb/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pyvirtualdisplay
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-xvfb";
+  version = "3.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-N0arH00RWfA/dRY40FNonM0oQpGzi4+wPT67579pz8A=";
+  };
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    pyvirtualdisplay
+  ];
+
+  meta = with lib; {
+    description = "A pytest plugin to run Xvfb for tests";
+    homepage = "https://github.com/The-Compiler/pytest-xvfb";
+    changelog = "https://github.com/The-Compiler/pytest-xvfb/blob/v${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest/default.nix b/nixpkgs/pkgs/development/python-modules/pytest/default.nix
new file mode 100644
index 000000000000..a00b59c425b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest/default.nix
@@ -0,0 +1,93 @@
+{ lib
+, buildPythonPackage
+, callPackage
+, pythonOlder
+, fetchPypi
+, writeText
+
+# build
+, setuptools
+, setuptools-scm
+
+# propagates
+, attrs
+, exceptiongroup
+, iniconfig
+, packaging
+, pluggy
+, py
+, tomli
+}:
+
+buildPythonPackage rec {
+  pname = "pytest";
+  version = "7.4.3";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2YnRNpgt5OOynavMg4rVgcZOjtUsEfvobd69naCBjNU=";
+  };
+
+  outputs = [
+    "out"
+    "testout"
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    iniconfig
+    packaging
+    pluggy
+    py
+    tomli
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    exceptiongroup
+  ];
+
+  postInstall = ''
+    mkdir $testout
+    cp -R testing $testout/testing
+  '';
+
+  doCheck = false;
+  passthru.tests.pytest = callPackage ./tests.nix { };
+
+  # Remove .pytest_cache when using py.test in a Nix build
+  setupHook = writeText "pytest-hook" ''
+    pytestcachePhase() {
+        find $out -name .pytest_cache -type d -exec rm -rf {} +
+    }
+    preDistPhases+=" pytestcachePhase"
+
+    # pytest generates it's own bytecode files to improve assertion messages.
+    # These files similar to cpython's bytecode files but are never laoded
+    # by python interpreter directly. We remove them for a few reasons:
+    # - files are non-deterministic: https://github.com/NixOS/nixpkgs/issues/139292
+    #   (file headers are generatedt by pytest directly and contain timestamps)
+    # - files are not needed after tests are finished
+    pytestRemoveBytecodePhase () {
+        # suffix is defined at:
+        #    https://github.com/pytest-dev/pytest/blob/7.2.1/src/_pytest/assertion/rewrite.py#L51-L53
+        find $out -name "*-pytest-*.py[co]" -delete
+    }
+    preDistPhases+=" pytestRemoveBytecodePhase"
+  '';
+
+  pythonImportsCheck = [
+    "pytest"
+  ];
+
+  meta = with lib; {
+    description = "Framework for writing tests";
+    homepage = "https://docs.pytest.org";
+    changelog = "https://github.com/pytest-dev/pytest/releases/tag/${version}";
+    maintainers = with maintainers; [ domenkozar lovek323 madjar lsix ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytest/tests.nix b/nixpkgs/pkgs/development/python-modules/pytest/tests.nix
new file mode 100644
index 000000000000..3fc078148b20
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytest/tests.nix
@@ -0,0 +1,40 @@
+{ buildPythonPackage
+, isPyPy
+, pytest
+, hypothesis
+, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "pytest-tests";
+  inherit (pytest) version;
+
+  src = pytest.testout;
+
+  dontBuild = true;
+  dontInstall = true;
+
+  nativeCheckInputs = [
+    hypothesis
+    pygments
+  ];
+
+  doCheck = !isPyPy; # https://github.com/pytest-dev/pytest/issues/3460
+
+  # Ignored file https://github.com/pytest-dev/pytest/pull/5605#issuecomment-522243929
+  # test_missing_required_plugins will emit deprecation warning which is treated as error
+  checkPhase = ''
+    runHook preCheck
+    ${pytest.out}/bin/py.test -x testing/ \
+      --ignore=testing/test_junitxml.py \
+      --ignore=testing/test_argcomplete.py \
+      -k "not test_collect_pyargs_with_testpaths and not test_missing_required_plugins"
+
+    # tests leave behind unreproducible pytest binaries in the output directory, remove:
+    find $out/lib -name "*-pytest-${version}.pyc" -delete
+    # specifically testing/test_assertion.py and testing/test_assertrewrite.py leave behind those:
+    find $out/lib -name "*opt-2.pyc" -delete
+
+    runHook postCheck
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytestcache/default.nix b/nixpkgs/pkgs/development/python-modules/pytestcache/default.nix
new file mode 100644
index 000000000000..cf8643db06d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytestcache/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi
+, pytest, execnet }:
+
+buildPythonPackage rec {
+  pname = "pytest-cache";
+  version = "1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1a873fihw4rhshc722j4h6j7g3nj7xpgsna9hhg3zn6ksknnhx5y";
+  };
+
+  buildInputs = [ pytest ];
+  propagatedBuildInputs = [ execnet ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  # Too many failing tests. Are they maintained?
+  doCheck = false;
+
+  meta = with lib; {
+    license = licenses.mit;
+    homepage = "https://pypi.python.org/pypi/pytest-cache/";
+    description = "pytest plugin with mechanisms for caching across test runs";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-arango/default.nix b/nixpkgs/pkgs/development/python-modules/python-arango/default.nix
new file mode 100644
index 000000000000..2949b8b7ea9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-arango/default.nix
@@ -0,0 +1,163 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+
+# build-system
+, setuptools
+, setuptools-scm
+
+# dependencies
+, urllib3
+, requests
+, requests-toolbelt
+, pyjwt
+, importlib-metadata
+, packaging
+
+# tests
+, arangodb
+, mock
+}:
+
+let
+  testDBOpts = {
+    host = "127.0.0.1";
+    port = "8529";
+    password = "test";
+    secret = "secret";
+  };
+in
+
+buildPythonPackage rec {
+  pname = "python-arango";
+  version = "7.8.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ArangoDB-Community";
+    repo = "python-arango";
+    rev = "refs/tags/${version}";
+    hash = "sha256-lZ+9l1kPE/Piw1QLYW+qjFQmTtZd4m/kDOTOxkTsla0=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    importlib-metadata
+    requests
+    requests-toolbelt
+    packaging
+    pyjwt
+    setuptools
+    urllib3
+  ];
+
+  nativeCheckInputs = [
+    arangodb
+    mock
+    pytestCheckHook
+  ];
+
+  # arangodb is compiled only for particular target architectures
+  # (i.e. "haswell"). Thus, these tests may not pass reproducibly,
+  # failing with: `166: Illegal instruction` if not run on arangodb's
+  # specified architecture.
+  #
+  # nonetheless, the client library should remain in nixpkgs - since
+  # the client library will talk to arangodb across the network and
+  # architecture issues will be irrelevant.
+  doCheck = false;
+
+  preCheck = lib.optionalString doCheck ''
+    # Start test DB
+    mkdir -p .nix-test/{data,work}
+
+    ICU_DATA=${arangodb}/share/arangodb3 \
+    GLIBCXX_FORCE_NEW=1 \
+    TZ=UTC \
+    TZ_DATA=${arangodb}/share/arangodb3/tzdata \
+    ARANGO_ROOT_PASSWORD=${testDBOpts.password} \
+    ${arangodb}/bin/arangod \
+      --server.uid=$(id -u) \
+      --server.gid=$(id -g) \
+      --server.authentication=true \
+      --server.endpoint=http+tcp://${testDBOpts.host}:${testDBOpts.port} \
+      --server.descriptors-minimum=4096 \
+      --server.jwt-secret=${testDBOpts.secret} \
+      --javascript.app-path=.nix-test/app \
+      --log.file=.nix-test/log \
+      --database.directory=.nix-test/data \
+      --foxx.api=false &
+  '';
+
+  pytestFlagsArray = [
+    "--host"
+    testDBOpts.host
+    "--port"
+    testDBOpts.port
+    "--passwd"
+    testDBOpts.password
+    "--secret"
+    testDBOpts.secret
+  ];
+
+  disabledTests = [
+    # AssertionError geo-related - try enabling later
+    "test_document_find_in_box"
+
+    # maybe arangod misconfig - try enabling later
+    # arango.exceptions.JWTAuthError: [HTTP 401][ERR 401] Wrong credentials
+    "test_auth_jwt"
+
+    # ValueError - try enabling later
+    # maybe missed 3.9.3->3.10.0 changes
+    # most caused by key change: isNewlyCreated->new
+    "test_add_hash_index"
+    "test_add_skiplist_index"
+    "test_add_persistent_index"
+    "test_add_ttl_index"
+    "test_delete_index"
+    "test_pregel_management"
+
+    # formatting error - try enabling later
+    # maybe missed 3.9.3->3.10.0 changes
+    # caused by: body["computedValues"] = None
+    "test_permission_management"
+    "test_collection_misc_methods"
+    "test_collection_management"
+    "test_replication_inventory"
+
+    # want outgoing network to update foxx apis
+    # so foxx.api disabled in arangod startup
+    "test_foxx_service_management_file"
+    "test_foxx_service_management_json"
+    "test_foxx_config_management"
+    "test_foxx_dependency_management"
+    "test_foxx_development_toggle"
+    "test_foxx_misc_functions"
+
+    # no replication configured via arangod invocation
+    "test_replication_applier"
+  ];
+
+  pythonImportsCheck = [
+    "arango"
+  ];
+
+  meta = with lib; {
+    description = "Python Driver for ArangoDB";
+    homepage = "https://github.com/ArangoDB-Community/python-arango";
+    changelog = "https://github.com/ArangoDB-Community/python-arango/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jsoo1 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-awair/default.nix b/nixpkgs/pkgs/development/python-modules/python-awair/default.nix
new file mode 100644
index 000000000000..fb65b6f848bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-awair/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, voluptuous
+, vcrpy
+}:
+
+buildPythonPackage rec {
+  pname = "python-awair";
+  version = "0.2.4";
+  format = "pyproject";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ahayworth";
+    repo = "python_awair";
+    rev = version;
+    hash = "sha256-zdZyA6adM4bfEYupdZl7CzMjwyfRkQBrntNh0MusynE=";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    voluptuous
+  ];
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytestCheckHook
+    vcrpy
+  ];
+
+  pythonImportsCheck = [ "python_awair" ];
+
+  meta = with lib; {
+    description = "Python library for the Awair API";
+    homepage = "https://github.com/ahayworth/python_awair";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-axolotl-curve25519/default.nix b/nixpkgs/pkgs/development/python-modules/python-axolotl-curve25519/default.nix
new file mode 100644
index 000000000000..1bd44dc3fc7c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-axolotl-curve25519/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "python-axolotl-curve25519";
+  version = "0.4.1.post2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0705a66297ebd2f508a60dc94e22881c754301eb81db93963322f6b3bdcb63a3";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/tgalal/python-axolotl-curve25519";
+    description = "Curve25519 with ed25519 signatures";
+    maintainers = with maintainers; [ abbradar ];
+    license = licenses.gpl3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-axolotl/default.nix b/nixpkgs/pkgs/development/python-modules/python-axolotl/default.nix
new file mode 100644
index 000000000000..3b55811f4e47
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-axolotl/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, cryptography, python-axolotl-curve25519, protobuf }:
+
+buildPythonPackage rec {
+  pname = "python-axolotl";
+  version = "0.2.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1bwdp24fmriffwx91aigs9k162albb51iskp23nc939z893q23py";
+  };
+
+  propagatedBuildInputs = [ cryptography python-axolotl-curve25519 protobuf ];
+
+  meta = with lib; {
+    homepage = "https://github.com/tgalal/python-axolotl";
+    description = "Python port of libaxolotl-android";
+    maintainers = with maintainers; [ abbradar ];
+    license = licenses.gpl3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-barcode/default.nix b/nixpkgs/pkgs/development/python-modules/python-barcode/default.nix
new file mode 100644
index 000000000000..1e56b59c1fd4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-barcode/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools-scm
+, pillow
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-barcode";
+  version = "0.15.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Oxgl+9sR5ZdGbf9ChrTqmx6GpXcXtZ5WOuZ5cm/IVN4=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools-scm
+  ];
+
+  passthru.optional-dependencies = {
+    images = [
+      pillow
+    ];
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=barcode" "" \
+      --replace "--cov-report=term-missing:skip-covered" "" \
+      --replace "--no-cov-on-fail" ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.images;
+
+  pythonImportsCheck = [ "barcode" ];
+
+  meta = with lib; {
+    description = "Create standard barcodes with Python";
+    homepage = "https://github.com/WhyNotHugo/python-barcode";
+    changelog = "https://github.com/WhyNotHugo/python-barcode/blob/v${version}/docs/changelog.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-baseconv/default.nix b/nixpkgs/pkgs/development/python-modules/python-baseconv/default.nix
new file mode 100644
index 000000000000..f9ac014919c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-baseconv/default.nix
@@ -0,0 +1,22 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+}:
+buildPythonPackage rec {
+  pname = "python-baseconv";
+  version = "1.2.2";
+
+  src = fetchPypi {
+    inherit pname version ;
+    sha256 = "0539f8bd0464013b05ad62e0a1673f0ac9086c76b43ebf9f833053527cd9931b";
+  };
+
+  pythonImportsCheck = [ "baseconv" ];
+
+  meta = with lib; {
+    description = "Python module to convert numbers from base 10 integers to base X strings and back again";
+    homepage = "https://github.com/semente/python-baseconv";
+    license = licenses.psfl;
+    maintainers = with maintainers; [ rakesh4g ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-benedict/default.nix b/nixpkgs/pkgs/development/python-modules/python-benedict/default.nix
new file mode 100644
index 000000000000..b100ba2292c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-benedict/default.nix
@@ -0,0 +1,94 @@
+{ lib
+, boto3
+, buildPythonPackage
+, fetchFromGitHub
+, ftfy
+, mailchecker
+, openpyxl
+, orjson
+, phonenumbers
+, pytestCheckHook
+, python-dateutil
+, python-decouple
+, python-fsutil
+, python-slugify
+, pythonOlder
+, pythonRelaxDepsHook
+, pyyaml
+, requests
+, six
+, toml
+, xlrd
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "python-benedict";
+  version = "0.32.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "fabiocaccamo";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-q9EIOMmUcttL1ohxQD+SkZTxKv8PwdN29+ez2xB7rvM=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    "boto3"
+  ];
+
+  propagatedBuildInputs = [
+    boto3
+    ftfy
+    mailchecker
+    openpyxl
+    phonenumbers
+    python-dateutil
+    python-fsutil
+    python-slugify
+    pyyaml
+    requests
+    toml
+    xlrd
+    xmltodict
+  ];
+
+  nativeCheckInputs = [
+    orjson
+    pytestCheckHook
+    python-decouple
+    six
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_from_base64_with_valid_url_valid_content"
+    "test_from_json_with_valid_url_valid_content"
+    "test_from_pickle_with_valid_url_valid_content"
+    "test_from_plist_with_valid_url_valid_content"
+    "test_from_query_string_with_valid_url_valid_content"
+    "test_from_toml_with_valid_url_valid_content"
+    "test_from_xls_with_valid_url_valid_content"
+    "test_from_xml_with_valid_url_valid_content"
+    "test_from_yaml_with_valid_url_valid_content"
+  ];
+
+  pythonImportsCheck = [
+    "benedict"
+  ];
+
+  meta = with lib; {
+    description = "Module with keylist/keypath support";
+    homepage = "https://github.com/fabiocaccamo/python-benedict";
+    changelog = "https://github.com/fabiocaccamo/python-benedict/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-bidi/default.nix b/nixpkgs/pkgs/development/python-modules/python-bidi/default.nix
new file mode 100644
index 000000000000..1a4a5d5b77cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-bidi/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, six }:
+
+buildPythonPackage rec {
+  pname = "python-bidi";
+  version = "0.4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "U0f3HoKz6Zdtxlfwne0r/jm6jWd3yoGlssVsMBIcSW4=";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  meta = with lib; {
+    homepage = "https://github.com/MeirKriheli/python-bidi";
+    description = "Pure python implementation of the BiDi layout algorithm";
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ freezeboy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-binance/default.nix b/nixpkgs/pkgs/development/python-modules/python-binance/default.nix
new file mode 100644
index 000000000000..59a36e776094
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-binance/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, dateparser
+, fetchFromGitHub
+, fetchpatch
+, pycryptodome
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+, six
+, ujson
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "python-binance";
+  version = "1.0.17";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "sammchardy";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-e88INUEkjOSVOD0KSs9LmstuQ7dQZdJk8K6VqFEusww=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "fix-unable-to-determine-version-error.patch";
+      url = "https://github.com/sammchardy/python-binance/commit/1b9dd4853cafccf6cdacc13bb64a18632a79a6f1.patch";
+      hash = "sha256-6KRHm2cZRcdD6qMdRAwlea4qLZ1/1YFzZAQ7Ph4XMCs=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    dateparser
+    requests
+    pycryptodome
+    six
+    ujson
+    websockets
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests-mock
+  ];
+
+  disabledTestPaths = [
+    # Tests require network access
+    "tests/test_api_request.py"
+    "tests/test_historical_klines.py"
+  ];
+
+  pythonImportsCheck = [
+    "binance"
+  ];
+
+  meta = with lib; {
+    description = "Binance Exchange API python implementation for automated trading";
+    homepage = "https://github.com/sammchardy/python-binance";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bhipple ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-box/default.nix b/nixpkgs/pkgs/development/python-modules/python-box/default.nix
new file mode 100644
index 000000000000..3145debc745c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-box/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, buildPythonPackage
+, cython_3
+, fetchFromGitHub
+, msgpack
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, ruamel-yaml
+, setuptools
+, toml
+, tomli
+, tomli-w
+}:
+
+buildPythonPackage rec {
+  pname = "python-box";
+  version = "7.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "cdgriffith";
+    repo = "Box";
+    rev = "refs/tags/${version}";
+    hash = "sha256-oxT2y3um6BZ3bwYa+LWBoTgU+9b+V7XtQdCdECU3Gu0=";
+  };
+
+  nativeBuildInputs = [
+    cython_3
+    setuptools
+  ];
+
+  passthru.optional-dependencies = {
+    all = [
+      msgpack
+      ruamel-yaml
+      toml
+    ];
+    yaml = [
+      ruamel-yaml
+    ];
+    ruamel-yaml = [
+      ruamel-yaml
+    ];
+    PyYAML = [
+      pyyaml
+    ];
+    tomli = [
+      tomli-w
+    ] ++ lib.optionals (pythonOlder "3.11") [
+      tomli
+    ];
+    toml = [
+      toml
+    ];
+    msgpack = [
+      msgpack
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.all;
+
+  pythonImportsCheck = [
+    "box"
+  ];
+
+  meta = with lib; {
+    description = "Python dictionaries with advanced dot notation access";
+    homepage = "https://github.com/cdgriffith/Box";
+    changelog = "https://github.com/cdgriffith/Box/blob/${version}/CHANGES.rst";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-bsblan/default.nix b/nixpkgs/pkgs/development/python-modules/python-bsblan/default.nix
new file mode 100644
index 000000000000..2ffc8ed0b7f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-bsblan/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, aiohttp
+, aresponses
+, backoff
+, buildPythonPackage
+, fetchFromGitHub
+, packaging
+, poetry-core
+, pydantic
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "python-bsblan";
+  version = "0.5.16";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "liudger";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-m80lnNd1ANddV0d/w3S7+QWzIPRklDZsWMO2g1hgEoQ=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'version = "0.0.0"' 'version = "${version}"' \
+      --replace "--cov" ""
+    sed -i "/covdefaults/d" pyproject.toml
+    sed -i "/ruff/d" pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    backoff
+    packaging
+    pydantic
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "bsblan"
+  ];
+
+  meta = with lib; {
+    description = "Module to control and monitor an BSBLan device programmatically";
+    homepage = "https://github.com/liudger/python-bsblan";
+    changelog = "https://github.com/liudger/python-bsblan/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-cinderclient/default.nix b/nixpkgs/pkgs/development/python-modules/python-cinderclient/default.nix
new file mode 100644
index 000000000000..6473cb660086
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-cinderclient/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ddt
+, keystoneauth1
+, oslo-i18n
+, oslo-serialization
+, oslo-utils
+, pbr
+, requests
+, prettytable
+, requests-mock
+, simplejson
+, stestr
+, stevedore
+}:
+
+buildPythonPackage rec {
+  pname = "python-cinderclient";
+  version = "9.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-pT5kcKUWYntZ0iUFIioMhXlL4afyd06HeWEFvUfulpU=";
+  };
+
+  propagatedBuildInputs = [
+    simplejson
+    keystoneauth1
+    oslo-i18n
+    oslo-utils
+    pbr
+    prettytable
+    requests
+    stevedore
+  ];
+
+  nativeCheckInputs = [
+    ddt
+    oslo-serialization
+    requests-mock
+    stestr
+  ];
+
+  checkPhase = ''
+    stestr run
+  '';
+
+  pythonImportsCheck = [ "cinderclient" ];
+
+  meta = with lib; {
+    description = "OpenStack Block Storage API Client Library";
+    homepage = "https://github.com/openstack/python-cinderclient";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-codon-tables/default.nix b/nixpkgs/pkgs/development/python-modules/python-codon-tables/default.nix
new file mode 100644
index 000000000000..a3a5397c96c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-codon-tables/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "python-codon-tables";
+  version = "0.1.12";
+
+  src = fetchPypi {
+    pname = "python_codon_tables";
+    inherit version;
+    hash = "sha256-pzPoR55nU8ObPv1iIE52qpqD5xGdYLm1uG3nCD6I46Y=";
+  };
+
+  # no tests in tarball
+  doCheck = false;
+
+  pythonImportsCheck = [ "python_codon_tables" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Edinburgh-Genome-Foundry/codon-usage-tables";
+    description = "Codon Usage Tables for Python, from kazusa.or.jp";
+    license = licenses.mit;
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-constraint/default.nix b/nixpkgs/pkgs/development/python-modules/python-constraint/default.nix
new file mode 100644
index 000000000000..d26d7e91c96c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-constraint/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+  # Check inputs
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-constraint";
+  version = "1.4.0";
+
+  src = fetchFromGitHub {
+    owner = "python-constraint";
+    repo = "python-constraint";
+    rev = version;
+    sha256 = "1dv11406yxmmgkkhwzqicajbg2bmla5xfad7lv57zyahxz8jzz94";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  dontUseSetuptoolsCheck = true;
+
+  meta = with lib; {
+    description = "Constraint Solving Problem resolver for Python.";
+    homepage = "https://labix.org/doc/constraint/";
+    downloadPage = "https://github.com/python-constraint/python-constraint/releases";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-creole/default.nix b/nixpkgs/pkgs/development/python-modules/python-creole/default.nix
new file mode 100644
index 000000000000..52d13d452aff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-creole/default.nix
@@ -0,0 +1,96 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, runtimeShell
+
+# build
+, poetry-core
+
+# propagates
+, docutils
+
+# tests
+, pytestCheckHook
+, readme_renderer
+, textile
+}:
+
+buildPythonPackage rec {
+  pname = "python-creole";
+  version = "1.4.10";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "jedie";
+    repo = "python-creole";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-8pXOnLNjhIv0d+BqjW8wlb6BT6CmFHSsxn5wLOv3LBQ=";
+  };
+
+  patches = [
+    # https://github.com/jedie/python-creole/pull/77
+    (fetchpatch {
+      name = "replace-poetry-with-poetry-core.patch";
+      url = "https://github.com/jedie/python-creole/commit/bfc46730ab4a189f3142246cead8d26005a28671.patch";
+      hash = "sha256-WtoEQyu/154Cfj6eSnNA+t37+o7Ij328QGMKxwcLg5k=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  postPatch = ''
+    substituteInPlace Makefile \
+      --replace "/bin/bash" "${runtimeShell}"
+
+    sed -i "/-cov/d" pytest.ini
+  '';
+
+  propagatedBuildInputs = [
+    docutils
+  ];
+
+  pythonImportsCheck = [
+    "creole"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    readme_renderer
+    textile
+  ];
+
+  preCheck = ''
+    export PATH=$out/bin:$PATH
+  '';
+
+  disabledTests = [
+    # macro didn't expect argument
+    "test_macro_wrong_arguments_quite"
+    "test_macro_wrong_arguments_with_error_report"
+    # rendering mismatches, likely docutils version mismatch
+    "test_headlines1"
+    "test_simple_table"
+  ];
+
+  disabledTestPaths = [
+    # requires poetry
+    "creole/tests/test_Makefile.py"
+    # requires poetry_publish
+    "creole/publish.py"
+    "creole/tests/test_project_setup.py"
+    # rendering differencenes, likely docutils version mismatch
+    "creole/tests/test_cross_compare_rest.py"
+    "creole/tests/test_rest2html.py"
+  ];
+
+  meta = with lib; {
+    description = "Creole markup tools written in Python";
+    homepage = "https://github.com/jedie/python-creole";
+    changelog = "https://github.com/jedie/python-creole/releases/tag/v${version}";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-crfsuite/default.nix b/nixpkgs/pkgs/development/python-modules/python-crfsuite/default.nix
new file mode 100644
index 000000000000..2efaa484fd74
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-crfsuite/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "python-crfsuite";
+  version = "0.9.9";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-yqYmHWlVRmdW+Ya3/PvU/VBiKWPjvbXMGAwSnGKzp20=";
+  };
+
+  preCheck = ''
+    # make sure import the built version, not the source one
+    rm -r pycrfsuite
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pycrfsuite"
+  ];
+
+  meta = with lib; {
+    description = "Python binding for CRFsuite";
+    homepage = "https://github.com/scrapinghub/python-crfsuite";
+    license = licenses.mit;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-crontab/default.nix b/nixpkgs/pkgs/development/python-modules/python-crontab/default.nix
new file mode 100644
index 000000000000..a1fb349c9ee9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-crontab/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python-dateutil
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "python-crontab";
+  version = "3.0.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-eft0ZQOd39T7k9By1u4NRcGsi/FZfwaG6hT9Q2Hbo3k=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    python-dateutil
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_07_non_posix_shell"
+    # doctest that assumes /tmp is writeable, awkward to patch
+    "test_03_usage"
+    # AssertionError: 4 != 0
+    "test_19_frequency_at_month"
+  ];
+
+  pythonImportsCheck = [
+    "crontab"
+  ];
+
+  meta = with lib; {
+    description = "Python API for crontab";
+    longDescription = ''
+      Crontab module for reading and writing crontab files
+      and accessing the system cron automatically and simply using a direct API.
+    '';
+    homepage = "https://gitlab.com/doctormo/python-crontab/";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ kfollesdal ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-csxcad/default.nix b/nixpkgs/pkgs/development/python-modules/python-csxcad/default.nix
new file mode 100644
index 000000000000..1044fe0a2748
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-csxcad/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, openems
+, csxcad
+, numpy
+, matplotlib
+}:
+
+buildPythonPackage rec {
+  pname = "python-csxcad";
+  version = "unstable-2020-02-18";
+
+  src = fetchFromGitHub {
+    owner = "thliebig";
+    repo = "CSXCAD";
+    rev = "ef6e40931dbd80e0959f37c8e9614c437bf7e518";
+    sha256 = "072s765jyzpdq8qqysdy0dld17m6sr9zfcs0ip2zk8c4imxaysnb";
+  };
+
+  sourceRoot = "${src.name}/python";
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    openems
+    csxcad
+    numpy
+    matplotlib
+  ];
+
+  setupPyBuildFlags = [ "-I${openems}/include" "-L${openems}/lib" "-R${openems}/lib" ];
+
+  meta = with lib; {
+    description = "Python interface to CSXCAD";
+    homepage = "http://openems.de/index.php/Main_Page.html";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ matthuszagh ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-ctags3/default.nix b/nixpkgs/pkgs/development/python-modules/python-ctags3/default.nix
new file mode 100644
index 000000000000..4c987250e49f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-ctags3/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, cython, fetchFromGitHub }:
+
+buildPythonPackage rec {
+  pname = "python-ctags3";
+  version = "1.5.0";
+
+  src = fetchFromGitHub {
+    owner = "universal-ctags";
+    repo = pname;
+    rev = version;
+    hash = "sha256-XVsZckNVJ1H5q8FzqoVd1UWRw0zOygvRtb7arX9dwGE=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  # Regenerating the bindings keeps later versions of Python happy
+  postPatch = ''
+    cython src/_readtags.pyx
+  '';
+
+  meta = with lib; {
+    inherit (src.meta) homepage;
+    description = "Ctags indexing python bindings";
+    license = licenses.lgpl3Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-daemon/default.nix b/nixpkgs/pkgs/development/python-modules/python-daemon/default.nix
new file mode 100644
index 000000000000..a0dc1f05b76e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-daemon/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, docutils
+, lockfile
+, pytestCheckHook
+, testscenarios
+, testtools
+, twine
+, python
+, pythonOlder
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "python-daemon";
+  version = "3.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-bFdFI3L36v9Ak0ocA60YJr9eeTVY6H/vSRMeZGS02uU=";
+  };
+
+  nativeBuildInputs = [
+    twine
+  ];
+
+  propagatedBuildInputs = [
+    docutils
+    lockfile
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    testscenarios
+    testtools
+  ];
+
+  disabledTests = [
+    "begin_with_TestCase"
+    "changelog_TestCase"
+    "ChangeLogEntry"
+    "DaemonContext"
+    "file_descriptor"
+    "get_distribution_version_info_TestCase"
+    "InvalidFormatError_TestCase"
+    "make_year_range_TestCase"
+    "ModuleExceptions_TestCase"
+    "test_metaclass_not_called"
+    "test_passes_specified_object"
+    "test_returns_expected"
+    "value_TestCase"
+    "YearRange_TestCase"
+  ];
+
+  pythonImportsCheck = [
+    "daemon"
+    "daemon.daemon"
+    "daemon.pidfile"
+  ];
+
+  meta = with lib; {
+    description = "Library to implement a well-behaved Unix daemon process";
+    homepage = "https://pagure.io/python-daemon/";
+    # See "Copying" section in https://pagure.io/python-daemon/blob/main/f/README
+    license = with licenses; [ gpl3Plus asl20 ];
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-datemath/default.nix b/nixpkgs/pkgs/development/python-modules/python-datemath/default.nix
new file mode 100644
index 000000000000..3c12e92b9036
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-datemath/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, arrow
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-datemath";
+  version = "1.5.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "nickmaccarthy";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-WVWGhyBguE1+KEMQu0N5QxO7IC4rPEJ/2L3VWUCQNi4=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "remove-unittest2.patch";
+      url = "https://github.com/nickmaccarthy/python-datemath/commit/781daa0241ed327d5f211f3b62f553f3ee3d86e0.patch";
+      hash = "sha256-WD6fuDaSSNXgYWoaUexiWnofCzEZzercEUlqTvOUT5I=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    arrow
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests.py"
+  ];
+
+  pythonImportsCheck = [
+    "datemath"
+  ];
+
+  meta = with lib; {
+    description = "Python module to emulate the date math used in SOLR and Elasticsearch";
+    homepage = "https://github.com/nickmaccarthy/python-datemath";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-dbusmock/default.nix b/nixpkgs/pkgs/development/python-modules/python-dbusmock/default.nix
new file mode 100644
index 000000000000..acb47fceb8b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-dbusmock/default.nix
@@ -0,0 +1,87 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, dbus
+, dbus-python
+, pygobject3
+, bluez
+, networkmanager
+, setuptools-scm
+, runCommand
+}:
+
+let
+  # Cannot just add it to path in preCheck since that attribute will be passed to
+  # mkDerivation even with doCheck = false, causing a dependency cycle.
+  pbap-client = runCommand "pbap-client" { } ''
+    mkdir -p "$out/bin"
+    ln -s "${bluez.test}/test/pbap-client" "$out/bin/pbap-client"
+  '';
+in buildPythonPackage rec {
+  pname = "python-dbusmock";
+  version = "0.29.1";
+
+  src = fetchFromGitHub {
+    owner = "martinpitt";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-sfvVLPTSTXjwyB0a2NyDIONv01FXZ40nHZwwo3oqI90=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    dbus-python
+  ];
+
+  nativeCheckInputs = [
+    dbus
+    pygobject3
+    bluez
+    pbap-client
+    networkmanager
+    nose
+  ];
+
+  # TODO: Get the rest of these tests running?
+  NOSE_EXCLUDE = lib.concatStringsSep "," [
+    "test_bluez4" # NixOS ships BlueZ5
+    # These appear to fail because they're expecting to run in an Ubuntu chroot?
+    "test_everything" # BlueZ5 OBEX
+    "test_polkitd"
+    "test_consolekit"
+    "test_api"
+    "test_logind"
+    "test_notification_daemon"
+    "test_ofono"
+    "test_gnome_screensaver"
+    "test_cli"
+    "test_timedated"
+    "test_upower"
+    # needs glib
+    "test_accounts_service"
+    # needs dbus-daemon active
+    "test_systemd"
+    # Very slow, consider disabling?
+    # "test_networkmanager"
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    nosetests -v
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Mock D-Bus objects for tests";
+    homepage = "https://github.com/martinpitt/python-dbusmock";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ callahad ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-decouple/default.nix b/nixpkgs/pkgs/development/python-modules/python-decouple/default.nix
new file mode 100644
index 000000000000..144aec0fa5c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-decouple/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-decouple";
+  version = "3.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "HBNetwork";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-F9Gu7Y/dJhwOJi/ZaoVclF3+4U/N5JdvpXwgGB3SF3Q=";
+  };
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "decouple"
+  ];
+
+  meta = with lib; {
+    description = "Module to handle code and condifuration";
+    homepage = "https://github.com/HBNetwork/python-decouple";
+    changelog = "https://github.com/HBNetwork/python-decouple/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-didl-lite/default.nix b/nixpkgs/pkgs/development/python-modules/python-didl-lite/default.nix
new file mode 100644
index 000000000000..f808efe2c131
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-didl-lite/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, defusedxml
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-didl-lite";
+  version = "1.3.2";
+  disabled = pythonOlder "3.5.3";
+
+  src = fetchFromGitHub {
+    owner = "StevenLooman";
+    repo = pname;
+    rev = version;
+    hash = "sha256-laKmWGDEzlBVJCUSKxekjPEXVlAz4MIzM7dNJfta/ek=";
+  };
+
+  propagatedBuildInputs = [
+    defusedxml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "didl_lite" ];
+
+  meta = with lib; {
+    description = "DIDL-Lite (Digital Item Declaration Language) tools for Python";
+    homepage = "https://github.com/StevenLooman/python-didl-lite";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-docs-theme/default.nix b/nixpkgs/pkgs/development/python-modules/python-docs-theme/default.nix
new file mode 100644
index 000000000000..464697c35bfa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-docs-theme/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, pythonOlder
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "python-docs-theme";
+  version = "2023.9";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "python";
+    repo = "python-docs-theme";
+    rev = "refs/tags/${version}";
+    hash = "sha256-XVwMEfprTNdNnaW38HMCAu4CswdVjBXYtNWBgqXfbno=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+   sphinx
+  ];
+
+  pythonImportsCheck = [
+    "python_docs_theme"
+  ];
+
+  meta = with lib; {
+    description = "Sphinx theme for CPython project";
+    homepage = "https://github.com/python/python-docs-theme";
+    changelog = "https://github.com/python/python-docs-theme/blob/${version}/CHANGELOG.rst";
+    license = licenses.psfl;
+    maintainers = with maintainers; [ kaction ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-docx/default.nix b/nixpkgs/pkgs/development/python-modules/python-docx/default.nix
new file mode 100644
index 000000000000..36146bbe05e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-docx/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, behave
+, buildPythonPackage
+, fetchPypi
+, lxml
+, pytest
+, pyparsing
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "python-docx";
+  version = "0.8.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1105d233a0956dd8dd1e710d20b159e2d72ac3c301041b95f4d4ceb3e0ebebc4";
+  };
+
+  nativeCheckInputs = [ behave mock pyparsing pytest ];
+  propagatedBuildInputs = [ lxml ];
+
+  checkPhase = ''
+    py.test tests
+    behave --format progress --stop --tags=-wip
+  '';
+
+  meta = {
+    description = "Create and update Microsoft Word .docx files";
+    homepage = "https://python-docx.readthedocs.io/en/latest/";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.alexchapman ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-doi/default.nix b/nixpkgs/pkgs/development/python-modules/python-doi/default.nix
new file mode 100644
index 000000000000..e0cb03d611d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-doi/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "python-doi";
+  version = "0.1.1";
+
+  src = fetchFromGitHub {
+    owner = "papis";
+    repo = "python-doi";
+    rev = "v${version}";
+    sha256 = "1wa5inh2a0drjswrnhjv6m23mvbfdgqj2jb8fya7q0armzp7l6fr";
+  };
+
+  disabled = !isPy3k;
+
+  meta = with lib; {
+    description = "Python library to work with Document Object Identifiers (doi)";
+    homepage = "https://github.com/alejandrogallo/python-doi";
+    maintainers = with maintainers; [ teto ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-dotenv/default.nix b/nixpkgs/pkgs/development/python-modules/python-dotenv/default.nix
new file mode 100644
index 000000000000..e98e7baac2d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-dotenv/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchPypi
+, ipython
+, mock
+, pytestCheckHook
+, pythonOlder
+, sh
+}:
+
+buildPythonPackage rec {
+  pname = "python-dotenv";
+  version = "1.0.0";
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-qN+WA0qubS1QpOvoIWMmxhw+tkg2d2UE/MpBDlk3o7o=";
+  };
+
+  propagatedBuildInputs = [ click ];
+
+  nativeCheckInputs = [
+    ipython
+    mock
+    pytestCheckHook
+    sh
+  ];
+
+  disabledTests = [
+    "cli"
+  ];
+
+  pythonImportsCheck = [ "dotenv" ];
+
+  meta = with lib; {
+    description = "Add .env support to your django/flask apps in development and deployments";
+    homepage = "https://github.com/theskumar/python-dotenv";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ erikarvstedt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-ecobee-api/default.nix b/nixpkgs/pkgs/development/python-modules/python-ecobee-api/default.nix
new file mode 100644
index 000000000000..644acb8a4883
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-ecobee-api/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "python-ecobee-api";
+  version = "0.2.17";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lJCbNOQJ8xmMa4V+tSFZx4QasK8ZLfsFavMP9Zge4K4=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "pyecobee" ];
+
+  meta = with lib; {
+    description = "Python API for talking to Ecobee thermostats";
+    homepage = "https://github.com/nkgilley/python-ecobee-api";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-editor/default.nix b/nixpkgs/pkgs/development/python-modules/python-editor/default.nix
new file mode 100644
index 000000000000..212e191568c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-editor/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  version = "1.0.4";
+  pname = "python-editor";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "51fda6bcc5ddbbb7063b2af7509e43bd84bfc32a4ff71349ec7847713882327b";
+  };
+
+  # No proper tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A library that provides the `editor` module for programmatically";
+    homepage = "https://github.com/fmoo/python-editor";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-efl/default.nix b/nixpkgs/pkgs/development/python-modules/python-efl/default.nix
new file mode 100644
index 000000000000..d4a2ca1dd6b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-efl/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, fetchurl
+, buildPythonPackage
+, pkg-config
+, python
+, dbus-python
+, packaging
+, enlightenment
+, directoryListingUpdater
+}:
+
+# Should be bumped along with EFL!
+
+buildPythonPackage rec {
+  pname = "python-efl";
+  version = "1.26.1";
+
+  src = fetchurl {
+    url = "http://download.enlightenment.org/rel/bindings/python/${pname}-${version}.tar.xz";
+    hash = "sha256-3Ns5fhIHihnpDYDnxvPP00WIZL/o1UWLzgNott4GKNc=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [ enlightenment.efl ];
+
+  propagatedBuildInputs = [ dbus-python packaging ];
+
+  preConfigure = ''
+    NIX_CFLAGS_COMPILE="$(pkg-config --cflags efl evas) $NIX_CFLAGS_COMPILE"
+  '';
+
+  preBuild = ''
+    ${python.pythonOnBuildForHost.interpreter} setup.py build_ext
+  '';
+
+  installPhase = ''
+    ${python.pythonOnBuildForHost.interpreter} setup.py install --prefix=$out --single-version-externally-managed
+  '';
+
+  doCheck = false;
+
+  passthru.updateScript = directoryListingUpdater { };
+
+  meta = with lib; {
+    description = "Python bindings for Enlightenment Foundation Libraries";
+    homepage = "https://github.com/DaveMDS/python-efl";
+    platforms = platforms.linux;
+    license = with licenses; [ gpl3 lgpl3 ];
+    maintainers = with maintainers; [ matejc ftrvxmtrx ] ++ teams.enlightenment.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-engineio/default.nix b/nixpkgs/pkgs/development/python-modules/python-engineio/default.nix
new file mode 100644
index 000000000000..990cbd1be317
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-engineio/default.nix
@@ -0,0 +1,88 @@
+{ lib
+, stdenv
+, aiohttp
+, buildPythonPackage
+, eventlet
+, fetchFromGitHub
+, iana-etc
+, libredirect
+, mock
+, pytestCheckHook
+, pythonOlder
+, requests
+, simple-websocket
+, tornado
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "python-engineio";
+  version = "4.7.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "miguelgrinberg";
+    repo = "python-engineio";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-jHXpPnrQlIpmQ2sY4y6AUx/6W8Pf+683s4NmmlwZO58=";
+  };
+
+  propagatedBuildInputs = [
+    simple-websocket
+  ];
+
+  passthru.optional-dependencies = {
+    client = [
+      requests
+      websocket-client
+    ];
+    asyncio_client = [
+      aiohttp
+    ];
+  };
+
+  nativeCheckInputs = [
+    aiohttp
+    eventlet
+    mock
+    requests
+    tornado
+    websocket-client
+    pytestCheckHook
+  ];
+
+  doCheck = !stdenv.isDarwin;
+
+  preCheck = lib.optionalString stdenv.isLinux ''
+    echo "nameserver 127.0.0.1" > resolv.conf
+    export NIX_REDIRECTS=/etc/protocols=${iana-etc}/etc/protocols:/etc/resolv.conf=$(realpath resolv.conf) \
+      LD_PRELOAD=${libredirect}/lib/libredirect.so
+  '';
+
+  postCheck = ''
+    unset NIX_REDIRECTS LD_PRELOAD
+  '';
+
+  # somehow effective log level does not change?
+  disabledTests = [
+    "test_logger"
+  ];
+
+  pythonImportsCheck = [
+    "engineio"
+  ];
+
+  meta = with lib; {
+    description = "Python based Engine.IO client and server";
+    longDescription = ''
+      Engine.IO is a lightweight transport protocol that enables real-time
+      bidirectional event-based communication between clients and a server.
+    '';
+    homepage = "https://github.com/miguelgrinberg/python-engineio/";
+    changelog = "https://github.com/miguelgrinberg/python-engineio/blob/v${version}/CHANGES.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-etcd/default.nix b/nixpkgs/pkgs/development/python-modules/python-etcd/default.nix
new file mode 100644
index 000000000000..f9b01802c421
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-etcd/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, mock
+, pyopenssl
+, urllib3
+, dnspython
+}:
+
+buildPythonPackage rec {
+  pname = "python-etcd";
+  version = "0.4.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f1b5ebb825a3e8190494f5ce1509fde9069f2754838ed90402a8c11e1f52b8cb";
+  };
+
+  buildInputs = [ nose mock pyopenssl ];
+
+  propagatedBuildInputs = [ urllib3 dnspython ];
+
+  postPatch = ''
+    sed -i '19s/dns/"dnspython"/' setup.py
+  '';
+
+  # Some issues with etcd not in path even though most tests passed
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A python client for Etcd";
+    homepage = "https://github.com/jplana/python-etcd";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-ethtool/default.nix b/nixpkgs/pkgs/development/python-modules/python-ethtool/default.nix
new file mode 100644
index 000000000000..e758f4a1ef71
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-ethtool/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pkg-config
+, libnl
+, nettools
+}:
+
+buildPythonPackage rec {
+  pname = "python-ethtool";
+  version = "0.15";
+
+  src = fetchFromGitHub {
+    owner = "fedora-python";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0arkcfq64a4fl88vjjsx4gd3mhcpa7mpq6sblpkgs4k4m9mccz6i";
+  };
+
+  postPatch = ''
+    substituteInPlace tests/parse_ifconfig.py --replace "Popen('ifconfig'," "Popen('${nettools}/bin/ifconfig',"
+  '';
+
+  buildInputs = [ libnl ];
+  nativeBuildInputs = [ pkg-config ];
+  pythonImportsCheck = [ "ethtool" ];
+
+  meta = with lib; {
+    description = "Python bindings for the ethtool kernel interface";
+    homepage = "https://github.com/fedora-python/python-ethtool";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ elohmeier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-ev3dev2/default.nix b/nixpkgs/pkgs/development/python-modules/python-ev3dev2/default.nix
new file mode 100644
index 000000000000..b5fc2e4fe537
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-ev3dev2/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "python-ev3dev2";
+  version = "2.1.0";
+
+  src = fetchFromGitHub {
+    owner = "ev3dev";
+    repo = "ev3dev-lang-python";
+    rev = version;
+    sha256 = "XxsiQs3k5xKb+3RewARbvBbxaztdvdq3w5ZMgTq+kRc=";
+    fetchSubmodules = true;
+  };
+
+  postPatch = ''
+    echo "${version}" > RELEASE-VERSION
+  '';
+
+  propagatedBuildInputs = [ pillow ];
+
+  checkPhase = ''
+    chmod -R g+rw ./tests/fake-sys/devices/**/*
+    ${python.interpreter} -W ignore::ResourceWarning tests/api_tests.py
+  '';
+
+  meta = with lib; {
+    description = "Python language bindings for ev3dev";
+    homepage = "https://github.com/ev3dev/ev3dev-lang-python";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ emilytrau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-family-hub-local/default.nix b/nixpkgs/pkgs/development/python-modules/python-family-hub-local/default.nix
new file mode 100644
index 000000000000..01d9da8423dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-family-hub-local/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, aiohttp
+, async-timeout
+, pillow
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-family-hub-local";
+  version = "0.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-bbOBlUJ4g+HOcJihEBAz3lsHR9Gn07z8st14FRFeJbc=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    pillow
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyfamilyhublocal"
+  ];
+
+  meta = with lib; {
+    description = "Module to accesse information from Samsung FamilyHub fridges locally";
+    homepage = "https://github.com/Klathmon/python-family-hub-local";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-fedora/default.nix b/nixpkgs/pkgs/development/python-modules/python-fedora/default.nix
new file mode 100644
index 000000000000..01c79c39ea1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-fedora/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, fetchPypi
+, kitchen
+, lockfile
+, munch
+, nose
+, openidc-client
+, pytestCheckHook
+, pythonOlder
+, requests
+, setuptools
+, six
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "python-fedora";
+  version = "1.1.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VrnYQaObQDDjiOkMe3fazUefHOXi/5sYw5VNl9Vwmhk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    kitchen
+    lockfile
+    munch
+    openidc-client
+    requests
+    six
+    urllib3
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    nose
+  ];
+
+  disabledTestPaths = [
+    # requires network access
+    "tests/functional/test_openidbaseclient.py"
+  ];
+
+  pythonImportsCheck = [
+    "fedora"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with the infrastructure of the Fedora Project";
+    homepage = "https://github.com/fedora-infra/python-fedora";
+    changelog = "https://github.com/fedora-infra/python-fedora/releases/tag/${version}";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-flirt/Cargo.lock b/nixpkgs/pkgs/development/python-modules/python-flirt/Cargo.lock
new file mode 100644
index 000000000000..2e05f648491e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-flirt/Cargo.lock
@@ -0,0 +1,1698 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "addr2line"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97"
+dependencies = [
+ "gimli",
+]
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "adler32"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
+
+[[package]]
+name = "aho-corasick"
+version = "0.7.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "anes"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
+
+[[package]]
+name = "ansi_term"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800"
+
+[[package]]
+name = "ar"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d67af77d68a931ecd5cbd8a3b5987d63a1d1d1278f7f6a60ae33db485cdebb69"
+
+[[package]]
+name = "atty"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
+dependencies = [
+ "hermit-abi 0.1.19",
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "backtrace"
+version = "0.3.67"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca"
+dependencies = [
+ "addr2line",
+ "cc",
+ "cfg-if 1.0.0",
+ "libc",
+ "miniz_oxide",
+ "object",
+ "rustc-demangle",
+]
+
+[[package]]
+name = "better-panic"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fa9e1d11a268684cbd90ed36370d7577afb6c62d912ddff5c15fc34343e5036"
+dependencies = [
+ "backtrace",
+ "console",
+]
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bitvec"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c"
+dependencies = [
+ "funty",
+ "radium",
+ "tap",
+ "wyz",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535"
+
+[[package]]
+name = "byteorder"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+
+[[package]]
+name = "cast"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
+
+[[package]]
+name = "cc"
+version = "1.0.79"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+
+[[package]]
+name = "cfg-if"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "chrono"
+version = "0.4.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f"
+dependencies = [
+ "iana-time-zone",
+ "js-sys",
+ "num-integer",
+ "num-traits",
+ "time",
+ "wasm-bindgen",
+ "winapi",
+]
+
+[[package]]
+name = "ciborium"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0c137568cc60b904a7724001b35ce2630fd00d5d84805fbb608ab89509d788f"
+dependencies = [
+ "ciborium-io",
+ "ciborium-ll",
+ "serde",
+]
+
+[[package]]
+name = "ciborium-io"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "346de753af073cc87b52b2083a506b38ac176a44cfb05497b622e27be899b369"
+
+[[package]]
+name = "ciborium-ll"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "213030a2b5a4e0c0892b6652260cf6ccac84827b83a85a534e178e3906c4cf1b"
+dependencies = [
+ "ciborium-io",
+ "half",
+]
+
+[[package]]
+name = "clap"
+version = "3.2.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5"
+dependencies = [
+ "atty",
+ "bitflags",
+ "clap_lex 0.2.4",
+ "indexmap",
+ "strsim",
+ "termcolor",
+ "textwrap",
+]
+
+[[package]]
+name = "clap"
+version = "4.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0b0588d44d4d63a87dbd75c136c166bbfd9a86a31cb89e09906521c7d3f5e3"
+dependencies = [
+ "bitflags",
+ "clap_lex 0.3.1",
+ "is-terminal",
+ "once_cell",
+ "strsim",
+ "termcolor",
+ "terminal_size",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5"
+dependencies = [
+ "os_str_bytes",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "783fe232adfca04f90f56201b26d79682d4cd2625e0bc7290b95123afe558ade"
+dependencies = [
+ "os_str_bytes",
+]
+
+[[package]]
+name = "cmake"
+version = "0.1.49"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "db34956e100b30725f2eb215f90d4871051239535632f84fea3bc92722c66b7c"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "codespan-reporting"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
+dependencies = [
+ "termcolor",
+ "unicode-width",
+]
+
+[[package]]
+name = "console"
+version = "0.15.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60"
+dependencies = [
+ "encode_unicode",
+ "lazy_static",
+ "libc",
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "console_error_panic_hook"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc"
+dependencies = [
+ "cfg-if 1.0.0",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "const_format"
+version = "0.2.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7309d9b4d3d2c0641e018d449232f2e28f1b22933c137f157d3dbc14228b8c0e"
+dependencies = [
+ "const_format_proc_macros",
+]
+
+[[package]]
+name = "const_format_proc_macros"
+version = "0.2.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d897f47bf7270cf70d370f8f98c1abb6d2d4cf60a6845d30e05bfb90c6568650"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-xid",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc"
+
+[[package]]
+name = "crc32fast"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "criterion"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb"
+dependencies = [
+ "anes",
+ "atty",
+ "cast",
+ "ciborium",
+ "clap 3.2.23",
+ "criterion-plot",
+ "itertools",
+ "lazy_static",
+ "num-traits",
+ "oorandom",
+ "plotters",
+ "rayon",
+ "regex",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "tinytemplate",
+ "walkdir",
+]
+
+[[package]]
+name = "criterion-plot"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1"
+dependencies = [
+ "cast",
+ "itertools",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521"
+dependencies = [
+ "cfg-if 1.0.0",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc"
+dependencies = [
+ "cfg-if 1.0.0",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a"
+dependencies = [
+ "autocfg",
+ "cfg-if 1.0.0",
+ "crossbeam-utils",
+ "memoffset 0.7.1",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "cxx"
+version = "1.0.91"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "86d3488e7665a7a483b57e25bdd90d0aeb2bc7608c8d0346acf2ad3f1caf1d62"
+dependencies = [
+ "cc",
+ "cxxbridge-flags",
+ "cxxbridge-macro",
+ "link-cplusplus",
+]
+
+[[package]]
+name = "cxx-build"
+version = "1.0.91"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48fcaf066a053a41a81dfb14d57d99738b767febb8b735c3016e469fac5da690"
+dependencies = [
+ "cc",
+ "codespan-reporting",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "scratch",
+ "syn",
+]
+
+[[package]]
+name = "cxxbridge-flags"
+version = "1.0.91"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2ef98b8b717a829ca5603af80e1f9e2e48013ab227b68ef37872ef84ee479bf"
+
+[[package]]
+name = "cxxbridge-macro"
+version = "1.0.91"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "086c685979a698443656e5cf7856c95c642295a38599f12fb1ff76fb28d19892"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "dynasm"
+version = "1.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "add9a102807b524ec050363f09e06f1504214b0e1c7797f64261c891022dce8b"
+dependencies = [
+ "bitflags",
+ "byteorder",
+ "lazy_static",
+ "proc-macro-error",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "dynasmrt"
+version = "1.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64fba5a42bd76a17cad4bfa00de168ee1cbfa06a5e8ce992ae880218c05641a9"
+dependencies = [
+ "byteorder",
+ "dynasm",
+ "memmap2",
+]
+
+[[package]]
+name = "either"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
+
+[[package]]
+name = "encode_unicode"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
+
+[[package]]
+name = "errno"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1"
+dependencies = [
+ "errno-dragonfly",
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "errno-dragonfly"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "fern"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3bdd7b0849075e79ee9a1836df22c717d1eba30451796fdc631b04565dd11e2a"
+dependencies = [
+ "log",
+]
+
+[[package]]
+name = "flate2"
+version = "1.0.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841"
+dependencies = [
+ "crc32fast",
+ "miniz_oxide",
+]
+
+[[package]]
+name = "funty"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
+
+[[package]]
+name = "gimli"
+version = "0.27.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4"
+
+[[package]]
+name = "goblin"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "572564d6cba7d09775202c8e7eebc4d534d5ae36578ab402fb21e182a0ac9505"
+dependencies = [
+ "log",
+ "plain",
+ "scroll",
+]
+
+[[package]]
+name = "half"
+version = "1.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7"
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
+[[package]]
+name = "hexyl"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "392fe25d8f080f8fed5faed180f560e2379f411c3fc0a62bba146d93d893d95d"
+dependencies = [
+ "anyhow",
+ "clap 4.1.6",
+ "const_format",
+ "libc",
+ "owo-colors",
+ "supports-color",
+ "terminal_size",
+ "thiserror",
+]
+
+[[package]]
+name = "iana-time-zone"
+version = "0.1.53"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "winapi",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca"
+dependencies = [
+ "cxx",
+ "cxx-build",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399"
+dependencies = [
+ "autocfg",
+ "hashbrown",
+]
+
+[[package]]
+name = "indoc"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306"
+
+[[package]]
+name = "inflate"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cdb29978cc5797bd8dcc8e5bf7de604891df2a8dc576973d71a281e916db2ff"
+dependencies = [
+ "adler32",
+]
+
+[[package]]
+name = "io-lifetimes"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1abeb7a0dd0f8181267ff8adc397075586500b81b28a73e8a0208b00fc170fb3"
+dependencies = [
+ "libc",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "is-terminal"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22e18b0a45d56fe973d6db23972bf5bc46f988a4a2385deac9cc29572f09daef"
+dependencies = [
+ "hermit-abi 0.3.1",
+ "io-lifetimes",
+ "rustix",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "is_ci"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "616cde7c720bb2bb5824a224687d8f77bfd38922027f01d825cd7453be5099fb"
+
+[[package]]
+name = "itertools"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440"
+
+[[package]]
+name = "js-sys"
+version = "0.3.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "jslancelot"
+version = "0.8.6"
+dependencies = [
+ "anyhow",
+ "console_error_panic_hook",
+ "js-sys",
+ "lancelot",
+ "wasm-bindgen",
+ "web-sys",
+ "wee_alloc",
+]
+
+[[package]]
+name = "lancelot"
+version = "0.8.6"
+dependencies = [
+ "ansi_term",
+ "anyhow",
+ "bitflags",
+ "bitvec",
+ "byteorder",
+ "chrono",
+ "criterion",
+ "dynasm",
+ "dynasmrt",
+ "fern",
+ "goblin",
+ "lancelot-flirt",
+ "lazy_static",
+ "log",
+ "object",
+ "regex",
+ "smallvec",
+ "smol_str",
+ "thiserror",
+ "unicorn-engine",
+ "widestring",
+ "zydis",
+]
+
+[[package]]
+name = "lancelot-bin"
+version = "0.8.6"
+dependencies = [
+ "ansi_term",
+ "anyhow",
+ "ar",
+ "better-panic",
+ "chrono",
+ "clap 3.2.23",
+ "fern",
+ "goblin",
+ "hex",
+ "hexyl",
+ "lancelot",
+ "lancelot-flirt",
+ "log",
+ "serde_json",
+ "thiserror",
+]
+
+[[package]]
+name = "lancelot-flirt"
+version = "0.8.6"
+dependencies = [
+ "anyhow",
+ "better-panic",
+ "bitflags",
+ "bitvec",
+ "chrono",
+ "clap 3.2.23",
+ "criterion",
+ "fern",
+ "inflate",
+ "log",
+ "nom",
+ "regex",
+ "smallvec",
+ "thiserror",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "libc"
+version = "0.2.139"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79"
+
+[[package]]
+name = "link-cplusplus"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4"
+
+[[package]]
+name = "lock_api"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "memmap2"
+version = "0.5.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2af2c65375e552a67fe3829ca63e8a7c27a378a62824594f43b2851d682b5ec2"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "memoffset"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "memoffset"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "memory_units"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3"
+
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
+[[package]]
+name = "miniz_oxide"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa"
+dependencies = [
+ "adler",
+]
+
+[[package]]
+name = "nom"
+version = "7.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b"
+dependencies = [
+ "hermit-abi 0.2.6",
+ "libc",
+]
+
+[[package]]
+name = "object"
+version = "0.30.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439"
+dependencies = [
+ "flate2",
+ "memchr",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.17.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
+
+[[package]]
+name = "oorandom"
+version = "11.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
+
+[[package]]
+name = "os_str_bytes"
+version = "6.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee"
+
+[[package]]
+name = "owo-colors"
+version = "3.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f"
+
+[[package]]
+name = "parking_lot"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "pkg-config"
+version = "0.3.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160"
+
+[[package]]
+name = "plain"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6"
+
+[[package]]
+name = "plotters"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2538b639e642295546c50fcd545198c9d64ee2a38620a628724a3b266d5fbf97"
+dependencies = [
+ "num-traits",
+ "plotters-backend",
+ "plotters-svg",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "plotters-backend"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "193228616381fecdc1224c62e96946dfbc73ff4384fba576e052ff8c1bea8142"
+
+[[package]]
+name = "plotters-svg"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9a81d2759aae1dae668f783c308bc5c8ebd191ff4184aaa1b37f65a6ae5a56f"
+dependencies = [
+ "plotters-backend",
+]
+
+[[package]]
+name = "proc-macro-error"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
+dependencies = [
+ "proc-macro-error-attr",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "version_check",
+]
+
+[[package]]
+name = "proc-macro-error-attr"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "version_check",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.51"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "pylancelot"
+version = "0.8.6"
+dependencies = [
+ "anyhow",
+ "lancelot",
+ "pyo3",
+]
+
+[[package]]
+name = "pyo3"
+version = "0.17.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "268be0c73583c183f2b14052337465768c07726936a260f480f0857cb95ba543"
+dependencies = [
+ "cfg-if 1.0.0",
+ "indoc",
+ "libc",
+ "memoffset 0.6.5",
+ "parking_lot",
+ "pyo3-build-config",
+ "pyo3-ffi",
+ "pyo3-macros",
+ "unindent",
+]
+
+[[package]]
+name = "pyo3-build-config"
+version = "0.17.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28fcd1e73f06ec85bf3280c48c67e731d8290ad3d730f8be9dc07946923005c8"
+dependencies = [
+ "once_cell",
+ "target-lexicon",
+]
+
+[[package]]
+name = "pyo3-ffi"
+version = "0.17.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f6cb136e222e49115b3c51c32792886defbfb0adead26a688142b346a0b9ffc"
+dependencies = [
+ "libc",
+ "pyo3-build-config",
+]
+
+[[package]]
+name = "pyo3-macros"
+version = "0.17.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94144a1266e236b1c932682136dc35a9dee8d3589728f68130c7c3861ef96b28"
+dependencies = [
+ "proc-macro2",
+ "pyo3-macros-backend",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "pyo3-macros-backend"
+version = "0.17.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8df9be978a2d2f0cdebabb03206ed73b11314701a5bfe71b0d753b81997777f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "python-flirt"
+version = "0.8.6"
+dependencies = [
+ "anyhow",
+ "lancelot-flirt",
+ "pyo3",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "radium"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
+
+[[package]]
+name = "rayon"
+version = "1.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6db3a213adf02b3bcfd2d3846bb41cb22857d131789e01df434fb7e7bc0759b7"
+dependencies = [
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "356a0625f1954f730c0201cdab48611198dc6ce21f4acff55089b5a78e6e835b"
+dependencies = [
+ "crossbeam-channel",
+ "crossbeam-deque",
+ "crossbeam-utils",
+ "num_cpus",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "regex"
+version = "1.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342"
+
+[[package]]
+name = "rustix"
+version = "0.36.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f43abb88211988493c1abb44a70efa56ff0ce98f233b7b276146f1f3f7ba9644"
+dependencies = [
+ "bitflags",
+ "errno",
+ "io-lifetimes",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "scratch"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ddccb15bcce173023b3fedd9436f882a0739b8dfb45e4f6b6002bee5929f61b2"
+
+[[package]]
+name = "scroll"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da"
+dependencies = [
+ "scroll_derive",
+]
+
+[[package]]
+name = "scroll_derive"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bdbda6ac5cd1321e724fa9cee216f3a61885889b896f073b8f82322789c5250e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde"
+version = "1.0.152"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.152"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.93"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cad406b69c91885b5107daf2c29572f6c8cdb3c66826821e286c533490c0bc76"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
+
+[[package]]
+name = "smol_str"
+version = "0.1.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fad6c857cbab2627dcf01ec85a623ca4e7dcb5691cbaa3d7fb7653671f0d09c9"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "strsim"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+
+[[package]]
+name = "supports-color"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ba6faf2ca7ee42fdd458f4347ae0a9bd6bcc445ad7cb57ad82b383f18870d6f"
+dependencies = [
+ "atty",
+ "is_ci",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.107"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "tap"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
+
+[[package]]
+name = "target-lexicon"
+version = "0.12.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ae9980cab1db3fceee2f6c6f643d5d8de2997c58ee8d25fb0cc8a9e9e7348e5"
+
+[[package]]
+name = "termcolor"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "terminal_size"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c9afddd2cec1c0909f06b00ef33f94ab2cc0578c4a610aa208ddfec8aa2b43a"
+dependencies = [
+ "rustix",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "textwrap"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d"
+
+[[package]]
+name = "thiserror"
+version = "1.0.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "time"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a"
+dependencies = [
+ "libc",
+ "wasi",
+ "winapi",
+]
+
+[[package]]
+name = "tinytemplate"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
+dependencies = [
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc"
+
+[[package]]
+name = "unicode-width"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
+
+[[package]]
+name = "unicorn-engine"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3b881bfd9837ff4f62e81a1e64b40a584604375ae0a73d0d5f09b7a72350b96"
+dependencies = [
+ "bitflags",
+ "cc",
+ "cmake",
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "unindent"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1766d682d402817b5ac4490b3c3002d91dfa0d22812f341609f97b08757359c"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "walkdir"
+version = "2.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56"
+dependencies = [
+ "same-file",
+ "winapi",
+ "winapi-util",
+]
+
+[[package]]
+name = "wasi"
+version = "0.10.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b"
+dependencies = [
+ "cfg-if 1.0.0",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.84"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d"
+
+[[package]]
+name = "web-sys"
+version = "0.3.61"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "wee_alloc"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbb3b5a6b2bb17cb6ad44a2e68a43e8d2722c997da10e928665c72ec6c0a0b8e"
+dependencies = [
+ "cfg-if 0.1.10",
+ "libc",
+ "memory_units",
+ "winapi",
+]
+
+[[package]]
+name = "widestring"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8"
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "windows-sys"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.45.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd"
+
+[[package]]
+name = "wyz"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed"
+dependencies = [
+ "tap",
+]
+
+[[package]]
+name = "zydis"
+version = "3.1.3"
+source = "git+https://github.com/williballenthin/zydis-rs?branch=nightly/wasm#cfebd092d2c98217c0527649beb5f67de349ccde"
+dependencies = [
+ "bitflags",
+ "cmake",
+ "serde",
+ "serde_derive",
+]
diff --git a/nixpkgs/pkgs/development/python-modules/python-flirt/default.nix b/nixpkgs/pkgs/development/python-modules/python-flirt/default.nix
new file mode 100644
index 000000000000..54d942fd0840
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-flirt/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, rustPlatform
+, libiconv
+}:
+
+buildPythonPackage rec {
+  pname = "python-flirt";
+  version = "0.8.6";
+
+  src = fetchFromGitHub {
+    owner = "williballenthin";
+    repo = "lancelot";
+    rev = "v${version}";
+    hash = "sha256-J48tRgJw6JjUrcAQdRELFE50pyDptbmbgYbr+rAK/PA=";
+  };
+
+  postPatch = ''
+    cp ${./Cargo.lock} Cargo.lock
+  '';
+
+  format = "pyproject";
+
+  nativeBuildInputs = with rustPlatform; [
+    cargoSetupHook
+    maturinBuildHook
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    libiconv
+  ];
+
+  buildAndTestSubdir = "pyflirt";
+
+  cargoDeps = rustPlatform.importCargoLock {
+    lockFile = ./Cargo.lock;
+    outputHashes = {
+      "zydis-3.1.3" = "sha256-X+aURjNfXGXO4eh6RJ3bi8Eb2kvF09I34ZHffvYjt9I=";
+    };
+  };
+
+  pythonImportsCheck = [ "flirt" ];
+
+  meta = with lib; {
+    description = "Python library for parsing, compiling, and matching Fast Library Identification and Recognition Technology (FLIRT) signatures";
+    homepage = "https://github.com/williballenthin/lancelot/tree/master/pyflirt";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ sbruder ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-fontconfig/default.nix b/nixpkgs/pkgs/development/python-modules/python-fontconfig/default.nix
new file mode 100644
index 000000000000..9a1416e0dbd6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-fontconfig/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildPythonPackage, fetchPypi, fontconfig, python, cython, freefont_ttf, makeFontsConf }:
+
+let
+  fontsConf = makeFontsConf {
+    fontDirectories = [ freefont_ttf ];
+  };
+in buildPythonPackage rec {
+  pname = "Python-fontconfig";
+  version = "0.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "154rfd0ygcbj9y8m32n537b457yijpfx9dvmf76vi0rg4ikf7kxp";
+  };
+
+  buildInputs = [ fontconfig ];
+  nativeBuildInputs = [ cython ];
+
+  preBuild = ''
+    ${python.pythonOnBuildForHost.interpreter} setup.py build_ext -i
+  '';
+
+  checkPhase = ''
+    export FONTCONFIG_FILE=${fontsConf};
+    echo y | ${python.interpreter} test/test.py
+  '';
+
+  meta = {
+    homepage = "https://github.com/Vayn/python-fontconfig";
+    description = "Python binding for Fontconfig";
+    license = lib.licenses.gpl3;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-frontmatter/default.nix b/nixpkgs/pkgs/development/python-modules/python-frontmatter/default.nix
new file mode 100644
index 000000000000..4670d58420bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-frontmatter/default.nix
@@ -0,0 +1,36 @@
+{ lib, fetchFromGitHub, buildPythonPackage, pyyaml, six, pytest, pyaml }:
+
+buildPythonPackage rec {
+  pname = "python-frontmatter";
+  version = "1.0.1";
+
+  src = fetchFromGitHub {
+    owner = "eyeseast";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-lkBCKZ1fZF580+4TnHYkfaGJjsWk7/Ksnk7VagZuef8=";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+    pyaml # yes, it's needed
+    six
+  ];
+
+  # tries to import test.test, which conflicts with module
+  # exported by python interpreter
+  doCheck = false;
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  pythonImportsCheck = [ "frontmatter" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/eyeseast/python-frontmatter";
+    description = "Parse and manage posts with YAML (or other) frontmatter";
+    license = licenses.mit;
+    maintainers = with maintainers; [ siraben ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-fsutil/default.nix b/nixpkgs/pkgs/development/python-modules/python-fsutil/default.nix
new file mode 100644
index 000000000000..a7e27ac64aa1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-fsutil/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "python-fsutil";
+  version = "0.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "fabiocaccamo";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-8d/cjD7dcA4/bKZtQUjgUPVgfZdjl+ibOFRpC9dyybA=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests/test.py"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_download_file"
+    "test_read_file_from_url"
+  ];
+
+  pythonImportsCheck = [
+    "fsutil"
+  ];
+
+  meta = with lib; {
+    description = "Module with file-system utilities";
+    homepage = "https://github.com/fabiocaccamo/python-fsutil";
+    changelog = "https://github.com/fabiocaccamo/python-fsutil/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-fullykiosk/default.nix b/nixpkgs/pkgs/development/python-modules/python-fullykiosk/default.nix
new file mode 100644
index 000000000000..d1931f82f310
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-fullykiosk/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-fullykiosk";
+  version = "0.0.12";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "cgarwood";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-88PsJ1qAlOpxDtZyQe8pFC2Y3ygg3boiPxmYad58Fm8=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "fullykiosk"
+  ];
+
+  meta = with lib; {
+    description = "Wrapper for Fully Kiosk Browser REST interface";
+    homepage = "https://github.com/cgarwood/python-fullykiosk";
+    changelog = "https://github.com/cgarwood/python-fullykiosk/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-fx/default.nix b/nixpkgs/pkgs/development/python-modules/python-fx/default.nix
new file mode 100644
index 000000000000..d505e0a19654
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-fx/default.nix
@@ -0,0 +1,100 @@
+{ lib
+, antlr4-python3-runtime
+, asciimatics
+, buildPythonPackage
+, click
+, dacite
+, decorator
+, fetchFromGitHub
+, future
+, first
+, jsonpath-ng
+, loguru
+, overrides
+, pillow
+, ply
+, pyfiglet
+, pyperclip
+, pytestCheckHook
+, pythonOlder
+, antlr4
+, pythonRelaxDepsHook
+, pyyaml
+, setuptools
+, six
+, urwid
+, parameterized
+, wcwidth
+, yamale
+}:
+
+buildPythonPackage rec {
+  pname = "python-fx";
+  version = "0.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "cielong";
+    repo = "pyfx";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-BXKH3AlYMNbMREW5Qx72PrbuZdXlmVS+knWWu/y9PsA=";
+  };
+
+  postPatch = ''
+    rm src/pyfx/model/common/jsonpath/*.{g4,interp,tokens}
+    antlr -Dlanguage=Python3 -visitor -o src/pyfx/model/common/jsonpath/ *.g4
+  '';
+
+  pythonRelaxDeps = true;
+
+  nativeBuildInputs = [
+    antlr4
+    pythonRelaxDepsHook
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    antlr4-python3-runtime
+    asciimatics
+    click
+    dacite
+    decorator
+    first
+    future
+    jsonpath-ng
+    loguru
+    overrides
+    pillow
+    ply
+    pyfiglet
+    pyperclip
+    pyyaml
+    six
+    urwid
+    wcwidth
+    yamale
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    parameterized
+  ];
+
+  # antlr4 issue prevents us from running the tests
+  # https://github.com/antlr/antlr4/issues/4041
+  doCheck = false;
+
+  # pythonImportsCheck = [
+  #   "pyfx"
+  # ];
+
+  meta = with lib; {
+    description = "Module to view JSON in a TUI";
+    homepage = "https://github.com/cielong/pyfx";
+    changelog = "https://github.com/cielong/pyfx/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-gammu/default.nix b/nixpkgs/pkgs/development/python-modules/python-gammu/default.nix
new file mode 100644
index 000000000000..4fb5e259329a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-gammu/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+  #, pytestCheckHook
+, pythonOlder
+, pkg-config
+, gammu
+}:
+
+buildPythonPackage rec {
+  pname = "python-gammu";
+  version = "3.2.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "gammu";
+    repo = pname;
+    rev = version;
+    hash = "sha256-lFQBrKWwdvUScwsBva08izZVeVDn1u+ldzixtL9YTpA=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  buildInputs = [
+    gammu
+  ];
+
+  # Check with the next release if tests could be run with pytest
+  # nativeCheckInputs = [ pytestCheckHook ];
+  # Don't run tests for now
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "gammu"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for Gammu";
+    homepage = "https://github.com/gammu/python-gammu/";
+    license = with licenses; [ gpl2Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-gitlab/default.nix b/nixpkgs/pkgs/development/python-modules/python-gitlab/default.nix
new file mode 100644
index 000000000000..0c0ded8af09f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-gitlab/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, argcomplete
+, requests
+, requests-toolbelt
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "python-gitlab";
+  version = "3.15.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-yeZet2Eqn7uKvwM5ly7Kf9enPU2mbJtEb/5SiTCv9TQ=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    requests-toolbelt
+  ];
+
+  passthru.optional-dependencies = {
+    autocompletion = [
+      argcomplete
+    ];
+    yaml = [
+      pyyaml
+    ];
+  };
+
+  # Tests rely on a gitlab instance on a local docker setup
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "gitlab"
+  ];
+
+  meta = with lib; {
+    description = "Interact with GitLab API";
+    homepage = "https://github.com/python-gitlab/python-gitlab";
+    changelog = "https://github.com/python-gitlab/python-gitlab/blob/v${version}/CHANGELOG.md";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ nyanloutre ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-glanceclient/default.nix b/nixpkgs/pkgs/development/python-modules/python-glanceclient/default.nix
new file mode 100644
index 000000000000..de8c5d000163
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-glanceclient/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, coreutils
+, pbr
+, prettytable
+, keystoneauth1
+, requests
+, warlock
+, oslo-utils
+, oslo-i18n
+, wrapt
+, pyopenssl
+, pythonOlder
+, stestr
+, testscenarios
+, ddt
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "python-glanceclient";
+  version = "4.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ejZuH/Zr23bmJ+7PfNQFO9lPNfo83GkNKa/0fpduBTI=";
+  };
+
+  postPatch = ''
+    substituteInPlace glanceclient/tests/unit/v1/test_shell.py \
+      --replace "/bin/echo" "${coreutils}/bin/echo"
+  '';
+
+  propagatedBuildInputs = [
+    pbr
+    prettytable
+    keystoneauth1
+    requests
+    warlock
+    oslo-utils
+    oslo-i18n
+    wrapt
+    pyopenssl
+  ];
+
+  nativeCheckInputs = [
+    stestr
+    testscenarios
+    ddt
+    requests-mock
+  ];
+
+  checkPhase = ''
+    stestr run
+  '';
+
+  pythonImportsCheck = [
+    "glanceclient"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for the OpenStack Images API";
+    homepage = "https://github.com/openstack/python-glanceclient/";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-gnupg/default.nix b/nixpkgs/pkgs/development/python-modules/python-gnupg/default.nix
new file mode 100644
index 000000000000..03290d2e99c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-gnupg/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, gnupg
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-gnupg";
+  version = "0.5.1";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VnS61Ok4dsCw0xl+MU1/lC05AYvzHiuDP2eIpoE8P7g=";
+  };
+
+  postPatch = ''
+    substituteInPlace gnupg.py \
+      --replace "gpgbinary='gpg'" "gpgbinary='${gnupg}/bin/gpg'"
+    substituteInPlace test_gnupg.py \
+      --replace "os.environ.get('GPGBINARY', 'gpg')" "os.environ.get('GPGBINARY', '${gnupg}/bin/gpg')"
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # network access
+    "test_search_keys"
+  ];
+
+  pythonImportsCheck = [ "gnupg" ];
+
+  meta = with lib; {
+    description = "API for the GNU Privacy Guard (GnuPG)";
+    homepage = "https://github.com/vsajip/python-gnupg";
+    changelog = "https://github.com/vsajip/python-gnupg/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ copumpkin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-google-nest/default.nix b/nixpkgs/pkgs/development/python-modules/python-google-nest/default.nix
new file mode 100644
index 000000000000..3d086fa2684e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-google-nest/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests-oauthlib
+}:
+
+buildPythonPackage rec {
+  pname = "python-google-nest";
+  version = "5.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-y3BOhorVkJ3rFPifNOopLMqk6y1fHX5vxHGiqWvWHhE=";
+  };
+
+  propagatedBuildInputs = [
+    requests-oauthlib
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "nest"
+  ];
+
+  meta = with lib; {
+    description = "Python API and command line tool for talking to Nest thermostats";
+    homepage = "https://github.com/axlan/python-nest/";
+    license = licenses.cc-by-nc-sa-30;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-gvm/default.nix b/nixpkgs/pkgs/development/python-modules/python-gvm/default.nix
new file mode 100644
index 000000000000..98cc6109ae78
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-gvm/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, defusedxml
+, fetchFromGitHub
+, lxml
+, paramiko
+, poetry-core
+, pontos
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-gvm";
+  version = "23.11.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "greenbone";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-7HneedqHbNB9ZYFUCCQ/puLtA1QlIkTKqji0py9hwBE=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    defusedxml
+    lxml
+    paramiko
+    pontos
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # No running SSH available
+    "test_connect_error"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_feed_xml_error"
+  ];
+
+  pythonImportsCheck = [
+    "gvm"
+  ];
+
+  meta = with lib; {
+    description = "Collection of APIs that help with remote controlling a Greenbone Security Manager";
+    homepage = "https://github.com/greenbone/python-gvm";
+    changelog = "https://github.com/greenbone/python-gvm/releases/tag/v${version}";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-heatclient/default.nix b/nixpkgs/pkgs/development/python-modules/python-heatclient/default.nix
new file mode 100644
index 000000000000..97cacf1b0642
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-heatclient/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, babel
+, buildPythonPackage
+, cliff
+, fetchPypi
+, iso8601
+, keystoneauth1
+, osc-lib
+, oslo-i18n
+, oslo-serialization
+, oslo-utils
+, pbr
+, prettytable
+, python-swiftclient
+, pythonOlder
+, pyyaml
+, requests
+, requests-mock
+, stestr
+, testscenarios
+}:
+
+buildPythonPackage rec {
+  pname = "python-heatclient";
+  version = "3.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-opBb9Zf60kgMtBNis2c+22VGS7psFEDPYvlz7WyKIHs=";
+  };
+
+  propagatedBuildInputs = [
+    babel
+    cliff
+    iso8601
+    keystoneauth1
+    osc-lib
+    oslo-i18n
+    oslo-serialization
+    oslo-utils
+    pbr
+    prettytable
+    python-swiftclient
+    pyyaml
+    requests
+  ];
+
+  nativeCheckInputs = [
+    stestr
+    testscenarios
+    requests-mock
+  ];
+
+  checkPhase = ''
+    stestr run -e <(echo "
+      heatclient.tests.unit.test_common_http.HttpClientTest.test_get_system_ca_file
+      heatclient.tests.unit.test_deployment_utils.TempURLSignalTest.test_create_temp_url
+    ")
+  '';
+
+  pythonImportsCheck = [
+    "heatclient"
+  ];
+
+  meta = with lib; {
+    description = "Library for Heat built on the Heat orchestration API";
+    homepage = "https://github.com/openstack/python-heatclient";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-hglib/default.nix b/nixpkgs/pkgs/development/python-modules/python-hglib/default.nix
new file mode 100644
index 000000000000..b7492239382f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-hglib/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mercurial
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "python-hglib";
+  version = "2.6.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sYvR7VPJDuV9VxTWata7crZOkw1K7KmDCJLAi7KNpgg=";
+  };
+
+  nativeCheckInputs = [ mercurial nose ];
+
+  preCheck = ''
+    export HGTMP=$(mktemp -d)
+    export HGUSER=test
+  '';
+
+  pythonImportsCheck = [ "hglib" ];
+
+  meta = with lib; {
+    description = "Library with a fast, convenient interface to Mercurial. It uses Mercurial’s command server for communication with hg.";
+    homepage = "https://www.mercurial-scm.org/wiki/PythonHglibs";
+    license = licenses.mit;
+    maintainers = [];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-hl7/default.nix b/nixpkgs/pkgs/development/python-modules/python-hl7/default.nix
new file mode 100644
index 000000000000..98a73c8252ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-hl7/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "python-hl7";
+  version = "0.4.5";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "johnpaulett";
+    repo = "python-hl7";
+    rev = "refs/tags/${version}";
+    hash = "sha256-9uFdyL4+9KSWXflyOMOeUudZTv4NwYPa0ADNTmuVbqo=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "hl7" ];
+
+  meta = with lib; {
+    description = "A simple library for parsing messages of Health Level 7 (HL7) version 2.x into Python objects";
+    homepage = "https://python-hl7.readthedocs.org";
+    changelog = "https://python-hl7.readthedocs.io/en/latest/changelog.html";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-homewizard-energy/default.nix b/nixpkgs/pkgs/development/python-modules/python-homewizard-energy/default.nix
new file mode 100644
index 000000000000..e7c0a2a26305
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-homewizard-energy/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, aiohttp
+, aresponses
+, awesomeversion
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, protobuf
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-homewizard-energy";
+  version = "2.1.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "DCSBL";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-iyDRhTV5GSBTVK7ccJhUOrCpE9YuiI1vJM4XroCyIwE=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    awesomeversion
+    aiohttp
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "homewizard_energy"
+  ];
+
+  meta = with lib; {
+    description = "Library to communicate with HomeWizard Energy devices";
+    homepage = "https://github.com/DCSBL/python-homewizard-energy";
+    changelog = "https://github.com/DCSBL/python-homewizard-energy/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-hosts/default.nix b/nixpkgs/pkgs/development/python-modules/python-hosts/default.nix
new file mode 100644
index 000000000000..7452abb860c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-hosts/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "python-hosts";
+  version = "1.0.5";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xabbGnvzXNiE0koQVq9dmEib5Cv7kg1JjpZAyb7IZM0=";
+  };
+
+  # win_inet_pton is required for Windows support
+  prePatch = ''
+    substituteInPlace setup.py \
+      --replace "install_requires=['win_inet_pton']," ""
+    substituteInPlace python_hosts/utils.py \
+      --replace "import win_inet_pton" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pyyaml
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "python_hosts"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_import_from_url_counters_for_part_success"
+    "test_import_from_url_with_force"
+    "test_import_from_url_without_force"
+    "test_import_from_url"
+  ];
+
+  meta = with lib; {
+    description = "Library for managing a hosts file";
+    longDescription = ''
+      python-hosts is a Python library for managing a hosts file. It enables you to add
+      and remove entries, or import them from a file or URL.
+    '';
+    homepage = "https://github.com/jonhadfield/python-hosts";
+    changelog = "https://github.com/jonhadfield/python-hosts/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/python-hpilo/default.nix b/nixpkgs/pkgs/development/python-modules/python-hpilo/default.nix
new file mode 100644
index 000000000000..c23f9eb4ac26
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-hpilo/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "python-hpilo";
+  version = "4.4.3";
+
+  src = fetchFromGitHub {
+    owner = "seveas";
+    repo = pname;
+    rev = version;
+    sha256 = "1dk5xswydw7nmn9hlna1xca1mzcas9qv2kmid5yx8kvk3hjqci9v";
+  };
+
+  # Most tests requires an actual iLO to run
+  doCheck = false;
+  pythonImportsCheck = [ "hpilo" ];
+
+  meta = with lib; {
+    description = "Python module to access the HP iLO XML interface";
+    homepage = "https://seveas.github.io/python-hpilo/";
+    license = with licenses; [ asl20 gpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-http-client/default.nix b/nixpkgs/pkgs/development/python-modules/python-http-client/default.nix
new file mode 100644
index 000000000000..f2ecd2145846
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-http-client/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-http-client";
+  version = "3.3.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "sendgrid";
+    repo = "python-http-client";
+    rev = version;
+    hash = "sha256-8Qs5Jw0LMV2UucLnlFKJQ2PUhYaQx6uJdIV/4gaPH3w=";
+  };
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # checks date in license file and subsequently fails after new years
+    "test_daterange"
+  ];
+
+  pythonImportsCheck = [
+    "python_http_client"
+  ];
+
+  meta = with lib; {
+    description = "Python HTTP library to call APIs";
+    homepage = "https://github.com/sendgrid/python-http-client";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-i18n/default.nix b/nixpkgs/pkgs/development/python-modules/python-i18n/default.nix
new file mode 100644
index 000000000000..d12d8b841344
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-i18n/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytestCheckHook, pyyaml }:
+
+buildPythonPackage rec {
+  pname = "python-i18n";
+  version = "0.3.9";
+
+  src = fetchFromGitHub {
+    owner = "danhper";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "6FahoHZqaOWYGaT9RqLARCm2kLfUIlYuauB6+0eX7jA=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook pyyaml ];
+
+  pytestFlagsArray = [ "i18n/tests/run_tests.py" ];
+
+  meta = with lib; {
+    description = "Easy to use i18n library";
+    homepage = "https://github.com/danhper/python-i18n";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ emilytrau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-ipmi/default.nix b/nixpkgs/pkgs/development/python-modules/python-ipmi/default.nix
new file mode 100644
index 000000000000..1f65e5b6e3cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-ipmi/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, future
+, mock
+, nose
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-ipmi";
+  version = "0.5.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "kontron";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-IXEq3d1nXGEndciQw2MJ1Abc0vmEYez+k6aWGSWEzWA=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "version=version," "version='${version}',"
+  '';
+
+  propagatedBuildInputs = [
+    future
+  ];
+
+  nativeCheckInputs = [
+    mock
+    nose
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyipmi"
+  ];
+
+  meta = with lib; {
+    description = "Python IPMI Library";
+    homepage = "https://github.com/kontron/python-ipmi";
+    license = with licenses; [ lgpl2Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-ipware/default.nix b/nixpkgs/pkgs/development/python-modules/python-ipware/default.nix
new file mode 100644
index 000000000000..5564eabdb4f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-ipware/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, unittestCheckHook
+, setuptools
+}:
+buildPythonPackage rec {
+  pname = "python-ipware";
+  version = "2.0.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "un33k";
+    repo = "python-ipware";
+    rev = "v${version}";
+    hash = "sha256-j43uAcb1dyKe/SHQLLR+QJS6hKGB5qxjb9NiJaUPj8Y=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  pythonImportsCheck = [
+    "python_ipware"
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A python package for server applications to retrieve client's IP address";
+    homepage = "https://github.com/un33k/python-ipware";
+    changelog = "https://github.com/un33k/python-ipware/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ e1mo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-ironicclient/default.nix b/nixpkgs/pkgs/development/python-modules/python-ironicclient/default.nix
new file mode 100644
index 000000000000..d8a28d81fcb4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-ironicclient/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pbr
+, appdirs
+, cliff
+, dogpile-cache
+, jsonschema
+, keystoneauth1
+, openstacksdk
+, osc-lib
+, oslo-utils
+, pyyaml
+, requests
+, stevedore
+, stestr
+, requests-mock
+, oslotest
+}:
+
+buildPythonPackage rec {
+  pname = "python-ironicclient";
+  version = "5.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Q9yGuYf9TS7RCo9aV1hnNSrHoll7AOUiSpzRYxi+JXU=";
+  };
+
+  propagatedBuildInputs = [
+    pbr
+    appdirs
+    cliff
+    dogpile-cache
+    jsonschema
+    keystoneauth1
+    openstacksdk
+    osc-lib
+    oslo-utils
+    pyyaml
+    requests
+    stevedore
+  ];
+
+  nativeCheckInputs = [
+    stestr
+    requests-mock
+    oslotest
+  ];
+
+  checkPhase = ''
+    stestr run
+  '';
+
+  pythonImportsCheck = [ "ironicclient" ];
+
+  meta = with lib; {
+    description = "A client for OpenStack bare metal provisioning API, includes a Python module (ironicclient) and CLI (baremetal).";
+    homepage = "https://github.com/openstack/python-ironicclient";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-izone/default.nix b/nixpkgs/pkgs/development/python-modules/python-izone/default.nix
new file mode 100644
index 000000000000..19dbbf733dc6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-izone/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, aiohttp
+, netifaces
+, pytest-aio
+, pytest-asyncio
+, pytestCheckHook
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "python-izone";
+  version = "1.2.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Swamp-Ig";
+    repo = "pizone";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-0rj+tKn2pbFe+nczTMGLwIwmc4jCznGGF4/IMjlEvQg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  propagatedBuildInputs = [
+    aiohttp
+    netifaces
+  ];
+
+  nativeCheckInputs = [
+    pytest-aio
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  doCheck = false; # most tests access network
+
+  pythonImportsCheck = [
+    "pizone"
+  ];
+
+  meta = with lib; {
+    description = "Python interface to the iZone airconditioner controller";
+    homepage = "https://github.com/Swamp-Ig/pizone";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-jenkins/default.nix b/nixpkgs/pkgs/development/python-modules/python-jenkins/default.nix
new file mode 100644
index 000000000000..e4ff8f1e7e51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-jenkins/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, mock
+, pbr
+, pyyaml
+, setuptools
+, six
+, multi-key-dict
+, testscenarios
+, requests
+, requests-mock
+, stestr
+, multiprocess
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-jenkins";
+  version = "1.8.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VufauwYHvbjh1vxtLUMBq+2+2RZdorIG+svTBxy27ss=";
+  };
+
+  # test uses timeout mechanism unsafe for use with the "spawn"
+  # multiprocessing backend used on macos
+  postPatch = lib.optionalString stdenv.isDarwin ''
+    substituteInPlace tests/test_jenkins_sockets.py \
+      --replace test_jenkins_open_no_timeout dont_test_jenkins_open_no_timeout
+  '';
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+  pythonRelaxDeps = [
+    "setuptools"
+  ];
+
+  buildInputs = [ mock ];
+  propagatedBuildInputs = [ pbr pyyaml setuptools six multi-key-dict requests ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [ stestr testscenarios requests-mock multiprocess ];
+  checkPhase = ''
+    # Skip tests that fail due to setuptools>=66.0.0 rejecting PEP 440
+    # non-conforming versions. See
+    # https://github.com/pypa/setuptools/issues/2497 for details.
+    stestr run -E "tests.test_plugins.(PluginsTestScenarios.test_plugin_version_comparison|PluginsTestScenarios.test_plugin_version_object_comparison|PluginsTest.test_plugin_equal|PluginsTest.test_plugin_not_equal)"
+  '';
+
+  meta = with lib; {
+    description = "Python bindings for the remote Jenkins API";
+    homepage = "https://pypi.python.org/pypi/python-jenkins";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ gador ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-jose/default.nix b/nixpkgs/pkgs/development/python-modules/python-jose/default.nix
new file mode 100644
index 000000000000..6e3f406fe5a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-jose/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, setuptools
+
+# dependencies
+, ecdsa
+, rsa
+, pyasn1
+
+# optional-dependencies
+, cryptography
+, pycrypto
+, pycryptodome
+
+# tests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-jose";
+  version = "3.3.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "mpdavis";
+    repo = pname;
+    rev = version;
+    hash = "sha256-6VGC6M5oyGCOiXcYp6mpyhL+JlcYZKIqOQU9Sm/TkKM=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner",' ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    ecdsa
+    pyasn1
+    rsa
+  ];
+
+  passthru.optional-dependencies = {
+    cryptography = [
+      cryptography
+    ];
+    pycrypto = [
+      pycrypto
+    ];
+    pycryptodome = [
+      pycryptodome
+    ];
+  };
+
+  pythonImportsCheck = [
+    "jose"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  meta = with lib; {
+    changelog = "https://github.com/mpdavis/python-jose/releases/tag/${version}";
+    homepage = "https://github.com/mpdavis/python-jose";
+    description = "A JOSE implementation in Python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jhhuh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-json-logger/default.nix b/nixpkgs/pkgs/development/python-modules/python-json-logger/default.nix
new file mode 100644
index 000000000000..603bc629e5ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-json-logger/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-json-logger";
+  version = "2.0.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-I+fsAtNCN8WqHimgcBk6Tqh1g7tOf4/QbT3oJkxLLhw=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Json Formatter for the standard python logger";
+    homepage = "https://github.com/madzak/python-json-logger";
+    license = licenses.bsdOriginal;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-jsonrpc-server/default.nix b/nixpkgs/pkgs/development/python-modules/python-jsonrpc-server/default.nix
new file mode 100644
index 000000000000..d60c1edcf967
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-jsonrpc-server/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder
+, pytestCheckHook, mock, pytest-cov, coverage
+, future, futures ? null, ujson}:
+
+buildPythonPackage rec {
+  pname = "python-jsonrpc-server";
+  version = "0.4.0";
+
+  src = fetchFromGitHub {
+    owner = "palantir";
+    repo = "python-jsonrpc-server";
+    rev = version;
+    sha256 = "0pcf50qvcxqnz3db58whqd8z89cdph19pfs1whgfm0zmwbwk0lw6";
+  };
+
+  postPatch = ''
+    sed -i "s/version=versioneer.get_version(),/version=\"$version\",/g" setup.py
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook mock pytest-cov coverage
+  ];
+
+  propagatedBuildInputs = [ future ujson ]
+    ++ lib.optional (pythonOlder "3.2") futures;
+
+  meta = with lib; {
+    homepage = "https://github.com/palantir/python-jsonrpc-server";
+    description = "A Python 2 and 3 asynchronous JSON RPC server";
+    license = licenses.mit;
+    maintainers = [ maintainers.mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-juicenet/default.nix b/nixpkgs/pkgs/development/python-modules/python-juicenet/default.nix
new file mode 100644
index 000000000000..ad27a913257e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-juicenet/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-juicenet";
+  version = "1.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jesserockz";
+    repo = "python-juicenet";
+    rev = "v${version}";
+    hash = "sha256-5RKnVwOfEHzFZCiC8OUpS8exKrENK+I3Ok45HlKEvtU=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyjuicenet"
+  ];
+
+  meta = with lib; {
+    description = "Read and control Juicenet/Juicepoint/Juicebox based EVSE devices";
+    homepage = "https://github.com/jesserockz/python-juicenet";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-kasa/default.nix b/nixpkgs/pkgs/development/python-modules/python-kasa/default.nix
new file mode 100644
index 000000000000..dd2b64173794
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-kasa/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, anyio
+, async-timeout
+, asyncclick
+, buildPythonPackage
+, fetchFromGitHub
+, kasa-crypt
+, orjson
+, poetry-core
+, pydantic
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "python-kasa";
+  version = "0.5.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-wGPMrYaTtKkkNW88eyiiciFcBSTRqqChYi6e15WUCHo=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    anyio
+    async-timeout
+    asyncclick
+    pydantic
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+    voluptuous
+  ];
+
+  passthru.optional-dependencies = {
+    speedup = [
+      kasa-crypt
+      orjson
+    ];
+  };
+
+  pytestFlagsArray = [
+    "--asyncio-mode=auto"
+  ];
+
+  disabledTestPaths = [
+    # Skip the examples tests
+    "kasa/tests/test_readme_examples.py"
+  ];
+
+  pythonImportsCheck = [
+    "kasa"
+  ];
+
+  meta = with lib; {
+    description = "Python API for TP-Link Kasa Smarthome products";
+    homepage = "https://python-kasa.readthedocs.io/";
+    changelog = "https://github.com/python-kasa/python-kasa/blob/${version}/CHANGELOG.md";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-keycloak/default.nix b/nixpkgs/pkgs/development/python-modules/python-keycloak/default.nix
new file mode 100644
index 000000000000..a4adbf787aac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-keycloak/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, python-jose
+, pythonOlder
+, requests
+, requests-toolbelt
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "python-keycloak";
+  version = "2.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "marcospereirampj";
+    repo = "python-keycloak";
+    rev = "v${version}";
+    hash = "sha256-cuj0gJlZDkbJ2HRSMcQvO4nxpjw65CKGEpWCL5sucvg=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'version = "0.0.0"' 'version = "${version}"' \
+      --replace 'requests-toolbelt = "^0.9.1"' 'requests-toolbelt = "*"'
+  '';
+
+  buildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    python-jose
+    urllib3
+    requests
+    requests-toolbelt
+  ];
+
+  # Test fixtures require a running keycloak instance
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "keycloak"
+  ];
+
+  meta = with lib; {
+    description = "Provides access to the Keycloak API";
+    homepage = "https://github.com/marcospereirampj/python-keycloak";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-keystoneclient/default.nix b/nixpkgs/pkgs/development/python-modules/python-keystoneclient/default.nix
new file mode 100644
index 000000000000..bfcb750197bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-keystoneclient/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, keystoneauth1
+, openssl
+, oslo-config
+, oslo-serialization
+, pbr
+, pythonOlder
+, requests-mock
+, stestr
+, testresources
+, testscenarios
+}:
+
+buildPythonPackage rec {
+  pname = "python-keystoneclient";
+  version = "5.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-cqQsOGniEouwxiashWw9vz447xbX6F3TVWe4LNJFOak=";
+  };
+
+  propagatedBuildInputs = [
+    keystoneauth1
+    oslo-config
+    oslo-serialization
+    pbr
+  ];
+
+  nativeCheckInputs = [
+    openssl
+    requests-mock
+    stestr
+    testresources
+    testscenarios
+  ];
+
+  checkPhase = ''
+    stestr run
+  '';
+
+  pythonImportsCheck = [
+    "keystoneclient"
+  ];
+
+  meta = with lib; {
+    description = "Client Library for OpenStack Identity";
+    homepage = "https://github.com/openstack/python-keystoneclient";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-ldap-test/default.nix b/nixpkgs/pkgs/development/python-modules/python-ldap-test/default.nix
new file mode 100644
index 000000000000..ed7a31b0cfe7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-ldap-test/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, py4j }:
+
+buildPythonPackage rec {
+  pname = "python-ldap-test";
+  version = "0.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1qh9x3lncaldnw79fgpqbayichs8pbz8abr6pxb5qxbs7zrnyrwf";
+  };
+
+  propagatedBuildInputs = [ py4j ];
+
+  # Tests needs java to be present in path
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Tool for testing code speaking with LDAP server";
+    homepage = "https://github.com/zoldar/python-ldap-test";
+    sourceProvenance = with sourceTypes; [
+      fromSource
+      binaryBytecode
+    ];
+    license = licenses.mit;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/python-ldap/default.nix b/nixpkgs/pkgs/development/python-modules/python-ldap/default.nix
new file mode 100644
index 000000000000..5bc9f3fecfcc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-ldap/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build-system
+, setuptools
+
+# native dependencies
+, openldap
+, cyrus_sasl
+
+# dependencies
+, pyasn1
+, pyasn1-modules
+
+# tests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-ldap";
+  version = "3.4.4";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "python-ldap";
+    repo = "python-ldap";
+    rev = "refs/tags/python-ldap-${version}";
+    hash = "sha256-v1cWoRGxbvvFnHqnwoIfmiQQcxfaA8Bf3+M5bE5PtuU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  buildInputs = [
+    openldap
+    cyrus_sasl
+  ];
+
+  propagatedBuildInputs = [
+    pyasn1
+    pyasn1-modules
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    # Needed by tests to setup a mockup ldap server.
+    export BIN="${openldap}/bin"
+    export SBIN="${openldap}/bin"
+    export SLAPD="${openldap}/libexec/slapd"
+    export SCHEMA="${openldap}/etc/schema"
+  '';
+
+  disabledTests = [
+    # https://github.com/python-ldap/python-ldap/issues/501
+    "test_tls_ext_noca"
+  ];
+
+  doCheck = !stdenv.isDarwin;
+
+  meta = with lib; {
+    changelog = "https://github.com/python-ldap/python-ldap/releases/tag/python-ldap-${version}";
+    description = "Python modules for implementing LDAP clients";
+    downloadPage = "https://github.com/python-ldap/python-ldap";
+    homepage = "https://www.python-ldap.org/";
+    license = licenses.psfl;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-libnmap/default.nix b/nixpkgs/pkgs/development/python-modules/python-libnmap/default.nix
new file mode 100644
index 000000000000..a6acf665ee85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-libnmap/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, defusedxml
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-libnmap";
+  version = "0.7.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "savon-noir";
+    repo = "python-libnmap";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-cI8wdOvTmRy2cxLBkJn7vXRBRvewDMNl/tkIiRGhZJ8=";
+  };
+
+  passthru.optional-dependencies = {
+    defusedxml = [
+      defusedxml
+    ];
+  };
+
+  # We don't want the nmap binary being present
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "libnmap"
+  ];
+
+  meta = with lib; {
+    description = "Library to run nmap scans, parse and diff scan results";
+    homepage = "https://github.com/savon-noir/python-libnmap";
+    changelog = "https://github.com/savon-noir/python-libnmap/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-linux-procfs/default.nix b/nixpkgs/pkgs/development/python-modules/python-linux-procfs/default.nix
new file mode 100644
index 000000000000..4c025b1add9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-linux-procfs/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchgit, six }:
+
+buildPythonPackage rec {
+  pname = "python-linux-procfs";
+  version = "0.6.3";
+
+  src = fetchgit {
+    url = "https://git.kernel.org/pub/scm/libs/python/${pname}/${pname}.git";
+    rev = "v${version}";
+    hash = "sha256-PPgMlL9oj4HYUsr444ZrGo1LSZBl9hL5SE98IASUpbc=";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  # contains no tests
+  doCheck = false;
+  pythonImportsCheck = [ "procfs" ];
+
+  meta = with lib; {
+    description = "Python classes to extract information from the Linux kernel /proc files";
+    homepage = "https://git.kernel.org/pub/scm/libs/python/python-linux-procfs/python-linux-procfs.git/";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ elohmeier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-logstash/default.nix b/nixpkgs/pkgs/development/python-modules/python-logstash/default.nix
new file mode 100644
index 000000000000..3f281d9696ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-logstash/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "python-logstash";
+  version = "0.4.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-0E4c4R7MEH5KTzuAf8V9loEelkpVQIGzu7RHMvdO9fk=";
+  };
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python logging handler for Logstash";
+    homepage = "https://github.com/vklochan/python-logstash";
+    maintainers = with maintainers; [ peterromfeldhk ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-louvain/default.nix b/nixpkgs/pkgs/development/python-modules/python-louvain/default.nix
new file mode 100644
index 000000000000..32bd611e704a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-louvain/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, fetchpatch
+, networkx
+, pandas
+, scipy
+, numpy }:
+
+buildPythonPackage rec {
+  pname = "python-louvain";
+  version = "0.16";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-t7ot9QAv0o0+54mklTK6rRH+ZI5PIRfPB5jnUgodpWs=";
+  };
+
+  patches = [
+    # Fix test_karate
+    (fetchpatch {
+      name = "fix-karate-test-networkx-2.7.patch";
+      url = "https://github.com/taynaud/python-louvain/pull/95/commits/c95d767e72f580cb15319fe08d72d87c9976640b.patch";
+      hash = "sha256-9oJ9YvKl2sI8oGhfyauNS+HT4kXsDt0L8S2owluWdj0=";
+    })
+  ];
+
+  propagatedBuildInputs = [ networkx numpy ];
+
+  pythonImportsCheck = [ "community" ];
+
+  nativeCheckInputs = [ pandas scipy ];
+
+  meta = with lib; {
+    homepage = "https://github.com/taynaud/python-louvain";
+    description = "Louvain Community Detection";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-lsp-black/default.nix b/nixpkgs/pkgs/development/python-modules/python-lsp-black/default.nix
new file mode 100644
index 000000000000..d3b6a90c5925
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-lsp-black/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, black
+, python-lsp-server
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "python-lsp-black";
+  version = "1.3.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "python-lsp";
+    repo = "python-lsp-black";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-16HjNB0VfrXLyVa+u5HaFNjq/ER2yXIWokMFsPgejr8=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  propagatedBuildInputs = [ black python-lsp-server toml ];
+
+  meta = with lib; {
+    homepage = "https://github.com/python-lsp/python-lsp-black";
+    description = "Black plugin for the Python LSP Server";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-lsp-jsonrpc/default.nix b/nixpkgs/pkgs/development/python-modules/python-lsp-jsonrpc/default.nix
new file mode 100644
index 000000000000..27057d92ea12
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-lsp-jsonrpc/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+, ujson
+}:
+
+buildPythonPackage rec {
+  pname = "python-lsp-jsonrpc";
+  version = "1.1.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "python-lsp";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-5WN/31e6WCgXVzevMuQbNjyo/2jjWDF+m48nrLKS+64=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov-report html --cov-report term --junitxml=pytest.xml --cov pylsp_jsonrpc --cov test" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    ujson
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pylsp_jsonrpc"
+  ];
+
+  meta = with lib; {
+    description = "Python server implementation of the JSON RPC 2.0 protocol";
+    homepage = "https://github.com/python-lsp/python-lsp-jsonrpc";
+    changelog = "https://github.com/python-lsp/python-lsp-jsonrpc/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-lsp-ruff/default.nix b/nixpkgs/pkgs/development/python-modules/python-lsp-ruff/default.nix
new file mode 100644
index 000000000000..01d9e4eb49d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-lsp-ruff/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchPypi
+, ruff
+, cattrs
+, lsprotocol
+, python-lsp-server
+, tomli
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-lsp-ruff";
+  version = "2.0.0";
+  pyproject = true;
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "python-lsp-ruff";
+    sha256 = "sha256-lCTBFKTb1djrRQcX4Eg/G2Fs+VrqTvJ/XVnUPVM/5nE=";
+  };
+
+  postPatch = ''
+    # ruff binary is used directly, the ruff python package is not needed
+    sed -i '/"ruff>=/d' pyproject.toml
+    sed -i 's|sys.executable, "-m", "ruff"|"${ruff}/bin/ruff"|' pylsp_ruff/plugin.py
+    sed -i -e '/sys.executable/,+2c"${ruff}/bin/ruff",' -e 's|assert "ruff" in call_args|assert "${ruff}/bin/ruff" in call_args|' tests/test_ruff_lint.py
+    # Nix builds everything in /build/ but ruff somehow doesn't run on files in /build/ and outputs empty results.
+    sed -i -e "s|workspace.root_path|'/tmp/'|g" tests/*.py
+  '';
+
+  propagatedBuildInputs = [
+    cattrs
+    lsprotocol
+    python-lsp-server
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/python-lsp/python-lsp-ruff";
+    description = "Ruff linting plugin for pylsp";
+    changelog = "https://github.com/python-lsp/python-lsp-ruff/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ linsui ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-lsp-server/default.nix b/nixpkgs/pkgs/development/python-modules/python-lsp-server/default.nix
new file mode 100644
index 000000000000..763154732943
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-lsp-server/default.nix
@@ -0,0 +1,171 @@
+{ lib
+, stdenv
+, autopep8
+, buildPythonPackage
+, docstring-to-markdown
+, fetchFromGitHub
+, flake8
+, flaky
+, importlib-metadata
+, jedi
+, matplotlib
+, mccabe
+, numpy
+, pandas
+, pluggy
+, pycodestyle
+, pydocstyle
+, pyflakes
+, pylint
+, pyqt5
+, pytestCheckHook
+, python-lsp-jsonrpc
+, pythonOlder
+, pythonRelaxDepsHook
+, rope
+, setuptools
+, setuptools-scm
+, toml
+, ujson
+, websockets
+, whatthepatch
+, wheel
+, yapf
+}:
+
+buildPythonPackage rec {
+  pname = "python-lsp-server";
+  version = "1.9.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "python-lsp";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-9za0et/W+AwrjqUVoHwk8oqLXk4eqgRON8Z4F5GSKXM=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov-report html --cov-report term --junitxml=pytest.xml" "" \
+      --replace "--cov pylsp --cov test" ""
+  '';
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  pythonRelaxDeps = [
+    "autopep8"
+    "flake8"
+    "mccabe"
+    "pycodestyle"
+    "pydocstyle"
+    "pyflakes"
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    docstring-to-markdown
+    jedi
+    pluggy
+    python-lsp-jsonrpc
+    setuptools # `pkg_resources`imported in pylsp/config/config.py
+    ujson
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    importlib-metadata
+  ];
+
+  passthru.optional-dependencies = {
+    all = [
+      autopep8
+      flake8
+      mccabe
+      pycodestyle
+      pydocstyle
+      pyflakes
+      pylint
+      rope
+      toml
+      whatthepatch
+      yapf
+    ];
+    autopep8 = [
+      autopep8
+    ];
+    flake8 = [
+      flake8
+    ];
+    mccabe = [
+      mccabe
+    ];
+    pycodestyle = [
+      pycodestyle
+    ];
+    pydocstyle = [
+      pydocstyle
+    ];
+    pyflakes = [
+      pyflakes
+    ];
+    pylint = [
+      pylint
+    ];
+    rope = [
+      rope
+    ];
+    yapf = [
+      whatthepatch
+      yapf
+    ];
+    websockets = [
+      websockets
+    ];
+  };
+
+  nativeCheckInputs = [
+    flaky
+    matplotlib
+    numpy
+    pandas
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.all
+  # pyqt5 is broken on aarch64-darwin
+  ++ lib.optionals (!stdenv.isDarwin || !stdenv.isAarch64) [
+    pyqt5
+  ];
+
+  disabledTests = [
+    # Don't run lint tests
+    "test_pydocstyle"
+    # https://github.com/python-lsp/python-lsp-server/issues/243
+    "test_numpy_completions"
+    "test_workspace_loads_pycodestyle_config"
+  ] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
+    # pyqt5 is broken on aarch64-darwin
+    "test_pyqt_completion"
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  pythonImportsCheck = [
+    "pylsp"
+    "pylsp.python_lsp"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of the Language Server Protocol";
+    homepage = "https://github.com/python-lsp/python-lsp-server";
+    changelog = "https://github.com/python-lsp/python-lsp-server/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+    mainProgram = "pylsp";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-ly/default.nix b/nixpkgs/pkgs/development/python-modules/python-ly/default.nix
new file mode 100644
index 000000000000..3b4a7ecc1194
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-ly/default.nix
@@ -0,0 +1,21 @@
+{ buildPythonPackage, fetchPypi, lib }:
+
+buildPythonPackage rec {
+  pname = "python-ly";
+  version = "0.9.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d4d2b68eb0ef8073200154247cc9bd91ed7fb2671ac966ef3d2853281c15d7a8";
+  };
+
+  # tests not shipped on `pypi` and
+  # seem to be broken ATM: https://github.com/wbsoft/python-ly/issues/70
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Tool and library for manipulating LilyPond files";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-lzf/default.nix b/nixpkgs/pkgs/development/python-modules/python-lzf/default.nix
new file mode 100644
index 000000000000..61194ff8f9cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-lzf/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  version = "0.2.4";
+  pname = "python-lzf";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1l8m6vzwm1m8hn7ldw8j8r2b6r199k8z3q0wnhdyy4p68hahyhni";
+  };
+
+  meta = with lib; {
+    description = "liblzf python bindings";
+    homepage = "https://github.com/teepark/python-lzf";
+    license = licenses.mit;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-lzo/default.nix b/nixpkgs/pkgs/development/python-modules/python-lzo/default.nix
new file mode 100644
index 000000000000..e3f1b0922a6a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-lzo/default.nix
@@ -0,0 +1,32 @@
+{ lib, fetchPypi, buildPythonPackage, lzo, pytestCheckHook, setuptools, wheel }:
+
+buildPythonPackage rec {
+  pname = "python-lzo";
+  version = "1.15";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-pXqqAMXDoFFd2fdCa6LPYBdn3BncAj2LmdShOwoye0k=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  buildInputs = [ lzo ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [
+    "lzo"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jd-boyd/python-lzo";
+    description = "Python bindings for the LZO data compression library";
+    license = licenses.gpl2Only;
+    maintainers = [ maintainers.jbedo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-magic/default.nix b/nixpkgs/pkgs/development/python-modules/python-magic/default.nix
new file mode 100644
index 000000000000..890cfb50c2cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-magic/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, substituteAll
+, file
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-magic";
+  version = "0.4.27";
+
+  src = fetchFromGitHub {
+    owner = "ahupp";
+    repo = "python-magic";
+    rev = version;
+    hash = "sha256-fZ+5xJ3P0EYK+6rQ8VzXv2zckKfEH5VUdISIR6ybIfQ=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./libmagic-path.patch;
+      libmagic = "${file}/lib/libmagic${stdenv.hostPlatform.extensions.sharedLibrary}";
+    })
+    (fetchpatch {
+      name = "update-test-for-upstream-added-gzip-extensions.patch";
+      url = "https://github.com/ahupp/python-magic/commit/4ffcd59113fa26d7c2e9d5897b1eef919fd4b457.patch";
+      hash = "sha256-67GpjlGiR4/os/iZ69V+ZziVLpjmid+7t+gQ2aQy9I0=";
+    })
+
+    # Upstream patch to amend test suite for-5.45:
+    #   https://github.com/ahupp/python-magic/pull/290
+    (fetchpatch {
+      name = "file-5.45.patch";
+      url = "https://github.com/ahupp/python-magic/commit/3d2405ca80cd39b2a91decd26af81dcf181390a4.patch";
+      hash = "sha256-HRsnO9MGfMD9BkJdC4SrEFQ1OZEaXpwakXFLoaCPK94=";
+    })
+  ];
+
+  preCheck = ''
+    export LC_ALL=en_US.UTF-8
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A python interface to the libmagic file type identification library";
+    homepage = "https://github.com/ahupp/python-magic";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-magic/libmagic-path.patch b/nixpkgs/pkgs/development/python-modules/python-magic/libmagic-path.patch
new file mode 100644
index 000000000000..e9530d6ddf75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-magic/libmagic-path.patch
@@ -0,0 +1,28 @@
+diff --git i/magic/loader.py w/magic/loader.py
+index 931f161..b8096d1 100644
+--- i/magic/loader.py
++++ w/magic/loader.py
+@@ -35,16 +35,12 @@ def _lib_candidates():
+ 
+ 
+ def load_lib():
++  lib = '@libmagic@'
+ 
+-  for lib in _lib_candidates():
+-    # find_library returns None when lib not found
+-    if lib is None:
+-      continue
+-    try:
+-      return ctypes.CDLL(lib)
+-    except OSError:
+-      pass
+-  else:
+-    # It is better to raise an ImportError since we are importing magic module
+-    raise ImportError('failed to find libmagic.  Check your installation')
++  try:
++    return ctypes.CDLL(lib)
++  except OSError:
++    pass
+ 
++  # It is better to raise an ImportError since we are importing magic module
++  raise ImportError('failed to find libmagic.  Check your installation')
diff --git a/nixpkgs/pkgs/development/python-modules/python-manilaclient/default.nix b/nixpkgs/pkgs/development/python-modules/python-manilaclient/default.nix
new file mode 100644
index 000000000000..60be5e80c8c7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-manilaclient/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, installShellFiles
+, pbr
+, openstackdocstheme
+, oslo-config
+, oslo-log
+, oslo-serialization
+, oslo-utils
+, prettytable
+, requests
+, simplejson
+, sphinx
+, sphinxcontrib-programoutput
+, babel
+, osc-lib
+, python-keystoneclient
+, debtcollector
+, callPackage
+}:
+
+buildPythonPackage rec {
+  pname = "python-manilaclient";
+  version = "4.6.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JFdpPX2lVSGN/jVsKMOOKrPm51fwpD476TnQo/0AYWQ=";
+  };
+
+  nativeBuildInputs = [
+    installShellFiles
+    openstackdocstheme
+    sphinx
+    sphinxcontrib-programoutput
+  ];
+
+  propagatedBuildInputs = [
+    pbr
+    oslo-config
+    oslo-log
+    oslo-serialization
+    oslo-utils
+    prettytable
+    requests
+    simplejson
+    babel
+    osc-lib
+    python-keystoneclient
+    debtcollector
+  ];
+
+  postInstall = ''
+    export PATH=$out/bin:$PATH
+    sphinx-build -a -E -d doc/build/doctrees -b man doc/source doc/build/man
+    installManPage doc/build/man/python-manilaclient.1
+  '';
+
+  # Checks moved to 'passthru.tests' to workaround infinite recursion
+  doCheck = false;
+
+  passthru.tests = {
+    tests = callPackage ./tests.nix { };
+  };
+
+  pythonImportsCheck = [
+    "manilaclient"
+  ];
+
+  meta = with lib; {
+    description = "Client library for OpenStack Manila API";
+    homepage = "https://github.com/openstack/python-manilaclient";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-manilaclient/tests.nix b/nixpkgs/pkgs/development/python-modules/python-manilaclient/tests.nix
new file mode 100644
index 000000000000..d1ceb5ed7431
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-manilaclient/tests.nix
@@ -0,0 +1,30 @@
+{ buildPythonPackage
+, python-manilaclient
+, stestr
+, ddt
+, tempest
+, mock
+, python-openstackclient
+}:
+
+buildPythonPackage {
+  pname = "python-manilaclient-tests";
+  inherit (python-manilaclient) version src;
+  format = "other";
+
+  dontBuild = true;
+  dontInstall = true;
+
+  nativeCheckInputs = [
+    python-manilaclient
+    stestr
+    ddt
+    tempest
+    mock
+    python-openstackclient
+  ];
+
+  checkPhase = ''
+    stestr run
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-mapnik/default.nix b/nixpkgs/pkgs/development/python-modules/python-mapnik/default.nix
new file mode 100644
index 000000000000..5eee8f59c39b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-mapnik/default.nix
@@ -0,0 +1,148 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, substituteAll
+, isPyPy
+, python
+, pillow
+, pycairo
+, pkg-config
+, boost182
+, cairo
+, harfbuzz
+, icu
+, libjpeg
+, libpng
+, libtiff
+, libwebp
+, mapnik
+, proj
+, zlib
+, libxml2
+, sqlite
+, nose
+, pytestCheckHook
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "python-mapnik";
+  version = "unstable-2020-09-08";
+
+  src = fetchFromGitHub {
+    owner = "mapnik";
+    repo = "python-mapnik";
+    rev = "a2c2a86eec954b42d7f00093da03807d0834b1b4";
+    hash = "sha256-GwDdrutJOHtW7pIWiUAiu1xucmRvp7YFYB3YSCrDsrY=";
+    # Only needed for test data
+    fetchSubmodules = true;
+  };
+
+  patches = [
+    # https://github.com/mapnik/python-mapnik/issues/239
+    (fetchpatch {
+      url = "https://github.com/koordinates/python-mapnik/commit/318b1edac16f48a7f21902c192c1dd86f6210a44.patch";
+      hash = "sha256-cfU8ZqPPGCqoHEyGvJ8Xy/bGpbN2vSDct6A3N5+I8xM=";
+    })
+    ./find-pycairo-with-pkg-config.patch
+    # python-mapnik seems to depend on having the mapnik src directory
+    # structure available at build time. We just hardcode the paths.
+    (substituteAll {
+      src = ./find-libmapnik.patch;
+      libmapnik = "${mapnik}/lib";
+    })
+  ];
+
+  nativeBuildInputs = [
+    mapnik # for mapnik_config
+    pkg-config
+  ];
+
+  buildInputs = [
+    mapnik
+    boost182
+    cairo
+    harfbuzz
+    icu
+    libjpeg
+    libpng
+    libtiff
+    libwebp
+    proj
+    zlib
+    libxml2
+    sqlite
+  ];
+
+  propagatedBuildInputs = [ pillow pycairo ];
+
+  configureFlags = [
+    "XMLPARSER=libxml2"
+  ];
+
+  disabled = isPyPy;
+
+  preBuild = ''
+    export BOOST_PYTHON_LIB="boost_python${"${lib.versions.major python.version}${lib.versions.minor python.version}"}"
+    export BOOST_THREAD_LIB="boost_thread"
+    export BOOST_SYSTEM_LIB="boost_system"
+    export PYCAIRO=true
+    export XMLPARSER=libxml2
+  '';
+
+  nativeCheckInputs = [
+    nose
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    # import from $out
+    rm -r mapnik
+  '' + lib.optionalString stdenv.isDarwin ''
+    # Replace the hardcoded /tmp references with $TMPDIR
+    sed -i "s,/tmp,$TMPDIR,g" test/python_tests/*.py
+  '';
+
+  # https://github.com/mapnik/python-mapnik/issues/255
+  disabledTests = [
+    "test_adding_datasource_to_layer"
+    "test_compare_map"
+    "test_dataraster_coloring"
+    "test_dataraster_query_point"
+    "test_geometry_type"
+    "test_good_files"
+    "test_layer_init"
+    "test_load_save_map"
+    "test_loading_fontset_from_map"
+    "test_normalizing_definition"
+    "test_pdf_printing"
+    "test_proj_antimeridian_bbox"
+    "test_proj_transform_between_init_and_literal"
+    "test_pycairo_pdf_surface1"
+    "test_pycairo_svg_surface1"
+    "test_query_tolerance"
+    "test_raster_warping"
+    "test_raster_warping_does_not_overclip_source"
+    "test_render_points"
+    "test_render_with_scale_factor"
+    "test_style_level_image_filter"
+    "test_that_coordinates_do_not_overflow_and_polygon_is_rendered_csv"
+    "test_that_coordinates_do_not_overflow_and_polygon_is_rendered_memory"
+    "test_transparency_levels"
+    "test_visual_zoom_all_rendering1"
+    "test_visual_zoom_all_rendering2"
+    "test_wgs84_inverse_forward"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_passing_pycairo_context_pdf"
+  ];
+
+  pythonImportsCheck = [ "mapnik" ];
+
+  meta = with lib; {
+    description = "Python bindings for Mapnik";
+    maintainers = with maintainers; [ ];
+    homepage = "https://mapnik.org";
+    license = licenses.lgpl21Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-mapnik/find-libmapnik.patch b/nixpkgs/pkgs/development/python-modules/python-mapnik/find-libmapnik.patch
new file mode 100644
index 000000000000..cec557a2940a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-mapnik/find-libmapnik.patch
@@ -0,0 +1,30 @@
+diff --git a/build.py b/build.py
+index 0f94826b6..3cceb4546 100644
+--- a/build.py
++++ b/build.py
+@@ -110,8 +110,8 @@ py_env.AppendUnique(LIBS='mapnik-wkt')
+ _mapnik = py_env.LoadableModule('mapnik/_mapnik', sources, LDMODULEPREFIX='', LDMODULESUFFIX='.so')
+ 
+ Depends(_mapnik, env.subst('../../src/%s' % env['MAPNIK_LIB_NAME']))
+-Depends(_mapnik, env.subst('../../src/json/libmapnik-json${LIBSUFFIX}'))
+-Depends(_mapnik, env.subst('../../src/wkt/libmapnik-wkt${LIBSUFFIX}'))
++Depends(_mapnik, env.subst('@libmapnik@/libmapnikjson${LIBSUFFIX}'))
++Depends(_mapnik, env.subst('@libmapnik@/libmapnikwkt${LIBSUFFIX}'))
+ 
+ if 'uninstall' not in COMMAND_LINE_TARGETS:
+     pymapniklib = env.Install(target_path,_mapnik)
+diff --git a/setup.py b/setup.py
+index 9985da5a2..5a03a1ec8 100755
+--- a/setup.py
++++ b/setup.py
+@@ -118,8 +118,8 @@ linkflags.extend(check_output([mapnik_config, '--libs']).split(' '))
+ linkflags.extend(check_output([mapnik_config, '--ldflags']).split(' '))
+ linkflags.extend(check_output([mapnik_config, '--dep-libs']).split(' '))
+ linkflags.extend([
+-'-lmapnik-wkt',
+-'-lmapnik-json',
++'-lmapnikwkt',
++'-lmapnikjson',
+ ] + ['-l%s' % i for i in get_boost_library_names()])
+ 
+ # Dynamically make the mapnik/paths.py file
diff --git a/nixpkgs/pkgs/development/python-modules/python-mapnik/find-pycairo-with-pkg-config.patch b/nixpkgs/pkgs/development/python-modules/python-mapnik/find-pycairo-with-pkg-config.patch
new file mode 100644
index 000000000000..1f35af36ee82
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-mapnik/find-pycairo-with-pkg-config.patch
@@ -0,0 +1,18 @@
+diff --git a/setup.py b/setup.py
+index 82a31d733..1c876a553 100755
+--- a/setup.py
++++ b/setup.py
+@@ -228,10 +228,9 @@ extra_comp_args = list(filter(lambda arg: arg != "-fvisibility=hidden", extra_co
+ if os.environ.get("PYCAIRO", "false") == "true":
+     try:
+         extra_comp_args.append('-DHAVE_PYCAIRO')
+-        print("-I%s/include/pycairo".format(sys.exec_prefix))
+-        extra_comp_args.append("-I{0}/include/pycairo".format(sys.exec_prefix))
+-        #extra_comp_args.extend(check_output(["pkg-config", '--cflags', 'pycairo']).strip().split(' '))
+-        #linkflags.extend(check_output(["pkg-config", '--libs', 'pycairo']).strip().split(' '))
++        pycairo_name = 'py3cairo' if PYTHON3 else 'pycairo'
++        extra_comp_args.extend(check_output(["pkg-config", '--cflags', pycairo_name]).strip().split(' '))
++        linkflags.extend(check_output(["pkg-config", '--libs', pycairo_name]).strip().split(' '))
+     except:
+         raise Exception("Failed to find compiler options for pycairo")
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/python-markdown-math/default.nix b/nixpkgs/pkgs/development/python-modules/python-markdown-math/default.nix
new file mode 100644
index 000000000000..959448d2ea22
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-markdown-math/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, markdown
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "python-markdown-math";
+  version = "0.8";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8564212af679fc18d53f38681f16080fcd3d186073f23825c7ce86fadd3e3635";
+  };
+
+  nativeCheckInputs = [ markdown ];
+
+  meta = {
+    description = "Math extension for Python-Markdown";
+    homepage = "https://github.com/mitya57/python-markdown-math";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ klntsky ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-matter-server/default.nix b/nixpkgs/pkgs/development/python-modules/python-matter-server/default.nix
new file mode 100644
index 000000000000..36e6ca30fcbd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-matter-server/default.nix
@@ -0,0 +1,90 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build
+, setuptools
+, wheel
+
+# propagates
+, aiohttp
+, aiorun
+, coloredlogs
+, dacite
+, orjson
+, home-assistant-chip-clusters
+
+# optionals
+, cryptography
+, home-assistant-chip-core
+
+# tests
+, python
+, pytest
+, pytest-aiohttp
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-matter-server";
+  version = "4.0.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = "python-matter-server";
+    rev = "refs/tags/${version}";
+    hash = "sha256-fyVvmYznYuhDhU3kApXgXjkPdwhJFxoFq3U87ichmt8=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    aiorun
+    coloredlogs
+    dacite
+    orjson
+    home-assistant-chip-clusters
+  ];
+
+  passthru.optional-dependencies = {
+    server = [
+      cryptography
+      home-assistant-chip-core
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytestCheckHook
+  ]
+  ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  preCheck = let
+    pythonEnv = python.withPackages (_: propagatedBuildInputs ++ nativeCheckInputs ++ [ pytest ]);
+  in
+  ''
+    export PYTHONPATH=${pythonEnv}/${python.sitePackages}
+  '';
+
+  pytestFlagsArray = [
+    # Upstream theymselves limit the test scope
+    # https://github.com/home-assistant-libs/python-matter-server/blob/main/.github/workflows/test.yml#L65
+    "tests/server"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/home-assistant-libs/python-matter-server/releases/tag/${version}";
+    description = "Python server to interact with Matter";
+    homepage = "https://github.com/home-assistant-libs/python-matter-server";
+    license = licenses.asl20;
+    maintainers = teams.home-assistant.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-mbedtls/default.nix b/nixpkgs/pkgs/development/python-modules/python-mbedtls/default.nix
new file mode 100644
index 000000000000..967bade85b3b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-mbedtls/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, certifi
+, cython
+, mbedtls_2
+, pytestCheckHook
+, setuptools
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "python-mbedtls";
+  version = "2.8.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Synss";
+    repo = "python-mbedtls";
+    rev = version;
+    hash = "sha256-gMFludfAprQ/1JR77Ee6/xVvGLJ9pY1LrouLpSKVrzk=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    setuptools
+  ];
+
+  buildInputs = [
+    mbedtls_2
+  ];
+
+  propagatedBuildInputs = [
+    certifi
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "mbedtls" ];
+
+  meta = with lib; {
+    description = "Cryptographic library with an mbed TLS back end";
+    homepage = "https://github.com/Synss/python-mbedtls";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-memcached/default.nix b/nixpkgs/pkgs/development/python-modules/python-memcached/default.nix
new file mode 100644
index 000000000000..180e70f1c1d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-memcached/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, six
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-memcached";
+  version = "1.59";
+
+  src = fetchFromGitHub {
+    owner = "linsomniac";
+    repo = "python-memcached";
+    rev = version;
+    hash = "sha256-tHqkwNloPTXOrEGtuDLu1cTw4SKJ4auv8UUbqdNp698=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  # all tests fail
+  doCheck = false;
+
+  pythonImportsCheck = [ "memcache" ];
+
+  meta = with lib; {
+    description = "Pure python memcached client";
+    homepage = "https://github.com/linsomniac/python-memcached";
+    license = licenses.psfl;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-miio/default.nix b/nixpkgs/pkgs/development/python-modules/python-miio/default.nix
new file mode 100644
index 000000000000..1d900d3d7fd8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-miio/default.nix
@@ -0,0 +1,87 @@
+{ lib
+, android-backup
+, appdirs
+, attrs
+, buildPythonPackage
+, click
+, construct
+, croniter
+, cryptography
+, defusedxml
+, fetchPypi
+, fetchpatch
+, importlib-metadata
+, micloud
+, netifaces
+, poetry-core
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, pytz
+, pyyaml
+, tqdm
+, zeroconf
+}:
+
+
+buildPythonPackage rec {
+  pname = "python-miio";
+  version = "0.5.12";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BJw1Gg3FO2R6WWKjkrpxDN4fTMTug5AIj0SNq1gEbBY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  patches = [
+    (fetchpatch {
+      # Fix pytest 7.2 compat
+      url = "https://github.com/rytilahti/python-miio/commit/67d9d771d04d51f5bd97f361ca1c15ae4a18c274.patch";
+      hash = "sha256-Os9vCSKyieCqHs63oX6gcLrtv1N7hbX5WvEurelEp8w=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    android-backup
+    appdirs
+    attrs
+    click
+    construct
+    croniter
+    cryptography
+    defusedxml
+    micloud
+    netifaces
+    pytz
+    pyyaml
+    tqdm
+    zeroconf
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "miio"
+  ];
+
+  meta = with lib; {
+    description = "Python library for interfacing with Xiaomi smart appliances";
+    homepage = "https://github.com/rytilahti/python-miio";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ flyfloh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-mimeparse/default.nix b/nixpkgs/pkgs/development/python-modules/python-mimeparse/default.nix
new file mode 100644
index 000000000000..e5aa879136b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-mimeparse/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-mimeparse";
+  version = "1.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "76e4b03d700a641fd7761d3cd4fdbbdcd787eade1ebfac43f877016328334f78";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A module provides basic functions for parsing mime-type names and matching them against a list of media-ranges";
+    homepage = "https://github.com/dbtsai/python-mimeparse";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-mnist/default.nix b/nixpkgs/pkgs/development/python-modules/python-mnist/default.nix
new file mode 100644
index 000000000000..131c0f2f5acb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-mnist/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "python-mnist";
+  version = "0.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a0cced01e83b5b844cff86109280df7a672a8e4e38fc19fa68999a17f8a9fbd8";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/sorki/python-mnist";
+    description = "Simple MNIST data parser written in Python";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ cmcdragonkai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-mpv-jsonipc/default.nix b/nixpkgs/pkgs/development/python-modules/python-mpv-jsonipc/default.nix
new file mode 100644
index 000000000000..4834b6bd9aa7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-mpv-jsonipc/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchFromGitHub, requests
+, tqdm, websocket-client, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "python-mpv-jsonipc";
+  version = "1.2.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "iwalton3";
+    repo = "python-mpv-jsonipc";
+    rev = "v${version}";
+    hash = "sha256-W9TNtbRhQmwZXhi0TJIDkZRtWhi92/iwL056YIcWnLM=";
+  };
+
+  # 'mpv-jsonipc' does not have any tests
+  doCheck = false;
+
+  propagatedBuildInputs = [ requests tqdm websocket-client ];
+
+  pythonImportsCheck = [ "python_mpv_jsonipc" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/iwalton3/python-mpv-jsonipc";
+    description = "Python API to MPV using JSON IPC";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ colemickens ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-multipart/default.nix b/nixpkgs/pkgs/development/python-modules/python-multipart/default.nix
new file mode 100644
index 000000000000..3c04398e56d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-multipart/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hatchling
+, pytestCheckHook
+, mock
+, pyyaml
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "python-multipart";
+  version = "0.0.6";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "python_multipart";
+    inherit version;
+    hash = "sha256-6ZJagLtmhSnxtnx/2wpdrN18v8b7C/8+pEP+Ir3WITI=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  pythonImportsCheck = [
+    "multipart"
+  ];
+
+  preCheck = ''
+    # https://github.com/andrew-d/python-multipart/issues/41
+    substituteInPlace multipart/tests/test_multipart.py \
+      --replace "yaml.load" "yaml.safe_load"
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+    pyyaml
+  ];
+
+  meta = with lib; {
+    description = "A streaming multipart parser for Python";
+    homepage = "https://github.com/andrew-d/python-multipart";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-musicpd/default.nix b/nixpkgs/pkgs/development/python-modules/python-musicpd/default.nix
new file mode 100644
index 000000000000..cc4ab6b722f0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-musicpd/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "python-musicpd";
+  version = "0.8.0";
+
+  src = fetchPypi {
+    inherit pname;
+    inherit version;
+    sha256 = "sha256-5Br4rZO1c/pPmAZ/UecYjuVLttR8R+xeReKsc/xnaeI=";
+  };
+
+  format = "setuptools";
+
+  doCheck = true;
+
+  meta = with lib; {
+    description = "An MPD (Music Player Daemon) client library written in pure Python.";
+    homepage = "https://gitlab.com/kaliko/python-musicpd";
+    license = licenses.lgpl3Plus;
+    maintainers = with lib.maintainers; [ apfelkuchen6 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-myq/default.nix b/nixpkgs/pkgs/development/python-modules/python-myq/default.nix
new file mode 100644
index 000000000000..88248abde3a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-myq/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, aiohttp
+, beautifulsoup4
+, buildPythonPackage
+, fetchFromGitHub
+, pkce
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-myq";
+  version = "3.1.13";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Python-MyQ";
+    repo = "Python-MyQ";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-kW03swRXZdkh45I/up/FIxv0WGBRqTlDt1X71Ow/hrg=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "poetry-core==1.6.1" "poetry-core"
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    beautifulsoup4
+    pkce
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pymyq"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for MyQ API";
+    homepage = "https://github.com/Python-MyQ/Python-MyQ";
+    changelog = "https://github.com/Python-MyQ/Python-MyQ/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-mystrom/default.nix b/nixpkgs/pkgs/development/python-modules/python-mystrom/default.nix
new file mode 100644
index 000000000000..16b634999c89
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-mystrom/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+, click
+, requests
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "python-mystrom";
+  version = "2.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VFsTA/isBw0H7qXQhOX6K2p1QcVxO7q5TIzf8YivVgc=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    click
+    requests
+    setuptools
+  ];
+
+  # no tests are present
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pymystrom.bulb"
+    "pymystrom.pir"
+    "pymystrom.switch"
+  ];
+
+  meta = with lib; {
+    description = "Python API client for interacting with myStrom devices";
+    longDescription = ''
+      Asynchronous Python API client for interacting with myStrom devices.
+      There is support for bulbs, motion sensors, plugs and buttons.
+    '';
+    homepage = "https://github.com/home-assistant-ecosystem/python-mystrom";
+    changelog = "https://github.com/home-assistant-ecosystem/python-mystrom/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-ndn/default.nix b/nixpkgs/pkgs/development/python-modules/python-ndn/default.nix
new file mode 100644
index 000000000000..6c47e8189a92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-ndn/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, aenum
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, lark
+, poetry-core
+, poetry-dynamic-versioning
+, pycryptodomex
+, pygtrie
+, pytestCheckHook
+, pythonRelaxDepsHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "python-ndn";
+  version = "0.4.1";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "named-data";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ArTP4LQu7VNjI/N13gMTc1SDiNmW5l4GdLYOk8JEfKg=";
+  };
+
+  disabled = pythonOlder "3.11";
+
+  nativeBuildInputs = [
+    setuptools
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    poetry-dynamic-versioning
+    pycryptodomex
+    lark
+    pygtrie
+    aenum
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonRelaxDeps = [
+    "lark"
+  ];
+
+  pythonImportChecks = [ "ndn" ];
+
+  meta = with lib; {
+    description = "An NDN client library with AsyncIO support";
+    homepage = "https://github.com/named-data/python-ndn";
+    changelog = "https://github.com/named-data/python-ndn/blob/${src.rev}/CHANGELOG.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ janik ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-nest/default.nix b/nixpkgs/pkgs/development/python-modules/python-nest/default.nix
new file mode 100644
index 000000000000..1cbdd2837a72
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-nest/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python-dateutil
+, requests
+, six
+, sseclient-py
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-nest";
+  version = "4.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-01hoZbDssbJ10NA72gOtlzjZMGjsUBUoVDVM35uAOLU=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    requests
+    six
+    sseclient-py
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "nest"
+  ];
+
+  meta = with lib; {
+    description = "Python API and command line tool for talking to the Nest™ Thermostat";
+    homepage = "https://github.com/jkoelker/python-nest";
+    license = licenses.cc-by-nc-sa-40;
+    maintainers = with maintainers; [ jamiemagee ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-nmap/default.nix b/nixpkgs/pkgs/development/python-modules/python-nmap/default.nix
new file mode 100644
index 000000000000..a68794af5a4d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-nmap/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nmap
+}:
+
+buildPythonPackage rec {
+  pname = "python-nmap";
+  version = "0.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-91r2uR3Y47DDH4adsyFj9iraaGlF5bfCX4S8D3+tO2Q=";
+  };
+
+  propagatedBuildInputs = [
+    nmap
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "universal=3" "universal=1"
+  '';
+
+  # Tests requires sudo and performs scans
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "nmap"
+  ];
+
+  meta = with lib; {
+    description = "Python library which helps in using nmap";
+    longDescription = ''
+      python-nmap is a Python library which helps in using nmap port scanner. It
+      allows to easily manipulate nmap scan results and will be a perfect tool
+      for systems administrators who want to automatize scanning task and reports.
+      It also supports nmap script outputs.
+    '';
+    homepage = "http://xael.org/pages/python-nmap-en.html";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-nomad/default.nix b/nixpkgs/pkgs/development/python-modules/python-nomad/default.nix
new file mode 100644
index 000000000000..3a7750e9deac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-nomad/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-nomad";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5IyHNw1ArE8fU9DoSQMGkDI9d/OiR1YI/7nTPeFIK+A=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Tests require nomad agent
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "nomad"
+  ];
+
+  meta = with lib; {
+    description = "Python client library for Hashicorp Nomad";
+    homepage = "https://github.com/jrxFive/python-nomad";
+    changelog = "https://github.com/jrxFive/python-nomad/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ xbreak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-novaclient/default.nix b/nixpkgs/pkgs/development/python-modules/python-novaclient/default.nix
new file mode 100644
index 000000000000..1bad0f4e6930
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-novaclient/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ddt
+, iso8601
+, keystoneauth1
+, openssl
+, oslo-i18n
+, oslo-serialization
+, pbr
+, prettytable
+, pythonOlder
+, requests-mock
+, stestr
+, testscenarios
+}:
+
+buildPythonPackage rec {
+  pname = "python-novaclient";
+  version = "18.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-a2tq4sEescEI469V6qchGw/JGZk1oimmuj4N5RTBK1A=";
+  };
+
+  propagatedBuildInputs = [
+    iso8601
+    keystoneauth1
+    oslo-i18n
+    oslo-serialization
+    pbr
+    prettytable
+  ];
+
+  nativeCheckInputs = [
+    ddt
+    openssl
+    requests-mock
+    stestr
+    testscenarios
+  ];
+
+  checkPhase = ''
+    stestr run -e <(echo "
+    novaclient.tests.unit.test_shell.ShellTest.test_osprofiler
+    novaclient.tests.unit.test_shell.ShellTestKeystoneV3.test_osprofiler
+    ")
+  '';
+
+  pythonImportsCheck = [ "novaclient" ];
+
+  meta = with lib; {
+    description = "Client library for OpenStack Compute API";
+    homepage = "https://github.com/openstack/python-novaclient";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-nvd3/default.nix b/nixpkgs/pkgs/development/python-modules/python-nvd3/default.nix
new file mode 100644
index 000000000000..6ad6b6d56de0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-nvd3/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchFromGitHub, python-slugify, jinja2, setuptools, coverage }:
+
+buildPythonPackage rec {
+  pname = "python-nvd3";
+  version = "0.15.0";
+
+  src = fetchFromGitHub {
+    owner = "areski";
+    repo = "python-nvd3";
+    rev = "dc8e772597ed72f413b229856fc9a3318e57fcfc";
+    sha256 = "1vjnicszcc9j0rgb58104fk9sry5xad1xli64jana9bkx42c6x1v";
+  };
+
+  propagatedBuildInputs = [ python-slugify jinja2 setuptools ];
+  nativeCheckInputs = [ coverage ];
+
+  checkPhase = ''
+    coverage run --source=nvd3 setup.py test
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/areski/python-nvd3";
+    description = "Python Wrapper for NVD3 - It's time for beautiful charts";
+    license = licenses.mit;
+    maintainers = [ maintainers.ivan-tkatchev ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-oauth2/default.nix b/nixpkgs/pkgs/development/python-modules/python-oauth2/default.nix
new file mode 100644
index 000000000000..cd45cbe7d284
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-oauth2/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "python-oauth2";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d7a8544927ac18215ba5317edd8f640a5f1f0593921bcf3ce862178312c8c9a4";
+  };
+  # attempts to run mysql
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Framework that aims at making it easy to provide authentication via OAuth 2.0 within an application stack";
+    homepage =  "https://github.com/wndhydrnt/python-oauth2";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-olm/default.nix b/nixpkgs/pkgs/development/python-modules/python-olm/default.nix
new file mode 100644
index 000000000000..e255a9b8915c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-olm/default.nix
@@ -0,0 +1,44 @@
+{ lib, buildPythonPackage, isPy3k, olm
+, cffi
+, future
+, aspectlib
+, pytest-benchmark
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  pname = "python-olm";
+  inherit (olm) src version;
+
+  disabled = !isPy3k;
+
+  sourceRoot = "${olm.src.name}/python";
+  buildInputs = [ olm ];
+
+  preBuild = ''
+    make include/olm/olm.h
+  '';
+
+  propagatedBuildInputs = [
+    cffi
+    future
+  ];
+
+  propagatedNativeBuildInputs = [
+    cffi
+  ];
+
+  pythonImportsCheck = [ "olm" ];
+
+  nativeCheckInputs = [
+    aspectlib
+    pytest-benchmark
+    pytestCheckHook
+  ];
+
+  meta = {
+    inherit (olm.meta) license maintainers;
+    description = "Python bindings for Olm";
+    homepage = "https://gitlab.matrix.org/matrix-org/olm/tree/master/python";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-on-whales/default.nix b/nixpkgs/pkgs/development/python-modules/python-on-whales/default.nix
new file mode 100644
index 000000000000..eef8f21cb3aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-on-whales/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pythonOlder
+, pydantic
+, requests
+, tqdm
+, typer
+}:
+
+buildPythonPackage rec {
+  pname = "python-on-whales";
+  version = "0.67.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "gabrieldemarmiesse";
+    repo = "python-on-whales";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-wO2ZSELxu8BmIZN4x2mSLzsbU3sU49MEpjTfiSzVzaE=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  propagatedBuildInputs = [
+    pydantic
+    requests
+    tqdm
+    typer
+  ];
+
+  doCheck = false;  # majority of tests require Docker and/or network access
+  pythonImportsCheck = [ "python_on_whales" ];
+
+  meta = with lib; {
+    description = "Docker client for Python, designed to be fun and intuitive";
+    homepage = "https://github.com/gabrieldemarmiesse/python-on-whales";
+    changelog = "https://github.com/gabrieldemarmiesse/python-on-whales/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-opendata-transport/default.nix b/nixpkgs/pkgs/development/python-modules/python-opendata-transport/default.nix
new file mode 100644
index 000000000000..473eb8089707
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-opendata-transport/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "python-opendata-transport";
+  version = "0.4.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    pname = "python_opendata_transport";
+    inherit version;
+    hash = "sha256-2lEKPu5vjyqNUqz1NGmZ5b6YP3oWnCgoubDdiQCbdps=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    urllib3
+  ];
+
+  # No tests are present
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "opendata_transport"
+  ];
+
+  meta = with lib; {
+    description = "Python client for interacting with transport.opendata.ch";
+    homepage = "https://github.com/home-assistant-ecosystem/python-opendata-transport";
+    changelog = "https://github.com/home-assistant-ecosystem/python-opendata-transport/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-openems/default.nix b/nixpkgs/pkgs/development/python-modules/python-openems/default.nix
new file mode 100644
index 000000000000..7a186276dfc7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-openems/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, openems
+, csxcad
+, boost
+, python-csxcad
+, numpy
+, h5py
+}:
+
+buildPythonPackage rec {
+  pname = "python-openems";
+  version = "unstable-2020-02-15";
+
+  src = fetchFromGitHub {
+    owner = "thliebig";
+    repo = "openEMS";
+    rev = "ba793ac84e2f78f254d6d690bb5a4c626326bbfd";
+    sha256 = "1dca6b6ccy771irxzsj075zvpa3dlzv4mjb8xyg9d889dqlgyl45";
+  };
+
+  sourceRoot = "${src.name}/python";
+
+  nativeBuildInputs = [
+    cython
+    boost
+  ];
+
+  propagatedBuildInputs = [
+    openems
+    csxcad
+    python-csxcad
+    numpy
+    h5py
+  ];
+
+  setupPyBuildFlags = [ "-I${openems}/include" "-L${openems}/lib" "-R${openems}/lib" ];
+  pythonImportsCheck = [ "openEMS" ];
+
+  meta = with lib; {
+    description = "Python interface to OpenEMS";
+    homepage = "http://openems.de/index.php/Main_Page.html";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ matthuszagh ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-opensky/default.nix b/nixpkgs/pkgs/development/python-modules/python-opensky/default.nix
new file mode 100644
index 000000000000..0f23163d9aff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-opensky/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pydantic
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, syrupy
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "python-opensky";
+  version = "0.2.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "joostlek";
+    repo = "python-opensky";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-xNXFvCUZ/x5ox3KxmG3eA73wpX4fwhvAVmlfcKiT1V8=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'version = "0.0.0"' 'version = "${version}"' \
+      --replace "--cov" ""
+    substituteInPlace src/python_opensky/opensky.py \
+      --replace ".joinpath(uri)" "/ uri"
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pydantic
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+    syrupy
+  ];
+
+  pythonImportsCheck = [
+    "python_opensky"
+  ];
+
+  meta = with lib; {
+    description = "Asynchronous Python client for the OpenSky API";
+    homepage = "https://github.com/joostlek/python-opensky";
+    changelog = "https://github.com/joostlek/python-opensky/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-openstackclient/default.nix b/nixpkgs/pkgs/development/python-modules/python-openstackclient/default.nix
new file mode 100644
index 000000000000..fdafe57d5ccf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-openstackclient/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ddt
+, installShellFiles
+, openstackdocstheme
+, osc-lib
+, pbr
+, python-cinderclient
+, python-keystoneclient
+, python-novaclient
+, requests-mock
+, sphinx
+, stestr
+}:
+
+buildPythonPackage rec {
+  pname = "python-openstackclient";
+  version = "6.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-m6C9+NAwh+WFtAqNzEKc673V/ewkwdYKECv58zEyDfE=";
+  };
+
+  nativeBuildInputs = [
+    installShellFiles
+    openstackdocstheme
+    sphinx
+  ];
+
+  propagatedBuildInputs = [
+    osc-lib
+    pbr
+    python-cinderclient
+    python-keystoneclient
+    python-novaclient
+  ];
+
+  postInstall = ''
+    sphinx-build -a -E -d doc/build/doctrees -b man doc/source doc/build/man
+    installManPage doc/build/man/openstack.1
+  '';
+
+  nativeCheckInputs = [
+    ddt
+    stestr
+    requests-mock
+  ];
+
+  checkPhase = ''
+    stestr run
+  '';
+
+  pythonImportsCheck = [ "openstackclient" ];
+
+  meta = with lib; {
+    description = "OpenStack Command-line Client";
+    homepage = "https://github.com/openstack/python-openstackclient";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-openzwave-mqtt/default.nix b/nixpkgs/pkgs/development/python-modules/python-openzwave-mqtt/default.nix
new file mode 100644
index 000000000000..68b51fc2fb3d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-openzwave-mqtt/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, asyncio-mqtt
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-openzwave-mqtt";
+  version = "1.4.0";
+
+  src = fetchFromGitHub {
+    owner = "cgarwood";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0zqx00dacs59y4gjr4swrn46c7hrp8a1167bcl270333284m8mqm";
+  };
+
+  propagatedBuildInputs = [
+    asyncio-mqtt
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for OpenZWave's MQTT daemon";
+    homepage = "https://github.com/cgarwood/python-openzwave-mqtt";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-osc/default.nix b/nixpkgs/pkgs/development/python-modules/python-osc/default.nix
new file mode 100644
index 000000000000..500e6beb0b0e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-osc/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "python-osc";
+  version = "1.8.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-pc4bpWyNgt9Ryz8pRrXdM6cFInkazEuFZOYtKyCtnKo=";
+  };
+
+  pythonImportsCheck = [ "pythonosc" ];
+
+  meta = with lib; {
+    description = "Open Sound Control server and client in pure python";
+    homepage = "https://github.com/attwad/python-osc";
+    license = licenses.unlicense;
+    maintainers = with maintainers; [ anirrudh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-otbr-api/default.nix b/nixpkgs/pkgs/development/python-modules/python-otbr-api/default.nix
new file mode 100644
index 000000000000..d6137cf191e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-otbr-api/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, aiohttp
+, bitstruct
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, fetchpatch
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, voluptuous
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "python-otbr-api";
+  version = "2.5.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-bPN2h60ypjlKpXs1xDS7bZcGRXvatA3EdlAX/HLxxTM=";
+  };
+
+  patches = [
+    # https://github.com/home-assistant-libs/python-otbr-api/pull/68
+    (fetchpatch {
+      name = "relax-setuptools-dependency.patch";
+      url = "https://github.com/home-assistant-libs/python-otbr-api/commit/37eb19c12d17ac7d040ded035d8401def872fbda.patch";
+      hash = "sha256-JGsaLQNbUfz0uK/MeGnR2XTJDs4RnTOEg7BavfDPArg=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    bitstruct
+    cryptography
+    voluptuous
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "python_otbr_api"
+  ];
+
+  meta = with lib; {
+    description = "Library for the Open Thread Border Router";
+    homepage = "https://github.com/home-assistant-libs/python-otbr-api";
+    changelog = "https://github.com/home-assistant-libs/python-otbr-api/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-owasp-zap-v2-4/default.nix b/nixpkgs/pkgs/development/python-modules/python-owasp-zap-v2-4/default.nix
new file mode 100644
index 000000000000..ad8117b996bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-owasp-zap-v2-4/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyhamcrest
+, pytestCheckHook
+, requests
+, requests-mock
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "python-owasp-zap-v2-4";
+  version = "0.0.18";
+
+  src = fetchFromGitHub {
+    owner = "zaproxy";
+    repo = "zap-api-python";
+    rev = version;
+    sha256 = "0b46m9s0vwaaq8vhiqspdr2ns9qdw65fnjh8mf58gjinlsd27ygk";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    six
+  ];
+
+  nativeCheckInputs = [
+    pyhamcrest
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pythonImportsCheck = [ "zapv2" ];
+
+  meta = with lib; {
+    description = "Python library to access the OWASP ZAP API";
+    homepage = "https://github.com/zaproxy/zap-api-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-packer/default.nix b/nixpkgs/pkgs/development/python-modules/python-packer/default.nix
new file mode 100644
index 000000000000..2e2b59eb29d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-packer/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, fetchpatch, sh }:
+
+buildPythonPackage rec {
+  pname = "python-packer";
+  version = "0.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fd363dae9bd2efd447739bbf7a4f29c1e4741596ae7b02d252fe525b2b4176e7";
+  };
+
+  patches = fetchpatch {
+    url = "${meta.homepage}/commit/de3421bf13bf7c3ec11fe0a381f0944e102b1d97.patch";
+    excludes = [ "dev-requirements.txt" ];
+    sha256 = "0rgmkyn7i6y1xs8m75dpl8hq7j2ns2s3dvp7kv9j4zwic93rrlsc";
+  };
+
+  propagatedBuildInputs = [ sh ];
+
+  # Tests requires network connections
+  doCheck = false;
+
+  meta = with lib; {
+    description = "An interface for packer.io";
+    homepage = "https://github.com/nir0s/python-packer";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-pae/default.nix b/nixpkgs/pkgs/development/python-modules/python-pae/default.nix
new file mode 100644
index 000000000000..73456cbd8f55
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-pae/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, poetry-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-pae";
+  version = "0.1.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  # Tests are on GitHub
+  src = fetchFromGitHub {
+    owner = "MatthiasValvekens";
+    repo = "python-pae";
+    rev = version;
+    hash = "sha256-D0X2T0ze79KR6Gno4UWpA/XvlkK6Y/jXUtLbzlOKr3E=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "python_pae" ];
+
+  meta = with lib; {
+    description = "Pre-authentication encoding (PAE) implementation in Python";
+    homepage = "https://github.com/MatthiasValvekens/python-pae";
+    license = licenses.mit;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-pam/default.nix b/nixpkgs/pkgs/development/python-modules/python-pam/default.nix
new file mode 100644
index 000000000000..22dcf9e467b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-pam/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pam
+, six
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "python-pam";
+  version = "2.0.2";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "FirefighterBlu3";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-MR9LYXtkbltAmn7yoyyKZn4yMHyh3rj/i/pA8nJy2xU=";
+  };
+
+  postPatch = ''
+    substituteInPlace src/pam/__internals.py \
+      --replace 'find_library("pam")' '"${pam}/lib/libpam.so"' \
+      --replace 'find_library("pam_misc")' '"${pam}/lib/libpam_misc.so"'
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  buildInputs = [
+    pam
+  ];
+
+  propagatedBuildInputs = [
+    six
+    toml
+  ];
+
+  pythonImportsCheck = [ "pam" ];
+
+  meta = with lib; {
+    description = "Python pam module";
+    homepage = "https://github.com/FirefighterBlu3/python-pam";
+    license = licenses.mit;
+    maintainers = with maintainers; [ abbradar mkg20001 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-periphery/default.nix b/nixpkgs/pkgs/development/python-modules/python-periphery/default.nix
new file mode 100644
index 000000000000..feeb22373d87
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-periphery/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "python-periphery";
+  version = "2.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-YdRh1zaYKm92boeHIKsQpoFR4ujBCGYA2TiaxH5A6Io=";
+  };
+
+  # Some tests require physical probing and additional physical setup
+  doCheck = false;
+
+  meta = {
+    homepage = "https://github.com/vsergeev/python-periphery";
+    description = "Linux Peripheral I/O (GPIO, LED, PWM, SPI, I2C, MMIO, Serial) with Python 2 & 3";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ bandresen ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-picnic-api/default.nix b/nixpkgs/pkgs/development/python-modules/python-picnic-api/default.nix
new file mode 100644
index 000000000000..4ff18224d2d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-picnic-api/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "python-picnic-api";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1axqw4bs3wa9mdac35h7r25v3i5g7v55cvyy48c4sg31dxnr4wcp";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Project doesn't ship tests
+  # https://github.com/MikeBrink/python-picnic-api/issues/13
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "python_picnic_api"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for the Picnic API";
+    homepage = "https://github.com/MikeBrink/python-picnic-api";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-pidfile/default.nix b/nixpkgs/pkgs/development/python-modules/python-pidfile/default.nix
new file mode 100644
index 000000000000..4bcc21ba1c77
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-pidfile/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, psutil
+}:
+
+buildPythonPackage rec {
+  pname = "python-pidfile";
+  version = "3.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-pgQBL2iagsHMRFEKI85ZwyaIL7kcIftAy6s+lX958M0=";
+  };
+
+  propagatedBuildInputs = [
+    psutil
+  ];
+
+  pythonImportsCheck = [ "pidfile" ];
+
+  # no tests on the github mirror of the source code
+  # see this: https://github.com/mosquito/python-pidfile/issues/7
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python context manager for managing pid files";
+    homepage = "https://github.com/mosquito/python-pidfile";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ lom ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-pipedrive/default.nix b/nixpkgs/pkgs/development/python-modules/python-pipedrive/default.nix
new file mode 100644
index 000000000000..a8d96043d8d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-pipedrive/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, httplib2
+}:
+
+buildPythonPackage rec {
+  pname = "python-pipedrive";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0f8qiyl82bpwxwjw2746vdvkps2010mvn1x9b6j6ppmifff2d4pl";
+  };
+
+  propagatedBuildInputs = [ httplib2 ];
+
+  doCheck = false; # Tests are not provided.
+
+  meta = with lib; {
+    description = "Python library for interacting with the pipedrive.com API";
+    homepage = "https://github.com/jscott1989/python-pipedrive";
+    license = licenses.unfree;
+    maintainers = with maintainers; [ mrmebelman ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-pkcs11/default.nix b/nixpkgs/pkgs/development/python-modules/python-pkcs11/default.nix
new file mode 100644
index 000000000000..d0d4b4e98d39
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-pkcs11/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, asn1crypto
+, buildPythonPackage
+, cached-property
+, cython
+, fetchFromGitHub
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "python-pkcs11";
+  version = "0.7.0";
+
+  src = fetchFromGitHub {
+    owner = "danni";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0kncbipfpsb7m7mhv5s5b9wk604h1j08i2j26fn90pklgqll0xhv";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    cython
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    cached-property
+    asn1crypto
+  ];
+
+  # Test require additional setup
+  doCheck = false;
+
+  pythonImportsCheck = [ "pkcs11" ];
+
+  meta = with lib; {
+    description = "PKCS#11/Cryptoki support for Python";
+    homepage = "https://github.com/danni/python-pkcs11";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-pptx/default.nix b/nixpkgs/pkgs/development/python-modules/python-pptx/default.nix
new file mode 100644
index 000000000000..e49dccec8206
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-pptx/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, lxml
+, xlsxwriter
+, pillow
+}:
+buildPythonPackage rec {
+  pname = "python-pptx";
+  version = "0.6.23";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WHSX/yjneasY27B09tQFKJPIXe3JXtdd8xk2TzMf7e4=";
+  };
+
+  # postPatch = ''
+  #   substituteInPlace setup.py \
+  #     --replace "grpcio-tools>=1.47.0, <=1.48.0" "grpcio-tools>=1.47.0, <=1.52.0" \
+  #     --replace "grpcio>=1.47.0,<=1.48.0" "grpcio>=1.47.0,<=1.53.0" \
+  #     --replace "ujson>=2.0.0,<=5.4.0" "ujson>=2.0.0,<=5.7.0"
+  #   '';
+
+  propagatedBuildInputs = [
+    lxml
+    xlsxwriter
+    pillow
+  ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/scanny/python-pptx";
+    description = "Create Open XML PowerPoint documents in Python";
+    license = licenses.mit;
+    maintainers = with maintainers; [happysalada];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-prctl/default.nix b/nixpkgs/pkgs/development/python-modules/python-prctl/default.nix
new file mode 100644
index 000000000000..05b73e43a859
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-prctl/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, libcap
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-prctl";
+  version = "1.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b4ca9a25a7d4f1ace4fffd1f3a2e64ef5208fe05f929f3edd5e27081ca7e67ce";
+  };
+
+  buildInputs = [ libcap ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  disabledTests = [
+    # Intel MPX support was removed in GCC 9.1 & Linux kernel 5.6
+    "test_mpx"
+
+    # The Nix build sandbox has no_new_privs already enabled
+    "test_no_new_privs"
+
+    # The Nix build sandbox has seccomp already enabled
+    "test_seccomp"
+
+    # This will fail if prctl(PR_SET_SPECULATION_CTRL, PR_SPEC_FORCE_DISABLE)
+    # has been set system-wide, even outside the sandbox
+    "test_speculation_ctrl"
+  ];
+
+  meta = {
+    description = "Python(ic) interface to the linux prctl syscall";
+    homepage = "https://github.com/seveas/python-prctl";
+    license = lib.licenses.gpl3;
+    platforms = lib.platforms.linux;
+    maintainers = with lib.maintainers; [ catern ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-ptrace/default.nix b/nixpkgs/pkgs/development/python-modules/python-ptrace/default.nix
new file mode 100644
index 000000000000..0ea759d92dcf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-ptrace/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "python-ptrace";
+  version = "0.9.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1e3bc6223f626aaacde8a7979732691c11b13012e702fee9ae16c87f71633eaa";
+  };
+
+  # requires distorm, which is optionally
+  doCheck = false;
+
+  propagatedBuildInputs = [ six ];
+
+  meta = with lib; {
+    description = "Python binding of ptrace library";
+    homepage = "https://github.com/vstinner/python-ptrace";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-rabbitair/default.nix b/nixpkgs/pkgs/development/python-modules/python-rabbitair/default.nix
new file mode 100644
index 000000000000..28c0ab9f4e56
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-rabbitair/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, typing-extensions
+, zeroconf
+}:
+
+buildPythonPackage rec {
+  pname = "python-rabbitair";
+  version = "0.0.8";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "rabbit-air";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-CGr7NvnGRNTiKq5BpB/zmfgyd/2ggTbO0nj+Q+MavTs=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    zeroconf
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "rabbitair"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_info"
+    "test_no_response"
+    "test_protocol_error"
+    "test_sequential_requests"
+    "test_set_state"
+    "test_state_a2"
+    "test_state_a3"
+    "test_zeroconf"
+  ];
+
+  meta = with lib; {
+    description = "Module for the control of Rabbit Air air purifiers";
+    homepage = "https://github.com/rabbit-air/python-rabbitair";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-rapidjson/default.nix b/nixpkgs/pkgs/development/python-modules/python-rapidjson/default.nix
new file mode 100644
index 000000000000..7aae0e442d28
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-rapidjson/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pythonOlder
+, rapidjson
+, pytestCheckHook
+, pytz
+, glibcLocales
+}:
+
+let
+  rapidjson' = rapidjson.overrideAttrs (old: {
+    version = "unstable-2023-03-06";
+    src = fetchFromGitHub {
+      owner = "Tencent";
+      repo = "rapidjson";
+      rev = "5e17dbed34eef33af8f3e734820b5dc547a2a3aa";
+      hash = "sha256-CTy42X6P6+Gz4WbJ3tCpAw3qqlJ+mU1PaWW9LGG+6nU=";
+    };
+    patches = [
+      (fetchpatch {
+        name = "do-not-include-gtest-src-dir.patch";
+        url = "https://git.alpinelinux.org/aports/plain/community/rapidjson/do-not-include-gtest-src-dir.patch?id=9e5eefc7a5fcf5938a8dc8a3be8c75e9e6809909";
+        hash = "sha256-BjSZEwfCXA/9V+kxQ/2JPWbc26jQn35CfN8+8NW24s4=";
+      })
+    ];
+    # valgrind_unittest failed
+    cmakeFlags = old.cmakeFlags ++ [ "-DCMAKE_CTEST_ARGUMENTS=-E;valgrind_unittest" ];
+  });
+in buildPythonPackage rec {
+  version = "1.13";
+  pname = "python-rapidjson";
+  disabled = pythonOlder "3.8";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "python-rapidjson";
+    repo = "python-rapidjson";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-lWF/INhgeFQoPAhyL655UCcVamFELra29R6JPJSAmMg=";
+  };
+
+  setupPyBuildFlags = [
+    "--rj-include-dir=${lib.getDev rapidjson'}/include"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytz
+  ];
+
+  disabledTestPaths = [
+    "benchmarks"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/python-rapidjson/python-rapidjson/blob/${src.rev}/CHANGES.rst";
+    homepage = "https://github.com/python-rapidjson/python-rapidjson";
+    description = "Python wrapper around rapidjson";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-redis-lock/default.nix b/nixpkgs/pkgs/development/python-modules/python-redis-lock/default.nix
new file mode 100644
index 000000000000..44527977bc19
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-redis-lock/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, eventlet
+, fetchPypi
+, gevent
+, pkgs
+, process-tests
+, pytestCheckHook
+, pythonOlder
+, redis
+, withDjango ? false
+, django-redis
+}:
+
+buildPythonPackage rec {
+  pname = "python-redis-lock";
+  version = "4.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Sr0Lz0kTasrWZye/VIbdJJQHjKVeSe+mk/eUB3MZCRo=";
+  };
+
+  propagatedBuildInputs = [
+    redis
+  ] ++ lib.optionals withDjango [
+    django-redis
+  ];
+
+  nativeCheckInputs = [
+    eventlet
+    gevent
+    pytestCheckHook
+    process-tests
+    pkgs.redis
+  ];
+
+  disabledTests = [
+    # https://github.com/ionelmc/python-redis-lock/issues/86
+    "test_no_overlap2"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # fail on Darwin because it defaults to multiprocessing `spawn`
+    "test_reset_signalizes"
+    "test_reset_all_signalizes"
+  ];
+
+  pythonImportsCheck = [
+    "redis_lock"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/ionelmc/python-redis-lock/blob/v${version}/CHANGELOG.rst";
+    description = "Lock context manager implemented via redis SETNX/BLPOP";
+    homepage = "https://github.com/ionelmc/python-redis-lock";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ vanschelven ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-registry/default.nix b/nixpkgs/pkgs/development/python-modules/python-registry/default.nix
new file mode 100644
index 000000000000..ef5ba5b438be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-registry/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, enum-compat
+, fetchFromGitHub
+, pytestCheckHook
+, unicodecsv
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "python-registry";
+  version = "1.4";
+
+  src = fetchFromGitHub {
+    owner = "williballenthin";
+    repo = pname;
+    rev = version;
+    sha256 = "0gwx5jcribgmmbz0ikhz8iphz7yj2d2nmk24nkdrjd3y5irly11s";
+  };
+
+  propagatedBuildInputs = [
+    enum-compat
+    unicodecsv
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    six
+  ];
+
+  disabledTestPaths = [
+    "samples"
+  ];
+
+  pythonImportsCheck = [
+    "Registry"
+  ];
+
+  meta = with lib; {
+    description = "Pure Python parser for Windows Registry hives";
+    homepage = "https://github.com/williballenthin/python-registry";
+    license = licenses.asl20;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-roborock/default.nix b/nixpkgs/pkgs/development/python-modules/python-roborock/default.nix
new file mode 100644
index 000000000000..3fa39b27fba5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-roborock/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, stdenv
+, aiohttp
+, alexapy
+, async-timeout
+, buildPythonPackage
+, click
+, construct
+, dacite
+, fetchFromGitHub
+, paho-mqtt
+, poetry-core
+, pycryptodome
+, pycryptodomex
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-roborock";
+  version = "0.35.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "humbertogontijo";
+    repo = "python-roborock";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-3XTVHs+mLePudLnr+bAN4pHvHtUcE0D5Hw+50Vxhlzw=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "poetry-core==1.6.1" "poetry-core"
+  '';
+
+  pythonRelaxDeps = [
+    "pycryptodome"
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    alexapy
+    aiohttp
+    async-timeout
+    click
+    construct
+    dacite
+    paho-mqtt
+    pycryptodome
+  ] ++ lib.optionals stdenv.isDarwin [
+    pycryptodomex
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "roborock"
+  ];
+
+  meta = with lib; {
+    description = "Python library & console tool for controlling Roborock vacuum";
+    homepage = "https://github.com/humbertogontijo/python-roborock";
+    changelog = "https://github.com/humbertogontijo/python-roborock/blob/v${version}/CHANGELOG.md";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-rtmidi/default.nix b/nixpkgs/pkgs/development/python-modules/python-rtmidi/default.nix
new file mode 100644
index 000000000000..c30f7b77b431
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-rtmidi/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, stdenv
+, alabaster
+, alsa-lib
+, buildPythonPackage
+, CoreAudio
+, CoreMIDI
+, CoreServices
+, Foundation
+, cython_3
+, fetchPypi
+, flake8
+, libjack2
+, meson-python
+, ninja
+, pkg-config
+, pythonOlder
+, tox
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "python-rtmidi";
+  version = "1.5.8";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "python_rtmidi";
+    inherit version;
+    hash = "sha256-f5reaLBorgkADstWKulSHaOiNDYa1USeg/xzRUTQBPo=";
+  };
+
+  nativeBuildInputs = [
+    cython_3
+    meson-python
+    ninja
+    pkg-config
+    wheel
+  ];
+
+  buildInputs = [
+  ] ++ lib.optionals stdenv.isLinux [
+    libjack2
+    alsa-lib
+  ] ++ lib.optionals stdenv.isDarwin [
+    CoreAudio
+    CoreMIDI
+    CoreServices
+    Foundation
+  ];
+
+  nativeCheckInputs = [
+    tox
+    flake8
+    alabaster
+  ];
+
+  pythonImportsCheck = [
+    "rtmidi"
+  ];
+
+  meta = with lib; {
+    description = "A Python binding for the RtMidi C++ library implemented using Cython";
+    homepage = "https://github.com/SpotlightKid/python-rtmidi";
+    changelog = "https://github.com/SpotlightKid/python-rtmidi/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-sat/default.nix b/nixpkgs/pkgs/development/python-modules/python-sat/default.nix
new file mode 100644
index 000000000000..d7f62a49f12f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-sat/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage, fetchFromGitHub, lib, six, pypblib, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "python-sat";
+  version = "0.1.7.dev1";
+
+  src = fetchFromGitHub {
+    owner = "pysathq";
+    repo = "pysat";
+    rev = version;
+    hash = "sha256-zGdgD+SgoMB7/zDQI/trmV70l91TB7OkDxaJ30W3dkI=";
+  };
+
+  propagatedBuildInputs = [ six pypblib ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  # https://github.com/pysathq/pysat/pull/102
+  postPatch = ''
+    # Fix for case-insensitive filesystem
+    cat >>solvers/patches/cadical.patch <<EOF
+diff --git solvers/cadical/VERSION solvers/cdc/VERSION
+deleted file mode 100644
+--- solvers/cadical/VERSION
++++ /dev/null
+@@ -1 +0,0 @@
+-1.0.3
+EOF
+  '';
+
+  meta = with lib; {
+    description = "Toolkit to provide interface for various SAT (without optional dependancy py-aiger-cnf)";
+    homepage = "https://github.com/pysathq/pysat";
+    license = licenses.mit;
+    maintainers = [ maintainers.marius851000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-simple-hipchat/default.nix b/nixpkgs/pkgs/development/python-modules/python-simple-hipchat/default.nix
new file mode 100644
index 000000000000..1a7974ecd267
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-simple-hipchat/default.nix
@@ -0,0 +1,17 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "python-simple-hipchat";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0zy6prrj85jjc4xmxgfg8h94j81k6zhfxfffcbvq9b10jis1rgav";
+  };
+
+  meta = with lib; {
+    description = "Easy peasy wrapper for HipChat's v1 API";
+    homepage = "https://github.com/kurttheviking/simple-hipchat-py";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-slugify/default.nix b/nixpkgs/pkgs/development/python-modules/python-slugify/default.nix
new file mode 100644
index 000000000000..cb525a5922be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-slugify/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, text-unidecode
+, unidecode
+}:
+
+buildPythonPackage rec {
+  pname = "python-slugify";
+  version = "8.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "un33k";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-MJac63XjgWdUQdyyEm8O7gAGVszmHxZzRF4frJtR0BU=";
+  };
+
+  propagatedBuildInputs = [
+    text-unidecode
+  ];
+
+  passthru.optional-dependencies = {
+    unidecode = [
+      unidecode
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "test.py"
+  ];
+
+  pythonImportsCheck = [
+    "slugify"
+  ];
+
+  meta = with lib; {
+    description = "Python Slugify application that handles Unicode";
+    homepage = "https://github.com/un33k/python-slugify";
+    changelog = "https://github.com/un33k/python-slugify/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ vrthra ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-smarttub/default.nix b/nixpkgs/pkgs/development/python-modules/python-smarttub/default.nix
new file mode 100644
index 000000000000..afe1451042b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-smarttub/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, inflection
+, pyjwt
+, pytest-asyncio
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-smarttub";
+  version = "0.0.36";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "mdz";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-cng19NW5Eq3arysl0B3dfK2Hy6lQFBFh7g2hxvxeklU=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    inflection
+    pyjwt
+    python-dateutil
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pyjwt~=2.1.0" "pyjwt>=2.1.0"
+  '';
+
+  pythonImportsCheck = [
+    "smarttub"
+  ];
+
+  meta = with lib; {
+    description = "Python API for SmartTub enabled hot tubs";
+    homepage = "https://github.com/mdz/python-smarttub";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-snap7/default.nix b/nixpkgs/pkgs/development/python-modules/python-snap7/default.nix
new file mode 100644
index 000000000000..069b57bd8c89
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-snap7/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, snap7
+, fetchFromGitHub
+, setuptools
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-snap7";
+  version = "1.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "gijzelaerr";
+    repo = "python-snap7";
+    rev = "refs/tags/${version}";
+    hash = "sha256-90WwgqPHsHbuQUY49cSQblN1jfoLydiG0dm1aMF/NCA=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  prePatch = ''
+    substituteInPlace snap7/common.py \
+      --replace "lib_location = None" "lib_location = '${snap7}/lib/libsnap7.so'"
+  '';
+
+  # Tests require root privileges to open privilaged ports
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "snap7"
+    "snap7.util"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for the snap7 PLC communication library";
+    homepage = "https://github.com/gijzelaerr/python-snap7";
+    license = licenses.mit;
+    maintainers = with maintainers; [ freezeboy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-snappy/default.nix b/nixpkgs/pkgs/development/python-modules/python-snappy/default.nix
new file mode 100644
index 000000000000..05fcdda421dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-snappy/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, snappy
+, cffi
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-snappy";
+  version = "0.6.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-tqEHqwYgasxTWdTFYyvZsi1EhwKnmzFpsMYuD7gIuyo=";
+  };
+
+  buildInputs = [ snappy ];
+
+  propagatedBuildInputs = lib.optional isPyPy cffi;
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  meta = with lib; {
+    description = "Python library for the snappy compression library from Google";
+    homepage = "https://github.com/andrix/python-snappy";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-socketio/default.nix b/nixpkgs/pkgs/development/python-modules/python-socketio/default.nix
new file mode 100644
index 000000000000..f046f7c81189
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-socketio/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, aiohttp
+, bidict
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, msgpack
+, pytestCheckHook
+, python-engineio
+, pythonOlder
+, requests
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "python-socketio";
+  version = "5.9.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "miguelgrinberg";
+    repo = "python-socketio";
+    rev = "v${version}";
+    hash = "sha256-1lyTZwkRpGRbeBqt6Thv5o+bUzkD1sC3T9T1GbWMEkI=";
+  };
+
+  propagatedBuildInputs = [
+    bidict
+    python-engineio
+  ];
+
+  passthru.optional-dependencies = {
+    client = [
+      requests
+      websocket-client
+    ];
+    asyncio_client = [
+      aiohttp
+    ];
+  };
+
+  nativeCheckInputs = [
+    mock
+    msgpack
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "socketio"
+  ];
+
+  meta = with lib; {
+    description = "Python Socket.IO server and client";
+    longDescription = ''
+      Socket.IO is a lightweight transport protocol that enables real-time
+      bidirectional event-based communication between clients and a server.
+    '';
+    homepage = "https://github.com/miguelgrinberg/python-socketio/";
+    changelog = "https://github.com/miguelgrinberg/python-socketio/blob/v${version}/CHANGES.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-socks/default.nix b/nixpkgs/pkgs/development/python-modules/python-socks/default.nix
new file mode 100644
index 000000000000..c6b59b0ac985
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-socks/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, curio
+, fetchFromGitHub
+, anyio
+, flask
+, pytest-asyncio
+, pytest-trio
+, pythonOlder
+, pytestCheckHook
+, trio
+, trustme
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "python-socks";
+  version = "2.4.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6.2";
+
+  __darwinAllowLocalNetworking = true;
+
+  src = fetchFromGitHub {
+    owner = "romis2012";
+    repo = "python-socks";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-HnZrnsxPmRJzrvJbKS5r+di+msykDwWS7TB5CitIve8=";
+  };
+
+  propagatedBuildInputs = [
+    trio
+    curio
+    async-timeout
+  ];
+
+  doCheck = false; # requires tiny_proxy module
+
+  nativeCheckInputs = [
+    anyio
+    flask
+    pytest-asyncio
+    pytest-trio
+    pytestCheckHook
+    trustme
+    yarl
+  ];
+
+  pythonImportsCheck = [
+    "python_socks"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/romis2012/python-socks/releases/tag/v${version}";
+    description = "Core proxy client (SOCKS4, SOCKS5, HTTP) functionality for Python";
+    homepage = "https://github.com/romis2012/python-socks";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-songpal/default.nix b/nixpkgs/pkgs/development/python-modules/python-songpal/default.nix
new file mode 100644
index 000000000000..3f73bf1e5a94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-songpal/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, aiohttp
+, async-upnp-client
+, attrs
+, click
+, importlib-metadata
+}:
+
+buildPythonPackage rec {
+  pname = "python-songpal";
+  version = "0.16";
+
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "rytilahti";
+    repo = "python-songpal";
+    rev = "refs/tags/release/${version}";
+    hash = "sha256-wHyq63RG0lhzG33ssWyvzLjc7s1OqquXMN26N2MBHU8=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-upnp-client
+    attrs
+    click
+    importlib-metadata
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "songpal" ];
+
+  meta = with lib; {
+    description = "Python library for interfacing with Sony's Songpal devices";
+    homepage = "https://github.com/rytilahti/python-songpal";
+    changelog = "https://github.com/rytilahti/python-songpal/blob/release/${version}/CHANGELOG.md";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-sql/default.nix b/nixpkgs/pkgs/development/python-modules/python-sql/default.nix
new file mode 100644
index 000000000000..424c1635f91a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-sql/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-sql";
+  version = "1.4.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-stuHXGcgwblayCyD6lLOu5RMQHvmii7wN8zdi6ucxTw=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sql"
+  ];
+
+  meta = with lib; {
+    description = "Library to write SQL queries in a pythonic way";
+    homepage = "https://foss.heptapod.net/tryton/python-sql";
+    changelog = "https://foss.heptapod.net/tryton/python-sql/-/blob/${version}/CHANGELOG";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ johbo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-status/default.nix b/nixpkgs/pkgs/development/python-modules/python-status/default.nix
new file mode 100644
index 000000000000..2633d93c312f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-status/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "python-status";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0lryrvmi04g7d38ilm4wfw717m0ddhylrzb5cm59lrp3ai3q572f";
+  };
+
+  # Project doesn't ship tests yet
+  doCheck = false;
+
+  pythonImportsCheck = [ "status" ];
+
+  meta = with lib; {
+    description = "HTTP Status for Humans";
+    homepage = "https://github.com/avinassh/status/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-stdnum/default.nix b/nixpkgs/pkgs/development/python-modules/python-stdnum/default.nix
new file mode 100644
index 000000000000..f251b47c6086
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-stdnum/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, zeep
+}:
+
+buildPythonPackage rec {
+  pname = "python-stdnum";
+  version = "1.19";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Ez7IL1Y5DqdMGQVp6Y8vsUuGmAix1UeFcI8i0P6tiz8=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --cov=stdnum --cov-report=term-missing:skip-covered --cov-report=html" ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  passthru.optional-dependencies = {
+    SOAP = [
+      zeep
+    ];
+  };
+
+  pythonImportsCheck = [
+    "stdnum"
+  ];
+
+  meta = with lib; {
+    description = "Python module to handle standardized numbers and codes";
+    homepage = "https://arthurdejong.org/python-stdnum/";
+    changelog = "https://github.com/arthurdejong/python-stdnum/blob/${version}/ChangeLog";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ johbo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-string-utils/default.nix b/nixpkgs/pkgs/development/python-modules/python-string-utils/default.nix
new file mode 100644
index 000000000000..d0164062b90b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-string-utils/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "python-string-utils";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3PkGCwPwdkfApgNAjciwP4B/O1SgXG4Z6xRGAlb6wMs=";
+  };
+
+  pythonImportsCheck = ["string_utils"];
+
+  # tests are not available in pypi tarball
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A handy Python library to validate, manipulate and generate strings.";
+    homepage = "https://github.com/daveoncode/python-string-utils";
+    license = licenses.mit;
+    maintainers = with maintainers; [ teto ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-swiftclient/default.nix b/nixpkgs/pkgs/development/python-modules/python-swiftclient/default.nix
new file mode 100644
index 000000000000..e34bad425b3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-swiftclient/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, installShellFiles
+, mock
+, openstacksdk
+, pbr
+, python-keystoneclient
+, pythonOlder
+, stestr
+}:
+
+buildPythonPackage rec {
+  pname = "python-swiftclient";
+  version = "4.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-p32Xqw5AEsZ4cy5XW9/u0oKzSJuRdegsRqR6yEke7oQ=";
+  };
+
+  # remove duplicate script that will be created by setuptools from the
+  # entry_points section of setup.cfg
+  postPatch = ''
+    sed -i '/^scripts =/d' setup.cfg
+    sed -i '/bin\/swift/d' setup.cfg
+  '';
+
+  nativeBuildInputs = [
+    installShellFiles
+  ];
+
+  propagatedBuildInputs = [
+    pbr
+    python-keystoneclient
+  ];
+
+  nativeCheckInputs = [
+    mock
+    openstacksdk
+    stestr
+  ];
+
+  postInstall = ''
+    installShellCompletion --cmd swift \
+      --bash tools/swift.bash_completion
+    installManPage doc/manpages/*
+  '';
+
+  checkPhase = ''
+    stestr run
+  '';
+
+  pythonImportsCheck = [
+    "swiftclient"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/openstack/python-swiftclient";
+    description = "Python bindings to the OpenStack Object Storage API";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-tado/default.nix b/nixpkgs/pkgs/development/python-modules/python-tado/default.nix
new file mode 100644
index 000000000000..017be9041dc1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-tado/default.nix
@@ -0,0 +1,39 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "python-tado";
+  version = "0.17.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "wmalgadey";
+    repo = "PyTado";
+    # https://github.com/wmalgadey/PyTado/issues/62
+    rev = "refs/tags/${version}";
+    hash = "sha256-w1qtSEpnZCs7+M/0Gywz9AeMxUzz2csHKm9SxBKzmz4=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description =
+      "Python binding for Tado web API. Pythonize your central heating!";
+    homepage = "https://github.com/wmalgadey/PyTado";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ jamiemagee ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-tds/default.nix b/nixpkgs/pkgs/development/python-modules/python-tds/default.nix
new file mode 100644
index 000000000000..502ff1433666
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-tds/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, six
+, pytestCheckHook
+, pyopenssl
+, pyspnego
+, namedlist
+, pydes
+, cryptography
+}:
+
+buildPythonPackage rec {
+  pname = "python-tds";
+  version = "1.13.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "denisenkom";
+    repo = "pytds";
+    rev = version;
+    hash = "sha256-ubAXCifSfNtxbFIJZD8IuK/8oPT9vo77YBCexoO9zsw=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "version.get_git_version()" '"${version}"'
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pyopenssl
+    pyspnego
+    namedlist
+    pydes
+    cryptography
+  ];
+
+  disabledTests = [
+    # ImportError: To use NTLM authentication you need to install ntlm-auth module
+    # ntlm-auth has been removed from nixpkgs
+    "test_ntlm"
+
+    # TypeError: CertificateBuilder.add_extension() got an unexpected keyword argument 'extension'
+    # Tests are broken for pyOpenSSL>=23.0.0
+    # https://github.com/denisenkom/pytds/blob/1.13.0/test_requirements.txt
+    "test_with_simple_server_req_encryption"
+    "test_both_server_and_client_encryption_on"
+    "test_server_has_enc_on_but_client_is_off"
+    "test_only_login_encrypted"
+    "test_server_encryption_not_supported"
+    "test_server_with_bad_name_in_cert"
+    "test_cert_with_san"
+    "test_encrypted_socket"
+  ];
+
+  pythonImportsCheck = [ "pytds" ];
+
+  meta = with lib; {
+    description = "Python DBAPI driver for MSSQL using pure Python TDS (Tabular Data Stream) protocol implementation";
+    homepage = "https://python-tds.readthedocs.io/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-telegram-bot/default.nix b/nixpkgs/pkgs/development/python-modules/python-telegram-bot/default.nix
new file mode 100644
index 000000000000..262f1d22e8ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-telegram-bot/default.nix
@@ -0,0 +1,134 @@
+{ lib
+, aiolimiter
+, apscheduler
+, beautifulsoup4
+, buildPythonPackage
+, cachetools
+, cryptography
+, fetchFromGitHub
+, flaky
+, httpx
+, pytest-asyncio
+, pytest-timeout
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, pytz
+, setuptools
+, wheel
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "python-telegram-bot";
+  version = "20.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-t6yHl2uNdGaTLdbQTXp3+zds2pab4T6Pe69mu31HahA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    aiolimiter
+    apscheduler
+    cachetools
+    cryptography
+    httpx
+    pytz
+  ]
+  ++ httpx.optional-dependencies.socks
+  ++ httpx.optional-dependencies.http2;
+
+  nativeCheckInputs = [
+    beautifulsoup4
+    flaky
+    pytest-asyncio
+    pytest-timeout
+    pytest-xdist
+    pytestCheckHook
+    tornado
+  ];
+
+  pythonImportsCheck = [
+    "telegram"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "TestAIO"
+    "TestAnimation"
+    "TestApplication"
+    "TestAudio"
+    "TestBase"
+    "TestBot"
+    "TestCallback"
+    "TestChat"
+    "TestChosenInlineResult"
+    "TestCommandHandler"
+    "TestConstants"
+    "TestContact"
+    "TestConversationHandler"
+    "TestDice"
+    "TestDict"
+    "TestDocument"
+    "TestFile"
+    "TestForceReply"
+    "TestForum"
+    "TestGame"
+    "TestGet"
+    "TestHTTP"
+    "TestInline"
+    "TestInput"
+    "TestInvoice"
+    "TestJob"
+    "TestKeyboard"
+    "TestLocation"
+    "TestMask"
+    "TestMenu"
+    "TestMessage"
+    "TestMeta"
+    "TestOrder"
+    "TestPassport"
+    "TestPhoto"
+    "TestPickle"
+    "TestPoll"
+    "TestPre"
+    "TestPrefix"
+    "TestProximity"
+    "TestReply"
+    "TestRequest"
+    "TestSend"
+    "TestSent"
+    "TestShipping"
+    "TestSlot"
+    "TestSticker"
+    "TestString"
+    "TestSuccess"
+    "TestTelegram"
+    "TestType"
+    "TestUpdate"
+    "TestUser"
+    "TestVenue"
+    "TestVideo"
+    "TestVoice"
+    "TestWeb"
+  ];
+
+  meta = with lib; {
+    description = "Python library to interface with the Telegram Bot API";
+    homepage = "https://python-telegram-bot.org";
+    changelog = "https://github.com/python-telegram-bot/python-telegram-bot/blob/v${version}/CHANGES.rst";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ veprbl pingiun ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-telegram/default.nix b/nixpkgs/pkgs/development/python-modules/python-telegram/default.nix
new file mode 100644
index 000000000000..50a14d6ccc27
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-telegram/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, tdlib
+, telegram-text
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-telegram";
+  version = "0.18.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "alexander-akhmetov";
+    repo = "python-telegram";
+    rev = version;
+    hash = "sha256-2Q0nUZ2TMVWznd05+fqYojkRn4xfFZJrlqb1PMuBsAY=";
+  };
+
+  postPatch = ''
+    # Remove bundled libtdjson
+    rm -fr telegram/lib
+
+    substituteInPlace telegram/tdjson.py \
+      --replace "ctypes.util.find_library(\"tdjson\")" \
+                "\"${tdlib}/lib/libtdjson${stdenv.hostPlatform.extensions.sharedLibrary}\""
+  '';
+
+  propagatedBuildInputs = [
+    setuptools
+    telegram-text
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "TestGetTdjsonTdlibPath"
+  ];
+
+  pythonImportsCheck = [
+    "telegram.client"
+  ];
+
+  meta = with lib; {
+    description = "Python client for the Telegram's tdlib";
+    homepage = "https://github.com/alexander-akhmetov/python-telegram";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sikmir ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-toolbox/default.nix b/nixpkgs/pkgs/development/python-modules/python-toolbox/default.nix
new file mode 100644
index 000000000000..bd975092ae9a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-toolbox/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, docutils
+, fetchFromGitHub
+, isPy27
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  version = "1.0.10";
+  pname = "python_toolbox";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "cool-RR";
+    repo = pname;
+    rev = version;
+    sha256 = "1hpls1hwisdjx1g15cq052bdn9fvh43r120llws8bvgvj9ivnaha";
+  };
+
+  nativeCheckInputs = [
+    docutils
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # file imports 'dummy_threading', which was deprecated since py37
+    # and removed in py39
+    "test_python_toolbox/test_cute_profile/test_cute_profile.py"
+  ];
+
+  meta = with lib; {
+    description = "Tools for testing PySnooper";
+    homepage = "https://github.com/cool-RR/python_toolbox";
+    license = licenses.mit;
+    maintainers = with maintainers; [ seqizz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-trovo/default.nix b/nixpkgs/pkgs/development/python-modules/python-trovo/default.nix
new file mode 100644
index 000000000000..6c443400d1c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-trovo/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "python-trovo";
+  version = "0.1.6";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-g1RDHSNGbGT1G2ej7A8WzyR17FaNPySfsAuKbHddmtQ=";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # No tests found
+  doCheck = false;
+
+  pythonImportsCheck = [ "trovoApi" ];
+
+  meta = with lib; {
+    description = "A Python wrapper for the Trovo API";
+    homepage = "https://codeberg.org/wolfangaukang/python-trovo";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-twitch-client/default.nix b/nixpkgs/pkgs/development/python-modules/python-twitch-client/default.nix
new file mode 100644
index 000000000000..29a10ced06f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-twitch-client/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+, responses
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "python-twitch-client";
+  version = "0.7.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "tsifrer";
+    repo = "python-twitch-client";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-gxBpltwExb9bg3HLkz/MNlP5Q3/x97RHxhbwNqqanIM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "twitch"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_delete_from_community"
+    "test_update"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for the Twitch API";
+    homepage = "https://github.com/tsifrer/python-twitch-client";
+    changelog = "https://github.com/tsifrer/python-twitch-client/blob/${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-twitter/default.nix b/nixpkgs/pkgs/development/python-modules/python-twitter/default.nix
new file mode 100644
index 000000000000..646cdaa18e46
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-twitter/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, filetype
+, future
+, hypothesis
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-oauthlib
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "python-twitter";
+  version = "3.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bear";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "08ydmf6dcd416cvw6xq1wxsz6b9s21f2mf9fh3y4qz9swj6n9h8z";
+  };
+
+  patches = [
+    # Fix tests. Remove with the next release
+    (fetchpatch {
+      url = "https://github.com/bear/python-twitter/commit/f7eb83d9dca3ba0ee93e629ba5322732f99a3a30.patch";
+      sha256 = "008b1bd03wwngs554qb136lsasihql3yi7vlcacmk4s5fmr6klqw";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    filetype
+    future
+    requests
+    requests-oauthlib
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+    hypothesis
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'" ""
+  '';
+
+  pythonImportsCheck = [
+    "twitter"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper around the Twitter API";
+    homepage = "https://github.com/bear/python-twitter";
+    license = licenses.asl20;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-u2flib-host/default.nix b/nixpkgs/pkgs/development/python-modules/python-u2flib-host/default.nix
new file mode 100644
index 000000000000..94f56698a3e7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-u2flib-host/default.nix
@@ -0,0 +1,23 @@
+{ lib, fetchPypi, buildPythonPackage, requests, hidapi }:
+
+buildPythonPackage rec {
+  pname = "python-u2flib-host";
+  version = "3.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "02pwafd5kyjpc310ys0pgnd0adff1laz18naxxwsfrllqafqnrxb";
+  };
+
+  propagatedBuildInputs = [ requests hidapi ];
+
+  # Tests fail: "ValueError: underlying buffer has been detached"
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python based U2F host library";
+    homepage = "https://github.com/Yubico/python-u2flib-host";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-u2flib-server/cryptography-37-compat.patch b/nixpkgs/pkgs/development/python-modules/python-u2flib-server/cryptography-37-compat.patch
new file mode 100644
index 000000000000..beed33ab2a35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-u2flib-server/cryptography-37-compat.patch
@@ -0,0 +1,112 @@
+diff --git a/test/soft_u2f_v2.py b/test/soft_u2f_v2.py
+index d011b1f..9a24bb9 100644
+--- a/test/soft_u2f_v2.py
++++ b/test/soft_u2f_v2.py
+@@ -112,9 +112,7 @@ class SoftU2FDevice(object):
+             CERT_PRIV, password=None, backend=default_backend())
+         cert = CERT
+         data = b'\x00' + app_param + client_param + key_handle + pub_key
+-        signer = cert_priv.signer(ec.ECDSA(hashes.SHA256()))
+-        signer.update(data)
+-        signature = signer.finalize()
++        signature = cert_priv.sign(data, ec.ECDSA(hashes.SHA256()))
+ 
+         raw_response = (b'\x05' + pub_key + six.int2byte(len(key_handle)) +
+                         key_handle + cert + signature)
+@@ -163,9 +161,7 @@ class SoftU2FDevice(object):
+         counter = struct.pack('>I', self.counter)
+ 
+         data = app_param + touch + counter + client_param
+-        signer = priv_key.signer(ec.ECDSA(hashes.SHA256()))
+-        signer.update(data)
+-        signature = signer.finalize()
++        signature = priv_key.sign(data, ec.ECDSA(hashes.SHA256()))
+         raw_response = touch + counter + signature
+ 
+         return SignResponse(
+diff --git a/u2flib_server/attestation/resolvers.py b/u2flib_server/attestation/resolvers.py
+index 034549f..cd59b10 100644
+--- a/u2flib_server/attestation/resolvers.py
++++ b/u2flib_server/attestation/resolvers.py
+@@ -86,27 +86,29 @@ class MetadataResolver(object):
+         cert_bytes = cert.tbs_certificate_bytes
+ 
+         if isinstance(pubkey, rsa.RSAPublicKey):
+-            verifier = pubkey.verifier(
+-                cert_signature,
+-                padding.PKCS1v15(),
+-                cert.signature_hash_algorithm
+-            )
++            try:
++                pubkey.verify(
++                    cert_signature,
++                    cert_bytes,
++                    padding.PKCS1v15(),
++                    cert.signature_hash_algorithm
++                )
++                return True
++            except InvalidSignature:
++                return False
+         elif isinstance(pubkey, ec.EllipticCurvePublicKey):
+-            verifier = pubkey.verifier(
+-                cert_signature,
+-                ec.ECDSA(cert.signature_hash_algorithm)
+-            )
++            try:
++                pubkey.verify(
++                    cert_signature,
++                    cert_bytes,
++                    ec.ECDSA(cert.signature_hash_algorithm)
++                )
++                return True
++            except InvalidSignature:
++                return False
+         else:
+             raise ValueError("Unsupported public key value")
+ 
+-        verifier.update(cert_bytes)
+-
+-        try:
+-            verifier.verify()
+-            return True
+-        except InvalidSignature:
+-            return False
+-
+     def resolve(self, cert):
+         if isinstance(cert, bytes):
+             cert = x509.load_der_x509_certificate(cert, default_backend())
+diff --git a/u2flib_server/model.py b/u2flib_server/model.py
+index 481be51..6ec01bb 100644
+--- a/u2flib_server/model.py
++++ b/u2flib_server/model.py
+@@ -175,12 +175,9 @@ class RegistrationData(object):
+         cert = x509.load_der_x509_certificate(self.certificate,
+                                               default_backend())
+         pubkey = cert.public_key()
+-        verifier = pubkey.verifier(self.signature, ec.ECDSA(hashes.SHA256()))
+-
+-        verifier.update(b'\0' + app_param + chal_param + self.key_handle +
+-                        self.pub_key)
++        msg = (b'\0' + app_param + chal_param + self.key_handle + self.pub_key)
+         try:
+-            verifier.verify()
++            pubkey.verify(self.signature, msg, ec.ECDSA(hashes.SHA256()))
+         except InvalidSignature:
+             raise ValueError('Attestation signature is invalid')
+ 
+@@ -207,13 +204,9 @@ class SignatureData(object):
+     def verify(self, app_param, chal_param, der_pubkey):
+         pubkey = load_der_public_key(PUB_KEY_DER_PREFIX + der_pubkey,
+                                      default_backend())
+-        verifier = pubkey.verifier(self.signature, ec.ECDSA(hashes.SHA256()))
+-        verifier.update(app_param +
+-                        six.int2byte(self.user_presence) +
+-                        struct.pack('>I', self.counter) +
+-                        chal_param)
++        msg = app_param + six.int2byte(self.user_presence) + struct.pack('>I', self.counter) + chal_param
+         try:
+-            verifier.verify()
++            pubkey.verify(self.signature, msg, ec.ECDSA(hashes.SHA256()))
+         except InvalidSignature:
+             raise ValueError('U2F signature is invalid')
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/python-u2flib-server/default.nix b/nixpkgs/pkgs/development/python-modules/python-u2flib-server/default.nix
new file mode 100644
index 000000000000..08a62d41363a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-u2flib-server/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+
+# propagates
+, cryptography
+, six
+
+# optional
+, webob
+
+# tests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-u2flib-server";
+  version = "5.0.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Yubico";
+    repo = "python-u2flib-server";
+    rev = version;
+    hash = "sha256-ginP9u+aHcdaWpwcFYJWu0Ghf7+nDZq9i3TVAacIPhg=";
+  };
+
+  patches = [
+    ./cryptography-37-compat.patch
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    six
+  ];
+
+  passthru.optional-dependencies = {
+    u2f_server = [
+      webob
+    ];
+  };
+
+  pythonImportsCheck = [
+    "u2flib_server"
+    "u2flib_server.u2f"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.u2f_server;
+
+  meta = with lib; {
+    description = "Python based U2F server library";
+    homepage = "https://github.com/Yubico/python-u2flib-server";
+    changelog = "https://github.com/Yubico/python-u2flib-server/blob/${src.rev}/NEWS";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-uinput/default.nix b/nixpkgs/pkgs/development/python-modules/python-uinput/default.nix
new file mode 100644
index 000000000000..8a187257ca76
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-uinput/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, udev
+}:
+
+buildPythonPackage rec {
+  pname = "python-uinput";
+  version = "0.11.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "033zqiypjz0nigav6vz0s57pbzikvds55mxphrdpkdbpdikjnfcr";
+  };
+
+  buildInputs = [ udev ];
+
+  NIX_CFLAGS_LINK = "-ludev";
+
+  doCheck = false; # no tests
+
+  meta = with lib; {
+    description = "Pythonic API to Linux uinput kernel module";
+    homepage = "https://tjjr.fi/sw/python-uinput/";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-ulid/default.nix b/nixpkgs/pkgs/development/python-modules/python-ulid/default.nix
new file mode 100644
index 000000000000..db1456dc3186
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-ulid/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, hatch-fancy-pypi-readme
+, hatch-vcs
+, hatchling
+, freezegun
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-ulid";
+  version = "2.2.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "mdomke";
+    repo = "python-ulid";
+    rev = "refs/tags/${version}";
+    hash = "sha256-d5jCPxWUOfw/OCtbA9Db9+s1D5DAdL+vbPR8zavgbbo=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    hatch-fancy-pypi-readme
+    hatch-vcs
+    hatchling
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "ulid" ];
+
+  meta = with lib; {
+    description = "ULID implementation for Python";
+    homepage = "https://github.com/mdomke/python-ulid";
+    changelog = "https://github.com/mdomke/python-ulid/blob/${src.rev}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-unshare/default.nix b/nixpkgs/pkgs/development/python-modules/python-unshare/default.nix
new file mode 100644
index 000000000000..f80721078dbb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-unshare/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage {
+  pname = "python-unshare";
+  # pypi version doesn't support Python 3 and the package didn't update for a long time:
+  # https://github.com/TheTincho/python-unshare/pull/8
+  version = "unstable-2018-05-20";
+
+  src = fetchFromGitHub {
+    owner = "TheTincho";
+    repo = "python-unshare";
+    rev = "4e98c177bdeb24c5dcfcd66c457845a776bbb75c";
+    sha256 = "1h9biinhy5m7r2cj4abhvsg2hb6xjny3n2dxnj1336zpa082ys3h";
+  };
+
+  meta = with lib; {
+    description = "Python bindings for the Linux unshare() syscall";
+    homepage    = "https://github.com/thetincho/python-unshare";
+    license     = licenses.gpl2;
+    platforms   = platforms.linux;
+    maintainers = with maintainers; [ abbradar ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-utils/default.nix b/nixpkgs/pkgs/development/python-modules/python-utils/default.nix
new file mode 100644
index 000000000000..30803442d081
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-utils/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, loguru
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "python-utils";
+  version = "3.8.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "WoLpH";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-HoKdMDs67lsuVRb5d51wx6qyEjEM973yD6O6qMO+7MI=";
+  };
+
+  postPatch = ''
+    sed -i pytest.ini \
+      -e '/--cov/d' \
+      -e '/--mypy/d'
+  '';
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = {
+    loguru = [
+      loguru
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.loguru;
+
+  pythonImportsCheck = [
+    "python_utils"
+  ];
+
+  pytestFlagsArray = [
+    "_python_utils_tests"
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # Flaky tests on darwin
+    "test_timeout_generator"
+  ];
+
+  meta = with lib; {
+    description = "Module with some convenient utilities";
+    homepage = "https://github.com/WoLpH/python-utils";
+    changelog = "https://github.com/wolph/python-utils/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-vagrant/default.nix b/nixpkgs/pkgs/development/python-modules/python-vagrant/default.nix
new file mode 100644
index 000000000000..61d780809db5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-vagrant/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, wheel
+}:
+
+buildPythonPackage rec {
+  version = "1.1.0";
+  pname = "python-vagrant";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pycontribs";
+    repo = "python-vagrant";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-apvYzH0IY6ZyUP/FiOVbGN3dXejgN7gn7Mq2tlEaTww=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  # The tests try to connect to qemu
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "vagrant"
+  ];
+
+  meta = {
+    description = "Python module that provides a thin wrapper around the vagrant command line executable";
+    homepage = "https://github.com/todddeluca/python-vagrant";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.pmiddend ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-velbus/default.nix b/nixpkgs/pkgs/development/python-modules/python-velbus/default.nix
new file mode 100644
index 000000000000..75d4e24f869b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-velbus/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyserial
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-velbus";
+  version = "2.1.14";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3eDfXPMO167QI/umLBjlHTBV67XQ8QYkg4EzfrRTw6M=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+  ];
+
+  # Project has not tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "velbus"
+  ];
+
+  meta = with lib; {
+    description = "Python library to control the Velbus home automation system";
+    homepage = "https://github.com/thomasdelaet/python-velbus";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-vipaccess/default.nix b/nixpkgs/pkgs/development/python-modules/python-vipaccess/default.nix
new file mode 100644
index 000000000000..a5a76bf45282
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-vipaccess/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, oath
+, pycryptodome
+, requests
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "python-vipaccess";
+  version = "0.14.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vBFCRXwZ91C48GuOet2Obbo7gM02M2c9+7rhp0l6w54=";
+  };
+
+  propagatedBuildInputs = [
+    oath
+    pycryptodome
+    requests
+  ];
+
+  nativeCheckInputs = [ pytest ];
+  # test_check_token_detects_valid_hotp_token,
+  # test_check_token_detects_valid_totp_token and
+  # test_check_token_detects_invlaid_token require network
+  checkPhase = ''
+    mv vipaccess vipaccess.hidden
+    pytest tests/ -k 'not test_check_token'
+  '';
+
+  meta = with lib; {
+    description = "A free software implementation of Symantec's VIP Access application and protocol";
+    homepage = "https://github.com/dlenski/python-vipaccess";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ aw ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-vlc/default.nix b/nixpkgs/pkgs/development/python-modules/python-vlc/default.nix
new file mode 100644
index 000000000000..bb603396c787
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-vlc/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, libvlc
+, substituteAll
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "python-vlc";
+  version = "3.0.18122";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-EDm94oeFO0t7Yboi2DdhgyQ094UG2nYt+wYCkb8yiX0=";
+  };
+
+  patches = [
+    # Patch path for VLC
+    (substituteAll {
+      src = ./vlc-paths.patch;
+      libvlcPath="${libvlc}/lib/libvlc.so.5";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "vlc"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for VLC, the cross-platform multimedia player and framework";
+    homepage = "https://wiki.videolan.org/PythonBinding";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ tbenst ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-vlc/vlc-paths.patch b/nixpkgs/pkgs/development/python-modules/python-vlc/vlc-paths.patch
new file mode 100644
index 000000000000..0b1cf732711a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-vlc/vlc-paths.patch
@@ -0,0 +1,13 @@
+diff --git a/vlc.py b/vlc.py
+index e3245a5..cebec09 100644
+--- a/vlc.py
++++ b/vlc.py
+@@ -190,7 +190,7 @@ def find_lib():
+ 
+     else:
+         # All other OSes (linux, freebsd...)
+-        p = find_library('vlc')
++        p = "@libvlcPath@"
+         try:
+             dll = ctypes.CDLL(p)
+         except OSError:  # may fail
diff --git a/nixpkgs/pkgs/development/python-modules/python-whois/default.nix b/nixpkgs/pkgs/development/python-modules/python-whois/default.nix
new file mode 100644
index 000000000000..0a52e0b25c3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-whois/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, future
+, nose
+, pytestCheckHook
+, simplejson
+}:
+
+buildPythonPackage rec {
+  pname = "python-whois";
+  version = "0.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3TNtNRfqzip2iUBtt7uWraPF50MnQjFRru4+ZCJfYiA=";
+  };
+
+  propagatedBuildInputs = [ future ];
+
+  nativeCheckInputs = [
+    nose
+    pytestCheckHook
+    simplejson
+  ];
+
+  # Exclude tests that require network access
+  disabledTests = [
+    "test_dk_parse"
+    "test_ipv4"
+    "test_ipv6"
+  ];
+  pythonImportsCheck = [ "whois" ];
+
+  meta = with lib; {
+    description = "Python module to produce parsed WHOIS data";
+    homepage = "https://github.com/richardpenman/whois";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-wifi/default.nix b/nixpkgs/pkgs/development/python-modules/python-wifi/default.nix
new file mode 100644
index 000000000000..a679100d3760
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-wifi/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "python-wifi";
+  version = "0.6.1";
+  disabled = !isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "tar.bz2";
+    sha256 = "149c3dznb63d82143cz5hqdim0mqjysz6p3yk0zv271vq3xnmzvv";
+  };
+
+  meta = with lib; {
+    description = "Read & write wireless card capabilities using the Linux Wireless Extensions";
+    homepage = "http://pythonwifi.tuxfamily.org/";
+    # From the README: "pythonwifi is licensed under LGPLv2+, however, the
+    # examples (e.g. iwconfig.py and iwlist.py) are licensed under GPLv2+."
+    license = with licenses; [ lgpl2Plus gpl2Plus ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-wink/default.nix b/nixpkgs/pkgs/development/python-modules/python-wink/default.nix
new file mode 100644
index 000000000000..fa0dc670133e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-wink/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "python-wink";
+  version = "1.10.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1r6qabnqxyy3llnj10z60d4w9pg2zabysl3l7znpy1adss4ywxl0";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "pywink" ];
+
+  meta = with lib; {
+    description = "Python implementation of the Wink API";
+    homepage = "https://github.com/python-wink/python-wink";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-xmp-toolkit/default.nix b/nixpkgs/pkgs/development/python-modules/python-xmp-toolkit/default.nix
new file mode 100644
index 000000000000..428bf73beb15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-xmp-toolkit/default.nix
@@ -0,0 +1,48 @@
+{ buildPythonPackage
+, exempi
+, fetchFromGitHub
+, mock
+, pytz
+, lib, stdenv
+}:
+
+buildPythonPackage {
+  pname = "python-xmp-toolkit";
+  version = "2.0.2";
+
+  # PyPi has version 2.0.1; the tests fail
+  # There are commits for a 2.0.2 release that was never published
+  # Not to github, not to PyPi
+  # This is the latest commit from Jun 29, 2017 (as of Mar 13, 2019)
+  # It includes the commits for the unreleased version 2.0.2 and more
+  # Tests pass with this version
+  src = fetchFromGitHub {
+    owner = "python-xmp-toolkit";
+    repo = "python-xmp-toolkit";
+    rev = "5692bdf8dac3581a0d5fb3c5aeb29be0ab6a54fc";
+    sha256 = "16bylcm183ilzp7mrpdzw0pzp6csv9v5v247914qsv2abg0hgl5y";
+  };
+
+  buildInputs = [ exempi ];
+
+  propagatedBuildInputs = [ pytz ];
+
+  postPatch = ''
+    substituteInPlace libxmp/exempi.py \
+      --replace "ctypes.util.find_library('exempi')" "'${exempi}/lib/libexempi${stdenv.hostPlatform.extensions.sharedLibrary}'"
+  '';
+
+  # hangs on darwin + sandbox
+  doCheck = !stdenv.isDarwin;
+
+  preCheck = ''
+    rm test/{test_exempi,test_files}.py
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/python-xmp-toolkit/python-xmp-toolkit";
+    description = "Python XMP Toolkit for working with metadata";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.kiwi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-xz/default.nix b/nixpkgs/pkgs/development/python-modules/python-xz/default.nix
new file mode 100644
index 000000000000..b5a2ed4e21f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-xz/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "python-xz";
+  version = "0.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-OYdGWTtwb6n6xZuMmI6rhgPh/iupGVERwLRSJ6OnfbM=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "xz" ];
+
+  meta = with lib; {
+    description = "Pure Python library for seeking within compressed xz files";
+    homepage = "https://github.com/Rogdham/python-xz";
+    license = licenses.mit;
+    maintainers = with lib.maintainers; [ mxmlnkn ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-yate/default.nix b/nixpkgs/pkgs/development/python-modules/python-yate/default.nix
new file mode 100644
index 000000000000..a35773f298de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-yate/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-yate";
+  version = "0.4.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "eventphone";
+    repo = "python-yate";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-AdnlNsEOFuzuGTBmfV9zKyv2iFHEJ4eLMrC6SHHf7m0=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "yate"
+  ];
+
+  meta = with lib; {
+    description = "Python library for the yate telephony engine";
+    homepage = "https://github.com/eventphone/python-yate";
+    changelog = "https://github.com/eventphone/python-yate/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ clerie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python-youtube/default.nix b/nixpkgs/pkgs/development/python-modules/python-youtube/default.nix
new file mode 100644
index 000000000000..7a0d04e979b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-youtube/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, dataclasses-json
+, isodate
+, requests
+, requests-oauthlib
+, pytestCheckHook
+, responses
+}:
+buildPythonPackage rec {
+  pname = "python-youtube";
+  version = "0.9.3";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "sns-sdks";
+    repo = "python-youtube";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-vd+cbESypc/q7eSrERqkMvGhVMIfKMsoxPblPJwPiUg=";
+  };
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace "--cov=pyyoutube" "" \
+      --replace "--cov-report xml" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    dataclasses-json
+    isodate
+    requests
+    requests-oauthlib
+  ];
+
+  pythonImportsCheck = [ "pyyoutube" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  meta = with lib; {
+    description = "A simple Python wrapper around for YouTube Data API";
+    homepage = "https://github.com/sns-sdks/python-youtube";
+    changelog = "https://github.com/sns-sdks/python-youtube/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ blaggacao ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/python-zbar/0001-python-enum-fix-build-for-Python-3.11.patch b/nixpkgs/pkgs/development/python-modules/python-zbar/0001-python-enum-fix-build-for-Python-3.11.patch
new file mode 100644
index 000000000000..11b554151790
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-zbar/0001-python-enum-fix-build-for-Python-3.11.patch
@@ -0,0 +1,61 @@
+From 64de7911d2938fc3601fec39c08008465b9d4f6f Mon Sep 17 00:00:00 2001
+From: Nick Cao <nickcao@nichi.co>
+Date: Tue, 7 Feb 2023 17:12:50 +0800
+Subject: [PATCH] python: enum: fix build for Python 3.11
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Python 3.9 introduced Py_SET_SIZE function to set size instead of
+relying on Py_SIZE() as a macro [3.9].
+
+Python 3.10 started to encourage to use Py_SET_SIZE instead of
+assigning into return value of Py_SIZE [3.10].
+
+Python 3.11 flips the switch, turn Py_SIZE into a function [3.11],
+thus Py_SIZE(obj) will be a rvalue. We need to use Py_SET_SIZE
+to set size now.
+
+[3.9]: https://docs.python.org/3.9/c-api/structures.html#c.Py_SET_SIZE
+[3.10]: https://docs.python.org/3.10/c-api/structures.html#c.Py_SIZE
+[3.11]: https://docs.python.org/3.11/c-api/structures.html#c.Py_SIZE
+
+Adapted from https://github.com/mchehab/zbar/pull/231
+
+Signed-off-by: Đoàn Trần Công Danh <congdanhqx@gmail.com>
+Signed-off-by: Nick Cao <nickcao@nichi.co>
+---
+ python/enum.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/python/enum.c b/python/enum.c
+index dfe1b1e..4833a20 100644
+--- a/python/enum.c
++++ b/python/enum.c
+@@ -52,7 +52,11 @@ enumitem_new (PyTypeObject *type,
+ 
+     /* we assume the "fast path" for a single-digit ints (see longobject.c) */
+     /* this also holds if we get a small_int preallocated long */
++#if PY_VERSION_HEX >= 0x030900A4
++    Py_SET_SIZE(&self->val, Py_SIZE(longval));
++#else
+     Py_SIZE(&self->val) = Py_SIZE(longval);
++#endif
+     self->val.ob_digit[0] = longval->ob_digit[0];
+     Py_DECREF(longval);
+ #else
+@@ -143,7 +147,11 @@ zbarEnumItem_New (PyObject *byname,
+ 
+     /* we assume the "fast path" for a single-digit ints (see longobject.c) */
+     /* this also holds if we get a small_int preallocated long */
++#if PY_VERSION_HEX >= 0x030900A4
++    Py_SET_SIZE(&self->val, Py_SIZE(longval));
++#else
+     Py_SIZE(&self->val) = Py_SIZE(longval);
++#endif
+     self->val.ob_digit[0] = longval->ob_digit[0];
+     Py_DECREF(longval);
+ 
+-- 
+2.39.1
+
diff --git a/nixpkgs/pkgs/development/python-modules/python-zbar/default.nix b/nixpkgs/pkgs/development/python-modules/python-zbar/default.nix
new file mode 100644
index 000000000000..4d85b26875cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python-zbar/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pillow
+, zbar
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "python-zbar";
+  version = "0.23.90";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "mchehab";
+    repo = "zbar";
+    rev = version;
+    hash = "sha256-FvV7TMc4JbOiRjWLka0IhtpGGqGm5fis7h870OmJw2U=";
+  };
+
+  patches = [
+    # python: enum: fix build for Python 3.11
+    # https://github.com/mchehab/zbar/pull/231
+    # the patch is reworked as it does not cleanly apply
+    ./0001-python-enum-fix-build-for-Python-3.11.patch
+  ];
+
+  propagatedBuildInputs = [ pillow ];
+
+  buildInputs = [ zbar ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  preBuild = ''
+    cd python
+  '';
+
+  disabledTests = [
+    #AssertionError: b'Y800' != 'Y800'
+    "test_format"
+    "test_new"
+    #Requires loading a recording device
+    #zbar.SystemError: <zbar.Processor object at 0x7ffff615a680>
+    "test_processing"
+  ];
+
+  pythonImportsCheck = [ "zbar" ];
+
+  meta = with lib; {
+    description = "Python bindings for zbar";
+    homepage = "https://github.com/mchehab/zbar";
+    license = licenses.lgpl21Only;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python3-application/default.nix b/nixpkgs/pkgs/development/python-modules/python3-application/default.nix
new file mode 100644
index 000000000000..9170ce798115
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python3-application/default.nix
@@ -0,0 +1,39 @@
+{ stdenv, lib, isPy3k, buildPythonPackage, fetchFromGitHub, zope_interface, twisted }:
+
+buildPythonPackage rec {
+  pname = "python3-application";
+  version = "3.0.6";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "AGProjects";
+    repo = pname;
+    rev = "release-${version}";
+    hash = "sha256-L7KN6rKkbjNmkSoy8vdMYpXSBkWN7afNpreJO0twjq8=";
+  };
+
+  propagatedBuildInputs = [ zope_interface twisted ];
+
+  pythonImportsCheck = [ "application" ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "A collection of modules that are useful when building python applications";
+    homepage = "https://github.com/AGProjects/python3-application";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ chanley yureien ];
+    longDescription = ''
+      This package is a collection of modules that are useful when building python applications. Their purpose is to eliminate the need to divert resources into implementing the small tasks that every application needs to do in order to run successfully and focus instead on the application logic itself.
+      The modules that the application package provides are:
+        1. process - UNIX process and signal management.
+        2. python - python utility classes and functions.
+        3. configuration - a simple interface to handle configuration files.
+        4. log - an extensible system logger for console and syslog.
+        5. debug - memory troubleshooting and execution timing.
+        6. system - interaction with the underlying operating system.
+        7. notification - an application wide notification system.
+        8. version - manage version numbers for applications and packages.
+    '';
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python3-eventlib/default.nix b/nixpkgs/pkgs/development/python-modules/python3-eventlib/default.nix
new file mode 100644
index 000000000000..74abe970399c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python3-eventlib/default.nix
@@ -0,0 +1,34 @@
+{ lib, fetchFromGitHub, buildPythonPackage, isPy3k, zope_interface, twisted, greenlet }:
+
+buildPythonPackage rec {
+  pname = "python3-eventlib";
+  version = "0.3.0";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "AGProjects";
+    repo = "python3-eventlib";
+    rev = version;
+    hash = "sha256-LFW3rCGa7A8tk6SjgYgjkLQ+72GE2WN8wG+XkXYTAoQ=";
+  };
+
+  propagatedBuildInputs = [ zope_interface twisted greenlet ];
+
+  dontUseSetuptoolsCheck = true;
+
+  pythonImportsCheck = [ "eventlib" ];
+
+  meta = with lib; {
+    description = "A networking library written in Python";
+    homepage = "https://github.com/AGProjects/python3-eventlib";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ chanley ];
+    longDescription = ''
+      Eventlib is a networking library written in Python. It achieves high
+      scalability by using non-blocking I/O while at the same time retaining
+      high programmer usability by using coroutines to make the non-blocking io
+      operations appear blocking at the source code level.
+    '';
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python3-gnutls/default.nix b/nixpkgs/pkgs/development/python-modules/python3-gnutls/default.nix
new file mode 100644
index 000000000000..4fcd528ad97c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python3-gnutls/default.nix
@@ -0,0 +1,52 @@
+{ lib, fetchFromGitHub, substituteAll, buildPythonPackage, isPy3k, gnutls
+, twisted, pyopenssl, service-identity }:
+
+buildPythonPackage rec {
+  pname = "python3-gnutls";
+  version = "3.1.9";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "AGProjects";
+    repo = "python3-gnutls";
+    rev = "324b78f7cd3d9fe58c89c7f0b2bf94199bd6a6e5"; # version not tagged
+    hash = "sha256-18T8bAHlNERHobsspUFvSC6ulN55nrFFb5aqNwU8T00=";
+  };
+
+  propagatedBuildInputs = [ twisted pyopenssl service-identity ];
+
+  patches = [
+    (substituteAll {
+      src = ./libgnutls-path.patch;
+      gnutlslib = "${lib.getLib gnutls}/lib";
+    })
+   ];
+
+  pythonImportsCheck = [ "gnutls" ];
+
+  meta = with lib; {
+    description = "Python wrapper for the GnuTLS library";
+    homepage = "https://github.com/AGProjects/python3-gnutls";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ chanley ];
+    longDescription = ''
+      This package provides a high level object oriented wrapper around libgnutls,
+      as well as low level bindings to the GnuTLS types and functions via ctypes.
+      The high level wrapper hides the details of accessing the GnuTLS library via
+      ctypes behind a set of classes that encapsulate GnuTLS sessions, certificates
+      and credentials and expose them to python applications using a simple API.
+
+      The package also includes a Twisted interface that has seamless intergration
+      with Twisted, providing connectTLS and listenTLS methods on the Twisted
+      reactor once imported (the methods are automatically attached to the reactor
+      by simply importing the GnuTLS Twisted interface module).
+
+      The high level wrapper is written using the GnuTLS library bindings that are
+      made available via ctypes. This makes the wrapper very powerful and flexible
+      as it has direct access to all the GnuTLS internals and is also very easy to
+      extend without any need to write C code or recompile anything.
+
+    '';
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python3-gnutls/libgnutls-path.patch b/nixpkgs/pkgs/development/python-modules/python3-gnutls/libgnutls-path.patch
new file mode 100644
index 000000000000..ff9b3aa69328
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python3-gnutls/libgnutls-path.patch
@@ -0,0 +1,42 @@
+diff --git a/gnutls/library/__init__.py b/gnutls/library/__init__.py
+index c1d898a..b87bd2e 100644
+--- a/gnutls/library/__init__.py
++++ b/gnutls/library/__init__.py
+@@ -18,35 +18,19 @@ def _library_locations(abi_version):
+     system = _get_system_name()
+     if system == "darwin":
+         library_names = ["libgnutls.%d.dylib" % abi_version]
+-        dynamic_loader_env_vars = ["DYLD_LIBRARY_PATH", "LD_LIBRARY_PATH"]
+-        additional_paths = ["/usr/local/lib", "/opt/local/lib", "/sw/lib"]
+     elif system == "windows":
+         library_names = ["libgnutls-%d.dll" % abi_version]
+-        dynamic_loader_env_vars = ["PATH"]
+-        additional_paths = ["."]
+     elif system == "cygwin":
+         library_names = ["cyggnutls-%d.dll" % abi_version]
+-        dynamic_loader_env_vars = ["LD_LIBRARY_PATH"]
+-        additional_paths = ["/usr/bin"]
+     else:
+         # Debian uses libgnutls-deb0.so.28, go figure
+         library_names = [
+             "libgnutls.so.%d" % abi_version,
+             "libgnutls-deb0.so.%d" % abi_version,
+         ]
+-        dynamic_loader_env_vars = ["LD_LIBRARY_PATH"]
+-        additional_paths = ["/usr/local/lib"]
+     for library_name in library_names:
+-        for path in (
+-            path
+-            for env_var in dynamic_loader_env_vars
+-            for path in os.environ.get(env_var, "").split(":")
+-            if os.path.isdir(path)
+-        ):
+-            yield os.path.join(path, library_name)
+-        yield library_name
+-        for path in additional_paths:
+-            yield os.path.join(path, library_name)
++        path = "@gnutlslib@"
++        yield os.path.join(path, library_name)
+ 
+ 
+ def _load_library(abi_versions):
diff --git a/nixpkgs/pkgs/development/python-modules/python3-openid/default.nix b/nixpkgs/pkgs/development/python-modules/python3-openid/default.nix
new file mode 100644
index 000000000000..769067f53fb0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python3-openid/default.nix
@@ -0,0 +1,23 @@
+{ lib, isPy3k, buildPythonPackage, fetchPypi, defusedxml }:
+
+buildPythonPackage rec {
+  pname = "python3-openid";
+  version = "3.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1bxf9a3ny1js422j962zfzl4a9dhj192pvai05whn7j0iy9gdyrk";
+  };
+
+  propagatedBuildInputs = [ defusedxml ];
+
+  doCheck = false;
+
+  disabled = !isPy3k;
+
+  meta = with lib; {
+    description = "OpenID support for modern servers and consumers";
+    homepage = "https://github.com/necaris/python3-openid";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python3-saml/default.nix b/nixpkgs/pkgs/development/python-modules/python3-saml/default.nix
new file mode 100644
index 000000000000..7a5d8bccaa31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python3-saml/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, freezegun
+, isodate
+, lxml
+, pythonOlder
+, xmlsec
+}:
+
+buildPythonPackage rec {
+  pname = "python3-saml";
+  version = "1.15.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "onelogin";
+    repo = "python3-saml";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-xPPR2z3h8RpoAROpKpu9ZoDxGq5Stm9wQVt4Stj/6fg=";
+  };
+
+  patches = [
+    # skip tests with expired test data
+    # upstream issue: https://github.com/SAML-Toolkits/python3-saml/issues/373
+    (fetchpatch {
+      name = "test-expired.patch";
+      url = "https://github.com/SAML-Toolkits/python3-saml/commit/bd65578e5a21494c89320094c61c1c77250bea33.diff";
+      hash = "sha256-9Trew6R5JDjtc0NRGoklqMVDEI4IEqFOdK3ezyBU6gI=";
+    })
+    (fetchpatch {
+      name = "test-expired.patch";
+      url = "https://github.com/SAML-Toolkits/python3-saml/commit/ea3a6d4ee6ea0c5cfb0f698d8c0ed25638150f47.patch";
+      hash = "sha256-Q9+GM+mCEZK0QVp7ulH2hORVig2411OvkC4+o36DeXg=";
+    })
+    (fetchpatch {
+      name = "test-expired.patch";
+      url = "https://github.com/SAML-Toolkits/python3-saml/commit/feb0d1d954ee4d0ad1ad1d7d536bf9e83fa9431b.patch";
+      hash = "sha256-NURGI4FUnFlWRZfkioU9IYmZ+Zk9FKfZchjdn7N9abU=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    isodate
+    lxml
+    xmlsec
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+  ];
+
+  pythonImportsCheck = [
+    "onelogin.saml2"
+  ];
+
+  meta = with lib; {
+    description = "OneLogin's SAML Python Toolkit";
+    homepage = "https://github.com/onelogin/python3-saml";
+    changelog = "https://github.com/SAML-Toolkits/python3-saml/blob/v${version}/changelog.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ zhaofengli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/python_openzwave/cython.patch b/nixpkgs/pkgs/development/python-modules/python_openzwave/cython.patch
new file mode 100644
index 000000000000..e01ffdbdc0d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python_openzwave/cython.patch
@@ -0,0 +1,20 @@
+diff --git a/pyozw_setup.py b/pyozw_setup.py
+index b201840..37bf2a8 100644
+--- a/pyozw_setup.py
++++ b/pyozw_setup.py
+@@ -257,13 +257,13 @@ class Template(object):
+         if sys.platform.startswith("win"):
+             return ['Cython']
+         else:
+-            return ['Cython==0.28.6']
++            return ['Cython>=0.28.6']
+ 
+     def build_requires(self):
+         if sys.platform.startswith("win"):
+             return ['Cython']
+         else:
+-            return ['Cython==0.28.6']
++            return ['Cython>=0.28.6']
+ 
+     def build(self):
+         if len(self.ctx['extra_objects']) == 1 and os.path.isfile(self.ctx['extra_objects'][0]):
diff --git a/nixpkgs/pkgs/development/python-modules/python_openzwave/default.nix b/nixpkgs/pkgs/development/python-modules/python_openzwave/default.nix
new file mode 100644
index 000000000000..e24f4f65d53e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/python_openzwave/default.nix
@@ -0,0 +1,42 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k
+, pkg-config
+, systemd, libyaml, openzwave, cython, pyserial
+, six, pydispatcher, urwid }:
+
+buildPythonPackage rec {
+  pname = "python_openzwave";
+  version = "0.4.19";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6b40c7711383eeb3535cf5504f1cf47cc1ac7018eb820f299642a5a2795aef84";
+    extension = "zip";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ systemd libyaml openzwave cython ];
+  propagatedBuildInputs = [ six urwid pydispatcher pyserial ];
+
+  # primary location for the .xml files is in /etc/openzwave so we override the
+  # /usr/local/etc lookup instead as that allows us to dump new .xml files into
+  # /etc/openzwave if needed
+  postPatch = ''
+    substituteInPlace src-lib/libopenzwave/libopenzwave.pyx \
+      --replace /usr/local/etc/openzwave ${openzwave}/etc/openzwave
+  '';
+
+  patches = [ ./cython.patch ];
+
+  # no tests available
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python wrapper for the OpenZWave C++ library";
+    homepage = "https://github.com/OpenZWave/python-openzwave";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ ];
+    inherit (openzwave.meta) platforms;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pythondialog/default.nix b/nixpkgs/pkgs/development/python-modules/pythondialog/default.nix
new file mode 100644
index 000000000000..3aa139b64b0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pythondialog/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "pythondialog";
+  version = "3.5.3";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b2a34a8af0a6625ccbdf45cd343b854fc6c1a85231dadc80b8805db836756323";
+  };
+
+  patchPhase = ''
+    substituteInPlace dialog.py --replace ":/bin:/usr/bin" ":$out/bin"
+  '';
+
+  meta = with lib; {
+    description = "A Python interface to the UNIX dialog utility and mostly-compatible programs";
+    homepage = "http://pythondialog.sourceforge.net/";
+    license = licenses.lgpl3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pythonegardia/default.nix b/nixpkgs/pkgs/development/python-modules/pythonegardia/default.nix
new file mode 100644
index 000000000000..1affca4ca65f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pythonegardia/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pythonegardia";
+  version = "1.0.52";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "jeroenterheerdt";
+    repo = "python-egardia";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-lQ/7tH74MllwFe2kF5OcYSb4rQd+yJU1W6ztG4Z6Y0U=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Project has no tests, only two test file for manual interaction
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pythonegardia"
+  ];
+
+  meta = with lib; {
+    description = "Python interface with Egardia/Woonveilig alarms";
+    homepage = "https://github.com/jeroenterheerdt/python-egardia";
+    changelog = "https://github.com/jeroenterheerdt/python-egardia/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pythonfinder/default.nix b/nixpkgs/pkgs/development/python-modules/pythonfinder/default.nix
new file mode 100644
index 000000000000..25e0484041a7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pythonfinder/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, cached-property
+, click
+, fetchFromGitHub
+, packaging
+, pydantic
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pythonfinder";
+  version = "2.0.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sarugaku";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-L/+6w5lLqHO5c9CThoUPOHXRPVxBlOWFDAmfoYxRw5g=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --cov" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    cached-property
+    packaging
+    pydantic
+  ];
+
+  passthru.optional-dependencies = {
+    cli = [
+      click
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytest-timeout
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "pythonfinder"
+  ];
+
+  # these tests invoke git in a subprocess and
+  # for some reason git can't be found even if included in nativeCheckInputs
+  # disabledTests = [
+  #   "test_shims_are_kept"
+  #   "test_shims_are_removed"
+  # ];
+
+  meta = with lib; {
+    description = "Cross platform search tool for finding Python";
+    homepage = "https://github.com/sarugaku/pythonfinder";
+    changelog = "https://github.com/sarugaku/pythonfinder/blob/v${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pythonix/default.nix b/nixpkgs/pkgs/development/python-modules/pythonix/default.nix
new file mode 100644
index 000000000000..9059e3b424ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pythonix/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchFromGitHub, ninja, boost, meson, pkg-config, nix, isPy3k, python }:
+
+buildPythonPackage rec {
+  pname = "pythonix";
+  version = "0.1.7";
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "Mic92";
+    repo = "pythonix";
+    rev = "v${version}";
+    sha256 = "1wxqv3i4bva2qq9mx670bcx0g0irjn68fvk28dwvhay9ndwcspqf";
+  };
+
+  disabled = !isPy3k;
+
+  nativeBuildInputs = [ meson ninja pkg-config ];
+
+  buildInputs = [ nix boost ];
+
+  postInstall = ''
+    # This is typically set by pipInstallHook/eggInstallHook,
+    # so we have to do so manually when using meson
+    export PYTHONPATH=$out/${python.sitePackages}:$PYTHONPATH
+  '';
+
+  pythonImportsCheck = [ "nix" ];
+
+  meta = with lib; {
+    description = ''
+       Eval nix code from python.
+    '';
+    maintainers = [ ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pythonnet/default.nix b/nixpkgs/pkgs/development/python-modules/pythonnet/default.nix
new file mode 100644
index 000000000000..5a2272c668c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pythonnet/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pytestCheckHook
+, pycparser
+, psutil
+, dotnet-sdk
+, buildDotnetModule
+, clr-loader
+, setuptools
+}:
+
+let
+  pname = "pythonnet";
+  version = "3.0.3";
+  src = fetchPypi {
+    pname = "pythonnet";
+    inherit version;
+    hash = "sha256-jUsulxWKAjh1+GR0WKWPOIF/T+Oa9gq91rDYrfHXfnU=";
+  };
+
+  # This buildDotnetModule is used only to get nuget sources, the actual
+  # build is done in `buildPythonPackage` below.
+  dotnet-build = buildDotnetModule {
+    inherit pname version src;
+    nugetDeps = ./deps.nix;
+  };
+in
+buildPythonPackage {
+  inherit pname version src;
+
+  format = "pyproject";
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'dynamic = ["version"]' 'version = "${version}"'
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    dotnet-sdk
+  ];
+
+  propagatedBuildInputs = [
+    pycparser
+    clr-loader
+  ];
+
+  pytestFlagsArray = [
+    # Run tests using .NET Core, Mono is unsupported for now due to find_library problem in clr-loader
+    "--runtime coreclr"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    psutil # needed for memory leak tests
+  ];
+
+  # Perform dotnet restore based on the nuget-source
+  preConfigure = ''
+    dotnet restore \
+      -p:ContinuousIntegrationBuild=true \
+      -p:Deterministic=true \
+      --source ${dotnet-build.nuget-source}
+  '';
+
+  # Rerun this when updating to refresh Nuget dependencies
+  passthru.fetch-deps = dotnet-build.fetch-deps;
+
+  meta = with lib; {
+    description = ".NET integration for Python";
+    homepage = "https://pythonnet.github.io";
+    changelog = "https://github.com/pythonnet/pythonnet/releases/tag/v${version}";
+    license = licenses.mit;
+    # <https://github.com/pythonnet/pythonnet/issues/898>
+    badPlatforms = [ "aarch64-linux" ];
+    maintainers = with maintainers; [ jraygauthier mdarocha ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pythonnet/deps.nix b/nixpkgs/pkgs/development/python-modules/pythonnet/deps.nix
new file mode 100644
index 000000000000..43d3a4992c7b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pythonnet/deps.nix
@@ -0,0 +1,194 @@
+# This file was automatically generated by passthru.fetch-deps.
+# Please dont edit it manually, your changes might get overwritten!
+
+{ fetchNuGet }: [
+  (fetchNuGet { pname = "BenchmarkDotNet"; version = "0.13.1"; sha256 = "1kgypxfp34vjy9kvqq8csznsjbnv37pp4r0457i5l1j6zrsm76rp"; })
+  (fetchNuGet { pname = "BenchmarkDotNet.Annotations"; version = "0.13.1"; sha256 = "0fizarpvdajwcvfhd45c35xrnrci5rbn5ksf3zvlw4q300hnlsir"; })
+  (fetchNuGet { pname = "CommandLineParser"; version = "2.4.3"; sha256 = "1aca3q25n3dg55v4j3kzlzfzd5k2jpy6zhp8x7g74pdfdqzrhg55"; })
+  (fetchNuGet { pname = "Iced"; version = "1.8.0"; sha256 = "12cgd9p3jm81wd7m8bp3pm20gmrmbad2hcwzynhz644h3062nn24"; })
+  (fetchNuGet { pname = "Lost.Compat.NullabilityAttributes"; version = "0.0.4"; sha256 = "1h8m1n4x1p69xh86ia1rf4dcr17w965fpxws7d3458r4w1wl143a"; })
+  (fetchNuGet { pname = "Microsoft.Build.Tasks.Git"; version = "1.1.1"; sha256 = "1bb5p4zlnfn88skkvymxfsn0jybqncl4356hwnic9jxdq2d4fz1w"; })
+  (fetchNuGet { pname = "Microsoft.CodeAnalysis.Analyzers"; version = "2.6.1"; sha256 = "1plk343h9fyxg08b9bcnlqyaq00cbnc1v73pj9nbcyphmgf5bqfp"; })
+  (fetchNuGet { pname = "Microsoft.CodeAnalysis.Common"; version = "2.10.0"; sha256 = "1l690xqrhmkasns5ghz0vqj8n2xyl5yrwan5gs52hwfxdwahqaaj"; })
+  (fetchNuGet { pname = "Microsoft.CodeAnalysis.CSharp"; version = "2.10.0"; sha256 = "0saabsr81crawdzs2cnzyjp5cgg2hk5k6q7n0i0pxghswb0m4dxk"; })
+  (fetchNuGet { pname = "Microsoft.CodeCoverage"; version = "16.11.0"; sha256 = "0f41l3kks6wk5vjaxpjh8m2flnrvlbvqgqflamhv8rfz4y8ifgdv"; })
+  (fetchNuGet { pname = "Microsoft.CodeCoverage"; version = "17.0.0"; sha256 = "18gdbsqf6i79ld4ikqr4jhx9ndsggm865b5xj1xmnmgg12ydp19a"; })
+  (fetchNuGet { pname = "Microsoft.CodeCoverage"; version = "17.6.2"; sha256 = "1wwmg6hn4dp2mvwn2bm81wccdw149lq17xdnpz17mvg4zcwmax7g"; })
+  (fetchNuGet { pname = "Microsoft.CSharp"; version = "4.7.0"; sha256 = "0gd67zlw554j098kabg887b5a6pq9kzavpa3jjy5w53ccjzjfy8j"; })
+  (fetchNuGet { pname = "Microsoft.Diagnostics.NETCore.Client"; version = "0.2.61701"; sha256 = "1ic1607jj4ln8dbibf1fz5v9svk9x2kqlgvhndc6ijaqnbc4wcr1"; })
+  (fetchNuGet { pname = "Microsoft.Diagnostics.Runtime"; version = "1.1.126102"; sha256 = "0w7jcxkd4cix6dbh0szawilmykjmdc1rqysllrpwb7ivrxzazypn"; })
+  (fetchNuGet { pname = "Microsoft.Diagnostics.Tracing.TraceEvent"; version = "2.0.61"; sha256 = "0gq51l4yyyn8dir6w41im9fwhw9r6jz6n7jm4zhmvvway5ijbcac"; })
+  (fetchNuGet { pname = "Microsoft.DotNet.InternalAbstractions"; version = "1.0.0"; sha256 = "0mp8ihqlb7fsa789frjzidrfjc1lrhk88qp3xm5qvr7vf4wy4z8x"; })
+  (fetchNuGet { pname = "Microsoft.DotNet.PlatformAbstractions"; version = "2.1.0"; sha256 = "1qydvyyinj3b5mraazjal3n2k7jqhn05b6n1a2f3qjkqkxi63dmy"; })
+  (fetchNuGet { pname = "Microsoft.Net.Compilers.Toolset"; version = "4.0.1"; sha256 = "08njbdnmjzjd6phys94w0di3vcxfq7pniad6s3jc5f65r9s1f0w2"; })
+  (fetchNuGet { pname = "Microsoft.NET.Test.Sdk"; version = "16.11.0"; sha256 = "1a2y6vw6p9xp3w72zq2lwrjl8bxv87s9d7zd2dh4zwbzh1c5slxl"; })
+  (fetchNuGet { pname = "Microsoft.NET.Test.Sdk"; version = "17.0.0"; sha256 = "0bknyf5kig5icwjxls7pcn51x2b2qf91dz9qv67fl70v6cczaz2r"; })
+  (fetchNuGet { pname = "Microsoft.NET.Test.Sdk"; version = "17.6.2"; sha256 = "1a658bnh5q3lfkrr81h3lyx1mc3hggnjr1bpmim71rr2s42ad70v"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "1.0.1"; sha256 = "01al6cfxp68dscl15z7rxfw9zvhm64dncsw09a1vmdkacsa2v6lr"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Platforms"; version = "1.1.0"; sha256 = "08vh1r12g6ykjygq5d3vq09zylgb84l63k49jc4v8faw9g93iqqm"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Targets"; version = "1.0.1"; sha256 = "0ppdkwy6s9p7x9jix3v4402wb171cdiibq7js7i13nxpdky7074p"; })
+  (fetchNuGet { pname = "Microsoft.NETCore.Targets"; version = "1.1.0"; sha256 = "193xwf33fbm0ni3idxzbr5fdq3i2dlfgihsac9jj7whj0gd902nh"; })
+  (fetchNuGet { pname = "Microsoft.NETFramework.ReferenceAssemblies"; version = "1.0.0"; sha256 = "0na724xhvqm63vq9y18fl9jw9q2v99bdwr353378s5fsi11qzxp9"; })
+  (fetchNuGet { pname = "Microsoft.NETFramework.ReferenceAssemblies.net461"; version = "1.0.0"; sha256 = "00vkn4c6i0rn1l9pv912y0wgb9h6ks76qah8hvk441nari8fqbm1"; })
+  (fetchNuGet { pname = "Microsoft.NETFramework.ReferenceAssemblies.net472"; version = "1.0.0"; sha256 = "1bqinq2nxnpqxziypg1sqy3ly0nymxxjpn8fwkn3rl4vl6gdg3rc"; })
+  (fetchNuGet { pname = "Microsoft.SourceLink.Common"; version = "1.1.1"; sha256 = "0xkdqs7az2cprar7jzjlgjpd64l6f8ixcmwmpkdm03fyb4s5m0bg"; })
+  (fetchNuGet { pname = "Microsoft.SourceLink.GitHub"; version = "1.1.1"; sha256 = "099y35f2npvva3jk1zp8hn0vb9pwm2l0ivjasdly6y2idv53s5yy"; })
+  (fetchNuGet { pname = "Microsoft.TestPlatform.ObjectModel"; version = "16.11.0"; sha256 = "1fc0ghk1cny4i8w43b94pxhl0srxisv6kaflkkp30ncsa9szhkxh"; })
+  (fetchNuGet { pname = "Microsoft.TestPlatform.ObjectModel"; version = "17.6.2"; sha256 = "0asbrbdyyig1p034smf79lszzbfv1cn6q181i7d4p2vsiqpjp9sj"; })
+  (fetchNuGet { pname = "Microsoft.TestPlatform.TestHost"; version = "16.11.0"; sha256 = "0hp1vndf2jhyg1f3miq4g2068z5kpfzy6nmswm25vymghxp1ws4k"; })
+  (fetchNuGet { pname = "Microsoft.TestPlatform.TestHost"; version = "17.6.2"; sha256 = "0lcj8kkcnxbwiaw6j0xf4fxqpa6z0s41nq52spvckfg4367lg4fg"; })
+  (fetchNuGet { pname = "Microsoft.Win32.Primitives"; version = "4.3.0"; sha256 = "0j0c1wj4ndj21zsgivsc24whiya605603kxrbiw6wkfdync464wq"; })
+  (fetchNuGet { pname = "Microsoft.Win32.Registry"; version = "4.3.0"; sha256 = "1gxyzxam8163vk1kb6xzxjj4iwspjsz9zhgn1w9rjzciphaz0ig7"; })
+  (fetchNuGet { pname = "Microsoft.Win32.Registry"; version = "4.5.0"; sha256 = "1zapbz161ji8h82xiajgriq6zgzmb1f3ar517p2h63plhsq5gh2q"; })
+  (fetchNuGet { pname = "NETStandard.Library"; version = "2.0.0"; sha256 = "1bc4ba8ahgk15m8k4nd7x406nhi0kwqzbgjk2dmw52ss553xz7iy"; })
+  (fetchNuGet { pname = "NETStandard.Library"; version = "2.0.3"; sha256 = "1fn9fxppfcg4jgypp2pmrpr6awl3qz1xmnri0cygpkwvyx27df1y"; })
+  (fetchNuGet { pname = "Newtonsoft.Json"; version = "13.0.1"; sha256 = "0fijg0w6iwap8gvzyjnndds0q4b8anwxxvik7y8vgq97dram4srb"; })
+  (fetchNuGet { pname = "Newtonsoft.Json"; version = "9.0.1"; sha256 = "0mcy0i7pnfpqm4pcaiyzzji4g0c8i3a5gjz28rrr28110np8304r"; })
+  (fetchNuGet { pname = "NonCopyableAnalyzer"; version = "0.7.0"; sha256 = "1jry36p53fkk3fn9pawgg7qiv79j30y0kvd4xrnd58d7zg7zzdj0"; })
+  (fetchNuGet { pname = "NuGet.Frameworks"; version = "5.0.0"; sha256 = "18ijvmj13cwjdrrm52c8fpq021531zaz4mj4b4zapxaqzzxf2qjr"; })
+  (fetchNuGet { pname = "NuGet.Frameworks"; version = "6.5.0"; sha256 = "0s37d1p4md0k6d4cy6sq36f2dgkd9qfbzapxhkvi8awwh0vrynhj"; })
+  (fetchNuGet { pname = "NUnit"; version = "3.12.0"; sha256 = "1880j2xwavi8f28vxan3hyvdnph4nlh5sbmh285s4lc9l0b7bdk2"; })
+  (fetchNuGet { pname = "NUnit"; version = "3.13.3"; sha256 = "0wdzfkygqnr73s6lpxg5b1pwaqz9f414fxpvpdmf72bvh4jaqzv6"; })
+  (fetchNuGet { pname = "NUnit3TestAdapter"; version = "3.16.1"; sha256 = "1pzhmapfdszsfza7zjr3zrlz4fssdxsyiwmlj76a40mbhxhfa4q9"; })
+  (fetchNuGet { pname = "NUnit3TestAdapter"; version = "3.17.0"; sha256 = "0kxc6z3b8ccdrcyqz88jm5yh5ch9nbg303v67q8sp5hhs8rl8nk6"; })
+  (fetchNuGet { pname = "NUnit3TestAdapter"; version = "4.5.0"; sha256 = "1srx1629s0k1kmf02nmz251q07vj6pv58mdafcr5dr0bbn1fh78i"; })
+  (fetchNuGet { pname = "Perfolizer"; version = "0.2.1"; sha256 = "012aqqi3y3nfikqmn26yajpwd52c04zlzp0p91iyslw7mf26qncy"; })
+  (fetchNuGet { pname = "runtime.any.System.Collections"; version = "4.3.0"; sha256 = "0bv5qgm6vr47ynxqbnkc7i797fdi8gbjjxii173syrx14nmrkwg0"; })
+  (fetchNuGet { pname = "runtime.any.System.Diagnostics.Tools"; version = "4.3.0"; sha256 = "1wl76vk12zhdh66vmagni66h5xbhgqq7zkdpgw21jhxhvlbcl8pk"; })
+  (fetchNuGet { pname = "runtime.any.System.Diagnostics.Tracing"; version = "4.3.0"; sha256 = "00j6nv2xgmd3bi347k00m7wr542wjlig53rmj28pmw7ddcn97jbn"; })
+  (fetchNuGet { pname = "runtime.any.System.Globalization"; version = "4.3.0"; sha256 = "1daqf33hssad94lamzg01y49xwndy2q97i2lrb7mgn28656qia1x"; })
+  (fetchNuGet { pname = "runtime.any.System.IO"; version = "4.3.0"; sha256 = "0l8xz8zn46w4d10bcn3l4yyn4vhb3lrj2zw8llvz7jk14k4zps5x"; })
+  (fetchNuGet { pname = "runtime.any.System.Reflection"; version = "4.3.0"; sha256 = "02c9h3y35pylc0zfq3wcsvc5nqci95nrkq0mszifc0sjx7xrzkly"; })
+  (fetchNuGet { pname = "runtime.any.System.Reflection.Extensions"; version = "4.3.0"; sha256 = "0zyri97dfc5vyaz9ba65hjj1zbcrzaffhsdlpxc9bh09wy22fq33"; })
+  (fetchNuGet { pname = "runtime.any.System.Reflection.Primitives"; version = "4.3.0"; sha256 = "0x1mm8c6iy8rlxm8w9vqw7gb7s1ljadrn049fmf70cyh42vdfhrf"; })
+  (fetchNuGet { pname = "runtime.any.System.Resources.ResourceManager"; version = "4.3.0"; sha256 = "03kickal0iiby82wa5flar18kyv82s9s6d4xhk5h4bi5kfcyfjzl"; })
+  (fetchNuGet { pname = "runtime.any.System.Runtime"; version = "4.3.0"; sha256 = "1cqh1sv3h5j7ixyb7axxbdkqx6cxy00p4np4j91kpm492rf4s25b"; })
+  (fetchNuGet { pname = "runtime.any.System.Runtime.Handles"; version = "4.3.0"; sha256 = "0bh5bi25nk9w9xi8z23ws45q5yia6k7dg3i4axhfqlnj145l011x"; })
+  (fetchNuGet { pname = "runtime.any.System.Runtime.InteropServices"; version = "4.3.0"; sha256 = "0c3g3g3jmhlhw4klrc86ka9fjbl7i59ds1fadsb2l8nqf8z3kb19"; })
+  (fetchNuGet { pname = "runtime.any.System.Text.Encoding"; version = "4.3.0"; sha256 = "0aqqi1v4wx51h51mk956y783wzags13wa7mgqyclacmsmpv02ps3"; })
+  (fetchNuGet { pname = "runtime.any.System.Text.Encoding.Extensions"; version = "4.3.0"; sha256 = "0lqhgqi0i8194ryqq6v2gqx0fb86db2gqknbm0aq31wb378j7ip8"; })
+  (fetchNuGet { pname = "runtime.any.System.Threading.Tasks"; version = "4.3.0"; sha256 = "03mnvkhskbzxddz4hm113zsch1jyzh2cs450dk3rgfjp8crlw1va"; })
+  (fetchNuGet { pname = "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "16rnxzpk5dpbbl1x354yrlsbvwylrq456xzpsha1n9y3glnhyx9d"; })
+  (fetchNuGet { pname = "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0hkg03sgm2wyq8nqk6dbm9jh5vcq57ry42lkqdmfklrw89lsmr59"; })
+  (fetchNuGet { pname = "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0c2p354hjx58xhhz7wv6div8xpi90sc6ibdm40qin21bvi7ymcaa"; })
+  (fetchNuGet { pname = "runtime.native.System"; version = "4.3.0"; sha256 = "15hgf6zaq9b8br2wi1i3x0zvmk410nlmsmva9p0bbg73v6hml5k4"; })
+  (fetchNuGet { pname = "runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "18pzfdlwsg2nb1jjjjzyb5qlgy6xjxzmhnfaijq5s2jw3cm3ab97"; })
+  (fetchNuGet { pname = "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0qyynf9nz5i7pc26cwhgi8j62ps27sqmf78ijcfgzab50z9g8ay3"; })
+  (fetchNuGet { pname = "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "1klrs545awhayryma6l7g2pvnp9xy4z0r1i40r80zb45q3i9nbyf"; })
+  (fetchNuGet { pname = "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0zcxjv5pckplvkg0r6mw3asggm7aqzbdjimhvsasb0cgm59x09l3"; })
+  (fetchNuGet { pname = "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "0vhynn79ih7hw7cwjazn87rm9z9fj0rvxgzlab36jybgcpcgphsn"; })
+  (fetchNuGet { pname = "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "160p68l2c7cqmyqjwxydcvgw7lvl1cr0znkw8fp24d1by9mqc8p3"; })
+  (fetchNuGet { pname = "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "15zrc8fgd8zx28hdghcj5f5i34wf3l6bq5177075m2bc2j34jrqy"; })
+  (fetchNuGet { pname = "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl"; version = "4.3.0"; sha256 = "1p4dgxax6p7rlgj4q73k73rslcnz4wdcv8q2flg1s8ygwcm58ld5"; })
+  (fetchNuGet { pname = "runtime.unix.Microsoft.Win32.Primitives"; version = "4.3.0"; sha256 = "0y61k9zbxhdi0glg154v30kkq7f8646nif8lnnxbvkjpakggd5id"; })
+  (fetchNuGet { pname = "runtime.unix.System.Diagnostics.Debug"; version = "4.3.0"; sha256 = "1lps7fbnw34bnh3lm31gs5c0g0dh7548wfmb8zz62v0zqz71msj5"; })
+  (fetchNuGet { pname = "runtime.unix.System.IO.FileSystem"; version = "4.3.0"; sha256 = "14nbkhvs7sji5r1saj2x8daz82rnf9kx28d3v2qss34qbr32dzix"; })
+  (fetchNuGet { pname = "runtime.unix.System.Private.Uri"; version = "4.3.0"; sha256 = "1jx02q6kiwlvfksq1q9qr17fj78y5v6mwsszav4qcz9z25d5g6vk"; })
+  (fetchNuGet { pname = "runtime.unix.System.Runtime.Extensions"; version = "4.3.0"; sha256 = "0pnxxmm8whx38dp6yvwgmh22smknxmqs5n513fc7m4wxvs1bvi4p"; })
+  (fetchNuGet { pname = "System.AppContext"; version = "4.1.0"; sha256 = "0fv3cma1jp4vgj7a8hqc9n7hr1f1kjp541s6z0q1r6nazb4iz9mz"; })
+  (fetchNuGet { pname = "System.AppContext"; version = "4.3.0"; sha256 = "1649qvy3dar900z3g817h17nl8jp4ka5vcfmsr05kh0fshn7j3ya"; })
+  (fetchNuGet { pname = "System.Buffers"; version = "4.3.0"; sha256 = "0fgns20ispwrfqll4q1zc1waqcmylb3zc50ys9x8zlwxh9pmd9jy"; })
+  (fetchNuGet { pname = "System.Buffers"; version = "4.4.0"; sha256 = "183f8063w8zqn99pv0ni0nnwh7fgx46qzxamwnans55hhs2l0g19"; })
+  (fetchNuGet { pname = "System.Collections"; version = "4.0.11"; sha256 = "1ga40f5lrwldiyw6vy67d0sg7jd7ww6kgwbksm19wrvq9hr0bsm6"; })
+  (fetchNuGet { pname = "System.Collections"; version = "4.3.0"; sha256 = "19r4y64dqyrq6k4706dnyhhw7fs24kpp3awak7whzss39dakpxk9"; })
+  (fetchNuGet { pname = "System.Collections.Concurrent"; version = "4.3.0"; sha256 = "0wi10md9aq33jrkh2c24wr2n9hrpyamsdhsxdcnf43b7y86kkii8"; })
+  (fetchNuGet { pname = "System.Collections.Immutable"; version = "1.5.0"; sha256 = "1d5gjn5afnrf461jlxzawcvihz195gayqpcfbv6dd7pxa9ialn06"; })
+  (fetchNuGet { pname = "System.Collections.NonGeneric"; version = "4.3.0"; sha256 = "07q3k0hf3mrcjzwj8fwk6gv3n51cb513w4mgkfxzm3i37sc9kz7k"; })
+  (fetchNuGet { pname = "System.Collections.Specialized"; version = "4.3.0"; sha256 = "1sdwkma4f6j85m3dpb53v9vcgd0zyc9jb33f8g63byvijcj39n20"; })
+  (fetchNuGet { pname = "System.ComponentModel"; version = "4.3.0"; sha256 = "0986b10ww3nshy30x9sjyzm0jx339dkjxjj3401r3q0f6fx2wkcb"; })
+  (fetchNuGet { pname = "System.ComponentModel.EventBasedAsync"; version = "4.3.0"; sha256 = "1rv9bkb8yyhqqqrx6x95njv6mdxlbvv527b44mrd93g8fmgkifl7"; })
+  (fetchNuGet { pname = "System.ComponentModel.Primitives"; version = "4.3.0"; sha256 = "1svfmcmgs0w0z9xdw2f2ps05rdxmkxxhf0l17xk9l1l8xfahkqr0"; })
+  (fetchNuGet { pname = "System.ComponentModel.TypeConverter"; version = "4.3.0"; sha256 = "17ng0p7v3nbrg3kycz10aqrrlw4lz9hzhws09pfh8gkwicyy481x"; })
+  (fetchNuGet { pname = "System.Console"; version = "4.3.0"; sha256 = "1flr7a9x920mr5cjsqmsy9wgnv3lvd0h1g521pdr1lkb2qycy7ay"; })
+  (fetchNuGet { pname = "System.Diagnostics.Debug"; version = "4.0.11"; sha256 = "0gmjghrqmlgzxivd2xl50ncbglb7ljzb66rlx8ws6dv8jm0d5siz"; })
+  (fetchNuGet { pname = "System.Diagnostics.Debug"; version = "4.3.0"; sha256 = "00yjlf19wjydyr6cfviaph3vsjzg3d5nvnya26i2fvfg53sknh3y"; })
+  (fetchNuGet { pname = "System.Diagnostics.FileVersionInfo"; version = "4.3.0"; sha256 = "094hx249lb3vb336q7dg3v257hbxvz2jnalj695l7cg5kxzqwai7"; })
+  (fetchNuGet { pname = "System.Diagnostics.Process"; version = "4.3.0"; sha256 = "0g4prsbkygq8m21naqmcp70f24a1ksyix3dihb1r1f71lpi3cfj7"; })
+  (fetchNuGet { pname = "System.Diagnostics.StackTrace"; version = "4.3.0"; sha256 = "0ash4h9k0m7xsm0yl79r0ixrdz369h7y922wipp5gladmlbvpyjd"; })
+  (fetchNuGet { pname = "System.Diagnostics.Tools"; version = "4.0.1"; sha256 = "19cknvg07yhakcvpxg3cxa0bwadplin6kyxd8mpjjpwnp56nl85x"; })
+  (fetchNuGet { pname = "System.Diagnostics.Tools"; version = "4.3.0"; sha256 = "0in3pic3s2ddyibi8cvgl102zmvp9r9mchh82ns9f0ms4basylw1"; })
+  (fetchNuGet { pname = "System.Diagnostics.Tracing"; version = "4.3.0"; sha256 = "1m3bx6c2s958qligl67q7grkwfz3w53hpy7nc97mh6f7j5k168c4"; })
+  (fetchNuGet { pname = "System.Dynamic.Runtime"; version = "4.0.11"; sha256 = "1pla2dx8gkidf7xkciig6nifdsb494axjvzvann8g2lp3dbqasm9"; })
+  (fetchNuGet { pname = "System.Dynamic.Runtime"; version = "4.3.0"; sha256 = "1d951hrvrpndk7insiag80qxjbf2y0y39y8h5hnq9612ws661glk"; })
+  (fetchNuGet { pname = "System.Globalization"; version = "4.0.11"; sha256 = "070c5jbas2v7smm660zaf1gh0489xanjqymkvafcs4f8cdrs1d5d"; })
+  (fetchNuGet { pname = "System.Globalization"; version = "4.3.0"; sha256 = "1cp68vv683n6ic2zqh2s1fn4c2sd87g5hpp6l4d4nj4536jz98ki"; })
+  (fetchNuGet { pname = "System.Globalization.Extensions"; version = "4.3.0"; sha256 = "02a5zfxavhv3jd437bsncbhd2fp1zv4gxzakp1an9l6kdq1mcqls"; })
+  (fetchNuGet { pname = "System.IO"; version = "4.1.0"; sha256 = "1g0yb8p11vfd0kbkyzlfsbsp5z44lwsvyc0h3dpw6vqnbi035ajp"; })
+  (fetchNuGet { pname = "System.IO"; version = "4.3.0"; sha256 = "05l9qdrzhm4s5dixmx68kxwif4l99ll5gqmh7rqgw554fx0agv5f"; })
+  (fetchNuGet { pname = "System.IO.Compression"; version = "4.3.0"; sha256 = "084zc82yi6yllgda0zkgl2ys48sypiswbiwrv7irb3r0ai1fp4vz"; })
+  (fetchNuGet { pname = "System.IO.FileSystem"; version = "4.0.1"; sha256 = "0kgfpw6w4djqra3w5crrg8xivbanh1w9dh3qapb28q060wb9flp1"; })
+  (fetchNuGet { pname = "System.IO.FileSystem"; version = "4.3.0"; sha256 = "0z2dfrbra9i6y16mm9v1v6k47f0fm617vlb7s5iybjjsz6g1ilmw"; })
+  (fetchNuGet { pname = "System.IO.FileSystem.Primitives"; version = "4.0.1"; sha256 = "1s0mniajj3lvbyf7vfb5shp4ink5yibsx945k6lvxa96r8la1612"; })
+  (fetchNuGet { pname = "System.IO.FileSystem.Primitives"; version = "4.3.0"; sha256 = "0j6ndgglcf4brg2lz4wzsh1av1gh8xrzdsn9f0yznskhqn1xzj9c"; })
+  (fetchNuGet { pname = "System.Linq"; version = "4.1.0"; sha256 = "1ppg83svb39hj4hpp5k7kcryzrf3sfnm08vxd5sm2drrijsla2k5"; })
+  (fetchNuGet { pname = "System.Linq"; version = "4.3.0"; sha256 = "1w0gmba695rbr80l1k2h4mrwzbzsyfl2z4klmpbsvsg5pm4a56s7"; })
+  (fetchNuGet { pname = "System.Linq.Expressions"; version = "4.1.0"; sha256 = "1gpdxl6ip06cnab7n3zlcg6mqp7kknf73s8wjinzi4p0apw82fpg"; })
+  (fetchNuGet { pname = "System.Linq.Expressions"; version = "4.3.0"; sha256 = "0ky2nrcvh70rqq88m9a5yqabsl4fyd17bpr63iy2mbivjs2nyypv"; })
+  (fetchNuGet { pname = "System.Management"; version = "4.5.0"; sha256 = "19z5x23n21xi94bgl531l9hrm64nyw9d5fpd7klfvr5xfsbh9jwr"; })
+  (fetchNuGet { pname = "System.Memory"; version = "4.5.3"; sha256 = "0naqahm3wljxb5a911d37mwjqjdxv9l0b49p5dmfyijvni2ppy8a"; })
+  (fetchNuGet { pname = "System.Numerics.Vectors"; version = "4.4.0"; sha256 = "0rdvma399070b0i46c4qq1h2yvjj3k013sqzkilz4bz5cwmx1rba"; })
+  (fetchNuGet { pname = "System.ObjectModel"; version = "4.0.12"; sha256 = "1sybkfi60a4588xn34nd9a58png36i0xr4y4v4kqpg8wlvy5krrj"; })
+  (fetchNuGet { pname = "System.Private.Uri"; version = "4.3.0"; sha256 = "04r1lkdnsznin0fj4ya1zikxiqr0h6r6a1ww2dsm60gqhdrf0mvx"; })
+  (fetchNuGet { pname = "System.Reflection"; version = "4.1.0"; sha256 = "1js89429pfw79mxvbzp8p3q93il6rdff332hddhzi5wqglc4gml9"; })
+  (fetchNuGet { pname = "System.Reflection"; version = "4.3.0"; sha256 = "0xl55k0mw8cd8ra6dxzh974nxif58s3k1rjv1vbd7gjbjr39j11m"; })
+  (fetchNuGet { pname = "System.Reflection.Emit"; version = "4.0.1"; sha256 = "0ydqcsvh6smi41gyaakglnv252625hf29f7kywy2c70nhii2ylqp"; })
+  (fetchNuGet { pname = "System.Reflection.Emit"; version = "4.3.0"; sha256 = "11f8y3qfysfcrscjpjym9msk7lsfxkk4fmz9qq95kn3jd0769f74"; })
+  (fetchNuGet { pname = "System.Reflection.Emit.ILGeneration"; version = "4.0.1"; sha256 = "1pcd2ig6bg144y10w7yxgc9d22r7c7ww7qn1frdfwgxr24j9wvv0"; })
+  (fetchNuGet { pname = "System.Reflection.Emit.ILGeneration"; version = "4.3.0"; sha256 = "0w1n67glpv8241vnpz1kl14sy7zlnw414aqwj4hcx5nd86f6994q"; })
+  (fetchNuGet { pname = "System.Reflection.Emit.Lightweight"; version = "4.0.1"; sha256 = "1s4b043zdbx9k39lfhvsk68msv1nxbidhkq6nbm27q7sf8xcsnxr"; })
+  (fetchNuGet { pname = "System.Reflection.Emit.Lightweight"; version = "4.3.0"; sha256 = "0ql7lcakycrvzgi9kxz1b3lljd990az1x6c4jsiwcacrvimpib5c"; })
+  (fetchNuGet { pname = "System.Reflection.Extensions"; version = "4.0.1"; sha256 = "0m7wqwq0zqq9gbpiqvgk3sr92cbrw7cp3xn53xvw7zj6rz6fdirn"; })
+  (fetchNuGet { pname = "System.Reflection.Extensions"; version = "4.3.0"; sha256 = "02bly8bdc98gs22lqsfx9xicblszr2yan7v2mmw3g7hy6miq5hwq"; })
+  (fetchNuGet { pname = "System.Reflection.Metadata"; version = "1.6.0"; sha256 = "1wdbavrrkajy7qbdblpbpbalbdl48q3h34cchz24gvdgyrlf15r4"; })
+  (fetchNuGet { pname = "System.Reflection.Primitives"; version = "4.0.1"; sha256 = "1bangaabhsl4k9fg8khn83wm6yial8ik1sza7401621jc6jrym28"; })
+  (fetchNuGet { pname = "System.Reflection.Primitives"; version = "4.3.0"; sha256 = "04xqa33bld78yv5r93a8n76shvc8wwcdgr1qvvjh959g3rc31276"; })
+  (fetchNuGet { pname = "System.Reflection.TypeExtensions"; version = "4.1.0"; sha256 = "1bjli8a7sc7jlxqgcagl9nh8axzfl11f4ld3rjqsyxc516iijij7"; })
+  (fetchNuGet { pname = "System.Reflection.TypeExtensions"; version = "4.3.0"; sha256 = "0y2ssg08d817p0vdag98vn238gyrrynjdj4181hdg780sif3ykp1"; })
+  (fetchNuGet { pname = "System.Resources.ResourceManager"; version = "4.0.1"; sha256 = "0b4i7mncaf8cnai85jv3wnw6hps140cxz8vylv2bik6wyzgvz7bi"; })
+  (fetchNuGet { pname = "System.Resources.ResourceManager"; version = "4.3.0"; sha256 = "0sjqlzsryb0mg4y4xzf35xi523s4is4hz9q4qgdvlvgivl7qxn49"; })
+  (fetchNuGet { pname = "System.Runtime"; version = "4.1.0"; sha256 = "02hdkgk13rvsd6r9yafbwzss8kr55wnj8d5c7xjnp8gqrwc8sn0m"; })
+  (fetchNuGet { pname = "System.Runtime"; version = "4.3.0"; sha256 = "066ixvgbf2c929kgknshcxqj6539ax7b9m570cp8n179cpfkapz7"; })
+  (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "4.5.2"; sha256 = "1vz4275fjij8inf31np78hw50al8nqkngk04p3xv5n4fcmf1grgi"; })
+  (fetchNuGet { pname = "System.Runtime.Extensions"; version = "4.1.0"; sha256 = "0rw4rm4vsm3h3szxp9iijc3ksyviwsv6f63dng3vhqyg4vjdkc2z"; })
+  (fetchNuGet { pname = "System.Runtime.Extensions"; version = "4.3.0"; sha256 = "1ykp3dnhwvm48nap8q23893hagf665k0kn3cbgsqpwzbijdcgc60"; })
+  (fetchNuGet { pname = "System.Runtime.Handles"; version = "4.0.1"; sha256 = "1g0zrdi5508v49pfm3iii2hn6nm00bgvfpjq1zxknfjrxxa20r4g"; })
+  (fetchNuGet { pname = "System.Runtime.Handles"; version = "4.3.0"; sha256 = "0sw2gfj2xr7sw9qjn0j3l9yw07x73lcs97p8xfc9w1x9h5g5m7i8"; })
+  (fetchNuGet { pname = "System.Runtime.InteropServices"; version = "4.1.0"; sha256 = "01kxqppx3dr3b6b286xafqilv4s2n0gqvfgzfd4z943ga9i81is1"; })
+  (fetchNuGet { pname = "System.Runtime.InteropServices"; version = "4.3.0"; sha256 = "00hywrn4g7hva1b2qri2s6rabzwgxnbpw9zfxmz28z09cpwwgh7j"; })
+  (fetchNuGet { pname = "System.Runtime.InteropServices.RuntimeInformation"; version = "4.0.0"; sha256 = "0glmvarf3jz5xh22iy3w9v3wyragcm4hfdr17v90vs7vcrm7fgp6"; })
+  (fetchNuGet { pname = "System.Runtime.InteropServices.RuntimeInformation"; version = "4.3.0"; sha256 = "0q18r1sh4vn7bvqgd6dmqlw5v28flbpj349mkdish2vjyvmnb2ii"; })
+  (fetchNuGet { pname = "System.Runtime.Numerics"; version = "4.3.0"; sha256 = "19rav39sr5dky7afygh309qamqqmi9kcwvz3i0c5700v0c5cg61z"; })
+  (fetchNuGet { pname = "System.Runtime.Serialization.Primitives"; version = "4.1.1"; sha256 = "042rfjixknlr6r10vx2pgf56yming8lkjikamg3g4v29ikk78h7k"; })
+  (fetchNuGet { pname = "System.Security.AccessControl"; version = "4.5.0"; sha256 = "1wvwanz33fzzbnd2jalar0p0z3x0ba53vzx1kazlskp7pwyhlnq0"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Algorithms"; version = "4.3.0"; sha256 = "03sq183pfl5kp7gkvq77myv7kbpdnq3y0xj7vi4q1kaw54sny0ml"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Encoding"; version = "4.3.0"; sha256 = "1jr6w70igqn07k5zs1ph6xja97hxnb3mqbspdrff6cvssgrixs32"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Primitives"; version = "4.3.0"; sha256 = "0pyzncsv48zwly3lw4f2dayqswcfvdwq2nz0dgwmi7fj3pn64wby"; })
+  (fetchNuGet { pname = "System.Security.Cryptography.X509Certificates"; version = "4.3.0"; sha256 = "0valjcz5wksbvijylxijjxb1mp38mdhv03r533vnx1q3ikzdav9h"; })
+  (fetchNuGet { pname = "System.Security.Principal.Windows"; version = "4.5.0"; sha256 = "0rmj89wsl5yzwh0kqjgx45vzf694v9p92r4x4q6yxldk1cv1hi86"; })
+  (fetchNuGet { pname = "System.Text.Encoding"; version = "4.0.11"; sha256 = "1dyqv0hijg265dwxg6l7aiv74102d6xjiwplh2ar1ly6xfaa4iiw"; })
+  (fetchNuGet { pname = "System.Text.Encoding"; version = "4.3.0"; sha256 = "1f04lkir4iladpp51sdgmis9dj4y8v08cka0mbmsy0frc9a4gjqr"; })
+  (fetchNuGet { pname = "System.Text.Encoding.CodePages"; version = "4.3.0"; sha256 = "0lgxg1gn7pg7j0f942pfdc9q7wamzxsgq3ng248ikdasxz0iadkv"; })
+  (fetchNuGet { pname = "System.Text.Encoding.Extensions"; version = "4.0.11"; sha256 = "08nsfrpiwsg9x5ml4xyl3zyvjfdi4mvbqf93kjdh11j4fwkznizs"; })
+  (fetchNuGet { pname = "System.Text.Encoding.Extensions"; version = "4.3.0"; sha256 = "11q1y8hh5hrp5a3kw25cb6l00v5l5dvirkz8jr3sq00h1xgcgrxy"; })
+  (fetchNuGet { pname = "System.Text.RegularExpressions"; version = "4.1.0"; sha256 = "1mw7vfkkyd04yn2fbhm38msk7dz2xwvib14ygjsb8dq2lcvr18y7"; })
+  (fetchNuGet { pname = "System.Text.RegularExpressions"; version = "4.3.0"; sha256 = "1bgq51k7fwld0njylfn7qc5fmwrk2137gdq7djqdsw347paa9c2l"; })
+  (fetchNuGet { pname = "System.Threading"; version = "4.0.11"; sha256 = "19x946h926bzvbsgj28csn46gak2crv2skpwsx80hbgazmkgb1ls"; })
+  (fetchNuGet { pname = "System.Threading"; version = "4.3.0"; sha256 = "0rw9wfamvhayp5zh3j7p1yfmx9b5khbf4q50d8k5rk993rskfd34"; })
+  (fetchNuGet { pname = "System.Threading.Tasks"; version = "4.0.11"; sha256 = "0nr1r41rak82qfa5m0lhk9mp0k93bvfd7bbd9sdzwx9mb36g28p5"; })
+  (fetchNuGet { pname = "System.Threading.Tasks"; version = "4.3.0"; sha256 = "134z3v9abw3a6jsw17xl3f6hqjpak5l682k2vz39spj4kmydg6k7"; })
+  (fetchNuGet { pname = "System.Threading.Tasks.Extensions"; version = "4.0.0"; sha256 = "1cb51z062mvc2i8blpzmpn9d9mm4y307xrwi65di8ri18cz5r1zr"; })
+  (fetchNuGet { pname = "System.Threading.Tasks.Extensions"; version = "4.3.0"; sha256 = "1xxcx2xh8jin360yjwm4x4cf5y3a2bwpn2ygkfkwkicz7zk50s2z"; })
+  (fetchNuGet { pname = "System.Threading.Tasks.Extensions"; version = "4.5.2"; sha256 = "1sh63dz0dymqcwmprp0nadm77b83vmm7lyllpv578c397bslb8hj"; })
+  (fetchNuGet { pname = "System.Threading.Tasks.Parallel"; version = "4.3.0"; sha256 = "1rr3qa4hxwyj531s4nb3bwrxnxxwz617i0n9gh6x7nr7dd3ayzgh"; })
+  (fetchNuGet { pname = "System.Threading.Thread"; version = "4.3.0"; sha256 = "0y2xiwdfcph7znm2ysxanrhbqqss6a3shi1z3c779pj2s523mjx4"; })
+  (fetchNuGet { pname = "System.Threading.ThreadPool"; version = "4.3.0"; sha256 = "027s1f4sbx0y1xqw2irqn6x161lzj8qwvnh2gn78ciiczdv10vf1"; })
+  (fetchNuGet { pname = "System.ValueTuple"; version = "4.5.0"; sha256 = "00k8ja51d0f9wrq4vv5z2jhq8hy31kac2rg0rv06prylcybzl8cy"; })
+  (fetchNuGet { pname = "System.Xml.ReaderWriter"; version = "4.0.11"; sha256 = "0c6ky1jk5ada9m94wcadih98l6k1fvf6vi7vhn1msjixaha419l5"; })
+  (fetchNuGet { pname = "System.Xml.ReaderWriter"; version = "4.3.0"; sha256 = "0c47yllxifzmh8gq6rq6l36zzvw4kjvlszkqa9wq3fr59n0hl3s1"; })
+  (fetchNuGet { pname = "System.Xml.XDocument"; version = "4.0.11"; sha256 = "0n4lvpqzy9kc7qy1a4acwwd7b7pnvygv895az5640idl2y9zbz18"; })
+  (fetchNuGet { pname = "System.Xml.XDocument"; version = "4.3.0"; sha256 = "08h8fm4l77n0nd4i4fk2386y809bfbwqb7ih9d7564ifcxr5ssxd"; })
+  (fetchNuGet { pname = "System.Xml.XmlDocument"; version = "4.3.0"; sha256 = "0bmz1l06dihx52jxjr22dyv5mxv6pj4852lx68grjm7bivhrbfwi"; })
+  (fetchNuGet { pname = "System.Xml.XPath"; version = "4.3.0"; sha256 = "1cv2m0p70774a0sd1zxc8fm8jk3i5zk2bla3riqvi8gsm0r4kpci"; })
+  (fetchNuGet { pname = "System.Xml.XPath.XDocument"; version = "4.3.0"; sha256 = "1wxckyb7n1pi433xzz0qcwcbl1swpra64065mbwwi8dhdc4kiabn"; })
+  (fetchNuGet { pname = "System.Xml.XPath.XmlDocument"; version = "4.3.0"; sha256 = "1h9lh7qkp0lff33z847sdfjj8yaz98ylbnkbxlnsbflhj9xyfqrm"; })
+]
diff --git a/nixpkgs/pkgs/development/python-modules/pythonocc-core/default.nix b/nixpkgs/pkgs/development/python-modules/pythonocc-core/default.nix
new file mode 100644
index 000000000000..cedf05029c9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pythonocc-core/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, stdenv
+, python
+, fetchFromGitHub
+, cmake
+, Cocoa
+, fontconfig
+, freetype
+, libGL
+, libGLU
+, libX11
+, libXext
+, libXi
+, libXmu
+, opencascade-occt
+, rapidjson
+, swig4
+}:
+
+stdenv.mkDerivation rec {
+  pname = "pythonocc-core";
+  version = "7.6.2";
+
+  src = fetchFromGitHub {
+    owner = "tpaviot";
+    repo = "pythonocc-core";
+    rev = "refs/tags/${version}";
+    hash = "sha256-45pqPQ07KYlpFwJSAYVHbzuqDQTbAvPpxReal52DCzU=";
+  };
+
+  postPatch = ''
+    substituteInPlace CMakeLists.txt \
+    --replace "/usr/X11R6/lib/libGL.dylib" "${libGL}/lib/libGL.dylib" \
+    --replace "/usr/X11R6/lib/libGLU.dylib" "${libGLU}/lib/libGLU.dylib"
+  '';
+
+  nativeBuildInputs = [ cmake swig4 ];
+  buildInputs = [
+    python opencascade-occt
+    freetype libGL libGLU libX11 libXext libXmu libXi
+    fontconfig rapidjson
+  ] ++ lib.optionals stdenv.isDarwin [ Cocoa ];
+
+  cmakeFlags = [
+    "-Wno-dev"
+    "-DPYTHONOCC_INSTALL_DIRECTORY=${placeholder "out"}/${python.sitePackages}/OCC"
+  ];
+
+  passthru = {
+    # `python3Packages.pythonocc-core` must be updated in tandem with
+    # `opencascade-occt`, and including it in the bulk updates often breaks it.
+    skipBulkUpdate = true;
+  };
+
+  meta = with lib; {
+    description = "Python wrapper for the OpenCASCADE 3D modeling kernel";
+    homepage = "https://github.com/tpaviot/pythonocc-core";
+    changelog = "https://github.com/tpaviot/pythonocc-core/releases/tag/${version}";
+    license = licenses.lgpl3;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ gebner ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pythran/0001-hardcode-path-to-libgomp.patch b/nixpkgs/pkgs/development/python-modules/pythran/0001-hardcode-path-to-libgomp.patch
new file mode 100644
index 000000000000..0f5a7ae404b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pythran/0001-hardcode-path-to-libgomp.patch
@@ -0,0 +1,79 @@
+diff --git a/omp/__init__.py b/omp/__init__.py
+index 3801d1c8c..a93a74d6f 100644
+--- a/omp/__init__.py
++++ b/omp/__init__.py
+@@ -48,72 +48,8 @@ class OpenMP(object):
+         return ['omp', 'gomp', 'iomp5']
+ 
+     def init_not_msvc(self):
+-        """ Find OpenMP library and try to load if using ctype interface. """
+-        # find_library() does not automatically search LD_LIBRARY_PATH
+-        # until Python 3.6+, so we explicitly add it.
+-        # LD_LIBRARY_PATH is used on Linux, while macOS uses DYLD_LIBRARY_PATH
+-        # and DYLD_FALLBACK_LIBRARY_PATH.
+-        env_vars = []
+-        if sys.platform == 'darwin':
+-            env_vars = ['DYLD_LIBRARY_PATH', 'DYLD_FALLBACK_LIBRARY_PATH']
+-        else:
+-            env_vars = ['LD_LIBRARY_PATH']
+-
+-        paths = []
+-        for env_var in env_vars:
+-            env_paths = os.environ.get(env_var, '')
+-            if env_paths:
+-                paths.extend(env_paths.split(os.pathsep))
+-
+-
+-        libomp_names = self.get_libomp_names()
+-
+-        if cxx is not None:
+-            for libomp_name in libomp_names:
+-                cmd = [cxx,
+-                       '-print-file-name=lib{}{}'.format(
+-                           libomp_name,
+-                           get_shared_lib_extension())]
+-                # The subprocess can fail in various ways, including because it
+-                # doesn't support '-print-file-name'. In that case just give up.
+-                try:
+-                    output = check_output(cmd,
+-                                          stderr=DEVNULL)
+-                    path = os.path.dirname(output.decode().strip())
+-                    if path:
+-                        paths.append(path)
+-                except (OSError, CalledProcessError):
+-                    pass
+-
+-
+-        for libomp_name in libomp_names:
+-            # Try to load find libomp shared library using loader search dirs
+-            libomp_path = find_library(libomp_name)
+-
+-            # Try to use custom paths if lookup failed
+-            if not libomp_path:
+-                for path in paths:
+-                    candidate_path = os.path.join(
+-                        path,
+-                        'lib{}{}'.format(libomp_name,
+-                                         get_shared_lib_extension()))
+-                    if os.path.isfile(candidate_path):
+-                        libomp_path = candidate_path
+-                        break
+-
+-            # Load the library
+-            if libomp_path:
+-                try:
+-                    self.libomp = ctypes.CDLL(libomp_path)
+-                except OSError:
+-                    raise ImportError("found openMP library '{}' but couldn't load it. "
+-                                      "This may happen if you are cross-compiling.".format(libomp_path))
+-                self.version = 45
+-                return
+-
+-        raise ImportError("I can't find a shared library for libomp, you may need to install it "
+-                          "or adjust the {} environment variable.".format(env_vars[0]))
+-
++        self.libomp = ctypes.CDLL("@gomp@")
++        self.version = 45
+ 
+     def __getattr__(self, name):
+         """
diff --git a/nixpkgs/pkgs/development/python-modules/pythran/default.nix b/nixpkgs/pkgs/development/python-modules/pythran/default.nix
new file mode 100644
index 000000000000..dcb03ad0c517
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pythran/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, python
+, buildPythonPackage
+, fetchFromGitHub
+, openmp
+, ply
+, gast
+, numpy
+, beniget
+, xsimd
+, isPy3k
+, substituteAll
+}:
+
+let
+  inherit (python) stdenv;
+
+in buildPythonPackage rec {
+  pname = "pythran";
+  version = "0.13.1";
+
+  src = fetchFromGitHub {
+    owner = "serge-sans-paille";
+    repo = "pythran";
+    rev = version;
+    hash = "sha256-baDrReJgQXbaKA8KNhHiFjr0X34yb8WK/nUJmiM9EZs=";
+  };
+
+  patches = [
+    # Hardcode path to mp library
+    (substituteAll {
+      src = ./0001-hardcode-path-to-libgomp.patch;
+      gomp = "${if stdenv.cc.isClang then openmp else stdenv.cc.cc.lib}/lib/libgomp${stdenv.hostPlatform.extensions.sharedLibrary}";
+    })
+  ];
+
+  # xsimd: unvendor this header-only C++ lib
+  postPatch = ''
+    rm -r third_party/xsimd
+    ln -s '${lib.getDev xsimd}'/include/xsimd third_party/
+  '';
+
+  propagatedBuildInputs = [
+    ply
+    gast
+    numpy
+    beniget
+  ];
+
+  pythonImportsCheck = [
+    "pythran"
+    "pythran.backend"
+    "pythran.middlend"
+    "pythran.passmanager"
+    "pythran.toolchain"
+    "pythran.spec"
+  ];
+
+  # Test suite is huge and has a circular dependency on scipy.
+  doCheck = false;
+
+  disabled = !isPy3k;
+
+  meta = {
+    description = "Ahead of Time compiler for numeric kernels";
+    homepage = "https://github.com/serge-sans-paille/pythran";
+    license = lib.licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytibber/default.nix b/nixpkgs/pkgs/development/python-modules/pytibber/default.nix
new file mode 100644
index 000000000000..f18402db6bb0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytibber/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, gql
+, graphql-subscription-manager
+, pytest-asyncio
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "pytibber";
+  version = "0.28.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "pyTibber";
+    rev = "refs/tags/${version}";
+    hash = "sha256-vi5f4V0nPb9K3nwdmwMDoNE85Or6haOWjMY4d/2Fj2s=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    gql
+    graphql-subscription-manager
+    python-dateutil
+  ] ++ gql.optional-dependencies.websockets;
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "test/test.py"
+  ];
+
+  # Tests access network
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "tibber"
+  ];
+
+  meta = with lib; {
+    description = "Python library to communicate with Tibber";
+    homepage = "https://github.com/Danielhiversen/pyTibber";
+    changelog = "https://github.com/Danielhiversen/pyTibber/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytidylib/default.nix b/nixpkgs/pkgs/development/python-modules/pytidylib/default.nix
new file mode 100644
index 000000000000..20aa6f817160
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytidylib/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, unittestCheckHook, html-tidy }:
+
+buildPythonPackage rec {
+  pname = "pytidylib";
+  version = "0.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "22b1c8d75970d8064ff999c2369e98af1d0685417eda4c829a5c9f56764b0af3";
+  };
+
+  postPatch = ''
+    # Patch path to library
+    substituteInPlace tidylib/tidy.py \
+      --replace "load_library(name)" \
+        "load_library('${html-tidy}/lib/libtidy${stdenv.hostPlatform.extensions.sharedLibrary}')"
+
+    # Test fails
+    substituteInPlace tests/test_docs.py \
+      --replace "    def test_large_document(self):" \
+        $'    @unittest.skip("")\n    def test_large_document(self):'
+  '';
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  meta = with lib; {
+    description = "Python wrapper for HTML Tidy (tidylib) on Python 2 and 3";
+    homepage = "https://countergram.github.io/pytidylib/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ layus ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytile/default.nix b/nixpkgs/pkgs/development/python-modules/pytile/default.nix
new file mode 100644
index 000000000000..7b1d22110632
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytile/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, certifi
+, fetchFromGitHub
+, poetry-core
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "pytile";
+  version = "2023.10.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = "pytile";
+    rev = "refs/tags/${version}";
+    hash = "sha256-L1Ovpxn7Y+reK8YcVBPwoRjKxcyByrPGz5i/csGzKfE=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    certifi
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Ignore the examples as they are prefixed with test_
+    "examples/"
+  ];
+
+  pythonImportsCheck = [
+    "pytile"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = " Python API for Tile Bluetooth trackers";
+    longDescription = ''
+      pytile is a simple Python library for retrieving information on Tile
+      Bluetooth trackers (including last location and more).
+    '';
+    homepage = "https://github.com/bachya/pytile";
+    changelog = "https://github.com/bachya/pytile/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytimeparse/default.nix b/nixpkgs/pkgs/development/python-modules/pytimeparse/default.nix
new file mode 100644
index 000000000000..257314860d50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytimeparse/default.nix
@@ -0,0 +1,20 @@
+{ lib, fetchPypi, buildPythonPackage, nose }:
+
+buildPythonPackage rec {
+    pname = "pytimeparse";
+    version = "1.1.8";
+
+    src = fetchPypi {
+      inherit pname version;
+      sha256 = "e86136477be924d7e670646a98561957e8ca7308d44841e21f5ddea757556a0a";
+    };
+
+    nativeCheckInputs = [ nose ];
+
+    meta = with lib; {
+      description = "A small Python library to parse various kinds of time expressions";
+      homepage    = "https://github.com/wroberts/pytimeparse";
+      license     = licenses.mit;
+      maintainers = with maintainers; [ vrthra ];
+    };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytimeparse2/default.nix b/nixpkgs/pkgs/development/python-modules/pytimeparse2/default.nix
new file mode 100644
index 000000000000..becbbb267e48
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytimeparse2/default.nix
@@ -0,0 +1,32 @@
+{ lib, fetchFromGitHub, buildPythonPackage, dateutils }:
+
+buildPythonPackage rec {
+  pname = "pytimeparse2";
+  version = "1.7.1";
+
+  src = fetchFromGitHub {
+    owner = "onegreyonewhite";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-zWRbSohTvbVd3GcRRoxH/UReVGYHC0YmbNgbt8N0X48=";
+  };
+
+  propagatedBuildInputs = [ dateutils ];
+
+  # custom checks, see
+  # https://github.com/onegreyonewhite/pytimeparse2/blob/e00df7506b6925f2c6a5783e89e9f239d128271a/tox.ini#L36C20-L36C78
+  checkPhase = ''
+    runHook preCheck
+    python tests.py -vv --failfast
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "pytimeparse2" ];
+
+  meta = with lib; {
+    description = "A pytimeparse based project with the aim of optimizing functionality and providing stable support";
+    homepage = "https://github.com/onegreyonewhite/pytimeparse2";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytlv/default.nix b/nixpkgs/pkgs/development/python-modules/pytlv/default.nix
new file mode 100644
index 000000000000..d4381f904423
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytlv/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, poetry-core
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pytlv";
+  version = "0.71";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-btxZ0oQzn1ZpwXihHlg6CduLh8nkerLV7SoFyXzJjVY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  pythonImportsCheck = [ "pytlv" ];
+
+  meta = with lib; {
+    description = "TLV (tag length lavue) data parser, especially useful for EMV tags parsing";
+    homepage = "https://github.com/timgabets/pytlv";
+    license = licenses.lgpl2;
+    maintainers = with maintainers; [ flokli janik ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytm/default.nix b/nixpkgs/pkgs/development/python-modules/pytm/default.nix
new file mode 100644
index 000000000000..a1567c9383ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytm/default.nix
@@ -0,0 +1,33 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, pythonOlder
+, pydal
+, graphviz
+, pandoc
+, plantuml
+}:
+
+buildPythonPackage rec {
+  pname = "pytm";
+  version = "1.2.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "izar";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1bx4s9a5kdyr2xvpw0smmh7zi9w38891yfqzdj1bmnsjl57x6qrg";
+  };
+
+  propagatedBuildInputs = [ pydal graphviz pandoc plantuml ];
+
+  pythonImportsCheck = [ "pytm" ];
+
+  meta = with lib; {
+    description = "A Pythonic framework for threat modeling";
+    homepage = "https://owasp.org/www-project-pytm/";
+    license = with licenses; [ capec mit ];
+    maintainers = with maintainers; [ wamserma ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytmx/default.nix b/nixpkgs/pkgs/development/python-modules/pytmx/default.nix
new file mode 100644
index 000000000000..177d255a13b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytmx/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pygame
+, pyglet
+, pysdl2
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytmx";
+  version = "3.31";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bitcraft";
+    repo = "PyTMX";
+    rev = "v${version}";
+    sha256 = "05v8zv06fymvgv332g48kcing4k4ncy2iwgpy1qmxrpin1avyynx";
+  };
+
+  propagatedBuildInputs = [
+    pygame
+    pyglet
+    pysdl2
+  ];
+
+  pythonImportsCheck = [
+    "pytmx.pytmx"
+    "pytmx.util_pygame"
+    "pytmx.util_pyglet"
+    "pytmx.util_pysdl2"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # AssertionError on the property name
+    "test_contains_reserved_property_name"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/bitcraft/PyTMX";
+    description = "Python library to read Tiled Map Editor's TMX maps";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ oxzi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytomlpp/default.nix b/nixpkgs/pkgs/development/python-modules/pytomlpp/default.nix
new file mode 100644
index 000000000000..1081f3147964
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytomlpp/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pybind11
+, pytestCheckHook
+, python-dateutil
+, doxygen
+, python
+, pelican
+, matplotlib
+}:
+
+buildPythonPackage rec {
+  pname = "pytomlpp";
+  version = "1.0.13";
+
+  src = fetchFromGitHub {
+    owner = "bobfang1992";
+    repo = pname;
+    rev = "v${version}";
+    fetchSubmodules = true;
+    hash = "sha256-QJeXvj1M3Vq5ctmx7RhczONsPRXAecv3WhJgKWtNK+M=";
+  };
+
+  buildInputs = [ pybind11 ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+
+    python-dateutil
+    doxygen
+    python
+    pelican
+    matplotlib
+  ];
+
+  # pelican requires > 2.7
+  doCheck = !pythonOlder "3.6";
+
+  disabledTests = [
+    # incompatible with pytest7
+    # https://github.com/bobfang1992/pytomlpp/issues/66
+    "test_loads_valid_toml_files"
+    "test_round_trip_for_valid_toml_files"
+    "test_decode_encode_binary"
+  ];
+
+  preCheck = ''
+    cd tests
+  '';
+
+  pythonImportsCheck = [ "pytomlpp" ];
+
+  meta = with lib; {
+    description = "A python wrapper for tomlplusplus";
+    homepage = "https://github.com/bobfang1992/pytomlpp";
+    license = licenses.mit;
+    maintainers = with maintainers; [ evils ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytomorrowio/default.nix b/nixpkgs/pkgs/development/python-modules/pytomorrowio/default.nix
new file mode 100644
index 000000000000..1b5bd96110e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytomorrowio/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, aiohttp
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytomorrowio";
+  version = "0.3.6";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ZCA+GYuZuRgc4Pi9Bcg4zthOnkmQ+/IddFMkR0WYfKk=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytomorrowio"
+  ];
+
+  meta = {
+    description = "Async Python package to access the Tomorrow.io API";
+    homepage = "https://github.com/raman325/pytomorrowio";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytoolconfig/default.nix b/nixpkgs/pkgs/development/python-modules/pytoolconfig/default.nix
new file mode 100644
index 000000000000..fb0b5399f52b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytoolconfig/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, buildPythonPackage
+, docutils
+, fetchFromGitHub
+, packaging
+, pdm-backend
+, platformdirs
+, pydantic
+, pytestCheckHook
+, pythonOlder
+, sphinx
+, sphinx-autodoc-typehints
+, sphinx-rtd-theme
+, sphinxHook
+, tabulate
+, tomli
+}:
+
+buildPythonPackage rec {
+  pname = "pytoolconfig";
+  version = "1.2.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bagel897";
+    repo = "pytoolconfig";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-KmmaxFJbvdOGG9T9iiHKnJpFzZiLVkPJki+qHPxPTdY=";
+  };
+
+  outputs = [
+    "out"
+    "doc"
+  ];
+
+  PDM_PEP517_SCM_VERSION = version;
+
+  nativeBuildInputs = [
+    pdm-backend
+
+    # docs
+    docutils
+    sphinx-autodoc-typehints
+    sphinx-rtd-theme
+    sphinxHook
+  ] ++ passthru.optional-dependencies.doc;
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "packaging>=22.0" "packaging"
+  '';
+
+  propagatedBuildInputs = [
+    packaging
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  passthru.optional-dependencies = {
+    validation = [
+      pydantic
+    ];
+    global = [
+      platformdirs
+    ];
+    doc = [
+      sphinx
+      tabulate
+    ];
+  };
+
+  pythonImportsCheck = [
+    "pytoolconfig"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  meta = with lib; {
+    description = "Python tool configuration";
+    homepage = "https://github.com/bagel897/pytoolconfig";
+    changelog = "https://github.com/bagel897/pytoolconfig/releases/tag/v${version}";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ fab hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytools/default.nix b/nixpkgs/pkgs/development/python-modules/pytools/default.nix
new file mode 100644
index 000000000000..0da6f9c8eb2c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytools/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, decorator
+, numpy
+, platformdirs
+, typing-extensions
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytools";
+  version = "2023.1.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gGN4c9IG9rzt9820atk+horLTqIlbbBS38yocr3QMh8=";
+  };
+
+  propagatedBuildInputs = [
+    decorator
+    numpy
+    platformdirs
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pytools"
+    "pytools.batchjob"
+    "pytools.lex"
+  ];
+
+  meta = {
+    homepage = "https://github.com/inducer/pytools/";
+    description = "Miscellaneous Python lifesavers.";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ artuuge ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytorch-lightning/default.nix b/nixpkgs/pkgs/development/python-modules/pytorch-lightning/default.nix
new file mode 100644
index 000000000000..c2244a1c1447
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytorch-lightning/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, fsspec
+, lightning-utilities
+, numpy
+, packaging
+, pyyaml
+, tensorboardx
+, torch
+, torchmetrics
+, tqdm
+, traitlets
+
+# tests
+, psutil
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytorch-lightning";
+  version = "2.1.2";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "Lightning-AI";
+    repo = "pytorch-lightning";
+    rev = "refs/tags/${version}";
+    hash = "sha256-d5DKAx67uuIPxtSgazIQnxLiHTBD0lwHaB6LD3R6vKA=";
+  };
+
+  preConfigure = ''
+    export PACKAGE_NAME=pytorch
+ '';
+
+  propagatedBuildInputs = [
+    fsspec
+    numpy
+    packaging
+    pyyaml
+    tensorboardx
+    torch
+    lightning-utilities
+    torchmetrics
+    tqdm
+    traitlets
+  ]
+  ++ fsspec.optional-dependencies.http;
+
+  nativeCheckInputs = [
+    psutil
+    pytestCheckHook
+  ];
+
+  # Some packages are not in NixPkgs; other tests try to build distributed
+  # models, which doesn't work in the sandbox.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pytorch_lightning"
+  ];
+
+  meta = with lib; {
+    description = "Lightweight PyTorch wrapper for machine learning researchers";
+    homepage = "https://pytorch-lightning.readthedocs.io";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ tbenst ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytorch-metric-learning/default.nix b/nixpkgs/pkgs/development/python-modules/pytorch-metric-learning/default.nix
new file mode 100644
index 000000000000..b73af6f8658b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytorch-metric-learning/default.nix
@@ -0,0 +1,73 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, numpy
+, scikit-learn
+, pytestCheckHook
+, torch
+, torchvision
+, tqdm
+, faiss
+}:
+
+buildPythonPackage rec {
+  pname   = "pytorch-metric-learning";
+  version = "2.3.0";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "KevinMusgrave";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-eDQQPIyUUEkvpXjWAcyljlFgVlu9is4fPPUTudP7NF4=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    torch
+    scikit-learn
+    torchvision
+    tqdm
+  ];
+
+  preCheck = ''
+    export HOME=$TMP
+    export TEST_DEVICE=cpu
+    export TEST_DTYPES=float32,float64  # half-precision tests fail on CPU
+  '';
+
+  # package only requires `unittest`, but use `pytest` to exclude tests
+  nativeCheckInputs = [
+    faiss
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # TypeError: setup() missing 1 required positional argument: 'world_size'
+    "TestDistributedLossWrapper"
+    # require network access:
+    "TestInference"
+    "test_get_nearest_neighbors"
+    "test_tuplestoweights_sampler"
+    "test_untrained_indexer"
+    "test_metric_loss_only"
+    "test_pca"
+    # flaky
+    "test_distributed_classifier_loss_and_miner"
+  ] ++ lib.optionals (stdenv.isLinux && stdenv.isAarch64) [
+    # RuntimeError: DataLoader worker (pid(s) <...>) exited unexpectedly
+    "test_global_embedding_space_tester"
+    "test_with_same_parent_label_tester"
+  ];
+
+  meta = {
+    description = "Metric learning library for PyTorch";
+    homepage = "https://github.com/KevinMusgrave/pytorch-metric-learning";
+    changelog = "https://github.com/KevinMusgrave/pytorch-metric-learning/releases/tag/v${version}";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytorch-msssim/default.nix b/nixpkgs/pkgs/development/python-modules/pytorch-msssim/default.nix
new file mode 100644
index 000000000000..371ae7514aeb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytorch-msssim/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, wheel
+, torch
+}:
+
+buildPythonPackage rec {
+  pname = "pytorch-msssim";
+  version = "1.0.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "VainF";
+    repo = "pytorch-msssim";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-bghglwQhgByC7BqbDvImSvt6edKF55NLYEPjqmmSFH8=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    torch
+  ];
+
+  pythonImportsCheck = [ "pytorch_msssim" ];
+
+  # This test doesn't have (automatic) tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Fast and differentiable MS-SSIM and SSIM for pytorch";
+    homepage = "https://github.com/VainF/pytorch-msssim";
+    license = licenses.mit;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytorch-pfn-extras/default.nix b/nixpkgs/pkgs/development/python-modules/pytorch-pfn-extras/default.nix
new file mode 100644
index 000000000000..56473cc95ae2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytorch-pfn-extras/default.nix
@@ -0,0 +1,75 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, numpy
+, onnx
+, packaging
+, pytestCheckHook
+, torch
+, torchvision
+, typing-extensions
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "pytorch-pfn-extras";
+  version = "0.7.2";
+
+  src = fetchFromGitHub {
+    owner = "pfnet";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-juoLw/qfq4YF7opyR7cTYCVzUa9pXVvQnvGntcQhBr4=";
+  };
+
+  propagatedBuildInputs = [ numpy packaging torch typing-extensions ];
+
+  nativeCheckInputs = [ onnx pytestCheckHook torchvision ];
+
+  # ignore all pytest warnings
+  preCheck = ''
+    rm pytest.ini
+  '';
+
+  pythonImportsCheck = [ "pytorch_pfn_extras" ];
+
+  disabledTestPaths = [
+    # Requires optuna which is currently (2022-02-16) marked as broken.
+    "tests/pytorch_pfn_extras_tests/test_config_types.py"
+
+    # requires onnxruntime which was removed because of poor maintainability
+    # See https://github.com/NixOS/nixpkgs/pull/105951 https://github.com/NixOS/nixpkgs/pull/155058
+    "tests/pytorch_pfn_extras_tests/onnx_tests/test_export.py"
+    "tests/pytorch_pfn_extras_tests/onnx_tests/test_torchvision.py"
+    "tests/pytorch_pfn_extras_tests/onnx_tests/utils.py"
+    "tests/pytorch_pfn_extras_tests/onnx_tests/test_lax.py"
+
+    # RuntimeError: No Op registered for Gradient with domain_version of 9
+    "tests/pytorch_pfn_extras_tests/onnx_tests/test_grad.py"
+
+    # Requires CUDA access which is not possible in the nix environment.
+    "tests/pytorch_pfn_extras_tests/cuda_tests/test_allocator.py"
+    "tests/pytorch_pfn_extras_tests/nn_tests/modules_tests/test_lazy_batchnorm.py"
+    "tests/pytorch_pfn_extras_tests/nn_tests/modules_tests/test_lazy_conv.py"
+    "tests/pytorch_pfn_extras_tests/nn_tests/modules_tests/test_lazy_linear.py"
+    "tests/pytorch_pfn_extras_tests/nn_tests/modules_tests/test_lazy.py"
+    "tests/pytorch_pfn_extras_tests/profiler_tests/test_record.py"
+    "tests/pytorch_pfn_extras_tests/runtime_tests/test_to.py"
+    "tests/pytorch_pfn_extras_tests/handler_tests/test_handler.py"
+    "tests/pytorch_pfn_extras_tests/test_reporter.py"
+    "tests/pytorch_pfn_extras_tests/training_tests/test_trainer.py"
+    "tests/pytorch_pfn_extras_tests/utils_tests/test_checkpoint.py"
+    "tests/pytorch_pfn_extras_tests/utils_tests/test_comparer.py"
+    "tests/pytorch_pfn_extras_tests/utils_tests/test_new_comparer.py"
+  ] ++ lib.optionals (pythonAtLeast "3.11") [
+    # Remove this when https://github.com/NixOS/nixpkgs/pull/259068 is merged
+    "tests/pytorch_pfn_extras_tests/dynamo_tests/test_compile.py"
+  ];
+
+  meta = with lib; {
+    description = "Supplementary components to accelerate research and development in PyTorch";
+    homepage = "https://github.com/pfnet/pytorch-pfn-extras";
+    license = licenses.mit;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytraccar/default.nix b/nixpkgs/pkgs/development/python-modules/pytraccar/default.nix
new file mode 100644
index 000000000000..f854589103a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytraccar/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pydantic
+, pytestCheckHook
+, pytest-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytraccar";
+  version = "1.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ludeeus";
+    repo = pname;
+    rev = version;
+    hash = "sha256-ngyLe6sbTTQ7n4WdV06OlQnn/vqkD+JUruyMYS1Ym+Q=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pydantic
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=auto"
+  ];
+
+  postPatch = ''
+    # Upstream doesn't set version in the repo
+    substituteInPlace pyproject.toml \
+      --replace 'version = "0"' 'version = "${version}"'
+  '';
+
+  pythonImportsCheck = [
+    "pytraccar"
+  ];
+
+  meta = with lib; {
+    description = "Python library to handle device information from Traccar";
+    homepage = "https://github.com/ludeeus/pytraccar";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytradfri/default.nix b/nixpkgs/pkgs/development/python-modules/pytradfri/default.nix
new file mode 100644
index 000000000000..83ab0a9879f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytradfri/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, aiocoap
+, dtlssocket
+, pydantic
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytradfri";
+  version = "13.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = "pytradfri";
+    rev = "refs/tags/${version}";
+    hash = "sha256-CWv3ebDulZuiFP+nJ2Xr7U/HTDFTqA9VYC0USLkpWR0=";
+  };
+
+  propagatedBuildInputs = [
+    pydantic
+  ];
+
+  passthru.optional-dependencies = {
+    async = [
+      aiocoap
+      dtlssocket
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ]
+  ++ passthru.optional-dependencies.async;
+
+  pythonImportsCheck = [
+    "pytradfri"
+  ];
+
+  meta = with lib; {
+    description = "Python package to communicate with the IKEA Trådfri ZigBee Gateway";
+    homepage = "https://github.com/home-assistant-libs/pytradfri";
+    changelog = "https://github.com/home-assistant-libs/pytradfri/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytrafikverket/default.nix b/nixpkgs/pkgs/development/python-modules/pytrafikverket/default.nix
new file mode 100644
index 000000000000..20b08ebd4431
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytrafikverket/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+, async-timeout
+, lxml
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pytrafikverket";
+  version = "0.3.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3p2tKFuzgl+VFRRXV66MRgcL1XS8xxDqMOUZw+Ql/5E=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    lxml
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pytrafikverket"
+  ];
+
+  meta = with lib; {
+    description = "Library to get data from the Swedish Transport Administration (Trafikverket) API";
+    homepage = "https://github.com/endor-force/pytrafikverket";
+    changelog = "https://github.com/endor-force/pytrafikverket/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytransportnsw/default.nix b/nixpkgs/pkgs/development/python-modules/pytransportnsw/default.nix
new file mode 100644
index 000000000000..67c0749df56b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytransportnsw/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pytransportnsw";
+  version = "0.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "PyTransportNSW";
+    inherit version;
+    sha256 = "00jklgjirmc58hiaqqc2n2rgixvx91bgrd6lv6hv28k51kid10f3";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "TransportNSW" ];
+
+  meta = with lib; {
+    description = "Python module to access Transport NSW information";
+    homepage = "https://github.com/Dav0815/TransportNSW";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytransportnswv2/default.nix b/nixpkgs/pkgs/development/python-modules/pytransportnswv2/default.nix
new file mode 100644
index 000000000000..a2cf2afb7087
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytransportnswv2/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, gtfs-realtime-bindings
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pytransportnswv2";
+  version = "0.2.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "PyTransportNSWv2";
+    inherit version;
+    sha256 = "129rrqckqgfrwdx0b83dqphcv55cxs5i8jl1ascia7rpzjn109ah";
+  };
+
+  propagatedBuildInputs = [
+    gtfs-realtime-bindings
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "TransportNSW" ];
+
+  meta = with lib; {
+    description = "Python module to access Transport NSW information";
+    homepage = "https://github.com/andystewart999/TransportNSW";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytrends/default.nix b/nixpkgs/pkgs/development/python-modules/pytrends/default.nix
new file mode 100644
index 000000000000..d52436348ad7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytrends/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, setuptools-scm
+, wheel
+, requests
+, lxml
+, pandas
+, pytestCheckHook
+, pytest-recording
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "pytrends";
+  version = "4.9.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-aRxuNrGuqkdU82kr260N/0RuUo/7BS7uLn8TmqosaYk=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'addopts = "--cov pytrends/"' ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [ requests lxml pandas ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-recording
+    responses
+  ];
+
+  pytestFlagsArray = [
+    "--block-network"
+  ];
+
+  pythonImportsCheck = [ "pytrends" ];
+
+  meta = with lib; {
+    description = "Pseudo API for Google Trends";
+    homepage = "https://github.com/GeneralMills/pytrends";
+    license = [ licenses.asl20 ];
+    maintainers = [ maintainers.mmahut ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytricia/default.nix b/nixpkgs/pkgs/development/python-modules/pytricia/default.nix
new file mode 100644
index 000000000000..01c4ea014adc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytricia/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "pytricia";
+  version = "unstable-2019-01-16";
+
+  src = fetchFromGitHub {
+    owner = "jsommers";
+    repo = pname;
+    rev = "4ba88f68c3125f789ca8cd1cfae156e1464bde87";
+    sha256 = "0qp5774xkm700g35k5c76pck8pdzqlyzbaqgrz76a1yh67s2ri8h";
+  };
+
+  meta = with lib; {
+    description = "A library for fast IP address lookup in Python";
+    homepage = "https://github.com/jsommers/pytricia";
+    license = with licenses; [ lgpl3Plus ];
+    maintainers = with maintainers; [ mkg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytrydan/default.nix b/nixpkgs/pkgs/development/python-modules/pytrydan/default.nix
new file mode 100644
index 000000000000..ef54cf77b4f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytrydan/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, orjson
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, respx
+, rich
+, syrupy
+, tenacity
+, typer
+}:
+
+buildPythonPackage rec {
+  pname = "pytrydan";
+  version = "0.4.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "dgomes";
+    repo = "pytrydan";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-9PyRICtZ+0Ezinu28oFgFOSnOyCmD7zZbdc/chN+sCo=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=pytrydan --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+    orjson
+    rich
+    tenacity
+    typer
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    respx
+    syrupy
+  ];
+
+  pythonImportsCheck = [
+    "pytrydan"
+  ];
+
+  meta = with lib; {
+    description = "Library to interface with V2C EVSE Trydan";
+    homepage = "https://github.com/dgomes/pytrydan";
+    changelog = "https://github.com/dgomes/pytrydan/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyttsx3/default.nix b/nixpkgs/pkgs/development/python-modules/pyttsx3/default.nix
new file mode 100644
index 000000000000..0cd58e6fa5bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyttsx3/default.nix
@@ -0,0 +1,25 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, espeak-ng }:
+
+buildPythonPackage rec {
+  pname = "pyttsx3";
+  version = "2.90";
+  format = "wheel";
+
+  src = fetchPypi {
+    inherit pname version format;
+    sha256 = "a585b6d8cffc19bd92db1e0ccbd8aa9c6528dd2baa5a47045d6fed542a44aa19";
+    dist = "py3";
+    python = "py3";
+  };
+
+  # This package has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Offline text-to-speech synthesis library";
+    homepage = "https://github.com/nateshmbhat/pyttsx3";
+    license = licenses.mpl20;
+    maintainers = [ maintainers.ethindp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytube/default.nix b/nixpkgs/pkgs/development/python-modules/pytube/default.nix
new file mode 100644
index 000000000000..2c8f714e500e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytube/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pytube";
+  version = "15.0.0";
+
+  disabled = pythonOlder "3.7";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "pytube";
+    repo = "pytube";
+    rev = "v${version}";
+    hash = "sha256-Nvs/YlOjk/P5nd1kpUnCM2n6yiEaqZP830UQI0Ug1rk=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_streaming"
+  ];
+
+  disabledTestPaths = [
+    "tests/test_extract.py"
+    "tests/test_query.py"
+    "tests/test_streams.py"
+    "tests/test_main.py"
+  ];
+
+  pythonImportsCheck = [ "pytube" ];
+
+  meta = with lib; {
+    description = "Python 3 library for downloading YouTube Videos";
+    homepage = "https://github.com/nficano/pytube";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytun/default.nix b/nixpkgs/pkgs/development/python-modules/pytun/default.nix
new file mode 100644
index 000000000000..3437c0fbe7a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytun/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "pytun";
+  version = "2.3.0";
+
+  src = fetchFromGitHub {
+    rev = "v${version}";
+    owner = "montag451";
+    repo = "pytun";
+    sha256 = "1cqq8aci38058fjh4a0xf21wac177fw576p2yjl2b8jd9rnsqbl5";
+  };
+
+  # Test directory contains examples, not tests.
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/montag451/pytun";
+    description = "Linux TUN/TAP wrapper for Python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ montag451 ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyturbojpeg/default.nix b/nixpkgs/pkgs/development/python-modules/pyturbojpeg/default.nix
new file mode 100644
index 000000000000..3da9eb457fcd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyturbojpeg/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, libjpeg_turbo
+, numpy
+, python
+, substituteAll
+}:
+
+buildPythonPackage rec {
+  pname = "pyturbojpeg";
+  version = "1.7.2";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "PyTurboJPEG";
+    inherit version;
+    hash = "sha256-ChFD05ZK0TCVvM+uqGzma2x5qqyD94uBvFpSnWuyL2c=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./lib-path.patch;
+      libturbojpeg = "${libjpeg_turbo.out}/lib/libturbojpeg${stdenv.hostPlatform.extensions.sharedLibrary}";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  # upstream has no tests, but we want to test whether the library is found
+  checkPhase = ''
+    ${python.interpreter} -c 'from turbojpeg import TurboJPEG; TurboJPEG()'
+  '';
+
+  pythonImportsCheck = [
+    "turbojpeg"
+  ];
+
+  meta = with lib; {
+    description = "A Python wrapper of libjpeg-turbo for decoding and encoding JPEG image";
+    homepage = "https://github.com/lilohuang/PyTurboJPEG";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyturbojpeg/lib-path.patch b/nixpkgs/pkgs/development/python-modules/pyturbojpeg/lib-path.patch
new file mode 100644
index 000000000000..30e6ed58bac7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyturbojpeg/lib-path.patch
@@ -0,0 +1,28 @@
+diff --git a/turbojpeg.py b/turbojpeg.py
+index 73edb38..bfa8c67 100644
+--- a/turbojpeg.py
++++ b/turbojpeg.py
+@@ -408,22 +408,7 @@ class TurboJPEG(object):
+ 
+     def __find_turbojpeg(self):
+         """returns default turbojpeg library path if possible"""
+-        lib_path = find_library('turbojpeg')
+-        if lib_path is not None:
+-            return lib_path
+-        for lib_path in DEFAULT_LIB_PATHS[platform.system()]:
+-            if os.path.exists(lib_path):
+-                return lib_path
+-        if platform.system() == 'Linux' and 'LD_LIBRARY_PATH' in os.environ:
+-            ld_library_path = os.environ['LD_LIBRARY_PATH']
+-            for path in ld_library_path.split(':'):
+-                lib_path = os.path.join(path, 'libturbojpeg.so.0')
+-                if os.path.exists(lib_path):
+-                    return lib_path
+-        raise RuntimeError(
+-            'Unable to locate turbojpeg library automatically. '
+-            'You may specify the turbojpeg library path manually.\n'
+-            'e.g. jpeg = TurboJPEG(lib_path)')
++        return '@libturbojpeg@'
+ 
+     def __getaddr(self, nda):
+         """returns the memory address for a given ndarray"""
diff --git a/nixpkgs/pkgs/development/python-modules/pytweening/default.nix b/nixpkgs/pkgs/development/python-modules/pytweening/default.nix
new file mode 100644
index 000000000000..c97f4f7341e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytweening/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+buildPythonPackage rec {
+  pname = "pytweening";
+  version = "1.0.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-dnE08b9Xt2wc6faS3Rz8d22aJ53mck6NBIVFCP1+3ts=";
+  };
+
+  pythonImportsCheck = [ "pytweening" ];
+  checkPhase = ''
+    python -m unittest tests.basicTests
+  '';
+
+  meta = with lib; {
+    description = "Set of tweening / easing functions implemented in Python";
+    homepage = "https://github.com/asweigart/pytweening";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ lucasew ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytz-deprecation-shim/default.nix b/nixpkgs/pkgs/development/python-modules/pytz-deprecation-shim/default.nix
new file mode 100644
index 000000000000..dd37c3c1af28
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytz-deprecation-shim/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonAtLeast
+, pythonOlder
+, backports-zoneinfo
+, python-dateutil
+, setuptools
+, tzdata
+, hypothesis
+, pytestCheckHook
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "pytz-deprecation-shim";
+  version = "0.1.0.post0";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "pytz_deprecation_shim";
+    inherit version;
+    sha256 = "af097bae1b616dde5c5744441e2ddc69e74dfdcb0c263129610d85b87445a59d";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  propagatedBuildInputs = (lib.optionals (pythonAtLeast "3.6" && pythonOlder "3.9") [
+    backports-zoneinfo
+  ]) ++ (lib.optionals (pythonOlder "3.6") [
+    python-dateutil
+  ]) ++ (lib.optionals (pythonAtLeast "3.6") [
+    tzdata
+  ]);
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+    pytz
+  ];
+
+  # https://github.com/pganssle/pytz-deprecation-shim/issues/27
+  # https://github.com/pganssle/pytz-deprecation-shim/issues/30
+  # The test suite is just very flaky and breaks all the time
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Shims to make deprecation of pytz easier";
+    homepage = "https://github.com/pganssle/pytz-deprecation-shim";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytz/default.nix b/nixpkgs/pkgs/development/python-modules/pytz/default.nix
new file mode 100644
index 000000000000..8d4bcfbb3c6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytz/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, unittestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "pytz";
+  version = "2023.3.post1";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-e0/dvrlKHrpLVX2iTxn9+dtXUZJUQnCpEB2FCfn0PXs=";
+  };
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  unittestFlagsArray = [ "-s" "pytz/tests" ];
+
+  pythonImportsCheck = [ "pytz" ];
+
+  meta = with lib; {
+    description = "World timezone definitions, modern and historical";
+    homepage = "https://pythonhosted.org/pytz";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pytzdata/default.nix b/nixpkgs/pkgs/development/python-modules/pytzdata/default.nix
new file mode 100644
index 000000000000..342bb088170d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pytzdata/default.nix
@@ -0,0 +1,20 @@
+{ lib, fetchPypi, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "pytzdata";
+  version = "2020.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540";
+  };
+
+  # No tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Timezone database for Python";
+    homepage = "https://github.com/sdispater/pytzdata";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyu2f/default.nix b/nixpkgs/pkgs/development/python-modules/pyu2f/default.nix
new file mode 100644
index 000000000000..609d8bfcebae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyu2f/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, six
+, mock
+, pyfakefs
+, pytest-forked
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyu2f";
+  version = "0.1.5a";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "0mx7bn1p3n0fxyxa82wg3c719hby7vqkxv57fhf7zvhlg2zfnr0v";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pyfakefs
+    pytest-forked
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # API breakage with pyfakefs>=5.0
+    "pyu2f/tests/hid/linux_test.py"
+  ];
+
+  meta = with lib; {
+    description = "U2F host library for interacting with a U2F device over USB";
+    homepage = "https://github.com/google/pyu2f";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyuavcan/default.nix b/nixpkgs/pkgs/development/python-modules/pyuavcan/default.nix
new file mode 100644
index 000000000000..f5152f8e9bf2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyuavcan/default.nix
@@ -0,0 +1,50 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder, numpy, nunavut
+, pyserial , pytest, ruamel-yaml}:
+
+ buildPythonPackage rec {
+  pname = "pyuavcan";
+  version = "1.1.0.dev1";
+  disabled = pythonOlder "3.7"; # only python>=3.7 is supported
+
+  src = fetchFromGitHub {
+    owner = "UAVCAN";
+    repo = pname;
+    rev = version;
+    hash = "sha256-ChNoYHuZulPLrxYvxeVO9Tyt8rymlk3p/OkYaG2rqzo=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    nunavut
+    pyserial
+    pytest
+    ruamel-yaml
+  ];
+
+  # allow for writable directory for darwin
+  preBuild = ''
+    export HOME=$TMPDIR
+    export PYTHONASYNCIODEBUG=1
+  '';
+
+  # tests fail ATM.
+  doCheck = false;
+
+  # check at least that import works, as tests fail
+  pythonImportsCheck = [
+    "pyuavcan"
+  ];
+
+  meta = with lib; {
+    description = "A full-featured implementation of the UAVCAN protocol stack";
+    longDescription = ''
+      It is intended for non-embedded, user-facing applications such as GUI
+      software, diagnostic tools, automation scripts, prototypes, and various
+      R&D cases.  PyUAVCAN consists of a Python library (package) and a simple
+      CLI tool for basic diagnostics and shell script automation.
+    '';
+    homepage = "https://pyuavcan.readthedocs.io";
+    maintainers = with maintainers; [ wucke13 ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyuca/default.nix b/nixpkgs/pkgs/development/python-modules/pyuca/default.nix
new file mode 100644
index 000000000000..94b29dc80f9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyuca/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyuca";
+  version = "1.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "jtauber";
+    repo = "pyuca";
+    rev = "v${version}";
+    hash = "sha256-KIWk+/o1MX5J9cO7xITvjHrYg0NdgdTetOzfGVwAI/4=";
+  };
+
+  pythonImportsCheck = [
+    "pyuca"
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A Python implementation of the Unicode Collation Algorithm";
+    homepage = "https://github.com/jtauber/pyuca";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyudev/default.nix b/nixpkgs/pkgs/development/python-modules/pyudev/default.nix
new file mode 100644
index 000000000000..8c3c0d86f3b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyudev/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, six
+, udev
+, pytest
+, mock
+, hypothesis
+, docutils
+, stdenvNoCC
+}:
+
+buildPythonPackage rec {
+  pname = "pyudev";
+  version = "0.24.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-deVNNyGPWsRbDaHw/ZzF5SajysPvHPrUEM96sziwFHE=";
+  };
+
+  postPatch = lib.optionalString stdenvNoCC.isLinux ''
+    substituteInPlace src/pyudev/_ctypeslib/utils.py \
+      --replace "find_library(name)" "'${lib.getLib udev}/lib/libudev.so'"
+    '';
+
+  nativeCheckInputs = [ pytest mock hypothesis docutils ];
+  propagatedBuildInputs = [ six ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  # Bunch of failing tests
+  # https://github.com/pyudev/pyudev/issues/187
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://pyudev.readthedocs.org/";
+    description = "Pure Python libudev binding";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ frogamic ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyunifi/default.nix b/nixpkgs/pkgs/development/python-modules/pyunifi/default.nix
new file mode 100644
index 000000000000..0ac0a6941254
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyunifi/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi
+, requests }:
+
+buildPythonPackage rec {
+  pname = "pyunifi";
+  version = "2.21";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ea7919caee14abe741016d8e37e96bc67a43e22f77c079e55962273f39dbea4e";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  meta = with lib; {
+    description = "API towards Ubiquity Networks UniFi controller";
+    homepage = "https://github.com/finish06/unifi-api";
+    license = licenses.mit;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyunifiprotect/default.nix b/nixpkgs/pkgs/development/python-modules/pyunifiprotect/default.nix
new file mode 100644
index 000000000000..00b0f3740c35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyunifiprotect/default.nix
@@ -0,0 +1,106 @@
+{ lib
+, aiofiles
+, aiohttp
+, aioshutil
+, buildPythonPackage
+, dateparser
+, fetchFromGitHub
+, ipython
+, orjson
+, packaging
+, pillow
+, poetry-core
+, py
+, pydantic
+, pyjwt
+, pytest-aiohttp
+, pytest-asyncio
+, pytest-benchmark
+, pytest-timeout
+, pytest-xdist
+, pytestCheckHook
+, python-dotenv
+, pythonOlder
+, pytz
+, setuptools
+, setuptools-scm
+, termcolor
+, typer
+, ffmpeg
+}:
+
+buildPythonPackage rec {
+  pname = "pyunifiprotect";
+  version = "4.21.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "briis";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-BFcICpWq0aBjEww9EuO6UH8oGX8fufernFqh/gihIrM=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov=pyunifiprotect --cov-append" ""
+  '';
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    aiofiles
+    aiohttp
+    aioshutil
+    dateparser
+    orjson
+    packaging
+    pillow
+    pydantic
+    pyjwt
+    pytz
+    typer
+  ] ++ typer.optional-dependencies.all;
+
+  passthru.optional-dependencies = {
+    shell = [
+      ipython
+      python-dotenv
+      termcolor
+    ];
+  };
+
+  nativeCheckInputs = [
+    ffmpeg # Required for command ffprobe
+    py
+    pytest-aiohttp
+    pytest-asyncio
+    pytest-benchmark
+    pytest-timeout
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyunifiprotect"
+  ];
+
+  pytestFlagsArray = [
+    "--benchmark-disable"
+  ];
+
+  meta = with lib; {
+    description = "Library for interacting with the Unifi Protect API";
+    homepage = "https://github.com/briis/pyunifiprotect";
+    changelog = "https://github.com/AngellusMortis/pyunifiprotect/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyunpack/default.nix b/nixpkgs/pkgs/development/python-modules/pyunpack/default.nix
new file mode 100644
index 000000000000..b6dff5a97d03
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyunpack/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, easyprocess
+, entrypoint2
+, patool
+}:
+
+buildPythonPackage rec {
+  pname = "pyunpack";
+  version = "0.3";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "ponty";
+    repo = "pyunpack";
+    rev = "refs/tags/${version}";
+    hash = "sha256-1MAdiX6+u35f6S8a0ZcIIebZE8bbxTy+0TnMohJ7J6s=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyunpack/__init__.py \
+      --replace \
+       '_exepath("patool")' \
+       '"${patool}/bin/.patool-wrapped"'
+  '';
+
+  propagatedBuildInputs = [
+    easyprocess
+    entrypoint2
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pytestFlagsArray = [ "-x" ];
+
+  pythonImportsCheck = [ "pyunpack" ];
+
+  disabledTestPaths = [
+    # unfree
+    "tests/test_rar.py"
+
+    # We get "patool: error: unrecognized arguments: --password 123"
+    # The currently packaged version of patool does not support this flag.
+    # https://github.com/wummel/patool/issues/114
+    # FIXME: Re-enable these once patool is updated
+    "tests/test_rarpw.py"
+    "tests/test_zippw.py"
+  ];
+
+  meta = with lib; {
+    description = "Unpack archive files in python";
+    homepage = "https://github.com/ponty/pyunpack";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ pbsds ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyupdate/default.nix b/nixpkgs/pkgs/development/python-modules/pyupdate/default.nix
new file mode 100644
index 000000000000..cd0460dc7e19
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyupdate/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k
+, requests }:
+
+buildPythonPackage rec {
+  pname = "pyupdate";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "016f50853b4d72e5ddb963b042caa45fb60fa4d3f13aee819d829af21e55ef07";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # As of 0.2.16, pyupdate is intimately tied to Home Assistant which is py3 only
+  disabled = !isPy3k;
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    # This description is terrible, but it's what upstream uses.
+    description = "Package to update stuff";
+    homepage = "https://github.com/ludeeus/pyupdate";
+    license = licenses.mit;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyupgrade/default.nix b/nixpkgs/pkgs/development/python-modules/pyupgrade/default.nix
new file mode 100644
index 000000000000..04e21f6e52ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyupgrade/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, tokenize-rt
+}:
+
+buildPythonPackage rec {
+  pname = "pyupgrade";
+  version = "3.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "asottile";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-vg1eNxIkdHM1MMTkCof/ED6nqFhwSgEiKjYmqAyHMp0=";
+  };
+
+  propagatedBuildInputs = [
+    tokenize-rt
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyupgrade"
+  ];
+
+  meta = with lib; {
+    description = "Tool to automatically upgrade syntax for newer versions of the language";
+    homepage = "https://github.com/asottile/pyupgrade";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lovesegfault ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyuptimerobot/default.nix b/nixpkgs/pkgs/development/python-modules/pyuptimerobot/default.nix
new file mode 100644
index 000000000000..8b6af6dc5d92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyuptimerobot/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pytest-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyuptimerobot";
+  version = "23.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ludeeus";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-hy/hmXxxEb44X8JUszoA1YF/41y7GkQqC4uS+Pax6WA=";
+  };
+
+  postPatch = ''
+    # Upstream doesn't set version in the repo
+    substituteInPlace setup.py \
+      --replace 'version="main",' 'version="${version}",'
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  pythonImportsCheck = [
+    "pyuptimerobot"
+  ];
+
+  meta = with lib; {
+    description = "Python API wrapper for Uptime Robot";
+    homepage = "https://github.com/ludeeus/pyuptimerobot";
+    changelog = "https://github.com/ludeeus/pyuptimerobot/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyusb/default.nix b/nixpkgs/pkgs/development/python-modules/pyusb/default.nix
new file mode 100644
index 000000000000..05fb6b682716
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyusb/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, fetchPypi, buildPythonPackage, libusb1, setuptools-scm }:
+
+buildPythonPackage rec {
+  pname = "pyusb";
+  version = "1.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a4cc7404a203144754164b8b40994e2849fde1cfff06b08492f12fff9d9de7b9";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  # Fix the USB backend library lookup
+  postPatch =
+    ''
+      libusb=${libusb1.out}/lib/libusb-1.0${stdenv.hostPlatform.extensions.sharedLibrary}
+      test -f $libusb || { echo "ERROR: $libusb doesn't exist, please update/fix this build expression."; exit 1; }
+      sed -i -e "s|find_library=None|find_library=lambda _:\"$libusb\"|" usb/backend/libusb1.py
+    '';
+
+  # No tests included
+  doCheck = false;
+
+  pythonImportsCheck = [ "usb" ];
+
+  meta = with lib; {
+    description = "Python USB access module (wraps libusb 1.0)";  # can use other backends
+    homepage = "https://pyusb.github.io/pyusb/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyuseragents/default.nix b/nixpkgs/pkgs/development/python-modules/pyuseragents/default.nix
new file mode 100644
index 000000000000..beafd4bff271
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyuseragents/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyuseragents";
+  version = "1.0.5";
+
+  src = fetchFromGitHub {
+    owner = "Animenosekai";
+    repo = "useragents";
+    rev = "v${version}";
+    sha256 = "D7Qs3vsfkRH2FDkbfakrR+FfWzQFiOCQM7q9AdJavyU=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  pytestFlagsArray = [ "test.py" ];
+  pythonImportsCheck = [ "pyuseragents" ];
+
+  meta = with lib; {
+    description = "Giving you a random User-Agent Header";
+    homepage = "https://github.com/Animenosekai/useragents";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ emilytrau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyutil/default.nix b/nixpkgs/pkgs/development/python-modules/pyutil/default.nix
new file mode 100644
index 000000000000..12a74c3f192c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyutil/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, simplejson
+, mock
+, twisted
+, isPyPy
+}:
+
+buildPythonPackage rec {
+  pname = "pyutil";
+  version = "3.3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XcPWu5xbq6u10Ldz4JQEXXVxLos0ry0psOKGAmaCZ8A=";
+  };
+
+  propagatedBuildInputs = [ simplejson ];
+
+  nativeCheckInputs = [ mock twisted ];
+
+  prePatch = lib.optionalString isPyPy ''
+    grep -rl 'utf-8-with-signature-unix' ./ | xargs sed -i -e "s|utf-8-with-signature-unix|utf-8|g"
+  '';
+
+  meta = with lib; {
+    description = "Pyutil, a collection of mature utilities for Python programmers";
+
+    longDescription = ''
+      These are a few data structures, classes and functions which
+      we've needed over many years of Python programming and which
+      seem to be of general use to other Python programmers. Many of
+      the modules that have existed in pyutil over the years have
+      subsequently been obsoleted by new features added to the
+      Python language or its standard library, thus showing that
+      we're not alone in wanting tools like these.
+    '';
+
+    homepage = "https://github.com/tpltnt/pyutil";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ prusnak ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyutilib/default.nix b/nixpkgs/pkgs/development/python-modules/pyutilib/default.nix
new file mode 100644
index 000000000000..a8af2db23622
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyutilib/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "pyutilib";
+  version = "6.0.0";
+
+  src = fetchPypi {
+    pname = "PyUtilib";
+    inherit version;
+    hash = "sha256-08FPjtkCioMbK/Ubird3brqH5mz8WKBrmcNZqqZA8EA=";
+  };
+
+  propagatedBuildInputs = [
+    nose
+    six
+  ];
+
+  # tests require text files that are not included in the pypi package
+  doCheck = false;
+
+  meta = with lib; {
+    description = "PyUtilib: A collection of Python utilities";
+    homepage = "https://github.com/PyUtilib/pyutilib";
+    license = licenses.bsd3;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyuv/default.nix b/nixpkgs/pkgs/development/python-modules/pyuv/default.nix
new file mode 100644
index 000000000000..f3209e3bdf21
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyuv/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, pythonAtLeast
+, fetchFromGitHub
+, fetchpatch
+, libuv
+}:
+
+buildPythonPackage rec {
+  pname = "pyuv";
+  version = "1.4.0";
+  disabled = pythonAtLeast "3.12";
+
+  src = fetchFromGitHub {
+    owner = "saghul";
+    repo = "pyuv";
+    rev = "pyuv-${version}";
+    sha256 = "1wiwwdylz66lfsjh6p4iv7pfhzvnhwjk332625njizfhz3gq9fwr";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "fix-build-with-python3.10.patch";
+      url = "https://github.com/saghul/pyuv/commit/8bddcc27052017b5b9cb89c24dbfdf06737b0dd3.patch";
+      hash = "sha256-J/3ky64Ff+gYpN3ksFLNuZ5xgPbBkyOl4LTY6fiHAgk=";
+    })
+    (fetchpatch {
+      name = "fix-build-with-python3.11.patch";
+      url = "https://github.com/saghul/pyuv/commit/2a3d42d44c6315ebd73899a35118380d2d5979b5.patch";
+      hash = "sha256-CQZexd6EjadCB7KyxeZKM24zrD9rXuNv4oA+Tb2nsdw=";
+    })
+  ];
+
+  setupPyBuildFlags = [ "--use-system-libuv" ];
+
+  buildInputs = [ libuv ];
+
+  doCheck = false; # doesn't work in sandbox
+
+  pythonImportsCheck = [ "pyuv" ];
+
+  meta = with lib; {
+    description = "Python interface for libuv";
+    homepage = "https://github.com/saghul/pyuv";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyvcd/default.nix b/nixpkgs/pkgs/development/python-modules/pyvcd/default.nix
new file mode 100644
index 000000000000..ad79a35d5e04
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvcd/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools-scm
+, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  version = "0.4.0";
+  pname = "pyvcd";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Mb4/UBRBqbjF3HJmD/e5z++bQ7ISGiPZb1htKGMnApA=";
+  };
+
+  buildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [ six ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Python package for writing Value Change Dump (VCD) files";
+    homepage = "https://github.com/SanDisk-Open-Source/pyvcd";
+    changelog = "https://github.com/SanDisk-Open-Source/pyvcd/blob/${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sb0 emily ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyvera/default.nix b/nixpkgs/pkgs/development/python-modules/pyvera/default.nix
new file mode 100644
index 000000000000..b43840b0790a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvera/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-cov
+, pytest-asyncio
+, pytest-timeout
+, responses
+, pytestCheckHook
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "pyvera";
+  version = "0.3.15";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pavoni";
+    repo = pname;
+    rev = version;
+    hash = "sha256-1+xIqOogRUt+blX7AZSKIiU8lpR4AzKIIW/smCSft94=";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [ requests ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-timeout
+    pytest-cov
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [ "pyvera" ];
+
+  meta = with lib; {
+    description = "Python library to control devices via the Vera hub";
+    homepage = "https://github.com/pavoni/pyvera";
+    license = with licenses; [ gpl2Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyverilog/default.nix b/nixpkgs/pkgs/development/python-modules/pyverilog/default.nix
new file mode 100644
index 000000000000..54456cf42789
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyverilog/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, jinja2
+, ply
+, verilog
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyverilog";
+  version = "1.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1a74k8r21swmfwvgv4c014y6nbcyl229fspxw89ygsgb0j83xnar";
+  };
+
+  disabled = pythonOlder "3.7";
+
+  patchPhase = ''
+    # The path to Icarus can still be overridden via an environment variable at runtime.
+    substituteInPlace pyverilog/vparser/preprocessor.py \
+      --replace "iverilog = 'iverilog'" "iverilog = '${verilog}/bin/iverilog'"
+  '';
+
+  propagatedBuildInputs = [
+    jinja2
+    ply
+    verilog
+  ];
+
+  preCheck = ''
+    substituteInPlace pytest.ini \
+      --replace "python_paths" "pythonpath"
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/PyHDI/Pyverilog";
+    description = "Python-based Hardware Design Processing Toolkit for Verilog HDL";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ trepetti ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyversasense/default.nix b/nixpkgs/pkgs/development/python-modules/pyversasense/default.nix
new file mode 100644
index 000000000000..908d9d37f7ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyversasense/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, aiohttp
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyversasense";
+  version = "0.0.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "imstevenxyz";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "vTaDEwImWDMInwti0Jj+j+RFEtXOOKtiH5wOMD6ZmJk=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  doCheck = pythonOlder "3.11"; # asynctest unsupported on python3.11
+
+  nativeCheckInputs = [
+    asynctest
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests/test.py"
+  ];
+
+  disabledTests = [
+    # Tests are not properly mocking network requests
+    "test_device_mac"
+    "test_peripheral_id"
+    "test_peripheral_measurements"
+    "test_samples"
+  ];
+
+  pythonImportsCheck = [
+    "pyversasense"
+  ];
+
+  meta = with lib; {
+    description = "Python library to communicate with the VersaSense API";
+    homepage = "https://github.com/imstevenxyz/pyversasense";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyvesync/default.nix b/nixpkgs/pkgs/development/python-modules/pyvesync/default.nix
new file mode 100644
index 000000000000..62ea4229079e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvesync/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyvesync";
+  version = "2.1.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ddtTtTAUpvS8DN1vKVN+CjnmYp20xyxHydwOaDRjWzo=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Test are not available (not in PyPI tarball and there are no GitHub releases)
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyvesync"
+  ];
+
+  meta = with lib; {
+    description = "Python library to manage Etekcity Devices and Levoit Air Purifier";
+    homepage = "https://github.com/webdjoe/pyvesync";
+    changelog = "https://github.com/webdjoe/pyvesync/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyvex/default.nix b/nixpkgs/pkgs/development/python-modules/pyvex/default.nix
new file mode 100644
index 000000000000..ef4e572c873a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvex/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, stdenv
+, archinfo
+, bitstring
+, buildPythonPackage
+, cffi
+, fetchPypi
+, future
+, pycparser
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pyvex";
+  version = "9.2.79";
+  pyproject = true;
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wtRguqbSvypScYhPlnWXM1qcppaw2Tb93GNYc/fziCM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    archinfo
+    bitstring
+    cffi
+    future
+    pycparser
+  ];
+
+  postPatch = lib.optionalString stdenv.isDarwin ''
+    substituteInPlace vex/Makefile-gcc \
+      --replace '/usr/bin/ar' 'ar'
+  '';
+
+  setupPyBuildFlags = lib.optionals stdenv.isLinux [
+    "--plat-name"
+    "linux"
+  ];
+
+  preBuild = ''
+    export CC=${stdenv.cc.targetPrefix}cc
+    substituteInPlace pyvex_c/Makefile \
+      --replace 'AR=ar' 'AR=${stdenv.cc.targetPrefix}ar'
+  '';
+
+  # No tests are available on PyPI, GitHub release has tests
+  # Switch to GitHub release after all angr parts are present
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyvex"
+  ];
+
+  meta = with lib; {
+    description = "Python interface to libVEX and VEX IR";
+    homepage = "https://github.com/angr/pyvex";
+    license = with licenses; [ bsd2 gpl3Plus lgpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyvicare/default.nix b/nixpkgs/pkgs/development/python-modules/pyvicare/default.nix
new file mode 100644
index 000000000000..20d632456ea6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvicare/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, authlib
+, buildPythonPackage
+, fetchFromGitHub
+, pkce
+, pytestCheckHook
+, pythonOlder
+, simplejson
+}:
+
+buildPythonPackage rec {
+  pname = "pyvicare";
+  version = "2.29.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "somm15";
+    repo = "PyViCare";
+    rev = "refs/tags/${version}";
+    hash = "sha256-FTvlRCPajRqKLCb5x1Gz/EGZIdMhXow4nP+WlWbjLko=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "version_config=True," 'version="${version}",' \
+      --replace "'setuptools-git-versioning<1.8.0'" ""
+  '';
+
+  propagatedBuildInputs = [
+    authlib
+    pkce
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    simplejson
+  ];
+
+  pythonImportsCheck = [
+    "PyViCare"
+  ];
+
+  meta = with lib; {
+    description = "Python Library to access Viessmann ViCare API";
+    homepage = "https://github.com/somm15/PyViCare";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyvips/default.nix b/nixpkgs/pkgs/development/python-modules/pyvips/default.nix
new file mode 100644
index 000000000000..70272d54ac8d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvips/default.nix
@@ -0,0 +1,55 @@
+{ stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+, glib
+, vips
+, cffi
+, pkgconfig  # from pythonPackages
+, pkg-config  # from pkgs
+, lib }:
+
+buildPythonPackage rec {
+  pname = "pyvips";
+  version = "2.2.1";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "libvips";
+    repo = "pyvips";
+    rev = "v${version}";
+    hash = "sha256-9S7h3bkm+QP78cpemYS7l3c8t+wXsJ5MUAP2T50R/Mc=";
+  };
+
+  nativeBuildInputs = [ pkgconfig pkg-config ];
+
+  buildInputs = [ glib vips ];
+
+  propagatedBuildInputs = [ cffi ];
+
+  env = lib.optionalAttrs stdenv.cc.isClang {
+    NIX_CFLAGS_COMPILE = "-Wno-error=incompatible-function-pointer-types";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  postPatch = ''
+    substituteInPlace pyvips/__init__.py \
+      --replace 'libvips.so.42' '${lib.getLib vips}/lib/libvips${stdenv.hostPlatform.extensions.sharedLibrary}' \
+      --replace 'libvips.42.dylib' '${lib.getLib vips}/lib/libvips${stdenv.hostPlatform.extensions.sharedLibrary}' \
+      --replace 'libgobject-2.0.so.0' '${glib.out}/lib/libgobject-2.0${stdenv.hostPlatform.extensions.sharedLibrary}' \
+      --replace 'libgobject-2.0.dylib' '${glib.out}/lib/libgobject-2.0${stdenv.hostPlatform.extensions.sharedLibrary}' \
+  '';
+
+  pythonImportsCheck = [ "pyvips" ];
+
+  meta = with lib; {
+    description = "A python wrapper for libvips";
+    homepage = "https://github.com/libvips/pyvips";
+    changelog = "https://github.com/libvips/pyvips/blob/v${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ccellado anthonyroussel ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyvirtualdisplay/default.nix b/nixpkgs/pkgs/development/python-modules/pyvirtualdisplay/default.nix
new file mode 100644
index 000000000000..0ba6c4ba6c00
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvirtualdisplay/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, easyprocess }:
+
+buildPythonPackage rec {
+  pname = "pyvirtualdisplay";
+  version = "3.0";
+
+  propagatedBuildInputs = [ easyprocess ];
+
+  src = fetchPypi {
+    pname = "PyVirtualDisplay";
+    inherit version;
+    hash = "sha256-CXVbw86263JfsH7KVCX0PyNY078I4A0qm3kqGu3RYVk=";
+  };
+
+  # requires X server
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python wrapper for Xvfb, Xephyr and Xvnc";
+    homepage = "https://github.com/ponty/pyvirtualdisplay";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ layus ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyvis/default.nix b/nixpkgs/pkgs/development/python-modules/pyvis/default.nix
new file mode 100644
index 000000000000..a9fea2dc6830
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvis/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, fetchFromGitHub
+, fetchpatch
+, buildPythonPackage
+, networkx
+, jinja2
+, ipython
+, jsonpickle
+, pytestCheckHook
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "pyvis";
+  version = "0.3.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "WestHealth";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-eo9Mk2c0hrBarCrzwmkXha3Qt4Bl1qR7Lhl9EkUx96E=";
+  };
+
+  propagatedBuildInputs = [
+    jinja2
+    networkx
+    ipython
+    jsonpickle
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    numpy
+  ];
+
+  disabledTestPaths = [
+    # jupyter integration test with selenium and webdriver_manager
+    "pyvis/tests/test_html.py"
+  ];
+
+  pythonImportsCheck = [ "pyvis" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/WestHealth/pyvis";
+    description = "Python package for creating and visualizing interactive network graphs";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ pbsds ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyvisa-py/default.nix b/nixpkgs/pkgs/development/python-modules/pyvisa-py/default.nix
new file mode 100644
index 000000000000..626d87b796ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvisa-py/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, setuptools
+, setuptools-scm
+, gpib-ctypes
+, pyserial
+, pyusb
+, pyvisa
+, typing-extensions
+, psutil
+, zeroconf
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyvisa-py";
+  version = "0.7.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pyvisa";
+    repo = "pyvisa-py";
+    rev = "refs/tags/${version}";
+    hash = "sha256-zsa4TGDvvPAogOC0ljXC9uwWC9mteldUYprLmwrXNMQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    pyvisa
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = {
+    gpib-ctypes = [ gpib-ctypes ];
+    serial = [ pyserial ];
+    usb = [ pyusb ];
+    psutil = [ psutil ];
+    hislip-discovery = [ zeroconf ];
+    # vicp = [ pyvicp zeroconf ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  meta = with lib; {
+    description = "Module that implements the Virtual Instrument Software Architecture";
+    homepage = "https://github.com/pyvisa/pyvisa-py";
+    changelog = "https://github.com/pyvisa/pyvisa-py/blob/${version}/CHANGES";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mvnetbiz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyvisa-sim/default.nix b/nixpkgs/pkgs/development/python-modules/pyvisa-sim/default.nix
new file mode 100644
index 000000000000..55d6ff6b5db6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvisa-sim/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, fetchPypi
+, pythonOlder
+, buildPythonPackage
+, pyvisa
+, pyyaml
+, stringparser
+, typing-extensions
+, pytestCheckHook
+, setuptools
+, setuptools-scm
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pyvisa-sim";
+  version = "0.5.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "PyVISA-sim";
+    inherit version;
+    hash = "sha256-vWxW941/1e58pqL/Rzq+eoZJpwsvLphgIe48SuJtohY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    pyvisa
+    pyyaml
+    stringparser
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pyvisa_sim" ];
+
+  # should be fixed after 0.5.1, remove at next release
+  disabledTestPaths = [
+    "pyvisa_sim/testsuite/test_all.py"
+  ];
+
+  meta = with lib; {
+    description = "Simulated backend for PyVISA implementing TCPIP, GPIB, RS232, and USB resources";
+    homepage = "https://pyvisa.readthedocs.io/projects/pyvisa-sim/en/latest/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ evilmav ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyvisa/default.nix b/nixpkgs/pkgs/development/python-modules/pyvisa/default.nix
new file mode 100644
index 000000000000..850b19e5b1af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvisa/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, setuptools-scm
+, setuptools
+, typing-extensions
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyvisa";
+  version = "1.13.0";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pyvisa";
+    repo = "pyvisa";
+    rev = "refs/tags/${version}";
+    hash = "sha256-TBu3Xko0IxFBT2vzrsOxqEG3y4XfPzISEtbkWkIaCvM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    typing-extensions
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Test can't find cli tool bin path correctly
+  disabledTests = [
+    "test_visa_info"
+  ];
+
+  postConfigure = ''
+    export SETUPTOOLS_SCM_PRETEND_VERSION="v${version}"
+  '';
+
+  meta = with lib; {
+    description = "Python package for support of the Virtual Instrument Software Architecture (VISA)";
+    homepage = "https://github.com/pyvisa/pyvisa";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mvnetbiz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyvista/default.nix b/nixpkgs/pkgs/development/python-modules/pyvista/default.nix
new file mode 100644
index 000000000000..eb457166876c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvista/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, imageio
+, matplotlib
+, numpy
+, pillow
+, pooch
+, pythonOlder
+, scooby
+, vtk
+}:
+
+buildPythonPackage rec {
+  pname = "pyvista";
+  version = "0.42.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-RIeasdsLCBBs9eXUts53zlCkqkME48GBWVAcBoEHuOM=";
+  };
+
+  propagatedBuildInputs = [
+    imageio
+    matplotlib
+    numpy
+    pillow
+    pooch
+    scooby
+    vtk
+  ];
+
+  # Fatal Python error: Aborted
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyvista"
+  ];
+
+  meta = with lib; {
+    description = "Easier Pythonic interface to VTK";
+    homepage = "https://pyvista.org";
+    changelog = "https://github.com/pyvista/pyvista/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ wegank ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyviz-comms/default.nix b/nixpkgs/pkgs/development/python-modules/pyviz-comms/default.nix
new file mode 100644
index 000000000000..4b3678494990
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyviz-comms/default.nix
@@ -0,0 +1,34 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, param
+, panel
+}:
+
+buildPythonPackage rec {
+  pname = "pyviz_comms";
+  version = "2.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-omFFuM5D0tk0s8aCbXe5E84QXFKOsuSUyJCz41Jd3zM=";
+  };
+
+  propagatedBuildInputs = [ param ];
+
+  # there are not tests with the package
+  doCheck = false;
+
+  pythonImportsCheck = [ "pyviz_comms" ];
+
+  passthru.tests = {
+    inherit panel;
+  };
+
+  meta = with lib; {
+    description = "Launch jobs, organize the output, and dissect the results";
+    homepage = "https://pyviz.org/";
+    license = licenses.bsd3;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyvizio/default.nix b/nixpkgs/pkgs/development/python-modules/pyvizio/default.nix
new file mode 100644
index 000000000000..567e8c4d5ebb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvizio/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, click
+, fetchPypi
+, jsonpickle
+, requests
+, tabulate
+, xmltodict
+, zeroconf
+}:
+
+buildPythonPackage rec {
+  pname = "pyvizio";
+  version = "0.1.61";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-AtqMWe2zgRqOp5S9oKq7keHNHM8pnTmV1mfGiVzygTc=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    click
+    jsonpickle
+    requests
+    tabulate
+    xmltodict
+    zeroconf
+  ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "pyvizio" ];
+
+  meta = with lib; {
+    description = "Python client for Vizio SmartCast";
+    homepage = "https://github.com/vkorn/pyvizio";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyvlx/default.nix b/nixpkgs/pkgs/development/python-modules/pyvlx/default.nix
new file mode 100644
index 000000000000..02550d61a9ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvlx/default.nix
@@ -0,0 +1,47 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "pyvlx";
+  version = "0.2.20";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Julius2342";
+    repo = pname;
+    rev = version;
+    sha256 = "1irjix9kr6qih84gii7k1a9c67n8133gpnmwfd09550jsqdmg006";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyvlx"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Python client to work with Velux units";
+    longDescription = ''
+      PyVLX uses the Velux KLF 200 interface to control io-Homecontrol
+      devices, e.g. Velux Windows.
+    '';
+    homepage = "https://github.com/Julius2342/pyvlx";
+    license = with licenses; [ lgpl2Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyvmomi/default.nix b/nixpkgs/pkgs/development/python-modules/pyvmomi/default.nix
new file mode 100644
index 000000000000..f395f88bf7dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvmomi/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, lxml
+, requests
+, six
+, pyopenssl
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyvmomi";
+  version = "8.0.2.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "vmware";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Y7Zor70P4lhkAslckg/prfCmnszVMFPntWdJpfWnvIM=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    six
+  ];
+
+  passthru.optional-dependencies = {
+    sso = [
+      lxml
+      pyopenssl
+    ];
+  };
+
+  # Requires old version of vcrpy
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyVim"
+    "pyVmomi"
+  ];
+
+  meta = with lib; {
+    description = "Python SDK for the VMware vSphere API that allows you to manage ESX, ESXi, and vCenter";
+    homepage = "https://github.com/vmware/pyvmomi";
+    changelog = "https://github.com/vmware/pyvmomi/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyvo/default.nix b/nixpkgs/pkgs/development/python-modules/pyvo/default.nix
new file mode 100644
index 000000000000..4498b4f15090
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvo/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, astropy
+, pillow
+, pythonOlder
+, pytestCheckHook
+, pytest-astropy
+, requests
+, requests-mock
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "pyvo";
+  version = "1.4.2";
+
+  disabled = pythonOlder "3.8"; # according to setup.cfg
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Zv4piGWs/XJbxfGHUHctfxuImbjluxd1chUgvtV9lcs=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    astropy
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pillow
+    pytestCheckHook
+    pytest-astropy
+    requests-mock
+  ];
+
+  disabledTestPaths = [
+    # touches network
+    "pyvo/dal/tests/test_datalink.py"
+  ];
+
+  pythonImportsCheck = [ "pyvo" ];
+
+  meta = with lib; {
+    description = "Astropy affiliated package for accessing Virtual Observatory data and services";
+    homepage = "https://github.com/astropy/pyvo";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ smaret ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyvolumio/default.nix b/nixpkgs/pkgs/development/python-modules/pyvolumio/default.nix
new file mode 100644
index 000000000000..05dcbce167e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvolumio/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyvolumio";
+  version = "0.1.5";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "OnFreund";
+    repo = "PyVolumio";
+    rev = "v${version}";
+    sha256 = "1nyvflap39cwq1cm9wwl9idvfmz1ixsl80f1dnskx22fk0lmvj4h";
+  };
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "pyvolumio" ];
+
+  meta = with lib; {
+    description = "Python module to control Volumio";
+    homepage = "https://github.com/OnFreund/PyVolumio";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyvoro/default.nix b/nixpkgs/pkgs/development/python-modules/pyvoro/default.nix
new file mode 100644
index 000000000000..595fa345f303
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyvoro/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  version = "1.3.2";
+  pname = "pyvoro";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f31c047f6e4fc5f66eb0ab43afd046ba82ce247e18071141791364c4998716fc";
+  };
+
+  # No tests in package
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/joe-jordan/pyvoro";
+    description = "2D and 3D Voronoi tessellations: a python entry point for the voro++ library";
+    license = licenses.mit;
+    maintainers = [ ];
+
+    # Cython generated code is vendored directly and no longer compatible with
+    # newer versions of the CPython C API.
+    #
+    # Upstream explicitly removed the Cython source files from the source
+    # distribution, making it impossible for us to force-compile them:
+    # https://github.com/joe-jordan/pyvoro/commit/922bba6db32d44c2e1825228627a25aa891f9bc1
+    #
+    # No upstream activity since 2014.
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pywal/convert.patch b/nixpkgs/pkgs/development/python-modules/pywal/convert.patch
new file mode 100644
index 000000000000..999bc1abeaf1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywal/convert.patch
@@ -0,0 +1,21 @@
+diff --git a/pywal/backends/wal.py b/pywal/backends/wal.py
+index a75fdc5..4339680 100644
+--- a/pywal/backends/wal.py
++++ b/pywal/backends/wal.py
+@@ -21,15 +21,7 @@ def imagemagick(color_count, img, magick_command):
+
+ def has_im():
+     """Check to see if the user has im installed."""
+-    if shutil.which("magick"):
+-        return ["magick", "convert"]
+-
+-    if shutil.which("convert"):
+-        return ["convert"]
+-
+-    logging.error("Imagemagick wasn't found on your system.")
+-    logging.error("Try another backend. (wal --backend)")
+-    sys.exit(1)
++    return ["@convert@"]
+
+
+ def gen_colors(img):
diff --git a/nixpkgs/pkgs/development/python-modules/pywal/default.nix b/nixpkgs/pkgs/development/python-modules/pywal/default.nix
new file mode 100644
index 000000000000..2e09573d848c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywal/default.nix
@@ -0,0 +1,41 @@
+{ lib, buildPythonPackage, fetchPypi, imagemagick, feh, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "pywal";
+  version = "3.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1drha9kshidw908k7h3gd9ws2bl64ms7bjcsa83pwb3hqa9bkspg";
+  };
+
+  patches = [
+    ./convert.patch
+    ./feh.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace pywal/backends/wal.py --subst-var-by convert "${imagemagick}/bin/convert"
+    substituteInPlace pywal/wallpaper.py --subst-var-by feh "${feh}/bin/feh"
+  '';
+
+  # Invalid syntax
+  disabled = !isPy3k;
+
+  preCheck = ''
+    mkdir tmp
+    HOME=$PWD/tmp
+
+    for f in tests/test_export.py tests/test_util.py ; do
+      substituteInPlace "$f" \
+        --replace '/tmp/' "$TMPDIR/"
+    done
+  '';
+
+  meta = with lib; {
+    description = "Generate and change colorschemes on the fly. A 'wal' rewrite in Python 3";
+    homepage = "https://github.com/dylanaraps/pywal";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Fresheyeball ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pywal/feh.patch b/nixpkgs/pkgs/development/python-modules/pywal/feh.patch
new file mode 100644
index 000000000000..985e601d6257
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywal/feh.patch
@@ -0,0 +1,39 @@
+commit c31faa212e09aa62c232d9008e05976b1cdc9ee5
+Author: Frederik Rietdijk <fridh@fridh.nl>
+Date:   Wed Dec 26 12:54:32 2018 +0100
+
+    nix: hardcode feh
+
+diff --git a/pywal/wallpaper.py b/pywal/wallpaper.py
+index ba61e66..fad34f7 100644
+--- a/pywal/wallpaper.py
++++ b/pywal/wallpaper.py
+@@ -47,27 +47,7 @@ def xfconf(path, img):
+ 
+ def set_wm_wallpaper(img):
+     """Set the wallpaper for non desktop environments."""
+-    if shutil.which("feh"):
+-        util.disown(["feh", "--bg-fill", img])
+-
+-    elif shutil.which("nitrogen"):
+-        util.disown(["nitrogen", "--set-zoom-fill", img])
+-
+-    elif shutil.which("bgs"):
+-        util.disown(["bgs", "-z", img])
+-
+-    elif shutil.which("hsetroot"):
+-        util.disown(["hsetroot", "-fill", img])
+-
+-    elif shutil.which("habak"):
+-        util.disown(["habak", "-mS", img])
+-
+-    elif shutil.which("display"):
+-        util.disown(["display", "-backdrop", "-window", "root", img])
+-
+-    else:
+-        logging.error("No wallpaper setter found.")
+-        return
++    return util.disown(["@feh@", "--bg-fill", img])
+ 
+ 
+ def set_desktop_wallpaper(desktop, img):
diff --git a/nixpkgs/pkgs/development/python-modules/pywatchman/default.nix b/nixpkgs/pkgs/development/python-modules/pywatchman/default.nix
new file mode 100644
index 000000000000..a2cd2a6eed5a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywatchman/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, watchman }:
+
+buildPythonPackage rec {
+  pname = "pywatchman";
+  version = "1.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1yf2gm20wc3djpb5larxii3l55xxby0il2ns3q0v1byyfnr7w16h";
+  };
+
+  postPatch = ''
+    substituteInPlace pywatchman/__init__.py \
+      --replace "'watchman'" "'${watchman}/bin/watchman'"
+  '';
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Watchman client for Python";
+    homepage = "https://facebook.github.io/watchman/";
+    license = licenses.bsd3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pywaterkotte/default.nix b/nixpkgs/pkgs/development/python-modules/pywaterkotte/default.nix
new file mode 100644
index 000000000000..43f276a2df82
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywaterkotte/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, pytestCheckHook
+, pythonOlder
+, requests
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "pywaterkotte";
+  version = "0.1.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "chboland";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-zK0x6LyXPPNPA20Zq+S1B1q7ZWGxQmWf4JxEfjNkPQw=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "pywaterkotte"
+  ];
+
+  meta = with lib; {
+    description = "Library to communicate with Waterkotte heatpumps";
+    homepage = "https://github.com/chboland/pywaterkotte";
+    changelog = "https://github.com/chboland/pywaterkotte/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pywavelets/default.nix b/nixpkgs/pkgs/development/python-modules/pywavelets/default.nix
new file mode 100644
index 000000000000..778148178cfb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywavelets/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, cython
+, nose
+, pytest
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "PyWavelets";
+  version = "1.4.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ZDevPd8IMRjCbY+Xq0OwckuVbJ+Vjp6niGWfaig0upM=";
+  };
+
+  nativeCheckInputs = [ nose pytest ];
+
+  buildInputs = [ cython ];
+
+  propagatedBuildInputs = [ numpy ];
+
+  # Somehow nosetests doesn't run the tests, so let's use pytest instead
+  doCheck = false; # tests use relative paths, which fail to resolve
+  checkPhase = ''
+    py.test pywt/tests
+  '';
+
+  # ensure compiled modules are present
+  pythonImportsCheck = [
+    "pywt"
+    "pywt._extensions._cwt"
+    "pywt._extensions._dwt"
+    "pywt._extensions._pywt"
+    "pywt._extensions._swt"
+  ];
+
+  meta = with lib; {
+    description = "Wavelet transform module";
+    homepage = "https://github.com/PyWavelets/pywt";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pywayland/default.nix b/nixpkgs/pkgs/development/python-modules/pywayland/default.nix
new file mode 100644
index 000000000000..591fb0026c2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywayland/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, cffi
+, pkg-config
+, wayland
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pywayland";
+  version = "0.4.17";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-9/0ZAmOML3oVrAfzGj72iV08FgyiYBSByoKyxhojxlc=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  propagatedNativeBuildInputs = [ cffi ];
+  buildInputs = [ wayland ];
+  propagatedBuildInputs = [ cffi ];
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  postBuild = ''
+    ${python.pythonOnBuildForHost.interpreter} pywayland/ffi_build.py
+  '';
+
+  # Tests need this to create sockets
+  preCheck = ''
+    export XDG_RUNTIME_DIR="$PWD"
+  '';
+
+  pythonImportsCheck = [ "pywayland" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/flacjacket/pywayland";
+    description = "Python bindings to wayland using cffi";
+    license = licenses.ncsa;
+    maintainers = with maintainers; [ chvp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pywaze/default.nix b/nixpkgs/pkgs/development/python-modules/pywaze/default.nix
new file mode 100644
index 000000000000..e3b8ab0bded4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywaze/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, httpx
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, respx
+}:
+
+buildPythonPackage rec {
+  pname = "pywaze";
+  version = "0.5.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "eifinger";
+    repo = "pywaze";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-r7ROEdgHdjXkveVUbuALHtwCX4IO0lwx9Zo3u6R9I58=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov --cov-report term-missing --cov=src/pywaze " ""
+  '';
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    respx
+  ];
+
+  pythonImportsCheck = [
+    "pywaze"
+  ];
+
+  meta = with lib; {
+    description = "Module for calculating WAZE routes and travel times";
+    homepage = "https://github.com/eifinger/pywaze";
+    changelog = "https://github.com/eifinger/pywaze/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pywbem/default.nix b/nixpkgs/pkgs/development/python-modules/pywbem/default.nix
new file mode 100644
index 000000000000..e13aafe71485
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywbem/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, decorator
+, fetchPypi
+, formencode
+, httpretty
+, libxml2
+, lxml
+, mock
+, nocasedict
+, nocaselist
+, pbr
+, ply
+, pytest
+, pythonOlder
+, pytz
+, pyyaml
+, requests
+, requests-mock
+, six
+, testfixtures
+, yamlloader
+}:
+
+buildPythonPackage rec {
+  pname = "pywbem";
+  version = "1.6.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JugXm8F+MXa0zVdrn1p3MPhI1RvgUTdo/X8x/ZsnCpY=";
+  };
+
+  propagatedBuildInputs = [
+    mock
+    nocasedict
+    nocaselist
+    pbr
+    ply
+    pyyaml
+    six
+    yamlloader
+  ];
+
+  nativeCheckInputs = [
+    decorator
+    formencode
+    httpretty
+    libxml2
+    lxml
+    pytest
+    pytz
+    requests
+    requests-mock
+    testfixtures
+  ];
+
+  pythonImportsCheck = [
+    "pywbem"
+  ];
+
+  meta = with lib; {
+    description = "Support for the WBEM standard for systems management";
+    homepage = "https://pywbem.github.io";
+    changelog = "https://github.com/pywbem/pywbem/blob/${version}/docs/changes.rst";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyweatherflowrest/default.nix b/nixpkgs/pkgs/development/python-modules/pyweatherflowrest/default.nix
new file mode 100644
index 000000000000..2d04fe3feb21
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyweatherflowrest/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "pyweatherflowrest";
+  version = "1.0.11";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "briis";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-l1V3HgzqnnoY6sWHwfgBtcIR782RwKhekY2qOLrUMNY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov=pyweatherflowrest --cov-append" ""
+  '';
+
+  # Module has no tests. test.py is a demo script
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyweatherflowrest"
+  ];
+
+  meta = with lib; {
+    description = "Python module to get data from WeatherFlow Weather Stations";
+    homepage = "https://github.com/briis/pyweatherflowrest";
+    changelog = "https://github.com/briis/pyweatherflowrest/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyweatherflowudp/default.nix b/nixpkgs/pkgs/development/python-modules/pyweatherflowudp/default.nix
new file mode 100644
index 000000000000..34674635a418
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyweatherflowudp/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pint
+, poetry-core
+, psychrolib
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyweatherflowudp";
+  version = "1.4.5";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "briis";
+    repo = "pyweatherflowudp";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-aTwGFYTtd07BsWFaFc7ns+8oh2AxTUfRFSu81Zv5OoA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pint
+    psychrolib
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyweatherflowudp"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_flow_control"
+    "test_listen_and_stop"
+    "test_repetitive_listen_and_stop"
+    "test_process_message"
+    "test_listener_connection_errors"
+    "test_invalid_messages"
+  ];
+
+  meta = with lib; {
+    description = "Library to receive UDP Packets from Weatherflow Weatherstations";
+    homepage = "https://github.com/briis/pyweatherflowudp";
+    changelog = "https://github.com/briis/pyweatherflowudp/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/pywebpush/default.nix b/nixpkgs/pkgs/development/python-modules/pywebpush/default.nix
new file mode 100644
index 000000000000..806f8e213831
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywebpush/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, cryptography
+, http-ece
+, py-vapid
+, requests
+, six
+, coverage
+, flake8
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pywebpush";
+  version = "1.14.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bDbhZ5JoIZ5pO6lA2yvyVMJAygJmTeECtyaa/DxUVzE=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    http-ece
+    py-vapid
+    requests
+    six
+  ];
+
+  nativeCheckInputs = [
+    coverage
+    flake8
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "pywebpush" ];
+
+  meta = with lib; {
+    description = "Webpush Data encryption library for Python";
+    homepage = "https://github.com/web-push-libs/pywebpush";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pywebview/default.nix b/nixpkgs/pkgs/development/python-modules/pywebview/default.nix
new file mode 100644
index 000000000000..9db835f1d547
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywebview/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, bottle
+, importlib-resources
+, proxy-tools
+, pygobject3
+, pyqtwebengine
+, pytest
+, pythonOlder
+, qt5
+, qtpy
+, six
+, xvfb-run
+}:
+
+buildPythonPackage rec {
+  pname = "pywebview";
+  version = "4.3.3";
+  pyproject = true;
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "r0x0r";
+    repo = "pywebview";
+    rev = "refs/tags/${version}";
+    hash = "sha256-8BkbO7C8cYDIQWWCKaXFjfD45L5KVG1tDZJl+uW5g9g=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+    qt5.wrapQtAppsHook
+  ];
+
+  propagatedBuildInputs = [
+    bottle
+    pyqtwebengine
+    proxy-tools
+    six
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    importlib-resources
+  ];
+
+  nativeCheckInputs = [
+    pygobject3
+    pytest
+    qtpy
+    xvfb-run
+  ];
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  checkPhase = ''
+    # Cannot create directory /homeless-shelter/.... Error: FILE_ERROR_ACCESS_DENIED
+    export HOME=$TMPDIR
+    # QStandardPaths: XDG_RUNTIME_DIR not set
+    export XDG_RUNTIME_DIR=$HOME/xdg-runtime-dir
+
+    pushd tests
+    substituteInPlace run.sh \
+      --replace "PYTHONPATH=.." "PYTHONPATH=$PYTHONPATH" \
+      --replace "pywebviewtest test_js_api.py::test_concurrent ''${PYTEST_OPTIONS}" "# skip flaky test_js_api.py::test_concurrent"
+
+    patchShebangs run.sh
+    wrapQtApp run.sh
+
+    xvfb-run -s '-screen 0 800x600x24' ./run.sh
+    popd
+  '';
+
+  pythonImportsCheck = [
+    "webview"
+  ];
+
+  meta = with lib; {
+    description = "Lightweight cross-platform wrapper around a webview";
+    homepage = "https://github.com/r0x0r/pywebview";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jojosch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pywemo/default.nix b/nixpkgs/pkgs/development/python-modules/pywemo/default.nix
new file mode 100644
index 000000000000..69b8114a95e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywemo/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hypothesis
+, ifaddr
+, lxml
+, poetry-core
+, pytest-vcr
+, pytestCheckHook
+, pythonOlder
+, requests
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "pywemo";
+  version = "1.3.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-RZeg6/xAGRumd4aM/mQQnIrIXB/rUrdeQQxk2c1mJNI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    ifaddr
+    requests
+    urllib3
+    lxml
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    hypothesis
+    pytest-vcr
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pywemo"
+  ];
+
+  meta = with lib; {
+    description = "Python module to discover and control WeMo devices";
+    homepage = "https://github.com/pywemo/pywemo";
+    changelog = "https://github.com/pywemo/pywemo/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pywerview/default.nix b/nixpkgs/pkgs/development/python-modules/pywerview/default.nix
new file mode 100644
index 000000000000..ac637d4501a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywerview/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, fetchFromGitHub
+, gssapi
+, impacket
+, ldap3
+, lxml
+, pyasn1
+, pycryptodome
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pywerview";
+  version = "0.5.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "the-useless-one";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-BWH9zYrlbzQC0/cc5k5BlXWyh38gI+hwwTCWhe1xgog=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    gssapi
+    impacket
+    ldap3
+    lxml
+    pycryptodome
+    pyasn1
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pywerview"
+  ];
+
+  meta = with lib; {
+    description = "Module for PowerSploit's PowerView support";
+    homepage = "https://github.com/the-useless-one/pywerview";
+    changelog = "https://github.com/the-useless-one/pywerview/releases/tag/v${version}";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pywfa/default.nix b/nixpkgs/pkgs/development/python-modules/pywfa/default.nix
new file mode 100644
index 000000000000..529417db9896
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywfa/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, cython
+, setuptools
+, wheel
+, pysam
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pywfa";
+  version = "0.5.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "kcleal";
+    repo = "pywfa";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-oeVXK9uyH4E98tApKrA7dXifQYb41KuDTAZ40XgAaF8=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    setuptools
+    wheel
+  ];
+
+  nativeCheckInputs = [
+    pysam
+    unittestCheckHook
+  ];
+
+  preCheck = ''
+    cd pywfa/tests
+  '';
+
+  pythonImportsCheck = [
+    "pywfa"
+    "pywfa.align"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for wavefront alignment using WFA2-lib";
+    homepage = "https://github.com/kcleal/pywfa";
+    changelog = "https://github.com/kcleal/pywfa/releases/tag/${src.rev}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pywilight/default.nix b/nixpkgs/pkgs/development/python-modules/pywilight/default.nix
new file mode 100644
index 000000000000..e25f24d40334
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywilight/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ifaddr
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pywilight";
+  version = "0.0.74";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-patCdQ7qLEfy+RpH9T/Fa8ubI7QF6OmLzFUokZc5syQ=";
+  };
+
+  propagatedBuildInputs = [
+    ifaddr
+    requests
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pywilight"
+  ];
+
+  meta = with lib; {
+    description = "Python API for WiLight device";
+    homepage = "https://github.com/leofig-rj/pywilight";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pywinrm/default.nix b/nixpkgs/pkgs/development/python-modules/pywinrm/default.nix
new file mode 100644
index 000000000000..40e8c70ba83b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywinrm/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, mock
+, pytestCheckHook
+, requests
+, requests_ntlm
+, six
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "pywinrm";
+  version = "0.4.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-mVZ0v1rGSyViycVlQEcxCeUw02veEMJi1aUpYSGtVWU=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    requests_ntlm
+    six
+    xmltodict
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "winrm"
+  ];
+
+  pytestFlagsArray = [
+    "winrm/tests/"
+  ];
+
+  meta = with lib; {
+    description = "Python library for Windows Remote Management";
+    homepage = "https://github.com/diyan/pywinrm";
+    license = licenses.mit;
+    maintainers = with maintainers; [ elasticdog kamadorueda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pywizlight/default.nix b/nixpkgs/pkgs/development/python-modules/pywizlight/default.nix
new file mode 100644
index 000000000000..e6ce3013515d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywizlight/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pywizlight";
+  version = "0.5.14";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sbidy";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-IkuAYEg5nuUT6zxmuJe6afp4MVWf0+HAnEoAdOrdTvQ=";
+  };
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=auto"
+  ];
+
+  disabledTests = [
+    # Tests requires network features (e. g., discovery testing)
+    "test_Bulb_Discovery"
+    "test_timeout"
+    "test_timeout_PilotBuilder"
+    "test_error_PilotBuilder_warm_wite"
+    "test_error_PilotBuilder_cold_white_lower"
+  ];
+
+  pythonImportsCheck = [
+    "pywizlight"
+  ];
+
+  meta = with lib; {
+    description = "Python connector for WiZ light bulbs";
+    homepage = "https://github.com/sbidy/pywizlight";
+    changelog = "https://github.com/sbidy/pywizlight/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pywlroots/default.nix b/nixpkgs/pkgs/development/python-modules/pywlroots/default.nix
new file mode 100644
index 000000000000..248af392f1fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pywlroots/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, cffi
+, pkg-config
+, libxkbcommon
+, libinput
+, pixman
+, pythonOlder
+, udev
+, wlroots
+, wayland
+, pywayland
+, xkbcommon
+, xorg
+, pytestCheckHook
+, qtile
+}:
+
+buildPythonPackage rec {
+  pname = "pywlroots";
+  version = "0.16.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ITf1uALQ0ZJMeZ4wbC7VqEL9LdoK67vqRpXD6LTWjUE=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  propagatedNativeBuildInputs = [ cffi ];
+  buildInputs = [ libinput libxkbcommon pixman xorg.libxcb xorg.xcbutilwm udev wayland wlroots ];
+  propagatedBuildInputs = [ cffi pywayland xkbcommon ];
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  postBuild = ''
+    ${python.pythonOnBuildForHost.interpreter} wlroots/ffi_build.py
+  '';
+
+  pythonImportsCheck = [ "wlroots" ];
+
+  passthru.tests = { inherit qtile; };
+
+  meta = with lib; {
+    homepage = "https://github.com/flacjacket/pywlroots";
+    description = "Python bindings to wlroots using cffi";
+    license = licenses.ncsa;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ chvp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyworld/default.nix b/nixpkgs/pkgs/development/python-modules/pyworld/default.nix
new file mode 100644
index 000000000000..bf31d646ff5f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyworld/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, cython
+}:
+
+buildPythonPackage rec {
+  pname = "pyworld";
+  version = "0.3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-EGxw7np9jJukiNgCLyAzcGkppA8CZCVrjofaWquYMDo=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  pythonImportsCheck = [ "pyworld" ];
+
+  meta = with lib; {
+    description = "PyWorld is a Python wrapper for WORLD vocoder";
+    homepage = "https://github.com/JeremyCCHsu/Python-Wrapper-for-World-Vocoder";
+    license = licenses.mit;
+    maintainers = [ maintainers.mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyws66i/default.nix b/nixpkgs/pkgs/development/python-modules/pyws66i/default.nix
new file mode 100644
index 000000000000..6931a0531ced
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyws66i/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyws66i";
+  version = "1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ssaenger";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-NTL2+xLqSNsz4YdUTwr0nFjhm1NNgB8qDnWSoE2sizY=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyws66i"
+  ];
+
+  meta = with lib; {
+    description = "Library to interface with WS66i 6-zone amplifier";
+    homepage = "https://github.com/bigmoby/pyialarmxr";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyx/default.nix b/nixpkgs/pkgs/development/python-modules/pyx/default.nix
new file mode 100644
index 000000000000..1774e89ed753
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyx/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "pyx";
+  version = "0.16";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    pname = "PyX";
+    inherit version;
+    hash = "sha256-TY4+RxzT6am9E9UIbN98CvGww/PhledPX2MxjcQKZtg=";
+  };
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python package for the generation of PostScript, PDF, and SVG files";
+    homepage = "https://pyx.sourceforge.net/";
+    license = with licenses; [ gpl2 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyxattr/default.nix b/nixpkgs/pkgs/development/python-modules/pyxattr/default.nix
new file mode 100644
index 000000000000..2bc4a9bf950e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyxattr/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, pkgs
+, fetchPypi
+, buildPythonPackage
+}:
+
+buildPythonPackage rec {
+    pname = "pyxattr";
+    version = "0.8.1";
+
+    src = fetchPypi {
+      inherit pname version;
+      hash = "sha256-SMV47PjqC9Q1GxdSRw4wGpCjdhx8IfAPlT3PbW+m7lo=";
+    };
+
+    # IOError: [Errno 95] Operation not supported (expected)
+    doCheck = false;
+
+    buildInputs = with pkgs; [ attr ];
+
+    meta = with lib; {
+      description = "A Python extension module which gives access to the extended attributes for filesystem objects available in some operating systems";
+      license = licenses.lgpl21Plus;
+      inherit (pkgs.attr.meta) platforms;
+    };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyxb/default.nix b/nixpkgs/pkgs/development/python-modules/pyxb/default.nix
new file mode 100644
index 000000000000..de4c4e8b9689
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyxb/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "PyXB";
+  version = "1.2.6";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1d17pyixbfvjyi2lb0cfp0ch8wwdf44mmg3r5pwqhyyqs66z601a";
+  };
+
+  pythonImportsCheck = [
+    "pyxb"
+  ];
+
+  # tests don't complete
+  # https://github.com/pabigot/pyxb/issues/130
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python XML Schema Bindings";
+    homepage = "https://github.com/pabigot/pyxb";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyxbe/default.nix b/nixpkgs/pkgs/development/python-modules/pyxbe/default.nix
new file mode 100644
index 000000000000..3442d5f9848e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyxbe/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyxbe";
+  version = "1.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mborgerson";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-iLzGGgizUbaEG1xrNq4WDaWrGtcaLwAYgn4NGYiSDBo=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Update location for run with pytest
+  preCheck = ''
+    substituteInPlace tests/test_load.py \
+      --replace '"xbefiles"' '"tests/xbefiles"'
+  '';
+
+  pythonImportsCheck = [
+    "xbe"
+  ];
+
+  meta = with lib; {
+    description = "Library to work with XBE files";
+    homepage = "https://github.com/mborgerson/pyxbe";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyxdg/default.nix b/nixpkgs/pkgs/development/python-modules/pyxdg/default.nix
new file mode 100644
index 000000000000..9e3c24fdb6d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyxdg/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitLab
+}:
+
+buildPythonPackage rec {
+  pname = "pyxdg";
+  version = "0.28";
+
+  src =  fetchFromGitLab {
+    domain = "gitlab.freedesktop.org";
+    owner = "xdg";
+    repo = pname;
+    rev = "rel-${version}";
+    hash = "sha256-TrFQzfkXabmfpGYwhxD1UVY1F645KycfSPPrMJFAe+0=";
+  };
+
+  # Tests failed (errors=4, failures=4) on NixOS
+  doCheck = false;
+
+  pythonImportsCheck = [ "xdg" ];
+
+  meta = with lib; {
+    homepage = "http://freedesktop.org/wiki/Software/pyxdg";
+    description = "Contains implementations of freedesktop.org standards";
+    license = licenses.lgpl2;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyxeoma/default.nix b/nixpkgs/pkgs/development/python-modules/pyxeoma/default.nix
new file mode 100644
index 000000000000..2fa840078df8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyxeoma/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pyxeoma";
+  version = "1.4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c6a3ed855025662df9b35ae2d1cac3fa41775a7612655804bde7276a8cab8d1c";
+  };
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  # Project doesn't have any tests
+  doCheck = false;
+  pythonImportsCheck = [ "pyxeoma" ];
+
+  meta = with lib; {
+    description = "Python wrapper for Xeoma web server API";
+    homepage = "https://github.com/jeradM/pyxeoma";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyxiaomigateway/default.nix b/nixpkgs/pkgs/development/python-modules/pyxiaomigateway/default.nix
new file mode 100644
index 000000000000..dd9ceacc1f9e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyxiaomigateway/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cryptography
+}:
+
+buildPythonPackage rec {
+  pname = "pyxiaomigateway";
+  version = "0.14.3";
+
+  src = fetchFromGitHub {
+    owner = "Danielhiversen";
+    repo = "PyXiaomiGateway";
+    rev = version;
+    hash = "sha256-TAbZvs1RrUy9+l2KpfbBopc3poTy+M+Q3ERQLFYbQis=";
+  };
+
+  propagatedBuildInputs = [ cryptography ];
+
+  # Tests are not mocking the gateway completely
+  doCheck = false;
+  pythonImportsCheck = [ "xiaomi_gateway" ];
+
+  meta = with lib; {
+    description = "Python library to communicate with the Xiaomi Gateway";
+    homepage = "https://github.com/Danielhiversen/PyXiaomiGateway/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyxl3/default.nix b/nixpkgs/pkgs/development/python-modules/pyxl3/default.nix
new file mode 100644
index 000000000000..1242697abab3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyxl3/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "pyxl3";
+  version = "1.4";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "gvanrossum";
+    repo = pname;
+    rev = "e6588c12caee49c43faf6aa260f04d7e971f6aa8";
+    hash = "sha256-8nKQgwLXPVgPxNRF4CryKJb7+llDsZHis5VctxqpIRo=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Python 3 port of pyxl for writing structured and reusable inline HTML";
+    homepage = "https://github.com/gvanrossum/pyxl3";
+    license = licenses.asl20;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyxlsb/default.nix b/nixpkgs/pkgs/development/python-modules/pyxlsb/default.nix
new file mode 100644
index 000000000000..df000db7e25d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyxlsb/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "pyxlsb";
+  version = "1.0.10";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gGLR6oYm0/GYDosc/pGkSDdHRJJC7LYQE7wt+FQ19oU=";
+  };
+
+  # package has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "pyxlsb" ];
+
+  meta = with lib; {
+    description = "Excel 2007-2010 Binary Workbook (xlsb) parser";
+    homepage = "https://github.com/willtrnr/pyxlsb";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ elohmeier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyxnat/default.nix b/nixpkgs/pkgs/development/python-modules/pyxnat/default.nix
new file mode 100644
index 000000000000..e8956dba3484
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyxnat/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, lxml
+, matplotlib
+, networkx
+, pandas
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "pyxnat";
+  version = "1.6";
+  disabled = pythonOlder "3.8";
+
+  # PyPI dist missing test configuration files:
+  src = fetchFromGitHub {
+    owner = "pyxnat";
+    repo = "pyxnat";
+    rev = "refs/tags/${version}";
+    hash = "sha256-QejYisvQFN7CsDOx9wAgTHmRZcSEqgIr8twG4XucfZ4=";
+  };
+
+  propagatedBuildInputs = [
+    lxml
+    requests
+    six
+  ];
+
+  # future is not used, and pathlib is installed part of python38+
+  # w/o an external package
+  prePatch = ''
+    substituteInPlace setup.py \
+      --replace "pathlib>=1.0" "" \
+      --replace "future>=0.16" ""
+    sed -i '/--cov/d' setup.cfg
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    matplotlib
+    networkx
+    pandas
+  ];
+  preCheck = ''
+    export PYXNAT_SKIP_NETWORK_TESTS=1
+  '';
+  pytestFlagsArray = [ "pyxnat" ];
+  disabledTestPaths = [
+    # try to access network even though PYXNAT_SKIP_NETWORK_TESTS is set:
+    "pyxnat/tests/pipelines_test.py"
+    "pyxnat/tests/search_test.py"
+    "pyxnat/tests/user_and_project_management_test.py"
+  ];
+  disabledTests = [
+    # try to access network even though PYXNAT_SKIP_NETWORK_TESTS is set:
+    "test_ashs_volumes"
+    "test_inspector_structure"
+  ];
+
+  pythonImportsCheck = [ "pyxnat" ];
+
+  meta = with lib; {
+    homepage = "https://pyxnat.github.io/pyxnat";
+    description = "Python API to XNAT";
+    changelog = "https://github.com/pyxnat/pyxnat/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyyaml-env-tag/default.nix b/nixpkgs/pkgs/development/python-modules/pyyaml-env-tag/default.nix
new file mode 100644
index 000000000000..208f608855c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyyaml-env-tag/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pyyaml
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyyaml-env-tag";
+  version = "0.1";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "pyyaml_env_tag";
+    inherit version;
+    sha256 = "1nsva88jsmwn0cb9jnrfiz4dvs9xakkpgfii7g1xwkx1pmsjc2bh";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "yaml_env_tag" ];
+
+  meta = with lib; {
+    description = "Custom YAML tag for referencing environment variables";
+    homepage = "https://github.com/waylan/pyyaml-env-tag";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyyaml-include/default.nix b/nixpkgs/pkgs/development/python-modules/pyyaml-include/default.nix
new file mode 100644
index 000000000000..176d402e99c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyyaml-include/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pyyaml
+, setuptools
+, setuptools-scm
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pyyaml-include";
+  version = "1.3.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "tanbro";
+    repo = "pyyaml-include";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-xsNMIEBYqMVQp+H8R7XpFCwROXA8I6bFvAuHrRvC+DI=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "yamlinclude" ];
+
+  meta = with lib; {
+    description = "Extending PyYAML with a custom constructor for including YAML files within YAML files";
+    homepage = "https://github.com/tanbro/pyyaml-include";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyyaml/default.nix b/nixpkgs/pkgs/development/python-modules/pyyaml/default.nix
new file mode 100644
index 000000000000..a7270958387d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyyaml/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, cython
+, setuptools
+, libyaml
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "pyyaml";
+  version = "6.0.1";
+
+  disabled = pythonOlder "3.6";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "yaml";
+    repo = "pyyaml";
+    rev = version;
+    hash = "sha256-YjWMyMVDByLsN5vEecaYjHpR1sbBey1L/khn4oH9SPA=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    setuptools
+  ];
+
+  buildInputs = [ libyaml ];
+
+  checkPhase = ''
+    runHook preCheck
+    PYTHONPATH="tests/lib:$PYTHONPATH" ${python.interpreter} -m test_all
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "yaml" ];
+
+  meta = with lib; {
+    description = "The next generation YAML parser and emitter for Python";
+    homepage = "https://github.com/yaml/pyyaml";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyyardian/default.nix b/nixpkgs/pkgs/development/python-modules/pyyardian/default.nix
new file mode 100644
index 000000000000..0216d562faea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyyardian/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pythonOlder
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "pyyardian";
+  version = "1.2.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "h3l1o5";
+    repo = "pyyardian";
+    rev = "refs/tags/${version}";
+    hash = "sha256-JBb62pFDuVcXIGRc6UOp5/ciUtbGm4XnKZjt1icF/jQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Tests require network access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pyyardian"
+  ];
+
+  meta = with lib; {
+    description = "Module for interacting with the Yardian irrigation controller";
+    homepage = "https://github.com/h3l1o5/pyyardian";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyzbar/default.nix b/nixpkgs/pkgs/development/python-modules/pyzbar/default.nix
new file mode 100644
index 000000000000..fca8feab0c3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyzbar/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, pillow
+, zbar
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "pyzbar";
+  version = "0.1.9";
+
+  src = fetchFromGitHub {
+    owner = "NaturalHistoryMuseum";
+    repo = "pyzbar";
+    rev = "v${version}";
+    sha256 = "8IZQY6qB4r1SUPItDlTDnVQuPs0I38K3yJ6LiPJuwbU=";
+  };
+
+  propagatedBuildInputs = [ zbar pillow numpy ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  # find_library doesn't return an absolute path
+  # https://github.com/NixOS/nixpkgs/issues/7307
+  postPatch = ''
+    substituteInPlace pyzbar/zbar_library.py \
+      --replace \
+        "find_library('zbar')" \
+        '"${lib.getLib zbar}/lib/libzbar${stdenv.hostPlatform.extensions.sharedLibrary}"'
+  '';
+
+  disabledTests = [
+    # find_library has been replaced by a hardcoded path
+    # the test fails due to find_library not called
+    "test_found_non_windows"
+    "test_not_found_non_windows"
+  ];
+
+  pythonImportsCheck = [ "pyzbar" ];
+
+  meta = with lib; {
+    description = "Read one-dimensional barcodes and QR codes from Python using the zbar library.";
+    homepage = "https://github.com/NaturalHistoryMuseum/pyzbar";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyzerproc/default.nix b/nixpkgs/pkgs/development/python-modules/pyzerproc/default.nix
new file mode 100644
index 000000000000..b5eb54916717
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyzerproc/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, bleak
+, click
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-mock
+, pythonAtLeast
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "pyzerproc";
+  version = "0.4.12";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "emlove";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-vS0sk/KjDhWispZvCuGlmVLLfeFymHqxwNzNqNRhg6k=";
+  };
+
+  postPatch = ''
+    sed -i "/--cov/d" setup.cfg
+  '';
+
+  propagatedBuildInputs = [
+    bleak
+    click
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = lib.optionals (pythonAtLeast "3.11") [
+    # unittest.mock.InvalidSpecError: Cannot spec a Mock object.
+    "tests/test_light.py"
+  ];
+
+  pythonImportsCheck = [
+    "pyzerproc"
+  ];
+
+  meta = with lib; {
+    description = "Python library to control Zerproc Bluetooth LED smart string lights";
+    homepage = "https://github.com/emlove/pyzerproc";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyzipper/default.nix b/nixpkgs/pkgs/development/python-modules/pyzipper/default.nix
new file mode 100644
index 000000000000..a0ad73fb8a3b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyzipper/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, pycryptodomex
+}:
+
+buildPythonPackage rec {
+  pname = "pyzipper";
+  version = "0.3.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "danifus";
+    repo = "pyzipper";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+fZXoAUeB/bUI3LrIFlMTktJgn+GNFBiDHvH2Jgo0pg=";
+  };
+
+  propagatedBuildInputs = [
+    pycryptodomex
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "pyzipper"
+  ];
+
+  disabledTests = [
+    # Tests are parsing CLI output
+    "test_args_from_interpreter_flags"
+    "test_bad_use"
+    "test_bad_use"
+    "test_check__all__"
+    "test_create_command"
+    "test_extract_command"
+    "test_main"
+    "test_temp_dir__forked_child"
+    "test_test_command"
+  ];
+
+  meta = with lib; {
+    description = "Python zipfile extensions";
+    homepage = "https://github.com/danifus/pyzipper";
+    changelog = "https://github.com/danifus/pyzipper/blob/v${version}/HISTORY.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyzmq/default.nix b/nixpkgs/pkgs/development/python-modules/pyzmq/default.nix
new file mode 100644
index 000000000000..88fbf7d63c05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyzmq/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, py
+, pytestCheckHook
+, python
+, pythonOlder
+, tornado
+, zeromq
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "pyzmq";
+  version = "25.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JZwiSFtxq6zfqL95cgzXvPS50SizDqVU8BrnH9v9qiM=";
+  };
+
+  buildInputs = [
+    zeromq
+  ];
+
+  propagatedBuildInputs = [
+    py
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    tornado
+    pytest-asyncio
+  ];
+
+  pythonImportsCheck = [
+    "zmq"
+  ];
+
+  pytestFlagsArray = [
+    "$out/${python.sitePackages}/zmq/tests/" # Folder with tests
+    # pytest.ini is missing in pypi's sdist
+    # https://github.com/zeromq/pyzmq/issues/1853#issuecomment-1592731986
+    "--asyncio-mode auto"
+  ];
+
+  disabledTests = [
+    # Tests hang
+    "test_socket"
+    "test_monitor"
+    # https://github.com/zeromq/pyzmq/issues/1272
+    "test_cython"
+    # Test fails
+    "test_mockable"
+    # Issues with the sandbox
+    "TestFutureSocket"
+    "TestIOLoop"
+    "TestPubLog"
+  ];
+
+  # Some of the tests use localhost networking.
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Python bindings for ØMQ";
+    homepage = "https://pyzmq.readthedocs.io/";
+    license = with licenses; [ bsd3 /* or */ lgpl3Only ];
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/pyzufall/default.nix b/nixpkgs/pkgs/development/python-modules/pyzufall/default.nix
new file mode 100644
index 000000000000..7ca619efa38d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/pyzufall/default.nix
@@ -0,0 +1,29 @@
+{ lib, fetchPypi, python, buildPythonPackage, nose, future, coverage }:
+
+buildPythonPackage rec {
+  pname = "PyZufall";
+  version = "0.13.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1jffhi20m82fdf78bjhncbdxkfzcskrlipxlrqq9741xdvrn14b5";
+  };
+
+  # disable tests due to problem with nose
+  # https://github.com/nose-devs/nose/issues/1037
+  doCheck = false;
+
+  nativeCheckInputs = [ nose coverage ];
+  propagatedBuildInputs = [ future ];
+
+  checkPhase = ''
+    ${python.interpreter} setup.py nosetests
+  '';
+
+  meta = with lib; {
+    homepage = "https://pyzufall.readthedocs.io/de/latest/";
+    description = "Library for generating random data and sentences in german language";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ davidak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qasync/default.nix b/nixpkgs/pkgs/development/python-modules/qasync/default.nix
new file mode 100644
index 000000000000..182e1b209df4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qasync/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyqt5
+, pytestCheckHook
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "qasync";
+  version = "0.27.0";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "CabbageDevelopment";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-kU8QgcBZSzQQO3V4zKaIBuodUCQS4CLHOH7qHYU8ja0=";
+  };
+
+  postPatch = ''
+    rm qasync/_windows.py # Ignoring it is not taking effect and it will not be used on Linux
+  '';
+
+  buildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [ pyqt5 ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "qasync" ];
+
+  disabledTestPaths = [
+    "tests/test_qeventloop.py"
+  ];
+
+  meta = {
+    description = "Allows coroutines to be used in PyQt/PySide applications by providing an implementation of the PEP 3156 event-loop";
+    homepage = "https://github.com/CabbageDevelopment/qasync";
+    license = [ lib.licenses.bsd2 ];
+    maintainers = [ lib.maintainers.lucasew ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qbittorrent-api/default.nix b/nixpkgs/pkgs/development/python-modules/qbittorrent-api/default.nix
new file mode 100644
index 000000000000..16ad74dd2469
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qbittorrent-api/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, six
+, urllib3
+, packaging
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "qbittorrent-api";
+  version = "2023.10.54";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xCHB/pPURc1+vje6IhBHZ6HogUsmYfBE9977Qtwoc2w=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    six
+    urllib3
+    packaging
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  # Tests require internet access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "qbittorrentapi"
+  ];
+
+  meta = with lib; {
+    description = "Python client implementation for qBittorrent's Web API";
+    homepage = "https://github.com/rmartin16/qbittorrent-api";
+    changelog = "https://github.com/rmartin16/qbittorrent-api/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ savyajha ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qcelemental/default.nix b/nixpkgs/pkgs/development/python-modules/qcelemental/default.nix
new file mode 100644
index 000000000000..59c8f47eea38
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qcelemental/default.nix
@@ -0,0 +1,54 @@
+{ stdenv
+, buildPythonPackage
+, lib
+, fetchPypi
+, poetry-core
+, networkx
+, numpy
+, pint
+, pydantic
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "qcelemental";
+  version = "0.27.1";
+
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-dlcfIUKAg6yc4S3RXVJ1sKM29E1ZvHY82kjx1CM8/08=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    networkx
+    numpy
+    pint
+    pydantic
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "qcelemental"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Periodic table, physical constants and molecule parsing for quantum chemistry";
+    homepage = "https://github.com/MolSSI/QCElemental";
+    changelog = "https://github.com/MolSSI/QCElemental/blob/v${version}/docs/changelog.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ sheepforce ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qcengine/default.nix b/nixpkgs/pkgs/development/python-modules/qcengine/default.nix
new file mode 100644
index 000000000000..c1464c233a93
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qcengine/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, psutil
+, py-cpuinfo
+, pydantic
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, qcelemental
+, msgpack
+}:
+
+buildPythonPackage rec {
+  pname = "qcengine";
+  version = "0.29.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-cIfX9MpRMXtBfLKHKTzCLkv31fBIyanTQHEs8hHk7aQ=";
+  };
+
+  propagatedBuildInputs = [
+    psutil
+    py-cpuinfo
+    pydantic
+    pyyaml
+    qcelemental
+    msgpack
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "qcengine"
+  ];
+
+  meta = with lib; {
+    description = "Quantum chemistry program executor and IO standardizer (QCSchema) for quantum chemistry";
+    homepage = "http://docs.qcarchive.molssi.org/projects/qcelemental/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ sheepforce ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qcodes-contrib-drivers/default.nix b/nixpkgs/pkgs/development/python-modules/qcodes-contrib-drivers/default.nix
new file mode 100644
index 000000000000..e26745e77566
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qcodes-contrib-drivers/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, fetchFromGitHub
+, pythonOlder
+, buildPythonPackage
+, setuptools
+, versioningit
+, qcodes
+, packaging
+, pytestCheckHook
+, pytest-mock
+, pyvisa-sim
+}:
+
+buildPythonPackage rec {
+  pname = "qcodes-contrib-drivers";
+  version = "0.18.0";
+
+  disabled = pythonOlder "3.8";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "QCoDeS";
+    repo = "Qcodes_contrib_drivers";
+    rev = "v${version}";
+    sha256 = "sha256-hg3jSiuOkiuOInnUzzlKtBeoP5zkCDBQ3xP6KCwq+lU=";
+  };
+
+  nativeBuildInputs = [ setuptools versioningit ];
+
+  propagatedBuildInputs = [
+    qcodes
+    packaging
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+    pyvisa-sim
+  ];
+
+  pythonImportsCheck = [ "qcodes_contrib_drivers" ];
+
+  # should be fixed starting with 0.19.0, remove at next release
+  disabledTestPaths = [
+    "qcodes_contrib_drivers/tests/test_Keysight_M3201A.py"
+  ];
+
+  postInstall = ''
+    export HOME="$TMPDIR"
+  '';
+
+  meta = with lib; {
+    description = "User contributed drivers for QCoDeS";
+    homepage = "https://github.com/QCoDeS/Qcodes_contrib_drivers";
+    license = licenses.mit;
+    maintainers = with maintainers; [ evilmav ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qcodes/default.nix b/nixpkgs/pkgs/development/python-modules/qcodes/default.nix
new file mode 100644
index 000000000000..7db5c72f80c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qcodes/default.nix
@@ -0,0 +1,162 @@
+{ lib
+, broadbean
+, buildPythonPackage
+, cf-xarray
+, dask
+, deepdiff
+, fetchFromGitHub
+, h5netcdf
+, h5py
+, hypothesis
+, importlib-metadata
+, ipykernel
+, ipython
+, ipywidgets
+, jsonschema
+, lxml
+, matplotlib
+, numpy
+, opencensus
+, opencensus-ext-azure
+, opentelemetry-api
+, packaging
+, pandas
+, pillow
+, pip
+, pytest-asyncio
+, pytest-mock
+, pytest-rerunfailures
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, pyvisa
+, pyvisa-sim
+, rsa
+, ruamel-yaml
+, setuptools
+, sphinx
+, tabulate
+, tqdm
+, typing-extensions
+, uncertainties
+, versioningit
+, websockets
+, wheel
+, wrapt
+, xarray
+}:
+
+buildPythonPackage rec {
+  pname = "qcodes";
+  version = "0.42.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "QCoDeS";
+    repo = "Qcodes";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+NtPE9mQKWftk3vR5WFZgM+7jl8HWr9MxVA+VpbuHvE=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    versioningit
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    broadbean
+    cf-xarray
+    dask
+    h5netcdf
+    h5py
+    ipykernel
+    ipython
+    ipywidgets
+    jsonschema
+    matplotlib
+    numpy
+    opencensus
+    opencensus-ext-azure
+    opentelemetry-api
+    packaging
+    pandas
+    pillow
+    pyvisa
+    rsa
+    ruamel-yaml
+    tabulate
+    tqdm
+    typing-extensions
+    uncertainties
+    websockets
+    wrapt
+    xarray
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    deepdiff
+    hypothesis
+    lxml
+    pip
+    pytest-asyncio
+    pytest-mock
+    pytest-rerunfailures
+    pytest-xdist
+    pytestCheckHook
+    pyvisa-sim
+    sphinx
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  pytestFlagsArray = [
+    "-v"
+    "-n"
+    "$NIX_BUILD_CORES"
+    # Follow upstream with settings
+    "--durations=20"
+  ];
+
+  disabledTestPaths = [
+    # Test depends on qcodes-loop, causing a cyclic dependency
+    "tests/dataset/measurement/test_load_legacy_data.py"
+    # TypeError
+    "tests/dataset/test_dataset_basic.py"
+  ];
+
+  disabledTests = [
+    # Tests are time-sensitive and power-consuming
+    # Those tests fails repeatably and are flaky
+    "test_access_channels_by_slice"
+    "test_aggregator"
+    "test_datasaver"
+    "test_do1d_additional_setpoints_shape"
+    "test_dond_1d_additional_setpoints_shape"
+    "test_field_limits"
+    "test_get_array_in_scalar_param_data"
+    "test_get_parameter_data"
+    "test_ramp_safely"
+  ];
+
+  pythonImportsCheck = [
+    "qcodes"
+  ];
+
+  postInstall = ''
+    export HOME="$TMPDIR"
+  '';
+
+  meta = with lib; {
+    description = "Python-based data acquisition framework";
+    changelog = "https://github.com/QCoDeS/Qcodes/releases/tag/v${version}";
+    downloadPage = "https://github.com/QCoDeS/Qcodes";
+    homepage = "https://qcodes.github.io/Qcodes/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ evilmav ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qcs-api-client/default.nix b/nixpkgs/pkgs/development/python-modules/qcs-api-client/default.nix
new file mode 100644
index 000000000000..0b38510d6603
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qcs-api-client/default.nix
@@ -0,0 +1,88 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, httpx
+, iso8601
+, poetry-core
+, pydantic
+, pyjwt
+, pytest-asyncio
+, pytestCheckHook
+, python-dateutil
+, pythonAtLeast
+, pythonOlder
+, pythonRelaxDepsHook
+, respx
+, retrying
+, rfc3339
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "qcs-api-client";
+  version = "0.23.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rigetti";
+    repo = "qcs-api-client-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Z+RCjpSpfYU3oU5HQ8CzZfwqUjMHvCKVn+p2tq+VDxQ=";
+  };
+
+  patches = [
+    # Switch to poetry-core, https://github.com/rigetti/qcs-api-client-python/pull/2
+    (fetchpatch {
+      name = "switch-to-poetry-core.patch";
+      url = "https://github.com/rigetti/qcs-api-client-python/commit/32f0b3c7070a65f4edf5b2552648d88435469e44.patch";
+      hash = "sha256-mOc+Q/5cmwPziojtxeEMWWHSDvqvzZlNRbPtOSeTinQ=";
+    })
+  ];
+
+  pythonRelaxDeps = [
+    "attrs"
+    "httpx"
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    httpx
+    iso8601
+    pydantic
+    pyjwt
+    python-dateutil
+    retrying
+    rfc3339
+    toml
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    respx
+  ];
+
+  # Tests are failing on Python 3.11, Fatal Python error: Aborted
+  doCheck = !(pythonAtLeast "3.11");
+
+  pythonImportsCheck = [
+    "qcs_api_client"
+  ];
+
+  meta = with lib; {
+    description = "Python library for accessing the Rigetti QCS API";
+    homepage = "https://qcs-api-client-python.readthedocs.io/";
+    changelog = "https://github.com/rigetti/qcs-api-client-python/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qdarkstyle/default.nix b/nixpkgs/pkgs/development/python-modules/qdarkstyle/default.nix
new file mode 100644
index 000000000000..f83a741dfd90
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qdarkstyle/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, helpdev
+, qtpy
+}:
+
+buildPythonPackage rec {
+  pname = "qdarkstyle";
+  version = "3.2.3";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "QDarkStyle";
+    hash = "sha256-DAt/dKbpISEAiZKzabq2BGgVfbHALNMNZKXpo7QC8a4=";
+  };
+
+  # No tests available
+  doCheck = false;
+
+  propagatedBuildInputs = [ helpdev qtpy ];
+
+  meta = with lib; {
+    description = "A dark stylesheet for Python and Qt applications";
+    homepage = "https://github.com/ColinDuquesnoy/QDarkStyleSheet";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nyanloutre ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qdldl/default.nix b/nixpkgs/pkgs/development/python-modules/qdldl/default.nix
new file mode 100644
index 000000000000..8369bbf2a33d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qdldl/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cmake
+, pybind11
+, numpy
+, scipy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "qdldl";
+  version = "0.1.7.post0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-80ahFMg0LubU29ZHHu8xQZn7Jo0797lYhco1H94rAj8=";
+  };
+
+  dontUseCmakeConfigure = true;
+  nativeBuildInputs = [ cmake ];
+
+  buildInputs = [ pybind11 ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+  ];
+
+  pythonImportsCheck = [ "qdldl" ];
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "A free LDL factorization routine";
+    homepage = "https://github.com/oxfordcontrol/qdldl";
+    downloadPage = "https://github.com/oxfordcontrol/qdldl-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qdrant-client/default.nix b/nixpkgs/pkgs/development/python-modules/qdrant-client/default.nix
new file mode 100644
index 000000000000..37ca849a7676
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qdrant-client/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, grpcio
+, grpcio-tools
+, httpx
+, numpy
+, pytestCheckHook
+, poetry-core
+, pydantic
+, pythonOlder
+, urllib3
+, portalocker
+, fastembed
+# check inputs
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "qdrant-client";
+  version = "1.6.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "qdrant";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-UGD8hl0KN6PzLvmE4ZK+GsQbM3Bp8t9Mz4K62N6Zv/s=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    httpx
+    grpcio
+    # typing-extensions
+    grpcio-tools
+    pydantic
+    urllib3
+    portalocker
+  ] ++ httpx.optional-dependencies.http2;
+
+  pythonImportsCheck = [
+    "qdrant_client"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  # tests require network access
+  doCheck = false;
+
+  passthru.optional-dependencies = {
+    fastembed = [ fastembed ];
+  };
+
+  meta = with lib; {
+    description = "Python client for Qdrant vector search engine";
+    homepage = "https://github.com/qdrant/qdrant-client";
+    changelog = "https://github.com/qdrant/qdrant-client/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qds-sdk/default.nix b/nixpkgs/pkgs/development/python-modules/qds-sdk/default.nix
new file mode 100644
index 000000000000..d4fb7a503144
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qds-sdk/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, boto
+, inflection
+, requests
+, six
+, urllib3
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "qds-sdk";
+  version = "1.16.1";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "qubole";
+    repo = "qds-sdk-py";
+    rev = "refs/tags/V${version}";
+    hash = "sha256-8aPIE2E3Fy2EiBM2FPRyjnJolIBdOzafI3Fvlod5hxU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    boto
+    inflection
+    requests
+    six
+    urllib3
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook mock ];
+
+  pythonImportsCheck = [
+    "qds_sdk"
+  ];
+
+  meta = with lib; {
+    description = "A Python module that provides the tools you need to authenticate with, and use the Qubole Data Service API";
+    homepage = "https://github.com/qubole/qds-sdk-py";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ shahrukh330 ];
+    mainProgram = "qds.py";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qgrid/default.nix b/nixpkgs/pkgs/development/python-modules/qgrid/default.nix
new file mode 100644
index 000000000000..f5758c3182d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qgrid/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, ipywidgets
+, notebook
+, pandas
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "qgrid";
+  version = "1.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-/or1tQgzCE3AtqJlzRrHuDfAPA+FIRUBY1YNzneNcRw=";
+  };
+
+  patches = [
+    # Fixes compatibility of qgrid with ipywidgets >= 8.0.0
+    # See https://github.com/quantopian/qgrid/pull/331
+    (fetchpatch {
+      url = "https://github.com/quantopian/qgrid/pull/331/commits/8cc50d5117d4208a9dd672418021c59898e2d1b2.patch";
+      hash = "sha256-+NLz4yBUGUXKyukPVE4PehenPzjnfljR5RAX7CEtpV4=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    ipywidgets
+    notebook
+    pandas
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Those tests are also failing upstream
+  disabledTests = [
+    "test_edit_date"
+    "test_edit_multi_index_df"
+    "test_multi_index"
+    "test_period_object_column"
+    # probably incompatible with pandas>=2.1
+    "test_add_row_button"
+  ];
+
+  pythonImportsCheck = [ "qgrid" ];
+
+  meta = with lib; {
+    description = "An interactive grid for sorting, filtering, and editing DataFrames in Jupyter notebooks";
+    homepage = "https://github.com/quantopian/qgrid";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qiling/default.nix b/nixpkgs/pkgs/development/python-modules/qiling/default.nix
new file mode 100644
index 000000000000..b7d424be3bfe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qiling/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, capstone
+, fetchFromGitHub
+, fetchPypi
+, gevent
+, keystone-engine
+, multiprocess
+, pefile
+, pyelftools
+, pythonOlder
+, python-fx
+, python-registry
+, pyyaml
+, questionary
+, termcolor
+, unicorn
+}:
+
+buildPythonPackage rec {
+  pname = "qiling";
+  version = "1.4.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-l3WQBlJic4lXCe5Z1FmoxaqOblE7uAaW2gG/nTn84Kc=";
+  };
+
+  propagatedBuildInputs = [
+    capstone
+    gevent
+    keystone-engine
+    multiprocess
+    pefile
+    pyelftools
+    python-fx
+    python-registry
+    pyyaml
+    termcolor
+    questionary
+    unicorn
+  ];
+
+  # Tests are broken (attempt to import a file that tells you not to import it,
+  # amongst other things)
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "qiling"
+  ];
+
+  meta = with lib; {
+    description = "Qiling Advanced Binary Emulation Framework";
+    homepage = "https://qiling.io/";
+    changelog = "https://github.com/qilingframework/qiling/releases/tag/${version}";
+    license = licenses.gpl2Only;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qimage2ndarray/default.nix b/nixpkgs/pkgs/development/python-modules/qimage2ndarray/default.nix
new file mode 100644
index 000000000000..2aead62789f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qimage2ndarray/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k
+, numpy
+, pyqt5
+}:
+
+buildPythonPackage rec {
+  pname = "qimage2ndarray";
+  version = "1.10.0";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NyUQJEbcimlrLsd1sdKvQ7E69qf56+6KNxFbuVQ6LFg=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    pyqt5
+  ];
+
+  # no tests executed
+  doCheck = false;
+
+  meta = {
+    homepage = "https://github.com/hmeine/qimage2ndarray";
+    description = "A small python extension for quickly converting between QImages and numpy.ndarrays (in both directions)";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ tbenst ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qingping-ble/default.nix b/nixpkgs/pkgs/development/python-modules/qingping-ble/default.nix
new file mode 100644
index 000000000000..8140226b4dd9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qingping-ble/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, bluetooth-data-tools
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "qingping-ble";
+  version = "0.8.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bluetooth-devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-vfezalq3x9KAMtwixUkIVQIwBO2zd+BDl+JwdRqBn7w=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-data-tools
+    bluetooth-sensor-state-data
+    sensor-state-data
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=qingping_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "qingping_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for Qingping BLE devices";
+    homepage = "https://github.com/bluetooth-devices/qingping-ble";
+    changelog = "https://github.com/Bluetooth-Devices/qingping-ble/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qiskit-aer/default.nix b/nixpkgs/pkgs/development/python-modules/qiskit-aer/default.nix
new file mode 100644
index 000000000000..e774990fb999
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qiskit-aer/default.nix
@@ -0,0 +1,158 @@
+{ stdenv
+, lib
+, pythonOlder
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+  # C Inputs
+, blas
+, catch2
+, cmake
+, cython
+, fmt
+, muparserx
+, ninja
+, nlohmann_json
+, spdlog
+  # Python Inputs
+, cvxpy
+, numpy
+, pybind11
+, scikit-build
+  # Check Inputs
+, pytestCheckHook
+, ddt
+, fixtures
+, pytest-timeout
+, qiskit-terra
+, setuptools
+, testtools
+}:
+
+buildPythonPackage rec {
+  pname = "qiskit-aer";
+  version = "0.12.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Qiskit";
+    repo = "qiskit-aer";
+    rev = "refs/tags/${version}";
+    hash = "sha256-K8Avh1j9j5CGdEYIeJJRF+PjUFXvVILkZLqX1QClInE=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'cmake!=3.17,!=3.17.0'," "" \
+      --replace "'pybind11', min_version='2.6'" "'pybind11'" \
+      --replace "pybind11>=2.6" "pybind11" \
+      --replace "scikit-build>=0.11.0" "scikit-build" \
+      --replace "min_version='0.11.0'" ""
+  '';
+
+  nativeBuildInputs = [
+    cmake
+    ninja
+    scikit-build
+  ];
+
+  buildInputs = [
+    blas
+    catch2
+    nlohmann_json
+    fmt
+    muparserx
+    spdlog
+  ];
+
+  propagatedBuildInputs = [
+    cvxpy
+    cython  # generates some cython files at runtime that need to be cython-ized
+    numpy
+    pybind11
+  ];
+
+  preBuild = ''
+    export DISABLE_CONAN=1
+  '';
+
+  dontUseCmakeConfigure = true;
+
+  # *** Testing ***
+  pythonImportsCheck = [
+    "qiskit.providers.aer"
+    "qiskit.providers.aer.backends.qasm_simulator"
+    "qiskit.providers.aer.backends.controller_wrappers" # Checks C++ files built correctly. Only exists if built & moved to output
+  ];
+
+  disabledTests = [
+    # these tests don't work with cvxpy >= 1.1.15
+    "test_clifford"
+    "test_approx_random"
+    "test_snapshot" # TODO: these ~30 tests fail on setup due to pytest fixture issues?
+    "test_initialize_2" # TODO: simulations appear incorrect, off by >10%.
+    "test_pauli_error_2q_gate_from_string_1qonly"
+
+    # these fail for some builds. Haven't been able to reproduce error locally.
+    "test_kraus_gate_noise"
+    "test_backend_method_clifford_circuits_and_kraus_noise"
+    "test_backend_method_nonclifford_circuit_and_kraus_noise"
+    "test_kraus_noise_fusion"
+
+    # Slow tests
+    "test_paulis_1_and_2_qubits"
+    "test_3d_oscillator"
+    "_057"
+    "_136"
+    "_137"
+    "_139"
+    "_138"
+    "_140"
+    "_141"
+    "_143"
+    "_144"
+    "test_sparse_output_probabilities"
+    "test_reset_2_qubit"
+
+    # Fails with 0.10.4
+    "test_extended_stabilizer_sparse_output_probs"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    ddt
+    fixtures
+    pytest-timeout
+    qiskit-terra
+    testtools
+  ];
+
+  pytestFlagsArray = [
+    "--timeout=30"
+    "--durations=10"
+  ];
+
+  preCheck = ''
+    # Tests include a compiled "circuit" which is auto-built in $HOME
+    export HOME=$(mktemp -d)
+    # move tests b/c by default try to find (missing) cython-ized code in /build/source dir
+    cp -r $TMP/$sourceRoot/test $HOME
+
+    # Add qiskit-aer compiled files to cython include search
+    pushd $HOME
+  '';
+
+  postCheck = "popd";
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64);
+    description = "High performance simulators for Qiskit";
+    homepage = "https://qiskit.org/aer";
+    downloadPage = "https://github.com/QISKit/qiskit-aer/releases";
+    changelog = "https://qiskit.org/documentation/release_notes.html";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qiskit-finance/default.nix b/nixpkgs/pkgs/development/python-modules/qiskit-finance/default.nix
new file mode 100644
index 000000000000..880804ff8527
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qiskit-finance/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchFromGitHub
+  # Python Inputs
+, fastdtw
+, numpy
+, pandas
+, psutil
+, qiskit-terra
+, qiskit-optimization
+, scikit-learn
+, scipy
+, quandl
+, yfinance
+  # Check Inputs
+, pytestCheckHook
+, ddt
+, pytest-timeout
+, qiskit-aer
+}:
+
+buildPythonPackage rec {
+  pname = "qiskit-finance";
+  version = "0.3.4";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "qiskit";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Ijoqn6nANLsEVKA5nycd1xbW5htJ+TQm6LkiMUWTsSs=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt --replace "pandas<1.4.0" "pandas"
+  '';
+
+  propagatedBuildInputs = [
+    fastdtw
+    numpy
+    pandas
+    psutil
+    qiskit-terra
+    qiskit-optimization
+    quandl
+    scikit-learn
+    scipy
+    yfinance
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-timeout
+    ddt
+    qiskit-aer
+  ];
+
+  pythonImportsCheck = [ "qiskit_finance" ];
+  disabledTests = [
+    # Fail due to approximation error, ~1-2%
+    "test_application"
+
+    # Tests fail b/c require internet connection. Stalls tests if enabled.
+    "test_exchangedata"
+    "test_yahoo"
+    "test_wikipedia"
+  ];
+  pytestFlagsArray = [
+    "--durations=10"
+  ];
+
+  meta = with lib; {
+    description = "Software for developing quantum computing programs";
+    homepage = "https://qiskit.org";
+    downloadPage = "https://github.com/QISKit/qiskit-optimization/releases";
+    changelog = "https://qiskit.org/documentation/release_notes.html";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qiskit-ibmq-provider/default.nix b/nixpkgs/pkgs/development/python-modules/qiskit-ibmq-provider/default.nix
new file mode 100644
index 000000000000..4bf996a26507
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qiskit-ibmq-provider/default.nix
@@ -0,0 +1,105 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchFromGitHub
+, arrow
+, nest-asyncio
+, qiskit-terra
+, requests
+, requests_ntlm
+, websocket-client
+  # Visualization inputs
+, withVisualization ? true
+, ipython
+, ipyvuetify
+, ipywidgets
+, matplotlib
+, plotly
+, pyperclip
+, seaborn
+  # check inputs
+, pytestCheckHook
+, nbconvert
+, nbformat
+, pproxy
+, qiskit-aer
+, websockets
+, vcrpy
+}:
+
+let
+  visualizationPackages = [
+    ipython
+    ipyvuetify
+    ipywidgets
+    matplotlib
+    plotly
+    pyperclip
+    seaborn
+  ];
+in
+buildPythonPackage rec {
+  pname = "qiskit-ibmq-provider";
+  version = "0.20.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Qiskit";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-7dIspeJpukLDfICoBPPZZWdzkVumtvh+NRxvtmnvWH0=";
+  };
+
+  propagatedBuildInputs = [
+    arrow
+    nest-asyncio
+    qiskit-terra
+    requests
+    requests_ntlm
+    websocket-client
+    websockets
+  ] ++ lib.optionals withVisualization visualizationPackages;
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "websocket-client>=1.0.1" "websocket-client"
+  '';
+
+  # Most tests require credentials to run on IBMQ
+  nativeCheckInputs = [
+    pytestCheckHook
+    nbconvert
+    nbformat
+    pproxy
+    qiskit-aer
+    vcrpy
+  ] ++ lib.optionals (!withVisualization) visualizationPackages;
+
+  pythonImportsCheck = [ "qiskit.providers.ibmq" ];
+  disabledTests = [
+    "test_coder_operators"  # fails for some reason on nixos-21.05+
+    # These disabled tests require internet connection, aren't skipped elsewhere
+    "test_old_api_url"
+    "test_non_auth_url"
+    "test_non_auth_url_with_hub"
+    "test_coder_optimizers" # TODO: reenable when package scikit-quant is packaged, either in NUR or nixpkgs
+
+    # slow tests
+    "test_websocket_retry_failure"
+    "test_invalid_url"
+  ];
+
+  # Skip tests that rely on internet access (mostly to IBM Quantum Experience cloud).
+  # Options defined in qiskit.terra.test.testing_options.py::get_test_options
+  preCheck = ''
+    export QISKIT_TESTS=skip_online
+  '';
+
+  meta = with lib; {
+    description = "Qiskit provider for accessing the quantum devices and simulators at IBMQ";
+    homepage = "https://github.com/Qiskit/qiskit-ibmq-provider";
+    changelog = "https://qiskit.org/documentation/release_notes.html";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qiskit-ignis/default.nix b/nixpkgs/pkgs/development/python-modules/qiskit-ignis/default.nix
new file mode 100644
index 000000000000..2c963271a4db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qiskit-ignis/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, stdenv
+, pythonOlder
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, qiskit-terra
+, scikit-learn
+, scipy
+  # Optional package inputs
+, withVisualization ? false
+, matplotlib
+, withCvx ? false
+, cvxpy
+, withJit ? false
+, numba
+  # Check Inputs
+, pytestCheckHook
+, ddt
+, pyfakefs
+, qiskit-aer
+}:
+
+buildPythonPackage rec {
+  pname = "qiskit-ignis";
+  version = "0.7.1";
+
+  disabled = pythonOlder "3.6";
+
+  # Pypi's tarball doesn't contain tests
+  src = fetchFromGitHub {
+    owner = "Qiskit";
+    repo = "qiskit-ignis";
+    rev = "refs/tags/${version}";
+    hash = "sha256-WyLNtZhtuGzqCJdOBvtBjZZiGFQihpeSjJQtP7lI248=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    qiskit-terra
+    scikit-learn
+    scipy
+  ] ++ lib.optionals (withCvx) [ cvxpy ]
+  ++ lib.optionals (withVisualization) [ matplotlib ]
+  ++ lib.optionals (withJit) [ numba ];
+
+  # Tests
+  pythonImportsCheck = [ "qiskit.ignis" ];
+  dontUseSetuptoolsCheck = true;
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+  nativeCheckInputs = [
+    pytestCheckHook
+    ddt
+    pyfakefs
+    qiskit-aer
+  ];
+  disabledTests = [
+    "test_tensored_meas_cal_on_circuit" # Flaky test, occasionally returns result outside bounds
+  ] ++ lib.optionals stdenv.isAarch64 [
+    "test_fitters" # Fails check that arrays are close. Might be due to aarch64 math issues.
+  ];
+
+  meta = with lib; {
+    description = "Qiskit tools for quantum hardware verification, noise characterization, and error correction";
+    homepage = "https://qiskit.org/ignis";
+    downloadPage = "https://github.com/QISKit/qiskit-ignis/releases";
+    changelog = "https://qiskit.org/documentation/release_notes.html";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qiskit-machine-learning/default.nix b/nixpkgs/pkgs/development/python-modules/qiskit-machine-learning/default.nix
new file mode 100644
index 000000000000..1c23fb3b0398
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qiskit-machine-learning/default.nix
@@ -0,0 +1,86 @@
+{ lib
+, pythonOlder
+, pythonAtLeast
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+  # Python Inputs
+, fastdtw
+, numpy
+, psutil
+, qiskit-terra
+, scikit-learn
+, sparse
+, torch
+  # Check Inputs
+, pytestCheckHook
+, ddt
+, pytest-timeout
+, qiskit-aer
+}:
+
+buildPythonPackage rec {
+  pname = "qiskit-machine-learning";
+  version = "0.6.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "qiskit";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-oSLQvZGEq/nBj7ktDEq3BMk7xyYiLGpBDmKxuXtMTfs=";
+  };
+
+  propagatedBuildInputs = [
+    fastdtw
+    numpy
+    psutil
+    torch
+    qiskit-terra
+    scikit-learn
+    sparse
+  ];
+
+  doCheck = false;  # TODO: enable. Tests fail on unstable due to some multithreading issue?
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-timeout
+    ddt
+    qiskit-aer
+  ];
+
+  pythonImportsCheck = [ "qiskit_machine_learning" ];
+
+  pytestFlagsArray = [
+    "--durations=10"
+    "--showlocals"
+    "-vv"
+    "--ignore=test/connectors/test_torch_connector.py"  # TODO: fix, get multithreading errors with python3.9, segfaults
+  ];
+  disabledTests = [
+    # Slow tests >10 s
+    "test_readme_sample"
+    "test_vqr_8"
+    "test_vqr_7"
+    "test_qgan_training_cg"
+    "test_vqc_4"
+    "test_classifier_with_circuit_qnn_and_cross_entropy_4"
+    "test_vqr_4"
+    "test_regressor_with_opflow_qnn_4"
+    "test_qgan_save_model"
+    "test_qgan_training_analytic_gradients"
+    "test_qgan_training_run_algo_numpy"
+    "test_ad_hoc_data"
+    "test_qgan_training"
+  ];
+
+  meta = with lib; {
+    description = "Software for developing quantum computing programs";
+    homepage = "https://qiskit.org";
+    downloadPage = "https://github.com/QISKit/qiskit-optimization/releases";
+    changelog = "https://qiskit.org/documentation/release_notes.html";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qiskit-nature/default.nix b/nixpkgs/pkgs/development/python-modules/qiskit-nature/default.nix
new file mode 100644
index 000000000000..8fc30687f69e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qiskit-nature/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchFromGitHub
+  # Python Inputs
+, h5py
+, numpy
+, psutil
+, qiskit-terra
+, rustworkx
+, scikit-learn
+, scipy
+, withPyscf ? false
+, pyscf
+  # Check Inputs
+, pytestCheckHook
+, ddt
+, pylatexenc
+, qiskit-aer
+}:
+
+buildPythonPackage rec {
+  pname = "qiskit-nature";
+  version = "0.6.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Qiskit";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-X/4jA/e2nmmaVEiCgd/4KJc/sAdcYDkyKzvyVztovXM=";
+  };
+
+  propagatedBuildInputs = [
+    h5py
+    numpy
+    psutil
+    qiskit-terra
+    rustworkx
+    scikit-learn
+    scipy
+  ] ++ lib.optional withPyscf pyscf;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    ddt
+    pylatexenc
+    qiskit-aer
+  ];
+
+  pythonImportsCheck = [ "qiskit_nature" ];
+
+  pytestFlagsArray = [
+    "--durations=10"
+  ];
+
+  disabledTests = [
+    "test_two_qubit_reduction"  # failure cause unclear
+  ];
+
+  meta = with lib; {
+    description = "Software for developing quantum computing programs";
+    homepage = "https://qiskit.org";
+    downloadPage = "https://github.com/QISKit/qiskit-nature/releases";
+    changelog = "https://qiskit.org/documentation/release_notes.html";
+    sourceProvenance = with sourceTypes; [
+      fromSource
+      binaryNativeCode  # drivers/gaussiand/gauopen/*.so
+    ];
+    license = licenses.asl20;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qiskit-optimization/default.nix b/nixpkgs/pkgs/development/python-modules/qiskit-optimization/default.nix
new file mode 100644
index 000000000000..f68149529e64
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qiskit-optimization/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchFromGitHub
+  # Python Inputs
+, decorator
+, docplex
+, networkx
+, numpy
+, qiskit-terra
+, scipy
+  # Check Inputs
+, pytestCheckHook
+, ddt
+, pylatexenc
+, qiskit-aer
+}:
+
+buildPythonPackage rec {
+  pname = "qiskit-optimization";
+  version = "0.5.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "qiskit";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-N4mf5ins0x+yUAIq+yyjSnUrHcaEhH/Jpid/QMhIjE0=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt --replace "networkx>=2.2,<2.6" "networkx"
+  '';
+
+  propagatedBuildInputs = [
+    docplex
+    decorator
+    networkx
+    numpy
+    qiskit-terra
+    scipy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    ddt
+    pylatexenc
+    qiskit-aer
+  ];
+
+  pythonImportsCheck = [ "qiskit_optimization" ];
+  pytestFlagsArray = [ "--durations=10" ];
+
+  meta = with lib; {
+    description = "Software for developing quantum computing programs";
+    homepage = "https://qiskit.org";
+    downloadPage = "https://github.com/QISKit/qiskit-optimization/releases";
+    changelog = "https://qiskit.org/documentation/release_notes.html";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qiskit-terra/default.nix b/nixpkgs/pkgs/development/python-modules/qiskit-terra/default.nix
new file mode 100644
index 000000000000..2c290493b063
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qiskit-terra/default.nix
@@ -0,0 +1,209 @@
+{ stdenv
+, lib
+, pythonOlder
+, buildPythonPackage
+, fetchFromGitHub
+, cargo
+, rustPlatform
+, rustc
+  # Python requirements
+, dill
+, numpy
+, networkx
+, ply
+, psutil
+, python-constraint
+, python-dateutil
+, rustworkx
+, scipy
+, scikit-quant ? null
+, setuptools-rust
+, stevedore
+, symengine
+, sympy
+, tweedledum
+, withVisualization ? false
+  # Python visualization requirements, optional
+, ipywidgets
+, matplotlib
+, pillow
+, pydot
+, pygments
+, pylatexenc
+, seaborn
+  # Crosstalk-adaptive layout pass
+, withCrosstalkPass ? false
+, z3
+  # test requirements
+, ddt
+, hypothesis
+, nbformat
+, nbconvert
+, pytestCheckHook
+, python
+}:
+
+let
+  visualizationPackages = [
+    ipywidgets
+    matplotlib
+    pillow
+    pydot
+    pygments
+    pylatexenc
+    seaborn
+  ];
+  crosstalkPackages = [ z3 ];
+in
+
+buildPythonPackage rec {
+  pname = "qiskit-terra";
+  version = "0.25.1";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "qiskit";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-4/LVKDNxKsRztCtU/mMfKMVHHJqfadZXmxeOlnlz9Tc=";
+  };
+
+  nativeBuildInputs = [ setuptools-rust rustc cargo rustPlatform.cargoSetupHook ];
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-SXC0UqWjWqLlZvKCRBylSX73r4Vale130KzS0zM8gjQ=";
+  };
+
+  propagatedBuildInputs = [
+    dill
+    numpy
+    networkx
+    ply
+    psutil
+    python-constraint
+    python-dateutil
+    rustworkx
+    scipy
+    scikit-quant
+    stevedore
+    symengine
+    sympy
+    tweedledum
+  ] ++ lib.optionals withVisualization visualizationPackages
+  ++ lib.optionals withCrosstalkPass crosstalkPackages;
+
+  # *** Tests ***
+  nativeCheckInputs = [
+    pytestCheckHook
+    ddt
+    hypothesis
+    nbformat
+    nbconvert
+  ] ++ lib.optionals (!withVisualization) visualizationPackages;
+
+  pythonImportsCheck = [
+    "qiskit"
+    "qiskit.pulse"
+  ];
+
+  disabledTestPaths = [
+    "test/randomized/test_transpiler_equivalence.py" # collection requires qiskit-aer, which would cause circular dependency
+    # These tests are nondeterministic and can randomly fail.
+    # We ignore them here for deterministic building.
+    "test/randomized/"
+    # These tests consistently fail on GitHub Actions build
+    "test/python/quantum_info/operators/test_random.py"
+  ];
+  pytestFlagsArray = [ "--durations=10" ];
+  disabledTests = [
+    "TestUnitarySynthesisPlugin" # use unittest mocks for transpiler.run(), seems incompatible somehow w/ pytest infrastructure
+    # matplotlib tests seems to fail non-deterministically
+    "TestMatplotlibDrawer"
+    "TestGraphMatplotlibDrawer"
+    "test_copy" # assertNotIn doesn't seem to work as expected w/ pytest vs unittest
+
+    # 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
+    "test_two_qubit_synthesis_not_pulse_optimal" # test of random circuit, seems to randomly fail depending on seed
+    "test_qv_natural" # fails due to sign error. Not sure why
+  ] ++ lib.optionals (lib.versionAtLeast matplotlib.version "3.4.0") [
+    "test_plot_circuit_layout"
+  ]
+  # Disabling slow tests for build constraints
+  ++ [
+    "test_all_examples"
+    "test_controlled_random_unitary"
+    "test_controlled_standard_gates_1"
+    "test_jupyter_jobs_pbars"
+    "test_lookahead_swap_higher_depth_width_is_better"
+    "test_move_measurements"
+    "test_job_monitor"
+    "test_wait_for_final_state"
+    "test_multi_controlled_y_rotation_matrix_basic_mode"
+    "test_two_qubit_weyl_decomposition_abc"
+    "test_isometry"
+    "test_parallel"
+    "test_random_state"
+    "test_random_clifford_valid"
+    "test_to_matrix"
+    "test_block_collection_reduces_1q_gate"
+    "test_multi_controlled_rotation_gate_matrices"
+    "test_block_collection_runs_for_non_cx_bases"
+    "test_with_two_qubit_reduction"
+    "test_basic_aer_qasm"
+    "test_hhl"
+    "test_H2_hamiltonian"
+    "test_max_evals_grouped_2"
+    "test_qaoa_qc_mixer_4"
+    "test_abelian_grouper_random_2"
+    "test_pauli_two_design"
+    "test_shor_factoring"
+    "test_sample_counts_memory_ghz"
+    "test_two_qubit_weyl_decomposition_ab0"
+    "test_sample_counts_memory_superposition"
+    "test_piecewise_polynomial_function"
+    "test_piecewise_chebyshev_mutability"
+    "test_bit_conditional_no_cregbundle"
+    "test_gradient_wrapper2"
+    "test_two_qubit_weyl_decomposition_abmb"
+    "test_two_qubit_weyl_decomposition_abb"
+    "test_vqe_qasm"
+    "test_dag_from_networkx"
+    "test_defaults_to_dict_46"
+  ];
+
+  # Moves tests to $PACKAGEDIR/test. They can't be run from /build because of finding
+  # cythonized modules and expecting to find some resource files in the test directory.
+  preCheck = ''
+    export PACKAGEDIR=$out/${python.sitePackages}
+    echo "Moving Qiskit test files to package directory"
+    cp -r $TMP/$sourceRoot/test $PACKAGEDIR
+    cp -r $TMP/$sourceRoot/examples $PACKAGEDIR
+
+    # run pytest from Nix's $out path
+    pushd $PACKAGEDIR
+  '';
+  postCheck = ''
+    rm -r test
+    rm -r examples
+    popd
+  '';
+
+
+  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.
+    '';
+    homepage = "https://qiskit.org/terra";
+    downloadPage = "https://github.com/QISKit/qiskit-terra/releases";
+    changelog = "https://qiskit.org/documentation/release_notes.html";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qiskit/default.nix b/nixpkgs/pkgs/development/python-modules/qiskit/default.nix
new file mode 100644
index 000000000000..953956413263
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qiskit/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, pythonOlder
+, buildPythonPackage
+, fetchFromGitHub
+  # Python Inputs
+, qiskit-aer
+, qiskit-ibmq-provider
+, qiskit-ignis
+, qiskit-terra
+  # Optional inputs
+, withOptionalPackages ? true
+, qiskit-finance
+, qiskit-machine-learning
+, qiskit-nature
+, qiskit-optimization
+  # Check Inputs
+, pytestCheckHook
+}:
+
+let
+  optionalQiskitPackages = [
+    qiskit-finance
+    qiskit-machine-learning
+    qiskit-nature
+    qiskit-optimization
+  ];
+in
+buildPythonPackage rec {
+  pname = "qiskit";
+  # NOTE: This version denotes a specific set of subpackages. See https://qiskit.org/documentation/release_notes.html#version-history
+  version = "0.41.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Qiskit";
+    repo = "qiskit";
+    rev = "refs/tags/${version}";
+    hash = "sha256-ICJJvbekvpaBMnSf+NHbTiarb+Ye3NtktcRYAq8KaCs=";
+  };
+
+  propagatedBuildInputs = [
+    qiskit-aer
+    qiskit-ibmq-provider
+    qiskit-ignis
+    qiskit-terra
+  ] ++ lib.optionals withOptionalPackages optionalQiskitPackages;
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [
+    "qiskit"
+    "qiskit.circuit"
+    "qiskit.ignis"
+    "qiskit.providers.aer"
+    "qiskit.providers.ibmq"
+  ];
+
+  meta = with lib; {
+    description = "Software for developing quantum computing programs";
+    homepage = "https://qiskit.org";
+    downloadPage = "https://github.com/QISKit/qiskit/releases";
+    changelog = "https://qiskit.org/documentation/release_notes.html";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ drewrisinger pandaman ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qmk-dotty-dict/default.nix b/nixpkgs/pkgs/development/python-modules/qmk-dotty-dict/default.nix
new file mode 100644
index 000000000000..8b7a7b553699
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qmk-dotty-dict/default.nix
@@ -0,0 +1,27 @@
+{ buildPythonPackage, fetchPypi, lib, setuptools-scm }:
+
+buildPythonPackage rec {
+  pname = "qmk_dotty_dict";
+  version = "1.3.0.post1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-O2EeOTZgv6poNcaOlHhLroD+B7hJCXi17KsDoNL8fqI=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/pawelzny/dotty_dict";
+    description = "Dictionary wrapper for quick access to deeply nested keys";
+    longDescription = ''
+      This is a version of dotty-dict by QMK (https://qmk.fm) since the original
+      dotty-dict published to pypi has non-ASCII characters that breaks with
+      some non-UTF8 locale settings.
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ babariviere ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qnap-qsw/default.nix b/nixpkgs/pkgs/development/python-modules/qnap-qsw/default.nix
new file mode 100644
index 000000000000..f4e9a1cdf8b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qnap-qsw/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "qnap-qsw";
+  version = "0.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Noltari";
+    repo = "python-qnap-qsw";
+    rev = version;
+    sha256 = "WP1bGt7aAtSVFOMJgPXKqVSbi5zj9K7qoIVrYCrPGqk=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "qnap_qsw"
+  ];
+
+  meta = with lib; {
+    description = "Python library to interact with the QNAP QSW API";
+    homepage = "https://github.com/Noltari/python-qnap-qsw";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qnapstats/default.nix b/nixpkgs/pkgs/development/python-modules/qnapstats/default.nix
new file mode 100644
index 000000000000..e42b0753bd3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qnapstats/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, xmltodict
+, responses
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "qnapstats";
+  version = "0.5.0";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "colinodell";
+    repo = "python-qnapstats";
+    rev = "refs/tags/${version}";
+    hash = "sha256-dpxl6a61h8zB7eS/2lxG+2//bOTzV6s4T1W+DVj0fnI=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    xmltodict
+  ];
+
+  nativeCheckInputs = [
+    responses
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    ${python.interpreter} tests/test-models.py
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "qnapstats" ];
+
+  meta = {
+    description = "Python API for obtaining QNAP NAS system stats";
+    homepage = "https://github.com/colinodell/python-qnapstats";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qpageview/default.nix b/nixpkgs/pkgs/development/python-modules/qpageview/default.nix
new file mode 100644
index 000000000000..db5ea8ad1f7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qpageview/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, python3Packages
+, pythonOlder
+}:
+
+python3Packages.buildPythonPackage rec {
+  pname = "qpageview";
+  version = "0.6.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "frescobaldi";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-XFMTOD7ums8sbFHUViEI9q6/rCjUmEtXAdd3/OmLsHU=";
+  };
+
+  propagatedBuildInputs = with python3Packages; [ pyqt5 poppler-qt5 pycups ];
+
+  pythonImportsCheck = [ "qpageview" ];
+
+  meta = with lib; {
+    description = "A page-based viewer widget for Qt5/PyQt5";
+    homepage = "https://github.com/frescobaldi/qpageview";
+    changelog = "https://github.com/frescobaldi/qpageview/blob/${src.rev}/ChangeLog";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ camillemndn ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qpsolvers/default.nix b/nixpkgs/pkgs/development/python-modules/qpsolvers/default.nix
new file mode 100644
index 000000000000..f480217aa621
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qpsolvers/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, unittestCheckHook
+, flit-core
+, daqp
+, ecos
+, numpy
+, osqp
+, scipy
+, scs
+, quadprog
+}:
+buildPythonPackage rec {
+  pname = "qpsolvers";
+  version = "4.0.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "qpsolvers";
+    repo = "qpsolvers";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-s1d8oTrmptS3exUqn9HSSla6P4dIxS/qNalsDTbFmFs=";
+  };
+
+  pythonImportsCheck = [ "qpsolvers" ];
+
+  propagatedBuildInputs = [
+    daqp
+    ecos
+    numpy
+    osqp
+    scipy
+    scs
+  ];
+
+  nativeCheckInputs = [
+    flit-core
+    quadprog
+    unittestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Quadratic programming solvers in Python with a unified API";
+    homepage = "https://github.com/qpsolvers/qpsolvers";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ renesat ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qrcode/default.nix b/nixpkgs/pkgs/development/python-modules/qrcode/default.nix
new file mode 100644
index 000000000000..43379422263d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qrcode/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, pillow
+, pypng
+, typing-extensions
+, mock
+, pytestCheckHook
+, testers
+, qrcode
+}:
+
+buildPythonPackage rec {
+  pname = "qrcode";
+  version = "7.4.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ndlpRUgn4Sfb2TaWsgdHI55tVA4IKTfJDxSslbMPWEU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    typing-extensions
+    pypng
+    # imports pkg_resouces in console_scripts.py
+    setuptools
+  ];
+
+  passthru.optional-dependencies.pil = [
+    pillow
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.pil;
+
+  passthru.tests = {
+    version = testers.testVersion {
+      package = qrcode;
+      command = "qr --version";
+    };
+  };
+
+  meta = with lib; {
+    description = "Python QR Code image generator";
+    homepage = "https://github.com/lincolnloop/python-qrcode";
+    changelog = "https://github.com/lincolnloop/python-qrcode/blob/v${version}/CHANGES.rst";
+    license = licenses.bsd3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qreactor/default.nix b/nixpkgs/pkgs/development/python-modules/qreactor/default.nix
new file mode 100644
index 000000000000..e4648919d9f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qreactor/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, twisted
+, qtpy
+, pyqt5
+}:
+
+buildPythonPackage rec {
+  pname = "qreactor-unstable";
+  version = "2018-09-29";
+
+  src = fetchFromGitHub {
+    owner = "frmdstryr";
+    repo = "qt-reactor";
+    rev = "364b3f561fb0d4d3938404d869baa4db7a982bf0";
+    sha256 = "1nb5iwg0nfz86shw28a2kj5pyhd4jvvxhf73fhnfbl8scgnvjv9h";
+  };
+
+  disabled = pythonOlder "3.0";
+
+  propagatedBuildInputs = [
+    twisted qtpy
+  ];
+
+  nativeCheckInputs = [
+    pyqt5
+  ];
+
+  pythonImportsCheck = [
+    "qreactor"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/frmdstryr/qt-reactor";
+    description = "Twisted and PyQt5/qtpy eventloop integration base";
+    license = licenses.mit;
+    maintainers = with maintainers; [ raboof ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qscintilla-qt5/default.nix b/nixpkgs/pkgs/development/python-modules/qscintilla-qt5/default.nix
new file mode 100644
index 000000000000..46622bc3e991
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qscintilla-qt5/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, pythonPackages
+, qscintilla
+, qtbase
+, qmake
+, qtmacextras
+, stdenv
+}:
+
+let
+  inherit (pythonPackages) buildPythonPackage isPy3k python sip sipbuild pyqt5 pyqt-builder;
+in buildPythonPackage rec {
+  pname = "qscintilla-qt5";
+  version = qscintilla.version;
+  src = qscintilla.src;
+  format = "pyproject";
+
+  disabled = !isPy3k;
+
+  nativeBuildInputs = [ sip qmake pyqt-builder qscintilla pythonPackages.setuptools ];
+  buildInputs = [ qtbase ];
+  propagatedBuildInputs = [ pyqt5 ] ++ lib.optionals stdenv.isDarwin [ qtmacextras ];
+
+  dontWrapQtApps = true;
+
+  postPatch = ''
+    cd Python
+    cp pyproject-qt5.toml pyproject.toml
+    echo '[tool.sip.project]' >> pyproject.toml
+    echo 'sip-include-dirs = [ "${pyqt5}/${python.sitePackages}/PyQt5/bindings"]' \
+       >> pyproject.toml
+  '' + lib.optionalString stdenv.isDarwin ''
+    substituteInPlace project.py \
+      --replace \
+      "if self.project.qsci_external_lib:
+                if self.qsci_features_dir is not None:" \
+      "if self.project.qsci_external_lib:
+                self.builder_settings.append('QT += widgets')
+
+                self.builder_settings.append('QT += printsupport')
+
+                if self.qsci_features_dir is not None:"
+  '';
+
+  dontConfigure = true;
+
+  build = ''
+    sip-install --qsci-features-dir ${qscintilla}/mkspecs/features \
+    --qsci-include-dir ${qscintilla}/include \
+    --qsci-library-dir ${qscintilla}/lib --api-dir ${qscintilla}/share";
+  '';
+  postInstall = ''
+    # Needed by pythonImportsCheck to find the module
+    export PYTHONPATH="$out/${python.sitePackages}:$PYTHONPATH"
+  '';
+
+  # Checked using pythonImportsCheck
+  doCheck = false;
+
+  pythonImportsCheck = [ "PyQt5.Qsci" ];
+
+  meta = with lib; {
+    description = "A Python binding to QScintilla, Qt based text editing control";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ lsix ];
+    homepage = "https://www.riverbankcomputing.com/software/qscintilla/";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qstylizer/default.nix b/nixpkgs/pkgs/development/python-modules/qstylizer/default.nix
new file mode 100644
index 000000000000..ee49d37055d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qstylizer/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, inflection
+, pbr
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, tinycss2
+}:
+
+buildPythonPackage rec {
+  pname = "qstylizer";
+  version = "0.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "blambright";
+    repo = pname;
+    rev = version;
+    hash = "sha256-QJ4xhaAoVO4/VncXKzI8Q5f/rPfctJ8CvfedkQVgZgQ=";
+  };
+
+  PBR_VERSION = version;
+
+  nativeBuildInputs = [
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    inflection
+    tinycss2
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+  ];
+
+  pythonImportsCheck = [
+    "qstylizer"
+  ];
+
+  meta = with lib; {
+    description = "Qt stylesheet generation utility for PyQt/PySide";
+    homepage = "https://github.com/blambright/qstylizer";
+    license = licenses.mit;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qt-material/default.nix b/nixpkgs/pkgs/development/python-modules/qt-material/default.nix
new file mode 100644
index 000000000000..c7c195cdfc48
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qt-material/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jinja2
+}:
+
+buildPythonPackage rec {
+  pname = "qt-material";
+  version = "2.14";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-tdu1relyF8964za7fAR8kL6zncfyBIpJjJFq1fL3riM=";
+  };
+
+  propagatedBuildInputs = [
+    jinja2
+  ];
+
+  pythonImportsCheck = [
+    "qt_material"
+  ];
+
+  meta = with lib; {
+    description = "Material inspired stylesheet for PySide2, PySide6, PyQt5 and PyQt6";
+    homepage = "https://github.com/UN-GCPDS/qt-material";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ _999eagle ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qt5reactor/default.nix b/nixpkgs/pkgs/development/python-modules/qt5reactor/default.nix
new file mode 100644
index 000000000000..e479e53dec56
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qt5reactor/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyqt5
+, twisted
+, pytest-twisted
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "qt5reactor";
+  version = "0.6.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c3470a8a25d9a339f9ca6243502a9b2277f181d772b7acbff551d5bc363b7572";
+  };
+
+  propagatedBuildInputs = [
+    pyqt5
+    twisted
+  ];
+
+  nativeCheckInputs = [
+    pytest-twisted
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "qt5reactor" ];
+
+  meta = with lib; {
+    description = "Twisted Qt Integration";
+    homepage = "https://github.com/twisted/qt5reactor";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qtawesome/default.nix b/nixpkgs/pkgs/development/python-modules/qtawesome/default.nix
new file mode 100644
index 000000000000..7b4bcb01384f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qtawesome/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyqt5
+, pytestCheckHook
+, pythonOlder
+, qtpy
+}:
+
+buildPythonPackage rec {
+  pname = "qtawesome";
+  version = "1.2.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "spyder-ide";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-cndmxdo00TLq1Cy66IFwcT5CKBavaFAfknkpLZCYvUQ=";
+  };
+
+  propagatedBuildInputs = [
+    pyqt5
+    qtpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Requires https://github.com/boylea/qtbot which is unmaintained
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "qtawesome"
+  ];
+
+  meta = with lib; {
+    description = "Iconic fonts in PyQt and PySide applications";
+    homepage = "https://github.com/spyder-ide/qtawesome";
+    changelog = "https://github.com/spyder-ide/qtawesome/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+    platforms = platforms.linux; # fails on Darwin
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qtconsole/default.nix b/nixpkgs/pkgs/development/python-modules/qtconsole/default.nix
new file mode 100644
index 000000000000..a49b63eaeb15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qtconsole/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ipykernel
+, jupyter-core
+, jupyter-client
+, ipython-genutils
+, pygments
+, pyqt5
+, pytestCheckHook
+, pythonOlder
+, pyzmq
+, qtpy
+, traitlets
+}:
+
+buildPythonPackage rec {
+  pname = "qtconsole";
+  version = "5.4.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-t/+1PXTyPO4p9M21Xdb6vI7DEtlPPEa6OOHd5FhpPfs=";
+  };
+
+  propagatedBuildInputs = [
+    ipykernel
+    ipython-genutils
+    jupyter-core
+    jupyter-client
+    pygments
+    pyqt5
+    pyzmq
+    qtpy
+    traitlets
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # : cannot connect to X server
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "qtconsole"
+  ];
+
+  meta = with lib; {
+    description = "Jupyter Qt console";
+    homepage = "https://qtconsole.readthedocs.io/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fridh ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qtile-extras/default.nix b/nixpkgs/pkgs/development/python-modules/qtile-extras/default.nix
new file mode 100644
index 000000000000..9555ef07c36a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qtile-extras/default.nix
@@ -0,0 +1,107 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, pytestCheckHook
+, xorgserver
+, imagemagick
+, pulseaudio
+, pytest-asyncio
+, pytest-lazy-fixture
+, qtile
+, keyring
+, requests
+, stravalib
+}:
+
+buildPythonPackage rec {
+  pname = "qtile-extras";
+  version = "0.23.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "elParaguayo";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-WI1z8vrbZiJw6fDHK27mKA+1FyZEQTMttIDNzSIX+PU=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    xorgserver
+    imagemagick
+  ];
+  checkInputs = [
+    pytest-asyncio
+    pytest-lazy-fixture
+    qtile
+    pulseaudio
+    keyring
+    requests
+    stravalib
+  ];
+  disabledTests = [
+    # AttributeError: 'ImgMask' object has no attribute '_default_size'. Did you mean: 'default_size'?
+    # cairocffi.pixbuf.ImageLoadingError: Pixbuf error: Unrecognized image file format
+    "test_draw"
+    "test_icons"
+    "1-x11-GithubNotifications-kwargs3"
+    "1-x11-SnapCast-kwargs8"
+    "1-x11-TVHWidget-kwargs10"
+    "test_tvh_widget_not_recording"
+    "test_tvh_widget_recording"
+    "test_tvh_widget_popup"
+    "test_snapcast_options"
+    "test_snapcast_icon"
+    "test_snapcast_icon_colour"
+    "test_snapcast_http_error"
+    "test_syncthing_not_syncing"
+    "test_syncthing_is_syncing"
+    "test_syncthing_http_error"
+    "test_githubnotifications_colours"
+    "test_githubnotifications_logging"
+    "test_githubnotifications_icon"
+    "test_githubnotifications_reload_token"
+    "test_image_size_horizontal"
+    "test_image_size_vertical"
+    "test_image_size_mask"
+    # ValueError: Namespace Gdk not available
+    # AssertionError: Window never appeared...
+    "test_statusnotifier_menu"
+    # AttributeError: 'str' object has no attribute 'canonical'
+    "test_strava_widget_display"
+    "test_strava_widget_popup"
+    # Needs a running DBUS
+    "test_brightness_power_saving"
+    "test_upower_all_batteries"
+    "test_upower_named_battery"
+    "test_upower_low_battery"
+    "test_upower_critical_battery"
+    "test_upower_charging"
+    "test_upower_show_text"
+    "test_global_menu"
+    "test_mpris2_popup"
+    # No network connection
+    "test_wifiicon_internet_check"
+    # AssertionErrors
+    "test_widget_init_config"
+    "test_decoration_output"
+  ];
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  pythonImportsCheck = [ "qtile_extras" ];
+
+  meta = with lib; {
+    description = "Extra modules and widgets for the Qtile tiling window manager";
+    homepage = "https://github.com/elParaguayo/qtile-extras";
+    changelog = "https://github.com/elParaguayo/qtile-extras/blob/${src.rev}/CHANGELOG";
+    license = licenses.mit;
+    maintainers = with maintainers; [ arjan-s ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qtile/default.nix b/nixpkgs/pkgs/development/python-modules/qtile/default.nix
new file mode 100644
index 000000000000..7e6d4a826eeb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qtile/default.nix
@@ -0,0 +1,102 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cairocffi
+, dbus-next
+, dbus-python
+, glib
+, iwlib
+, libdrm
+, libinput
+, libxkbcommon
+, mpd2
+, pango
+, pixman
+, pkg-config
+, psutil
+, pulsectl-asyncio
+, pygobject3
+, python-dateutil
+, pywayland
+, pywlroots
+, pyxdg
+, setuptools
+, setuptools-scm
+, wayland
+, wlroots
+, xcbutilcursor
+, xcbutilwm
+, xcffib
+, xkbcommon
+}:
+
+buildPythonPackage rec {
+  pname = "qtile";
+  version = "0.23.0";
+
+  src = fetchFromGitHub {
+    owner = "qtile";
+    repo = "qtile";
+    rev = "v${version}";
+    hash = "sha256-WxnpkKqYGGEsFTt/1iCSiCzdESJP6HFJ6BztaMsMbYo=";
+  };
+
+  patches = [
+    ./fix-restart.patch # https://github.com/NixOS/nixpkgs/issues/139568
+  ];
+
+  postPatch = ''
+    substituteInPlace libqtile/pangocffi.py \
+      --replace libgobject-2.0.so.0 ${glib.out}/lib/libgobject-2.0.so.0 \
+      --replace libpangocairo-1.0.so.0 ${pango.out}/lib/libpangocairo-1.0.so.0 \
+      --replace libpango-1.0.so.0 ${pango.out}/lib/libpango-1.0.so.0
+    substituteInPlace libqtile/backend/x11/xcursors.py \
+      --replace libxcb-cursor.so.0 ${xcbutilcursor.out}/lib/libxcb-cursor.so.0
+    substituteInPlace libqtile/backend/wayland/cffi/build.py \
+        --replace /usr/include/pixman-1 ${lib.getDev pixman}/include \
+        --replace /usr/include/libdrm ${lib.getDev libdrm}/include/libdrm
+  '';
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    pkg-config
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    (cairocffi.override { withXcffib = true; })
+    dbus-next
+    dbus-python
+    iwlib
+    mpd2
+    psutil
+    pulsectl-asyncio
+    pygobject3
+    python-dateutil
+    pywayland
+    pywlroots
+    pyxdg
+    xcffib
+    xkbcommon
+  ];
+
+  buildInputs = [
+    libinput
+    libxkbcommon
+    wayland
+    wlroots
+    xcbutilwm
+  ];
+
+  doCheck = false; # Requires X server #TODO this can be worked out with the existing NixOS testing infrastructure.
+
+  meta = with lib; {
+    homepage = "http://www.qtile.org/";
+    license = licenses.mit;
+    description = "A small, flexible, scriptable tiling window manager written in Python";
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ kamilchm arjan-s ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qtile/fix-restart.patch b/nixpkgs/pkgs/development/python-modules/qtile/fix-restart.patch
new file mode 100644
index 000000000000..eca4f0866342
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qtile/fix-restart.patch
@@ -0,0 +1,22 @@
+diff --git a/libqtile/core/lifecycle.py b/libqtile/core/lifecycle.py
+index 0d4d119d..c37d1799 100644
+--- a/libqtile/core/lifecycle.py
++++ b/libqtile/core/lifecycle.py
+@@ -25,7 +25,7 @@ class LifeCycle:
+ 
+     def _atexit(self) -> None:
+         if self.behavior is Behavior.RESTART:
+-            argv = [sys.executable] + sys.argv
++            argv = sys.argv
+             if "--no-spawn" not in argv:
+                 argv.append("--no-spawn")
+             argv = [s for s in argv if not s.startswith("--with-state")]
+@@ -33,7 +33,7 @@ class LifeCycle:
+                 argv.append("--with-state=" + self.state_file)
+             logger.warning("Restarting Qtile with os.execv(...)")
+             # No other code will execute after the following line does
+-            os.execv(sys.executable, argv)
++            os.execv(sys.argv[0], argv)
+         elif self.behavior is Behavior.TERMINATE:
+             logger.warning("Qtile will now terminate")
+         elif self.behavior is Behavior.NONE:
diff --git a/nixpkgs/pkgs/development/python-modules/qtile/wrapper.nix b/nixpkgs/pkgs/development/python-modules/qtile/wrapper.nix
new file mode 100644
index 000000000000..b4f6e4c2e23b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qtile/wrapper.nix
@@ -0,0 +1,8 @@
+{ python3 }:
+
+(python3.withPackages (_: [ python3.pkgs.qtile ])).overrideAttrs (_: {
+  # restore some qtile attrs, beautify name
+  inherit (python3.pkgs.qtile) pname version meta;
+  name = with python3.pkgs.qtile; "${pname}-${version}";
+  passthru.unwrapped = python3.pkgs.qtile;
+})
diff --git a/nixpkgs/pkgs/development/python-modules/qtpy/default.nix b/nixpkgs/pkgs/development/python-modules/qtpy/default.nix
new file mode 100644
index 000000000000..e534704a7c4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qtpy/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+# propagates
+, packaging
+
+# tests
+, pyqt5
+, pyside2
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "QtPy";
+  version = "2.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2y1QgWeqYQZ4FWXI2lxvFIfeusujNRnO3DX6iZfUJNQ=";
+  };
+
+  propagatedBuildInputs = [
+    packaging
+  ];
+
+  doCheck = false; # ModuleNotFoundError: No module named 'PyQt5.QtConnectivity'
+  nativeCheckInputs = [
+    pyside2
+    (pyqt5.override {
+      withConnectivity = true;
+      withMultimedia = true;
+      withWebKit = true;
+      withWebSockets = true;
+    })
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Fatal error in python on x86_64
+    "qtpy/tests/test_uic.py"
+  ];
+
+  meta = with lib; {
+    description = "Abstraction layer for PyQt5/PyQt6/PySide2/PySide6";
+    homepage = "https://github.com/spyder-ide/qtpy";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/quadprog/default.nix b/nixpkgs/pkgs/development/python-modules/quadprog/default.nix
new file mode 100644
index 000000000000..47a3f4e1a555
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/quadprog/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, cython
+, numpy
+, pytestCheckHook
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "quadprog";
+  version = "0.1.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-/suv1KbG3HbiYqEiuCtB/ia3xbxAO5AMuWx1Svy0rMw=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  preBuild = ''
+    cython quadprog/quadprog.pyx
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    scipy
+  ];
+
+  pytestFlagsArray = [
+    # test fails on aarch64-darwin
+    "--deselect=tests/test_1.py::test_5"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/quadprog/quadprog";
+    changelog = "https://github.com/quadprog/quadprog/releases/tag/v${version}";
+    description = "Quadratic Programming Solver";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ wegank ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qualysclient/default.nix b/nixpkgs/pkgs/development/python-modules/qualysclient/default.nix
new file mode 100644
index 000000000000..be16a8c48cc5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qualysclient/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, certifi
+, charset-normalizer
+, fetchFromGitHub
+, idna
+, lxml
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, requests
+, responses
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "qualysclient";
+  version = "0.0.4.8.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "woodtechie1428";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+SZICysgSC4XeXC9CCl6Yxb47V9c1eMp7KcpH8J7kK0=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "version=__version__," 'version="${version}",'
+  '';
+
+  propagatedBuildInputs = [
+    certifi
+    charset-normalizer
+    idna
+    lxml
+    requests
+    urllib3
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "qualysclient"
+  ];
+
+  meta = with lib; {
+    description = "Python SDK for interacting with the Qualys API";
+    homepage = "https://qualysclient.readthedocs.io/";
+    changelog = "https://github.com/woodtechie1428/qualysclient/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/quamash/default.nix b/nixpkgs/pkgs/development/python-modules/quamash/default.nix
new file mode 100644
index 000000000000..bca7c8dc7d63
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/quamash/default.nix
@@ -0,0 +1,41 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, pytest, isPy3k, pyqt5, pyqt ? pyqt5
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "quamash";
+  version = "0.6.1";
+
+  disabled = !isPy3k;
+
+  # No tests in PyPi tarball
+  src = fetchFromGitHub {
+    owner = "harvimt";
+    repo = "quamash";
+    rev = "version-${version}";
+    sha256 = "117rp9r4lz0kfz4dmmpa35hp6nhbh6b4xq0jmgvqm68g9hwdxmqa";
+  };
+
+  patches = [
+    # add 3.10 compatibility, merged remove on next update
+    (fetchpatch {
+      url = "https://github.com/harvimt/quamash/pull/126/commits/1e9047bec739dbc9d6ab337fc1a111a8b1090244.patch";
+      hash = "sha256-6gomY82AOKkrt32SEBKnRugzhnC5FAyKDs6K5xaxnRM=";
+    })
+  ];
+
+  propagatedBuildInputs = [ pyqt ];
+
+  nativeCheckInputs = [ pytest ];
+  checkPhase = ''
+     pytest -k 'test_qthreadexec.py' # the others cause the test execution to be aborted, I think because of asyncio
+  '';
+
+  meta = with lib; {
+    description = "Implementation of the PEP 3156 event-loop (asyncio) api using the Qt Event-Loop";
+    homepage = "https://github.com/harvimt/quamash";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ borisbabic ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/quandl/default.nix b/nixpkgs/pkgs/development/python-modules/quandl/default.nix
new file mode 100644
index 000000000000..85a8fdd12bcc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/quandl/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, factory-boy
+, faker
+, fetchPypi
+, httpretty
+, importlib-metadata
+, inflection
+, jsondate
+, mock
+, more-itertools
+, numpy
+, pandas
+, parameterized
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "quandl";
+  version = "3.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "Quandl";
+    hash = "sha256-bguC+8eGFhCzV3xTlyd8QiDgZe7g/tTkbNa2AhZVtkw=";
+  };
+
+  patches = [
+    ./pandas2-datetime-removal.patch
+  ];
+
+  propagatedBuildInputs = [
+    pandas
+    numpy
+    requests
+    inflection
+    python-dateutil
+    six
+    more-itertools
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    factory-boy
+    faker
+    httpretty
+    jsondate
+    mock
+    parameterized
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "quandl"
+  ];
+
+  meta = with lib; {
+    description = "Quandl Python client library";
+    homepage = "https://github.com/quandl/quandl-python";
+    changelog = "https://github.com/quandl/quandl-python/blob/master/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ilya-kolpakov ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/quandl/pandas2-datetime-removal.patch b/nixpkgs/pkgs/development/python-modules/quandl/pandas2-datetime-removal.patch
new file mode 100644
index 000000000000..6e473ad4fb3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/quandl/pandas2-datetime-removal.patch
@@ -0,0 +1,33 @@
+diff --git a/test/test_datatable_data.py b/test/test_datatable_data.py
+index ee9ac61..0266a19 100644
+--- a/test/test_datatable_data.py
++++ b/test/test_datatable_data.py
+@@ -1,3 +1,4 @@
++import datetime
+ import re
+ import unittest
+ import httpretty
+@@ -135,7 +136,7 @@ class ListDatatableDataTest(unittest.TestCase):
+         df = results.to_pandas()
+         self.assertEqual(df.index.name, 'None')
+ 
+-    # if datatable has Date field then it should be convert to pandas datetime
++    # if datatable has Date field then it should be convert to datetime
+     @parameterized.expand(['GET', 'POST'])
+     def test_pandas_dataframe_date_field_is_datetime(self, request_method):
+         if request_method == 'POST':
+@@ -143,10 +144,10 @@ class ListDatatableDataTest(unittest.TestCase):
+         datatable = Datatable('ZACKS/FC')
+         results = Data.page(datatable, params={})
+         df = results.to_pandas()
+-        self.assertIsInstance(df['per_end_date'][0], pandas.datetime)
+-        self.assertIsInstance(df['per_end_date'][1], pandas.datetime)
+-        self.assertIsInstance(df['per_end_date'][2], pandas.datetime)
+-        self.assertIsInstance(df['per_end_date'][3], pandas.datetime)
++        self.assertIsInstance(df['per_end_date'][0], datetime.datetime)
++        self.assertIsInstance(df['per_end_date'][1], datetime.datetime)
++        self.assertIsInstance(df['per_end_date'][2], datetime.datetime)
++        self.assertIsInstance(df['per_end_date'][3], datetime.datetime)
+ 
+     @parameterized.expand(['GET', 'POST'])
+     def test_to_numpy_returns_numpy_object(self, request_method):
diff --git a/nixpkgs/pkgs/development/python-modules/quantile-python/default.nix b/nixpkgs/pkgs/development/python-modules/quantile-python/default.nix
new file mode 100644
index 000000000000..98206ff8aaba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/quantile-python/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "quantile-python";
+  version = "1.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VYYp6IxJfvO5sQgTScGuamG1NZDjF3JCmP9UxnTbeWk=";
+  };
+
+  # package has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "quantile" ];
+
+  meta = with lib; {
+    description = "Python Implementation of Graham Cormode and S. Muthukrishnan's Effective Computation of Biased Quantiles over Data Streams in ICDE'05";
+    homepage = "https://github.com/matttproud/python_quantile_estimation";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/quantiphy-eval/default.nix b/nixpkgs/pkgs/development/python-modules/quantiphy-eval/default.nix
new file mode 100644
index 000000000000..92e1f94c1adc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/quantiphy-eval/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, inform
+, pythonOlder
+, sly
+}:
+
+buildPythonPackage rec {
+  pname = "quantiphy-eval";
+  version = "0.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "KenKundert";
+    repo = "quantiphy_eval";
+    rev = "v${version}";
+    hash = "sha256-7VHcuINhe17lRNkHUnZkVOEtD6mVWk5gu0NbrLZwprg=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    inform
+    sly
+  ];
+
+  # this has a circular dependency on quantiphy
+  preBuild = ''
+    sed -i '/quantiphy>/d' ./pyproject.toml
+  '';
+
+  # tests require quantiphy import
+  doCheck = false;
+
+  # Also affected by the circular dependency on quantiphy
+  # pythonImportsCheck = [
+  #   "quantiphy_eval"
+  # ];
+
+  meta = with lib; {
+    description = "QuantiPhy support for evals in-line";
+    homepage = "https://github.com/KenKundert/quantiphy_eval/";
+    changelog = "https://github.com/KenKundert/quantiphy_eval/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jpetrucciani ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/quantiphy/default.nix b/nixpkgs/pkgs/development/python-modules/quantiphy/default.nix
new file mode 100644
index 000000000000..57ac30017ce4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/quantiphy/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, pytestCheckHook
+, pythonOlder
+, inform
+, parametrize-from-file
+, setuptools
+, voluptuous
+, quantiphy-eval
+, rkm-codes
+}:
+
+buildPythonPackage rec {
+  pname = "quantiphy";
+  version = "2.19";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "KenKundert";
+    repo = "quantiphy";
+    rev = "v${version}";
+    hash = "sha256-oSWq/D1EX6mxUDElfujyOSEtql0csAm72u2B5RuQddE=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    quantiphy-eval
+    rkm-codes
+  ];
+
+  nativeCheckInputs = [
+    inform
+    parametrize-from-file
+    pytestCheckHook
+    setuptools
+    voluptuous
+  ];
+
+  pythonImportsCheck = [
+    "quantiphy"
+  ];
+
+  meta = with lib; {
+    description = "Module for physical quantities (numbers with units)";
+    homepage = "https://quantiphy.readthedocs.io";
+    changelog = "https://github.com/KenKundert/quantiphy/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jpetrucciani ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/quantities/default.nix b/nixpkgs/pkgs/development/python-modules/quantities/default.nix
new file mode 100644
index 000000000000..937d03125353
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/quantities/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "quantities";
+  version = "0.14.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7+r//AwDZPiRqTJyOc0SSWvMtVzQN6bRv0TecG9yKHc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # test fails with numpy 1.24
+    "test_mul"
+  ];
+
+  pythonImportsCheck = [
+    "quantities"
+  ];
+
+  meta = with lib; {
+    description = "Quantities is designed to handle arithmetic and conversions of physical quantities";
+    homepage = "https://python-quantities.readthedocs.io/";
+    changelog = "https://github.com/python-quantities/python-quantities/blob/v${version}/CHANGES.txt";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/quantulum3/default.nix b/nixpkgs/pkgs/development/python-modules/quantulum3/default.nix
new file mode 100644
index 000000000000..259871b4ef0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/quantulum3/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, pythonAtLeast
+, fetchFromGitHub
+  # build inputs
+, inflect
+, num2words
+, numpy
+, scipy
+, scikit-learn
+, joblib
+, wikipedia
+, stemming
+, setuptools
+}:
+let
+  pname = "quantulum3";
+  version = "0.9.0";
+in
+buildPythonPackage {
+  inherit version pname;
+  format = "pyproject";
+
+  # Pypi source package doesn't contain tests
+  src = fetchFromGitHub {
+    owner = "nielstron";
+    repo = pname;
+    rev = "9dafd76d3586aa5ea1b96164d86c73037e827294";
+    hash = "sha256-fHztPeTbMp1aYsj+STYWzHgwdY0Q9078qXpXxtA8pPs=";
+  };
+
+  disabled = pythonOlder "3.7";
+
+  propagatedBuildInputs = [
+    inflect
+    num2words
+    numpy
+    scipy
+    scikit-learn
+    joblib
+    wikipedia
+    stemming
+    setuptools
+  ];
+
+  pythonImportsCheck = [ "quantulum3" ];
+
+  meta = with lib; {
+    description = "Library for unit extraction - fork of quantulum for python3";
+    homepage = "https://github.com/nielstron/quantulum3";
+    license = licenses.mit;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/quantum-gateway/default.nix b/nixpkgs/pkgs/development/python-modules/quantum-gateway/default.nix
new file mode 100644
index 000000000000..43c9c8dcb2d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/quantum-gateway/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, esprima
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+, setuptools-scm
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "quantum-gateway";
+  version = "0.0.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "cisasteelersfan";
+    repo = "quantum_gateway";
+    rev = version;
+    hash = "sha256-jwLfth+UaisPR0p+UHfm6qMXT2eSYWnsYEp0BqyeI9U=";
+  };
+
+  propagatedBuildInputs = [
+    urllib3
+    esprima
+    requests
+  ];
+
+  nativeCheckInputs = [
+    requests-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "quantum_gateway"
+  ];
+
+  disabledTests = [
+    # Tests require network features
+    "TestGateway3100"
+  ];
+
+  meta = with lib; {
+    description = "Python library for interacting with Verizon Fios Quantum gateway devices";
+    homepage = "https://github.com/cisasteelersfan/quantum_gateway";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/quart-cors/default.nix b/nixpkgs/pkgs/development/python-modules/quart-cors/default.nix
new file mode 100644
index 000000000000..78f3f0311f88
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/quart-cors/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build-system
+, poetry-core
+
+# propagates
+, quart
+, typing-extensions
+
+# tests
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "quart-cors";
+  version = "0.7.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pgjones";
+    repo = "quart-cors";
+    rev = "refs/tags/${version}";
+    hash = "sha256-qUzs0CTZHf3fGADBXPkd3CjZ6dnz1t3cTxflMErvz/k=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--no-cov-on-fail " ""
+  '';
+
+  propagatedBuildInputs = [
+    quart
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [
+    "quart_cors"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  meta = with lib; {
+    description = "Quart-CORS is an extension for Quart to enable and control Cross Origin Resource Sharing, CORS";
+    homepage = "https://github.com/pgjones/quart-cors/";
+    changelog = "https://github.com/pgjones/quart-cors/blob/${src.rev}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/quart/default.nix b/nixpkgs/pkgs/development/python-modules/quart/default.nix
new file mode 100644
index 000000000000..6cf51d6920ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/quart/default.nix
@@ -0,0 +1,90 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, poetry-core
+
+# propagates
+, aiofiles
+, blinker
+, click
+, hypercorn
+, importlib-metadata
+, itsdangerous
+, jinja2
+, markupsafe
+, pydata-sphinx-theme
+, python-dotenv
+, typing-extensions
+, werkzeug
+
+# tests
+, hypothesis
+, mock
+, py
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "quart";
+  version = "0.18.4";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pallets";
+    repo = "quart";
+    rev = "refs/tags/${version}";
+    hash = "sha256-iT/pePUtH1hwNIOG8Y/YbqCVseNXVOKC0nrXfB2RTlQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--no-cov-on-fail " ""
+  '';
+
+  propagatedBuildInputs = [
+    aiofiles
+    blinker
+    click
+    hypercorn
+    importlib-metadata
+    itsdangerous
+    jinja2
+    markupsafe
+    pydata-sphinx-theme
+    python-dotenv
+    typing-extensions
+    werkzeug
+  ];
+
+  pythonImportsCheck = [
+    "quart"
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    mock
+    py
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # remove after 0.18.4
+    "tests/test_signals.py"
+  ];
+
+  meta = with lib; {
+    description = "An async Python micro framework for building web applications";
+    homepage = "https://github.com/pallets/quart/";
+    changelog = "https://github.com/pallets/quart/blob/${src.rev}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/quaternion/default.nix b/nixpkgs/pkgs/development/python-modules/quaternion/default.nix
new file mode 100644
index 000000000000..ad53a085d327
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/quaternion/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, oldest-supported-numpy
+, scipy
+, numba
+}:
+
+buildPythonPackage rec {
+  pname = "quaternion";
+  version = "2022.4.3";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "moble";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-iLjVQ6eGwpLQXi8Sr5ShJdXMqYNclGEuq/oxR4ExDLA=";
+  };
+
+  propagatedBuildInputs = [
+    oldest-supported-numpy
+    numba
+    scipy
+  ];
+
+  meta = with lib; {
+    description = "A package add built-in support for quaternions to numpy";
+    homepage = "https://github.com/moble/quaternion";
+    license = licenses.mit;
+    maintainers = [ maintainers.ocfox ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qudida/default.nix b/nixpkgs/pkgs/development/python-modules/qudida/default.nix
new file mode 100644
index 000000000000..48d83c4d14ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qudida/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, opencv4
+, pythonOlder
+, pythonRelaxDepsHook
+, scikit-learn
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "qudida";
+  version = "0.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2xmOKIerDJqgAj5WWvv/Qd+3azYfhf1eE/eA11uhjMg=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  pythonRemoveDeps = [
+    "opencv-python"
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    opencv4
+    scikit-learn
+    typing-extensions
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "qudida" ];
+
+  meta = with lib; {
+    description = "QUick and DIrty Domain Adaptation";
+    homepage = "https://github.com/arsenyinfo/qudida";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/querystring-parser/default.nix b/nixpkgs/pkgs/development/python-modules/querystring-parser/default.nix
new file mode 100644
index 000000000000..6288d196bb4e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/querystring-parser/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, python, isPy27
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "querystring_parser";
+  version = "1.2.4";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "644fce1cffe0530453b43a83a38094dbe422ccba8c9b2f2a1c00280e14ca8a62";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  checkPhase = "${python.interpreter} querystring_parser/tests.py -k 'not test_parse_normalized'";
+  # one test fails due to https://github.com/bernii/querystring-parser/issues/35
+  doCheck = true;
+
+  meta = with lib; {
+    homepage = "https://github.com/bernii/querystring-parser";
+    description = "QueryString parser for Python/Django that correctly handles nested dictionaries";
+    license = licenses.mit;
+    maintainers = with maintainers; [ tbenst ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/questionary/default.nix b/nixpkgs/pkgs/development/python-modules/questionary/default.nix
new file mode 100644
index 000000000000..6f9b0488c5d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/questionary/default.nix
@@ -0,0 +1,57 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, prompt-toolkit
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "questionary";
+  version = "2.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "tmbo";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-JY0kXomgiGtOrsXfRf0756dTPVgud91teh+jW+kFNdk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    prompt-toolkit
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = lib.optionalString stdenv.isDarwin ''
+    ulimit -n 1024
+  '';
+
+  disabledTests = [
+    # RuntimeError: no running event loop
+    "test_blank_line_fix"
+  ];
+
+  pythonImportsCheck = [
+    "questionary"
+  ];
+
+  meta = with lib; {
+    description = "Python library to build command line user prompts";
+    homepage = "https://github.com/tmbo/questionary";
+    changelog = "https://github.com/tmbo/questionary/blob/${src.rev}/docs/pages/changelog.rst";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/queuelib/default.nix b/nixpkgs/pkgs/development/python-modules/queuelib/default.nix
new file mode 100644
index 000000000000..71e09ef98ed5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/queuelib/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "queuelib";
+  version = "1.6.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4b207267f2642a8699a1f806045c56eb7ad1a85a10c0e249884580d139c2fcd2";
+  };
+
+  buildInputs = [ pytest ];
+
+  meta = with lib; {
+    description = "A collection of persistent (disk-based) queues for Python";
+    homepage = "https://github.com/scrapy/queuelib";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/qutip/default.nix b/nixpkgs/pkgs/development/python-modules/qutip/default.nix
new file mode 100644
index 000000000000..0b58eafa398d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/qutip/default.nix
@@ -0,0 +1,94 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cvxopt
+, cvxpy
+, cython
+, fetchFromGitHub
+, ipython
+, matplotlib
+, numpy
+, packaging
+, pytest-rerunfailures
+, pytestCheckHook
+, python
+, pythonOlder
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "qutip";
+  version = "4.7.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-cpzUHjZBpAbNEnYRuY1wUZouAEAgBaN9rWdxRSfI3bs=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    packaging
+    scipy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-rerunfailures
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  # Disabling OpenMP support on Darwin.
+  setupPyGlobalFlags = lib.optionals (!stdenv.isDarwin) [
+    "--with-openmp"
+  ];
+
+  # QuTiP tries to access the home directory to create an rc file for us.
+  # We need to go to another directory to run the tests from there.
+  # This is due to the Cython-compiled modules not being in the correct location
+  # of the source tree.
+  preCheck = ''
+    export HOME=$(mktemp -d);
+    export OMP_NUM_THREADS=$NIX_BUILD_CORES
+    mkdir -p test && cd test
+  '';
+
+  # For running tests, see https://qutip.org/docs/latest/installation.html#verifying-the-installation
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -c "import qutip.testing; qutip.testing.run()"
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "qutip"
+  ];
+
+  passthru.optional-dependencies = {
+    graphics = [
+      matplotlib
+    ];
+    ipython = [
+      ipython
+    ];
+    semidefinite = [
+      cvxpy
+      cvxopt
+    ];
+  };
+
+  meta = with lib; {
+    description = "Open-source software for simulating the dynamics of closed and open quantum systems";
+    homepage = "https://qutip.org/";
+    changelog = "https://github.com/qutip/qutip/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fabiangd ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/r2pipe/default.nix b/nixpkgs/pkgs/development/python-modules/r2pipe/default.nix
new file mode 100644
index 000000000000..ad258fc123ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/r2pipe/default.nix
@@ -0,0 +1,54 @@
+{ stdenv
+, lib
+, python
+, buildPythonPackage
+, fetchPypi
+, radare2
+, coreutils
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "r2pipe";
+  version = "1.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  postPatch = let
+    r2lib = "${lib.getOutput "lib" radare2}/lib";
+    libr_core = "${r2lib}/libr_core${stdenv.hostPlatform.extensions.sharedLibrary}";
+  in
+  ''
+    # Fix find_library, can be removed after
+    # https://github.com/NixOS/nixpkgs/issues/7307 is resolved.
+    substituteInPlace r2pipe/native.py --replace 'find_library("r_core")' "'${libr_core}'"
+
+    # Fix the default r2 executable
+    substituteInPlace r2pipe/open_sync.py --replace 'r2e = "radare2"' "r2e = '${radare2}/bin/radare2'"
+    substituteInPlace r2pipe/open_base.py --replace 'which("radare2")' "'${radare2}/bin/radare2'"
+  '';
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-T1w4QG0KBPBekETd+nMNbvPF2mgBZgQ/jhWcP9694mg=";
+  };
+
+  # Tiny sanity check to make sure r2pipe finds radare2 (since r2pipe doesn't
+  # provide its own tests):
+  # Analyze ls with the fastest analysis and do nothing with the result.
+  postCheck = ''
+    ${python.interpreter} <<EOF
+    import r2pipe
+    r2 = r2pipe.open('${coreutils}/bin/ls')
+    r2.cmd('a')
+    EOF
+  '';
+
+  meta = with lib; {
+    description = "Interact with radare2";
+    homepage = "https://github.com/radare/radare2-r2pipe";
+    license = licenses.mit;
+    maintainers = with maintainers; [ timokau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rachiopy/default.nix b/nixpkgs/pkgs/development/python-modules/rachiopy/default.nix
new file mode 100644
index 000000000000..ccd1f9aef64d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rachiopy/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, requests
+, buildPythonPackage
+, fetchFromGitHub
+, jsonschema
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "rachiopy";
+  version = "1.0.3";
+
+  src = fetchFromGitHub {
+    owner = "rfverbruggen";
+    repo = pname;
+    rev = version;
+    sha256 = "1d5v9qc7ymzns3ivc5fzwxnxz9sjkhklh57cw05va95mpk5kdskc";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  nativeCheckInputs = [
+    jsonschema
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "rachiopy" ];
+
+  meta = with lib; {
+    description = "Python client for Rachio Irrigation controller";
+    homepage = "https://github.com/rfverbruggen/rachiopy";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/radian/default.nix b/nixpkgs/pkgs/development/python-modules/radian/default.nix
new file mode 100644
index 000000000000..a1b0a4309554
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/radian/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pyte
+, pexpect
+, ptyprocess
+, jedi
+, git
+, lineedit
+, prompt-toolkit
+, pygments
+, rchitect
+, R
+, rPackages
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "radian";
+  version = "0.6.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "randy3k";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-zI6oUHO4rY/BbbHhvzSNIKCpTDRm0cK46rIKN/ISgY0=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner"' ""
+  '';
+
+  nativeBuildInputs = [
+    R # needed at setup time to detect R_HOME
+  ];
+
+  propagatedBuildInputs = [
+    lineedit
+    prompt-toolkit
+    pygments
+    rchitect
+  ] ++ (with rPackages; [
+    reticulate
+    askpass
+  ]);
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pyte
+    pexpect
+    ptyprocess
+    jedi
+    git
+  ];
+
+  makeWrapperArgs = [ "--set R_HOME ${R}/lib/R" ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${R}/lib/R/lib
+  '';
+
+  pythonImportsCheck = [ "radian" ];
+
+  meta = with lib; {
+    description = "A 21 century R console";
+    homepage = "https://github.com/randy3k/radian";
+    changelog = "https://github.com/randy3k/radian/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ savyajha ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/radicale_infcloud/default.nix b/nixpkgs/pkgs/development/python-modules/radicale_infcloud/default.nix
new file mode 100644
index 000000000000..e862c70c1223
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/radicale_infcloud/default.nix
@@ -0,0 +1,27 @@
+{ lib, fetchFromGitHub, buildPythonPackage, radicale }:
+
+buildPythonPackage {
+  pname = "radicale_infcloud";
+  version = "unstable-2022-04-18";
+
+  src = fetchFromGitHub {
+    owner = "Unrud";
+    repo = "RadicaleInfCloud";
+    rev = "53d3a95af5b58cfa3242cef645f8d40c731a7d95";
+    hash = "sha256-xzBWIx2OOkCtBjlff1Z0VqgMhxWtgiOKutXUadT3tIo=";
+  };
+
+  propagatedBuildInputs = [ radicale ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "radicale" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Unrud/RadicaleInfCloud/";
+    description = "Integrate InfCloud into Radicale's web interface";
+    license = with licenses; [ agpl3 gpl3 ];
+    maintainers = with maintainers; [ erictapen ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/radio-beam/default.nix b/nixpkgs/pkgs/development/python-modules/radio-beam/default.nix
new file mode 100644
index 000000000000..41653caaa3e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/radio-beam/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, setuptools-scm
+, astropy
+, numpy
+, matplotlib
+, scipy
+, six
+, pytestCheckHook
+, pytest-astropy
+}:
+
+buildPythonPackage rec {
+  pname = "radio-beam";
+  version = "0.3.6";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-U+IjOTt7x9uzUl7IcQRu2s+MBKF/OR+sLddvHmp9hqU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    astropy
+    numpy
+    scipy
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    matplotlib
+    pytest-astropy
+  ];
+
+  pythonImportsCheck = [
+    "radio_beam"
+  ];
+
+  meta = with lib; {
+    description = "Tools for Beam IO and Manipulation";
+    homepage = "http://radio-astro-tools.github.io";
+    changelog = "https://github.com/radio-astro-tools/radio-beam/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ smaret ];
+  };
+}
+
+
diff --git a/nixpkgs/pkgs/development/python-modules/radios/default.nix b/nixpkgs/pkgs/development/python-modules/radios/default.nix
new file mode 100644
index 000000000000..73630f59fd3a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/radios/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, aiodns
+, aiohttp
+, awesomeversion
+, backoff
+, cachetools
+, mashumaro
+, orjson
+, pycountry
+, yarl
+, aresponses
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "radios";
+  version = "0.3.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.11";
+
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-radios";
+    rev = "v${version}";
+    hash = "sha256-bzo+SA8kqc2GcxSV0TiIJyPVG+JshdsMoXSUhZYSphU=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "0.0.0" "${version}" \
+      --replace "--cov" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiodns
+    aiohttp
+    awesomeversion
+    backoff
+    cachetools
+    mashumaro
+    orjson
+    pycountry
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "radios" ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Asynchronous Python client for the Radio Browser API";
+    homepage = "https://github.com/frenck/python-radios";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/radiotherm/default.nix b/nixpkgs/pkgs/development/python-modules/radiotherm/default.nix
new file mode 100644
index 000000000000..e7cd4fb1f854
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/radiotherm/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "radiotherm";
+  version = "2.1.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "mhrivnak";
+    repo = pname;
+    rev = version;
+    sha256 = "0p37pc7l2malmjfkdlh4q2cfa6dqpsk1rah2j2xil0pj57ai6bks";
+  };
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "radiotherm" ];
+
+  meta = with lib; {
+    description = "Python library for Wifi Radiothermostat";
+    homepage = "https://github.com/mhrivnak/radiotherm";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/radish-bdd/default.nix b/nixpkgs/pkgs/development/python-modules/radish-bdd/default.nix
new file mode 100644
index 000000000000..f0f9070180ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/radish-bdd/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, click
+, colorful
+, docopt
+, fetchFromGitHub
+, freezegun
+, humanize
+, lark
+, lxml
+, parse-type
+, pysingleton
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, tag-expressions
+}:
+
+buildPythonPackage rec {
+  pname = "radish-bdd";
+  version = "0.17.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = "radish";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-9Wt+W7PWUVijzAeZMvcOl/Na60OCCGJJqxh2UaAxAcM=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    colorful
+    docopt
+    humanize
+    lark
+    lxml
+    parse-type
+    pysingleton
+    tag-expressions
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    pytest-mock
+    pytestCheckHook
+    pyyaml
+  ];
+
+  pythonImportsCheck = [
+    "radish"
+  ];
+
+  disabledTests = [
+    "test_main_cli_calls"
+  ];
+
+  meta = with lib; {
+    description = "Behaviour-Driven-Development tool for python";
+    homepage = "https://radish-bdd.github.io/";
+    changelog = "https://github.com/radish-bdd/radish/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kalbasit ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/radon/default.nix b/nixpkgs/pkgs/development/python-modules/radon/default.nix
new file mode 100644
index 000000000000..23f1a9427b56
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/radon/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, fetchpatch
+# Python deps
+, mando
+, colorama
+, pytest-mock
+, tomli
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "radon";
+  version = "6.0.1";
+
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "rubik";
+    repo = "radon";
+    rev = "v${version}";
+    hash = "sha256-yY+j9kuX0ou/uDoVI/Qfqsmq0vNHv735k+vRl22LwwY=";
+  };
+
+  patches = [
+    # NOTE: Remove after next release
+    (fetchpatch {
+      url = "https://github.com/rubik/radon/commit/ce5d2daa0a9e0e843059d6f57a8124c64a87a6dc.patch";
+      hash = "sha256-WwcfR2ZEWeRiMKdMZAwtZRBcWOqoqpaVTmVo0k+Tn74=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+  ];
+
+  propagatedBuildInputs = [
+    mando
+    colorama
+  ];
+
+  passthru.optional-dependencies = {
+    toml = [
+      tomli
+    ];
+  };
+
+  pythonImportsCheck = [
+    "radon"
+  ];
+
+  meta = with lib; {
+    description = "Various code metrics for Python code";
+    homepage = "https://radon.readthedocs.org";
+    changelog = "https://github.com/rubik/radon/blob/v${version}/CHANGELOG";
+    license = licenses.mit;
+    maintainers = with maintainers; [ t4ccer ];
+    mainProgram = "radon";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/railroad-diagrams/default.nix b/nixpkgs/pkgs/development/python-modules/railroad-diagrams/default.nix
new file mode 100644
index 000000000000..e720c180014b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/railroad-diagrams/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "railroad-diagrams";
+  version = "3.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-qRMyuskAyzw2czH6m2mfCJe8+GtyZPZUWGdd9DDQTOM=";
+  };
+
+  # This is a dependency of pyparsing, which is a dependency of pytest
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "railroad"
+  ];
+
+  meta = with lib; {
+    description = "Module to generate SVG railroad syntax diagrams";
+    homepage = "https://github.com/tabatkins/railroad-diagrams";
+    license = licenses.cc0;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rainbowstream/default.nix b/nixpkgs/pkgs/development/python-modules/rainbowstream/default.nix
new file mode 100644
index 000000000000..a210429e9850
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rainbowstream/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, arrow
+, buildPythonPackage
+, fetchFromGitHub
+, freetype
+, glibcLocales
+, libjpeg
+, pillow
+, pocket
+, pyfiglet
+, pysocks
+, python
+, python-dateutil
+, requests
+, twitter
+, zlib
+}:
+
+buildPythonPackage rec {
+  pname = "rainbowstream";
+  version = "1.5.5";
+
+  src = fetchFromGitHub {
+    owner = "orakaro";
+    repo = pname;
+    # Request for tagging, https://github.com/orakaro/rainbowstream/issues/314
+    rev = "96141fac10675e0775d703f65a59c4477a48c57e";
+    sha256 = "0j0qcc428lk9b3l0cr2j418gd6wd5k4160ham2zn2mmdmxn5bldg";
+  };
+
+  buildInputs = [
+    freetype
+    glibcLocales
+    libjpeg
+    zlib
+  ];
+
+  propagatedBuildInputs = [
+    arrow
+    pillow
+    pocket
+    pyfiglet
+    pysocks
+    python-dateutil
+    requests
+    twitter
+  ];
+
+  patches = [ ./image.patch ];
+
+  postPatch = ''
+    clib=$out/${python.sitePackages}/rainbowstream/image.so
+    substituteInPlace rainbowstream/c_image.py \
+      --replace @CLIB@ $clib
+    sed -i 's/requests.*"/requests"/' setup.py
+  '';
+
+  LC_ALL = "en_US.UTF-8";
+
+  postInstall = ''
+    mkdir -p $out/lib
+    cc -fPIC -shared -o $clib rainbowstream/image.c
+    for prog in "$out/bin/"*; do
+      wrapProgram "$prog" \
+        --prefix PYTHONPATH : "$PYTHONPATH"
+    done
+  '';
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "rainbowstream" ];
+
+  meta = with lib; {
+    description = "Streaming command-line twitter client";
+    homepage = "https://github.com/orakaro/rainbowstream";
+    license = licenses.mit;
+    maintainers = with maintainers; [ thoughtpolice ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rainbowstream/image.patch b/nixpkgs/pkgs/development/python-modules/rainbowstream/image.patch
new file mode 100644
index 000000000000..215152ae4fb1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rainbowstream/image.patch
@@ -0,0 +1,18 @@
+diff --git a/rainbowstream/c_image.py b/rainbowstream/c_image.py
+index f050150..a0fb77d 100644
+--- a/rainbowstream/c_image.py
++++ b/rainbowstream/c_image.py
+@@ -12,11 +12,7 @@ def call_c():
+     """
+     Call the C program for converting RGB to Ansi colors
+     """
+-    library = expanduser('~/.image.so')
+-    sauce = join(dirname(__file__), 'image.c')
+-    if not exists(library) or getmtime(sauce) > getmtime(library):
+-        build = "cc -fPIC -shared -o %s %s" % (library, sauce)
+-        os.system(build + " >/dev/null 2>&1")
++    library = '@CLIB@'
+     image_c = ctypes.cdll.LoadLibrary(library)
+     image_c.init()
+     return image_c.rgb_to_ansi
+
diff --git a/nixpkgs/pkgs/development/python-modules/raincloudy/default.nix b/nixpkgs/pkgs/development/python-modules/raincloudy/default.nix
new file mode 100644
index 000000000000..6a223bb4fb76
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/raincloudy/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, aiohttp
+, aioresponses
+, beautifulsoup4
+, buildPythonPackage
+, fetchFromGitHub
+, html5lib
+, pytest-asyncio
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+, setuptools
+, setuptools-scm
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "raincloudy";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "vanstinator";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-qCkBVirM09iA1sXiOB9FJns8bHjQq7rRk8XbRWrtBDI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  postPatch = ''
+    # https://github.com/vanstinator/raincloudy/pull/60
+    substituteInPlace setup.py \
+      --replace "bs4" "beautifulsoup4" \
+
+    # fix raincloudy.aio package discovery, by relying on
+    # autodiscovery instead.
+    sed -i '/packages=/d' setup.py
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+    requests
+    beautifulsoup4
+    urllib3
+    html5lib
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytest-asyncio
+    pytest-aiohttp
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pythonImportsCheck = [
+    "raincloudy"
+    "raincloudy.aio"
+  ];
+
+  disabledTests = [
+    # Test requires network access
+    "test_attributes"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with Melnor RainCloud Smart Garden Watering Irrigation Timer";
+    homepage = "https://github.com/vanstinator/raincloudy";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ramlfications/default.nix b/nixpkgs/pkgs/development/python-modules/ramlfications/default.nix
new file mode 100644
index 000000000000..081a3a285718
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ramlfications/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi
+, mock, pytest, pytest-mock, pytest-server-fixtures, pytest-localserver
+, termcolor, click, markdown2, six, jsonref, pyyaml, xmltodict, attrs
+}:
+
+buildPythonPackage rec {
+  pname = "ramlfications";
+  version = "0.1.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0xvnna7kaq4nm5nfnwcwbr5bcm2s532hgyp7kq4v9iivn48rrf3v";
+  };
+
+  meta = with lib; {
+    description = "A Python RAML parser.";
+    homepage    = "https://ramlfications.readthedocs.org";
+    license     = licenses.asl20;
+    maintainers = with maintainers; [ ];
+    platforms   = platforms.all;
+  };
+
+  doCheck = false;
+  # [darwin]  AssertionError: Expected 'update_mime_types' to have been called once. Called 0 times.
+
+  buildInputs = [ mock pytest pytest-mock pytest-server-fixtures pytest-localserver ];
+
+  propagatedBuildInputs = [ termcolor click markdown2 six jsonref pyyaml xmltodict attrs ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/random2/default.nix b/nixpkgs/pkgs/development/python-modules/random2/default.nix
new file mode 100644
index 000000000000..cb84d32ef414
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/random2/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "random2";
+  version = "1.0.1";
+  doCheck = !isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "34ad30aac341039872401595df9ab2c9dc36d0b7c077db1cea9ade430ed1c007";
+  };
+
+  patches = [
+    # Patch test suite for python >= 3.9
+    (fetchpatch {
+      url = "https://github.com/strichter/random2/pull/3/commits/1bac6355d9c65de847cc445d782c466778b94fbd.patch";
+      sha256 = "064137pg1ilv3f9r10123lqbqz45070jca8pjjyp6gpfd0yk74pi";
+    })
+  ];
+
+  meta = with lib; {
+    homepage = "http://pypi.python.org/pypi/random2";
+    description = "Python 3 compatible Python 2 `random` Module";
+    license = licenses.psfl;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/range-typed-integers/default.nix b/nixpkgs/pkgs/development/python-modules/range-typed-integers/default.nix
new file mode 100644
index 000000000000..1bb5d7b26f62
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/range-typed-integers/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "range-typed-integers";
+  version = "1.0.1";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "theCapypara";
+    repo = "range-typed-integers";
+    rev = version;
+    sha256 = "sha256-4+XdalHq6Q2cBbuYi4x7kmCNQh1MwYf+XlLP9FzzzgE=";
+  };
+
+  format = "pyproject";
+
+  nativeBuildInputs = [ setuptools ];
+
+  checkInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "A package provides integer types that have a specific range of valid values";
+    homepage = "https://github.com/theCapypara/range-typed-integers";
+    license = [ licenses.mit ];
+    maintainers = with maintainers; [ marius851000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rangehttpserver/default.nix b/nixpkgs/pkgs/development/python-modules/rangehttpserver/default.nix
new file mode 100644
index 000000000000..bab8f73b412b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rangehttpserver/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pytestCheckHook
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "rangehttpserver";
+  version = "1.3.3";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "danvk";
+    repo = "RangeHTTPServer";
+    rev = "refs/tags/${version}";
+    hash = "sha256-ZXEbis37QO8t05JQ2qQQf5rkUSxq3DwzR3khAJkZ5W0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests
+  ];
+
+  pythonImportsCheck = [
+    "RangeHTTPServer"
+  ];
+
+  meta = with lib; {
+    description = "SimpleHTTPServer with support for Range requests";
+    homepage = "https://github.com/danvk/RangeHTTPServer";
+    changelog = "https://github.com/danvk/RangeHTTPServer/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rank-bm25/default.nix b/nixpkgs/pkgs/development/python-modules/rank-bm25/default.nix
new file mode 100644
index 000000000000..9b0c5080449d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rank-bm25/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, numpy
+}:
+let
+  pname = "rank-bm25";
+  version = "0.2.2";
+in
+buildPythonPackage {
+  inherit version pname;
+  format = "setuptools";
+
+  # Pypi source package doesn't contain tests
+  src = fetchFromGitHub {
+    owner = "dorianbrown";
+    repo = pname;
+    rev = version;
+    hash = "sha256-+BxQBflMm2AvCLAFFj52Jpkqn+KErwYXU1wztintgOg=";
+  };
+
+  disabled = pythonOlder "3.7";
+
+  postPatch = ''
+    # Upstream doesn't provide a PKG-INFO file
+    substituteInPlace setup.py --replace "get_version()" "'${version}'"
+  '';
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  pythonImportsCheck = [ "rank_bm25" ];
+
+  meta = with lib; {
+    description = "A Collection of BM25 Algorithms in Python";
+    homepage = "https://github.com/dorianbrown/rank_bm25";
+    changelog = "https://github.com/dorianbrown/rank_bm25/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rapidfuzz-capi/default.nix b/nixpkgs/pkgs/development/python-modules/rapidfuzz-capi/default.nix
new file mode 100644
index 000000000000..b0235f1eda44
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rapidfuzz-capi/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "rapidfuzz-capi";
+  version = "1.0.5";
+
+  src = fetchFromGitHub {
+    owner = "maxbachmann";
+    repo = "rapidfuzz_capi";
+    rev = "v${version}";
+    hash = "sha256-0IvJl2JU/k1WbGPWRoucVGbVsEFNPHZT1ozEQAKQnPk=";
+  };
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "rapidfuzz_capi" ];
+
+  meta = with lib; {
+    description = "C-API of RapidFuzz, which can be used to extend RapidFuzz from separate packages";
+    homepage = "https://github.com/maxbachmann/rapidfuzz_capi";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rapidfuzz/default.nix b/nixpkgs/pkgs/development/python-modules/rapidfuzz/default.nix
new file mode 100644
index 000000000000..6bde7864d2af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rapidfuzz/default.nix
@@ -0,0 +1,91 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, cmake
+, cython_3
+, ninja
+, scikit-build
+, setuptools
+, numpy
+, hypothesis
+, pandas
+, pytestCheckHook
+, rapidfuzz-cpp
+, taskflow
+}:
+
+buildPythonPackage rec {
+  pname = "rapidfuzz";
+  version = "3.5.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "maxbachmann";
+    repo = "RapidFuzz";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-D7Z0xKqAJAPKSAEK+3Mpz/LaEKqKYczp+m6SqfzufwA=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    cython_3
+    ninja
+    scikit-build
+    setuptools
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  buildInputs = [
+    rapidfuzz-cpp
+    taskflow
+  ];
+
+  preBuild = ''
+    export RAPIDFUZZ_BUILD_EXTENSION=1
+  '' + lib.optionalString (stdenv.isDarwin && stdenv.isx86_64) ''
+    export CMAKE_ARGS="-DCMAKE_CXX_COMPILER_AR=$AR -DCMAKE_CXX_COMPILER_RANLIB=$RANLIB"
+  '';
+
+  env.NIX_CFLAGS_COMPILE = toString (lib.optionals (stdenv.cc.isClang && stdenv.isDarwin) [
+    "-fno-lto"  # work around https://github.com/NixOS/nixpkgs/issues/19098
+  ]);
+
+  passthru.optional-dependencies = {
+    full = [ numpy ];
+  };
+
+  preCheck = ''
+    export RAPIDFUZZ_IMPLEMENTATION=cpp
+  '';
+
+  nativeCheckInputs = [
+    hypothesis
+    pandas
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals (stdenv.isDarwin && stdenv.isx86_64) [
+    # segfaults
+    "test_cdist"
+  ];
+
+  pythonImportsCheck = [
+    "rapidfuzz.distance"
+    "rapidfuzz.fuzz"
+    "rapidfuzz.process"
+    "rapidfuzz.utils"
+  ];
+
+  meta = with lib; {
+    description = "Rapid fuzzy string matching";
+    homepage = "https://github.com/maxbachmann/RapidFuzz";
+    changelog = "https://github.com/maxbachmann/RapidFuzz/blob/${src.rev}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rapidgzip/default.nix b/nixpkgs/pkgs/development/python-modules/rapidgzip/default.nix
new file mode 100644
index 000000000000..450746876669
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rapidgzip/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, nasm
+}:
+
+buildPythonPackage rec {
+  pname = "rapidgzip";
+  version = "0.10.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-dTVQTxzgjHAUuoWA2+asMI5g2fIWvHEl46bdTIAxAvg=";
+  };
+
+  nativeBuildInputs = [ nasm ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "rapidgzip" ];
+
+  meta = with lib; {
+    description = "Python library for parallel decompression and seeking within compressed gzip files";
+    homepage = "https://github.com/mxmlnkn/rapidgzip";
+    changelog = "https://github.com/mxmlnkn/rapidgzip/blob/rapidgzip-v${version}/python/rapidgzip/CHANGELOG.md";
+    license = licenses.mit; # dual MIT and asl20, https://internals.rust-lang.org/t/rationale-of-apache-dual-licensing/8952
+    maintainers = with lib.maintainers; [ mxmlnkn ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rapt-ble/default.nix b/nixpkgs/pkgs/development/python-modules/rapt-ble/default.nix
new file mode 100644
index 000000000000..4c5df7b4b9fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rapt-ble/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, bluetooth-data-tools
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, fetchFromGitHub
+, home-assistant-bluetooth
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "rapt-ble";
+  version = "0.1.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "sairon";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ozZwVgTV/xYl1nXLiybcPs6DQKocNdbxTEYDfYyQuvY=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=rapt_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-data-tools
+    bluetooth-sensor-state-data
+    home-assistant-bluetooth
+    sensor-state-data
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "rapt_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for RAPT Pill hydrometer BLE devices";
+    homepage = "https://github.com/sairon/rapt-ble";
+    changelog = "https://github.com/sairon/rapt-ble/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rarfile/default.nix b/nixpkgs/pkgs/development/python-modules/rarfile/default.nix
new file mode 100644
index 000000000000..2f988ddace7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rarfile/default.nix
@@ -0,0 +1,42 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytestCheckHook, nose, libarchive, glibcLocales, isPy27
+# unrar is non-free software
+, useUnrar ? false, unrar
+}:
+
+assert useUnrar -> unrar != null;
+assert !useUnrar -> libarchive != null;
+
+buildPythonPackage rec {
+  pname = "rarfile";
+  version = "4.1";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "markokr";
+    repo = "rarfile";
+    rev = "v${version}";
+    sha256 = "sha256-9PT4/KgkdFhTjZIia2xiSM5VnaZ4040Ww7bG9Nr3XDU=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook nose glibcLocales ];
+
+  prePatch = ''
+    substituteInPlace rarfile.py \
+  '' + (if useUnrar then
+        ''--replace 'UNRAR_TOOL = "unrar"' "UNRAR_TOOL = \"${unrar}/bin/unrar\""
+        ''
+       else
+        ''--replace 'ALT_TOOL = "bsdtar"' "ALT_TOOL = \"${libarchive}/bin/bsdtar\""
+        '')
+     + "";
+  # the tests only work with the standard unrar package
+  doCheck = useUnrar;
+  LC_ALL = "en_US.UTF-8";
+  pythonImportsCheck = [ "rarfile" ];
+
+  meta = with lib; {
+    description = "RAR archive reader for Python";
+    homepage = "https://github.com/markokr/rarfile";
+    license = licenses.isc;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rasterio/default.nix b/nixpkgs/pkgs/development/python-modules/rasterio/default.nix
new file mode 100644
index 000000000000..0e216ce18508
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rasterio/default.nix
@@ -0,0 +1,124 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+, pythonOlder
+, stdenv
+
+, affine
+, attrs
+, boto3
+, certifi
+, click
+, click-plugins
+, cligj
+, cython_3
+, gdal
+, hypothesis
+, ipython
+, matplotlib
+, numpy
+, oldest-supported-numpy
+, packaging
+, pytest-randomly
+, setuptools
+, shapely
+, snuggs
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "rasterio";
+  version = "1.3.9";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "rasterio";
+    repo = "rasterio";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Tp6BSU33FaszrIXQgU0Asb7IMue0C939o/atAKz+3Q4=";
+  };
+
+  patches = [
+    # fix tests failing with GDAL 3.8.0
+    (fetchpatch {
+      url = "https://github.com/rasterio/rasterio/commit/54ec554a6d9ee52207ad17dee42cbc51c613f709.diff";
+      hash = "sha256-Vjt9HRYNAWyj0myMdtSUENbcLjACfzegEClzZb4BxY8=";
+    })
+    (fetchpatch {
+      url = "https://github.com/rasterio/rasterio/commit/5a72613c58d1482bf297d08cbacf27992f52b2c4.diff";
+      hash = "sha256-bV6rh3GBmeqq9+Jff2b8/1wOuyF3Iqducu2eN4CT3lM=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    cython_3
+    gdal
+    numpy
+    oldest-supported-numpy
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    affine
+    attrs
+    certifi
+    click
+    click-plugins
+    cligj
+    numpy
+    setuptools
+    snuggs
+  ];
+
+  passthru.optional-dependencies = {
+    ipython = [
+      ipython
+    ];
+    plot = [
+      matplotlib
+    ];
+    s3 = [
+      boto3
+    ];
+  };
+
+  nativeCheckInputs = [
+    boto3
+    hypothesis
+    packaging
+    pytestCheckHook
+    pytest-randomly
+    shapely
+  ];
+
+  doCheck = true;
+
+  preCheck = ''
+    rm -r rasterio # prevent importing local rasterio
+  '';
+
+  pytestFlagsArray = [
+    "-m 'not network'"
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    "test_reproject_error_propagation"
+  ];
+
+  pythonImportsCheck = [
+    "rasterio"
+  ];
+
+  meta = with lib; {
+    description = "Python package to read and write geospatial raster data";
+    homepage = "https://rasterio.readthedocs.io/";
+    changelog = "https://github.com/rasterio/rasterio/blob/${version}/CHANGES.txt";
+    license = licenses.bsd3;
+    maintainers = teams.geospatial.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ratarmount/default.nix b/nixpkgs/pkgs/development/python-modules/ratarmount/default.nix
new file mode 100644
index 000000000000..1555dfca2197
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ratarmount/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, fusepy
+, ratarmountcore
+}:
+
+buildPythonPackage rec {
+  pname = "ratarmount";
+  version = "0.14.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-P+p0h+KuOsunPsXbRwxzAhr1XcEqMjQxHeHmA29+pDQ=";
+  };
+
+  propagatedBuildInputs = [ ratarmountcore fusepy ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    python tests/tests.py
+
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Mounts archives as read-only file systems by way of indexing";
+    homepage = "https://github.com/mxmlnkn/ratarmount";
+    license = licenses.mit;
+    maintainers = with lib.maintainers; [ mxmlnkn ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ratarmountcore/default.nix b/nixpkgs/pkgs/development/python-modules/ratarmountcore/default.nix
new file mode 100644
index 000000000000..49ffdb17cfa5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ratarmountcore/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchgit
+, pythonOlder
+, pytestCheckHook
+, indexed-bzip2
+, indexed-gzip
+, indexed-zstd
+, python-xz
+, rapidgzip
+, rarfile
+, zstandard     # Python bindings
+, zstd          # System tool
+}:
+
+buildPythonPackage rec {
+  pname = "ratarmountcore";
+  version = "0.6.0";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchgit {
+    url = "https://github.com/mxmlnkn/ratarmount";
+    # The revision is hardcoded for now to fix problems with the tests, which are not worthy of a new release
+    # tag because releases do not officially contain tests. On the next release, use the commented revision,
+    # which points to a release tag, instead.
+    #rev = "core-v${version}";
+    rev = "ea43572dfbac4770a27ef2169f72ff73ee4a4ae9";
+    hash = "sha256-sPApM5OW+UbujFXHSL4ptMaegajz7FNtXz/KftTlw+U=";
+    fetchSubmodules = true;
+  };
+
+  sourceRoot = "${src.name}/core";
+
+  propagatedBuildInputs = [ indexed-gzip indexed-bzip2 indexed-zstd python-xz rapidgzip rarfile ];
+
+  pythonImportsCheck = [ "ratarmountcore" ];
+
+  nativeCheckInputs = [ pytestCheckHook zstandard zstd ];
+
+  meta = with lib; {
+    description = "Library for accessing archives by way of indexing";
+    homepage = "https://github.com/mxmlnkn/ratarmount/tree/master/core";
+    license = licenses.mit;
+    maintainers = with lib.maintainers; [ mxmlnkn ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ratelim/default.nix b/nixpkgs/pkgs/development/python-modules/ratelim/default.nix
new file mode 100644
index 000000000000..8fc3323ce1b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ratelim/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, decorator
+}:
+
+buildPythonPackage rec {
+  pname = "ratelim";
+  version = "0.1.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "07dirdd8y23706110nb0lfz5pzbrcvd9y74h64la3y8igqbk4vc2";
+  };
+
+  propagatedBuildInputs = [
+    decorator
+  ];
+
+  pythonImportsCheck = [ "ratelim" ];
+
+  # package has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/themiurgo/ratelim";
+    description = "Simple Python library that limits the number of times a function can be called during a time interval";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dgliwka ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ratelimit/default.nix b/nixpkgs/pkgs/development/python-modules/ratelimit/default.nix
new file mode 100644
index 000000000000..7a1af77df0e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ratelimit/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ratelimit";
+  version = "2.2.1";
+
+  src = fetchFromGitHub {
+    owner = "tomasbasham";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "04hy3hhh5xdqcsz0lx8j18zbj88kh5ik4wyi5d3a5sfy2hx70in2";
+  };
+
+  postPatch = ''
+    sed -i "/--cov/d" pytest.ini
+  '';
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pytestFlagsArray = [ "tests" ];
+
+  pythonImportsCheck = [ "ratelimit" ];
+
+  meta = with lib; {
+    description = "Python API Rate Limit Decorator";
+    homepage = "https://github.com/tomasbasham/ratelimit";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rauth/default.nix b/nixpkgs/pkgs/development/python-modules/rauth/default.nix
new file mode 100644
index 000000000000..059dfa9a2a60
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rauth/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, requests
+, pytestCheckHook
+, mock
+, nose
+, pycrypto
+}:
+
+buildPythonPackage rec {
+  pname = "rauth";
+  version = "0.7.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "litl";
+    repo = "rauth";
+    rev = version;
+    hash = "sha256-wRKZbxZCEfihOaJM8sk8438LE++KJWxdOGImpL1gHa4=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # https://github.com/litl/rauth/pull/211
+      name = "fix-pycrypdodome-replacement-for-pycrypto.patch";
+      url = "https://github.com/litl/rauth/commit/7fb3b7bf1a1869a52cf59ee3eb607d318e97265c.patch";
+      hash = "sha256-jiAIw+VQ2d/bkm2brqfY1RUrNGf+lsMPnoI91gGUS6o=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  pythonImportsCheck = [ "rauth" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+    nose
+    pycrypto
+  ];
+
+  meta = with lib; {
+    description = "A Python library for OAuth 1.0/a, 2.0, and Ofly";
+    homepage = "https://github.com/litl/rauth";
+    changelog = "https://github.com/litl/rauth/blob/${src.rev}/CHANGELOG";
+    license = licenses.mit;
+    maintainers = with maintainers; [ blaggacao ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/raven/default.nix b/nixpkgs/pkgs/development/python-modules/raven/default.nix
new file mode 100644
index 000000000000..cdcec2bf249d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/raven/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, blinker
+, flask
+}:
+
+buildPythonPackage rec {
+  pname = "raven";
+  version = "6.10.0";
+
+  src = fetchFromGitHub {
+    owner = "getsentry";
+    repo = "raven-python";
+    rev = version;
+    sha256 = "16x9ldl8cy7flw5kh7qmgbmflqyf210j3q6ac2lw61sgwajsnvw8";
+  };
+
+  # requires outdated dependencies which have no official support for python 3.4
+  doCheck = false;
+
+  pythonImportsCheck = [ "raven" ];
+
+  passthru.optional-dependencies = {
+    flask = [ blinker flask ];
+  };
+
+  meta = {
+    description = "Legacy Python client for Sentry (getsentry.com) — replaced by sentry-python";
+    homepage = "https://github.com/getsentry/raven-python";
+    license = [ lib.licenses.bsd3 ];
+    maintainers = with lib.maintainers; [ primeos ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rawkit/default.nix b/nixpkgs/pkgs/development/python-modules/rawkit/default.nix
new file mode 100644
index 000000000000..83252b1c3338
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rawkit/default.nix
@@ -0,0 +1,36 @@
+{ lib, fetchPypi, buildPythonPackage, fetchpatch
+, libraw
+, pytest, mock }:
+
+buildPythonPackage rec {
+  pname = "rawkit";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0vrhrpr70i61y5q5ysk341x1539ff1q1k82g59zq69lv16s0f76s";
+  };
+
+  patches = [
+    # Python 3.7 compatibility
+    (fetchpatch {
+      url = "https://github.com/photoshell/rawkit/commit/663e90afa835d398aedd782c87b8cd0bff64bc9f.patch";
+      sha256 = "1cdw0x9bgk0b5jnpjnmd8jpbaryarr3cjqizq44366qh3l0jycxy";
+    })
+  ];
+
+  buildInputs = [ libraw ];
+
+  nativeCheckInputs = [ pytest mock ];
+
+  checkPhase = ''
+    py.test tests
+  '';
+
+  meta = with lib; {
+    description = "CTypes based LibRaw bindings for Python";
+    homepage = "https://rawkit.readthedocs.org/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ray/binary-hashes.nix b/nixpkgs/pkgs/development/python-modules/ray/binary-hashes.nix
new file mode 100644
index 000000000000..a09e64923486
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ray/binary-hashes.nix
@@ -0,0 +1,11 @@
+{
+  cp39 = {
+    sha256 = "0e0f7dbeb4444940c72b64fdecd6f331593466914b2dffeed03ce97225acec14";
+  };
+  cp310 = {
+    sha256 = "b83621f5d2d4079e6ae624c3bf30046a4fefa0ea7ea5e4a4dfe4b50c580b3768";
+  };
+  cp311 = {
+    sha256 = "8384b3f30bc1446ef810e9e894afa03238c5ac40d3c40c0740d82f347112015d";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ray/default.nix b/nixpkgs/pkgs/development/python-modules/ray/default.nix
new file mode 100644
index 000000000000..6edff4847984
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ray/default.nix
@@ -0,0 +1,167 @@
+{ aiohttp
+, aiohttp-cors
+, aiorwlock
+, aiosignal
+, attrs
+, autoPatchelfHook
+, buildPythonPackage
+, fetchPypi
+, click
+, cloudpickle
+, colorama
+, colorful
+, cython
+, dm-tree
+, fastapi
+, filelock
+, frozenlist
+, fsspec
+, gpustat
+, grpcio
+, gym
+, jsonschema
+, lib
+, lz4
+, matplotlib
+, msgpack
+, numpy
+, opencensus
+, packaging
+, pandas
+, py-spy
+, prometheus-client
+, psutil
+, pyarrow
+, pydantic
+, python
+, pythonAtLeast
+, pythonOlder
+, pythonRelaxDepsHook
+, pyyaml
+, requests
+, scikit-image
+, scipy
+, setproctitle
+, smart-open
+, starlette
+, tabulate
+, tensorboardx
+, uvicorn
+, virtualenv
+}:
+
+let
+  pname = "ray";
+  version = "2.7.0";
+in
+buildPythonPackage rec {
+  inherit pname version;
+  format = "wheel";
+
+  disabled = pythonOlder "3.9" || pythonAtLeast "3.12";
+
+  src =
+    let
+      pyShortVersion = "cp${builtins.replaceStrings ["."] [""] python.pythonVersion}";
+      binary-hash = (import ./binary-hashes.nix)."${pyShortVersion}" or {};
+    in
+    fetchPypi ({
+      inherit pname version format;
+      dist = pyShortVersion;
+      python = pyShortVersion;
+      abi = pyShortVersion;
+      platform = "manylinux2014_x86_64";
+    } // binary-hash);
+
+  passthru.optional-dependencies = rec {
+    data-deps = [
+      pandas
+      pyarrow
+      fsspec
+    ];
+
+    serve-deps = [
+      aiorwlock
+      fastapi
+      pandas
+      starlette
+      uvicorn
+    ];
+
+    tune-deps = [
+      tabulate
+      tensorboardx
+    ];
+
+    rllib-deps = tune-deps ++ [
+      dm-tree
+      gym
+      lz4
+      matplotlib
+      scikit-image
+      pyyaml
+      scipy
+    ];
+
+    air-deps = data-deps ++ serve-deps ++ tune-deps ++ rllib-deps;
+  };
+
+  nativeBuildInputs = [
+    autoPatchelfHook
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    "click"
+    "grpcio"
+    "protobuf"
+    "virtualenv"
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    aiohttp
+    aiohttp-cors
+    aiosignal
+    click
+    cloudpickle
+    colorama
+    colorful
+    cython
+    filelock
+    frozenlist
+    gpustat
+    grpcio
+    jsonschema
+    msgpack
+    numpy
+    opencensus
+    packaging
+    py-spy
+    prometheus-client
+    psutil
+    pydantic
+    pyyaml
+    requests
+    setproctitle
+    smart-open
+    virtualenv
+  ];
+
+  postInstall = ''
+    chmod +x $out/${python.sitePackages}/ray/core/src/ray/{gcs/gcs_server,raylet/raylet}
+  '';
+
+  pythonImportsCheck = [
+    "ray"
+  ];
+
+  meta = with lib; {
+    description = "A unified framework for scaling AI and Python applications";
+    homepage = "https://github.com/ray-project/ray";
+    changelog = "https://github.com/ray-project/ray/releases/tag/ray-${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ billhuang ];
+    platforms = [ "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/razdel/default.nix b/nixpkgs/pkgs/development/python-modules/razdel/default.nix
new file mode 100644
index 000000000000..c870ba819ba1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/razdel/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "razdel";
+  version = "0.5.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QzTA/f401OiIzw7YVJaMnfFPClR9+Qmnf0Y0+f/mJuY=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  pytestFlagsArray = [ "razdel" ];
+  pythonImportCheck = [ "razdel" ];
+
+  meta = with lib; {
+    description = "Rule-based system for Russian sentence and word tokenization";
+    homepage = "https://github.com/natasha/razdel";
+    license = licenses.mit;
+    maintainers = with maintainers; [ npatsakula ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rbtools/default.nix b/nixpkgs/pkgs/development/python-modules/rbtools/default.nix
new file mode 100644
index 000000000000..1c99ee0fc8df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rbtools/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+, isPy3k
+, setuptools
+, colorama
+, six
+, texttable
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "rbtools";
+  version = "1.0.2";
+
+  disabled = !isPy3k;
+
+  src = fetchurl {
+    url = "https://downloads.reviewboard.org/releases/RBTools/${lib.versions.majorMinor version}/RBTools-${version}.tar.gz";
+    sha256 = "577c2f8bbf88f77bda84ee95af0310b59111c156f48a5aab56ca481e2f77eaf4";
+  };
+
+  propagatedBuildInputs = [ six texttable tqdm colorama setuptools ];
+
+  # The kgb test dependency is not in nixpkgs
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://www.reviewboard.org/docs/rbtools/dev/";
+    description = "RBTools is a set of command line tools for working with Review Board and RBCommons";
+    license = licenses.mit;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rchitect/default.nix b/nixpkgs/pkgs/development/python-modules/rchitect/default.nix
new file mode 100644
index 000000000000..060fafa8d6e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rchitect/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cffi
+, pytestCheckHook
+, pytest-mock
+, pythonOlder
+, R
+, rPackages
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "rchitect";
+  version = "0.4.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "randy3k";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-igrYMgPemYVGDR+eWiqtxFxFjroCyOfKEU0wj8D7ZS8=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner"' ""
+  '';
+
+  propagatedBuildInputs = [
+    cffi
+    six
+  ] ++ (with rPackages; [
+    reticulate
+  ]);
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+    R
+  ];
+
+  preCheck = ''
+    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${R}/lib/R/lib
+    cd $TMPDIR
+  '';
+
+  pythonImportsCheck = [ "rchitect" ];
+
+  meta = with lib; {
+    description = "Interoperate R with Python";
+    homepage = "https://github.com/randy3k/rchitect";
+    changelog = "https://github.com/randy3k/rchitect/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ savyajha ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rcssmin/default.nix b/nixpkgs/pkgs/development/python-modules/rcssmin/default.nix
new file mode 100644
index 000000000000..15fc1c3bfee1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rcssmin/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "rcssmin";
+  version = "1.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vHXrdb1tNFwMUf2A/Eh93W+f1AndeGGz/pje6FAY4ek=";
+  };
+
+  # The package does not ship tests, and the setup machinary confuses
+  # tests auto-discovery
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "rcssmin"
+  ];
+
+  meta = with lib; {
+    description = "CSS minifier written in pure python";
+    homepage = "http://opensource.perlig.de/rcssmin/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rdflib/default.nix b/nixpkgs/pkgs/development/python-modules/rdflib/default.nix
new file mode 100644
index 000000000000..471439b28e5c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rdflib/default.nix
@@ -0,0 +1,104 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# builds
+, poetry-core
+
+# propagates
+, isodate
+, pyparsing
+
+# propagates <3.8
+, importlib-metadata
+
+# extras: networkx
+, networkx
+
+# extras: html
+, html5lib
+
+# tests
+, pip
+, pytest-cov
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "rdflib";
+  version = "7.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "RDFLib";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-VCjvgXMun1Hs+gPeqjzLXbIX1NBQ5aMLz0aWlwsm0iY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    isodate
+    html5lib
+    pyparsing
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  passthru.optional-dependencies = {
+    html = [
+      html5lib
+    ];
+    networkx = [
+      networkx
+    ];
+  };
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pip
+    pytest-cov
+    pytestCheckHook
+  ]
+  ++ passthru.optional-dependencies.networkx
+  ++ passthru.optional-dependencies.html;
+
+  pytestFlagsArray = [
+    # requires network access
+    "--deselect=rdflib/__init__.py::rdflib"
+    "--deselect=test/jsonld/test_onedotone.py::test_suite"
+  ];
+
+  disabledTests = [
+    # Requires network access
+    "test_service"
+    "testGuessFormatForParse"
+    "test_infix_owl_example1"
+    "test_context"
+    "test_example"
+    "test_guess_format_for_parse"
+    "rdflib.extras.infixowl"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # Require loopback network access
+    "TestGraphHTTP"
+  ];
+
+  pythonImportsCheck = [
+    "rdflib"
+  ];
+
+  meta = with lib; {
+    description = "Python library for working with RDF";
+    homepage = "https://rdflib.readthedocs.io";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rdkit/default.nix b/nixpkgs/pkgs/development/python-modules/rdkit/default.nix
new file mode 100644
index 000000000000..56cca6c1af85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rdkit/default.nix
@@ -0,0 +1,161 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, cmake
+, comic-neue
+, boost
+, catch2
+, inchi
+, cairo
+, eigen
+, python
+, rapidjson
+, maeparser
+, coordgenlibs
+, numpy
+, pandas
+, pillow
+, memorymappingHook
+}:
+let
+  external = {
+    avalon = fetchFromGitHub {
+      owner = "rdkit";
+      repo = "ava-formake";
+      rev = "AvalonToolkit_2.0.5-pre.3";
+      hash = "sha256-2MuFZgRIHXnkV7Nc1da4fa7wDx57VHUtwLthrmjk+5o=";
+    };
+    yaehmop = fetchFromGitHub {
+      owner = "greglandrum";
+      repo = "yaehmop";
+      rev = "v2023.03.1";
+      hash = "sha256-K9//cDN69U4sLETfIZq9NUaBE3RXOReH53qfiCzutqM=";
+    };
+    freesasa = fetchFromGitHub {
+      owner = "mittinatten";
+      repo = "freesasa";
+      rev = "2.0.3";
+      hash = "sha256-7E+imvfDAJFnXQRWb5hNaSu+Xrf9NXeIKc9fl+o3yHQ=";
+    };
+  };
+in
+buildPythonPackage rec {
+  pname = "rdkit";
+  version = "2023.09.1";
+  format = "other";
+
+  src =
+    let
+      versionTag = lib.replaceStrings [ "." ] [ "_" ] version;
+    in
+    fetchFromGitHub {
+      owner = pname;
+      repo = pname;
+      rev = "Release_${versionTag}";
+      hash = "sha256-qaYD/46oCTnso1FbD08zr2JuatKmSSqNBhOYlfeIiAA=";
+    };
+
+  unpackPhase = ''
+    cp -r $src/* .
+    find . -type d -exec chmod +w {} +
+
+    mkdir External/AvalonTools/avalon
+    # In buildPhase, CMake patches the file in this directory
+    # see https://github.com/rdkit/rdkit/pull/5928
+    cp -r ${external.avalon}/* External/AvalonTools/avalon
+
+    mkdir External/YAeHMOP/yaehmop
+    ln -s ${external.yaehmop}/* External/YAeHMOP/yaehmop
+
+    mkdir -p External/FreeSASA/freesasa
+    cp -r ${external.freesasa}/* External/FreeSASA/freesasa
+    chmod +w External/FreeSASA/freesasa/src
+    cp External/FreeSASA/freesasa2.c External/FreeSASA/freesasa/src
+
+    ln -s ${rapidjson} External/rapidjson-1.1.0
+    ln -s ${comic-neue}/share/fonts/truetype/ComicNeue-Regular.ttf Data/Fonts/
+  '';
+
+  nativeBuildInputs = [
+    cmake
+  ];
+
+  buildInputs = [
+    boost
+    cairo
+  ] ++ lib.optionals (stdenv.system == "x86_64-darwin") [
+    memorymappingHook
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    pandas
+    pillow
+  ];
+
+  hardeningDisable = [ "format" ]; # required by yaehmop
+
+  dontUseSetuptoolsBuild = true;
+  dontUsePipInstall = true;
+  dontUseSetuptoolsCheck = true;
+
+  preConfigure = ''
+    # Since we can't expand with bash in cmakeFlags
+    cmakeFlags="$cmakeFlags -DPYTHON_NUMPY_INCLUDE_PATH=$(${python}/bin/python -c 'import numpy; print(numpy.get_include())')"
+    cmakeFlags="$cmakeFlags -DFREESASA_DIR=$PWD/External/FreeSASA/freesasa"
+    cmakeFlags="$cmakeFlags -DFREESASA_SRC_DIR=$PWD/External/FreeSASA/freesasa"
+    cmakeFlags="$cmakeFlags -DAVALONTOOLS_DIR=$PWD/External/AvalonTools/avalon"
+  '';
+
+  cmakeFlags = [
+    "-DCATCH_DIR=${catch2}/include/catch2"
+    "-DINCHI_LIBRARY=${inchi}/lib/libinchi.so"
+    "-DINCHI_LIBRARIES=${inchi}/lib/libinchi.so"
+    "-DINCHI_INCLUDE_DIR=${inchi}/include/inchi"
+    "-DEIGEN3_INCLUDE_DIR=${eigen}/include/eigen3"
+    "-DRDK_INSTALL_INTREE=OFF"
+    "-DRDK_INSTALL_STATIC_LIBS=OFF"
+    "-DRDK_BUILD_INCHI_SUPPORT=ON"
+    "-DRDK_BUILD_AVALON_SUPPORT=ON"
+    "-DRDK_BUILD_FREESASA_SUPPORT=ON"
+    "-DRDK_BUILD_YAEHMOP_SUPPORT=ON"
+    "-DRDK_BUILD_MAEPARSER_SUPPORT=ON"
+    "-DMAEPARSER_DIR=${maeparser}"
+    "-DRDK_BUILD_COORDGEN_SUPPORT=ON"
+    "-DCOORDGEN_DIR=${coordgenlibs}"
+    "-DRDK_USE_URF=OFF"
+    "-DRDK_USE_FLEXBISON=OFF"
+    "-DRDK_BUILD_CAIRO_SUPPORT=ON"
+    "-DRDK_BUILD_THREADSAFE_SSS=ON"
+    "-DRDK_TEST_MULTITHREADED=ON"
+    "-DRDK_BUILD_CPP_TESTS=ON"
+    "-DRDK_TEST_MULTITHREADED=ON"
+    "-DPYTHON_EXECUTABLE=${python}/bin/python"
+    "-DBOOST_ROOT=${boost}"
+    "-DBoost_NO_SYSTEM_PATHS=ON"
+    "-DBoost_NO_BOOST_CMAKE=TRUE"
+    "-DCMAKE_SKIP_BUILD_RPATH=ON" # fails to find libs in pythonImportsCheckPhase otherwise
+  ];
+
+  checkPhase = ''
+    export QT_QPA_PLATFORM='offscreen'
+    export RDBASE=$(realpath ..)
+    export PYTHONPATH="$out/lib/${python.libPrefix}/site-packages:$PYTHONPATH"
+    (cd $RDBASE/rdkit/Chem && python $RDBASE/rdkit/TestRunner.py test_list.py)
+  '';
+
+  pythonImportsCheck = [
+    "rdkit"
+    "rdkit.Chem"
+    "rdkit.Chem.AllChem"
+  ];
+
+  meta = with lib; {
+    description = "Open source toolkit for cheminformatics";
+    maintainers = with maintainers; [ rmcgibbo natsukium ];
+    license = licenses.bsd3;
+    homepage = "https://www.rdkit.org";
+    changelog = "https://github.com/rdkit/rdkit/releases/tag/${src.rev}";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/re-assert/default.nix b/nixpkgs/pkgs/development/python-modules/re-assert/default.nix
new file mode 100644
index 000000000000..9cf32d79802e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/re-assert/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, regex
+}:
+
+buildPythonPackage rec {
+  pname = "re_assert";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5172dfbd2047a15dff2347735dea7e495479cc7e58841199a4a4973256b20464";
+  };
+
+  # No tests in archive
+  doCheck = false;
+
+  propagatedBuildInputs = [
+    regex
+  ];
+
+  meta = {
+    description = "Show where your regex match assertion failed";
+    license = lib.licenses.mit;
+    homepage = "https://github.com/asottile/re-assert";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/reactivex/default.nix b/nixpkgs/pkgs/development/python-modules/reactivex/default.nix
new file mode 100644
index 000000000000..430581fce58f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reactivex/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "reactivex";
+  version = "4.0.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ReactiveX";
+    repo = "RxPY";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-W1qYNbYV6Roz1GJtP/vpoPD6KigWaaQOWe1R5DZHlUw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # Upstream doesn't set a version for their GitHub releases
+    substituteInPlace pyproject.toml \
+      --replace 'version = "0.0.0"' 'version = "${version}"'
+  '';
+
+  pythonImportsCheck = [
+    "reactivex"
+  ];
+
+  meta = with lib; {
+    description = "Library for composing asynchronous and event-based programs";
+    homepage = "https://github.com/ReactiveX/RxPY";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/readability-lxml/default.nix b/nixpkgs/pkgs/development/python-modules/readability-lxml/default.nix
new file mode 100644
index 000000000000..6b04c0f1cd91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/readability-lxml/default.nix
@@ -0,0 +1,45 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, chardet
+, cssselect
+, lxml
+, timeout-decorator
+}:
+
+buildPythonPackage rec {
+  pname = "readability-lxml";
+  version = "0.8.1";
+
+  src = fetchFromGitHub {
+    owner = "buriy";
+    repo = "python-readability";
+    rev = "v${version}";
+    hash = "sha256-MKdQRety24qOG9xgIdaCJ72XEImP42SlMG6tC7bwzo4=";
+  };
+
+  propagatedBuildInputs = [ chardet cssselect lxml ];
+
+  postPatch = ''
+    substituteInPlace setup.py --replace 'sys.platform == "darwin"' "False"
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    timeout-decorator
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # Test is broken on darwin. Fix in master from https://github.com/buriy/python-readability/pull/178
+    "test_many_repeated_spaces"
+  ];
+
+  meta = with lib; {
+    description = "Fast python port of arc90's readability tool";
+    homepage = "https://github.com/buriy/python-readability";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ siraben ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/readchar/default.nix b/nixpkgs/pkgs/development/python-modules/readchar/default.nix
new file mode 100644
index 000000000000..8517bb34654f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/readchar/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# tests
+, pytestCheckHook
+, pexpect
+}:
+
+buildPythonPackage rec {
+  pname = "readchar";
+  version = "4.0.5";
+  format = "setuptools";
+
+  # Don't use wheels on PyPI
+  src = fetchFromGitHub {
+    owner = "magmax";
+    repo = "python-${pname}";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Ru18lh+9tXtvttypnob0HNPKBiGF7E9HDL21l1AAGa8=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=readchar" ""
+    # run Linux tests on Darwin as well
+    # see https://github.com/magmax/python-readchar/pull/99 for why this is not upstreamed
+    substituteInPlace tests/linux/conftest.py \
+      --replace 'sys.platform.startswith("linux")' 'sys.platform.startswith(("darwin", "linux"))'
+  '';
+
+  pythonImportsCheck = [ "readchar" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pexpect
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/magmax/python-readchar";
+    description = "Python library to read characters and key strokes";
+    license = licenses.mit;
+    maintainers = [ maintainers.mmahut ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/readlike/default.nix b/nixpkgs/pkgs/development/python-modules/readlike/default.nix
new file mode 100644
index 000000000000..6fc271f7811a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/readlike/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "readlike";
+  version = "0.1.3";
+
+  src = fetchFromGitHub {
+    owner = "jangler";
+    repo = "readlike";
+    rev = version;
+    sha256 = "1mw8j8ads8hqdbz42siwpffi4wi5s33z9g14a5c2i7vxp8m68qc1";
+  };
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  unittestFlagsArray = [ "-s" "tests" ];
+
+  meta = with lib; {
+    description = "GNU Readline-like line editing module";
+    homepage = "https://github.com/jangler/readlike";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/readmdict/default.nix b/nixpkgs/pkgs/development/python-modules/readmdict/default.nix
new file mode 100644
index 000000000000..b7d61f8c8f57
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/readmdict/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+
+, poetry-core
+, python-lzo
+, tkinter
+
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "readmdict";
+  version = "0.1.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ffreemt";
+    repo = "readmdict";
+    rev = "v${version}";
+    hash = "sha256-1/f+o2bVscT3EA8XQyS2hWjhimLRzfIBM6u2O7UqwcA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    python-lzo
+    tkinter
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "readmdict"
+  ];
+
+  meta = with lib; {
+    description = "Read mdx/mdd files (repacking of readmdict from mdict-analysis)";
+    homepage = "https://github.com/ffreemt/readmdict";
+    license = licenses.mit;
+    maintainers = with maintainers; [ paveloom ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/readme/default.nix b/nixpkgs/pkgs/development/python-modules/readme/default.nix
new file mode 100644
index 000000000000..6a43bcdc3e06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/readme/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, readme_renderer
+}:
+
+buildPythonPackage rec {
+  pname = "readme";
+  version = "0.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "32fbe1538a437da160fa4e4477270bfdcd8876e2e364d0d12898302644496231";
+  };
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    readme_renderer
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  # tests are not included with pypi release
+  # package is not readme_renderer
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Readme is a library for rendering readme descriptions for Warehouse";
+    homepage = "https://github.com/pypa/readme";
+    license = licenses.asl20;
+    maintainers = [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/readme_renderer/default.nix b/nixpkgs/pkgs/development/python-modules/readme_renderer/default.nix
new file mode 100644
index 000000000000..983de37f3932
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/readme_renderer/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, bleach
+, buildPythonPackage
+, cmarkgfm
+, docutils
+, fetchPypi
+, mock
+, pygments
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "readme-renderer";
+  version = "37.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "readme_renderer";
+    inherit version;
+    hash = "sha256-zWUxht/HMFVlbwkPIn9csioEbX9xqEHfowX1XJpRMnM=";
+  };
+
+  propagatedBuildInputs = [
+    bleach
+    cmarkgfm
+    docutils
+    pygments
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "cmarkgfm>=0.5.0,<0.7.0" "cmarkgfm>=0.5.0,<1"
+  '';
+
+  disabledTests = [
+    # https://github.com/pypa/readme_renderer/issues/221
+    "test_GFM_"
+    # https://github.com/pypa/readme_renderer/issues/274
+    "test_CommonMark_008.md"
+    "test_rst_008.rst"
+    # Relies on old distutils behaviour removed by setuptools (TypeError: dist must be a Distribution instance)
+    "test_valid_rst"
+    "test_invalid_rst"
+    "test_malicious_rst"
+    "test_invalid_missing"
+    "test_invalid_empty"
+  ];
+
+  pythonImportsCheck = [
+    "readme_renderer"
+  ];
+
+  meta = with lib; {
+    description = "Python library for rendering readme descriptions";
+    homepage = "https://github.com/pypa/readme_renderer";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/readthedocs-sphinx-ext/default.nix b/nixpkgs/pkgs/development/python-modules/readthedocs-sphinx-ext/default.nix
new file mode 100644
index 000000000000..fc2fd653083d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/readthedocs-sphinx-ext/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, pytest
+, mock
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "readthedocs-sphinx-ext";
+  version = "2.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-kiF77xTZE3e88nvffaNj5XSzseQYC2Xu9ufPpV8P0Lg=";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  nativeCheckInputs = [ pytest mock sphinx ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    description = "Sphinx extension for Read the Docs overrides";
+    homepage = "https://github.com/rtfd/readthedocs-sphinx-ext";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rebulk/default.nix b/nixpkgs/pkgs/development/python-modules/rebulk/default.nix
new file mode 100644
index 000000000000..cab55c3a29fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rebulk/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, regex
+}:
+
+buildPythonPackage rec {
+  pname = "rebulk";
+  version = "3.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-DTC/gPygD6nGlxhaxHXarJveX2Rs4zOMn/XV3B69/rw=";
+  };
+
+  propagatedBuildInputs = [
+    regex
+  ];
+
+  buildInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "rebulk"
+  ];
+
+  meta = with lib; {
+    description = "Advanced string matching from simple patterns";
+    homepage = "https://github.com/Toilal/rebulk/";
+    changelog = "https://github.com/Toilal/rebulk/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/recipe-scrapers/default.nix b/nixpkgs/pkgs/development/python-modules/recipe-scrapers/default.nix
new file mode 100644
index 000000000000..c5b7fcb88b76
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/recipe-scrapers/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, beautifulsoup4
+, extruct
+, language-tags
+, regex
+, requests
+, pytestCheckHook
+, responses
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "recipe-scrapers";
+  version = "14.46.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "hhursev";
+    repo = "recipe-scrapers";
+    rev = "refs/tags/${version}";
+    hash = "sha256-XCcunwqmcvPC5AVxR9mit06BRDTYfu/CeTXg3IH7Dy0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    extruct
+    language-tags
+    regex
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  disabledTestPaths = [
+    # This is not actual code, just some pre-written boiler-plate template
+    "templates/test_scraper.py"
+  ];
+
+  pythonImportsCheck = [ "recipe_scrapers" ];
+
+  meta = with lib; {
+    description = "Python package for scraping recipes data ";
+    homepage = "https://github.com/hhursev/recipe-scrapers";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ambroisie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/recline/default.nix b/nixpkgs/pkgs/development/python-modules/recline/default.nix
new file mode 100644
index 000000000000..074e1da03386
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/recline/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pudb
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "recline";
+  version = "2023.5";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "NetApp";
+    repo = "recline";
+    rev = "v${version}";
+    sha256 = "sha256-jsWOPkzhN4D+Q/lK5yWg1kTgFkmOEIQY8O7oAXq5Nak=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pudb
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "recline" ];
+
+  meta = with lib; {
+    description = "This library helps you quickly implement an interactive command-based application";
+    homepage = "https://github.com/NetApp/recline";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/recommonmark/default.nix b/nixpkgs/pkgs/development/python-modules/recommonmark/default.nix
new file mode 100644
index 000000000000..ebe070f2735f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/recommonmark/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, commonmark
+, docutils
+, sphinx
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "recommonmark";
+  version = "0.7.1";
+
+  src = fetchFromGitHub {
+    owner = "rtfd";
+    repo = pname;
+    rev = version;
+    sha256 = "0kwm4smxbgq0c0ybkxfvlgrfb3gq9amdw94141jyykk9mmz38379";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  propagatedBuildInputs = [ commonmark docutils sphinx ];
+
+  dontUseSetuptoolsCheck = true;
+
+  disabledTests = [
+    # https://github.com/readthedocs/recommonmark/issues/164
+    "test_lists"
+    "test_integration"
+  ];
+
+  doCheck = !isPy3k; # Not yet compatible with latest Sphinx.
+  pythonImportsCheck = [ "recommonmark" ];
+
+  meta = {
+    description = "A docutils-compatibility bridge to CommonMark";
+    homepage = "https://github.com/rtfd/recommonmark";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/recordlinkage/default.nix b/nixpkgs/pkgs/development/python-modules/recordlinkage/default.nix
new file mode 100644
index 000000000000..7b92cfacebf9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/recordlinkage/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, bottleneck
+, buildPythonPackage
+, fetchPypi
+, jellyfish
+, joblib
+, networkx
+, numexpr
+, numpy
+, pandas
+, pyarrow
+, pytest
+, pythonOlder
+, scikit-learn
+, scipy
+, setuptools
+, setuptools-scm
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "recordlinkage";
+  version = "0.16";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7NoMEN/xOLFwaBXeMysShfZwrn6MzpJZYhNQHVieaqQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    pyarrow
+    jellyfish
+    numpy
+    pandas
+    scipy
+    scikit-learn
+    joblib
+    networkx
+    bottleneck
+    numexpr
+  ];
+
+  # pytestCheckHook does not work
+  # Reusing their CI setup which involves 'rm -rf recordlinkage' in preCheck phase do not work too.
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  pythonImportsCheck = [
+    "recordlinkage"
+  ];
+
+  meta = with lib; {
+    description = "Library to link records in or between data sources";
+    homepage = "https://recordlinkage.readthedocs.io/";
+    changelog = "https://github.com/J535D165/recordlinkage/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ raitobezarius ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/recurring-ical-events/default.nix b/nixpkgs/pkgs/development/python-modules/recurring-ical-events/default.nix
new file mode 100644
index 000000000000..3ddc6bb4ccc9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/recurring-ical-events/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, icalendar
+, pytz
+, python-dateutil
+, x-wr-timezone
+, pytestCheckHook
+, restructuredtext-lint
+, pygments
+, tzdata
+}:
+
+buildPythonPackage rec {
+  pname = "recurring-ical-events";
+  version = "2.1.1";
+
+  disabled = pythonOlder "3.7";
+
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "niccokunzmann";
+    repo = "python-recurring-ical-events";
+    rev = "v${version}";
+    hash = "sha256-I5D4CAk0C60H2hMBV62gOaIRA+wYF2ORKxHfWustQz0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    icalendar
+    pytz
+    python-dateutil
+    x-wr-timezone
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    restructuredtext-lint
+    pygments
+    tzdata
+  ];
+
+  pythonImportsCheck = [ "recurring_ical_events" ];
+
+  meta = {
+    changelog = "https://github.com/niccokunzmann/python-recurring-ical-events/blob/${src.rev}/README.rst#changelog";
+    description = "Repeat ICalendar events by RRULE, RDATE and EXDATE";
+    homepage = "https://github.com/niccokunzmann/python-recurring-ical-events";
+    license = lib.licenses.lgpl3Plus;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/recursive-pth-loader/default.nix b/nixpkgs/pkgs/development/python-modules/recursive-pth-loader/default.nix
new file mode 100644
index 000000000000..499ad3c23d07
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/recursive-pth-loader/default.nix
@@ -0,0 +1,25 @@
+{ stdenv, python }:
+
+stdenv.mkDerivation {
+  pname = "python-recursive-pth-loader";
+  version = "1.0";
+
+  dontUnpack = true;
+
+  buildInputs = [ python ];
+
+  patchPhase = "cat ${./sitecustomize.py} > sitecustomize.py";
+
+  buildPhase = "${python.pythonOnBuildForHost}/bin/${python.pythonOnBuildForHost.executable} -m compileall .";
+
+  installPhase =
+    ''
+      dst=$out/lib/${python.libPrefix}/site-packages
+      mkdir -p $dst
+      cp sitecustomize.* $dst/
+    '';
+
+  meta = {
+      description = "Enable recursive processing of pth files anywhere in sys.path";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/recursive-pth-loader/sitecustomize.py b/nixpkgs/pkgs/development/python-modules/recursive-pth-loader/sitecustomize.py
new file mode 100644
index 000000000000..057e779803cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/recursive-pth-loader/sitecustomize.py
@@ -0,0 +1,46 @@
+"""Recursively load pth files in site-packages of sys.path
+
+- iterate over sys.path
+- check for pth in dirs that end in site-packages
+- ignore import statements in pth files
+- add dirs listed in pth files right after current sys.path element,
+  they will be processed in next iteration
+"""
+
+import os
+import site
+import sys
+
+
+for path_idx, sitedir in enumerate(sys.path):
+    # ignore non-site-packages
+    if not sitedir.endswith('site-packages'):
+        continue
+
+    # find pth files
+    try:
+        names = os.listdir(sitedir)
+    except os.error:
+        continue
+    dotpth = os.extsep + "pth"
+    pths = [name for name in names if name.endswith(dotpth)]
+
+    for pth in pths:
+        fullname = os.path.join(sitedir, pth)
+        try:
+            f = open(fullname, "rU")
+        except IOError:
+            continue
+
+        with f:
+            for n, line in enumerate(f):
+                if line.startswith("#"):
+                    continue
+
+                if line.startswith(("import ", "import\t")):
+                    continue
+
+                line = line.rstrip()
+                dir, dircase = site.makepath(sitedir, line)
+                if not dircase in sys.path:
+                    sys.path.insert(path_idx+1, dir)
diff --git a/nixpkgs/pkgs/development/python-modules/redbaron/default.nix b/nixpkgs/pkgs/development/python-modules/redbaron/default.nix
new file mode 100644
index 000000000000..46123c39496f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/redbaron/default.nix
@@ -0,0 +1,27 @@
+{ lib, fetchPypi, buildPythonPackage, baron, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "redbaron";
+  version = "0.9.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0bqkq0wn20cc3qrcd1ifq74p4m570j345bkq4axl08kbr8whfba7";
+  };
+
+  propagatedBuildInputs = [ baron ];
+
+  preCheck = ''
+    rm -rf tests/__pycache__
+    rm tests/test_bounding_box.py
+  ''; #error about fixtures
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    homepage = "https://github.com/gristlabs/asttokens";
+    description = "Abstraction on top of baron, a FST for python to make writing refactoring code a realistic task";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ marius851000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/redis-om/default.nix b/nixpkgs/pkgs/development/python-modules/redis-om/default.nix
new file mode 100644
index 000000000000..aec5311351e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/redis-om/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, unasync
+, poetry-core
+, python
+, click
+, hiredis
+, more-itertools
+, pydantic
+, python-ulid
+, redis
+, types-redis
+, typing-extensions
+, pkgs
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "redis-om";
+  version = "0.2.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "redis";
+    repo = "redis-om-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-jQS0VTYZeAj3+OVFy+JP4mUFBPo+a5D/kdJKagFraaA=";
+  };
+
+  nativeBuildInputs = [
+    unasync
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    click
+    hiredis
+    more-itertools
+    pydantic
+    python-ulid
+    redis
+    types-redis
+    typing-extensions
+  ];
+
+  preBuild = ''
+    ${python.pythonOnBuildForHost.interpreter} make_sync.py
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  preCheck = ''
+    ${pkgs.redis}/bin/redis-server &
+    REDIS_PID=$!
+  '';
+
+  postCheck = ''
+    kill $REDIS_PID
+  '';
+
+  # probably require redisearch
+  # https://github.com/redis/redis-om-python/issues/532
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "aredis_om"
+    "redis_om"
+  ];
+
+  meta = with lib; {
+    description = "Object mapping, and more, for Redis and Python";
+    homepage = "https://github.com/redis/redis-om-python";
+    changelog = "https://github.com/redis/redis-om-python/releases/tag/${src.rev}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/redis/default.nix b/nixpkgs/pkgs/development/python-modules/redis/default.nix
new file mode 100644
index 000000000000..2616e1da9f4d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/redis/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+
+# propagates
+, async-timeout
+, deprecated
+, importlib-metadata
+, packaging
+, typing-extensions
+
+# extras: hiredis
+, hiredis
+
+# extras: ocsp
+, cryptography
+, pyopenssl
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "redis";
+  version = "5.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XOpsDTNcmnMypGDthynOq7TQxInHKFsKhtu/igF70SA=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+    deprecated
+    packaging
+    typing-extensions
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  passthru.optional-dependencies = {
+    hiredis = [
+      hiredis
+    ];
+    ocsp = [
+      cryptography
+      pyopenssl
+      requests
+    ];
+  };
+
+  pythonImportsCheck = [
+    "redis"
+    "redis.client"
+    "redis.cluster"
+    "redis.connection"
+    "redis.exceptions"
+    "redis.sentinel"
+    "redis.utils"
+  ];
+
+  # Tests require a running redis
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python client for Redis key-value store";
+    homepage = "https://github.com/redis/redis-py";
+    changelog = "https://github.com/redis/redis-py/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/redshift-connector/default.nix b/nixpkgs/pkgs/development/python-modules/redshift-connector/default.nix
new file mode 100644
index 000000000000..4bd4b3c14619
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/redshift-connector/default.nix
@@ -0,0 +1,62 @@
+{ beautifulsoup4
+, boto3
+, buildPythonPackage
+, fetchFromGitHub
+, lib
+, lxml
+, packaging
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, pytz
+, requests
+, scramp
+}:
+
+buildPythonPackage rec {
+  pname = "redshift-connector";
+  version = "2.0.914";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "aws";
+    repo = "amazon-redshift-python-driver";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-fGOo9FgVMI6ayyB3EMN6RGThwWciShcBZzWTZWtOt8E=";
+  };
+
+  # remove addops as they add test directory and coverage parameters to pytest
+  postPatch = ''
+    substituteInPlace setup.cfg --replace 'addopts =' 'no-opts ='
+  '';
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    boto3
+    lxml
+    packaging
+    pytz
+    requests
+    scramp
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  # integration tests require a Redshift cluster
+  pytestFlagsArray = [ "test/unit" ];
+
+  __darwinAllowLocalNetworking = true; # required for tests
+
+  meta = {
+    description = "Redshift interface library";
+    homepage = "https://github.com/aws/amazon-redshift-python-driver";
+    changelog = "https://github.com/aws/amazon-redshift-python-driver/releases/tag/v${version}";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ mcwitt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/reedsolo/default.nix b/nixpkgs/pkgs/development/python-modules/reedsolo/default.nix
new file mode 100644
index 000000000000..a2fb336f70b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reedsolo/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, cython
+, setuptools
+
+# tests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "reedsolo";
+  version = "1.7.0";
+  format = "pyproject";
+
+  # Pypi does not have the tests
+  src = fetchFromGitHub {
+    owner = "tomerfiliba";
+    repo = "reedsolomon";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-nzdD1oGXHSeGDD/3PpQQEZYGAwn9ahD2KNYGqpgADh0=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    "tests/test_creedsolo.py" # TODO: package creedsolo
+  ];
+
+  meta = with lib; {
+    description = "Pure-python universal errors-and-erasures Reed-Solomon Codec";
+    homepage = "https://github.com/tomerfiliba/reedsolomon";
+    license = licenses.publicDomain;
+    maintainers = with maintainers; [ yorickvp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/referencing/default.nix b/nixpkgs/pkgs/development/python-modules/referencing/default.nix
new file mode 100644
index 000000000000..dc09aa3594a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/referencing/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, hatch-vcs
+, hatchling
+, jsonschema
+, pytest-subtests
+, pytestCheckHook
+, pythonOlder
+, rpds-py
+}:
+
+
+let
+  self = buildPythonPackage rec {
+    pname = "referencing";
+    version = "0.30.2";
+    format = "pyproject";
+
+    disabled = pythonOlder "3.7";
+
+    src = fetchFromGitHub {
+      owner = "python-jsonschema";
+      repo = "referencing";
+      rev = "refs/tags/v${version}";
+      fetchSubmodules = true;
+      hash = "sha256-C2gKjoaMcUWz/QOsqpv4TkozQyI+zEIQf3GMf5w40aw=";
+    };
+
+    SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+    nativeBuildInputs = [
+      hatch-vcs
+      hatchling
+    ];
+
+    propagatedBuildInputs = [
+      attrs
+      rpds-py
+    ];
+
+    nativeCheckInputs = [
+      jsonschema
+      pytest-subtests
+      pytestCheckHook
+    ];
+
+    # avoid infinite recursion with jsonschema
+    doCheck = false;
+
+    passthru.tests.referencing = self.overridePythonAttrs { doCheck = true; };
+
+    pythonImportsCheck = [
+      "referencing"
+    ];
+
+    meta = with lib; {
+      description = "Cross-specification JSON referencing";
+      homepage = "https://github.com/python-jsonschema/referencing";
+      changelog = "https://github.com/python-jsonschema/referencing/blob/${version}/CHANGELOG.rst";
+      license = licenses.mit;
+      maintainers = with maintainers; [ fab ];
+    };
+  };
+in
+  self
diff --git a/nixpkgs/pkgs/development/python-modules/reflink/default.nix b/nixpkgs/pkgs/development/python-modules/reflink/default.nix
new file mode 100644
index 000000000000..44106c6ca814
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reflink/default.nix
@@ -0,0 +1,39 @@
+{ buildPythonPackage
+, cffi
+, fetchPypi
+, lib
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "reflink";
+  version = "0.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-iCN17nMZJ1rl9qahKHQGNl2sHpZDuRrRDlGH0/hCU70=";
+  };
+
+  propagatedBuildInputs = [ cffi ];
+
+  propagatedNativeBuildInputs = [ cffi ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest-runner" ""
+  '';
+
+  # FIXME: These do not work, and I have been unable to figure out why.
+  doCheck = false;
+
+  pythonImportsCheck = [ "reflink" ];
+
+  meta = with lib; {
+    description = "Python reflink wraps around platform specific reflink implementations";
+    homepage = "https://gitlab.com/rubdos/pyreflink";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lovesegfault ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/regenmaschine/default.nix b/nixpkgs/pkgs/development/python-modules/regenmaschine/default.nix
new file mode 100644
index 000000000000..c3b959a65ef0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/regenmaschine/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-aiohttp
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "regenmaschine";
+  version = "2023.11.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = "regenmaschine";
+    rev = "refs/tags/${version}";
+    hash = "sha256-FRfw3B2zHEspKf1LENrB3Ayu6/t3hyS8sjuwoBC5Lfk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-aiohttp
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Examples are prefix with test_
+    "examples/"
+  ];
+
+  pythonImportsCheck = [
+    "regenmaschine"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Python library for interacting with RainMachine smart sprinkler controllers";
+    homepage = "https://github.com/bachya/regenmaschine";
+    changelog = "https://github.com/bachya/regenmaschine/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/regex/default.nix b/nixpkgs/pkgs/development/python-modules/regex/default.nix
new file mode 100644
index 000000000000..2df8bf922ea7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/regex/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "regex";
+  version = "2023.8.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/L3F8rDxzQ9qVs20b+QdLM4eZE47aIMvPu68X7D3cS4=";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest
+  '';
+
+  pythonImportsCheck = [
+    "regex"
+  ];
+
+  meta = with lib; {
+    description = "Alternative regular expression module, to replace re";
+    homepage = "https://bitbucket.org/mrabarnett/mrab-regex";
+    license = licenses.psfl;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/regional/default.nix b/nixpkgs/pkgs/development/python-modules/regional/default.nix
new file mode 100644
index 000000000000..ccbfb1cb874a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/regional/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, scipy
+, matplotlib
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "regional";
+  version = "1.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "freeman-lab";
+    repo = pname;
+    rev = "e3a29c58982e5cd3d5700131ac96e5e0b84fb981"; # no tags in repo
+    hash = "sha256-u88v9H9RZ9cgtSat73QEnHr3gZGL8DmBZ0XphMuoDw8=";
+  };
+
+  propagatedBuildInputs = [
+    matplotlib
+    numpy
+    scipy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "regional"
+  ];
+
+  disabledTests = [
+    "test_dilate"
+    "test_outline"
+    "test_mask"
+  ];
+
+  meta = with lib; {
+    description = "Simple manipualtion and display of spatial regions";
+    homepage = "https://github.com/freeman-lab/regional";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/reikna/default.nix b/nixpkgs/pkgs/development/python-modules/reikna/default.nix
new file mode 100644
index 000000000000..316d81b70658
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reikna/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, sphinx
+, pytest-cov
+, pytest
+, mako
+, numpy
+, funcsigs
+, withCuda ? false, pycuda
+, withOpenCL ? true, pyopencl
+}:
+
+buildPythonPackage rec {
+  pname = "reikna";
+  version = "0.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-fpa1Pfo5EAafg7Pgha17G6k5G13fdErjclv0On/uYyI=";
+  };
+
+  nativeCheckInputs = [ sphinx pytest-cov pytest ];
+
+  propagatedBuildInputs = [ mako numpy funcsigs ]
+    ++ lib.optional withCuda pycuda
+    ++ lib.optional withOpenCL pyopencl;
+
+  checkPhase = ''
+    py.test
+  '';
+
+  # Requires device
+  doCheck = false;
+
+  meta = with lib; {
+    description = "GPGPU algorithms for PyCUDA and PyOpenCL";
+    homepage = "https://github.com/fjarri/reikna";
+    license = licenses.mit;
+    maintainers = [ maintainers.fridh ];
+
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/related/default.nix b/nixpkgs/pkgs/development/python-modules/related/default.nix
new file mode 100644
index 000000000000..8c131e146944
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/related/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchPypi
+, future
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "related";
+  version = "0.7.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-IqmbqAW6PubN9GBXrMs5Je4u1XkgLl9camSGNrlrFJA=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    future
+    python-dateutil
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # Remove outdated setup.cfg
+    rm setup.cfg
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'," ""
+  '';
+
+  disabledTests = [
+    # Source tarball doesn't contains all needed files
+    "test_compose_from_yml"
+    "test_yaml_roundtrip_with_empty_values"
+    "test_compose_from_yml"
+    "test_store_data_from_json"
+  ];
+
+  pythonImportsCheck = [
+    "related"
+  ];
+
+  meta = with lib; {
+    description = "Nested Object Models in Python";
+    homepage = "https://github.com/genomoncology/related";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/relatorio/default.nix b/nixpkgs/pkgs/development/python-modules/relatorio/default.nix
new file mode 100644
index 000000000000..05a18ff34eee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/relatorio/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, genshi
+, lxml
+, pyyaml
+, python-magic
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "relatorio";
+  version = "0.10.1";
+
+  disabled = pythonOlder "3.5";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a0c72302d50d5dfa433ddab191672eec1dde1c6ed26330a378b720e5a3012e23";
+  };
+
+  propagatedBuildInputs = [
+    genshi
+    lxml
+  ];
+
+  passthru.optional-dependencies = {
+    chart = [ /* pycha */ pyyaml ];
+    fodt = [ python-magic ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.fodt;
+
+  pythonImportsCheck = [ "relatorio" ];
+
+  meta = {
+    homepage = "https://relatorio.tryton.org/";
+    changelog = "https://hg.tryton.org/relatorio/file/${version}/CHANGELOG";
+    description = "A templating library able to output odt and pdf files";
+    maintainers = with lib.maintainers; [ johbo ];
+    license = lib.licenses.gpl2Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/releases/default.nix b/nixpkgs/pkgs/development/python-modules/releases/default.nix
new file mode 100644
index 000000000000..05c6d5ae75d0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/releases/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, semantic-version
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "releases";
+  version = "2.1.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "bitprophet";
+    repo = pname;
+    rev = version;
+    hash = "sha256-IgEKAUk97R3ZvqvexD/ptT8i0uf48K+DKkk4q3pn3G8=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "semantic_version<2.7" "semantic_version"
+  '';
+
+  propagatedBuildInputs = [ semantic-version sphinx ];
+
+  # Test suite doesn't run. See https://github.com/bitprophet/releases/issues/95.
+  doCheck = false;
+
+  pythonImportsCheck = [ "releases" ];
+
+  meta = with lib; {
+    description = "A Sphinx extension for changelog manipulation";
+    homepage = "https://github.com/bitprophet/releases";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/remarshal/default.nix b/nixpkgs/pkgs/development/python-modules/remarshal/default.nix
new file mode 100644
index 000000000000..32916774ee36
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/remarshal/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build deps
+, poetry-core
+
+# propagates
+, cbor2
+, python-dateutil
+, pyyaml
+, tomlkit
+, u-msgpack-python
+
+# tested using
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "remarshal";
+  version = "0.17.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "dbohdan";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-2WxMh5P/8NvElymnMU3JzQU0P4DMXFF6j15OxLaS+VA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    cbor2
+    python-dateutil
+    pyyaml
+    tomlkit
+    u-msgpack-python
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/remarshal-project/remarshal/releases/tag/v${version}";
+    description = "Convert between TOML, YAML and JSON";
+    license = licenses.mit;
+    homepage = "https://github.com/dbohdan/remarshal";
+    maintainers = with maintainers; [ offline ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/remi/default.nix b/nixpkgs/pkgs/development/python-modules/remi/default.nix
new file mode 100644
index 000000000000..1a6ac76db05c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/remi/default.nix
@@ -0,0 +1,61 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, matplotlib
+, python-snap7
+, opencv4
+}:
+
+buildPythonPackage rec {
+  pname = "remi";
+  version = "2022.7.27";
+
+  src = fetchFromGitHub {
+    owner = "rawpython";
+    repo = pname;
+    rev = version;
+    hash = "sha256-VQn+Uzp6oGSit8ot0e8B0C2N41Q8+J+o91skyVN1gDA=";
+  };
+
+  preCheck = ''
+    # for some reason, REMI already deal with these using try blocks, but they fail
+    substituteInPlace test/test_widget.py \
+      --replace \
+        "from html_validator import " \
+        "from .html_validator import "
+    substituteInPlace test/test_examples_app.py \
+      --replace \
+        "from mock_server_and_request import " \
+        "from .mock_server_and_request import " \
+      --replace \
+        "from html_validator import " \
+        "from .html_validator import "
+    # Halves number of warnings
+    substituteInPlace test/test_*.py \
+      --replace \
+        "self.assertEquals(" \
+        "self.assertEqual("
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    python-snap7
+    opencv4
+    matplotlib
+  ];
+
+  pythonImportsCheck = [
+    "remi"
+    "editor"
+    "editor.widgets"
+  ];
+
+  meta = with lib; {
+    description = "Pythonic, lightweight and websocket-based webui library";
+    homepage = "https://github.com/rawpython/remi";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ pbsds ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/remote-pdb/default.nix b/nixpkgs/pkgs/development/python-modules/remote-pdb/default.nix
new file mode 100644
index 000000000000..cbaf07ebe2b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/remote-pdb/default.nix
@@ -0,0 +1,18 @@
+{ buildPythonPackage, fetchFromGitHub, lib }:
+buildPythonPackage rec {
+  pname = "remote-pdb";
+  version = "2.1.0";
+  src = fetchFromGitHub {
+    owner = "ionelmc";
+    repo = "python-remote-pdb";
+    rev = "v${version}";
+    hash = "sha256-/7RysJOJigU4coC6d/Ob2lrtw8u8nLZI8wBk4oEEY3g=";
+  };
+  meta = with lib; {
+    description = "Remote vanilla PDB (over TCP sockets).";
+    homepage = "https://github.com/ionelmc/python-remote-pdb";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ mic92 ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/remotezip/default.nix b/nixpkgs/pkgs/development/python-modules/remotezip/default.nix
new file mode 100644
index 000000000000..5a79b68e6b85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/remotezip/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, tabulate
+, pytestCheckHook
+, requests-mock
+}:
+
+buildPythonPackage {
+  pname = "remotezip";
+  version = "0.12.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "gtsystem";
+    repo = "python-remotezip";
+    # upstream does not tag releases, determined with git blame
+    # pypi archive lacks files for tests
+    rev = "da62e115bdb2071ad08a8c91f7ae48f2c1827e0c";
+    hash = "sha256-su4dlV8KZuewf/yGdTnGHK9hNLHwGe10ditmFcne4Us=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    tabulate
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  checkInputs = [
+    requests-mock
+  ];
+
+  pythonImportsCheck = [
+    "remotezip"
+  ];
+
+  meta = with lib; {
+    description = "Python module to access single members of a zip archive without downloading the full content";
+    homepage = "https://github.com/gtsystem/python-remotezip";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/renault-api/default.nix b/nixpkgs/pkgs/development/python-modules/renault-api/default.nix
new file mode 100644
index 000000000000..58fc148997b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/renault-api/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, click
+, dateparser
+, fetchFromGitHub
+, marshmallow-dataclass
+, poetry-core
+, pyjwt
+, pythonOlder
+, pytest-asyncio
+, pytestCheckHook
+, tabulate
+}:
+
+buildPythonPackage rec {
+  pname = "renault-api";
+  version = "0.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "hacf-fr";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-x6+rFstZM7Uplwa8NeRBTb8FYSD/NGjN/3q5earvN7c=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    click
+    dateparser
+    marshmallow-dataclass
+    pyjwt
+    tabulate
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=auto"
+  ];
+
+  pythonImportsCheck = [
+    "renault_api"
+  ];
+
+  meta = with lib; {
+    description = "Python library to interact with the Renault API";
+    homepage = "https://github.com/hacf-fr/renault-api";
+    changelog = "https://github.com/hacf-fr/renault-api/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rencode/default.nix b/nixpkgs/pkgs/development/python-modules/rencode/default.nix
new file mode 100644
index 000000000000..ffbe1ef8967a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rencode/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "rencode";
+  version = "unstable-2021-08-10";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "aresch";
+    repo = "rencode";
+    rev = "572ff74586d9b1daab904c6f7f7009ce0143bb75";
+    hash = "sha256-cL1hV3RMDuSdcjpPXXDYIEbzQrxiPeRs82PU8HTEQYk=";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    # import from $out
+    rm -r rencode
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/aresch/rencode";
+    description = "Fast (basic) object serialization similar to bencode";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/reolink-aio/default.nix b/nixpkgs/pkgs/development/python-modules/reolink-aio/default.nix
new file mode 100644
index 000000000000..2fbacc6ea980
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reolink-aio/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, orjson
+, pythonOlder
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "reolink-aio";
+  version = "0.8.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "starkillerOG";
+    repo = "reolink_aio";
+    rev = "refs/tags/${version}";
+    hash = "sha256-zxIx7+cpYKN811yz+nxjtOagHOMMIs1YU0ZLN9q5T7M=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    orjson
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [
+    "reolink_aio"
+  ];
+
+  # All tests require a network device
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Module to interact with the Reolink IP camera API";
+    homepage = "https://github.com/starkillerOG/reolink_aio";
+    changelog = "https://github.com/starkillerOG/reolink_aio/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/reolink/default.nix b/nixpkgs/pkgs/development/python-modules/reolink/default.nix
new file mode 100644
index 000000000000..06143c2922f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reolink/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, aiohttp
+, aiounittest
+, buildPythonPackage
+, fetchFromGitHub
+, ffmpeg-python
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "reolink";
+  version = "0053";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "fwestenberg";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-DZcTfmzO9rBhhRN2RkgoPwUPE+LPPeZgc8kmhYU9V2I=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    ffmpeg-python
+    requests
+  ];
+
+  nativeCheckInputs = [
+    aiounittest
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # Packages in nixpkgs is different than the module name
+    substituteInPlace setup.py \
+      --replace "ffmpeg" "ffmpeg-python"
+  '';
+
+  # https://github.com/fwestenberg/reolink/issues/83
+  doCheck = false;
+
+  pytestFlagsArray = [
+    "test.py"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test1_settings"
+    "test2_states"
+    "test3_images"
+    "test4_properties"
+    "test_succes"
+  ];
+
+  pythonImportsCheck = [
+    "reolink"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with the Reolink IP camera API";
+    homepage = "https://github.com/fwestenberg/reolink";
+    changelog = "https://github.com/fwestenberg/reolink/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/reorder-python-imports/default.nix b/nixpkgs/pkgs/development/python-modules/reorder-python-imports/default.nix
new file mode 100644
index 000000000000..1c5417c75a19
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reorder-python-imports/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, aspy-refactor-imports
+, classify-imports
+}:
+
+buildPythonPackage rec {
+  pname = "reorder-python-imports";
+  version = "3.12.0";
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "asottile";
+    repo = "reorder_python_imports";
+    rev = "v${version}";
+    hash = "sha256-bKv9APbraR2359IzzkzXs4sEXrTvGK3J4LO3wFHOti0=";
+  };
+
+  propagatedBuildInputs = [
+    aspy-refactor-imports
+    classify-imports
+  ];
+
+  pythonImportsCheck = [
+    "reorder_python_imports"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # prints an explanation about PYTHONPATH first
+  # and therefore fails the assertion
+  disabledTests = [
+    "test_success_messages_are_printed_on_stderr"
+  ];
+
+  meta = with lib; {
+    description = "Tool for automatically reordering python imports";
+    homepage = "https://github.com/asottile/reorder_python_imports";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/reparser/default.nix b/nixpkgs/pkgs/development/python-modules/reparser/default.nix
new file mode 100644
index 000000000000..90d701a0e465
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reparser/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "reparser";
+  version = "1.4.3";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "xmikos";
+    repo = "reparser";
+    rev = "v${version}";
+    sha256 = "04v7h52wny0j2qj37501nk33j0s4amm134kagdicx2is49zylzq1";
+  };
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "reparser" ];
+
+  meta = with lib; {
+    description = "Simple regex-based lexer/parser for inline markup";
+    homepage = "https://github.com/xmikos/reparser";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/repath/default.nix b/nixpkgs/pkgs/development/python-modules/repath/default.nix
new file mode 100644
index 000000000000..f66a42155da0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/repath/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "repath";
+  version = "0.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gpITm6xqDkP9nXBgXU6NrrJdRmcuSE7TGiTHzgrvD7c=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  pythonImportsCheck = [
+    "repath"
+  ];
+
+  meta = {
+    description = "A port of the node module path-to-regexp to Python";
+    homepage = "https://github.com/nickcoutsos/python-repath";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.heyimnova ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/repeated-test/default.nix b/nixpkgs/pkgs/development/python-modules/repeated-test/default.nix
new file mode 100644
index 000000000000..f87d5cdc782c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/repeated-test/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools-scm
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "repeated-test";
+  version = "2.3.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    pname = "repeated_test";
+    inherit version;
+    hash = "sha256-3YPU8SL9rud5s0pnwwH5TJk1MXsDhdkDnZp/Oj6sgXs=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "repeated_test"
+  ];
+
+  meta = with lib; {
+    description = "Unittest-compatible framework for repeating a test function over many fixtures";
+    homepage = "https://github.com/epsy/repeated_test";
+    changelog = "https://github.com/epsy/repeated_test/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ tjni ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/repocheck/default.nix b/nixpkgs/pkgs/development/python-modules/repocheck/default.nix
new file mode 100644
index 000000000000..9d6c2c419216
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/repocheck/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "repocheck";
+  version = "2015-08-05";
+
+  src = fetchFromGitHub {
+    sha256 = "1jc4v5zy7z7xlfmbfzvyzkyz893f5x2k6kvb3ni3rn2df7jqhc81";
+    rev = "ee48d0e88d3f5814d24a8d1f22d5d83732824688";
+    repo = "repocheck";
+    owner = "kynikos";
+  };
+
+  meta = with lib; {
+    inherit (src.meta) homepage;
+    description = "Check the status of code repositories under a root directory";
+    license = licenses.gpl3Plus;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/reportengine/default.nix b/nixpkgs/pkgs/development/python-modules/reportengine/default.nix
new file mode 100644
index 000000000000..79e1a908f7eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reportengine/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit
+, jinja2
+, ruamel-yaml
+, matplotlib
+, pandas
+, pandoc
+, pygments
+, blessings
+, curio
+, hypothesis
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "reportengine";
+  version = "0.31";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jrt+ml8o1PUidV1bY0hCyNgcPaVTBloW574/i5Pl7iE=";
+  };
+
+  nativeBuildInputs = [ flit ];
+
+  propagatedBuildInputs = [
+    jinja2
+    ruamel-yaml
+    matplotlib
+    pandas
+    pygments
+    blessings
+    curio
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pandoc
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "reportengine" ];
+
+  meta = with lib; {
+    description = "A framework for declarative data analysis";
+    homepage = "https://github.com/NNPDF/reportengine/";
+    license = with licenses; [ gpl2Only ];
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/reportlab/darwin-m1-compat.patch b/nixpkgs/pkgs/development/python-modules/reportlab/darwin-m1-compat.patch
new file mode 100644
index 000000000000..5c9d4404f97e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reportlab/darwin-m1-compat.patch
@@ -0,0 +1,13 @@
+diff --git a/setup.py b/setup.py
+index 7625074..b3aa2fc 100644
+--- a/setup.py
++++ b/setup.py
+@@ -249,7 +249,7 @@ class inc_lib_dirs:
+             aDir(L, os.path.join("/usr/lib", "python%s" % sys.version[:3], "config"))
+         elif platform == "darwin":
+             machine = sysconfig_platform.split('-')[-1]
+-            if machine=='arm64' or os.environ.get('ARCHFLAGS','')=='-arch arm64':
++            if False and machine=='arm64' or os.environ.get('ARCHFLAGS','')=='-arch arm64':
+                 #print('!!!!! detected darwin arm64 build')
+                 #probably an M1
+                 target = pjoin(
diff --git a/nixpkgs/pkgs/development/python-modules/reportlab/default.nix b/nixpkgs/pkgs/development/python-modules/reportlab/default.nix
new file mode 100644
index 000000000000..664d87040c45
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reportlab/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, freetype
+, pillow
+, setuptools
+, glibcLocales
+, python
+, isPyPy
+}:
+
+let
+  ft = freetype.overrideAttrs (oldArgs: { dontDisableStatic = true; });
+in buildPythonPackage rec {
+  pname = "reportlab";
+  version = "4.0.4";
+  format = "pyproject";
+
+  # See https://bitbucket.org/pypy/compatibility/wiki/reportlab%20toolkit
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-f3CztWr/XxHLQTbFGg9aVv5uTI+7rHuQMHbbmajvMcE=";
+  };
+
+  postPatch = ''
+    # Remove all the test files that require access to the internet to pass.
+    rm tests/test_lib_utils.py
+    rm tests/test_platypus_general.py
+    rm tests/test_platypus_images.py
+
+    # Remove the tests that require Vera fonts installed
+    rm tests/test_graphics_render.py
+    rm tests/test_graphics_charts.py
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  buildInputs = [
+    ft
+  ];
+
+  propagatedBuildInputs = [
+    pillow
+  ];
+
+  nativeCheckInputs = [
+    glibcLocales
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    pushd tests
+    LC_ALL="en_US.UTF-8" ${python.interpreter} runAll.py
+    popd
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "An Open Source Python library for generating PDFs and graphics";
+    homepage = "http://www.reportlab.com/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/repoze_lru/default.nix b/nixpkgs/pkgs/development/python-modules/repoze_lru/default.nix
new file mode 100644
index 000000000000..cfe19f6b6376
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/repoze_lru/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "repoze.lru";
+  version = "0.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0429a75e19380e4ed50c0694e26ac8819b4ea7851ee1fc7583c8572db80aff77";
+  };
+
+  pythonImportsCheck = [ "repoze.lru" ];
+
+  meta = with lib; {
+    description = "A tiny LRU cache implementation and decorator";
+    homepage = "http://www.repoze.org/";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/repoze_sphinx_autointerface/default.nix b/nixpkgs/pkgs/development/python-modules/repoze_sphinx_autointerface/default.nix
new file mode 100644
index 000000000000..073977d1252e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/repoze_sphinx_autointerface/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, zope_interface
+, zope_testrunner
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "repoze.sphinx.autointerface";
+  version = "1.0.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-SGvxQjpGlrkVPkiM750ybElv/Bbd6xSwyYh7RsYOKKE=";
+  };
+
+  propagatedBuildInputs = [
+    zope_interface
+    sphinx
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    zope_testrunner
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/repoze/repoze.sphinx.autointerface";
+    description = "Auto-generate Sphinx API docs from Zope interfaces";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/repoze_who/default.nix b/nixpkgs/pkgs/development/python-modules/repoze_who/default.nix
new file mode 100644
index 000000000000..3231eafb0fc9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/repoze_who/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zope_interface
+, webob
+}:
+
+buildPythonPackage rec {
+  pname = "repoze.who";
+  version = "3.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6VWt8AwfCwxxXoKJeaI37Ev37nCCe9l/Xhe/gnYNyzA=";
+  };
+
+  propagatedBuildInputs = [ zope_interface webob ];
+
+  # skip failing test
+  # OSError: [Errno 22] Invalid argument
+  preCheck = ''
+    rm repoze/who/plugins/tests/test_htpasswd.py
+  '';
+
+  meta = with lib; {
+    description = "WSGI Authentication Middleware / API";
+    homepage = "http://www.repoze.org";
+    changelog = "https://github.com/repoze/repoze.who/blob/${version}/CHANGES.rst";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/reproject/default.nix b/nixpkgs/pkgs/development/python-modules/reproject/default.nix
new file mode 100644
index 000000000000..81ab320c77f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reproject/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, astropy
+, astropy-extension-helpers
+, astropy-healpix
+, buildPythonPackage
+, cloudpickle
+, cython
+, dask
+, fetchPypi
+, fsspec
+, numpy
+, oldest-supported-numpy
+, pytest-astropy
+, pytestCheckHook
+, pythonOlder
+, scipy
+, setuptools-scm
+, zarr
+}:
+
+buildPythonPackage rec {
+  pname = "reproject";
+  version = "0.12.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jb4efKT5jMY0ECV+ab5rpUHEk+tT4T2MioCRxs92TbI=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "cython==" "cython>="
+  '';
+
+  nativeBuildInputs = [
+    astropy-extension-helpers
+    cython
+    numpy
+    oldest-supported-numpy
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    astropy
+    astropy-healpix
+    cloudpickle
+    dask
+    fsspec
+    numpy
+    scipy
+    zarr
+  ] ++ dask.optional-dependencies.array;
+
+  nativeCheckInputs = [
+    pytest-astropy
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "build/lib*"
+    # Avoid failure due to user warning: Distutils was imported before Setuptools
+    "-p no:warnings"
+    # Uses network
+    "--ignore build/lib*/reproject/interpolation/"
+  ];
+
+  pythonImportsCheck = [
+    "reproject"
+  ];
+
+  meta = with lib; {
+    description = "Reproject astronomical images";
+    downloadPage = "https://github.com/astropy/reproject";
+    homepage = "https://reproject.readthedocs.io";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ smaret ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/reprshed/default.nix b/nixpkgs/pkgs/development/python-modules/reprshed/default.nix
new file mode 100644
index 000000000000..1aa9469aab29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reprshed/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "python-reprshed";
+  version = "1.0.6";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "mentalisttraceur";
+    repo = "python-reprshed";
+    rev = "v${version}";
+    hash = "sha256-XfmiewI74eDLKTAU6Ed76QXfJYMRb+idRACl6CW07ME=";
+  };
+
+  pythonImportsCheck = [
+    "reprshed"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mentalisttraceur/python-reprshed";
+    description = "A toolshed for writing great __repr__ methods quickly and easily";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ netali ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/reptor/default.nix b/nixpkgs/pkgs/development/python-modules/reptor/default.nix
new file mode 100644
index 000000000000..d48a84025e4c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reptor/default.nix
@@ -0,0 +1,111 @@
+{ lib
+, asgiref
+, buildPythonPackage
+, certifi
+, charset-normalizer
+, cvss
+, deepl
+, django
+, fetchFromGitHub
+, gql
+, idna
+, markdown-it-py
+, mdurl
+, pygments
+, pytest
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, reptor
+, requests
+, rich
+, setuptools
+, sqlparse
+, termcolor
+, toml
+, tomli-w
+, urllib3
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "reptor";
+  version = "0.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Syslifters";
+    repo = "reptor";
+    rev = "refs/tags/${version}";
+    hash = "sha256-d76Hsf+leJKYOh7k/RVuo6adfjMW6yAYt+vh7KNh7sA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    asgiref
+    certifi
+    charset-normalizer
+    cvss
+    django
+    idna
+    markdown-it-py
+    mdurl
+    pygments
+    pyyaml
+    requests
+    rich
+    sqlparse
+    termcolor
+    toml
+    tomli-w
+    urllib3
+    xmltodict
+  ];
+
+  passthru.optional-dependencies = {
+    ghostwriter = [
+      gql
+    ] ++ gql.optional-dependencies.aiohttp;
+    translate = [
+      deepl
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+    export PATH="$PATH:$out/bin";
+  '';
+
+  pythonImportsCheck = [
+    "reptor"
+  ];
+
+  disabledTestPaths = [
+    # Tests want to use pip install dependencies
+    "reptor/plugins/importers/GhostWriter/tests/test_ghostwriter.py"
+  ];
+
+  disabledTests = [
+    # Tests need network access
+    "TestDummy"
+    "TestIntegration"
+
+  ];
+
+  meta = with lib; {
+    description = "Module to do automated pentest reporting with SysReptor";
+    homepage = "https://github.com/Syslifters/reptor";
+    changelog = "https://github.com/Syslifters/reptor/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/reqif/default.nix b/nixpkgs/pkgs/development/python-modules/reqif/default.nix
new file mode 100644
index 000000000000..e0ba5610ebd5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reqif/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, python
+, fetchFromGitHub
+, hatchling
+, beautifulsoup4
+, lxml
+, jinja2
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "reqif";
+  version = "0.0.35";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "strictdoc-project";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-3yOLOflPqzJRv3qCQXFK3rIFftBq8FkYy7XhOfWH82Y=";
+  };
+
+  postPatch = ''
+    substituteInPlace ./tests/unit/conftest.py --replace \
+       "os.path.abspath(os.path.join(__file__, \"../../../../reqif\"))" \
+      "\"${placeholder "out"}/${python.sitePackages}/reqif\""
+    substituteInPlace requirements.txt --replace "==" ">="
+  '';
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    lxml
+    jinja2
+  ];
+
+  pythonImportsCheck = [
+    "reqif"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Python library for ReqIF format";
+    homepage = "https://github.com/strictdoc-project/reqif";
+    changelog = "https://github.com/strictdoc-project/reqif/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ yuu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/requests-aws4auth/default.nix b/nixpkgs/pkgs/development/python-modules/requests-aws4auth/default.nix
new file mode 100644
index 000000000000..9ce588e3206b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-aws4auth/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, pytestCheckHook
+, python
+, pythonOlder
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "requests-aws4auth";
+  version = "1.2.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tedder";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-9ySuX7eKrSwgxgFoMdnVTsIfpnm9kVcI9AqSb+AsVaU=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    six
+  ];
+
+  passthru.optional-dependencies = {
+    httpx = [
+      httpx
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.httpx;
+
+  pythonImportsCheck = [
+    "requests_aws4auth"
+  ];
+
+  meta = with lib; {
+    description = "Amazon Web Services version 4 authentication for the Python Requests library";
+    homepage = "https://github.com/sam-washington/requests-aws4auth";
+    changelog = "https://github.com/tedder/requests-aws4auth/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ basvandijk ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/requests-cache/default.nix b/nixpkgs/pkgs/development/python-modules/requests-cache/default.nix
new file mode 100644
index 000000000000..d04f25ae0e01
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-cache/default.nix
@@ -0,0 +1,127 @@
+{ lib
+, attrs
+, buildPythonPackage
+, bson
+, boto3
+, botocore
+, cattrs
+, fetchFromGitHub
+, itsdangerous
+, platformdirs
+, poetry-core
+, psutil
+, pymongo
+, pytestCheckHook
+, pytest-rerunfailures
+, pytest-xdist
+, pythonOlder
+, pyyaml
+, redis
+, requests
+, requests-mock
+, responses
+, rich
+, tenacity
+, time-machine
+, timeout-decorator
+, ujson
+, urllib3
+, url-normalize
+}:
+
+buildPythonPackage rec {
+  pname = "requests-cache";
+  version = "1.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "requests-cache";
+    repo = "requests-cache";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-kJqy7aK67JFtmsrwMtze/wTM9qch9YYj2eUzGJRJreQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    cattrs
+    platformdirs
+    requests
+    urllib3
+    url-normalize
+  ];
+
+  passthru.optional-dependencies = {
+    dynamodb = [
+      boto3
+      botocore
+    ];
+    mongodbo = [
+      pymongo
+    ];
+    redis = [
+      redis
+    ];
+    bson = [
+      bson
+    ];
+    json = [
+      ujson
+    ];
+    security = [
+      itsdangerous
+    ];
+    yaml = [
+      pyyaml
+    ];
+  };
+
+  nativeCheckInputs = [
+    psutil
+    pytestCheckHook
+    pytest-rerunfailures
+    pytest-xdist
+    requests-mock
+    responses
+    rich
+    tenacity
+    time-machine
+    timeout-decorator
+  ]
+  ++ passthru.optional-dependencies.json
+  ++ passthru.optional-dependencies.security;
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  pytestFlagsArray = [
+    # Integration tests require local DBs
+    "tests/unit"
+  ];
+
+  disabledTests = [
+    # Tests are flaky in the sandbox
+    "test_remove_expired_responses"
+    # Tests that broke with urllib 2.0.5
+    "test_request_only_if_cached__stale_if_error__expired"
+    "test_stale_if_error__error_code"
+  ];
+
+  pythonImportsCheck = [
+    "requests_cache"
+  ];
+
+  meta = with lib; {
+    description = "Persistent cache for requests library";
+    homepage = "https://github.com/reclosedev/requests-cache";
+    changelog = "https://github.com/requests-cache/requests-cache/blob/v${version}/HISTORY.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/requests-credssp/default.nix b/nixpkgs/pkgs/development/python-modules/requests-credssp/default.nix
new file mode 100644
index 000000000000..8c7dfc3aee8d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-credssp/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, gssapi
+, krb5
+, pyspnego
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "requests-credssp";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jborean93";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-HHLEmQ+mNjMjpR6J+emrKFM+2PiYq32o7Gnoo0gUrNA=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    pyspnego
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  passthru.optional-dependencies = {
+    kerberos = [
+      # pyspnego[kerberos] will have those two dependencies
+      gssapi
+      krb5
+    ];
+  };
+
+  pythonImportsCheck = [
+    "requests_credssp"
+  ];
+
+  meta = with lib; {
+    description = "HTTPS CredSSP authentication with the requests library";
+    homepage = "https://github.com/jborean93/requests-credssp";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/requests-file/default.nix b/nixpkgs/pkgs/development/python-modules/requests-file/default.nix
new file mode 100644
index 000000000000..de7a94c75aa0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-file/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pytestCheckHook
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "requests-file";
+  version = "1.5.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-B9dCCNM4nQHDirie9AOvDP7GOVfVOgCB2OynONAkfY4=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "requests_file"
+  ];
+
+  meta = with lib; {
+    description = "Transport adapter for fetching file:// URLs with the requests python library";
+    homepage = "https://github.com/dashea/requests-file";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/requests-futures/default.nix b/nixpkgs/pkgs/development/python-modules/requests-futures/default.nix
new file mode 100644
index 000000000000..b2f1aab46988
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-futures/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "requests-futures";
+  version = "1.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-9VpO+ABw4oWOfR5zEj0r+uryW5P9NDhNjd8UjitnY3M=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Tests are disabled because they require being online
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "requests_futures"
+  ];
+
+  meta = with lib; {
+    description = "Asynchronous Python HTTP Requests for Humans using Futures";
+    homepage = "https://github.com/ross/requests-futures";
+    changelog = "https://github.com/ross/requests-futures/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ applePrincess ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/requests-hawk/default.nix b/nixpkgs/pkgs/development/python-modules/requests-hawk/default.nix
new file mode 100644
index 000000000000..74bafbcabca5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-hawk/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, python, mohawk, requests }:
+
+buildPythonPackage rec {
+  pname = "requests-hawk";
+  version = "1.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-rZIFBCyUvbFa+qGbB4DhEHeyTZ5c/6wfs9JssIqkNbc=";
+  };
+
+  propagatedBuildInputs = [ mohawk requests ];
+
+  meta = with lib; {
+    description = "Hawk authentication strategy for the requests python library.";
+    homepage = "https://github.com/mozilla-services/requests-hawk";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ austinbutler ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/requests-http-signature/default.nix b/nixpkgs/pkgs/development/python-modules/requests-http-signature/default.nix
new file mode 100644
index 000000000000..36b993d79553
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-http-signature/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, http-message-signatures
+, http-sfv
+, requests
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "requests-http-signature";
+  version = "0.7.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pyauth";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-sW2vYqT/nY27DvEKHdptc3dUpuqKmD7PLMs+Xp+cpeU=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    http-message-signatures
+    http-sfv
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "test/test.py"
+  ];
+
+  disabledTests = [
+    # Test require network access
+    "test_readme_example"
+  ];
+
+  pythonImportsCheck = [
+    "requests_http_signature"
+  ];
+
+  meta = with lib; {
+    description = "Requests authentication module for HTTP Signature";
+    homepage = "https://github.com/kislyuk/requests-http-signature";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ mmai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/requests-kerberos/default.nix b/nixpkgs/pkgs/development/python-modules/requests-kerberos/default.nix
new file mode 100644
index 000000000000..38a38f27dfa4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-kerberos/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pykerberos
+, pyspnego
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "requests-kerberos";
+  version = "0.14.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "requests";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Y9dTzFCgVmSnbnTE0kEfjpEkXDEA+uOqFHLkSC27YGg=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    requests
+    pykerberos
+    pyspnego
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+  ];
+
+  # avoid needing to package krb5
+  postPatch = ''
+    substituteInPlace setup.py \
+    --replace "pyspnego[kerberos]" "pyspnego"
+  '';
+
+  pythonImportsCheck = [
+    "requests_kerberos"
+  ];
+
+  meta = with lib; {
+    description = "An authentication handler for using Kerberos with Python Requests";
+    homepage = "https://github.com/requests/requests-kerberos";
+    license = licenses.isc;
+    maintainers = with maintainers; [ catern ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/requests-mock/default.nix b/nixpkgs/pkgs/development/python-modules/requests-mock/default.nix
new file mode 100644
index 000000000000..4e72ce67364a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-mock/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fixtures
+, purl
+, pytestCheckHook
+, python
+, requests
+, requests-futures
+, six
+, testtools
+}:
+
+buildPythonPackage rec {
+  pname = "requests-mock";
+  version = "1.11.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7xC1crSJpfKOCbcIaXIIxKOyuJ74Cp8BWENA6jV+w8Q=";
+  };
+
+  propagatedBuildInputs = [ requests six ];
+
+  nativeCheckInputs = [
+    fixtures
+    purl
+    pytestCheckHook
+    requests-futures
+    testtools
+  ];
+
+  meta = with lib; {
+    description = "Mock out responses from the requests package";
+    homepage = "https://requests-mock.readthedocs.io";
+    changelog = "https://github.com/jamielennox/requests-mock/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/requests-oauthlib/default.nix b/nixpkgs/pkgs/development/python-modules/requests-oauthlib/default.nix
new file mode 100644
index 000000000000..225bf1ecbbdf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-oauthlib/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, oauthlib
+, pytestCheckHook
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "requests-oauthlib";
+  version = "1.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-db6sSkeIHuuU1epdatMe+IhWr/4jMrmq+1LGRSzPDXo=";
+  };
+
+  propagatedBuildInputs = [ oauthlib requests ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+    requests-mock
+  ];
+
+  # Exclude tests which require network access
+  disabledTests = [
+    "testCanPostBinaryData"
+    "test_content_type_override"
+    "test_url_is_native_str"
+  ];
+
+  pythonImportsCheck = [ "requests_oauthlib" ];
+
+  meta = with lib; {
+    description = "OAuthlib authentication support for Requests";
+    homepage = "https://github.com/requests/requests-oauthlib";
+    license = with licenses; [ isc ];
+    maintainers = with maintainers; [ prikhi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/requests-pkcs12/default.nix b/nixpkgs/pkgs/development/python-modules/requests-pkcs12/default.nix
new file mode 100644
index 000000000000..4c939064d759
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-pkcs12/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyopenssl
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "requests-pkcs12";
+  version = "1.22";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "m-click";
+    repo = "requests_pkcs12";
+    rev = version;
+    hash = "sha256-YMFeWbPTwxP/+lYojXEbJf87FNHL6QrzOdOKF5JERSE=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    pyopenssl
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "requests_pkcs12"
+  ];
+
+  meta = with lib; {
+    description = "PKCS#12 support for the Python requests library";
+    homepage = "https://github.com/m-click/requests_pkcs12";
+    license = with licenses; [ isc ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/requests-ratelimiter/default.nix b/nixpkgs/pkgs/development/python-modules/requests-ratelimiter/default.nix
new file mode 100644
index 000000000000..5cc57d86a57f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-ratelimiter/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pyrate-limiter
+, requests
+, pytestCheckHook
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "requests-ratelimiter";
+  version = "0.4.2";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "JWCook";
+    repo = "requests-ratelimiter";
+    rev = "v${version}";
+    hash = "sha256-w4cBQRpk9UTuGA0lPDsqpQ3UEIQdYe38NYXz+V4+Lvc=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pyrate-limiter
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pythonImportsCheck = [ "requests_ratelimiter" ];
+
+  meta = with lib; {
+    description = "Easy rate-limiting for python requests";
+    homepage = "https://github.com/JWCook/requests-ratelimiter";
+    changelog = "https://github.com/JWCook/requests-ratelimiter/blob/${src.rev}/HISTORY.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/requests-toolbelt/default.nix b/nixpkgs/pkgs/development/python-modules/requests-toolbelt/default.nix
new file mode 100644
index 000000000000..0d4bf487d7bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-toolbelt/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, betamax
+, buildPythonPackage
+, fetchPypi
+, pyopenssl
+, pytestCheckHook
+, requests
+, trustme
+}:
+
+buildPythonPackage rec {
+  pname = "requests-toolbelt";
+  version = "1.0.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-doGgo9BHAStb3A7jfX+PB+vnarCMrsz8OSHOI8iNW8Y=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    betamax
+    pyopenssl
+    pytestCheckHook
+    trustme
+  ];
+
+  disabledTests = [
+    # incompatible with urllib3 2.0
+    "test_dump_response"
+    "test_dump_all"
+    "test_prepared_request_override_base"
+    "test_prepared_request_with_base"
+    "test_request_override_base"
+    "test_request_with_base"
+  ];
+
+  pythonImportsCheck = [
+    "requests_toolbelt"
+  ];
+
+  meta = with lib; {
+    description = "Toolbelt of useful classes and functions to be used with requests";
+    homepage = "http://toolbelt.rtfd.org";
+    changelog = "https://github.com/requests/toolbelt/blob/${version}/HISTORY.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ matthiasbeyer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/requests-unixsocket/default.nix b/nixpkgs/pkgs/development/python-modules/requests-unixsocket/default.nix
new file mode 100644
index 000000000000..58ecce446c21
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-unixsocket/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pbr
+, requests
+, pytestCheckHook
+, waitress
+}:
+
+buildPythonPackage rec {
+  pname = "requests-unixsocket";
+  version = "0.3.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-KDBCg+qTV9Rf/1itWxHkdwjPv1gGgXqlmyo2Mijulx4=";
+  };
+
+  patches = [
+    # https://github.com/msabramo/requests-unixsocket/pull/69
+    (fetchpatch {
+      name = "urllib3-2-compatibility.patch";
+      url = "https://github.com/msabramo/requests-unixsocket/commit/39b9c64847a52ddc8c6d14ff414a6a7a3f6358d9.patch";
+      hash = "sha256-DFtjhk33JLCu7FW6XI7uf2klNmwzvh2QNwxUb4W223Q=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    waitress
+  ];
+
+  pythonImportsCheck = [
+    "requests_unixsocket"
+  ];
+
+  meta = with lib; {
+    description = "Use requests to talk HTTP via a UNIX domain socket";
+    homepage = "https://github.com/msabramo/requests-unixsocket";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ catern ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/requests-wsgi-adapter/default.nix b/nixpkgs/pkgs/development/python-modules/requests-wsgi-adapter/default.nix
new file mode 100644
index 000000000000..77386c21a869
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests-wsgi-adapter/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "requests-wsgi-adapter";
+  version = "0.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WncJ6Qq/SdGB9sMqo3eUU39yXeD23UI2K8jIyQgSyHg=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # tests are not contained in pypi-release
+  doCheck = false;
+
+  meta = with lib; {
+    description = "WSGI Transport Adapter for Requests";
+    homepage = "https://github.com/seanbrant/requests-wsgi-adapter";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ betaboon ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/requests/default.nix b/nixpkgs/pkgs/development/python-modules/requests/default.nix
new file mode 100644
index 000000000000..44733b2da0af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests/default.nix
@@ -0,0 +1,94 @@
+{ lib
+, stdenv
+, brotlicffi
+, buildPythonPackage
+, certifi
+, chardet
+, charset-normalizer
+, fetchPypi
+, fetchpatch
+, idna
+, pysocks
+, pytest-mock
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "requests";
+  version = "2.31.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  __darwinAllowLocalNetworking = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lCxadY+Y15Dq7Ropy27vx/+w0c968Fw9J5Flbb1q0eE=";
+  };
+
+  propagatedBuildInputs = [
+    brotlicffi
+    certifi
+    charset-normalizer
+    idna
+    urllib3
+  ];
+
+  passthru.optional-dependencies = {
+    security = [];
+    socks = [
+      pysocks
+    ];
+    use_chardet_on_py3 = [
+      chardet
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytest-xdist
+    pytestCheckHook
+  ]
+  ++ passthru.optional-dependencies.socks;
+
+  disabledTests = [
+    # Disable tests that require network access and use httpbin
+    "requests.api.request"
+    "requests.models.PreparedRequest"
+    "requests.sessions.Session"
+    "requests"
+    "test_redirecting_to_bad_url"
+    "test_requests_are_updated_each_time"
+    "test_should_bypass_proxies_pass_only_hostname"
+    "test_urllib3_pool_connection_closed"
+    "test_urllib3_retries"
+    "test_use_proxy_from_environment"
+    "TestRequests"
+    "TestTimeout"
+  ] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
+    # Fatal Python error: Aborted
+    "test_basic_response"
+    "test_text_response"
+  ];
+
+  disabledTestPaths = lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
+    # Fatal Python error: Aborted
+    "tests/test_lowlevel.py"
+  ];
+
+  pythonImportsCheck = [
+    "requests"
+  ];
+
+  meta = with lib; {
+    description = "HTTP library for Python";
+    homepage = "http://docs.python-requests.org/";
+    changelog = "https://github.com/psf/requests/blob/v${version}/HISTORY.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/requests_download/default.nix b/nixpkgs/pkgs/development/python-modules/requests_download/default.nix
new file mode 100644
index 000000000000..b31573a91ca0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests_download/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "requests_download";
+  version = "0.1.2";
+
+  format = "wheel";
+
+  #src = pkgs.fetchurl {
+  #  url = "https://files.pythonhosted.org/packages/60/af/10f899f0574a81cbc511124c08d7c7dc46c20d4f956a6a3c793ad4330bb4/requests_download-0.1.2-py2.py3-none-any.whl";
+  #  sha256 = "1ballx1hljpdpyvqzqn79m0dc21z2smrnxk2ylb6dbpg5crrskcr";
+  #};
+
+  src = fetchPypi {
+    inherit pname version format;
+    sha256 = "1ballx1hljpdpyvqzqn79m0dc21z2smrnxk2ylb6dbpg5crrskcr";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  meta = {
+    description = "Download files using requests and save them to a target path";
+    homepage = "https://www.github.com/takluyver/requests_download";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/requests_ntlm/default.nix b/nixpkgs/pkgs/development/python-modules/requests_ntlm/default.nix
new file mode 100644
index 000000000000..43a002e1e19e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requests_ntlm/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, cryptography
+, pyspnego
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "requests-ntlm";
+  version = "1.2.0";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "requests_ntlm";
+    inherit version;
+    hash = "sha256-M8KF9QdOMXy90zjRma+kanwBEy5cER02vUFVNOm5Fqg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    pyspnego
+    requests
+  ];
+
+  pythonImportsCheck = [ "requests_ntlm" ];
+
+  # Tests require networking
+  doCheck = false;
+
+  meta = with lib; {
+    description = "HTTP NTLM authentication support for python-requests";
+    homepage = "https://github.com/requests/requests-ntlm";
+    changelog = "https://github.com/requests/requests-ntlm/releases/tag/v${version}";
+    license = licenses.isc;
+    maintainers = with maintainers; [ elasticdog ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/requestsexceptions/default.nix b/nixpkgs/pkgs/development/python-modules/requestsexceptions/default.nix
new file mode 100644
index 000000000000..55b320955351
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requestsexceptions/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, pbr }:
+
+buildPythonPackage rec {
+  pname = "requestsexceptions";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b095cbc77618f066d459a02b137b020c37da9f46d9b057704019c9f77dba3065";
+  };
+
+  propagatedBuildInputs = [ pbr ];
+
+  # upstream hacking package is not required for functional testing
+  patchPhase = ''
+    sed -i '/^hacking/d' test-requirements.txt
+  '';
+
+  meta = with lib; {
+    description = "Import exceptions from potentially bundled packages in requests.";
+    homepage = "https://pypi.python.org/pypi/requestsexceptions";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ makefu ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/requirements-detector/default.nix b/nixpkgs/pkgs/development/python-modules/requirements-detector/default.nix
new file mode 100644
index 000000000000..5acc7ae6ae26
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requirements-detector/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, astroid
+, buildPythonPackage
+, fetchFromGitHub
+, packaging
+, poetry-core
+, poetry-semver
+, pytestCheckHook
+, pythonOlder
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "requirements-detector";
+  version = "1.2.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "landscapeio";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-qmrHFQRypBJOI1N6W/Dtc5ss9JGqoPhFlbqrLHcb6vc=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    astroid
+    packaging
+    poetry-semver
+    toml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "requirements_detector"
+  ];
+
+  meta = with lib; {
+    description = "Python tool to find and list requirements of a Python project";
+    homepage = "https://github.com/landscapeio/requirements-detector";
+    changelog = "https://github.com/landscapeio/requirements-detector/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kamadorueda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/requirements-parser/default.nix b/nixpkgs/pkgs/development/python-modules/requirements-parser/default.nix
new file mode 100644
index 000000000000..11fe8edf6a10
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/requirements-parser/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, types-setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "requirements-parser";
+  version = "0.5.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "madpah";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-e2dfVBMh1uGRMDw7OdPefO4/eRxc3BGwvy/D7u5ipkk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    setuptools
+    types-setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "requirements"
+  ];
+
+  meta = with lib; {
+    description = "Pip requirements file parser";
+    homepage = "https://github.com/davidfischer/requirements-parser";
+    license = licenses.bsd2;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/reretry/default.nix b/nixpkgs/pkgs/development/python-modules/reretry/default.nix
new file mode 100644
index 000000000000..c4c6928af042
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/reretry/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "reretry";
+  version = "0.11.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8nkfzr5RLqLx0VOih0d4UjqAZIYLWRzZCvwhqL7UMuM=";
+  };
+
+  meta = with lib; {
+    description = "An easy to use retry decorator.";
+    homepage = "https://github.com/leshchenko1979/reretry";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ renatoGarcia ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/resampy/default.nix b/nixpkgs/pkgs/development/python-modules/resampy/default.nix
new file mode 100644
index 000000000000..f9827dca48d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/resampy/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchFromGitHub
+, numba
+, numpy
+, pytestCheckHook
+, pythonOlder
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "resampy";
+  version = "0.4.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bmcfee";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-t5I7NJmIeV0uucPyvR+UJ24NK7fIzYlNJ8bECkbvdjI=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    cython
+    numba
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    scipy
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --cov-report term-missing --cov resampy --cov-report=xml" ""
+  '';
+
+  pythonImportsCheck = [
+    "resampy"
+  ];
+
+  meta = with lib; {
+    description = "Efficient signal resampling";
+    homepage = "https://github.com/bmcfee/resampy";
+    license = licenses.isc;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/resize-right/default.nix b/nixpkgs/pkgs/development/python-modules/resize-right/default.nix
new file mode 100644
index 000000000000..6a0b9b5cd773
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/resize-right/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+
+# dependencies
+, numpy
+, torch
+}:
+
+buildPythonPackage rec {
+  pname = "resize-right";
+  version = "0.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-fcNbcs5AErd/fMkEmDUWN5OrmKWKuIk2EPsRn+Wa9SA=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    torch
+  ];
+
+  pythonImportsCheck = [
+    "resize_right"
+  ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "The correct way to resize images or tensors. For Numpy or Pytorch (differentiable";
+    homepage = "https://github.com/assafshocher/ResizeRight";
+    license = licenses.mit;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/resolvelib/default.nix b/nixpkgs/pkgs/development/python-modules/resolvelib/default.nix
new file mode 100644
index 000000000000..dc809ecbdee0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/resolvelib/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, commentjson
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "resolvelib";
+  # Currently this package is only used by Ansible and breaking changes
+  # are frequently introduced, so when upgrading ensure the new version
+  # is compatible with Ansible
+  # https://github.com/NixOS/nixpkgs/pull/128636
+  # https://github.com/ansible/ansible/blob/devel/requirements.txt
+  version = "0.5.5";
+
+  src = fetchFromGitHub {
+    owner = "sarugaku";
+    repo = "resolvelib";
+    rev = version;
+    sha256 = "198vfv78hilpg0d0mjzchzp9zk6239wnra61vlsgwpcgz66d2bgv";
+  };
+
+  nativeCheckInputs = [
+    commentjson
+    pytestCheckHook
+  ];
+  # TODO: reenable after updating to >= 1.0.0
+  # https://github.com/sarugaku/resolvelib/issues/114
+  disabledTests = [
+    "shared_parent_dependency"
+    "deep_complex_conflict"
+    "shared_parent_dependency_with_swapping"
+    "spapping_and_rewinding"
+    "pruned_unresolved_orphan"
+    "conflict_common_parent"
+    "same-package"
+  ];
+
+  pythonImportsCheck = [
+    "resolvelib"
+  ];
+
+  meta = with lib; {
+    description = "Resolve abstract dependencies into concrete ones";
+    homepage = "https://github.com/sarugaku/resolvelib";
+    license = licenses.isc;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/responses/default.nix b/nixpkgs/pkgs/development/python-modules/responses/default.nix
new file mode 100644
index 000000000000..a35b03680a44
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/responses/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-httpserver
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, requests
+, tomli
+, tomli-w
+, types-pyyaml
+, types-toml
+, typing-extensions
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "responses";
+  version = "0.23.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  __darwinAllowLocalNetworking = true;
+
+  src = fetchFromGitHub {
+    owner = "getsentry";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-VJmcRMn0O+3mDwzkCwxIX7RU3/I9T9p9N8t6USWDZJQ=";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+    requests
+    types-pyyaml
+    types-toml
+    urllib3
+  ]  ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-httpserver
+    pytestCheckHook
+    tomli-w
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  pythonImportsCheck = [
+    "responses"
+  ];
+
+  meta = with lib; {
+    description = "Python module for mocking out the requests Python library";
+    homepage = "https://github.com/getsentry/responses";
+    changelog = "https://github.com/getsentry/responses/blob/${version}/CHANGES";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/respx/default.nix b/nixpkgs/pkgs/development/python-modules/respx/default.nix
new file mode 100644
index 000000000000..9d0bf307ff23
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/respx/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, httpcore
+, httpx
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, starlette
+, trio
+}:
+
+buildPythonPackage rec {
+  pname = "respx";
+  version = "0.20.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "lundberg";
+    repo = pname;
+    rev = version;
+    hash = "sha256-OiBKNK8V9WNQDe29Q5+E/jjBWD0qFcYUzhYUWA+7oFc=";
+  };
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  nativeCheckInputs = [
+    httpcore
+    httpx
+    flask
+    pytest-asyncio
+    pytestCheckHook
+    starlette
+    trio
+  ];
+
+  postPatch = ''
+    sed -i "/--cov/d" setup.cfg
+  '';
+
+  disabledTests = [
+    "test_pass_through"
+  ];
+
+  pythonImportsCheck = [
+    "respx"
+  ];
+
+  meta = with lib; {
+    description = "Python library for mocking HTTPX";
+    homepage = "https://lundberg.github.io/respx/";
+    changelog = "https://github.com/lundberg/respx/blob/${version}/CHANGELOG.md";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/restfly/default.nix b/nixpkgs/pkgs/development/python-modules/restfly/default.nix
new file mode 100644
index 000000000000..8ebc4ee2b880
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/restfly/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, arrow
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-datafiles
+, pytest-vcr
+, pytestCheckHook
+, python-box
+, pythonOlder
+, responses
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "restfly";
+  version = "1.4.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "stevemcgrath";
+    repo = pname;
+    rev = version;
+    hash = "sha256-PPXJHatJKve9fIjveVYRnTSIDHFmnSDWTnkgO91twJs=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    arrow
+    python-box
+  ];
+
+  nativeCheckInputs = [
+    pytest-datafiles
+    pytest-vcr
+    pytestCheckHook
+    responses
+  ];
+
+  disabledTests = [
+    # Test requires network access
+    "test_session_ssl_error"
+  ];
+
+  pythonImportsCheck = [
+    "restfly"
+  ];
+
+  meta = with lib; {
+    description = "Python RESTfly API Library Framework";
+    homepage = "https://github.com/stevemcgrath/restfly";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/restrictedpython/default.nix b/nixpkgs/pkgs/development/python-modules/restrictedpython/default.nix
new file mode 100644
index 000000000000..875771d8f8c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/restrictedpython/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest-mock
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "restrictedpython";
+  version = "6.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "RestrictedPython";
+    inherit version;
+    hash = "sha256-23Prfjs5ZQ8NIdEMyN2pwOKYbmIclLDF3jL7De46CK8=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+  ];
+
+  disabledTests = lib.optionals (pythonAtLeast "3.11") [
+    "test_compile__compile_restricted_exec__5"
+  ];
+
+  pythonImportsCheck = [
+    "RestrictedPython"
+  ];
+
+  meta = with lib; {
+    description = "Restricted execution environment for Python to run untrusted code";
+    homepage = "https://github.com/zopefoundation/RestrictedPython";
+    changelog = "https://github.com/zopefoundation/RestrictedPython/blob/${version}/CHANGES.rst";
+    license = licenses.zpl21;
+    maintainers = with maintainers; [ juaningan ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/restructuredtext-lint/default.nix b/nixpkgs/pkgs/development/python-modules/restructuredtext-lint/default.nix
new file mode 100644
index 000000000000..3b7f4dfd57f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/restructuredtext-lint/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, docutils
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "restructuredtext-lint";
+  version = "1.4.0";
+  pyproject = true;
+
+  src = fetchPypi {
+    pname = "restructuredtext_lint";
+    inherit version;
+    hash = "sha256-GyNcDJIjQatsUwOQiS656S+QubdQRgY+BHys+w8FDEU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [ docutils ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "restructuredtext_lint/test/test.py"
+  ];
+
+  pythonImportsCheck = [
+    "restructuredtext_lint"
+  ];
+
+  meta = {
+    description = "reStructuredText linter";
+    homepage = "https://github.com/twolfson/restructuredtext-lint";
+    changelog = "https://github.com/twolfson/restructuredtext-lint/blob/${version}/CHANGELOG.rst";
+    license = lib.licenses.unlicense;
+    mainProgram = "rst-lint";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/restview/default.nix b/nixpkgs/pkgs/development/python-modules/restview/default.nix
new file mode 100644
index 000000000000..43e877686beb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/restview/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, docutils
+, readme_renderer
+, packaging
+, pygments
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "restview";
+  version = "3.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jBoXHBWdRtFdVWn3cCGCiIOhIdb5uvdY1kH8HlSwWuU=";
+  };
+
+  propagatedBuildInputs = [
+    docutils
+    readme_renderer
+    packaging
+    pygments
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "restview"
+  ];
+
+  disabledTests = [
+    # Tests are comparing output
+    "rest_to_html"
+  ];
+
+  meta = with lib; {
+    description = "ReStructuredText viewer";
+    homepage = "https://mg.pov.lt/restview/";
+    changelog = "https://github.com/mgedmin/restview/blob/${version}/CHANGES.rst";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ koral ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/result/default.nix b/nixpkgs/pkgs/development/python-modules/result/default.nix
new file mode 100644
index 000000000000..e969764f90cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/result/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "result";
+  version = "0.7.0";
+
+  src = fetchFromGitHub {
+    owner = "rustedpy";
+    repo = "result";
+     rev = "v${version}";
+    hash = "sha256-bEf3OJg6ksDvzZE7ezA58Q2FObb5V7BG8vkKtX284Jg=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"--flake8",' "" \
+      --replace '"--tb=short",' "" \
+      --replace '"--cov=result",' "" \
+      --replace '"--cov=tests",' "" \
+      --replace '"--cov-report=term",' "" \
+      --replace '"--cov-report=xml",' ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    #TODO: figure out the failure "match o:" Invalid Syntax
+    "tests/test_pattern_matching.py"
+  ];
+
+  pythonImportsCheck = [ "result" ];
+
+  meta = with lib; {
+    description = "A simple Result type for Python 3 inspired by Rust, fully type annotated";
+    homepage = "https://github.com/rustedpy/result";
+    license = licenses.mit;
+    maintainers = [];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rethinkdb/default.nix b/nixpkgs/pkgs/development/python-modules/rethinkdb/default.nix
new file mode 100644
index 000000000000..d0ba2a4da77b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rethinkdb/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "rethinkdb";
+  version = "2.4.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-dV8I9xdTWlXAUSj2vmwoJI+pr/JningWqrh+H59YFcE=";
+  };
+
+  propagatedBuildInputs = [ six setuptools ];
+
+  doCheck = false;
+  pythonImportsCheck = [ "rethinkdb" ];
+
+  meta = with lib; {
+    description = "Python driver library for the RethinkDB database server";
+    homepage = "https://pypi.python.org/pypi/rethinkdb";
+    license = licenses.asl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/retry/default.nix b/nixpkgs/pkgs/development/python-modules/retry/default.nix
new file mode 100644
index 000000000000..e093f761f251
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/retry/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pbr
+, decorator
+, py
+, mock
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "retry";
+  version = "0.9.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f8bfa8b99b69c4506d6f5bd3b0aabf77f98cdb17f3c9fc3f5ca820033336fba4";
+  };
+
+  nativeBuildInputs = [
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    decorator
+    py
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Easy to use retry decorator";
+    homepage = "https://github.com/invl/retry";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/retry_decorator/default.nix b/nixpkgs/pkgs/development/python-modules/retry_decorator/default.nix
new file mode 100644
index 000000000000..a2c984dfe412
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/retry_decorator/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "retry-decorator";
+  version = "1.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pnpnpn";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-0dZq4YbPcH4ItyMnpF7B20YYLtzwniJClBK9gRndU1M=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "retry_decorator"
+  ];
+
+  meta = with lib; {
+    description = "Decorator for retrying when exceptions occur";
+    homepage = "https://github.com/pnpnpn/retry-decorator";
+    changelog = "https://github.com/pnpnpn/retry-decorator/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/retrying/default.nix b/nixpkgs/pkgs/development/python-modules/retrying/default.nix
new file mode 100644
index 000000000000..36e76f6bc6c7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/retrying/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "retrying";
+  version = "1.3.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NF2oxXZb2YKx0ZFd65EC/T0fetFr2EqXALhfZNJOjz4=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  # doesn't ship tests in tarball
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "retrying"
+  ];
+
+  meta = with lib; {
+    description = "General-purpose retrying library";
+    homepage = "https://github.com/rholder/retrying";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/returns/default.nix b/nixpkgs/pkgs/development/python-modules/returns/default.nix
new file mode 100644
index 000000000000..2e0275bd8040
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/returns/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, anyio
+, buildPythonPackage
+, curio
+, fetchFromGitHub
+, httpx
+, hypothesis
+, poetry-core
+, pytest-aio
+, pytest-subtests
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, trio
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "returns";
+  version = "0.22.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dry-python";
+    repo = "returns";
+    rev = "refs/tags/${version}";
+    hash = "sha256-0eFirhBsj8SWfoAPWEMuFa+EvBgHKpNeKVj3qJ4L6hE=";
+  };
+
+  postPatch = ''
+    sed -i setup.cfg \
+      -e '/--cov.*/d' \
+      -e '/--mypy.*/d'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    anyio
+    curio
+    httpx
+    hypothesis
+    pytestCheckHook
+    pytest-aio
+    pytest-subtests
+    setuptools
+    trio
+  ];
+
+  preCheck = ''
+    rm -rf returns/contrib/mypy
+  '';
+
+  pythonImportsCheck = [
+    "returns"
+  ];
+
+  pytestFlagsArray = [
+    "--ignore=typesafety"
+  ];
+
+  meta = with lib; {
+    description = "Make your functions return something meaningful, typed, and safe!";
+    homepage = "https://github.com/dry-python/returns";
+    changelog = "https://github.com/dry-python/returns/blob/${version}/CHANGELOG.md";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ jessemoore ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rfc3339-validator/default.nix b/nixpkgs/pkgs/development/python-modules/rfc3339-validator/default.nix
new file mode 100644
index 000000000000..e1a9f0318882
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rfc3339-validator/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, hypothesis
+, six
+, strict-rfc3339
+}:
+
+buildPythonPackage rec {
+  pname = "rfc3339-validator";
+  version = "0.1.4";
+
+  src = fetchPypi {
+    pname = "rfc3339_validator";
+    inherit version;
+    sha256 = "0srg0b89aikzinw72s433994k5gv5lfyarq1adhas11kz6yjm2hk";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  nativeCheckInputs = [ pytestCheckHook hypothesis strict-rfc3339 ];
+  pythonImportsCheck = [ "rfc3339_validator" ];
+
+  meta = with lib; {
+    description = "RFC 3339 validator for Python";
+    homepage = "https://github.com/naimetti/rfc3339-validator";
+    license = licenses.mit;
+    maintainers = with maintainers; [ AluisioASG ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rfc3339/default.nix b/nixpkgs/pkgs/development/python-modules/rfc3339/default.nix
new file mode 100644
index 000000000000..4b1355e511a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rfc3339/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "rfc3339";
+  version = "6.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1l6l1bh91i2r4dwcm86hlkx8cbh1xwgsk8hb4jvr5y5fxxg3ng6m";
+  };
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "rfc3339" ];
+
+  meta = with lib; {
+    description = "Format dates according to the RFC 3339";
+    homepage = "https://hg.sr.ht/~henryprecheur/rfc3339";
+    license = licenses.isc;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rfc3986-validator/default.nix b/nixpkgs/pkgs/development/python-modules/rfc3986-validator/default.nix
new file mode 100644
index 000000000000..823eb16aef1a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rfc3986-validator/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hypothesis
+, rfc3987
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "rfc3986-validator";
+  version = "0.1.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "rfc3986_validator";
+    inherit version;
+    hash = "sha256-PUS955IbO57Drk463KNwQ47M68Z2RWRJsUXVM7JA0FU=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'," ""
+  '';
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+    rfc3987
+  ];
+
+  meta = with lib; {
+    description = "Pure python rfc3986 validator";
+    homepage = "https://github.com/naimetti/rfc3986-validator";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rfc3986/default.nix b/nixpkgs/pkgs/development/python-modules/rfc3986/default.nix
new file mode 100644
index 000000000000..d2b4bf57a062
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rfc3986/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, idna
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "rfc3986";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-l6rPnb1L/YKbqtbmMJ+mVzqvG+P2+nNcirBeRs7LJhw=";
+  };
+
+  propagatedBuildInputs = [
+    idna
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "rfc3986"
+  ];
+
+  meta = with lib; {
+    description = "Validating URI References per RFC 3986";
+    homepage = "https://rfc3986.readthedocs.org";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rfc3987/default.nix b/nixpkgs/pkgs/development/python-modules/rfc3987/default.nix
new file mode 100644
index 000000000000..41beb1c8c17f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rfc3987/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "rfc3987";
+  version = "1.3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d3c4d257a560d544e9826b38bc81db676890c79ab9d7ac92b39c7a253d5ca733";
+  };
+
+  doCheck = false;
+  meta = with lib; {
+    homepage = "https://pypi.python.org/pypi/rfc3987";
+    license = licenses.gpl3Plus;
+    description = "Parsing and validation of URIs (RFC 3986) and IRIs (RFC 3987)";
+    maintainers = with maintainers; [ vanschelven ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rfc6555/default.nix b/nixpkgs/pkgs/development/python-modules/rfc6555/default.nix
new file mode 100644
index 000000000000..d33d518fcea5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rfc6555/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "rfc6555";
+  version = "0.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sethmlarson";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-Lmwgusc4EQlF0GHmMTUxWzUCjBk19cvurNwbOnT+1jM=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Disabling tests that require a functional DNS IPv{4,6} stack to pass
+    "test_create_connection_has_proper_timeout"
+  ];
+
+  pythonImportsCheck = [
+    "rfc6555"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of the Happy Eyeballs Algorithm";
+    homepage = "https://github.com/sethmlarson/rfc6555";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ endocrimes ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rfc7464/default.nix b/nixpkgs/pkgs/development/python-modules/rfc7464/default.nix
new file mode 100644
index 000000000000..9e5a5d3689da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rfc7464/default.nix
@@ -0,0 +1,19 @@
+{ buildPythonPackage, fetchPypi, lib }:
+
+buildPythonPackage rec {
+  pname = "rfc7464";
+  version = "17.7.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1hcn6h38qplfcmq392cs58r01k16k202bqyap4br02376pr4ik7a";
+    extension = "zip";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/moshez/rfc7464";
+    description = "RFC 7464 is a proposed standard for streaming JSON documents.";
+    license = [ licenses.mit ];
+    maintainers = with maintainers; [ shlevy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rfcat/default.nix b/nixpkgs/pkgs/development/python-modules/rfcat/default.nix
new file mode 100644
index 000000000000..9ee83c5fa728
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rfcat/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, future
+, ipython
+, numpy
+, pyserial
+, pyusb
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "rfcat";
+  version = "2.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "atlas0fd00m";
+    repo = "rfcat";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-hdRsVbDXRC1EOhBoFJ9T5ZE6hwOgDWSdN5sIpxJ0x3E=";
+  };
+
+  propagatedBuildInputs = [
+    future
+    ipython
+    numpy
+    pyserial
+    pyusb
+  ];
+
+  postInstall = lib.optionalString stdenv.hostPlatform.isLinux ''
+    mkdir -p $out/etc/udev/rules.d
+    cp etc/udev/rules.d/20-rfcat.rules $out/etc/udev/rules.d
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "rflib"
+  ];
+
+  meta = with lib; {
+    description = "Swiss Army knife of sub-GHz ISM band radio";
+    homepage = "https://github.com/atlas0fd00m/rfcat";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ trepetti ];
+    changelog = "https://github.com/atlas0fd00m/rfcat/releases/tag/v${version}";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rflink/default.nix b/nixpkgs/pkgs/development/python-modules/rflink/default.nix
new file mode 100644
index 000000000000..fc829a40e5c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rflink/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, async-timeout
+, docopt
+, pyserial
+, pyserial-asyncio
+, setuptools
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "rflink";
+  version = "0.0.65";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aequitas";
+    repo = "python-rflink";
+    rev = "refs/tags/${version}";
+    hash = "sha256-DUnhuA84nkmYkREa7vUiyLg7JUdEEeLewg3vFFlcar8=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+    docopt
+    pyserial
+    pyserial-asyncio
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "version=version_from_git()" "version='${version}'"
+  '';
+
+  pythonImportsCheck = [
+    "rflink.protocol"
+  ];
+
+  meta = with lib; {
+    description = "Library and CLI tools for interacting with RFlink 433MHz transceiver";
+    homepage = "https://github.com/aequitas/python-rflink";
+    changelog = "https://github.com/aequitas/python-rflink/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rich-argparse-plus/default.nix b/nixpkgs/pkgs/development/python-modules/rich-argparse-plus/default.nix
new file mode 100644
index 000000000000..e152ce267f4c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rich-argparse-plus/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, rich
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "rich-argparse-plus";
+  version = "0.3.1.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "michelcrypt4d4mus";
+    repo = "rich-argparse-plus";
+    rev = "v${version}";
+    hash = "sha256-oF2wuvyLYwObVJ4fhJl9b/sdfmQ2ahgKkfd9ZwObfPw=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    rich
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "rich_argparse_plus"
+  ];
+
+  disabledTests = [
+    # Tests are comparing CLI output
+    "test_spans"
+    "test_actions_spans_in_usage"
+    "test_boolean_optional_action_spans"
+    "test_usage_spans_errors"
+    "test_text_highlighter"
+    "test_default_highlights"
+  ];
+
+  meta = with lib; {
+    description = "Library to help formatting argparse";
+    homepage = "https://github.com/michelcrypt4d4mus/rich-argparse-plus";
+    changelog = "https://github.com/michelcrypt4d4mus/rich-argparse-plus/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rich-argparse/default.nix b/nixpkgs/pkgs/development/python-modules/rich-argparse/default.nix
new file mode 100644
index 000000000000..7dc2878d391d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rich-argparse/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, rich
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "rich-argparse";
+  version = "1.4.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "hamdanal";
+    repo = "rich-argparse";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-iQ8x8UM0zmb2qYUpSh6RSEaBMrDpwY0ZHaJ9GJqn4Hs=";
+  };
+
+  propagatedBuildInputs = [
+    hatchling
+    rich
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "rich_argparse"
+  ];
+
+  meta = with lib; {
+    description = "Format argparse help output using rich.";
+    homepage = "https://github.com/hamdanal/rich-argparse";
+    changelog = "https://github.com/hamdanal/rich-argparse/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ graham33 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rich-click/default.nix b/nixpkgs/pkgs/development/python-modules/rich-click/default.nix
new file mode 100644
index 000000000000..6aad6e527975
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rich-click/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, pythonOlder
+, rich
+, typer
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "rich-click";
+  version = "1.7.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "ewels";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-rWVJEuJx5nDUg6RvhubHu9U2Glilrkugjg28SpFIZys=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    rich
+    typing-extensions
+  ];
+
+  # Module has no test
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "rich_click"
+  ];
+
+  meta = with lib; {
+    description = "Module to format click help output nicely with rich";
+    homepage = "https://github.com/ewels/rich-click";
+    changelog = "https://github.com/ewels/rich-click/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rich-pixels/default.nix b/nixpkgs/pkgs/development/python-modules/rich-pixels/default.nix
new file mode 100644
index 000000000000..9e40b4b52fcf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rich-pixels/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, syrupy
+, pillow
+, rich
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "rich-pixels";
+  version = "2.1.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "darrenburns";
+    repo = "rich-pixels";
+    rev = version;
+    hash = "sha256-zI6jtEdmBAEGxyASo/6fiHdzwzoSwXN7A5x1CmYS5qc=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  checkInputs = [
+    syrupy
+  ];
+
+  propagatedBuildInputs = [
+    pillow
+    rich
+  ];
+
+  pythonRelaxDeps = [
+    "pillow"
+  ];
+
+  pythonImportsCheck = [ "rich_pixels" ];
+
+  meta = with lib; {
+    description = "A Rich-compatible library for writing pixel images and ASCII art to the terminal";
+    homepage = "https://github.com/darrenburns/rich-pixels";
+    changelog = "https://github.com/darrenburns/rich-pixels/releases/tag/${src.rev}";
+    # upstream has no license specified
+    # https://github.com/darrenburns/rich-pixels/issues/11
+    license = licenses.unfree;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rich-rst/default.nix b/nixpkgs/pkgs/development/python-modules/rich-rst/default.nix
new file mode 100644
index 000000000000..91e8f2b34d22
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rich-rst/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, docutils
+, rich
+}:
+
+buildPythonPackage rec {
+  pname = "rich-rst";
+  version = "1.1.7";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "wasi-master";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-s48hdJo1LIRXTf+PeSBa6y/AH1NLmnyAafFydJ+exDk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [ docutils rich ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "rich_rst" ];
+
+  meta = with lib; {
+    description = "A beautiful reStructuredText renderer for rich";
+    homepage = "https://github.com/wasi-master/rich-rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ joelkoen ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rich/default.nix b/nixpkgs/pkgs/development/python-modules/rich/default.nix
new file mode 100644
index 000000000000..86c3ac1ffeeb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rich/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, markdown-it-py
+, poetry-core
+, pygments
+, typing-extensions
+, pytestCheckHook
+, setuptools
+
+# for passthru.tests
+, enrich
+, httpie
+, rich-rst
+, textual
+}:
+
+buildPythonPackage rec {
+  pname = "rich";
+  version = "13.5.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Textualize";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ycDmFJa68OOrNqIy/hGKxbjoaIbiniiO4UAPNSyZvDk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    markdown-it-py
+    pygments
+    setuptools
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # pygments 2.16 compat
+    # https://github.com/Textualize/rich/issues/3088
+    "test_card_render"
+    "test_markdown_render"
+    "test_markdown_render"
+    "test_python_render"
+    "test_python_render_simple"
+    "test_python_render_simple_passing_lexer_instance"
+    "test_python_render_indent_guides"
+    "test_option_no_wrap"
+    "test_syntax_highlight_ranges"
+  ];
+
+  pythonImportsCheck = [
+    "rich"
+  ];
+
+  passthru.tests = {
+    inherit enrich httpie rich-rst textual;
+  };
+
+  meta = with lib; {
+    description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal";
+    homepage = "https://github.com/Textualize/rich";
+    changelog = "https://github.com/Textualize/rich/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ris joelkoen ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ring-doorbell/default.nix b/nixpkgs/pkgs/development/python-modules/ring-doorbell/default.nix
new file mode 100644
index 000000000000..ac7d76f4377e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ring-doorbell/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, asyncclick
+, buildPythonPackage
+, fetchPypi
+, oauthlib
+, poetry-core
+, pytest-asyncio
+, pytest-mock
+, pytest-socket
+, pytestCheckHook
+, pythonOlder
+, pytz
+, requests
+, requests-mock
+, requests-oauthlib
+}:
+
+buildPythonPackage rec {
+  pname = "ring-doorbell";
+  version = "0.8.3";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "ring_doorbell";
+    inherit version;
+    hash = "sha256-d3GcswCTI8UUj4Ph/WujnQQlHB9m46UjNRkN0nA6Sxs=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    asyncclick
+    oauthlib
+    pytz
+    requests
+    requests-oauthlib
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-mock
+    pytest-socket
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pythonImportsCheck = [
+    "ring_doorbell"
+  ];
+
+  meta = with lib; {
+    description = "Python library to communicate with Ring Door Bell";
+    homepage = "https://github.com/tchellomello/python-ring-doorbell";
+    changelog = "https://github.com/tchellomello/python-ring-doorbell/releases/tag/${version}";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ graham33 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ripe-atlas-cousteau/default.nix b/nixpkgs/pkgs/development/python-modules/ripe-atlas-cousteau/default.nix
new file mode 100644
index 000000000000..b02f1f9a72f0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ripe-atlas-cousteau/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, jsonschema
+, pytestCheckHook
+, python-dateutil
+, python-socketio
+, pythonOlder
+, requests
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "ripe-atlas-cousteau";
+  version = "2.0.0";
+  format = "setuptools";
+
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "RIPE-NCC";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-z8ZXOiCVYughrbmXfnwtks7NPmYpII2BA0+8mr1cdSQ=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "websocket-client~=1.3.1" "websocket-client"
+  '';
+
+  propagatedBuildInputs = [
+    python-dateutil
+    requests
+    python-socketio
+    websocket-client
+  ] ++ python-socketio.optional-dependencies.client;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    jsonschema
+  ];
+
+  pythonImportsCheck = [
+    "ripe.atlas.cousteau"
+  ];
+
+  meta = with lib; {
+    description = "Python client library for RIPE ATLAS API";
+    homepage = "https://github.com/RIPE-NCC/ripe-atlas-cousteau";
+    changelog = "https://github.com/RIPE-NCC/ripe-atlas-cousteau/blob/v${version}/CHANGES.rst";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ raitobezarius ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ripe-atlas-sagan/default.nix b/nixpkgs/pkgs/development/python-modules/ripe-atlas-sagan/default.nix
new file mode 100644
index 000000000000..a9ed4bd3f52c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ripe-atlas-sagan/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pytz
+, ujson
+}:
+
+buildPythonPackage rec {
+  pname = "ripe-atlas-sagan";
+  version = "1.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "RIPE-NCC";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-xIBIKsQvDmVBa/C8/7Wr3WKeepHaGhoXlgatXSUtWLA=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    python-dateutil
+    pytz
+  ];
+
+  passthru.optional-dependencies = {
+    fast = [
+      ujson
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests/*.py"
+  ];
+
+  disabledTests = [
+    # This test fail for unknown reason, I suspect it to be flaky.
+    "test_invalid_country_code"
+  ];
+
+  pythonImportsCheck = [
+    "ripe.atlas.sagan"
+  ];
+
+  meta = with lib; {
+    description = "A parsing library for RIPE Atlas measurements results";
+    homepage = "https://github.com/RIPE-NCC/ripe-atlas-sagan";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ raitobezarius ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/riprova/default.nix b/nixpkgs/pkgs/development/python-modules/riprova/default.nix
new file mode 100644
index 000000000000..c4a0ee950704
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/riprova/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+}:
+
+buildPythonPackage rec{
+  pname = "riprova";
+  version = "0.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-FgFySbvBjcZU2bjo40/1O7glc6oFWW05jinEOfMWMVI=";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  # PyPI archive doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "riprova" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/h2non/riprova";
+    description = "Small and versatile library to retry failed operations using different backoff strategies";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mmilata ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ripser/default.nix b/nixpkgs/pkgs/development/python-modules/ripser/default.nix
new file mode 100644
index 000000000000..0b65e8c1c487
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ripser/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchPypi
+, numpy
+, persim
+, pytestCheckHook
+, pythonOlder
+, scikit-learn
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "ripser";
+  version = "0.6.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-eps+lCCGnFDfhemkRskSuK+BYh5iyhr4+UksYzW35ZQ=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    scikit-learn
+    persim
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    # specifically needed for darwin
+    export HOME=$(mktemp -d)
+    mkdir -p $HOME/.matplotlib
+    echo "backend: ps" > $HOME/.matplotlib/matplotlibrc
+  '';
+
+  pythonImportsCheck = [
+    "ripser"
+  ];
+
+  meta = with lib; {
+    description = "A Lean Persistent Homology Library for Python";
+    homepage = "https://ripser.scikit-tda.org";
+    changelog = "https://github.com/scikit-tda/ripser.py/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/riscof/default.nix b/nixpkgs/pkgs/development/python-modules/riscof/default.nix
new file mode 100644
index 000000000000..fc5874e39e33
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/riscof/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, git
+, jinja2
+, pythonOlder
+, riscv-config
+, riscv-isac
+}:
+
+buildPythonPackage rec {
+  pname = "riscof";
+  version = "1.25.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "riscv-software-src";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-ToI2xI0fvnDR+hJ++T4ss5X3gc4G6Cj1uJHx0m2X7GY=";
+  };
+
+  patches = [
+    # riscof copies a template directory from the store, but breaks because it
+    # doesn't change permissions and expects it to be writeable
+    ./make_writeable.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "import pip" ""
+    substituteInPlace riscof/requirements.txt \
+      --replace "GitPython==3.1.17" "GitPython"
+  '';
+
+  propagatedBuildInputs = [
+    riscv-isac
+    riscv-config
+    jinja2
+  ];
+
+  pythonImportsCheck = [
+    "riscof"
+  ];
+
+  # No unitests available
+  doCheck = false;
+
+  meta = with lib; {
+    description = "RISC-V Architectural Test Framework";
+    homepage = "https://github.com/riscv-software-src/riscof";
+    changelog = "https://github.com/riscv-software-src/riscof/blob/${version}/CHANGELOG.md";
+    maintainers = with maintainers; [ genericnerdyusername ];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/riscof/make_writeable.patch b/nixpkgs/pkgs/development/python-modules/riscof/make_writeable.patch
new file mode 100644
index 000000000000..938f9913a7ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/riscof/make_writeable.patch
@@ -0,0 +1,25 @@
+diff --git a/riscof/cli.py b/riscof/cli.py
+index 26af62e..9d0ddbf 100644
+--- a/riscof/cli.py
++++ b/riscof/cli.py
+@@ -502,6 +502,7 @@ def setup(dutname,refname,work_dir):
+         src = os.path.join(constants.root, "Templates/setup/model/")
+         dest = os.path.join(cwd, dutname)
+         distutils.dir_util.copy_tree(src, dest)
++        os.system(f"chmod +w -R '{dest}'")
+ 
+         os.rename(cwd+'/'+dutname+'/model_isa.yaml',
+                 cwd+'/'+dutname+'/'+dutname+'_isa.yaml')
+@@ -525,10 +526,12 @@ def setup(dutname,refname,work_dir):
+             src = os.path.join(constants.root, "Templates/setup/sail_cSim/")
+             dest = os.path.join(cwd, refname)
+             distutils.dir_util.copy_tree(src, dest)
++            os.system(f"chmod +w -R '{dest}'")
+         else:
+             src = os.path.join(constants.root, "Templates/setup/reference/")
+             dest = os.path.join(cwd, refname)
+             distutils.dir_util.copy_tree(src, dest)
++            os.system(f"chmod +w -R '{dest}'")
+             os.rename(cwd+'/'+refname+'/riscof_model.py',
+                 cwd+'/'+refname+'/riscof_'+refname+'.py')
+             with open(cwd+'/'+refname+'/riscof_'+refname+'.py', 'r') as file :
diff --git a/nixpkgs/pkgs/development/python-modules/riscv-config/default.nix b/nixpkgs/pkgs/development/python-modules/riscv-config/default.nix
new file mode 100644
index 000000000000..397259d30fe3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/riscv-config/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, cerberus
+, fetchFromGitHub
+, fetchpatch
+, pythonOlder
+, pyyaml
+, ruamel-yaml
+}:
+
+buildPythonPackage rec {
+  pname = "riscv-config";
+  version = "3.13.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "riscv-software-src";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-tMV5mRqOLURkr8HQN1yvq5Cf3yz2NRBY6uaaxNKCy2c=";
+  };
+
+  propagatedBuildInputs = [
+    cerberus
+    pyyaml
+    ruamel-yaml
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "riscv_config"
+  ];
+
+  meta = with lib; {
+    description = "RISC-V configuration validator";
+    homepage = "https://github.com/riscv/riscv-config";
+    changelog = "https://github.com/riscv-software-src/riscv-config/blob/${version}/CHANGELOG.md";
+    maintainers = with maintainers; [ genericnerdyusername ];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/riscv-isac/default.nix b/nixpkgs/pkgs/development/python-modules/riscv-isac/default.nix
new file mode 100644
index 000000000000..651c27be676a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/riscv-isac/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, click
+, colorlog
+, gitpython
+, pluggy
+, pyelftools
+, pytablewriter
+, pytestCheckHook
+, pyyaml
+, ruamel-yaml
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "riscv-isac";
+  version = "0.18.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "riscv-software-src";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-7CWUyYwzynFq/Qk5SzQB+ljsVVI98kPPDT63Emhqihw=";
+  };
+
+  postPatch = ''
+    substituteInPlace riscv_isac/requirements.txt \
+      --replace "pyelftools==0.26" "pyelftools" \
+      --replace "pytest" ""
+  '';
+
+  propagatedBuildInputs = [
+    click
+    colorlog
+    gitpython
+    pluggy
+    pyelftools
+    pytablewriter
+    pyyaml
+    ruamel-yaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "riscv_isac"
+  ];
+
+  meta = with lib; {
+    description = "An ISA coverage extraction tool";
+    homepage = "https://github.com/riscv/riscv-isac";
+    changelog = "https://github.com/riscv-software-src/riscv-isac/blob/${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ genericnerdyusername ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rising/default.nix b/nixpkgs/pkgs/development/python-modules/rising/default.nix
new file mode 100644
index 000000000000..ab52aec1a236
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rising/default.nix
@@ -0,0 +1,57 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+, pythonRelaxDepsHook
+, dill
+, lightning-utilities
+, numpy
+, torch
+, threadpoolctl
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "rising";
+  version = "0.3.0";
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "PhoenixDL";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-sBzVTst5Tp2oZZ+Xsg3M7uAMbucL6idlpYwHvib3EaY=";
+  };
+
+  nativeBuildInputs = [ pythonRelaxDepsHook ];
+
+  pythonRelaxDeps = [ "lightning-utilities" ];
+
+  propagatedBuildInputs = [
+    lightning-utilities numpy torch threadpoolctl tqdm
+  ];
+  nativeCheckInputs = [ dill pytestCheckHook ];
+  disabledTests = lib.optionals (stdenv.isLinux && stdenv.isAarch64) [
+    # RuntimeError: DataLoader worker (pid(s) <...>) exited unexpectedly:
+    "test_progressive_resize_integration"
+  ];
+
+  pythonImportsCheck = [
+    "rising"
+    "rising.loading"
+    "rising.ops"
+    "rising.random"
+    "rising.transforms"
+    "rising.transforms.functional"
+    "rising.utils"
+  ];
+
+  meta = {
+    description = "High-performance data loading and augmentation library in PyTorch";
+    homepage = "https://rising.rtfd.io";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ritassist/default.nix b/nixpkgs/pkgs/development/python-modules/ritassist/default.nix
new file mode 100644
index 000000000000..a23bb3df5dee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ritassist/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, ciso8601
+, fetchPypi
+, geopy
+, pythonOlder
+, requests
+, sseclient
+}:
+
+buildPythonPackage rec {
+  pname = "ritassist";
+  version = "0.9.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1JCKWb+3mdQYnL250Ml+kFkx6VAlBC7FL6XcQlQ+kC4=";
+  };
+
+  propagatedBuildInputs = [
+    ciso8601
+    geopy
+    requests
+    sseclient
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ritassist"
+  ];
+
+  meta = with lib; {
+    description = "Python client to access RitAssist and FleetGO API";
+    homepage = "https://github.com/depl0y/ritassist-py";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rjpl/default.nix b/nixpkgs/pkgs/development/python-modules/rjpl/default.nix
new file mode 100644
index 000000000000..8d5cfbc92aae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rjpl/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, requests
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "rjpl";
+  version = "0.3.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GLNIpZuM3yuCnPyjBa8KjdaL5cFK8InluuY+LTCrimc=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "rjpl"
+  ];
+
+  meta = with lib; {
+    description = "Library for interacting with the Rejseplanen API";
+    homepage = "https://github.com/tomatpasser/python-rejseplanen";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rjsmin/default.nix b/nixpkgs/pkgs/development/python-modules/rjsmin/default.nix
new file mode 100644
index 000000000000..f2a7a7874e6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rjsmin/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "rjsmin";
+  version = "1.2.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jBvNghFD/s8jJCAStV4TYQhAqDnNRns1jxY1kBDWLa4=";
+  };
+
+  # The package does not ship tests, and the setup machinary confuses
+  # tests auto-discovery
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "rjsmin"
+  ];
+
+  meta = with lib; {
+    description = "Module to minify Javascript";
+    homepage = "http://opensource.perlig.de/rjsmin/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rki-covid-parser/default.nix b/nixpkgs/pkgs/development/python-modules/rki-covid-parser/default.nix
new file mode 100644
index 000000000000..d7e12ba2293f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rki-covid-parser/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "rki-covid-parser";
+  version = "1.3.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "thebino";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-e0MJjE4zgBPL+vt9EkgsdGrgqUyKK/1S9ZFxy56PUjc=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Tests require netowrk access
+    "tests/test_districts.py"
+    "tests/test_endpoint_availibility.py"
+  ];
+
+  pythonImportsCheck = [
+    "rki_covid_parser"
+  ];
+
+  meta = with lib; {
+    description = "Python module for working with data from the Robert-Koch Institut";
+    homepage = "https://github.com/thebino/rki-covid-parser";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rkm-codes/default.nix b/nixpkgs/pkgs/development/python-modules/rkm-codes/default.nix
new file mode 100644
index 000000000000..0a8869052d60
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rkm-codes/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "rkm-codes";
+  version = "0.6";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "KenKundert";
+    repo = "rkm_codes";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-CkLLZuWcNL8sqAupc7lHXu0DXUXrX3qwd1g/ekyHdw4=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  # this has a circular dependency on quantiphy
+  preBuild = ''
+    sed -i '/quantiphy/d' pyproject.toml
+  '';
+
+  # this import check will fail as quantiphy is imported by this package
+  # pythonImportsCheck = [ "rkm_codes" ];
+
+  # tests require quantiphy import
+  doCheck = false;
+
+  meta = with lib; {
+    description = "QuantiPhy support for RKM codes";
+    homepage = "https://github.com/kenkundert/rkm_codes/";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ jpetrucciani ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rlax/default.nix b/nixpkgs/pkgs/development/python-modules/rlax/default.nix
new file mode 100644
index 000000000000..6793cf747b5f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rlax/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, chex
+, jaxlib
+, tensorflow-probability
+, optax
+, dm-haiku
+, bsuite
+, frozendict
+, pytestCheckHook
+, dm-env
+, distrax }:
+
+buildPythonPackage rec {
+  pname = "rlax";
+  version = "0.1.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-C3nFOv/zxvAoz6WZ0RAZffzEbxIx/XrGabO4QPxrik8=";
+  };
+
+  buildInputs = [
+    chex
+    jaxlib
+    distrax
+    tensorflow-probability
+  ];
+
+  nativeCheckInputs = [
+    bsuite
+    dm-env
+    dm-haiku
+    frozendict
+    optax
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "rlax"
+  ];
+
+  disabledTests = [
+    # RuntimeErrors
+    "test_cross_replica_scatter_add0"
+    "test_cross_replica_scatter_add1"
+    "test_cross_replica_scatter_add2"
+    "test_cross_replica_scatter_add3"
+    "test_cross_replica_scatter_add4"
+    "test_learn_scale_shift"
+    "test_normalize_unnormalize_is_identity"
+    "test_outputs_preserved"
+    "test_scale_bounded"
+    "test_slow_update"
+    "test_unnormalize_linear"
+  ];
+
+  meta = with lib; {
+    description = "Library of reinforcement learning building blocks in JAX";
+    homepage = "https://github.com/deepmind/rlax";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rlp/default.nix b/nixpkgs/pkgs/development/python-modules/rlp/default.nix
new file mode 100644
index 000000000000..b0e7d123e691
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rlp/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, eth-utils
+, hypothesis
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "rlp";
+  version = "3.0.0";
+
+  src = fetchFromGitHub {
+    owner = "ethereum";
+    repo = "pyrlp";
+    rev = "v${version}";
+    hash = "sha256-GRCq4FU38e08fREg5fweig5Y60jLT2k3Yj1Jk8OA6XY=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'setuptools-markdown'" ""
+  '';
+
+  propagatedBuildInputs = [
+    eth-utils
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "rlp" ];
+
+  meta = with lib; {
+    description = "RLP serialization library";
+    homepage = "https://github.com/ethereum/pyrlp";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rmcl/default.nix b/nixpkgs/pkgs/development/python-modules/rmcl/default.nix
new file mode 100644
index 000000000000..001992f539eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rmcl/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, poetry-core
+, asks
+, trio
+, xdg
+}:
+
+buildPythonPackage rec {
+  pname = "rmcl";
+  version = "0.4.2";
+
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "58de4758e7e3cb7acbf28fcfa80f4155252afdfb191beb4ba4aa36961f66cc67";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '= "^' '= ">='
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    asks
+    trio
+    xdg
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "rmcl" ];
+
+  meta = {
+    description = "ReMarkable Cloud Library";
+    homepage = "https://github.com/rschroll/rmcl";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rmrl/default.nix b/nixpkgs/pkgs/development/python-modules/rmrl/default.nix
new file mode 100644
index 000000000000..48a33ca47cde
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rmrl/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, pdfrw
+, reportlab
+, setuptools
+, svglib
+, xdg
+}:
+
+buildPythonPackage rec {
+  pname = "rmrl";
+  version = "unstable-2022-12-11";
+
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "naturale0";
+    repo = "rmrl";
+    rev = "3c908536f11dfa92f81e7127ae76f18f0b2cc3e3";
+    hash = "sha256-13pMfRe2McWDpBTlJy/TBT0W5wyd0EXDoocxeIzmqCo=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pdfrw
+    reportlab
+    setuptools
+    svglib
+    xdg
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "rmrl" ];
+
+  meta = {
+    description = "Render reMarkable documents to PDF";
+    homepage = "https://github.com/naturale0/rmrl";
+    license = lib.licenses.gpl3Plus;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rmsd/default.nix b/nixpkgs/pkgs/development/python-modules/rmsd/default.nix
new file mode 100644
index 000000000000..2a0f2ecb50b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rmsd/default.nix
@@ -0,0 +1,27 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "rmsd";
+  version = "1.5.1";
+
+  propagatedBuildInputs = [ scipy ];
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wDQoIUMqrBDpgImHeHWizYu/YkFjlxB22TaGpA8Q0Sc=";
+  };
+
+  pythonImportsCheck = [ "rmsd" ];
+
+  meta = with lib; {
+    description = "Calculate root-mean-square deviation (RMSD) between two sets of cartesian coordinates";
+    homepage = "https://github.com/charnley/rmsd";
+    license = licenses.bsd2;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ sheepforce markuskowa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rnc2rng/default.nix b/nixpkgs/pkgs/development/python-modules/rnc2rng/default.nix
new file mode 100644
index 000000000000..104a6f12a675
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rnc2rng/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, rply
+}:
+
+buildPythonPackage rec {
+  pname = "rnc2rng";
+  version = "2.6.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5a01d157857b5f010a94167e7092cc49efe2531d58e013f12c4e60b8c4df78f1";
+  };
+
+  propagatedBuildInputs = [ rply ];
+
+  checkPhase = "${python.interpreter} test.py";
+
+  meta = with lib; {
+    homepage = "https://github.com/djc/rnc2rng";
+    description = "Compact to regular syntax conversion library for RELAX NG schemata";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rnginline/default.nix b/nixpkgs/pkgs/development/python-modules/rnginline/default.nix
new file mode 100644
index 000000000000..d006fc950d80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rnginline/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, poetry-core
+, lxml
+, docopt-ng
+, typing-extensions
+, importlib-metadata
+, importlib-resources
+, pytestCheckHook
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "rnginline";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JWqzs+OqOynIAWYVgGrZiuiCqObAgGe6rBt0DcP3U6E=";
+  };
+
+  format = "pyproject";
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'importlib-metadata = "^6.6.0"' 'importlib-metadata = "^6.0.0"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    docopt-ng
+    lxml
+    typing-extensions
+    importlib-metadata
+    importlib-resources
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "rnginline" ];
+
+  meta = with lib; {
+    description = "A Python library and command-line tool for loading multi-file RELAX NG schemas from arbitary URLs, and flattening them into a single RELAX NG schema";
+    homepage = "https://github.com/h4l/rnginline";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ lesuisse ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rns/default.nix b/nixpkgs/pkgs/development/python-modules/rns/default.nix
new file mode 100644
index 000000000000..0640ce63db35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rns/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, netifaces
+, pyserial
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "rns";
+  version = "0.6.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "markqvist";
+    repo = "Reticulum";
+    rev = "refs/tags/${version}";
+    hash = "sha256-MDD0Vs5XIWqxKHbrAa0vXJRd8uYZDlr//hP1NBf4b7U=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    netifaces
+    pyserial
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "RNS"
+  ];
+
+  meta = with lib; {
+    description = "Cryptography-based networking stack for wide-area networks";
+    homepage = "https://github.com/markqvist/Reticulum";
+    changelog = "https://github.com/markqvist/Reticulum/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/robomachine/default.nix b/nixpkgs/pkgs/development/python-modules/robomachine/default.nix
new file mode 100644
index 000000000000..613b47a8e601
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robomachine/default.nix
@@ -0,0 +1,51 @@
+{ stdenv
+, lib
+, allpairspy
+, buildPythonPackage
+, fetchPypi
+, pyparsing
+, pythonRelaxDepsHook
+, robotframework
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "RoboMachine";
+  version = "0.10.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XrxHaV9U7mZ2TvySHGm6qw1AsoukppzwPq4wufIjL+k=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pyparsing
+    robotframework
+    allpairspy
+  ];
+
+  pythonRemoveDeps = [
+    "argparse"
+  ];
+
+  pythonRelaxDeps = [
+    "pyparsing"
+  ];
+
+  pythonImportsCheck = [
+    "robomachine"
+  ];
+
+  meta = with lib; {
+    description = "Test data generator for Robot Framework";
+    homepage = "https://github.com/mkorpela/RoboMachine";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/robot-detection/default.nix b/nixpkgs/pkgs/development/python-modules/robot-detection/default.nix
new file mode 100644
index 000000000000..31b1f43a4e24
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robot-detection/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, six }:
+
+buildPythonPackage rec {
+  pname = "robot-detection";
+  version = "0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1xd2jm3yn31bnk1kqzggils2rxj26ylxsfz3ap7bhr3ilhnbg3rx";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  # no tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Library for detecting if a HTTP User Agent header is likely to be a bot";
+    homepage = "https://github.com/rory/robot-detection";
+    license = licenses.gpl3Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/robotframework-databaselibrary/default.nix b/nixpkgs/pkgs/development/python-modules/robotframework-databaselibrary/default.nix
new file mode 100644
index 000000000000..eea465ee8fb9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotframework-databaselibrary/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, robotframework
+}:
+
+buildPythonPackage rec {
+  version = "1.3.1";
+  pname = "robotframework-databaselibrary";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-C+shwpGbiA+YS8t9ApJEv6mYQVd3fVvY3qWzDF6vYqU=";
+  };
+
+  # unit tests are impure
+  doCheck = false;
+
+  propagatedBuildInputs = [ robotframework ];
+
+  meta = with lib; {
+    description = "Database Library contains utilities meant for Robot Framework";
+    homepage = "https://github.com/franz-see/Robotframework-Database-Library";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ talkara ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/robotframework-pythonlibcore/default.nix b/nixpkgs/pkgs/development/python-modules/robotframework-pythonlibcore/default.nix
new file mode 100644
index 000000000000..43da9125f1ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotframework-pythonlibcore/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytest-mockito
+, pytestCheckHook
+, robotframework
+}:
+
+buildPythonPackage rec {
+  pname = "robotframework-pythonlibcore";
+  version = "4.2.0";
+
+  disabled = pythonOlder "3.7";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "robotframework";
+    repo = "PythonLibCore";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-RJTn1zSVJYgbh93Idr77uHl02u0wpj6p6llSJfQVTQk=";
+  };
+
+  nativeCheckInputs = [
+    pytest-mockito
+    pytestCheckHook
+    robotframework
+  ];
+
+  preCheck = ''
+    export PYTHONPATH="atest:utest/helpers:$PYTHONPATH"
+  '';
+
+  pythonImportsCheck = [ "robotlibcore" ];
+
+  meta = {
+    changelog = "https://github.com/robotframework/PythonLibCore/blob/${src.rev}/docs/PythonLibCore-${version}.rst";
+    description = "Tools to ease creating larger test libraries for Robot Framework using Python";
+    homepage = "https://github.com/robotframework/PythonLibCore";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/robotframework-requests/default.nix b/nixpkgs/pkgs/development/python-modules/robotframework-requests/default.nix
new file mode 100644
index 000000000000..e1c43eb66b87
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotframework-requests/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, lxml
+, pytestCheckHook
+, pythonOlder
+, requests
+, robotframework
+}:
+
+buildPythonPackage rec {
+  pname = "robotframework-requests";
+  version = "0.9.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "MarketSquare";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-PvhMo1r/4962nntPQb4fQxcMMXIvKjp0FdNyOA43Euc=";
+  };
+
+  propagatedBuildInputs = [
+    lxml
+    requests
+    robotframework
+  ];
+
+  buildInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "RequestsLibrary"
+  ];
+
+  pytestFlagsArray = [
+    "utests"
+  ];
+
+  meta = with lib; {
+    description = "Robot Framework keyword library wrapper around the HTTP client library requests";
+    homepage = "https://github.com/bulkan/robotframework-requests";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/robotframework-selenium2library/default.nix b/nixpkgs/pkgs/development/python-modules/robotframework-selenium2library/default.nix
new file mode 100644
index 000000000000..6d079a99b4f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotframework-selenium2library/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, robotframework-seleniumlibrary }:
+
+buildPythonPackage rec {
+  version = "3.0.0";
+  pname = "robotframework-selenium2library";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2a8e942b0788b16ded253039008b34d2b46199283461b294f0f41a579c70fda7";
+  };
+
+  # Neither the PyPI tarball nor the repository has tests
+  doCheck = false;
+
+  propagatedBuildInputs = [ robotframework-seleniumlibrary ];
+
+  meta = with lib; {
+    description = "Web testing library for Robot Framework";
+    homepage = "https://github.com/robotframework/Selenium2Library";
+    license = licenses.asl20;
+    maintainers = [ maintainers.marsam ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/robotframework-seleniumlibrary/default.nix b/nixpkgs/pkgs/development/python-modules/robotframework-seleniumlibrary/default.nix
new file mode 100644
index 000000000000..114c24aa1c98
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotframework-seleniumlibrary/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, robotframework
+, robotframework-pythonlibcore
+, selenium
+, approvaltests
+, pytest-mockito
+, pytestCheckHook
+, robotstatuschecker
+}:
+
+buildPythonPackage rec {
+  version = "6.1.2";
+  pname = "robotframework-seleniumlibrary";
+
+  # no tests included in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "robotframework";
+    repo = "SeleniumLibrary";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-QbAwPm1Y76KPIcHkopiyISULQSwUet021erFa/zi8Zw=";
+  };
+
+  propagatedBuildInputs = [
+    robotframework
+    robotframework-pythonlibcore
+    selenium
+  ];
+
+  nativeCheckInputs = [
+    approvaltests
+    pytest-mockito
+    pytestCheckHook
+    robotstatuschecker
+  ];
+
+  disabledTestPaths = [
+    # https://github.com/robotframework/SeleniumLibrary/issues/1804
+    "utest/test/keywords/test_webdrivercache.py"
+  ];
+
+  disabledTests = [
+    "test_create_opera_executable_path_not_set"
+    "test_create_opera_executable_path_set"
+    "test_create_opera_with_options"
+    "test_create_opera_with_service_log_path_real_path"
+    "test_get_executable_path"
+    "test_get_ff_profile_instance_FirefoxProfile"
+    "test_has_options"
+    "test_importer"
+    "test_log_file_with_index_exist"
+    "test_opera"
+    "test_single_method"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/robotframework/SeleniumLibrary/blob/${src.rev}/docs/SeleniumLibrary-${version}.rst";
+    description = "Web testing library for Robot Framework";
+    homepage = "https://github.com/robotframework/SeleniumLibrary";
+    license = licenses.asl20;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/robotframework-sshlibrary/default.nix b/nixpkgs/pkgs/development/python-modules/robotframework-sshlibrary/default.nix
new file mode 100644
index 000000000000..e72a72308643
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotframework-sshlibrary/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, robotframework
+, paramiko
+, scp
+}:
+
+buildPythonPackage rec {
+  version = "3.8.0";
+  pname = "robotframework-sshlibrary";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "aedf8a02bcb7344404cf8575d0ada25d6c7dc2fcb65de2113c4e07c63d2446c2";
+  };
+
+  # unit tests are impure
+  doCheck = false;
+
+  propagatedBuildInputs = [ robotframework paramiko scp ];
+
+  meta = with lib; {
+    description = "SSHLibrary is a Robot Framework test library for SSH and SFTP";
+    homepage = "https://github.com/robotframework/SSHLibrary";
+    license = licenses.asl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/robotframework-tools/default.nix b/nixpkgs/pkgs/development/python-modules/robotframework-tools/default.nix
new file mode 100644
index 000000000000..3dcf1606c8ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotframework-tools/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, robotframework
+, moretools
+, path
+, six
+, zetup
+, modeled
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  version = "0.1rc4";
+  pname = "robotframework-tools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0377ikajf6c3zcy3lc0kh4w9zmlqyplk2c2hb0yyc7h3jnfnya96";
+  };
+
+  nativeBuildInputs = [ zetup ];
+
+  propagatedBuildInputs = [
+    robotframework
+    moretools
+    path
+    six
+    modeled
+  ];
+
+  postPatch = ''
+    # Remove upstream's selfmade approach to collect the dependencies
+    # https://github.com/userzimmermann/robotframework-tools/issues/1
+    substituteInPlace setup.py --replace \
+      "setup_requires=SETUP_REQUIRES + (zfg.SETUP_REQUIRES or [])," ""
+  '';
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  pytestFlagsArray = [ "test" ];
+  pythonImportsCheck = [ "robottools" ];
+
+  meta = with lib; {
+    description = "Python Tools for Robot Framework and Test Libraries";
+    homepage = "https://github.com/userzimmermann/robotframework-tools";
+    license = licenses.gpl3Plus;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/robotframework/default.nix b/nixpkgs/pkgs/development/python-modules/robotframework/default.nix
new file mode 100644
index 000000000000..122e2ff326ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotframework/default.nix
@@ -0,0 +1,26 @@
+{ lib, fetchFromGitHub, buildPythonPackage, jsonschema }:
+
+buildPythonPackage rec {
+  pname = "robotframework";
+  version = "6.1.1";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-vtP0TVkCMrm0CRXlpZvVTBf7yd8+3p+nRArMWyQUn4k=";
+  };
+
+  nativeCheckInputs = [ jsonschema ];
+
+  checkPhase = ''
+    python3 utest/run.py
+  '';
+
+  meta = with lib; {
+    description = "Generic test automation framework";
+    homepage = "https://robotframework.org/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/robotstatuschecker/default.nix b/nixpkgs/pkgs/development/python-modules/robotstatuschecker/default.nix
new file mode 100644
index 000000000000..d11c38444a35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotstatuschecker/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchFromGitHub, python, robotframework }:
+
+buildPythonPackage rec {
+  version = "3.0.1";
+  pname = "robotstatuschecker";
+
+  # no tests included in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "robotframework";
+    repo = "statuschecker";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-yW6353gDwo/IzoWOB8oelaS6IUbvTtwwDT05yD7w6UA=";
+  };
+
+  propagatedBuildInputs = [ robotframework ];
+
+  checkPhase = ''
+    ${python.interpreter} test/run.py
+  '';
+
+  meta = with lib; {
+    description = "A tool for checking that Robot Framework test cases have expected statuses and log messages";
+    homepage = "https://github.com/robotframework/statuschecker";
+    license = licenses.asl20;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/robotsuite/default.nix b/nixpkgs/pkgs/development/python-modules/robotsuite/default.nix
new file mode 100644
index 000000000000..544beaf12072
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/robotsuite/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, lxml
+, robotframework
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "robotsuite";
+  version = "2.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sPmOoR5K+gMfyPk2QMbiDNmWPRcqKrsz6ZPBAKR/3XY=";
+  };
+
+  propagatedBuildInputs = [
+    robotframework
+    lxml
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Python unittest test suite for Robot Framework";
+    homepage = "https://github.com/collective/robotsuite/";
+    license = licenses.gpl3Only;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rocket-errbot/default.nix b/nixpkgs/pkgs/development/python-modules/rocket-errbot/default.nix
new file mode 100644
index 000000000000..65b7c62b9e34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rocket-errbot/default.nix
@@ -0,0 +1,26 @@
+{ lib, fetchPypi, fetchpatch, buildPythonPackage }:
+
+buildPythonPackage rec {
+  pname = "rocket-errbot";
+  version = "1.2.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "181y1wqjvlry5xdzbliajvrxvswzh3myh795jnj1pm92r5grqzda";
+  };
+
+  # remove with 1.2.6
+  patches = [ (fetchpatch {
+    # https://github.com/errbotio/rocket/pull/1
+    name = "errbotio-rocket-pull-1.patch";
+    url = "https://github.com/errbotio/rocket/compare/f1a52fe17164f83bccce5e6a1935fc5071c2265f...d69adcd49de5d78bd80f952a2ee31e6a0bac4e3d.patch";
+    sha256 = "1s668yv5b86b78vbqwhcl44k2l16c9bhk3199yy9hayf0vkxnwif";
+  }) ];
+
+  meta = {
+    homepage = "https://github.com/errbotio/rocket";
+    description = "Modern, multi-threaded and extensible web server";
+    license = lib.licenses.mit;
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/roku/default.nix b/nixpkgs/pkgs/development/python-modules/roku/default.nix
new file mode 100644
index 000000000000..c4826e6bc4ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/roku/default.nix
@@ -0,0 +1,26 @@
+{ lib, fetchFromGitHub, buildPythonPackage, requests, pytest, flask, isPy27
+}:
+
+buildPythonPackage rec {
+  version = "4.1";
+  pname = "roku";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "jcarbaugh";
+    repo = "python-roku";
+    rev = "v${version}";
+    sha256 = "09mq59kjll7gj1srw4qc921ncsm7cld95sbz5v3p2bwmgckpqza7";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  nativeCheckInputs = [ pytest flask ];
+  pythonImportsCheck = [ "roku" ];
+
+  meta = with lib; {
+    description = "Screw remotes. Control your Roku with Python.";
+    homepage = "https://github.com/jcarbaugh/python-roku";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rokuecp/default.nix b/nixpkgs/pkgs/development/python-modules/rokuecp/default.nix
new file mode 100644
index 000000000000..34a5c17a4772
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rokuecp/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, aiohttp
+, aresponses
+, awesomeversion
+, backoff
+, buildPythonPackage
+, cachetools
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytest-freezegun
+, pytestCheckHook
+, pythonOlder
+, xmltodict
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "rokuecp";
+  version = "0.18.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "ctalkington";
+    repo = "python-rokuecp";
+    rev = "refs/tags/${version}";
+    hash = "sha256-fgnR3TZh+cHvC8qJnvwfrrtxCdEr89Uw8ciACzaQPYE=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    backoff
+    cachetools
+    xmltodict
+    awesomeversion
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytest-freezegun
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'version = "0.0.0"' 'version = "${version}"' \
+      --replace "--cov" ""
+  '';
+
+  disabledTests = [
+    # Network related tests are having troube in the sandbox
+    "test_resolve_hostname"
+    "test_get_dns_state"
+    # Assertion issue
+    "test_guess_stream_format"
+    "test_update_tv"
+    "test_get_apps_single_app"
+    "test_get_tv_channels_single_channel"
+  ];
+
+  pythonImportsCheck = [
+    "rokuecp"
+  ];
+
+  meta = with lib; {
+    description = "Asynchronous Python client for Roku (ECP)";
+    homepage = "https://github.com/ctalkington/python-rokuecp";
+    changelog = "https://github.com/ctalkington/python-rokuecp/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rollbar/default.nix b/nixpkgs/pkgs/development/python-modules/rollbar/default.nix
new file mode 100644
index 000000000000..d5caebf899b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rollbar/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, aiocontextvars
+, blinker
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, httpx
+, mock
+, pytestCheckHook
+, requests
+, six
+, pythonOlder
+, webob
+}:
+
+buildPythonPackage rec {
+  pname = "rollbar";
+  version = "1.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Y0e35J8i8ClvwoemrqddZCz2RJTS7hJwQqelk8l9868=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    six
+  ];
+
+  nativeCheckInputs = [
+    webob
+    blinker
+    mock
+    httpx
+    aiocontextvars
+    pytestCheckHook
+  ];
+
+  # Still supporting unittest2
+  # https://github.com/rollbar/pyrollbar/pull/346
+  # https://github.com/rollbar/pyrollbar/pull/340
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "rollbar"
+  ];
+
+  meta = with lib; {
+    description = "Error tracking and logging from Python to Rollbar";
+    homepage = "https://github.com/rollbar/pyrollbar";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/roman/default.nix b/nixpkgs/pkgs/development/python-modules/roman/default.nix
new file mode 100644
index 000000000000..cde0ab0f271b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/roman/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  version = "2.0.0";
+  pname = "roman";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "90e83b512b44dd7fc83d67eb45aa5eb707df623e6fc6e66e7f273abd4b2613ae";
+  };
+
+  meta = with lib; {
+    description = "Integer to Roman numerals converter";
+    homepage = "https://pypi.python.org/pypi/roman";
+    license = licenses.psfl;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ronin/default.nix b/nixpkgs/pkgs/development/python-modules/ronin/default.nix
new file mode 100644
index 000000000000..c9b0a0d25617
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ronin/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, blessings
+, colorama
+, glob2
+}:
+
+buildPythonPackage rec {
+  pname = "ronin";
+  version = "1.1.1";
+
+  src = fetchPypi {
+    inherit version pname;
+    hash = "sha256-5gZ8S0NR4JzKBIdi/xYtVmFg9ObbCSkT7sz+OKWnK/U=";
+  };
+
+  propagatedBuildInputs = [
+    blessings
+    colorama
+    glob2
+  ];
+
+  pythonImportsCheck = [
+    "ronin"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/tliron/ronin/";
+    description = "A straightforward but powerful build system based on Ninja and Python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ AndersonTorres ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/roombapy/default.nix b/nixpkgs/pkgs/development/python-modules/roombapy/default.nix
new file mode 100644
index 000000000000..4b65adafdc9f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/roombapy/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, amqtt
+, buildPythonPackage
+, fetchFromGitHub
+, orjson
+, paho-mqtt
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "roombapy";
+  version = "1.6.9";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pschmitt";
+    repo = "roombapy";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Bu8wl5Qtys1sy5FnB+2NCGnXnuq9u+TUUR9zNdlOFTU=";
+  };
+
+  postPatch = ''
+    # hbmqtt was replaced by amqtt
+    substituteInPlace tests/test_roomba_integration.py \
+      --replace "from hbmqtt.broker import Broker" "from amqtt.broker import Broker"
+
+    substituteInPlace pyproject.toml \
+      --replace 'orjson = ">=3.8.7"' 'orjson = "*"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    orjson
+    paho-mqtt
+  ];
+
+  nativeCheckInputs = [
+    amqtt
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Requires network access
+    "tests/test_discovery.py"
+  ];
+
+  disabledTests = [
+    # Test want to connect to a local MQTT broker
+    "test_roomba_connect"
+  ];
+
+  pythonImportsCheck = [
+    "roombapy"
+  ];
+
+  meta = with lib; {
+    description = "Python program and library to control Wi-Fi enabled iRobot Roombas";
+    homepage = "https://github.com/pschmitt/roombapy";
+    changelog = "https://github.com/pschmitt/roombapy/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/roonapi/default.nix b/nixpkgs/pkgs/development/python-modules/roonapi/default.nix
new file mode 100644
index 000000000000..68346eb7cb3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/roonapi/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ifaddr
+, poetry-core
+, pythonOlder
+, requests
+, six
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "roonapi";
+  version = "0.1.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pavoni";
+    repo = "pyroon";
+    rev = version;
+    hash = "sha256-356eSRlO0kIaOm+O4bApraC0amEprBcCSvzl3LQ7k/E=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    ifaddr
+    requests
+    six
+    websocket-client
+  ];
+
+  # Tests require access to the Roon API
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "roonapi"
+  ];
+
+  meta = with lib; {
+    description = "Python library to interface with the Roon API";
+    homepage = "https://github.com/pavoni/pyroon";
+    changelog = "https://github.com/pavoni/pyroon/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rope/default.nix b/nixpkgs/pkgs/development/python-modules/rope/default.nix
new file mode 100644
index 000000000000..c014314685b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rope/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytoolconfig
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "rope";
+  version = "1.9.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "python-rope";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-j65C3x3anhH23D4kic5j++r/Ft0RqgZ/jFrNrNHVcXA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pytoolconfig
+  ] ++ pytoolconfig.optional-dependencies.global;
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_search_submodule"
+    "test_get_package_source_pytest"
+    "test_get_modname_folder"
+  ];
+
+  meta = with lib; {
+    description = "Python refactoring library";
+    homepage = "https://github.com/python-rope/rope";
+    changelog = "https://github.com/python-rope/rope/blob/${version}/CHANGELOG.md";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ropgadget/default.nix b/nixpkgs/pkgs/development/python-modules/ropgadget/default.nix
new file mode 100644
index 000000000000..04c934b4ed11
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ropgadget/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, capstone
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ropgadget";
+  version = "7.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "JonathanSalwan";
+    repo = "ROPgadget";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-6m8opcTM4vrK+VCPXxNhZttUq6YmS8swLUDhjyfinWE=";
+  };
+
+  propagatedBuildInputs = [
+    capstone
+  ];
+
+  # Test suite is working with binaries
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ropgadget"
+  ];
+
+  meta = with lib; {
+    description = "Tool to search for gadgets in binaries to facilitate ROP exploitation";
+    homepage = "http://shell-storm.org/project/ROPgadget/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bennofs ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ropper/default.nix b/nixpkgs/pkgs/development/python-modules/ropper/default.nix
new file mode 100644
index 000000000000..1bc393fd44ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ropper/default.nix
@@ -0,0 +1,45 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, capstone
+, filebytes
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ropper";
+  version = "1.13.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sashs";
+    repo = "Ropper";
+    rev = "v${version}";
+    hash = "sha256-agbqP5O9QEP5UKkaWI5HxAlMsCBPKNSLnAAo2WFDXS8=";
+  };
+
+  propagatedBuildInputs = [
+    capstone
+    filebytes
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ropper"
+  ];
+
+  meta = with lib; {
+    description = "Show information about files in different file formats";
+    homepage = "https://scoding.de/ropper/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bennofs ];
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rotary-embedding-torch/default.nix b/nixpkgs/pkgs/development/python-modules/rotary-embedding-torch/default.nix
new file mode 100644
index 000000000000..814f178c81f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rotary-embedding-torch/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, setuptools
+, wheel
+
+# dependencies
+, einops
+, torch
+}:
+
+buildPythonPackage rec {
+  pname = "rotary-embedding-torch";
+  version = "0.3.6";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "lucidrains";
+    repo = "rotary-embedding-torch";
+    rev = "refs/tags/${version}";
+    hash = "sha256-sbkUHFUv/+nY6AT3wu/ipuDF45VUjQalsYcIvUFR9PE=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    einops
+    torch
+  ];
+
+  pythonImportsCheck = [
+    "rotary_embedding_torch"
+  ];
+
+  doCheck = false; # no tests
+
+  meta = with lib; {
+    description = "Implementation of Rotary Embeddings, from the Roformer paper, in Pytorch";
+    homepage = "https://github.com/lucidrains/rotary-embedding-torch";
+    license = licenses.mit;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rouge-score/default.nix b/nixpkgs/pkgs/development/python-modules/rouge-score/default.nix
new file mode 100644
index 000000000000..09d2bcc1dc81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rouge-score/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, fetchPypi
+, fetchFromGitHub
+, python
+, buildPythonPackage
+, absl-py
+, nltk
+, numpy
+, six
+, pytestCheckHook
+, pythonOlder
+}:
+let
+  testdata = fetchFromGitHub {
+    owner = "google-research";
+    repo = "google-research";
+    sparseCheckout = [ "rouge/testdata" ];
+    rev = "1d4d2f1aa6f2883a790d2ae46a6ee8ab150d8f31";
+    hash = "sha256-ojqk6U2caS7Xz4iGUC9aQVHrKb2QNvMlPuQAL/jJat0=";
+  };
+in buildPythonPackage rec {
+  pname = "rouge-score";
+  version = "0.1.2";
+  format = "setuptools";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "rouge_score";
+    inherit version;
+    extension = "tar.gz";
+    hash = "sha256-x9TaJoPmjJq/ATXvkV1jpGZDZm+EjlWKG59+rRf/DwQ=";
+  };
+
+  # the tar file from pypi doesn't come with the test data
+  postPatch = ''
+    substituteInPlace rouge_score/test_util.py \
+      --replace 'os.path.join(os.path.dirname(__file__), "testdata")' '"${testdata}/rouge/testdata/"'
+  '';
+
+  propagatedBuildInputs = [ absl-py nltk numpy six ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  doCheck = true;
+
+  disabledTests = [
+    # https://github.com/google-research/google-research/issues/1203
+    "testRougeLSumSentenceSplitting"
+    # tries to download external tokenizers via nltk
+    "testRougeLsumLarge"
+  ];
+
+  pythonImportsCheck = [ "rouge_score" ];
+
+  meta = {
+    description = "Python ROUGE Implementation";
+    homepage = "https://github.com/google-research/google-research/tree/master/rouge";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ nviets ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/routeros-api/default.nix b/nixpkgs/pkgs/development/python-modules/routeros-api/default.nix
new file mode 100644
index 000000000000..622d29584f02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/routeros-api/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, six
+, mock
+, tox
+}:
+
+buildPythonPackage rec {
+  pname = "routeros-api";
+  version = "0.17.0";
+
+  # N.B. The version published on PyPI is missing tests.
+  src = fetchFromGitHub {
+    owner = "socialwifi";
+    repo = pname;
+    rev = version;
+    sha256 = "wpIfeYZ1w/yoNCHLYFVjn0O4Rb+N5lfvYzhGuN+HDTA=";
+  };
+
+  nativeCheckInputs = [
+    mock
+    tox
+  ];
+
+  propagatedBuildInputs = [ six ];
+
+  meta = with lib; {
+    description = "Python API to RouterBoard devices produced by MikroTik.";
+    homepage = "https://github.com/socialwifi/RouterOS-api";
+    license = licenses.mit;
+    maintainers = with maintainers; [ quentin ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/routes/default.nix b/nixpkgs/pkgs/development/python-modules/routes/default.nix
new file mode 100644
index 000000000000..ea548fcfe56f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/routes/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, repoze_lru
+, six
+, soupsieve
+, webob
+}:
+
+buildPythonPackage rec {
+  pname = "routes";
+  version = "2.5.1";
+
+  src = fetchPypi {
+    pname = "Routes";
+    inherit version;
+    sha256 = "b6346459a15f0cbab01a45a90c3d25caf980d4733d628b4cc1952b865125d053";
+  };
+
+  propagatedBuildInputs = [ repoze_lru six soupsieve webob ];
+
+  # incompatible with latest soupsieve
+  doCheck = false;
+
+  pythonImportsCheck = [ "routes" ];
+
+  meta = with lib; {
+    description = "Re-implementation of the Rails routes system for mapping URLs to application actions";
+    homepage = "https://github.com/bbangert/routes";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rova/default.nix b/nixpkgs/pkgs/development/python-modules/rova/default.nix
new file mode 100644
index 000000000000..5f419615dd53
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rova/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "rova";
+  version = "0.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "GidoHakvoort";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-TLL9Ta+7Xd55hGTTXjc6CBMj+tW1LpFrprpsnGqZvkQ=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "rova"
+  ];
+
+  meta = with lib; {
+    description = "Module to access for ROVA calendars";
+    homepage = "https://github.com/GidoHakvoort/rova";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rpcq/default.nix b/nixpkgs/pkgs/development/python-modules/rpcq/default.nix
new file mode 100644
index 000000000000..42643ca74826
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpcq/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, msgpack
+, numpy
+, pytest-asyncio
+, pytestCheckHook
+, python-rapidjson
+, pythonOlder
+, pyzmq
+, ruamel-yaml
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "rpcq";
+  version = "3.10.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "rigetti";
+    repo = "rpcq";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-J7jtGXJIF3jp0a0IQZmSR4TWf9D02Luau+Bupmi/d68=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "msgpack>=0.6,<1.0" "msgpack"
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    msgpack
+    python-rapidjson
+    pyzmq
+    ruamel-yaml
+  ];
+
+  nativeCheckInputs = [
+    numpy
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    # Don't run tests that spin-up a zmq server
+    "rpcq/test/test_base.py"
+    "rpcq/test/test_spec.py"
+  ];
+
+  pythonImportsCheck = [
+    "rpcq"
+  ];
+
+  meta = with lib; {
+    description = "The RPC framework and message specification for rigetti Quantum Cloud services";
+    homepage = "https://github.com/rigetti/rpcq";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rpdb/default.nix b/nixpkgs/pkgs/development/python-modules/rpdb/default.nix
new file mode 100644
index 000000000000..69a886f6e0da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpdb/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "rpdb";
+  version = "0.1.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5d1a1cee34378ab075879dc30fa6328d448a9f680a66c4e84cac7382ad92f15f";
+  };
+
+  meta = with lib; {
+    description = "pdb wrapper with remote access via tcp socket";
+    homepage = "https://github.com/tamentis/rpdb";
+    license = licenses.bsd2;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rpds-py/default.nix b/nixpkgs/pkgs/development/python-modules/rpds-py/default.nix
new file mode 100644
index 000000000000..6cd3f5dea28e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpds-py/default.nix
@@ -0,0 +1,57 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, cargo
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, rustc
+, rustPlatform
+, libiconv
+}:
+
+buildPythonPackage rec {
+  pname = "rpds-py";
+  version = "0.10.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "rpds_py";
+    inherit version;
+    hash = "sha256-/MHrt1YaPiSmWI98be0V2ArsIsZqBwx1dVm1exf/0cs=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-iWy6BHVsKsZB0SVrh3CVhryaavk4gAQVvRdu9xBiDRg=";
+  };
+
+  nativeBuildInputs = [
+    rustPlatform.cargoSetupHook
+    rustPlatform.maturinBuildHook
+    cargo
+    rustc
+  ];
+
+  buildInputs = lib.optionals stdenv.hostPlatform.isDarwin [
+    libiconv
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "rpds"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings to Rust's persistent data structures (rpds";
+    homepage = "https://pypi.org/project/rpds-py/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rpi-bad-power/default.nix b/nixpkgs/pkgs/development/python-modules/rpi-bad-power/default.nix
new file mode 100644
index 000000000000..5a73ee4a1bf1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpi-bad-power/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pytestCheckHook
+}:
+
+let
+  pname = "rpi-bad-power";
+  version = "0.1.0";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "shenxn";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256:1yvfz28blq4fdnn614n985vbs5hcw1gm3i9am53k410sfs7ilvkk";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  pythonImportsCheck = [
+    "rpi_bad_power"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Python library to detect bad power supply on Raspberry Pi";
+    homepage = "https://github.com/shenxn/rpi-bad-power";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rpi-gpio/default.nix b/nixpkgs/pkgs/development/python-modules/rpi-gpio/default.nix
new file mode 100644
index 000000000000..f1ef22515eb0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpi-gpio/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "rpi-gpio";
+  version = "0.7.1";
+
+  src = fetchPypi {
+    pname = "RPi.GPIO";
+    inherit version;
+    hash = "sha256-zWHEsDw3tiu6SlrP6phidJwzxhjgKV5+kKpHE/s3O3A=";
+  };
+
+  # Tests disable because they do a platform check which requires running on a
+  # Raspberry Pi
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://sourceforge.net/p/raspberry-gpio-python";
+    description = "Python module to control the GPIO on a Raspberry Pi";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rpi-gpio2/default.nix b/nixpkgs/pkgs/development/python-modules/rpi-gpio2/default.nix
new file mode 100644
index 000000000000..43f6e0bbb95e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpi-gpio2/default.nix
@@ -0,0 +1,30 @@
+{ lib, libgpiod, buildPythonPackage, fetchFromGitHub }:
+
+buildPythonPackage rec {
+  pname = "rpi-gpio2";
+  version = "0.4.0";
+
+  # PyPi source does not work for some reason
+  src = fetchFromGitHub {
+    owner = "underground-software";
+    repo = "RPi.GPIO2";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-CNnej67yTh3C8n4cCA7NW97rlfIDrrlepRNDkv+BUeY=";
+  };
+
+  propagatedBuildInputs = [
+    libgpiod
+  ];
+
+  # Disable checks because they need to run on the specific platform
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/underground-software/RPi.GPIO2";
+    description = ''
+      Compatibility layer between RPi.GPIO syntax and libgpiod semantics
+    '';
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rplcd/default.nix b/nixpkgs/pkgs/development/python-modules/rplcd/default.nix
new file mode 100644
index 000000000000..466bfa0ae966
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rplcd/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "rplcd";
+  version = "1.3.1";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "RPLCD";
+    hash = "sha256-uZ0pPzWK8cBSX8/qvcZGYEnlVdtWn/vKPyF1kfwU5Pk=";
+  };
+
+  # Disable check because it depends on a GPIO library
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/dbrgn/RPLCD";
+    description = ''
+      Raspberry Pi LCD library for the widely used Hitachi HD44780 controller
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rply/default.nix b/nixpkgs/pkgs/development/python-modules/rply/default.nix
new file mode 100644
index 000000000000..ff42e93f9560
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rply/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, appdirs
+, py
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "rply";
+  version = "0.7.7";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "alex";
+    repo = "rply";
+    rev = "v${version}";
+    hash = "sha256-5uINDCX4Jr4bSSwqBjvkS3f5wTMnZvsRGq1DeCw8Y+M=";
+  };
+
+  propagatedBuildInputs = [
+    appdirs
+  ];
+
+  nativeCheckInputs = [
+    py
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  meta = with lib; {
+    description = "A python Lex/Yacc that works with RPython";
+    homepage = "https://github.com/alex/rply";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ nixy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rpmfile/default.nix b/nixpkgs/pkgs/development/python-modules/rpmfile/default.nix
new file mode 100644
index 000000000000..6af50237e4bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpmfile/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+}:
+buildPythonPackage rec {
+  pname = "rpmfile";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-tLDdVTrZlxGk+oYmeCm/4XLAPx6hzkztJP+lXtiDhb4=";
+  };
+
+  # Tests access the internet
+  doCheck = false;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  pythonImportsCheck = [
+    "rpmfile"
+  ];
+
+  meta = with lib; {
+    description = "Read rpm archive files";
+    homepage = "https://github.com/srossross/rpmfile";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rpmfluff/default.nix b/nixpkgs/pkgs/development/python-modules/rpmfluff/default.nix
new file mode 100644
index 000000000000..9957393770b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpmfluff/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+, glibcLocales
+}:
+
+buildPythonPackage rec {
+  pname = "rpmfluff";
+  version = "0.5.7.1";
+
+  src = fetchurl {
+  url = "https://releases.pagure.org/${pname}/${pname}-${version}.tar.xz";
+    sha256 = "19vnlzma8b0aghdiixk0q3wc10y6306hsnic0qvswaaiki94fss1";
+  };
+
+  LC_ALL="en_US.utf-8";
+  buildInputs = [ glibcLocales ];
+
+  meta = with lib; {
+    description = "lightweight way of building RPMs, and sabotaging them";
+    homepage = "https://pagure.io/rpmfluff";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ disassembler ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rpy2/default.nix b/nixpkgs/pkgs/development/python-modules/rpy2/default.nix
new file mode 100644
index 000000000000..837d77b4dce2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpy2/default.nix
@@ -0,0 +1,99 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, R
+, rWrapper
+, rPackages
+, pcre
+, xz
+, bzip2
+, zlib
+, icu
+, ipython
+, jinja2
+, pytz
+, pandas
+, numpy
+, cffi
+, tzlocal
+, simplegeneric
+, pytestCheckHook
+, extraRPackages ? []
+}:
+
+buildPythonPackage rec {
+    version = "3.5.14";
+    pname = "rpy2";
+
+    disabled = isPyPy;
+    src = fetchPypi {
+      inherit version pname;
+      hash = "sha256-X0auMdNuEXvjZq1K4CSTwBWsa6WevjtM1yAAdTMvxIE=";
+    };
+
+    patches = [
+      # R_LIBS_SITE is used by the nix r package to point to the installed R libraries.
+      # This patch sets R_LIBS_SITE when rpy2 is imported.
+      ./rpy2-3.x-r-libs-site.patch
+    ];
+
+    postPatch = ''
+      substituteInPlace 'rpy2/rinterface_lib/embedded.py' --replace '@NIX_R_LIBS_SITE@' "$R_LIBS_SITE"
+      substituteInPlace 'requirements.txt' --replace 'pytest' ""
+    '';
+
+    buildInputs = [
+      pcre
+      xz
+      bzip2
+      zlib
+      icu
+    ] ++ (with rPackages; [
+      # packages expected by the test framework
+      ggplot2
+      dplyr
+      RSQLite
+      broom
+      DBI
+      dbplyr
+      hexbin
+      lazyeval
+      lme4
+      tidyr
+    ]) ++ extraRPackages ++ rWrapper.recommendedPackages;
+
+    nativeBuildInputs = [
+      R # needed at setup time to detect R_HOME (alternatively set R_HOME explicitly)
+    ];
+
+    propagatedBuildInputs = [
+      ipython
+      jinja2
+      pytz
+      pandas
+      numpy
+      cffi
+      tzlocal
+      simplegeneric
+    ];
+
+    doCheck = !stdenv.isDarwin;
+
+    # newlines in environment variables are a problem due to
+    # https://github.com/rpy2/rpy2/issues/1066
+    preCheck = "unset postPatch";
+
+    nativeCheckInputs = [
+      pytestCheckHook
+    ];
+
+    meta = {
+      homepage = "https://rpy2.github.io/";
+      description = "Python interface to R";
+      license = lib.licenses.gpl2Plus;
+      platforms = lib.platforms.unix;
+      maintainers = with lib.maintainers; [ joelmo ];
+    };
+  }
diff --git a/nixpkgs/pkgs/development/python-modules/rpy2/rpy2-3.x-r-libs-site.patch b/nixpkgs/pkgs/development/python-modules/rpy2/rpy2-3.x-r-libs-site.patch
new file mode 100644
index 000000000000..2617472096d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpy2/rpy2-3.x-r-libs-site.patch
@@ -0,0 +1,21 @@
+diff --git a/rpy2/rinterface_lib/embedded.py b/rpy2/rinterface_lib/embedded.py
+index ccd3a315..51fb5da4 100644
+--- a/rpy2/rinterface_lib/embedded.py
++++ b/rpy2/rinterface_lib/embedded.py
+@@ -276,6 +276,16 @@ def _initr(
+                  os.environ.get('LD_LIBRARY_PATH', ''))
+                 )
+         )
++
++        # path to libraries
++        existing = os.environ.get('R_LIBS_SITE')
++        if existing is not None:
++            prefix = existing + ':'
++        else:
++            prefix = ''
++        additional = '@NIX_R_LIBS_SITE@'
++        os.environ['R_LIBS_SITE'] = prefix + additional
++
+         options_c = [ffi.new('char[]', o.encode('ASCII')) for o in _options]
+         n_options = len(options_c)
+         n_options_c = ffi.cast('int', n_options)
diff --git a/nixpkgs/pkgs/development/python-modules/rpyc/default.nix b/nixpkgs/pkgs/development/python-modules/rpyc/default.nix
new file mode 100644
index 000000000000..0d02b9b3d93a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rpyc/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, plumbum
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "rpyc";
+  version = "5.3.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tomerfiliba";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-2b6ryqDqZPs5VniLhCwA1/c9+3CT+JJrr3VwP3G6tpY=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    plumbum
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Disable tests that requires network access
+    "test_api"
+    "test_close_timeout"
+    "test_deploy"
+    "test_listing"
+    "test_pruning"
+    "test_rpyc"
+    # Test is outdated
+    # ssl.SSLError: [SSL: NO_CIPHERS_AVAILABLE] no ciphers available (_ssl.c:997)
+    "test_ssl_conenction"
+  ];
+
+  pythonImportsCheck = [
+    "rpyc"
+  ];
+
+  doCheck = !stdenv.isDarwin;
+
+  meta = with lib; {
+    description = "Remote Python Call (RPyC), a transparent and symmetric RPC library";
+    homepage = "https://rpyc.readthedocs.org";
+    changelog = "https://github.com/tomerfiliba-org/rpyc/blob/${version}/CHANGELOG.rst";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rq/default.nix b/nixpkgs/pkgs/development/python-modules/rq/default.nix
new file mode 100644
index 000000000000..b8e19d46f790
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rq/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, click
+, redis
+}:
+
+buildPythonPackage rec {
+  pname = "rq";
+  version = "1.15.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rq";
+    repo = "rq";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-cymNXFI+6YEVw2Pc7u6+vroC0428oW7BTLxyBgPqLng=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    redis
+  ];
+
+  # Tests require a running Redis rerver
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "rq"
+  ];
+
+  meta = with lib; {
+    description = "Library for creating background jobs and processing them";
+    homepage = "https://github.com/nvie/rq/";
+    changelog = "https://github.com/rq/rq/releases/tag/v${version}";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ mrmebelman ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/rsa/default.nix b/nixpkgs/pkgs/development/python-modules/rsa/default.nix
new file mode 100644
index 000000000000..792024166d97
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rsa/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pyasn1
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "rsa";
+  version = "4.9";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "sybrenstuvel";
+    repo = "python-rsa";
+    rev = "version-${version}";
+    hash = "sha256-PwaRe+ICy0UoguXSMSh3PFl5R+YAhJwNdNN9isadlJY=";
+  };
+
+  preConfigure = lib.optionalString (pythonOlder "3.7") ''
+    substituteInPlace setup.py --replace "open('README.md')" "open('README.md',encoding='utf-8')"
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [ pyasn1 ];
+
+  preCheck = ''
+    sed -i '/addopts/d' tox.ini
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    "tests/test_mypy.py"
+  ];
+
+  meta = with lib; {
+    homepage = "https://stuvel.eu/rsa";
+    license = licenses.asl20;
+    description = "A pure-Python RSA implementation";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rsskey/default.nix b/nixpkgs/pkgs/development/python-modules/rsskey/default.nix
new file mode 100644
index 000000000000..61cba286d1b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rsskey/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, feedparser
+, httpx
+, loca
+, markdownify
+, trio
+}:
+
+buildPythonPackage rec {
+  pname = "rsskey";
+  version = "0.2.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QedLuwd0ES2LWhZ72Cjh3+ZZ7HbRyNsyLN9lNFbY5dQ=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    feedparser
+    httpx
+    loca
+    markdownify
+    trio
+  ];
+
+  doCheck = false; # upstream has no test
+  pythonImportsCheck = [ "rsskey" ];
+
+  meta = with lib; {
+    description = "RSS feed mirror on Misskey";
+    homepage = "https://sr.ht/~cnx/rsskey";
+    license = licenses.agpl3Plus;
+    maintainers = with maintainers; [ McSinyx ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rst2ansi/default.nix b/nixpkgs/pkgs/development/python-modules/rst2ansi/default.nix
new file mode 100644
index 000000000000..7e09d32a0a80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rst2ansi/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, docutils, }:
+
+buildPythonPackage rec {
+  pname = "rst2ansi";
+  version = "0.1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Gxf7mmKNQPV5M60aOqlSNGREvgaUaVCOc+lQYNoz/m8=";
+  };
+
+  propagatedBuildInputs = [ docutils ];
+
+  meta = with lib; {
+    description = "A rst converter to ansi-decorated console output";
+    homepage = "https://github.com/Snaipe/python-rst-to-ansi";
+    license = licenses.mit;
+    maintainers = with maintainers; [ vojta001 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rst2pdf/default.nix b/nixpkgs/pkgs/development/python-modules/rst2pdf/default.nix
new file mode 100644
index 000000000000..6fb44840f5b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rst2pdf/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, setuptools-scm
+, wheel
+, docutils
+, importlib-metadata
+, jinja2
+, packaging
+, pygments
+, pyyaml
+, reportlab
+, smartypants
+, pillow
+, pytestCheckHook
+, pymupdf
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "rst2pdf";
+  version = "0.101";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-AF8FssEIFHmeY2oVrAPNe85pbmgKWO52yD6ycNNzTSg=";
+  };
+
+  outputs = [ "out" "man" ];
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    docutils
+    importlib-metadata
+    jinja2
+    packaging
+    pygments
+    pyyaml
+    reportlab
+    smartypants
+    pillow
+  ];
+
+  pythonImportsCheck = [
+    "rst2pdf"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pymupdf
+    sphinx
+  ];
+
+  # Test suite fails: https://github.com/rst2pdf/rst2pdf/issues/1067
+  doCheck = false;
+
+  postInstall = ''
+    mkdir -p $man/share/man/man1/
+    ${docutils}/bin/rst2man.py doc/rst2pdf.rst $man/share/man/man1/rst2pdf.1
+  '';
+
+  meta = with lib; {
+    description = "Convert reStructured Text to PDF via ReportLab";
+    homepage = "https://rst2pdf.org/";
+    changelog = "https://github.com/rst2pdf/rst2pdf/blob/${version}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rstcheck-core/default.nix b/nixpkgs/pkgs/development/python-modules/rstcheck-core/default.nix
new file mode 100644
index 000000000000..0a250a83fa5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rstcheck-core/default.nix
@@ -0,0 +1,66 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, docutils
+, fetchFromGitHub
+, importlib-metadata
+, mock
+, poetry-core
+, pydantic
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, types-docutils
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "rstcheck-core";
+  version = "1.0.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rstcheck";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-9U+GhkwBr+f3yEe7McOxqPRUuTp9vP+3WT5wZ92n32w=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    docutils
+    importlib-metadata
+    pydantic
+    types-docutils
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # Disabled until https://github.com/rstcheck/rstcheck-core/issues/19 is resolved.
+    "test_error_without_config_file_macos"
+    "test_file_1_is_bad_without_config_macos"
+  ];
+
+  pythonImportsCheck = [
+    "rstcheck_core"
+  ];
+
+  meta = with lib; {
+    description = "Library for checking syntax of reStructuredText";
+    homepage = "https://github.com/rstcheck/rstcheck-core";
+    changelog = "https://github.com/rstcheck/rstcheck-core/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rstcheck/default.nix b/nixpkgs/pkgs/development/python-modules/rstcheck/default.nix
new file mode 100644
index 000000000000..22f160000830
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rstcheck/default.nix
@@ -0,0 +1,79 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, docutils
+, fetchFromGitHub
+, importlib-metadata
+, poetry-core
+, pydantic
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, rstcheck-core
+, typer
+, types-docutils
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "rstcheck";
+  version = "6.1.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rstcheck";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-UMByfnnP1va3v1IgyQL0f3kC+W6HoiWScb7U2FAvWkU=";
+  };
+
+  pythonRelaxDeps = [
+    "typer"
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    docutils
+    rstcheck-core
+    types-docutils
+    typing-extensions
+    pydantic
+    typer
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+    importlib-metadata
+  ] ++ typer.optional-dependencies.all;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # Disabled until https://github.com/rstcheck/rstcheck-core/issues/19 is resolved.
+    "test_error_without_config_file_macos"
+    "test_file_1_is_bad_without_config_macos"
+  ];
+
+  pythonImportsCheck = [
+    "rstcheck"
+  ];
+
+  preCheck = ''
+    # The tests need to find and call the rstcheck executable
+    export PATH="$PATH:$out/bin";
+  '';
+
+  meta = with lib; {
+    description = "Checks syntax of reStructuredText and code blocks nested within it";
+    homepage = "https://github.com/myint/rstcheck";
+    changelog = "https://github.com/rstcheck/rstcheck/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ staccato ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rtmidi-python/default.nix b/nixpkgs/pkgs/development/python-modules/rtmidi-python/default.nix
new file mode 100644
index 000000000000..02bb45fd6bc0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rtmidi-python/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, cython
+, alsa-lib
+, CoreAudio
+, CoreMIDI
+, CoreServices
+}:
+
+buildPythonPackage rec {
+  pname = "rtmidi-python";
+  version = "0.2.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1wpcaxfpbmsjc78g8841kpixr0a3v6zn0ak058s3mm25kcysp4m0";
+  };
+
+  postPatch = ''
+    rm rtmidi_python.cpp
+  '';
+
+  nativeBuildInputs = [ cython ];
+  buildInputs = lib.optionals stdenv.isLinux [
+    alsa-lib
+  ] ++ lib.optionals stdenv.isDarwin [
+    CoreAudio
+    CoreMIDI
+    CoreServices
+  ];
+
+  setupPyBuildFlags = [ "--from-cython" ];
+
+  # package has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "rtmidi_python"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for RtMidi";
+    homepage = "https://github.com/superquadratic/rtmidi-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rtmixer/default.nix b/nixpkgs/pkgs/development/python-modules/rtmixer/default.nix
new file mode 100644
index 000000000000..361ba5e7fb56
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rtmixer/default.nix
@@ -0,0 +1,40 @@
+{ fetchFromGitHub
+, buildPythonPackage
+, isPy27
+, cython
+, portaudio
+, cffi
+, pa-ringbuffer
+, sounddevice
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "rtmixer";
+  version = "0.1.4";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "spatialaudio";
+    repo = "python-rtmixer";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-S8aVfxoG0o5GarDX5ZIDQ3GKOT32NtttQJ449FI9Fy0=";
+    fetchSubmodules = true;
+  };
+
+  buildInputs = [ portaudio ];
+  nativeBuildInputs = [ cython ];
+
+  propagatedBuildInputs = [
+    cffi
+    pa-ringbuffer
+    sounddevice
+  ];
+
+  meta = {
+    description = "Reliable low-latency audio playback and recording with Python, using PortAudio via the sounddevice module";
+    homepage = "https://python-rtmixer.readthedocs.io";
+    maintainers = with lib.maintainers; [ laikq ];
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rtoml/default.nix b/nixpkgs/pkgs/development/python-modules/rtoml/default.nix
new file mode 100644
index 000000000000..a7130a101928
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rtoml/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, cargo
+, fetchFromGitHub
+, libiconv
+, pytestCheckHook
+, pythonOlder
+, rustPlatform
+, rustc
+, setuptools-rust
+}:
+
+buildPythonPackage rec {
+  pname = "rtoml";
+  version = "0.8";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "samuelcolvin";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-tvX4KcQGw0khBjEXVFmkhsVyAkdr2Bgm6IfD1yGZ37c=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-KcF3Z71S7ZNZicViqwpClfT736nYYbKcKWylOP+S3HI=";
+  };
+
+  nativeBuildInputs = with rustPlatform; [
+    setuptools-rust
+    rustc
+    cargo
+    rustPlatform.cargoSetupHook
+  ];
+
+  buildInputs = [
+    libiconv
+  ];
+
+  pythonImportsCheck = [
+    "rtoml"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    cd tests
+  '';
+
+  meta = with lib; {
+    description = "Rust based TOML library for Python";
+    homepage = "https://github.com/samuelcolvin/rtoml";
+    license = licenses.mit;
+    maintainers = with maintainers; [ evils ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rtp/default.nix b/nixpkgs/pkgs/development/python-modules/rtp/default.nix
new file mode 100644
index 000000000000..aef1171d8d47
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rtp/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python3
+
+  # nativeCheckInputs
+, hypothesis
+, unittestCheckHook
+
+}:
+
+buildPythonPackage rec {
+  pname = "rtp";
+  version = "0.0.3";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-I5k3uF5lSLDdCWjBEQC4kl2dWyAKcHEJIYwqnEvJDBI=";
+  };
+
+  nativeCheckInputs = [
+    hypothesis
+    unittestCheckHook
+  ];
+
+  unittestFlagsArray = [ "-s" "tests" "-v" ];
+
+  pythonImportsCheck = [
+    "rtp"
+  ];
+
+
+  meta = with lib; {
+    description = "A library for decoding/encoding rtp packets";
+    homepage = "https://github.com/bbc/rd-apmm-python-lib-rtp";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fleaz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rtree/default.nix b/nixpkgs/pkgs/development/python-modules/rtree/default.nix
new file mode 100644
index 000000000000..0de516ec85f0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rtree/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, libspatialindex
+, numpy
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "rtree";
+  version = "1.1.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "Rtree";
+    inherit version;
+    hash = "sha256-b47lBN3l0AWyWwiq9b4LNASvOtX+zm4d3N41kIp5ipU=";
+  };
+
+  postPatch = ''
+    substituteInPlace rtree/finder.py --replace \
+      'find_library("spatialindex_c")' '"${libspatialindex}/lib/libspatialindex_c${stdenv.hostPlatform.extensions.sharedLibrary}"'
+  '';
+
+  buildInputs = [ libspatialindex ];
+
+  nativeCheckInputs = [
+    numpy
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "rtree" ];
+
+  meta = with lib; {
+    description = "R-Tree spatial index for Python GIS";
+    homepage = "https://toblerity.org/rtree/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bgamari ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rtslib/default.nix b/nixpkgs/pkgs/development/python-modules/rtslib/default.nix
new file mode 100644
index 000000000000..808dca3d44f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rtslib/default.nix
@@ -0,0 +1,21 @@
+{ lib, fetchFromGitHub, buildPythonPackage, six, pyudev, pygobject3 }:
+
+buildPythonPackage rec {
+  pname = "rtslib";
+  version = "2.1.76";
+
+  src = fetchFromGitHub {
+    owner = "open-iscsi";
+    repo = "${pname}-fb";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-z9fpSVyv96ZoJaP0ch2A3bX/o/K23ooEpxa/OAhY6Z4=";
+  };
+
+  propagatedBuildInputs = [ six pyudev pygobject3 ];
+
+  meta = with lib; {
+    description = "A Python object API for managing the Linux LIO kernel target";
+    homepage = "https://github.com/open-iscsi/rtslib-fb";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rtsp-to-webrtc/default.nix b/nixpkgs/pkgs/development/python-modules/rtsp-to-webrtc/default.nix
new file mode 100644
index 000000000000..812a4fc1ba1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rtsp-to-webrtc/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "rtsp-to-webrtc";
+  version = "0.5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "allenporter";
+    repo = "rtsp-to-webrtc-client";
+    rev = version;
+    hash = "sha256-miMBN/8IO4v03mMoclCa3GFl6HCS3Sh6z2HOQ39MRZY=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "rtsp_to_webrtc"
+  ];
+
+  meta = with lib; {
+    description = "Module for RTSPtoWeb and RTSPtoWebRTC";
+    homepage = "https://github.com/allenporter/rtsp-to-webrtc-client";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ruamel-base/default.nix b/nixpkgs/pkgs/development/python-modules/ruamel-base/default.nix
new file mode 100644
index 000000000000..675ae527b311
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ruamel-base/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "ruamel-base";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    pname = "ruamel.base";
+    inherit version;
+    sha256 = "1wswxrn4givsm917mfl39rafgadimf1sldpbjdjws00g1wx36hf0";
+  };
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "ruamel.base" ];
+
+  pythonNamespaces = [ "ruamel" ];
+
+  meta = with lib; {
+    description = "Common routines for ruamel packages";
+    homepage = "https://sourceforge.net/projects/ruamel-base/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ruamel-yaml-clib/default.nix b/nixpkgs/pkgs/development/python-modules/ruamel-yaml-clib/default.nix
new file mode 100644
index 000000000000..a7a362bcf4ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ruamel-yaml-clib/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchhg
+, cython
+}:
+
+buildPythonPackage rec {
+  pname = "ruamel-yaml-clib";
+  version = "0.2.7";
+  format = "setuptools";
+
+  src = fetchhg {
+    url = "http://hg.code.sf.net/p/ruamel-yaml-clib/code";
+    rev = version;
+    sha256 = "sha256-QNJyJWfCT8zEvrqI65zPlWIMSRZSoDwIAbFU48TfO4U=";
+  };
+
+  # no tests
+  doCheck = false;
+
+  # circular dependency with ruamel-yaml
+  # pythonImportsCheck = [ "_ruamel_yaml" ];
+  nativeBuildInputs = [ cython ];
+
+  # Fix incompatible function pointer conversion errors with clang 16.
+  patches = [ ./fix-incompatible-function-pointers.patch ];
+  preBuild = "cython _ruamel_yaml.pyx -3 --module-name _ruamel_yaml -I.";
+
+  meta = with lib; {
+    description = "YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order";
+    homepage = "https://sourceforge.net/projects/ruamel-yaml-clib/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ruamel-yaml-clib/fix-incompatible-function-pointers.patch b/nixpkgs/pkgs/development/python-modules/ruamel-yaml-clib/fix-incompatible-function-pointers.patch
new file mode 100644
index 000000000000..99debf22e5ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ruamel-yaml-clib/fix-incompatible-function-pointers.patch
@@ -0,0 +1,79 @@
+Based on https://sourceforge.net/p/ruamel-yaml-clib/code/merge-requests/4/ with additions
+for `input_handler` and `output_handler`.
+
+--- a/_ruamel_yaml.pxd
++++ b/_ruamel_yaml.pxd
+@@ -2,15 +2,15 @@
+ cdef extern from "_ruamel_yaml.h":
+ 
+     void malloc(int l)
+-    void memcpy(char *d, char *s, int l)
++    void memcpy(unsigned char *d, char *s, int l)
+     int strlen(char *s)
+     int PyString_CheckExact(object o)
+     int PyUnicode_CheckExact(object o)
+     char *PyString_AS_STRING(object o)
+     int PyString_GET_SIZE(object o)
+-    object PyString_FromStringAndSize(char *v, int l)
++    object PyString_FromStringAndSize(unsigned char *v, size_t l)
+     object PyUnicode_FromString(char *u)
+-    object PyUnicode_DecodeUTF8(char *u, int s, char *e)
++    object PyUnicode_DecodeUTF8(unsigned char *u, size_t s, char *e)
+     object PyUnicode_AsUTF8String(object o)
+     int PY_MAJOR_VERSION
+ 
+@@ -85,11 +85,11 @@
+         YAML_MAPPING_START_EVENT
+         YAML_MAPPING_END_EVENT
+ 
+-    ctypedef int yaml_read_handler_t(void *data, char *buffer,
+-            int size, int *size_read) except 0
+-
+-    ctypedef int yaml_write_handler_t(void *data, char *buffer,
+-            int size) except 0
++    ctypedef int yaml_read_handler_t(void *data, unsigned char *buffer,
++            size_t size, size_t *size_read) except 0
++
++    ctypedef int yaml_write_handler_t(void *data, unsigned char *buffer,
++            size_t size) except 0
+ 
+     ctypedef struct yaml_mark_t:
+         int index
+@@ -112,7 +112,7 @@
+         char *handle
+         char *suffix
+     ctypedef struct _yaml_token_scalar_data_t:
+-        char *value
++        unsigned char *value
+         int length
+         yaml_scalar_style_t style
+     ctypedef struct _yaml_token_version_directive_data_t:
+@@ -151,7 +151,7 @@
+     ctypedef struct _yaml_event_scalar_data_t:
+         char *anchor
+         char *tag
+-        char *value
++        unsigned char *value
+         int length
+         int plain_implicit
+         int quoted_implicit
+--- a/_ruamel_yaml.pyx
++++ b/_ruamel_yaml.pyx
+@@ -904,7 +904,7 @@
+                 raise error
+         return 1
+
+-cdef int input_handler(void *data, char *buffer, int size, int *read) except 0:
++cdef int input_handler(void *data, unsigned char *buffer, size_t size, size_t *read) except 0:
+     cdef CParser parser
+     parser = <CParser>data
+     if parser.stream_cache is None:
+@@ -1514,7 +1514,7 @@
+             self.ascend_resolver()
+         return 1
+
+-cdef int output_handler(void *data, char *buffer, int size) except 0:
++cdef int output_handler(void *data, unsigned char *buffer, size_t size) except 0:
+     cdef CEmitter emitter
+     emitter = <CEmitter>data
+     if emitter.dump_unicode == 0:
diff --git a/nixpkgs/pkgs/development/python-modules/ruamel-yaml/default.nix b/nixpkgs/pkgs/development/python-modules/ruamel-yaml/default.nix
new file mode 100644
index 000000000000..0c34a24d0864
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ruamel-yaml/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ruamel-base
+, ruamel-yaml-clib
+, isPyPy
+}:
+
+buildPythonPackage rec {
+  pname = "ruamel-yaml";
+  version = "0.17.32";
+
+  src = fetchPypi {
+    pname = "ruamel.yaml";
+    inherit version;
+    hash = "sha256-7JOQY3YZFOFFQpcqXLptM8I7CFmrY0L2HPBwz8YA78I=";
+  };
+
+  # Tests use relative paths
+  doCheck = false;
+
+  propagatedBuildInputs = [ ruamel-base ]
+    ++ lib.optional (!isPyPy) ruamel-yaml-clib;
+
+  pythonImportsCheck = [ "ruamel.yaml" ];
+
+  meta = with lib; {
+    description = "YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order";
+    homepage = "https://sourceforge.net/projects/ruamel-yaml/";
+    changelog = "https://sourceforge.net/p/ruamel-yaml/code/ci/default/tree/CHANGES";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rubymarshal/default.nix b/nixpkgs/pkgs/development/python-modules/rubymarshal/default.nix
new file mode 100644
index 000000000000..51cec6f86025
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rubymarshal/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, hypothesis, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "rubymarshal";
+  version = "1.2.7";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "94aa84fa42393f773c8215fab679bd3b72bbdb9f7931643d3672184cde9981d9";
+  };
+
+  propagatedBuildInputs = [ hypothesis ];
+
+  # pypi doesn't distribute tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "rubymarshal" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/d9pouces/RubyMarshal/";
+    description = "Read and write Ruby-marshalled data";
+    license = licenses.wtfpl;
+    maintainers = [ maintainers.ryantm ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ruffus/default.nix b/nixpkgs/pkgs/development/python-modules/ruffus/default.nix
new file mode 100644
index 000000000000..57d300592995
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ruffus/default.nix
@@ -0,0 +1,47 @@
+{ gevent
+, buildPythonPackage
+, fetchFromGitHub
+, hostname
+, pytest
+, lib, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "ruffus";
+  version = "2.8.4";
+
+  src = fetchFromGitHub {
+    owner = "cgat-developers";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0fnzpchwwqsy5h18fs0n90s51w25n0dx0l74j0ka6lvhjl5sxn4c";
+  };
+
+  propagatedBuildInputs = [ gevent ];
+
+  nativeCheckInputs = [
+    hostname
+    pytest
+  ];
+
+  # tests very flaky & hang often on darwin
+  doCheck = !stdenv.isDarwin;
+  # test files do indeed need to be executed separately
+  checkPhase = ''
+    pushd ruffus/test
+    rm test_with_logger.py  # spawns 500 processes
+    for f in test_*.py ; do
+      HOME=$TMPDIR pytest -v --disable-warnings $f
+    done
+    popd
+  '';
+  pythonImportsCheck = [ "ruffus" ];
+
+  meta = with lib; {
+    description = "Light-weight Python Computational Pipeline Management";
+    homepage = "http://www.ruffus.org.uk";
+    license = licenses.mit;
+    maintainers = [ maintainers.kiwi ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/rules/default.nix b/nixpkgs/pkgs/development/python-modules/rules/default.nix
new file mode 100644
index 000000000000..3563b76affe7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rules/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# tests
+, django
+, djangorestframework
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "rules";
+  version = "3.3.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "dfunckt";
+    repo = "django-rules";
+    rev = "v${version}";
+    hash = "sha256-UFRfRwcvxEn0fD3ScJJ7f/EHd93BOpY3cEF9QDryJZY=";
+  };
+
+  pythonImportsCheck = [
+    "rules"
+  ];
+
+  nativeCheckInputs = [
+    django
+    djangorestframework
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} tests/manage.py test testsuite -v2
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Awesome Django authorization, without the database";
+    homepage = "https://github.com/dfunckt/django-rules";
+    changelog = "https://github.com/dfunckt/django-rules/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rustworkx/default.nix b/nixpkgs/pkgs/development/python-modules/rustworkx/default.nix
new file mode 100644
index 000000000000..4c929ceef965
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rustworkx/default.nix
@@ -0,0 +1,51 @@
+{ fetchFromGitHub
+, buildPythonPackage
+, cargo
+, rustPlatform
+, rustc
+, setuptools-rust
+, numpy
+, fixtures
+, networkx
+, testtools
+, libiconv
+, stdenv
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "rustworkx";
+  version = "0.13.1";
+
+  src = fetchFromGitHub {
+    owner = "Qiskit";
+    repo = pname;
+    rev = version;
+    hash = "sha256-WwQuvRMDGiY9VrWPfxL0OotPCUhCsvbXoVSCNhmIF/g=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    hash = "sha256-QuzBJyM83VtB6CJ7i9/SFE8h6JbxkX/LQ9lOFSQIidU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-rust
+    rustPlatform.cargoSetupHook
+    cargo
+    rustc
+  ];
+
+  buildInputs = [ numpy ] ++ lib.optionals stdenv.isDarwin [ libiconv ];
+
+  checkInputs = [ fixtures networkx testtools ];
+
+  pythonImportsCheck = [ "rustworkx" ];
+
+  meta = with lib; {
+    description = "A high performance Python graph library implemented in Rust";
+    homepage = "https://github.com/Qiskit/rustworkx";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ raitobezarius ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ruuvitag-ble/default.nix b/nixpkgs/pkgs/development/python-modules/ruuvitag-ble/default.nix
new file mode 100644
index 000000000000..d69e92636aef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ruuvitag-ble/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, bluetooth-data-tools
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, home-assistant-bluetooth
+, pytestCheckHook
+, pythonOlder
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "ruuvitag-ble";
+  version = "0.1.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-J+807p2mE+VZ0oqldFtjdcNGsRTkAU54s6byQSGrng4=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-data-tools
+    bluetooth-sensor-state-data
+    home-assistant-bluetooth
+    sensor-state-data
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=ruuvitag_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "ruuvitag_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for Ruuvitag BLE devices";
+    homepage = "https://github.com/Bluetooth-Devices/ruuvitag-ble";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ruyaml/default.nix b/nixpkgs/pkgs/development/python-modules/ruyaml/default.nix
new file mode 100644
index 000000000000..8779325d9b23
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ruyaml/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, distro
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, setuptools-scm-git-archive
+}:
+
+buildPythonPackage rec {
+  pname = "ruyaml";
+  version = "0.91.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "pycontribs";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0gxvwry7n1gczxkjzyfrr3fammllkvnnamja4yln8xrg3n1h89al";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+    setuptools-scm-git-archive
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  propagatedBuildInputs = [
+    distro
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "-W" "ignore::DeprecationWarning"
+  ];
+
+  pythonImportsCheck = [
+    "ruyaml"
+  ];
+
+  meta = with lib; {
+    description = "YAML 1.2 loader/dumper package for Python";
+    homepage = "https://ruyaml.readthedocs.io/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rx/default.nix b/nixpkgs/pkgs/development/python-modules/rx/default.nix
new file mode 100644
index 000000000000..3dc07cd0def4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rx/default.nix
@@ -0,0 +1,31 @@
+{ lib, fetchPypi, buildPythonPackage, pythonOlder, nose }:
+
+buildPythonPackage rec {
+  pname = "rx";
+  version = "3.2.0";
+  disabled = pythonOlder "3.6";
+
+  # Use fetchPypi to avoid the updater script to migrate it to `reactivex` which
+  # is being developed in the same repository
+  src = fetchPypi {
+    inherit version;
+    pname = "Rx";
+    sha256 = "b657ca2b45aa485da2f7dcfd09fac2e554f7ac51ff3c2f8f2ff962ecd963d91c";
+  };
+
+  nativeCheckInputs = [ nose ];
+
+  # Some tests are nondeterministic. (`grep sleep -r tests`)
+  # test_timeout_schedule_action_cancel: https://hydra.nixos.org/build/74954646
+  # test_new_thread_scheduler_timeout: https://hydra.nixos.org/build/74949851
+  doCheck = false;
+
+  pythonImportsCheck = [ "rx" ];
+
+  meta = {
+    homepage = "https://github.com/ReactiveX/RxPY";
+    description = "Reactive Extensions for Python";
+    maintainers = with lib.maintainers; [ thanegill ];
+    license = lib.licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rxv/default.nix b/nixpkgs/pkgs/development/python-modules/rxv/default.nix
new file mode 100644
index 000000000000..50e5f1482cec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rxv/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, defusedxml
+, fetchFromGitHub
+, mock
+, pytest-asyncio
+, pytest-timeout
+, pytest-vcr
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "rxv";
+  version = "0.7.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "wuub";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0jldnlzbfg5jm1nbgv91mlvcqkswd9f2n3qj9aqlbmj1cxq19yz8";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    defusedxml
+    requests
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytest-asyncio
+    pytest-timeout
+    pytest-vcr
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pythonImportsCheck = [ "rxv" ];
+
+  meta = with lib; {
+    description = "Python library for communicate with Yamaha RX-Vxxx receivers";
+    homepage = "https://github.com/wuub/rxv";
+    license = licenses.mit;
+    maintainers = with maintainers; [ flyfloh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/rzpipe/default.nix b/nixpkgs/pkgs/development/python-modules/rzpipe/default.nix
new file mode 100644
index 000000000000..d5a98e0c63bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/rzpipe/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "rzpipe";
+  version = "0.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-py4oiNp+WUcOGHn2AdHyIpgV8BsI8A1gtJi2joi1Wxc=";
+  };
+
+  # No native rz_core library
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "rzpipe"
+  ];
+
+  meta = with lib; {
+    description = "Python interface for rizin";
+    homepage = "https://rizin.re";
+    changelog = "https://github.com/rizinorg/rizin/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/s2clientprotocol/default.nix b/nixpkgs/pkgs/development/python-modules/s2clientprotocol/default.nix
new file mode 100644
index 000000000000..43c89aa9e776
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/s2clientprotocol/default.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, protobuf
+}:
+
+buildPythonPackage rec {
+  pname = "s2clientprotocol";
+  version = "3.19.1.58600.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "02jqwdfj5zpag4c5nf0707qmwk7sqm98yfgrd19rq6pi58zgl74f";
+  };
+
+  patches = [ ./pure-version.patch ];
+
+  buildInputs = [ protobuf ];
+
+  meta = {
+    description = "StarCraft II - client protocol.";
+    homepage = "https://github.com/Blizzard/sc2client-proto";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/s2clientprotocol/pure-version.patch b/nixpkgs/pkgs/development/python-modules/s2clientprotocol/pure-version.patch
new file mode 100644
index 000000000000..43675c3bb11c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/s2clientprotocol/pure-version.patch
@@ -0,0 +1,13 @@
+diff --git a/setup.py b/setup.py
+index 89131a8..19527df 100755
+--- a/setup.py
++++ b/setup.py
+@@ -13,8 +13,6 @@ from distutils.spawn import find_executable
+ from setuptools import setup
+ from setuptools.command.build_py import build_py
+ 
+-import gameversion_autogen as ver
+-
+ SETUP_DIR = os.path.dirname(os.path.abspath(__file__))
+ PROTO_DIR = os.path.join(SETUP_DIR, 's2clientprotocol')
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/s3-credentials/default.nix b/nixpkgs/pkgs/development/python-modules/s3-credentials/default.nix
new file mode 100644
index 000000000000..458f21618caf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/s3-credentials/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, click
+, click-default-group
+, boto3
+, pytestCheckHook
+, hypothesis
+, pytest-mock
+, moto
+}:
+
+buildPythonPackage rec {
+  pname = "s3-credentials";
+  version = "0.15";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "simonw";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-YSsm5SMfDRqJ53XnBjMgaWWHjA6IXnmEBvxme4uiOPw=";
+  };
+
+  propagatedBuildInputs = [
+    boto3
+    click
+    click-default-group
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    moto
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "s3_credentials"
+  ];
+
+  disabledTests = [
+    # AssertionError: assert 'directory/th...ory/...
+    "test_put_objects"
+  ];
+
+  meta = with lib; {
+    description = "Python CLI utility for creating credentials for accessing S3 buckets";
+    homepage = "https://github.com/simonw/s3-credentials";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ techknowlogick ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/s3fs/default.nix b/nixpkgs/pkgs/development/python-modules/s3fs/default.nix
new file mode 100644
index 000000000000..bc4ea00f055c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/s3fs/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, stdenv
+, aiobotocore
+, aiohttp
+, buildPythonPackage
+, docutils
+, fetchPypi
+, fsspec
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "s3fs";
+  version = "2023.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xA8jjMyf7/8/bQnUtXYqvWyRO6QuGjKJdrVNA4kBuDU=";
+  };
+
+  postPatch = ''
+    sed -i 's/fsspec==.*/fsspec/' requirements.txt
+  '';
+
+  buildInputs = [
+    docutils
+  ];
+
+  propagatedBuildInputs = [
+    aiobotocore
+    aiohttp
+    fsspec
+  ];
+
+  # Depends on `moto` which has a long dependency chain with exact
+  # version requirements that can't be made to work with current
+  # pythonPackages.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "s3fs"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "A Pythonic file interface for S3";
+    homepage = "https://github.com/fsspec/s3fs";
+    changelog = "https://github.com/fsspec/s3fs/raw/${version}/docs/source/changelog.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ teh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/s3transfer/default.nix b/nixpkgs/pkgs/development/python-modules/s3transfer/default.nix
new file mode 100644
index 000000000000..748b6abecf45
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/s3transfer/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, botocore
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "s3transfer";
+  version = "0.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "boto";
+    repo = pname;
+    rev = version;
+    hash = "sha256-EvLqRvm9E1Taf+JvbhQbfJqIlbu2a+rB2MX0IO90x98=";
+  };
+
+  propagatedBuildInputs = [ botocore ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  disabledTestPaths = [
+    # Requires network access
+    "tests/integration"
+  ] ++
+  # There was a change in python 3.8 that defaults multiprocessing to spawn instead of fork on macOS
+  # See https://bugs.python.org/issue33725 and https://github.com/python/cpython/pull/13603.
+  # I suspect the underlying issue here is that upstream tests aren't compatible with spawn multiprocessing, and pass on linux where the default is still fork
+  lib.optionals stdenv.isDarwin [ "tests/unit/test_compat.py" ];
+
+  pythonImportsCheck = [ "s3transfer" ];
+
+  meta = with lib; {
+    description = "Library for managing Amazon S3 transfers";
+    homepage = "https://github.com/boto/s3transfer";
+    changelog = "https://github.com/boto/s3transfer/blob/${version}/CHANGELOG.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sabctools/default.nix b/nixpkgs/pkgs/development/python-modules/sabctools/default.nix
new file mode 100644
index 000000000000..d20ea7318620
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sabctools/default.nix
@@ -0,0 +1,27 @@
+{
+  lib,
+  buildPythonPackage,
+  fetchPypi,
+  sabnzbd,
+}:
+buildPythonPackage rec {
+  pname = "sabctools";
+  version = "7.1.2"; # needs to match version sabnzbd expects, e.g. https://github.com/sabnzbd/sabnzbd/blob/4.0.x/requirements.txt#L3
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wDgFXuxclmqMlRXyr9qpruJJcOXfOiOWTZXX53uYEB8=";
+  };
+
+  pythonImportsCheck = ["sabctools"];
+
+  passthru.tests = {inherit sabnzbd;};
+
+  meta = with lib; {
+    description = "C implementations of functions for use within SABnzbd";
+    homepage = "https://github.com/sabnzbd/sabctools";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [adamcstephens];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sabyenc/default.nix b/nixpkgs/pkgs/development/python-modules/sabyenc/default.nix
new file mode 100644
index 000000000000..e8294ce7bcdc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sabyenc/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "sabyenc";
+  version = "3.3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1qbymi1626mmcxnsqdwnz2krxg7jvl4qbh8nwjj54z2p681wvjm4";
+  };
+
+  # tests are not included in pypi distribution
+  doCheck = false;
+
+  meta = {
+    description = "Python yEnc package optimized for use within SABnzbd";
+    homepage = "https://github.com/sabnzbd/sabyenc/";
+    license = lib.licenses.lgpl3;
+    maintainers = [ lib.maintainers.georgewhewell ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sabyenc3/default.nix b/nixpkgs/pkgs/development/python-modules/sabyenc3/default.nix
new file mode 100644
index 000000000000..19bd3d36fc46
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sabyenc3/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sabyenc3";
+  version = "5.4.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-89ZfKnC8sT7xvq4P9rs7aa2uGElwNfjNT/5OWvGqL0E=";
+  };
+
+  # Tests are not included in pypi distribution
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sabyenc3"
+  ];
+
+  meta = with lib; {
+    description = "yEnc Decoding for Python 3";
+    homepage = "https://github.com/sabnzbd/sabyenc/";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ lovek323 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sacn/default.nix b/nixpkgs/pkgs/development/python-modules/sacn/default.nix
new file mode 100644
index 000000000000..4ba86bd68aef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sacn/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sacn";
+  version = "1.9.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-LimA0I8y1tdjFk244iWvKJj0Rx3OEaYOSIJtirRHh4o=";
+  };
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sacn"
+  ];
+
+  meta = with lib; {
+    description = "A simple ANSI E1.31 (aka sACN) module";
+    homepage = "https://github.com/Hundemeier/sacn";
+    changelog = "https://github.com/Hundemeier/sacn/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sacrebleu/default.nix b/nixpkgs/pkgs/development/python-modules/sacrebleu/default.nix
new file mode 100644
index 000000000000..411426eaa34d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sacrebleu/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# Propagated build inputs
+, portalocker
+, regex
+, tabulate
+, numpy
+, colorama
+, lxml
+
+# Check inputs
+, pytestCheckHook
+}:
+let
+  pname = "sacrebleu";
+  version = "2.3.1";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "mjpost";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-+58dhQv5LkjccjktfoAG2gqja6TMLIxHIbRgzZPDhKo=";
+  };
+
+  # postPatch = ''
+  #   substituteInPlace setup.py \
+  #     --replace "portalocker==" "portalocker>="
+  # '';
+
+  propagatedBuildInputs = [
+    portalocker
+    regex
+    tabulate
+    numpy
+    colorama
+    lxml
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # require network access
+    "test/test_api.py"
+    "test/test_dataset.py"
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  pythonImportsCheck = [ "sacrebleu" ];
+
+  meta = with lib; {
+    description = "Hassle-free computation of shareable, comparable, and reproducible BLEU, chrF, and TER scores";
+    homepage = "https://github.com/mjpost/sacrebleu";
+    changelog = "https://github.com/mjpost/sacrebleu/blob/v{version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sacremoses/default.nix b/nixpkgs/pkgs/development/python-modules/sacremoses/default.nix
new file mode 100644
index 000000000000..9efb29ba76f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sacremoses/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage
+, lib
+, fetchFromGitHub
+, click
+, six
+, tqdm
+, joblib
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "sacremoses";
+  version = "0.0.35";
+
+  src = fetchFromGitHub {
+    owner = "alvations";
+    repo = pname;
+    rev = version;
+    sha256 = "1gzr56w8yx82mn08wax5m0xyg15ym4ri5l80gmagp8r53443j770";
+  };
+
+  propagatedBuildInputs = [ click six tqdm joblib ];
+
+  nativeCheckInputs = [ pytest ];
+  # ignore tests which call to remote host
+  checkPhase = ''
+    pytest -k 'not truecase'
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/alvations/sacremoses";
+    description = "Python port of Moses tokenizer, truecaser and normalizer";
+    license = licenses.lgpl21Plus;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ pashashocky ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/safe-pysha3/default.nix b/nixpkgs/pkgs/development/python-modules/safe-pysha3/default.nix
new file mode 100644
index 000000000000..a71cce569ce7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/safe-pysha3/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "safe-pysha3";
+  version = "1.0.4";
+  format = "setuptools";
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5CkUax7dGYssqTSiBGplZWxdMbDsiUu9YFUSf03q/xc=";
+  };
+
+  pythonImportsCheck = [
+    "sha3"
+  ];
+
+  meta = {
+    changelog = "https://github.com/5afe/pysha3/releases/tag/v${version}";
+    description = "SHA-3 (Keccak) for Python 3.9 - 3.11";
+    homepage = "https://github.com/5afe/pysha3";
+    license = lib.licenses.psfl;
+    maintainers = with lib.maintainers; [ wegank ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/safe/default.nix b/nixpkgs/pkgs/development/python-modules/safe/default.nix
new file mode 100644
index 000000000000..6a4515b90f83
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/safe/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+}:
+
+buildPythonPackage rec {
+  version = "0.4";
+  pname = "Safe";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a2fdac9fe8a9dcf02b438201d6ce0b7be78f85dc6492d03edfb89be2adf489de";
+  };
+
+  buildInputs = [ nose ];
+
+  meta = with lib; {
+    homepage = "https://github.com/lepture/safe";
+    license = licenses.bsd3;
+    description = "Check password strength";
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/safeio/default.nix b/nixpkgs/pkgs/development/python-modules/safeio/default.nix
new file mode 100644
index 000000000000..313c32156c4c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/safeio/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "safeio";
+  version = "1.2";
+
+  src = fetchPypi {
+    pname = "safeIO";
+    inherit version;
+    sha256 = "d480a6dab01a390ebc24c12d6b774ad00cef3db5348ad07d8bd11d272a808cd3";
+  };
+
+  pythonImportsCheck = [ "safeIO" ];
+
+  meta = with lib; {
+    description = "Safely make I/O operations to files in Python even from multiple threads";
+    homepage = "https://github.com/Animenosekai/safeIO";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/safetensors/default.nix b/nixpkgs/pkgs/development/python-modules/safetensors/default.nix
new file mode 100644
index 000000000000..976d6b9b3fa8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/safetensors/default.nix
@@ -0,0 +1,70 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, cargo
+, fetchFromGitHub
+, h5py
+, numpy
+, pythonOlder
+, pytestCheckHook
+, rustc
+, rustPlatform
+, setuptools-rust
+, torch
+, libiconv
+}:
+
+buildPythonPackage rec {
+  pname = "safetensors";
+  version = "0.3.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "huggingface";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-U+indMoLFN6vMZkJTWFG08lsdXuK5gOfgaHmUVl6DPk=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    sourceRoot = "${src.name}/bindings/python";
+    hash = "sha256-MhRs9tFCmVZI5O0EVRUbo4ZnUVRQ0EfQTU+E1K+qKZI=";
+  };
+
+  sourceRoot = "${src.name}/bindings/python";
+
+  nativeBuildInputs = [
+    setuptools-rust
+    cargo
+    rustc
+    rustPlatform.cargoSetupHook
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv ];
+
+  nativeCheckInputs = [
+    h5py numpy pytestCheckHook torch
+  ];
+  pytestFlagsArray = [ "tests" ];
+  # don't require PaddlePaddle (not in Nixpkgs), Flax, or Tensorflow (onerous) to run tests:
+  disabledTestPaths = [
+    "tests/test_flax_comparison.py"
+    "tests/test_paddle_comparison.py"
+    "tests/test_tf_comparison.py"
+  ];
+
+  pythonImportsCheck = [
+    "safetensors"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/huggingface/safetensors";
+    description = "Fast (zero-copy) and safe (unlike pickle) format for storing tensors";
+    changelog = "https://github.com/huggingface/safetensors/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/safety/default.nix b/nixpkgs/pkgs/development/python-modules/safety/default.nix
new file mode 100644
index 000000000000..bb367629b5a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/safety/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, pythonRelaxDepsHook
+, setuptools
+, click
+, requests
+, packaging
+, dparse
+, ruamel-yaml
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "safety";
+  version = "2.3.5";
+
+  disabled = pythonOlder "3.6";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-pgwR+JUvQSy7Fl1wyx9nOjtDorqak84R+X5qTeg0qjo=";
+  };
+
+  postPatch = ''
+    substituteInPlace safety/safety.py \
+      --replace "telemetry=True" "telemetry=False"
+    substituteInPlace safety/util.py \
+      --replace "telemetry=True" "telemetry=False"
+    substituteInPlace safety/cli.py \
+      --replace "telemetry', default=True" "telemetry', default=False"
+  '';
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    setuptools
+  ];
+
+  pythonRelaxDeps = [
+    "packaging"
+  ];
+
+  propagatedBuildInputs = [
+    setuptools
+    click
+    requests
+    packaging
+    dparse
+    ruamel-yaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Disable tests depending on online services
+  disabledTests = [
+    "test_announcements_if_is_not_tty"
+    "test_check_live"
+    "test_check_live_cached"
+    "test_check_vulnerabilities"
+    "test_license"
+    "test_chained_review"
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  meta = with lib; {
+    description = "Checks installed dependencies for known vulnerabilities";
+    homepage = "https://github.com/pyupio/safety";
+    changelog = "https://github.com/pyupio/safety/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ thomasdesr dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sagemaker/default.nix b/nixpkgs/pkgs/development/python-modules/sagemaker/default.nix
new file mode 100644
index 000000000000..0f6dd6469046
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sagemaker/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pythonRelaxDepsHook
+, attrs
+, boto3
+, cloudpickle
+, google-pasta
+, numpy
+, protobuf
+, smdebug-rulesconfig
+, importlib-metadata
+, packaging
+, pandas
+, pathos
+, schema
+, pyyaml
+, jsonschema
+, platformdirs
+, tblib
+, urllib3
+, docker
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "sagemaker";
+  version = "2.198.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "aws";
+    repo = "sagemaker-python-sdk";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-iaO+wbMs2FsnPB3Y4zwC49fWqP/zHQGzGisxNtPxOUA=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    "attrs"
+    "boto3"
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    boto3
+    cloudpickle
+    google-pasta
+    numpy
+    protobuf
+    smdebug-rulesconfig
+    importlib-metadata
+    packaging
+    pandas
+    pathos
+    schema
+    pyyaml
+    jsonschema
+    platformdirs
+    tblib
+  ];
+
+  doCheck = false; # many test dependencies are not available in nixpkgs
+
+  pythonImportsCheck = [
+    "sagemaker"
+    "sagemaker.lineage.visualizer"
+  ];
+
+  passthru.optional-dependencies = {
+    local = [ urllib3 docker pyyaml ];
+    scipy = [ scipy ];
+    # feature-processor = [ pyspark sagemaker-feature-store-pyspark ]; # not available in nixpkgs
+  };
+
+  meta = with lib; {
+    description = "Library for training and deploying machine learning models on Amazon SageMaker";
+    homepage = "https://github.com/aws/sagemaker-python-sdk/";
+    changelog = "https://github.com/aws/sagemaker-python-sdk/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ nequissimus ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/salmon-mail/default.nix b/nixpkgs/pkgs/development/python-modules/salmon-mail/default.nix
new file mode 100644
index 000000000000..d213026bd5b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/salmon-mail/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, dnspython, chardet, lmtpd
+, python-daemon, six, jinja2, mock, click }:
+
+buildPythonPackage rec {
+  pname = "salmon-mail";
+  version = "3.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0q2m6xri1b7qv46rqpv2qfdgk2jvswj8lpaacnxwjna3m685fhfx";
+  };
+
+  nativeCheckInputs = [ jinja2 mock ];
+  propagatedBuildInputs = [ chardet dnspython lmtpd python-daemon six click ];
+
+  # Darwin tests fail without this. See:
+  # https://github.com/NixOS/nixpkgs/pull/82166#discussion_r399909846
+  __darwinAllowLocalNetworking = true;
+
+  # The tests use salmon executable installed by salmon itself so we need to add
+  # that to PATH
+  checkPhase = ''
+    # tests fail and pytest is not supported
+    rm tests/server_tests.py
+    PATH=$out/bin:$PATH python setup.py test
+  '';
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    homepage = "https://salmon-mail.readthedocs.org/";
+    description = "Pythonic mail application server";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sampledata/default.nix b/nixpkgs/pkgs/development/python-modules/sampledata/default.nix
new file mode 100644
index 000000000000..93d45b3d1a0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sampledata/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi,
+  nose, pytz, six, versiontools
+}:
+
+buildPythonPackage rec {
+  pname = "sampledata";
+  version = "0.3.7";
+
+  meta = {
+    description = "Sample Data generator for Python ";
+    homepage = "https://github.com/jespino/sampledata";
+    license = lib.licenses.bsd3;
+  };
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1kx2j49lag30d32zhzsr50gl5b949wa4lcdap2filg0d07picsdh";
+  };
+
+  buildInputs = [ nose versiontools ];
+  propagatedBuildInputs = [ pytz six ];
+
+# ERROR: test_image_path_from_directory (tests.tests.TestImageHelpers)
+# ERROR: test_image_stream (tests.tests.TestImageHelpers)
+  doCheck = false;
+
+  checkPhase = ''
+    nosetests -e "TestImageHelpers"
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/samplerate/default.nix b/nixpkgs/pkgs/development/python-modules/samplerate/default.nix
new file mode 100644
index 000000000000..7ac9950a6966
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/samplerate/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, cffi
+, numpy
+, libsamplerate
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "samplerate";
+  version = "0.1.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "tuxu";
+    repo = "python-samplerate";
+    rev = "refs/tags/${version}";
+    hash = "sha256-lHZ9SVnKcsEsnKYXR/QocGbKPEoA7yCZxXvrNPeH1rA=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace ", 'pytest-runner'" ""
+
+    substituteInPlace samplerate/lowlevel.py --replace \
+      "lib_filename = _find_library('samplerate')" \
+      'lib_filename = "${libsamplerate.out}/lib/libsamplerate${stdenv.hostPlatform.extensions.sharedLibrary}"'
+  '';
+
+  propagatedBuildInputs = [
+    cffi
+    numpy
+  ];
+
+  pythonImportsCheck = [
+    "samplerate"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    rm -rf samplerate
+  '';
+
+  meta = with lib; {
+    description = "Python bindings for libsamplerate based on CFFI and NumPy";
+    homepage = "https://github.com/tuxu/python-samplerate";
+    changelog = "https://github.com/tuxu/python-samplerate/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/samsungctl/default.nix b/nixpkgs/pkgs/development/python-modules/samsungctl/default.nix
new file mode 100644
index 000000000000..92af8775d81d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/samsungctl/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+
+# extra: websocket
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "samsungctl";
+  version = "0.7.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ipz3fd65rqkxlb02sql0awc3vnslrwb2pfrsnpfnf8bfgxpbh9g";
+  };
+
+  passthru.optional-dependencies = {
+    websocket = [
+      websocket-client
+    ];
+    # interactive_ui requires curses package
+  };
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "samsungctl" ];
+
+  meta = with lib; {
+    description = "Remote control Samsung televisions via a TCP/IP connection";
+    homepage = "https://github.com/Ape/samsungctl";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/samsungtvws/default.nix b/nixpkgs/pkgs/development/python-modules/samsungtvws/default.nix
new file mode 100644
index 000000000000..d1f5236639f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/samsungtvws/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+
+# propagates:
+, requests
+, websocket-client
+
+# extras: async
+, aiohttp
+, websockets
+
+# extras: encrypted
+, cryptography
+, py3rijndael
+
+# tests
+, aioresponses
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "samsungtvws";
+  version = "2.6.0";
+  format = "setuptools";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "xchwarze";
+    repo = "samsung-tv-ws-api";
+    rev = "v${version}";
+    hash = "sha256-mkjfimzu7paz+ZskartL052AfUBtL1xU0eOlrHgD1UE=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    websocket-client
+  ];
+
+  passthru.optional-dependencies = {
+    async = [
+      aiohttp
+      websockets
+    ];
+    encrypted = [
+      cryptography
+      py3rijndael
+    ];
+  };
+
+  nativeCheckInputs = [
+    aioresponses
+    pytest-asyncio
+    pytestCheckHook
+  ]
+  ++ passthru.optional-dependencies.async
+  ++ passthru.optional-dependencies.encrypted;
+
+  pythonImportsCheck = [ "samsungtvws" ];
+
+  meta = with lib; {
+    description = "Samsung Smart TV WS API wrapper";
+    homepage = "https://github.com/xchwarze/samsung-tv-ws-api";
+    changelog = "https://github.com/xchwarze/samsung-tv-ws-api/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sane/default.nix b/nixpkgs/pkgs/development/python-modules/sane/default.nix
new file mode 100644
index 000000000000..b02feb9e2192
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sane/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sane-backends
+}:
+
+buildPythonPackage rec {
+  pname = "sane";
+  version = "2.9.1";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "python-sane";
+    sha256 = "JAmOuDxujhsBEm5q16WwR5wHsBPF0iBQm1VYkv5JJd4=";
+  };
+
+  buildInputs = [
+    sane-backends
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/python-pillow/Sane";
+    description = "Python interface to the SANE scanner and frame grabber ";
+    license = licenses.mit;
+    maintainers = with maintainers; [ doronbehar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/saneyaml/default.nix b/nixpkgs/pkgs/development/python-modules/saneyaml/default.nix
new file mode 100644
index 000000000000..acbaca9ff018
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/saneyaml/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, setuptools-scm
+, pyyaml
+, pytestCheckHook
+}:
+buildPythonPackage rec {
+  pname = "saneyaml";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sjCfeDZiPNbbkyV067xD4/ZcdD52NReeZL7ssNFibkQ=";
+  };
+
+  dontConfigure = true;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "saneyaml"
+  ];
+
+  meta = with lib; {
+    description = "A PyYaml wrapper with sane behaviour to read and write readable YAML safely";
+    homepage = "https://github.com/nexB/saneyaml";
+    license = licenses.asl20;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sanic-auth/default.nix b/nixpkgs/pkgs/development/python-modules/sanic-auth/default.nix
new file mode 100644
index 000000000000..813df37a84e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sanic-auth/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sanic
+, sanic-testing
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "Sanic-Auth";
+  version = "0.3.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0dc24ynqjraqwgvyk0g9bj87zgpq4xnssl24hnsn7l5vlkmk8198";
+  };
+
+  propagatedBuildInputs = [
+    sanic
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    sanic-testing
+  ];
+
+  disabledTests = [
+    # incompatible with sanic>=22.3.0
+    "test_login_required"
+  ];
+
+  postPatch = ''
+    # Support for httpx>=0.20.0
+    substituteInPlace tests/test_auth.py \
+      --replace "allow_redirects=False" "follow_redirects=False"
+  '';
+
+  pythonImportsCheck = [
+    "sanic_auth"
+  ];
+
+  meta = with lib; {
+    description = "Simple Authentication for Sanic";
+    homepage = "https://github.com/pyx/sanic-auth/";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ arnoldfarkas ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sanic-routing/default.nix b/nixpkgs/pkgs/development/python-modules/sanic-routing/default.nix
new file mode 100644
index 000000000000..c9402b30b125
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sanic-routing/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pytest-asyncio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sanic-routing";
+  version = "23.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sanic-org";
+    repo = "sanic-routing";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ual/vjL3M/nqlaRttJPoBcOYE3L/OAahbBLceUEVLXc=";
+  };
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sanic_routing"
+  ];
+
+  meta = with lib; {
+    description = "Core routing component for the Sanic web framework";
+    homepage = "https://github.com/sanic-org/sanic-routing";
+    changelog = "https://github.com/sanic-org/sanic-routing/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ AluisioASG ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sanic-testing/default.nix b/nixpkgs/pkgs/development/python-modules/sanic-testing/default.nix
new file mode 100644
index 000000000000..8ebdeef2c86f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sanic-testing/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, callPackage
+, fetchFromGitHub
+, httpx
+, pythonOlder
+, sanic
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "sanic-testing";
+  version = "23.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sanic-org";
+    repo = "sanic-testing";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-WDiEuve9P9fLHxpK0UjxhbZUmWXtP+DV7e6OT19TASs=";
+  };
+
+  outputs = [
+    "out"
+    "testsout"
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+    sanic
+    websockets
+  ];
+
+  postInstall = ''
+    mkdir $testsout
+    cp -R tests $testsout/tests
+  '';
+
+  # Check in passthru.tests.pytest to escape infinite recursion with sanic
+  doCheck = false;
+
+  doInstallCheck = false;
+
+  passthru.tests = {
+    pytest = callPackage ./tests.nix { };
+  };
+
+  meta = with lib; {
+    description = "Core testing clients for the Sanic web framework";
+    homepage = "https://github.com/sanic-org/sanic-testing";
+    changelog = "https://github.com/sanic-org/sanic-testing/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ AluisioASG ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sanic-testing/tests.nix b/nixpkgs/pkgs/development/python-modules/sanic-testing/tests.nix
new file mode 100644
index 000000000000..7c2b94d9590c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sanic-testing/tests.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage
+, sanic-testing
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  pname = "sanic-testing-tests";
+  inherit (sanic-testing) version;
+
+  src = sanic-testing.testsout;
+  format = "other";
+
+  dontBuild = true;
+  dontInstall = true;
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    sanic-testing
+  ];
+
+  pythonImportsCheck = [
+    "sanic_testing"
+  ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sanic/default.nix b/nixpkgs/pkgs/development/python-modules/sanic/default.nix
new file mode 100644
index 000000000000..752802df209c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sanic/default.nix
@@ -0,0 +1,175 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+
+# build-system
+, setuptools
+, wheel
+
+# propagates
+, aiofiles
+, html5tagger
+, httptools
+, multidict
+, sanic-routing
+, tracerite
+, typing-extensions
+, ujson
+, uvloop
+, websockets
+
+# optionals
+, aioquic
+
+# tests
+, doCheck ? !stdenv.isDarwin # on Darwin, tests fail but pkg still works
+
+, beautifulsoup4
+, gunicorn
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, sanic-testing
+, uvicorn
+}:
+
+buildPythonPackage rec {
+  pname = "sanic";
+  version = "23.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sanic-org";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Ffw92mlYNV+ikb6299uw24EI1XPpl3Ju2st1Yt/YHKw=";
+  };
+
+  patches = [
+    # https://github.com/sanic-org/sanic/pull/2801
+    (fetchpatch {
+      name = "fix-test-one-cpu.patch";
+      url = "https://github.com/sanic-org/sanic/commit/a1df2a6de1c9c88a85d166e7e2636d26f7925852.patch";
+      hash = "sha256-vljGuoP/Q9HrP+/AOoI1iUpbDQ4/1Pn7AURP1dncI00=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    aiofiles
+    httptools
+    html5tagger
+    multidict
+    sanic-routing
+    tracerite
+    typing-extensions
+    ujson
+    uvloop
+    websockets
+  ];
+
+  passthru.optional-dependencies = {
+    ext = [
+      # TODO: sanic-ext
+    ];
+    http3 = [
+      aioquic
+    ];
+  };
+
+  nativeCheckInputs = [
+    beautifulsoup4
+    gunicorn
+    pytest-asyncio
+    pytestCheckHook
+    sanic-testing
+    uvicorn
+  ] ++ passthru.optional-dependencies.http3;
+
+  inherit doCheck;
+
+  preCheck = ''
+    # Some tests depends on sanic on PATH
+    PATH="$out/bin:$PATH"
+    PYTHONPATH=$PWD:$PYTHONPATH
+
+    # needed for relative paths for some packages
+    cd tests
+  '' + lib.optionalString stdenv.isDarwin ''
+    # OSError: [Errno 24] Too many open files
+    ulimit -n 1024
+  '';
+
+  # uvloop usage is buggy
+  #SANIC_NO_UVLOOP = true;
+
+  pytestFlagsArray = [
+    "--asyncio-mode=auto"
+    "-vvv"
+  ];
+
+  disabledTests = [
+    # Require networking
+    "test_full_message"
+    # Server mode mismatch (debug vs production)
+    "test_num_workers"
+    # Racy tests
+    "test_keep_alive_client_timeout"
+    "test_keep_alive_server_timeout"
+    "test_zero_downtime"
+    # sanic.exceptions.SanicException: Cannot setup Sanic Simple Server without a path to a directory
+    "test_load_app_simple"
+    # create defunct python processes
+    "test_reloader_live"
+    "test_reloader_live_with_dir"
+    "test_reload_listeners"
+    # crash the python interpreter
+    "test_host_port_localhost"
+    "test_host_port"
+    "test_server_run"
+    # NoneType object is not subscriptable
+    "test_serve_app_implicit"
+    # AssertionError: assert [] == ['Restarting a process', 'Begin restart termination', 'Starting a process']
+    "test_default_reload_shutdown_order"
+    # App not found.
+    "test_input_is_dir"
+    # HTTP 500 with Websocket subprotocols
+    "test_websocket_route_with_subprotocols"
+    # Socket closes early
+    "test_no_exceptions_when_cancel_pending_request"
+  ];
+
+  disabledTestPaths = [
+    # We are not interested in benchmarks
+    "benchmark/"
+    # We are also not interested in typing
+    "typing/test_typing.py"
+    # unable to create async loop
+    "test_app.py"
+    "test_asgi.py"
+    # occasionally hangs
+    "test_multiprocessing.py"
+  ];
+
+  # avoid usage of nixpkgs-review in darwin since tests will compete usage
+  # for the same local port
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [ "sanic" ];
+
+  meta = with lib; {
+    description = "Web server and web framework";
+    homepage = "https://github.com/sanic-org/sanic/";
+    changelog = "https://github.com/sanic-org/sanic/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ AluisioASG ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sansio-multipart/default.nix b/nixpkgs/pkgs/development/python-modules/sansio-multipart/default.nix
new file mode 100644
index 000000000000..e9379bc52236
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sansio-multipart/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "sansio-multipart";
+  version = "0.3";
+
+  disabled = isPy27;
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "sansio_multipart";
+    inherit version;
+    sha256 = "6e95b2e64039a95d0f2cd8f3360eaf418d6b9018fb2215d82d399d62d6122dc3";
+  };
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "sansio_multipart" ];
+
+  meta = {
+    description = "Parser for multipart/form-data";
+    homepage = "https://github.com/theelous3/sansio-multipart-parser";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sarge/default.nix b/nixpkgs/pkgs/development/python-modules/sarge/default.nix
new file mode 100644
index 000000000000..f3dc0f269f85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sarge/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sarge";
+  version = "0.1.7.post1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "vsajip";
+    repo = pname;
+    rev = version;
+    hash = "sha256-bT1DbcQi+SbeRBsL7ILuQbSnAj3BBB4+FNl+Zek5xU4=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Aarch64-linux times out for these tests, so they need to be disabled.
+    "test_timeout"
+    "test_feeder"
+  ];
+
+  pythonImportsCheck = [
+    "sarge"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for subprocess which provides command pipeline functionality";
+    homepage = "https://sarge.readthedocs.org/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sarif-om/default.nix b/nixpkgs/pkgs/development/python-modules/sarif-om/default.nix
new file mode 100644
index 000000000000..b7b334ebf9ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sarif-om/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchPypi
+, attrs
+, pbr
+}:
+
+buildPythonPackage rec {
+  pname = "sarif-om";
+  version = "1.0.4";
+
+  src = fetchPypi {
+    pname = "sarif_om";
+    inherit version;
+    sha256 = "cd5f416b3083e00d402a92e449a7ff67af46f11241073eea0461802a3b5aef98";
+  };
+
+  nativeBuildInputs = [
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+  ];
+
+  pythonImportsCheck = [ "sarif_om" ];
+
+  # no tests included with tarball
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Classes implementing the SARIF 2.1.0 object model";
+    homepage = "https://github.com/microsoft/sarif-python-om";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sasmodels/default.nix b/nixpkgs/pkgs/development/python-modules/sasmodels/default.nix
new file mode 100644
index 000000000000..a0e1907c9b1d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sasmodels/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, pytest
+, numpy
+, scipy
+, matplotlib
+, docutils
+, pyopencl
+, opencl-headers
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sasmodels";
+  version = "1.0.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "SasView";
+    repo = "sasmodels";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-GZQYVvQ4bEBizTmJ+o5fIfGr8gn2/4uD3PxIswEjzSE=";
+  };
+
+  buildInputs = [
+    opencl-headers
+  ];
+
+  propagatedBuildInputs = [
+    docutils
+    matplotlib
+    numpy
+    scipy
+    pyopencl
+  ];
+
+  # Note: the 1.0.5 release should be compatible with pytest6, so this can
+  # be set back to 'pytest' at that point
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    HOME=$(mktemp -d) py.test -c ./pytest.ini
+  '';
+
+  pythonImportsCheck = [
+    "sasmodels"
+  ];
+
+  meta = with lib; {
+    description = "Library of small angle scattering models";
+    homepage = "https://github.com/SasView/sasmodels";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ rprospero ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scales/default.nix b/nixpkgs/pkgs/development/python-modules/scales/default.nix
new file mode 100644
index 000000000000..93e566fd380b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scales/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "scales";
+  version = "1.0.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8b6930f7d4bf115192290b44c757af5e254e3fcfcb75ff9a51f5c96a404e2753";
+  };
+
+  nativeCheckInputs = [ nose ];
+  propagatedBuildInputs = [ six ];
+
+  # No tests included
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Stats for Python processes";
+    homepage = "https://www.github.com/Cue/scales";
+    license = licenses.asl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scancode-toolkit/default.nix b/nixpkgs/pkgs/development/python-modules/scancode-toolkit/default.nix
new file mode 100644
index 000000000000..2affddbb6a4c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scancode-toolkit/default.nix
@@ -0,0 +1,176 @@
+{ lib
+, attrs
+, beautifulsoup4
+, bitarray
+, boolean-py
+, buildPythonPackage
+, chardet
+, click
+, colorama
+, commoncode
+, container-inspector
+, debian-inspector
+, dparse2
+, extractcode
+, extractcode-7z
+, extractcode-libarchive
+, fasteners
+, fetchPypi
+, fetchpatch
+, fingerprints
+, ftfy
+, gemfileparser2
+, html5lib
+, importlib-metadata
+, intbitset
+, jaraco-functools
+, javaproperties
+, jinja2
+, jsonstreams
+, license-expression
+, lxml
+, markupsafe
+, packageurl-python
+, packaging
+, parameter-expansion-patched
+, pefile
+, pip-requirements-parser
+, pkginfo2
+, pluggy
+, plugincode
+, publicsuffix2
+, pyahocorasick
+, pycryptodome
+, pygmars
+, pygments
+, pymaven-patch
+, pytestCheckHook
+, pythonOlder
+, requests
+, saneyaml
+, spdx-tools
+, text-unidecode
+, toml
+, typecode
+, typecode-libmagic
+, typing
+, urlpy
+, xmltodict
+, zipp
+}:
+
+buildPythonPackage rec {
+  pname = "scancode-toolkit";
+  version = "32.0.6";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-suqk7LOnZgSJGlaHq81LDOSCHZWdsJOUbma6MEpHxSM=";
+  };
+
+  dontConfigure = true;
+
+  propagatedBuildInputs = [
+    attrs
+    beautifulsoup4
+    bitarray
+    boolean-py
+    chardet
+    click
+    colorama
+    commoncode
+    container-inspector
+    debian-inspector
+    dparse2
+    extractcode
+    extractcode-7z
+    extractcode-libarchive
+    fasteners
+    fingerprints
+    ftfy
+    gemfileparser2
+    html5lib
+    importlib-metadata
+    intbitset
+    jaraco-functools
+    javaproperties
+    jinja2
+    jsonstreams
+    license-expression
+    lxml
+    markupsafe
+    packageurl-python
+    packaging
+    parameter-expansion-patched
+    pefile
+    pip-requirements-parser
+    pkginfo2
+    pluggy
+    plugincode
+    publicsuffix2
+    pyahocorasick
+    pycryptodome
+    pygmars
+    pygments
+    pymaven-patch
+    requests
+    saneyaml
+    spdx-tools
+    text-unidecode
+    toml
+    typecode
+    typecode-libmagic
+    urlpy
+    xmltodict
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    zipp
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    typing
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  patches = [
+    (fetchpatch {
+      name = "${pname}-allow-stable-spdx-tools.patch";
+      url = "https://github.com/nexB/scancode-toolkit/commit/d89ab6584d3df6b7eb1d1394559e9d967d6db6ae.patch";
+      includes = [ "src/*" ];
+      hash = "sha256-AU3vJlOxmCy3yvkupVaAVxAKxJI3ymXEk+A5DWSkfOM=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "pdfminer.six >= 20200101" "pdfminer.six" \
+      --replace "pluggy >= 0.12.0, < 1.0" "pluggy" \
+      --replace "pygmars >= 0.7.0" "pygmars" \
+      --replace "license_expression >= 21.6.14" "license_expression" \
+      --replace "intbitset >= 2.3.0,  < 3.0" "intbitset" \
+      --replace "spdx_tools == 0.7.0a3" "spdx_tools"
+  '';
+
+  # Importing scancode needs a writeable home, and preCheck happens in between
+  # pythonImportsCheckPhase and pytestCheckPhase.
+  postInstall = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  pythonImportsCheck = [
+    "scancode"
+  ];
+
+  # takes a long time and doesn't appear to do anything
+  dontStrip = true;
+
+  meta = with lib; {
+    description = "Tool to scan code for license, copyright, package and their documented dependencies and other interesting facts";
+    homepage = "https://github.com/nexB/scancode-toolkit";
+    changelog = "https://github.com/nexB/scancode-toolkit/blob/v${version}/CHANGELOG.rst";
+    license = with licenses; [ asl20 cc-by-40 ];
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scapy/default.nix b/nixpkgs/pkgs/development/python-modules/scapy/default.nix
new file mode 100644
index 000000000000..4f2c9cad8e36
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scapy/default.nix
@@ -0,0 +1,92 @@
+{ buildPythonPackage, fetchFromGitHub, stdenv, lib, isPyPy
+, pycrypto, ecdsa # TODO
+, mock, can, brotli
+, withOptionalDeps ? true, tcpdump, ipython
+, withCryptography ? true, cryptography
+, withVoipSupport ? true, sox
+, withPlottingSupport ? true, matplotlib
+, withGraphicsSupport ? false, pyx, texliveBasic, graphviz, imagemagick
+, withManufDb ? false, wireshark
+, libpcap
+# 2D/3D graphics and graphs TODO: VPython
+# TODO: nmap, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "scapy";
+  version = "2.5.0";
+
+  disabled = isPyPy;
+
+  src = fetchFromGitHub {
+    owner = "secdev";
+    repo = "scapy";
+    rev = "v${version}";
+    hash = "sha256-xJlovcxUQOQHfOU0Jgin/ayd2T5fOyeN4Jg0DbLHoeU=";
+  };
+
+  patches = [
+    ./find-library.patch
+  ];
+
+  postPatch = ''
+    printf "${version}" > scapy/VERSION
+
+    libpcap_file="${lib.getLib libpcap}/lib/libpcap${stdenv.hostPlatform.extensions.sharedLibrary}"
+    if ! [ -e "$libpcap_file" ]; then
+        echo "error: $libpcap_file not found" >&2
+        exit 1
+    fi
+    substituteInPlace "scapy/libs/winpcapy.py" \
+        --replace "@libpcap_file@" "$libpcap_file"
+  '' + lib.optionalString withManufDb ''
+    substituteInPlace scapy/data.py --replace "/opt/wireshark" "${wireshark}"
+  '';
+
+  propagatedBuildInputs = [ pycrypto ecdsa ]
+    ++ lib.optionals withOptionalDeps [ tcpdump ipython ]
+    ++ lib.optional withCryptography cryptography
+    ++ lib.optional withVoipSupport sox
+    ++ lib.optional withPlottingSupport matplotlib
+    ++ lib.optionals withGraphicsSupport [ pyx texliveBasic graphviz imagemagick ];
+
+  # Running the tests seems too complicated:
+  doCheck = false;
+  nativeCheckInputs = [ mock can brotli ];
+  checkPhase = ''
+    # TODO: be more specific about files
+    patchShebangs .
+    .config/ci/test.sh
+  '';
+  pythonImportsCheck = [ "scapy" ];
+
+  meta = with lib; {
+    description = "A Python-based network packet manipulation program and library";
+    longDescription = ''
+      Scapy is a powerful Python-based interactive packet manipulation program
+      and library.
+
+      It is able to forge or decode packets of a wide number of protocols, send
+      them on the wire, capture them, store or read them using pcap files,
+      match requests and replies, and much more. It is designed to allow fast
+      packet prototyping by using default values that work.
+
+      It can easily handle most classical tasks like scanning, tracerouting,
+      probing, unit tests, attacks or network discovery (it can replace hping,
+      85% of nmap, arpspoof, arp-sk, arping, tcpdump, wireshark, p0f, etc.). It
+      also performs very well at a lot of other specific tasks that most other
+      tools can't handle, like sending invalid frames, injecting your own
+      802.11 frames, combining techniques (VLAN hopping+ARP cache poisoning,
+      VoIP decoding on WEP protected channel, ...), etc.
+
+      Scapy supports Python 2.7 and Python 3 (3.4 to 3.8). It's intended to be
+      cross platform, and runs on many different platforms (Linux, OSX, *BSD,
+      and Windows).
+    '';
+    homepage = "https://scapy.net/";
+    changelog = "https://github.com/secdev/scapy/releases/tag/v${version}";
+    license = licenses.gpl2Only;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ primeos bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scapy/find-library.patch b/nixpkgs/pkgs/development/python-modules/scapy/find-library.patch
new file mode 100644
index 000000000000..bd3a44fd83ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scapy/find-library.patch
@@ -0,0 +1,12 @@
+diff -uNr a/scapy/libs/winpcapy.py b/scapy/libs/winpcapy.py
+--- a/scapy/libs/winpcapy.py	1970-01-01 01:00:01.000000000 +0100
++++ b/scapy/libs/winpcapy.py	2022-08-12 17:57:52.830224862 +0200
+@@ -33,7 +33,7 @@
+ else:
+     # Try to load libpcap
+     SOCKET = c_int
+-    _lib_name = find_library("pcap")
++    _lib_name = "@libpcap_file@"
+     if not _lib_name:
+         raise OSError("Cannot find libpcap.so library")
+     _lib = CDLL(_lib_name)
diff --git a/nixpkgs/pkgs/development/python-modules/schedule/default.nix b/nixpkgs/pkgs/development/python-modules/schedule/default.nix
new file mode 100644
index 000000000000..443b0f73d2df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/schedule/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "schedule";
+  version = "1.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-hDvAU4uZyT8CuLUOPjmIbAby0AOyT0jhqkyt+j80Enk=";
+  };
+
+  buildInputs = [
+    mock
+  ];
+
+  preCheck = ''
+    # https://github.com/dbader/schedule/issues/488
+    substituteInPlace test_schedule.py --replace \
+      "self.assertRaises(ScheduleValueError, every().day.until, datetime.time(hour=5))" \
+      "# self.assertRaises(ScheduleValueError, every().day.until, datetime.time(hour=5))"
+  '';
+
+  pythonImportsCheck = [
+    "schedule"
+  ];
+
+  meta = with lib; {
+    description = "Python job scheduling for humans";
+    homepage = "https://github.com/dbader/schedule";
+    changelog = "https://github.com/dbader/schedule/blob/${version}/HISTORY.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/schema-salad/default.nix b/nixpkgs/pkgs/development/python-modules/schema-salad/default.nix
new file mode 100644
index 000000000000..39a35038fb0a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/schema-salad/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, black
+, buildPythonPackage
+, cachecontrol
+, fetchPypi
+, importlib-resources
+, lockfile
+, mistune
+, mypy
+, pytestCheckHook
+, pythonOlder
+, rdflib
+, ruamel-yaml
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "schema-salad";
+  version = "8.4.20230808163024";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ai4vv6EFX4yTR8sgRspiG+M8a8oa83LIlJPGX7q+Kd0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    cachecontrol
+    importlib-resources
+    lockfile
+    mistune
+    mypy
+    rdflib
+    ruamel-yaml
+    setuptools # needs pkg_resources at runtime
+  ] ++ cachecontrol.optional-dependencies.filecache;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.pycodegen;
+
+  preCheck = ''
+    rm tox.ini
+  '';
+
+  disabledTests = [
+    # Setup for these tests requires network access
+    "test_secondaryFiles"
+    "test_outputBinding"
+    # Test requires network
+    "test_yaml_tab_error"
+    "test_bad_schemas"
+  ];
+
+  pythonImportsCheck = [
+    "schema_salad"
+  ];
+
+  passthru.optional-dependencies = {
+    pycodegen = [
+      black
+    ];
+  };
+
+  meta = with lib; {
+    description = "Semantic Annotations for Linked Avro Data";
+    homepage = "https://github.com/common-workflow-language/schema_salad";
+    changelog = "https://github.com/common-workflow-language/schema_salad/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ veprbl ];
+    # https://github.com/common-workflow-language/schema_salad/issues/721
+    broken = versionAtLeast mistune.version "2.1";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/schema/default.nix b/nixpkgs/pkgs/development/python-modules/schema/default.nix
new file mode 100644
index 000000000000..008813330dc8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/schema/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "schema";
+  version = "0.7.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8GcXESxhiVyrxHB3UriHFuhCCogZ1xQEUB4RT5EEMZc=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  pythonRemoveDeps = [
+    "contextlib2"
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "schema"
+  ];
+
+  meta = with lib; {
+    description = "Library for validating Python data structures";
+    homepage = "https://github.com/keleshev/schema";
+    license = licenses.mit;
+    maintainers = with maintainers; [ tobim ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/schemainspect/default.nix b/nixpkgs/pkgs/development/python-modules/schemainspect/default.nix
new file mode 100644
index 000000000000..e2c375b11b92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/schemainspect/default.nix
@@ -0,0 +1,118 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pythonOlder
+, sqlalchemy
+, sqlbag
+, setuptools
+, poetry-core
+, pytestCheckHook
+, pytest-xdist
+, pytest-sugar
+, postgresql
+, postgresqlTestHook
+,
+}:
+buildPythonPackage rec {
+  pname = "schemainspect";
+  version = "3.1.1663587362";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "djrobstep";
+    repo = pname;
+    # no tags on github, version patch number is unix time.
+    rev = "066262d6fb4668f874925305a0b7dbb3ac866882";
+    hash = "sha256-SYpQQhlvexNc/xEgSIk8L8J+Ta+3OZycGLeZGQ6DWzk=";
+  };
+
+  patches = [
+    # https://github.com/djrobstep/schemainspect/pull/87
+    (fetchpatch
+      {
+        name = "specify_poetry.patch";
+        url = "https://github.com/djrobstep/schemainspect/commit/bdcd001ef7798236fe0ff35cef52f34f388bfe68.patch";
+        hash = "sha256-/SEmcV9GjjvzfbszeGPkfd2DvYenl7bZyWdC0aI3M4M=";
+      })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+  propagatedBuildInputs = [
+    setuptools # needed for 'pkg_resources'
+    sqlalchemy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-xdist
+    pytest-sugar
+
+    postgresql
+    postgresqlTestHook
+
+    sqlbag
+  ];
+
+  preCheck = ''
+    export PGUSER="nixbld";
+    export postgresqlEnableTCP=1;
+  '';
+  disabledTests = [
+    # These all fail with "List argument must consist only of tuples or dictionaries":
+    # Related issue: https://github.com/djrobstep/schemainspect/issues/88
+    "test_can_replace"
+    "test_collations"
+    "test_constraints"
+    "test_dep_order"
+    "test_enum_deps"
+    "test_exclusion_constraint"
+    "test_fk_col_order"
+    "test_fk_info"
+    "test_generated_columns"
+    "test_identity_columns"
+    "test_indexes"
+    "test_inherit"
+    "test_kinds"
+    "test_lineendings"
+    "test_long_identifiers"
+    "test_partitions"
+    "test_postgres_inspect"
+    "test_postgres_inspect_excludeschema"
+    "test_postgres_inspect_sigleschema"
+    "test_raw_connection"
+    "test_relationship"
+    "test_replica_trigger"
+    "test_rls"
+    "test_separate_validate"
+    "test_sequences"
+    "test_table_dependency_order"
+    "test_types_and_domains"
+    "test_view_trigger"
+    "test_weird_names"
+  ];
+
+  pytestFlagsArray = [
+    "-x"
+    "-svv"
+    "tests"
+  ];
+  pythonImportsCheck = [
+    "schemainspect"
+  ];
+
+  postUnpack = ''
+    # this dir is used to bump the version number, having it here fails the build
+    rm -r ./source/deploy
+  '';
+
+  meta = with lib; {
+    description = "Schema inspection for PostgreSQL, and potentially others";
+    homepage = "https://github.com/djrobstep/schemainspect";
+    license = with licenses; [ unlicense ];
+    maintainers = with maintainers; [ soispha ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/schemdraw/default.nix b/nixpkgs/pkgs/development/python-modules/schemdraw/default.nix
new file mode 100644
index 000000000000..bf4bcee43758
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/schemdraw/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pyparsing
+, matplotlib
+, latex2mathml
+, ziafont
+, ziamath
+, pytestCheckHook
+, nbval
+}:
+
+buildPythonPackage rec {
+  pname = "schemdraw";
+  version = "0.17";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "cdelker";
+    repo = pname;
+    rev = version;
+    hash = "sha256-wa/IeNGZynU/xKwyFwebXcFaruhBFqGWsrZYaIEVa8Q=";
+  };
+
+  propagatedBuildInputs = [
+    pyparsing
+  ];
+
+  passthru.optional-dependencies = {
+    matplotlib = [
+      matplotlib
+    ];
+    svgmath = [
+      latex2mathml
+      ziafont
+      ziamath
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    nbval
+    matplotlib
+    latex2mathml
+    ziafont
+    ziamath
+  ];
+
+  # Strip out references to unfree fonts from the test suite
+  postPatch = ''
+    substituteInPlace test/test_styles.ipynb --replace "font='Times', " ""
+  '';
+
+  pytestFlagsArray = [ "--nbval-lax" ];
+
+  pythonImportsCheck = [ "schemdraw" ];
+
+  meta = with lib; {
+    description = "A package for producing high-quality electrical circuit schematic diagrams";
+    homepage = "https://schemdraw.readthedocs.io/en/latest/";
+    changelog = "https://schemdraw.readthedocs.io/en/latest/changes.html";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sfrijters ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/schiene/default.nix b/nixpkgs/pkgs/development/python-modules/schiene/default.nix
new file mode 100644
index 000000000000..cc8d49668064
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/schiene/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "schiene";
+  version = "0.26";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sCaVrHqQZwAZDXIjh4Rg9ZT/EQSbrOPdSyT8oofCsmA=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    beautifulsoup4
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "schiene"
+  ];
+
+  meta = with lib; {
+    description = "Python library for interacting with Bahn.de";
+    homepage = "https://github.com/kennell/schiene";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/schwifty/default.nix b/nixpkgs/pkgs/development/python-modules/schwifty/default.nix
new file mode 100644
index 000000000000..5344c1de3b4c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/schwifty/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, importlib-resources
+, importlib-metadata
+, iso3166
+, pycountry
+, pytestCheckHook
+, pytest-cov
+, pythonOlder
+, setuptools
+, setuptools-scm
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "schwifty";
+  version = "2023.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-hDNAoITt2Ak5aVWmMgqg2oA9rDFsiuum5JXc7v7sspU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    iso3166
+    pycountry
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-resources
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    pytest-cov
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "schwifty"
+  ];
+
+  meta = with lib; {
+    description = "Validate/generate IBANs and BICs";
+    homepage = "https://github.com/mdomke/schwifty";
+    license = licenses.mit;
+    maintainers = with maintainers; [ milibopp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scikit-bio/default.nix b/nixpkgs/pkgs/development/python-modules/scikit-bio/default.nix
new file mode 100644
index 000000000000..a1b355f1b832
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-bio/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cython
+, lockfile
+, cachecontrol
+, decorator
+, h5py
+, ipython
+, matplotlib
+, natsort
+, numpy
+, pandas
+, scipy
+, hdmedians
+, scikit-learn
+, coverage
+, python
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  version = "0.5.9";
+  pname = "scikit-bio";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-euBE3IvuIxkAJIrcOoZZB352FA1WrJ9CvQH7eYEBSRA=";
+  };
+
+  nativeBuildInputs = [ cython ];
+  nativeCheckInputs = [ coverage ];
+  propagatedBuildInputs = [ lockfile cachecontrol decorator ipython matplotlib natsort numpy pandas scipy h5py hdmedians scikit-learn ];
+
+  # cython package not included for tests
+  doCheck = false;
+
+  checkPhase = ''
+    ${python.interpreter} -m skbio.test
+  '';
+
+  pythonImportsCheck = [ "skbio" ];
+
+  meta = with lib; {
+    homepage = "http://scikit-bio.org/";
+    description = "Data structures, algorithms and educational resources for bioinformatics";
+    license = licenses.bsd3;
+    platforms = [ "x86_64-linux" "x86_64-darwin" ];
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scikit-build-core/default.nix b/nixpkgs/pkgs/development/python-modules/scikit-build-core/default.nix
new file mode 100644
index 000000000000..bea510faa93a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-build-core/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, distlib
+, pythonOlder
+, exceptiongroup
+, hatch-vcs
+, hatchling
+, cattrs
+, cmake
+, ninja
+, packaging
+, pathspec
+, pyproject-metadata
+, pytest-subprocess
+, pytestCheckHook
+, setuptools
+, tomli
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-build-core";
+  version = "0.5.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "scikit_build_core";
+    inherit version;
+    hash = "sha256-xtrVpRJ7Kr+qI8uR0jrCEFn9d83fcSKzP9B3kQJNz78=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'minversion = "7.2"' "" \
+      --replace '"error",' '"error", "ignore::DeprecationWarning", "ignore::UserWarning",'
+  '';
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    exceptiongroup
+    tomli
+  ];
+
+  passthru.optional-dependencies = {
+    pyproject = [
+      distlib
+      pathspec
+      pyproject-metadata
+    ];
+  };
+
+  dontUseCmakeConfigure = true;
+
+  nativeCheckInputs = [
+    cattrs
+    cmake
+    ninja
+    pytest-subprocess
+    pytestCheckHook
+    setuptools
+    wheel
+  ] ++ passthru.optional-dependencies.pyproject;
+
+  disabledTestPaths = [
+    # runs pip, requires network access
+    "tests/test_custom_modules.py"
+    "tests/test_pyproject_pep517.py"
+    "tests/test_pyproject_pep518.py"
+    "tests/test_pyproject_pep660.py"
+    "tests/test_setuptools_pep517.py"
+    "tests/test_setuptools_pep518.py"
+  ];
+
+  pythonImportsCheck = [
+    "scikit_build_core"
+  ];
+
+  meta = with lib; {
+    description = "A next generation Python CMake adaptor and Python API for plugins";
+    homepage = "https://github.com/scikit-build/scikit-build-core";
+    changelog = "https://github.com/scikit-build/scikit-build-core/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scikit-build/default.nix b/nixpkgs/pkgs/development/python-modules/scikit-build/default.nix
new file mode 100644
index 000000000000..5b868bb42a6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-build/default.nix
@@ -0,0 +1,95 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, hatch-fancy-pypi-readme
+, hatch-vcs
+, hatchling
+, distro
+, packaging
+, setuptools
+, wheel
+, tomli
+  # Test Inputs
+, cmake
+, cython
+, git
+, path
+, pytestCheckHook
+, pytest-mock
+, requests
+, virtualenv
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-build";
+  version = "0.17.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "scikit_build";
+    inherit version;
+    hash = "sha256-tRpRo2s3xCZQmUtQR5EvWbIuMhCyPjIfKHYR+e9uXJ0=";
+  };
+
+  # This line in the filterwarnings section of the pytest configuration leads to this error:
+  #  E   UserWarning: Distutils was imported before Setuptools, but importing Setuptools also replaces the `distutils` module in `sys.modules`. This may lead to undesirable behaviors or errors. To avoid these issues, avoid using distutils directly, ensure that setuptools is installed in the traditional way (e.g. not an editable install), and/or make sure that setuptools is always imported before distutils.
+  postPatch = ''
+    sed -i "/'error',/d" pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    hatch-fancy-pypi-readme
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    distro
+    packaging
+    setuptools
+    wheel
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  nativeCheckInputs = [
+    cmake
+    cython
+    git
+    pytestCheckHook
+    pytest-mock
+    requests
+    virtualenv
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  disabledTests = [
+    "test_hello_develop" # tries setuptools develop install
+    "test_source_distribution" # pip has no way to install missing dependencies
+    "test_wheel" # pip has no way to install missing dependencies
+    "test_fortran_compiler" # passes if gfortran is available
+    "test_install_command" # tries to alter out path
+    "test_test_command" # tries to alter out path
+    "test_setup" # tries to install using distutils
+    "test_pep518" # pip exits with code 1
+    "test_dual_pep518" # pip exits with code 1
+    "test_isolated_env_trigger_reconfigure" # Regex pattern 'exit skbuild saving cmake spec' does not match 'exit skbuild running make'.
+    "test_hello_wheel" # [Errno 2] No such file or directory: '_skbuild/linux-x86_64-3.9/setuptools/bdist.linux-x86_64/wheel/helloModule.py'
+    # sdist contents differ, contains additional setup.py
+    "test_hello_sdist"
+    "test_manifest_in_sdist"
+    "test_sdist_with_symlinks"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/scikit-build/scikit-build/blob/${version}/CHANGES.rst";
+    description = "Improved build system generator for CPython C/C++/Fortran/Cython extensions";
+    homepage = "https://github.com/scikit-build/scikit-build";
+    license = with licenses; [ mit bsd2 ]; # BSD due to reuses of PyNE code
+    maintainers = with maintainers; [ FlorianFranzen ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scikit-fmm/default.nix b/nixpkgs/pkgs/development/python-modules/scikit-fmm/default.nix
new file mode 100644
index 000000000000..553afcd8a1fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-fmm/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-fmm";
+  version = "2023.4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-14ccR/ggdyq6kvJWUe8U5NJ96M45PArjwCqzxuJCPAs=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  checkPhase = ''
+    mkdir testdir; cd testdir
+    ${python.interpreter} -c "import skfmm, sys; sys.exit(skfmm.test())"
+  '';
+
+  meta = with lib; {
+    description = "A Python extension module which implements the fast marching method";
+    homepage = "https://github.com/scikit-fmm/scikit-fmm";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scikit-fuzzy/default.nix b/nixpkgs/pkgs/development/python-modules/scikit-fuzzy/default.nix
new file mode 100644
index 000000000000..354c27f01915
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-fuzzy/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, fetchpatch
+, matplotlib
+, networkx
+, nose
+, numpy
+, scipy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-fuzzy";
+  version = "unstable-2022-11-07";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "d8c45c259d62955004379592e45bc64c8e002fc3";
+    hash = "sha256-kS48aHC719wUdc2WcJa9geoMUcLHSj7ZsoRZYAhF2a0=";
+  };
+
+  patches = [
+    # https://github.com/scikit-fuzzy/scikit-fuzzy/pull/299
+    (fetchpatch {
+      name = "numpy-1.25-test-compatibility-1.patch";
+      url = "https://github.com/scikit-fuzzy/scikit-fuzzy/commit/d7d114cff002e2edf9361a55cb985615e91797b5.patch";
+      hash = "sha256-udF/z94tVGRHq7gcOko4BSkvVnqe/A/bAARfCPrc06M=";
+    })
+    (fetchpatch {
+      name = "numpy-1.25-test-compatibility-2.patch";
+      url = "https://github.com/scikit-fuzzy/scikit-fuzzy/commit/f1612f6aeff34dc9329dbded7cee098fcd22ffd9.patch";
+      hash = "sha256-Le1ECR4+RjWCkfqjVrd471GD7tuVaQlZ7RZd3zvFdHU=";
+    })
+    (fetchpatch {
+      name = "numpy-1.25-test-compatibility-3.patch";
+      url = "https://github.com/scikit-fuzzy/scikit-fuzzy/commit/459b9602cf182b7b42f93aad8bcf3bda6f20bfb5.patch";
+      hash = "sha256-gKrhNpGt6XoAlMwQW70OPFZj/ZC8NhQq6dEaBpGE8yY=";
+    })
+  ];
+
+  propagatedBuildInputs = [ networkx numpy scipy ];
+  nativeCheckInputs = [ matplotlib nose pytestCheckHook ];
+
+  pythonImportsCheck = [ "skfuzzy" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/scikit-fuzzy/scikit-fuzzy";
+    description = "Fuzzy logic toolkit for scientific Python";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scikit-hep-testdata/default.nix b/nixpkgs/pkgs/development/python-modules/scikit-hep-testdata/default.nix
new file mode 100644
index 000000000000..520c83575005
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-hep-testdata/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, fetchFromGitHub
+, pythonAtLeast
+, buildPythonPackage
+, importlib-resources
+, pyyaml
+, requests
+, setuptools-scm
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-hep-testdata";
+  version = "0.4.34";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "scikit-hep";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-kHpJXqFQI3vtDJIcH2ebzbaReHecwItDh73/NcoPk9A=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    pyyaml
+    requests
+  ] ++ lib.optionals (!pythonAtLeast "3.9") [
+    importlib-resources
+  ];
+
+  SKHEP_DATA = 1; # install the actual root files
+
+  doCheck = false; # tests require networking
+
+  pythonImportsCheck = [
+    "skhep_testdata"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/scikit-hep/scikit-hep-testdata";
+    description = "A common package to provide example files (e.g., ROOT) for testing and developing packages against";
+    changelog = "https://github.com/scikit-hep/scikit-hep-testdata/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scikit-image/default.nix b/nixpkgs/pkgs/development/python-modules/scikit-image/default.nix
new file mode 100644
index 000000000000..7987f3bba1cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-image/default.nix
@@ -0,0 +1,165 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, python
+, pythonOlder
+, astropy
+, cloudpickle
+, cython
+, dask
+, imageio
+, lazy-loader
+, matplotlib
+, meson-python
+, networkx
+, numpy
+, packaging
+, pillow
+, pooch
+, pyamg
+, pytestCheckHook
+, pythran
+, pywavelets
+, scikit-learn
+, scipy
+, setuptools
+, simpleitk
+, six
+, tifffile
+, wheel
+}:
+
+let
+  installedPackageRoot = "${builtins.placeholder "out"}/${python.sitePackages}";
+  self = buildPythonPackage rec {
+    pname = "scikit-image";
+    version = "0.21.0";
+    format = "pyproject";
+
+    disabled = pythonOlder "3.8";
+
+    src = fetchFromGitHub {
+      owner = "scikit-image";
+      repo = "scikit-image";
+      rev = "v${version}";
+      hash = "sha256-WJ2WNlcFCEtPr+bV/af6MoBBhbXDpOBEsJu4FmudoIo=";
+    };
+
+    patches = [
+      # https://github.com/scikit-image/scikit-image/pull/7052
+      # prepare a patch file because the commit contains additional changes
+      ./suppress-deprecation-warning.patch
+    ];
+
+    postPatch = ''
+      patchShebangs skimage/_build_utils/{version,cythoner}.py
+
+      substituteInPlace pyproject.toml \
+        --replace "numpy==" "numpy>="
+    '';
+
+    nativeBuildInputs = [
+      cython
+      meson-python
+      numpy
+      packaging
+      pythran
+      setuptools
+      wheel
+    ];
+
+    propagatedBuildInputs = [
+      imageio
+      lazy-loader
+      matplotlib
+      networkx
+      numpy
+      packaging
+      pillow
+      pywavelets
+      scipy
+      tifffile
+    ];
+
+    passthru.optional-dependencies = {
+      data = [
+        pooch
+      ];
+      optional = [
+        astropy
+        cloudpickle
+        dask
+        matplotlib
+        pooch
+        pyamg
+        scikit-learn
+        simpleitk
+      ] ++ dask.optional-dependencies.array;
+    };
+
+    # test suite is very cpu intensive, move to passthru.tests
+    doCheck = false;
+    nativeCheckInputs = [ pytestCheckHook ];
+
+    # (1) The package has cythonized modules, whose .so libs will appear only in the wheel, i.e. in nix store;
+    # (2) To stop Python from importing the wrong directory, i.e. the one in the build dir, not the one in nix store, `skimage` dir should be removed or renamed;
+    # (3) Therefore, tests should be run on the installed package in nix store.
+
+    # See e.g. https://discourse.nixos.org/t/cant-import-cythonized-modules-at-checkphase/14207 on why the following is needed.
+    preCheck = ''
+      rm -r skimage
+    '';
+
+    disabledTestPaths = [
+      # Requires network access (actually some data is loaded via `skimage._shared.testing.fetch` in the global scope, which calls `pytest.skip` when a network is unaccessible, leading to a pytest collection error).
+      "${installedPackageRoot}/skimage/filters/rank/tests/test_rank.py"
+    ];
+    pytestFlagsArray = [ "${installedPackageRoot}" "--pyargs" "skimage" ] ++ builtins.map (testid: "--deselect=" + testid) ([
+      # These tests require network access
+      "skimage/data/test_data.py::test_skin"
+      "skimage/data/tests/test_data.py::test_skin"
+      "skimage/io/tests/test_io.py::test_imread_http_url"
+      "skimage/restoration/tests/test_rolling_ball.py::test_ndim"
+    ] ++ lib.optionals stdenv.isDarwin [
+      # Matplotlib tests are broken inside darwin sandbox
+      "skimage/feature/tests/test_util.py::test_plot_matches"
+      "skimage/filters/tests/test_thresholding.py::TestSimpleImage::test_try_all_threshold"
+      "skimage/io/tests/test_mpl_imshow.py::"
+    ] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
+      # https://github.com/scikit-image/scikit-image/issues/7104
+      "skimage/measure/tests/test_fit.py"
+      "skimage/measure/tests/test_moments.py"
+    ]);
+
+    # Check cythonized modules
+    pythonImportsCheck = [
+      "skimage"
+      "skimage._shared"
+      "skimage.draw"
+      "skimage.feature"
+      "skimage.restoration"
+      "skimage.filters"
+      "skimage.graph"
+      "skimage.io"
+      "skimage.measure"
+      "skimage.morphology"
+      "skimage.transform"
+      "skimage.util"
+      "skimage.segmentation"
+    ];
+
+    passthru.tests = {
+      all-tests = self.override { doCheck = true; };
+    };
+
+    meta = {
+      description = "Image processing routines for SciPy";
+      homepage = "https://scikit-image.org";
+      changelog = "https://github.com/scikit-image/scikit-image/releases/tag/${src.rev}";
+      license = lib.licenses.bsd3;
+      maintainers = with lib.maintainers; [ yl3dy ];
+    };
+  };
+in
+  self
diff --git a/nixpkgs/pkgs/development/python-modules/scikit-image/suppress-deprecation-warning.patch b/nixpkgs/pkgs/development/python-modules/scikit-image/suppress-deprecation-warning.patch
new file mode 100644
index 000000000000..f51f1d9860a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-image/suppress-deprecation-warning.patch
@@ -0,0 +1,30 @@
+diff --git a/skimage/exposure/tests/test_exposure.py b/skimage/exposure/tests/test_exposure.py
+index ed8dd6bc8..8ec7d13bf 100644
+--- a/skimage/exposure/tests/test_exposure.py
++++ b/skimage/exposure/tests/test_exposure.py
+@@ -368,19 +368,16 @@ def test_rescale_nan_warning(in_range, out_range):
+     )
+ 
+     # 2019/11/10 Passing NaN to np.clip raises a DeprecationWarning for
+-    # versions above 1.17
+-    # TODO: Remove once NumPy removes this DeprecationWarning
++    # versions above 1.17, "|\A\Z" marks as optional warning
++    # TODO: Remove once NumPy 1.25.0 is minimal dependency
+     numpy_warning_1_17_plus = (
+-        "Passing `np.nan` to mean no clipping in np.clip"
++        "|\\A\\ZPassing `np.nan` to mean no clipping in np.clip"
+     )
+ 
+-    if in_range == "image":
+-        exp_warn = [msg, numpy_warning_1_17_plus]
+-    else:
+-        exp_warn = [msg]
++    with expected_warnings([msg, numpy_warning_1_17_plus]):
++        result = exposure.rescale_intensity(image, in_range, out_range)
+ 
+-    with expected_warnings(exp_warn):
+-        exposure.rescale_intensity(image, in_range, out_range)
++    assert np.all(np.isnan(result))
+ 
+ 
+ @pytest.mark.parametrize(
diff --git a/nixpkgs/pkgs/development/python-modules/scikit-learn-extra/default.nix b/nixpkgs/pkgs/development/python-modules/scikit-learn-extra/default.nix
new file mode 100644
index 000000000000..23718fde945a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-learn-extra/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, numpy
+, cython
+, scipy
+, scikit-learn
+, matplotlib
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-learn-extra";
+  version = "0.3.0";
+
+  src = fetchFromGitHub {
+    owner = "scikit-learn-contrib";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-dHOwo6NIuhcvIehpuJQ621JEg5O3mnXycAhpTZKaxns=";
+  };
+
+  nativeBuildInputs = [ numpy cython ];
+  propagatedBuildInputs = [ numpy scipy scikit-learn ];
+  nativeCheckInputs = [ matplotlib pytestCheckHook ];
+
+  preCheck = ''
+    # Remove the package in the build dir, because Python defaults to it and
+    # ignores the one in Nix store with cythonized modules.
+    rm -r sklearn_extra
+  '';
+
+  pytestFlagsArray = [ "--pyargs sklearn_extra" ];
+  disabledTestPaths = [
+    "benchmarks"
+    "examples"
+    "doc"
+  ];
+  disabledTests = [
+    "build"   # needs network connection
+    "test_all_estimators" # sklearn.exceptions.NotFittedError: Estimator fails to pass `check_is_fitted` even though it has been fit.
+  ];
+
+  # Check packages with cythonized modules
+  pythonImportsCheck = [
+    "sklearn_extra"
+    "sklearn_extra.cluster"
+    "sklearn_extra.robust"
+    "sklearn_extra.utils"
+  ];
+
+  meta = {
+    description = "A set of tools for scikit-learn";
+    homepage = "https://github.com/scikit-learn-contrib/scikit-learn-extra";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ yl3dy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scikit-learn/default.nix b/nixpkgs/pkgs/development/python-modules/scikit-learn/default.nix
new file mode 100644
index 000000000000..fa2510b0a441
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-learn/default.nix
@@ -0,0 +1,105 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, gfortran
+, glibcLocales
+, numpy
+, scipy
+, pytestCheckHook
+, pytest-xdist
+, pillow
+, cython
+, joblib
+, llvmPackages
+, threadpoolctl
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-learn";
+  version = "1.3.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-i+VJiG9e2kZDa25VWw5Ic7TxCqIcB99FxLwXNa+8zXo=";
+  };
+
+  buildInputs = [
+    pillow
+    glibcLocales
+  ] ++ lib.optionals stdenv.cc.isClang [
+    llvmPackages.openmp
+  ];
+
+  nativeBuildInputs = [
+    cython
+    gfortran
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    numpy.blas
+    joblib
+    threadpoolctl
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook pytest-xdist ];
+
+  LC_ALL="en_US.UTF-8";
+
+  preBuild = ''
+    export SKLEARN_BUILD_PARALLEL=$NIX_BUILD_CORES
+  '';
+
+  doCheck = !stdenv.isAarch64;
+
+  disabledTests = [
+    # Skip test_feature_importance_regression - does web fetch
+    "test_feature_importance_regression"
+
+    # failing on macos
+    "check_regressors_train"
+    "check_classifiers_train"
+    "xfail_ignored_in_check_estimator"
+  ] ++ lib.optionals (stdenv.isDarwin) [
+    "test_graphical_lasso"
+  ];
+
+  pytestFlagsArray = [
+    # verbose build outputs needed to debug hard-to-reproduce hydra failures
+    "-v"
+    "--pyargs" "sklearn"
+
+    # NuSVC memmap tests causes segmentation faults in certain environments
+    # (e.g. Hydra Darwin machines) related to a long-standing joblib issue
+    # (https://github.com/joblib/joblib/issues/563). See also:
+    # https://github.com/scikit-learn/scikit-learn/issues/17582
+    # Since we are overriding '-k' we need to include the 'disabledTests' from above manually.
+    "-k" "'not (NuSVC and memmap) ${toString (lib.forEach disabledTests (t: "and not ${t}"))}'"
+  ];
+
+  preCheck = ''
+    cd $TMPDIR
+    export HOME=$TMPDIR
+    export OMP_NUM_THREADS=1
+  '';
+
+  pythonImportsCheck = [ "sklearn" ];
+
+  meta = with lib; {
+    description = "A set of python modules for machine learning and data mining";
+    changelog = let
+      major = versions.major version;
+      minor = versions.minor version;
+      dashVer = replaceStrings ["."] ["-"] version;
+    in
+      "https://scikit-learn.org/stable/whats_new/v${major}.${minor}.html#version-${dashVer}";
+    homepage = "https://scikit-learn.org";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ davhau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scikit-misc/default.nix b/nixpkgs/pkgs/development/python-modules/scikit-misc/default.nix
new file mode 100644
index 000000000000..cf9d4c84c0bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-misc/default.nix
@@ -0,0 +1,91 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, cython
+, gfortran
+, git
+, meson-python
+, pkg-config
+, blas
+, lapack
+, numpy
+, setuptools
+, wheel
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-misc";
+  version = "0.3.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "has2k1";
+    repo = "scikit-misc";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-XV3s+y3JdMr1770S91ek6Y7MqvTg7/2cphLQldUPe5s=";
+  };
+
+  postPatch = ''
+    patchShebangs .
+
+    # unbound numpy and disable coverage testing in pytest
+    substituteInPlace pyproject.toml \
+      --replace 'numpy==' 'numpy>=' \
+      --replace 'addopts = "' '#addopts = "'
+
+    # provide a version to use when git fails to get the tag
+    [[ -f skmisc/_version.py ]] || \
+      echo '__version__ = "${version}"' > skmisc/_version.py
+  '';
+
+  nativeBuildInputs = [
+    cython
+    gfortran
+    git
+    meson-python
+    numpy
+    pkg-config
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  buildInputs = [
+    blas
+    lapack
+  ];
+
+  mesonFlags = [
+    "-Dblas=${blas.pname}"
+    "-Dlapack=${lapack.pname}"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # can not run tests from source directory
+  preCheck = ''
+    cd "$(mktemp -d)"
+  '';
+
+  pytestFlagsArray = [
+    "--pyargs skmisc"
+  ];
+
+  pythonImportsCheck = [
+    "skmisc"
+  ];
+
+  meta = with lib; {
+    description = "Miscellaneous tools for scientific computing";
+    homepage = "https://github.com/has2k1/scikit-misc";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scikit-optimize/default.nix b/nixpkgs/pkgs/development/python-modules/scikit-optimize/default.nix
new file mode 100644
index 000000000000..09c9547fd583
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-optimize/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, isPy27
+, buildPythonPackage
+, fetchFromGitHub
+, matplotlib
+, numpy
+, scipy
+, scikit-learn
+, pyaml
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-optimize";
+  version = "0.9.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "scikit-optimize";
+    repo = "scikit-optimize";
+    rev = "v${version}";
+    sha256 = "0hsq6pmryimxc275yrcy4bv217bx7ma6rz0q6m4138bv4zgq18d1";
+  };
+
+  propagatedBuildInputs = [
+    matplotlib
+    numpy
+    scipy
+    scikit-learn
+    pyaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Sequential model-based optimization toolbox";
+    homepage = "https://scikit-optimize.github.io/";
+    license = licenses.bsd3;
+    maintainers = [ ];
+    broken = true; # It will fix by https://github.com/scikit-optimize/scikit-optimize/pull/1123
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scikit-posthocs/0001-increased-abs-tolerance-for-wilcoxon-test.patch b/nixpkgs/pkgs/development/python-modules/scikit-posthocs/0001-increased-abs-tolerance-for-wilcoxon-test.patch
new file mode 100644
index 000000000000..e3fa524e5a4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-posthocs/0001-increased-abs-tolerance-for-wilcoxon-test.patch
@@ -0,0 +1,25 @@
+From 02266a00ce0eb6a089e7efe07816da1aa5152fc9 Mon Sep 17 00:00:00 2001
+From: Maksim Terpilovskii <maximtrp@gmail.com>
+Date: Sun, 31 Jul 2022 12:25:14 +0300
+Subject: [PATCH] increased abs tolerance for wilcoxon test
+
+---
+ tests/test_posthocs.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tests/test_posthocs.py b/tests/test_posthocs.py
+index 956d808..8cc65e4 100644
+--- a/tests/test_posthocs.py
++++ b/tests/test_posthocs.py
+@@ -471,7 +471,7 @@ class TestPosthocs(unittest.TestCase):
+                               [2.857818e-06, 1.230888e-05, 1]])
+ 
+         results = sp.posthoc_wilcoxon(self.df.sort_index(), val_col = 'pulse', group_col = 'kind')
+-        self.assertTrue(np.allclose(results, r_results))
++        self.assertTrue(np.allclose(results, r_results, atol=1e-4))
+ 
+ 
+     def test_posthoc_scheffe(self):
+-- 
+2.36.1
+
diff --git a/nixpkgs/pkgs/development/python-modules/scikit-posthocs/0002-Update-test_posthocs.py.patch b/nixpkgs/pkgs/development/python-modules/scikit-posthocs/0002-Update-test_posthocs.py.patch
new file mode 100644
index 000000000000..fa4d6d3ececf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-posthocs/0002-Update-test_posthocs.py.patch
@@ -0,0 +1,34 @@
+From 5416ffba3ab01aebab3909400b5a9e847022898e Mon Sep 17 00:00:00 2001
+From: Maksim Terpilovskii <maximtrp@gmail.com>
+Date: Thu, 16 Mar 2023 00:20:02 +0300
+Subject: [PATCH] Update test_posthocs.py
+
+---
+ tests/test_posthocs.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/tests/test_posthocs.py b/tests/test_posthocs.py
+index 8cc65e4..42ca5f3 100644
+--- a/tests/test_posthocs.py
++++ b/tests/test_posthocs.py
+@@ -71,7 +71,7 @@ class TestPosthocs(unittest.TestCase):
+         a = splt.sign_plot(x, flat=True, labels=False)
+         with self.assertRaises(ValueError):
+             splt.sign_plot(x.astype(float), flat=True, labels=False)
+-        self.assertTrue(isinstance(a, ma._subplots.Axes))
++        self.assertTrue(isinstance(a, ma._axes.Axes))
+ 
+     def test_sign_plot_nonflat(self):
+ 
+@@ -85,7 +85,7 @@ class TestPosthocs(unittest.TestCase):
+         with self.assertRaises(ValueError):
+             splt.sign_plot(x.astype(np.int64), labels=False)
+ 
+-        self.assertTrue(isinstance(a, ma._subplots.Axes) and isinstance(cbar, mpl.colorbar.ColorbarBase))
++        self.assertTrue(isinstance(a, ma._axes.Axes) and isinstance(cbar, mpl.colorbar.ColorbarBase))
+ 
+     # Outliers tests
+     def test_outliers_iqr(self):
+-- 
+2.36.1
+
diff --git a/nixpkgs/pkgs/development/python-modules/scikit-posthocs/default.nix b/nixpkgs/pkgs/development/python-modules/scikit-posthocs/default.nix
new file mode 100644
index 000000000000..d7df6518903e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-posthocs/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, wheel
+, matplotlib
+, numpy
+, pandas
+, scipy
+, seaborn
+, statsmodels
+, pytestCheckHook
+, seaborn-data
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-posthocs";
+  version = "0.7.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "maximtrp";
+    repo = "scikit-posthocs";
+    rev = "v${version}";
+    hash = "sha256-IkvAc684AWEK427OGAa4qVy6leWmd3b8Dnhd5bYAt5I=";
+  };
+
+  patches = [
+    # Fixed on master: https://github.com/maximtrp/scikit-posthocs/commit/02266a00ce0eb6a089e7efe07816da1aa5152fc9
+    ./0001-increased-abs-tolerance-for-wilcoxon-test.patch
+    # Fixed on master: https://github.com/maximtrp/scikit-posthocs/commit/5416ffba3ab01aebab3909400b5a9e847022898e
+    ./0002-Update-test_posthocs.py.patch
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    matplotlib
+    numpy
+    pandas
+    scipy
+    seaborn
+    statsmodels
+  ];
+
+  preCheck = ''
+    # tests require to write to home directory
+    export SEABORN_DATA=${seaborn-data.exercise}
+  '';
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+  pythonImportsCheck = [ "scikit_posthocs" ];
+
+  meta = with lib; {
+    description = "Multiple Pairwise Comparisons (Post Hoc) Tests in Python";
+    homepage = "https://github.com/maximtrp/scikit-posthocs";
+    changelog = "https://github.com/maximtrp/scikit-posthocs/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scikit-rf/default.nix b/nixpkgs/pkgs/development/python-modules/scikit-rf/default.nix
new file mode 100644
index 000000000000..a2cf6d82a35b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-rf/default.nix
@@ -0,0 +1,121 @@
+{ stdenv
+, lib
+, pythonOlder
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, scipy
+, pandas
+, matplotlib
+, tox
+, coverage
+, flake8
+, nbval
+, pyvisa
+, networkx
+, ipython
+, ipykernel
+, ipywidgets
+, jupyter-client
+, sphinx-rtd-theme
+, sphinx
+, nbsphinx
+, openpyxl
+, qtpy
+, pyqtgraph
+, pyqt5
+, setuptools
+, pytestCheckHook
+, pytest-cov
+, pytest-mock
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-rf";
+  version = "0.29.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "scikit-rf";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-sLE6rcBGUKmk5y7oO06rHON3GVIjcvnKlr6Tgddj64Y=";
+  };
+
+  buildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    pandas
+  ];
+
+  passthru.optional-dependencies = {
+    plot = [
+      matplotlib
+    ];
+    xlsx = [
+      openpyxl
+    ];
+    netw = [
+      networkx
+    ];
+    visa = [
+      pyvisa
+    ];
+    docs = [
+      ipython
+      ipykernel
+      ipywidgets
+      jupyter-client
+      sphinx-rtd-theme
+      sphinx
+      nbsphinx
+      openpyxl
+    ];
+    qtapps = [
+      qtpy
+      pyqtgraph
+      pyqt5
+    ];
+  };
+
+  nativeCheckInputs = [
+    tox
+    coverage
+    flake8
+    pytest-cov
+    pytest-mock
+    nbval
+    matplotlib
+    pyvisa
+    openpyxl
+    networkx
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  # test_calibration.py generates a divide by zero error on darwin
+  # https://github.com/scikit-rf/scikit-rf/issues/972
+  disabledTestPaths =
+    lib.optional (stdenv.isAarch64 && stdenv.isDarwin)
+    "skrf/calibration/tests/test_calibration.py";
+
+  pythonImportsCheck = [
+    "skrf"
+  ];
+
+  meta = with lib; {
+    description = "A Python library for RF/Microwave engineering";
+    homepage = "https://scikit-rf.org/";
+    changelog = "https://github.com/scikit-rf/scikit-rf/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ lugarun ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scikit-survival/default.nix b/nixpkgs/pkgs/development/python-modules/scikit-survival/default.nix
new file mode 100644
index 000000000000..9a766cedece3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-survival/default.nix
@@ -0,0 +1,83 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, cython
+, ecos
+, joblib
+, numexpr
+, numpy
+, osqp
+, pandas
+, setuptools-scm
+, scikit-learn
+, scipy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-survival";
+  version = "0.22.1";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Ft0Hg5iF9Sb9VSOsFMgfAvc4Nsam216kzt5Xv2iykv8=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    ecos
+    joblib
+    numexpr
+    numpy
+    osqp
+    pandas
+    scikit-learn
+    scipy
+  ];
+
+  pythonImportsCheck = [ "sksurv" ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  # treat numpy versions as lower bounds, same as setuptools build
+  postPatch = ''
+    sed -i 's/numpy==/numpy>=/' pyproject.toml
+  '';
+
+  # Hack needed to make pytest + cython work
+  # https://github.com/NixOS/nixpkgs/pull/82410#issuecomment-827186298
+  preCheck = ''
+    export HOME=$(mktemp -d)
+    cp -r $TMP/$sourceRoot/tests $HOME
+    pushd $HOME
+  '';
+  postCheck = "popd";
+
+  # very long tests, unnecessary for a leaf package
+  disabledTests = [
+    "test_coxph"
+    "test_datasets"
+    "test_ensemble_selection"
+    "test_minlip"
+    "test_pandas_inputs"
+    "test_survival_svm"
+    "test_tree"
+  ] ++ lib.optional (stdenv.isDarwin && stdenv.isAarch64)
+    # floating point mismatch on aarch64
+    # 27079905.88052468 to far from 27079905.880496684
+    "test_coxnet"
+  ;
+
+  meta = with lib; {
+    description = "Survival analysis built on top of scikit-learn";
+    homepage = "https://github.com/sebp/scikit-survival";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ GuillaumeDesforges ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scikit-tda/default.nix b/nixpkgs/pkgs/development/python-modules/scikit-tda/default.nix
new file mode 100644
index 000000000000..e2b6fae9aa01
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikit-tda/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, scipy
+, scikit-learn
+, matplotlib
+, numba
+, umap-learn
+, cython
+, ripser
+, persim
+, pillow
+, kmapper
+, tadasets
+, pytest
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "scikit-tda";
+  version = "1.0.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "scikit-tda";
+    repo = "scikit-tda";
+    rev = "v${version}";
+    sha256 = "0yhmf5jmxywyj6l9q0rfv9r8wpdk063fvvfnb4azwwccblgz37rj";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    scikit-learn
+    matplotlib
+    numba
+    umap-learn
+    cython
+    ripser
+    persim
+    pillow
+    kmapper
+    tadasets
+  ];
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest test
+  '';
+
+  # tests will be included in next release
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Topological Data Analysis for humans";
+    homepage = "https://github.com/scikit-tda/scikit-tda";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scikits-odes/default.nix b/nixpkgs/pkgs/development/python-modules/scikits-odes/default.nix
new file mode 100644
index 000000000000..4d56ab6fa944
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikits-odes/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cython
+, enum34
+, gfortran
+, isPy27
+, isPy3k
+, numpy
+, pytest
+, python
+, scipy
+, sundials
+}:
+
+buildPythonPackage rec {
+  pname = "scikits.odes";
+  version = "2.7.0";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-px4Z4UhYk3VK6MBQZoIy/MaU8XuDYC51++v3v5+XXh4=";
+  };
+
+  nativeBuildInputs = [
+    gfortran
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    sundials
+    scipy
+  ] ++ lib.optionals (!isPy3k) [ enum34 ];
+
+  doCheck = true;
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    cd $out/${python.sitePackages}/scikits/odes/tests
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "A scikit offering extra ode/dae solvers, as an extension to what is available in scipy";
+    homepage = "https://github.com/bmcage/odes";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ idontgetoutmuch ];
+    platforms = [ "aarch64-linux" "x86_64-linux" "x86_64-darwin" ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scikits-samplerate/default.nix b/nixpkgs/pkgs/development/python-modules/scikits-samplerate/default.nix
new file mode 100644
index 000000000000..5a437c07f46b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scikits-samplerate/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, numpy
+, libsamplerate
+, fetchFromGitHub
+}:
+
+buildPythonPackage {
+  pname = "scikits-samplerate";
+  version = "0.3.3";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "cournape";
+    repo = "samplerate";
+    rev = "a536c97eb2d6195b5f266ea3cc3a35364c4c2210";
+    hash = "sha256-7x03Q6VXfP9p8HCk15IDZ9HeqTyi5F1AlGX/otdh8VU=";
+  };
+
+  buildInputs =  [
+    libsamplerate
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  preConfigure = ''
+     cat > site.cfg << END
+     [samplerate]
+     library_dirs=${libsamplerate.out}/lib
+     include_dirs=${lib.getDev libsamplerate}/include
+     END
+  '';
+
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/cournape/samplerate";
+    description = "High quality sampling rate convertion from audio data in numpy arrays";
+    license = licenses.gpl2;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scim2-filter-parser/default.nix b/nixpkgs/pkgs/development/python-modules/scim2-filter-parser/default.nix
new file mode 100644
index 000000000000..f3d37df7735c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scim2-filter-parser/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, django
+, sly
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "scim2-filter-parser";
+  version = "0.5.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "15five";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-QEPTYpWlRPWO6Evyt4zoqUST4ousF67GmiOpD7WUqcI=";
+  };
+
+  patches = [
+    # https://github.com/15five/scim2-filter-parser/pull/43
+    (fetchpatch {
+      name = "replace-poetry-with-poetry-core.patch";
+      url = "https://github.com/15five/scim2-filter-parser/commit/675d85f3a3ff338e96a408827d64d9e893fa5255.patch";
+      hash = "sha256-PjJH1S5CDe/BMI0+mB34KdpNNcHfexBFYBmHolsWH4o=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "poetry.masonry.api" "poetry.core.masonry.api"
+  '';
+
+  propagatedBuildInputs = [
+    sly
+  ];
+
+  passthru.optional-dependencies = {
+    django-query = [
+      django
+    ];
+  };
+
+  pythonImportsCheck = [
+    "scim2_filter_parser"
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.django-query;
+
+  meta = with lib; {
+    description = "A customizable parser/transpiler for SCIM2.0 filters";
+    homepage = "https://github.com/15five/scim2-filter-parser";
+    changelog = "https://github.com/15five/scim2-filter-parser/blob/${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ s1341 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scipy/default.nix b/nixpkgs/pkgs/development/python-modules/scipy/default.nix
new file mode 100644
index 000000000000..2c5ecd42585c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scipy/default.nix
@@ -0,0 +1,223 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchpatch
+, fetchurl
+, writeText
+, python
+, pythonOlder
+, buildPythonPackage
+, cython
+, gfortran
+, meson-python
+, pkg-config
+, pythran
+, wheel
+, nose
+, pytestCheckHook
+, pytest-xdist
+, numpy
+, pybind11
+, pooch
+, libxcrypt
+, xsimd
+, blas
+, lapack
+}:
+
+let
+  pname = "scipy";
+  # DON'T UPDATE THESE ATTRIBUTES MANUALLY - USE:
+  #
+  #     nix-shell maintainers/scripts/update.nix --argstr package python3.pkgs.scipy
+  #
+  # The update script uses sed regexes to replace them with the updated hashes.
+  version = "1.11.3";
+  srcHash = "sha256-swxRfFjTcKjKQv6GFdWNR6IKhdJQYhZSR7UWLtcnrXw=";
+  datasetsHashes = {
+    ascent = "1qjp35ncrniq9rhzb14icwwykqg2208hcssznn3hz27w39615kh3";
+    ecg = "1bwbjp43b7znnwha5hv6wiz3g0bhwrpqpi75s12zidxrbwvd62pj";
+    face = "11i8x29h80y7hhyqhil1fg8mxag5f827g33lhnsf44qk116hp2wx";
+  };
+  datasets = lib.mapAttrs (
+    d: hash: fetchurl {
+      url = "https://raw.githubusercontent.com/scipy/dataset-${d}/main/${d}.dat";
+      sha256 = hash;
+    }
+  ) datasetsHashes;
+  # Additional cross compilation related properties that scipy reads in scipy/meson.build
+  crossFileScipy = writeText "cross-file-scipy.conf" ''
+    [properties]
+    numpy-include-dir = '${numpy}/${python.sitePackages}/numpy/core/include'
+    pythran-include-dir = '${pythran}/${python.sitePackages}/pythran'
+    host-python-path = '${python.interpreter}'
+    host-python-version = '${python.pythonVersion}'
+  '';
+in buildPythonPackage {
+  inherit pname version;
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "scipy";
+    repo = pname;
+    rev = "v${version}";
+    hash = srcHash;
+    fetchSubmodules = true;
+  };
+
+  patches = [
+    # Helps with cross compilation, see https://github.com/scipy/scipy/pull/18167
+    (fetchpatch {
+      url = "https://github.com/scipy/scipy/commit/dd50ac9d98dbb70625333a23e3a90e493228e3be.patch";
+      hash = "sha256-Vf6/hhwu6X5s8KWhq8bUZKtSkdVu/GtEpGtj8Olxe7s=";
+      excludes = [
+        "doc/source/dev/contributor/meson_advanced.rst"
+      ];
+    })
+  ];
+
+  # Relax deps a bit
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'meson-python>=0.12.1,<0.14.0' 'meson-python' \
+      --replace 'numpy==' 'numpy>=' \
+      --replace "pybind11>=2.10.4,<2.11.1" "pybind11>=2.10.4,<2.12.0" \
+      --replace 'wheel<0.41.0' 'wheel'
+  '';
+
+  nativeBuildInputs = [
+    cython
+    gfortran
+    meson-python
+    pythran
+    pkg-config
+    wheel
+  ];
+
+  buildInputs = [
+    blas
+    lapack
+    pybind11
+    pooch
+    xsimd
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    libxcrypt
+  ];
+
+  propagatedBuildInputs = [ numpy ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    nose
+    pytestCheckHook
+    pytest-xdist
+  ];
+
+  # The following tests are broken on aarch64-darwin with newer compilers and library versions.
+  # See https://github.com/scipy/scipy/issues/18308
+  disabledTests = lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
+    "test_a_b_neg_int_after_euler_hypergeometric_transformation"
+    "test_dst4_definition_ortho"
+    "test_load_mat4_le"
+    "hyp2f1_test_case47"
+    "hyp2f1_test_case3"
+    "test_uint64_max"
+  ];
+
+  doCheck = !(stdenv.isx86_64 && stdenv.isDarwin);
+
+  preConfigure = ''
+    # Helps parallelization a bit
+    export NPY_NUM_BUILD_JOBS=$NIX_BUILD_CORES
+    # We download manually the datasets and this variable tells the pooch
+    # library where these files are cached. See also:
+    # https://github.com/scipy/scipy/pull/18518#issuecomment-1562350648 And at:
+    # https://github.com/scipy/scipy/pull/17965#issuecomment-1560759962
+    export XDG_CACHE_HOME=$PWD; export HOME=$(mktemp -d); mkdir scipy-data
+  '' + (lib.concatStringsSep "\n" (lib.mapAttrsToList (d: dpath:
+    # Actually copy the datasets
+    "cp ${dpath} scipy-data/${d}.dat"
+  ) datasets));
+
+  mesonFlags = [
+    "-Dblas=${blas.pname}"
+    "-Dlapack=${lapack.pname}"
+    # We always run what's necessary for cross compilation, which is passing to
+    # meson the proper cross compilation related arguments. See also:
+    # https://docs.scipy.org/doc/scipy/building/cross_compilation.html
+    "--cross-file=${crossFileScipy}"
+  ];
+
+  # disable stackprotector on aarch64-darwin for now
+  #
+  # build error:
+  #
+  # /private/tmp/nix-build-python3.9-scipy-1.6.3.drv-0/ccDEsw5U.s:109:15: error: index must be an integer in range [-256, 255].
+  #
+  #         ldr     x0, [x0, ___stack_chk_guard];momd
+  #
+  hardeningDisable = lib.optionals (stdenv.isAarch64 && stdenv.isDarwin) [ "stackprotector" ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    # Adapted from pytestCheckHook because scipy uses a custom check phase.
+    # It needs to pass `$args` as a Python list to `scipy.test` rather than as
+    # arguments to pytest on the command-line.
+    args=""
+    if [ -n "$disabledTests" ]; then
+      disabledTestsString=$(_pytestComputeDisabledTestsString "''${disabledTests[@]}")
+      args+="'-k','$disabledTestsString'"
+    fi
+
+    if [ -n "''${disabledTestPaths-}" ]; then
+        eval "disabledTestPaths=($disabledTestPaths)"
+    fi
+
+    for path in ''${disabledTestPaths[@]}; do
+      if [ ! -e "$path" ]; then
+        echo "Disabled tests path \"$path\" does not exist. Aborting"
+        exit 1
+      fi
+      args+="''${args:+,}'--ignore=\"$path\"'"
+    done
+    args+="''${args:+,}$(printf \'%s\', "''${pytestFlagsArray[@]}")"
+    args=''${args%,}
+
+    pushd "$out"
+    export OMP_NUM_THREADS=$(( $NIX_BUILD_CORES / 4 ))
+    ${python.interpreter} -c "import scipy, sys; sys.exit(scipy.test(
+        'fast',
+        verbose=10,
+        extra_argv=[$args],
+        parallel=$NIX_BUILD_CORES
+    ) != True)"
+    popd
+    runHook postCheck
+  '';
+
+  requiredSystemFeatures = [ "big-parallel" ]; # the tests need lots of CPU time
+
+  passthru = {
+    inherit blas;
+    updateScript = [
+      ./update.sh
+      # Pass it this file name as argument
+      (builtins.unsafeGetAttrPos "pname" python.pkgs.scipy).file
+    ]
+    # Pass it the names of the datasets to update their hashes
+    ++ (builtins.attrNames datasetsHashes)
+    ;
+  };
+
+  SCIPY_USE_G77_ABI_WRAPPER = 1;
+
+  meta = with lib; {
+    description = "SciPy (pronounced 'Sigh Pie') is open-source software for mathematics, science, and engineering";
+    downloadPage = "https://github.com/scipy/scipy";
+    homepage = "https://www.scipy.org/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fridh doronbehar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scipy/update.sh b/nixpkgs/pkgs/development/python-modules/scipy/update.sh
new file mode 100755
index 000000000000..c6b3dca49186
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scipy/update.sh
@@ -0,0 +1,31 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i bash -p jq nix-prefetch-github
+
+set -euo pipefail
+echoerr() { echo "$@" 1>&2; }
+
+fname="$1"
+echoerr got fname $fname
+shift
+datasets="$@"
+echoerr datasets are: "$@"
+latest_release=$(curl --silent https://api.github.com/repos/scipy/scipy/releases/latest)
+version=$(jq -r '.tag_name' <<<"$latest_release" | cut -c2-)
+# Update version, if needed
+if grep -q 'version = "'$version $fname; then
+    echo "Current version $version is the latest available, will update only datasets' hashes (don't take long)"
+else
+    echoerr got version $version
+    sed -i -E 's/(version = ").*(";)/\1'$version'\2/g' $fname
+    # Verify the sed command above did not fail
+    grep -q $version $fname
+    # Update srcHash
+    srcHash="$(nix-prefetch-github scipy scipy --rev v${version} --fetch-submodules | jq --raw-output .hash)"
+    sed -i -E 's#(srcHash = ").*(";)#\1'$srcHash'\2#g' $fname
+fi
+
+for d in $datasets; do
+    datasetHash=$(nix-prefetch-url "https://raw.githubusercontent.com/scipy/dataset-${d}/main/${d}.dat")
+    sed -i 's/'$d' = "[0-9a-z]\+/'$d' = "'$datasetHash'/g' $fname
+    echoerr updated hash for dataset "'$d'"
+done
diff --git a/nixpkgs/pkgs/development/python-modules/scmrepo/default.nix b/nixpkgs/pkgs/development/python-modules/scmrepo/default.nix
new file mode 100644
index 000000000000..36e69d778db8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scmrepo/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, asyncssh
+, buildPythonPackage
+, dulwich
+, fetchFromGitHub
+, fsspec
+, funcy
+, gitpython
+, pathspec
+, pygit2
+, pygtrie
+, pythonOlder
+, setuptools
+, setuptools-scm
+, shortuuid
+}:
+
+buildPythonPackage rec {
+  pname = "scmrepo";
+  version = "1.5.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "iterative";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-eEK2U1gTw3PP7kt2lNjiEs8yZX9Cmty0LIgZqg7FsJc=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    asyncssh
+    dulwich
+    fsspec
+    funcy
+    gitpython
+    pathspec
+    pygit2
+    pygtrie
+    shortuuid
+  ];
+
+  # Requires a running Docker instance
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "scmrepo"
+  ];
+
+  meta = with lib; {
+    description = "SCM wrapper and fsspec filesystem";
+    homepage = "https://github.com/iterative/scmrepo";
+    changelog = "https://github.com/iterative/scmrepo/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scooby/default.nix b/nixpkgs/pkgs/development/python-modules/scooby/default.nix
new file mode 100644
index 000000000000..f1f6716c917f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scooby/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, pytest-console-scripts
+, pytestCheckHook
+, pythonOlder
+, pyvips
+, scipy
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "scooby";
+  version = "0.9.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "banesullivan";
+    repo = "scooby";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-x6GPRo0OuXJtN41urviY0joZKzq0SQjUdRBpIylgcXY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    beautifulsoup4
+    numpy
+    pytest-console-scripts
+    pytestCheckHook
+    pyvips
+    scipy
+  ];
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  preCheck = ''
+    export PATH="$PATH:$out/bin";
+  '';
+
+  pythonImportsCheck = [
+    "scooby"
+  ];
+
+  disabledTests = [
+    # Tests have additions requirements (e.g., time and module)
+    "test_get_version"
+    "test_tracking"
+    "test_import_os_error"
+    "test_import_time"
+    # TypeError: expected str, bytes or os.PathLike object, not list
+    "test_cli"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/banesullivan/scooby/releases/tag/v${version}";
+    description = "A lightweight tool for reporting Python package versions and hardware resources";
+    homepage = "https://github.com/banesullivan/scooby";
+    license = licenses.mit;
+    maintainers = with maintainers; [ wegank ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scour/default.nix b/nixpkgs/pkgs/development/python-modules/scour/default.nix
new file mode 100644
index 000000000000..b38d095a845f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scour/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, six }:
+
+buildPythonPackage rec {
+  pname = "scour";
+  version = "0.38.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6881ec26660c130c5ecd996ac6f6b03939dd574198f50773f2508b81a68e0daf";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  # No tests included in archive
+  doCheck = false;
+
+  meta = with lib; {
+    description = "An SVG Optimizer / Cleaner ";
+    homepage    = "https://github.com/scour-project/scour";
+    license     = licenses.asl20;
+    maintainers = with maintainers; [ worldofpeace ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scp/default.nix b/nixpkgs/pkgs/development/python-modules/scp/default.nix
new file mode 100644
index 000000000000..d85d8f1dac75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scp/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, paramiko
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "scp";
+  version = "0.14.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ZPABWJmz0hLLgIjn1A668Ghoif8OJD1cEkLv6LUPBT4=";
+  };
+
+  propagatedBuildInputs = [
+    paramiko
+  ];
+
+  checkPhase = ''
+    SCPPY_PORT=10022 ${python.interpreter} test.py
+  '';
+
+  #The Pypi package doesn't include the test
+  doCheck = false;
+
+  pythonImportsCheck = [ "scp" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jbardin/scp.py";
+    description = "SCP module for paramiko";
+    license = licenses.lgpl21Only;
+    maintainers = with maintainers; [ xnaveira ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scramp/default.nix b/nixpkgs/pkgs/development/python-modules/scramp/default.nix
new file mode 100644
index 000000000000..aa6013589cd3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scramp/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, asn1crypto
+, buildPythonPackage
+, fetchFromGitHub
+, importlib-metadata
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "scramp";
+  version = "1.4.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tlocke";
+    repo = "scramp";
+    rev = version;
+    hash = "sha256-WOyv1fLSXG7p+WKs2QSwlsh8FSK/lxp6I1hPY0VIkKo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    asn1crypto
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # Upstream uses versioningit to set the version
+    sed -i "/versioningit >=/d" pyproject.toml
+    sed -i '/^name =.*/a version = "${version}"' pyproject.toml
+    sed -i "/dynamic =/d" pyproject.toml
+  '';
+
+  pythonImportsCheck = [
+    "scramp"
+  ];
+
+  disabledTests = [
+    "test_readme"
+  ];
+
+  meta = with lib; {
+    description = "Implementation of the SCRAM authentication protocol";
+    homepage = "https://github.com/tlocke/scramp";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scrap-engine/default.nix b/nixpkgs/pkgs/development/python-modules/scrap-engine/default.nix
new file mode 100644
index 000000000000..2726f3675fc3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scrap-engine/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "scrap_engine";
+  version = "1.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5OlnBRFhjFAcVkuuKM5hpeRxi+uvjpzfdhp1+5Nx1IU=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  meta = with lib; {
+    maintainers = with maintainers; [ fgaz ];
+    description = "A 2D ascii game engine for the terminal";
+    homepage = "https://github.com/lxgr-linux/scrap_engine";
+    license = licenses.gpl3Only;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scrapy-deltafetch/default.nix b/nixpkgs/pkgs/development/python-modules/scrapy-deltafetch/default.nix
new file mode 100644
index 000000000000..95091a0be765
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scrapy-deltafetch/default.nix
@@ -0,0 +1,24 @@
+{ lib, fetchPypi, buildPythonPackage, scrapy, bsddb3 }:
+
+buildPythonPackage rec {
+  pname = "scrapy-deltafetch";
+  version = "2.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "13f7968bd0ffae133e2a1dede215e683b8c95285f046260603a5c3e25f2d57b0";
+  };
+
+  propagatedBuildInputs = [ bsddb3 scrapy ];
+
+  # no tests
+  doCheck = false;
+  pythonImportsCheck = [ "scrapy_deltafetch" ];
+
+  meta = with lib; {
+    description = "Scrapy spider middleware to ignore requests to pages containing items seen in previous crawls";
+    homepage = "https://github.com/scrapy-plugins/scrapy-deltafetch";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ evanjs ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scrapy-fake-useragent/default.nix b/nixpkgs/pkgs/development/python-modules/scrapy-fake-useragent/default.nix
new file mode 100644
index 000000000000..f4474235cd23
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scrapy-fake-useragent/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fake-useragent
+, faker
+, fetchFromGitHub
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, scrapy
+}:
+
+buildPythonPackage rec {
+  pname = "scrapy-fake-useragent";
+  version = "1.4.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  # PyPi tarball is corrupted
+  src = fetchFromGitHub {
+    owner = "alecxe";
+    repo = pname;
+    rev = "59c20d38c58c76618164760d546aa5b989a79b8b"; # no tags
+    hash = "sha256-khQMOQrrdHokvNqfaMWqXV7AzwGxTuxaLsZoLkNpZ3k=";
+  };
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace " --cov=scrapy_fake_useragent --cov-report=term --cov-report=html --fulltrace" ""
+  '';
+
+  propagatedBuildInputs = [
+    fake-useragent
+    faker
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+    scrapy
+  ];
+
+  pythonImportsCheck = [
+    "scrapy_fake_useragent"
+  ];
+
+  disabledTests = [
+    # AttributeError: 'RetryUserAgentMiddleware' object has no attribute 'EXCEPTIONS_TO_RETRY'
+    "test_random_ua_set_on_exception"
+  ];
+
+  meta = with lib; {
+    description = "Random User-Agent middleware based on fake-useragent";
+    homepage = "https://github.com/alecxe/scrapy-fake-useragent";
+    changelog = "https://github.com/alecxe/scrapy-fake-useragent/blob/master/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scrapy-splash/default.nix b/nixpkgs/pkgs/development/python-modules/scrapy-splash/default.nix
new file mode 100644
index 000000000000..5559586d04ce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scrapy-splash/default.nix
@@ -0,0 +1,24 @@
+{ lib, fetchPypi, buildPythonPackage, scrapy, six }:
+
+buildPythonPackage rec {
+  pname = "scrapy-splash";
+  version = "0.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7PEwJk3AjgxGHIYH7K13dGimStAd7bJinA+BvV/NcpU=";
+  };
+
+  propagatedBuildInputs = [ scrapy six ];
+
+  # no tests
+  doCheck = false;
+  pythonImportsCheck = [ "scrapy_splash" ];
+
+  meta = with lib; {
+    description = "Scrapy+Splash for JavaScript integration";
+    homepage = "https://github.com/scrapy-plugins/scrapy-splash";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ evanjs ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scrapy/default.nix b/nixpkgs/pkgs/development/python-modules/scrapy/default.nix
new file mode 100644
index 000000000000..88ecd6f2be8a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scrapy/default.nix
@@ -0,0 +1,166 @@
+{ lib
+, stdenv
+, botocore
+, buildPythonPackage
+, cryptography
+, cssselect
+, fetchPypi
+, fetchpatch
+, glibcLocales
+, installShellFiles
+, itemadapter
+, itemloaders
+, jmespath
+, lxml
+, packaging
+, parsel
+, pexpect
+, protego
+, pydispatcher
+, pyopenssl
+, pytestCheckHook
+, pythonOlder
+, queuelib
+, service-identity
+, sybil
+, testfixtures
+, tldextract
+, twisted
+, w3lib
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "scrapy";
+  version = "2.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "Scrapy";
+    hash = "sha256-PL3tzgw/DgSC1hvi10WGg758188UsO5q37rduA9bNqU=";
+  };
+
+  patches = [
+    # Fix compatiblity with Twisted>=23.8. Remove with the next release.
+    (fetchpatch {
+      url = "https://github.com/scrapy/scrapy/commit/aa95ada42cdf570f840f55c463375f8a81b303f8.patch";
+      hash = "sha256-LuhA5BqtjSUgkotplvUCtvGNYOTrl0MJRCXiSBMDFzY=";
+      excludes = [
+        "tests/CrawlerProcess/sleeping.py"
+        "tests/test_crawler.py"
+      ];
+    })
+  ];
+
+  nativeBuildInputs = [
+    installShellFiles
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    cssselect
+    itemadapter
+    itemloaders
+    lxml
+    packaging
+    parsel
+    protego
+    pydispatcher
+    pyopenssl
+    queuelib
+    service-identity
+    tldextract
+    twisted
+    w3lib
+    zope_interface
+  ];
+
+  nativeCheckInputs = [
+    botocore
+    glibcLocales
+    jmespath
+    pexpect
+    pytestCheckHook
+    sybil
+    testfixtures
+  ];
+
+  LC_ALL = "en_US.UTF-8";
+
+  disabledTestPaths = [
+    "tests/test_proxy_connect.py"
+    "tests/test_utils_display.py"
+    "tests/test_command_check.py"
+    # Don't test the documentation
+    "docs"
+  ];
+
+  disabledTests = [
+    # It's unclear if the failures are related to libxml2, https://github.com/NixOS/nixpkgs/pull/123890
+    "test_nested_css"
+    "test_nested_xpath"
+    "test_flavor_detection"
+    "test_follow_whitespace"
+    # Requires network access
+    "AnonymousFTPTestCase"
+    "FTPFeedStorageTest"
+    "FeedExportTest"
+    "test_custom_asyncio_loop_enabled_true"
+    "test_custom_loop_asyncio"
+    "test_custom_loop_asyncio_deferred_signal"
+    "FileFeedStoragePreFeedOptionsTest"  # https://github.com/scrapy/scrapy/issues/5157
+    "test_persist"
+    "test_timeout_download_from_spider_nodata_rcvd"
+    "test_timeout_download_from_spider_server_hangs"
+    "test_unbounded_response"
+    "CookiesMiddlewareTest"
+    # Depends on uvloop
+    "test_asyncio_enabled_reactor_different_loop"
+    "test_asyncio_enabled_reactor_same_loop"
+    # Fails with AssertionError
+    "test_peek_fifo"
+    "test_peek_one_element"
+    "test_peek_lifo"
+    "test_callback_kwargs"
+    # Test fails on Hydra
+    "test_start_requests_laziness"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_xmliter_encoding"
+    "test_download"
+    "test_reactor_default_twisted_reactor_select"
+    "URIParamsSettingTest"
+    "URIParamsFeedOptionTest"
+    # flaky on darwin-aarch64
+    "test_fixed_delay"
+    "test_start_requests_laziness"
+  ];
+
+  postInstall = ''
+    installManPage extras/scrapy.1
+    installShellCompletion --cmd scrapy \
+      --zsh extras/scrapy_zsh_completion \
+      --bash extras/scrapy_bash_completion
+  '';
+
+  pythonImportsCheck = [
+    "scrapy"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "High-level web crawling and web scraping framework";
+    longDescription = ''
+      Scrapy is a fast high-level web crawling and web scraping framework, used to crawl
+      websites and extract structured data from their pages. It can be used for a wide
+      range of purposes, from data mining to monitoring and automated testing.
+    '';
+    homepage = "https://scrapy.org/";
+    changelog = "https://github.com/scrapy/scrapy/raw/${version}/docs/news.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/screed/default.nix b/nixpkgs/pkgs/development/python-modules/screed/default.nix
new file mode 100644
index 000000000000..604d77c493d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/screed/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, setuptools-scm
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "screed";
+  version = "1.1.2";
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-c0/6eopkUoZJbYlbc2+R1rKYiVbi/UI1gSPZPshRm2o=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  pythonImportsCheck = [ "screed" ];
+  checkInputs = [ pytestCheckHook ];
+
+  # These tests use the screed CLI and make assumptions on how screed is
+  # installed that break with nix. Can be enabled when upstream is fixed.
+  disabledTests = [
+    "Test_convert_shell"
+    "Test_fa_shell_command"
+    "Test_fq_shell_command"
+  ];
+
+  meta = with lib; {
+    description = "A simple read-only sequence database, designed for short reads";
+    homepage = "https://pypi.org/project/screed/";
+    maintainers = with maintainers; [ luizirber ];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/screeninfo/default.nix b/nixpkgs/pkgs/development/python-modules/screeninfo/default.nix
new file mode 100644
index 000000000000..40479baca0d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/screeninfo/default.nix
@@ -0,0 +1,58 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, libX11
+, libXinerama
+, libXrandr
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "screeninfo";
+  version = "0.8.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rr-";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-TEy4wff0eRRkX98yK9054d33Tm6G6qWrd9Iv+ITcFmA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  postPatch = ''
+    substituteInPlace screeninfo/enumerators/xinerama.py \
+      --replace 'load_library("X11")' 'ctypes.cdll.LoadLibrary("${libX11}/lib/libX11.so")' \
+      --replace 'load_library("Xinerama")' 'ctypes.cdll.LoadLibrary("${libXinerama}/lib/libXinerama.so")'
+    substituteInPlace screeninfo/enumerators/xrandr.py \
+      --replace 'load_library("X11")' 'ctypes.cdll.LoadLibrary("${libX11}/lib/libX11.so")' \
+      --replace 'load_library("Xrandr")' 'ctypes.cdll.LoadLibrary("${libXrandr}/lib/libXrandr.so")'
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # We don't have a screen
+    "tests/test_screeninfo.py"
+  ];
+
+  pythonImportsCheck = [ "screeninfo" ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Fetch location and size of physical screens";
+    homepage = "https://github.com/rr-/screeninfo";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nickhu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/screenlogicpy/default.nix b/nixpkgs/pkgs/development/python-modules/screenlogicpy/default.nix
new file mode 100644
index 000000000000..73564d11e8f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/screenlogicpy/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "screenlogicpy";
+  version = "0.9.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "dieselrabbit";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-OdAhA+vzIrUnE8Xdv52x7ij0LJKyxawaSY4QORP1TUg=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_gateway_discovery"
+    "test_async_discovery"
+    "test_gateway"
+    "test_async"
+    "test_asyncio_gateway_discovery"
+  ];
+
+  pythonImportsCheck = [
+    "screenlogicpy"
+  ];
+
+  meta = with lib; {
+    description = "Python interface for Pentair Screenlogic devices";
+    homepage = "https://github.com/dieselrabbit/screenlogicpy";
+    changelog = "https://github.com/dieselrabbit/screenlogicpy/releases/tag/v${version}";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scripttest/default.nix b/nixpkgs/pkgs/development/python-modules/scripttest/default.nix
new file mode 100644
index 000000000000..c6102f145310
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scripttest/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "scripttest";
+  version = "1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "951cfc25219b0cd003493a565f2e621fd791beaae9f9a3bdd7024d8626419c38";
+  };
+
+  buildInputs = [ pytest ];
+
+  # Tests are not included. See https://github.com/pypa/scripttest/issues/11
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A library for testing interactive command-line applications";
+    homepage = "https://pypi.org/project/scripttest/";
+    maintainers = with maintainers; [ ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/scs/default.nix b/nixpkgs/pkgs/development/python-modules/scs/default.nix
new file mode 100644
index 000000000000..5e95bed4cbdb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/scs/default.nix
@@ -0,0 +1,84 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, meson-python
+, pkg-config
+, Accelerate
+, blas
+, lapack
+, numpy
+, scipy
+  # check inputs
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "scs";
+  version = "3.2.4";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "bodono";
+    repo = "scs-python";
+    rev = version;
+    hash = "sha256-UmMbnj7QZSvHWSUk1Qa0VP4i3iDCYHxoa+qBmEdFjRs=";
+    fetchSubmodules = true;
+  };
+
+  patches = [
+    # needed for building against netlib's reference blas implementation and
+    # the pkg-config patch. remove on next update
+    (fetchpatch {
+      name = "find-and-ld-lapack.patch";
+      url = "https://github.com/bodono/scs-python/commit/a0aea80e7d490770d6a47d2c79396f6c3341c1f9.patch";
+      hash = "sha256-yHF8f7SLoG7veZ6DEq1HVH6rT2KtFONwJtqSiKcxOdg=";
+    })
+    # add support for pkg-config. remove on next update
+    (fetchpatch {
+      name = "use-pkg-config.patch";
+      url = "https://github.com/bodono/scs-python/commit/dd17e2e5282ebe85f2df8a7c6b25cfdeb894970d.patch";
+      hash = "sha256-vSeSJeeu5Wx3RXPyB39YTo0RU8HtAojrUw85Q76/QzA=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    meson-python
+    pkg-config
+  ];
+
+  buildInputs = if stdenv.isDarwin then [
+    Accelerate
+  ] else [
+    blas
+    lapack
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [ "scs" ];
+  disabledTests = lib.lists.optional (stdenv.system == "x86_64-linux") [
+    # `test/test_scs_rand.py` hang on "x86_64-linux" (https://github.com/NixOS/nixpkgs/pull/244532#pullrequestreview-1598095858)
+    "test_feasible"
+    "test_infeasibl"
+    "test_unbounded"
+  ];
+
+  meta = with lib; {
+    description = "Python interface for SCS: Splitting Conic Solver";
+    longDescription = ''
+      Solves convex cone programs via operator splitting.
+      Can solve: linear programs (LPs), second-order cone programs (SOCPs), semidefinite programs (SDPs),
+      exponential cone programs (ECPs), and power cone programs (PCPs), or problems with any combination of those cones.
+    '';
+    homepage = "https://github.com/cvxgrp/scs"; # upstream C package
+    downloadPage = "https://github.com/bodono/scs-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ a-n-n-a-l-e-e drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sdds/default.nix b/nixpkgs/pkgs/development/python-modules/sdds/default.nix
new file mode 100644
index 000000000000..9ae9c01b39e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sdds/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sdds";
+  version = "0.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pylhc";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-8tnJAptTUsC0atxM9Dpn90drcprdWrs8fYoX8RDkLyQ=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sdds"
+  ];
+
+  meta = with lib; {
+    description = "Module to handle SDDS files";
+    homepage = "https://pylhc.github.io/sdds/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sdkmanager/default.nix b/nixpkgs/pkgs/development/python-modules/sdkmanager/default.nix
new file mode 100644
index 000000000000..0a2092c3d24c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sdkmanager/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitLab
+, pythonOlder
+, argcomplete
+, requests
+, gnupg
+}:
+
+buildPythonPackage rec {
+  pname = "sdkmanager";
+  version = "0.6.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitLab {
+    owner = "fdroid";
+    repo = pname;
+    rev = version;
+    hash = "sha256-EQ24OjQZr42C1PFtIXr4yFzYb/M4Tatqu8Zo+9dgtEE=";
+  };
+
+  propagatedBuildInputs = [
+    argcomplete
+    requests
+  ];
+
+  postInstall = ''
+    wrapProgram $out/bin/sdkmanager \
+      --suffix PATH : ${lib.makeBinPath [ gnupg ]}
+  '';
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "sdkmanager" ];
+
+  meta = with lib; {
+    homepage = "https://gitlab.com/fdroid/sdkmanager";
+    description = "A drop-in replacement for sdkmanager from the Android SDK written in Python";
+    license = licenses.agpl3Plus;
+    maintainers = with maintainers; [ linsui ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sdnotify/default.nix b/nixpkgs/pkgs/development/python-modules/sdnotify/default.nix
new file mode 100644
index 000000000000..a447283c63ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sdnotify/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "sdnotify";
+  version = "0.3.2";
+
+  src = fetchPypi {
+    sha256 = "1wdrdg2j16pmqhk0ify20s5pngijh7zc6hyxhh8w8v5k8v3pz5vk";
+    inherit pname version;
+  };
+
+  meta = with lib; {
+    description = "A pure Python implementation of systemd's service notification protocol";
+    homepage = "https://github.com/bb4242/sdnotify";
+    license = licenses.mit;
+    maintainers = with maintainers; [ pmiddend ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/seaborn/default.nix b/nixpkgs/pkgs/development/python-modules/seaborn/default.nix
new file mode 100644
index 000000000000..fef58d973ccf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/seaborn/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, matplotlib
+, pytest-xdist
+, pytestCheckHook
+, numpy
+, pandas
+, pythonOlder
+, scipy
+, statsmodels
+}:
+
+buildPythonPackage rec {
+  pname = "seaborn";
+  version = "0.13.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "mwaskom";
+    repo = "seaborn";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-RbtBNKTjUHdCFe1V7IvACgbSNIPhVFMYmtE34GKVIzs=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    matplotlib
+    numpy
+    pandas
+  ];
+
+  passthru.optional-dependencies = {
+    stats = [
+      scipy
+      statsmodels
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # requires internet connection
+    "test_load_dataset_string_error"
+  ] ++ lib.optionals (!stdenv.hostPlatform.isx86) [
+    # overly strict float tolerances
+    "TestDendrogram"
+  ];
+
+  # All platforms should use Agg. Let's set it explicitly to avoid probing GUI
+  # backends (leads to crashes on macOS).
+  env.MPLBACKEND="Agg";
+
+  pythonImportsCheck = [
+    "seaborn"
+  ];
+
+  meta = with lib; {
+    description = "Statistical data visualization";
+    homepage = "https://seaborn.pydata.org/";
+    changelog = "https://github.com/mwaskom/seaborn/blob/master/doc/whatsnew/${src.rev}.rst";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/seabreeze/default.nix b/nixpkgs/pkgs/development/python-modules/seabreeze/default.nix
new file mode 100644
index 000000000000..92923170c0de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/seabreeze/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, cython
+, git
+, pkgconfig
+, setuptools-scm
+, future
+, numpy
+, pyusb
+, mock
+, pytestCheckHook
+, zipp
+}:
+
+## Usage
+# In NixOS, add the package to services.udev.packages for non-root plugdev
+# users to get device access permission:
+#    services.udev.packages = [ pkgs.python3Packages.seabreeze ];
+
+buildPythonPackage rec {
+  pname = "seabreeze";
+  version = "1.3.0";
+
+  src = fetchFromGitHub {
+    owner = "ap--";
+    repo = "python-seabreeze";
+    rev = "v${version}";
+    sha256 = "1hm9aalpb9sdp8s7ckn75xvyiacp5678pv9maybm5nz0z2h29ibq";
+    leaveDotGit = true;
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner",' ""
+  '';
+
+  nativeBuildInputs = [
+    cython
+    git
+    pkgconfig
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    future
+    numpy
+    pyusb
+  ];
+
+  postInstall = ''
+    mkdir -p $out/etc/udev/rules.d
+    cp os_support/10-oceanoptics.rules $out/etc/udev/rules.d/10-oceanoptics.rules
+  '';
+
+  # few backends enabled, but still some tests
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+    zipp
+  ];
+
+  setupPyBuildFlags = [ "--without-cseabreeze" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ap--/python-seabreeze";
+    description = "A python library to access Ocean Optics spectrometers";
+    maintainers = [];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/seasonal/default.nix b/nixpkgs/pkgs/development/python-modules/seasonal/default.nix
new file mode 100644
index 000000000000..d38559ff2eed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/seasonal/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, numpy
+, scipy
+, pandas
+, matplotlib
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "seasonal";
+  version = "0.3.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "welch";
+    repo = "seasonal";
+    # There are no tags or releases, but this commit corresponds to the 0.3.1 version
+    # PyPI project contains only a wheel
+    rev = "2a2396014d46283d0c7aff34cde5dafb6c462c58";
+    hash = "sha256-8YedGylH70pI0OyefiS1PG1yc+sg+tchlgcuNvxcNqE=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'setup_requires=["pytest-runner"],' ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+  ];
+
+  passthru.optional-dependencies = {
+    csv = [
+      pandas
+    ];
+    plot = [
+      matplotlib
+    ];
+  };
+
+  pythonImportsCheck = [ "seasonal" "seasonal.trend" "seasonal.periodogram" ];
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  meta = with lib; {
+    description = "Robustly estimate trend and periodicity in a timeseries";
+    homepage = "https://github.com/welch/seasonal";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/seatconnect/default.nix b/nixpkgs/pkgs/development/python-modules/seatconnect/default.nix
new file mode 100644
index 000000000000..981b2d7da869
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/seatconnect/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, aiohttp
+, beautifulsoup4
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, lxml
+, pyjwt
+, pythonOlder
+, setuptools-scm
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "seatconnect";
+  version = "1.1.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "farfar";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-HITVrI0o94a61gy/TYSGFtLBYX4Rw/dK1o2/KsvHLTQ=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    beautifulsoup4
+    cryptography
+    lxml
+    pyjwt
+    xmltodict
+  ];
+
+  # Project only has a dummy test
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "seatconnect"
+  ];
+
+  meta = with lib; {
+    description = "Python module to communicate with Seat Connect";
+    homepage = "https://github.com/farfar/seatconnect";
+    changelog = "https://github.com/Farfar/seatconnect/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/seccomp/default.nix b/nixpkgs/pkgs/development/python-modules/seccomp/default.nix
new file mode 100644
index 000000000000..3257722b1782
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/seccomp/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage, lib
+, cython, libseccomp
+}:
+
+buildPythonPackage rec {
+  pname   = "libseccomp";
+  version = libseccomp.version;
+  src     = libseccomp.pythonsrc;
+
+  VERSION_RELEASE = version; # used by build system
+
+  nativeBuildInputs = [ cython ];
+  buildInputs = [ libseccomp ];
+
+  unpackCmd = "tar xf $curSrc";
+  doInstallCheck = true;
+
+  postPatch = ''
+    substituteInPlace ./setup.py \
+      --replace 'extra_objects=["../.libs/libseccomp.a"]' \
+                'libraries=["seccomp"]'
+  '';
+
+  meta = with lib; {
+    description = "Python bindings for libseccomp";
+    license     = with licenses; [ lgpl21 ];
+    maintainers = with maintainers; [ thoughtpolice ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/secp256k1/default.nix b/nixpkgs/pkgs/development/python-modules/secp256k1/default.nix
new file mode 100644
index 000000000000..17c2324598e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/secp256k1/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pkg-config
+, pytestCheckHook
+, cffi
+, secp256k1
+}:
+
+buildPythonPackage rec {
+  pname = "secp256k1";
+  version = "0.14.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "82c06712d69ef945220c8b53c1a0d424c2ff6a1f64aee609030df79ad8383397";
+  };
+
+  postPatch = ''
+    # don't do hacky tarball download + setuptools check
+    sed -i '38,54d' setup.py
+    substituteInPlace setup.py --replace ", 'pytest-runner==2.6.2'" ""
+  '';
+
+  nativeBuildInputs = [ pkg-config ];
+
+  propagatedBuildInputs = [ cffi secp256k1 ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  # Tests are not included in archive
+  doCheck = false;
+
+  preConfigure = ''
+    cp -r ${secp256k1.src} libsecp256k1
+    export INCLUDE_DIR=${secp256k1}/include
+    export LIB_DIR=${secp256k1}/lib
+  '';
+
+  meta = {
+    homepage = "https://github.com/ludbb/secp256k1-py";
+    description = "Python FFI bindings for secp256k1";
+    license = with lib.licenses; [ mit ];
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/secretstorage/default.nix b/nixpkgs/pkgs/development/python-modules/secretstorage/default.nix
new file mode 100644
index 000000000000..59584ee9170f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/secretstorage/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchPypi
+, jeepney
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "secretstorage";
+  version = "3.3.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "SecretStorage";
+    inherit version;
+    hash = "sha256-JANTPvNp7KbSuoFxhXbF4PVk1cyhtY9zqLI+fU7uvXc=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    jeepney
+  ];
+
+  # Needs a D-Bus session
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "secretstorage"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings to FreeDesktop.org Secret Service API";
+    homepage = "https://github.com/mitya57/secretstorage";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ teto ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sectools/default.nix b/nixpkgs/pkgs/development/python-modules/sectools/default.nix
new file mode 100644
index 000000000000..2fdc27283f08
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sectools/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ldap3
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sectools";
+  version = "1.3.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "p0dalirius";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-F9mmPSlfSSS7UDNuX9OPrqDsEpqq0bD3eROG8D9CC78=";
+  };
+
+  propagatedBuildInputs = [
+    ldap3
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sectools"
+  ];
+
+  meta = with lib; {
+    description = "library containing functions to write security tools";
+    homepage = "https://github.com/p0dalirius/sectools";
+    changelog = "https://github.com/p0dalirius/sectools/releases/tag/${version}";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/secure/default.nix b/nixpkgs/pkgs/development/python-modules/secure/default.nix
new file mode 100644
index 000000000000..890d022f1a99
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/secure/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchFromGitHub, isPy27
+, maya
+, requests
+}:
+
+buildPythonPackage rec {
+  version = "0.3.0";
+  pname = "secure";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "typeerror";
+    repo = "secure.py";
+    rev = version;
+    sha256 = "1ajz1nx0nnhsc80xbgbc42ib2h08qnccvsp5i583rd9b0f9pklwk";
+  };
+
+  propagatedBuildInputs = [ maya requests ];
+
+  # no tests in release
+  doCheck = false;
+
+  pythonImportsCheck = [ "secure" ];
+
+  meta = with lib; {
+    description = "Adds optional security headers and cookie attributes for Python web frameworks";
+    homepage = "https://github.com/TypeError/secure.py";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/securesystemslib/default.nix b/nixpkgs/pkgs/development/python-modules/securesystemslib/default.nix
new file mode 100644
index 000000000000..4a0ce694866b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/securesystemslib/default.nix
@@ -0,0 +1,96 @@
+{ lib
+, asn1crypto
+, azure-identity
+, azure-keyvault-keys
+, boto3
+, botocore
+, buildPythonPackage
+, cryptography
+, ed25519
+, fetchFromGitHub
+, google-cloud-kms
+, hatchling
+, pynacl
+, pyspx
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "securesystemslib";
+  version = "0.30.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "secure-systems-lab";
+    repo = "securesystemslib";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Jqw65VTMLA/X7VQGxN0BlTzF/lxBYirDKBf+xI9cfhg=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  passthru.optional-dependencies = {
+    PySPX = [
+      pyspx
+    ];
+    awskms = [
+      boto3
+      botocore
+      cryptography
+    ];
+    azurekms = [
+      azure-identity
+      azure-keyvault-keys
+      cryptography
+    ];
+    crypto = [
+      cryptography
+    ];
+    gcpkms = [
+      cryptography
+      google-cloud-kms
+    ];
+    hsm = [
+      asn1crypto
+      cryptography
+    #   pykcs11
+    ];
+    pynacl = [
+      pynacl
+    ];
+    # Circular dependency
+    # sigstore = [
+    #   sigstore
+    # ];
+  };
+
+  nativeCheckInputs = [
+    ed25519
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "securesystemslib"
+  ];
+
+  disabledTestPaths = [
+    # pykcs11 is not available
+    "tests/test_hsm_signer.py"
+    # Ignore vendorized tests
+    "securesystemslib/_vendor/"
+  ];
+
+  meta = with lib; {
+    description = "Cryptographic and general-purpose routines";
+    homepage = "https://github.com/secure-systems-lab/securesystemslib";
+    changelog = "https://github.com/secure-systems-lab/securesystemslib/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/securetar/default.nix b/nixpkgs/pkgs/development/python-modules/securetar/default.nix
new file mode 100644
index 000000000000..8b28d3ef815f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/securetar/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "securetar";
+  version = "2023.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "pvizeli";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-3bDboggvKbpWyjpUOrUmtJx3Nj/6Uvut2nEQLYJubDA=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "securetar"
+  ];
+
+  meta = with lib; {
+    description = "Module to handle tarfile backups";
+    homepage = "https://github.com/pvizeli/securetar";
+    changelog = "https://github.com/pvizeli/securetar/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/seedir/default.nix b/nixpkgs/pkgs/development/python-modules/seedir/default.nix
new file mode 100644
index 000000000000..46fca2c568f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/seedir/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, natsort
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "seedir";
+  version = "0.4.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "earnestt1234";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ioez5lBNyiBK3poL2Px3KtCQeM+Gh2d4iD3SoAIHFAk=";
+  };
+
+  propagatedBuildInputs = [
+    natsort
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "seedir"
+  ];
+
+  pytestFlagsArray = [
+    "tests/tests.py"
+  ];
+
+  meta = with lib; {
+    description = "Module for for creating, editing, and reading folder tree diagrams";
+    homepage = "https://github.com/earnestt1234/seedir";
+    changelog = "https://github.com/earnestt1234/seedir/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/seekpath/default.nix b/nixpkgs/pkgs/development/python-modules/seekpath/default.nix
new file mode 100644
index 000000000000..8788bf665363
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/seekpath/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pythonOlder, numpy, future, spglib, glibcLocales, pytest, scipy }:
+
+buildPythonPackage rec {
+  pname = "seekpath";
+  version = "2.0.1";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "giovannipizzi";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0x592650ynacmx5n5bilj5lja4iw0gf1nfypy82cmy5z363qhqxn";
+  };
+
+  LC_ALL = "en_US.utf-8";
+
+  # scipy isn't listed in install_requires, but used in package
+  propagatedBuildInputs = [ numpy spglib future scipy ];
+
+  nativeBuildInputs = [ glibcLocales ];
+
+  nativeCheckInputs = [ pytest ];
+
+  # I don't know enough about crystal structures to fix
+  checkPhase = ''
+    pytest . -k 'not oI2Y'
+  '';
+
+  meta = with lib; {
+    description = "A module to obtain and visualize band paths in the Brillouin zone of crystal structures.";
+    homepage = "https://github.com/giovannipizzi/seekpath";
+    license = licenses.mit;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/segments/default.nix b/nixpkgs/pkgs/development/python-modules/segments/default.nix
new file mode 100644
index 000000000000..97805642dc4c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/segments/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, regex
+, csvw
+, clldutils
+, mock
+, pytestCheckHook
+, pytest-mock
+}:
+
+buildPythonPackage rec {
+  pname = "segments";
+  version = "2.2.0";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "cldf";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "04yc8q79zk09xj0wnal0vdg5azi9jlarfmf2iyljqyr80p79gwvv";
+  };
+
+  patchPhase = ''
+    substituteInPlace setup.cfg --replace "--cov" ""
+  '';
+
+  propagatedBuildInputs = [
+    regex
+    csvw
+    clldutils
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+    pytest-mock
+  ];
+
+  meta = with lib; {
+    description = "Unicode Standard tokenization routines and orthography profile segmentation";
+    homepage = "https://github.com/cldf/segments";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/segno/default.nix b/nixpkgs/pkgs/development/python-modules/segno/default.nix
new file mode 100644
index 000000000000..3e7bb0816448
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/segno/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, setuptools
+
+# tests
+, pytestCheckHook
+, pypng
+, pyzbar
+}:
+
+buildPythonPackage rec {
+  pname = "segno";
+  version = "1.5.3";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "heuer";
+    repo = "segno";
+    rev = version;
+    hash = "sha256-j7DUCeMoYziu19WfJu/9YiIMa2ysOPYfqW8AMcE5LaU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pypng
+    pyzbar
+  ];
+
+  pythonImportsCheck = [
+    "segno"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/heuer/segno/releases/tag/${version}";
+    description = "QR Code and Micro QR Code encoder";
+    homepage = "https://github.com/heuer/segno/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ phaer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/segyio/default.nix b/nixpkgs/pkgs/development/python-modules/segyio/default.nix
new file mode 100644
index 000000000000..8f73ebd5e5ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/segyio/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, ninja
+, python
+, scikit-build
+, pytest
+, numpy
+}:
+
+stdenv.mkDerivation rec {
+  pname = "segyio";
+  version = "1.9.11";
+
+  postPatch = ''
+    # Removing unecessary build dependency
+    substituteInPlace python/setup.py --replace "'pytest-runner'," ""
+
+    # Fixing bug making one test fail in the python 3.10 build
+    substituteInPlace python/segyio/open.py --replace \
+    "cube_metrics = f.xfd.cube_metrics(iline, xline)" \
+    "cube_metrics = f.xfd.cube_metrics(int(iline), int(xline))"
+  '';
+
+  src = fetchFromGitHub {
+    owner = "equinor";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-4izeMRgg5nJ9pRfSEMDlKSYYNWkhbKEzIz7czea6Vrc=";
+  };
+
+  nativeBuildInputs = [ cmake ninja python scikit-build ];
+
+  doCheck = true;
+  # I'm not modifying the checkPhase nor adding a pytestCheckHook because the pytest is called
+  # within the cmake test phase
+  nativeCheckInputs = [ pytest numpy ];
+
+  meta = with lib; {
+    description = "Fast Python library for SEGY files";
+    homepage = "https://github.com/equinor/segyio";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ atila ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/selectors2/default.nix b/nixpkgs/pkgs/development/python-modules/selectors2/default.nix
new file mode 100644
index 000000000000..297a6514ec63
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/selectors2/default.nix
@@ -0,0 +1,35 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi
+, nose, psutil, mock }:
+
+buildPythonPackage rec {
+  version = "2.0.2";
+  pname = "selectors2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1f1bbaac203a23fbc851dc1b5a6e92c50698cc8cefa5873eb5b89eef53d1d82b";
+  };
+
+  patches = [
+    ./mapping-import.patch
+  ];
+
+  nativeCheckInputs = [ nose psutil mock ];
+
+  checkPhase = ''
+    # https://github.com/NixOS/nixpkgs/pull/46186#issuecomment-419450064
+    # Trick to disable certain tests that depend on timing which
+    # will always fail on hydra
+    export TRAVIS=""
+    nosetests tests/test_selectors2.py \
+      --exclude=test_above_fd_setsize
+  '';
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    homepage = "https://www.github.com/SethMichaelLarson/selectors2";
+    description = "Back-ported, durable, and portable selectors";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/selectors2/mapping-import.patch b/nixpkgs/pkgs/development/python-modules/selectors2/mapping-import.patch
new file mode 100644
index 000000000000..64f74a5ce29b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/selectors2/mapping-import.patch
@@ -0,0 +1,14 @@
+diff --git a/selectors2.py b/selectors2.py
+index 1625a30..c4a1231 100644
+--- a/selectors2.py
++++ b/selectors2.py
+@@ -22,7 +22,8 @@
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ # SOFTWARE.
+ 
+-from collections import namedtuple, Mapping
++from collections import namedtuple
++from collections.abc import Mapping
+ import errno
+ import math
+ import platform
diff --git a/nixpkgs/pkgs/development/python-modules/selenium/default.nix b/nixpkgs/pkgs/development/python-modules/selenium/default.nix
new file mode 100644
index 000000000000..086c53108976
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/selenium/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, certifi
+, geckodriver
+, pytestCheckHook
+, pythonOlder
+, trio
+, trio-websocket
+, urllib3
+, pytest-trio
+, nixosTests
+, stdenv
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "selenium";
+  version = "4.14.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "SeleniumHQ";
+    repo = "selenium";
+    # check if there is a newer tag with or without -python suffix
+    rev = "refs/tags/selenium-${version}";
+    hash = "sha256-cTMCKfFLUlJDbTUQA3Z/pKCE1RQQRMb4K8hKKn9HqvU=";
+  };
+
+  preConfigure = ''
+    cd py
+  '';
+
+  postInstall = ''
+    DST_PREFIX=$out/lib/${python.libPrefix}/site-packages/selenium/webdriver/
+    DST_REMOTE=$DST_PREFIX/remote/
+    DST_FF=$DST_PREFIX/firefox
+    cp ../rb/lib/selenium/webdriver/atoms/getAttribute.js $DST_REMOTE
+    cp ../rb/lib/selenium/webdriver/atoms/isDisplayed.js $DST_REMOTE
+    cp ../rb/lib/selenium/webdriver/atoms/findElements.js $DST_REMOTE
+    cp ../javascript/cdp-support/mutation-listener.js $DST_REMOTE
+    cp ../third_party/js/selenium/webdriver.json $DST_FF/webdriver_prefs.json
+  '' + lib.optionalString stdenv.isDarwin ''
+    mkdir -p $DST_PREFIX/common/macos
+    cp ../common/manager/macos/selenium-manager $DST_PREFIX/common/macos
+  '' + lib.optionalString stdenv.isLinux ''
+    mkdir -p $DST_PREFIX/common/linux/
+    cp ../common/manager/linux/selenium-manager $DST_PREFIX/common/linux/
+  '';
+
+  propagatedBuildInputs = [
+    certifi
+    trio
+    trio-websocket
+    urllib3
+  ] ++ urllib3.optional-dependencies.socks;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-trio
+  ];
+
+  passthru.tests = {
+    testing-vaultwarden = nixosTests.vaultwarden;
+  };
+
+  meta = with lib; {
+    description = "Bindings for Selenium WebDriver";
+    homepage = "https://selenium.dev/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jraygauthier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/semantic-version/default.nix b/nixpkgs/pkgs/development/python-modules/semantic-version/default.nix
new file mode 100644
index 000000000000..d80afabb2169
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/semantic-version/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "semantic-version";
+  version = "2.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "semantic_version";
+    inherit version;
+    hash = "sha256-vau20zaZjLs3jUuds6S1ah4yNXAdwF6iaQ2amX7VBBw=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "semantic_version"
+  ];
+
+  meta = with lib; {
+    description = "A library implementing the 'SemVer' scheme";
+    homepage = "https://github.com/rbarrois/python-semanticversion/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ layus makefu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/semaphore-bot/default.nix b/nixpkgs/pkgs/development/python-modules/semaphore-bot/default.nix
new file mode 100644
index 000000000000..7725b48adac4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/semaphore-bot/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python-dateutil
+, attrs
+, anyio
+}:
+
+buildPythonPackage rec {
+  pname = "semaphore-bot";
+  version = "0.16.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit version pname;
+    hash = "sha256-EOUvzW4a8CgyQSxb2fXnIWfOYs5Xe0v794vDIruSHmI=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "anyio>=3.5.0,<=3.6.2" "anyio"
+  '';
+
+  propagatedBuildInputs = [
+    anyio
+    attrs
+    python-dateutil
+  ];
+
+  # Upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "semaphore" ];
+
+  meta = with lib; {
+    description = "Simple rule-based bot library for Signal Private Messenger";
+    homepage = "https://github.com/lwesterhof/semaphore";
+    license = with licenses; [ agpl3Plus ];
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/semver/default.nix b/nixpkgs/pkgs/development/python-modules/semver/default.nix
new file mode 100644
index 000000000000..c33db77b72d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/semver/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "semver";
+  version = "3.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "python-semver";
+    repo = "python-semver";
+    rev = "refs/tags/${version}";
+    hash = "sha256-vVi0+Pq8VpYMy73JSrvi9ranOzvFaHpcPZRt8gMkkFs=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    sed -i "/--cov/d" setup.cfg
+    sed -i "/--no-cov-on-fail/d" setup.cfg
+  '';
+
+  disabledTestPaths = [
+    # Don't test the documentation
+    "docs/*.rst"
+  ];
+
+  pythonImportsCheck = [
+    "semver"
+  ];
+
+  meta = with lib; {
+    description = "Python package to work with Semantic Versioning (http://semver.org/)";
+    homepage = "https://python-semver.readthedocs.io/";
+    changelog = "https://github.com/python-semver/python-semver/releases/tag/3.0.0";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ np ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/send2trash/default.nix b/nixpkgs/pkgs/development/python-modules/send2trash/default.nix
new file mode 100644
index 000000000000..0fab032f93a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/send2trash/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "Send2Trash";
+  version = "1.8.2";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "hsoft";
+    repo = "send2trash";
+    rev = "refs/tags/${version}";
+    hash = "sha256-p0Pd9g+nLoT+oruthwjBn2E9rznvcx35VmzOAce2iTY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  doCheck = !stdenv.isDarwin;
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Send file to trash natively under macOS, Windows and Linux";
+    homepage = "https://github.com/hsoft/send2trash";
+    changelog = "https://github.com/arsenetar/send2trash/blob/${version}/CHANGES.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sendgrid/default.nix b/nixpkgs/pkgs/development/python-modules/sendgrid/default.nix
new file mode 100644
index 000000000000..6f3e9914243c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sendgrid/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, pytestCheckHook
+, python-http-client
+, pythonOlder
+, pyyaml
+, starkbank-ecdsa
+, six
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "sendgrid";
+  version = "6.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = "sendgrid-python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-/un/m4Br0Ylk00fS/U+QKeXwM1Ix5TFedaPhCyScWvs=";
+  };
+
+  propagatedBuildInputs = [
+    python-http-client
+    starkbank-ecdsa
+    six
+  ];
+
+  nativeCheckInputs = [
+    flask
+    pytestCheckHook
+    pyyaml
+    werkzeug
+  ];
+
+  disabledTestPaths = [
+    # Exclude tests that require network access
+    "test/integ/test_sendgrid.py"
+    "live_test.py"
+  ];
+
+  pythonImportsCheck = [
+    "sendgrid"
+  ];
+
+  meta = with lib; {
+    description = "Python client for SendGrid";
+    homepage = "https://github.com/sendgrid/sendgrid-python";
+    changelog = "https://github.com/sendgrid/sendgrid-python/blob/${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sense-energy/default.nix b/nixpkgs/pkgs/development/python-modules/sense-energy/default.nix
new file mode 100644
index 000000000000..35c0b4b6f4f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sense-energy/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, ciso8601
+, async-timeout
+, kasa-crypt
+, orjson
+, pythonOlder
+, requests
+, websocket-client
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "sense-energy";
+  version = "0.12.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "scottbonline";
+    repo = "sense";
+    rev = "refs/tags/${version}";
+    hash = "sha256-OVFRM31LwHNeJUx+s/TN/1o4wvjMQEKaZEPI+y+S64s=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "{{VERSION_PLACEHOLDER}}" "${version}"
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+    kasa-crypt
+    orjson
+    ciso8601
+    requests
+    websocket-client
+    websockets
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sense_energy"
+  ];
+
+  meta = with lib; {
+    description = "API for the Sense Energy Monitor";
+    homepage = "https://github.com/scottbonline/sense";
+    changelog = "https://github.com/scottbonline/sense/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sensirion-ble/default.nix b/nixpkgs/pkgs/development/python-modules/sensirion-ble/default.nix
new file mode 100644
index 000000000000..86f81f67814b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sensirion-ble/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, bluetooth-data-tools
+, bluetooth-sensor-state-data
+, home-assistant-bluetooth
+, sensor-state-data
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sensirion-ble";
+  version = "0.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "akx";
+    repo = "sensirion-ble";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-VeUfrQ/1Hqs9yueUKcv/ZpCDEEy84VDcZpuTT4fXSGw=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=sensirion_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-data-tools
+    bluetooth-sensor-state-data
+    home-assistant-bluetooth
+    sensor-state-data
+  ];
+
+  pythonImportsCheck = [
+    "sensirion_ble"
+  ];
+
+  meta = with lib; {
+    description = "Parser for Sensirion BLE devices";
+    homepage = "https://github.com/akx/sensirion-ble";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sensor-state-data/default.nix b/nixpkgs/pkgs/development/python-modules/sensor-state-data/default.nix
new file mode 100644
index 000000000000..7802340cedef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sensor-state-data/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, home-assistant-bluetooth
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "sensor-state-data";
+  version = "2.18.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-wYYSS4lABCbIhmUU3z3Wh0+4zwpEzXl8Kk9gi6LBrbQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=sensor_state_data --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "sensor_state_data"
+  ];
+
+  meta = with lib; {
+    description = "Models for storing and converting Sensor Data state";
+    homepage = "https://github.com/bluetooth-devices/sensor-state-data";
+    changelog = "https://github.com/Bluetooth-Devices/sensor-state-data/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sensorpro-ble/default.nix b/nixpkgs/pkgs/development/python-modules/sensorpro-ble/default.nix
new file mode 100644
index 000000000000..4c8412e7f936
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sensorpro-ble/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, bluetooth-data-tools
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "sensorpro-ble";
+  version = "0.5.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Zqa6qa0Jw79Iu4VEw6KN0GsZcC1X7OpiYUiyT4zwKyY=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=sensorpro_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-data-tools
+    bluetooth-sensor-state-data
+    sensor-state-data
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sensorpro_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for Sensorpro BLE devices";
+    homepage = "https://github.com/Bluetooth-Devices/sensorpro-ble";
+    changelog = "https://github.com/Bluetooth-Devices/sensorpro-ble/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sensorpush-ble/default.nix b/nixpkgs/pkgs/development/python-modules/sensorpush-ble/default.nix
new file mode 100644
index 000000000000..d51f6d7d6447
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sensorpush-ble/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, fetchFromGitHub
+, home-assistant-bluetooth
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "sensorpush-ble";
+  version = "1.5.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-17Yzpbcy/r+GlkLktgghehfAEboZHMbB/Dze1no4I80=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-sensor-state-data
+    home-assistant-bluetooth
+    sensor-state-data
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=sensorpush_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "sensorpush_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for SensorPush BLE devices";
+    homepage = "https://github.com/Bluetooth-Devices/sensorpush-ble";
+    changelog = "https://github.com/Bluetooth-Devices/sensorpush-ble/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sentence-splitter/default.nix b/nixpkgs/pkgs/development/python-modules/sentence-splitter/default.nix
new file mode 100644
index 000000000000..a544a006ce80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sentence-splitter/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+
+, pytestCheckHook
+, regex
+}:
+
+buildPythonPackage rec {
+  pname = "sentence-splitter";
+  version = "1.4";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "mediacloud";
+    repo = "sentence-splitter";
+    rev = version;
+    hash = "sha256-FxRi8fhKB9++lCTFpCAug0fxjkSVTKChLY84vkshR34=";
+  };
+
+  propagatedBuildInputs = [
+    regex
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sentence_splitter"
+  ];
+
+  meta = with lib; {
+    description = "Text to sentence splitter using heuristic algorithm by Philipp Koehn and Josh Schroeder";
+    homepage = "https://github.com/mediacloud/sentence-splitter";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ paveloom ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sentence-transformers/default.nix b/nixpkgs/pkgs/development/python-modules/sentence-transformers/default.nix
new file mode 100644
index 000000000000..9c439149964d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sentence-transformers/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, huggingface-hub
+, nltk
+, numpy
+, scikit-learn
+, scipy
+, sentencepiece
+, tokenizers
+, torch
+, torchvision
+, tqdm
+, transformers
+}:
+
+buildPythonPackage rec {
+  pname = "sentence-transformers";
+  version = "2.2.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "UKPLab";
+    repo = "sentence-transformers";
+    rev = "v${version}";
+    hash = "sha256-hEYpDAL0lliaS1j+c5vaZ0q1hw802jfTUurx/FvgY9w=";
+  };
+
+  propagatedBuildInputs = [
+    huggingface-hub
+    nltk
+    numpy
+    scikit-learn
+    scipy
+    sentencepiece
+    tokenizers
+    torch
+    torchvision
+    tqdm
+    transformers
+  ];
+
+  pythonImportsCheck = [ "sentence_transformers" ];
+
+  doCheck = false; # tests fail at build_ext
+
+  meta = with lib; {
+    description = "Multilingual Sentence & Image Embeddings with BERT";
+    homepage = "https://github.com/UKPLab/sentence-transformers";
+    changelog = "https://github.com/UKPLab/sentence-transformers/releases/tag/${src.rev}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dit7ya ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sentencepiece/default.nix b/nixpkgs/pkgs/development/python-modules/sentencepiece/default.nix
new file mode 100644
index 000000000000..dc7335b351f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sentencepiece/default.nix
@@ -0,0 +1,18 @@
+{ buildPythonPackage
+
+, sentencepiece
+, pkg-config
+}:
+
+buildPythonPackage rec {
+  pname = "sentencepiece";
+  inherit (sentencepiece) version src;
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ sentencepiece.dev ];
+
+  sourceRoot = "${src.name}/python";
+
+  # sentencepiece installs 'bin' output.
+  meta = builtins.removeAttrs sentencepiece.meta [ "outputsToInstall" ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sentinel/default.nix b/nixpkgs/pkgs/development/python-modules/sentinel/default.nix
new file mode 100644
index 000000000000..33d5f2990320
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sentinel/default.nix
@@ -0,0 +1,17 @@
+{ lib, buildPythonPackage, fetchPypi}:
+
+buildPythonPackage rec {
+  pname = "sentinel";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GQko+ZUa9ulKH4Tu/K7XkcKAl90VK4jpiJBr4wBFH9I=";
+  };
+
+  meta = with lib; {
+    description = "Create sentinel and singleton objects";
+    homepage = "https://github.com/eddieantonio/sentinel";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sentinels/default.nix b/nixpkgs/pkgs/development/python-modules/sentinels/default.nix
new file mode 100644
index 000000000000..ba2412cecbf6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sentinels/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sentinels";
+  version = "1.0.0";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1cglkxph47pki4db4kjx5g4ikxp2milqdlcjgqwmx4p1gx6p1q3v";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "sentinels" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/vmalloc/sentinels/";
+    description = "Various objects to denote special meanings in python";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sentry-sdk/default.nix b/nixpkgs/pkgs/development/python-modules/sentry-sdk/default.nix
new file mode 100644
index 000000000000..cabee11f0d6d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sentry-sdk/default.nix
@@ -0,0 +1,158 @@
+{ lib
+, stdenv
+, aiohttp
+, apache-beam
+, asttokens
+, blinker
+, botocore
+, bottle
+, buildPythonPackage
+, celery
+, certifi
+, chalice
+, django
+, executing
+, falcon
+, fetchFromGitHub
+, flask
+, flask-login
+, gevent
+, httpx
+, jsonschema
+, mock
+, pure-eval
+, pyramid
+, pyrsistent
+, pyspark
+, pysocks
+, pytest-forked
+, pytest-localserver
+, pytest-watch
+, pytestCheckHook
+, pythonOlder
+, rq
+, sanic
+, sqlalchemy
+, tornado
+, trytond
+, urllib3
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "sentry-sdk";
+  version = "1.37.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "getsentry";
+    repo = "sentry-python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-y1fZe3ql8twSsTl24bP0fqA6myMv71I6IgzOVucbuvM=";
+  };
+
+  propagatedBuildInputs = [
+    certifi
+    urllib3
+  ];
+
+  passthru.optional-dependencies = {
+    aiohttp = [
+      aiohttp
+    ];
+    beam = [
+      apache-beam
+    ];
+    bottle = [
+      bottle
+    ];
+    celery = [
+      celery
+    ];
+    chalice = [
+      chalice
+    ];
+    django = [
+      django
+    ];
+    falcon = [
+      falcon
+    ];
+    flask = [
+      flask
+      blinker
+    ];
+    httpx = [
+      httpx
+    ];
+    pyspark = [
+      pyspark
+    ];
+    pure_eval = [
+      asttokens
+      executing
+      pure-eval
+    ];
+    quart = [
+      # quart missing
+      blinker
+    ];
+    rq = [
+      rq
+    ];
+    sanic = [
+      sanic
+    ];
+    sqlalchemy = [
+      sqlalchemy
+    ];
+    tornado = [
+      tornado
+    ];
+  };
+
+  nativeCheckInputs = [
+    asttokens
+    executing
+    gevent
+    jsonschema
+    mock
+    pure-eval
+    pyrsistent
+    pysocks
+    pytest-forked
+    pytest-localserver
+    pytest-watch
+    pytestCheckHook
+  ];
+
+  doCheck = !stdenv.isDarwin;
+
+  disabledTests = [
+    # Issue with the asseration
+    "test_auto_enabling_integrations_catches_import_error"
+  ];
+
+  disabledTestPaths = [
+    # Varius integration tests fail every once in a while when we
+    # upgrade depencies, so don't bother testing them.
+    "tests/integrations/"
+  ] ++ lib.optionals (stdenv.buildPlatform != "x86_64-linux") [
+    # test crashes on aarch64
+    "tests/test_transport.py"
+  ];
+
+  pythonImportsCheck = [
+    "sentry_sdk"
+  ];
+
+  meta = with lib; {
+    description = "Python SDK for Sentry.io";
+    homepage = "https://github.com/getsentry/sentry-python";
+    changelog = "https://github.com/getsentry/sentry-python/blob/${version}/CHANGELOG.md";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ fab gebner ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sepaxml/default.nix b/nixpkgs/pkgs/development/python-modules/sepaxml/default.nix
new file mode 100644
index 000000000000..56c40e892f0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sepaxml/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, lxml
+, pytestCheckHook
+, text-unidecode
+, xmlschema
+}:
+
+buildPythonPackage rec {
+  pname = "sepaxml";
+  version = "2.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "raphaelm";
+    repo = "python-sepaxml";
+    rev = version;
+    hash = "sha256-l5UMy0M3Ovzb6rcSAteGOnKdmBPHn4L9ZWY+YGOCn40=";
+  };
+
+  propagatedBuildInputs = [
+    text-unidecode
+    xmlschema
+  ];
+
+  nativeCheckInputs = [
+    lxml
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sepaxml"
+  ];
+
+  meta = with lib; {
+    description = "SEPA Direct Debit XML generation in python";
+    homepage = "https://github.com/raphaelm/python-sepaxml/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ elohmeier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/seqdiag/default.nix b/nixpkgs/pkgs/development/python-modules/seqdiag/default.nix
new file mode 100644
index 000000000000..d2a61dcbb7ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/seqdiag/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, blockdiag
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "seqdiag";
+  version = "3.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "blockdiag";
+    repo = pname;
+    rev = version;
+    hash = "sha256-Dh9JMx50Nexi0q39rYr9MpkKmQRAfT7lzsNOXoTuphg=";
+  };
+
+  propagatedBuildInputs = [
+    blockdiag
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    nose
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "src/seqdiag/tests/"
+  ];
+
+  disabledTests = [
+    # UnicodeEncodeError: 'latin-1' codec can't encode...
+    "test_setup_inline_svg_is_true_with_multibytes"
+  ];
+
+  pythonImportsCheck = [
+    "seqdiag"
+  ];
+
+  meta = with lib; {
+    description = "Generate sequence-diagram image from spec-text file (similar to Graphviz)";
+    homepage = "http://blockdiag.com/";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/seqeval/default.nix b/nixpkgs/pkgs/development/python-modules/seqeval/default.nix
new file mode 100644
index 000000000000..05a284f47a70
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/seqeval/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, scikit-learn
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "seqeval";
+  version = "1.2.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "chakki-works";
+    repo = "seqeval";
+    rev = "v${version}";
+    sha256 = "0qv05gn54kc4wpmwnflmfqw4gwwb8lxqhkiihl0pvl7s2i7qzx2j";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "use_scm_version=True," "version='${version}'," \
+      --replace "setup_requires=['setuptools_scm']," "setup_requires=[],"
+  '';
+
+  propagatedBuildInputs = [
+    numpy
+    scikit-learn
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # tests call perl script and get stuck in there
+    "test_statistical_tests"
+    "test_by_ground_truth"
+  ];
+
+  meta = with lib; {
+    description = "A Python framework for sequence labeling evaluation";
+    homepage = "https://github.com/chakki-works/seqeval";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/serialio/default.nix b/nixpkgs/pkgs/development/python-modules/serialio/default.nix
new file mode 100644
index 000000000000..2ee338c66631
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/serialio/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, pyserial
+, sockio
+}:
+
+buildPythonPackage rec {
+  pname = "serialio";
+  version = "2.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tiagocoutinho";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-9TRGT0wpoRRcHqnH1XzlMBh0IcVzdEcOzN7hkeYnoW4=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+    sockio
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "serialio"
+  ];
+
+  meta = with lib; {
+    description = "Library for concurrency agnostic serial communication";
+    homepage = "https://github.com/tiagocoutinho/serialio";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/serializable/default.nix b/nixpkgs/pkgs/development/python-modules/serializable/default.nix
new file mode 100644
index 000000000000..5c881558d69e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/serializable/default.nix
@@ -0,0 +1,33 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, simplejson
+, six
+, typechecks
+}:
+
+buildPythonPackage rec {
+  pname = "serializable";
+  version = "unstable-2023-07-13";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "iskandr";
+    repo = pname;
+    # See https://github.com/iskandr/serializable/issues/7. As of 2023-07-13,
+    # they do no have version tags.
+    rev = "ed309a6f8f2590b525fc0f93c00549223c8c944f";
+    hash = "sha256-AXlgIc1B7bkR+joXn6ZSxk/t848CWlgVZp8WIsSZFKQ=";
+  };
+
+  propagatedBuildInputs = [ simplejson six typechecks ];
+
+  pythonImportsCheck = [ "serializable" ];
+
+  meta = with lib; {
+    description = "Base class with serialization methods for user-defined Python objects";
+    homepage = "https://github.com/iskandr/serializable";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/serpent/default.nix b/nixpkgs/pkgs/development/python-modules/serpent/default.nix
new file mode 100644
index 000000000000..4ee432a9fce9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/serpent/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, isPy27
+, enum34
+, attrs
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "serpent";
+  version = "1.41";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BAcDX+PGZEOH1Iz/FGfVqp/v+BTQc3K3hnftDuPtcJU=";
+  };
+
+  propagatedBuildInputs = lib.optionals isPy27 [ enum34 ];
+
+  nativeCheckInputs = [ attrs pytz ];
+  checkPhase = ''
+    ${python.interpreter} setup.py test
+  '';
+
+  meta = with lib; {
+    description = "A simple serialization library based on ast.literal_eval";
+    homepage = "https://github.com/irmen/Serpent";
+    license = licenses.mit;
+    maintainers = with maintainers; [ prusnak ];
+    };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/serpy/default.nix b/nixpkgs/pkgs/development/python-modules/serpy/default.nix
new file mode 100644
index 000000000000..9f086e4c86e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/serpy/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "serpy";
+  version = "0.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3772b2a9923fbf674000ff51abebf6ea8f0fca0a2cfcbfa0d63ff118193d1ec5";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  # ImportError: No module named 'tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "serpy"
+  ];
+
+  meta = with lib; {
+    description = "Ridiculously fast object serialization";
+    homepage = "https://github.com/clarkduvall/serpy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/servefile/default.nix b/nixpkgs/pkgs/development/python-modules/servefile/default.nix
new file mode 100644
index 000000000000..13d21b1be6c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/servefile/default.nix
@@ -0,0 +1,44 @@
+{ stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, lib
+, pyopenssl
+, pytestCheckHook
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "servefile";
+  version = "0.5.4";
+
+  src = fetchFromGitHub {
+    owner = "sebageek";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-hIqXwhmvstCslsCO973oK5FF2c8gZJ0wNUI/z8W+OjU=";
+  };
+
+  propagatedBuildInputs = [ pyopenssl ];
+
+  nativeCheckInputs = [ pytestCheckHook requests ];
+  # Test attempts to connect to a port on localhost which fails in nix build
+  # environment.
+  disabledTests = [
+    "test_abort_download"
+    "test_big_download"
+    "test_https_big_download"
+    "test_https"
+    "test_redirect_and_download"
+    "test_specify_port"
+    "test_upload_size_limit"
+    "test_upload"
+  ];
+  pythonImportsCheck = [ "servefile" ];
+
+  meta = with lib; {
+    description = "Serve files from shell via a small HTTP server";
+    homepage = "https://github.com/sebageek/servefile";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/serverfiles/default.nix b/nixpkgs/pkgs/development/python-modules/serverfiles/default.nix
new file mode 100644
index 000000000000..955e18e589e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/serverfiles/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "serverfiles";
+  version = "0.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XhD8MudYeR43NbwIvOLtRwKoOx5Fq5bF1ZzIruz76+E=";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  pythonImportsCheck = [ "serverfiles" ];
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  meta = {
+    description = "An utility that accesses files on a HTTP server and stores them locally for reuse";
+    homepage = "https://github.com/biolab/serverfiles";
+    license = [ lib.licenses.gpl3Plus ];
+    maintainers = [ lib.maintainers.lucasew ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/serverlessrepo/default.nix b/nixpkgs/pkgs/development/python-modules/serverlessrepo/default.nix
new file mode 100644
index 000000000000..68ebeca52069
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/serverlessrepo/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, boto3
+, six
+, pyyaml
+, mock
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "serverlessrepo";
+  version = "0.1.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "671f48038123f121437b717ed51f253a55775590f00fbab6fbc6a01f8d05c017";
+  };
+
+  propagatedBuildInputs = [
+    six
+    boto3
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pyyaml~=5.1" "pyyaml" \
+      --replace "boto3~=1.9, >=1.9.56" "boto3"
+  '';
+
+  pytestFlagsArray = [
+    "tests/unit"
+  ];
+
+  pythonImportsCheck = [
+    "serverlessrepo"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/awslabs/aws-serverlessrepo-python";
+    description = "Helpers for working with the AWS Serverless Application Repository";
+    longDescription = ''
+      A Python library with convenience helpers for working with the
+      AWS Serverless Application Repository.
+    '';
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dhkl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/service-identity/default.nix b/nixpkgs/pkgs/development/python-modules/service-identity/default.nix
new file mode 100644
index 000000000000..53fa54a5aff0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/service-identity/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, attrs
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, hatch-fancy-pypi-readme
+, hatch-vcs
+, hatchling
+, idna
+, pyasn1
+, pyasn1-modules
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "service-identity";
+  version = "23.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pyca";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-PGDtsDgRwh7GuuM4OuExiy8L4i3Foo+OD0wMrndPkvo=";
+  };
+
+  nativeBuildInputs = [
+    hatch-fancy-pypi-readme
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    cryptography
+    idna
+    pyasn1
+    pyasn1-modules
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "service_identity"
+  ];
+
+  meta = with lib; {
+    description = "Service identity verification for pyOpenSSL";
+    homepage = "https://service-identity.readthedocs.io";
+    changelog = "https://github.com/pyca/service-identity/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/setproctitle/default.nix b/nixpkgs/pkgs/development/python-modules/setproctitle/default.nix
new file mode 100644
index 000000000000..5e4fbecccba6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setproctitle/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "setproctitle";
+  version = "1.3.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ufuXkHyDDSYPoGWO1Yr9SKhrK4iqxSETXDUv9/00d/0=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  # tries to compile programs with dependencies that aren't available
+  pytestFlagsArray = [ "--ignore=tests/setproctitle_test.py" ];
+
+  meta = with lib; {
+    description = "Allows a process to change its title (as displayed by system tools such as ps and top)";
+    homepage =  "https://github.com/dvarrazzo/py-setproctitle";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ exi ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/setupmeta/default.nix b/nixpkgs/pkgs/development/python-modules/setupmeta/default.nix
new file mode 100644
index 000000000000..09a3f565d543
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setupmeta/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, git
+, mock
+, pep440
+, pip
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, six
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "setupmeta";
+  version = "3.5.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "codrsquad";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-r3pGlcdem+c5I2dKrRueksesqq9HTk0oEr/xJuM7vuc=";
+  };
+
+  preBuild = ''
+    export PYGRADLE_PROJECT_VERSION=${version};
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+    wheel
+  ];
+
+  nativeCheckInputs = [
+    git
+    mock
+    pep440
+    pip
+    pytestCheckHook
+    six
+  ];
+
+  preCheck = ''
+    unset PYGRADLE_PROJECT_VERSION
+  '';
+
+  disabledTests = [
+    # Tests want to scan site-packages
+    "test_check_dependencies"
+    "test_clean"
+    "test_scenario"
+    "test_git_versioning"
+    # setuptools.installer and fetch_build_eggs are deprecated.
+    # Requirements should be satisfied by a PEP 517 installer.
+    "test_brand_new_project"
+  ];
+
+  pythonImportsCheck = [
+    "setupmeta"
+  ];
+
+  meta = with lib; {
+    description = "Python module to simplify setup.py files";
+    homepage = "https://github.com/codrsquad/setupmeta";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/setuptools-changelog-shortener/default.nix b/nixpkgs/pkgs/development/python-modules/setuptools-changelog-shortener/default.nix
new file mode 100644
index 000000000000..fef62dfbfbb9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools-changelog-shortener/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, tomli
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "setuptools-changelog-shortener";
+  version = "0.2.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "fschulze";
+    repo = "setuptools-changelog-shortener";
+    rev = "refs/tags/${version}";
+    hash = "sha256-K8oVcX40K5j2CwQnulK55HykkEXAmOiUg4mZPg5T+YI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    tomli
+    wheel
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "setuptools_changelog_shortener" ];
+
+  meta = with lib; {
+    description = "Setuptools-changelog-shortener: add only newest changelog entries to long_description";
+    homepage = "https://github.com/fschulze/setuptools-changelog-shortener";
+    changelog = "https://github.com/fschulze/setuptools-changelog-shortener/blob/${src.rev}/README.rst#changelog";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/setuptools-declarative-requirements/default.nix b/nixpkgs/pkgs/development/python-modules/setuptools-declarative-requirements/default.nix
new file mode 100644
index 000000000000..fbf05cce22b2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools-declarative-requirements/default.nix
@@ -0,0 +1,28 @@
+{ buildPythonPackage, fetchPypi, lib, pypiserver, pytestCheckHook
+, setuptools-scm, virtualenv }:
+
+buildPythonPackage rec {
+  pname = "setuptools-declarative-requirements";
+  version = "1.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-V6W5u5rTUMJ46Kpr5M3rvNklubpx1qcSoXimGM+4mPc=";
+  };
+
+  buildInputs = [ setuptools-scm ];
+
+  nativeCheckInputs = [ pypiserver pytestCheckHook virtualenv ];
+
+  # Tests use network
+  doCheck = false;
+
+  pythonImportsCheck = [ "declarative_requirements" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/s0undt3ch/setuptools-declarative-requirements";
+    description = "Declarative setuptools Config Requirements Files Support";
+    license = licenses.asl20;
+    maintainers = [ maintainers.austinbutler ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/setuptools-generate/default.nix b/nixpkgs/pkgs/development/python-modules/setuptools-generate/default.nix
new file mode 100644
index 000000000000..e4293bd118cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools-generate/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools-scm
+, click
+, help2man
+, markdown-it-py
+, shtab
+, tomli
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "setuptools-generate";
+  version = "0.0.6";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Freed-Wu";
+    repo = "setuptools-generate";
+    rev = "refs/tags/${version}";
+    hash = "sha256-xDjxkWy/n0jStI9eLcM6WduyU9vGjtBOmJ86dpXjceQ=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    click
+    help2man
+    markdown-it-py
+    shtab
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "setuptools_generate" ];
+
+  meta = with lib; {
+    description = "Generate shell completions and man page when building a python package";
+    homepage = "https://github.com/Freed-Wu/setuptools-generate";
+    changelog = "https://github.com/Freed-Wu/setuptools-generate/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/setuptools-gettext/default.nix b/nixpkgs/pkgs/development/python-modules/setuptools-gettext/default.nix
new file mode 100644
index 000000000000..725c71eeafdc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools-gettext/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "setuptools-gettext";
+  version = "0.1.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "breezy-team";
+    repo = "setuptools-gettext";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-16kzKB0xq3ApQlGQYp12oB7K99QCQMUwqpP54QiI3gg=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  pythonImportsCheck = [
+    "setuptools_gettext"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/breezy-team/setuptools-gettext/releases/tag/v${version}";
+    description = "setuptools plugin for building mo files";
+    homepage = "https://github.com/breezy-team/setuptools-gettext";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/setuptools-git-versioning/default.nix b/nixpkgs/pkgs/development/python-modules/setuptools-git-versioning/default.nix
new file mode 100644
index 000000000000..b280650436b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools-git-versioning/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, build
+, coverage
+, git
+, packaging
+, pytestCheckHook
+, pytest-rerunfailures
+, pythonOlder
+, setuptools
+, toml
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "setuptools-git-versioning";
+  version = "1.13.5";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "dolfinus";
+    repo = "setuptools-git-versioning";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-MAHB6hMAcMo1+HCc6g7xQUD2sG+TLjM/6Oa/BKuXpRc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+    setuptools
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    toml
+  ];
+
+  pythonImportsCheck = [
+    "setuptools_git_versioning"
+  ];
+
+  nativeCheckInputs = [
+    build
+    coverage
+    git
+    pytestCheckHook
+    pytest-rerunfailures
+    toml
+  ];
+
+  preCheck = ''
+    # so that its built binary is accessible by tests
+    export PATH="$out/bin:$PATH"
+  '';
+
+  # limit tests because the full suite takes several minutes to run
+  pytestFlagsArray = [ "-m" "important" ];
+
+  disabledTests = [
+    # runs an isolated build that uses internet to download dependencies
+    "test_config_not_used"
+  ];
+
+  meta = with lib; {
+    description = "Use git repo data (latest tag, current commit hash, etc) for building a version number according PEP-440";
+    homepage = "https://github.com/dolfinus/setuptools-git-versioning";
+    changelog = "https://github.com/dolfinus/setuptools-git-versioning/blob/${src.rev}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ tjni ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/setuptools-git/default.nix b/nixpkgs/pkgs/development/python-modules/setuptools-git/default.nix
new file mode 100644
index 000000000000..06e699e19a31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools-git/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "setuptools-git";
+  version = "1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ff64136da01aabba76ae88b050e7197918d8b2139ccbf6144e14d472b9c40445";
+  };
+
+  propagatedBuildInputs = [ pkgs.git ];
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Setuptools revision control system plugin for Git";
+    homepage = "https://pypi.python.org/pypi/setuptools-git";
+    license = licenses.bsd3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/setuptools-lint/default.nix b/nixpkgs/pkgs/development/python-modules/setuptools-lint/default.nix
new file mode 100644
index 000000000000..f1eb2903f03e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools-lint/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi, pylint }:
+
+buildPythonPackage rec {
+  pname = "setuptools-lint";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "16a1ac5n7k7sx15cnk03gw3fmslab3a7m74dc45rgpldgiff3577";
+  };
+
+  propagatedBuildInputs = [ pylint ];
+
+  meta = with lib; {
+    description = "Package to expose pylint as a lint command into setup.py";
+    homepage = "https://github.com/johnnoone/setuptools-pylint";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ nickhu ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/setuptools-odoo/default.nix b/nixpkgs/pkgs/development/python-modules/setuptools-odoo/default.nix
new file mode 100644
index 000000000000..5e262daa580e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools-odoo/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, git
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, writeScript
+}:
+
+buildPythonPackage rec {
+  pname = "setuptools-odoo";
+  version = "3.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "acsone";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-aS2a1G9lssgGk3uqWgPPWpOpEnqUkCUzWsqPLQfU55k=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools-scm
+  ];
+
+  # HACK https://github.com/NixOS/nixpkgs/pull/229460
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  patchPhase = ''
+    runHook prePatch
+
+    old_manifest="$(cat MANIFEST.in 2>/dev/null || true)"
+    echo 'global-include **' > MANIFEST.in
+    echo "$old_manifest" >> MANIFEST.in
+
+    runHook postPatch
+  '';
+
+  pythonImportsCheck = [
+    "setuptools_odoo"
+  ];
+
+  setupHook = writeScript "setupHook.sh" ''
+    setuptoolsOdooHook() {
+      # Don't look for a version suffix from git when building addons
+      export SETUPTOOLS_ODOO_POST_VERSION_STRATEGY_OVERRIDE=none
+
+      # Let setuptools-odoo know which files to install, when Git is missing
+      # HACK https://github.com/acsone/setuptools-odoo/issues/20#issuecomment-340192355
+      echo 'recursive-include odoo/addons/* **' >> MANIFEST.in
+
+      # Make sure you can import the built addon
+      for manifest in $(find -L . -name __manifest__.py); do
+        export pythonImportsCheck="$pythonImportsCheck odoo.addons.$(basename $(dirname $manifest))"
+      done
+    }
+
+    preBuildHooks+=(setuptoolsOdooHook)
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    git
+  ];
+
+  disabledTests = [
+    "test_addon1_uncommitted_change"
+    "test_addon1"
+    "test_addon2_uncommitted_version_change"
+    "test_odoo_addon1_sdist"
+    "test_odoo_addon1"
+    "test_odoo_addon5_wheel"
+  ];
+
+  meta = with lib; {
+    description = "Setuptools plugin for Odoo addons";
+    homepage = "https://github.com/acsone/setuptools-odoo";
+    changelog = "https://github.com/acsone/setuptools-odoo/blob/${version}/CHANGES.rst";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ yajo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/setuptools-rust/default.nix b/nixpkgs/pkgs/development/python-modules/setuptools-rust/default.nix
new file mode 100644
index 000000000000..e1c04780b8e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools-rust/default.nix
@@ -0,0 +1,53 @@
+{ callPackage
+, lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, semantic-version
+, setuptools
+, setuptools-scm
+, tomli
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "setuptools-rust";
+  version = "1.7.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xxAJmZSCNaOK5+VV/hmapmwlPcOEsSX12FRzv4Hq46M=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    semantic-version
+    setuptools
+    typing-extensions
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  pythonImportsCheck = [
+    "setuptools_rust"
+  ];
+
+  doCheck = false;
+
+  passthru.tests.pyo3 = callPackage ./pyo3-test { };
+
+  meta = with lib; {
+    description = "Setuptools plugin for Rust support";
+    homepage = "https://github.com/PyO3/setuptools-rust";
+    changelog = "https://github.com/PyO3/setuptools-rust/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/setuptools-rust/pyo3-test/default.nix b/nixpkgs/pkgs/development/python-modules/setuptools-rust/pyo3-test/default.nix
new file mode 100644
index 000000000000..3a82ef799255
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools-rust/pyo3-test/default.nix
@@ -0,0 +1,27 @@
+{ callPackage
+, cargo
+, rustPlatform
+, rustc
+, setuptools-rust
+}:
+
+callPackage ../../../tools/rust/maturin/pyo3-test/generic.nix {
+  # Isolated builds break for this package, because PyO3 is not
+  # in the build root of the Python Package:
+  #
+  # https://github.com/pypa/pip/issues/6276
+  #
+  format = "setuptools";
+
+  nativeBuildInputs = [ setuptools-rust ] ++ [
+    rustPlatform.cargoSetupHook
+    cargo
+    rustc
+  ];
+
+  preConfigure = ''
+    # sourceRoot puts Cargo.lock in the wrong place due to the
+    # example setup.
+    cd examples/word-count
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/setuptools-scm-git-archive/default.nix b/nixpkgs/pkgs/development/python-modules/setuptools-scm-git-archive/default.nix
new file mode 100644
index 000000000000..d2f6a10a3700
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools-scm-git-archive/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, setuptools-scm, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "setuptools-scm-git-archive";
+  version = "1.4";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "setuptools_scm_git_archive";
+    sha256 = "b048b27b32e1e76ec865b0caa4bb85df6ddbf4697d6909f567ac36709f6ef2f0";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pytestFlagsArray = [
+    "tests.py"
+  ];
+
+  pythonImportsCheck = [ "setuptools_scm_git_archive" ];
+
+  meta = with lib; {
+    description = "setuptools_scm plugin for git archives";
+    homepage = "https://github.com/Changaco/setuptools_scm_git_archive";
+    license = licenses.mit;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/setuptools-scm/default.nix b/nixpkgs/pkgs/development/python-modules/setuptools-scm/default.nix
new file mode 100644
index 000000000000..36373efda530
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools-scm/default.nix
@@ -0,0 +1,54 @@
+{ buildPythonPackage
+, callPackage
+, fetchPypi
+, packaging
+, typing-extensions
+, tomli
+, setuptools
+, pythonOlder
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "setuptools-scm";
+  version = "7.1.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "setuptools_scm";
+    inherit version;
+    hash = "sha256-bFCDRadxqtfVbr/w5wYovysOx1c3Yr6ZYCFHMN4njyc=";
+  };
+
+  nativeBuildInputs = [
+    packaging
+    setuptools
+    typing-extensions
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+    setuptools
+    typing-extensions
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  pythonImportsCheck = [
+    "setuptools_scm"
+  ];
+
+  # check in passthru.tests.pytest to escape infinite recursion on pytest
+  doCheck = false;
+
+  passthru.tests = {
+    pytest = callPackage ./tests.nix { };
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/pypa/setuptools_scm/";
+    description = "Handles managing your python package versions in scm metadata";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/setuptools-scm/tests.nix b/nixpkgs/pkgs/development/python-modules/setuptools-scm/tests.nix
new file mode 100644
index 000000000000..b679a0f5ca4c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools-scm/tests.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage
+, setuptools-scm
+, pytestCheckHook
+, git
+, mercurial
+, pip
+, virtualenv
+}:
+
+buildPythonPackage {
+  pname = "setuptools-scm-tests";
+  inherit (setuptools-scm) version src;
+  format = "other";
+
+  dontBuild = true;
+  dontInstall = true;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    setuptools-scm
+    pip
+    virtualenv
+    git
+    mercurial
+  ];
+
+  disabledTests = [
+    # network access
+    "test_pip_download"
+  ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/setuptools-trial/default.nix b/nixpkgs/pkgs/development/python-modules/setuptools-trial/default.nix
new file mode 100644
index 000000000000..14f666d311a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools-trial/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, twisted
+}:
+
+buildPythonPackage rec {
+  pname = "setuptools-trial";
+  version = "0.6.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "setuptools_trial";
+    inherit version;
+    hash = "sha256-FCIPj3YcSLoeJSbwhxlQd89U+tcJizgs4iBCLw/1mxI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    twisted
+  ];
+
+  # Couldn't get tests working
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "setuptools_trial"
+  ];
+
+  meta = with lib; {
+    description = "Setuptools plugin that makes unit tests execute with trial instead of pyunit";
+    homepage = "https://github.com/rutsky/setuptools-trial";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ryansydnor ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/setuptools/default.nix b/nixpkgs/pkgs/development/python-modules/setuptools/default.nix
new file mode 100644
index 000000000000..93912d4b4ad3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools/default.nix
@@ -0,0 +1,45 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "setuptools";
+  version = "68.2.2";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pypa";
+    repo = "setuptools";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-PpZbITlYp/cA+8jmObw8g69TK+oE9YEXD3NNJixExB4=";
+  };
+
+  patches = [
+    ./tag-date.patch
+    ./setuptools-distutils-C++.patch
+  ];
+
+  nativeBuildInputs = [
+    wheel
+  ];
+
+  preBuild = lib.optionalString (!stdenv.hostPlatform.isWindows) ''
+    export SETUPTOOLS_INSTALL_WINDOWS_SPECIFIC_FILES=0
+  '';
+
+  # Requires pytest, causing infinite recursion.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Utilities to facilitate the installation of Python packages";
+    homepage = "https://github.com/pypa/setuptools";
+    changelog = "https://setuptools.pypa.io/en/stable/history.html#v${replaceStrings [ "." ] [ "-" ] version}";
+    license = with licenses; [ mit ];
+    platforms = python.meta.platforms;
+    maintainers = teams.python.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/setuptools/setuptools-distutils-C++.patch b/nixpkgs/pkgs/development/python-modules/setuptools/setuptools-distutils-C++.patch
new file mode 100644
index 000000000000..399e1682357d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools/setuptools-distutils-C++.patch
@@ -0,0 +1,171 @@
+diff --git a/setuptools/_distutils/cygwinccompiler.py b/setuptools/_distutils/cygwinccompiler.py
+index 47efa377..5cdbbe10 100644
+--- a/setuptools/_distutils/cygwinccompiler.py
++++ b/setuptools/_distutils/cygwinccompiler.py
+@@ -101,14 +101,19 @@ class CygwinCCompiler(UnixCCompiler):
+         self.cxx = os.environ.get('CXX', 'g++')
+ 
+         self.linker_dll = self.cc
++        self.linker_dll_cxx = self.cxx
+         shared_option = "-shared"
+ 
+         self.set_executables(
+             compiler='%s -mcygwin -O -Wall' % self.cc,
+             compiler_so='%s -mcygwin -mdll -O -Wall' % self.cc,
+             compiler_cxx='%s -mcygwin -O -Wall' % self.cxx,
++            compiler_so_cxx='%s -mcygwin -mdll -O -Wall' % self.cxx,
+             linker_exe='%s -mcygwin' % self.cc,
+             linker_so=('{} -mcygwin {}'.format(self.linker_dll, shared_option)),
++            linker_exe_cxx='%s -mcygwin' % self.cxx,
++            linker_so_cxx=('%s -mcygwin %s' %
++                (self.linker_dll_cxx, shared_option)),
+         )
+ 
+         # Include the appropriate MSVC runtime library if Python was built
+@@ -140,9 +145,12 @@ class CygwinCCompiler(UnixCCompiler):
+                 raise CompileError(msg)
+         else:  # for other files use the C-compiler
+             try:
+-                self.spawn(
+-                    self.compiler_so + cc_args + [src, '-o', obj] + extra_postargs
+-                )
++                if self.detect_language(src) == 'c++':
++                    self.spawn(self.compiler_so_cxx + cc_args + [src, '-o', obj] +
++                                   extra_postargs)
++                else:
++                    self.spawn(
++                        self.compiler_so + cc_args + [src, '-o', obj] + extra_postargs)
+             except DistutilsExecError as msg:
+                 raise CompileError(msg)
+ 
+@@ -278,9 +286,12 @@ class Mingw32CCompiler(CygwinCCompiler):
+         self.set_executables(
+             compiler='%s -O -Wall' % self.cc,
+             compiler_so='%s -mdll -O -Wall' % self.cc,
++            compiler_so_cxx='%s -mdll -O -Wall' % self.cxx,
+             compiler_cxx='%s -O -Wall' % self.cxx,
+             linker_exe='%s' % self.cc,
+             linker_so='{} {}'.format(self.linker_dll, shared_option),
++            linker_exe_cxx='%s' % self.cxx,
++            linker_so_cxx='%s %s' % (self.linker_dll_cxx, shared_option)
+         )
+ 
+     def runtime_library_dir_option(self, dir):
+diff --git a/setuptools/_distutils/sysconfig.py b/setuptools/_distutils/sysconfig.py
+index a40a7231..e5aad4f4 100644
+--- a/setuptools/_distutils/sysconfig.py
++++ b/setuptools/_distutils/sysconfig.py
+@@ -297,6 +297,7 @@ def customize_compiler(compiler):  # noqa: C901
+             cflags,
+             ccshared,
+             ldshared,
++            ldcxxshared,
+             shlib_suffix,
+             ar,
+             ar_flags,
+@@ -306,11 +307,14 @@ def customize_compiler(compiler):  # noqa: C901
+             'CFLAGS',
+             'CCSHARED',
+             'LDSHARED',
++            'LDCXXSHARED',
+             'SHLIB_SUFFIX',
+             'AR',
+             'ARFLAGS',
+         )
+ 
++        cxxflags = cflags
++
+         if 'CC' in os.environ:
+             newcc = os.environ['CC']
+             if 'LDSHARED' not in os.environ and ldshared.startswith(cc):
+@@ -322,19 +326,27 @@ def customize_compiler(compiler):  # noqa: C901
+             cxx = os.environ['CXX']
+         if 'LDSHARED' in os.environ:
+             ldshared = os.environ['LDSHARED']
++        if 'LDCXXSHARED' in os.environ:
++            ldcxxshared = os.environ['LDCXXSHARED']
+         if 'CPP' in os.environ:
+             cpp = os.environ['CPP']
+         else:
+             cpp = cc + " -E"  # not always
+         if 'LDFLAGS' in os.environ:
+             ldshared = ldshared + ' ' + os.environ['LDFLAGS']
++            ldcxxshared = ldcxxshared + ' ' + os.environ['LDFLAGS']
+         if 'CFLAGS' in os.environ:
+-            cflags = cflags + ' ' + os.environ['CFLAGS']
++            cflags = os.environ['CFLAGS']
+             ldshared = ldshared + ' ' + os.environ['CFLAGS']
++        if 'CXXFLAGS' in os.environ:
++            cxxflags = os.environ['CXXFLAGS']
++            ldcxxshared = ldcxxshared + ' ' + os.environ['CXXFLAGS']
+         if 'CPPFLAGS' in os.environ:
+             cpp = cpp + ' ' + os.environ['CPPFLAGS']
+             cflags = cflags + ' ' + os.environ['CPPFLAGS']
++            cxxflags = cxxflags + ' ' + os.environ['CPPFLAGS']
+             ldshared = ldshared + ' ' + os.environ['CPPFLAGS']
++            ldcxxshared = ldcxxshared + ' ' + os.environ['CPPFLAGS']
+         if 'AR' in os.environ:
+             ar = os.environ['AR']
+         if 'ARFLAGS' in os.environ:
+@@ -343,13 +355,17 @@ def customize_compiler(compiler):  # noqa: C901
+             archiver = ar + ' ' + ar_flags
+ 
+         cc_cmd = cc + ' ' + cflags
++        cxx_cmd = cxx + ' ' + cxxflags
+         compiler.set_executables(
+             preprocessor=cpp,
+             compiler=cc_cmd,
+             compiler_so=cc_cmd + ' ' + ccshared,
+-            compiler_cxx=cxx,
++            compiler_cxx=cxx_cmd,
++            compiler_so_cxx=cxx_cmd + ' ' + ccshared,
+             linker_so=ldshared,
++            linker_so_cxx=ldcxxshared,
+             linker_exe=cc,
++            linker_exe_cxx=cxx,
+             archiver=archiver,
+         )
+ 
+diff --git a/setuptools/_distutils/unixccompiler.py b/setuptools/_distutils/unixccompiler.py
+index 6ca2332a..5ac64128 100644
+--- a/setuptools/_distutils/unixccompiler.py
++++ b/setuptools/_distutils/unixccompiler.py
+@@ -115,9 +115,12 @@ class UnixCCompiler(CCompiler):
+         'preprocessor': None,
+         'compiler': ["cc"],
+         'compiler_so': ["cc"],
+-        'compiler_cxx': ["cc"],
++        'compiler_cxx': ["c++"],
++        'compiler_so_cxx': ["c++"],
+         'linker_so': ["cc", "-shared"],
++        'linker_so_cxx': ["c++", "-shared"],
+         'linker_exe': ["cc"],
++        'linker_exe_cxx': ["c++", "-shared"],
+         'archiver': ["ar", "-cr"],
+         'ranlib': None,
+     }
+@@ -181,8 +184,13 @@ class UnixCCompiler(CCompiler):
+ 
+     def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):
+         compiler_so = compiler_fixup(self.compiler_so, cc_args + extra_postargs)
++        compiler_so_cxx = compiler_fixup(self.compiler_so_cxx, cc_args + extra_postargs)
+         try:
+-            self.spawn(compiler_so + cc_args + [src, '-o', obj] + extra_postargs)
++            if self.detect_language(src) == 'c++':
++                self.spawn(compiler_so_cxx + cc_args + [ src, '-o', obj] +
++                               extra_postargs)
++            else:
++                self.spawn(compiler_so + cc_args + [src, '-o', obj] + extra_postargs)
+         except DistutilsExecError as msg:
+             raise CompileError(msg)
+ 
+@@ -250,7 +258,8 @@ class UnixCCompiler(CCompiler):
+                 # building an executable or linker_so (with shared options)
+                 # when building a shared library.
+                 building_exe = target_desc == CCompiler.EXECUTABLE
+-                linker = (self.linker_exe if building_exe else self.linker_so)[:]
++                linker = (self.linker_exe if building_exe else (self.linker_so_cxx if
++                              target_lang == "c++" else self.linker_so))[:]
+ 
+                 if target_lang == "c++" and self.compiler_cxx:
+                     env, linker_ne = _split_env(linker)
diff --git a/nixpkgs/pkgs/development/python-modules/setuptools/tag-date.patch b/nixpkgs/pkgs/development/python-modules/setuptools/tag-date.patch
new file mode 100644
index 000000000000..441177a5d17e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools/tag-date.patch
@@ -0,0 +1,12 @@
+diff --git a/setup.cfg b/setup.cfg
+index f23714b6..8aaeb330 100644
+--- a/setup.cfg
++++ b/setup.cfg
+@@ -1,6 +1,6 @@
+ [egg_info]
+ tag_build = .post
+-tag_date = 1
++tag_date = 0
+
+ [aliases]
+ clean_egg_info = egg_info -Db ''
diff --git a/nixpkgs/pkgs/development/python-modules/setuptools_dso/default.nix b/nixpkgs/pkgs/development/python-modules/setuptools_dso/default.nix
new file mode 100644
index 000000000000..30fc6f7393b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/setuptools_dso/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose2
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "setuptools_dso";
+  version = "2.10";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sjAZ9enOw3vF3zqXNbhu45SM5/sv2kIwfKC6SWJdG0Q=";
+  };
+
+  propagatedBuildInputs = [ setuptools ];
+
+  nativeCheckInputs = [ nose2 ];
+
+  checkPhase = ''
+    runHook preCheck
+    nose2 -v
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "setuptools extension for building non-Python Dynamic Shared Objects";
+    homepage = "https://github.com/mdavidsaver/setuptools_dso";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ marius851000 xfix ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/seventeentrack/default.nix b/nixpkgs/pkgs/development/python-modules/seventeentrack/default.nix
new file mode 100644
index 000000000000..351392aec46a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/seventeentrack/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, aiohttp
+, aresponses
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "seventeentrack";
+  version = "2022.04.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "McSwindler";
+    repo = pname;
+    rev = version;
+    hash = "sha256-vMdRXcd0es/LjgsVyWItSLFzlSTEa3oaA6lr/NL4i8U=";
+  };
+
+  patches = [
+    # This patch removes references to setuptools and wheel that are no longer
+    # necessary and changes poetry to poetry-core, so that we don't need to add
+    # unnecessary nativeBuildInputs.
+    #
+    #   https://github.com/McSwindler/seventeentrack/pull/4
+    #
+    (fetchpatch {
+      name = "clean-up-build-dependencies.patch";
+      url = "https://github.com/McSwindler/seventeentrack/commit/9a21e22f796a17628a9628f54e19d19d002b4d0a.patch";
+      hash = "sha256-UvxUpiSkDbP8Jum5XbrWHBnH1HLBYEKUKw6GTV+Kvys=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    attrs
+    pytz
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Ignore the examples directory as the files are prefixed with test_
+    "examples/"
+  ];
+
+  pythonImportsCheck = [
+    "seventeentrack"
+  ];
+
+  meta = with lib; {
+    description = "Python library to track package info from 17track.com";
+    homepage = "https://github.com/McSwindler/seventeentrack";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sexpdata/default.nix b/nixpkgs/pkgs/development/python-modules/sexpdata/default.nix
new file mode 100644
index 000000000000..0d2c0192c1c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sexpdata/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "sexpdata";
+  version = "1.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-b2XxFSkYkMvOXNJpwTvfH4KkzSO8YbbhUKJ1Ee5qfV4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sexpdata"
+  ];
+
+  meta = with lib; {
+    description = "S-expression parser for Python";
+    homepage = "https://github.com/jd-boyd/sexpdata";
+    changelog = "https://github.com/jd-boyd/sexpdata/releases/tag/v${version}";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sfepy/default.nix b/nixpkgs/pkgs/development/python-modules/sfepy/default.nix
new file mode 100644
index 000000000000..7b981be99557
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sfepy/default.nix
@@ -0,0 +1,80 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, scipy
+, matplotlib
+, pyparsing
+, tables
+, cython
+, python
+, sympy
+, meshio
+, mpi4py
+, psutil
+, openssh
+, pyvista
+, pytest
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sfepy";
+  version = "2023.1";
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "sfepy";
+    repo = "sfepy";
+    rev = "release_${version}";
+    hash = "sha256-PuU6DL9zftHltpYI9VZQzKGIP8l9UUU8GVChrHtpNM0=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    cython
+    scipy
+    matplotlib
+    pyparsing
+    tables
+    sympy
+    meshio
+    mpi4py
+    psutil
+    openssh
+    pyvista
+  ];
+
+  postPatch = ''
+    # slow tests
+    rm sfepy/tests/test_io.py
+    rm sfepy/tests/test_elasticity_small_strain.py
+    rm sfepy/tests/test_term_call_modes.py
+    rm sfepy/tests/test_refine_hanging.py
+    rm sfepy/tests/test_hyperelastic_tlul.py
+    rm sfepy/tests/test_poly_spaces.py
+    rm sfepy/tests/test_linear_solvers.py
+    rm sfepy/tests/test_quadratures.py
+  '';
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    export OMPI_MCA_plm_rsh_agent=${openssh}/bin/ssh
+    export HOME=$TMPDIR
+    mv sfepy sfepy.hidden
+    mkdir -p $HOME/.matplotlib
+    echo "backend: ps" > $HOME/.matplotlib/matplotlibrc
+    ${python.interpreter} -c "import sfepy; sfepy.test()"
+  '';
+
+  meta = with lib; {
+    homepage = "https://sfepy.org/";
+    description = "Simple Finite Elements in Python";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ wd15 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sfrbox-api/default.nix b/nixpkgs/pkgs/development/python-modules/sfrbox-api/default.nix
new file mode 100644
index 000000000000..397fa31a8ca9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sfrbox-api/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, click
+, defusedxml
+, fetchFromGitHub
+, httpx
+, poetry-core
+, pydantic
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, respx
+}:
+
+buildPythonPackage rec {
+  pname = "sfrbox-api";
+  version = "0.0.8";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "hacf-fr";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-yvVoWBupHRbMoXmun/pj0bPpujWKfH1SknEhvgIsPzk=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'pydantic = ">=1.10.2"' 'pydantic = "*"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    click
+    defusedxml
+    httpx
+    pydantic
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    respx
+  ];
+
+  pythonImportsCheck = [
+    "sfrbox_api"
+  ];
+
+  meta = with lib; {
+    description = "Module for the SFR Box API";
+    homepage = "https://github.com/hacf-fr/sfrbox-api";
+    changelog = "https://github.com/hacf-fr/sfrbox-api/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sgmllib3k/default.nix b/nixpkgs/pkgs/development/python-modules/sgmllib3k/default.nix
new file mode 100644
index 000000000000..05eb7da77395
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sgmllib3k/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, pytestCheckHook
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "sgmllib3k";
+  version = "1.0.0";
+  format = "setuptools";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "hsoft";
+    repo = "sgmllib";
+    rev = "799964676f35349ca2dd04503e34c2b3ad522c0d";
+    sha256 = "0bzf6pv85dzfxfysm6zbj8m40hp0xzr9h8qlk4hp3nmy88rznqvr";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals (pythonAtLeast "3.10") [
+    "test_declaration_junk_chars"
+  ];
+
+  pythonImportsCheck = [
+    "sgmllib"
+  ];
+
+  meta = with lib; {
+    homepage = "https://pypi.org/project/sgmllib3k/";
+    description = "Python 3 port of sgmllib";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ lovesegfault ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sgp4/default.nix b/nixpkgs/pkgs/development/python-modules/sgp4/default.nix
new file mode 100644
index 000000000000..9f6693603e04
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sgp4/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, numpy }:
+
+buildPythonPackage rec {
+  pname = "sgp4";
+  version = "2.23";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2K3cU6L7n4je5r/UAdKGWwFMwLV78s7mm97o2WhdVCk=";
+  };
+
+  nativeCheckInputs = [ numpy ];
+
+  pythonImportsCheck = [ "sgp4" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/brandon-rhodes/python-sgp4";
+    description = "Python version of the SGP4 satellite position library";
+    license = licenses.mit;
+    maintainers = with maintainers; [ zane ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sh/default.nix b/nixpkgs/pkgs/development/python-modules/sh/default.nix
new file mode 100644
index 000000000000..46332d0d528a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sh/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+ }:
+
+buildPythonPackage rec {
+  pname = "sh";
+  version = "2.0.6";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "amoffat";
+    repo = "sh";
+    rev = "refs/tags/${version}";
+    hash = "sha256-c4Ms4ydcW7LgmAI1WuYD74nzILuY/Xg+JePJe0q5AQQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests"
+  ];
+
+  # A test needs the HOME directory to be different from $TMPDIR.
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  disabledTests = [
+    # Disable tests that fail on Hydra
+    "test_no_fd_leak"
+    "test_piped_exception1"
+    "test_piped_exception2"
+    "test_unicode_path"
+    # fails to import itself after modifying the environment
+    "test_environment"
+    # timing sensitive through usage of sleep(1) and signal handling
+    # https://github.com/amoffat/sh/issues/684
+    "test_general_signal"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # Disable tests that fail on Darwin sandbox
+    "test_background_exception"
+    "test_cwd"
+    "test_ok_code"
+  ];
+
+  meta = with lib; {
+    description = "Python subprocess interface";
+    homepage = "https://pypi.python.org/pypi/sh/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ siriobalmelli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/shamir-mnemonic/default.nix b/nixpkgs/pkgs/development/python-modules/shamir-mnemonic/default.nix
new file mode 100644
index 000000000000..5fbd75d7e42a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shamir-mnemonic/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, fetchFromGitHub
+, attrs
+, click
+, colorama
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "shamir-mnemonic";
+  version = "0.2.2";
+
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "trezor";
+    repo = "python-${pname}";
+    rev = "v${version}";
+    hash = "sha256-b9tBXN9dBdAeGg3xf5ZBdd6kPpFzseJl6wRTTfNZEwo=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    click
+    colorama
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "shamir_mnemonic" ];
+
+  meta = with lib; {
+    description = "Reference implementation of SLIP-0039";
+    homepage = "https://github.com/trezor/python-shamir-mnemonic";
+    license = licenses.mit;
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/shap/default.nix b/nixpkgs/pkgs/development/python-modules/shap/default.nix
new file mode 100644
index 000000000000..cc042fcd4f52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shap/default.nix
@@ -0,0 +1,154 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, writeText
+, catboost
+, cloudpickle
+, ipython
+, lightgbm
+, lime
+, matplotlib
+, nose
+, numba
+, numpy
+, oldest-supported-numpy
+, opencv4
+, pandas
+, pyspark
+, pytest-mpl
+, scikit-learn
+, scipy
+, sentencepiece
+, setuptools
+, slicer
+, tqdm
+, transformers
+, xgboost
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "shap";
+  version = "0.43.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "slundberg";
+    repo = "shap";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ylkpXhaLXsQiu6YMC3pUtlicptQmtjITzW+ydinB4ls=";
+  };
+
+  nativeBuildInputs = [
+    oldest-supported-numpy
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    cloudpickle
+    numba
+    numpy
+    pandas
+    scikit-learn
+    scipy
+    slicer
+    tqdm
+  ];
+
+  passthru.optional-dependencies = {
+    plots = [ matplotlib ipython ];
+    others = [ lime ];
+  };
+
+  preCheck = let
+    # This pytest hook mocks and catches attempts at accessing the network
+    # tests that try to access the network will raise, get caught, be marked as skipped and tagged as xfailed.
+    conftestSkipNetworkErrors = writeText "conftest.py" ''
+      from _pytest.runner import pytest_runtest_makereport as orig_pytest_runtest_makereport
+      import urllib, requests, transformers
+
+      class NetworkAccessDeniedError(RuntimeError): pass
+      def deny_network_access(*a, **kw):
+        raise NetworkAccessDeniedError
+
+      requests.head = deny_network_access
+      requests.get  = deny_network_access
+      urllib.request.urlopen = deny_network_access
+      urllib.request.Request = deny_network_access
+      transformers.AutoTokenizer.from_pretrained = deny_network_access
+
+      def pytest_runtest_makereport(item, call):
+        tr = orig_pytest_runtest_makereport(item, call)
+        if call.excinfo is not None and call.excinfo.type is NetworkAccessDeniedError:
+            tr.outcome = 'skipped'
+            tr.wasxfail = "reason: Requires network access."
+        return tr
+    '';
+  in ''
+    export HOME=$TMPDIR
+    # when importing the local copy the extension is not found
+    rm -r shap
+
+    # Add pytest hook skipping tests that access network.
+    # These tests are marked as "Expected fail" (xfail)
+    cat ${conftestSkipNetworkErrors} >> tests/conftest.py
+  '';
+
+  nativeCheckInputs = [
+    ipython
+    matplotlib
+    nose
+    pytest-mpl
+    pytestCheckHook
+    # optional dependencies, which only serve to enable more tests:
+    catboost
+    lightgbm
+    opencv4
+    pyspark
+    sentencepiece
+    #torch # we already skip all its tests due to slowness, adding it does nothing
+    transformers
+    xgboost
+  ];
+
+  disabledTestPaths = [
+    # The resulting plots look sane, but does not match pixel-perfectly with the baseline.
+    # Likely due to a matplotlib version mismatch, different backend, or due to missing fonts.
+    "tests/plots/test_summary.py" # FIXME: enable
+  ];
+
+  disabledTests = [
+    # The same reason as above test_summary.py
+    "test_random_force_plot_negative_sign"
+    "test_random_force_plot_positive_sign"
+    "test_random_summary_layered_violin_with_data2"
+    "test_random_summary_violin_with_data2"
+    "test_simple_bar_with_cohorts_dict"
+  ];
+
+  pythonImportsCheck = [
+    "shap"
+    "shap.explainers"
+    "shap.explainers.other"
+    "shap.plots"
+    "shap.plots.colors"
+    "shap.benchmark"
+    "shap.maskers"
+    "shap.utils"
+    "shap.actions"
+    "shap.models"
+  ];
+
+  meta = with lib; {
+    description = "A unified approach to explain the output of any machine learning model";
+    homepage = "https://github.com/slundberg/shap";
+    changelog = "https://github.com/slundberg/shap/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ evax natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/shapely/default.nix b/nixpkgs/pkgs/development/python-modules/shapely/default.nix
new file mode 100644
index 000000000000..7f87ddf6befa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shapely/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, cython
+, geos
+, oldest-supported-numpy
+, setuptools
+, wheel
+, numpy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "shapely";
+  version = "2.0.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-FxPMBMFxuv/Fslm6hTHFiswqMBcHt/Ah2IoV7QkGSec=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    geos # for geos-config
+    oldest-supported-numpy
+    setuptools
+    wheel
+  ];
+
+  buildInputs = [
+    geos
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Fix a ModuleNotFoundError. Investigated at:
+  # https://github.com/NixOS/nixpkgs/issues/255262
+  preCheck = ''
+    cd $out
+  '';
+
+  disabledTests = lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
+    # FIXME(lf-): these logging tests are broken, which is definitely our
+    # fault. I've tried figuring out the cause and failed.
+    #
+    # It is apparently some sandbox or no-sandbox related thing on macOS only
+    # though.
+    "test_error_handler_exception"
+    "test_error_handler"
+    "test_info_handler"
+  ];
+
+  pythonImportsCheck = [ "shapely" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/shapely/shapely/blob/${version}/CHANGES.txt";
+    description = "Manipulation and analysis of geometric objects";
+    homepage = "https://github.com/shapely/shapely";
+    license = licenses.bsd3;
+    maintainers = teams.geospatial.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sharedmem/default.nix b/nixpkgs/pkgs/development/python-modules/sharedmem/default.nix
new file mode 100644
index 000000000000..942e272229a7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sharedmem/default.nix
@@ -0,0 +1,21 @@
+{ buildPythonPackage, fetchPypi, lib, numpy }:
+
+buildPythonPackage rec {
+
+  pname = "sharedmem";
+  version = "0.3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c654a6bee2e2f35c82e6cc8b6c262fcabd378f5ba11ac9ef71530f8dabb8e2f7";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  meta = {
+    homepage = "http://rainwoodman.github.io/sharedmem/";
+    description = "Easier parallel programming on shared memory computers";
+    maintainers = with lib.maintainers; [ edwtjo ];
+    license = lib.licenses.gpl3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sharkiq/default.nix b/nixpkgs/pkgs/development/python-modules/sharkiq/default.nix
new file mode 100644
index 000000000000..0b99c15564fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sharkiq/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "sharkiq";
+  version = "1.0.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "JeffResc";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-UG460uEv1U/KTuVEcXMZlVbK/7REFpotkUk4U7z7KpA=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "sharkiq" ];
+
+  meta = with lib; {
+    description = "Python API for Shark IQ robots";
+    homepage = "https://github.com/JeffResc/sharkiq";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/shazamio/default.nix b/nixpkgs/pkgs/development/python-modules/shazamio/default.nix
new file mode 100644
index 000000000000..ee1616f7b775
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shazamio/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, wheel
+, aiofiles
+, aiohttp
+, dataclass-factory
+, numpy
+, pydantic
+, pydub
+, ffmpeg
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "shazamio";
+  version = "0.4.0.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "dotX12";
+    repo = "ShazamIO";
+    rev = version;
+    hash = "sha256-dfrdfbGkLYNjlS6Qv9Rnywv6nqiKrNXCICLSuAXpQBU=";
+  };
+
+  patches = [
+    # remove poetry and virtualenv from build dependencies as they are not used
+    # https://github.com/dotX12/ShazamIO/pull/71
+    (fetchpatch {
+      name = "remove-unused-build-dependencies.patch";
+      url = "https://github.com/dotX12/ShazamIO/commit/5c61e1efe51c2826852da5b6aa6ad8ce3d4012a9.patch";
+      hash = "sha256-KiU5RVBPnSs5qrReFeTe9ePg1fR7y0NchIIHcQwlPaI=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    aiofiles
+    aiohttp
+    dataclass-factory
+    numpy
+    pydantic
+    pydub
+  ];
+
+  nativeCheckInputs = [
+    ffmpeg
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # requires internet access
+    "test_about_artist"
+    "test_recognize_song_file"
+    "test_recognize_song_bytes"
+  ];
+
+  pythonImportsCheck = [ "shazamio" ];
+
+  meta = with lib; {
+    description = "A free asynchronous library from reverse engineered Shazam API";
+    homepage = "https://github.com/dotX12/ShazamIO";
+    changelog = "https://github.com/dotX12/ShazamIO/releases/tag/${src.rev}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/shellescape/default.nix b/nixpkgs/pkgs/development/python-modules/shellescape/default.nix
new file mode 100644
index 000000000000..6244baca90d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shellescape/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "shellescape";
+  version = "3.8.1";
+
+  src = fetchFromGitHub {
+    owner = "chrissimpkins";
+    repo = "shellescape";
+    rev = "v${version}";
+    hash = "sha256-HAe3Qf3lLeVWw/tVkW0J+CfoxSoOnCcWDR2nEWZn7HM=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [ "shellescape" ];
+
+  meta = with lib; {
+    description = "Shell escape a string to safely use it as a token in a shell command (backport of Python shlex.quote)";
+    homepage = "https://github.com/chrissimpkins/shellescape";
+    license = with licenses; [ mit psfl ];
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/shellingham/default.nix b/nixpkgs/pkgs/development/python-modules/shellingham/default.nix
new file mode 100644
index 000000000000..ee368852422a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shellingham/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "shellingham";
+  version = "1.5.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sarugaku";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-7hMlKw9oSGp57FQmbxdAgUsm5cFRr1oTW1ymJyYsgOg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "shellingham"
+  ];
+
+  meta = with lib; {
+    description = "Tool to detect the surrounding shell";
+    homepage = "https://github.com/sarugaku/shellingham";
+    changelog = "https://github.com/sarugaku/shellingham/blob/${version}/CHANGELOG.rst";
+    license = licenses.isc;
+    maintainers = with maintainers; [ mbode ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/shiboken2/default.nix b/nixpkgs/pkgs/development/python-modules/shiboken2/default.nix
new file mode 100644
index 000000000000..593a7b7d82ea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shiboken2/default.nix
@@ -0,0 +1,60 @@
+{ python
+, lib
+, stdenv
+, pyside2
+, cmake
+, qt5
+, libxcrypt
+, llvmPackages_15
+}:
+
+stdenv.mkDerivation {
+  pname = "shiboken2";
+
+  inherit (pyside2) version src;
+
+  patches = [
+    ./nix_compile_cflags.patch
+  ];
+
+  postPatch = ''
+    cd sources/shiboken2
+  '';
+
+  CLANG_INSTALL_DIR = llvmPackages_15.libclang.out;
+
+  nativeBuildInputs = [ cmake ];
+
+  buildInputs = [
+    llvmPackages_15.libclang
+    python
+    python.pkgs.setuptools
+    qt5.qtbase
+    qt5.qtxmlpatterns
+  ] ++ (lib.optionals (python.pythonOlder "3.9") [
+    # see similar issue: 202262
+    # libxcrypt is required for crypt.h for building older python modules
+    libxcrypt
+  ]);
+
+  cmakeFlags = [
+    "-DBUILD_TESTS=OFF"
+  ];
+
+  dontWrapQtApps = true;
+
+  postInstall = ''
+    cd ../../..
+    ${python.pythonOnBuildForHost.interpreter} setup.py egg_info --build-type=shiboken2
+    cp -r shiboken2.egg-info $out/${python.sitePackages}/
+    rm $out/bin/shiboken_tool.py
+  '';
+
+  meta = with lib; {
+    description = "Generator for the PySide2 Qt bindings";
+    license = with licenses; [ gpl2 lgpl21 ];
+    homepage = "https://wiki.qt.io/Qt_for_Python";
+    maintainers = with maintainers; [ gebner ];
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/shiboken2/nix_compile_cflags.patch b/nixpkgs/pkgs/development/python-modules/shiboken2/nix_compile_cflags.patch
new file mode 100644
index 000000000000..c3c63dc67ba9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shiboken2/nix_compile_cflags.patch
@@ -0,0 +1,30 @@
+--- pyside-setup-everywhere-src-5.12.6/sources/shiboken2/ApiExtractor/clangparser/compilersupport.cpp~	2020-07-08 14:37:13.022476435 -0700
++++ pyside-setup-everywhere-src-5.12.6/sources/shiboken2/ApiExtractor/clangparser/compilersupport.cpp	2020-07-08 14:37:18.271484269 -0700
+@@ -330,17 +330,15 @@
+     }
+ #endif // NEED_CLANG_BUILTIN_INCLUDES
+ 
+-    // Append the c++ include paths since Clang is unable to find <list> etc
+-    // on RHEL 7 with g++ 6.3 or CentOS 7.2.
+-    // A fix for this has been added to Clang 5.0, so, the code can be removed
+-    // once Clang 5.0 is the minimum version.
+-    if (needsGppInternalHeaders()) {
+-        const HeaderPaths gppPaths = gppInternalIncludePaths(compilerFromCMake(QStringLiteral("g++")));
+-        for (const HeaderPath &h : gppPaths) {
+-            if (h.path.contains("c++")
+-                || h.path.contains("sysroot")) { // centOS
+-                headerPaths.append(h);
+-            }
++    const HeaderPaths gppPaths = gppInternalIncludePaths(QStringLiteral("g++"));
++    for (const HeaderPath &h : gppPaths) {
++        // PySide2 requires that Qt headers are not -isystem
++        // https://bugreports.qt.io/browse/PYSIDE-787
++        if (!h.path.contains("-qt")) {
++            // add using -isystem
++            headerPaths.append(h);
++        } else {
++            headerPaths.append({h.path, HeaderType::Standard});
+         }
+     }
+ #else
+
diff --git a/nixpkgs/pkgs/development/python-modules/shiboken6/default.nix b/nixpkgs/pkgs/development/python-modules/shiboken6/default.nix
new file mode 100644
index 000000000000..b2e8362be8b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shiboken6/default.nix
@@ -0,0 +1,90 @@
+{ lib
+, fetchurl
+, fetchpatch
+, llvmPackages
+, python
+, cmake
+, autoPatchelfHook
+, stdenv
+}:
+
+let
+  stdenv' = if stdenv.cc.isClang then stdenv else llvmPackages.stdenv;
+in
+stdenv'.mkDerivation rec {
+  pname = "shiboken6";
+  version = "6.6.0";
+
+  src = fetchurl {
+    # https://download.qt.io/official_releases/QtForPython/shiboken6/
+    url = "https://download.qt.io/official_releases/QtForPython/shiboken6/PySide6-${version}-src/pyside-setup-everywhere-src-${version}.tar.xz";
+    sha256 = "sha256-LdAC24hRqHFzNU84qoxuxC0P8frJnqQisp4t/OUtFjg=";
+  };
+
+  sourceRoot = "pyside-setup-everywhere-src-${lib.removeSuffix ".0" version}/sources/${pname}";
+
+  patches = [
+    ./fix-include-qt-headers.patch
+    # TODO: remove after bumping above 6.6.0
+    (fetchpatch {
+      name = "shiboken6-improve-api-extractor-argument-parsing.patch";
+      url = "https://code.qt.io/cgit/pyside/pyside-setup.git/patch/?id=6abde77c3df60ccac25089660df5797de7f6e68c";
+      hash = "sha256-uctp5rjY16X37BYzsZzg9AAgM2hwNVkcNxT1bCobb0I=";
+      stripLen = 2;
+    })
+  ];
+
+  nativeBuildInputs = [
+    cmake
+    (python.pythonOnBuildForHost.withPackages (ps: [ ps.setuptools ]))
+  ] ++ lib.optionals stdenv.isLinux [
+    autoPatchelfHook
+  ];
+
+  buildInputs = [
+    llvmPackages.llvm
+    llvmPackages.libclang
+    python.pkgs.qt6.qtbase
+    python.pkgs.ninja
+    python.pkgs.packaging
+    python.pkgs.setuptools
+  ];
+
+  cmakeFlags = [
+    "-DBUILD_TESTS=OFF"
+  ];
+
+  # We intentionally use single quotes around `${BASH}` since it expands from a CMake
+  # variable available in this file.
+  postPatch = ''
+    substituteInPlace cmake/ShibokenHelpers.cmake --replace '#!/bin/bash' '#!''${BASH}'
+  '';
+
+  # Due to Shiboken.abi3.so being linked to libshiboken6.abi3.so.6.6 in the build tree,
+  # we need to remove the build tree reference from the RPATH and then add the correct
+  # directory to the RPATH. On Linux, the second part is handled by autoPatchelfHook.
+  # https://bugreports.qt.io/browse/PYSIDE-2233
+  preFixup = ''
+    echo "fixing RPATH of Shiboken.abi3.so"
+  '' + lib.optionalString stdenv.isDarwin ''
+    install_name_tool -change {@rpath,$out/lib}/libshiboken6.abi3.6.6.dylib $out/${python.sitePackages}/shiboken6/Shiboken.abi3.so
+  '' + lib.optionalString stdenv.isLinux ''
+    patchelf $out/${python.sitePackages}/shiboken6/Shiboken.abi3.so --shrink-rpath --allowed-rpath-prefixes ${builtins.storeDir}
+  '';
+
+  postInstall = ''
+    cd ../../..
+    ${python.pythonOnBuildForHost.interpreter} setup.py egg_info --build-type=shiboken6
+    cp -r shiboken6.egg-info $out/${python.sitePackages}/
+  '';
+
+  dontWrapQtApps = true;
+
+  meta = with lib; {
+    description = "Generator for the pyside6 Qt bindings";
+    license = with licenses; [ lgpl3Only gpl2Only gpl3Only ];
+    homepage = "https://wiki.qt.io/Qt_for_Python";
+    maintainers = with maintainers; [ gebner Enzime ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/shiboken6/fix-include-qt-headers.patch b/nixpkgs/pkgs/development/python-modules/shiboken6/fix-include-qt-headers.patch
new file mode 100644
index 000000000000..4c6d7bdad3fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shiboken6/fix-include-qt-headers.patch
@@ -0,0 +1,80 @@
+--- a/ApiExtractor/clangparser/compilersupport.cpp
++++ b/ApiExtractor/clangparser/compilersupport.cpp
+@@ -16,6 +16,7 @@
+ #include <QtCore/QStandardPaths>
+ #include <QtCore/QStringList>
+ #include <QtCore/QVersionNumber>
++#include <QtCore/QRegularExpression>
+ 
+ #include <clang-c/Index.h>
+ 
+@@ -341,6 +342,13 @@ QByteArrayList emulatedCompilerOptions()
+ {
+     QByteArrayList result;
+     HeaderPaths headerPaths;
++
++    bool isNixDebug = qgetenv("NIX_DEBUG").toInt() > 0;
++    // examples:
++    // /nix/store/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-qtsensors-6.4.2-dev/include
++    // /nix/store/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-qtbase-6.4.2-dev/include
++    QRegularExpression qtHeaderRegex(uR"(/[0-9a-z]{32}-qt[a-z0-9]+-)"_s);
++
+     switch (compiler()) {
+     case Compiler::Msvc:
+         result.append(QByteArrayLiteral("-fms-compatibility-version=19.26.28806"));
+@@ -352,9 +360,30 @@ QByteArrayList emulatedCompilerOptions()
+             appendClangBuiltinIncludes(&headerPaths);
+         break;
+     case Compiler::Clang:
+-        headerPaths.append(gppInternalIncludePaths(compilerFromCMake(u"clang++"_s)));
++    // fix: error: cannot jump from switch statement to this case label: case Compiler::Gpp
++    // note: jump bypasses variable initialization: const HeaderPaths clangPaths =
++    {
++        //headerPaths.append(gppInternalIncludePaths(compilerFromCMake(u"clang++"_s)));
++        // fix: qt.shiboken: x is specified in typesystem, but not defined. This could potentially lead to compilation errors.
++        // PySide requires that Qt headers are not -isystem
++        // https://bugreports.qt.io/browse/PYSIDE-787
++        const HeaderPaths clangPaths = gppInternalIncludePaths(compilerFromCMake(u"clang++"_qs));
++        for (const HeaderPath &h : clangPaths) {
++            auto match = qtHeaderRegex.match(QString::fromUtf8(h.path));
++            if (!match.hasMatch()) {
++                if (isNixDebug)
++                    qDebug() << "shiboken compilersupport.cpp: found non-qt header: " << h.path;
++                // add using -isystem
++                headerPaths.append(h);
++            } else {
++                if (isNixDebug)
++                    qDebug() << "shiboken compilersupport.cpp: found qt header: " << h.path;
++                headerPaths.append({h.path, HeaderType::Standard});
++            }
++        }
+         result.append(noStandardIncludeOption());
+         break;
++    }
+     case Compiler::Gpp:
+         if (needsClangBuiltinIncludes())
+             appendClangBuiltinIncludes(&headerPaths);
+@@ -363,8 +392,20 @@ QByteArrayList emulatedCompilerOptions()
+         // <type_traits> etc (g++ 11.3).
+         const HeaderPaths gppPaths = gppInternalIncludePaths(compilerFromCMake(u"g++"_qs));
+         for (const HeaderPath &h : gppPaths) {
+-            if (h.path.contains("c++") || h.path.contains("sysroot"))
++            // fix: qt.shiboken: x is specified in typesystem, but not defined. This could potentially lead to compilation errors.
++            // PySide requires that Qt headers are not -isystem
++            // https://bugreports.qt.io/browse/PYSIDE-787
++            auto match = qtHeaderRegex.match(QString::fromUtf8(h.path));
++            if (!match.hasMatch()) {
++                if (isNixDebug)
++                    qDebug() << "shiboken compilersupport.cpp: found non-qt header: " << h.path;
++                // add using -isystem
+                 headerPaths.append(h);
++            } else {
++                if (isNixDebug)
++                    qDebug() << "shiboken compilersupport.cpp: found qt header: " << h.path;
++                headerPaths.append({h.path, HeaderType::Standard});
++            }
+         }
+         break;
+     }
+-- 
+2.39.0
diff --git a/nixpkgs/pkgs/development/python-modules/shippai/default.nix b/nixpkgs/pkgs/development/python-modules/shippai/default.nix
new file mode 100644
index 000000000000..e7efb1ef2dc6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shippai/default.nix
@@ -0,0 +1,19 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "shippai";
+  # Please make sure that vdirsyncer still builds if you update this package.
+  version = "0.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0r6iwvmay8ygn2m15pyjrk9am4mfpk7rkf0lcbcb15pnabixlyzj";
+  };
+
+  meta = with lib; {
+    description = "Use Rust failures as Python exceptions";
+    homepage = "https://github.com/untitaker/shippai";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gebner ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/shiv/default.nix b/nixpkgs/pkgs/development/python-modules/shiv/default.nix
new file mode 100644
index 000000000000..57e67567c7c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shiv/default.nix
@@ -0,0 +1,47 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, click
+, pip
+, setuptools
+, wheel
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "shiv";
+  version = "1.0.4";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-j2n3gXolRalMyOB6jsWXN1z4biwb0OWD7nU9bzH4UGA=";
+  };
+
+  propagatedBuildInputs = [ click pip setuptools wheel ];
+
+  pythonImportsCheck = [ "shiv" ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  disabledTests = [
+    # AssertionError
+    "test_hello_world"
+    "test_extend_pythonpath"
+    "test_multiple_site_packages"
+    "test_no_entrypoint"
+    "test_results_are_binary_identical_with_env_and_build_id"
+    "test_preamble"
+    "test_preamble_no_pip"
+    "test_alternate_root"
+    "test_alternate_root_environment_variable"
+  ];
+
+  meta = with lib; {
+    description = "Command line utility for building fully self contained Python zipapps";
+    homepage = "https://github.com/linkedin/shiv";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/shlib/default.nix b/nixpkgs/pkgs/development/python-modules/shlib/default.nix
new file mode 100644
index 000000000000..03c94140a54e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shlib/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, braceexpand
+, inform
+}:
+
+buildPythonPackage rec {
+  pname = "shlib";
+  version = "1.6";
+
+  src = fetchFromGitHub {
+    owner = "KenKundert";
+    repo = "shlib";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-f2jJgpjybutCpYnIT+RihtoA1YlXdhTs+MvV8bViSMQ=";
+  };
+
+  pythonImportsCheck = [ "shlib" ];
+  postPatch = ''
+    patchShebangs .
+  '';
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+  propagatedBuildInputs = [
+    braceexpand
+    inform
+  ];
+
+  meta = with lib; {
+    description = "shell library";
+    homepage = "https://github.com/KenKundert/shlib";
+    changelog = "https://github.com/KenKundert/shlib/releases/tag/v${version}";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ jpetrucciani ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/shodan/default.nix b/nixpkgs/pkgs/development/python-modules/shodan/default.nix
new file mode 100644
index 000000000000..0c4b1afb930c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shodan/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, click-plugins
+, colorama
+, fetchPypi
+, pythonOlder
+, requests
+, setuptools
+, tldextract
+, xlsxwriter
+}:
+
+buildPythonPackage rec {
+  pname = "shodan";
+  version = "1.30.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-vttujCtEWVksG8F7TUtX2rDLWKRVrVie4mpjBCQs1QU=";
+  };
+
+  propagatedBuildInputs = [
+    click-plugins
+    colorama
+    requests
+    setuptools
+    tldextract
+    xlsxwriter
+  ];
+
+  # The tests require a shodan api key, so skip them.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "shodan"
+  ];
+
+  meta = with lib; {
+    description = "Python library and command-line utility for Shodan";
+    homepage = "https://github.com/achillean/shodan-python";
+    changelog = "https://github.com/achillean/shodan-python/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab lihop ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/shortuuid/default.nix b/nixpkgs/pkgs/development/python-modules/shortuuid/default.nix
new file mode 100644
index 000000000000..fda1e1896a50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shortuuid/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "shortuuid";
+  version = "1.0.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/HXyYVkUgVqOTLFQGzpRN0XLZu8P1fxvufjD+jSB94k=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "shortuuid"
+  ];
+
+  meta = with lib; {
+    description = "Library to generate concise, unambiguous and URL-safe UUIDs";
+    homepage = "https://github.com/stochastic-technologies/shortuuid/";
+    changelog = "https://github.com/skorokithakis/shortuuid/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ zagy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/should-dsl/default.nix b/nixpkgs/pkgs/development/python-modules/should-dsl/default.nix
new file mode 100644
index 000000000000..7510ba88d1d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/should-dsl/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "should-dsl";
+  version = "2.1.2";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "should_dsl";
+    sha256 = "0ai30dxgygwzaj9sgdzyfr9p5b7gwc9piq59nzr4xy5x1zcm7xrn";
+  };
+
+  # There are no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Should assertions in Python as clear and readable as possible";
+    homepage = "http://www.should-dsl.info/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/shouldbe/default.nix b/nixpkgs/pkgs/development/python-modules/shouldbe/default.nix
new file mode 100644
index 000000000000..20634f4a9f02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shouldbe/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, pythonAtLeast
+, fetchPypi
+, nose
+, forbiddenfruit
+}:
+
+buildPythonPackage rec {
+  version = "0.1.2";
+  pname = "shouldbe";
+  # incompatible, https://github.com/DirectXMan12/should_be/issues/4
+  disabled = pythonAtLeast "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "16zbvjxf71dl4yfbgcr6idyim3mdrfvix1dv8b95p0s9z07372pj";
+  };
+
+  nativeCheckInputs = [ nose ];
+  propagatedBuildInputs = [ forbiddenfruit ];
+
+  meta = with lib; {
+    description = "Python Assertion Helpers inspired by Shouldly";
+    homepage =  "https://pypi.python.org/pypi/shouldbe/";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/show-in-file-manager/default.nix b/nixpkgs/pkgs/development/python-modules/show-in-file-manager/default.nix
new file mode 100644
index 000000000000..d5f95aa466b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/show-in-file-manager/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, importlib-metadata
+, packaging
+, pyxdg
+}:
+
+buildPythonPackage rec {
+  pname = "show-in-file-manager";
+  version = "1.1.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-FdFuSodbniF7A40C8CnDgAxKatZF4/c8nhB+omurOts=";
+  };
+
+  propagatedBuildInputs = [
+    packaging
+  ]
+  ++ lib.optional (stdenv.isLinux) pyxdg
+  ++ lib.optional (pythonOlder "3.8") importlib-metadata;
+
+  meta = with lib; {
+    homepage = "https://github.com/damonlynch/showinfilemanager";
+    description = "Open the system file manager and select files in it";
+    longDescription = ''
+      Show in File Manager is a Python package to open the system file
+      manager and optionally select files in it. The point is not to
+      open the files, but to select them in the file manager, thereby
+      highlighting the files and allowing the user to quickly do
+      something with them.
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/showit/default.nix b/nixpkgs/pkgs/development/python-modules/showit/default.nix
new file mode 100644
index 000000000000..bb74352b1a8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/showit/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, matplotlib
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "showit";
+  version = "1.1.4";
+
+  src = fetchFromGitHub {
+    owner = "freeman-lab";
+    repo = pname;
+    rev = "ef76425797c71fbe3795b4302c49ab5be6b0bacb"; # no tags in repo
+    sha256 = "0xd8isrlwwxlgji90lly1sq4l2a37rqvhsmyhv7bd3aj1dyjmdr6";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    matplotlib
+  ];
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest test
+  '';
+
+  meta = with lib; {
+    description = "simple and sensible display of images";
+    homepage = "https://github.com/freeman-lab/showit";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/shtab/default.nix b/nixpkgs/pkgs/development/python-modules/shtab/default.nix
new file mode 100644
index 000000000000..e50717d5a807
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shtab/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+, bashInteractive
+}:
+
+buildPythonPackage rec {
+  pname = "shtab";
+  version = "1.6.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "iterative";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-BMwi3a7CPq58G30XlkJdSfSP6oc6u2AuSPAwEExI9zM=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=shtab --cov-report=term-missing --cov-report=xml" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    bashInteractive
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "shtab"
+  ];
+
+  meta = with lib; {
+    description = "Module for shell tab completion of Python CLI applications";
+    homepage = "https://docs.iterative.ai/shtab/";
+    changelog = "https://github.com/iterative/shtab/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/shutilwhich/default.nix b/nixpkgs/pkgs/development/python-modules/shutilwhich/default.nix
new file mode 100644
index 000000000000..5bcd2bca8bdd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/shutilwhich/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "shutilwhich";
+  version = "1.1.0";
+
+  src = fetchFromGitHub {
+    owner = "mbr";
+    repo = pname;
+    rev = version;
+    sha256 = "05fwcjn86w8wprck04iv1zccfi39skdf0lhwpb4b9gpvklyc9mj0";
+  };
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    pytest -rs
+  '';
+
+  meta = with lib; {
+    description = "Backport of shutil.which";
+    license = licenses.psfl;
+    homepage = "https://github.com/mbr/shutilwhich";
+    maintainers = with maintainers; [ multun ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sievelib/default.nix b/nixpkgs/pkgs/development/python-modules/sievelib/default.nix
new file mode 100644
index 000000000000..1bb13e6cc3d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sievelib/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, pytestCheckHook
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "sievelib";
+  version = "1.2.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7cubQWqYWjzFt9f01+wBPjcuv5DmTJ2eAOIDEpmvOP0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sievelib"
+  ];
+
+  meta = with lib; {
+    description = "Client-side Sieve and Managesieve library written in Python";
+    longDescription = ''
+      A library written in Python that implements RFC 5228 (Sieve: An Email
+      Filtering Language) and RFC 5804 (ManageSieve: A Protocol for
+      Remotely Managing Sieve Scripts), as well as the following extensions:
+
+       * Copying Without Side Effects (RFC 3894)
+       * Body (RFC 5173)
+       * Date and Index (RFC 5260)
+       * Vacation (RFC 5230)
+       * Imap4flags (RFC 5232)
+    '';
+    homepage = "https://github.com/tonioo/sievelib";
+    license = licenses.mit;
+    maintainers = with maintainers; [ leenaars ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/signalslot/default.nix b/nixpkgs/pkgs/development/python-modules/signalslot/default.nix
new file mode 100644
index 000000000000..98e3a15eec57
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/signalslot/default.nix
@@ -0,0 +1,58 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, pythonRelaxDepsHook
+, contexter
+, eventlet
+, mock
+, pytest-xdist
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "signalslot";
+  version = "0.2.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ZNodibNGfCOa8xd3myN+cRa28rY3/ynNUia1kwjTIOU=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--pep8 --cov" "" \
+      --replace "--cov-report html" ""
+  '';
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    contexter
+    six
+  ];
+
+  pythonRemoveDeps = [
+    "weakrefmethod" # needed until https://github.com/Numergy/signalslot/pull/17
+  ];
+
+  nativeCheckInputs = [
+    eventlet
+    mock
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "signalslot" ];
+
+  meta = with lib; {
+    description = "Simple Signal/Slot implementation";
+    homepage = "https://github.com/numergy/signalslot";
+    license = licenses.mit;
+    maintainers = with maintainers; [ myaats ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/signedjson/default.nix b/nixpkgs/pkgs/development/python-modules/signedjson/default.nix
new file mode 100644
index 000000000000..e57a86c37f21
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/signedjson/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, canonicaljson
+, fetchPypi
+, importlib-metadata
+, pynacl
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, typing-extensions
+, unpaddedbase64
+}:
+
+buildPythonPackage rec {
+  pname = "signedjson";
+  version = "1.1.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zZHFavU/Fp7wMsYunEoyktwViGaTMxjQWS40Yts9ZJI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    canonicaljson
+    unpaddedbase64
+    pynacl
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "signedjson"
+  ];
+
+  meta = with lib; {
+    description = "Sign JSON with Ed25519 signatures";
+    homepage = "https://github.com/matrix-org/python-signedjson";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/signify/certificate-expiration-date.patch b/nixpkgs/pkgs/development/python-modules/signify/certificate-expiration-date.patch
new file mode 100644
index 000000000000..6554211a4bc7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/signify/certificate-expiration-date.patch
@@ -0,0 +1,18 @@
+diff --git a/tests/test_authenticode.py b/tests/test_authenticode.py
+index 7e2c709..2f27e09 100644
+--- a/tests/test_authenticode.py
++++ b/tests/test_authenticode.py
+@@ -153,10 +153,12 @@ class AuthenticodeParserTestCase(unittest.TestCase):
+         """this certificate is revoked"""
+         with open(str(root_dir / "test_data" / "jameslth"), "rb") as f:
+             pefile = SignedPEFile(f)
+-            pefile.verify()
++            pefile.verify(verification_context_kwargs=
++                          {'timestamp': datetime.datetime(2021, 1, 1, tzinfo=datetime.timezone.utc)})
+
+     def test_jameslth_revoked(self):
+         """this certificate is revoked"""
++        # TODO: this certificate is now expired, so it will not show up as valid anyway
+         with open(str(root_dir / "test_data" / "jameslth"), "rb") as f:
+             pefile = SignedPEFile(f)
+             with self.assertRaises(VerificationError):
diff --git a/nixpkgs/pkgs/development/python-modules/signify/default.nix b/nixpkgs/pkgs/development/python-modules/signify/default.nix
new file mode 100644
index 000000000000..85e4d4668e5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/signify/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, asn1crypto
+, buildPythonPackage
+, certvalidator
+, fetchFromGitHub
+, mscerts
+, oscrypto
+, pyasn1
+, pyasn1-modules
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "signify";
+  version = "0.5.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "ralphje";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+UhZF+QYuv8pq/sTu7GDPUrlPNNixFgVZL+L0ulj/ko=";
+  };
+
+  propagatedBuildInputs = [
+    asn1crypto
+    certvalidator
+    mscerts
+    oscrypto
+    pyasn1
+    pyasn1-modules
+  ];
+
+  pythonImportsCheck = [
+    "signify"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # chain doesn't validate because end-entitys certificate expired
+    # https://github.com/ralphje/signify/issues/27
+    "test_revoked_certificate"
+  ];
+
+  meta = with lib; {
+    description = "library that verifies PE Authenticode-signed binaries";
+    homepage = "https://github.com/ralphje/signify";
+    license = licenses.mit;
+    maintainers = with maintainers; [ baloo ];
+    # No support for pyasn1 > 0.5
+    # https://github.com/ralphje/signify/issues/37
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sigrok/default.nix b/nixpkgs/pkgs/development/python-modules/sigrok/default.nix
new file mode 100644
index 000000000000..b8b925ba6b16
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sigrok/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, stdenv
+, libsigrok
+, toPythonModule
+, python
+, autoreconfHook
+, pythonImportsCheckHook
+, pythonCatchConflictsHook
+, swig
+, setuptools
+, numpy
+, pygobject3
+}:
+
+# build libsigrok plus its Python bindings. Unfortunately it does not appear
+# to be possible to build them separately, at least not easily.
+toPythonModule ((libsigrok.override {
+  inherit python;
+}).overrideAttrs (orig: {
+  pname = "${python.libPrefix}-sigrok";
+
+  patches = orig.patches or [] ++ [
+    # Makes libsigrok install the bindings into site-packages properly (like
+    # we expect) instead of making a version-specific *.egg subdirectory.
+    ./python-install.patch
+  ];
+
+  nativeBuildInputs = orig.nativeBuildInputs or [] ++ [
+    autoreconfHook
+    setuptools
+    swig
+    numpy
+  ] ++ lib.optionals (stdenv.hostPlatform == stdenv.buildPlatform) [
+    pythonImportsCheckHook
+    pythonCatchConflictsHook
+  ];
+
+  buildInputs = orig.buildInputs or [] ++ [
+    pygobject3 # makes headers available the configure script checks for
+  ];
+
+  propagatedBuildInputs = orig.propagatedBuildInputs or [] ++ [
+    pygobject3
+    numpy
+  ];
+
+  postInstall = ''
+    ${orig.postInstall or ""}
+
+    # for pythonImportsCheck
+    export PYTHONPATH="$out/${python.sitePackages}:$PYTHONPATH"
+  '';
+
+  pythonImportsCheck = [ "sigrok" "sigrok.core" ];
+
+  meta = orig.meta // {
+    description = "Python bindings for libsigrok";
+    maintainers = orig.meta.maintainers ++ [
+      lib.maintainers.sternenseemann
+    ];
+  };
+}))
diff --git a/nixpkgs/pkgs/development/python-modules/sigrok/python-install.patch b/nixpkgs/pkgs/development/python-modules/sigrok/python-install.patch
new file mode 100644
index 000000000000..9c25eab6f39a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sigrok/python-install.patch
@@ -0,0 +1,16 @@
+diff --git a/Makefile.am b/Makefile.am
+index 280cf64d..e10eb79f 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -888,8 +888,9 @@ $(PDIR)/timestamp: $(PDIR)/sigrok/core/classes.i \
+ 
+ python-install:
+ 	$(AM_V_at)$(MKDIR_P) "$(DESTDIR)$(prefix)" "$(DESTDIR)$(exec_prefix)"
+-	destdir='$(DESTDIR)'; $(setup_py) install $${destdir:+"--root=$$destdir"} \
+-		--prefix "$(prefix)" --exec-prefix "$(exec_prefix)"
++	destdir='$(DESTDIR)'; $(setup_py) install --root=$${destdir:-/} \
++		--prefix "$(prefix)" --exec-prefix "$(exec_prefix)" \
++		--single-version-externally-managed
+ 
+ python-clean:
+ 	-$(AM_V_at)rm -f $(PDIR)/timestamp
diff --git a/nixpkgs/pkgs/development/python-modules/sigstore-protobuf-specs/default.nix b/nixpkgs/pkgs/development/python-modules/sigstore-protobuf-specs/default.nix
new file mode 100644
index 000000000000..be58c8b5f4cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sigstore-protobuf-specs/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, pythonOlder
+, flit-core
+, fetchPypi
+, buildPythonPackage
+, betterproto
+}:
+
+buildPythonPackage rec {
+  pname = "sigstore-protobuf-specs";
+  version = "0.2.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "sigstore_protobuf_specs";
+    inherit version;
+    hash = "sha256-wFwedHioCvDH3qnMLRHwR4JuTAKVc9VkE394jhE3c5E=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    betterproto
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sigstore_protobuf_specs"
+  ];
+
+  meta = with lib; {
+    description = "Library for serializing and deserializing Sigstore messages";
+    homepage = "https://pypi.org/project/sigstore-protobuf-specs/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sigstore-rekor-types/default.nix b/nixpkgs/pkgs/development/python-modules/sigstore-rekor-types/default.nix
new file mode 100644
index 000000000000..a58595ed19a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sigstore-rekor-types/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, pythonOlder
+, pydantic
+, flit-core
+, fetchFromGitHub
+, buildPythonPackage
+}:
+
+buildPythonPackage rec {
+  pname = "sigstore-rekor-types";
+  version = "0.0.11";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "trailofbits";
+    repo = "sigstore-rekor-types";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-oOFdRiDp9USc3A+aaPExprEO2i/RERNahiyi2kVpkns=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    pydantic
+  ] ++ pydantic.optional-dependencies.email;
+
+  # Module has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python models for Rekor's API types";
+    homepage = "https://github.com/trailofbits/sigstore-rekor-types";
+    changelog = "https://github.com/trailofbits/sigstore-rekor-types/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sigtools/default.nix b/nixpkgs/pkgs/development/python-modules/sigtools/default.nix
new file mode 100644
index 000000000000..87dc4e91e6e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sigtools/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchPypi
+, mock
+, pythonOlder
+, repeated-test
+, setuptools-scm
+, sphinx
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sigtools";
+  version = "4.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-S44TWpzU0uoA2mcMCTNy105nK6OruH9MmNjnPepURFw=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+  ];
+
+  nativeCheckInputs = [
+    mock
+    repeated-test
+    sphinx
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sigtools"
+  ];
+
+  meta = with lib; {
+    description = "Utilities for working with inspect.Signature objects";
+    homepage = "https://sigtools.readthedocs.io/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simanneal/default.nix b/nixpkgs/pkgs/development/python-modules/simanneal/default.nix
new file mode 100644
index 000000000000..6145279c3258
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simanneal/default.nix
@@ -0,0 +1,23 @@
+{ lib, fetchFromGitHub, buildPythonPackage, pytest }:
+
+buildPythonPackage rec {
+  pname = "simanneal";
+  version = "0.5.0";
+
+  src = fetchFromGitHub {
+    owner = "perrygeo";
+    repo = "simanneal";
+    rev = version;
+    hash = "sha256-yKZHkrf6fM0WsHczIEK5Kxusz5dSBgydK3fLu1nDyvk=";
+  };
+
+  nativeCheckInputs = [ pytest ];
+  checkPhase = "pytest tests";
+
+  meta = with lib; {
+    description = "A python implementation of the simulated annealing optimization technique";
+    homepage = "https://github.com/perrygeo/simanneal";
+    license = licenses.isc;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simber/default.nix b/nixpkgs/pkgs/development/python-modules/simber/default.nix
new file mode 100644
index 000000000000..c5e3a8ef2210
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simber/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, colorama
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "simber";
+  version = "0.2.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "deepjyoti30";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-kHoFZD7nhVxJu9MqePLkL7KTG2saPecY9238c/oeEco=";
+  };
+
+  propagatedBuildInputs = [
+    colorama
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "simber"
+  ];
+
+  meta = with lib; {
+    description = "Simple, minimal and powerful logger for Python";
+    homepage = "https://github.com/deepjyoti30/simber";
+    changelog = "https://github.com/deepjyoti30/simber/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ j0hax ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simpful/default.nix b/nixpkgs/pkgs/development/python-modules/simpful/default.nix
new file mode 100644
index 000000000000..2060210a3bd8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simpful/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, matplotlib
+, numpy
+, pytestCheckHook
+, pythonOlder
+, requests
+, scipy
+, seaborn
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "simpful";
+  version = "2.11.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aresio";
+    repo = "simpful";
+    rev = "refs/tags/${version}";
+    hash = "sha256-54WkKnPB3xA2CaOpmasqxgDoga3uAqoC1nOivytXmGY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    requests
+  ];
+
+  passthru.optional-dependencies = {
+    plotting = [
+      matplotlib
+      seaborn
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "simpful"
+  ];
+
+  meta = with lib; {
+    description = "Library for fuzzy logic";
+    homepage = "https://github.com/aresio/simpful";
+    changelog = "https://github.com/aresio/simpful/releases/tag/${version}";
+    license = with licenses; [ lgpl3Only ];
+    maintainers = with maintainers; [ fab ];
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simple-di/default.nix b/nixpkgs/pkgs/development/python-modules/simple-di/default.nix
new file mode 100644
index 000000000000..79437c4a0b34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simple-di/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, setuptools
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "simple-di";
+  version = "0.1.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "simple_di";
+    inherit version;
+    hash = "sha256-GSuZne5M1PsRpdhhFlyq0C2PBhfA+Ab8Wwn5BfGgPKA=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [
+    "simple_di"
+  ];
+
+  # pypi distribution contains no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Simple dependency injection library";
+    homepage = "https://github.com/bentoml/simple_di";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ sauyon ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simple-rest-client/default.nix b/nixpkgs/pkgs/development/python-modules/simple-rest-client/default.nix
new file mode 100644
index 000000000000..325454c30ea7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simple-rest-client/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, pytest-asyncio
+, pytest-httpserver
+, pytestCheckHook
+, python-slugify
+, python-status
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "simple-rest-client";
+  version = "1.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "allisson";
+    repo = "python-simple-rest-client";
+    rev = version;
+    hash = "sha256-IaLo7nBMIabi4ZjZ4ZLJliCL/dzidaCBCmn0cq7Fzdw=";
+  };
+
+  propagatedBuildInputs = [
+    httpx
+    python-slugify
+    python-status
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-httpserver
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest-runner" ""
+    substituteInPlace pytest.ini \
+      --replace " --cov=simple_rest_client --cov-report=term-missing" ""
+    substituteInPlace requirements-dev.txt \
+      --replace "asyncmock" ""
+  '';
+
+  disabledTestPaths = [
+    "tests/test_decorators.py"
+  ];
+
+  pythonImportsCheck = [
+    "simple_rest_client"
+  ];
+
+  meta = with lib; {
+    description = "Simple REST client for Python";
+    homepage = "https://github.com/allisson/python-simple-rest-client";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simple-rlp/default.nix b/nixpkgs/pkgs/development/python-modules/simple-rlp/default.nix
new file mode 100644
index 000000000000..06837ba1f342
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simple-rlp/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "simple-rlp";
+  version = "0.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-LfHSt2nwoBd9JiMauL4W5l41RrF7sKmkkO/TUXwIKHY=";
+  };
+
+  pythonImportsCheck = [ "rlp" ];
+
+  meta = with lib; {
+    description = "Simple RLP (Recursive Length Prefix)";
+    homepage = "https://github.com/SamuelHaidu/simple-rlp";
+    license = licenses.mit;
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simple-salesforce/default.nix b/nixpkgs/pkgs/development/python-modules/simple-salesforce/default.nix
new file mode 100644
index 000000000000..10d5f64385a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simple-salesforce/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, more-itertools
+, pendulum
+, pyjwt
+, pytestCheckHook
+, pythonOlder
+, pytz
+, requests
+, responses
+, setuptools
+, zeep
+}:
+
+buildPythonPackage rec {
+  pname = "simple-salesforce";
+  version = "1.12.5";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "simple-salesforce";
+    repo = "simple-salesforce";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-mj7lbBGEybsEzWo4TYmPrN3mBXItdo/JomVIYmzIDAY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    more-itertools
+    pendulum
+    pyjwt
+    requests
+    zeep
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytz
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "simple_salesforce"
+  ];
+
+  meta = with lib; {
+    description = "A very simple Salesforce.com REST API client for Python";
+    homepage = "https://github.com/simple-salesforce/simple-salesforce";
+    changelog = "https://github.com/simple-salesforce/simple-salesforce/blob/v${version}/CHANGES";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simple-websocket-server/default.nix b/nixpkgs/pkgs/development/python-modules/simple-websocket-server/default.nix
new file mode 100644
index 000000000000..7228e6d9f3e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simple-websocket-server/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchFromGitHub }:
+
+buildPythonPackage {
+  pname = "simple-websocket-server";
+  version = "20180414";
+  src = fetchFromGitHub {
+    owner = "dpallot";
+    repo = "simple-websocket-server";
+    rev = "34e6def93502943d426fb8bb01c6901341dd4fe6";
+    sha256 = "19rcpdx4vxg9is1cpyh9m9br5clyzrpb7gyfqsl0g3im04m098n5";
+  };
+
+  doCheck = false; # no tests
+
+  meta = with lib; {
+    description = "A python based websocket server that is simple and easy to use";
+    homepage = "https://github.com/dpallot/simple-websocket-server/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rvolosatovs ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simple-websocket/default.nix b/nixpkgs/pkgs/development/python-modules/simple-websocket/default.nix
new file mode 100644
index 000000000000..5af426fb5ba2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simple-websocket/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, setuptools
+, wheel
+, wsproto
+}:
+
+buildPythonPackage rec {
+  pname = "simple-websocket";
+  version = "1.0.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "miguelgrinberg";
+    repo = "simple-websocket";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-5dUZnbjHzH1sQ93CbFdEoW9j2zY4Z+8wNsYfmOrgC8E=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    wsproto
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "simple_websocket"
+  ];
+
+  meta = with lib; {
+    description = "Simple WebSocket server and client for Python";
+    homepage = "https://github.com/miguelgrinberg/simple-websocket";
+    changelog = "https://github.com/miguelgrinberg/simple-websocket/blob/${version}/CHANGES.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simpleaudio/default.nix b/nixpkgs/pkgs/development/python-modules/simpleaudio/default.nix
new file mode 100644
index 000000000000..4ab18efe332a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simpleaudio/default.nix
@@ -0,0 +1,24 @@
+{ alsa-lib, buildPythonPackage, fetchFromGitHub, isPy27, lib }:
+
+buildPythonPackage rec {
+  pname = "simpleaudio";
+  version = "1.0.4";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "hamiltron";
+    repo = "py-simple-audio";
+    rev = version;
+    sha256 = "12nypzb1m14yip4zrbzin5jc5awyp1d5md5y40g5anj4phb4hx1i";
+  };
+
+  buildInputs = [ alsa-lib ];
+
+  meta = with lib; {
+    homepage = "https://github.com/hamiltron/py-simple-audio";
+    description =
+      "A simple audio playback Python extension - cross-platform, asynchronous, dependency-free";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lucus16 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simplebayes/default.nix b/nixpkgs/pkgs/development/python-modules/simplebayes/default.nix
new file mode 100644
index 000000000000..40bc248d8a0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simplebayes/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, mock
+, isPy3k
+}:
+
+buildPythonPackage {
+  pname = "simplebayes";
+  version = "1.5.8";
+
+  # Use GitHub instead of pypi, because it contains tests.
+  src = fetchFromGitHub {
+    repo = "simplebayes";
+    owner = "hickeroar";
+    # NOTE: This is actually 1.5.8 but the tag is wrong!
+    rev = "1.5.7";
+    sha256 = "0mp7rvfdmpfxnka4czw3lv5kkh6gdxh6dm4r6hcln1zzfg9lxp4h";
+  };
+
+  nativeCheckInputs = [ nose mock ];
+
+  postPatch = lib.optionalString isPy3k ''
+    sed -i -e 's/open *(\([^)]*\))/open(\1, encoding="utf-8")/' setup.py
+  '';
+
+  checkPhase = "nosetests tests/test.py";
+
+  meta = with lib; {
+    description = "Memory-based naive bayesian text classifier";
+    homepage = "https://github.com/hickeroar/simplebayes";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simpleeval/default.nix b/nixpkgs/pkgs/development/python-modules/simpleeval/default.nix
new file mode 100644
index 000000000000..57693fb3791c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simpleeval/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "simpleeval";
+  version = "0.9.13";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "danthedeckie";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-I1GILYPE6OyotgRe0Ek/iHHv6q9/b/MlcTxMAtfZD80=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "test_simpleeval.py"
+  ];
+
+  pythonImportsCheck = [
+    "simpleeval"
+  ];
+
+  meta = with lib; {
+    description = "Simple, safe single expression evaluator library";
+    homepage = "https://github.com/danthedeckie/simpleeval";
+    changelog = "https://github.com/danthedeckie/simpleeval/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ johbo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simplefix/default.nix b/nixpkgs/pkgs/development/python-modules/simplefix/default.nix
new file mode 100644
index 000000000000..329c1ba313e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simplefix/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "simplefix";
+  version = "1.0.17";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    repo = "simplefix";
+    owner = "da4089";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-D85JW3JRQ1xErw6krMbAg94WYjPi76Xqjv/MGNMY5ZU=";
+  };
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "simplefix"
+  ];
+
+  unittestFlagsArray = [
+    "-s"
+    "test"
+  ];
+
+  meta = with lib; {
+    description = "Simple FIX Protocol implementation for Python";
+    homepage = "https://github.com/da4089/simplefix";
+    changelog = "https://github.com/da4089/simplefix/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ catern ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simplegeneric/default.nix b/nixpkgs/pkgs/development/python-modules/simplegeneric/default.nix
new file mode 100644
index 000000000000..ea320a2ad5af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simplegeneric/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "simplegeneric";
+  version = "0.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "dc972e06094b9af5b855b3df4a646395e43d1c9d0d39ed345b7393560d0b9173";
+  };
+
+  meta = {
+    description = "Simple generic functions";
+    homepage = "http://cheeseshop.python.org/pypi/simplegeneric";
+    license = lib.licenses.zpl21;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simplehound/default.nix b/nixpkgs/pkgs/development/python-modules/simplehound/default.nix
new file mode 100644
index 000000000000..307010f3feaf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simplehound/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, requests
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "simplehound";
+  version = "0.6";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "robmarkcole";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1b5m3xjmk0l6ynf0yvarplsfsslgklalfcib7sikxg3v5hiv9qwh";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  nativeCheckInputs = [
+    requests-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "simplehound" ];
+
+  meta = with lib; {
+    description = "Python API for Sighthound";
+    homepage = "https://github.com/robmarkcole/simplehound";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simpleitk/default.nix b/nixpkgs/pkgs/development/python-modules/simpleitk/default.nix
new file mode 100644
index 000000000000..e07e6e994d43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simpleitk/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, cmake
+, swig4
+, elastix
+, itk
+, numpy
+, simpleitk
+, scikit-build
+}:
+
+buildPythonPackage rec {
+  inherit (simpleitk) pname version src meta;
+  format = "pyproject";
+  disabled = pythonOlder "3.8";
+
+  sourceRoot = "${src.name}/Wrapping/Python";
+  preBuild = ''
+    make
+  '';
+
+  nativeBuildInputs = [
+    cmake
+    swig4
+    scikit-build
+  ];
+  propagatedBuildInputs = [
+    elastix
+    itk
+    simpleitk
+    numpy
+  ];
+
+  pythonImportsCheck = [ "SimpleITK" ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simplejson/default.nix b/nixpkgs/pkgs/development/python-modules/simplejson/default.nix
new file mode 100644
index 000000000000..b136d9e94dac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simplejson/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "simplejson";
+  version = "3.19.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+HHtU6sxxwISciLxiwa5m1zj7h/SLDmRxOZNqW5FQSY=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  doCheck = !stdenv.isDarwin;
+
+  pythonImportsCheck = [
+    "simplejson"
+  ];
+
+  meta = with lib; {
+    description = "Extensible JSON encoder/decoder for Python";
+    longDescription = ''
+      simplejson covers the full JSON specification for both encoding
+      and decoding, with unicode support. By default, encoding is done
+      in an encoding neutral fashion (plain ASCII with \uXXXX escapes
+      for unicode characters).
+    '';
+    homepage = "https://github.com/simplejson/simplejson";
+    changelog = "https://github.com/simplejson/simplejson/blob/v${version}/CHANGES.txt";
+    license = with licenses; [ mit afl21 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simplekml/default.nix b/nixpkgs/pkgs/development/python-modules/simplekml/default.nix
new file mode 100644
index 000000000000..0d5020c59958
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simplekml/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "simplekml";
+  version = "1.3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "cda687be2754395fcab664e908ebf589facd41e8436d233d2be37a69efb1c536";
+  };
+
+  # no tests are defined in 1.3.5
+  doCheck = false;
+  pythonImportsCheck = [ "simplekml" ];
+
+  meta = with lib; {
+    description = "Python package to generate KML";
+    homepage =  "https://simplekml.readthedocs.io/";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ rvolosatovs ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simplekv/default.nix b/nixpkgs/pkgs/development/python-modules/simplekv/default.nix
new file mode 100644
index 000000000000..12e2449b04c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simplekv/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, dulwich
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "simplekv";
+  version = "0.14.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mbr";
+    repo = "simplekv";
+    rev = "refs/tags/${version}";
+    hash = "sha256-seUGDj2q84+AjDFM1pxMLlHbe9uBgEhmqA96UHjnCmo=";
+  };
+
+  nativeCheckInputs = [
+    dulwich
+    mock
+    pytestCheckHook
+    six
+  ];
+
+  pythonImportsCheck = [
+    "simplekv"
+  ];
+
+  disabledTests = [
+    # Issue with fixture
+    "test_concurrent_mkdir"
+  ];
+
+  meta = with lib; {
+    description = "A simple key-value store for binary data";
+    homepage = "https://github.com/mbr/simplekv";
+    changelog = "https://github.com/mbr/simplekv/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simplemma/default.nix b/nixpkgs/pkgs/development/python-modules/simplemma/default.nix
new file mode 100644
index 000000000000..6c7f5f7c1afb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simplemma/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "simplemma";
+  version = "0.9.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "adbar";
+    repo = "simplemma";
+    rev = "v${version}";
+    hash = "sha256-2IvAJ+tRnlYISymYXznCGAoUTKkM/PoYwpZpuMSXRYQ=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "simplemma"
+  ];
+
+  meta = with lib; {
+    description = "Simple multilingual lemmatizer for Python, especially useful for speed and efficiency";
+    homepage = "https://github.com/adbar/simplemma";
+    license = licenses.mit;
+    maintainers = with maintainers; [ paveloom ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simplenote/default.nix b/nixpkgs/pkgs/development/python-modules/simplenote/default.nix
new file mode 100644
index 000000000000..5cde9b794cdf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simplenote/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "simplenote";
+  version = "2.1.4";
+
+  src = fetchFromGitHub {
+    owner = "simplenote-vim";
+    repo = "simplenote.py";
+    rev = "v${version}";
+    sha256 = "1grvvgzdybhxjydalnsgh2aaz3f48idv5lqs48gr0cn7n18xwhd5";
+  };
+
+   propagatedBuildInputs = [ ];
+
+   meta = with lib; {
+    description = "A python library for the simplenote.com web service";
+    homepage = "http://readthedocs.org/docs/simplenotepy/en/latest/api.html";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+   };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simplepush/default.nix b/nixpkgs/pkgs/development/python-modules/simplepush/default.nix
new file mode 100644
index 000000000000..e7461a850b30
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simplepush/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pythonOlder
+, requests
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "simplepush";
+  version = "2.2.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "simplepush";
+    repo = "simplepush-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-DvDPihhx1rzJN6iQP5rHluplJ1AaN0b/glcd+tZCues=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    cryptography
+    requests
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "simplepush"
+  ];
+
+  meta = with lib; {
+    description = "Module to send push notifications via Simplepush";
+    homepage = "https://github.com/simplepush/simplepush-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simplesat/default.nix b/nixpkgs/pkgs/development/python-modules/simplesat/default.nix
new file mode 100644
index 000000000000..406283fc8b09
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simplesat/default.nix
@@ -0,0 +1,48 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, writeText
+, lib
+, attrs
+, six
+, okonomiyaki
+}:
+
+let
+  version = "0.8.2";
+
+  versionFile = writeText "simplesat_ver" ''
+    version = '${version}'
+    full_version = '${version}'
+    git_revision = '0000000000000000000000000000000000000000'
+    is_released = True
+    msi_version = '${version}.000'
+    version_info = (${lib.versions.major version}, ${lib.versions.minor version}, ${lib.versions.patch version}, 'final', 0)
+  '';
+
+in buildPythonPackage rec {
+  pname = "simplesat";
+  inherit version;
+
+  propagatedBuildInputs = [ attrs six okonomiyaki ];
+
+  src = fetchFromGitHub {
+    owner = "enthought";
+    repo = "sat-solver";
+    rev = "v${version}";
+    hash = "sha256-6BQn1W2JGrMmNqgxi+sXx06XzNMcvwqYGMkpD0SSpT8=";
+  };
+
+  preConfigure = ''
+    cp ${versionFile} simplesat/_version.py
+  '';
+  dontUseSetuptoolsCheck = true;
+
+  pythonImportsCheck = [ "simplesat" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/enthought/sat-solver";
+    description = "Prototype for SAT-based dependency handling";
+    maintainers = with maintainers; [ genericnerdyusername ];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simplisafe-python/default.nix b/nixpkgs/pkgs/development/python-modules/simplisafe-python/default.nix
new file mode 100644
index 000000000000..6863d1f1a889
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simplisafe-python/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, aiohttp
+, aresponses
+, backoff
+, beautifulsoup4
+, buildPythonPackage
+, docutils
+, fetchFromGitHub
+, poetry-core
+, pytest-aiohttp
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, pytz
+, types-pytz
+, voluptuous
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "simplisafe-python";
+  version = "2023.10.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bachya";
+    repo = "simplisafe-python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-U3SbaR8PTTvoAMu65+LAHSwTmR7iwqiidbefW8bNSCo=";
+  };
+
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    backoff
+    beautifulsoup4
+    docutils
+    pytz
+    voluptuous
+    websockets
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-aiohttp
+    pytest-asyncio
+    pytestCheckHook
+    types-pytz
+  ];
+
+  disabledTests = [
+    # simplipy/api.py:253: InvalidCredentialsError
+    "test_request_error_failed_retry"
+    "test_update_error"
+    # ClientConnectorError: Cannot connect to host auth.simplisafe.com:443 ssl:default [Temporary failure in name resolution]
+    "test_client_async_from_refresh_token_unknown_error"
+  ];
+
+  disabledTestPaths = [
+    # Ignore the examples as they are prefixed with test_
+    "examples/"
+  ];
+
+  pythonImportsCheck = [
+    "simplipy"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    changelog = "https://github.com/bachya/simplisafe-python/releases/tag/${version}";
+    description = "Python library the SimpliSafe API";
+    homepage = "https://simplisafe-python.readthedocs.io/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/simpy/default.nix b/nixpkgs/pkgs/development/python-modules/simpy/default.nix
new file mode 100644
index 000000000000..e1544a0b89a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/simpy/default.nix
@@ -0,0 +1,41 @@
+{ buildPythonPackage
+, fetchPypi
+, isPy27
+, lib
+, setuptools
+, setuptools-scm
+, py
+, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "simpy";
+  version = "4.0.2";
+  format = "setuptools";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-bYrcAinfawL7fibc0TOHA7T09j8WelrCpyE8uAq6RIQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    py
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    homepage = "https://simpy.readthedocs.io/en/${version}/";
+    description = "Process-based discrete-event simulation framework based on standard Python";
+    license = [ licenses.mit ];
+    maintainers = with maintainers; [ dmrauh shlevy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/single-source/default.nix b/nixpkgs/pkgs/development/python-modules/single-source/default.nix
new file mode 100644
index 000000000000..3bf2ff810d50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/single-source/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, importlib-metadata
+, poetry-core
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "single-source";
+  version = "0.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rabbit72";
+    repo = "single-source";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-bhfMRIeJUd5JhN2tPww7fdbmHQ7ypcsZrYSa55v0+W8=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "single_source"
+  ];
+
+  meta = with lib; {
+    description = "Access to the project version in Python code for PEP 621-style projects";
+    homepage = "https://github.com/rabbit72/single-source";
+    changelog = "https://github.com/rabbit72/single-source/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/single-version/default.nix b/nixpkgs/pkgs/development/python-modules/single-version/default.nix
new file mode 100644
index 000000000000..558126bbbd71
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/single-version/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "single-version";
+  version = "1.6.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "hongquan";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-dUmJhNCPuq/7WGzFQXLjb8JrQgQn7qyBqzPWaKzD9hc=";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "single_version" ];
+
+  meta = with lib; {
+    description = "Utility to let you have a single source of version in your code base";
+    homepage = "https://github.com/hongquan/single-version";
+    license = licenses.mit;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/siobrultech-protocols/default.nix b/nixpkgs/pkgs/development/python-modules/siobrultech-protocols/default.nix
new file mode 100644
index 000000000000..e21580162cfe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/siobrultech-protocols/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "siobrultech-protocols";
+  version = "0.13.0";
+
+  disabled = pythonOlder "3.8";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "sdwilsh";
+    repo = "siobrultech-protocols";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-6BGhelyv0FoPyGwzgIX5Gbbu9Ks19MtL1AZQRZWKzhM=";
+  };
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    pyyaml
+  ];
+
+  pythonImportsCheck = [
+    "siobrultech_protocols.gem.api"
+    "siobrultech_protocols.gem.protocol"
+  ];
+
+  meta = with lib; {
+    description = "A Sans-I/O Python client library for Brultech Devices";
+    homepage = "https://github.com/sdwilsh/siobrultech-protocols";
+    changelog = "https://github.com/sdwilsh/siobrultech-protocols/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/siosocks/default.nix b/nixpkgs/pkgs/development/python-modules/siosocks/default.nix
new file mode 100644
index 000000000000..7af2a1118c31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/siosocks/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest-asyncio
+, pytest-trio
+, pytestCheckHook
+, pythonOlder
+, trio
+}:
+
+buildPythonPackage rec {
+  pname = "siosocks";
+  version = "0.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uja79vWhPYOhhTUBIh+XpS4GnrYJy0/XpDXXQjnyHWM=";
+  };
+
+  propagatedBuildInputs = [
+    trio
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    pytest-trio
+  ];
+
+  disabledTests = [
+    # network access
+    "test_connection_direct_success"
+    "test_connection_socks_success"
+    "test_connection_socks_failed"
+  ];
+
+  disabledTestPaths = [
+    # Timeout on Hydra
+    "tests/test_trio.py"
+    "tests/test_sansio.py"
+    "tests/test_socketserver.py"
+  ];
+
+  pythonImportsCheck = [
+    "siosocks"
+  ];
+
+  meta = with lib; {
+    description = "Python socks 4/5 client/server library/framework";
+    homepage = "https://github.com/pohmelie/siosocks";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sip/4.x.nix b/nixpkgs/pkgs/development/python-modules/sip/4.x.nix
new file mode 100644
index 000000000000..0e1db82e8af0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sip/4.x.nix
@@ -0,0 +1,43 @@
+{ lib, fetchurl, fetchpatch, buildPythonPackage, python, isPyPy, pythonAtLeast, sip-module ? "sip" }:
+
+buildPythonPackage rec {
+  pname = sip-module;
+  version = "4.19.25";
+  format = "other";
+
+  disabled = isPyPy;
+
+  src = fetchurl {
+    url = "https://www.riverbankcomputing.com/static/Downloads/sip/${version}/sip-${version}.tar.gz";
+    sha256 = "04a23cgsnx150xq86w1z44b6vr2zyazysy9mqax0fy346zlr77dk";
+  };
+
+  patches = lib.optionals (pythonAtLeast "3.11") [
+    (fetchpatch {
+      name = "sip-4-python3-11.patch";
+      url = "https://aur.archlinux.org/cgit/aur.git/plain/python3-11.patch?h=sip4&id=67b5907227e68845cdfafcf050fedb89ed653585";
+      sha256 = "sha256-cmuz2y5+T8EM/h03G2oboSnnOwrUjVKt2TUQaC9YAdE=";
+    })
+  ];
+
+  configurePhase = ''
+    ${python.executable} ./configure.py \
+      --sip-module ${sip-module} \
+      -d $out/${python.sitePackages} \
+      -b $out/bin -e $out/include
+  '';
+
+  enableParallelBuilding = true;
+
+  pythonImportsCheck = [ sip-module "sipconfig" ];
+
+  doCheck = true;
+
+  meta = with lib; {
+    description = "Creates C++ bindings for Python modules";
+    homepage    = "https://riverbankcomputing.com/";
+    license     = licenses.gpl2Plus;
+    maintainers = with maintainers; [ lovek323 sander ];
+    platforms   = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sip/default.nix b/nixpkgs/pkgs/development/python-modules/sip/default.nix
new file mode 100644
index 000000000000..f4870f2fa6f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sip/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, wheel
+, packaging
+, ply
+, toml
+, tomli
+}:
+
+buildPythonPackage rec {
+  pname = "sip";
+  version = "6.7.11";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8Nwyh6CxcuVmSTHIeEd1DUfk/c2k/jYrUUr47dZVtGk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [ packaging ply toml ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  # There aren't tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "sipbuild" ];
+
+  meta = with lib; {
+    description = "Creates C++ bindings for Python modules";
+    homepage    = "https://riverbankcomputing.com/";
+    license     = licenses.gpl3Only;
+    maintainers = with maintainers; [ nrdxp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sipyco/default.nix b/nixpkgs/pkgs/development/python-modules/sipyco/default.nix
new file mode 100644
index 000000000000..a44977c06279
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sipyco/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "sipyco";
+  version = "1.4";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "m-labs";
+    repo = "sipyco";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-sEYWtp11piUIa8YyuTOdFIIJ2GfcrUb+HEzPVKr4hW8=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sipyco"
+  ];
+
+  meta = with lib; {
+    description = "Simple Python Communications - used by the ARTIQ experimental control package";
+    homepage = "https://github.com/m-labs/sipyco";
+    changelog = "https://github.com/m-labs/sipyco/releases/tag/v${version}";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ charlesbaynham ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sisyphus-control/default.nix b/nixpkgs/pkgs/development/python-modules/sisyphus-control/default.nix
new file mode 100644
index 000000000000..8e9a5b0168c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sisyphus-control/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, netifaces
+, python-engineio
+, python-socketio
+, pythonOlder
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "sisyphus-control";
+  version = "3.1.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "jkeljo";
+    repo = "sisyphus-control";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-FbZWvsm2NT9a7TgHKWh/LHPsse6NBLK2grlOtHDbV2Y=";
+  };
+
+  pythonRelaxDeps = [
+    "python-engineio"
+    "python-socketio"
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    netifaces
+    python-engineio
+    python-socketio
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sisyphus_control"
+  ];
+
+  meta = with lib; {
+    description = "Control your Sisyphus Kinetic Art Table";
+    homepage = "https://github.com/jkeljo/sisyphus-control";
+    changelog = "https://github.com/jkeljo/sisyphus-control/blob/${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/siuba/default.nix b/nixpkgs/pkgs/development/python-modules/siuba/default.nix
new file mode 100644
index 000000000000..dbaab8c6df6b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/siuba/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, hypothesis
+, numpy
+, pandas
+, psycopg2
+, pymysql
+, python-dateutil
+, pytz
+, pyyaml
+, six
+, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "siuba";
+  version = "0.4.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "machow";
+    repo = "siuba";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-rd/yQH3sbZqQAQ1AN44vChe30GMJuIlZj3Ccfv1m3lU=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    pandas
+    psycopg2
+    pymysql
+    python-dateutil
+    pytz
+    pyyaml
+    six
+    sqlalchemy
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  # requires running mysql and postgres instances; see docker-compose.yml
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "siuba"
+    "siuba.data"
+  ];
+
+  meta = with lib; {
+    description = "Use dplyr-like syntax with pandas and SQL";
+    homepage = "https://siuba.org";
+    changelog = "https://github.com/machow/siuba/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/six/default.nix b/nixpkgs/pkgs/development/python-modules/six/default.nix
new file mode 100644
index 000000000000..afaedae9529e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/six/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "six";
+  version = "1.16.0";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = if isPyPy then [
+    # uses ctypes to find native library
+    "--deselect=test_six.py::test_move_items"
+  ] else null;
+
+  pythonImportsCheck = [ "six" ];
+
+  meta = {
+    changelog = "https://github.com/benjaminp/six/blob/${version}/CHANGES";
+    description = "Python 2 and 3 compatibility library";
+    homepage = "https://github.com/benjaminp/six";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sjcl/default.nix b/nixpkgs/pkgs/development/python-modules/sjcl/default.nix
new file mode 100644
index 000000000000..a44ceb91589f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sjcl/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pycryptodome
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sjcl";
+  version = "0.2.1";
+
+  format = "setuptools";
+
+  # PyPi release is missing tests
+  src = fetchFromGitHub {
+    owner = "berlincode";
+    repo = pname;
+    # commit from: 2018-08-16, because there aren't any tags on git
+    rev = "e8bdad312fa99c89c74f8651a1240afba8a9f3bd";
+    sha256 = "1v8rc55v28v8cl7nxcavj34am005wi63zcvwnbc6pyfbv4ss30ab";
+  };
+
+  propagatedBuildInputs = [ pycryptodome ];
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  pythonImportsCheck = [
+    "sjcl"
+  ];
+
+  meta = with lib; {
+    description = "Decrypt and encrypt messages compatible to the \"Stanford Javascript Crypto Library (SJCL)\" message format. This is a wrapper around pycrypto.";
+    homepage = "https://github.com/berlincode/sjcl";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ binsky ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/skein/default.nix b/nixpkgs/pkgs/development/python-modules/skein/default.nix
new file mode 100644
index 000000000000..d3896772bb8e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skein/default.nix
@@ -0,0 +1,62 @@
+{ buildPythonPackage
+, callPackage
+, fetchPypi
+, isPy27
+, lib
+, cryptography
+, grpcio
+, pyyaml
+, grpcio-tools
+, hadoop
+, pytestCheckHook
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "skein";
+  version = "0.8.2";
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-nXTqsJNX/LwAglPcPZkmdYPfF+vDLN+nNdZaDFTrHzE=";
+  };
+
+  # Update this hash if bumping versions
+  jarHash = "sha256-x2KH6tnoG7sogtjrJvUaxy0PCEA8q/zneuI969oBOKo=";
+  skeinJar = callPackage ./skeinjar.nix { inherit pname version jarHash; };
+
+  propagatedBuildInputs = [ cryptography grpcio pyyaml ];
+  buildInputs = [ grpcio-tools ];
+
+  preBuild = ''
+    # Ensure skein.jar exists skips the maven build in setup.py
+    mkdir -p skein/java
+    ln -s ${skeinJar} skein/java/skein.jar
+  '';
+
+  postPatch = ''
+    substituteInPlace skein/core.py --replace "'yarn'" "'${hadoop}/bin/yarn'" \
+      --replace "else 'java'" "else '${hadoop.jdk}/bin/java'"
+  '';
+
+  pythonImportsCheck = [ "skein" ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  # These tests require connecting to a YARN cluster. They could be done through NixOS tests later.
+  disabledTests = [
+    "test_ui"
+    "test_tornado"
+    "test_kv"
+    "test_core"
+    "test_cli"
+  ];
+
+  meta = with lib; {
+    homepage = "https://jcristharif.com/skein";
+    description = "A tool and library for easily deploying applications on Apache YARN";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ alexbiehl illustris ];
+    # https://github.com/NixOS/nixpkgs/issues/48663#issuecomment-1083031627
+    # replace with https://github.com/NixOS/nixpkgs/pull/140325 once it is merged
+    broken = lib.traceIf isPy27 "${pname} not supported on ${python.executable}" isPy27;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/skein/skeinjar.nix b/nixpkgs/pkgs/development/python-modules/skein/skeinjar.nix
new file mode 100644
index 000000000000..1cec80fa9333
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skein/skeinjar.nix
@@ -0,0 +1,22 @@
+{ fetchPypi, unzip, stdenv, pname, version, jarHash }:
+
+stdenv.mkDerivation rec {
+  inherit pname version;
+
+  src = fetchPypi {
+    inherit pname version;
+    format = "wheel";
+    python = "py3";
+    dist = "py3";
+    hash = jarHash;
+  };
+
+  dontUnpack = true;
+
+  nativeBuildInputs = [ unzip ];
+
+  installPhase = ''
+    unzip ${src}
+    install -D ./skein/java/skein.jar $out
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/skia-pathops/default.nix b/nixpkgs/pkgs/development/python-modules/skia-pathops/default.nix
new file mode 100644
index 000000000000..d12726ec391c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skia-pathops/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cython
+, isPyPy
+, ninja
+, setuptools-scm
+, setuptools
+, fetchPypi
+, gn
+, pytestCheckHook
+, xcodebuild
+, ApplicationServices
+, OpenGL
+}:
+
+buildPythonPackage rec {
+  pname = "skia-pathops";
+  version = "0.8.0.post1";
+
+  src = fetchPypi {
+    pname = "skia-pathops";
+    inherit version;
+    extension = "zip";
+    hash = "sha256-oFYkneL2H6VRFrnuVVE8aja4eK7gDJFFDkBNFgZIXLs=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "build_cmd = [sys.executable, build_skia_py, build_dir]" \
+        'build_cmd = [sys.executable, build_skia_py, "--no-fetch-gn", "--no-virtualenv", "--gn-path", "${gn}/bin/gn", build_dir]'
+  '' + lib.optionalString (stdenv.isDarwin && stdenv.isAarch64) ''
+    substituteInPlace src/cpp/skia-builder/skia/gn/skia/BUILD.gn \
+      --replace "-march=armv7-a" "-march=armv8-a" \
+      --replace "-mfpu=neon" "" \
+      --replace "-mthumb" ""
+    substituteInPlace src/cpp/skia-builder/skia/src/core/SkOpts.cpp \
+      --replace "defined(SK_CPU_ARM64)" "0"
+  '' + lib.optionalString (stdenv.isDarwin && stdenv.isx86_64) /* old compiler? */ ''
+    patch -p1 <<EOF
+    --- a/src/cpp/skia-builder/skia/include/private/base/SkTArray.h
+    +++ b/src/cpp/skia-builder/skia/include/private/base/SkTArray.h
+    @@ -492 +492 @@:
+    -    static constexpr int kMaxCapacity = SkToInt(std::min(SIZE_MAX / sizeof(T), (size_t)INT_MAX));
+    +    static constexpr int kMaxCapacity = SkToInt(std::min<size_t>(SIZE_MAX / sizeof(T), (size_t)INT_MAX));
+    EOF
+  '';
+
+  nativeBuildInputs = [ cython ninja setuptools-scm ]
+    ++ lib.optionals stdenv.isDarwin [ xcodebuild ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [ ApplicationServices OpenGL ];
+
+  propagatedBuildInputs = [ setuptools ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "pathops" ];
+
+  meta = {
+    description = "Python access to operations on paths using the Skia library";
+    homepage = "https://github.com/fonttools/skia-pathops";
+    license = lib.licenses.bsd3;
+    maintainers = [ lib.maintainers.BarinovMaxim ];
+    # ERROR at //gn/BUILDCONFIG.gn:87:14: Script returned non-zero exit code.
+    broken = isPyPy;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/skidl/default.nix b/nixpkgs/pkgs/development/python-modules/skidl/default.nix
new file mode 100644
index 000000000000..3b4f42c1feee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skidl/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, future
+, kinparse
+, pyspice
+, graphviz
+}:
+
+buildPythonPackage rec {
+  pname = "skidl";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "xesscorp";
+    repo = "skidl";
+    rev = version;
+    sha256 = "1m0hllvmr5nkl4zy8yyzfgw9zmbrrzd5pw87ahd2mq68fjpcaqq5";
+  };
+
+  propagatedBuildInputs = [
+    future
+    kinparse
+    pyspice
+    graphviz
+  ];
+
+  # Checks require availability of the kicad symbol libraries.
+  doCheck = false;
+  pythonImportsCheck = [ "skidl" ];
+
+  meta = with lib; {
+    description = "Module that extends Python with the ability to design electronic circuits";
+    homepage = "https://xess.com/skidl/docs/_site/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ matthuszagh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/skl2onnx/default.nix b/nixpkgs/pkgs/development/python-modules/skl2onnx/default.nix
new file mode 100644
index 000000000000..1698d2de4573
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skl2onnx/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, scipy
+, protobuf
+, onnx
+, scikit-learn
+, onnxconverter-common
+, onnxruntime
+, pandas
+, unittestCheckHook
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "skl2onnx";
+  version = "1.15.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BbLCZDrQNX7B6mhNE4Q4ot9lffgo5X0Hy3jC52viDjc=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    protobuf
+    onnx
+    scikit-learn
+    onnxconverter-common
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [ "scikit-learn" ];
+
+  nativeCheckInputs = [
+    onnxruntime
+    pandas
+    unittestCheckHook
+  ];
+
+  unittestFlagsArray = [ "-s" "tests" ];
+
+  # Core dump
+  doCheck = false;
+
+  meta = {
+    description = "Convert scikit-learn models to ONNX";
+    maintainers = with lib.maintainers; [ fridh ];
+    license = with lib.licenses; [ asl20 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sklearn-deap/default.nix b/nixpkgs/pkgs/development/python-modules/sklearn-deap/default.nix
new file mode 100644
index 000000000000..7e8f8e159eca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sklearn-deap/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, deap
+, numpy
+, scikit-learn
+, scipy
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sklearn-deap";
+  version = "0.3.0";
+  format = "setuptools";
+
+  # No tests in Pypi
+  src = fetchFromGitHub {
+    owner = "rsteca";
+    repo = "sklearn-deap";
+    rev = version;
+    hash = "sha256-bXBHlv1pIOyDLKCBeffyHaTZ7gNiZNl0soa73e8E4/M=";
+  };
+
+  patches = [
+    # Fix for scikit-learn v1.1. See: https://github.com/rsteca/sklearn-deap/pull/80
+    (fetchpatch {
+      url = "https://github.com/rsteca/sklearn-deap/commit/3b84bd905796378dd845f99e083da17284c9ff6f.patch";
+      hash = "sha256-YYLw0uzecyIbdNAy/CxxWDV67zJbZZhUMypnDm/zNGs=";
+    })
+    (fetchpatch {
+      url = "https://github.com/rsteca/sklearn-deap/commit/2f60e215c834f60966b4e51df25e91939a72b952.patch";
+      hash = "sha256-vn5nLPwwkjsQrp3q7C7Z230lkgRiyJN0TQxO8Apizg8=";
+    })
+  ];
+
+  propagatedBuildInputs = [ numpy scipy deap scikit-learn ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [ "evolutionary_search" ];
+
+  meta = with lib; {
+    description = "Use evolutionary algorithms instead of gridsearch in scikit-learn";
+    homepage = "https://github.com/rsteca/sklearn-deap";
+    license = licenses.mit;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/skodaconnect/default.nix b/nixpkgs/pkgs/development/python-modules/skodaconnect/default.nix
new file mode 100644
index 000000000000..ab64765f3083
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skodaconnect/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, aiohttp
+, beautifulsoup4
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, flit-core
+, lxml
+, pyjwt
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "skodaconnect";
+  version = "1.3.8";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "lendy007";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Isnji6hXkTuTmbMpSuim9uG5ECSDX6A8QZ13sTCU9t0=";
+  };
+
+  postPatch = ''
+    # https://github.com/skodaconnect/skodaconnect/pull/103
+    substituteInPlace pyproject.toml \
+      --replace "Bug Tracker" '"Bug Tracker"'
+  '';
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    beautifulsoup4
+    cryptography
+    lxml
+    pyjwt
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "skodaconnect"
+  ];
+
+  meta = with lib; {
+    description = "Python module to communicate with Skoda Connect";
+    homepage = "https://github.com/lendy007/skodaconnect";
+    changelog = "https://github.com/lendy007/skodaconnect/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/skorch/default.nix b/nixpkgs/pkgs/development/python-modules/skorch/default.nix
new file mode 100644
index 000000000000..13757f13e1aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skorch/default.nix
@@ -0,0 +1,86 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, numpy
+, scikit-learn
+, scipy
+, tabulate
+, torch
+, tqdm
+, flaky
+, pandas
+, pytestCheckHook
+, safetensors
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "skorch";
+  version = "0.15.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-39XVBlCmbg162z9uL84GZrU+v+M8waXbGdVV72ZYf84=";
+  };
+
+  disabled = pythonOlder "3.8";
+
+  propagatedBuildInputs = [
+    numpy
+    scikit-learn
+    scipy
+    tabulate
+    torch
+    tqdm
+  ];
+
+  nativeCheckInputs = [
+    flaky
+    pandas
+    pytestCheckHook
+    safetensors
+  ];
+
+  # patch out pytest-cov dep/invocation
+  postPatch = ''
+    substituteInPlace setup.cfg  \
+      --replace "--cov=skorch" ""  \
+      --replace "--cov-report=term-missing" ""  \
+      --replace "--cov-config .coveragerc" ""
+  '';
+
+  disabledTests = [
+    # on CPU, these expect artifacts from previous GPU run
+    "test_load_cuda_params_to_cpu"
+    # failing tests
+    "test_pickle_load"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # there is a problem with the compiler selection
+    "test_fit_and_predict_with_compile"
+  ] ++ lib.optionals (pythonAtLeast "3.11") [
+    # Python 3.11+ not yet supported for torch.compile
+    # https://github.com/pytorch/pytorch/blob/v2.0.1/torch/_dynamo/eval_frame.py#L376-L377
+    "test_fit_and_predict_with_compile"
+  ];
+
+  disabledTestPaths = [
+    # tries to import `transformers` and download HuggingFace data
+    "skorch/tests/test_hf.py"
+  ] ++ lib.optionals (stdenv.hostPlatform.system != "x86_64-linux") [
+    # torch.distributed is disabled by default in darwin
+    # aarch64-linux also failed these tests
+    "skorch/tests/test_history.py"
+  ];
+
+  pythonImportsCheck = [ "skorch" ];
+
+  meta = with lib; {
+    description = "Scikit-learn compatible neural net library using Pytorch";
+    homepage = "https://skorch.readthedocs.io";
+    changelog = "https://github.com/skorch-dev/skorch/blob/master/CHANGES.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/skrl/default.nix b/nixpkgs/pkgs/development/python-modules/skrl/default.nix
new file mode 100644
index 000000000000..417c1c1fe351
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skrl/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, gym
+, gymnasium
+, torch
+, tensorboard
+, tqdm
+, wandb
+, packaging
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "skrl";
+  version = "1.0.0";
+  pyproject = true;
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Toni-SM";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-89OoJanmaB74SLF1qMI8WFBdN1czS7Yr7BmojaRdo4M=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  propagatedBuildInputs = [
+    gym
+    gymnasium
+    torch
+    tensorboard
+    tqdm
+    wandb
+    packaging
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  doCheck = torch.cudaSupport;
+
+  pythonImportsCheck = [
+    "skrl"
+    "skrl.agents"
+    "skrl.agents.torch"
+    "skrl.envs"
+    "skrl.envs.torch"
+    "skrl.models"
+    "skrl.models.torch"
+    "skrl.resources"
+    "skrl.resources.noises"
+    "skrl.resources.noises.torch"
+    "skrl.resources.schedulers"
+    "skrl.resources.schedulers.torch"
+    "skrl.trainers"
+    "skrl.trainers.torch"
+    "skrl.utils"
+    "skrl.utils.model_instantiators"
+  ];
+
+  meta = with lib; {
+    description = "Reinforcement learning library using PyTorch focusing on readability and simplicity";
+    homepage = "https://skrl.readthedocs.io";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/skybellpy/default.nix b/nixpkgs/pkgs/development/python-modules/skybellpy/default.nix
new file mode 100644
index 000000000000..093df95b5657
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skybellpy/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, colorlog
+, fetchFromGitHub
+, pytest-sugar
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "skybellpy";
+  version = "0.6.3";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "MisterWil";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1ghvm0pcdyhq6xfjc2dkldd701x77w07077sx09xsk6q2milmvzz";
+  };
+
+  propagatedBuildInputs = [
+    colorlog
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytest-sugar
+    pytest-timeout
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pythonImportsCheck = [ "skybellpy" ];
+
+  meta = with lib; {
+    description = "Python wrapper for the Skybell alarm API";
+    homepage = "https://github.com/MisterWil/skybellpy";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/skyfield/default.nix b/nixpkgs/pkgs/development/python-modules/skyfield/default.nix
new file mode 100644
index 000000000000..9b6d92e217d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skyfield/default.nix
@@ -0,0 +1,48 @@
+{ lib, buildPythonPackage, pythonOlder, fetchFromGitHub, certifi, numpy, sgp4, jplephem
+, pandas, ipython, matplotlib, assay
+}:
+
+buildPythonPackage rec {
+  pname = "skyfield";
+  version = "1.45";
+
+  src = fetchFromGitHub {
+    owner = "skyfielders";
+    repo = "python-skyfield";
+    rev = version;
+    hash = "sha256-kZrXNVE+JGPGiVsd6CTwOqfciYLsD2A4pTS3FpqO+Dk=";
+  };
+
+  # Fix broken tests on "exotic" platforms.
+  # https://github.com/skyfielders/python-skyfield/issues/582#issuecomment-822033858
+  postPatch = ''
+    substituteInPlace skyfield/tests/test_planetarylib.py \
+      --replace "if IS_32_BIT" "if True"
+  '';
+
+  propagatedBuildInputs = [ certifi numpy sgp4 jplephem ];
+
+  nativeCheckInputs = [ pandas ipython matplotlib assay ];
+
+  # assay is broken on Python >= 3.11
+  # https://github.com/brandon-rhodes/assay/issues/15
+  doCheck = pythonOlder "3.11";
+
+  checkPhase = ''
+    runHook preCheck
+
+    cd ci
+    assay --batch skyfield.tests
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "skyfield" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/skyfielders/python-skyfield";
+    description = "Elegant astronomy for Python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ zane ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/skytemple-dtef/default.nix b/nixpkgs/pkgs/development/python-modules/skytemple-dtef/default.nix
new file mode 100644
index 000000000000..238bae491a90
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skytemple-dtef/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pillow
+, pytestCheckHook
+, pythonOlder
+, skytemple-files
+}:
+
+buildPythonPackage rec {
+  pname = "skytemple-dtef";
+  version = "1.6.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "SkyTemple";
+    repo = pname;
+    rev = version;
+    hash = "sha256-ngIjM8DW9HQJpa/U2f1sy+6CeWdccayp60vbJmos+A8=";
+  };
+
+  propagatedBuildInputs = [
+    pillow
+    skytemple-files
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "skytemple_dtef"
+  ];
+
+  meta = with lib; {
+    description = "A format for standardized rule-based tilesets with 256 adjacency combinations";
+    homepage = "https://github.com/SkyTemple/skytemple-dtef";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ marius851000 xfix ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/skytemple-eventserver/default.nix b/nixpkgs/pkgs/development/python-modules/skytemple-eventserver/default.nix
new file mode 100644
index 000000000000..e258b46c584f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skytemple-eventserver/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchFromGitHub }:
+
+buildPythonPackage rec {
+  pname = "skytemple-eventserver";
+  version = "1.6.0";
+
+  src = fetchFromGitHub {
+    owner = "SkyTemple";
+    repo = pname;
+    rev = version;
+    hash = "sha256-PWLGPORNprTfG+jgXI1sxyVkRTwSEib4SZhPdOBchwE=";
+  };
+
+  doCheck = false; # there are no tests
+  pythonImportsCheck = [ "skytemple_eventserver" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/SkyTemple/skytemple-eventserver";
+    description = "Websocket server that emits SkyTemple UI events";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ marius851000 xfix ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/skytemple-files/default.nix b/nixpkgs/pkgs/development/python-modules/skytemple-files/default.nix
new file mode 100644
index 000000000000..faac31c81521
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skytemple-files/default.nix
@@ -0,0 +1,92 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, appdirs
+, dungeon-eos
+, explorerscript
+, ndspy
+, pillow
+, setuptools
+, skytemple-rust
+, tilequant
+, pyyaml
+, pmdsky-debug-py
+, range-typed-integers
+, importlib-resources
+, typing-extensions
+, pythonOlder
+, # optional dependancies for SpriteCollab
+  aiohttp
+, lru-dict
+, graphql-core
+, gql
+, armips
+  # tests
+, pytestCheckHook
+, parameterized
+, xmldiff
+}:
+
+buildPythonPackage rec {
+  pname = "skytemple-files";
+  version = "1.6.1";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "SkyTemple";
+    repo = pname;
+    rev = version;
+    hash = "sha256-P0VME1keazqcyb0JuQ4iXPyJH7/gTmYE7uASpjvhqUo=";
+  };
+
+  postPatch = ''
+    substituteInPlace skytemple_files/patch/arm_patcher.py skytemple_files/data/data_cd/armips_importer.py \
+      --replace "exec_name = os.getenv(\"SKYTEMPLE_ARMIPS_EXEC\", f\"{prefix}armips\")" "exec_name = \"${armips}/bin/armips\""
+  '';
+
+  buildInputs = [ armips ];
+
+  propagatedBuildInputs = [
+    appdirs
+    dungeon-eos
+    explorerscript
+    ndspy
+    pillow
+    setuptools
+    skytemple-rust
+    tilequant
+    pyyaml
+    pmdsky-debug-py
+    range-typed-integers
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    importlib-resources
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = {
+    spritecollab = [
+      aiohttp
+      gql
+      graphql-core
+      lru-dict
+    ] ++ gql.optional-dependencies.aiohttp;
+  };
+
+  checkInputs = [ pytestCheckHook parameterized xmldiff ] ++ passthru.optional-dependencies.spritecollab;
+  pytestFlagsArray = [ "test/" ];
+  disabledTestPaths = [
+    "test/skytemple_files_test/common/spritecollab/sc_online_test.py"
+    "test/skytemple_files_test/compression_container/atupx/atupx_test.py" # Particularly long test
+  ];
+
+  pythonImportsCheck = [ "skytemple_files" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/SkyTemple/skytemple-files";
+    description = "Python library to edit the ROM of Pokémon Mystery Dungeon Explorers of Sky";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ xfix marius851000 ];
+    broken = stdenv.isDarwin; # pyobjc is missing
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/skytemple-icons/default.nix b/nixpkgs/pkgs/development/python-modules/skytemple-icons/default.nix
new file mode 100644
index 000000000000..0bcbff47ade2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skytemple-icons/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchFromGitHub }:
+
+buildPythonPackage rec {
+  pname = "skytemple-icons";
+  version = "1.3.2";
+
+  src = fetchFromGitHub {
+    owner = "SkyTemple";
+    repo = pname;
+    rev = version;
+    sha256 = "0wagdvzks9irdl5lj8sfqkkvfwwmdpvjyzx6424shvpp5mk28dcv";
+  };
+
+  doCheck = false; # there are no tests
+  pythonImportsCheck = [ "skytemple_icons" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/SkyTemple/skytemple-icons";
+    description = "Icons for SkyTemple";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ xfix ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/skytemple-rust/default.nix b/nixpkgs/pkgs/development/python-modules/skytemple-rust/default.nix
new file mode 100644
index 000000000000..d33a87f50662
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skytemple-rust/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cargo
+, fetchPypi
+, libiconv
+, Foundation
+, rustPlatform
+, rustc
+, setuptools-rust
+, range-typed-integers
+}:
+
+buildPythonPackage rec {
+  pname = "skytemple-rust";
+  version = "1.6.1";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Qg2KAzjSV7yQTpRHmNMkHRwOJSbfsgcdT0RHQru2lBI=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-ZJ5eYof9RZ07iP0YowIBorHuNUntQVW9JWcSVe2emig=";
+  };
+
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv Foundation ];
+  nativeBuildInputs = [ setuptools-rust rustPlatform.cargoSetupHook cargo rustc ];
+  propagatedBuildInputs = [ range-typed-integers ];
+
+  GETTEXT_SYSTEM = true;
+
+  doCheck = false; # tests for this package are in skytemple-files package
+  pythonImportsCheck = [ "skytemple_rust" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/SkyTemple/skytemple-rust";
+    description = "Binary Rust extensions for SkyTemple";
+    license = licenses.mit;
+    maintainers = with maintainers; [ xfix marius851000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/skytemple-ssb-debugger/default.nix b/nixpkgs/pkgs/development/python-modules/skytemple-ssb-debugger/default.nix
new file mode 100644
index 000000000000..b497c4406147
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skytemple-ssb-debugger/default.nix
@@ -0,0 +1,62 @@
+{ buildPythonPackage
+, explorerscript
+, fetchFromGitHub
+, gobject-introspection
+, gtk3
+, gtksourceview4
+, importlib-metadata
+, lib
+, ndspy
+, nest-asyncio
+, pmdsky-debug-py
+, pycairo
+, pygobject3
+, pygtkspellcheck
+, pythonOlder
+, range-typed-integers
+, skytemple-files
+, skytemple-icons
+, skytemple-ssb-emulator
+, wrapGAppsHook
+}:
+
+buildPythonPackage rec {
+  pname = "skytemple-ssb-debugger";
+  version = "1.6.1";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "SkyTemple";
+    repo = pname;
+    rev = version;
+    hash = "sha256-Zqp/NSF3uoxktycg+Q3BLFUMzbHFKUkYCg+DvEcRydU=";
+  };
+
+  buildInputs = [ gtk3 gtksourceview4 ];
+  nativeBuildInputs = [ gobject-introspection wrapGAppsHook ];
+  propagatedBuildInputs = [
+    explorerscript
+    ndspy
+    nest-asyncio
+    pmdsky-debug-py
+    pycairo
+    pygobject3
+    pygtkspellcheck
+    range-typed-integers
+    skytemple-files
+    skytemple-icons
+    skytemple-ssb-emulator
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    importlib-metadata
+  ];
+
+  doCheck = false; # requires Pokémon Mystery Dungeon ROM
+  pythonImportsCheck = [ "skytemple_ssb_debugger" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/SkyTemple/skytemple-ssb-debugger";
+    description = "Script Engine Debugger for Pokémon Mystery Dungeon Explorers of Sky";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ marius851000 xfix ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/skytemple-ssb-emulator/Cargo.lock b/nixpkgs/pkgs/development/python-modules/skytemple-ssb-emulator/Cargo.lock
new file mode 100644
index 000000000000..f8ed09197a77
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skytemple-ssb-emulator/Cargo.lock
@@ -0,0 +1,887 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "aho-corasick"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "arc-swap"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6"
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bitflags"
+version = "2.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
+
+[[package]]
+name = "bitvec"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c"
+dependencies = [
+ "funty",
+ "radium",
+ "tap",
+ "wyz",
+]
+
+[[package]]
+name = "block"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
+
+[[package]]
+name = "byteorder"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
+
+[[package]]
+name = "bytes"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
+
+[[package]]
+name = "cc"
+version = "1.0.83"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "desmume-rs"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95166a679be6515156852dfd35dd5b086929b1a82104a0fdc68c7e3c3dcccd05"
+dependencies = [
+ "desmume-sys",
+ "thiserror",
+]
+
+[[package]]
+name = "desmume-sys"
+version = "0.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8414d5cfbc53315f1956069a67d34e2a1c4c05d420e669504a4dfc4e5ba278e3"
+dependencies = [
+ "glob",
+ "libc",
+ "pkg-config",
+ "tempfile",
+]
+
+[[package]]
+name = "either"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
+
+[[package]]
+name = "encoding"
+version = "0.2.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec"
+dependencies = [
+ "encoding-index-japanese",
+ "encoding-index-korean",
+ "encoding-index-simpchinese",
+ "encoding-index-singlebyte",
+ "encoding-index-tradchinese",
+]
+
+[[package]]
+name = "encoding-index-japanese"
+version = "1.20141219.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91"
+dependencies = [
+ "encoding_index_tests",
+]
+
+[[package]]
+name = "encoding-index-korean"
+version = "1.20141219.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81"
+dependencies = [
+ "encoding_index_tests",
+]
+
+[[package]]
+name = "encoding-index-simpchinese"
+version = "1.20141219.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7"
+dependencies = [
+ "encoding_index_tests",
+]
+
+[[package]]
+name = "encoding-index-singlebyte"
+version = "1.20141219.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a"
+dependencies = [
+ "encoding_index_tests",
+]
+
+[[package]]
+name = "encoding-index-tradchinese"
+version = "1.20141219.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18"
+dependencies = [
+ "encoding_index_tests",
+]
+
+[[package]]
+name = "encoding_index_tests"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569"
+
+[[package]]
+name = "errno"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860"
+dependencies = [
+ "libc",
+ "windows-sys",
+]
+
+[[package]]
+name = "fastrand"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
+
+[[package]]
+name = "funty"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
+
+[[package]]
+name = "gettext-rs"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e49ea8a8fad198aaa1f9655a2524b64b70eb06b2f3ff37da407566c93054f364"
+dependencies = [
+ "gettext-sys",
+ "locale_config",
+]
+
+[[package]]
+name = "gettext-sys"
+version = "0.21.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c63ce2e00f56a206778276704bbe38564c8695249fdc8f354b4ef71c57c3839d"
+dependencies = [
+ "cc",
+ "temp-dir",
+]
+
+[[package]]
+name = "glob"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
+
+[[package]]
+name = "heck"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+
+[[package]]
+name = "indoc"
+version = "2.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8"
+
+[[package]]
+name = "itertools"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "libc"
+version = "0.2.149"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b"
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.4.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f"
+
+[[package]]
+name = "locale_config"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08d2c35b16f4483f6c26f0e4e9550717a2f6575bcd6f12a53ff0c490a94a6934"
+dependencies = [
+ "lazy_static",
+ "objc",
+ "objc-foundation",
+ "regex",
+ "winapi",
+]
+
+[[package]]
+name = "lock_api"
+version = "0.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
+
+[[package]]
+name = "malloc_buf"
+version = "0.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "memchr"
+version = "2.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
+
+[[package]]
+name = "memoffset"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num-derive"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "objc"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
+dependencies = [
+ "malloc_buf",
+]
+
+[[package]]
+name = "objc-foundation"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9"
+dependencies = [
+ "block",
+ "objc",
+ "objc_id",
+]
+
+[[package]]
+name = "objc_id"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b"
+dependencies = [
+ "objc",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+
+[[package]]
+name = "packed_struct"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36b29691432cc9eff8b282278473b63df73bea49bc3ec5e67f31a3ae9c3ec190"
+dependencies = [
+ "bitvec",
+ "packed_struct_codegen",
+ "serde",
+]
+
+[[package]]
+name = "packed_struct_codegen"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9cd6706dfe50d53e0f6aa09e12c034c44faacd23e966ae5a209e8bdb8f179f98"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "parking_lot"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-targets",
+]
+
+[[package]]
+name = "paste"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "pyo3"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04e8453b658fe480c3e70c8ed4e3d3ec33eb74988bd186561b0cc66b85c3bc4b"
+dependencies = [
+ "cfg-if",
+ "indoc",
+ "libc",
+ "memoffset",
+ "parking_lot",
+ "pyo3-build-config",
+ "pyo3-ffi",
+ "pyo3-macros",
+ "unindent",
+]
+
+[[package]]
+name = "pyo3-build-config"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a96fe70b176a89cff78f2fa7b3c930081e163d5379b4dcdf993e3ae29ca662e5"
+dependencies = [
+ "once_cell",
+ "target-lexicon",
+]
+
+[[package]]
+name = "pyo3-ffi"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "214929900fd25e6604661ed9cf349727c8920d47deff196c4e28165a6ef2a96b"
+dependencies = [
+ "libc",
+ "pyo3-build-config",
+]
+
+[[package]]
+name = "pyo3-log"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c10808ee7250403bedb24bc30c32493e93875fef7ba3e4292226fe924f398bd"
+dependencies = [
+ "arc-swap",
+ "log",
+ "pyo3",
+]
+
+[[package]]
+name = "pyo3-macros"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dac53072f717aa1bfa4db832b39de8c875b7c7af4f4a6fe93cdbf9264cf8383b"
+dependencies = [
+ "proc-macro2",
+ "pyo3-macros-backend",
+ "quote",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "pyo3-macros-backend"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7774b5a8282bd4f25f803b1f0d945120be959a36c72e08e7cd031c792fdfd424"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "radium"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
+
+[[package]]
+name = "redox_syscall"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
+dependencies = [
+ "bitflags 1.3.2",
+]
+
+[[package]]
+name = "regex"
+version = "1.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
+
+[[package]]
+name = "rustix"
+version = "0.38.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3"
+dependencies = [
+ "bitflags 2.4.1",
+ "errno",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
+
+[[package]]
+name = "scopeguard"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
+[[package]]
+name = "serde"
+version = "1.0.190"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.190"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.107"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "skytemple_rust"
+version = "1.6.0"
+source = "git+https://github.com/SkyTemple/skytemple-rust.git?tag=1.6.0#9403594d96a7c8fa480625578038a75e9189173f"
+dependencies = [
+ "bytes",
+ "encoding",
+ "gettext-rs",
+ "itertools",
+ "log",
+ "num-derive",
+ "num-traits",
+ "packed_struct",
+ "paste",
+ "skytemple_rust_macros",
+ "skytemple_rust_macros_no_py",
+ "thiserror",
+]
+
+[[package]]
+name = "skytemple_rust_macros"
+version = "1.4.0"
+source = "git+https://github.com/SkyTemple/skytemple-rust.git?tag=1.6.0#9403594d96a7c8fa480625578038a75e9189173f"
+dependencies = [
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "skytemple_rust_macros_no_py"
+version = "1.4.0"
+source = "git+https://github.com/SkyTemple/skytemple-rust.git?tag=1.6.0#9403594d96a7c8fa480625578038a75e9189173f"
+dependencies = [
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "skytemple_ssb_emulator"
+version = "1.6.1"
+dependencies = [
+ "byteorder",
+ "crossbeam-channel",
+ "desmume-rs",
+ "lazy_static",
+ "log",
+ "pyo3",
+ "pyo3-log",
+ "serde_json",
+ "skytemple_rust",
+ "sprintf",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a"
+
+[[package]]
+name = "sprintf"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c0cdea5a20a06e7c57f627094e7b1618e5665592cd88f2d45fa4014e348db58"
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "tap"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
+
+[[package]]
+name = "target-lexicon"
+version = "0.12.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a"
+
+[[package]]
+name = "temp-dir"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af547b166dd1ea4b472165569fc456cfb6818116f854690b0ff205e636523dab"
+
+[[package]]
+name = "tempfile"
+version = "3.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5"
+dependencies = [
+ "cfg-if",
+ "fastrand",
+ "redox_syscall",
+ "rustix",
+ "windows-sys",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.50"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.50"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.38",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
+
+[[package]]
+name = "unindent"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce"
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+
+[[package]]
+name = "wyz"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed"
+dependencies = [
+ "tap",
+]
diff --git a/nixpkgs/pkgs/development/python-modules/skytemple-ssb-emulator/default.nix b/nixpkgs/pkgs/development/python-modules/skytemple-ssb-emulator/default.nix
new file mode 100644
index 000000000000..0e0f4dc98885
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/skytemple-ssb-emulator/default.nix
@@ -0,0 +1,78 @@
+{ alsa-lib
+, buildPythonPackage
+, cargo
+, fetchPypi
+, glib
+, lib
+, libpcap
+, meson
+, ninja
+, openal
+, pkg-config
+, range-typed-integers
+, rustc
+, rustPlatform
+, SDL2
+, setuptools
+, setuptools-rust
+, soundtouch
+, zlib
+}:
+buildPythonPackage rec {
+  pname = "skytemple-ssb-emulator";
+  version = "1.6.1.post1";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-FEQnQPIathtrP03Dncz560K0lhKW4+HI/Oyo7qsEpFw=";
+  };
+
+  cargoDeps = rustPlatform.importCargoLock {
+    lockFile = ./Cargo.lock;
+    outputHashes = {
+      "skytemple_rust-1.6.0" = "sha256-4glBo1VKCSwSSeQU6Ojhc0Cbaikxy101V1fU4rgcczg=";
+    };
+  };
+
+  buildInputs = [
+    alsa-lib
+    glib
+    libpcap
+    SDL2
+    soundtouch
+    zlib
+  ];
+
+  nativeBuildInputs = [
+    cargo
+    meson
+    ninja
+    openal
+    pkg-config
+    rustc
+    rustPlatform.cargoSetupHook
+    setuptools
+    setuptools-rust
+  ];
+
+  propagatedBuildInputs = [
+    range-typed-integers
+  ];
+
+  hardeningDisable = [
+    "format"
+  ];
+
+  doCheck = false; # there are no tests
+  pythonImportsCheck = [
+    "skytemple_ssb_emulator"
+  ];
+
+  meta = with lib; {
+    description = "SkyTemple Script Engine Debugger Emulator Backend";
+    homepage = "https://github.com/SkyTemple/skytemple-ssb-emulator";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ marius851000 xfix ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/slack-bolt/default.nix b/nixpkgs/pkgs/development/python-modules/slack-bolt/default.nix
new file mode 100644
index 000000000000..94291d7a9cc4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slack-bolt/default.nix
@@ -0,0 +1,125 @@
+{ aiohttp
+, bottle
+, buildPythonPackage
+, chalice
+, cherrypy
+, django
+, docker
+, falcon
+, fastapi
+, fetchFromGitHub
+, flask
+, flask-sockets
+, gunicorn
+, lib
+, moto
+, numpy
+, pyramid
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, sanic
+, setuptools
+, sanic-testing
+, slack-sdk
+, starlette
+, tornado
+, uvicorn
+, websocket-client
+, websockets
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "slack-bolt";
+  version = "1.18.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "slackapi";
+    repo = "bolt-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-UwVStemFVA4hgqnSpCKpQGwLYG+p5z7MwFXXnIhrvNk=";
+  };
+
+  # The packaged pytest-runner version is too new as of 2023-07-27. It's not really needed anyway. Unfortunately,
+  # pythonRelaxDepsHook doesn't work on setup_requires packages.
+  postPatch = ''
+    substituteInPlace setup.py --replace "pytest-runner==5.2" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    slack-sdk
+  ];
+
+  passthru.optional-dependencies = {
+    async = [
+      aiohttp
+      websockets
+    ];
+    adapter = [
+      bottle
+      chalice
+      cherrypy
+      django
+      falcon
+      fastapi
+      flask
+      flask-sockets
+      gunicorn
+      moto
+      pyramid
+      sanic
+      sanic-testing
+      starlette
+      tornado
+      uvicorn
+      websocket-client
+      werkzeug
+    ];
+  };
+
+  nativeCheckInputs = [
+    docker
+    pytest-asyncio
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  # Work around "Read-only file system: '/homeless-shelter'" errors
+  preCheck = ''
+    export HOME="$(mktemp -d)"
+  '';
+
+  disabledTestPaths = [
+    # boddle is not packaged as of 2023-07-15
+    "tests/adapter_tests/bottle/"
+    # Tests are blocking at some point. Blocking could be performance-related.
+    "tests/scenario_tests_async/"
+    "tests/slack_bolt_async/"
+  ];
+
+  disabledTests = [
+    # Require network access
+    "test_events"
+    "test_interactions"
+    "test_lazy_listener_calls"
+    "test_lazy_listeners"
+    "test_failure"
+  ];
+
+  pythonImportsCheck = [ "slack_bolt" ];
+
+  meta = with lib; {
+    description = "A framework to build Slack apps using Python";
+    homepage = "https://github.com/slackapi/bolt-python";
+    changelog = "https://github.com/slackapi/bolt-python/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/slack-sdk/default.nix b/nixpkgs/pkgs/development/python-modules/slack-sdk/default.nix
new file mode 100644
index 000000000000..a015400616e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slack-sdk/default.nix
@@ -0,0 +1,82 @@
+{ stdenv
+, lib
+, aiodns
+, aiohttp
+, boto3
+, buildPythonPackage
+, codecov
+, fetchFromGitHub
+, flake8
+, flask-sockets
+, moto
+, pythonOlder
+, psutil
+, pytest-asyncio
+, pytestCheckHook
+, sqlalchemy
+, websocket-client
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "slack-sdk";
+  version = "3.26.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "slackapi";
+    repo = "python-slack-sdk";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-jvLzZFlR2msyCc9C7WvYpXIGoKCDRxJI5lgNUtbGh/w=";
+  };
+
+  propagatedBuildInputs = [
+    aiodns
+    aiohttp
+    boto3
+    sqlalchemy
+    websocket-client
+    websockets
+  ];
+
+  nativeCheckInputs = [
+    codecov
+    flake8
+    flask-sockets
+    moto
+    psutil
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  disabledTestPaths = [
+    # Exclude tests that requires network features
+    "integration_tests"
+  ];
+
+  disabledTests = [
+    # Requires network features
+    "test_start_raises_an_error_if_rtm_ws_url_is_not_returned"
+    "test_org_installation"
+    "test_interactions"
+    "test_issue_690_oauth_access"
+  ];
+
+  pythonImportsCheck = [
+    "slack_sdk"
+  ];
+
+  meta = with lib; {
+    description = "Slack Developer Kit for Python";
+    homepage = "https://slack.dev/python-slack-sdk/";
+    changelog = "https://github.com/slackapi/python-slack-sdk/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/slackclient/default.nix b/nixpkgs/pkgs/development/python-modules/slackclient/default.nix
new file mode 100644
index 000000000000..c45d8394fa85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slackclient/default.nix
@@ -0,0 +1,90 @@
+{ lib
+, stdenv
+, aiohttp
+, boto3
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, flask-sockets
+, pythonOlder
+, mock
+, moto
+, psutil
+, pytest-mock
+, pytestCheckHook
+, requests
+, responses
+, sqlalchemy
+, websockets
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "slackclient";
+  version = "3.26.0";
+  format =  "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "slackapi";
+    repo = "python-slack-sdk";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-jvLzZFlR2msyCc9C7WvYpXIGoKCDRxJI5lgNUtbGh/w=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    websocket-client
+    requests
+  ];
+
+  nativeCheckInputs = [
+    boto3
+    flask
+    flask-sockets
+    mock
+    moto
+    psutil
+    pytest-mock
+    pytestCheckHook
+    responses
+    sqlalchemy
+    websockets
+  ];
+
+  pytestFlagsArray = [
+    # Exclude tests that requires network features
+    "--ignore=integration_tests"
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  disabledTests = [
+    "test_start_raises_an_error_if_rtm_ws_url_is_not_returned"
+    "test_interactions"
+    "test_send_message_while_disconnection"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # these fail with `ConnectionResetError: [Errno 54] Connection reset by peer`
+    "test_issue_690_oauth_access"
+    "test_issue_690_oauth_v2_access"
+    "test_send"
+    "test_send_attachments"
+    "test_send_blocks"
+    "test_send_dict"
+  ];
+
+  pythonImportsCheck = [
+    "slack"
+  ];
+
+  meta = with lib; {
+    description = "A client for Slack, which supports the Slack Web API and Real Time Messaging (RTM) API";
+    homepage = "https://github.com/slackapi/python-slackclient";
+    changelog = "https://github.com/slackapi/python-slack-sdk/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ flokli psyanticy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sleekxmpp/default.nix b/nixpkgs/pkgs/development/python-modules/sleekxmpp/default.nix
new file mode 100644
index 000000000000..41578b3dc047
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sleekxmpp/default.nix
@@ -0,0 +1,27 @@
+{ stdenv, lib, fetchPypi, buildPythonPackage, pythonAtLeast, dnspython, pyasn1 }:
+
+buildPythonPackage rec {
+  pname = "sleekxmpp";
+  version = "1.3.3";
+
+  disabled = pythonAtLeast "3.10"; # Deprecated in favor of Slixmpp
+
+  propagatedBuildInputs = [ dnspython pyasn1 ];
+
+  patches = [
+    ./dnspython-ip6.patch
+  ];
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d213c1de71d92505f95ced0460ee0f84fdc4ddcacb7d7dd343739ed4028e5569";
+  };
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    description = "XMPP library for Python";
+    license = licenses.mit;
+    homepage = "http://sleekxmpp.com/";
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sleekxmpp/dnspython-ip6.patch b/nixpkgs/pkgs/development/python-modules/sleekxmpp/dnspython-ip6.patch
new file mode 100644
index 000000000000..d8d6eb106838
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sleekxmpp/dnspython-ip6.patch
@@ -0,0 +1,55 @@
+--- a/sleekxmpp/xmlstream/resolver.py
++++ b/sleekxmpp/xmlstream/resolver.py
+@@ -175,6 +175,9 @@ def get_A(host, resolver=None, use_dnspy
+     """
+     log.debug("DNS: Querying %s for A records." % host)
+
++    if isinstance(host, bytes):
++        host = host.decode("utf-8")
++
+     # If not using dnspython, attempt lookup using the OS level
+     # getaddrinfo() method.
+     if resolver is None or not use_dnspython:
+@@ -189,7 +192,10 @@ def get_A(host, resolver=None, use_dnspy
+     # Using dnspython:
+     try:
+         recs = resolver.query(host, dns.rdatatype.A)
+-        return [rec.to_text() for rec in recs]
++        if isinstance(recs[0].to_text(), bytes):
++            return [rec.to_text().decode("utf-8") for rec in recs]
++        else:
++            return [rec.to_text() for rec in recs]
+     except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer):
+         log.debug("DNS: No A records for %s" % host)
+         return []
+@@ -222,6 +228,9 @@ def get_AAAA(host, resolver=None, use_dn
+     """
+     log.debug("DNS: Querying %s for AAAA records." % host)
+
++    if isinstance(host, bytes):
++        host = host.decode("utf-8")
++
+     # If not using dnspython, attempt lookup using the OS level
+     # getaddrinfo() method.
+     if resolver is None or not use_dnspython:
+@@ -240,7 +249,10 @@ def get_AAAA(host, resolver=None, use_dn
+     # Using dnspython:
+     try:
+         recs = resolver.query(host, dns.rdatatype.AAAA)
+-        return [rec.to_text() for rec in recs]
++        if isinstance(recs[0].to_text(), bytes):
++            return [rec.to_text().decode("utf-8") for rec in recs]
++        else:
++            return [rec.to_text() for rec in recs]
+     except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer):
+         log.debug("DNS: No AAAA records for %s" % host)
+         return []
+@@ -324,6 +336,8 @@ def get_SRV(host, port, service, proto='
+                 if running_sum >= selected:
+                     rec = sums[running_sum]
+                     host = rec.target.to_text()
++                    if isinstance(host, bytes):
++                        host = host.decode("utf-8")
+                     if host.endswith('.'):
+                         host = host[:-1]
+                     sorted_recs.append((host, rec.port))
diff --git a/nixpkgs/pkgs/development/python-modules/sleepyq/default.nix b/nixpkgs/pkgs/development/python-modules/sleepyq/default.nix
new file mode 100644
index 000000000000..0a335de3177f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sleepyq/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, inflection
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "sleepyq";
+  version = "0.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1bhzrxpzglfw4qbqfzyxr7dmmavzq4pq0h90jh0aa8vdw7iy7g7v";
+  };
+
+  propagatedBuildInputs = [
+    inflection
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "sleepyq" ];
+
+  meta = with lib; {
+    description = "Python module for SleepIQ API";
+    homepage = "https://github.com/technicalpickles/sleepyq";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/slicedimage/default.nix b/nixpkgs/pkgs/development/python-modules/slicedimage/default.nix
new file mode 100644
index 000000000000..f74447750cc3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slicedimage/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, boto3
+, diskcache
+, enum34
+, packaging
+, pathlib
+, numpy
+, requests
+, scikit-image
+, six
+, pytestCheckHook
+, isPy27
+, tifffile
+}:
+
+buildPythonPackage rec {
+  pname = "slicedimage";
+  version = "4.1.1";
+
+  src = fetchFromGitHub {
+    owner = "spacetx";
+    repo = pname;
+    rev = version;
+    sha256 = "1vpg8varvfx0nj6xscdfm7m118hzsfz7qfzn28r9rsfvrhr0dlcw";
+  };
+
+  propagatedBuildInputs = [
+    boto3
+    diskcache
+    packaging
+    numpy
+    requests
+    scikit-image
+    six
+    tifffile
+  ] ++ lib.optionals isPy27 [ pathlib enum34 ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # Ignore tests which require setup, check again if disabledTestFiles can be used
+  pytestFlagsArray = [ "--ignore tests/io_" ];
+
+  pythonImportsCheck = [ "slicedimage" ];
+
+  meta = with lib; {
+    description = "Library to access sliced imaging data";
+    homepage = "https://github.com/spacetx/slicedimage";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/slicer/default.nix b/nixpkgs/pkgs/development/python-modules/slicer/default.nix
new file mode 100644
index 000000000000..f678dfb2eaa2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slicer/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, dos2unix
+, fetchpatch
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, pandas
+, torch
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "slicer";
+  version = "0.0.7";
+  format = "setuptools";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-9dX3tF+Y0VW5wLplVPqXcMaybVeTo+d6EDD7VpEOvuw=";
+  };
+
+  prePatch = ''
+    dos2unix slicer/*
+  '';
+
+  patches = [
+    # these patches add support for numpy>=1.24
+    (fetchpatch {
+      url = "https://github.com/interpretml/slicer/commit/028e09e639c4a3c99abe1d537cce30af2eebb081.patch";
+      hash = "sha256-jh/cbz7cx2ks6jMNh1gI1n5RS/OHBtSIDZRxUGyrl/I=";
+    })
+    (fetchpatch {
+      url = "https://github.com/interpretml/slicer/commit/d4bb09f136d7e1f64711633c16a37e7bee738696.patch";
+      hash = "sha256-9rh99s4JWF4iKClZ19jvqSeRulL32xB5Use8PGkh/SA=";
+    })
+    (fetchpatch {
+      url = "https://github.com/interpretml/slicer/commit/74b3683a5a7bd982f9eaaf8d8d665dfdaf2c6604.patch";
+      hash = "sha256-R3zsC3udYPFUT93eRhb6wyc9S5n2wceiOunWJ8K+648=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    dos2unix
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook pandas torch scipy ];
+
+  disabledTests = [
+    # IndexError: too many indices for array
+    "test_slicer_sparse"
+    "test_operations_2d"
+  ];
+
+  meta = with lib; {
+    description = "Wraps tensor-like objects and provides a uniform slicing interface via __getitem__";
+    homepage = "https://github.com/interpretml/slicer";
+    license = licenses.mit;
+    maintainers = with maintainers; [ evax ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/slicerator/default.nix b/nixpkgs/pkgs/development/python-modules/slicerator/default.nix
new file mode 100644
index 000000000000..a8a4a7d3b8d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slicerator/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "slicerator";
+  version = "1.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-RAEKf1zYdoDAchO1yr6B0ftxJSlilD5Tc+59FGBdYEY=";
+  };
+
+  checkPhase = ''
+    ${python.interpreter} run_tests.py
+  '';
+
+  # run_tests.py not packaged with pypi release
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A lazy-loading, fancy-sliceable iterable";
+    homepage = "https://github.com/soft-matter/slicerator";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/slimit/default.nix b/nixpkgs/pkgs/development/python-modules/slimit/default.nix
new file mode 100644
index 000000000000..1166db2639c4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slimit/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ply
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "slimit";
+  version = "unstable-2018-08-08";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "rspivak";
+    repo = "slimit";
+    rev = "3533eba9ad5b39f3a015ae6269670022ab310847";
+    hash = "sha256-J+8RGENM/+eaTNvoC54XXPP+aWmazlssjnZAY88J/F0=";
+  };
+
+  propagatedBuildInputs = [
+    ply
+  ];
+
+  pythonImportsCheck = [
+    "slimit"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "SlimIt -  a JavaScript minifier/parser in Python";
+    homepage = "https://github.com/rspivak/slimit";
+    changelog = "https://github.com/rspivak/slimit/blob/${src.rev}/CHANGES";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/slither-analyzer/default.nix b/nixpkgs/pkgs/development/python-modules/slither-analyzer/default.nix
new file mode 100644
index 000000000000..f613645b390a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slither-analyzer/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, crytic-compile
+, fetchFromGitHub
+, makeWrapper
+, packaging
+, prettytable
+, pythonOlder
+, setuptools
+, solc
+, web3
+, withSolc ? false
+}:
+
+buildPythonPackage rec {
+  pname = "slither-analyzer";
+  version = "0.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "crytic";
+    repo = "slither";
+    rev = "refs/tags/${version}";
+    hash = "sha256-lyjHubnYIwGiA6uAt9erKlTr2sCRGHQy/ZkNByFrFgM=";
+  };
+
+  nativeBuildInputs = [
+    makeWrapper
+  ];
+
+  propagatedBuildInputs = [
+    crytic-compile
+    packaging
+    prettytable
+    setuptools
+    web3
+  ];
+
+  postFixup = lib.optionalString withSolc ''
+    wrapProgram $out/bin/slither \
+      --prefix PATH : "${lib.makeBinPath [ solc ]}"
+  '';
+
+  # No Python tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Static Analyzer for Solidity";
+    longDescription = ''
+      Slither is a Solidity static analysis framework written in Python 3. It
+      runs a suite of vulnerability detectors, prints visual information about
+      contract details, and provides an API to easily write custom analyses.
+    '';
+    homepage = "https://github.com/trailofbits/slither";
+    changelog = "https://github.com/crytic/slither/releases/tag/${version}";
+    license = licenses.agpl3Plus;
+    maintainers = with maintainers; [ arturcygan fab hellwolf ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/slixmpp/default.nix b/nixpkgs/pkgs/development/python-modules/slixmpp/default.nix
new file mode 100644
index 000000000000..17620e452b2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slixmpp/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, aiodns
+, aiohttp
+, fetchPypi
+, gnupg
+, pyasn1
+, pyasn1-modules
+, pytestCheckHook
+, substituteAll
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "slixmpp";
+  version = "1.8.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QG8fS6t+dXPdVZpEECfT3jPRe7o1S88g3caq+6JyKGs=";
+  };
+
+  propagatedBuildInputs = [
+    aiodns
+    aiohttp
+    pyasn1
+    pyasn1-modules
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  patches = [
+    (substituteAll {
+      src = ./hardcode-gnupg-path.patch;
+      inherit gnupg;
+    })
+  ];
+
+  disabledTestPaths = [
+    # Exclude live tests
+    "tests/live_test.py"
+    "tests/test_xep_0454.py"
+  ];
+
+  pythonImportsCheck = [
+    "slixmpp"
+  ];
+
+  meta = with lib; {
+    description = "Python library for XMPP";
+    homepage = "https://slixmpp.readthedocs.io/";
+    changelog = "https://lab.louiz.org/poezio/slixmpp/-/tags/slix-${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/slixmpp/hardcode-gnupg-path.patch b/nixpkgs/pkgs/development/python-modules/slixmpp/hardcode-gnupg-path.patch
new file mode 100644
index 000000000000..4bb3b7c73490
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slixmpp/hardcode-gnupg-path.patch
@@ -0,0 +1,26 @@
+diff --git a/slixmpp/plugins/xep_0027/gpg.py b/slixmpp/plugins/xep_0027/gpg.py
+index a0b1df4..7cfb3bd 100644
+--- a/slixmpp/plugins/xep_0027/gpg.py
++++ b/slixmpp/plugins/xep_0027/gpg.py
+@@ -41,7 +41,7 @@ class XEP_0027(BasePlugin):
+     dependencies = set()
+     stanza = stanza
+     default_config = {
+-        'gpg_binary': 'gpg',
++        'gpg_binary': '@gnupg@/bin/gpg',
+         'gpg_home': '',
+         'use_agent': True,
+         'keyring': None,
+diff --git a/slixmpp/thirdparty/gnupg.py b/slixmpp/thirdparty/gnupg.py
+index a89289f..46dd9b7 100644
+--- a/slixmpp/thirdparty/gnupg.py
++++ b/slixmpp/thirdparty/gnupg.py
+@@ -468,7 +468,7 @@ class GPG(object):
+     }
+ 
+     "Encapsulate access to the gpg executable"
+-    def __init__(self, gpgbinary='gpg', gnupghome=None, verbose=False,
++    def __init__(self, gpgbinary='@gnupg@/bin/gpg', gnupghome=None, verbose=False,
+                  use_agent=False, keyring=None):
+         """Initialize a GPG process wrapper.  Options are:
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/slob/default.nix b/nixpkgs/pkgs/development/python-modules/slob/default.nix
new file mode 100644
index 000000000000..363bd0ab62d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slob/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, pyicu
+, python
+}:
+
+buildPythonPackage {
+  pname = "slob";
+  version = "unstable-2020-06-26";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "itkach";
+    repo = "slob";
+    rev = "018588b59999c5c0eb42d6517fdb84036f3880cb";
+    sha256 = "01195hphjnlcvgykw143rf06s6y955sjc1r825a58vhjx7hj54zh";
+  };
+
+  propagatedBuildInputs = [ pyicu ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest slob
+  '';
+
+  pythonImportsCheck = [ "slob" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/itkach/slob/";
+    description = "Reference implementation of the slob (sorted list of blobs) format";
+    license = licenses.gpl3Only;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/slovnet/default.nix b/nixpkgs/pkgs/development/python-modules/slovnet/default.nix
new file mode 100644
index 000000000000..83f431a6a8c5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slovnet/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, razdel
+, navec
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "slovnet";
+  version = "0.6.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-AtIle9ybnMHSQr007iyGHGSPcIPveJj+FGirzDge95k=";
+  };
+
+  propagatedBuildInputs = [ numpy navec razdel ];
+  nativeCheckInputs = [ pytestCheckHook ];
+  pytestFlagsArray = [ "tests/" ];
+  disabledTestPaths = [
+    # Tries to download model binary artifacts:
+    "tests/test_api.py"
+  ];
+  pythonImportCheck = [ "slovnet" ];
+
+  meta = with lib; {
+    description = "Deep-learning based NLP modeling for Russian language";
+    homepage = "https://github.com/natasha/slovnet";
+    license = licenses.mit;
+    maintainers = with maintainers; [ npatsakula ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/slowapi/default.nix b/nixpkgs/pkgs/development/python-modules/slowapi/default.nix
new file mode 100644
index 000000000000..dfa583bc0d3b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slowapi/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, buildPythonPackage
+, fastapi
+, fetchFromGitHub
+, limits
+, mock
+, hiro
+, poetry-core
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, pythonRelaxDepsHook
+, redis
+, starlette
+}:
+
+buildPythonPackage rec {
+  pname = "slowapi";
+  version = "0.1.8";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "laurentS";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-xgHz8b95SXf/GwzKPfQ/RHbUNJfCx6+7a2HB8+6hjsw=";
+  };
+
+  pythonRelaxDeps = [
+    "limits"
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '["redis^3.4.1"]' '["redis"]'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    limits
+    redis
+  ];
+
+  nativeCheckInputs = [
+    fastapi
+    hiro
+    mock
+    pytestCheckHook
+    starlette
+  ];
+
+  disabledTests = [
+    # AssertionError: Regex pattern 'parameter `request` must be an instance of starlette.requests.Request' does not match 'This portal is not running'.
+    "test_endpoint_request_param_invalid"
+    "test_endpoint_response_param_invalid"
+  ] ++ lib.optionals (pythonAtLeast "3.10") [
+    "test_multiple_decorators"
+  ];
+
+  pythonImportsCheck = [
+    "slowapi"
+  ];
+
+  meta = with lib; {
+    description = "Python library for API rate limiting";
+    homepage = "https://github.com/laurentS/slowapi";
+    changelog = "https://github.com/laurentS/slowapi/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/slpp/default.nix b/nixpkgs/pkgs/development/python-modules/slpp/default.nix
new file mode 100644
index 000000000000..d52ac84dad7a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slpp/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+
+, setuptools
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "slpp";
+  version = "1.2.3";
+  pyproject = true;
+
+  src = fetchPypi {
+    pname = "SLPP";
+    inherit version;
+    hash = "sha256-If3ZMoNICQxxpdMnc+juaKq4rX7MMi9eDMAQEUy1Scg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  # No tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "slpp"
+  ];
+
+  meta = with lib; {
+    description = "Simple lua-python parser";
+    homepage = "https://github.com/SirAnthony/slpp";
+    license = licenses.mit;
+    maintainers = with maintainers; [ paveloom ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/slugid/default.nix b/nixpkgs/pkgs/development/python-modules/slugid/default.nix
new file mode 100644
index 000000000000..34f394bee302
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/slugid/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage
+, lib
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "slugid";
+  version = "2.0.0";
+
+  src = fetchFromGitHub {
+    owner = "taskcluster";
+    repo = "slugid.py";
+    rev = "v${version}";
+    sha256 = "McBxGRi8KqVhe2Xez5k4G67R5wBCCoh41dRsTKW4xMA=";
+  };
+
+  doCheck = false; # has no tests
+
+  pythonImportsCheck = [
+    "slugid"
+  ];
+
+  meta = with lib; {
+    description = "URL-safe base64 UUID encoder for generating 22 character slugs";
+    homepage = "https://github.com/taskcluster/slugid.py";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ milahu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sly/default.nix b/nixpkgs/pkgs/development/python-modules/sly/default.nix
new file mode 100644
index 000000000000..a1ba8f67f87b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sly/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sly";
+  version = "0.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JR1CAV6FBxWK7CFk8GA130qCsDFM5kUPRX1xJedkkCQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  postPatch = ''
+    # imperative dev dependency installation
+    rm Makefile
+  '';
+
+  pythonImportsCheck = [
+    "sly"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "An improved PLY implementation of lex and yacc for Python 3";
+    homepage = "https://github.com/dabeaz/sly";
+    license = licenses.bsd3;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/smart-meter-texas/default.nix b/nixpkgs/pkgs/development/python-modules/smart-meter-texas/default.nix
new file mode 100644
index 000000000000..bd0d181a3ede
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/smart-meter-texas/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, aiohttp
+, asn1
+, python-dateutil
+, tenacity
+}:
+
+buildPythonPackage rec {
+  pname = "smart-meter-texas";
+  version = "0.5.3";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "grahamwetzler";
+    repo = "smart-meter-texas";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-8htd5fLrtkaVlSEm+RB7tWA5YZkcAOjAXVNzZiMwP7k=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest-runner" ""
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+    asn1
+    python-dateutil
+    tenacity
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Connect to and retrieve data from the unofficial Smart Meter Texas API";
+    homepage = "https://github.com/grahamwetzler/smart-meter-texas";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/smart-open/default.nix b/nixpkgs/pkgs/development/python-modules/smart-open/default.nix
new file mode 100644
index 000000000000..df0cbdc8a01c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/smart-open/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, azure-common
+, azure-core
+, azure-storage-blob
+, boto3
+, google-cloud-storage
+, requests
+, moto
+, paramiko
+, pytestCheckHook
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "smart-open";
+  version = "6.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "RaRe-Technologies";
+    repo = "smart_open";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-fciNaVw603FAcgrSrND+LEycJffmnFQij2ZpatYZ/e4=";
+  };
+
+  passthru.optional-dependencies = {
+    s3 = [
+      boto3
+    ];
+    gcs = [
+      google-cloud-storage
+    ];
+    azure = [
+      azure-storage-blob
+      azure-common
+      azure-core
+    ];
+    http = [
+      requests
+    ];
+    webhdfs = [
+      requests
+    ];
+    ssh = [
+      paramiko
+    ];
+  };
+
+  pythonImportsCheck = [
+    "smart_open"
+  ];
+
+  nativeCheckInputs = [
+    moto
+    pytestCheckHook
+    responses
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pytestFlagsArray = [
+    "smart_open"
+  ];
+
+  disabledTests = [
+    # https://github.com/RaRe-Technologies/smart_open/issues/784
+    "test_https_seek_forward"
+    "test_seek_from_current"
+    "test_seek_from_end"
+    "test_seek_from_start"
+  ];
+
+  meta = with lib; {
+    description = "Library for efficient streaming of very large file";
+    homepage = "https://github.com/RaRe-Technologies/smart_open";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jyp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/smarthab/default.nix b/nixpkgs/pkgs/development/python-modules/smarthab/default.nix
new file mode 100644
index 000000000000..f26e294b938f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/smarthab/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, aiohttp
+}:
+
+buildPythonPackage rec {
+  pname = "smarthab";
+  version = "0.21";
+
+  src = fetchPypi {
+    pname = "SmartHab";
+    inherit version;
+    sha256 = "bf929455a2f7cc1e275b331de73d983587138a8d9179574988ba05fa152d3ccf";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # no tests on PyPI, no tags on GitLab
+  doCheck = false;
+
+  pythonImportsCheck = [ "pysmarthab" ];
+
+  meta = with lib; {
+    description = "Control devices in a SmartHab-powered home";
+    homepage = "https://gitlab.com/outadoc/python-smarthab";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/smartypants/default.nix b/nixpkgs/pkgs/development/python-modules/smartypants/default.nix
new file mode 100644
index 000000000000..af21271edc51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/smartypants/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPyPy
+, docutils
+, pygments
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  version = "2.0.1";
+  pname = "smartypants";
+  disabled = isPyPy;
+
+  src = fetchFromGitHub {
+    owner = "leohemsted";
+    repo = "smartypants.py";
+    rev = "v${version}";
+    sha256 = "00p1gnb9pzb3svdq3c5b9b332gsp50wrqqa39gj00m133zadanjp";
+  };
+
+  nativeCheckInputs = [
+    docutils
+    pygments
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    patchShebangs smartypants
+  '';
+
+  meta = with lib; {
+    description = "Python with the SmartyPants";
+    homepage = "https://github.com/leohemsted/smartypants.py";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/smbprotocol/default.nix b/nixpkgs/pkgs/development/python-modules/smbprotocol/default.nix
new file mode 100644
index 000000000000..471f02e50bd8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/smbprotocol/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pyspnego
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "smbprotocol";
+  version = "1.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jborean93";
+    repo = "smbprotocol";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-MhkeizBorDAlTLrvbsuzvrwrbBZv/dYA7Khvg/FrKoI=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    pyspnego
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # https://github.com/jborean93/smbprotocol/issues/119
+    "test_copymode_local_to_local_symlink_dont_follow"
+    "test_copystat_local_to_local_symlink_dont_follow_fail"
+
+    # fail in sandbox due to networking
+    "test_small_recv"
+    "test_recv_"
+  ];
+
+  pythonImportsCheck = [
+    "smbprotocol"
+  ];
+
+  meta = with lib; {
+    description = "Python SMBv2 and v3 Client";
+    homepage = "https://github.com/jborean93/smbprotocol";
+    changelog = "https://github.com/jborean93/smbprotocol/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/smbus-cffi/default.nix b/nixpkgs/pkgs/development/python-modules/smbus-cffi/default.nix
new file mode 100644
index 000000000000..1612a606f316
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/smbus-cffi/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cffi
+, py
+, pytestCheckHook
+, pyserial
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "smbus-cffi";
+  version = "0.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fb4195aaabfc01586863f60d3190b5cb1bf8f12622fd597e23e48768dad6bde8";
+  };
+
+  patches = [
+    # https://github.com/bivab/smbus-cffi/pull/24
+    (fetchpatch {
+      url = "https://github.com/bivab/smbus-cffi/commit/ba79ae174a9d84e767d95f165c43ee212b1bbb92.patch";
+      hash = "sha256-WtRuK5y6fWDEhm0Xy5XqS5yCkn7vXXYtjlOjS90gla4=";
+    })
+  ];
+
+  propagatedNativeBuildInputs = [ cffi ];
+
+  propagatedBuildInputs = [ cffi ];
+
+  installCheckPhase = ''
+    # we want to import the installed module that also contains the compiled library
+    rm -rf smbus
+    runHook pytestCheckPhase
+  '';
+
+  # requires hardware access
+  pytestFlagsArray = [ "--ignore=test/test_smbus_integration.py" ];
+
+  nativeCheckInputs = [ py pytestCheckHook pyserial ];
+
+  meta = with lib; {
+    description = "Python module for SMBus access through Linux I2C /dev interface";
+    homepage = "https://github.com/bivab/smbus-cffi";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ mic92 ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/smbus2/default.nix b/nixpkgs/pkgs/development/python-modules/smbus2/default.nix
new file mode 100644
index 000000000000..893dd1921b51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/smbus2/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "smbus2";
+  version = "0.4.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "kplindegaard";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-tjJurJzDn0ATiYY3Xo66lwUs98/7ZLG3d4+h1prVHAI=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "smbus2"
+  ];
+
+  meta = with lib; {
+    description = "Drop-in replacement for smbus-cffi/smbus-python";
+    homepage = "https://smbus2.readthedocs.io/";
+    changelog = "https://github.com/kplindegaard/smbus2/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/smdebug-rulesconfig/default.nix b/nixpkgs/pkgs/development/python-modules/smdebug-rulesconfig/default.nix
new file mode 100644
index 000000000000..864a395cc88c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/smdebug-rulesconfig/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "smdebug-rulesconfig";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "smdebug_rulesconfig";
+    sha256 = "1mpwjfvpmryqqwlbyf500584jclgm3vnxa740yyfzkvb5vmyc6bs";
+  };
+
+  doCheck = false;
+
+  pythonImportsCheck = [ "smdebug_rulesconfig" ];
+
+  meta = with lib; {
+    description = "These builtin rules are available in Amazon SageMaker";
+    homepage = "https://github.com/awslabs/sagemaker-debugger-rulesconfig";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ nequissimus ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/smhi-pkg/default.nix b/nixpkgs/pkgs/development/python-modules/smhi-pkg/default.nix
new file mode 100644
index 000000000000..e1310a0a386c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/smhi-pkg/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "smhi-pkg";
+  version = "1.0.16";
+
+  src = fetchFromGitHub {
+    owner = "joysoftware";
+    repo = "pypi_smhi";
+    rev = "refs/tags/${version}";
+    hash = "sha256-jcIXzAZO9SxC/0apdjAVv1GmBTbdlasfXr1/Tj9adNc=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Disable tests that needs network access
+    "test_smhi_integration_test"
+    "test_smhi_async_integration_test"
+    "test_smhi_async_integration_test_use_session"
+    "test_smhi_async_get_forecast_integration2"
+    "test_async_error_from_api"
+  ];
+
+  pythonImportsCheck = [ "smhi" ];
+
+  meta = with lib; {
+    description = "Python library for accessing SMHI open forecast data";
+    homepage = "https://github.com/joysoftware/pypi_smhi";
+    changelog = "https://github.com/joysoftware/pypi_smhi/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/smmap/default.nix b/nixpkgs/pkgs/development/python-modules/smmap/default.nix
new file mode 100644
index 000000000000..53afd01afcfa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/smmap/default.nix
@@ -0,0 +1,19 @@
+{ lib, fetchPypi, buildPythonPackage, nosexcover }:
+
+buildPythonPackage rec {
+  pname = "smmap";
+  version = "5.0.0";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936";
+  };
+
+  nativeCheckInputs = [ nosexcover ];
+
+  meta = {
+    description = "A pure python implementation of a sliding window memory map manager";
+    homepage = "https://github.com/gitpython-developers/smmap";
+    maintainers = [ ];
+    license = lib.licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/smpp.pdu/default.nix b/nixpkgs/pkgs/development/python-modules/smpp.pdu/default.nix
new file mode 100644
index 000000000000..8860c4b2c531
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/smpp.pdu/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pydantic
+, requests
+, pytestCheckHook
+, pytest-asyncio
+, setuptools
+}:
+
+buildPythonPackage {
+  pname = "smpp.pdu";
+  version = "unstable-2022-09-02";
+  format = "pyproject";
+
+  # Upstream was once mozes/smpp.pdu, but it's dead and Python 2 only.
+  src = fetchFromGitHub {
+    owner = "hologram-io";
+    repo = "smpp.pdu";
+    rev = "20acc840ded958898eeb35ae9a18df9b29bdaaac";
+    hash = "sha256-/icVexc2S8sbJqn4ioeIhYxyDFIENuCfsFhl0uAHa9g=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "smpp.pdu" ];
+
+  meta = with lib; {
+    description = "Library for parsing Protocol Data Units (PDUs) in SMPP protocol";
+    homepage = "https://github.com/hologram-io/smpp.pdu";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ flokli janik ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/smpplib/default.nix b/nixpkgs/pkgs/development/python-modules/smpplib/default.nix
new file mode 100644
index 000000000000..a991532fa917
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/smpplib/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, six
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "smpplib";
+  version = "2.2.3";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-UhWpWwU40m8YlgDgmCsx2oKB90U81uKGLFsh4+EAIzE=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  postInstall = ''
+    rm -rf $out/${python.sitePackages}/tests
+  '';
+
+  pythonImportsCheck = [
+    "smpplib"
+  ];
+
+  meta = with lib; {
+    description = "SMPP library for Python";
+    homepage = "https://github.com/python-smpplib/python-smpplib";
+    changelog = "https://github.com/python-smpplib/python-smpplib/releases/tag/${version}";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/snakebite/default.nix b/nixpkgs/pkgs/development/python-modules/snakebite/default.nix
new file mode 100644
index 000000000000..a5b8a9931102
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snakebite/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, protobuf
+}:
+
+buildPythonPackage rec {
+  pname = "snakebite";
+  version = "2.11.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "085238b4944cb9c658ee62d5794de936ac3d0c337c504b2cc86424a205ae978a";
+  };
+
+  propagatedBuildInputs = [
+    protobuf
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'argparse'" ""
+  '';
+
+  # Tests require hadoop hdfs
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "snakebite"
+  ];
+
+  meta = with lib; {
+    description = "Pure Python HDFS client";
+    homepage = "https://github.com/spotify/snakebite";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/snakeviz/default.nix b/nixpkgs/pkgs/development/python-modules/snakeviz/default.nix
new file mode 100644
index 000000000000..1b8c1c81183b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snakeviz/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ipython
+, pytestCheckHook
+, pythonOlder
+, requests
+, setuptools
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "snakeviz";
+  version = "2.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jiffyclub";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-tW1zUfCgOGQ8TjrKo2lBzGb0MSe25dP0/P9Q6x3736E=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    tornado
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    ipython
+    pytestCheckHook
+    requests
+  ];
+
+  pythonImportsCheck = [
+    "snakeviz"
+  ];
+
+  preCheck = ''
+    export PATH="$PATH:$out/bin";
+  '';
+
+  meta = with lib; {
+    description = "Browser based viewer for profiling data";
+    homepage = "https://jiffyclub.github.io/snakeviz";
+    changelog = "https://github.com/jiffyclub/snakeviz/blob/v${version}/CHANGES.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ nixy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/snapcast/default.nix b/nixpkgs/pkgs/development/python-modules/snapcast/default.nix
new file mode 100644
index 000000000000..9917e4d3f759
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snapcast/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, construct
+, packaging
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "snapcast";
+  version = "2.3.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "happyleavesaoc";
+    repo = "python-snapcast";
+    rev = "refs/tags/${version}";
+    hash = "sha256-IFgSO0PjlFb4XJarx50Xnx6dF4tBKk3sLcoLWVdpnk8=";
+  };
+
+  propagatedBuildInputs = [
+    construct
+    packaging
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "snapcast"
+  ];
+
+  disabledTests = [
+    # AssertionError and TypeError
+    "test_stream_setmeta"
+    "est_stream_setproperty"
+  ];
+
+  meta = with lib; {
+    description = "Control Snapcast, a multi-room synchronous audio solution";
+    homepage = "https://github.com/happyleavesaoc/python-snapcast/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/snapshottest/default.nix b/nixpkgs/pkgs/development/python-modules/snapshottest/default.nix
new file mode 100644
index 000000000000..a36c8e48d490
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snapshottest/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fastdiff
+, six
+, termcolor
+, pytestCheckHook
+, pytest-cov
+, django
+}:
+
+buildPythonPackage rec {
+  pname = "snapshottest";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0g35ggqw4jd9zmazw55kj6gfjdghv49qx4jw5q231qyqj8fzijmv";
+  };
+
+  propagatedBuildInputs = [ fastdiff six termcolor ];
+
+  nativeCheckInputs = [ django pytestCheckHook pytest-cov ];
+
+  pythonImportsCheck = [ "snapshottest" ];
+
+  meta = with lib; {
+    description = "Snapshot testing for pytest, unittest, Django, and Nose";
+    homepage = "https://github.com/syrusakbary/snapshottest";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/snaptime/default.nix b/nixpkgs/pkgs/development/python-modules/snaptime/default.nix
new file mode 100644
index 000000000000..8555e3640d55
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snaptime/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python-dateutil
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "snaptime";
+  version = "0.2.4";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-4/HriQQ9WNMHIauYy2UCPxpMJ0DjsZdwQpixY8ktUIs=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    pytz
+  ];
+
+  pythonImportsCheck = [ "snaptime" ];
+
+  # no tests on Pypi, no tags on github
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Transform timestamps with a simple DSL";
+    homepage = "https://github.com/zartstrom/snaptime";
+    license = licenses.mit;
+    maintainers = with maintainers; [ pbsds ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sniffio/default.nix b/nixpkgs/pkgs/development/python-modules/sniffio/default.nix
new file mode 100644
index 000000000000..b16cebd557d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sniffio/default.nix
@@ -0,0 +1,37 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, glibcLocales
+, isPy3k
+, pythonOlder
+, pytestCheckHook
+, curio
+}:
+
+buildPythonPackage rec {
+  pname = "sniffio";
+  version = "1.3.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5gMFxeXTFPU4klm38iqqM9j33uSXYxGSNK83VcVbkQE=";
+  };
+
+  disabled = !isPy3k;
+
+  buildInputs = [
+    glibcLocales
+  ];
+
+  nativeCheckInputs = [
+    curio
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/python-trio/sniffio";
+    license = licenses.asl20;
+    description = "Sniff out which async library your code is running under";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/snitun/default.nix b/nixpkgs/pkgs/development/python-modules/snitun/default.nix
new file mode 100644
index 000000000000..9701824a4df2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snitun/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, stdenv
+, async-timeout
+, attrs
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pytest-aiohttp
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "snitun";
+  version = "0.36.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "NabuCasa";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-ViNsmTq1iLxNujA71b9JZB5AZ79ZbiqdTyDeBGd4gUA=";
+  };
+
+  propagatedBuildInputs = [
+    async-timeout
+    attrs
+    cryptography
+  ];
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # broke after aiohttp 3.8.5 upgrade
+    "test_client_stop_no_wait"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "test_multiplexer_data_channel_abort_full" # https://github.com/NabuCasa/snitun/issues/61
+    # port binding conflicts
+    "test_snitun_single_runner_timeout"
+    "test_snitun_single_runner_throttling"
+    # ConnectionResetError: [Errno 54] Connection reset by peer
+    "test_peer_listener_timeout"
+  ] ++ lib.optionals (pythonAtLeast "3.11") [
+    # TypeError: Passing coroutines is forbidden, use tasks explicitly.
+    "test_snitun_runner_updown"
+  ];
+
+  pythonImportsCheck = [ "snitun" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/NabuCasa/snitun/releases/tag/${version}";
+    homepage = "https://github.com/nabucasa/snitun";
+    description = "SNI proxy with TCP multiplexer";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ Scriptkiddi ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/snorkel/default.nix b/nixpkgs/pkgs/development/python-modules/snorkel/default.nix
new file mode 100644
index 000000000000..6e918c2f9145
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snorkel/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, tensorboard
+, scipy
+, tqdm
+, scikit-learn
+, munkres
+, networkx
+, torch
+, pandas
+# test dependencies
+, pytestCheckHook
+, spacy
+, pyspark
+, dill
+, dask
+, spacy_models
+}:
+let
+  pname = "snorkel";
+  version = "0.9.9";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "snorkel-team";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-IDWYvblS0Q8ubuHzgIc7fU/gwpJ43Dd7VMWycMfAJxc=";
+  };
+
+  propagatedBuildInputs = [
+    tensorboard
+    scipy
+    tqdm
+    scikit-learn
+    munkres
+    networkx
+    torch
+    pandas
+  ];
+
+  # test fail because of some wrong path references
+  # things like No such file or directory: '/nix/store/8r9x7xv9nfwmd36ca28a39xaharcjdzj-python3.10-pyspark-3.4.0/lib/python3.10/site-packages/pyspark/./bin/spark-submit'
+  doCheck = false;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    spacy
+    pyspark
+    dill
+    dask
+    spacy_models.en_core_web_sm
+  ] ++ dask.optional-dependencies.distributed;
+
+  meta = with lib; {
+    description = "A system for quickly generating training data with weak supervision";
+    homepage = "https://github.com/snorkel-team/snorkel";
+    changelog = "https://github.com/snorkel/snorkel/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/snowballstemmer/default.nix b/nixpkgs/pkgs/development/python-modules/snowballstemmer/default.nix
new file mode 100644
index 000000000000..60ba22e90390
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snowballstemmer/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, pystemmer, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "snowballstemmer";
+  version = "2.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1";
+  };
+
+  # No tests included
+  doCheck = false;
+
+  propagatedBuildInputs = [ pystemmer ];
+
+  meta = with lib; {
+    description = "16 stemmer algorithms (15 + Poerter English stemmer) generated from Snowball algorithms";
+    homepage = "http://sigal.saimon.org/en/latest/index.html";
+    license = licenses.bsd3;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/snowflake-connector-python/default.nix b/nixpkgs/pkgs/development/python-modules/snowflake-connector-python/default.nix
new file mode 100644
index 000000000000..fc3974db138b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snowflake-connector-python/default.nix
@@ -0,0 +1,107 @@
+{ lib
+, asn1crypto
+, buildPythonPackage
+, pythonRelaxDepsHook
+, certifi
+, cffi
+, charset-normalizer
+, fetchPypi
+, filelock
+, idna
+, keyring
+, oscrypto
+, packaging
+, platformdirs
+, pycryptodomex
+, pyjwt
+, pyopenssl
+, pythonOlder
+, pytz
+, requests
+, setuptools
+, sortedcontainers
+, tomlkit
+, typing-extensions
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "snowflake-connector-python";
+  version = "3.3.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-u2ZyK9ZKvNdqarBqZCPWdLy3Kfm6ORBWl375Lzg6rbg=";
+  };
+
+  # snowflake-connector-python requires arrow 10.0.1, which we don't have in
+  # nixpkgs, so we cannot build the C extensions that use it. thus, patch out
+  # cython and pyarrow from the build dependencies
+  #
+  # keep an eye on following issue for improvements to this situation:
+  #
+  #   https://github.com/snowflakedb/snowflake-connector-python/issues/1144
+  #
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"cython",' "" \
+      --replace '"pyarrow>=10.0.1,<10.1.0",' ""
+  '';
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    setuptools
+    wheel
+  ];
+
+  pythonRelaxDeps = [
+    "pyOpenSSL"
+    "charset-normalizer"
+    "cryptography"
+    "platformdirs"
+  ];
+
+  propagatedBuildInputs = [
+    asn1crypto
+    certifi
+    cffi
+    charset-normalizer
+    filelock
+    idna
+    oscrypto
+    packaging
+    platformdirs
+    pycryptodomex
+    pyjwt
+    pyopenssl
+    pytz
+    requests
+    sortedcontainers
+    tomlkit
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = {
+    secure-local-storage = [ keyring ];
+  };
+
+  # Tests require encrypted secrets, see
+  # https://github.com/snowflakedb/snowflake-connector-python/tree/master/.github/workflows/parameters
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "snowflake"
+    "snowflake.connector"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/snowflakedb/snowflake-connector-python/blob/v${version}/DESCRIPTION.md";
+    description = "Snowflake Connector for Python";
+    homepage = "https://github.com/snowflakedb/snowflake-connector-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/snowflake-sqlalchemy/default.nix b/nixpkgs/pkgs/development/python-modules/snowflake-sqlalchemy/default.nix
new file mode 100644
index 000000000000..41f7c2e10c3d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snowflake-sqlalchemy/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, snowflake-connector-python
+, sqlalchemy
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "snowflake-sqlalchemy";
+  version = "1.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-PtD3fQnIqd79NcYFdDMlpNwhCY6PHGL/wDR/QnKdsFo=";
+  };
+
+  propagatedBuildInputs = [
+    six
+    snowflake-connector-python
+    sqlalchemy
+  ];
+
+  # Pypi does not include tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "snowflake.sqlalchemy"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/snowflakedb/snowflake-sqlalchemy/blob/v${version}/DESCRIPTION.md";
+    description = "Snowflake SQLAlchemy Dialect";
+    homepage = "https://github.com/snowflakedb/snowflake-sqlalchemy";
+    license = licenses.asl20;
+    maintainers = [ ];
+
+    # https://github.com/snowflakedb/snowflake-sqlalchemy/issues/380
+    broken = versionAtLeast sqlalchemy.version "2";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/snscrape/default.nix b/nixpkgs/pkgs/development/python-modules/snscrape/default.nix
new file mode 100644
index 000000000000..cb07518e95d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snscrape/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, fetchFromGitHub
+, filelock
+, lxml
+, pythonOlder
+, pytz
+, requests
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "snscrape";
+  version = "0.7.0.20230622";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "JustAnotherArchivist";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-9xAUMr1SWFePEvIz6DFEexk9Txex3u8wPNfMAdxEUCA=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    filelock
+    lxml
+    requests
+  ]
+  ++ requests.optional-dependencies.socks
+  ++ lib.optionals (pythonOlder "3.9") [
+    pytz
+  ];
+
+  # There are no tests; make sure the executable works.
+  checkPhase = ''
+    export PATH=$PATH:$out/bin
+    snscrape --help
+  '';
+
+  pythonImportsCheck = [
+    "snscrape"
+  ];
+
+  meta = with lib; {
+    description = "A social networking service scraper";
+    homepage = "https://github.com/JustAnotherArchivist/snscrape";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ ivan ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/snuggs/default.nix b/nixpkgs/pkgs/development/python-modules/snuggs/default.nix
new file mode 100644
index 000000000000..9290e2f36987
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/snuggs/default.nix
@@ -0,0 +1,29 @@
+{ buildPythonPackage, lib, fetchFromGitHub
+, click, numpy, pyparsing
+, pytest, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "snuggs";
+  version = "1.4.7";
+
+  # Pypi doesn't ship the tests, so we fetch directly from GitHub
+  src = fetchFromGitHub {
+    owner = "mapbox";
+    repo = pname;
+    rev = version;
+    sha256 = "1p3lh9s2ylsnrzbs931y2vn7mp2y2xskgqmh767c9l1a33shfgwf";
+  };
+
+  propagatedBuildInputs = [ click numpy pyparsing ];
+
+  nativeCheckInputs = [ pytest hypothesis ];
+  checkPhase = "pytest test_snuggs.py";
+
+  meta = with lib; {
+    description = "S-expressions for Numpy";
+    license = licenses.mit;
+    homepage = "https://github.com/mapbox/snuggs";
+    maintainers = with maintainers; [ mredaelli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/social-auth-app-django/default.nix b/nixpkgs/pkgs/development/python-modules/social-auth-app-django/default.nix
new file mode 100644
index 000000000000..a8fd2503dbe0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/social-auth-app-django/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, social-auth-core
+, django
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "social-auth-app-django";
+  version = "5.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "python-social-auth";
+    repo = "social-app-django";
+    rev = "refs/tags/${version}";
+    hash = "sha256-CZF1DA4UUnmGfdmWlBJ0zJIYx1E03a7Z7Y6WJNFU68M=";
+  };
+
+  propagatedBuildInputs = [
+    social-auth-core
+  ];
+
+  pythonImportsCheck = [
+    "social_django"
+  ];
+
+  nativeCheckInputs = [
+    django
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m django test --settings="tests.settings"
+  '';
+
+  meta = with lib; {
+    description = "Module for social authentication/registration mechanism";
+    homepage = "https://github.com/python-social-auth/social-app-django";
+    changelog = "https://github.com/python-social-auth/social-app-django/blob/${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ n0emis ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/social-auth-core/default.nix b/nixpkgs/pkgs/development/python-modules/social-auth-core/default.nix
new file mode 100644
index 000000000000..5506f417be04
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/social-auth-core/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, defusedxml
+, fetchFromGitHub
+, httpretty
+, lxml
+, oauthlib
+, pyjwt
+, pytestCheckHook
+, python-jose
+, python3-openid
+, python3-saml
+, pythonOlder
+, requests
+, requests-oauthlib
+}:
+
+buildPythonPackage rec {
+  pname = "social-auth-core";
+  version = "4.4.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "python-social-auth";
+    repo = "social-core";
+    rev = "refs/tags/${version}";
+    hash = "sha256-o/qx3bwaj2fiNKM3fafFxOW27JrJ9jG4M4uSnnJDpes=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    defusedxml
+    oauthlib
+    pyjwt
+    python3-openid
+    requests
+    requests-oauthlib
+  ];
+
+  passthru.optional-dependencies = {
+    openidconnect = [
+      python-jose
+    ];
+    saml = [
+      lxml
+      python3-saml
+    ];
+    azuread = [
+      cryptography
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    httpretty
+  ] ++ lib.flatten (lib.attrValues passthru.optional-dependencies);
+
+  # Disable checking the code coverage
+  prePatch = ''
+    substituteInPlace social_core/tests/requirements.txt \
+      --replace "coverage>=3.6" "" \
+      --replace "pytest-cov>=2.7.1" ""
+
+    substituteInPlace tox.ini \
+      --replace "{posargs:-v --cov=social_core}" "{posargs:-v}"
+  '';
+
+  pythonImportsCheck = [
+    "social_core"
+  ];
+
+  meta = with lib; {
+    description = "Module for social authentication/registration mechanisms";
+    homepage = "https://github.com/python-social-auth/social-core";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ n0emis ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/socialscan/default.nix b/nixpkgs/pkgs/development/python-modules/socialscan/default.nix
new file mode 100644
index 000000000000..db9cd3c1f8ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/socialscan/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, colorama
+, pythonOlder
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "socialscan";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "iojw";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-jiyTcpJ00DvfweChawj1ugdCVHHAdwDbHEp9jivH7gs=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    colorama
+    tqdm
+  ];
+
+  # Tests require network access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "socialscan"
+  ];
+
+  meta = with lib; {
+    description = "Python library and CLI for accurately querying username and email usage on online platforms";
+    homepage = "https://github.com/iojw/socialscan";
+    changelog = "https://github.com/iojw/socialscan/releases/tag/v${version}";
+    license = with licenses; [ mpl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/socid-extractor/default.nix b/nixpkgs/pkgs/development/python-modules/socid-extractor/default.nix
new file mode 100644
index 000000000000..2c163aa7b34b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/socid-extractor/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, fetchFromGitHub
+, python-dateutil
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "socid-extractor";
+  version = "0.0.26";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "soxoj";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-3ht/wlxB40k4n0DTBGAvAl7yPiUIZqAe+ECbtkyMTzk=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    python-dateutil
+    requests
+  ];
+
+  postPatch = ''
+    # https://github.com/soxoj/socid-extractor/pull/150
+    substituteInPlace requirements.txt \
+      --replace "beautifulsoup4~=4.11.1" "beautifulsoup4>=4.10.0"
+  '';
+
+  # Test require network access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "socid_extractor"
+  ];
+
+  meta = with lib; {
+    description = "Python module to extract details from personal pages";
+    homepage = "https://github.com/soxoj/socid-extractor";
+    changelog = "https://github.com/soxoj/socid-extractor/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/socketio-client/default.nix b/nixpkgs/pkgs/development/python-modules/socketio-client/default.nix
new file mode 100644
index 000000000000..43587824e01a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/socketio-client/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, requests
+, six
+, websocket-client
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "socketio-client";
+  version = "0.7.2";
+
+  src = fetchFromGitHub {
+    owner = "invisibleroads";
+    repo = "socketio-client";
+    rev = version;
+    hash = "sha256-71sjiGJDDYElPGUNCH1HaVdvgMt8KeD/kXVDpF615ho=";
+  };
+
+  propagatedBuildInputs = [
+    six
+    websocket-client
+    requests
+  ];
+
+  # Perform networking tests.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "socketIO_client"
+  ];
+
+  meta = with lib; {
+    description = "A socket.io client library for protocol 1.x";
+    homepage = "https://github.com/invisibleroads/socketIO-client";
+    license = licenses.mit;
+    maintainers = with maintainers; [ raitobezarius ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sockio/default.nix b/nixpkgs/pkgs/development/python-modules/sockio/default.nix
new file mode 100644
index 000000000000..8ce561b781f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sockio/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sockio";
+  version = "0.15.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tiagocoutinho";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-NSGd7/k1Yr408dipMNBSPRSwQ+wId7VLxgqMM/UmN/Q=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov-config=.coveragerc --cov sockio" "" \
+      --replace "--cov-report html --cov-report term" "" \
+      --replace "--durations=2 --verbose" ""
+  '';
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sockio"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_open_timeout"
+    "test_write_readline_error"
+    "test_open_close"
+    "test_callbacks"
+    "test_coroutine_callbacks"
+    "test_error_callback"
+    "test_eof_callback"
+    "test_write_read"
+    "test_write_readline"
+    "test_write_readlines"
+    "test_writelines_readlines"
+    "test_writelines"
+    "test_readline"
+    "test_readuntil"
+    "test_readexactly"
+    "test_readlines"
+    "test_read"
+    "test_readbuffer"
+    "test_parallel_rw"
+    "test_parallel"
+    "test_stream"
+    "test_timeout"
+    "test_line_stream"
+    "test_block_stream"
+    "test_socket_for_url"
+    "test_root_socket_for_url"
+  ];
+
+  disabledTestPaths = [
+    # We don't care about Python 2.x
+    "tests/test_py2.py"
+  ];
+
+  meta = with lib; {
+    description = "Implementation of the Modbus protocol";
+    homepage = "https://tiagocoutinho.github.io/sockio/";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sockjs-tornado/default.nix b/nixpkgs/pkgs/development/python-modules/sockjs-tornado/default.nix
new file mode 100644
index 000000000000..c7235468370f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sockjs-tornado/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, tornado }:
+
+buildPythonPackage rec {
+  pname = "sockjs-tornado";
+  version = "1.0.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "02ff25466b3a46b1a7dbe477340b042770ac078de7ea475a6285a28a75eb1fab";
+  };
+
+  propagatedBuildInputs = [ tornado ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mrjoes/sockjs-tornado/";
+    description = "SockJS python server implementation on top of Tornado framework";
+    license = licenses.mit;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sockjs/default.nix b/nixpkgs/pkgs/development/python-modules/sockjs/default.nix
new file mode 100644
index 000000000000..d589179338fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sockjs/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, aiohttp }:
+
+buildPythonPackage rec {
+  pname = "sockjs";
+  version = "0.11.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "A0fUBO2e8xllBnh+2AGPh+5OLQuupJ1CDN1TqWm+wik=";
+  };
+
+  propagatedBuildInputs = [ aiohttp ];
+
+  pythonImportsCheck = [ "sockjs" ];
+
+  meta = with lib; {
+    description = "Sockjs server";
+    homepage = "https://github.com/aio-libs/sockjs";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ freezeboy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/socksio/default.nix b/nixpkgs/pkgs/development/python-modules/socksio/default.nix
new file mode 100644
index 000000000000..fb767db631d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/socksio/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, pythonAtLeast
+, flit-core
+, pytestCheckHook
+}:
+
+let
+  pname = "socksio";
+  version = "1.0.0";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+IvrPaW1w4uYkEad5n0MsPnUlLeLEGyhhF+WwQuRxKw=";
+  };
+
+  patches = [
+    # https://github.com/sethmlarson/socksio/pull/61
+    (fetchpatch {
+      name = "unpin-flit-core.patch";
+      url = "https://github.com/sethmlarson/socksio/commit/5c50fd76e7459bb822ff8f712172a78e21b8dd04.patch";
+      hash = "sha256-VVUzFvF2KCXXkCfCU5xu9acT6OLr+PlQQPeVGONtU4A=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  # remove coverage configuration
+  preCheck = ''
+    rm pytest.ini
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Sans-I/O implementation of SOCKS4, SOCKS4A, and SOCKS5";
+    homepage = "https://github.com/sethmlarson/socksio";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/socksipy-branch/default.nix b/nixpkgs/pkgs/development/python-modules/socksipy-branch/default.nix
new file mode 100644
index 000000000000..abfee3718b53
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/socksipy-branch/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "SocksiPy-branch";
+  version = "1.01";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "01l41v4g7fy9fzvinmjxy6zcbhgqaif8dhdqm4w90fwcw9h51a8p";
+  };
+
+  meta = with lib; {
+    homepage = "http://code.google.com/p/socksipy-branch/";
+    description = "This Python module allows you to create TCP connections through a SOCKS proxy without any special effort";
+    license = licenses.bsd3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/soco/default.nix b/nixpkgs/pkgs/development/python-modules/soco/default.nix
new file mode 100644
index 000000000000..01128c77a5d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/soco/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, graphviz
+, appdirs
+, ifaddr
+, pythonOlder
+, lxml
+, mock
+, nix-update-script
+, pytestCheckHook
+, requests
+, requests-mock
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "soco";
+  version = "0.29.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "SoCo";
+    repo = "SoCo";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Kp9rG7fJzvmnLpjVulf9kODoABdjaaHvgyed9I+FHVA=";
+  };
+
+  propagatedBuildInputs = [
+    appdirs
+    ifaddr
+    lxml
+    requests
+    xmltodict
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    graphviz
+    mock
+    requests-mock
+  ];
+
+  pythonImportsCheck = [
+    "soco"
+  ];
+
+  passthru.updateScript = nix-update-script { };
+
+  meta = with lib; {
+    description = "CLI and library to control Sonos speakers";
+    homepage = "http://python-soco.com/";
+    changelog = "https://github.com/SoCo/SoCo/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lovesegfault ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/softlayer/default.nix b/nixpkgs/pkgs/development/python-modules/softlayer/default.nix
new file mode 100644
index 000000000000..28c24f533d75
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/softlayer/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, mock
+, prettytable
+, prompt-toolkit
+, ptable
+, pygments
+, pytestCheckHook
+, pythonOlder
+, requests
+, rich
+, sphinx
+, testtools
+, tkinter
+, urllib3
+, zeep
+}:
+
+buildPythonPackage rec {
+  pname = "softlayer";
+  version = "6.1.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = "softlayer-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-0NLa+kEArKqfqytnxbzXnX/OVhYFBKZO9odXGR0AoSA=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+        --replace "rich ==" "rich >="
+  '';
+
+  propagatedBuildInputs = [
+    click
+    prettytable
+    prompt-toolkit
+    ptable
+    pygments
+    requests
+    rich
+    urllib3
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+    sphinx
+    testtools
+    tkinter
+    zeep
+  ];
+
+  # Otherwise soap_tests.py will fail to create directory
+  # Permission denied: '/homeless-shelter'
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  disabledTestPaths = [
+    # Test fails with ConnectionError trying to connect to api.softlayer.com
+    "tests/transports/soap_tests.py.unstable"
+  ];
+
+  pythonImportsCheck = [
+    "SoftLayer"
+  ];
+
+  meta = with lib; {
+    description = "Python libraries that assist in calling the SoftLayer API";
+    homepage = "https://github.com/softlayer/softlayer-python";
+    changelog = "https://github.com/softlayer/softlayer-python/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/solaredge/default.nix b/nixpkgs/pkgs/development/python-modules/solaredge/default.nix
new file mode 100644
index 000000000000..f593ff501620
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/solaredge/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python-dateutil
+, pythonOlder
+, pytz
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "solaredge";
+  version = "0.0.4";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0q4gib0l3qnlpncg84ki027vr1apjlr47vd6845rpk7zkm8lqgfz";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    pytz
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "solaredge" ];
+
+  meta = with lib; {
+    description = "Python wrapper for Solaredge monitoring service";
+    homepage = "https://github.com/bertouttier/solaredge";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/solax/default.nix b/nixpkgs/pkgs/development/python-modules/solax/default.nix
new file mode 100644
index 000000000000..b66bac955ab1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/solax/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pytest-asyncio
+, pytest-cov
+, pytest-httpserver
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "solax";
+  version = "0.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7UDTG8rw9XJd5LPqcAe2XyE7DQa96dBj9YOcgW+/aFc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    voluptuous
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-cov
+    pytest-httpserver
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "solax"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for the Solax Inverter API";
+    homepage = "https://github.com/squishykid/solax";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/solc-select/default.nix b/nixpkgs/pkgs/development/python-modules/solc-select/default.nix
new file mode 100644
index 000000000000..d9910e570d5d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/solc-select/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, packaging
+, pycryptodome
+}:
+
+buildPythonPackage rec {
+  pname = "solc-select";
+  version = "1.0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-23ud4AmvbeOlQWuAu+W21ja/MUcDwBYxm4wSMeJIpsc=";
+  };
+
+  propagatedBuildInputs = [
+    packaging
+    pycryptodome
+  ];
+
+  # no tests
+  doCheck = false;
+  pythonImportsCheck = [ "solc_select" ];
+
+  meta = with lib; {
+    description = "Manage and switch between Solidity compiler versions";
+    homepage = "https://github.com/crytic/solc-select";
+    license = licenses.agpl3Plus;
+    maintainers = with maintainers; [ arturcygan ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/solo-python/default.nix b/nixpkgs/pkgs/development/python-modules/solo-python/default.nix
new file mode 100644
index 000000000000..fef12eb963a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/solo-python/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, flit
+, click
+, cryptography
+, ecdsa
+, fido2
+, intelhex
+, pyserial
+, pyusb
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "solo-python";
+  version = "0.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "solokeys";
+    repo = pname;
+    rev = version;
+    hash = "sha256-XVPYr7JwxeZfZ68+vQ7a7MNiAfJ2bvMbM3R1ryVJ+OU=";
+  };
+
+  nativeBuildInputs = [
+    flit
+  ];
+
+  propagatedBuildInputs = [
+    click
+    cryptography
+    ecdsa
+    fido2
+    intelhex
+    pyserial
+    pyusb
+    requests
+  ];
+
+  preBuild = ''
+    export HOME=$TMPDIR
+  '';
+
+  pythonImportsCheck = [
+    "solo"
+    "solo.cli"
+    "solo.commands"
+    "solo.fido2"
+    "solo.operations"
+  ];
+
+  meta = with lib; {
+    description = "Python tool and library for SoloKeys Solo 1";
+    homepage = "https://github.com/solokeys/solo1-cli";
+    maintainers = with maintainers; [ wucke13 ];
+    license = with licenses; [ asl20 mit ];
+    # not compatible with fido2 >= 1.0.0
+    # https://github.com/solokeys/solo1-cli/issues/157
+    broken = versionAtLeast fido2.version "1.0.0";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/somajo/default.nix b/nixpkgs/pkgs/development/python-modules/somajo/default.nix
new file mode 100644
index 000000000000..0c953e20c5fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/somajo/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, buildPythonPackage
+, pythonOlder
+, setuptools
+, regex
+}:
+
+buildPythonPackage rec {
+  pname = "somajo";
+  version = "2.3.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tsproisl";
+    repo = "SoMaJo";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-3A2et4pl92LsRtEx2Ki8Soz3n1nZEGQGPc3ZIBDojNM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    regex
+  ];
+
+  # loops forever
+  doCheck = !stdenv.isDarwin;
+
+  pythonImportsCheck = [
+    "somajo"
+  ];
+
+  meta = with lib; {
+    description = "Tokenizer and sentence splitter for German and English web texts";
+    homepage = "https://github.com/tsproisl/SoMaJo";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/somfy-mylink-synergy/default.nix b/nixpkgs/pkgs/development/python-modules/somfy-mylink-synergy/default.nix
new file mode 100644
index 000000000000..b0fa5948c0da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/somfy-mylink-synergy/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "somfy-mylink-synergy";
+  version = "1.0.6";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "bendews";
+    repo = "somfy-mylink-synergy";
+    rev = "v${version}";
+    sha256 = "1aa178b5lxdzfa4z7sjw6ky39dkfazp7dqs9dq78z2zay2sqgmgr";
+  };
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "somfy_mylink_synergy" ];
+
+  meta = with lib; {
+    description = "Python API to utilise the Somfy Synergy JsonRPC API";
+    homepage = "https://github.com/bendews/somfy-mylink-synergy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sonarr/default.nix b/nixpkgs/pkgs/development/python-modules/sonarr/default.nix
new file mode 100644
index 000000000000..2cc1095b9ede
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sonarr/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, aiohttp
+, yarl
+, aresponses
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sonarr";
+  version = "0.3.0";
+
+  src = fetchFromGitHub {
+    owner = "ctalkington";
+    repo = "python-sonarr";
+    rev = version;
+    sha256 = "0gi34951qhzzrq59hj93mnkid8cvvknlamkhir6ya9mb23fr7bya";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "sonarr" ];
+
+  meta = with lib; {
+    description = "Asynchronous Python client for the Sonarr API";
+    homepage = "https://github.com/ctalkington/python-sonarr";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sonos-websocket/default.nix b/nixpkgs/pkgs/development/python-modules/sonos-websocket/default.nix
new file mode 100644
index 000000000000..594469400cae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sonos-websocket/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "sonos-websocket";
+  version = "0.1.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jjlawren";
+    repo = "sonos-websocket";
+    rev = "refs/tags/${version}";
+    hash = "sha256-QUX724Q8HtOiWuCfKouy7be0gTn6Vo3QHnw3MXJcMZo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sonos_websocket"
+  ];
+
+  meta = with lib; {
+    description = "Library to communicate with Sonos devices over websockets";
+    homepage = "https://github.com/jjlawren/sonos-websocket";
+    changelog = "https://github.com/jjlawren/sonos-websocket/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sopel/default.nix b/nixpkgs/pkgs/development/python-modules/sopel/default.nix
new file mode 100644
index 000000000000..93b942811c38
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sopel/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, buildPythonPackage
+, dnspython
+, fetchPypi
+, geoip2
+, ipython
+, isPyPy
+, praw
+, pyenchant
+, pygeoip
+, pytestCheckHook
+, pythonOlder
+, pytz
+, sqlalchemy
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "sopel";
+  version = "7.1.9";
+  format = "setuptools";
+
+  disabled = isPyPy || pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-IJ+ovLQv6/UU1oepmUQjzaWBG3Rdd3xvui7FjK85Urs=";
+  };
+
+  patches = [
+    # https://github.com/sopel-irc/sopel/issues/2401
+    # https://github.com/sopel-irc/sopel/commit/596adc44330939519784389cbb927435305ef758.patch
+    # rewrite the patch because there are too many patches needed to apply the above patch.
+    ./python311-support.patch
+  ];
+
+  propagatedBuildInputs = [
+    dnspython
+    geoip2
+    ipython
+    praw
+    pyenchant
+    pygeoip
+    pytz
+    sqlalchemy
+    xmltodict
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "praw>=4.0.0,<6.0.0" "praw" \
+      --replace "sqlalchemy<1.4" "sqlalchemy" \
+      --replace "xmltodict==0.12" "xmltodict>=0.12"
+  '';
+
+  preCheck = ''
+    export TESTDIR=$(mktemp -d)
+    cp -R ./test $TESTDIR
+    pushd $TESTDIR
+  '';
+
+  postCheck = ''
+    popd
+  '';
+
+  pythonImportsCheck = [
+    "sopel"
+  ];
+
+  meta = with lib; {
+    description = "Simple and extensible IRC bot";
+    homepage = "https://sopel.chat";
+    license = licenses.efl20;
+    maintainers = with maintainers; [ mog ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sopel/python311-support.patch b/nixpkgs/pkgs/development/python-modules/sopel/python311-support.patch
new file mode 100644
index 000000000000..dfa0283409ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sopel/python311-support.patch
@@ -0,0 +1,96 @@
+diff --git a/sopel/plugins/handlers.py b/sopel/plugins/handlers.py
+index 76902aa0..05f0279d 100644
+--- a/sopel/plugins/handlers.py
++++ b/sopel/plugins/handlers.py
+@@ -46,20 +46,15 @@ from __future__ import absolute_import, division, print_function, unicode_litera
+ 
+ import imp
+ import importlib
++import importlib.util
+ import inspect
+ import itertools
+ import os
++import sys
+ 
+ from sopel import loader
+ from . import exceptions
+ 
+-try:
+-    reload = importlib.reload
+-except AttributeError:
+-    # py2: no reload function
+-    # TODO: imp is deprecated, to be removed when py2 support is dropped
+-    reload = imp.reload
+-
+ 
+ class AbstractPluginHandler(object):
+     """Base class for plugin handlers.
+@@ -301,7 +296,7 @@ class PyModulePlugin(AbstractPluginHandler):
+ 
+         This method assumes the plugin is already loaded.
+         """
+-        self._module = reload(self._module)
++        self._module = importlib.reload(self._module)
+ 
+     def is_loaded(self):
+         return self._module is not None
+@@ -402,45 +397,31 @@ class PyFilePlugin(PyModulePlugin):
+ 
+         if good_file:
+             name = os.path.basename(filename)[:-3]
+-            module_type = imp.PY_SOURCE
++            spec = importlib.util.spec_from_file_location(
++                name,
++                filename,
++            )
+         elif good_dir:
+             name = os.path.basename(filename)
+-            module_type = imp.PKG_DIRECTORY
++            spec = importlib.util.spec_from_file_location(
++                name,
++                os.path.join(filename, '__init__.py'),
++                submodule_search_locations=filename,
++            )
+         else:
+             raise exceptions.PluginError('Invalid Sopel plugin: %s' % filename)
+ 
+         self.filename = filename
+         self.path = filename
+-        self.module_type = module_type
++        self.module_spec = spec
+ 
+         super(PyFilePlugin, self).__init__(name)
+ 
+     def _load(self):
+-        # The current implementation uses `imp.load_module` to perform the
+-        # load action, which also reloads the module. However, `imp` is
+-        # deprecated in Python 3, so that might need to be changed when the
+-        # support for Python 2 is dropped.
+-        #
+-        # However, the solution for Python 3 is non-trivial, since the
+-        # `importlib` built-in module does not have a similar function,
+-        # therefore requires to dive into its public internals
+-        # (``importlib.machinery`` and ``importlib.util``).
+-        #
+-        # All of that is doable, but represents a lot of work. As long as
+-        # Python 2 is supported, we can keep it for now.
+-        #
+-        # TODO: switch to ``importlib`` when Python2 support is dropped.
+-        if self.module_type == imp.PY_SOURCE:
+-            with open(self.path) as mod:
+-                description = ('.py', 'U', self.module_type)
+-                mod = imp.load_module(self.name, mod, self.path, description)
+-        elif self.module_type == imp.PKG_DIRECTORY:
+-            description = ('', '', self.module_type)
+-            mod = imp.load_module(self.name, None, self.path, description)
+-        else:
+-            raise TypeError('Unsupported module type')
+-
+-        return mod
++        module = importlib.util.module_from_spec(self.module_spec)
++        sys.modules[self.name] = module
++        self.module_spec.loader.exec_module(module)
++        return module
+ 
+     def get_meta_description(self):
+         """Retrieve a meta description for the plugin.
diff --git a/nixpkgs/pkgs/development/python-modules/sorl-thumbnail/default.nix b/nixpkgs/pkgs/development/python-modules/sorl-thumbnail/default.nix
new file mode 100644
index 000000000000..2337d6b940c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sorl-thumbnail/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, setuptools-scm
+, django
+}:
+
+buildPythonPackage rec {
+  pname = "sorl-thumbnail";
+  version = "12.10.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3pWkkhf9/s7SIvo86qAdMS7i+KrVa6NNbHDy3umoSTg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    django
+  ];
+
+  env.DJANGO_SETTINGS_MODULE = "sorl.thumbnail.conf.defaults";
+
+  # Disabled due to an improper configuration error when tested against django. This looks like something broken in the test cases for sorl.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sorl.thumbnail"
+  ];
+
+  meta = with lib; {
+    homepage = "https://sorl-thumbnail.readthedocs.org/en/latest/";
+    description = "Thumbnails for Django";
+    changelog = "https://github.com/jazzband/sorl-thumbnail/blob/${version}/CHANGES.rst";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sortedcollections/default.nix b/nixpkgs/pkgs/development/python-modules/sortedcollections/default.nix
new file mode 100644
index 000000000000..73bc2757c6f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sortedcollections/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-cov
+, pytestCheckHook
+, sortedcontainers
+}:
+
+buildPythonPackage rec {
+  pname = "sortedcollections";
+  version = "2.1.0";
+
+  src = fetchFromGitHub {
+    owner = "grantjenks";
+    repo = "python-sortedcollections";
+    rev = "v${version}";
+    hash = "sha256-GkZO8afUAgDpDjIa3dhO6nxykqrljeKldunKMODSXfg=";
+  };
+
+  propagatedBuildInputs = [ sortedcontainers ];
+
+  nativeCheckInputs = [
+    pytest-cov
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "sortedcollections" ];
+
+  meta = with lib; {
+    description = "Python Sorted Collections";
+    homepage = "http://www.grantjenks.com/docs/sortedcollections/";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sortedcontainers/default.nix b/nixpkgs/pkgs/development/python-modules/sortedcontainers/default.nix
new file mode 100644
index 000000000000..3b60be8c4877
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sortedcontainers/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+let
+  sortedcontainers = buildPythonPackage rec {
+    pname = "sortedcontainers";
+    version = "2.4.0";
+
+    src = fetchFromGitHub {
+      owner = "grantjenks";
+      repo = "python-sortedcontainers";
+      rev = "v${version}";
+      hash = "sha256-YRbSM2isWi7AzfquFvuZBlpEMNUnBJTBLBn0/XYVHKQ=";
+    };
+
+    doCheck = false;
+
+    nativeCheckInputs = [
+      pytestCheckHook
+    ];
+
+    pythonImportsCheck = [ "sortedcontainers" ];
+
+    passthru.tests = {
+      pytest = sortedcontainers.overridePythonAttrs (_: { doCheck = true; });
+    };
+
+    meta = with lib; {
+      description = "Python Sorted Container Types: SortedList, SortedDict, and SortedSet";
+      homepage = "https://grantjenks.com/docs/sortedcontainers/";
+      license = licenses.asl20;
+      maintainers = with maintainers; [ ];
+    };
+  };
+in
+sortedcontainers
diff --git a/nixpkgs/pkgs/development/python-modules/soundcloud-v2/default.nix b/nixpkgs/pkgs/development/python-modules/soundcloud-v2/default.nix
new file mode 100644
index 000000000000..ca21c4cebb8e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/soundcloud-v2/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, dacite
+, python-dateutil
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "soundcloud-v2";
+  version = "1.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9a9c12aa22e71566e2ca6015267cabc1856afd79fa458f0fc43c44872c184741";
+  };
+
+  propagatedBuildInputs = [
+    dacite
+    python-dateutil
+    requests
+  ];
+
+  # tests require network
+  doCheck = false;
+
+  pythonImportsCheck = [ "soundcloud" ];
+
+  meta = with lib; {
+    description = "Python wrapper for the v2 SoundCloud API";
+    homepage = "https://github.com/7x11x13/soundcloud.py";
+    license = licenses.mit;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sounddevice/default.nix b/nixpkgs/pkgs/development/python-modules/sounddevice/default.nix
new file mode 100644
index 000000000000..46e16e58a35d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sounddevice/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, cffi
+, numpy
+, portaudio
+, substituteAll
+}:
+
+buildPythonPackage rec {
+  pname = "sounddevice";
+  version = "0.4.6";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Mja3jxXwQVvfAGpiDO8HPQwFIoUdZvSpYe1tjrFIL+k=";
+  };
+
+  propagatedBuildInputs = [ cffi numpy portaudio ];
+
+  # No tests included nor upstream available.
+  doCheck = false;
+
+  pythonImportsCheck = [ "sounddevice" ];
+
+  patches = [
+    (substituteAll {
+      src = ./fix-portaudio-library-path.patch;
+      portaudio = "${portaudio}/lib/libportaudio${stdenv.hostPlatform.extensions.sharedLibrary}";
+    })
+  ];
+
+  meta = {
+    description = "Play and Record Sound with Python";
+    homepage = "http://python-sounddevice.rtfd.org/";
+    license = with lib.licenses; [ mit ];
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sounddevice/fix-portaudio-library-path.patch b/nixpkgs/pkgs/development/python-modules/sounddevice/fix-portaudio-library-path.patch
new file mode 100644
index 000000000000..a5761764fdbb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sounddevice/fix-portaudio-library-path.patch
@@ -0,0 +1,35 @@
+diff --git i/sounddevice.py w/sounddevice.py
+index c7c1d62..aabcb12 100644
+--- i/sounddevice.py
++++ w/sounddevice.py
+@@ -58,29 +58,7 @@ from ctypes.util import find_library as _find_library
+ from _sounddevice import ffi as _ffi
+
+
+-try:
+-    for _libname in (
+-            'portaudio',  # Default name on POSIX systems
+-            'bin\\libportaudio-2.dll',  # DLL from conda-forge
+-            'lib/libportaudio.dylib',  # dylib from anaconda
+-            ):
+-        _libname = _find_library(_libname)
+-        if _libname is not None:
+-            break
+-    else:
+-        raise OSError('PortAudio library not found')
+-    _lib = _ffi.dlopen(_libname)
+-except OSError:
+-    if _platform.system() == 'Darwin':
+-        _libname = 'libportaudio.dylib'
+-    elif _platform.system() == 'Windows':
+-        _libname = 'libportaudio' + _platform.architecture()[0] + '.dll'
+-    else:
+-        raise
+-    import _sounddevice_data
+-    _libname = _os.path.join(
+-        next(iter(_sounddevice_data.__path__)), 'portaudio-binaries', _libname)
+-    _lib = _ffi.dlopen(_libname)
++_lib = _ffi.dlopen('@portaudio@')
+
+ _sampleformats = {
+     'float32': _lib.paFloat32,
diff --git a/nixpkgs/pkgs/development/python-modules/soundfile/0001-Fix-build-on-linux-arm64.patch b/nixpkgs/pkgs/development/python-modules/soundfile/0001-Fix-build-on-linux-arm64.patch
new file mode 100644
index 000000000000..fa656fd2845e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/soundfile/0001-Fix-build-on-linux-arm64.patch
@@ -0,0 +1,25 @@
+From b3eabd314f050a7491e82bc1560e8d8633569a06 Mon Sep 17 00:00:00 2001
+From: Zhong Jianxin <azuwis@gmail.com>
+Date: Fri, 24 Feb 2023 11:03:41 +0800
+Subject: [PATCH] Fix build on linux arm64
+
+---
+ setup.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/setup.py b/setup.py
+index ef99bcc..81c2dcb 100644
+--- a/setup.py
++++ b/setup.py
+@@ -80,7 +80,7 @@ else:
+             elif platform == 'linux':
+                 # the oldest mainline github runner available is ubuntu 20.04,
+                 # which runs glibc 2.31:
+-                oses = 'manylinux_2_31_x86_64'
++                oses = 'manylinux_2_31_{}'.format(architecture0)
+             else:
+                 pythons = 'py2.py3'
+                 oses = 'any'
+-- 
+2.39.1
+
diff --git a/nixpkgs/pkgs/development/python-modules/soundfile/default.nix b/nixpkgs/pkgs/development/python-modules/soundfile/default.nix
new file mode 100644
index 000000000000..a6875d5edca3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/soundfile/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, numpy
+, libsndfile
+, cffi
+, isPyPy
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "soundfile";
+  version = "0.12.1";
+  # https://github.com/bastibe/python-soundfile/issues/157
+  disabled = isPyPy || stdenv.isi686;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6OEBeyzx3adnrvGdL9nuXr4H4FDUMPd6Cnxmugi4za4=";
+  };
+
+  patches = [
+    ./0001-Fix-build-on-linux-arm64.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace soundfile.py --replace "_find_library('sndfile')" "'${libsndfile.out}/lib/libsndfile${stdenv.hostPlatform.extensions.sharedLibrary}'"
+  '';
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  propagatedBuildInputs = [ numpy libsndfile cffi ];
+  propagatedNativeBuildInputs = [ cffi ];
+
+  meta = {
+    description = "An audio library based on libsndfile, CFFI and NumPy";
+    license = lib.licenses.bsd3;
+    homepage = "https://github.com/bastibe/python-soundfile";
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/soupsieve/default.nix b/nixpkgs/pkgs/development/python-modules/soupsieve/default.nix
new file mode 100644
index 000000000000..1ae1cb7b8d2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/soupsieve/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hatchling
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "soupsieve";
+  version = "2.5";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VmPVp7O/ru4LxDcuf8SPnP9JQLPuxUpkUcxSmfEJdpA=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  # Circular dependency on beautifulsoup4
+  doCheck = false;
+
+  # Circular dependency on beautifulsoup4
+  # pythonImportsCheck = [ "soupsieve" ];
+
+  meta = with lib; {
+    description = "A CSS4 selector implementation for Beautiful Soup";
+    license = licenses.mit;
+    homepage = "https://github.com/facelessuser/soupsieve";
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sourmash/default.nix b/nixpkgs/pkgs/development/python-modules/sourmash/default.nix
new file mode 100644
index 000000000000..ac879c12886a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sourmash/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, rustPlatform
+, bitstring
+, cachetools
+, cffi
+, deprecation
+, iconv
+, matplotlib
+, numpy
+, scipy
+, screed
+, hypothesis
+, pytest-xdist
+, pyyaml
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sourmash";
+  version = "4.8.4";
+  format = "pyproject";
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Q1hMESwzEHGXcd4XW4nLqU8cLTCxrqRgAOr1qB77roo=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-HisWvJgx15OfYoMzzqYm1JyY1/jmGXBSZZmuNaKTDjI=";
+  };
+
+  nativeBuildInputs = with rustPlatform; [
+    cargoSetupHook
+    maturinBuildHook
+  ];
+
+  buildInputs = [ iconv ];
+
+  propagatedBuildInputs = [
+    bitstring
+    cachetools
+    cffi
+    deprecation
+    matplotlib
+    numpy
+    scipy
+    screed
+  ];
+
+  pythonImportsCheck = [ "sourmash" ];
+  nativeCheckInputs = [
+    hypothesis
+    pytest-xdist
+    pytestCheckHook
+    pyyaml
+  ];
+
+  # TODO(luizirber): Working on fixing these upstream
+  disabledTests = [
+    "test_compare_no_such_file"
+    "test_do_sourmash_index_multiscaled_rescale_fail"
+    "test_metagenome_kreport_out_fail"
+  ];
+
+  meta = with lib; {
+    description = "Quickly search, compare, and analyze genomic and metagenomic data sets";
+    homepage = "https://sourmash.bio";
+    changelog = "https://github.com/sourmash-bio/sourmash/releases/tag/v${version}";
+    maintainers = with maintainers; [ luizirber ];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/soxr/default.nix b/nixpkgs/pkgs/development/python-modules/soxr/default.nix
new file mode 100644
index 000000000000..941b6e596a2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/soxr/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, cython_3
+, numpy
+, oldest-supported-numpy
+, setuptools
+, setuptools-scm
+, gnutar
+
+# native
+, libsoxr
+
+# tests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "soxr";
+  version = "0.3.6";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "dofuuz";
+    repo = "python-soxr";
+    rev = "refs/tags/v${version}";
+    fetchSubmodules = true;
+    hash = "sha256-H2sueQq32o/9EHENANKVoiWlFoSF88P0LZ7DfEh/Esg=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    cython_3
+    gnutar
+    numpy
+    oldest-supported-numpy
+    setuptools
+    setuptools-scm
+  ];
+
+  pythonImportsCheck = [
+    "soxr"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "High quality, one-dimensional sample-rate conversion library";
+    homepage = "https://github.com/dofuuz/python-soxr/tree/main";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spacy-alignments/default.nix b/nixpkgs/pkgs/development/python-modules/spacy-alignments/default.nix
new file mode 100644
index 000000000000..9bcb74a242ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy-alignments/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, stdenv
+, cargo
+, fetchPypi
+, buildPythonPackage
+, isPy3k
+, rustPlatform
+, rustc
+, setuptools-rust
+, libiconv
+}:
+
+buildPythonPackage rec {
+  pname = "spacy-alignments";
+  version = "0.9.0";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jcNYghWR9Xbu97/hAYe8ewa5oMQ4ofNGFwY4cY7/EmM=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-I5uI+qFyb4/ArpUZi4yS/E/bmwoW7+CalMq02Gnm9S8=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-rust
+    rustPlatform.cargoSetupHook
+    cargo
+    rustc
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv ];
+
+  # Fails because spacy_alignments module cannot be loaded correctly.
+  doCheck = false;
+
+  pythonImportsCheck = [ "spacy_alignments" ];
+
+  meta = with lib; {
+    description = "Align tokenizations for spaCy and transformers";
+    homepage = "https://github.com/explosion/spacy-alignments";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spacy-loggers/default.nix b/nixpkgs/pkgs/development/python-modules/spacy-loggers/default.nix
new file mode 100644
index 000000000000..293224c3d07c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy-loggers/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, callPackage
+, fetchPypi
+, buildPythonPackage
+, wandb
+, wasabi
+}:
+
+buildPythonPackage rec {
+  pname = "spacy-loggers";
+  version = "1.0.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-1gsL2/kVpg5RbMLmU7rv+Ubwz8RhtFLRGk1UWMb+XyQ=";
+  };
+
+  propagatedBuildInputs = [
+    wandb
+    wasabi
+  ];
+
+  pythonImportsCheck = [ "spacy_loggers" ];
+
+  # skipping the checks, becaus it requires a cycle dependency to spacy as well.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Logging utilities for spaCy";
+    homepage = "https://github.com/explosion/spacy-loggers";
+    license = licenses.mit;
+    maintainers = with maintainers; [ stunkymonkey ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spacy-pkuseg/default.nix b/nixpkgs/pkgs/development/python-modules/spacy-pkuseg/default.nix
new file mode 100644
index 000000000000..b904569010f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy-pkuseg/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, cython
+, numpy
+, srsly
+}:
+
+buildPythonPackage rec {
+  pname = "spacy-pkuseg";
+  version = "0.0.33";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit version;
+    pname = "spacy_pkuseg";
+    hash = "sha256-8TFWrE4ERg8aw17f0DbplwTbutGa0KObBsNA+AKinmI=";
+  };
+
+  # Does not seem to have actual tests, but unittest discover
+  # recognizes some non-tests as tests and fails.
+  doCheck = false;
+
+  nativeBuildInputs = [ cython ];
+
+  propagatedBuildInputs = [ numpy srsly ];
+
+  pythonImportsCheck = [ "spacy_pkuseg" ];
+
+  meta = with lib; {
+    description = "Toolkit for multi-domain Chinese word segmentation (spaCy fork)";
+    homepage = "https://github.com/explosion/spacy-pkuseg";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spacy-transformers/annotation-test/annotate.py b/nixpkgs/pkgs/development/python-modules/spacy-transformers/annotation-test/annotate.py
new file mode 100644
index 000000000000..96854b6cae8e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy-transformers/annotation-test/annotate.py
@@ -0,0 +1,69 @@
+import pytest
+import spacy
+
+en_text = (
+    "When Sebastian Thrun started working on self-driving cars at "
+    "Google in 2007, few people outside of the company took him "
+    "seriously. “I can tell you very senior CEOs of major American "
+    "car companies would shake my hand and turn away because I wasn’t "
+    "worth talking to,” said Thrun, in an interview with Recode earlier "
+    "this week.")
+
+
+@pytest.fixture
+def en_core_web_trf():
+    return spacy.load("en_core_web_trf")
+
+
+@pytest.fixture
+def doc_en_core_web_trf(en_core_web_trf):
+    return en_core_web_trf(en_text)
+
+
+def test_entities(doc_en_core_web_trf):
+    entities = list(map(lambda e: (e.text, e.label_),
+                        doc_en_core_web_trf.ents))
+
+    assert entities == [
+        ('Sebastian Thrun', 'PERSON'),
+        ('Google', 'ORG'),
+        ('2007', 'DATE'),
+        ('American', 'NORP'),
+        ('Thrun', 'PERSON'),
+        ('Recode', 'ORG'),
+        ('earlier this week', 'DATE'),
+    ]
+
+
+def test_nouns(doc_en_core_web_trf):
+    assert [
+        chunk.text for chunk in doc_en_core_web_trf.noun_chunks] == [
+        'Sebastian Thrun',
+        'self-driving cars',
+        'Google',
+        'few people',
+        'the company',
+        'him',
+        'I',
+        'you',
+        'very senior CEOs',
+        'major American car companies',
+        'my hand',
+        'I',
+        'Thrun',
+        'an interview',
+        'Recode']
+
+
+def test_verbs(doc_en_core_web_trf):
+    assert [
+        token.lemma_ for token in doc_en_core_web_trf if token.pos_ == "VERB"] == [
+        'start',
+        'work',
+        'drive',
+        'take',
+        'tell',
+        'shake',
+        'turn',
+        'talk',
+        'say']
diff --git a/nixpkgs/pkgs/development/python-modules/spacy-transformers/annotation-test/default.nix b/nixpkgs/pkgs/development/python-modules/spacy-transformers/annotation-test/default.nix
new file mode 100644
index 000000000000..c9e1f3400f3a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy-transformers/annotation-test/default.nix
@@ -0,0 +1,23 @@
+{ stdenv, pytest, spacy_models }:
+
+stdenv.mkDerivation {
+  name = "spacy-transformers-annotation-test";
+
+  src = ./.;
+
+  dontConfigure = true;
+  dontBuild = true;
+  doCheck = true;
+
+  nativeCheckInputs = [ pytest spacy_models.en_core_web_trf ];
+
+  checkPhase = ''
+    pytest annotate.py
+  '';
+
+  installPhase = ''
+    touch $out
+  '';
+
+  meta.timeout = 60;
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spacy-transformers/default.nix b/nixpkgs/pkgs/development/python-modules/spacy-transformers/default.nix
new file mode 100644
index 000000000000..475a9c6540a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy-transformers/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, callPackage
+, fetchPypi
+, buildPythonPackage
+, pythonRelaxDepsHook
+, torch
+, pythonOlder
+, spacy
+, spacy-alignments
+, srsly
+, transformers
+}:
+
+buildPythonPackage rec {
+  pname = "spacy-transformers";
+  version = "1.3.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Q8oV0mw8POFscFcdsYZfTkavNVQyqWdLAdb4lDX4ahM=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    torch
+    spacy
+    spacy-alignments
+    srsly
+    transformers
+  ];
+
+  pythonRelaxDeps = [
+    "spacy"
+    "transformers"
+  ];
+
+  # Test fails due to missing arguments for trfs2arrays().
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "spacy_transformers"
+  ];
+
+  passthru.tests.annotation = callPackage ./annotation-test { };
+
+  meta = with lib; {
+    description = "spaCy pipelines for pretrained BERT, XLNet and GPT-2";
+    homepage = "https://github.com/explosion/spacy-transformers";
+    changelog = "https://github.com/explosion/spacy-transformers/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spacy/annotation-test/annotate.py b/nixpkgs/pkgs/development/python-modules/spacy/annotation-test/annotate.py
new file mode 100644
index 000000000000..5acc3ddc60fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy/annotation-test/annotate.py
@@ -0,0 +1,69 @@
+import pytest
+import spacy
+
+en_text = (
+    "When Sebastian Thrun started working on self-driving cars at "
+    "Google in 2007, few people outside of the company took him "
+    "seriously. “I can tell you very senior CEOs of major American "
+    "car companies would shake my hand and turn away because I wasn’t "
+    "worth talking to,” said Thrun, in an interview with Recode earlier "
+    "this week.")
+
+
+@pytest.fixture
+def en_core_web_sm():
+    return spacy.load("en_core_web_sm")
+
+
+@pytest.fixture
+def doc_en_core_web_sm(en_core_web_sm):
+    return en_core_web_sm(en_text)
+
+
+def test_entities(doc_en_core_web_sm):
+    entities = list(map(lambda e: (e.text, e.label_),
+                        doc_en_core_web_sm.ents))
+
+    assert entities == [
+        ('Sebastian Thrun', 'PERSON'),
+        ('Google', 'ORG'),
+        ('2007', 'DATE'),
+        ('American', 'NORP'),
+        ('Thrun', 'PERSON'),
+        ('Recode', 'ORG'),
+        ('earlier this week', 'DATE'),
+    ]
+
+
+def test_nouns(doc_en_core_web_sm):
+    assert [
+        chunk.text for chunk in doc_en_core_web_sm.noun_chunks] == [
+        'Sebastian Thrun',
+        'self-driving cars',
+        'Google',
+        'few people',
+        'the company',
+        'him',
+        'I',
+        'you',
+        'very senior CEOs',
+        'major American car companies',
+        'my hand',
+        'I',
+        'Thrun',
+        'an interview',
+        'Recode']
+
+
+def test_verbs(doc_en_core_web_sm):
+    assert [
+        token.lemma_ for token in doc_en_core_web_sm if token.pos_ == "VERB"] == [
+        'start',
+        'work',
+        'drive',
+        'take',
+        'tell',
+        'shake',
+        'turn',
+        'talk',
+        'say']
diff --git a/nixpkgs/pkgs/development/python-modules/spacy/annotation-test/default.nix b/nixpkgs/pkgs/development/python-modules/spacy/annotation-test/default.nix
new file mode 100644
index 000000000000..c7d5efe86641
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy/annotation-test/default.nix
@@ -0,0 +1,23 @@
+{ stdenv, pytest, spacy_models }:
+
+stdenv.mkDerivation {
+  name = "spacy-annotation-test";
+
+  src = ./.;
+
+  dontConfigure = true;
+  dontBuild = true;
+  doCheck = true;
+
+  nativeCheckInputs = [ pytest spacy_models.en_core_web_sm ];
+
+  checkPhase = ''
+    pytest annotate.py
+  '';
+
+  installPhase = ''
+    touch $out
+  '';
+
+  meta.timeout = 60;
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spacy/default.nix b/nixpkgs/pkgs/development/python-modules/spacy/default.nix
new file mode 100644
index 000000000000..ccbfef1568e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy/default.nix
@@ -0,0 +1,126 @@
+{ lib
+, stdenv
+, blis
+, buildPythonPackage
+, callPackage
+, catalogue
+, cymem
+, fetchPypi
+, jinja2
+, jsonschema
+, langcodes
+, murmurhash
+, numpy
+, packaging
+, pathy
+, preshed
+, pydantic
+, pytest
+, python
+, pythonOlder
+, pythonRelaxDepsHook
+, requests
+, setuptools
+, spacy-legacy
+, spacy-loggers
+, srsly
+, thinc
+, tqdm
+, typer
+, typing-extensions
+, wasabi
+, weasel
+, writeScript
+, nix
+, git
+, nix-update
+}:
+
+buildPythonPackage rec {
+  pname = "spacy";
+  version = "3.7.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zt9JJ78NP+x3OmzkjV0skb2wL+08fV7Ae9uHPxEm8aA=";
+  };
+
+  pythonRelaxDeps = [
+    "typer"
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    blis
+    catalogue
+    cymem
+    jinja2
+    jsonschema
+    langcodes
+    murmurhash
+    numpy
+    packaging
+    pathy
+    preshed
+    pydantic
+    requests
+    setuptools
+    spacy-legacy
+    spacy-loggers
+    srsly
+    thinc
+    tqdm
+    typer
+    wasabi
+    weasel
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "thinc>=8.1.8,<8.2.0" "thinc>=8.1.8"
+  '';
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  doCheck = false;
+
+  checkPhase = ''
+    ${python.interpreter} -m pytest spacy/tests --vectors --models --slow
+  '';
+
+  pythonImportsCheck = [
+    "spacy"
+  ];
+
+  passthru = {
+    updateScript = writeScript "update-spacy" ''
+    #!${stdenv.shell}
+    set -eou pipefail
+    PATH=${lib.makeBinPath [ nix git nix-update ]}
+
+    nix-update python3Packages.spacy
+
+    # update spacy models as well
+    echo | nix-shell maintainers/scripts/update.nix --argstr package python3Packages.spacy_models.en_core_web_sm
+    '';
+    tests.annotation = callPackage ./annotation-test { };
+  };
+
+  meta = with lib; {
+    description = "Industrial-strength Natural Language Processing (NLP)";
+    homepage = "https://github.com/explosion/spaCy";
+    changelog = "https://github.com/explosion/spaCy/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spacy/legacy.nix b/nixpkgs/pkgs/development/python-modules/spacy/legacy.nix
new file mode 100644
index 000000000000..f94855e66a3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy/legacy.nix
@@ -0,0 +1,29 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+}:
+
+buildPythonPackage rec {
+  pname = "spacy-legacy";
+  version = "3.0.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-s31uDJtuHXyhz1vHFSq2SkxGcfWcha2vej/LhwNXp3Q=";
+  };
+
+  # nativeCheckInputs = [ pytestCheckHook spacy ];
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "spacy_legacy"
+  ];
+
+  meta = with lib; {
+    description = "Legacy registered functions for spaCy backwards compatibility";
+    homepage = "https://github.com/explosion/spacy-legacy";
+    changelog = "https://github.com/explosion/spacy-legacy/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ melling ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spacy/lookups-data.nix b/nixpkgs/pkgs/development/python-modules/spacy/lookups-data.nix
new file mode 100644
index 000000000000..70469761eddb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy/lookups-data.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, spacy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "spacy-lookups-data";
+  version = "1.0.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "explosion";
+    repo = "spacy-lookups-data";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-6sKZ+GgCjLWYnV96nub4xEUFh1qpPQpbnoxyOVrvcD0=";
+  };
+
+  nativeCheckInputs = [
+    spacy
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "spacy_lookups_data" ];
+
+  meta = with lib; {
+    description = "Additional lookup tables and data resources for spaCy";
+    homepage = "https://pypi.org/project/spacy-lookups-data";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jboy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spacy/models.json b/nixpkgs/pkgs/development/python-modules/spacy/models.json
new file mode 100644
index 000000000000..7f25c4281c37
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy/models.json
@@ -0,0 +1,506 @@
+[
+  {
+    "pname": "ca_core_news_lg",
+    "version": "3.7.0",
+    "sha256": "1hlrbrgiahj6jkap3hrhki6zk10wg7dpajxcp540darprl7w60vy",
+    "license": "gpl3"
+  },
+  {
+    "pname": "ca_core_news_md",
+    "version": "3.7.0",
+    "sha256": "0ygygvw8bs510dyz4k9sfmxxlqssmv566aac9k3xiip3k5lfgysi",
+    "license": "gpl3"
+  },
+  {
+    "pname": "ca_core_news_sm",
+    "version": "3.7.0",
+    "sha256": "1cj53w9vzdb2xqjpprkhgrglm70g0vaw0308jxnd7nvgn6vfx09s",
+    "license": "gpl3"
+  },
+  {
+    "pname": "ca_core_news_trf",
+    "version": "3.7.0",
+    "sha256": "1il0ak0wh4dlxxdddwz8a2vr6817cn5fwrflxwgcd25njx7w886g",
+    "license": "gpl3"
+  },
+  {
+    "pname": "da_core_news_lg",
+    "version": "3.7.0",
+    "sha256": "04bm53v7dpdlnlk39wppfir792jp2qq9kkw0zs9i0ki68sxh8giz",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "da_core_news_md",
+    "version": "3.7.0",
+    "sha256": "1c35avbhkx16icnqsp571nvilcra143kqjvnszd7j0xnnzn5iqyx",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "da_core_news_sm",
+    "version": "3.7.0",
+    "sha256": "1hlx9zgixv91x4xa489gnwm3qdghffk4fimg7mjncyjw1g9xskif",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "da_core_news_trf",
+    "version": "3.7.0",
+    "sha256": "02hbg58ql1dcd7zdlgb959106inaqnvxphc2dmxf7myjr4si3w37",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "de_core_news_lg",
+    "version": "3.7.0",
+    "sha256": "1aag695nygpbxrvvknlcic79hyfzdwcc2d9vjgzq2bc43zdf05a0",
+    "license": "mit"
+  },
+  {
+    "pname": "de_core_news_md",
+    "version": "3.7.0",
+    "sha256": "1qnq7yy38nw1pg8ysxjqyxd82yc3ncl148p90hil2njxg771g1hk",
+    "license": "mit"
+  },
+  {
+    "pname": "de_core_news_sm",
+    "version": "3.7.0",
+    "sha256": "0r0wgf044r0nl267m5dc3zp4cq5ml4b9i6gpkas1hhn708d5sjb1",
+    "license": "mit"
+  },
+  {
+    "pname": "de_dep_news_trf",
+    "version": "3.7.0",
+    "sha256": "05xca8gjpmn7dlj8jb93rv7r0s4wa3nq5h7rkmq6d7h7gy6zpz8f",
+    "license": "mit"
+  },
+  {
+    "pname": "el_core_news_lg",
+    "version": "3.7.0",
+    "sha256": "0n7xk8kbqqis1fivsgvyfmhd6qj853wylrwjl9q352cvbv8zg6dk",
+    "license": "cc-by-nc-sa-30"
+  },
+  {
+    "pname": "el_core_news_md",
+    "version": "3.7.0",
+    "sha256": "042vmymi40zgwxg87sfsvq7b9crigh6g9ai7cyz49spcqmvq2qd3",
+    "license": "cc-by-nc-sa-30"
+  },
+  {
+    "pname": "el_core_news_sm",
+    "version": "3.7.0",
+    "sha256": "0apky61l3gh2dvfpqaj6vqql5g6sh4bp9i91y7zfgacqvf7jp67g",
+    "license": "cc-by-nc-sa-30"
+  },
+  {
+    "pname": "en_core_web_lg",
+    "version": "3.7.0",
+    "sha256": "192mhp5niixq0crqwwmp70g63wbahgr41dpmmjsdqf9189s7qswr",
+    "license": "mit"
+  },
+  {
+    "pname": "en_core_web_md",
+    "version": "3.7.0",
+    "sha256": "1wy2kpsninpxwjbqavh963i12041a0av4wmrn8plvb73czp995dg",
+    "license": "mit"
+  },
+  {
+    "pname": "en_core_web_sm",
+    "version": "3.7.0",
+    "sha256": "01hps9i3v73prqfjrch0da0s38vhbvx0d73g3x1bkrmavan26bj7",
+    "license": "mit"
+  },
+  {
+    "pname": "en_core_web_trf",
+    "version": "3.7.0",
+    "sha256": "1pnm63bk5k6g6kc5s8v5pwdahqgbh3rlm5mxq3gxk8my3cfkklpc",
+    "license": "mit"
+  },
+  {
+    "pname": "es_core_news_lg",
+    "version": "3.7.0",
+    "sha256": "1qfadw61yjz1hkp5wldg5ncj50db0b3wvpcfklybij56r4ibz6f2",
+    "license": "gpl3"
+  },
+  {
+    "pname": "es_core_news_md",
+    "version": "3.7.0",
+    "sha256": "1z9m6f2c3cbjrljdlywdd4c4qj4lky1rb3n20yav5zb9k7jbj3s4",
+    "license": "gpl3"
+  },
+  {
+    "pname": "es_core_news_sm",
+    "version": "3.7.0",
+    "sha256": "07fm2bmiwkkia4v491dzkgb3dbp1qfh4j7iba2h4wv8yci6la3n4",
+    "license": "gpl3"
+  },
+  {
+    "pname": "es_dep_news_trf",
+    "version": "3.7.0",
+    "sha256": "1n5sk5jlj6gx4w2ka1ia93bmi4nm2cyfg7fbca2kvmsg6zw8hq27",
+    "license": "gpl3"
+  },
+  {
+    "pname": "fi_core_news_lg",
+    "version": "3.7.0",
+    "sha256": "08lk2dgwm99nj2a355s682ar4xwg1av4z3r6qpwq72rkm2h8jkmm",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "fi_core_news_md",
+    "version": "3.7.0",
+    "sha256": "07hqjw6w8332zf3ki5pbrv7m1kc4y6j3f0czharvv0grr2sfvh84",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "fi_core_news_sm",
+    "version": "3.7.0",
+    "sha256": "03bhh3z3r70km19p3x202g66hikfyh309hgb96sycb8lhfr737lk",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "fr_core_news_lg",
+    "version": "3.7.0",
+    "sha256": "02dv00w67alc1avwq93hara49va7mnsmmm2kww961p5a3k3ldz20",
+    "license": "lgpllr"
+  },
+  {
+    "pname": "fr_core_news_md",
+    "version": "3.7.0",
+    "sha256": "184gxwgf980x3vsn45zycd3cr1mkl3r1vbf3hb5hrhs8xk3y1v34",
+    "license": "lgpllr"
+  },
+  {
+    "pname": "fr_core_news_sm",
+    "version": "3.7.0",
+    "sha256": "1ifbazd9hs1fhy22hjqhwkq0bnnsr3km3ff60v8arkyq5vlprhdb",
+    "license": "lgpllr"
+  },
+  {
+    "pname": "fr_dep_news_trf",
+    "version": "3.7.0",
+    "sha256": "0shhlmyyd79bbvxf6dfr5r99lfhjcywvvrji67k2hxz4604q8bxv",
+    "license": "lgpllr"
+  },
+  {
+    "pname": "hr_core_news_lg",
+    "version": "3.7.0",
+    "sha256": "1r8cdyawf6fdvx1xn1l470mx31lbx5cjpivlx1pvv9ckp71zp28z",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "hr_core_news_md",
+    "version": "3.7.0",
+    "sha256": "1dzi6dxwjpbddc0rjqajj4k1c61sacyycwnjvy03h3aclxacqn53",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "hr_core_news_sm",
+    "version": "3.7.0",
+    "sha256": "0dmhv1fa46hi78jgv562v4x3mfl7svchs6kiz35s63ph9ik5r6f2",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "ja_core_news_lg",
+    "version": "3.7.0",
+    "sha256": "1nb77kivzy0wixsw8ijmw78fffkpqa63kykqph04jzmh75ra4wvg",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "ja_core_news_md",
+    "version": "3.7.0",
+    "sha256": "0p22bwc24q76cl7ndszvhqgllvq3ws3i3vbjsp5xvhxxls6p49x9",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "ja_core_news_sm",
+    "version": "3.7.0",
+    "sha256": "0bfvkds4dqynjshk2lxfya9yfcnbvwjfhc6n7yh0852ms1ycicaw",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "ja_core_news_trf",
+    "version": "3.7.0",
+    "sha256": "0n2lqql4flnilgf671n5mcdp8vi5pdjfz3vymxsapc1gyp29jykk",
+    "license": "cc-by-sa-30"
+  },
+  {
+    "pname": "it_core_news_lg",
+    "version": "3.7.0",
+    "sha256": "0gwn6pf0rzbplahs2wnzp6379mmj066dqhijhq4ln4552fz4d1yx",
+    "license": "cc-by-nc-sa-30"
+  },
+  {
+    "pname": "it_core_news_md",
+    "version": "3.7.0",
+    "sha256": "003w99glj5jgb6gfqygb4c5jljhc85ck6yqn49h9m8fa9vmaylhx",
+    "license": "cc-by-nc-sa-30"
+  },
+  {
+    "pname": "it_core_news_sm",
+    "version": "3.7.0",
+    "sha256": "0kng2w5xj1irz6c5d6vl4px9my1z41h8zfvf9b01rh9yvjmhfyzc",
+    "license": "cc-by-nc-sa-30"
+  },
+  {
+    "pname": "ko_core_news_lg",
+    "version": "3.7.0",
+    "sha256": "0hxwkb1w58vb4g1162ry12a63hnj20q20n66xnlvc0r96ibj4fia",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "ko_core_news_md",
+    "version": "3.7.0",
+    "sha256": "1ai7cyk58c7rj0dy82l01w5r4fkp2cpnhcsarzas1ml0icnk1srm",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "ko_core_news_sm",
+    "version": "3.7.0",
+    "sha256": "16m1lsikf8ghsazpdprd9fc4n3m8an9qzjbyjwyvwkr0f2p0nmph",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "lt_core_news_lg",
+    "version": "3.7.0",
+    "sha256": "174p8i2lnwq324qcs85s3c0j7iyav12yk0i896l23khg9gyzkmlg",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "lt_core_news_md",
+    "version": "3.7.0",
+    "sha256": "1117sij5w4s297q5j6h210hafh2amm6pd9m9m7m3608rfwsvm9g8",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "lt_core_news_sm",
+    "version": "3.7.0",
+    "sha256": "1j04apdc63c2b2namic4blhm9mk8inmr8ynid09mncljwskg0fjb",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "mk_core_news_lg",
+    "version": "3.7.0",
+    "sha256": "0fshypj08hvcbbqjfxkzyfs72p5rm5fw1pfclgln2y0whfap0lqx",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "mk_core_news_md",
+    "version": "3.7.0",
+    "sha256": "1il8pzfk2nd09hd8kmk5znf66ir4bsrp1ax7jaxghi76ggrbpzyx",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "mk_core_news_sm",
+    "version": "3.7.0",
+    "sha256": "1805hkkm3hjbzw8pg6q08p61bpjk5h13ldzpik0gb9wqw9f69dbp",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "nb_core_news_lg",
+    "version": "3.7.0",
+    "sha256": "1zqwp8a8d26mi94dkib5ahhkr9hawxx4vag4fhibfa6m0prpzh9h",
+    "license": "mit"
+  },
+  {
+    "pname": "nb_core_news_md",
+    "version": "3.7.0",
+    "sha256": "1ilxscc6hnmiby7ip7kgx3aih9msqmg21iqakkwny3z1lnnly466",
+    "license": "mit"
+  },
+  {
+    "pname": "nb_core_news_sm",
+    "version": "3.7.0",
+    "sha256": "1wrchw1rhlzrji5j46lpwzydiaxcywaglz0nvm4vk1np45r7l3dm",
+    "license": "mit"
+  },
+  {
+    "pname": "nl_core_news_lg",
+    "version": "3.7.0",
+    "sha256": "1777sdmjcc7lnj0j26zf00ab7pr09v1220k47fq724cw9l0knin1",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "nl_core_news_md",
+    "version": "3.7.0",
+    "sha256": "19g6hzljz0zi1fppl7c3w8gdak42af3f7z45cg12qyw7vnjl9988",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "nl_core_news_sm",
+    "version": "3.7.0",
+    "sha256": "0gcbb0vs5snif4j5a7z9ha2sj9jby0hnxbp0w5h73yxyg37fk8d4",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "pl_core_news_lg",
+    "version": "3.7.0",
+    "sha256": "0glpd8lv7gwq3bryx32q84ny6pdvwrjm7lhxg9h2cdjrair8vx94",
+    "license": "gpl3"
+  },
+  {
+    "pname": "pl_core_news_md",
+    "version": "3.7.0",
+    "sha256": "04qwfh3dam7advyysdcdak7vna5gvirns001zq09kxhj766bc2k9",
+    "license": "gpl3"
+  },
+  {
+    "pname": "pl_core_news_sm",
+    "version": "3.7.0",
+    "sha256": "00wygnwjpvfgiccb643720691pxhcb4pnk3zjj35hv9gbbx6qb8c",
+    "license": "gpl3"
+  },
+  {
+    "pname": "pt_core_news_lg",
+    "version": "3.7.0",
+    "sha256": "1im0hgr6wd4sfsfb0ddnl2ad9pi1vs0vvr7rq3g14vda3x2f1rxy",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "pt_core_news_md",
+    "version": "3.7.0",
+    "sha256": "0zpgxg3ass084qv4bvk9wz15ya92w6a7d2p9p24g49a530b8gd7y",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "pt_core_news_sm",
+    "version": "3.7.0",
+    "sha256": "0z64w8599xwjvxdmrdlr08yyk4a5174m4a39m3zivgib0b5jyvdq",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "ro_core_news_lg",
+    "version": "3.7.0",
+    "sha256": "1y45xhdjlhf8026vlsdrxvmiwj8p9hzlpdg628kdcdzmcrr23l5j",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "ro_core_news_md",
+    "version": "3.7.0",
+    "sha256": "0jw71lav2fim48ff34mf137dsnn3arac555b9rf4flamiy8xg7y6",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "ro_core_news_sm",
+    "version": "3.7.0",
+    "sha256": "0r35hxm6dgk2fnwl79ss25g6lfkgrd1h24zf96ys2p3cppp2i167",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "ru_core_news_lg",
+    "version": "3.7.0",
+    "sha256": "02qnl0cfvx0m0icdbpn9zfsv39sp9k6sfdarzazhz7xnxzxib93q",
+    "license": "mit"
+  },
+  {
+    "pname": "ru_core_news_md",
+    "version": "3.7.0",
+    "sha256": "187lkkm04x1ylg3jzyhf9avzpj2jkb48n86i36hqi6iqdv6yhfd5",
+    "license": "mit"
+  },
+  {
+    "pname": "ru_core_news_sm",
+    "version": "3.7.0",
+    "sha256": "11mh1rd0q024xfagdqkly1n4nndksrlq650n51jl1x1pmzlsdgzl",
+    "license": "mit"
+  },
+  {
+    "pname": "sl_core_news_lg",
+    "version": "3.7.0",
+    "sha256": "128ayhp21szc31ckiq3i8vib42i9xnz4lpi1709gjdc38cpmpnlp",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "sl_core_news_md",
+    "version": "3.7.0",
+    "sha256": "07gx174gw5q1zgyyg1xhfplihhnr311f9562ri5pdd2hgjyz58yb",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "sl_core_news_sm",
+    "version": "3.7.0",
+    "sha256": "005xwsnh5y3pf8y64lhvrzcbh8y34yr3in204as6hv7krsfg8bxa",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "sl_core_news_trf",
+    "version": "3.7.0",
+    "sha256": "0x97lwm1i2dq4kdg6rvarh9mnlcx45cnwq80qpjwv3b7zmviyq8c",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "sv_core_news_lg",
+    "version": "3.7.0",
+    "sha256": "05qaff8r3vs30zaxja1lgpibd12njp9ciq49zs26i6d4dqa18hdp",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "sv_core_news_md",
+    "version": "3.7.0",
+    "sha256": "0c64lqm10zmy863gs5h3ghx7662c8g7iyapn2rjhmz6909d82yyl",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "sv_core_news_sm",
+    "version": "3.7.0",
+    "sha256": "1ik8b2nvxdalglwqg0zl4wbqnd2dyhdcy5hvxh40gi77rg2qd6kb",
+    "license": "cc-by-sa-40"
+  },
+  {
+    "pname": "uk_core_news_lg",
+    "version": "3.7.0",
+    "sha256": "1qbw16y3ha690fqq71w7r46n8mz7d8za2iw1lljpqpf49my408q1",
+    "license": "mit"
+  },
+  {
+    "pname": "uk_core_news_md",
+    "version": "3.7.0",
+    "sha256": "0znfyl8cdvxbxfhypwkjv84hcs6n457wh4j2cl1sfp9pgsd7bmzb",
+    "license": "mit"
+  },
+  {
+    "pname": "uk_core_news_sm",
+    "version": "3.7.0",
+    "sha256": "08scx97j87rrhyrg5smj9ydwmdhl81859qaqj2klgqqpykg0xwlc",
+    "license": "mit"
+  },
+  {
+    "pname": "uk_core_news_trf",
+    "version": "3.7.0",
+    "sha256": "14s4xwr0qs8x3d2fca2m1nj6ksl82gggj2by7c817gii1bdvn47p",
+    "license": "mit"
+  },
+  {
+    "pname": "xx_ent_wiki_sm",
+    "version": "3.7.0",
+    "sha256": "1k06aa8xsx2qcmd4lz02sfxmgif5nngni8dc4y0w0d4x88icdscn",
+    "license": "mit"
+  },
+  {
+    "pname": "xx_sent_ud_sm",
+    "version": "3.7.0",
+    "sha256": "13fc4dmmmkanxaxabyx0sa2sh53p92jp3mj263pf31yh98kryxpw",
+    "license": "cc-by-sa-30"
+  },
+  {
+    "pname": "zh_core_web_lg",
+    "version": "3.7.0",
+    "sha256": "1kqdczq5id0sqnyg3sq5g8n7fcknz53srvd72qmz4wrymy5h81qa",
+    "license": "mit"
+  },
+  {
+    "pname": "zh_core_web_md",
+    "version": "3.7.0",
+    "sha256": "03m5gnx47mcyx7sh1g3dgqnarvprdkvkyxibsli6yrnvx3vz434j",
+    "license": "mit"
+  },
+  {
+    "pname": "zh_core_web_sm",
+    "version": "3.7.0",
+    "sha256": "1x9y4z2883m21rsvv6sw71l1nva3j8an8csdsabs4y84kb5y2by2",
+    "license": "mit"
+  },
+  {
+    "pname": "zh_core_web_trf",
+    "version": "3.7.0",
+    "sha256": "1y4c9z4vjywmpg61yxsyp80cmz5s3aa95car01wq3i42qj09bvm6",
+    "license": "mit"
+  }
+]
diff --git a/nixpkgs/pkgs/development/python-modules/spacy/models.nix b/nixpkgs/pkgs/development/python-modules/spacy/models.nix
new file mode 100644
index 000000000000..287364dc873a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spacy/models.nix
@@ -0,0 +1,85 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+, protobuf
+, pymorphy3
+, pymorphy3-dicts-uk
+, sentencepiece
+, spacy
+, spacy-pkuseg
+, spacy-transformers
+, writeScript
+, stdenv
+, jq
+, nix
+, moreutils
+}:
+let
+  buildModelPackage = { pname, version, sha256, license }:
+
+    let
+      lang = builtins.substring 0 2 pname;
+      requires-protobuf = pname == "fr_dep_news_trf" || pname == "uk_core_news_trf";
+    in
+    buildPythonPackage {
+      inherit pname version;
+
+      src = fetchurl {
+        url = "https://github.com/explosion/spacy-models/releases/download/${pname}-${version}/${pname}-${version}.tar.gz";
+        inherit sha256;
+      };
+
+      propagatedBuildInputs = [ spacy ]
+        ++ lib.optionals (lib.hasSuffix "_trf" pname) [ spacy-transformers ]
+        ++ lib.optionals (lang == "ru") [ pymorphy3 ]
+        ++ lib.optionals (lang == "uk") [ pymorphy3 pymorphy3-dicts-uk ]
+        ++ lib.optionals (lang == "zh") [ spacy-pkuseg ]
+        ++ lib.optionals (pname == "fr_dep_news_trf") [ sentencepiece ];
+
+      postPatch = lib.optionalString requires-protobuf ''
+        substituteInPlace meta.json \
+          --replace "protobuf<3.21.0" "protobuf"
+      '';
+
+      nativeBuildInputs = lib.optionals requires-protobuf [
+        protobuf
+      ];
+
+      pythonImportsCheck = [ pname ];
+
+      passthru.updateScript = writeScript "update-spacy-models" ''
+        #!${stdenv.shell}
+        set -eou pipefail
+        PATH=${lib.makeBinPath [ jq nix moreutils ]}
+
+        IFS=. read -r major minor patch <<<"${spacy.version}"
+        spacyVersion="$(echo "$major.$minor.0")"
+
+        pushd pkgs/development/python-modules/spacy/ || exit
+
+        jq -r '.[] | .pname' models.json | while IFS= read -r pname; do
+          if [ "$(jq --arg pname "$pname" -r '.[] | select(.pname == $pname) | .version' models.json)" == "$spacyVersion" ]; then
+            continue
+          fi
+
+          newHash="$(nix-prefetch-url "https://github.com/explosion/spacy-models/releases/download/$pname-$spacyVersion/$pname-$spacyVersion.tar.gz")"
+          jq --arg newHash "$newHash" --arg pname "$pname" --arg spacyVersion "$spacyVersion" \
+           '[(.[] | select(.pname != $pname)), (.[] | select(.pname == $pname) | .sha256 = $newHash | .version = $spacyVersion)] | sort_by(.pname)' \
+           models.json | sponge models.json
+        done
+
+        popd || exit
+      '';
+
+      meta = with lib; {
+        description = "Models for the spaCy NLP library";
+        homepage = "https://github.com/explosion/spacy-models";
+        license = licenses.${license};
+        maintainers = with maintainers; [ rvl ];
+      };
+    };
+
+  makeModelSet = models: with lib; listToAttrs (map (m: nameValuePair m.pname (buildModelPackage m)) models);
+
+in
+makeModelSet (lib.importJSON ./models.json)
diff --git a/nixpkgs/pkgs/development/python-modules/spake2/default.nix b/nixpkgs/pkgs/development/python-modules/spake2/default.nix
new file mode 100644
index 000000000000..a5f5f6bf92a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spake2/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, hkdf, pytest }:
+
+buildPythonPackage rec {
+  pname = "spake2";
+  version = "0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c17a614b29ee4126206e22181f70a406c618d3c6c62ca6d6779bce95e9c926f4";
+  };
+
+  nativeCheckInputs = [ pytest ];
+
+  propagatedBuildInputs = [ hkdf ];
+
+  checkPhase = ''
+    py.test $out
+  '';
+
+  meta = with lib; {
+    description = "SPAKE2 password-authenticated key exchange library";
+    homepage = "https://github.com/warner/python-spake2";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spark_parser/default.nix b/nixpkgs/pkgs/development/python-modules/spark_parser/default.nix
new file mode 100644
index 000000000000..fb30daf81fe7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spark_parser/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, click
+}:
+
+buildPythonPackage rec {
+  pname = "spark_parser";
+  version = "1.8.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0np2y4jcir4a4j18wws7yzkz2zj6nqhdhn41rpq8pyskg6wrgfx7";
+  };
+
+  buildInputs = [ nose ];
+  propagatedBuildInputs = [ click ];
+
+  meta = with lib; {
+    description = "An Early-Algorithm Context-free grammar Parser";
+    homepage = "https://github.com/rocky/python-spark";
+    license = licenses.mit;
+    maintainers = with maintainers; [raskin];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sparklines/default.nix b/nixpkgs/pkgs/development/python-modules/sparklines/default.nix
new file mode 100644
index 000000000000..b94a56439d53
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sparklines/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, future
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sparklines";
+  version = "0.4.2";
+
+  src = fetchFromGitHub {
+    owner = "deeplook";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1hfxp5c4wbyddy7fgmnda819w3dia3i6gqb2323dr2z016p84r7l";
+  };
+
+  propagatedBuildInputs = [ future ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "sparklines" ];
+
+  meta = with lib; {
+    description = "This Python package implements Edward Tufte's concept of sparklines, but limited to text only";
+    homepage = "https://github.com/deeplook/sparklines";
+    maintainers = with maintainers; [ rhoriguchi ];
+    license = licenses.gpl3Only;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sparqlwrapper/default.nix b/nixpkgs/pkgs/development/python-modules/sparqlwrapper/default.nix
new file mode 100644
index 000000000000..41248d73b8fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sparqlwrapper/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, keepalive
+}:
+
+buildPythonPackage rec {
+  pname = "sparqlwrapper";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    pname = "SPARQLWrapper";
+    inherit version;
+    hash = "sha256-P+0+vMd2F6SnTSZEuG/Yjg8y5/cAOseyszTAJiAXMfE=";
+  };
+
+  # break circular dependency loop
+  patchPhase = ''
+    sed -i '/rdflib/d' setup.cfg
+  '';
+
+  # Doesn't actually run tests
+  doCheck = false;
+
+  propagatedBuildInputs = [ keepalive ];
+
+  meta = with lib; {
+    description = "This is a wrapper around a SPARQL service. It helps in creating the query URI and, possibly, convert the result into a more manageable format";
+    homepage = "http://rdflib.github.io/sparqlwrapper";
+    license = licenses.w3c;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sparse/default.nix b/nixpkgs/pkgs/development/python-modules/sparse/default.nix
new file mode 100644
index 000000000000..9b02a1c222f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sparse/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, dask
+, fetchpatch
+, fetchPypi
+, numba
+, numpy
+, pytestCheckHook
+, pythonOlder
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "sparse";
+  version = "0.14.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-X1gno39s1vZzClQfmUyVxgo64jKeAfS6Ic7VM5rqAJg=";
+  };
+
+  patches = [
+    # https://github.com/pydata/sparse/issues/594
+    (fetchpatch {
+      name = "fix-test.patch";
+      url = "https://github.com/pydata/sparse/commit/a55651d630efaea6fd2758d083c6d02333b0eebe.patch";
+      hash = "sha256-Vrx7MDlKtA8fOuFZenEkvgA70Hzm+p/4SPZuCvwtLuo=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    numba
+    numpy
+    scipy
+  ];
+
+  nativeCheckInputs = [
+    dask
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sparse"
+  ];
+
+  meta = with lib; {
+    description = "Sparse n-dimensional arrays computations";
+    homepage = "https://sparse.pydata.org/";
+    changelog = "https://sparse.pydata.org/en/stable/changelog.html";
+    downloadPage = "https://github.com/pydata/sparse/releases/tag/${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spdx-tools/default.nix b/nixpkgs/pkgs/development/python-modules/spdx-tools/default.nix
new file mode 100644
index 000000000000..06faf6ca261f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spdx-tools/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, beartype
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, license-expression
+, ply
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, rdflib
+, semantic-version
+, setuptools
+, setuptools-scm
+, uritools
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "spdx-tools";
+  version = "0.8.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "spdx";
+    repo = "tools-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-KB+tfuz0ZnoQcMX3H+IZXjcmPZ4x2ecl8ofz1/3r0/8=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    beartype
+    click
+    license-expression
+    ply
+    pyyaml
+    rdflib
+    semantic-version
+    uritools
+    xmltodict
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "spdx_tools.spdx"
+  ];
+
+  disabledTestPaths = [
+    # Test depends on the currently not packaged pyshacl module
+    "tests/spdx3/validation/json_ld/test_shacl_validation.py"
+  ];
+
+  disabledTests = [
+    # Missing files
+    "test_spdx2_convert_to_spdx3"
+    "test_json_writer"
+  ];
+
+  meta = with lib; {
+    description = "SPDX parser and tools";
+    homepage = "https://github.com/spdx/tools-python";
+    changelog = "https://github.com/spdx/tools-python/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/speaklater/default.nix b/nixpkgs/pkgs/development/python-modules/speaklater/default.nix
new file mode 100644
index 000000000000..a9acfb2dbb38
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/speaklater/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "speaklater";
+  version = "1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ab5dbfzzgz6cnz4xlwx79gz83id4bhiw67k1cgqrlzfs0va7zjr";
+  };
+
+  meta = with lib; {
+    description = "Implements a lazy string for python useful for use with gettext";
+    homepage = "https://github.com/mitsuhiko/speaklater";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ matejc ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/speaklater3/default.nix b/nixpkgs/pkgs/development/python-modules/speaklater3/default.nix
new file mode 100644
index 000000000000..60c4c99fd3a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/speaklater3/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "speaklater3";
+  version = "1.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ySYdS2taMEZyMS0esImb4Cj6yRdgGQqA/szTHTo7UEI=";
+  };
+
+  pythonImportsCheck = [ "speaklater" ];
+
+  meta = with lib; {
+    description = "Implements a lazy string for python useful for use with gettext";
+    homepage = "https://github.com/mitsuhiko/speaklater";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spectral-cube/default.nix b/nixpkgs/pkgs/development/python-modules/spectral-cube/default.nix
new file mode 100644
index 000000000000..98132c9f17d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spectral-cube/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, stdenv
+, aplpy
+, astropy
+, buildPythonPackage
+, casa-formats-io
+, dask
+, fetchPypi
+, joblib
+, pytest-astropy
+, pytestCheckHook
+, pythonOlder
+, radio-beam
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "spectral-cube";
+  version = "0.6.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7wfvsravSkAGkTtuPE01wPW7wEHKVWT8kYQn93Q2B4M=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    astropy
+    casa-formats-io
+    radio-beam
+    joblib
+    dask
+  ];
+
+  nativeCheckInputs = [
+    aplpy
+    pytest-astropy
+    pytestCheckHook
+  ];
+
+  # Tests must be run in the build directory.
+  preCheck = ''
+    cd build/lib
+  '';
+
+  # On x86_darwin, this test fails with "Fatal Python error: Aborted"
+  # when sandbox = true.
+  disabledTestPaths = lib.optionals stdenv.isDarwin [
+    "spectral_cube/tests/test_visualization.py"
+  ];
+
+  pythonImportsCheck = [
+    "spectral_cube"
+  ];
+
+  meta = with lib; {
+    description = "Library for reading and analyzing astrophysical spectral data cubes";
+    homepage = "https://spectral-cube.readthedocs.io";
+    changelog = "https://github.com/radio-astro-tools/spectral-cube/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ smaret ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/speechbrain/default.nix b/nixpkgs/pkgs/development/python-modules/speechbrain/default.nix
new file mode 100644
index 000000000000..ddb1ab53c9c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/speechbrain/default.nix
@@ -0,0 +1,55 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, huggingface-hub
+, hyperpyyaml
+, joblib
+, lib
+, numpy
+, packaging
+, pythonOlder
+, sentencepiece
+, scipy
+, torch
+, torchaudio
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "speechbrain";
+  version = "0.5.16";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "speechbrain";
+    repo = "speechbrain";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Mve6wr3klXMe7sCiJjPuzUPKGHRyI/LzTe6Ea39zNHw=";
+  };
+
+  propagatedBuildInputs = [
+    huggingface-hub
+    hyperpyyaml
+    joblib
+    numpy
+    packaging
+    sentencepiece
+    scipy
+    torch
+    torchaudio
+    tqdm
+  ];
+
+  doCheck = false; # requires sox backend
+
+  pythonImportsCheck = [ "speechbrain" ];
+
+  meta = with lib; {
+    description = "A PyTorch-based Speech Toolkit";
+    homepage = "https://speechbrain.github.io";
+    changelog = "https://github.com/speechbrain/speechbrain/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/speedtest-cli/default.nix b/nixpkgs/pkgs/development/python-modules/speedtest-cli/default.nix
new file mode 100644
index 000000000000..b4842a547610
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/speedtest-cli/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+# cannot be built as pythonApplication because the library functions are
+# required for home-assistant
+buildPythonPackage rec {
+  pname = "speedtest-cli";
+  version = "2.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1w4h7m0isbvfy4zx6m5j4594p5y4pjbpzsr0h4yzmdgd7hip69sy";
+  };
+
+  # tests require working internet connection
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Command line interface for testing internet bandwidth using speedtest.net";
+    homepage = "https://github.com/sivel/speedtest-cli";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ makefu domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/speg/default.nix b/nixpkgs/pkgs/development/python-modules/speg/default.nix
new file mode 100644
index 000000000000..5c969f55b168
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/speg/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, speg
+}:
+
+buildPythonPackage rec {
+  pname = "speg";
+  version = "0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-EMvvR+Fo38YvFNtXXPHEKAN6K4gc7mw8/O2gQ5wkPnE=";
+    extension = "zip";
+  };
+
+  pythonImportsCheck = [ "speg" ];
+
+  # checks fail for seemingly spurious reasons
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A PEG-based parser interpreter with memoization (in time)";
+    homepage = "https://github.com/avakar/speg";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ xworld21 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spglib/default.nix b/nixpkgs/pkgs/development/python-modules/spglib/default.nix
new file mode 100644
index 000000000000..95d73246aab9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spglib/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+
+# build-system
+, scikit-build-core
+, cmake
+, pathspec
+, ninja
+, pyproject-metadata
+
+# dependencies
+, numpy
+
+# tests
+, pytestCheckHook
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "spglib";
+  version = "2.1.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gUNUX9/8EfvNpNcFpra81Iid6bw1JLeN+GajbdDeCks=";
+  };
+
+  nativeBuildInputs = [
+    scikit-build-core
+    cmake
+    pathspec
+    ninja
+    pyproject-metadata
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pyyaml
+  ];
+
+  pythonImportsCheck = [
+    "spglib"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for C library for finding and handling crystal symmetries";
+    homepage = "https://spglib.github.io/spglib/";
+    changelog = "https://github.com/spglib/spglib/raw/v${version}/ChangeLog";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphfile/default.nix b/nixpkgs/pkgs/development/python-modules/sphfile/default.nix
new file mode 100644
index 000000000000..79f7aa0739cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphfile/default.nix
@@ -0,0 +1,23 @@
+{ lib, fetchurl, buildPythonPackage, numpy }:
+
+buildPythonPackage rec {
+  pname = "sphfile";
+  version = "1.0.3";
+
+  src = fetchurl {
+    url = "mirror://pypi/s/sphfile/${pname}-${version}.tar.gz";
+    sha256 = "1596d801facc2b03a40a1bc67a839701f068a41597059feb82fc9378420c52c0";
+  };
+
+  propagatedBuildInputs = [ numpy ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Numpy-based NIST SPH audio-file reader";
+    homepage    = "https://github.com/mcfletch/sphfile";
+    license     = licenses.mit;
+    maintainers = with maintainers; [ abbradar ];
+    platforms   = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-argparse/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-argparse/default.nix
new file mode 100644
index 000000000000..d2720bd1246e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-argparse/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-argparse";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    pname = "sphinx_argparse";
+    inherit version;
+    hash = "sha256-4PNBhOtW8S+s53T7yHuICr25AXoJmNHsVZsmfpaX5Ek=";
+  };
+
+  postPatch = ''
+    # Fix tests for python-3.10 and add 3.10 to CI matrix
+    # Should be fixed in versions > 0.3.1
+    # https://github.com/ashb/sphinx-argparse/pull/3
+    substituteInPlace sphinxarg/parser.py \
+      --replace "if action_group.title == 'optional arguments':" "if action_group.title == 'optional arguments' or action_group.title == 'options':"
+  '';
+
+  propagatedBuildInputs = [
+    sphinx
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "sphinxarg" ];
+
+  meta = {
+    description = "A sphinx extension that automatically documents argparse commands and options";
+    homepage = "https://github.com/ashb/sphinx-argparse";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ clacke ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-autoapi/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-autoapi/default.nix
new file mode 100644
index 000000000000..3d47f22c8726
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-autoapi/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+# build-system
+, setuptools
+
+# dependencies
+, astroid
+, anyascii
+, jinja2
+, pyyaml
+, sphinx
+
+# tests
+, beautifulsoup4
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-autoapi";
+  version = "2.1.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+625bnkCDWsOxF2IhRe/gW1rWHotNA++HsMRNeMApsg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    anyascii
+    astroid
+    jinja2
+    pyyaml
+    sphinx
+  ];
+
+  nativeCheckInputs = [
+    beautifulsoup4
+    mock
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # failing typing assertions
+    "test_integration"
+    "test_annotations"
+  ];
+
+  pythonImportsCheck = [
+    "autoapi"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/readthedocs/sphinx-autoapi";
+    changelog = "https://github.com/readthedocs/sphinx-autoapi/blob/v${version}/CHANGELOG.rst";
+    description = "Provides 'autodoc' style documentation";
+    longDescription = ''
+      Sphinx AutoAPI provides 'autodoc' style documentation for
+      multiple programming languages without needing to load, run, or
+      import the project being documented.
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ karolchmist ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-autobuild/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-autobuild/default.nix
new file mode 100644
index 000000000000..379dbdd0b3da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-autobuild/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, colorama
+, sphinx
+, livereload
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-autobuild";
+  version = "2021.3.14";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "de1ca3b66e271d2b5b5140c35034c89e47f263f2cd5db302c9217065f7443f05";
+  };
+
+  propagatedBuildInputs = [
+    colorama
+    sphinx
+    livereload
+  ];
+
+  # No tests included.
+  doCheck = false;
+
+  pythonImportsCheck = [ "sphinx_autobuild" ];
+
+  meta = with lib; {
+    description = "Rebuild Sphinx documentation on changes, with live-reload in the browser";
+    homepage = "https://github.com/executablebooks/sphinx-autobuild";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [holgerpeters];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-autodoc-typehints/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-autodoc-typehints/default.nix
new file mode 100644
index 000000000000..d99577fd234e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-autodoc-typehints/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hatch-vcs
+, hatchling
+, pythonOlder
+, sphinx
+, pytestCheckHook
+}:
+
+let
+  pname = "sphinx-autodoc-typehints";
+  version = "1.24.0";
+in
+
+buildPythonPackage {
+  inherit pname version;
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "sphinx_autodoc_typehints";
+    inherit version;
+    hash = "sha256-lORABmlBuyN3BLuIB4Xi0F6K5UBsiGdP7vu5OK0Nxq8=";
+  };
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    sphinx
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # requires spobjinv, nbtyping
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sphinx_autodoc_typehints"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/tox-dev/sphinx-autodoc-typehints/releases/tag/${version}";
+    description = "Type hints (PEP 484) support for the Sphinx autodoc extension";
+    homepage = "https://github.com/tox-dev/sphinx-autodoc-typehints";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-automodapi/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-automodapi/default.nix
new file mode 100644
index 000000000000..bc74fae5491e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-automodapi/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchurl
+, pythonOlder
+, setuptools-scm
+, git
+, sphinx
+, pytestCheckHook
+, cython
+, gcc
+, graphviz
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-automodapi";
+  version = "0.16.0";
+  pyproject = true;
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "astropy";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-ecOwBtJBkGsBShMG5fK22V1EHLe6pCmOdHPrS/k6rno=";
+    leaveDotGit = true;
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+    git
+  ];
+
+  propagatedBuildInputs = [ sphinx ];
+
+  # https://github.com/astropy/sphinx-automodapi/issues/155
+  testInventory = fetchurl {
+    # Originally: https://docs.python.org/3/objects.inv
+    url = "https://web.archive.org/web/20221007193144/https://docs.python.org/3/objects.inv";
+    hash = "sha256-1cbUmdJJSoifkiIYa70SxnLsaK3F2gvnTEWo9vo/6rY=";
+  };
+
+  postPatch = ''
+    substituteInPlace sphinx_automodapi/tests/{helpers,test_cases}.py \
+      --replace ", None)" ", (None, '${testInventory}'))"
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    cython
+    gcc
+    graphviz
+  ];
+
+  pythonImportsCheck = [ "sphinx_automodapi" ];
+
+  meta = with lib; {
+    description = "Sphinx extension for generating API documentation";
+    homepage = "https://github.com/astropy/sphinx-automodapi";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ lovesegfault ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-basic-ng/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-basic-ng/default.nix
new file mode 100644
index 000000000000..a3da400d1070
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-basic-ng/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-basic-ng";
+  version = "1.0.0.beta2";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pradyunsg";
+    repo = "sphinx-basic-ng";
+    rev = version;
+    hash = "sha256-MHBGIKOKhGklrx3O075LRud8NhY2hzlTWh+jalrFpko=";
+  };
+
+  propagatedBuildInputs = [
+    sphinx
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "sphinx_basic_ng" ];
+
+  meta = with lib; {
+    description = "A modernised skeleton for Sphinx themes";
+    homepage = "https://sphinx-basic-ng.readthedocs.io/en/latest/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Luflosi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-better-theme/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-better-theme/default.nix
new file mode 100644
index 000000000000..8227eca47d84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-better-theme/default.nix
@@ -0,0 +1,45 @@
+{ lib, buildPythonPackage, fetchFromGitHub, sphinxHook }:
+
+buildPythonPackage rec {
+  pname = "sphinx-better-theme";
+  version = "0.1.5";
+  outputs = [ "out" "doc" ];
+
+  src = fetchFromGitHub {
+    owner = "irskep";
+    repo = "sphinx-better-theme";
+    rev = "v${version}";
+    sha256 = "07lhfmsjcfzcchsjzh6kxdq5s47j2a6lb5wv3m1kmv2hcm3gvddh";
+  };
+
+  nativeBuildInputs = [ sphinxHook ];
+
+  pythonImportsCheck = [ "better" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/irskep/sphinx-better-theme";
+    description = "Better Sphinx Theme";
+    longDescription = ''
+      This is a modified version of the default Sphinx theme with the following
+      goals:
+
+      1. Remove frivolous colors, especially hard-coded ones
+      2. Improve readability by limiting width and using more whitespace
+      3. Encourage visual customization through CSS, not themeconf
+      4. Use semantic markup
+
+      v0.1 meets goals one and two. Goal three is partially complete; it's simple to
+      add your own CSS file without creating a whole new theme.
+      you'd like something changed.
+
+      To use the theme, set ``html_theme_path`` to contain
+      ``better.better_theme_path``, and set ``html_theme`` to ``'better'``::
+
+          from better import better_theme_path
+          html_theme_path = [better_theme_path]
+          html_theme = 'better'
+    '';
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ kaction ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-book-theme/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-book-theme/default.nix
new file mode 100644
index 000000000000..872df1fbb451
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-book-theme/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, sphinx
+, pydata-sphinx-theme
+, jupyter-book
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-book-theme";
+  version = "1.0.1";
+
+  format = "wheel";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit version format;
+    dist = "py3";
+    python = "py3";
+    pname = "sphinx_book_theme";
+    hash = "sha256-0V+CSLNxippr4LphejLRWR+fo5xhRGm/rOd3uganO3U=";
+  };
+
+  propagatedBuildInputs = [
+    pydata-sphinx-theme
+    sphinx
+  ];
+
+  pythonImportsCheck = [
+    "sphinx_book_theme"
+  ];
+
+  passthru.tests = {
+    inherit jupyter-book;
+  };
+
+  meta = with lib; {
+    description = "A clean book theme for scientific explanations and documentation with Sphinx";
+    homepage = "https://github.com/executablebooks/sphinx-book-theme";
+    changelog = "https://github.com/executablebooks/sphinx-book-theme/raw/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-codeautolink/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-codeautolink/default.nix
new file mode 100644
index 000000000000..e7defb682db3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-codeautolink/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+# documentation build dependencies
+, sphinxHook
+, sphinx-rtd-theme
+, matplotlib
+, ipython
+# runtime dependencies
+, sphinx
+, beautifulsoup4
+# check dependencies
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-codeautolink";
+  version = "0.15.0";
+  format = "pyproject";
+
+  outputs = [ "out" "doc" ];
+
+  src = fetchFromGitHub {
+    owner = "felix-hilden";
+    repo = "sphinx-codeautolink";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-iXUdOwyTRViDTDRPCcteiJ2Rcdbpiol7JPEzqbUwIPc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    sphinxHook
+    sphinx-rtd-theme
+    matplotlib
+    ipython
+  ];
+
+  sphinxRoot = "docs/src";
+
+  propagatedBuildInputs = [ sphinx beautifulsoup4 ];
+
+  nativeCheckInputs = [ pytest ];
+
+  pythonImportsCheck = [ "sphinx_codeautolink" ];
+
+  meta = with lib; {
+    description = "A sphinx extension that makes code examples clickable";
+    homepage = "https://github.com/felix-hilden/sphinx-codeautolink";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kaction ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-comments/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-comments/default.nix
new file mode 100644
index 000000000000..2ffed0c091fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-comments/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-comments";
+  version = "0.0.3";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "00170afff27019fad08e421da1ae49c681831fb2759786f07c826e89ac94cf21";
+  };
+
+  propagatedBuildInputs = [ sphinx ];
+
+  pythonImportsCheck = [ "sphinx_comments" ];
+
+  meta = with lib; {
+    description = "Add comments and annotation to your documentation";
+    homepage = "https://github.com/executablebooks/sphinx-comments";
+    license = licenses.mit;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-copybutton/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-copybutton/default.nix
new file mode 100644
index 000000000000..040bed82cdec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-copybutton/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-copybutton";
+  version = "0.5.2";
+
+  src = fetchFromGitHub {
+    owner = "executablebooks";
+    repo = "sphinx-copybutton";
+    rev = "v${version}";
+    hash = "sha256-LM2LtQuYsPRJ2XX9aAW36xRtwghTkzug6A6fpVJ6hbk=";
+    fetchSubmodules = true;
+  };
+
+  propagatedBuildInputs = [
+    sphinx
+  ];
+
+  doCheck = false; # no tests
+
+  pythonImportsCheck = [ "sphinx_copybutton" ];
+
+  meta = with lib; {
+    description = "A small sphinx extension to add a \"copy\" button to code blocks";
+    homepage = "https://github.com/executablebooks/sphinx-copybutton";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Luflosi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-design/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-design/default.nix
new file mode 100644
index 000000000000..ad109b1d30fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-design/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, flit-core
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-design";
+  version = "0.5.0";
+
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "sphinx_design";
+    hash = "sha256-6OUTrOpvktFcbeOzTpVEWPJFuOdhtFtjlQ9lNzNSqwA=";
+  };
+
+  nativeBuildInputs = [ flit-core ];
+
+  propagatedBuildInputs = [ sphinx ];
+
+  pythonImportsCheck = [ "sphinx_design" ];
+
+  meta = with lib; {
+    description = "A sphinx extension for designing beautiful, view size responsive web components";
+    homepage = "https://github.com/executablebooks/sphinx-design";
+    changelog = "https://github.com/executablebooks/sphinx-design/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-external-toc/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-external-toc/default.nix
new file mode 100644
index 000000000000..921669d4ca71
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-external-toc/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, flit-core
+, click
+, pyyaml
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-external-toc";
+  version = "1.0.0";
+
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "sphinx_external_toc";
+    sha256 = "sha256-990JX/OrD7dKMQ1BCwo2GPwd3G8s5DWJfWWayqSj6yQ=";
+  };
+
+  nativeBuildInputs = [ flit-core ];
+
+  propagatedBuildInputs = [
+    click
+    pyyaml
+    sphinx
+  ];
+
+  pythonImportsCheck = [ "sphinx_external_toc" ];
+
+  meta = with lib; {
+    description = "A sphinx extension that allows the site-map to be defined in a single YAML file";
+    homepage = "https://github.com/executablebooks/sphinx-external-toc";
+    changelog = "https://github.com/executablebooks/sphinx-external-toc/raw/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-fortran/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-fortran/default.nix
new file mode 100644
index 000000000000..cd47d3c4743f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-fortran/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, future
+, numpy
+, sphinx
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-fortran";
+  version = "unstable-2022-03-02";
+
+  src = fetchFromGitHub {
+    owner = "VACUMM";
+    repo = pname;
+    rev = "394ae990b43ed43fcff8beb048632f5e99794264";
+    hash = "sha256-IVKu5u9gqs7/9EZrf4ZYd12K6J31u+/B8kk4+8yfohM=";
+  };
+
+  propagatedBuildInputs = [
+    future
+    numpy
+    sphinx
+    six
+  ];
+
+  pythonImportsCheck = [ "sphinxfortran" ];
+
+  # Tests are failing because reference files are not updated
+  doCheck = false;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Fortran domain and autodoc extensions to Sphinx";
+    homepage = "http://sphinx-fortran.readthedocs.org/";
+    license = licenses.cecill21;
+    maintainers = with maintainers; [ loicreynier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-hoverxref/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-hoverxref/default.nix
new file mode 100644
index 000000000000..d6237387bf88
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-hoverxref/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, pythonImportsCheckHook
+# documentation build dependencies
+, sphinxHook
+, sphinx-notfound-page
+, sphinx-prompt
+, sphinx-rtd-theme
+, sphinx-tabs
+, sphinx-version-warning
+, sphinx-autoapi
+, sphinxcontrib-bibtex
+, sphinxemoji
+# runtime dependencies
+, sphinx
+, sphinxcontrib-jquery
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-hoverxref";
+  version = "1.3.0";
+  format = "pyproject";
+  outputs = [ "out" "doc" ];
+
+  src = fetchFromGitHub {
+    owner = "readthedocs";
+    repo = "sphinx-hoverxref";
+    rev = version;
+    hash = "sha256-DJ+mHu9IeEYEyf/SD+nDNtWpTf6z7tQzG0ogaECDpkU=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+    pythonImportsCheckHook
+
+    sphinxHook
+    sphinx-notfound-page
+    sphinx-prompt
+    sphinx-rtd-theme
+    sphinx-tabs
+    sphinx-version-warning
+    sphinx-autoapi
+    sphinxcontrib-bibtex
+    sphinxemoji
+  ];
+
+  propagatedBuildInputs = [ sphinx sphinxcontrib-jquery ];
+
+  pythonImportsCheck = [ "hoverxref" ];
+
+  meta = with lib; {
+    description = "A sphinx extension for creating tooltips on the cross references of the documentation";
+    longDescription = ''
+      sphinx-hoverxref is a Sphinx extension to show a floating window
+      (tooltips or modal dialogues) on the cross references of the
+      documentation embedding the content of the linked section on them.
+
+      With sphinx-hoverxref, you don’t need to click a link to see what’s
+      in there.
+    '';
+    homepage = "https://github.com/readthedocs/sphinx-hoverxref";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kaction ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-inline-tabs/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-inline-tabs/default.nix
new file mode 100644
index 000000000000..0f44efae9796
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-inline-tabs/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-inline-tabs";
+  version = "2023.04.21";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pradyunsg";
+    repo = "sphinx-inline-tabs";
+    rev = version;
+    hash = "sha256-1oZheHDNOQU0vWL3YClQrJe94WyUJ72bCAF1UKtjJ0w=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    sphinx
+  ];
+
+  # no tests, see https://github.com/pradyunsg/sphinx-inline-tabs/issues/6
+  doCheck = false;
+
+  pythonImportsCheck = [ "sphinx_inline_tabs" ];
+
+  meta = with lib; {
+    description = "Add inline tabbed content to your Sphinx documentation";
+    homepage = "https://github.com/pradyunsg/sphinx-inline-tabs";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Luflosi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-intl/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-intl/default.nix
new file mode 100644
index 000000000000..1fdf937ae650
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-intl/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, transifex-cli
+, babel
+, click
+, setuptools
+, sphinx
+, pytestCheckHook
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-intl";
+  version = "2.1.0";
+  format = "setuptools";
+
+ src = fetchFromGitHub {
+    owner = "sphinx-doc";
+    repo = pname;
+    rev = version;
+    hash = "sha256-U/YCviGrsZNruVzfP0P2dGcB0K0Afh+XUZtp71OeP6c=";
+  };
+
+  propagatedBuildInputs = [
+    babel
+    click
+    setuptools
+    sphinx
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+    transifex-cli
+  ];
+
+  pythonImportsCheck = [ "sphinx_intl" ];
+
+  meta = with lib; {
+    description = "Sphinx utility that make it easy to translate and to apply translation";
+    homepage = "https://github.com/sphinx-doc/sphinx-intl";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ thornycrackers ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-issues/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-issues/default.nix
new file mode 100644
index 000000000000..4ea94b761890
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-issues/default.nix
@@ -0,0 +1,36 @@
+{ lib, buildPythonPackage, sphinx, fetchFromGitHub, pandoc }:
+
+buildPythonPackage rec {
+  pname = "sphinx-issues";
+  version = "3.0.1";
+  outputs = [ "out" "doc" ];
+
+  src = fetchFromGitHub {
+    owner = "sloria";
+    repo = "sphinx-issues";
+    rev = version;
+    sha256 = "1lns6isq9kwcw8z4jwgy927f7idx9srvri5adaa5zmypw5x47hha";
+  };
+
+  pythonImportsCheck = [ "sphinx_issues" ];
+
+  propagatedBuildInputs = [ sphinx ];
+
+  nativeBuildInputs = [ pandoc ];
+
+  postBuild = ''
+    pandoc -f rst -t html --standalone < README.rst > README.html
+  '';
+
+  postInstall = ''
+    mkdir -p $doc/share/doc/$name/html
+    cp README.html $doc/share/doc/$name/html
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/sloria/sphinx-issues";
+    description = "Sphinx extension for linking to your project's issue tracker.";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kaction ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-jinja/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-jinja/default.nix
new file mode 100644
index 000000000000..68590ed24ecd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-jinja/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder, sphinx }:
+
+buildPythonPackage rec {
+  pname = "sphinx-jinja";
+  version = "2.0.2";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xiMrWaiUE5dwvh3G0LAKN55CiM54FXkE4fhHPeo+Bxg=";
+  };
+
+  propagatedBuildInputs = [ sphinx ];
+
+  # upstream source is not updated to 2.0.X and pypi does not contain tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "sphinx_jinja" ];
+
+  meta = with lib; {
+    description = "Sphinx extension to include jinja templates in documentation";
+    homepage = "https://github.com/tardyp/sphinx-jinja";
+    maintainers = with maintainers; [ ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-jupyterbook-latex/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-jupyterbook-latex/default.nix
new file mode 100644
index 000000000000..5dff846924d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-jupyterbook-latex/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, sphinx
+, importlib-resources
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-jupyterbook-latex";
+  version = "0.5.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "sphinx_jupyterbook_latex";
+    hash = "sha256-2h060Cj1XdvxC5Ewu58k/GDK+2ccvTnf2VU3qvyQly4=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "sphinx>=4,<5.1" "sphinx"
+  '';
+
+  propagatedBuildInputs = [ sphinx ]
+    ++ lib.optionals (pythonOlder "3.9") [ importlib-resources ];
+
+  pythonImportsCheck = [ "sphinx_jupyterbook_latex" ];
+
+  meta = with lib; {
+    description = "Latex specific features for jupyter book";
+    homepage = "https://github.com/executablebooks/sphinx-jupyterbook-latex";
+    changelog = "https://github.com/executablebooks/sphinx-jupyterbook-latex/raw/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-markdown-parser/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-markdown-parser/default.nix
new file mode 100644
index 000000000000..626e8dba585b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-markdown-parser/default.nix
@@ -0,0 +1,46 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, sphinx
+, markdown
+, commonmark
+, recommonmark
+, pydash
+, pyyaml
+, unify
+, yapf
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-markdown-parser";
+  version = "0.2.4";
+
+  # PyPi release does not include requirements.txt
+  src = fetchFromGitHub {
+    owner = "clayrisser";
+    repo = "sphinx-markdown-parser";
+    # Upstream maintainer currently does not tag releases
+    # https://github.com/clayrisser/sphinx-markdown-parser/issues/35
+    rev = "2fd54373770882d1fb544dc6524c581c82eedc9e";
+    sha256 = "0i0hhapmdmh83yx61lxi2h4bsmhnzddamz95844g2ghm132kw5mv";
+  };
+
+  propagatedBuildInputs = [ sphinx markdown commonmark pydash pyyaml unify yapf recommonmark ];
+
+  # Avoids running broken tests in test_markdown.py
+  checkPhase = ''
+    ${python.interpreter} -m unittest -v tests/test_basic.py tests/test_sphinx.py
+  '';
+
+  pythonImportsCheck = [ "sphinx_markdown_parser" ];
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    description = "Write markdown inside of docutils & sphinx projects";
+    homepage = "https://github.com/clayrisser/sphinx-markdown-parser";
+    license = licenses.mit;
+    maintainers = with maintainers; [ FlorianFranzen ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-markdown-tables/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-markdown-tables/default.nix
new file mode 100644
index 000000000000..55fb0b41f43e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-markdown-tables/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sphinx
+, markdown
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-markdown-tables";
+  version = "0.0.17";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-a8bT1ADqzP7r0ohEa8CN2DCDNnxYuF1A/mwS1371kvE=";
+  };
+
+  propagatedBuildInputs = [
+    sphinx
+    markdown
+  ];
+
+  pythonImportsCheck = [ "sphinx_markdown_tables" ];
+
+  meta = with lib; {
+    description = "Sphinx extension for rendering tables written in markdown";
+    homepage = "https://github.com/ryanfox/sphinx-markdown-tables";
+    maintainers = with maintainers; [ Madouura ];
+    license = licenses.gpl3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-material/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-material/default.nix
new file mode 100644
index 000000000000..9cbcb31d3347
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-material/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, css-html-js-minify
+, fetchPypi
+, lxml
+, python-slugify
+, pythonOlder
+, sphinx
+, unidecode
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-material";
+  version = "0.0.36";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "sphinx_material";
+    inherit version;
+    hash = "sha256-7v9ffT3AFq8yuv33DGbmcdFch1Tb4GE9+9Yp++2RKGk=";
+  };
+
+  propagatedBuildInputs = [
+    sphinx
+    beautifulsoup4
+    python-slugify
+    unidecode
+    css-html-js-minify
+    lxml
+  ];
+
+  doCheck = false; # no tests
+
+  pythonImportsCheck = [
+    "sphinx_material"
+  ];
+
+  meta = with lib; {
+    description = "A material-based, responsive theme inspired by mkdocs-material";
+    homepage = "https://bashtage.github.io/sphinx-material";
+    license = licenses.mit;
+    maintainers = with maintainers; [ FlorianFranzen ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-mdinclude/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-mdinclude/default.nix
new file mode 100644
index 000000000000..d20446e91bb0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-mdinclude/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, flit-core
+, docutils
+, mistune
+, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-mdinclude";
+  version = "0.5.3";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "sphinx_mdinclude";
+    inherit version;
+    hash = "sha256-KZjj0YswIsmYPRtyGR/jfiX/zNVBZcvjrLIszu3ZGvQ=";
+  };
+
+  nativeBuildInputs = [ flit-core ];
+  propagatedBuildInputs = [ mistune docutils ];
+
+  nativeCheckInputs = [ pygments ];
+
+  meta = with lib; {
+    homepage = "https://github.com/miyakogi/m2r";
+    description = "Sphinx extension for including or writing pages in Markdown format.";
+    longDescription = ''
+      A simple Sphinx extension that enables including Markdown documents from within
+      reStructuredText.
+      It provides the .. mdinclude:: directive, and automatically converts the content of
+      Markdown documents to reStructuredText format.
+
+      sphinx-mdinclude is a fork of m2r and m2r2, focused only on providing a Sphinx extension.
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ flokli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-multitoc-numbering/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-multitoc-numbering/default.nix
new file mode 100644
index 000000000000..33e346638e9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-multitoc-numbering/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-multitoc-numbering";
+  version = "0.1.3";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c9607671ac511236fa5d61a7491c1031e700e8d498c9d2418e6c61d1251209ae";
+  };
+
+  propagatedBuildInputs = [ sphinx ];
+
+  pythonImportsCheck = [ "sphinx_multitoc_numbering" ];
+
+  meta = with lib; {
+    description = "Supporting continuous HTML section numbering";
+    homepage = "https://github.com/executablebooks/sphinx-multitoc-numbering";
+    license = licenses.mit;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-notfound-page/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-notfound-page/default.nix
new file mode 100644
index 000000000000..e9f5d9c4519d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-notfound-page/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, pythonImportsCheckHook
+# documentation build dependencies
+, sphinxHook
+, sphinx-prompt
+, sphinx-rtd-theme
+, sphinx-tabs
+, sphinx-autoapi
+, sphinxemoji
+# runtime dependencies
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-notfound-page";
+  version = "1.0.0";
+  format = "pyproject";
+  outputs = [ "out" "doc" ];
+
+  src = fetchFromGitHub {
+    owner = "readthedocs";
+    repo = "sphinx-notfound-page";
+    rev = version;
+    hash = "sha256-tG71UuYbdlWNgq6Y5xRH3aWc9/eTr/RlsRNWSUjrbBE=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+    pythonImportsCheckHook
+    sphinxHook
+    sphinx-prompt
+    sphinx-rtd-theme
+    sphinx-tabs
+    sphinx-autoapi
+    sphinxemoji
+  ];
+
+  propagatedBuildInputs = [ sphinx ];
+
+  pythonImportsCheck = [ "notfound" ];
+
+  meta = with lib; {
+    description = "A sphinx extension to create a custom 404 page with absolute URLs hardcoded";
+    homepage = "https://github.com/readthedocs/sphinx-notfound-page";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kaction ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-prompt/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-prompt/default.nix
new file mode 100644
index 000000000000..776752d74c45
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-prompt/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, poetry-dynamic-versioning
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-prompt";
+  version = "1.7.0"; # read before updating past 1.7.0 https://github.com/sbrunner/sphinx-prompt/issues/398
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "sbrunner";
+    repo = "sphinx-prompt";
+    rev = "refs/tags/${version}";
+    hash = "sha256-/XxUSsW8Bowks7P+d6iTlklyMIfTb2otXva/VtRVAkM=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"poetry-plugin-tweak-dependencies-version", ' ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+    poetry-dynamic-versioning
+  ];
+
+  propagatedBuildInputs = [ sphinx ];
+
+  meta = with lib; {
+    description = "A sphinx extension for creating unselectable prompt";
+    homepage = "https://github.com/sbrunner/sphinx-prompt";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ kaction ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-pytest/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-pytest/default.nix
new file mode 100644
index 000000000000..7bc41418fe46
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-pytest/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, pytest
+, sphinx
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-pytest";
+  version = "0.2.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "chrisjsewell";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-oSBBt+hSMs4mvGqibQHoYHXr2j/bpsGOnIMfwfTfWKQ=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    sphinx
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  pythonImportsCheck = [
+    "sphinx_pytest"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/sphinx-extensions2/sphinx-pytest/releases/tag/v${version}";
+    description = "Helpful pytest fixtures for Sphinx extensions";
+    homepage = "https://github.com/chrisjsewell/sphinx-pytest";
+    license = licenses.mit;
+    maintainers = with maintainers; [ loicreynier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-rtd-theme/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-rtd-theme/default.nix
new file mode 100644
index 000000000000..fe056b3e70bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-rtd-theme/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, docutils
+, sphinx
+, readthedocs-sphinx-ext
+, sphinxcontrib-jquery
+, pytestCheckHook
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-rtd-theme";
+  version = "1.3.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "sphinx_rtd_theme";
+    inherit version;
+    hash = "sha256-WQsDDHq7nPA47AU7leU4C1xw1hWR6wtVIGP758QfCTE=";
+  };
+
+  preBuild = ''
+    # Don't use NPM to fetch assets. Assets are included in sdist.
+    export CI=1
+  '';
+
+  propagatedBuildInputs = [
+    docutils
+    sphinx
+    sphinxcontrib-jquery
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    readthedocs-sphinx-ext
+  ];
+
+  pythonRelaxDeps = [
+    "docutils"
+    "sphinxcontrib-jquery"
+  ];
+
+  pythonImportsCheck = [
+    "sphinx_rtd_theme"
+  ];
+
+  meta = with lib; {
+    description = "Sphinx theme for readthedocs.org";
+    homepage = "https://github.com/readthedocs/sphinx_rtd_theme";
+    changelog = "https://github.com/readthedocs/sphinx_rtd_theme/blob/${version}/docs/changelog.rst";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-serve/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-serve/default.nix
new file mode 100644
index 000000000000..ca2b587e3acc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-serve/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-serve";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8d90f6595114108500b1f935d3f4d07bf5192783c67ce83f944ef289099669c9";
+  };
+
+  doCheck = false; # No tests
+
+  pythonImportsCheck = [ "sphinx_serve" ];
+
+  meta = with lib; {
+    description = "Spawns a simple HTTP server to preview your sphinx documents";
+    homepage = "https://github.com/tlatsas/sphinx-serve";
+    maintainers = with maintainers; [ FlorianFranzen ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-sitemap/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-sitemap/default.nix
new file mode 100644
index 000000000000..b14d669a10c9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-sitemap/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, sphinx
+, sphinx-pytest
+, pytestCheckHook
+}:
+let
+  pname = "sphinx-sitemap";
+  version = "2.5.1";
+in
+buildPythonPackage {
+  inherit pname version;
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "jdillard";
+    repo = "sphinx-sitemap";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-R8nAaEPd2vQs9Z0Fa5yvTP0KP3O+DnIJLPeISZ10Xtk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    sphinx
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    sphinx-pytest
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/jdillard/sphinx-sitemap/releases/tag/v${version}";
+    description = "Sitemap generator for Sphinx";
+    homepage = "https://github.com/jdillard/sphinx-sitemap";
+    maintainers = with maintainers; [ alejandrosame ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-tabs/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-tabs/default.nix
new file mode 100644
index 000000000000..04630f189d5a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-tabs/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, setuptools
+
+# documentation build dependencies
+, sphinxHook
+# runtime dependencies
+, sphinx
+, pygments
+, docutils
+# test dependencies
+, pytest
+, beautifulsoup4
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-tabs";
+  version = "3.4.4";
+  format = "pyproject";
+
+  outputs = [ "out" "doc" ];
+
+  src = fetchFromGitHub {
+    owner = "executablebooks";
+    repo = "sphinx-tabs";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-RcCADGJfwXP/U7Uws/uX+huaJzRDRUabQOnc9gqMUzM=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py --replace 'docutils~=0.18.0' 'docutils'
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    sphinxHook
+  ];
+
+  propagatedBuildInputs = [
+    sphinx
+    pygments
+    docutils
+  ];
+
+  nativeCheckInputs = [ pytest
+    beautifulsoup4
+  ];
+
+  pythonImportsCheck = [ "sphinx_tabs" ];
+
+  meta = with lib; {
+    description = "A sphinx extension for creating tabbed content when building HTML.";
+    homepage = "https://github.com/executablebooks/sphinx-tabs";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kaction ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-testing/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-testing/default.nix
new file mode 100644
index 000000000000..d29cfdb7a761
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-testing/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, sphinx
+, six
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-testing";
+  version = "1.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ef661775b5722d7b00f67fc229104317d35637a4fb4434bf2c005afdf1da4d09";
+  };
+
+  nativeCheckInputs = [ unittestCheckHook mock ];
+  propagatedBuildInputs = [ sphinx six ];
+
+  unittestFlagsArray = [ "-s" "tests" ];
+
+  # Test failures https://github.com/sphinx-doc/sphinx-testing/issues/5
+  doCheck = false;
+
+  meta = {
+    homepage = "https://github.com/sphinx-doc/sphinx-testing";
+    license = lib.licenses.bsd2;
+    description = "Testing utility classes and functions for Sphinx extensions";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-thebe/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-thebe/default.nix
new file mode 100644
index 000000000000..d6d150d6e92b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-thebe/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hatch-vcs
+, hatchling
+, pythonOlder
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-thebe";
+  version = "0.3.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "sphinx_thebe";
+    hash = "sha256-xg2rG1m5LWouq41xGeh8BzBHDaYvPIS/bKdWkEh9BQU=";
+  };
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    sphinx
+  ];
+
+  pythonImportsCheck = [
+    "sphinx_thebe"
+  ];
+
+  meta = with lib; {
+    description = "Integrate interactive code blocks into your documentation with Thebe and Binder";
+    homepage = "https://github.com/executablebooks/sphinx-thebe";
+    changelog = "https://github.com/executablebooks/sphinx-thebe/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-togglebutton/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-togglebutton/default.nix
new file mode 100644
index 000000000000..3b3e146b98e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-togglebutton/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, wheel
+, docutils
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx-togglebutton";
+  version = "0.3.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-qwyLNmQnsB5MiYAtXQeEcsQn+m6dEtUhw0+gRCVZ3Ho=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    docutils
+    sphinx
+  ];
+
+  pythonImportsCheck = [
+    "sphinx_togglebutton"
+  ];
+
+  meta = with lib; {
+    description = "Toggle page content and collapse admonitions in Sphinx";
+    homepage = "https://github.com/executablebooks/sphinx-togglebutton";
+    license = licenses.mit;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx-version-warning/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx-version-warning/default.nix
new file mode 100644
index 000000000000..1fb89f3a2849
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx-version-warning/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pythonImportsCheckHook
+, sphinx
+, sphinxHook
+, sphinx-autoapi
+, sphinx-rtd-theme
+, sphinx-tabs
+, sphinx-prompt
+, sphinxemoji
+}:
+
+# Latest tagged release release "1.1.2" (Nov 2018) does not contain
+# documenation, it was added in commits Aug 10, 2019. Repository does not have
+# any activity since then.
+buildPythonPackage {
+  pname = "sphinx-version-warning";
+  version = "unstable-2019-08-10";
+  format = "pyproject";
+
+  outputs = [ "out" "doc" ];
+
+  src = fetchFromGitHub {
+    owner = "humitos";
+    repo = "sphinx-version-warning";
+    rev = "a82156c2ea08e5feab406514d0ccd9d48a345f48";
+    hash = "sha256-WnJYMk1gPLT0dBn7lmxVDNVkLYkDCgQOtM9fQ3kc6k0=";
+  };
+
+  # It tries to write to file relative to it own location at runtime
+  # and gets permission denied, since Nix store is immutable.
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/humitos/sphinx-version-warning/commit/cb1b47becf2a0d3b2570ca9929f42f7d7e472b6f.patch";
+      hash = "sha256-Vj0QAHIBmc0VxE+TTmJePzvr5nc45Sn2qqM+C/pkgtM=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    pythonImportsCheckHook
+    sphinxHook
+    sphinx-autoapi
+    sphinx-rtd-theme
+    sphinx-tabs
+    sphinx-prompt
+    sphinxemoji
+  ];
+
+  propagatedBuildInputs = [ sphinx ];
+
+  pythonImportsCheck = [ "versionwarning" ];
+
+  meta = with lib; {
+    description = "A sphinx extension to show a warning banner at the top of your documentation";
+    homepage = "https://github.com/humitos/sphinx-version-warning";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kaction ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinx/default.nix b/nixpkgs/pkgs/development/python-modules/sphinx/default.nix
new file mode 100644
index 000000000000..6dac59106f5f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinx/default.nix
@@ -0,0 +1,153 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, isPyPy
+
+# nativeBuildInputs
+, flit-core
+
+# propagatedBuildInputs
+, babel
+, alabaster
+, docutils
+, imagesize
+, importlib-metadata
+, jinja2
+, packaging
+, pygments
+, requests
+, snowballstemmer
+, sphinxcontrib-apidoc
+, sphinxcontrib-applehelp
+, sphinxcontrib-devhelp
+, sphinxcontrib-htmlhelp
+, sphinxcontrib-jsmath
+, sphinxcontrib-qthelp
+, sphinxcontrib-serializinghtml
+, sphinxcontrib-websupport
+
+# check phase
+, cython
+, filelock
+, html5lib
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sphinx";
+  version = "7.2.6";
+  format = "pyproject";
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "sphinx-doc";
+    repo = "sphinx";
+    rev = "refs/tags/v${version}";
+    postFetch = ''
+      # Change ä to æ in file names, since ä can be encoded multiple ways on different
+      # filesystems, leading to different hashes on different platforms.
+      cd "$out";
+      mv tests/roots/test-images/{testimäge,testimæge}.png
+      sed -i 's/testimäge/testimæge/g' tests/{test_build*.py,roots/test-images/index.rst}
+    '';
+    hash = "sha256-IjpRGeGpGfzrEvwIKtuu2l1S74w8W+AbqDOGnWwtRck=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    alabaster
+    babel
+    docutils
+    imagesize
+    jinja2
+    packaging
+    pygments
+    requests
+    snowballstemmer
+    sphinxcontrib-applehelp
+    sphinxcontrib-devhelp
+    sphinxcontrib-htmlhelp
+    sphinxcontrib-jsmath
+    sphinxcontrib-qthelp
+    sphinxcontrib-serializinghtml
+    # extra[docs]
+    sphinxcontrib-websupport
+
+    # extra plugins which are otherwise not found by sphinx-build
+    sphinxcontrib-apidoc
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    importlib-metadata
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    cython
+    filelock
+    html5lib
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  disabledTests = [
+    # requires network access
+    "test_latex_images"
+  ] ++ lib.optionals isPyPy [
+    # PyPy has not __builtins__ which get asserted
+    # https://doc.pypy.org/en/latest/cpython_differences.html#miscellaneous
+    "test_autosummary_generate_content_for_module"
+    "test_autosummary_generate_content_for_module_skipped"
+    # internals are asserted which are sightly different in PyPy
+    "test_autodoc_inherited_members_None"
+    "test_automethod_for_builtin"
+    "test_builtin_function"
+    "test_cython"
+    "test_isattributedescriptor"
+    "test_methoddescriptor"
+    "test_partialfunction"
+  ];
+
+  meta = {
+    description = "Python documentation generator";
+    longDescription = ''
+      Sphinx makes it easy to create intelligent and beautiful documentation.
+
+      Here are some of Sphinx’s major features:
+      - Output formats: HTML (including Windows HTML Help), LaTeX (for printable
+        PDF versions), ePub, Texinfo, manual pages, plain text
+      - Extensive cross-references: semantic markup and automatic links for
+        functions, classes, citations, glossary terms and similar pieces of
+        information
+      - Hierarchical structure: easy definition of a document tree, with
+        automatic links to siblings, parents and children
+      - Automatic indices: general index as well as a language-specific module
+        indices
+      - Code handling: automatic highlighting using the Pygments highlighter
+      - Extensions: automatic testing of code snippets, inclusion of docstrings
+        from Python modules (API docs) via built-in extensions, and much more
+        functionality via third-party extensions.
+      - Themes: modify the look and feel of outputs via creating themes, and
+        re-use many third-party themes.
+      - Contributed extensions: dozens of extensions contributed by users; most
+        of them installable from PyPI.
+
+      Sphinx uses the reStructuredText markup language by default, and can read
+      MyST markdown via third-party extensions. Both of these are powerful and
+      straightforward to use, and have functionality for complex documentation
+      and publishing workflows. They both build upon Docutils to parse and write
+      documents.
+    '';
+    homepage = "https://www.sphinx-doc.org";
+    changelog = "https://www.sphinx-doc.org/en/master/changes.html";
+    license = lib.licenses.bsd3;
+    maintainers = lib.teams.sphinx.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-actdiag/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-actdiag/default.nix
new file mode 100644
index 000000000000..bfe5739b2a7b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-actdiag/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sphinx
+, actdiag
+, blockdiag
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-actdiag";
+  version = "3.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-PFXUVP/Due/nwg8q2vAiGZuCVhLTLyAL6KSXqofg+B8=";
+  };
+
+  propagatedBuildInputs = [
+    actdiag
+    blockdiag
+    sphinx
+  ];
+
+  pythonImportsCheck = [
+    "sphinxcontrib.actdiag"
+  ];
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "Sphinx actdiag extension";
+    homepage = "https://github.com/blockdiag/sphinxcontrib-actdiag";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ davidtwco ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-apidoc/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-apidoc/default.nix
new file mode 100644
index 000000000000..77fe8929b2fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-apidoc/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pbr
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-apidoc";
+  version = "0.4.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/lnRWIJHKqk8Jzevvepr7bNM41y9NKpJR5CfXfFQCq0=";
+  };
+
+  postPatch = ''
+    # break infite recursion, remove pytest 4 requirement
+    rm test-requirements.txt requirements.txt
+  '';
+
+  propagatedBuildInputs = [
+    pbr
+  ];
+
+  # Check is disabled due to circular dependency of sphinx
+  doCheck = false;
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "Sphinx extension for running sphinx-apidoc on each build";
+    homepage = "https://github.com/sphinx-contrib/apidoc";
+    license = licenses.bsd2;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-applehelp/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-applehelp/default.nix
new file mode 100644
index 000000000000..3e8fe11d192f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-applehelp/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, flit-core
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-applehelp";
+  version = "1.0.7";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    pname = "sphinxcontrib_applehelp";
+    inherit version;
+    hash = "sha256-Of3I12LTOwGn2PAmo7fXFWPqO3J4fV8ArYRlvZ1t+/o=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  # Check is disabled due to circular dependency of sphinx
+  doCheck = false;
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books";
+    homepage = "https://github.com/sphinx-doc/sphinxcontrib-applehelp";
+    license = licenses.bsd2;
+    maintainers = teams.sphinx.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-asyncio/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-asyncio/default.nix
new file mode 100644
index 000000000000..597dac22a015
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-asyncio/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-asyncio";
+  version = "0.3.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-mf0m4P5+34ckSnGpnDFv0Mm1CFbCUZrMqSfr50EAci4=";
+  };
+
+  propagatedBuildInputs = [
+    sphinx
+  ];
+
+  doCheck = false; # no tests
+
+  pythonImportsCheck = [
+    "sphinxcontrib.asyncio"
+  ];
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "Sphinx extension to add asyncio-specific markups";
+    homepage = "https://github.com/aio-libs/sphinxcontrib-asyncio";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-bayesnet/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-bayesnet/default.nix
new file mode 100644
index 000000000000..ca968f3f232c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-bayesnet/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sphinx
+, sphinxcontrib-tikz
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-bayesnet";
+  version = "0.4";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+M+K8WzQqxQUGgAgGPK+isf3gKK7HOrdI6nNW/V8Wv0=";
+  };
+
+  propagatedBuildInputs = [ sphinx sphinxcontrib-tikz ];
+
+  # No tests
+  doCheck = false;
+  pythonImportsCheck = [ "sphinxcontrib.bayesnet" ];
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jluttine/sphinx-bayesnet";
+    description = "Bayesian networks and factor graphs in Sphinx using TikZ syntax";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-bibtex/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-bibtex/default.nix
new file mode 100644
index 000000000000..2d8dca991290
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-bibtex/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, oset
+, pybtex
+, pybtex-docutils
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-bibtex";
+  version = "2.6.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BGtJ8HCuUnavNMG43bm8lWLvbeL3pS03qRy45T9UuGM=";
+  };
+
+  propagatedBuildInputs = [
+    oset
+    pybtex
+    pybtex-docutils
+    sphinx
+  ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sphinxcontrib.bibtex"
+  ];
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "A Sphinx extension for BibTeX style citations";
+    homepage = "https://github.com/mcmtroffaes/sphinxcontrib-bibtex";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-blockdiag/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-blockdiag/default.nix
new file mode 100644
index 000000000000..44c4de9570dd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-blockdiag/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, unittestCheckHook
+, mock
+, sphinx-testing
+, sphinx
+, blockdiag
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-blockdiag";
+  version = "3.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "aa49bf924516f5de8a479994c7be81e077df5599c9da2a082003d5b388e1d450";
+  };
+
+  buildInputs = [ mock sphinx-testing ];
+  propagatedBuildInputs = [ sphinx blockdiag ];
+
+  # Seems to look for files in the wrong dir
+  doCheck = false;
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  unittestFlagsArray = [ "-s" "tests" ];
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "Sphinx blockdiag extension";
+    homepage = "https://github.com/blockdiag/sphinxcontrib-blockdiag";
+    maintainers = with maintainers; [ ];
+    license = licenses.bsd2;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-confluencebuilder/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-confluencebuilder/default.nix
new file mode 100644
index 000000000000..dc7798015cb7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-confluencebuilder/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, docutils
+, sphinx
+, requests
+, jinja2
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-confluencebuilder";
+  version = "2.3.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "sphinxcontrib_confluencebuilder";
+    inherit version;
+    hash = "sha256-Zpe2n131afnq4IhQEEZtquvSEkkjv/uznXt2tQhGfZA=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    docutils
+    sphinx
+    requests
+    jinja2
+  ];
+
+  # Tests are disabled due to a circular dependency on Sphinx
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sphinxcontrib.confluencebuilder"
+  ];
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "Confluence builder for sphinx";
+    homepage = "https://github.com/sphinx-contrib/confluencebuilder";
+    license = licenses.bsd1;
+    maintainers = with maintainers; [ graysonhead ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-devhelp/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-devhelp/default.nix
new file mode 100644
index 000000000000..b254d4b64327
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-devhelp/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, flit-core
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-devhelp";
+  version = "1.0.5";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    pname = "sphinxcontrib_devhelp";
+    inherit version;
+    hash = "sha256-Y7QeDTggfKQOu+q89NjlH3bAPnjNYavhGM9ENcc9QhI=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  # Check is disabled due to circular dependency of sphinx
+  doCheck = false;
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document.";
+    homepage = "https://github.com/sphinx-doc/sphinxcontrib-devhelp";
+    license = licenses.bsd2;
+    maintainers = teams.sphinx.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-excel-table/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-excel-table/default.nix
new file mode 100644
index 000000000000..d7cea5a6418a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-excel-table/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sphinx
+, openpyxl
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-excel-table";
+  version = "1.0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256:1q79byn3k3ribvwqafbpixwabjhymk46ns8ym0hxcn8vhf5nljzd";
+  };
+
+  propagatedBuildInputs = [ sphinx openpyxl ];
+
+  pythonImportsCheck = [ "sphinxcontrib.excel_table" ];
+
+  # No tests present upstream
+  doCheck = false;
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "Sphinx excel-table extension";
+    homepage = "https://github.com/hackerain/sphinxcontrib-excel-table";
+    maintainers = with maintainers; [ raboof ];
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-fulltoc/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-fulltoc/default.nix
new file mode 100644
index 000000000000..79a326150073
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-fulltoc/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder, sphinx, pbr }:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-fulltoc";
+  version = "1.2.0";
+
+  # pkgutil namespaces are broken in nixpkgs (because they can't scan multiple
+  # directories). But python2 is EOL, so not supporting it, should be ok.
+  disabled = pythonOlder "3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1nbwflv9szyh37yr075xhck8b4gg2c7g3sa38mfi7wv7qhpxcif8";
+  };
+
+  nativeBuildInputs = [ pbr ];
+  propagatedBuildInputs = [ sphinx ];
+
+  # There are no unit tests
+  doCheck = false;
+  # Ensure package importing works
+  pythonImportsCheck = [ "sphinxcontrib.fulltoc" ];
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "Include a full table of contents in your Sphinx HTML sidebar";
+    homepage = "https://sphinxcontrib-fulltoc.readthedocs.org/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-htmlhelp/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-htmlhelp/default.nix
new file mode 100644
index 000000000000..56fae964eca0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-htmlhelp/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, flit-core
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-htmlhelp";
+  version = "2.0.4";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    pname = "sphinxcontrib_htmlhelp";
+    inherit version;
+    hash = "sha256-bCahGKBbdgAHOEKbckoFaNveW3I5GmiFd9oI8RiRCSo=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  # Check is disabled due to circular dependency of sphinx
+  doCheck = false;
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "Sphinx extension which renders HTML help files";
+    homepage = "https://github.com/sphinx-doc/sphinxcontrib-htmlhelp";
+    license = licenses.bsd2;
+    maintainers = teams.sphinx.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-httpdomain/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-httpdomain/default.nix
new file mode 100644
index 000000000000..96dad44be8bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-httpdomain/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-httpdomain";
+  version = "1.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bC3+bKKC119m3zM4absM5zMcAbR122gJ/50Qe3zf4Es=";
+  };
+
+  propagatedBuildInputs = [ sphinx ];
+
+  # Check is disabled due to this issue:
+  # https://bitbucket.org/pypa/setuptools/issue/137/typeerror-unorderable-types-str-nonetype
+  doCheck = false;
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "Provides a Sphinx domain for describing RESTful HTTP APIs";
+    homepage = "https://bitbucket.org/birkenfeld/sphinx-contrib";
+    license = licenses.bsd0;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-jquery/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-jquery/default.nix
new file mode 100644
index 000000000000..16c57f5886b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-jquery/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, flit-core
+, pytestCheckHook
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-jquery";
+  version = "4.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "sphinx-contrib";
+    repo = "jquery";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ZQGQcVmhWREFa2KyaOKdTz5W2AS2ur7pFp8qZ2IkxSE=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "fix-tests-with-sphinx7.1.patch";
+      url = "https://github.com/sphinx-contrib/jquery/commit/ac97ce5202b05ddb6bf4e5b77151a8964b6bf632.patch";
+      hash = "sha256-dc9bhr/af3NmrIfoVabM1lNpXbGVsJoj7jq0E1BAtHw=";
+    })
+    (fetchpatch {
+      name = "fix-tests-with-sphinx7.2.patch";
+      url = "https://github.com/sphinx-contrib/jquery/commit/03f1595b3793e087a407933fbcb757bdd3f558fc.patch";
+      hash = "sha256-4gNG1DL/63N2FwXDy5fMApZpf/AGOGBruwPuVqgnVkc=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  pythonImportsCheck = [
+    "sphinxcontrib.jquery"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    sphinx
+  ];
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "Extension to include jQuery on newer Sphinx releases";
+    longDescription = ''
+      A sphinx extension that ensures that jQuery is installed for use
+      in Sphinx themes or extensions
+    '';
+    homepage = "https://github.com/sphinx-contrib/jquery";
+    changelog = "https://github.com/sphinx-contrib/jquery/blob/v${version}/CHANGES.rst";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ kaction ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-jsmath/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-jsmath/default.nix
new file mode 100644
index 000000000000..2b8c2cd75826
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-jsmath/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-jsmath";
+  version = "1.0.1";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8";
+  };
+
+  # Check is disabled due to circular dependency of sphinx
+  doCheck = false;
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "sphinxcontrib-jsmath is a sphinx extension which renders display math in HTML via JavaScript.";
+    homepage = "https://github.com/sphinx-doc/sphinxcontrib-jsmath";
+    license = licenses.bsd0;
+    maintainers = teams.sphinx.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-katex/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-katex/default.nix
new file mode 100644
index 000000000000..30c94a088fbf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-katex/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-katex";
+  version = "0.9.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-OmdUsc/JDhQeP3Pgg16vyCYtpfr+ekxnT6cI+rec69c=";
+  };
+
+  propagatedBuildInputs = [
+    sphinx
+  ];
+
+  # There are no unit tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sphinxcontrib.katex"
+  ];
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "Sphinx extension using KaTeX to render math in HTML";
+    homepage = "https://github.com/hagenw/sphinxcontrib-katex";
+    changelog = "https://github.com/hagenw/sphinxcontrib-katex/blob/v${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-log-cabinet/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-log-cabinet/default.nix
new file mode 100644
index 000000000000..2dfc743a60f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-log-cabinet/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchFromGitHub, sphinx }:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-log-cabinet";
+  version = "1.0.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "davidism";
+    repo = "sphinxcontrib-log-cabinet";
+    rev = "refs/tags/${version}";
+    sha256 = "03cxspgqsap9q74sqkdx6r6b4gs4hq6dpvx4j58hm50yfhs06wn1";
+  };
+
+  propagatedBuildInputs = [ sphinx ];
+
+  pythonImportsCheck = [ "sphinxcontrib.log_cabinet" ];
+
+  doCheck = false; # no tests
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/davidism/sphinxcontrib-log-cabinet";
+    description = "Sphinx extension to organize changelogs";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kaction ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-mscgen/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-mscgen/default.nix
new file mode 100644
index 000000000000..7350b837a7f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-mscgen/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, sphinx
+, mscgen
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-mscgen";
+  version = "0.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-AXfSWRq3CepT/jNOgHxiYT7vkdKZejPu/LeUqxZ8T5A=";
+  };
+
+  propagatedBuildInputs = [
+    mscgen
+    sphinx
+  ];
+
+  # There are no unit tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sphinxcontrib.mscgen"
+  ];
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "Sphinx extension using mscgen to render diagrams";
+    homepage = "https://github.com/sphinx-contrib/mscgen";
+    license = licenses.bola11;
+    maintainers = with maintainers; [ drupol ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-newsfeed/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-newsfeed/default.nix
new file mode 100644
index 000000000000..ee9661d954e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-newsfeed/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-newsfeed";
+  version = "0.1.4";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1d7gam3mn8v4in4p16yn3v10vps7nnaz6ilw99j4klij39dqd37p";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    sphinx
+  ];
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "Extension for adding a simple Blog, News or Announcements section to a Sphinx website";
+    homepage = "https://github.com/prometheusresearch/sphinxcontrib-newsfeed";
+    license = licenses.bsd2;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-nwdiag/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-nwdiag/default.nix
new file mode 100644
index 000000000000..de4ebf723bf1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-nwdiag/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, blockdiag
+, buildPythonPackage
+, fetchPypi
+, nwdiag
+, pythonOlder
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-nwdiag";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bula1DutRv6NwfZRhciZfLHRZmXu42p+qvbeExN/+Fk=";
+  };
+
+  propagatedBuildInputs = [
+    blockdiag
+    nwdiag
+    sphinx
+  ];
+
+  pythonImportsCheck = [
+    "sphinxcontrib.nwdiag"
+  ];
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "Sphinx nwdiag extension";
+    homepage = "https://github.com/blockdiag/sphinxcontrib-nwdiag";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ davidtwco ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-openapi/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-openapi/default.nix
new file mode 100644
index 000000000000..6e3279b4de96
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-openapi/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, deepmerge
+, fetchPypi
+, fetchpatch
+, isPy27
+, setuptools-scm
+, jsonschema
+, picobox
+, pyyaml
+, sphinx-mdinclude
+, sphinxcontrib-httpdomain
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-openapi";
+  version = "0.8.3";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-nGIRdUC1J2AGrHrUrzRpbQKvJ4r6KZcSdAw2gKmp3mw=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+  propagatedBuildInputs = [
+    deepmerge
+    jsonschema
+    picobox
+    pyyaml
+    sphinx-mdinclude
+    sphinxcontrib-httpdomain
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  doCheck = false;
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ikalnytskyi/sphinxcontrib-openapi";
+    description = "OpenAPI (fka Swagger) spec renderer for Sphinx";
+    license = licenses.bsd0;
+    maintainers = [ maintainers.flokli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-plantuml/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-plantuml/default.nix
new file mode 100644
index 000000000000..d6c588c8d022
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-plantuml/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sphinx
+, plantuml
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-plantuml";
+  version = "0.27";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-iXV3ju2cFCpC7NxOzYMTLewGkMA1yueIwSN1Dq1SZwM=";
+  };
+
+  propagatedBuildInputs = [
+    sphinx
+    plantuml
+  ];
+
+  # No tests included.
+  doCheck = false;
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "Provides a Sphinx domain for embedding UML diagram with PlantUML";
+    homepage = "https://github.com/sphinx-contrib/plantuml/";
+    license = with licenses; [ bsd2 ];
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-programoutput/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-programoutput/default.nix
new file mode 100644
index 000000000000..67d7d9b587f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-programoutput/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sphinx
+, sphinxcontrib-serializinghtml
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-programoutput";
+  version = "0.17";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MA7puMrug1XSXMdLTRx+/RLmCNKtFl4xQdMeb7wVK38=";
+  };
+
+  buildInputs = [
+    sphinx
+  ];
+
+  # fails to import sphinxcontrib.serializinghtml
+  doCheck = false;
+
+  pythonImportsCheck = [ "sphinxcontrib.programoutput" ];
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "Sphinx extension to include program output";
+    homepage = "https://github.com/NextThought/sphinxcontrib-programoutput";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-qthelp/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-qthelp/default.nix
new file mode 100644
index 000000000000..d526f8aad8ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-qthelp/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, flit-core
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-qthelp";
+  version = "1.0.6";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    pname = "sphinxcontrib_qthelp";
+    inherit version;
+    hash = "sha256-YrnRoYarf17jNW2Qb2SMrLemvblNIB7nrfJttVCSmC0=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  # Check is disabled due to circular dependency of sphinx
+  doCheck = false;
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document.";
+    homepage = "https://github.com/sphinx-doc/sphinxcontrib-qthelp";
+    license = licenses.bsd2;
+    maintainers = teams.sphinx.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-seqdiag/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-seqdiag/default.nix
new file mode 100644
index 000000000000..085cb5730548
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-seqdiag/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, blockdiag
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, seqdiag
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-seqdiag";
+  version = "3.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QH5IeXZz9x2Ujp/6BHFsrB2ZqeyPYW3jdk1C0DNBZXQ=";
+  };
+
+  propagatedBuildInputs = [
+    blockdiag
+    seqdiag
+    sphinx
+  ];
+
+  pythonImportsCheck = [
+    "sphinxcontrib.seqdiag"
+  ];
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "Sphinx seqdiag extension";
+    homepage = "https://github.com/blockdiag/sphinxcontrib-seqdiag";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ davidtwco ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-serializinghtml/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-serializinghtml/default.nix
new file mode 100644
index 000000000000..4604eec5f184
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-serializinghtml/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, flit-core
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-serializinghtml";
+  version = "1.1.9";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    pname = "sphinxcontrib_serializinghtml";
+    inherit version;
+    hash = "sha256-DGT/iYM54frCmr0r9fEQePPsQTz+nARtMSDXymVTC1Q=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  # Check is disabled due to circular dependency of sphinx
+  doCheck = false;
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle).";
+    homepage = "https://github.com/sphinx-doc/sphinxcontrib-serializinghtml";
+    license = licenses.bsd2;
+    maintainers = teams.sphinx.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-spelling/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-spelling/default.nix
new file mode 100644
index 000000000000..b7a71f891c32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-spelling/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, importlib-metadata
+, sphinx
+, pyenchant
+, setuptools
+, setuptools-scm
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-spelling";
+  version = "8.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GZ0KFpAq2Aw4fClm3J6xD1ZbH7FczOFyEEAtt8JEPlw=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    sphinx
+    pyenchant
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  # No tests included
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sphinxcontrib.spelling"
+  ];
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "Sphinx spelling extension";
+    homepage = "https://github.com/sphinx-contrib/spelling";
+    changelog = "https://github.com/sphinx-contrib/spelling/blob/${version}/docs/source/history.rst";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-tikz/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-tikz/default.nix
new file mode 100644
index 000000000000..dd83acb3d205
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-tikz/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, sphinx
+, pdf2svg
+, texliveSmall
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-tikz";
+  version = "0.4.16";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8f9FNx6WMopcqihUzNlQoPBGYoW2YkFi6W1iaFLD4qU=";
+  };
+
+  postPatch = ''
+    substituteInPlace sphinxcontrib/tikz.py \
+      --replace "config.latex_engine" "'${texliveSmall.withPackages (ps: with ps; [ standalone pgfplots ])}/bin/pdflatex'" \
+      --replace "system(['pdf2svg'" "system(['${pdf2svg}/bin/pdf2svg'"
+  '';
+
+  propagatedBuildInputs = [ sphinx ];
+
+  # no tests in package
+  doCheck = false;
+
+  pythonImportsCheck = [ "sphinxcontrib.tikz" ];
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "TikZ extension for Sphinx";
+    homepage = "https://bitbucket.org/philexander/tikz";
+    maintainers = with maintainers; [ ];
+    license = licenses.bsd3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-wavedrom/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-wavedrom/default.nix
new file mode 100644
index 000000000000..6f35e2b59e32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-wavedrom/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, setuptools-scm
+, sphinx
+, wavedrom
+, xcffib
+, cairosvg
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-wavedrom";
+  version = "3.0.4";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-0zTHVBr9kXwMEo4VRTFsxdX2HI31DxdHfLUHCQmw1Ko=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [
+    sphinx
+    wavedrom
+    xcffib
+    cairosvg
+  ];
+
+  # No tests included
+  doCheck = false;
+
+  pythonImportsCheck = [ "sphinxcontrib.wavedrom" ];
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "A sphinx extension that allows including wavedrom diagrams by using its text-based representation";
+    homepage = "https://github.com/bavovanachte/sphinx-wavedrom";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fsagbuya ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-websupport/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-websupport/default.nix
new file mode 100644
index 000000000000..bd9ae779c081
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-websupport/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, jinja2
+, sphinxcontrib-serializinghtml
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-websupport";
+  version = "1.2.6";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "sphinxcontrib_websupport";
+    inherit version;
+    hash = "sha256-1ZK+jhEmG7vGRmjyWO/E/ULJOrYXQRFDtSRf4wxjPYw=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    jinja2
+    sphinxcontrib-serializinghtml
+  ];
+
+  doCheck = false;
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = {
+    description = "Sphinx API for Web Apps";
+    homepage = "http://sphinx-doc.org/";
+    license = lib.licenses.bsd2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxcontrib-youtube/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-youtube/default.nix
new file mode 100644
index 000000000000..ab48066dc6af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxcontrib-youtube/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, sphinx
+, requests
+, flit-core
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxcontrib-youtube";
+  version = "1.4.1";
+  format = "pyproject";
+
+  nativeBuildInputs = [ flit-core ];
+
+  src = fetchFromGitHub {
+    owner = "sphinx-contrib";
+    repo = "youtube";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-XuOfZ77tg9akmgTuMQN20OhgkFbn/6YzT46vpTsXxC8=";
+  };
+
+  propagatedBuildInputs = [ sphinx requests ];
+
+  # tests require internet access
+  doCheck = false;
+
+  pythonImportsCheck = [ "sphinxcontrib.youtube" ];
+
+  pythonNamespaces = [ "sphinxcontrib" ];
+
+  meta = with lib; {
+    description = "Youtube extension for Sphinx";
+    homepage = "https://github.com/sphinx-contrib/youtube";
+    maintainers = with maintainers; [ gador ];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxemoji/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxemoji/default.nix
new file mode 100644
index 000000000000..02abae52c4d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxemoji/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, sphinx
+, sphinxHook
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxemoji";
+  version = "0.2.0";
+  format = "pyproject";
+
+  outputs = [ "out" "doc" ];
+
+  src = fetchFromGitHub {
+    owner = "sphinx-contrib";
+    repo = "emojicodes";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-TLhjpJpUIoDAe3RZ/7sjTgdW+5s7OpMEd1/w0NyCQ3A=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    sphinxHook
+  ];
+
+  propagatedBuildInputs = [
+    sphinx
+   ];
+
+  pythonImportsCheck = [
+    "sphinxemoji"
+  ];
+
+  meta = with lib; {
+    description = "Extension to use emoji codes in your Sphinx documentation";
+    homepage = "https://github.com/sphinx-contrib/emojicodes";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kaction ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sphinxext-opengraph/default.nix b/nixpkgs/pkgs/development/python-modules/sphinxext-opengraph/default.nix
new file mode 100644
index 000000000000..85a736bd880c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sphinxext-opengraph/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, sphinx
+, matplotlib
+, pytestCheckHook
+, pythonOlder
+, beautifulsoup4
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "sphinxext-opengraph";
+  version = "0.9.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "wpilibsuite";
+    repo = "sphinxext-opengraph";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ZLIxbFgayG+WVvSXu74eZJ/PbSHg6dzkkIr1OBry4DE=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  passthru.optional-dependencies = {
+    social_cards_generation = [
+      matplotlib
+    ];
+  };
+
+  propagatedBuildInputs = [
+    sphinx
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    beautifulsoup4
+  ] ++ passthru.optional-dependencies.social_cards_generation;
+
+  pythonImportsCheck = [ "sphinxext.opengraph" ];
+
+  meta = with lib; {
+    description = "Sphinx extension to generate unique OpenGraph metadata";
+    homepage = "https://github.com/wpilibsuite/sphinxext-opengraph";
+    changelog = "https://github.com/wpilibsuite/sphinxext-opengraph/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Luflosi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spiderpy/default.nix b/nixpkgs/pkgs/development/python-modules/spiderpy/default.nix
new file mode 100644
index 000000000000..1747e8609924
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spiderpy/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitHub
+, poetry-core
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "spiderpy";
+  version = "1.7.2";
+  format = "pyproject";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "peternijssen";
+    repo = "spiderpy";
+    rev = version;
+    hash = "sha256-Yujy8HSMbK2DQ/913r2c74hKPYDfcHFKq04ysqxG+go=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # tests don't mock remote resources
+  doCheck = false;
+
+  pythonImportsCheck = [ "spiderpy.spiderapi" ];
+
+  meta = with lib; {
+    description = "Unofficial Python wrapper for the Spider API";
+    homepage = "https://www.github.com/peternijssen/spiderpy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spidev/default.nix b/nixpkgs/pkgs/development/python-modules/spidev/default.nix
new file mode 100644
index 000000000000..fd3a12d7da45
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spidev/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "spidev";
+  version = "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-FNvDdZSkqu+FQDq2F5hdPD70ZNYrybdp71UttTcBEVs=";
+  };
+
+  # package does not include tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "spidev" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/doceme/py-spidev";
+    description = "Python bindings for Linux SPI access through spidev";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+    platforms = platforms.linux;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spinners/default.nix b/nixpkgs/pkgs/development/python-modules/spinners/default.nix
new file mode 100644
index 000000000000..1e71296fd176
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spinners/default.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage
+, fetchPypi
+, isPy27
+, lib }:
+
+buildPythonPackage rec {
+  pname = "spinners";
+  version = "0.0.24";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0zz2z6dpdjdq5z8m8w8dfi8by0ih1zrdq0caxm1anwhxg2saxdhy";
+  };
+
+  # Tests are not included in the PyPI distribution and the git repo does not have tagged releases
+  doCheck = false;
+  pythonImportsCheck = [ "spinners" ];
+
+  meta = with lib; {
+    description = "Spinners for the Terminal.";
+    homepage = "https://github.com/manrajgrover/py-spinners";
+    license = licenses.mit;
+    maintainers = with maintainers; [ urbas ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/splinter/default.nix b/nixpkgs/pkgs/development/python-modules/splinter/default.nix
new file mode 100644
index 000000000000..6b60d2f3ad2c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/splinter/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchFromGitHub
+, setuptools
+, urllib3
+, selenium
+, cssselect
+, django
+, flask
+, lxml
+, pytestCheckHook
+, zope-testbrowser
+}:
+
+buildPythonPackage rec {
+  pname = "splinter";
+  version = "0.20.1";
+
+  disabled = isPy27;
+
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "cobrateam";
+    repo = "splinter";
+    rev = "refs/tags/${version}";
+    hash = "sha256-6oHcHIkqOr0aFNfCNjZpm4zIYuz2ov9drfCxSdjAg7o=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    urllib3
+  ];
+
+  passthru.optional-dependencies = {
+    "zope.testbrowser" = [ zope-testbrowser lxml cssselect ];
+    django = [ django lxml cssselect ];
+    flask = [ flask lxml cssselect ];
+    selenium = [ selenium ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.flatten (lib.attrValues passthru.optional-dependencies);
+
+  disabledTests = [
+    # driver is present and fails with a different error during loading
+    "test_browser_local_driver_not_present"
+    "test_browser_log_missing_drivers"
+    "test_local_driver_not_present"
+  ];
+
+  disabledTestPaths = [
+    "samples"
+    # We run neither Chromium nor Firefox nor ...
+    "tests/test_async_finder.py"
+    "tests/test_element_is_visible.py"
+    "tests/test_html_snapshot.py"
+    "tests/test_iframes.py"
+    "tests/test_mouse_interaction.py"
+    "tests/test_popups.py"
+    "tests/test_screenshot.py"
+    "tests/test_shadow_root.py"
+    "tests/test_webdriver.py"
+    "tests/test_webdriver_chrome.py"
+    "tests/test_webdriver_edge_chromium.py"
+    "tests/test_webdriver_firefox.py"
+    "tests/test_webdriver_remote.py"
+  ];
+
+  pythonImportsCheck = [ "splinter" ];
+
+  meta = with lib; {
+    description = "Browser abstraction for web acceptance testing";
+    homepage = "https://github.com/cobrateam/splinter";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spotipy/default.nix b/nixpkgs/pkgs/development/python-modules/spotipy/default.nix
new file mode 100644
index 000000000000..8ed6525fd072
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spotipy/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, redis
+, requests
+, six
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "spotipy";
+  version = "2.23.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Dfr+CCOdqubBb6po9gtXddQMQRByXhp8VFrUx/tm1Og=";
+  };
+
+  propagatedBuildInputs = [
+    redis
+    requests
+    six
+    urllib3
+  ];
+
+  # Tests want to access the spotify API
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "spotipy"
+    "spotipy.oauth2"
+  ];
+
+  meta = with lib; {
+    description = "Library for the Spotify Web API";
+    homepage = "https://spotipy.readthedocs.org/";
+    changelog = "https://github.com/plamere/spotipy/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rvolosatovs ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spsdk/default.nix b/nixpkgs/pkgs/development/python-modules/spsdk/default.nix
new file mode 100644
index 000000000000..d8e6b0ab45ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spsdk/default.nix
@@ -0,0 +1,116 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonRelaxDepsHook
+, asn1crypto
+, astunparse
+, bincopy
+, bitstring
+, click
+, click-command-tree
+, click-option-group
+, cmsis-pack-manager
+, commentjson
+, crcmod
+, cryptography
+, deepmerge
+, fastjsonschema
+, hexdump
+, importlib-metadata
+, jinja2
+, libusbsio
+, oscrypto
+, pycryptodome
+, pyftdi
+, pylink-square
+, pyocd
+, pypemicro
+, pyserial
+, ruamel-yaml
+, sly
+, spsdk
+, testers
+, typing-extensions
+, pytestCheckHook
+, voluptuous
+}:
+
+buildPythonPackage rec {
+  pname = "spsdk";
+  version = "1.11.0";
+
+  src = fetchFromGitHub {
+    owner = "nxp-mcuxpresso";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-B3qedAXSG3A8rcWu1O2GnZ1ZqHN+7fQK43qXzGnDEY0=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    "bincopy"
+    "bitstring"
+    "cmsis-pack-manager"
+    "deepmerge"
+    "jinja2"
+    "pycryptodome"
+    "pylink-square"
+    "pyocd"
+    "typing-extensions"
+  ];
+
+  pythonRemoveDeps = [
+    "pyocd-pemicro"
+  ];
+
+  propagatedBuildInputs = [
+    asn1crypto
+    astunparse
+    bincopy
+    bitstring
+    click
+    click-command-tree
+    click-option-group
+    cmsis-pack-manager
+    commentjson
+    crcmod
+    cryptography
+    deepmerge
+    fastjsonschema
+    hexdump
+    importlib-metadata
+    jinja2
+    libusbsio
+    oscrypto
+    pycryptodome
+    pylink-square
+    pyocd
+    pypemicro
+    pyserial
+    ruamel-yaml
+    sly
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pyftdi
+    pytestCheckHook
+    voluptuous
+  ];
+
+  pythonImportsCheck = [ "spsdk" ];
+
+  passthru.tests.version = testers.testVersion { package = spsdk; };
+
+  meta = with lib; {
+    changelog = "https://github.com/nxp-mcuxpresso/spsdk/blob/${src.rev}/docs/release_notes.rst";
+    description = "NXP Secure Provisioning SDK";
+    homepage = "https://github.com/nxp-mcuxpresso/spsdk";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ frogamic sbruder ];
+    mainProgram = "spsdk";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spur/default.nix b/nixpkgs/pkgs/development/python-modules/spur/default.nix
new file mode 100644
index 000000000000..4b4fe911817e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spur/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, paramiko
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "spur";
+  version = "0.3.23";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mwilliamson";
+    repo = "spur.py";
+    rev = "refs/tags/${version}";
+    hash = "sha256-LTkZ1p2P9fsD+gZEQZaCS68Q6nGc4qFGMNtH75gQmXQ=";
+  };
+
+  propagatedBuildInputs = [
+    paramiko
+  ];
+
+  # Tests require a running SSH server
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "spur"
+  ];
+
+  meta = with lib; {
+    description = "Python module to run commands and manipulate files locally or over SSH";
+    homepage = "https://github.com/mwilliamson/spur.py";
+    changelog = "https://github.com/mwilliamson/spur.py/blob/0.3.23/CHANGES";
+    license = with licenses; [ bsd2 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spyder-kernels/default.nix b/nixpkgs/pkgs/development/python-modules/spyder-kernels/default.nix
new file mode 100644
index 000000000000..f62c4d7c9ede
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spyder-kernels/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, cloudpickle
+, fetchPypi
+, ipykernel
+, ipython
+, jupyter-client
+, packaging
+, pythonOlder
+, pyxdg
+, pyzmq
+, wurlitzer
+}:
+
+buildPythonPackage rec {
+  pname = "spyder-kernels";
+  version = "2.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-M2hCbARFfgIRiE6SdPpH61ViUrpMBz3ydeg8Zd97oqE=";
+  };
+
+  propagatedBuildInputs = [
+    cloudpickle
+    ipykernel
+    ipython
+    jupyter-client
+    packaging
+    pyxdg
+    pyzmq
+    wurlitzer
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "ipykernel>=6.16.1,<7" "ipykernel" \
+      --replace "ipython>=7.31.1,<8" "ipython"
+  '';
+
+  # No tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "spyder_kernels"
+  ];
+
+  meta = with lib; {
+    description = "Jupyter kernels for Spyder's console";
+    homepage = "https://docs.spyder-ide.org/current/ipythonconsole.html";
+    downloadPage = "https://github.com/spyder-ide/spyder-kernels/releases";
+    changelog = "https://github.com/spyder-ide/spyder-kernels/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gebner ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spyder/default.nix b/nixpkgs/pkgs/development/python-modules/spyder/default.nix
new file mode 100644
index 000000000000..a70ef94409f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spyder/default.nix
@@ -0,0 +1,138 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, atomicwrites
+, chardet
+, cloudpickle
+, cookiecutter
+, diff-match-patch
+, intervaltree
+, jedi
+, jellyfish
+, keyring
+, matplotlib
+, nbconvert
+, numpy
+, numpydoc
+, psutil
+, pygments
+, pylint-venv
+, pyls-spyder
+, pyopengl
+, pyqtwebengine
+, python-lsp-black
+, python-lsp-server
+, pyxdg
+, pyzmq
+, qdarkstyle
+, qstylizer
+, qtawesome
+, qtconsole
+, qtpy
+, rope
+, rtree
+, scipy
+, spyder-kernels
+, textdistance
+, three-merge
+, watchdog
+}:
+
+buildPythonPackage rec {
+  pname = "spyder";
+  version = "5.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zjQmUmkqwtXNnZKssNpl24p4FQscZKGiiJj5iwYl2UM=";
+  };
+
+  patches = [
+    ./dont-clear-pythonpath.patch
+  ];
+
+  nativeBuildInputs = [
+    pyqtwebengine.wrapQtAppsHook
+  ];
+
+  propagatedBuildInputs = [
+    atomicwrites
+    chardet
+    cloudpickle
+    cookiecutter
+    diff-match-patch
+    intervaltree
+    jedi
+    jellyfish
+    keyring
+    matplotlib
+    nbconvert
+    numpy
+    numpydoc
+    psutil
+    pygments
+    pylint-venv
+    pyls-spyder
+    pyopengl
+    pyqtwebengine
+    python-lsp-black
+    python-lsp-server
+    pyxdg
+    pyzmq
+    qdarkstyle
+    qstylizer
+    qtawesome
+    qtconsole
+    qtpy
+    rope
+    rtree
+    scipy
+    spyder-kernels
+    textdistance
+    three-merge
+    watchdog
+  ] ++ python-lsp-server.optional-dependencies.all;
+
+  # There is no test for spyder
+  doCheck = false;
+
+  postPatch = ''
+    # Remove dependency on pyqtwebengine
+    # This is still part of the pyqt 5.11 version we have in nixpkgs
+    sed -i /pyqtwebengine/d setup.py
+    substituteInPlace setup.py \
+      --replace "qdarkstyle>=3.0.2,<3.1.0" "qdarkstyle" \
+      --replace "ipython>=7.31.1,<8.0.0" "ipython"
+  '';
+
+  postInstall = ''
+    # Add Python libs to env so Spyder subprocesses
+    # created to run compute kernels don't fail with ImportErrors
+    wrapProgram $out/bin/spyder --prefix PYTHONPATH : "$PYTHONPATH"
+  '';
+
+  dontWrapQtApps = true;
+
+  preFixup = ''
+    makeWrapperArgs+=("''${qtWrapperArgs[@]}")
+  '';
+
+  meta = with lib; {
+    description = "Scientific python development environment";
+    longDescription = ''
+      Spyder (previously known as Pydee) is a powerful interactive development
+      environment for the Python language with advanced editing, interactive
+      testing, debugging and introspection features.
+    '';
+    homepage = "https://www.spyder-ide.org/";
+    downloadPage = "https://github.com/spyder-ide/spyder/releases";
+    changelog = "https://github.com/spyder-ide/spyder/blob/master/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gebner ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/spyder/dont-clear-pythonpath.patch b/nixpkgs/pkgs/development/python-modules/spyder/dont-clear-pythonpath.patch
new file mode 100644
index 000000000000..abb021e39554
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spyder/dont-clear-pythonpath.patch
@@ -0,0 +1,25 @@
+diff --git a/spyder/app/start.py b/spyder/app/start.py
+index 97b08a600..66486e510 100644
+--- a/spyder/app/start.py
++++ b/spyder/app/start.py
+@@ -6,20 +6,8 @@
+ # (see spyder/__init__.py for details)
+ # -----------------------------------------------------------------------------
+
+-# Remove PYTHONPATH paths from sys.path before other imports to protect against
+-# shadowed standard libraries.
+ import os
+ import sys
+-if os.environ.get('PYTHONPATH'):
+-    for path in os.environ['PYTHONPATH'].split(os.pathsep):
+-        if os.name == 'nt' and 'pkgs' in path:
+-            # Don't remove pynsist installer entry for 'pkgs' directory
+-            continue
+-        else:
+-            try:
+-                sys.path.remove(path.rstrip(os.sep))
+-            except ValueError:
+-                pass
+
+ # Standard library imports
+ import ctypes
diff --git a/nixpkgs/pkgs/development/python-modules/spyse-python/default.nix b/nixpkgs/pkgs/development/python-modules/spyse-python/default.nix
new file mode 100644
index 000000000000..0064454a1eaf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/spyse-python/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, dataclasses-json
+, fetchFromGitHub
+, fetchpatch
+, limiter
+, pythonOlder
+, requests
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "spyse-python";
+  version = "2.2.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "spyse-com";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "041k0037anwaxp2mh7mdk8rdsw9hdr3arigyyqfxfn35x8j41c3k";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    dataclasses-json
+    responses
+    limiter
+  ];
+
+  # Tests requires an API token
+  doCheck = false;
+
+  patches = [
+    # Update limiter import and rate limit, https://github.com/spyse-com/spyse-python/pull/11
+    (fetchpatch {
+      name = "support-later-limiter.patch";
+      url = "https://github.com/spyse-com/spyse-python/commit/ff68164c514dfb28ab77d8690b3a5153962dbe8c.patch";
+      hash = "sha256-PoWPJCK/Scsh4P7lr97u4JpVHXNlY0C9rJgY4TDYmv0=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'dataclasses~=0.6'," "" \
+      --replace "responses~=0.13.3" "responses>=0.13.3" \
+      --replace "limiter~=0.1.2" "limiter>=0.1.2" \
+      --replace "requests~=2.26.0" "requests>=2.26.0"
+  '';
+
+  pythonImportsCheck = [
+    "spyse"
+  ];
+
+  meta = with lib; {
+    description = "Python module for spyse.com API";
+    homepage = "https://github.com/spyse-com/spyse-python";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqids/default.nix b/nixpkgs/pkgs/development/python-modules/sqids/default.nix
new file mode 100644
index 000000000000..a9d5fe372953
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqids/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools-scm
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sqids";
+  version = "0.4.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/8P7/vY0kb7ouUCpgGU4g0Xb77BtSeQVt6nkdcogD50=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "sqids" ];
+
+  meta = with lib; {
+    homepage = "https://sqids.org/python";
+    description = "A library that lets you generate short YouTube-looking IDs from numbers";
+    license = with licenses; mit;
+    maintainers = with maintainers; [ panicgh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqlalchemy-citext/default.nix b/nixpkgs/pkgs/development/python-modules/sqlalchemy-citext/default.nix
new file mode 100644
index 000000000000..9bf638647680
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-citext/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, psycopg2
+, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "sqlalchemy-citext";
+  version = "1.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a1740e693a9a334e7c8f60ae731083fe75ce6c1605bb9ca6644a6f1f63b15b77";
+  };
+
+  propagatedBuildInputs = [
+    sqlalchemy
+
+    # not listed in `install_requires`, but is imported in citext/__init__.py
+    psycopg2
+  ];
+
+  # tests are not packaged in pypi tarball
+  doCheck = false;
+
+  pythonImportsCheck = [ "citext" ];
+
+  meta = with lib; {
+    description = "A sqlalchemy plugin that allows postgres use of CITEXT";
+    homepage = "https://github.com/mahmoudimus/sqlalchemy-citext";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqlalchemy-continuum/default.nix b/nixpkgs/pkgs/development/python-modules/sqlalchemy-continuum/default.nix
new file mode 100644
index 000000000000..fa0d3ad6cade
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-continuum/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flask
+, flask-login
+, flask-sqlalchemy
+, psycopg2
+, pymysql
+, pytestCheckHook
+, pythonOlder
+, sqlalchemy
+, sqlalchemy-i18n
+, sqlalchemy-utils
+}:
+
+buildPythonPackage rec {
+  pname = "sqlalchemy-continuum";
+  version = "1.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "SQLAlchemy-Continuum";
+    inherit version;
+    hash = "sha256-Rk+aWxBjUrXuRPE5MSyzWMWS0l7qrjU3wOrHLC+vteU=";
+  };
+
+  propagatedBuildInputs = [
+    sqlalchemy
+    sqlalchemy-utils
+  ];
+
+  passthru.optional-dependencies = {
+    flask = [
+      flask
+    ];
+    flask-login = [
+      flask-login
+    ];
+    flask-sqlalchemy = [
+      flask-sqlalchemy
+    ];
+    i18n = [
+      sqlalchemy-i18n
+    ];
+  };
+
+  nativeCheckInputs = [
+    psycopg2
+    pymysql
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  # Indicate tests that we don't have a database server at hand
+  env.DB = "sqlite";
+
+  pythonImportsCheck = [
+    "sqlalchemy_continuum"
+  ];
+
+  meta = with lib; {
+    description = "Versioning and auditing extension for SQLAlchemy";
+    homepage = "https://github.com/kvesteri/sqlalchemy-continuum/";
+    changelog = "https://github.com/kvesteri/sqlalchemy-continuum/blob/${version}/CHANGES.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqlalchemy-i18n/default.nix b/nixpkgs/pkgs/development/python-modules/sqlalchemy-i18n/default.nix
new file mode 100644
index 000000000000..a17e7ada4522
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-i18n/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, sqlalchemy
+, sqlalchemy-utils
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "SQLAlchemy-i18n";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "de33376483a581ca14218d8f57a114466c5f72b674a95839b6c4564a6e67796f";
+  };
+
+  propagatedBuildInputs = [
+    sqlalchemy
+    sqlalchemy-utils
+    six
+  ];
+
+  # tests require running a postgresql server
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/kvesteri/sqlalchemy-i18n";
+    description = "Internationalization extension for SQLAlchemy models";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqlalchemy-jsonfield/default.nix b/nixpkgs/pkgs/development/python-modules/sqlalchemy-jsonfield/default.nix
new file mode 100644
index 000000000000..1821ed3ef8df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-jsonfield/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, sqlalchemy
+, setuptools-scm
+, setuptools
+, sphinx
+, pytestCheckHook
+, pytest-sugar
+, pymysql
+, psycopg2
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sqlalchemy-jsonfield";
+  version = "1.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "penguinolog";
+    repo = "sqlalchemy_jsonfield";
+    rev = "refs/tags/${version}";
+    hash = "sha256-4zLXB3UQh6pgQ80KrxkLeC5yiv1R8t2+JmSukmGXr7I=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = "v${version}";
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    sqlalchemy
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-sugar
+    pymysql
+    psycopg2
+  ];
+
+  pythonImportsCheck = [
+    "sqlalchemy_jsonfield"
+  ];
+
+  meta = with lib; {
+    description = "SQLALchemy JSONField implementation for storing dicts at SQL independently from JSON type support";
+    homepage = "https://github.com/penguinolog/sqlalchemy_jsonfield";
+    changelog = "https://github.com/penguinolog/sqlalchemy_jsonfield/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ivan-tkatchev ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqlalchemy-migrate/default.nix b/nixpkgs/pkgs/development/python-modules/sqlalchemy-migrate/default.nix
new file mode 100644
index 000000000000..c71172764af7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-migrate/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, python
+, scripttest
+, pytz
+, pbr
+, tempita
+, decorator
+, sqlalchemy
+, six
+, sqlparse
+, testrepository
+}:
+
+buildPythonPackage rec {
+  pname = "sqlalchemy-migrate";
+  version = "0.13.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1y0lcqii7b4vp7yh9dyxrl4i77hi8jkkw7d06mgdw2h458ljxh0b";
+  };
+
+  patches = [
+    # See: https://review.openstack.org/#/c/608382/
+    # https://github.com/openstack/sqlalchemy-migrate/pull/18
+    (fetchpatch {
+      url = "https://github.com/openstack/sqlalchemy-migrate/commit/a5d69a17d9354ec1a792493280f96484740cf7ff.patch";
+      sha256 = "1qyfq2m7w7xqf0r9bc2x42qcra4r9k9l9g1jy5j0fvlb6bvvjj07";
+    })
+    ./python3.11-comp.diff
+  ];
+
+  postPatch = ''
+    substituteInPlace test-requirements.txt \
+      --replace "ibm_db_sa>=0.3.0;python_version<'3.0'" "" \
+      --replace "ibm-db-sa-py3;python_version>='3.0'" "" \
+      --replace "tempest-lib>=0.1.0" "" \
+      --replace "testtools>=0.9.34,<0.9.36" "" \
+      --replace "pylint" ""
+  '';
+
+  nativeCheckInputs = [ scripttest pytz testrepository ];
+  propagatedBuildInputs = [ pbr tempita decorator sqlalchemy six sqlparse ];
+
+  doCheck = !stdenv.isDarwin;
+
+  checkPhase = ''
+    export PATH=$PATH:$out/bin
+    echo sqlite:///__tmp__ > test_db.cfg
+    # depends on ibm_db_sa
+    rm migrate/tests/changeset/databases/test_ibmdb2.py
+    # wants very old testtools
+    rm migrate/tests/versioning/test_schema.py
+    # transient failures on py27
+    substituteInPlace migrate/tests/versioning/test_util.py --replace "test_load_model" "noop"
+    ${python.interpreter} setup.py test
+  '';
+
+  meta = with lib; {
+    homepage = "https://opendev.org/x/sqlalchemy-migrate";
+    description = "Schema migration tools for SQLAlchemy";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members ++ (with maintainers; [ makefu ]);
+    broken = lib.versionAtLeast sqlalchemy.version "2.0.0";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqlalchemy-migrate/python3.11-comp.diff b/nixpkgs/pkgs/development/python-modules/sqlalchemy-migrate/python3.11-comp.diff
new file mode 100644
index 000000000000..c8e201b0ca6d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-migrate/python3.11-comp.diff
@@ -0,0 +1,13 @@
+diff --git a/migrate/versioning/shell.py b/migrate/versioning/shell.py
+index 5fb86b1..fae0ce4 100644
+--- a/migrate/versioning/shell.py
++++ b/migrate/versioning/shell.py
+@@ -108,7 +108,7 @@ def main(argv=None, **kwargs):
+         parser.error("Invalid command %s" % command)
+ 
+     parser.set_usage(inspect.getdoc(command_func))
+-    f_args, f_varargs, f_kwargs, f_defaults = inspect.getargspec(command_func)
++    f_args, f_varargs, f_kwargs, f_defaults, _, _, _ = inspect.getfullargspec(command_func)
+     for arg in f_args:
+         parser.add_option(
+             "--%s" % arg,
diff --git a/nixpkgs/pkgs/development/python-modules/sqlalchemy-mixins/default.nix b/nixpkgs/pkgs/development/python-modules/sqlalchemy-mixins/default.nix
new file mode 100644
index 000000000000..1a075b227913
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-mixins/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, pytestCheckHook
+, pythonOlder
+, six
+, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "sqlalchemy-mixins";
+  version = "2.0.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "absent1706";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-iJrRlV/M0Z1IOdrwWSblefm6wjvdk4/v0am+It8VeWI=";
+  };
+
+  propagatedBuildInputs = [
+    six
+    sqlalchemy
+  ];
+
+  nativeCheckInputs = [
+    nose
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sqlalchemy_mixins"
+  ];
+
+  meta = with lib; {
+    description = "Python mixins for SQLAlchemy ORM";
+    homepage = "https://github.com/absent1706/sqlalchemy-mixins";
+    changelog = "https://github.com/absent1706/sqlalchemy-mixins/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqlalchemy-utils/default.nix b/nixpkgs/pkgs/development/python-modules/sqlalchemy-utils/default.nix
new file mode 100644
index 000000000000..84b42ad27f2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-utils/default.nix
@@ -0,0 +1,105 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+# runtime
+, importlib-metadata
+, sqlalchemy
+
+# optionals
+, babel
+, arrow
+, pendulum
+#, intervals
+, phonenumbers
+, passlib
+, colour
+, python-dateutil
+, furl
+, cryptography
+
+# tests
+, pytestCheckHook
+, pygments
+, jinja2
+, docutils
+, flexmock
+, psycopg2
+, psycopg2cffi
+, pg8000
+, pytz
+, backports-zoneinfo
+, pymysql
+, pyodbc
+
+}:
+
+buildPythonPackage rec {
+  pname = "sqlalchemy-utils";
+  version = "0.41.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "SQLAlchemy-Utils";
+    hash = "sha256-ohgb/wHuuER544Vx0sBxjrUgQvmv2MGU0NAod+hLfXQ=";
+  };
+
+  patches = [
+    ./skip-database-tests.patch
+  ];
+
+  propagatedBuildInputs = [
+    sqlalchemy
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  passthru.optional-dependencies = {
+    babel = [ babel ];
+    arrow = [ arrow ];
+    pendulum = [ pendulum ];
+    #intervals = [ intervals ];
+    phone = [ phonenumbers ];
+    password = [ passlib ];
+    color = [ colour ];
+    timezone = [ python-dateutil ];
+    url = [ furl ];
+    encrypted = [ cryptography ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pygments
+    jinja2
+    docutils
+    flexmock
+    psycopg2
+    psycopg2cffi
+    pg8000
+    pytz
+    python-dateutil
+    pymysql
+    pyodbc
+  ]
+  ++ lib.flatten (builtins.attrValues passthru.optional-dependencies)
+  ++ lib.optionals (pythonOlder "3.9") [
+    backports-zoneinfo
+  ];
+
+  pytestFlagsArray = [
+    "--deselect tests/functions/test_database.py::TestDatabasePostgresCreateDatabaseCloseConnection::test_create_database_twice"
+    "--deselect tests/functions/test_database.py::TestDatabasePostgresPg8000::test_create_and_drop"
+    "--deselect tests/functions/test_database.py::TestDatabasePostgresPsycoPG2CFFI::test_create_and_drop"
+    "--deselect tests/functions/test_database.py::TestDatabasePostgresPsycoPG3::test_create_and_drop"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/kvesteri/sqlalchemy-utils/releases/tag/${version}";
+    homepage = "https://github.com/kvesteri/sqlalchemy-utils";
+    description = "Various utility functions and datatypes for SQLAlchemy";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ eadwu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqlalchemy-utils/skip-database-tests.patch b/nixpkgs/pkgs/development/python-modules/sqlalchemy-utils/skip-database-tests.patch
new file mode 100644
index 000000000000..d5f9a46ecb88
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-utils/skip-database-tests.patch
@@ -0,0 +1,34 @@
+diff --git a/conftest.py b/conftest.py
+index 4426e02..1f84096 100644
+--- a/conftest.py
++++ b/conftest.py
+@@ -73,17 +73,12 @@ def mysql_db_user():
+ @pytest.fixture
+ def postgresql_dsn(postgresql_db_user, postgresql_db_password, postgresql_db_host,
+                    db_name):
+-    return 'postgresql://{}:{}@{}/{}'.format(
+-        postgresql_db_user,
+-        postgresql_db_password,
+-        postgresql_db_host,
+-        db_name
+-    )
++    pytest.skip()
+ 
+ 
+ @pytest.fixture
+ def mysql_dsn(mysql_db_user, db_name):
+-    return f'mysql+pymysql://{mysql_db_user}@localhost/{db_name}'
++    pytest.skip()
+ 
+ 
+ @pytest.fixture
+@@ -121,8 +116,7 @@ def mssql_db_driver():
+ 
+ @pytest.fixture
+ def mssql_dsn(mssql_db_user, mssql_db_password, mssql_db_driver, db_name):
+-    return 'mssql+pyodbc://{}:{}@localhost/{}?driver={}'\
+-        .format(mssql_db_user, mssql_db_password, db_name, mssql_db_driver)
++    pytest.skip()
+ 
+ 
+ @pytest.fixture
diff --git a/nixpkgs/pkgs/development/python-modules/sqlalchemy-views/default.nix b/nixpkgs/pkgs/development/python-modules/sqlalchemy-views/default.nix
new file mode 100644
index 000000000000..beafdbc2b538
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy-views/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, sqlalchemy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sqlalchemy-views";
+  version = "0.3.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    repo = pname;
+    owner = "jklukas";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-MJgikWXo3lpMsSYbb5sOSOTbJPOx5gEghW1V9jKvHKU=";
+  };
+
+  postPatch = ''
+    substituteInPlace tox.ini --replace '--cov=sqlalchemy_views --cov-report=term' ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    sqlalchemy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sqlalchemy_views"
+  ];
+
+  meta = with lib; {
+    description = "Adds CreateView and DropView constructs to SQLAlchemy";
+    homepage = "https://github.com/jklukas/sqlalchemy-views";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqlalchemy/default.nix b/nixpkgs/pkgs/development/python-modules/sqlalchemy/default.nix
new file mode 100644
index 000000000000..95e357cabda9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlalchemy/default.nix
@@ -0,0 +1,156 @@
+{ lib
+, isPyPy
+, pythonOlder
+, fetchFromGitHub
+, buildPythonPackage
+
+# build
+, cython
+, setuptools
+
+# propagates
+, greenlet
+, typing-extensions
+
+# optionals
+, aiomysql
+, aiosqlite
+, asyncmy
+, asyncpg
+, cx_oracle
+, mariadb
+, mypy
+, mysql-connector
+, mysqlclient
+, oracledb
+, pg8000
+, psycopg
+, psycopg2
+, psycopg2cffi
+# TODO: pymssql
+, pymysql
+, pyodbc
+# TODO: sqlcipher3
+
+# tests
+, mock
+, pytest-xdist
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "SQLAlchemy";
+  version = "2.0.21";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sqlalchemy";
+    repo = "sqlalchemy";
+    rev = "refs/tags/rel_${lib.replaceStrings [ "." ] [ "_" ] version}";
+    hash = "sha256-ldBn+pdZfqnBKdYkOcG47ScH/hBgeJBeIvn1hCIBw/A=";
+  };
+
+  nativeBuildInputs =[
+    setuptools
+  ] ++ lib.optionals (!isPyPy) [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    greenlet
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = lib.fix (self: {
+    asyncio = [
+      greenlet
+    ];
+    mypy = [
+      mypy
+    ];
+    mssql = [
+      pyodbc
+    ];
+    mssql_pymysql = [
+      # TODO: pymssql
+    ];
+    mssql_pyodbc = [
+      pyodbc
+    ];
+    mysql = [
+      mysqlclient
+    ];
+    mysql_connector = [
+      mysql-connector
+    ];
+    mariadb_connector = [
+      mariadb
+    ];
+    oracle = [
+      cx_oracle
+    ];
+    oracle_oracledb = [
+      oracledb
+    ];
+    postgresql = [
+      psycopg2
+    ];
+    postgresql_pg8000 = [
+      pg8000
+    ];
+    postgresql_asyncpg = [
+      asyncpg
+    ] ++ self.asyncio;
+    postgresql_psycopg2binary = [
+      psycopg2
+    ];
+    postgresql_psycopg2cffi = [
+      psycopg2cffi
+    ];
+    postgresql_psycopg = [
+      psycopg
+    ];
+    postgresql_psycopgbinary = [
+      psycopg
+    ];
+    pymysql = [
+      pymysql
+    ];
+    aiomysql = [
+      aiomysql
+    ] ++ self.asyncio;
+    asyncmy = [
+      asyncmy
+    ] ++ self.asyncio;
+    aiosqlite = [
+      aiosqlite
+      typing-extensions
+    ] ++ self.asyncio;
+    sqlcipher = [
+      # TODO: sqlcipher3
+    ];
+  });
+
+  nativeCheckInputs = [
+    pytest-xdist
+    pytestCheckHook
+    mock
+  ];
+
+  disabledTestPaths = [
+    # typing correctness, not interesting
+    "test/ext/mypy"
+    "test/typing"
+    # slow and high memory usage, not interesting
+    "test/aaa_profiling"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/sqlalchemy/sqlalchemy/releases/tag/rel_${builtins.replaceStrings [ "." ] [ "_" ] version}";
+    description = "The Python SQL toolkit and Object Relational Mapper";
+    homepage = "http://www.sqlalchemy.org/";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqlbag/default.nix b/nixpkgs/pkgs/development/python-modules/sqlbag/default.nix
new file mode 100644
index 000000000000..8b21d89ad5da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlbag/default.nix
@@ -0,0 +1,95 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, psycopg2
+, pymysql
+, sqlalchemy
+, pathlib
+, six
+, flask
+, pendulum
+, packaging
+, setuptools
+, poetry-core
+, pytestCheckHook
+, pytest-xdist
+, pytest-sugar
+, postgresql
+, postgresqlTestHook
+,
+}:
+buildPythonPackage rec {
+  pname = "sqlbag";
+  version = "0.1.1617247075";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "djrobstep";
+    repo = pname;
+    # no tags on github, version patch number is unix time.
+    rev = "eaaeec4158ffa139fba1ec30d7887f4d836f4120";
+    hash = "sha256-lipgnkqrzjzqwbhtVcWDQypBNzq6Dct/qoM8y/FNiNs=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs =
+    [
+      sqlalchemy
+      six
+      packaging
+
+      psycopg2
+      pymysql
+
+      setuptools # needed for 'pkg_resources'
+    ]
+    ++ lib.optional isPy27 pathlib;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-xdist
+    pytest-sugar
+
+    postgresql
+    postgresqlTestHook
+
+    flask
+    pendulum
+  ];
+
+  preCheck = ''
+    export PGUSER="nixbld";
+  '';
+  disabledTests = [
+    # These all fail with "List argument must consist only of tuples or dictionaries":
+    # Related issue: https://github.com/djrobstep/sqlbag/issues/14
+    "test_basic"
+    "test_createdrop"
+    "test_errors_and_messages"
+    "test_flask_integration"
+    "test_orm_stuff"
+    "test_pendulum_for_time_types"
+    "test_transaction_separation"
+  ];
+
+  pytestFlagsArray = [
+    "-x"
+    "-svv"
+    "tests"
+  ];
+
+  pythonImportsCheck = [
+    "sqlbag"
+  ];
+
+  meta = with lib; {
+    description = "Handy python code for doing database things";
+    homepage = "https://github.com/djrobstep/sqlbag";
+    license = with licenses; [ unlicense ];
+    maintainers = with maintainers; [ soispha ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqlglot/default.nix b/nixpkgs/pkgs/development/python-modules/sqlglot/default.nix
new file mode 100644
index 000000000000..a5d3e5ea11fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlglot/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, python-dateutil
+, duckdb
+, setuptools-scm
+}:
+buildPythonPackage rec {
+  pname = "sqlglot";
+  version = "17.14.2";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    repo = "sqlglot";
+    owner = "tobymao";
+    rev = "v${version}";
+    hash = "sha256-aImshQ5jf0k62ucpK4X8G7uHGAFQkhGgjMYo4mvSvew=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  # optional dependency used in the sqlglot optimizer
+  propagatedBuildInputs = [ python-dateutil ];
+
+  nativeCheckInputs = [ pytestCheckHook duckdb ];
+
+  # these integration tests assume a running Spark instance
+  disabledTestPaths = [ "tests/dataframe/integration" ];
+
+  pythonImportsCheck = [ "sqlglot" ];
+
+  meta = with lib; {
+    description = "A no dependency Python SQL parser, transpiler, and optimizer";
+    homepage = "https://github.com/tobymao/sqlglot";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqlite-fts4/default.nix b/nixpkgs/pkgs/development/python-modules/sqlite-fts4/default.nix
new file mode 100644
index 000000000000..27a6913020a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlite-fts4/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sqlite-fts4";
+  version = "1.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "simonw";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Ibiows3DSnzjIUv7U9tYNVnDaecBBxjXzDqxbIlNhhU=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sqlite_fts4"
+  ];
+
+  meta = with lib; {
+    description = "Custom Python functions for working with SQLite FTS4";
+    homepage = "https://github.com/simonw/sqlite-fts4";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ meatcar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqlite-migrate/default.nix b/nixpkgs/pkgs/development/python-modules/sqlite-migrate/default.nix
new file mode 100644
index 000000000000..b19d3e590f52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlite-migrate/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, sqlite-utils
+}:
+
+buildPythonPackage rec {
+  pname = "sqlite-migrate";
+  version = "0.1a2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wztAqe3TW0SQ4JX1XPWeA4KNJci5c3fNih97cmlPwRE=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    sqlite-utils
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sqlite_migrate"
+  ];
+
+  meta = with lib; {
+    description = "A simple database migration system for SQLite, based on sqlite-utils";
+    homepage = "https://github.com/simonw/sqlite-migrate";
+    changelog = "https://github.com/simonw/sqlite-migrate/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ aldoborrero ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqlite-utils/default.nix b/nixpkgs/pkgs/development/python-modules/sqlite-utils/default.nix
new file mode 100644
index 000000000000..92cc4ea62784
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlite-utils/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pythonOlder
+, click
+, click-default-group
+, python-dateutil
+, sqlite-fts4
+, tabulate
+, pluggy
+, pytestCheckHook
+, hypothesis
+, testers
+, sqlite-utils
+}:
+
+buildPythonPackage rec {
+  pname = "sqlite-utils";
+  version = "3.35.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WQsUrSd5FMs/x9XiVHZIR/rNqqI8e6/YXsk4dPb0IUM=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "click-default-group-wheel" "click-default-group"
+  '';
+
+  propagatedBuildInputs = [
+    click
+    click-default-group
+    python-dateutil
+    sqlite-fts4
+    tabulate
+    pluggy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    hypothesis
+  ];
+
+  pythonImportsCheck = [
+    "sqlite_utils"
+  ];
+
+  passthru.tests.version = testers.testVersion {
+    package = sqlite-utils;
+  };
+
+  meta = with lib; {
+    description = "Python CLI utility and library for manipulating SQLite databases";
+    homepage = "https://github.com/simonw/sqlite-utils";
+    changelog = "https://github.com/simonw/sqlite-utils/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ meatcar techknowlogick ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqlitedict/default.nix b/nixpkgs/pkgs/development/python-modules/sqlitedict/default.nix
new file mode 100644
index 000000000000..f506430619a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlitedict/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, py
+, pytest-benchmark
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sqlitedict";
+  version = "2.1.0";
+
+  src = fetchFromGitHub {
+    owner = "RaRe-Technologies";
+    repo = "sqlitedict";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-GfvvkQ6a75UBPn70IFOvjvL1MedSc4siiIjA3IsQnic=";
+  };
+
+  preCheck = ''
+    mkdir tests/db
+  '';
+
+  nativeCheckInputs = [
+    py
+    pytest-benchmark
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--benchmark-disable"
+  ];
+
+  meta = with lib; {
+    description = "Persistent, thread-safe dict";
+    homepage = "https://github.com/RaRe-Technologies/sqlitedict";
+    license = licenses.asl20;
+    maintainers = [ maintainers.arnoldfarkas ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqlmap/default.nix b/nixpkgs/pkgs/development/python-modules/sqlmap/default.nix
new file mode 100644
index 000000000000..936d904c6523
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlmap/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, file
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sqlmap";
+  version = "1.7.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gjObtmEvvyCnqd+bLdirzW18/AarmvhF6ItvqJ2Qmuo=";
+  };
+
+  postPatch = ''
+    substituteInPlace sqlmap/thirdparty/magic/magic.py --replace "ctypes.util.find_library('magic')" \
+      "'${file}/lib/libmagic${stdenv.hostPlatform.extensions.sharedLibrary}'"
+
+    # the check for the last update date does not work in Nix,
+    # since the timestamp of the all files in the nix store is reset to the unix epoch
+    echo 'LAST_UPDATE_NAGGING_DAYS = float("inf")' >> sqlmap/lib/core/settings.py
+  '';
+
+  # No tests in archive
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sqlmap"
+  ];
+
+  meta = with lib; {
+    description = "Automatic SQL injection and database takeover tool";
+    homepage = "https://sqlmap.org";
+    changelog = "https://github.com/sqlmapproject/sqlmap/releases/tag/${version}";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ bennofs ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqlmodel/default.nix b/nixpkgs/pkgs/development/python-modules/sqlmodel/default.nix
new file mode 100644
index 000000000000..5b7449d4a796
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlmodel/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fastapi
+, fetchFromGitHub
+, poetry-core
+, pydantic
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, sqlalchemy
+}:
+
+buildPythonPackage rec {
+  pname = "sqlmodel";
+  version = "0.0.12";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tiangolo";
+    repo = "sqlmodel";
+    rev = "refs/tags/${version}";
+    hash = "sha256-ER8NGDcCCCXT8lsm8fgJUaLyjdf5v2/UdrBw5T9EeXQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    pydantic
+    sqlalchemy
+  ];
+
+  nativeCheckInputs = [
+    fastapi
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sqlmodel"
+  ];
+
+  disabledTestPaths = [
+    # Coverage
+    "tests/test_tutorial/test_create_db_and_table/test_tutorial001.py"
+  ];
+
+  meta = with lib; {
+    description = "Module to work with SQL databases";
+    homepage = "https://github.com/tiangolo/sqlmodel";
+    changelog = "https://github.com/tiangolo/sqlmodel/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqlobject/default.nix b/nixpkgs/pkgs/development/python-modules/sqlobject/default.nix
new file mode 100644
index 000000000000..e4ac317418ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlobject/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, formencode
+, pastedeploy
+, paste
+, pydispatcher
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sqlobject";
+  version = "3.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "SQLObject";
+    inherit version;
+    hash = "sha256-QrGyrM6e1cxCtF4GxoivXU/Gj2H8VnG7EFcgimLfdng=";
+  };
+
+  propagatedBuildInputs = [
+    formencode
+    paste
+    pastedeploy
+    pydispatcher
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # https://github.com/sqlobject/sqlobject/issues/179
+    "test_fail"
+  ];
+
+  pythonImportsCheck = [
+    "sqlobject"
+  ];
+
+  meta = with lib; {
+    description = "Object Relational Manager for providing an object interface to your database";
+    homepage = "https://www.sqlobject.org/";
+    changelog = "https://github.com/sqlobject/sqlobject/blob/${version}/docs/News.rst";
+    license = licenses.lgpl21Only;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqlparse/default.nix b/nixpkgs/pkgs/development/python-modules/sqlparse/default.nix
new file mode 100644
index 000000000000..795647098caf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlparse/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, installShellFiles
+, pytestCheckHook
+, isPy3k
+
+# for passthru.tests
+, django
+, django_4
+, django-silk
+, pgadmin4
+}:
+
+buildPythonPackage rec {
+  pname = "sqlparse";
+  version = "0.4.4";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-1EYYPoS4NJ+jBh8P5/BsqUumW0JpRv/r5uPoKVMyQgw=";
+  };
+
+  format = "pyproject";
+
+  nativeBuildInputs = [ flit-core installShellFiles ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  postInstall = ''
+    installManPage docs/sqlformat.1
+  '';
+
+  passthru.tests = {
+    inherit django django_4 django-silk pgadmin4;
+  };
+
+  meta = with lib; {
+    description = "Non-validating SQL parser for Python";
+    longDescription = ''
+      Provides support for parsing, splitting and formatting SQL statements.
+    '';
+    homepage = "https://github.com/andialbrecht/sqlparse";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqlsoup/default.nix b/nixpkgs/pkgs/development/python-modules/sqlsoup/default.nix
new file mode 100644
index 000000000000..6a06ef247a0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqlsoup/default.nix
@@ -0,0 +1,22 @@
+{ buildPythonPackage, fetchPypi, lib, sqlalchemy, nose }:
+
+buildPythonPackage rec {
+  pname = "sqlsoup";
+  version = "0.9.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1mj00fhxj75ac3i8xk9jmm7hvcjz9p4x2r3yndcwsgb659rvgbrg";
+  };
+
+  propagatedBuildInputs = [ sqlalchemy ];
+  nativeCheckInputs = [ nose ];
+
+  meta = with lib; {
+    description = "A one step database access tool, built on the SQLAlchemy ORM";
+    homepage = "https://github.com/zzzeek/sqlsoup";
+    license = licenses.mit;
+    maintainers = [];
+    broken = true; # incompatible with sqlalchemy>=1.4 and unmaintained since 2016
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sqltrie/default.nix b/nixpkgs/pkgs/development/python-modules/sqltrie/default.nix
new file mode 100644
index 000000000000..09eac58bae7c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sqltrie/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pygtrie
+, orjson
+, python
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "sqltrie";
+  version = "0.9.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "iterative";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-4+jj9kRT6AR8u9nIlEkILY+/GQ7EBRd5V2oLeMLSo3o=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    orjson
+    pygtrie
+  ];
+
+  # nox is not available at the moment
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sqltrie"
+  ];
+
+  meta = with lib; {
+    description = "DVC's data management subsystem";
+    homepage = "https://github.com/iterative/sqltrie";
+    changelog = "https://github.com/iterative/sqltrie/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/squarify/default.nix b/nixpkgs/pkgs/development/python-modules/squarify/default.nix
new file mode 100644
index 000000000000..e0fe054156c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/squarify/default.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, pytestCheckHook
+, matplotlib
+}:
+
+buildPythonPackage rec {
+  pname = "squarify";
+  version = "0.4.3";
+
+  src = fetchFromGitHub {
+    owner = "laserson";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-zSv+6xT9H4WyShRnwjjcNMjY19AFlQ6bw9Mh9p2rL08=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  propagatedBuildInputs = [ matplotlib ];
+
+  pythonImportsCheck = [ "squarify" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/laserson/squarify";
+    description = "Pure Python implementation of the squarify treemap layout algorithm";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ veehaitch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/srp/default.nix b/nixpkgs/pkgs/development/python-modules/srp/default.nix
new file mode 100644
index 000000000000..952713123134
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/srp/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "srp";
+  version = "1.0.20";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-LbRTvc4mue6tNnp7V4MHTvgOhIK/MMAUCnuJg2oFRwc=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  # Tests ends up with libssl.so cannot load shared
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "srp"
+  ];
+
+  meta = with lib; {
+    description = "Implementation of the Secure Remote Password protocol (SRP)";
+    longDescription = ''
+     This package provides an implementation of the Secure Remote Password protocol (SRP).
+     SRP is a cryptographically strong authentication protocol for password-based, mutual authentication over an insecure network connection.
+    '';
+    homepage = "https://github.com/cocagne/pysrp";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jefflabonte ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/srpenergy/default.nix b/nixpkgs/pkgs/development/python-modules/srpenergy/default.nix
new file mode 100644
index 000000000000..e36bd7c2e4b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/srpenergy/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, python-dateutil
+, requests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "srpenergy";
+  version = "1.3.6";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "lamoreauxlab";
+    repo = "srpenergy-api-client-python";
+    rev = version;
+    hash = "sha256-aZnqGtfklWgigac2gdkQv29Qy5HC34zGGY2iWr2cOMo=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "srpenergy.client" ];
+
+  meta = with lib; {
+    description = "Unofficial Python module for interacting with Srp Energy data";
+    homepage = "https://github.com/lamoreauxlab/srpenergy-api-client-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/srptools/default.nix b/nixpkgs/pkgs/development/python-modules/srptools/default.nix
new file mode 100644
index 000000000000..9c80f4dbc90b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/srptools/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "srptools";
+  version = "1.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-f6QzclahVC6PW7S+0Z4dmuqY/l/5uvdmkzQqHdasfJY=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "srptools"
+  ];
+
+  meta = with lib; {
+    description = "Module to implement Secure Remote Password (SRP) authentication";
+    homepage = "https://github.com/idlesign/srptools";
+    changelog = "https://github.com/idlesign/srptools/blob/v${version}/CHANGELOG";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/srsly/default.nix b/nixpkgs/pkgs/development/python-modules/srsly/default.nix
new file mode 100644
index 000000000000..c3549ca3df02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/srsly/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, cython
+, catalogue
+, mock
+, numpy
+, psutil
+, pytest
+, ruamel-yaml
+, setuptools
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "srsly";
+  version = "2.4.8";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sk2VplAJwkR+C0nNoEOsU/7PTwnjWNh6V0RkWPkbipE=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    catalogue
+  ];
+
+  nativeCheckInputs = [
+    mock
+    numpy
+    psutil
+    pytest
+    ruamel-yaml
+    tornado
+  ];
+
+  pythonImportsCheck = [
+    "srsly"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/explosion/srsly/releases/tag/v${version}";
+    description = "Modern high-performance serialization utilities for Python";
+    homepage = "https://github.com/explosion/srsly";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/srt/default.nix b/nixpkgs/pkgs/development/python-modules/srt/default.nix
new file mode 100644
index 000000000000..62d03be0b177
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/srt/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hypothesis
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "srt";
+  version = "3.5.3";
+
+  disabled = pythonOlder "2.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-SIQxUEOk8HQP0fh47WyqN2rAbXDhNfMGptxEYy7tDMA=";
+  };
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "srt" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/cdown/srt";
+    description = "A tiny but featureful Python library for parsing, modifying, and composing SRT files";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ friedelino ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/srvlookup/default.nix b/nixpkgs/pkgs/development/python-modules/srvlookup/default.nix
new file mode 100644
index 000000000000..a81c1d25da23
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/srvlookup/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, dnspython
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "srvlookup";
+  version = "3.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "gmr";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-iXbi25HsoNX0hnhwZoFik5ddlJ7i+xml3HGaezj3jgY=";
+  };
+
+  propagatedBuildInputs = [
+    dnspython
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "srvlookup"
+  ];
+
+  meta = with lib; {
+    description = "Wrapper for dnspython to return SRV records for a given host, protocol, and domain name";
+    homepage = "https://github.com/gmr/srvlookup";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ mmlb ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ssdeep/default.nix b/nixpkgs/pkgs/development/python-modules/ssdeep/default.nix
new file mode 100644
index 000000000000..44a7f37190dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ssdeep/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, cffi
+, fetchFromGitHub
+, pytestCheckHook
+, six
+, ssdeep
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ssdeep";
+  version = "3.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "DinoTools";
+    repo = "python-ssdeep";
+    rev = "refs/tags/${version}";
+    hash = "sha256-I5ci5BS+B3OE0xdLSahu3HCh99jjhnRHJFz830SvFpg=";
+  };
+
+  buildInputs = [
+    ssdeep
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner"' ""
+  '';
+
+  pythonImportsCheck = [
+    "ssdeep"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for the ssdeep library";
+    homepage = "https://github.com/DinoTools/python-ssdeep";
+    changelog = "https://github.com/DinoTools/python-ssdeep/blob/${version}/CHANGELOG.rst";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ssdp/default.nix b/nixpkgs/pkgs/development/python-modules/ssdp/default.nix
new file mode 100644
index 000000000000..295ebc98a941
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ssdp/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, flit-scm
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ssdp";
+  version = "1.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "codingjoe";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-mORjMEg7Q/2CKZBLICSGF8dcdl98S6mBgJ4jujPGs6M=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov" ""
+  '';
+
+  nativeBuildInputs = [
+    flit-core
+    flit-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ssdp"
+  ];
+
+  meta = with lib; {
+    description = "Python asyncio library for Simple Service Discovery Protocol (SSDP)";
+    homepage = "https://github.com/codingjoe/ssdp";
+    changelog = "https://github.com/codingjoe/ssdp/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ssdpy/default.nix b/nixpkgs/pkgs/development/python-modules/ssdpy/default.nix
new file mode 100644
index 000000000000..ba9d32d710b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ssdpy/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pytestCheckHook
+, pytest-mock
+}:
+
+buildPythonPackage rec {
+  pname = "ssdpy";
+  version = "0.4.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "MoshiBin";
+    repo = "ssdpy";
+    rev = version;
+    hash = "sha256-luOanw4aOepGxoGtmnWZosq9JyHLJb3E+25tPkkL1w0=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+  ];
+
+  pythonImportsCheck = [ "ssdpy" ];
+
+  disabledTests = [
+    # They all require network access
+    "test_client_json_output"
+    "test_discover"
+    "test_server_ipv4"
+    "test_server_ipv6"
+    "test_server_binds_iface"
+    "test_server_bind_address_ipv6"
+    "test_server_extra_fields"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/MoshiBin/ssdpy/releases/tag/${version}";
+    description = "A lightweight, compatible SSDP library for Python";
+    homepage = "https://github.com/MoshiBin/ssdpy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mjm ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sseclient-py/default.nix b/nixpkgs/pkgs/development/python-modules/sseclient-py/default.nix
new file mode 100644
index 000000000000..5e9fcf4c61e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sseclient-py/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "sseclient-py";
+  version = "1.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mpetazzoni";
+    repo = "sseclient";
+    rev = "sseclient-py-${version}";
+    hash = "sha256-rNiJqR7/e+Rhi6kVBY8gZJZczqSUsyszotXkb4OKfWk=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sseclient"
+  ];
+
+  pytestFlagsArray = [
+    "tests/unittests.py"
+  ];
+
+  meta = with lib; {
+    description = "Pure-Python Server Side Events (SSE) client";
+    homepage = "https://github.com/mpetazzoni/sseclient";
+    changelog = "https://github.com/mpetazzoni/sseclient/releases/tag/sseclient-py-${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jamiemagee ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sseclient/default.nix b/nixpkgs/pkgs/development/python-modules/sseclient/default.nix
new file mode 100644
index 000000000000..bc1be1222bbe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sseclient/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "sseclient";
+  version = "0.0.27";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sv5TTcszsdP6rRPWDFp8cY4o+FmH8qA07PXsJ5kYwRw=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "event_stream"
+  ];
+
+  meta = with lib; {
+    description = "Client library for reading Server Sent Event streams";
+    homepage = "https://github.com/btubbs/sseclient";
+    license = licenses.mit;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sshfs/default.nix b/nixpkgs/pkgs/development/python-modules/sshfs/default.nix
new file mode 100644
index 000000000000..17378c8611a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sshfs/default.nix
@@ -0,0 +1,63 @@
+{ stdenv
+, lib
+, asyncssh
+, bcrypt
+, buildPythonPackage
+, fetchFromGitHub
+, fsspec
+, mock-ssh-server
+, pytest-asyncio
+, pytestCheckHook
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "sshfs";
+  version = "2023.10.0";
+
+  src = fetchFromGitHub {
+    owner = "fsspec";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-6MueDHR+jZFDZg4zufEVhBtSwcgDd7KnW9gJp2hDu0A=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    asyncssh
+    bcrypt
+    fsspec
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    mock-ssh-server
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # test fails with sandbox enabled
+    "test_checksum"
+  ];
+
+  pythonImportsCheck = [
+    "sshfs"
+  ];
+
+  meta = with lib; {
+    description = "SSH/SFTP implementation for fsspec";
+    homepage = "https://github.com/fsspec/sshfs/";
+    changelog = "https://github.com/fsspec/sshfs/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ melling ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sshpubkeys/default.nix b/nixpkgs/pkgs/development/python-modules/sshpubkeys/default.nix
new file mode 100644
index 000000000000..955eb905ac29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sshpubkeys/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchFromGitHub
+, cryptography
+, ecdsa
+}:
+
+buildPythonPackage rec {
+  version = "3.3.1";
+  pname = "sshpubkeys";
+
+  src = fetchFromGitHub {
+    owner = "ojarva";
+    repo = "python-${pname}";
+    rev = version;
+    sha256 = "1qsixmqg97kyvg1naw76blq4314vaw4hl5f9wi0v111mcmdia1r4";
+  };
+
+  propagatedBuildInputs = [ cryptography ecdsa ];
+
+  meta = with lib; {
+    description = "OpenSSH Public Key Parser for Python";
+    homepage = "https://github.com/ojarva/python-sshpubkeys";
+    license = licenses.bsd3;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sshtunnel/default.nix b/nixpkgs/pkgs/development/python-modules/sshtunnel/default.nix
new file mode 100644
index 000000000000..2e585c2bbc31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sshtunnel/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi
+, paramiko
+, pytestCheckHook
+, mock
+}:
+
+buildPythonPackage rec {
+  version = "0.4.0";
+  pname = "sshtunnel";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-58sOp3Tbgb+RhE2yLecqQKro97D5u5ug9mbUdO9r+fw=";
+  };
+
+  propagatedBuildInputs = [ paramiko ];
+
+  nativeCheckInputs = [ pytestCheckHook mock ];
+
+  # disable impure tests
+  disabledTests = [
+    "test_get_keys"
+    "connect_via_proxy"
+    "read_ssh_config"
+  ];
+
+  meta = with lib; {
+    description = "Pure python SSH tunnels";
+    homepage = "https://github.com/pahaz/sshtunnel";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sslib/default.nix b/nixpkgs/pkgs/development/python-modules/sslib/default.nix
new file mode 100644
index 000000000000..407053785f09
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sslib/default.nix
@@ -0,0 +1,22 @@
+{ lib, fetchPypi, buildPythonPackage, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "sslib";
+  version = "0.2.0";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0b5zrjkvx4klmv57pzhcmvbkdlyn745mn02k7hp811hvjrhbz417";
+  };
+
+  # No tests available
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/jqueiroz/python-sslib";
+    description = "A Python3 library for sharing secrets";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jqueiroz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stack-data/default.nix b/nixpkgs/pkgs/development/python-modules/stack-data/default.nix
new file mode 100644
index 000000000000..cba83f5df09b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stack-data/default.nix
@@ -0,0 +1,70 @@
+{ asttokens
+, buildPythonPackage
+, cython
+, executing
+, fetchFromGitHub
+, git
+, lib
+, littleutils
+, pure-eval
+, pygments
+, pytestCheckHook
+, setuptools-scm
+, toml
+, typeguard
+}:
+
+buildPythonPackage rec {
+  pname = "stack-data";
+  version = "0.2.0";
+
+  src = fetchFromGitHub {
+    owner = "alexmojaki";
+    repo = "stack_data";
+    rev = "v${version}";
+    hash = "sha256-brXFrk1UU5hxCVeRvGK7wzRA0Hoj9fgqoxTIwInPrEc=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    git
+    setuptools-scm
+    toml
+  ];
+
+  propagatedBuildInputs = [
+    asttokens
+    executing
+    pure-eval
+  ];
+
+  nativeCheckInputs = [
+    cython
+    littleutils
+    pygments
+    pytestCheckHook
+    typeguard
+  ];
+
+  # https://github.com/alexmojaki/stack_data/issues/50
+  # incompatible with typeguard>=3
+  doCheck = false;
+
+  disabledTests = [
+    # AssertionError
+    "test_example"
+    "test_executing_style_defs"
+    "test_pygments_example"
+    "test_variables"
+  ];
+
+  pythonImportsCheck = [ "stack_data" ];
+
+  meta = with lib; {
+    description = "Extract data from stack frames and tracebacks";
+    homepage = "https://github.com/alexmojaki/stack_data/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stanio/default.nix b/nixpkgs/pkgs/development/python-modules/stanio/default.nix
new file mode 100644
index 000000000000..83fcc7903107
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stanio/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, setuptools
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "stanio";
+  version = "0.3.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-DFBK5nG41Sah2nEYWsAqJ3VQj/5tPbkfJC6shbz2BG8=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  pythonImportsCheck = [ "stanio" ];
+
+  meta = with lib; {
+    description = "Preparing inputs to and reading outputs from Stan";
+    homepage = "https://github.com/WardBrian/stanio";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ wegank ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stanza/default.nix b/nixpkgs/pkgs/development/python-modules/stanza/default.nix
new file mode 100644
index 000000000000..51f2152c8689
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stanza/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, emoji
+, fetchFromGitHub
+, numpy
+, protobuf
+, pythonOlder
+, requests
+, six
+, torch
+, tqdm
+, transformers
+}:
+
+buildPythonPackage rec {
+  pname = "stanza";
+  version = "1.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "stanfordnlp";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-8WH83K/1SbzjlAmjKVh3gT9KVvQ6BMRmg3Z0SSeL1j8=";
+  };
+
+  propagatedBuildInputs = [
+    emoji
+    numpy
+    protobuf
+    requests
+    six
+    torch
+    tqdm
+    transformers
+  ];
+
+  # Tests require network access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "stanza"
+  ];
+
+  meta = with lib; {
+    description = "Official Stanford NLP Python Library for Many Human Languages";
+    homepage = "https://github.com/stanfordnlp/stanza/";
+    changelog = "https://github.com/stanfordnlp/stanza/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ riotbib ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/starkbank-ecdsa/default.nix b/nixpkgs/pkgs/development/python-modules/starkbank-ecdsa/default.nix
new file mode 100644
index 000000000000..ec741b7e1ee4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/starkbank-ecdsa/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "starkbank-ecdsa";
+  version = "2.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "starkbank";
+    repo = "ecdsa-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-HarlCDE2qOLbyhMLOE++bTC+7srJqwmohM6vrJkJ/gc=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    cd tests
+  '';
+
+  pytestFlagsArray = [
+    "-v"
+    "*.py"
+  ];
+
+  pythonImportsCheck = [
+    "ellipticcurve"
+  ];
+
+  meta = with lib; {
+    description = "Python ECDSA library";
+    homepage = "https://github.com/starkbank/ecdsa-python";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/starlette/default.nix b/nixpkgs/pkgs/development/python-modules/starlette/default.nix
new file mode 100644
index 000000000000..acac9c99f13a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/starlette/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+
+# runtime
+, ApplicationServices
+, anyio
+, itsdangerous
+, jinja2
+, python-multipart
+, pyyaml
+, httpx
+, typing-extensions
+
+# tests
+, pytestCheckHook
+, pythonOlder
+, trio
+}:
+
+buildPythonPackage rec {
+  pname = "starlette";
+  version = "0.31.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "encode";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-Tq414cEpXX8MQDR0KYyB+J7lFqorbiwP/sGnUFvs7wA=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    anyio
+    itsdangerous
+    jinja2
+    python-multipart
+    pyyaml
+    httpx
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    typing-extensions
+  ] ++ lib.optionals stdenv.isDarwin [
+    ApplicationServices
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    trio
+    typing-extensions
+  ];
+
+  pytestFlagsArray = [
+    "-W" "ignore::DeprecationWarning"
+    "-W" "ignore::trio.TrioDeprecationWarning"
+  ];
+
+  disabledTests = [
+    # asserts fail due to inclusion of br in Accept-Encoding
+    "test_websocket_headers"
+    "test_request_headers"
+  ];
+
+  pythonImportsCheck = [
+    "starlette"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/encode/starlette/releases/tag/${version}";
+    downloadPage = "https://github.com/encode/starlette";
+    homepage = "https://www.starlette.io/";
+    description = "The little ASGI framework that shines";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ wd15 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/starline/default.nix b/nixpkgs/pkgs/development/python-modules/starline/default.nix
new file mode 100644
index 000000000000..ce7418a88734
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/starline/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "starline";
+  version = "0.2.0";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "550b00ab95cf59d933f7708abab40a4e41e5790e62b653471afe86a3af3320e6";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "starline" ];
+
+  meta = with lib; {
+    description = "Unofficial python library for StarLine API";
+    homepage = "https://github.com/Anonym-tsk/starline";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stashy/default.nix b/nixpkgs/pkgs/development/python-modules/stashy/default.nix
new file mode 100644
index 000000000000..fa866cc26037
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stashy/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, decorator
+, fetchPypi
+, pythonOlder
+, requests
+ }:
+
+buildPythonPackage rec {
+  pname = "stashy";
+  version = "0.7";
+  disabled = pythonOlder "3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1x89zazwxnsx6rdfw8nfr372hj4sk8nrcs5hsjxpcxcva0calrcr";
+  };
+
+  propagatedBuildInputs = [ decorator requests ];
+
+  # Tests require internet connection
+  doCheck = false;
+  pythonImportsCheck = [ "stashy" ];
+
+  meta = with lib; {
+    description = "Python client for the Atlassian Bitbucket Server (formerly known as Stash) REST API.";
+    homepage = "https://github.com/cosmin/stashy";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ mupdt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/static3/default.nix b/nixpkgs/pkgs/development/python-modules/static3/default.nix
new file mode 100644
index 000000000000..9156ea6d6089
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/static3/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# optionals
+, genshi
+
+# tests
+, pytestCheckHook
+, webtest
+}:
+
+buildPythonPackage rec {
+  pname = "static3";
+  version = "0.7.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "rmohr";
+    repo = "static3";
+    rev = "v${version}";
+    hash = "sha256-uFgv+57/UZs4KoOdkFxbvTEDQrJbb0iYJ5JoWWN4yFY=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace ", 'pytest-cov'" ""
+  '';
+
+  passthru.optional-dependencies = {
+    KidMagic = [
+      # TODO: kid
+    ];
+    Genshimagic = [
+      genshi
+    ];
+  };
+
+  pythonImportsCheck = [
+    "static"
+  ];
+
+  nativeCheckInputs  = [
+    pytestCheckHook
+    webtest
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  meta = with lib; {
+    changelog = "https://github.com/rmohr/static3/releases/tag/v${version}";
+    description = "A really simple WSGI way to serve static (or mixed) content";
+    homepage = "https://github.com/rmohr/static3";
+    license = licenses.lgpl21Only;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/staticjinja/default.nix b/nixpkgs/pkgs/development/python-modules/staticjinja/default.nix
new file mode 100644
index 000000000000..54a93398e1ff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/staticjinja/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, poetry-core
+, docopt-ng
+, easywatch
+, jinja2
+, pytestCheckHook
+, pytest-check
+, pythonOlder
+, markdown
+, testers
+, tomlkit
+, typing-extensions
+, staticjinja
+, callPackage
+}:
+
+buildPythonPackage rec {
+  pname = "staticjinja";
+  version = "5.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  # No tests in pypi
+  src = fetchFromGitHub {
+    owner = "staticjinja";
+    repo = pname;
+    rev = version;
+    hash = "sha256-LfJTQhZtnTOm39EWF1m2MP5rxz/5reE0G1Uk9L7yx0w=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    jinja2
+    docopt-ng
+    easywatch
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-check
+    markdown
+    tomlkit
+    typing-extensions
+  ];
+
+  # The tests need to find and call the installed staticjinja executable
+  preCheck = ''
+    export PATH="$PATH:$out/bin";
+  '';
+
+  passthru.tests = {
+    version = testers.testVersion { package = staticjinja; };
+    minimal-template = callPackage ./test-minimal-template {};
+  };
+
+  meta = with lib; {
+    description = "A library and cli tool that makes it easy to build static sites using Jinja2";
+    homepage = "https://staticjinja.readthedocs.io/en/latest/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fgaz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/staticjinja/test-minimal-template/default.nix b/nixpkgs/pkgs/development/python-modules/staticjinja/test-minimal-template/default.nix
new file mode 100644
index 000000000000..e51a619c9e90
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/staticjinja/test-minimal-template/default.nix
@@ -0,0 +1,11 @@
+{ stdenv, staticjinja }:
+
+stdenv.mkDerivation {
+  name = "staticjinja-test-minimal-template";
+  meta.timeout = 30;
+  buildCommand = ''
+    ${staticjinja}/bin/staticjinja build --srcpath ${./templates}
+    grep 'Hello World!' index
+    touch $out
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/staticjinja/test-minimal-template/templates/include b/nixpkgs/pkgs/development/python-modules/staticjinja/test-minimal-template/templates/include
new file mode 100644
index 000000000000..216e97ce0822
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/staticjinja/test-minimal-template/templates/include
@@ -0,0 +1 @@
+World
diff --git a/nixpkgs/pkgs/development/python-modules/staticjinja/test-minimal-template/templates/index b/nixpkgs/pkgs/development/python-modules/staticjinja/test-minimal-template/templates/index
new file mode 100644
index 000000000000..03e1043180d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/staticjinja/test-minimal-template/templates/index
@@ -0,0 +1 @@
+Hello {% include './include' %}!
diff --git a/nixpkgs/pkgs/development/python-modules/staticmap/default.nix b/nixpkgs/pkgs/development/python-modules/staticmap/default.nix
new file mode 100644
index 000000000000..bb3eac8655bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/staticmap/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pillow
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "staticmap";
+  version = "0.5.7";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-x6lrkCumEpLoGMILCBBhnWuBps21C8wauS1QrE2yCn8=";
+  };
+
+  propagatedBuildInputs = [ requests pillow ];
+
+  pythonImportsCheck = [ "staticmap" ];
+
+  # Tests seem to be broken
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A small, python-based library for creating map images with lines and markers";
+    homepage = "https://pypi.org/project/staticmap/";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ traxys ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/statistics/default.nix b/nixpkgs/pkgs/development/python-modules/statistics/default.nix
new file mode 100644
index 000000000000..40a51373c70e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/statistics/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, docutils
+}:
+
+buildPythonPackage rec {
+  pname = "statistics";
+  version = "1.0.3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2dc379b80b07bf2ddd5488cad06b2b9531da4dd31edb04dc9ec0dc226486c138";
+  };
+
+  propagatedBuildInputs = [ docutils ];
+
+  # statistics package does not have any tests
+  doCheck = false;
+
+  meta = {
+    description = "A Python 2.* port of 3.4 Statistics Module";
+    homepage = "https://github.com/digitalemagine/py-statistics";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/statmake/default.nix b/nixpkgs/pkgs/development/python-modules/statmake/default.nix
new file mode 100644
index 000000000000..b9d0a4425c41
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/statmake/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, attrs
+, buildPythonPackage
+, cattrs
+, exceptiongroup
+, fetchFromGitHub
+, fonttools
+, fs
+, importlib-metadata
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, ufo2ft
+, ufoLib2
+}:
+
+buildPythonPackage rec {
+  pname = "statmake";
+  version = "0.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "daltonmaag";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-3BZ71JVvj7GCojM8ycu160viPj8BLJ1SiW86Df2fzsw=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    cattrs
+    fonttools
+    # required by fonttools[ufo]
+    fs
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    exceptiongroup
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    ufo2ft
+    ufoLib2
+  ];
+
+  pythonImportsCheck = [
+    "statmake"
+  ];
+
+  disabledTests = [
+    # Test requires an update as later cattrs is present in Nixpkgs
+    # https://github.com/daltonmaag/statmake/issues/42
+    "test_load_stylespace_broken_range"
+  ];
+
+  meta = with lib; {
+    description = "Applies STAT information from a Stylespace to a variable font";
+    homepage = "https://github.com/daltonmaag/statmake";
+    changelog = "https://github.com/daltonmaag/statmake/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/statsd/default.nix b/nixpkgs/pkgs/development/python-modules/statsd/default.nix
new file mode 100644
index 000000000000..a9dd1b3ff252
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/statsd/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, nose
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "statsd";
+  version = "4.0.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-mXY9qBv+qNr2s9ItEarMsBqND1LqUh2qs351ikyn0Sg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [ nose mock ];
+
+  patchPhase = ''
+    # Failing test: ERROR: statsd.tests.test_ipv6_resolution_udp
+    sed -i 's/test_ipv6_resolution_udp/noop/' statsd/tests.py
+    # well this is a noop, but so it was before
+    sed -i 's/assert_called_once()/called/' statsd/tests.py
+  '';
+
+  meta = with lib; {
+    maintainers = with maintainers; [ domenkozar ];
+    description = "A simple statsd client";
+    license = licenses.mit;
+    homepage = "https://github.com/jsocol/pystatsd";
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/statsmodels/default.nix b/nixpkgs/pkgs/development/python-modules/statsmodels/default.nix
new file mode 100644
index 000000000000..7df922863174
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/statsmodels/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchpatch
+, fetchPypi
+, matplotlib
+, numpy
+, oldest-supported-numpy
+, pandas
+, patsy
+, pythonOlder
+, scipy
+, setuptools-scm
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "statsmodels";
+  version = "0.14.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-aHXH1onpZtlI8V64FqtWFvSShwaxgM9HD9WQerb2R6Q=";
+  };
+
+  patches = [
+    # https://github.com/statsmodels/statsmodels/pull/8969
+    (fetchpatch {
+      name = "unpin-setuptools-scm.patch";
+      url = "https://github.com/statsmodels/statsmodels/commit/cfad8d81166e9b1392ba99763b95983afdb6d61b.patch";
+      hash = "sha256-l7cQHodkPm399a+3qIVmXPk/Ca+CqJDyWXWgjb062nM=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    cython
+    oldest-supported-numpy
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    pandas
+    patsy
+    matplotlib
+  ];
+
+  # Huge test suites with several test failures
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "statsmodels"
+  ];
+
+  meta = with lib; {
+    description = "Statistical computations and models for use with SciPy";
+    homepage = "https://www.github.com/statsmodels/statsmodels";
+    changelog = "https://github.com/statsmodels/statsmodels/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/std2/default.nix b/nixpkgs/pkgs/development/python-modules/std2/default.nix
new file mode 100644
index 000000000000..8e117b10e775
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/std2/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+}:
+
+buildPythonPackage {
+  pname = "std2";
+  version = "unstable-2023-10-07";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "ms-jpq";
+    repo = "std2";
+    rev = "6332e559ee51c3a7c956804afdd7e1cc6ad47965";
+    hash = "sha256-huN7P/Ws6anrFXDG7L5xxMenS25BHquV9cMi1s7WFJ4=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ms-jpq/std2";
+    description = "Dependency to chadtree and coq_nvim plugins";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stdiomask/default.nix b/nixpkgs/pkgs/development/python-modules/stdiomask/default.nix
new file mode 100644
index 000000000000..1ad09c22da8e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stdiomask/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "stdiomask";
+  version = "0.0.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "19m3p6i7fj7nmkbsjhiha3f2l7d05j9gf9ha2pd0pqfrx9lp1r61";
+  };
+
+  # tests are not published: https://github.com/asweigart/stdiomask/issues/5
+  doCheck = false;
+  pythonImportsCheck = [ "stdiomask" ];
+
+  meta = with lib; {
+    description = "Python module for masking passwords";
+    homepage = "https://github.com/asweigart/stdiomask";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stdlib-list/default.nix b/nixpkgs/pkgs/development/python-modules/stdlib-list/default.nix
new file mode 100644
index 000000000000..86f7c6a7d629
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stdlib-list/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+
+# build-system
+, flit-core
+}:
+
+buildPythonPackage rec {
+  pname = "stdlib-list";
+  version = "0.10.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "stdlib_list";
+    inherit version;
+    hash = "sha256-ZRnFDWRVE+0odle/6FbVJ/J3MxVAaR3er3eyVFmWShQ=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  pythonImportsCheck = [
+    "stdlib_list"
+  ];
+
+  # tests see mismatches to our standard library
+  doCheck = false;
+
+  meta = with lib; {
+    changelog = "https://github.com/pypi/stdlib-list/releases/tag/v${version}";
+    description = "A list of Python Standard Libraries";
+    homepage = "https://github.com/jackmaney/python-stdlib-list";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stdlibs/default.nix b/nixpkgs/pkgs/development/python-modules/stdlibs/default.nix
new file mode 100644
index 000000000000..1b2f80da245d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stdlibs/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "stdlibs";
+  version = "2023.11.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "omnilib";
+    repo = "stdlibs";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-084px8p+pOHonSiOvi/BklaccudSlw9URtCaalWlI0o=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "stdlibs"
+  ];
+
+  meta = with lib; {
+    description = "Overview of the Python stdlib";
+    homepage = "https://github.com/omnilib/stdlibs";
+    changelog = "https://github.com/omnilib/stdlibs/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/steamodd/default.nix b/nixpkgs/pkgs/development/python-modules/steamodd/default.nix
new file mode 100644
index 000000000000..edc489b297e8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/steamodd/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "steamodd";
+  version = "5.0";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Lagg";
+    repo = "steamodd";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ySAyCOI1ISuBQ/5+UHSQVji76ZDRGjdVwlBAY9tnSmE=";
+  };
+
+  # tests require API key
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "steam.api"
+    "steam.apps"
+    "steam.items"
+    "steam.loc"
+    "steam.remote_storage"
+    "steam.sim"
+    "steam.user"
+    "steam.vdf"
+  ];
+
+  meta = {
+    description = "High level Steam API implementation with low level reusable core";
+    homepage = "https://github.com/Lagg/steamodd";
+    license = lib.licenses.isc;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/steamship/default.nix b/nixpkgs/pkgs/development/python-modules/steamship/default.nix
new file mode 100644
index 000000000000..adc6db83dd9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/steamship/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, pythonRelaxDepsHook
+, requests
+, pydantic
+, aiohttp
+, inflection
+, fluent-logger
+, toml
+, click
+, semver
+, tiktoken
+}:
+
+buildPythonPackage rec {
+  pname = "steamship";
+  version = "2.17.32";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-dTpz2/XXu8patDnorg/36652j9VLUjE5uF2fVzbDjfI=";
+  };
+
+  pythonRelaxDeps = [
+    "requests"
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    pydantic
+    aiohttp
+    inflection
+    fluent-logger
+    toml
+    click
+    semver
+    tiktoken
+  ];
+
+  # almost all tests require "steamship api key"
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "steamship"
+  ];
+
+  meta = with lib; {
+    description = "The fastest way to add language AI to your product";
+    homepage = "https://www.steamship.com/";
+    changelog = "https://github.com/steamship-core/python-client/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stem/default.nix b/nixpkgs/pkgs/development/python-modules/stem/default.nix
new file mode 100644
index 000000000000..8cd6ff3f3d6e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stem/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, cryptography
+, mock
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "stem";
+  version = "1.8.2";
+
+  disabled = pythonOlder "3.6";
+
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "torproject";
+    repo = "stem";
+    rev = "refs/tags/${version}";
+    hash = "sha256-9BXeE/sVa13jr8G060aWjc49zgDVBhjaR6nt4lSxc0g=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    cryptography
+    mock
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    ${python.interpreter} run_tests.py --unit
+
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    changelog = "https://github.com/torproject/stem/blob/${src.rev}/docs/change_log.rst";
+    description = "Controller library that allows applications to interact with Tor";
+    downloadPage = "https://github.com/torproject/stem";
+    homepage = "https://stem.torproject.org/";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stemming/default.nix b/nixpkgs/pkgs/development/python-modules/stemming/default.nix
new file mode 100644
index 000000000000..b0e9ce0c4453
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stemming/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+}:
+let
+  pname = "stemming";
+  version = "1.0.1";
+in
+buildPythonPackage {
+  inherit version pname;
+  format = "setuptools";
+
+  # Pypi source package doesn't contain tests
+  src = fetchFromGitHub {
+    owner = "nmstoker";
+    repo = pname;
+    rev = "477d0e354e79843f5ec241ba3603bcb5b843c3c4";
+    hash = "sha256-wnmBCbxnCZ9mN1J7sLcN7OynMcvqgAnhEgpAwW2/xz4=";
+  };
+
+  disabled = pythonOlder "3.7";
+
+  pythonImportsCheck = [ "stemming" ];
+
+  meta = with lib; {
+    description = "Python implementations of various stemming algorithms.";
+    homepage = "https://github.com/nmstoker/stemming";
+    license = licenses.unlicense;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stestr/default.nix b/nixpkgs/pkgs/development/python-modules/stestr/default.nix
new file mode 100644
index 000000000000..afce80b83c34
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stestr/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cliff
+, fixtures
+, future
+, pbr
+, subunit
+, testtools
+, voluptuous
+, callPackage
+}:
+
+buildPythonPackage rec {
+  pname = "stestr";
+  version = "4.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wsHHO/x8/KORJxWeP7x0GTrr8s0C2KBCfy5YZI42zyY=";
+  };
+
+  postPatch = ''
+    # only a small portion of the listed packages are actually needed for running the tests
+    # so instead of removing them one by one remove everything
+    rm test-requirements.txt
+  '';
+
+  propagatedBuildInputs = [
+    cliff
+    fixtures
+    future
+    pbr
+    subunit
+    testtools
+    voluptuous
+  ];
+
+  # check in passthru.tests.pytest to escape infinite recursion with other oslo components
+  doCheck = false;
+
+  passthru.tests = {
+    tests = callPackage ./tests.nix { };
+  };
+
+  pythonImportsCheck = [ "stestr" ];
+
+  meta = with lib; {
+    description = "A parallel Python test runner built around subunit";
+    homepage = "https://github.com/mtreinish/stestr";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stestr/tests.nix b/nixpkgs/pkgs/development/python-modules/stestr/tests.nix
new file mode 100644
index 000000000000..f4964fa8f66e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stestr/tests.nix
@@ -0,0 +1,30 @@
+{  buildPythonPackage
+, stestr
+}:
+
+buildPythonPackage {
+  pname = "stestr-tests";
+  inherit (stestr) version src;
+  format = "other";
+
+  postPatch = ''
+    # only a small portion of the listed packages are actually needed for running the tests
+    # so instead of removing them one by one remove everything
+    rm test-requirements.txt
+  '';
+
+  dontBuild = true;
+  dontInstall = true;
+  preConfigure = ''
+    pythonOutputDistPhase() { touch $dist; }
+  '';
+
+  nativeCheckInputs = [
+    stestr
+  ];
+
+  checkPhase = ''
+    export PATH=$out/bin:$PATH
+    export HOME=$TMPDIR
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stevedore/default.nix b/nixpkgs/pkgs/development/python-modules/stevedore/default.nix
new file mode 100644
index 000000000000..45a3e744f1ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stevedore/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, importlib-metadata
+, pbr
+, setuptools
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "stevedore";
+  version = "5.1.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-pUU0rPm4m8ftJkgHATtQW/B/dNvkvPo30yvQY4cLCHw=";
+  };
+
+  propagatedBuildInputs = [
+    pbr
+    setuptools
+    six
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  doCheck = false;
+  pythonImportsCheck = [ "stevedore" ];
+
+  meta = with lib; {
+    description = "Manage dynamic plugins for Python applications";
+    homepage = "https://docs.openstack.org/stevedore/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stickytape/default.nix b/nixpkgs/pkgs/development/python-modules/stickytape/default.nix
new file mode 100644
index 000000000000..c3c9d4423fd0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stickytape/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+, pytestCheckHook
+, pythonOlder
+, spur
+}:
+
+buildPythonPackage rec {
+  pname = "stickytape";
+  version = "0.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.4";
+
+  src = fetchFromGitHub {
+    owner = "mwilliamson";
+    repo = pname;
+    rev = version;
+    hash = "sha256-KOZN9oxPb91l8QVU07I49UMNXqox8j+oekA1fMtj6l8=";
+  };
+
+  # Tests have additional requirements
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "stickytape"
+  ];
+
+  meta = with lib; {
+    description = "Python module to convert Python packages into a single script";
+    homepage = "https://github.com/mwilliamson/stickytape";
+    license = with licenses; [ bsd2 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stim/default.nix b/nixpkgs/pkgs/development/python-modules/stim/default.nix
new file mode 100644
index 000000000000..734a3b3c9ff1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stim/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, pkgs
+, buildPythonPackage
+, pythonOlder
+, pytestCheckHook
+, pytest-xdist
+, fetchFromGitHub
+, numpy
+, pybind11
+, cirq-core
+, matplotlib
+, networkx
+, scipy
+, setuptools
+, wheel
+, pandas
+}:
+
+buildPythonPackage rec {
+  pname = "stim";
+  version = "1.9.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = pkgs.fetchFromGitHub {
+    owner = "quantumlib";
+    repo = "Stim";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-zXWdJjFkf74FCWxyVMF8dx0P8GmUkuHFxUo5wYNU2o0=";
+  };
+
+  postPatch = ''
+    # asked to relax this in https://github.com/quantumlib/Stim/issues/623
+    substituteInPlace pyproject.toml \
+      --replace "pybind11==" "pybind11>="
+  '';
+
+  nativeBuildInputs = [
+    pybind11
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-xdist
+
+    cirq-core
+    matplotlib
+    networkx
+    scipy
+    pandas
+  ];
+
+  meta = {
+    description = "A tool for high performance simulation and analysis of quantum stabilizer circuits, especially quantum error correction (QEC) circuits.";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ chrispattison ];
+    homepage = "https://github.com/quantumlib/stim";
+  };
+
+  pythonImportsCheck = [ "stim" ];
+
+  enableParallelBuilding = true;
+
+  disabledTestPaths = [
+    # No pymatching
+    "glue/sample/src/sinter/main_test.py"
+    "glue/sample/src/sinter/decoding_test.py"
+    "glue/sample/src/sinter/predict_test.py"
+    "glue/sample/src/sinter/collection_test.py"
+    "glue/sample/src/sinter/collection_work_manager.py"
+    "glue/sample/src/sinter/worker_test.py"
+  ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stix2-patterns/default.nix b/nixpkgs/pkgs/development/python-modules/stix2-patterns/default.nix
new file mode 100644
index 000000000000..3817a96fe99c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stix2-patterns/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, antlr4-python3-runtime
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, pytestCheckHook
+, wheel
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "stix2-patterns";
+  version = "2.0.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "oasis-open";
+    repo = "cti-pattern-validator";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-lFgnvI5a7U7/Qj4Pqjr3mx4TNDnC2/Ru7tVG7VggR7Y=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "antlr4-python3-runtime~=" "antlr4-python3-runtime>="
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    antlr4-python3-runtime
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "stix2patterns"
+  ];
+
+  disabledTestPaths = [
+    # Exception: Could not deserialize ATN with version  (expected 4)
+    "stix2patterns/test/v20/test_inspector.py"
+    "stix2patterns/test/v21/test_inspector.py"
+    "stix2patterns/test/v20/test_validator.py"
+    "stix2patterns/test/v21/test_validator.py"
+  ];
+
+  meta = with lib; {
+    description = "Validate patterns used to express cyber observable content in STIX Indicators";
+    homepage = "https://github.com/oasis-open/cti-pattern-validator";
+    changelog = "https://github.com/oasis-open/cti-pattern-validator/blob/${version}/CHANGELOG.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stm32loader/default.nix b/nixpkgs/pkgs/development/python-modules/stm32loader/default.nix
new file mode 100644
index 000000000000..f79caf582f93
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stm32loader/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, isPy27
+, fetchPypi
+, progress
+, pyserial
+, pytest
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "stm32loader";
+  version = "0.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0135qzxlrivvkq6wgkw7shfz94n755qs2c1754p1hc2jk0nqayrg";
+  };
+
+  propagatedBuildInputs = [ progress pyserial ];
+
+  nativeCheckInputs = [ pytest ] ++ lib.optional isPy27 mock;
+
+  checkPhase = ''
+    pytest --strict tests/unit
+  '';
+
+  meta = with lib; {
+    description = "Flash firmware to STM32 microcontrollers in Python";
+    homepage = "https://github.com/florisla/stm32loader";
+    changelog = "https://github.com/florisla/stm32loader/blob/v${version}/CHANGELOG.md";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ emily ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stone/default.nix b/nixpkgs/pkgs/development/python-modules/stone/default.nix
new file mode 100644
index 000000000000..a0d07fa51542
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stone/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, ply
+, pytestCheckHook
+, six
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "stone";
+  version = "3.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dropbox";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-0FWdYbv+paVU3Wj6g9OrSNUB0pH8fLwTkhVIBPeFB/U=";
+  };
+
+  postPatch = ''
+    # https://github.com/dropbox/stone/issues/288
+    substituteInPlace stone/frontend/ir_generator.py \
+      --replace "inspect.getargspec" "inspect.getfullargspec"
+    substituteInPlace setup.py \
+      --replace "'pytest-runner == 5.2.0'," ""
+  '';
+
+  propagatedBuildInputs = [
+    ply
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+  ];
+
+  disabledTests = [
+    "test_type_name_with_module"
+  ];
+
+  pythonImportsCheck = [
+    "stone"
+  ];
+
+  meta = with lib; {
+    description = "Official Api Spec Language for Dropbox";
+    homepage = "https://github.com/dropbox/stone";
+    changelog = "https://github.com/dropbox/stone/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stookalert/default.nix b/nixpkgs/pkgs/development/python-modules/stookalert/default.nix
new file mode 100644
index 000000000000..82552ca44bb3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stookalert/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "stookalert";
+  version = "0.1.4";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "38c479e2fb7668f9b37aff0f9ffdd7bfd1ee9393528f2d3d36b5911b40da70a1";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "stookalert" ];
+
+  meta = {
+    description = "Python package for the RIVM Stookalert";
+    homepage = "https://github.com/fwestenberg/stookalert";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stopit/default.nix b/nixpkgs/pkgs/development/python-modules/stopit/default.nix
new file mode 100644
index 000000000000..7fdb46764e6b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stopit/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+
+}:
+
+buildPythonPackage rec {
+  pname = "stopit";
+  version = "1.1.2";
+
+  # tests are missing from the PyPi tarball
+  src = fetchFromGitHub {
+    owner = "glenfant";
+    repo = pname;
+    rev = version;
+    hash = "sha256-uXJUA70JOGWT2NmS6S7fPrTWAJZ0mZ/hICahIUzjfbw=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools # for pkg_resources
+  ];
+
+  pythonImportsCheck = [ "stopit" ];
+
+  meta = with lib; {
+    description = "Raise asynchronous exceptions in other thread, control the timeout of blocks or callables with a context manager or a decorator";
+    homepage = "https://github.com/glenfant/stopit";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stransi/default.nix b/nixpkgs/pkgs/development/python-modules/stransi/default.nix
new file mode 100644
index 000000000000..5b2802ea1afe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stransi/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, hypothesis
+, pytestCheckHook
+, ochre
+}:
+
+buildPythonPackage rec {
+  pname = "stransi";
+  version = "0.3.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "getcuia";
+    repo = "stransi";
+    rev = "v${version}";
+    hash = "sha256-PDMel6emra5bzX+FwHvUVpFu2YkRKy31UwkCL4sGJ14=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  propagatedBuildInputs = [
+    ochre
+  ];
+
+  pythonImportsCheck = [ "stransi" ];
+
+  meta = with lib; {
+    description = "A lightweight Python parser library for ANSI escape code sequences";
+    homepage = "https://github.com/getcuia/stransi";
+    changelog = "https://github.com/getcuia/stransi/releases/tag/${src.rev}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/strategies/default.nix b/nixpkgs/pkgs/development/python-modules/strategies/default.nix
new file mode 100644
index 000000000000..f11ce2ce5c8f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/strategies/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi
+, multipledispatch, toolz
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "strategies";
+  version = "0.2.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "02i4ydrs9k61p8iv2vl2akks8p9gc88rw8031wlwb1zqsyjmb328";
+  };
+
+  propagatedBuildInputs = [ multipledispatch toolz ];
+  nativeCheckInputs = [ pytest ];
+
+  meta = {
+    description = "A Python library for control flow programming";
+    homepage    = "https://github.com/logpy/strategies";
+    license     = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ suhr ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stravalib/default.nix b/nixpkgs/pkgs/development/python-modules/stravalib/default.nix
new file mode 100644
index 000000000000..df64dbebab50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stravalib/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, setuptools
+, setuptools-scm
+, wheel
+, arrow
+, requests
+, units
+, pint
+, pydantic
+, pytz
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "stravalib";
+  version = "1.5";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-OEdMRg3KjUrXt/CgJgsUqa/sVFAE0JONNZg5MBKtxmY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  nativeCheckInputs = [
+    nose
+  ];
+
+  propagatedBuildInputs = [
+    arrow
+    requests
+    units
+    pint
+    pydantic
+    pytz
+    six
+  ];
+
+  # tests require network access
+  # testing strava api
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python library for interacting with Strava v3 REST API";
+    homepage = "https://github.com/stravalib/stravalib";
+    license = licenses.asl20;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/strawberry-graphql/default.nix b/nixpkgs/pkgs/development/python-modules/strawberry-graphql/default.nix
new file mode 100644
index 000000000000..895471333802
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/strawberry-graphql/default.nix
@@ -0,0 +1,186 @@
+{ lib
+, aiohttp
+, asgiref
+, buildPythonPackage
+, chalice
+, channels
+, click
+, daphne
+, django
+, email-validator
+, fastapi
+, fetchFromGitHub
+, fetchpatch
+, flask
+, freezegun
+, graphql-core
+, libcst
+, opentelemetry-api
+, opentelemetry-sdk
+, poetry-core
+, pydantic
+, pygments
+, pyinstrument
+, pytest-aiohttp
+, pytest-asyncio
+, pytest-django
+, pytest-emoji
+, pytest-flask
+, pytest-mock
+, pytest-snapshot
+, pytestCheckHook
+, python-dateutil
+, python-multipart
+, pythonOlder
+, rich
+, sanic
+, sanic-testing
+, starlette
+, typing-extensions
+, uvicorn
+}:
+
+buildPythonPackage rec {
+  pname = "strawberry-graphql";
+  version = "0.215.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "strawberry-graphql";
+    repo = "strawberry";
+    rev = "refs/tags/${version}";
+    hash = "sha256-7jWG9bk7NN3BhpzS2fi7OkAsxL0446hnqiNqhwiBGHc=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # https://github.com/strawberry-graphql/strawberry/pull/2199
+      name = "switch-to-poetry-core.patch";
+      url = "https://github.com/strawberry-graphql/strawberry/commit/710bb96f47c244e78fc54c921802bcdb48f5f421.patch";
+      hash = "sha256-ekUZ2hDPCqwXp9n0YjBikwSkhCmVKUzQk7LrPECcD7Y=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--emoji --mypy-ini-file=mypy.ini" "" \
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    graphql-core
+    python-dateutil
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = {
+    aiohttp = [
+      aiohttp
+      pytest-aiohttp
+    ];
+    asgi = [
+      starlette
+      python-multipart
+    ];
+    debug = [
+      rich
+      libcst
+    ];
+    debug-server = [
+      click
+      libcst
+      pygments
+      python-multipart
+      rich
+      starlette
+      uvicorn
+    ];
+    django = [
+      django
+      pytest-django
+      asgiref
+    ];
+    channels = [
+      channels
+      asgiref
+    ];
+    flask = [
+      flask
+      pytest-flask
+    ];
+    opentelemetry = [
+      opentelemetry-api
+      opentelemetry-sdk
+    ];
+    pydantic = [
+      pydantic
+    ];
+    sanic = [
+      sanic
+    ];
+    fastapi = [
+      fastapi
+      python-multipart
+    ];
+    chalice = [
+      chalice
+    ];
+    cli = [
+      click
+      pygments
+      rich
+      libcst
+    ];
+    # starlite = [
+    #   starlite
+    # ];
+    pyinstrument = [
+      pyinstrument
+    ];
+  };
+
+  nativeCheckInputs = [
+    daphne
+    email-validator
+    freezegun
+    pytest-asyncio
+    pytest-emoji
+    pytest-mock
+    pytest-snapshot
+    pytestCheckHook
+    sanic-testing
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "strawberry"
+  ];
+
+  disabledTestPaths = [
+    "tests/benchmarks/"
+    "tests/cli/"
+    "tests/django/test_dataloaders.py"
+    "tests/exceptions/"
+    "tests/http/"
+    "tests/mypy/test_plugin.py" # avoid dependency on mypy
+    "tests/schema/extensions/"
+    "tests/schema/test_dataloaders.py"
+    "tests/schema/test_lazy/"
+    "tests/starlite/"
+    "tests/test_dataloaders.py"
+    "tests/utils/test_pretty_print.py"
+    "tests/websockets/test_graphql_transport_ws.py"
+  ];
+
+  meta = with lib; {
+    description = "A GraphQL library for Python that leverages type annotations";
+    homepage = "https://strawberry.rocks";
+    changelog = "https://github.com/strawberry-graphql/strawberry/blob/${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ izorkin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/streamdeck/default.nix b/nixpkgs/pkgs/development/python-modules/streamdeck/default.nix
new file mode 100644
index 000000000000..8354b840238f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/streamdeck/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, substituteAll
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "streamdeck";
+  version = "0.9.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-aVmWbrBhZ49NfwOp23FD1dxZF+w/q26fIOVs7iQXUxo=";
+  };
+
+  patches = [
+    # substitute libusb path
+    (substituteAll {
+      src = ./hardcode-libusb.patch;
+      libusb = "${pkgs.hidapi}/lib/libhidapi-libusb${stdenv.hostPlatform.extensions.sharedLibrary}";
+    })
+  ];
+
+  pythonImportsCheck = [ "StreamDeck" ];
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python library to control the Elgato Stream Deck";
+    homepage = "https://github.com/abcminiuser/python-elgato-streamdeck";
+    license = licenses.mit;
+    maintainers = with maintainers; [ majiir ];
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/streamdeck/hardcode-libusb.patch b/nixpkgs/pkgs/development/python-modules/streamdeck/hardcode-libusb.patch
new file mode 100644
index 000000000000..a8b7e0083e5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/streamdeck/hardcode-libusb.patch
@@ -0,0 +1,13 @@
+diff --git a/src/StreamDeck/Transport/LibUSBHIDAPI.py b/src/StreamDeck/Transport/LibUSBHIDAPI.py
+index 824c59c..f13754e 100644
+--- a/src/StreamDeck/Transport/LibUSBHIDAPI.py
++++ b/src/StreamDeck/Transport/LibUSBHIDAPI.py
+@@ -110,7 +110,7 @@ class LibUSBHIDAPI(Transport):
+ 

+             search_library_names = {

+                 "Windows": ["hidapi.dll", "libhidapi-0.dll", "./hidapi.dll"],

+-                "Linux": ["libhidapi-libusb.so", "libhidapi-libusb.so.0"],

++                "Linux": ["@libusb@"],

+                 "Darwin": ["libhidapi.dylib"],

+             }

+ 

diff --git a/nixpkgs/pkgs/development/python-modules/streaming-form-data/default.nix b/nixpkgs/pkgs/development/python-modules/streaming-form-data/default.nix
new file mode 100644
index 000000000000..f3aa0aa28116
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/streaming-form-data/default.nix
@@ -0,0 +1,37 @@
+{ lib, fetchFromGitHub, buildPythonPackage, pythonOlder,
+cython, smart-open, pytestCheckHook, moto, requests-toolbelt }:
+
+buildPythonPackage rec {
+  pname = "streaming-form-data";
+  version = "1.13.0";
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "siddhantgoel";
+    repo = "streaming-form-data";
+    rev = "v${version}";
+    hash = "sha256-Ntiad5GZtfRd+2uDPgbDzLBzErGFroffK6ZAmMcsfXA=";
+  };
+
+  nativeBuildInputs = [ cython ];
+
+  propagatedBuildInputs = [ smart-open ];
+
+  nativeCheckInputs = [ pytestCheckHook moto requests-toolbelt ];
+
+  pytestFlagsArray = [ "tests" ];
+
+  pythonImportsCheck = [ "streaming_form_data" ];
+
+  preCheck = ''
+    # remove in-tree copy to make pytest find the installed one, with the native parts already built
+    rm -rf streaming_form_data
+  '';
+
+  meta = with lib; {
+    description = "Streaming parser for multipart/form-data";
+    homepage = "https://github.com/siddhantgoel/streaming-form-data";
+    license = licenses.mit;
+    maintainers = with maintainers; [ zhaofengli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/streamlabswater/default.nix b/nixpkgs/pkgs/development/python-modules/streamlabswater/default.nix
new file mode 100644
index 000000000000..68f6011edcf4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/streamlabswater/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "streamlabswater";
+  version = "1.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-kXG0Wg3PVryMBQ9RMMtEzudMiwVQq7Ikw2OK7JcBojA=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "streamlabswater" ];
+
+  meta = with lib; {
+    description = "Python library for the StreamLabs API";
+    homepage = "https://github.com/streamlabswater/stream-python";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/streamlit/default.nix b/nixpkgs/pkgs/development/python-modules/streamlit/default.nix
new file mode 100644
index 000000000000..73c36577413a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/streamlit/default.nix
@@ -0,0 +1,95 @@
+{ lib
+, stdenv
+, altair
+, blinker
+, buildPythonPackage
+, cachetools
+, click
+, fetchPypi
+, gitpython
+, importlib-metadata
+, numpy
+, packaging
+, pandas
+, pillow
+, protobuf
+, pyarrow
+, pydeck
+, pympler
+, python-dateutil
+, pythonOlder
+, setuptools
+, requests
+, rich
+, tenacity
+, toml
+, tornado
+, typing-extensions
+, tzlocal
+, validators
+, watchdog
+}:
+
+buildPythonPackage rec {
+  pname = "streamlit";
+  version = "1.28.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wUQWiIG/e9bWAXqb/eWFtS0gCHsQstXIXTdu9tUqqO4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    altair
+    blinker
+    cachetools
+    click
+    gitpython
+    importlib-metadata
+    numpy
+    packaging
+    pandas
+    pillow
+    protobuf
+    pyarrow
+    pydeck
+    pympler
+    python-dateutil
+    requests
+    rich
+    tenacity
+    toml
+    tornado
+    typing-extensions
+    tzlocal
+    validators
+  ] ++ lib.optionals (!stdenv.isDarwin) [
+    watchdog
+  ];
+
+  # pypi package does not include the tests, but cannot be built with fetchFromGitHub
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "streamlit"
+  ];
+
+  postInstall = ''
+    rm $out/bin/streamlit.cmd # remove windows helper
+  '';
+
+  meta = with lib; {
+    homepage = "https://streamlit.io/";
+    changelog = "https://github.com/streamlit/streamlit/releases/tag/${version}";
+    description = "The fastest way to build custom ML tools";
+    maintainers = with maintainers; [ natsukium yrashk ];
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/streamz/default.nix b/nixpkgs/pkgs/development/python-modules/streamz/default.nix
new file mode 100644
index 000000000000..ff12abf47ae3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/streamz/default.nix
@@ -0,0 +1,83 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, confluent-kafka
+, distributed
+, fetchpatch
+, fetchPypi
+, flaky
+, graphviz
+, networkx
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, requests
+, six
+, toolz
+, tornado
+, zict
+}:
+
+buildPythonPackage rec {
+  pname = "streamz";
+  version = "0.6.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VXfWkEwuxInBQVQJV3IQXgGVRkiBmYfUZCBMbjyWNPM=";
+  };
+
+  propagatedBuildInputs = [
+    networkx
+    six
+    toolz
+    tornado
+    zict
+  ];
+
+  nativeCheckInputs = [
+    confluent-kafka
+    distributed
+    flaky
+    graphviz
+    pytest-asyncio
+    pytestCheckHook
+    requests
+  ];
+
+  pythonImportsCheck = [
+    "streamz"
+  ];
+
+  disabledTests = [
+    # Error with distutils version: fixture 'cleanup' not found
+    "test_separate_thread_without_time"
+    "test_await_syntax"
+    "test_partition_then_scatter_sync"
+    "test_sync"
+    "test_sync_2"
+    # Test fail in the sandbox
+    "test_tcp_async"
+    "test_tcp"
+    "test_partition_timeout"
+    # Tests are flaky
+    "test_from_iterable"
+    "test_buffer"
+  ];
+
+  disabledTestPaths = [
+    # Disable kafka tests
+    "streamz/tests/test_kafka.py"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Pipelines to manage continuous streams of data";
+    homepage = "https://github.com/python-streamz/streamz";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/strenum/default.nix b/nixpkgs/pkgs/development/python-modules/strenum/default.nix
new file mode 100644
index 000000000000..b7d2661ce2c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/strenum/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "strenum";
+  version = "0.4.15";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "irgeek";
+    repo = "StrEnum";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-LrDLIWiV/zIbl7CwKh7DAy4LoLyY7+hfUu8nqduclnA=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner"' ""
+    substituteInPlace pytest.ini \
+      --replace " --cov=strenum --cov-report term-missing --black --pylint" ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "strenum"
+  ];
+
+  meta = with lib; {
+    description = "MOdule for enum that inherits from str";
+    homepage = "https://github.com/irgeek/StrEnum";
+    changelog = "https://github.com/irgeek/StrEnum/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/strict-rfc3339/default.nix b/nixpkgs/pkgs/development/python-modules/strict-rfc3339/default.nix
new file mode 100644
index 000000000000..e76365a525ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/strict-rfc3339/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "strict-rfc3339";
+  version = "0.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5cad17bedfc3af57b399db0fed32771f18fc54bbd917e85546088607ac5e1277";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/danielrichman/strict-rfc3339";
+    license = licenses.gpl3;
+    description = "Strict, simple, lightweight RFC3339 functions";
+    maintainers = with maintainers; [ vanschelven ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/strictyaml/default.nix b/nixpkgs/pkgs/development/python-modules/strictyaml/default.nix
new file mode 100644
index 000000000000..d9d57faf48f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/strictyaml/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, ruamel-yaml
+, python-dateutil
+}:
+
+buildPythonPackage rec {
+  pname = "strictyaml";
+  version = "1.7.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-IvhUpfyrQrXduoAwoOS+UcqJrwJnlhyNbPqGOVWGxAc=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "ruamel.yaml==0.17.4" "ruamel.yaml"
+  '';
+
+  propagatedBuildInputs = [
+    ruamel-yaml
+    python-dateutil
+  ];
+
+  # Library tested with external tool
+  # https://hitchdev.com/approach/contributing-to-hitch-libraries/
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "strictyaml"
+  ];
+
+  meta = with lib; {
+    description = "Strict, typed YAML parser";
+    homepage = "https://hitchdev.com/strictyaml/";
+    changelog = "https://hitchdev.com/strictyaml/changelog/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stringcase/default.nix b/nixpkgs/pkgs/development/python-modules/stringcase/default.nix
new file mode 100644
index 000000000000..e02cc0384f9a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stringcase/default.nix
@@ -0,0 +1,22 @@
+{ buildPythonPackage, fetchPypi, lib
+}:
+
+buildPythonPackage rec {
+  pname = "stringcase";
+  version = "1.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "023hv3gknblhf9lx5kmkcchzmbhkdhmsnknkv7lfy20rcs06k828";
+  };
+
+  # PyPi package does not include tests.
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/okunishinishi/python-stringcase";
+    description = "Convert string cases between camel case, pascal case, snake case etc…";
+    license = licenses.mit;
+    maintainers = with maintainers; [ alunduil ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stringly/default.nix b/nixpkgs/pkgs/development/python-modules/stringly/default.nix
new file mode 100644
index 000000000000..777fc11ed37f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stringly/default.nix
@@ -0,0 +1,28 @@
+{ lib , python, buildPythonPackage , fetchPypi, typing-extensions }:
+
+buildPythonPackage rec {
+  pname = "stringly";
+  version = "1.0b2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "09fi9dgf27v4qi0mwwms7hpwim9qpyalckd66p7nlmfp6c8bzppq";
+  };
+
+  pythonImportsCheck = [ "stringly" ];
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest
+  '';
+
+  meta = with lib; {
+    description = "Stringly: Human Readable Object Serialization";
+    homepage = "https://github.com/evalf/stringly";
+    license = licenses.mit;
+    maintainers = [ maintainers.Scriptkiddi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stringparser/default.nix b/nixpkgs/pkgs/development/python-modules/stringparser/default.nix
new file mode 100644
index 000000000000..44e6d6baa52f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stringparser/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "stringparser";
+  version = "0.7";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "hgrecco";
+    repo = "stringparser";
+    rev = "refs/tags/${version}";
+    hash = "sha256-gj0ooeb869JhlB9Mf5nBydiV2thTes8ys+BLJ516iSA=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "stringparser"
+  ];
+
+  meta = with lib; {
+    description = "Easy to use pattern matching and information extraction";
+    homepage = "https://github.com/hgrecco/stringparser";
+    changelog = "https://github.com/hgrecco/stringparser/blob/${version}/CHANGES";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ evilmav ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stripe/default.nix b/nixpkgs/pkgs/development/python-modules/stripe/default.nix
new file mode 100644
index 000000000000..3f91435b3aa7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stripe/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+, setuptools
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "stripe";
+  version = "7.5.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-duDfcHHaXvORNNkpuMf6zxMZqkfCIr8ScrSKxVq/PW8=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    typing-extensions
+  ];
+
+  # Tests require network connectivity and there's no easy way to disable them
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "stripe"
+  ];
+
+  meta = with lib; {
+    description = "Stripe Python bindings";
+    homepage = "https://github.com/stripe/stripe-python";
+    changelog = "https://github.com/stripe/stripe-python/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/striprtf/default.nix b/nixpkgs/pkgs/development/python-modules/striprtf/default.nix
new file mode 100644
index 000000000000..95814c1c0603
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/striprtf/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "striprtf";
+  version = "0.0.26";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/bK7p6xEAHLRxB6rUNjXSuiPYKi2V1xuLHgF3EYgk6o=";
+  };
+
+  pythonImportsCheck = [
+    "striprtf"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/joshy/striprtf/blob/v${version}/CHANGELOG.md";
+    homepage = "https://github.com/joshy/striprtf";
+    description = "A simple library to convert rtf to text";
+    maintainers = with maintainers; [ aanderse ];
+    license = with licenses; [ bsd3 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/structlog/default.nix b/nixpkgs/pkgs/development/python-modules/structlog/default.nix
new file mode 100644
index 000000000000..20d1ba2c0a56
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/structlog/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, freezegun
+, hatch-fancy-pypi-readme
+, hatch-vcs
+, hatchling
+, pretend
+, pytest-asyncio
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, simplejson
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "structlog";
+  version = "23.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "hynek";
+    repo = "structlog";
+    rev = "refs/tags/${version}";
+    hash = "sha256-KSHKgkv+kObKCdWZDg5o6QYe0AMND9VLdEuseY/GyDY=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    hatch-fancy-pypi-readme
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    pretend
+    pytest-asyncio
+    pytestCheckHook
+    simplejson
+  ];
+
+  pythonImportsCheck = [
+    "structlog"
+  ];
+
+  meta = with lib; {
+    description = "Painless structural logging";
+    homepage = "https://github.com/hynek/structlog";
+    changelog = "https://github.com/hynek/structlog/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stubserver/default.nix b/nixpkgs/pkgs/development/python-modules/stubserver/default.nix
new file mode 100644
index 000000000000..87b9cd988cce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stubserver/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "stubserver";
+  version = "1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-j9R7wpvb07FuN5EhIpE7xTSf26AniQZN4iLpxMjNYKA=";
+  };
+
+  # Tests are not shipped and the source not tagged
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "stubserver"
+  ];
+
+  meta = with lib; {
+    description = "Web and FTP server for use in unit and7or acceptance tests";
+    homepage = "https://github.com/tarttelin/Python-Stub-Server";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stumpy/default.nix b/nixpkgs/pkgs/development/python-modules/stumpy/default.nix
new file mode 100644
index 000000000000..491af1105dae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stumpy/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, scipy
+, numba
+, pandas
+, dask
+, distributed
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "stumpy";
+  version = "1.12.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "TDAmeritrade";
+    repo = "stumpy";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-rVl3tIx8iWx2mnaix3V5YnfWWdPBTP8+K2JJKTfctDA=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    numba
+  ];
+
+  nativeCheckInputs = [
+    pandas
+    dask
+    distributed
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "stumpy"
+  ];
+
+  pytestFlagsArray = [
+    # whole testsuite is very CPU intensive, only run core tests
+    # TODO: move entire test suite to passthru.tests
+    "tests/test_core.py"
+  ];
+
+  meta = with lib; {
+    description = "Library that can be used for a variety of time series data mining tasks";
+    homepage = "https://github.com/TDAmeritrade/stumpy";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stups-cli-support/default.nix b/nixpkgs/pkgs/development/python-modules/stups-cli-support/default.nix
new file mode 100644
index 000000000000..1ec1bb017dfa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stups-cli-support/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, clickclick
+, dnspython
+, requests
+, pytest
+, pytest-cov
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "stups-cli-support";
+  version = "1.1.20";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "zalando-stups";
+    repo = "stups-cli-support";
+    rev = version;
+    sha256 = "1r6g29gd009p87m8a6wv4rzx7f0564zdv67qz5xys4wsgvc95bx0";
+  };
+
+  propagatedBuildInputs = [
+    clickclick
+    dnspython
+    requests
+  ];
+
+  preCheck = "export HOME=$TEMPDIR";
+
+  nativeCheckInputs = [
+    pytest
+    pytest-cov
+  ];
+
+  meta = with lib; {
+    description = "Helper library for all STUPS command line tools.";
+    homepage = "https://github.com/zalando-stups/stups-cli-support";
+    license = licenses.asl20;
+    maintainers = [ maintainers.mschuwalow ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stups-fullstop/default.nix b/nixpkgs/pkgs/development/python-modules/stups-fullstop/default.nix
new file mode 100644
index 000000000000..46b5f9046f60
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stups-fullstop/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, requests
+, stups-cli-support
+, stups-zign
+, pytest
+, pytest-cov
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "stups-fullstop";
+  version = "1.1.31";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "zalando-stups";
+    repo = "fullstop-cli";
+    rev = version;
+    sha256 = "1cpzz1b8g2mich7c1p74vfgw70vlxpgwi82a1ld82wv3srwqa0h3";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    stups-cli-support
+    stups-zign
+  ];
+
+  preCheck = "
+    export HOME=$TEMPDIR
+  ";
+
+  nativeCheckInputs = [
+    pytest
+    pytest-cov
+  ];
+
+  meta = with lib; {
+    description = "Convenience command line tool for fullstop. audit reporting.";
+    homepage = "https://github.com/zalando-stups/stups-fullstop-cli";
+    license = licenses.asl20;
+    maintainers = [ maintainers.mschuwalow ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stups-pierone/default.nix b/nixpkgs/pkgs/development/python-modules/stups-pierone/default.nix
new file mode 100644
index 000000000000..b99ac4cf520b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stups-pierone/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, requests
+, stups-cli-support
+, stups-zign
+, pytest
+, pytest-cov
+, hypothesis
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "stups-pierone";
+  version = "1.1.51";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "zalando-stups";
+    repo = "pierone-cli";
+    rev = version;
+    hash = "sha256-OypGYHfiFUfcUndylM2N2WfPnfXXJ4gvWypUbltYAYE=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    stups-cli-support
+    stups-zign
+  ];
+
+  preCheck = ''
+    export HOME=$TEMPDIR
+  '';
+
+  nativeCheckInputs = [
+    pytest
+    pytest-cov
+    hypothesis
+  ];
+
+  pythonImportsCheck = [
+    "pierone"
+  ];
+
+  meta = with lib; {
+    description = "Convenient command line client for STUPS' Pier One Docker registry";
+    homepage = "https://github.com/zalando-stups/pierone-cli";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ mschuwalow ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stups-tokens/default.nix b/nixpkgs/pkgs/development/python-modules/stups-tokens/default.nix
new file mode 100644
index 000000000000..8f046986a025
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stups-tokens/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, requests
+, mock
+, pytest
+, pytest-cov
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "stups-tokens";
+  version = "1.1.19";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "zalando-stups";
+    repo = "python-tokens";
+    rev = version;
+    sha256 = "09z3l3xzdlwpivbi141gk1k0zd9m75mjwbdy81zc386rr9k8s0im";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytest
+    pytest-cov
+  ];
+
+  meta = with lib; {
+    description = "A Python library that keeps OAuth 2.0 service access tokens in memory for your usage.";
+    homepage = "https://github.com/zalando-stups/python-tokens";
+    license = licenses.asl20;
+    maintainers = [ maintainers.mschuwalow ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stups-zign/default.nix b/nixpkgs/pkgs/development/python-modules/stups-zign/default.nix
new file mode 100644
index 000000000000..e9a1bad22e32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stups-zign/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, stups-tokens
+, stups-cli-support
+, pytest
+, pytest-cov
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "stups-zign";
+  version = "1.2";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "zalando-stups";
+    repo = "zign";
+    rev = version;
+    sha256 = "1vk6pnprnd5lfx96hc2c1n7kwh99f260r730x4y2h7lamlv82fh4";
+  };
+
+  patches = [
+    # pytest 5 is currently unsupported. Fetch and apply a pr that resolves this.
+    (fetchpatch {
+      url = "https://github.com/zalando-stups/zign/commit/50140720211e547b0e59f7ddb39a732f0cc73ad7.patch";
+      sha256 = "1zmyvg1z1asaqqsmxvsx0srvxd6gkgavppvg3dblxwhkml01awqk";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    stups-tokens
+    stups-cli-support
+  ];
+
+  preCheck = "
+    export HOME=$TEMPDIR
+  ";
+
+  nativeCheckInputs = [
+    pytest
+    pytest-cov
+  ];
+
+  meta = with lib; {
+    description = "OAuth2 token management command line utility.";
+    homepage = "https://github.com/zalando-stups/zign";
+    license = licenses.asl20;
+    maintainers = [ maintainers.mschuwalow ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/stytra/0000-workaround-pyqtgraph.patch b/nixpkgs/pkgs/development/python-modules/stytra/0000-workaround-pyqtgraph.patch
new file mode 100644
index 000000000000..ad0ecbb11301
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stytra/0000-workaround-pyqtgraph.patch
@@ -0,0 +1,26 @@
+diff --git a/stytra/gui/fishplots.py b/stytra/gui/fishplots.py
+index 49ef1fe..fd1cc50 100644
+--- a/stytra/gui/fishplots.py
++++ b/stytra/gui/fishplots.py
+@@ -13,7 +13,7 @@ from lightparam.gui import ParameterGui
+ from scipy.ndimage.filters import gaussian_filter1d
+ 
+ 
+-class StreamingPositionPlot(pg.GraphicsWindow):
++class StreamingPosition(pg.GraphicsView):
+     """Plot that displays the virtual position of the fish"""
+ 
+     def __init__(self, *args, data_accumulator, n_points=500, **kwargs):
+diff --git a/stytra/utilities.py b/stytra/utilities.py
+index f79c4db..feaa7ef 100644
+--- a/stytra/utilities.py
++++ b/stytra/utilities.py
+@@ -239,7 +239,7 @@ def recursive_update(d, u):
+     :return:
+     """
+     for k, v in u.items():
+-        if isinstance(v, collections.Mapping):
++        if isinstance(v, collections.ChainMap):
+             d[k] = recursive_update(d.get(k, {}), v)
+         else:
+             d[k] = v
diff --git a/nixpkgs/pkgs/development/python-modules/stytra/default.nix b/nixpkgs/pkgs/development/python-modules/stytra/default.nix
new file mode 100644
index 000000000000..821aaa41437c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/stytra/default.nix
@@ -0,0 +1,93 @@
+{ lib
+, anytree
+, arrayqueues
+, av
+, buildPythonPackage
+, colorspacious
+, fetchPypi
+, flammkuchen
+, git
+, gitpython
+, imageio
+, imageio-ffmpeg
+, lightparam
+, matplotlib
+, nose
+, numba
+, numpy
+, opencv4
+, pandas
+, pims
+, pyqt5
+, pyqtgraph
+, pyserial
+, pytestCheckHook
+, pythonOlder
+, qdarkstyle
+, qimage2ndarray
+, scikit-image
+, scipy
+, tables
+}:
+
+buildPythonPackage rec {
+  pname = "stytra";
+  version = "0.8.34";
+  pyproject = true;
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "aab9d07575ef599a9c0ae505656e3c03ec753462df3c15742f1f768f2b578f0a";
+  };
+
+  patches = [
+    # https://github.com/portugueslab/stytra/issues/87
+    ./0000-workaround-pyqtgraph.patch
+  ];
+
+  propagatedBuildInputs = [
+    opencv4
+    pyqt5
+    pyqtgraph
+    numpy
+    scipy
+    numba
+    pandas
+    tables
+    git
+    scikit-image
+    matplotlib
+    qdarkstyle
+    gitpython
+    anytree
+    qimage2ndarray
+    flammkuchen
+    pims
+    colorspacious
+    lightparam
+    imageio
+    imageio-ffmpeg
+    arrayqueues
+    av
+  ];
+
+  nativeCheckInputs = [
+    nose
+    pytestCheckHook
+    pyserial
+  ];
+
+  disabledTestPaths = [
+    # Crashes python
+    "stytra/tests/test_z_experiments.py"
+  ];
+
+  meta = with lib; {
+    description = "A modular package to control stimulation and track behaviour";
+    homepage = "https://github.com/portugueslab/stytra";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ tbenst ];
+    broken = true;  # incompatible with pyqtgraph>0.13.0: https://github.com/portugueslab/stytra/issues/87
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/subarulink/default.nix b/nixpkgs/pkgs/development/python-modules/subarulink/default.nix
new file mode 100644
index 000000000000..603acb73884b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/subarulink/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, stdiomask
+}:
+
+buildPythonPackage rec {
+  pname = "subarulink";
+  version = "0.7.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "G-Two";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-dRhZWV58tHoGpJ2bDWFov1timTHYnqTPILySauutyzg=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    stdiomask
+  ];
+
+  nativeCheckInputs = [
+    cryptography
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=subarulink" ""
+  '';
+
+  __darwinAllowLocalNetworking = true;
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  pythonImportsCheck = [
+    "subarulink"
+  ];
+
+  meta = with lib; {
+    description = "Python module for interacting with STARLINK-enabled vehicle";
+    homepage = "https://github.com/G-Two/subarulink";
+    changelog = "https://github.com/G-Two/subarulink/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/subliminal/default.nix b/nixpkgs/pkgs/development/python-modules/subliminal/default.nix
new file mode 100644
index 000000000000..0b6d801c8ed0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/subliminal/default.nix
@@ -0,0 +1,95 @@
+{ lib
+, appdirs
+, babelfish
+, beautifulsoup4
+, buildPythonPackage
+, chardet
+, click
+, dogpile-cache
+, enzyme
+, fetchFromGitHub
+, guessit
+, pysrt
+, pytestCheckHook
+, pythonOlder
+, pytz
+, rarfile
+, requests
+, six
+, stevedore
+, sympy
+, vcrpy
+}:
+
+buildPythonPackage rec {
+  pname = "subliminal";
+  version = "2.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Diaoul";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-P4gVxKKCGKS3MC4F3yTAaOSv36TtdoYfrf61tBHg8VY=";
+  };
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace " --pep8 --flakes" ""
+  '';
+
+  propagatedBuildInputs = [
+    appdirs
+    babelfish
+    beautifulsoup4
+    chardet
+    click
+    dogpile-cache
+    enzyme
+    guessit
+    pysrt
+    pytz
+    rarfile
+    requests
+    six
+    stevedore
+  ];
+
+  nativeCheckInputs = [
+    sympy
+    vcrpy
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "subliminal"
+  ];
+
+  disabledTests = [
+    # Tests rewuire network access
+    "test_refine_video_metadata"
+    "test_scan"
+    "test_hash"
+    "test_provider_pool_list_subtitles"
+    "test_async_provider_pool_list_subtitles"
+    "test_list_subtitles"
+    "test_download_bad_subtitle"
+    # Not implemented
+    "test_save_subtitles"
+  ];
+
+  disabledTestPaths = [
+    # AttributeError: module 'rarfile' has no attribute 'custom_check'
+    "tests/test_legendastv.py"
+  ];
+
+  meta = with lib; {
+    description = "Python library to search and download subtitles";
+    homepage = "https://github.com/Diaoul/subliminal";
+    changelog = "https://github.com/Diaoul/subliminal/blob/${version}/HISTORY.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/subprocess-tee/default.nix b/nixpkgs/pkgs/development/python-modules/subprocess-tee/default.nix
new file mode 100644
index 000000000000..462a0cd60b0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/subprocess-tee/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, pytestCheckHook
+, enrich
+}:
+
+buildPythonPackage rec {
+  pname = "subprocess-tee";
+  version = "0.4.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-s8EkmT+LiNHrHC/eC8IGl4fqxyC6iHccuhfoyTMkgl0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    enrich
+  ];
+
+  disabledTests = [
+    # cyclic dependency on `molecule` (see https://github.com/pycontribs/subprocess-tee/issues/50)
+    "test_molecule"
+    # duplicates in console output, rich issue
+    "test_rich_console_ex"
+  ];
+
+  pythonImportsCheck = [
+    "subprocess_tee"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pycontribs/subprocess-tee";
+    description = "A subprocess.run drop-in replacement that supports a tee mode";
+    license = licenses.mit;
+    maintainers = with maintainers; [ putchar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/subunit/default.nix b/nixpkgs/pkgs/development/python-modules/subunit/default.nix
new file mode 100644
index 000000000000..eb27ffdfb982
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/subunit/default.nix
@@ -0,0 +1,54 @@
+{ buildPythonPackage
+# pkgs dependencies
+, check
+, cppunit
+, pkg-config
+, subunit
+, pythonOlder
+
+# python dependencies
+, fixtures
+, hypothesis
+, pytestCheckHook
+, setuptools
+, testscenarios
+, testtools
+}:
+
+buildPythonPackage {
+  inherit (subunit) name src meta;
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "version=VERSION" 'version="${subunit.version}"'
+  '';
+
+  nativeBuildInputs = [
+    pkg-config
+    setuptools
+  ];
+
+  buildInputs = [ check cppunit ];
+  propagatedBuildInputs = [ testtools ];
+
+  nativeCheckInputs = [
+    testscenarios
+    hypothesis
+    fixtures
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "python/subunit"
+  ];
+
+  disabledTestPaths = [
+    # these tests require testtools and don't work with pytest
+    "python/subunit/tests/test_output_filter.py"
+    "python/subunit/tests/test_test_protocol.py"
+    "python/subunit/tests/test_test_protocol2.py"
+  ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/subunit2sql/default.nix b/nixpkgs/pkgs/development/python-modules/subunit2sql/default.nix
new file mode 100644
index 000000000000..2f29322b9a8a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/subunit2sql/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, oslo-concurrency
+, oslo-db
+, pbr
+, python-dateutil
+, stestr
+}:
+
+buildPythonPackage rec {
+  pname = "subunit2sql";
+  version = "1.10.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-c+Dg6moKiv30M0mmwGQSOEbc94gfH//ZnF7lnBgv8EU=";
+  };
+
+  propagatedBuildInputs = [
+    oslo-db
+    pbr
+    python-dateutil
+  ];
+
+  nativeCheckInputs = [
+    mock
+    oslo-concurrency
+    stestr
+  ];
+
+  checkPhase = ''
+    export PATH=$out/bin:$PATH
+    export HOME=$TMPDIR
+
+    stestr run -e <(echo "
+    subunit2sql.tests.db.test_api.TestDatabaseAPI.test_get_failing_test_ids_from_runs_by_key_value
+    subunit2sql.tests.db.test_api.TestDatabaseAPI.test_get_id_from_test_id
+    subunit2sql.tests.db.test_api.TestDatabaseAPI.test_get_test_run_dict_by_run_meta_key_value
+    subunit2sql.tests.migrations.test_migrations.TestWalkMigrations.test_sqlite_opportunistically
+    subunit2sql.tests.test_shell.TestMain.test_main
+    subunit2sql.tests.test_shell.TestMain.test_main_with_targets
+    ")
+  '';
+
+  pythonImportsCheck = [ "subunit2sql" ];
+
+  meta = with lib; {
+    description = "Command to Read a subunit file or stream and put the data in a SQL DB";
+    homepage = "https://opendev.org/opendev/subunit2sql";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/subzerod/default.nix b/nixpkgs/pkgs/development/python-modules/subzerod/default.nix
new file mode 100644
index 000000000000..5a3632336511
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/subzerod/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "subzerod";
+  version = "1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/7g8Upj9Hb4m83JXLI3X2lqa9faCt42LVxh+V9WpI68=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "subzerod"
+  ];
+
+  meta = with lib; {
+    description = "Python module to help with the enumeration of subdomains";
+    homepage = "https://github.com/sanderfoobar/subzerod";
+    license = with licenses; [ wtfpl ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/succulent/default.nix b/nixpkgs/pkgs/development/python-modules/succulent/default.nix
new file mode 100644
index 000000000000..e1ad7981b047
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/succulent/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flask
+, pandas
+, pyyaml
+, poetry-core
+, pytestCheckHook
+, pythonRelaxDepsHook
+, pythonOlder
+, toml-adapt
+}:
+
+buildPythonPackage rec {
+  pname = "succulent";
+  version = "0.2.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "firefly-cpp";
+    repo = "succulent";
+    rev = "refs/tags/${version}";
+    hash = "sha256-CGDgt6tv+KysrytJsgDKwf2yv6shXizvD67XsGBg+nI=";
+  };
+
+  pythonRelaxDeps = [
+    "flask"
+    "pandas"
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    flask
+    pandas
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "succulent"
+  ];
+
+  meta = with lib; {
+    description = "Collect POST requests";
+    homepage = "https://github.com/firefly-cpp/succulent";
+    changelog = "https://github.com/firefly-cpp/succulent/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ firefly-cpp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/summarytools/default.nix b/nixpkgs/pkgs/development/python-modules/summarytools/default.nix
new file mode 100644
index 000000000000..a46cf5080c7c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/summarytools/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, ipython
+, matplotlib
+, numpy
+, pandas
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "summarytools";
+  version = "0.2.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  # no version tags in GitHub repo
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wsDf9IXCMQe0cVfQQuRVwMhxkhhUxbPu06yWZPLvgw4=";
+  };
+
+  propagatedBuildInputs = [
+    ipython
+    matplotlib
+    numpy
+    pandas
+  ];
+
+  nativeCheckImports = [ pytestCheckHook ];
+  pythonImportsCheck = [ "summarytools" ];
+
+  meta = with lib; {
+    description = "Python port of the R summarytools package for summarizing dataframes";
+    homepage = "https://github.com/6chaoran/jupyter-summarytools";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sumo/default.nix b/nixpkgs/pkgs/development/python-modules/sumo/default.nix
new file mode 100644
index 000000000000..da7641c9d056
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sumo/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, cython
+, h5py
+, matplotlib
+, numpy
+, phonopy
+, pymatgen
+, scipy
+, seekpath
+, spglib
+, castepxbin
+, pytestCheckHook
+, colormath
+}:
+
+buildPythonPackage rec {
+  pname = "sumo";
+  version = "2.3.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "SMTG-UCL";
+    repo = "sumo";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-9NHz8SPymD9zANWMeajjavpjw68X4abqhrLl0dn92l0=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    castepxbin
+    colormath
+    h5py
+    matplotlib
+    numpy
+    phonopy
+    pymatgen
+    scipy
+    seekpath
+    spglib
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "sumo"
+  ];
+
+  meta = with lib; {
+    description = "Toolkit for plotting and analysis of ab initio solid-state calculation data";
+    homepage = "https://github.com/SMTG-UCL/sumo";
+    changelog = "https://github.com/SMTG-Bham/sumo/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sumtypes/default.nix b/nixpkgs/pkgs/development/python-modules/sumtypes/default.nix
new file mode 100644
index 000000000000..1b6f1c38e604
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sumtypes/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, attrs
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sumtypes";
+  version = "0.1a6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "radix";
+    repo = pname;
+    rev = version;
+    hash = "sha256-qwQyFKVnGEqHUqFmUSnHVvedsp2peM6rJZcS90paLOo=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Algebraic data types for Python";
+    homepage = "https://github.com/radix/sumtypes";
+    license = licenses.mit;
+    maintainers = with maintainers; [ NieDzejkob ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sunpy/default.nix b/nixpkgs/pkgs/development/python-modules/sunpy/default.nix
new file mode 100644
index 000000000000..a676f28d2758
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sunpy/default.nix
@@ -0,0 +1,164 @@
+{ lib
+, stdenv
+, asdf
+, astropy
+, astropy-extension-helpers
+, astropy-helpers
+, beautifulsoup4
+, buildPythonPackage
+, drms
+, fetchPypi
+, glymur
+, h5netcdf
+, hypothesis
+, lxml
+, matplotlib
+, numpy
+, pandas
+, parfive
+, pytest-astropy
+, pytestCheckHook
+, pytest-mock
+, python-dateutil
+, pythonOlder
+, scikit-image
+, scipy
+, setuptools-scm
+, sqlalchemy
+, tqdm
+, zeep
+}:
+
+buildPythonPackage rec {
+  pname = "sunpy";
+  version = "5.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7tmyywyfQw1T9qr5UbPH/KR+AmmhSaHunkeUGRKDl+Q=";
+  };
+
+  nativeBuildInputs = [
+    astropy-extension-helpers
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    astropy
+    astropy-helpers
+    numpy
+    parfive
+  ];
+
+  passthru.optional-dependencies = {
+    asdf = [
+      asdf
+      # asdf-astropy
+    ];
+    database = [
+      sqlalchemy
+    ];
+    image = [
+      scikit-image
+      scipy
+    ];
+    net = [
+      beautifulsoup4
+      drms
+      python-dateutil
+      tqdm
+      zeep
+    ];
+    jpeg2000 = [
+      glymur
+      lxml
+    ];
+    timeseries = [
+      # cdflib
+      h5netcdf
+      # h5py
+      matplotlib
+      pandas
+    ];
+  };
+
+  nativeCheckInputs = [
+    hypothesis
+    pytest-astropy
+    pytest-mock
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.asdf
+    ++ passthru.optional-dependencies.database
+    ++ passthru.optional-dependencies.image
+    ++ passthru.optional-dependencies.net
+    ++ passthru.optional-dependencies.timeseries;
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --dist no" ""
+  '';
+
+  # darwin has write permission issues
+  doCheck = stdenv.isLinux;
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  disabledTests = [
+    "rst"
+    "test_sunpy_warnings_logging"
+    "test_main_nonexisting_module"
+    "test_main_stdlib_module"
+    "test_find_dependencies"
+  ];
+
+  disabledTestPaths = [
+    # Tests are very slow
+    "sunpy/net/tests/test_fido.py"
+    # asdf.extensions plugin issue
+    "sunpy/io/special/asdf/resources/schemas/"
+    "sunpy/io/special/asdf/resources/manifests/sunpy-1.0.0.yaml"
+    # Requires mpl-animators package
+    "sunpy/map/tests/test_compositemap.py"
+    "sunpy/map/tests/test_mapbase.py"
+    "sunpy/map/tests/test_mapsequence.py"
+    "sunpy/map/tests/test_plotting.py"
+    "sunpy/map/tests/test_reproject_to.py"
+    "sunpy/net/tests/test_helioviewer.py"
+    "sunpy/timeseries/tests/test_timeseriesbase.py"
+    "sunpy/visualization/animator/tests/test_basefuncanimator.py"
+    "sunpy/visualization/animator/tests/test_mapsequenceanimator.py"
+    "sunpy/visualization/animator/tests/test_wcs.py"
+    "sunpy/visualization/colormaps/tests/test_cm.py"
+    # Requires cdflib package
+    "sunpy/timeseries/tests/test_timeseries_factory.py"
+    # Requires jplephem
+    "sunpy/image/tests/test_transform.py"
+    "sunpy/io/special/asdf/tests/test_coordinate_frames.py"
+    "sunpy/io/special/asdf/tests/test_genericmap.py"
+    # distutils is deprecated
+    "sunpy/io/setup_package.py"
+  ];
+
+  pytestFlagsArray = [
+    "-W"
+    "ignore::DeprecationWarning"
+  ];
+
+  # Wants a configuration file
+  # pythonImportsCheck = [
+  #   "sunpy"
+  # ];
+
+  meta = with lib; {
+    description = "Python for Solar Physics";
+    homepage = "https://sunpy.org";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sunwatcher/default.nix b/nixpkgs/pkgs/development/python-modules/sunwatcher/default.nix
new file mode 100644
index 000000000000..ee3a2e200b17
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sunwatcher/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "sunwatcher";
+  version = "0.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0swmvmmbfb914k473yv3fc4zizy2abq2qhd7h6lixli11l5wfjxv";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "sunwatcher" ];
+
+  meta = with lib; {
+    description = "Python module for the SolarLog HTTP API";
+    homepage = "https://bitbucket.org/Lavode/sunwatcher/src/master/";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sunweg/default.nix b/nixpkgs/pkgs/development/python-modules/sunweg/default.nix
new file mode 100644
index 000000000000..b33220898cd3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sunweg/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "sunweg";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rokam";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-S92PybN+pReI9WtJr9as95uceicsSMadMQfh9JxsE8U=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sunweg"
+  ];
+
+  meta = with lib; {
+    description = "Module to access the WEG solar energy platform";
+    homepage = "https://github.com/rokam/sunweg";
+    changelog = "https://github.com/rokam/sunweg/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/superqt/default.nix b/nixpkgs/pkgs/development/python-modules/superqt/default.nix
new file mode 100644
index 000000000000..f0d65a96ddc5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/superqt/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, pyqt5
+, qtpy
+, typing-extensions
+, pytestCheckHook
+, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "superqt";
+  version = "0.3.8";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "napari";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-zEMG2zscGDlRxtLn/lUTEjZBPabcwzMcj/kMcy3yOs8=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [
+    pyqt5
+    qtpy
+    typing-extensions
+    pygments
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  doCheck = false; # Segfaults...
+
+  pythonImportsCheck = [ "superqt" ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  meta = with lib; {
+    description = "Missing widgets and components for Qt-python (napari/superqt)";
+    homepage = "https://github.com/napari/superqt";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ SomeoneSerge ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/supervise-api/default.nix b/nixpkgs/pkgs/development/python-modules/supervise-api/default.nix
new file mode 100644
index 000000000000..3bd223127a7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/supervise-api/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, substituteAll
+, supervise
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "supervise-api";
+  version = "0.6.0";
+  pyproject = true;
+
+  src = fetchPypi {
+    pname = "supervise_api";
+    inherit version;
+    hash = "sha256-EjD0IpSRDoNCG307CKlo0n1RCkpwnpZlB+1w212hud4=";
+  };
+
+  postPatch = ''
+    substituteInPlace supervise_api/supervise.py \
+      --replace 'which("supervise")' '"${supervise}/bin/supervise"'
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "supervise_api"
+  ];
+
+  meta = {
+    description = "An API for running processes safely and securely";
+    homepage = "https://github.com/catern/supervise";
+    license = lib.licenses.mit;
+    platforms = lib.platforms.linux;
+    maintainers = with lib.maintainers; [ catern ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/supervisor/default.nix b/nixpkgs/pkgs/development/python-modules/supervisor/default.nix
new file mode 100644
index 000000000000..b99b5cfd05b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/supervisor/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, mock
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "supervisor";
+  version = "4.2.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NHYbrhojxYGSKBpRFfsH+/IsmwEzwIFmvv/HD+0+vBI=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  # wants to write to /tmp/foo which is likely already owned by another
+  # nixbld user on hydra
+  doCheck = !stdenv.isDarwin;
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "supervisor"
+  ];
+
+  meta = with lib; {
+    description = "A system for controlling process state under UNIX";
+    homepage = "http://supervisord.org/";
+    changelog = "https://github.com/Supervisor/supervisor/blob/${version}/CHANGES.rst";
+    license = licenses.free; # http://www.repoze.org/LICENSE.txt
+    maintainers = with maintainers; [ zimbatm ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sure/default.nix b/nixpkgs/pkgs/development/python-modules/sure/default.nix
new file mode 100644
index 000000000000..55638abad003
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sure/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, mock
+, six
+, isPyPy
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sure";
+  version = "2.0.1";
+  format = "setuptools";
+
+  disabled = isPyPy;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-yPxvq8Dn9phO6ruUJUDkVkblvvC7mf5Z4C2mNOTUuco=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "rednose = 1" ""
+  '';
+
+  propagatedBuildInputs = [
+    mock
+    six
+  ];
+
+  nativeCheckInputs = [
+    nose
+  ];
+
+  pythonImportsCheck = [
+    "sure"
+  ];
+
+  meta = with lib; {
+    description = "Utility belt for automated testing";
+    homepage = "https://sure.readthedocs.io/";
+    changelog = "https://github.com/gabrielfalcao/sure/blob/v${version}/CHANGELOG.md";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/surepy/default.nix b/nixpkgs/pkgs/development/python-modules/surepy/default.nix
new file mode 100644
index 000000000000..445f942581b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/surepy/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, aiodns
+, aiohttp
+, async-timeout
+, attrs
+, brotlipy
+, buildPythonPackage
+, faust-cchardet
+, click
+, colorama
+, fetchFromGitHub
+, halo
+, poetry-core
+, pythonOlder
+, requests
+, rich
+}:
+
+buildPythonPackage rec {
+  pname = "surepy";
+  version = "0.8.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "benleb";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-/fgNznsucjHPO44lK4tk5tDJHKjCJEbPtOO7YHmDcRQ=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'aiohttp = {extras = ["speedups"], version = "^3.7.4"}' 'aiohttp = {extras = ["speedups"], version = ">=3.7.4"}' \
+      --replace 'async-timeout = "^3.0.1"' 'async-timeout = ">=3.0.1"' \
+      --replace 'rich = "^10.1.0"' 'rich = ">=10.1.0"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiodns
+    aiohttp
+    async-timeout
+    attrs
+    brotlipy
+    click
+    colorama
+    faust-cchardet
+    halo
+    requests
+    rich
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "surepy"
+  ];
+
+  meta = with lib; {
+    description = "Python library to interact with the Sure Petcare API";
+    homepage = "https://github.com/benleb/surepy";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/surt/default.nix b/nixpkgs/pkgs/development/python-modules/surt/default.nix
new file mode 100644
index 000000000000..d11e8e2fe53f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/surt/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, six
+, tldextract
+}:
+
+buildPythonPackage rec {
+  pname = "surt";
+  version = "0.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "internetarchive";
+    repo = "surt";
+    # Has no git tag, https://github.com/internetarchive/surt/issues/26
+    rev = "6934c321b3e2f66af9c001d882475949f00570c5";
+    hash = "sha256-pSMNpFfq2V0ANWNFPcb1DwPHccbfddo9P4xZ+ghwbz4=";
+  };
+
+  propagatedBuildInputs = [
+    six
+    tldextract
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "surt"
+  ];
+
+  disabledTests = [
+    # Tests want to download Public Suffix List
+    "test_getPublicPrefix"
+    "test_getPublicSuffix"
+  ];
+
+  meta = with lib; {
+    description = "Sort-friendly URI Reordering Transform (SURT) python module";
+    homepage = "https://github.com/internetarchive/surt";
+    license = licenses.agpl3Only;
+    maintainers = with maintainers; [ Luflosi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/survey/default.nix b/nixpkgs/pkgs/development/python-modules/survey/default.nix
new file mode 100644
index 000000000000..2ce5a49b8d14
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/survey/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "survey";
+  version = "4.5.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wjpO1+9AXi75uPXOTE5/owEiZgtffkkMAaZ+gDO0t5I=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  doCheck = false;
+  pythonImportsCheck = [ "survey" ];
+
+  meta = with lib; {
+    description = "A simple library for creating beautiful interactive prompts";
+    homepage = "https://github.com/Exahilosys/survey";
+    changelog = "https://github.com/Exahilosys/survey/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sfrijters ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sv-ttk/default.nix b/nixpkgs/pkgs/development/python-modules/sv-ttk/default.nix
new file mode 100644
index 000000000000..660d32a6735c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sv-ttk/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sv-ttk";
+  version = "2.5.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "sv_ttk";
+    hash = "sha256-m7/iq6bMb5/fcNeTMQRlQ8lmb8zMeLrV/2SKmYfjzts=";
+  };
+
+  # No tests available
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sv_ttk"
+  ];
+
+  meta = with lib; {
+    description = "A gorgeous theme for Tkinter/ttk, based on the Sun Valley visual style";
+    homepage = "https://github.com/rdbende/Sun-Valley-ttk-theme";
+    changelog = "https://github.com/rdbende/Sun-Valley-ttk-theme/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ AngryAnt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/svg-path/default.nix b/nixpkgs/pkgs/development/python-modules/svg-path/default.nix
new file mode 100644
index 000000000000..2ec9f5b78025
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/svg-path/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pillow
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "svg.path";
+  version = "6.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GiFZ+duJjfk8RjfP08yvfaH9Bz9Z+ppZUMc+RtSqGso=";
+  };
+
+  nativeCheckInputs = [
+    pillow
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # generated image differs from example
+    "test_image"
+  ];
+
+  pythonImportsCheck = [
+    "svg.path"
+  ];
+
+  meta = with lib; {
+    description = "SVG path objects and parser";
+    homepage = "https://github.com/regebro/svg.path";
+    license = licenses.mit;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/svg2tikz/default.nix b/nixpkgs/pkgs/development/python-modules/svg2tikz/default.nix
new file mode 100644
index 000000000000..b6623d3b8009
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/svg2tikz/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, inkex
+, lxml
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "svg2tikz";
+  version = "2.1.0";
+
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "xyz2tex";
+    repo = "svg2tikz";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-v8+0h90uJlkI5eJcwCG55nxPz8n2aJXwP8Ocp48cl9M=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    inkex
+    lxml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "svg2tikz" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/xyz2tex/svg2tikz/blob/${src.rev}/CHANGELOG.md";
+    homepage = "https://github.com/xyz2tex/svg2tikz";
+    description = "Set of tools for converting SVG graphics to TikZ/PGF code";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ dotlambda gal_bolle ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/svgelements/default.nix b/nixpkgs/pkgs/development/python-modules/svgelements/default.nix
new file mode 100644
index 000000000000..22a7e2c5b1ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/svgelements/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, wheel
+, anyio
+, numpy
+, pillow
+, pytest-forked
+, pytest-xdist
+, pytestCheckHook
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "svgelements";
+  version = "1.9.6";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "meerk40t";
+    repo = "svgelements";
+    rev = "refs/tags/${version}";
+    hash = "sha256-nx2sGXeeh8S17TfRDFifQbdSxc4YGsDNnrPSSbxv7S4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  pythonImportsCheck = [ "svgelements" ];
+
+  nativeCheckInputs =  [
+    anyio
+    numpy
+    pillow
+    pytest-forked
+    pytest-xdist
+    pytestCheckHook
+    scipy
+  ];
+
+  meta = with lib; {
+    description = "SVG Parsing for Elements, Paths, and other SVG Objects";
+    homepage = "https://github.com/meerk40t/svgelements";
+    license = licenses.mit;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/svglib/default.nix b/nixpkgs/pkgs/development/python-modules/svglib/default.nix
new file mode 100644
index 000000000000..59841b4cecfd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/svglib/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, cssselect2
+, lxml
+, pillow
+, pytestCheckHook
+, reportlab
+, tinycss2
+}:
+
+buildPythonPackage rec {
+  pname = "svglib";
+  version = "1.5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Oudl06lAnuYMD7TSTC3raoBheqknBU9bzX/JjwaV5Yc=";
+  };
+
+  propagatedBuildInputs = [
+    cssselect2
+    lxml
+    pillow
+    reportlab
+    tinycss2
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Ignore tests that require network access (TestWikipediaFlags and TestW3CSVG), and tests that
+    # require files missing in the 1.0.0 PyPI release (TestOtherFiles).
+    "TestWikipediaFlags"
+    "TestW3CSVG"
+    "TestOtherFiles"
+  ];
+
+  pythonImportsCheck = [
+    "svglib.svglib"
+  ];
+
+  meta = with lib; {
+    description = "A pure-Python library for reading and converting SVG";
+    homepage = "https://github.com/deeplook/svglib";
+    changelog = "https://github.com/deeplook/svglib/blob/v${version}/CHANGELOG.rst";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ trepetti ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/svgwrite/default.nix b/nixpkgs/pkgs/development/python-modules/svgwrite/default.nix
new file mode 100644
index 000000000000..7f03007ee5f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/svgwrite/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "svgwrite";
+  version = "1.4.3";
+
+  src = fetchFromGitHub {
+    owner = "mozman";
+    repo = "svgwrite";
+    rev = "v${version}";
+    hash = "sha256-uOsrDhE9AwWU7GIrCVuL3uXTPqtrh8sofvo2C5t+25I=";
+  };
+
+  # svgwrite requires Python 3.6 or newer
+  disabled = pythonOlder "3.6";
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  disabledTests = [
+    # embed_google_web_font test tried to pull font from internet
+    "test_embed_google_web_font"
+  ];
+
+  meta = with lib; {
+    description = "A Python library to create SVG drawings";
+    homepage = "https://github.com/mozman/svgwrite";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/swagger-spec-validator/default.nix b/nixpkgs/pkgs/development/python-modules/swagger-spec-validator/default.nix
new file mode 100644
index 000000000000..124b69135253
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/swagger-spec-validator/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pyyaml, jsonschema, six, pytestCheckHook, mock }:
+
+buildPythonPackage rec {
+  pname = "swagger-spec-validator";
+  version = "2.7.4";
+
+  src = fetchFromGitHub {
+    owner = "Yelp";
+    repo = "swagger_spec_validator";
+    rev = "v${version}";
+    hash = "sha256-7+kFmtzeze0QlGf6z/M4J4F7z771a5NWewB1S3+bxn4=";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+    jsonschema
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+  ];
+
+  pythonImportsCheck = [ "swagger_spec_validator" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Yelp/swagger_spec_validator";
+    license = licenses.asl20;
+    description = "Validation of Swagger specifications";
+    maintainers = with maintainers; [ vanschelven ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/swagger-ui-bundle/default.nix b/nixpkgs/pkgs/development/python-modules/swagger-ui-bundle/default.nix
new file mode 100644
index 000000000000..e44fd471bc79
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/swagger-ui-bundle/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, jinja2, flake8 }:
+
+buildPythonPackage rec {
+  pname = "swagger-ui-bundle";
+  version = "0.0.9";
+
+  src = fetchPypi {
+    pname = "swagger_ui_bundle";
+    inherit version;
+    sha256 = "b462aa1460261796ab78fd4663961a7f6f347ce01760f1303bbbdf630f11f516";
+  };
+
+  # patch away unused test requirements since package contains no tests
+  postPatch = ''
+    substituteInPlace setup.py --replace "setup_requires=['pytest-runner', 'flake8']" "setup_requires=[]"
+  '';
+
+  propagatedBuildInputs = [ jinja2 ];
+
+  # package contains no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "bundled swagger-ui pip package";
+    homepage = "https://github.com/dtkav/swagger_ui_bundle";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ elohmeier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/swift/default.nix b/nixpkgs/pkgs/development/python-modules/swift/default.nix
new file mode 100644
index 000000000000..95dd8e55d4a4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/swift/default.nix
@@ -0,0 +1,90 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, boto3
+, cryptography
+, eventlet
+, greenlet
+, iana-etc
+, installShellFiles
+, libredirect
+, lxml
+, mock
+, netifaces
+, pastedeploy
+, pbr
+, pyeclib
+, requests
+, setuptools
+, six
+, stestr
+, swiftclient
+, xattr
+}:
+
+buildPythonPackage rec {
+  pname = "swift";
+  version = "2.32.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JeDmZx667rG1ARfRBUDTcOWe7u3ZiytZzGQSRp8bpes=";
+  };
+
+  postPatch = ''
+    # files requires boto which is incompatible with python 3.9
+    rm test/functional/s3api/{__init__.py,s3_test_client.py}
+  '';
+
+  nativeBuildInputs = [
+    installShellFiles
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    eventlet
+    greenlet
+    lxml
+    netifaces
+    pastedeploy
+    pyeclib
+    requests
+    setuptools
+    six
+    xattr
+  ];
+
+  postInstall = ''
+    installManPage doc/manpages/*
+  '';
+
+  nativeCheckInputs = [
+    boto3
+    mock
+    stestr
+    swiftclient
+  ];
+
+  # a lot of tests currently fail while establishing a connection
+  doCheck = false;
+
+  checkPhase = ''
+    echo "nameserver 127.0.0.1" > resolv.conf
+    export NIX_REDIRECTS=/etc/protocols=${iana-etc}/etc/protocols:/etc/resolv.conf=$(realpath resolv.conf)
+    export LD_PRELOAD=${libredirect}/lib/libredirect.so
+
+    export SWIFT_TEST_CONFIG_FILE=test/sample.conf
+
+    stestr run
+  '';
+
+  pythonImportsCheck = [ "swift" ];
+
+  meta = with lib; {
+    description = "OpenStack Object Storage";
+    homepage = "https://github.com/openstack/swift";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/swisshydrodata/default.nix b/nixpkgs/pkgs/development/python-modules/swisshydrodata/default.nix
new file mode 100644
index 000000000000..38ed15981fd4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/swisshydrodata/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "swisshydrodata";
+  version = "0.1.0";
+
+  src = fetchFromGitHub {
+    owner = "Bouni";
+    repo = pname;
+    rev = version;
+    sha256 = "1rdgfc6zg5j3fvrpbqs9vc3n5m66r5yljawyl7nmrqd5lwq1lqak";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests-mock
+  ];
+
+  pythonImportsCheck = [ "swisshydrodata" ];
+
+  meta = with lib; {
+    description = "Python client to get data from the Swiss federal Office for Environment FEON";
+    homepage = "https://github.com/bouni/swisshydrodata";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/swspotify/default.nix b/nixpkgs/pkgs/development/python-modules/swspotify/default.nix
new file mode 100644
index 000000000000..e2627660006b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/swspotify/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, dbus-python
+, fetchFromGitHub
+, flask
+, flask-cors
+, poetry-core
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "swspotify";
+  version = "1.2.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "SwagLyrics";
+    repo = "SwSpotify";
+    rev = "v${version}";
+    hash = "sha256-xGLvc154xnje45Akf7H1qqQRUc03gGVt8AhGlkcP3kY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    dbus-python
+    flask
+    flask-cors
+    requests
+  ];
+
+  # Tests want to use Dbus
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "SwSpotify"
+  ];
+
+  meta = with lib; {
+    description = "Library to get the currently playing song and artist from Spotify";
+    homepage = "https://github.com/SwagLyrics/SwSpotify";
+    license = licenses.mit;
+    maintainers = with maintainers; [ siraben ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sybil/default.nix b/nixpkgs/pkgs/development/python-modules/sybil/default.nix
new file mode 100644
index 000000000000..568c2dc67801
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sybil/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "sybil";
+  version = "5.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "simplistix";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-FeyamQDm/EqOWrRlxA8iIQniHI5xag+zUVfRGRHmslE=";
+  };
+
+  # Circular dependency with testfixtures
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "sybil"
+  ];
+
+  meta = with lib; {
+    description = "Automated testing for the examples in your documentation";
+    homepage = "https://github.com/cjw296/sybil";
+    changelog = "https://github.com/simplistix/sybil/blob/${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/symengine/default.nix b/nixpkgs/pkgs/development/python-modules/symengine/default.nix
new file mode 100644
index 000000000000..7d02d2e0c6fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/symengine/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, cmake
+, symengine
+, pytest
+, sympy
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "symengine";
+  version = "0.11.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "symengine";
+    repo = "symengine.py";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-uUMcNnynE2itIwc7IGFwxveqLRL8f4dAAcaD6FUWJaY=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "\"cmake\"" "\"${cmake}/bin/cmake\"" \
+      --replace "'cython>=0.29.24'" "'cython'"
+  '';
+
+  nativeBuildUnputs = [ cmake ];
+
+  buildInputs = [ cython ];
+
+  nativeCheckInputs = [ pytest sympy ];
+
+  setupPyBuildFlags = [
+    "--symengine-dir=${symengine}/"
+    "--define=\"CYTHON_BIN=${cython}/bin/cython\""
+  ];
+
+  checkPhase = ''
+    mkdir empty
+    cd empty
+    ${python.interpreter} ../bin/test_python.py
+  '';
+
+  meta = with lib; {
+    description = "Python library providing wrappers to SymEngine";
+    homepage = "https://github.com/symengine/symengine.py";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sympy/default.nix b/nixpkgs/pkgs/development/python-modules/sympy/default.nix
new file mode 100644
index 000000000000..a88e21021e41
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sympy/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, glibcLocales
+, mpmath
+}:
+
+buildPythonPackage rec {
+  pname = "sympy";
+  version = "1.12";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6/WVyNrD4P3EFSxRh4tJg5bsfzDnqRTWBx5nTUlCD7g=";
+  };
+
+  nativeCheckInputs = [ glibcLocales ];
+
+  propagatedBuildInputs = [ mpmath ];
+
+  # tests take ~1h
+  doCheck = false;
+  pythonImportsCheck = [ "sympy" ];
+
+  preCheck = ''
+    export LANG="en_US.UTF-8"
+  '';
+
+  meta = with lib; {
+    description = "A Python library for symbolic mathematics";
+    homepage    = "https://www.sympy.org/";
+    license     = licenses.bsd3;
+    maintainers = with maintainers; [ lovek323 ] ++ teams.sage.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/syncedlyrics/default.nix b/nixpkgs/pkgs/development/python-modules/syncedlyrics/default.nix
new file mode 100644
index 000000000000..a8482b18d56a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/syncedlyrics/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pythonOlder
+, pythonRelaxDepsHook
+, rapidfuzz
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "syncedlyrics";
+  version = "0.6.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rtcq";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-oMG3TqCJfEyfF5zK8hNhyhQ1z7G+S+De8hI1GLCfctM=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    "rapidfuzz"
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    rapidfuzz
+    beautifulsoup4
+  ];
+
+  # Tests require network access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "syncedlyrics"
+  ];
+
+  meta = with lib; {
+    description = "Module to get LRC format (synchronized) lyrics";
+    homepage = "https://github.com/rtcq/syncedlyrics";
+    changelog = "https://github.com/rtcq/syncedlyrics/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/syncer/default.nix b/nixpkgs/pkgs/development/python-modules/syncer/default.nix
new file mode 100644
index 000000000000..48345b94e421
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/syncer/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "syncer";
+  version = "2.0.3";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "miyakogi";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-3EYWy6LuZ/3i+9d0QaclCqWMMw5O3WzhTY3LUL5iMso=";
+  };
+
+  # Tests require an not maintained package (xfail)
+  doCheck = false;
+
+  pythonImportsCheck = [ "syncer" ];
+
+  meta = with lib; {
+    description = "Python async to sync converter";
+    homepage = "https://github.com/miyakogi/syncer";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/synergy/default.nix b/nixpkgs/pkgs/development/python-modules/synergy/default.nix
new file mode 100644
index 000000000000..0b6c367db6ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/synergy/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, numpy
+, scipy
+, matplotlib
+, plotly
+, pandas
+}:
+
+buildPythonPackage rec {
+  pname = "synergy";
+  version = "0.5.1";
+  disabled = pythonOlder "3.5";
+
+  # Pypi does not contain unit tests
+  src = fetchFromGitHub {
+    owner = "djwooten";
+    repo = "synergy";
+    rev = "v${version}";
+    sha256 = "1c60dpvr72g4wjqg6bc601kssl5z55v9bg09xbyh9ahch58bi212";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    matplotlib
+    plotly
+    pandas
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [ "synergy" ];
+
+  meta = with lib; {
+    description = "A Python library for calculating, analyzing, and visualizing drug combination synergy";
+    homepage = "https://github.com/djwooten/synergy";
+    maintainers = [ maintainers.ivar ];
+    license = licenses.gpl3Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/synologydsm-api/default.nix b/nixpkgs/pkgs/development/python-modules/synologydsm-api/default.nix
new file mode 100644
index 000000000000..e86361979c1b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/synologydsm-api/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, requests
+, urllib3
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "synologydsm-api";
+  version = "1.0.2";
+
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "hacf-fr";
+    repo = "synologydsm-api";
+    rev = "v${version}";
+    sha256 = "0gyahf1x6i6j9pslh1y3pyh3si5jvxb06r1w761b9gsxyk14y1si";
+  };
+
+  patches = [
+    # https://github.com/hacf-fr/synologydsm-api/pull/84
+    (fetchpatch {
+      name = "switch-to-poetry-core.patch";
+      url = "https://github.com/hacf-fr/synologydsm-api/commit/f1ea2be927388bdff6d43d09027b82a854635e34.patch";
+      sha256 = "120pdgp2i4ds6y3rf9j372f9zdcf4y8rsgl1xjbkgdhkp76bkkgr";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    urllib3
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "synology_dsm" ];
+
+  meta = with lib; {
+    description = "Python API for communication with Synology DSM";
+    homepage = "https://github.com/hacf-fr/synologydsm-api";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/syrupy/default.nix b/nixpkgs/pkgs/development/python-modules/syrupy/default.nix
new file mode 100644
index 000000000000..84bc944317e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/syrupy/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, poetry-core
+, pytest
+, colored
+, invoke
+}:
+
+buildPythonPackage rec {
+  pname = "syrupy";
+  version = "4.6.0";
+  format = "pyproject";
+
+  disabled = lib.versionOlder python.version "3.8.1";
+
+  src = fetchFromGitHub {
+    owner = "tophat";
+    repo = "syrupy";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-FjDGwSOKvDWx+LwUCNGEOBKV3rFG+09gtFpLLi0xgD4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  buildInputs = [
+    pytest
+  ];
+
+  propagatedBuildInputs = [
+    colored
+  ];
+
+  nativeCheckInputs = [
+    invoke
+    pytest
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    # https://github.com/tophat/syrupy/blob/main/CONTRIBUTING.md#local-development
+    invoke test
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "syrupy" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/tophat/syrupy/releases/tag/v${version}";
+    description = "Pytest Snapshot Test Utility";
+    homepage = "https://github.com/tophat/syrupy";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/syslog-rfc5424-formatter/default.nix b/nixpkgs/pkgs/development/python-modules/syslog-rfc5424-formatter/default.nix
new file mode 100644
index 000000000000..50ebc91d9e81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/syslog-rfc5424-formatter/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "syslog-rfc5424-formatter";
+  version = "1.2.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "easypost";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-dvRSOMXRmZf0vEEyX6H7OBSfo/PgyOLKuDS8X6g4qe0=";
+  };
+
+  # Tests are not picked up, review later again
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "syslog_rfc5424_formatter"
+  ];
+
+  meta = with lib; {
+    description = "Python logging formatter for emitting RFC5424 Syslog messages";
+    homepage = "https://github.com/easypost/syslog-rfc5424-formatter";
+    license = with licenses; [ isc ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/systembridge/default.nix b/nixpkgs/pkgs/development/python-modules/systembridge/default.nix
new file mode 100644
index 000000000000..5cac083229be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/systembridge/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "systembridge";
+  version = "2.3.1";
+
+  src = fetchFromGitHub {
+    owner = "timmo001";
+    repo = "system-bridge-connector-py";
+    rev = "v${version}";
+    hash = "sha256-Ts8zPRK6S5iLnl19Y/Uz0YAh6hDeVRNBY6HsvLwdUFw=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    websockets
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "systembridge" ];
+
+  meta = with lib; {
+    description = "Python module for connecting to System Bridge";
+    homepage = "https://github.com/timmo001/system-bridge-connector-py";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/systemd/default.nix b/nixpkgs/pkgs/development/python-modules/systemd/default.nix
new file mode 100644
index 000000000000..da81905fca37
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/systemd/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, libredirect
+, systemd
+, pkg-config
+, pytest
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "systemd";
+  version = "235";
+
+  src = fetchFromGitHub {
+    owner = "systemd";
+    repo = "python-systemd";
+    rev = "v${version}";
+    hash = "sha256-8p4m4iM/z4o6PHRQIpuSXb64tPTWGlujEYCDVLiIt2o=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  buildInputs = [
+    systemd
+  ];
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    echo "12345678901234567890123456789012" > machine-id
+    export NIX_REDIRECTS=/etc/machine-id=$(realpath machine-id) \
+    LD_PRELOAD=${libredirect}/lib/libredirect.so
+
+    # Those tests assume /etc/machine-id to be available
+    # But our redirection technique does not work apparently
+    pytest $out/${python.sitePackages}/systemd -k 'not test_get_machine and not test_get_machine_app_specific and not test_reader_this_machine'
+  '';
+
+  pythonImportsCheck = [
+    "systemd.journal"
+    "systemd.id128"
+    "systemd.daemon"
+    "systemd.login"
+  ];
+
+  meta = with lib; {
+    description = "Python module for native access to the systemd facilities";
+    homepage = "https://www.freedesktop.org/software/systemd/python-systemd/";
+    changelog = "https://github.com/systemd/python-systemd/blob/v${version}/NEWS";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ raitobezarius ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/sysv_ipc/default.nix b/nixpkgs/pkgs/development/python-modules/sysv_ipc/default.nix
new file mode 100644
index 000000000000..a58b714a4ac8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/sysv_ipc/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "sysv_ipc";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0f063cbd36ec232032e425769ebc871f195a7d183b9af32f9901589ea7129ac3";
+  };
+
+  meta = with lib; {
+    description = "SysV IPC primitives (semaphores, shared memory and message queues)";
+    license = licenses.bsd3;
+    homepage = "http://semanchuk.com/philip/sysv_ipc/";
+    maintainers = with maintainers; [ ris ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tabcmd/default.nix b/nixpkgs/pkgs/development/python-modules/tabcmd/default.nix
new file mode 100644
index 000000000000..0569b2e661c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tabcmd/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, python3
+, pythonOlder
+, fetchPypi
+, ftfy
+, appdirs
+, requests
+, setuptools-scm
+, types-mock
+, types-appdirs
+, types-requests
+, types-setuptools
+, argparse
+, doit
+, pyinstaller-versionfile
+, tableauserverclient
+, pytestCheckHook
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "tabcmd";
+  version = "2.0.12";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-nsQJWDzSzSc1WRk5TBl/E7Mpfk8wGD1CsETAWILKxCM=";
+  };
+
+  propagatedBuildInputs = [ ftfy appdirs requests setuptools-scm types-mock types-appdirs argparse doit pyinstaller-versionfile types-requests types-setuptools tableauserverclient ];
+
+  nativeCheckInputs = [ pytestCheckHook mock ];
+
+  # Remove an unneeded dependency that can't be resolved
+  prePatch = ''
+    sed -i "/'argparse',/d" pyproject.toml
+  '';
+
+  # Create a "tabcmd" executable
+  postInstall = ''
+    # Create a directory for our wrapped binary.
+    mkdir -p $out/bin
+
+    cp -r build/lib/tabcmd/__main__.py $out/bin/
+
+    # Create a 'tabcmd' script with python3 shebang
+    echo "#!${python3}/bin/python3" > $out/bin/tabcmd
+
+    # Append __main__.py contents
+    cat $out/bin/__main__.py >> $out/bin/tabcmd
+
+    # Make it executable.
+    chmod +x $out/bin/tabcmd
+  '';
+
+
+  meta = {
+    description = "A command line client for working with Tableau Server.";
+    homepage = "https://pypi.org/project/tabcmd/";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tableaudocumentapi/default.nix b/nixpkgs/pkgs/development/python-modules/tableaudocumentapi/default.nix
new file mode 100644
index 000000000000..437c1b218394
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tableaudocumentapi/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, lxml
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "tableaudocumentapi";
+  version = "0.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-g6V1UBf+P21FcZkR3PHoUmdmrQwEvjdd1VKhvNmvOys=";
+  };
+
+  propagatedBuildInputs = [
+    lxml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "tableaudocumentapi"
+  ];
+
+  # ModuleNotFoundError: No module named 'test.assets'
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python module for working with Tableau files";
+    homepage = "https://github.com/tableau/document-api-python";
+    changelog = "https://github.com/tableau/document-api-python/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tableauserverclient/default.nix b/nixpkgs/pkgs/development/python-modules/tableauserverclient/default.nix
new file mode 100644
index 000000000000..6bcdde6c7390
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tableauserverclient/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, defusedxml
+, requests
+, packaging
+, requests-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "tableauserverclient";
+  version = "0.28";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jSblDVkuuBBZ7GmPKUYji8wtRoPS7g8r6Ye9EpnjvKA=";
+  };
+
+  propagatedBuildInputs = [
+    defusedxml
+    requests
+    packaging
+  ];
+
+  nativeCheckInputs = [
+    requests-mock
+    pytestCheckHook
+  ];
+
+  # Tests attempt to create some file artifacts and fails
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "tableauserverclient"
+  ];
+
+  meta = with lib; {
+    description = "Module for working with the Tableau Server REST API";
+    homepage = "https://github.com/tableau/server-client-python";
+    changelog = "https://github.com/tableau/server-client-python/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tabledata/default.nix b/nixpkgs/pkgs/development/python-modules/tabledata/default.nix
new file mode 100644
index 000000000000..b178665628a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tabledata/default.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, dataproperty
+, typepy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tabledata";
+  version = "1.3.3";
+
+  src = fetchFromGitHub {
+    owner = "thombashi";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-84KrXnks76mvIjcEeQPpwd8rPO5SMbH/jfqERaFTrWo=";
+  };
+
+  propagatedBuildInputs = [ dataproperty typepy ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    homepage = "https://github.com/thombashi/tabledata";
+    description = "A library to represent tabular data";
+    changelog = "https://github.com/thombashi/tabledata/releases/tag/v${version}";
+    maintainers = with maintainers; [ genericnerdyusername ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tables/default.nix b/nixpkgs/pkgs/development/python-modules/tables/default.nix
new file mode 100644
index 000000000000..c1726ee97a85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tables/default.nix
@@ -0,0 +1,117 @@
+{ lib
+, fetchPypi
+, fetchpatch
+, buildPythonPackage
+, pythonOlder
+, blosc2
+, bzip2
+, c-blosc
+, cython
+, hdf5
+, lzo
+, numpy
+, numexpr
+, packaging
+, sphinx
+  # Test inputs
+, python
+, pytest
+, py-cpuinfo
+}:
+
+buildPythonPackage rec {
+  pname = "tables";
+  version = "3.8.0";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NPP6I2bOILGPHfVzp3wdJzBs4fKkHZ+e/2IbUZLqh4g=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "numpy-1.25-compatibility.patch";
+      url = "https://github.com/PyTables/PyTables/commit/337792561e5924124efd20d6fea6bbbd2428b2aa.patch";
+      hash = "sha256-pz3A/jTPWXXlzr+Yl5PRUvdSAinebFsoExfek4RUHkc=";
+    })
+    (fetchpatch {
+      name = "numexpr-2.8.5-compatibility.patch";
+      url = "https://github.com/PyTables/PyTables/commit/1a235490ebe1a138da1139cfa19829b5f0a2af37.patch";
+      includes = [ "tables/tests/test_queries.py" ];
+      hash = "sha256-uMS+Z2Zcz68ILMQaBdIDMnCyasozCaCGOiGIyw0+Evc=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    blosc2
+    cython
+    sphinx
+  ];
+
+  buildInputs = [
+    bzip2
+    c-blosc
+    hdf5
+    lzo
+  ];
+
+  propagatedBuildInputs = [
+    blosc2
+    py-cpuinfo
+    numpy
+    numexpr
+    packaging # uses packaging.version at runtime
+  ];
+
+  # When doing `make distclean`, ignore docs
+  postPatch = ''
+    substituteInPlace Makefile --replace "src doc" "src"
+    # Force test suite to error when unittest runner fails
+    substituteInPlace tables/tests/test_suite.py \
+      --replace "return 0" "assert result.wasSuccessful(); return 0" \
+      --replace "return 1" "assert result.wasSuccessful(); return 1"
+    substituteInPlace requirements.txt \
+      --replace "cython>=0.29.21" "" \
+      --replace "blosc2~=2.0.0" "blosc2"
+  '';
+
+  # Regenerate C code with Cython
+  preBuild = ''
+    make distclean
+  '';
+
+  setupPyBuildFlags = [
+    "--hdf5=${lib.getDev hdf5}"
+    "--lzo=${lib.getDev lzo}"
+    "--bzip2=${lib.getDev bzip2}"
+    "--blosc=${lib.getDev c-blosc}"
+  ];
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  preCheck = ''
+    cd ..
+  '';
+
+  # Runs the light (yet comprehensive) subset of the test suite.
+  # The whole "heavy" test suite supposedly takes ~4 hours to run.
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m tables.tests.test_all
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "tables" ];
+
+  meta = with lib; {
+    description = "Hierarchical datasets for Python";
+    homepage = "https://www.pytables.org/";
+    changelog = "https://github.com/PyTables/PyTables/releases/tag/v${version}";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tablib/default.nix b/nixpkgs/pkgs/development/python-modules/tablib/default.nix
new file mode 100644
index 000000000000..679f8df11559
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tablib/default.nix
@@ -0,0 +1,96 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, markuppy
+, odfpy
+, openpyxl
+, pandas
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, setuptools-scm
+, tabulate
+, unicodecsv
+, xlrd
+, xlwt
+}:
+
+buildPythonPackage rec {
+  pname = "tablib";
+  version = "3.5.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-9mYd/EXh1PUfqKYjn5yDSTgIWaW/qnMoBkXwRtbJbjM=";
+  };
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace " --cov=tablib --cov=tests --cov-report xml --cov-report term --cov-report html" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  passthru.optional-dependencies = {
+    all = [
+      markuppy
+      odfpy
+      openpyxl
+      pandas
+      pyyaml
+      tabulate
+      xlrd
+      xlwt
+    ];
+    cli = [
+      tabulate
+    ];
+    html = [
+      markuppy
+    ];
+    ods = [
+      odfpy
+    ];
+    pandas = [
+      pandas
+    ];
+    xls = [
+      xlrd
+      xlwt
+    ];
+    xlsx = [
+      openpyxl
+    ];
+    yaml = [
+      pyyaml
+    ];
+  };
+
+  nativeCheckInputs = [
+    pandas
+    pytestCheckHook
+    unicodecsv
+  ];
+
+  disabledTestPaths = [
+    # test_tablib needs MarkupPy, which isn't packaged yet
+    "tests/test_tablib.py"
+  ];
+
+  pythonImportsCheck = [
+    "tablib"
+  ];
+
+  meta = with lib; {
+    description = "Format-agnostic tabular dataset library";
+    homepage = "https://tablib.readthedocs.io/";
+    changelog = "https://github.com/jazzband/tablib/raw/v${version}/HISTORY.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tabula-py/default.nix b/nixpkgs/pkgs/development/python-modules/tabula-py/default.nix
new file mode 100644
index 000000000000..3ce734237ce4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tabula-py/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, buildPythonPackage
+, distro
+, fetchFromGitHub
+, jre
+, numpy
+, pandas
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+, jpype1
+}:
+
+buildPythonPackage rec {
+  pname = "tabula-py";
+  version = "2.9.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "chezou";
+    repo = "tabula-py";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-MGv2n8DoSjumD3lRcqwI0sEsaEDgs1n+st8DwZuZauo=";
+  };
+
+  postPatch = ''
+    substituteInPlace tabula/backend.py \
+      --replace '"java"' '"${lib.getExe jre}"'
+  '';
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    jre
+  ];
+
+  propagatedBuildInputs = [
+    distro
+    numpy
+    pandas
+    jpype1
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "tabula"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_convert_remote_file"
+    "test_read_pdf_with_remote_template"
+    "test_read_remote_pdf"
+    "test_read_remote_pdf_with_custom_user_agent"
+    # not sure what it checks
+    # probably related to jpype, but we use subprocess instead
+    # https://github.com/chezou/tabula-py/issues/352#issuecomment-1730791540
+    # Failed: DID NOT RAISE <class 'RuntimeError'>
+    "test_read_pdf_with_silent_true"
+  ];
+
+  meta = with lib; {
+    description = "Module to extract table from PDF into pandas DataFrame";
+    homepage = "https://github.com/chezou/tabula-py";
+    changelog = "https://github.com/chezou/tabula-py/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tabulate/default.nix b/nixpkgs/pkgs/development/python-modules/tabulate/default.nix
new file mode 100644
index 000000000000..99420e9e32fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tabulate/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools-scm
+, setuptools
+, wcwidth
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  version = "0.9.0";
+  pname = "tabulate";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-AJWxK/WWbeUpwP6x+ghnFnGzNo7sd9fverEUviwGizw=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  passthru.optional-dependencies = {
+    widechars = [ wcwidth ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  meta = {
+    description = "Pretty-print tabular data";
+    homepage = "https://github.com/astanin/python-tabulate";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tabview/default.nix b/nixpkgs/pkgs/development/python-modules/tabview/default.nix
new file mode 100644
index 000000000000..62eaf512357b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tabview/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tabview";
+  version = "1.4.4";
+  format = "setuptools";
+
+  # newest release only available as wheel on pypi
+  src = fetchFromGitHub {
+    owner = "TabViewer";
+    repo = "tabview";
+    rev = version;
+    sha256 = "1d1l8fhdn3w2zg7wakvlmjmgjh9lh9h5fal1clgyiqmhfix4cn4m";
+  };
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  meta = with lib; {
+    description = "Python curses command line CSV and tabular data viewer";
+    homepage = "https://github.com/TabViewer/tabview";
+    changelog = "https://github.com/TabViewer/tabview/blob/main/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tadasets/default.nix b/nixpkgs/pkgs/development/python-modules/tadasets/default.nix
new file mode 100644
index 000000000000..7eab0e9cda51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tadasets/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, matplotlib
+, pytest
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "tadasets";
+  version = "0.0.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a0e6c14678750315febd97fcf334bbbfd2695ebd91b4fe7707bb1220d7348416";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    matplotlib
+  ];
+
+  nativeCheckInputs = [
+    pytest
+    scipy
+  ];
+
+  meta = with lib; {
+    description = "Great data sets for Topological Data Analysis";
+    homepage = "https://tadasets.scikit-tda.org";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tag-expressions/default.nix b/nixpkgs/pkgs/development/python-modules/tag-expressions/default.nix
new file mode 100644
index 000000000000..e87c489dae4a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tag-expressions/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "tag-expressions";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/6Ym72jlgVdpel4V2W2aCKNtISDT9y5qz7+gTllUuPg=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "tagexpressions"
+  ];
+
+  meta = with lib; {
+    description = "Package to parse logical tag expressions";
+    homepage = "https://github.com/timofurrer/tag-expressions";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ kalbasit ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tago/default.nix b/nixpkgs/pkgs/development/python-modules/tago/default.nix
new file mode 100644
index 000000000000..d20d99f9ebc1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tago/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, promise
+, python-socketio
+, pythonOlder
+, pythonRelaxDepsHook
+, requests
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "tago";
+  version = "3.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "tago-io";
+    repo = "tago-sdk-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-q1xcPF+oeQsCAZjeYTVY2aaKFmb8rCTWVikGxdpPQ28=";
+  };
+
+  pythonRelaxDeps = true;
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    promise
+    python-socketio
+    requests
+    websockets
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "tago"
+  ];
+
+  meta = with lib; {
+    description = "Python module for interacting with Tago.io";
+    homepage = "https://github.com/tago-io/tago-sdk-python";
+    changelog = "https://github.com/tago-io/tago-sdk-python/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tagoio-sdk/default.nix b/nixpkgs/pkgs/development/python-modules/tagoio-sdk/default.nix
new file mode 100644
index 000000000000..b5bcc619eed8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tagoio-sdk/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, python-dateutil
+, python-socketio
+, pythonOlder
+, pythonRelaxDepsHook
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "tagoio-sdk";
+  version = "4.2.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "tago-io";
+    repo = "sdk-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-R7qJIgL8/zejIuT6YMnC3bdm8lKLBTK5eVjVDEjvRKs=";
+  };
+
+  pythonRelaxDeps = [
+    "requests"
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    python-dateutil
+    python-socketio
+    requests
+  ];
+
+  nativeCheckInputs = [
+    requests-mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "tagoio_sdk"
+  ];
+
+  meta = with lib; {
+    description = "Module for interacting with Tago.io";
+    homepage = "https://github.com/tago-io/sdk-python";
+    changelog = "https://github.com/tago-io/sdk-python/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tahoma-api/default.nix b/nixpkgs/pkgs/development/python-modules/tahoma-api/default.nix
new file mode 100644
index 000000000000..14989f9ac750
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tahoma-api/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "tahoma-api";
+  version = "0.0.17";
+
+  src = fetchFromGitHub {
+    owner = "philklei";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-YwOKSBlN4lNyS+hfdbQDUq1gc14FBof463ofxtUVLC4=";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "tahoma_api" ];
+
+  meta = with lib; {
+    description = "Python module to interface with Tahoma REST API";
+    homepage = "https://github.com/philklei/tahoma-api/";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tailer/default.nix b/nixpkgs/pkgs/development/python-modules/tailer/default.nix
new file mode 100644
index 000000000000..b8e19b7d97d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tailer/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "tailer";
+  version = "0.4.1";
+
+  src = fetchFromGitHub {
+    owner = "six8";
+    repo = "pytailer";
+    rev = version;
+    sha256 = "1s5p5m3q9k7r1m0wx5wcxf20xzs0rj14qwg1ydwhf6adr17y2w5y";
+  };
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m doctest -v src/tailer/__init__.py
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "tailer" ];
+
+  meta = with lib; {
+    description = "Python implementation implementation of GNU tail and head";
+    homepage = "https://github.com/six8/pytailer";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tailscale/default.nix b/nixpkgs/pkgs/development/python-modules/tailscale/default.nix
new file mode 100644
index 000000000000..c146c7fd9bd8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tailscale/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, mashumaro
+, orjson
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "tailscale";
+  version = "0.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-tailscale";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-wO6yMMU5fxk8GQ0e4ZCse2atlR4wrzulZOFXkVKAsmU=";
+  };
+
+  postPatch = ''
+    # Upstream doesn't set a version for the pyproject.toml
+    substituteInPlace pyproject.toml \
+      --replace 'version = "0.0.0"' 'version = "${version}"' \
+      --replace "--cov" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    mashumaro
+    orjson
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "tailscale"
+  ];
+
+  meta = with lib; {
+    description = "Python client for the Tailscale API";
+    homepage = "https://github.com/frenck/python-tailscale";
+    changelog = "https://github.com/frenck/python-tailscale/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/takethetime/default.nix b/nixpkgs/pkgs/development/python-modules/takethetime/default.nix
new file mode 100644
index 000000000000..7bc914ed85db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/takethetime/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "takethetime";
+  version = "0.3.1";
+
+  src = fetchPypi {
+    pname = "TakeTheTime";
+    inherit version;
+    sha256 = "sha256-2+MEU6G1lqOPni4/qOGtxa8tv2RsoIN61cIFmhb+L/k=";
+  };
+
+  disabled = pythonOlder "3.6";
+
+  # all tests are timing dependent
+  doCheck = false;
+
+  pythonImportsCheck = [ "takethetime" ];
+
+  meta = with lib; {
+    description = "Simple time taking library using context managers";
+    homepage = "https://github.com/ErikBjare/TakeTheTime";
+    maintainers = with maintainers; [ huantian ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tank-utility/default.nix b/nixpkgs/pkgs/development/python-modules/tank-utility/default.nix
new file mode 100644
index 000000000000..03d9c6c77d73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tank-utility/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, pythonOlder
+, requests
+, responses
+, setuptools
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "tank-utility";
+  version = "1.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "krismolendyke";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-h9y3X+FSzSFt+bd/chz+x0nocHaKZ8DvreMxAYMs8/E=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    urllib3
+    setuptools
+  ] ++ urllib3.optional-dependencies.secure;
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "tank_utility"
+  ];
+
+  meta = with lib; {
+    description = "Library for the Tank Utility API";
+    homepage = "https://github.com/krismolendyke/tank-utility";
+    changelog = "https://github.com/krismolendyke/tank-utility/blob/${version}/HISTORY.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tappy/default.nix b/nixpkgs/pkgs/development/python-modules/tappy/default.nix
new file mode 100644
index 000000000000..d2a311f7e95a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tappy/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tap.py";
+  version = "3.1";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3c0cd45212ad5a25b35445964e2517efa000a118a1bfc3437dae828892eaf1e1";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "tap" ];
+
+  meta = with lib; {
+    description = "A set of tools for working with the Test Anything Protocol (TAP) in Python";
+    homepage = "https://github.com/python-tap/tappy";
+    changelog = "https://tappy.readthedocs.io/en/latest/releases.html";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ sfrijters ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tasklib/default.nix b/nixpkgs/pkgs/development/python-modules/tasklib/default.nix
new file mode 100644
index 000000000000..126ea75f6a51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tasklib/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, pythonPackages
+, fetchPypi
+, taskwarrior
+, writeShellScriptBin
+}:
+
+with pythonPackages;
+
+let
+
+wsl_stub = writeShellScriptBin "wsl" "true";
+
+in buildPythonPackage rec {
+  pname = "tasklib";
+  version = "2.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XM1zG1JjbdEEV6i42FjLDQJv+qsePnUbr3kb+APjfXs=";
+  };
+
+  propagatedBuildInputs = [
+    six
+    pytz
+    tzlocal
+  ];
+
+  nativeCheckInputs = [
+    taskwarrior
+    wsl_stub
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/robgolding/tasklib";
+    description = "Library for interacting with taskwarrior databases";
+    changelog = "https://github.com/GothenburgBitFactory/tasklib/releases/tag/${version}";
+    maintainers = with maintainers; [ arcnmx ];
+    platforms = platforms.all;
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/taskw/default.nix b/nixpkgs/pkgs/development/python-modules/taskw/default.nix
new file mode 100644
index 000000000000..5e9b2f3269e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/taskw/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, tox
+, six
+, python-dateutil
+, kitchen
+, pytestCheckHook
+, pytz
+, pkgs
+}:
+
+buildPythonPackage rec {
+  pname = "taskw";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-EQm9+b3nqbMqUAejAsh4MD/2UYi2QiWsdKMomkxUi90=";
+  };
+
+  patches = [
+    ./use-template-for-taskwarrior-install-path.patch
+    # Remove when https://github.com/ralphbean/taskw/pull/151 is merged.
+    ./support-relative-path-in-taskrc.patch
+  ];
+  postPatch = ''
+    substituteInPlace taskw/warrior.py \
+      --replace '@@taskwarrior@@' '${pkgs.taskwarrior}'
+  '';
+
+  buildInputs = [ pkgs.taskwarrior ];
+
+  propagatedBuildInputs = [ six python-dateutil kitchen pytz ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    homepage =  "https://github.com/ralphbean/taskw";
+    description = "Python bindings for your taskwarrior database";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ pierron ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/taskw/support-relative-path-in-taskrc.patch b/nixpkgs/pkgs/development/python-modules/taskw/support-relative-path-in-taskrc.patch
new file mode 100644
index 000000000000..25b1b28eff5c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/taskw/support-relative-path-in-taskrc.patch
@@ -0,0 +1,79 @@
+From 958b63ceec02b179482141cfb846ddbcae711a1b Mon Sep 17 00:00:00 2001
+From: Scott Mcdermott <scott@smemsh.net>
+Date: Sat, 28 Aug 2021 21:12:38 -0700
+Subject: [PATCH] RcFile: _read: try taskrc directory when trying to load
+ includes
+
+Taskwarrior itself tries includes as absolute path, then cwd, then
+relative to rcfile, then in various search paths (see
+GothenburgBitFactory/libshared -> src/Configuration.cpp ->
+Configuration::parse()).
+
+We won't try to duplicate that whole arrangement here, but at least look
+relative to the rcfile in addition to cwd/absolute, like taskwarrior
+does.  This will allow specification as relative path in most cases.
+Otherwise, we'd have to chdir anyways because includes are always tried
+as-is by taskw.  They would only work if specified as absolute paths or
+if in cwd
+
+We use a TaskRc() class variable to store the rcdir because there could
+be an include chain and all the instances will need to know the same
+one, but will be processing different paths, so we have to capture the
+directory of the first one processed, ie the base rcfile.
+
+Fixes #150
+
+Co-authored-by: Raito Bezarius <masterancpp@gmail.com>
+---
+ taskw/taskrc.py | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+diff --git a/taskw/taskrc.py b/taskw/taskrc.py
+index 1b6f8e5..b72dee6 100644
+--- a/taskw/taskrc.py
++++ b/taskw/taskrc.py
+@@ -1,5 +1,6 @@
+ import logging
+ import os
++import os.path
+ 
+ from taskw.fields import (
+     ChoiceField,
+@@ -39,6 +40,7 @@ class TaskRc(dict):
+ 
+     """
+ 
++    rcdir = None
+     UDA_TYPE_MAP = {
+         'date': DateField,
+         'duration': DurationField,
+@@ -54,6 +56,8 @@ class TaskRc(dict):
+                     path
+                 )
+             )
++            if not self.rcdir:
++                TaskRc.rcdir = os.path.dirname(os.path.realpath(self.path))
+             config = self._read(self.path)
+         else:
+             self.path = None
+@@ -92,6 +96,17 @@ class TaskRc(dict):
+ 
+     def _read(self, path):
+         config = {}
++        if not os.path.exists(path) and TaskRc.rcdir is not None:
++            # include path may be given relative to dir of rcfile
++            oldpath = path
++            path = os.path.join(TaskRc.rcdir, oldpath)
++            if not os.path.exists(path):
++                logger.error(
++                    "rcfile does not exist, tried %s and %s",
++                    oldpath, path
++                )
++                raise FileNotFoundError
++
+         with open(path, 'r') as config_file:
+             for raw_line in config_file.readlines():
+                 line = sanitize(raw_line)
+-- 
+2.42.0
+
diff --git a/nixpkgs/pkgs/development/python-modules/taskw/use-template-for-taskwarrior-install-path.patch b/nixpkgs/pkgs/development/python-modules/taskw/use-template-for-taskwarrior-install-path.patch
new file mode 100644
index 000000000000..8c7685c9d03b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/taskw/use-template-for-taskwarrior-install-path.patch
@@ -0,0 +1,14 @@
+commit 4de021d049a9b194da93d7e96ff12cc1cbabac83
+Author: Nicolas B. Pierron <nixos@nbp.name>
+Date:   Sun Nov 16 15:19:38 2014 +0100
+
+    Use a template for taskwarrior install path.
+
+--- a/taskw/warrior.py
++++ b/taskw/warrior.py
+@@ -449 +449 @@ class TaskWarriorShellout(TaskWarriorBase):
+-                'task',
++                '@@taskwarrior@@/bin/task',
+@@ -553 +553 @@ class TaskWarriorShellout(TaskWarriorBase):
+-                ['task', '--version'],
++                ['@@taskwarrior@@/bin/task', '--version'],
diff --git a/nixpkgs/pkgs/development/python-modules/tatsu/default.nix b/nixpkgs/pkgs/development/python-modules/tatsu/default.nix
new file mode 100644
index 000000000000..4d376dc6d2ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tatsu/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, colorama
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, regex
+}:
+
+buildPythonPackage rec {
+  pname = "tatsu";
+  version = "5.8.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "neogeny";
+    repo = "TatSu";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-cKEMRbH/xNtYM0lmNVazv3i0Q1tmVrVPrB6F2s02Sro=";
+  };
+
+  propagatedBuildInputs = [
+    colorama
+    regex
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "tatsu"
+  ];
+
+  meta = with lib; {
+    description = "Generates Python parsers from grammars in a variation of EBNF";
+    longDescription = ''
+      TatSu (the successor to Grako) is a tool that takes grammars in a
+      variation of EBNF as input, and outputs memoizing (Packrat) PEG parsers in
+      Python.
+    '';
+    homepage = "https://tatsu.readthedocs.io/";
+    changelog = "https://github.com/neogeny/TatSu/releases/tag/v${version}";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/taxi/default.nix b/nixpkgs/pkgs/development/python-modules/taxi/default.nix
new file mode 100644
index 000000000000..1d7c80e4dd0a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/taxi/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, appdirs
+, requests
+, click
+, setuptools
+, pytestCheckHook
+, freezegun
+}:
+
+buildPythonPackage rec {
+  pname = "taxi";
+  version = "6.2.0";
+
+  src = fetchFromGitHub {
+    owner = "sephii";
+    repo = "taxi";
+    rev = version;
+    hash = "sha256-wtLlO/W+39kTPjb2U6c54bxWxAQB7CxGxBh8gur+RCQ=";
+  };
+
+  propagatedBuildInputs = [
+    appdirs
+    requests
+    click
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "taxi" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/sephii/taxi/";
+    description = "Timesheeting made easy";
+    license = licenses.wtfpl;
+    maintainers = with maintainers; [ jocelynthode ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tbats/default.nix b/nixpkgs/pkgs/development/python-modules/tbats/default.nix
new file mode 100644
index 000000000000..8976fef859d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tbats/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, numpy
+, pmdarima
+, scikit-learn
+, scipy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tbats";
+  version = "1.1.3";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "intive-DataScience";
+    repo = "tbats";
+    rev = version;
+    hash = "sha256-f6QqDq/ffbnFBZRAT6KQRlqvZZSE+Pff2/o+htVabZI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    pmdarima
+    scikit-learn
+    scipy
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  pytestFlagsArray = [
+    # test_R folder is just for comparison of results with R lib
+    # we need only test folder
+    "test/"
+
+    # several tests has same name, so we use --deselect instead of disableTests
+
+    # Test execution is too long > 15 min
+    "--deselect=test/tbats/TBATS_test.py::TestTBATS::test_fit_predict_trigonometric_seasonal"
+  ];
+
+  pythonImportsCheck = [ "tbats" ];
+
+  meta = with lib; {
+    description = "BATS and TBATS forecasting methods";
+    homepage = "https://github.com/intive-DataScience/tbats";
+    changelog = "https://github.com/intive-DataScience/tbats/releases/tag/${src.rev}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tblib/default.nix b/nixpkgs/pkgs/development/python-modules/tblib/default.nix
new file mode 100644
index 000000000000..0441fb2894fd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tblib/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "tblib";
+  version = "2.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-pt8w8nLAi/i+ZuB3X62GIAXZUKa4RJuU98eIcx1w7Nc=";
+  };
+
+  meta = with lib; {
+    description = "Traceback fiddling library. Allows you to pickle tracebacks.";
+    homepage = "https://github.com/ionelmc/python-tblib";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ teh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tbm-utils/default.nix b/nixpkgs/pkgs/development/python-modules/tbm-utils/default.nix
new file mode 100644
index 000000000000..4fa46defe2cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tbm-utils/default.nix
@@ -0,0 +1,76 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, attrs
+, pendulum
+, poetry-core
+, pprintpp
+, pytestCheckHook
+, pythonRelaxDepsHook
+, wrapt
+}:
+
+buildPythonPackage rec {
+  pname = "tbm-utils";
+  version = "2.6.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "thebigmunch";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-AEKawsAxDSDNkIaXEFFgdEBOY2PpASDrhlDrsnM5eyA=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'poetry>=1.0.0' 'poetry-core' \
+      --replace 'poetry.masonry.api' 'poetry.core.masonry.api'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    pendulum
+    pprintpp
+    wrapt
+  ];
+
+  pythonRelaxDeps = [
+    "attrs"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # Skip on macOS because /etc/localtime is accessed through the pendulum
+    # library, which is not allowed in a sandboxed build.
+    "test_create_parser_filter_dates"
+    "test_parse_args"
+  ];
+
+  disabledTestPaths = lib.optionals stdenv.isDarwin [
+    # Skip on macOS because /etc/localtime is accessed through the pendulum
+    # library, which is not allowed in a sandboxed build.
+    "tests/test_datetime.py"
+    "tests/test_misc.py"
+  ];
+
+  pythonImportsCheck = [
+    "tbm_utils"
+  ];
+
+  meta = {
+    description = "A commonly-used set of utilities";
+    homepage = "https://github.com/thebigmunch/tbm-utils";
+    changelog = "https://github.com/thebigmunch/tbm-utils/blob/${version}/CHANGELOG.md";
+    license = [ lib.licenses.mit ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tcolorpy/default.nix b/nixpkgs/pkgs/development/python-modules/tcolorpy/default.nix
new file mode 100644
index 000000000000..9114043e149b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tcolorpy/default.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tcolorpy";
+  version = "0.1.4";
+
+  src = fetchFromGitHub {
+    owner = "thombashi";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-cCdKeixRfXkvEGBqozMWw2RjliLdzhlMv8GE2Q40LZQ=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    homepage = "https://github.com/thombashi/tcolorpy";
+    description = "A library to apply true color for terminal text";
+    maintainers = with maintainers; [ genericnerdyusername ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tcxparser/default.nix b/nixpkgs/pkgs/development/python-modules/tcxparser/default.nix
new file mode 100644
index 000000000000..c011b9e32fac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tcxparser/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, lxml
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "tcxparser";
+  version = "2.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "vkurup";
+    repo = "python-tcxparser";
+    rev = version;
+    hash = "sha256-HOACQpPVg/UKopz3Jdsyg0CIBnXYuVyhWUVPA+OXI0k=";
+  };
+
+  propagatedBuildInputs = [
+    lxml
+    python-dateutil
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "tcxparser"
+  ];
+
+  meta = with lib; {
+    description = "Simple parser for Garmin TCX files";
+    homepage = "https://github.com/vkurup/python-tcxparser";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ firefly-cpp ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/tcxreader/default.nix b/nixpkgs/pkgs/development/python-modules/tcxreader/default.nix
new file mode 100644
index 000000000000..9442567eec08
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tcxreader/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "tcxreader";
+  version = "0.4.5";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "alenrajsp";
+    repo = "tcxreader";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-CiOLcev9fo2BPgnPZZ2borU25f/gKISqRAapAHgLN3w=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "tcxreader"
+  ];
+
+  meta = with lib; {
+    description = "A reader for Garmin’s TCX file format";
+    homepage = "https://github.com/alenrajsp/tcxreader";
+    license = licenses.mit;
+    maintainers = with maintainers; [ firefly-cpp ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/teamcity-messages/default.nix b/nixpkgs/pkgs/development/python-modules/teamcity-messages/default.nix
new file mode 100644
index 000000000000..bc4f25003b60
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/teamcity-messages/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "teamcity-messages";
+  version = "1.32";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "JetBrains";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-9az7kD7nKqMF2b3/eFgF+pOKKIYLvTy2sf4TSJfHRnA=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests/unit-tests/"
+  ];
+
+  pythonImportsCheck = [
+    "teamcity"
+  ];
+
+  meta = with lib; {
+    description = "Python unit test reporting to TeamCity";
+    homepage = "https://github.com/JetBrains/teamcity-messages";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/telegram-text/default.nix b/nixpkgs/pkgs/development/python-modules/telegram-text/default.nix
new file mode 100644
index 000000000000..b79cd78bf4b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/telegram-text/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, poetry-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "telegram-text";
+  version = "0.1.2";
+  pyproject = true;
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "SKY-ALIN";
+    repo = "telegram-text";
+    rev = "v${version}";
+    hash = "sha256-p8SVQq7IvkVuOFE8VDugROLY5Wk0L2HmXyacTzFFSP4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Python markup module for Telegram messenger";
+    downloadPage = "https://github.com/SKY-ALIN/telegram-text";
+    homepage = "https://telegram-text.alinsky.tech/";
+    changelog = "https://github.com/SKY-ALIN/telegram-text/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sikmir ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/telegram/default.nix b/nixpkgs/pkgs/development/python-modules/telegram/default.nix
new file mode 100644
index 000000000000..c297efc0efdd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/telegram/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "telegram";
+  version = "0.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1495l2ml8mg120wfvqhikqkfczhwwaby40vdmsz8v2l69jps01fl";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/liluo/telegram";
+    description = "Telegram APIs";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/telegraph/default.nix b/nixpkgs/pkgs/development/python-modules/telegraph/default.nix
new file mode 100644
index 000000000000..b6bca3a357a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/telegraph/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, requests
+, httpx
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "telegraph";
+  version = "2.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    repo = "telegraph";
+    owner = "python273";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-xARX8lSOftNVYY4InR5vU4OiguCJJJZv/W76G9eLgNY=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  passthru.optional-dependencies = {
+    aio = [
+      httpx
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests/"
+  ];
+
+  disabledTests = [
+    "test_get_page"
+  ];
+
+  doCheck = true;
+
+  pythonImportsCheck = [
+    "telegraph"
+  ];
+
+  meta = with lib; {
+    description = "Telegraph API wrapper";
+    homepage = "https://github.com/python273/telegraph";
+    changelog = "https://github.com/python273/telegraph/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gp2112 ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/telepath/default.nix b/nixpkgs/pkgs/development/python-modules/telepath/default.nix
new file mode 100644
index 000000000000..5a38142eade3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/telepath/default.nix
@@ -0,0 +1,34 @@
+{ buildPythonPackage
+, django
+, fetchFromGitHub
+, lib
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "telepath";
+  version = "0.3";
+
+  src = fetchFromGitHub {
+    repo = "telepath";
+    owner = "wagtail";
+    rev = "v${version}";
+    sha256 = "sha256-kfEAYCXbK0HTf1Gut/APkpw2krMa6C6mU/dJ0dsqzS0=";
+  };
+
+  checkInputs = [ django ];
+
+  checkPhase = ''
+    ${python.interpreter} -m django test --settings=telepath.test_settings
+  '';
+
+  pythonImportsCheck = [ "telepath" ];
+
+  meta = with lib; {
+    description = "A library for exchanging data between Python and JavaScript";
+    homepage = "https://github.com/wagtail/telepath";
+    changelog = "https://github.com/wagtail/telepath/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ sephi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/telethon-session-sqlalchemy/default.nix b/nixpkgs/pkgs/development/python-modules/telethon-session-sqlalchemy/default.nix
new file mode 100644
index 000000000000..346f7de2b898
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/telethon-session-sqlalchemy/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k, sqlalchemy }:
+
+buildPythonPackage rec {
+  pname = "telethon-session-sqlalchemy";
+  version = "0.2.16";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f847c57302a102eb88e29ed95b8f4efa69582db2966fd806c21376b9a66ad4a8";
+  };
+
+  propagatedBuildInputs = [
+    sqlalchemy
+  ];
+
+  # No tests available
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/tulir/telethon-session-sqlalchemy";
+    description = "SQLAlchemy backend for Telethon session storage";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nyanloutre ];
+
+    # Package requires SQLAlchemy <2
+    # https://github.com/tulir/telethon-session-sqlalchemy/blob/d498503ddde332e190bfa47e70f0bfa59fe6b5ef/setup.py#L17
+    # Repo is archived and so this is unlikely to change unless someone forks
+    # and takes over development
+    broken = versionAtLeast sqlalchemy.version "2";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/telethon/default.nix b/nixpkgs/pkgs/development/python-modules/telethon/default.nix
new file mode 100644
index 000000000000..f40809dabf9e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/telethon/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, openssl
+, rsa
+, pyaes
+, pythonOlder
+, setuptools
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "telethon";
+  version = "1.26.1";
+  format = "pyproject";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "LonamiWebs";
+    repo = "Telethon";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-RxnC+PVSnLeCZ1xap6n6CjpeA8Ig6oLGiB0LDxqUmsA=";
+  };
+
+  patchPhase = ''
+    substituteInPlace telethon/crypto/libssl.py --replace \
+      "ctypes.util.find_library('ssl')" "'${lib.getLib openssl}/lib/libssl.so'"
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    rsa
+    pyaes
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "tests/telethon"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/LonamiWebs/Telethon";
+    description = "Full-featured Telegram client library for Python 3";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nyanloutre ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/teletype/default.nix b/nixpkgs/pkgs/development/python-modules/teletype/default.nix
new file mode 100644
index 000000000000..83cfb471e0d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/teletype/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "teletype";
+  version = "1.3.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uBppM4w9GlMgYqKFGw1Rcjvq+mnU04K3E74jCgK9YYo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "teletype"
+  ];
+
+  meta = with lib; {
+    description = "A high-level cross platform tty library";
+    homepage = "https://github.com/jkwill87/teletype";
+    license = licenses.mit;
+    maintainers = with maintainers; [ urlordjames ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/telfhash/default.nix b/nixpkgs/pkgs/development/python-modules/telfhash/default.nix
new file mode 100644
index 000000000000..40198cddb681
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/telfhash/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, capstone
+, packaging
+, pyelftools
+, tlsh
+, nose
+}:
+buildPythonPackage rec {
+  pname = "telfhash";
+  version = "0.9.8";
+
+  src = fetchFromGitHub {
+    owner = "trendmicro";
+    repo = "telfhash";
+    rev = "v${version}";
+    sha256 = "124zajv43wx9l8rvdvmzcnbh0xpzmbn253pznpbjwvygfx16gq02";
+  };
+
+  # The tlsh library's name is just "tlsh"
+  postPatch = ''
+    substituteInPlace requirements.txt \
+       --replace "python-tlsh" "tlsh" \
+       --replace "py-tlsh" "tlsh"
+  '';
+
+  propagatedBuildInputs = [
+    capstone
+    pyelftools
+    tlsh
+    packaging
+  ];
+
+  nativeCheckInputs = [
+    nose
+  ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  pythonImportsCheck = [
+    "telfhash"
+  ];
+
+  meta = with lib; {
+    description = "Symbol hash for ELF files";
+    homepage = "https://github.com/trendmicro/telfhash";
+    license = licenses.asl20;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tellduslive/default.nix b/nixpkgs/pkgs/development/python-modules/tellduslive/default.nix
new file mode 100644
index 000000000000..f933553dcdbe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tellduslive/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, docopt
+, fetchFromGitHub
+, requests
+, requests-oauthlib
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "tellduslive";
+  version = "0.10.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "molobrakos";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0aqhj6fq2z2qb4jyk23ygjicf5nlj8lkya7blkyqb7jra5k1gyg0";
+  };
+
+  propagatedBuildInputs = [
+    docopt
+    requests
+    requests-oauthlib
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "tellduslive"
+  ];
+
+  meta = with lib; {
+    description = "Python module to communicate with Telldus Live";
+    homepage = "https://github.com/molobrakos/tellduslive";
+    license = with licenses; [ unlicense ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/temescal/default.nix b/nixpkgs/pkgs/development/python-modules/temescal/default.nix
new file mode 100644
index 000000000000..2c19ab2844ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/temescal/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pycryptodome
+}:
+
+buildPythonPackage rec {
+  pname = "temescal";
+  version = "0.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MfTftheNj8zI3iXIIJU+jy9xikvX9eO58LA0NCMJBnY=";
+  };
+
+  propagatedBuildInputs = [
+    pycryptodome
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "temescal"
+  ];
+
+  meta = with lib; {
+    description = "Module for interacting with LG speaker systems";
+    homepage = "https://github.com/google/python-temescal";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/temperusb/default.nix b/nixpkgs/pkgs/development/python-modules/temperusb/default.nix
new file mode 100644
index 000000000000..929560167e76
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/temperusb/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pyusb
+}:
+
+buildPythonPackage rec {
+  pname = "temperusb";
+  version = "1.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-enYhqtJnORKhBoZkZPISLCt9Ec5SN6txD3z0SXuPrQo=";
+  };
+
+  propagatedBuildInputs = [
+    pyusb
+  ];
+
+  # Module has no tests which are shipped and source is not tagged
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "temperusb"
+  ];
+
+  meta = with lib; {
+    description = "Library to read TEMPer USB HID devices";
+    homepage = "https://github.com/padelt/temper-python";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tempest/default.nix b/nixpkgs/pkgs/development/python-modules/tempest/default.nix
new file mode 100644
index 000000000000..3c8217239f23
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tempest/default.nix
@@ -0,0 +1,93 @@
+{ lib
+, buildPythonPackage
+, defusedxml
+, fetchPypi
+, pbr
+, cliff
+, jsonschema
+, testtools
+, paramiko
+, netaddr
+, oslo-concurrency
+, oslo-config
+, oslo-log
+, stestr
+, oslo-serialization
+, oslo-utils
+, fixtures
+, pythonOlder
+, pyyaml
+, subunit
+, stevedore
+, prettytable
+, urllib3
+, debtcollector
+, hacking
+, oslotest
+, bash
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "tempest";
+  version = "36.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-97Z5C7IluOXSkkUamFuljzzvD3QxdHZ/p8mXE9jW/2I=";
+  };
+
+  propagatedBuildInputs = [
+    pbr
+    cliff
+    defusedxml
+    jsonschema
+    testtools
+    paramiko
+    netaddr
+    oslo-concurrency
+    oslo-config
+    oslo-log
+    stestr
+    oslo-serialization
+    oslo-utils
+    fixtures
+    pyyaml
+    subunit
+    stevedore
+    prettytable
+    urllib3
+    debtcollector
+  ];
+
+  nativeCheckInputs = [
+    stestr
+    hacking
+    oslotest
+  ];
+
+  checkPhase = ''
+    # Tests expect these applications available as such.
+    mkdir -p bin
+    export PATH="$PWD/bin:$PATH"
+    printf '#!${bash}/bin/bash\nexec ${python.interpreter} -m tempest.cmd.main "$@"\n' > bin/tempest
+    printf '#!${bash}/bin/bash\nexec ${python.interpreter} -m tempest.cmd.subunit_describe_calls "$@"\n' > bin/subunit-describe-calls
+    chmod +x bin/*
+
+    stestr --test-path tempest/tests run -e <(echo "
+      tempest.tests.lib.cli.test_execute.TestExecute.test_execute_with_prefix
+    ")
+  '';
+
+  pythonImportsCheck = [ "tempest" ];
+
+  meta = with lib; {
+    description = "An OpenStack integration test suite that runs against live OpenStack cluster and validates an OpenStack deployment";
+    homepage = "https://github.com/openstack/tempest";
+    license = licenses.asl20;
+    maintainers = teams.openstack.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tempita/default.nix b/nixpkgs/pkgs/development/python-modules/tempita/default.nix
new file mode 100644
index 000000000000..344ed1ea68d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tempita/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchFromGitHub, nose }:
+
+buildPythonPackage {
+  version = "0.5.3-2016-09-28";
+  pname = "tempita";
+
+  src = fetchFromGitHub {
+    owner = "agramfort";
+    repo = "tempita";
+    rev = "47414a7c6e46a9a9afe78f0bce2ea299fa84d10";
+    sha256 = "0f33jjjs5rvp7ar2j6ggyfykcrsrn04jaqcq71qfvycf6b7nw3rn";
+  };
+
+  buildInputs = [ nose ];
+
+  meta = {
+    homepage = "https://github.com/agramfort/tempita";
+    description = "A very small text templating language";
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tempora/default.nix b/nixpkgs/pkgs/development/python-modules/tempora/default.nix
new file mode 100644
index 000000000000..591cf9e3555f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tempora/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, freezegun
+, jaraco-functools
+, pytest-freezegun
+, pytestCheckHook
+, pythonOlder
+, pytz
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "tempora";
+  version = "5.5.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-E+T8yZfQUJwzBtaEHwPpOBt+Xkayvr+ukVGvkAhfDCY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    jaraco-functools
+    pytz
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    pytest-freezegun
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "tempora"
+    "tempora.schedule"
+    "tempora.timing"
+    "tempora.utc"
+  ];
+
+  meta = with lib; {
+    description = "Objects and routines pertaining to date and time";
+    homepage = "https://github.com/jaraco/tempora";
+    changelog = "https://github.com/jaraco/tempora/blob/v${version}/NEWS.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tenacity/default.nix b/nixpkgs/pkgs/development/python-modules/tenacity/default.nix
new file mode 100644
index 000000000000..5fe70090feea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tenacity/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pbr
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, tornado
+, typeguard
+}:
+
+buildPythonPackage rec {
+  pname = "tenacity";
+  version = "8.2.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-U5jvDXjmP0AAfB+0wL/5bhkROU0vqNGU93YZwF/2zIo=";
+  };
+
+  nativeBuildInputs = [
+    pbr
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    tornado
+    typeguard
+  ];
+
+  pythonImportsCheck = [
+    "tenacity"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jd/tenacity";
+    description = "Retrying library for Python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jakewaksbaum ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tensorboard-data-server/default.nix b/nixpkgs/pkgs/development/python-modules/tensorboard-data-server/default.nix
new file mode 100644
index 000000000000..5ff48c7cc3d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorboard-data-server/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder }:
+
+buildPythonPackage rec {
+  pname = "tensorboard-data-server";
+  version = "0.7.1";
+  format = "wheel";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "tensorboard_data_server";
+    inherit version format;
+    dist = "py3";
+    python = "py3";
+    hash = "sha256-mTi9OfUEF5ezOSEGb7oOqwOg3RDRiHoF5irliEGtTD8=";
+  };
+
+  pythonImportsCheck = [ "tensorboard_data_server" ];
+
+  meta = with lib; {
+    description = "Fast data loading for TensorBoard";
+    homepage = "https://github.com/tensorflow/tensorboard/tree/master/tensorboard/data/server";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tensorboard-plugin-profile/default.nix b/nixpkgs/pkgs/development/python-modules/tensorboard-plugin-profile/default.nix
new file mode 100644
index 000000000000..158437a93d1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorboard-plugin-profile/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, setuptools
+, gviz-api
+, protobuf
+, werkzeug
+}:
+
+buildPythonPackage rec {
+  pname = "tensorboard_plugin_profile";
+  version = "2.11.1";
+  format = "wheel";
+
+  src = fetchPypi {
+    inherit pname version;
+    format = "wheel";
+    dist = "py3";
+    python = "py3";
+    hash = "sha256-t9AZg0BGjDcOxtoRBHZO0joIgLHpoKqEUY4pxmw8sjg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    gviz-api
+    protobuf
+    werkzeug
+  ];
+
+  meta = with lib; {
+    description = "Profile Tensorboard Plugin.";
+    homepage = "http://tensorflow.org";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ndl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tensorboard-plugin-wit/default.nix b/nixpkgs/pkgs/development/python-modules/tensorboard-plugin-wit/default.nix
new file mode 100644
index 000000000000..ec4a63f65d43
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorboard-plugin-wit/default.nix
@@ -0,0 +1,22 @@
+{ lib, fetchPypi, buildPythonPackage
+}:
+
+buildPythonPackage rec {
+  pname = "tensorboard_plugin_wit";
+  version = "1.7.0";
+  format = "wheel";
+
+  src = fetchPypi {
+    inherit pname version;
+    format = "wheel";
+    python = "py3";
+    sha256 = "0nv855qm2fav70lndsrv810pqgg41sbmd70fk86wk18ih825yxzf";
+  };
+
+  meta = with lib; {
+    description = "What-If Tool TensorBoard plugin.";
+    homepage = "http://tensorflow.org";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ndl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tensorboard/default.nix b/nixpkgs/pkgs/development/python-modules/tensorboard/default.nix
new file mode 100644
index 000000000000..73c76d74771c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorboard/default.nix
@@ -0,0 +1,84 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, pythonRelaxDepsHook
+, numpy
+, wheel
+, werkzeug
+, protobuf
+, grpcio
+, markdown
+, absl-py
+, google-auth-oauthlib
+, setuptools
+, tensorboard-data-server
+, tensorboard-plugin-wit
+, tensorboard-plugin-profile
+}:
+
+# tensorflow/tensorboard is built from a downloaded wheel, because
+# https://github.com/tensorflow/tensorboard/issues/719 blocks
+# buildBazelPackage.
+
+buildPythonPackage rec {
+  pname = "tensorboard";
+  version = "2.14.0";
+  format = "wheel";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version format;
+    dist = "py3";
+    python = "py3";
+    hash = "sha256-Nmf5dF2ZKAg2rWcwIjYshA9g7Y/v1aPjC/Bx9aj9ABc=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    "google-auth-oauthlib"
+    "protobuf"
+  ];
+
+  propagatedBuildInputs = [
+    absl-py
+    grpcio
+    google-auth-oauthlib
+    markdown
+    numpy
+    protobuf
+    setuptools
+    tensorboard-data-server
+    tensorboard-plugin-profile
+    tensorboard-plugin-wit
+    werkzeug
+    # not declared in install_requires, but used at runtime
+    # https://github.com/NixOS/nixpkgs/issues/73840
+    wheel
+  ];
+
+  # in the absence of a real test suite, run cli and imports
+  checkPhase = ''
+    $out/bin/tensorboard --help > /dev/null
+  '';
+
+  pythonImportsCheck = [
+    "tensorboard"
+    "tensorboard.backend"
+    "tensorboard.compat"
+    "tensorboard.data"
+    "tensorboard.plugins"
+    "tensorboard.summary"
+    "tensorboard.util"
+  ];
+
+  meta = with lib; {
+    description = "TensorFlow's Visualization Toolkit";
+    homepage = "https://www.tensorflow.org/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tensorboardx/default.nix b/nixpkgs/pkgs/development/python-modules/tensorboardx/default.nix
new file mode 100644
index 000000000000..6097d2ecfd81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorboardx/default.nix
@@ -0,0 +1,84 @@
+{ boto3
+, buildPythonPackage
+, crc32c
+, fetchFromGitHub
+, lib
+, matplotlib
+, moto
+, numpy
+, protobuf
+, pytestCheckHook
+, torch
+, setuptools-scm
+, soundfile
+, stdenv
+, tensorboard
+, torchvision
+}:
+
+buildPythonPackage rec {
+  pname = "tensorboardx";
+  version = "2.6.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "lanpa";
+    repo = "tensorboardX";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-m7RLDOMuRNLacnIudptBGjhcTlMk8+v/onz6Amqxb90=";
+  };
+
+  nativeBuildInputs = [
+    protobuf
+    setuptools-scm
+  ];
+
+  # required to make tests deterministic
+  env.PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION = "python";
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  propagatedBuildInputs = [
+    crc32c
+    numpy
+  ];
+
+  pythonImportsCheck = [ "tensorboardX" ];
+
+  nativeCheckInputs = [
+    boto3
+    matplotlib
+    moto
+    pytestCheckHook
+    soundfile
+    torch
+    tensorboard
+    torchvision
+  ];
+
+  disabledTests = [
+    # ImportError: Visdom visualization requires installation of Visdom
+    "test_TorchVis"
+    # Requires network access (FileNotFoundError: [Errno 2] No such file or directory: 'wget')
+    "test_onnx_graph"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # Fails with a mysterious error in pytorch:
+    # RuntimeError: required keyword attribute 'name' has the wrong type
+    "test_pytorch_graph"
+  ];
+
+  disabledTestPaths = [
+    # we are not interested in linting errors
+    "tests/test_lint.py"
+  ];
+
+  meta = with lib; {
+    description = "Library for writing tensorboard-compatible logs";
+    homepage = "https://tensorboardx.readthedocs.io";
+    downloadPage = "https://github.com/lanpa/tensorboardX";
+    changelog = "https://github.com/lanpa/tensorboardX/blob/${src.rev}/HISTORY.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lebastr akamaus ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tensorflow-datasets/corruptions.patch b/nixpkgs/pkgs/development/python-modules/tensorflow-datasets/corruptions.patch
new file mode 100644
index 000000000000..71e5da5e11bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow-datasets/corruptions.patch
@@ -0,0 +1,22 @@
+diff --git a/tensorflow_datasets/image_classification/corruptions.py b/tensorflow_datasets/image_classification/corruptions.py
+index 066c4460..cb9a6667 100644
+--- a/tensorflow_datasets/image_classification/corruptions.py
++++ b/tensorflow_datasets/image_classification/corruptions.py
+@@ -35,7 +35,7 @@ FROST_FILENAMES = []
+ 
+ 
+ def _imagemagick_bin():
+-  return 'imagemagick'  # pylint: disable=unreachable
++  return 'convert'  # pylint: disable=unreachable
+ 
+ 
+ # /////////////// Corruption Helpers ///////////////
+@@ -675,7 +675,7 @@ def spatter(x, severity=1):
+     #     ker = np.array([[-1,-2,-3],[-2,0,0],[-3,0,1]], dtype=np.float32)
+     #     ker -= np.mean(ker)
+     ker = np.array([[-2, -1, 0], [-1, 1, 1], [0, 1, 2]])
+-    dist = cv2.filter2D(dist, cv2.CVX_8U, ker)
++    dist = cv2.filter2D(dist, cv2.CV_8U, ker)
+     dist = cv2.blur(dist, (3, 3)).astype(np.float32)
+ 
+     m = cv2.cvtColor(liquid_layer * dist, cv2.COLOR_GRAY2BGRA)
diff --git a/nixpkgs/pkgs/development/python-modules/tensorflow-datasets/default.nix b/nixpkgs/pkgs/development/python-modules/tensorflow-datasets/default.nix
new file mode 100644
index 000000000000..3fd7a441106d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow-datasets/default.nix
@@ -0,0 +1,180 @@
+{ apache-beam
+, array-record
+, attrs
+, beautifulsoup4
+, buildPythonPackage
+, click
+, datasets
+, dill
+, dm-tree
+, fetchFromGitHub
+, ffmpeg
+, future
+, imagemagick
+, importlib-resources
+, jax
+, jaxlib
+, jinja2
+, langdetect
+, lib
+, lxml
+, matplotlib
+, mwparserfromhell
+, mwxml
+, networkx
+, nltk
+, numpy
+, opencv4
+, pandas
+, pillow
+, promise
+, protobuf
+, psutil
+, pycocotools
+, pydub
+, pytest-xdist
+, pytestCheckHook
+, requests
+, scikit-image
+, scipy
+, six
+, tensorflow
+, tensorflow-metadata
+, termcolor
+, tifffile
+, tqdm
+, zarr
+}:
+
+buildPythonPackage rec {
+  pname = "tensorflow-datasets";
+  version = "4.9.3";
+
+  src = fetchFromGitHub {
+    owner = "tensorflow";
+    repo = "datasets";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ZXCcXChrWqs0FAK5Fe8cD+MuJpWa9Dwo/ny5fOX2lKU=";
+  };
+
+  patches = [
+    # addresses https://github.com/tensorflow/datasets/issues/3673
+    ./corruptions.patch
+  ];
+
+  propagatedBuildInputs = [
+    array-record
+    attrs
+    dill
+    dm-tree
+    future
+    importlib-resources
+    numpy
+    promise
+    protobuf
+    psutil
+    requests
+    six
+    tensorflow-metadata
+    termcolor
+    tqdm
+  ];
+
+  pythonImportsCheck = [
+    "tensorflow_datasets"
+  ];
+
+  nativeCheckInputs = [
+    apache-beam
+    beautifulsoup4
+    click
+    datasets
+    ffmpeg
+    imagemagick
+    jax
+    jaxlib
+    jinja2
+    langdetect
+    lxml
+    matplotlib
+    mwparserfromhell
+    mwxml
+    networkx
+    nltk
+    opencv4
+    pandas
+    pillow
+    pycocotools
+    pydub
+    pytest-xdist
+    pytestCheckHook
+    scikit-image
+    scipy
+    tensorflow
+    tifffile
+    zarr
+  ];
+
+  disabledTestPaths = [
+    # Sandbox violations: network access, filesystem write attempts outside of build dir, ...
+    "tensorflow_datasets/core/dataset_builder_test.py"
+    "tensorflow_datasets/core/dataset_info_test.py"
+    "tensorflow_datasets/core/features/features_test.py"
+    "tensorflow_datasets/core/github_api/github_path_test.py"
+    "tensorflow_datasets/core/registered_test.py"
+    "tensorflow_datasets/core/utils/gcs_utils_test.py"
+    "tensorflow_datasets/import_without_tf_test.py"
+    "tensorflow_datasets/proto/build_tf_proto_test.py"
+    "tensorflow_datasets/scripts/cli/build_test.py"
+
+    # Requires `pretty_midi` which is not packaged in `nixpkgs`.
+    "tensorflow_datasets/audio/groove.py"
+    "tensorflow_datasets/datasets/groove/groove_dataset_builder_test.py"
+
+    # Requires `crepe` which is not packaged in `nixpkgs`.
+    "tensorflow_datasets/audio/nsynth.py"
+    "tensorflow_datasets/datasets/nsynth/nsynth_dataset_builder_test.py"
+
+    # Requires `conllu` which is not packaged in `nixpkgs`.
+    "tensorflow_datasets/core/dataset_builders/conll/conllu_dataset_builder_test.py"
+    "tensorflow_datasets/datasets/universal_dependencies/universal_dependencies_dataset_builder_test.py"
+    "tensorflow_datasets/datasets/xtreme_pos/xtreme_pos_dataset_builder_test.py"
+
+    # Requires `gcld3` and `pretty_midi` which are not packaged in `nixpkgs`.
+    "tensorflow_datasets/core/lazy_imports_lib_test.py"
+
+    # Requires `tensorflow_io` which is not packaged in `nixpkgs`.
+    "tensorflow_datasets/core/features/audio_feature_test.py"
+    "tensorflow_datasets/image/lsun_test.py"
+
+    # Requires `envlogger` which is not packaged in `nixpkgs`.
+    "tensorflow_datasets/rlds/locomotion/locomotion_test.py"
+    "tensorflow_datasets/rlds/robosuite_panda_pick_place_can/robosuite_panda_pick_place_can_test.py"
+
+    # Fails with `TypeError: Constant constructor takes either 0 or 2 positional arguments`
+    # deep in TF AutoGraph. Doesn't reproduce in Docker with Ubuntu 22.04 => might be related
+    # to the differences in some of the dependencies?
+    "tensorflow_datasets/rl_unplugged/rlu_atari/rlu_atari_test.py"
+
+    # Fails with `ValueError: setting an array element with a sequence`
+    "tensorflow_datasets/core/dataset_utils_test.py"
+    "tensorflow_datasets/core/features/sequence_feature_test.py"
+
+    # Requires `tensorflow_docs` which is not packaged in `nixpkgs` and the test is for documentation anyway.
+    "tensorflow_datasets/scripts/documentation/build_api_docs_test.py"
+
+    # Not a test, should not be executed.
+    "tensorflow_datasets/testing/test_utils.py"
+
+    # Require `gcld3` and `nltk.punkt` which are not packaged in `nixpkgs`.
+    "tensorflow_datasets/text/c4_test.py"
+    "tensorflow_datasets/text/c4_utils_test.py"
+  ];
+
+  meta = with lib; {
+    description = "Library of datasets ready to use with TensorFlow";
+    homepage = "https://www.tensorflow.org/datasets/overview";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ndl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tensorflow-estimator/bin.nix b/nixpkgs/pkgs/development/python-modules/tensorflow-estimator/bin.nix
new file mode 100644
index 000000000000..c7d8e4d630be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow-estimator/bin.nix
@@ -0,0 +1,27 @@
+{ lib, fetchPypi, buildPythonPackage
+, numpy
+, absl-py
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "tensorflow-estimator";
+  version = "2.11.0";
+  format = "wheel";
+
+  src = fetchPypi {
+    pname = "tensorflow_estimator";
+    inherit version format;
+    hash = "sha256-6jtkrP/z2aJE8GF4yb3ty90/Eltn0IiNuoIpSY0GRos=";
+  };
+
+  propagatedBuildInputs = [ mock numpy absl-py ];
+
+  meta = with lib; {
+    description = "TensorFlow Estimator is a high-level API that encapsulates model training, evaluation, prediction, and exporting.";
+    homepage = "http://tensorflow.org";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jyp ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/tensorflow-metadata/build.patch b/nixpkgs/pkgs/development/python-modules/tensorflow-metadata/build.patch
new file mode 100644
index 000000000000..5b570bf72062
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow-metadata/build.patch
@@ -0,0 +1,15 @@
+diff --git a/setup.py b/setup.py
+index 7a09b2f..94c5aa6 100644
+--- a/setup.py
++++ b/setup.py
+@@ -137,8 +137,5 @@ setup(
+     long_description_content_type='text/markdown',
+     keywords='tensorflow metadata tfx',
+     download_url='https://github.com/tensorflow/metadata/tags',
+-    requires=[],
+-    cmdclass={
+-        'build': _BuildCommand,
+-        'bazel_build': _BazelBuildCommand,
+-    })
++    requires=[]
++    )
diff --git a/nixpkgs/pkgs/development/python-modules/tensorflow-metadata/default.nix b/nixpkgs/pkgs/development/python-modules/tensorflow-metadata/default.nix
new file mode 100644
index 000000000000..be299e867d32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow-metadata/default.nix
@@ -0,0 +1,56 @@
+{ absl-py
+, buildPythonPackage
+, fetchFromGitHub
+, googleapis-common-protos
+, protobuf
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "tensorflow-metadata";
+  version = "1.14.0";
+
+  src = fetchFromGitHub {
+    owner = "tensorflow";
+    repo = "metadata";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ZfX25CaV+tZVdas+n7O6Gqv1GxOP1iwippIXxfhcOfg=";
+  };
+
+  patches = [
+    ./build.patch
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'protobuf>=3.13,<4' 'protobuf>=3.13'
+  '';
+
+  # Default build pulls in Bazel + extra deps, given the actual build
+  # is literally three lines (see below) - replace it with custom build.
+  preBuild = ''
+    for proto in tensorflow_metadata/proto/v0/*.proto; do
+      protoc --python_out=. $proto
+    done
+  '';
+
+  propagatedBuildInputs = [
+    absl-py
+    googleapis-common-protos
+    protobuf
+  ];
+
+  # has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "tensorflow_metadata"
+  ];
+
+  meta = with lib; {
+    description = "Standard representations for metadata that are useful when training machine learning models with TensorFlow";
+    homepage = "https://github.com/tensorflow/metadata";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ndl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tensorflow-probability/default.nix b/nixpkgs/pkgs/development/python-modules/tensorflow-probability/default.nix
new file mode 100644
index 000000000000..e81e9736c26c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow-probability/default.nix
@@ -0,0 +1,121 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, bazel_6
+, buildBazelPackage
+, buildPythonPackage
+, cctools
+, python
+, setuptools
+, wheel
+, absl-py
+, tensorflow
+, six
+, numpy
+, dm-tree
+, keras
+, decorator
+, cloudpickle
+, gast
+, hypothesis
+, scipy
+, pandas
+, mpmath
+, matplotlib
+, mock
+, pytest
+}:
+
+let
+  version = "0.21.0";
+  pname = "tensorflow-probability";
+
+  # first build all binaries and generate setup.py using bazel
+  bazel-wheel = buildBazelPackage {
+    name = "tensorflow_probability-${version}-py2.py3-none-any.whl";
+    src = fetchFromGitHub {
+      owner = "tensorflow";
+      repo = "probability";
+      rev = "refs/tags/v${version}";
+      hash = "sha256-DsJd1E5n86xNS7Ci0DXxoUxQ9jH8OwTZq2UuLlQtMUU=";
+    };
+    nativeBuildInputs = [
+      # needed to create the output wheel in installPhase
+      python
+      setuptools
+      wheel
+      absl-py
+      tensorflow
+    ];
+
+    bazel = bazel_6;
+
+    bazelTargets = [ ":pip_pkg" ];
+    LIBTOOL = lib.optionalString stdenv.isDarwin "${cctools}/bin/libtool";
+
+    fetchAttrs = {
+      sha256 = "sha256-1iO/eXz1wvSIRTmGuGZDF9VeDVTiWYnjw0Cby4n/6HM=";
+    };
+
+    buildAttrs = {
+      preBuild = ''
+        patchShebangs .
+      '';
+
+      installPhase = ''
+        # work around timestamp issues
+        # https://github.com/NixOS/nixpkgs/issues/270#issuecomment-467583872
+        export SOURCE_DATE_EPOCH=315532800
+
+        # First build, then move. Otherwise pip_pkg would create the dir $out
+        # and then put the wheel in that directory. However we want $out to
+        # point directly to the wheel file.
+        ./bazel-bin/pip_pkg . --release
+        mv *.whl "$out"
+      '';
+    };
+  };
+in buildPythonPackage {
+  inherit version pname;
+  format = "wheel";
+
+  src = bazel-wheel;
+
+  propagatedBuildInputs = [
+    tensorflow
+    six
+    numpy
+    decorator
+    cloudpickle
+    gast
+    dm-tree
+    keras
+  ];
+
+  # Listed here:
+  # https://github.com/tensorflow/probability/blob/f3777158691787d3658b5e80883fe1a933d48989/testing/dependency_install_lib.sh#L83
+  nativeCheckInputs = [
+    hypothesis
+    pytest
+    scipy
+    pandas
+    mpmath
+    matplotlib
+    mock
+  ];
+
+  # Ideally, we run unit tests with pytest, but in checkPhase, only the Bazel-build wheel is available.
+  # But it seems not guaranteed that running the tests with pytest will even work, see
+  # https://github.com/tensorflow/probability/blob/c2a10877feb2c4c06a4dc58281e69c37a11315b9/CONTRIBUTING.md?plain=1#L69
+  # Ideally, tests would be run using Bazel. For now, lets's do a...
+
+  # sanity check
+  pythonImportsCheck = [ "tensorflow_probability" ];
+
+  meta = with lib; {
+    description = "Library for probabilistic reasoning and statistical analysis";
+    homepage = "https://www.tensorflow.org/probability/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tensorflow/absl_py_argparse_flags.patch b/nixpkgs/pkgs/development/python-modules/tensorflow/absl_py_argparse_flags.patch
new file mode 100644
index 000000000000..1b130e22662e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow/absl_py_argparse_flags.patch
@@ -0,0 +1,11 @@
+diff -Naurd x/third_party/systemlibs/absl_py.absl.flags.BUILD y/third_party/systemlibs/absl_py.absl.flags.BUILD
+--- x/third_party/systemlibs/absl_py.absl.flags.BUILD	2023-09-20 06:02:15.079683729 +0000
++++ y/third_party/systemlibs/absl_py.absl.flags.BUILD	2023-09-20 06:04:58.491897303 +0000
+@@ -5,3 +5,7 @@
+ py_library(
+     name = "flags",
+ )
++
++py_library(
++    name = "argparse_flags",
++)
diff --git a/nixpkgs/pkgs/development/python-modules/tensorflow/absl_to_std.patch b/nixpkgs/pkgs/development/python-modules/tensorflow/absl_to_std.patch
new file mode 100644
index 000000000000..b834ec983c94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow/absl_to_std.patch
@@ -0,0 +1,389 @@
+diff -Naurd x/tensorflow/c/experimental/stream_executor/stream_executor.cc y/tensorflow/c/experimental/stream_executor/stream_executor.cc
+--- x/tensorflow/c/experimental/stream_executor/stream_executor.cc	2023-10-19 14:25:48.648646416 +0000
++++ y/tensorflow/c/experimental/stream_executor/stream_executor.cc	2023-10-19 14:29:11.700743574 +0000
+@@ -23,6 +23,7 @@
+ 
+ #include <string>
+ #include <utility>
++#include <optional>
+ 
+ #include "absl/functional/any_invocable.h"
+ #include "tensorflow/c/c_api_macros.h"
+@@ -275,17 +276,17 @@
+     stream_executor_->unified_memory_deallocate(&device_, mem);
+   }
+ 
+-  absl::optional<AllocatorStats> GetAllocatorStats() override {
++  std::optional<AllocatorStats> GetAllocatorStats() override {
+     SP_AllocatorStats c_stats{SP_ALLOCATORSTATS_STRUCT_SIZE};
+     TF_Bool has_stats =
+         stream_executor_->get_allocator_stats(&device_, &c_stats);
+     if (!has_stats) {
+-      return absl::nullopt;
++      return std::nullopt;
+     }
+     tsl::Status status = ValidateSPAllocatorStats(c_stats);
+     if (!status.ok()) {
+       LOG(ERROR) << status.message();
+-      return absl::nullopt;
++      return std::nullopt;
+     }
+     ::stream_executor::AllocatorStats stats;
+     stats.num_allocs = c_stats.num_allocs;
+diff -Naurd x/tensorflow/c/experimental/stream_executor/stream_executor_test.cc y/tensorflow/c/experimental/stream_executor/stream_executor_test.cc
+--- x/tensorflow/c/experimental/stream_executor/stream_executor_test.cc	2023-10-19 14:25:48.648646416 +0000
++++ y/tensorflow/c/experimental/stream_executor/stream_executor_test.cc	2023-10-19 14:29:11.700743574 +0000
+@@ -15,6 +15,7 @@
+ #include "tensorflow/c/experimental/stream_executor/stream_executor.h"
+ 
+ #include <utility>
++#include <optional>
+ 
+ #include "tensorflow/c/experimental/stream_executor/stream_executor_internal.h"
+ #include "tensorflow/c/experimental/stream_executor/stream_executor_test_util.h"
+@@ -239,7 +240,7 @@
+   };
+ 
+   StreamExecutor* executor = GetExecutor(0);
+-  absl::optional<AllocatorStats> optional_stats = executor->GetAllocatorStats();
++  std::optional<AllocatorStats> optional_stats = executor->GetAllocatorStats();
+   ASSERT_TRUE(optional_stats.has_value());
+   AllocatorStats stats = optional_stats.value();
+   ASSERT_EQ(stats.bytes_in_use, 123);
+diff -Naurd x/tensorflow/compiler/xla/stream_executor/allocator_stats.h y/tensorflow/compiler/xla/stream_executor/allocator_stats.h
+--- x/tensorflow/compiler/xla/stream_executor/allocator_stats.h	2023-10-19 14:25:55.064649379 +0000
++++ y/tensorflow/compiler/xla/stream_executor/allocator_stats.h	2023-10-19 14:29:11.700743574 +0000
+@@ -17,6 +17,7 @@
+ #define TENSORFLOW_COMPILER_XLA_STREAM_EXECUTOR_ALLOCATOR_STATS_H_
+ 
+ #include <string>
++#include <optional>
+ 
+ #include "absl/types/optional.h"
+ #include "tensorflow/compiler/xla/stream_executor/platform/port.h"
+diff -Naurd x/tensorflow/core/common_runtime/mkl_cpu_allocator.h y/tensorflow/core/common_runtime/mkl_cpu_allocator.h
+--- x/tensorflow/core/common_runtime/mkl_cpu_allocator.h	2023-10-19 14:25:58.996651199 +0000
++++ y/tensorflow/core/common_runtime/mkl_cpu_allocator.h	2023-10-19 14:29:11.700743574 +0000
+@@ -22,6 +22,7 @@
+ #ifdef INTEL_MKL
+ 
+ #include <cstdlib>
++#include <optional>
+ 
+ #include "tensorflow/core/common_runtime/bfc_allocator.h"
+ #include "tensorflow/core/common_runtime/pool_allocator.h"
+@@ -80,7 +81,7 @@
+     port::AlignedFree(ptr);
+   }
+ 
+-  absl::optional<AllocatorStats> GetStats() override {
++  std::optional<AllocatorStats> GetStats() override {
+     mutex_lock l(mutex_);
+     return stats_;
+   }
+@@ -242,7 +243,7 @@
+       large_size_allocator_->DeallocateRaw(ptr);
+     }
+   }
+-  absl::optional<AllocatorStats> GetStats() override {
++  std::optional<AllocatorStats> GetStats() override {
+     auto s_stats = small_size_allocator_->GetStats();
+     auto l_stats = large_size_allocator_->GetStats();
+ 
+diff -Naurd x/tensorflow/core/common_runtime/pluggable_device/pluggable_device_simple_allocator.cc y/tensorflow/core/common_runtime/pluggable_device/pluggable_device_simple_allocator.cc
+--- x/tensorflow/core/common_runtime/pluggable_device/pluggable_device_simple_allocator.cc	2023-10-19 14:25:59.236651310 +0000
++++ y/tensorflow/core/common_runtime/pluggable_device/pluggable_device_simple_allocator.cc	2023-10-19 14:29:11.700743574 +0000
+@@ -32,7 +32,7 @@
+   return sub_allocator_->Free(ptr, 0);
+ }
+ 
+-absl::optional<AllocatorStats> PluggableDeviceSimpleAllocator::GetStats() {
++std::optional<AllocatorStats> PluggableDeviceSimpleAllocator::GetStats() {
+   AllocatorStats stats_;
+   stats_.num_allocs = 0;
+   stats_.peak_bytes_in_use = 0;
+diff -Naurd x/tensorflow/core/common_runtime/pluggable_device/pluggable_device_simple_allocator.h y/tensorflow/core/common_runtime/pluggable_device/pluggable_device_simple_allocator.h
+--- x/tensorflow/core/common_runtime/pluggable_device/pluggable_device_simple_allocator.h	2023-10-19 14:25:59.236651310 +0000
++++ y/tensorflow/core/common_runtime/pluggable_device/pluggable_device_simple_allocator.h	2023-10-19 14:29:11.700743574 +0000
+@@ -19,6 +19,7 @@
+ #include <string>
+ #include <unordered_map>
+ #include <vector>
++#include <optional>
+ 
+ #include "tensorflow/core/common_runtime/device/device_mem_allocator.h"
+ #include "tensorflow/core/platform/thread_annotations.h"
+@@ -37,7 +38,7 @@
+ 
+   bool TracksAllocationSizes() const override { return false; }
+   string Name() override { return "Simple allocator"; }
+-  absl::optional<AllocatorStats> GetStats() override;
++  std::optional<AllocatorStats> GetStats() override;
+ 
+   AllocatorMemoryType GetMemoryType() const override {
+     return sub_allocator_->GetMemoryType();
+diff -Naurd x/tensorflow/core/common_runtime/process_state.h y/tensorflow/core/common_runtime/process_state.h
+--- x/tensorflow/core/common_runtime/process_state.h	2023-10-19 14:25:59.076651236 +0000
++++ y/tensorflow/core/common_runtime/process_state.h	2023-10-19 14:29:11.704743576 +0000
+@@ -20,6 +20,7 @@
+ #include <map>
+ #include <unordered_map>
+ #include <vector>
++#include <optional>
+ 
+ #include "tensorflow/core/framework/allocator.h"
+ #include "tensorflow/core/framework/allocator_registry.h"
+@@ -144,7 +145,7 @@
+   size_t AllocatedSize(const void* p) const override {
+     return a_->AllocatedSize(p);
+   }
+-  absl::optional<AllocatorStats> GetStats() override { return a_->GetStats(); }
++  std::optional<AllocatorStats> GetStats() override { return a_->GetStats(); }
+   bool ClearStats() override { return a_->ClearStats(); }
+ 
+   AllocatorMemoryType GetMemoryType() const override {
+diff -Naurd x/tensorflow/core/common_runtime/step_stats_collector.cc y/tensorflow/core/common_runtime/step_stats_collector.cc
+--- x/tensorflow/core/common_runtime/step_stats_collector.cc	2023-10-19 14:25:59.112651253 +0000
++++ y/tensorflow/core/common_runtime/step_stats_collector.cc	2023-10-19 14:29:11.704743576 +0000
+@@ -15,6 +15,7 @@
+ #include "tensorflow/core/common_runtime/step_stats_collector.h"
+ 
+ #include <memory>
++#include <optional>
+ 
+ #include "tensorflow/core/common_runtime/costmodel_manager.h"
+ #include "tensorflow/core/framework/allocation_description.pb.h"
+@@ -175,7 +176,7 @@
+   memory->set_peak_bytes(std::get<1>(sizes));
+   memory->set_live_bytes(std::get<2>(sizes));
+ 
+-  absl::optional<AllocatorStats> stats = allocator->GetStats();
++  std::optional<AllocatorStats> stats = allocator->GetStats();
+   if (stats) {
+     memory->set_allocator_bytes_in_use(stats->bytes_in_use);
+   }
+diff -Naurd x/tensorflow/core/framework/allocator_test.cc y/tensorflow/core/framework/allocator_test.cc
+--- x/tensorflow/core/framework/allocator_test.cc	2023-10-19 14:25:59.524651443 +0000
++++ y/tensorflow/core/framework/allocator_test.cc	2023-10-19 14:29:11.704743576 +0000
+@@ -17,6 +17,7 @@
+ 
+ #include <algorithm>
+ #include <vector>
++#include <optional>
+ 
+ #include "tensorflow/core/framework/typed_allocator.h"
+ #include "tensorflow/core/platform/logging.h"
+@@ -33,7 +34,7 @@
+ 
+ static void CheckStats(Allocator* a, int64_t num_allocs, int64_t bytes_in_use,
+                        int64_t peak_bytes_in_use, int64_t largest_alloc_size) {
+-  absl::optional<AllocatorStats> stats = a->GetStats();
++  std::optional<AllocatorStats> stats = a->GetStats();
+   EXPECT_TRUE(stats);
+   if (!stats) {
+     return;
+@@ -255,7 +256,7 @@
+   EXPECT_EQ(e0.Name(), "MemoryAllocation")
+       << "XSpace: " << xspace.DebugString();
+   {
+-    absl::optional<std::string> bytes_allocated, peak_bytes_in_use,
++    std::optional<std::string> bytes_allocated, peak_bytes_in_use,
+         requested_bytes, allocation_bytes;
+     e0.ForEachStat([&](const ::tensorflow::profiler::XStatVisitor& stat) {
+       LOG(ERROR) << "STAT " << stat.Name() << ": " << stat.ToString();
+@@ -282,7 +283,7 @@
+   EXPECT_EQ(e1.Name(), "MemoryDeallocation")
+       << "XSpace: " << xspace.DebugString();
+   {
+-    absl::optional<std::string> bytes_allocated, peak_bytes_in_use,
++    std::optional<std::string> bytes_allocated, peak_bytes_in_use,
+         allocation_bytes;
+     e1.ForEachStat([&](const ::tensorflow::profiler::XStatVisitor& stat) {
+       if (stat.Name() == "bytes_allocated") {
+diff -Naurd x/tensorflow/core/framework/tracking_allocator_test.cc y/tensorflow/core/framework/tracking_allocator_test.cc
+--- x/tensorflow/core/framework/tracking_allocator_test.cc	2023-10-19 14:25:59.700651525 +0000
++++ y/tensorflow/core/framework/tracking_allocator_test.cc	2023-10-19 14:29:11.704743576 +0000
+@@ -16,6 +16,7 @@
+ #include "tensorflow/core/framework/tracking_allocator.h"
+ 
+ #include <unordered_map>
++#include <optional>
+ 
+ #include "tensorflow/core/framework/allocator.h"
+ #include "tensorflow/core/platform/logging.h"
+@@ -44,7 +45,7 @@
+     EXPECT_NE(size_map_.end(), iter);
+     return iter->second;
+   }
+-  absl::optional<AllocatorStats> GetStats() override { return absl::nullopt; }
++  std::optional<AllocatorStats> GetStats() override { return std::nullopt; }
+ 
+  private:
+   std::unordered_map<const void*, size_t> size_map_;
+@@ -58,7 +59,7 @@
+   }
+   void DeallocateRaw(void* ptr) override {}
+   bool TracksAllocationSizes() const override { return true; }
+-  absl::optional<AllocatorStats> GetStats() override { return absl::nullopt; }
++  std::optional<AllocatorStats> GetStats() override { return std::nullopt; }
+ };
+ 
+ TEST(TrackingAllocatorTest, SimpleNoTracking) {
+diff -Naurd x/tensorflow/core/grappler/clusters/single_machine.cc y/tensorflow/core/grappler/clusters/single_machine.cc
+--- x/tensorflow/core/grappler/clusters/single_machine.cc	2023-10-19 14:25:59.964651648 +0000
++++ y/tensorflow/core/grappler/clusters/single_machine.cc	2023-10-19 14:29:11.704743576 +0000
+@@ -17,6 +17,7 @@
+ 
+ #include <atomic>
+ #include <memory>
++#include <optional>
+ 
+ #include "tensorflow/cc/training/queue_runner.h"
+ #include "tensorflow/core/common_runtime/device.h"
+@@ -230,7 +231,7 @@
+       return Status(absl::StatusCode::kInvalidArgument,
+                     "Tracking allocation is not enabled.");
+     }
+-    absl::optional<AllocatorStats> stats = allocator->GetStats();
++    std::optional<AllocatorStats> stats = allocator->GetStats();
+     (*device_peak_memory)[device->name()] =
+         (stats ? stats->peak_bytes_in_use : 0);
+   }
+diff -Naurd x/tensorflow/core/kernels/stack.cc y/tensorflow/core/kernels/stack.cc
+--- x/tensorflow/core/kernels/stack.cc	2023-10-19 14:26:01.668652437 +0000
++++ y/tensorflow/core/kernels/stack.cc	2023-10-19 14:29:11.704743576 +0000
+@@ -18,6 +18,7 @@
+ #include <limits.h>
+ #include <atomic>
+ #include <vector>
++#include <optional>
+ 
+ #include "tensorflow/core/common_runtime/device.h"
+ #include "tensorflow/core/framework/device_base.h"
+@@ -245,7 +246,7 @@
+     DeviceContext* device_ctxt = ctx->op_device_context();
+     auto device = static_cast<tensorflow::Device*>(ctx->device());
+     Allocator* allocator = device->GetAllocator(alloc_attrs);
+-    absl::optional<AllocatorStats> stats = allocator->GetStats();
++    std::optional<AllocatorStats> stats = allocator->GetStats();
+     if (stats && *stats->bytes_limit &&
+         stats->bytes_in_use > (*stats->bytes_limit * kOccupancy)) {
+       // Asynchronously copy the tensor from GPU to CPU memory.
+diff -Naurd x/tensorflow/python/tfe_wrapper.cc y/tensorflow/python/tfe_wrapper.cc
+--- x/tensorflow/python/tfe_wrapper.cc	2023-10-19 14:26:10.716656639 +0000
++++ y/tensorflow/python/tfe_wrapper.cc	2023-10-19 14:29:11.708743578 +0000
+@@ -14,6 +14,7 @@
+ ==============================================================================*/
+ 
+ #include <memory>
++#include <optional>
+ 
+ #include "Python.h"
+ #include "absl/strings/match.h"
+@@ -691,7 +692,7 @@
+     tensorflow::AllocatorAttributes attrs;
+     tensorflow::Allocator* allocator = matched_device->GetAllocator(attrs);
+ 
+-    if (absl::optional<tensorflow::AllocatorStats> stats =
++    if (std::optional<tensorflow::AllocatorStats> stats =
+             allocator->GetStats()) {
+       return std::map<std::string, int64_t>{{"current", stats->bytes_in_use},
+                                             {"peak", stats->peak_bytes_in_use}};
+diff -Naurd x/tensorflow/tsl/framework/allocator.h y/tensorflow/tsl/framework/allocator.h
+--- x/tensorflow/tsl/framework/allocator.h	2023-10-19 14:26:15.884659044 +0000
++++ y/tensorflow/tsl/framework/allocator.h	2023-10-19 14:29:11.708743578 +0000
+@@ -216,7 +216,7 @@
+   }
+ 
+   // Fills in 'stats' with statistics collected by this allocator.
+-  virtual absl::optional<AllocatorStats> GetStats() { return absl::nullopt; }
++  virtual std::optional<AllocatorStats> GetStats() { return std::nullopt; }
+ 
+   // If implemented, clears the internal stats except for the `in_use` fields
+   // and sets the `peak_bytes_in_use` to be equal to the `bytes_in_use`. Returns
+diff -Naurd x/tensorflow/tsl/framework/bfc_allocator.cc y/tensorflow/tsl/framework/bfc_allocator.cc
+--- x/tensorflow/tsl/framework/bfc_allocator.cc	2023-10-19 14:26:15.900659052 +0000
++++ y/tensorflow/tsl/framework/bfc_allocator.cc	2023-10-19 14:29:11.708743578 +0000
+@@ -1205,7 +1205,7 @@
+   return md;
+ }
+ 
+-absl::optional<AllocatorStats> BFCAllocator::GetStats() {
++std::optional<AllocatorStats> BFCAllocator::GetStats() {
+   mutex_lock l(lock_);
+   return stats_;
+ }
+diff -Naurd x/tensorflow/tsl/framework/bfc_allocator.h y/tensorflow/tsl/framework/bfc_allocator.h
+--- x/tensorflow/tsl/framework/bfc_allocator.h	2023-10-19 14:26:15.900659052 +0000
++++ y/tensorflow/tsl/framework/bfc_allocator.h	2023-10-19 14:29:11.708743578 +0000
+@@ -22,6 +22,7 @@
+ #include <string>
+ #include <unordered_map>
+ #include <vector>
++#include <optional>
+ 
+ #include "absl/container/flat_hash_set.h"
+ #include "tensorflow/tsl/framework/allocator.h"
+@@ -93,7 +94,7 @@
+ 
+   int64_t AllocationId(const void* ptr) const override;
+ 
+-  absl::optional<AllocatorStats> GetStats() override;
++  std::optional<AllocatorStats> GetStats() override;
+ 
+   bool ClearStats() override;
+ 
+diff -Naurd x/tensorflow/tsl/framework/cpu_allocator_impl.cc y/tensorflow/tsl/framework/cpu_allocator_impl.cc
+--- x/tensorflow/tsl/framework/cpu_allocator_impl.cc	2023-10-19 14:26:15.928659065 +0000
++++ y/tensorflow/tsl/framework/cpu_allocator_impl.cc	2023-10-19 14:29:11.708743578 +0000
+@@ -15,6 +15,7 @@
+ 
+ #include <algorithm>
+ #include <atomic>
++#include <optional>
+ 
+ #include "tensorflow/tsl/framework/allocator.h"
+ #include "tensorflow/tsl/framework/allocator_registry.h"
+@@ -145,8 +146,8 @@
+         /*level=*/tsl::profiler::TraceMeLevel::kInfo);
+   }
+ 
+-  absl::optional<AllocatorStats> GetStats() override {
+-    if (!cpu_allocator_collect_stats) return absl::nullopt;
++  std::optional<AllocatorStats> GetStats() override {
++    if (!cpu_allocator_collect_stats) return std::nullopt;
+     mutex_lock l(mu_);
+     return stats_;
+   }
+diff -Naurd x/tensorflow/tsl/framework/tracking_allocator.cc y/tensorflow/tsl/framework/tracking_allocator.cc
+--- x/tensorflow/tsl/framework/tracking_allocator.cc	2023-10-19 14:26:15.968659084 +0000
++++ y/tensorflow/tsl/framework/tracking_allocator.cc	2023-10-19 14:29:11.708743578 +0000
+@@ -152,7 +152,7 @@
+   }
+ }
+ 
+-absl::optional<AllocatorStats> TrackingAllocator::GetStats() {
++std::optional<AllocatorStats> TrackingAllocator::GetStats() {
+   return allocator_->GetStats();
+ }
+ 
+diff -Naurd x/tensorflow/tsl/framework/tracking_allocator.h y/tensorflow/tsl/framework/tracking_allocator.h
+--- x/tensorflow/tsl/framework/tracking_allocator.h	2023-10-19 14:26:15.968659084 +0000
++++ y/tensorflow/tsl/framework/tracking_allocator.h	2023-10-19 14:29:11.712743580 +0000
+@@ -17,6 +17,7 @@
+ #define TENSORFLOW_TSL_FRAMEWORK_TRACKING_ALLOCATOR_H_
+ 
+ #include <unordered_map>
++#include <optional>
+ 
+ #include "tensorflow/tsl/framework/allocator.h"
+ #include "tensorflow/tsl/lib/gtl/inlined_vector.h"
+@@ -66,7 +67,7 @@
+   size_t RequestedSize(const void* ptr) const override;
+   size_t AllocatedSize(const void* ptr) const override;
+   int64_t AllocationId(const void* ptr) const override;
+-  absl::optional<AllocatorStats> GetStats() override;
++  std::optional<AllocatorStats> GetStats() override;
+   bool ClearStats() override;
+ 
+   AllocatorMemoryType GetMemoryType() const override {
diff --git a/nixpkgs/pkgs/development/python-modules/tensorflow/bin.nix b/nixpkgs/pkgs/development/python-modules/tensorflow/bin.nix
new file mode 100644
index 000000000000..fa70e4cc4a30
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow/bin.nix
@@ -0,0 +1,214 @@
+{ stdenv
+, lib
+, fetchurl
+, buildPythonPackage
+, isPy3k, pythonOlder, pythonAtLeast, astor
+, gast
+, google-pasta
+, wrapt
+, numpy
+, six
+, termcolor
+, packaging
+, protobuf
+, absl-py
+, grpcio
+, mock
+, scipy
+, wheel
+, jax
+, opt-einsum
+, tensorflow-estimator-bin
+, tensorboard
+, config
+, cudaSupport ? config.cudaSupport
+, cudaPackages ? {}
+, zlib
+, python
+, keras-applications
+, keras-preprocessing
+, addOpenGLRunpath
+, astunparse
+, flatbuffers
+, h5py
+, typing-extensions
+}:
+
+# We keep this binary build for two reasons:
+# - the source build doesn't work on Darwin.
+# - the source build is currently brittle and not easy to maintain
+
+# unsupported combination
+assert ! (stdenv.isDarwin && cudaSupport);
+
+let
+  packages = import ./binary-hashes.nix;
+  inherit (cudaPackages) cudatoolkit cudnn;
+in buildPythonPackage {
+  pname = "tensorflow" + lib.optionalString cudaSupport "-gpu";
+  inherit (packages) version;
+  format = "wheel";
+
+  src = let
+    pyVerNoDot = lib.strings.stringAsChars (x: lib.optionalString (x != ".") x) python.pythonVersion;
+    platform = if stdenv.isDarwin then "mac" else "linux";
+    unit = if cudaSupport then "gpu" else "cpu";
+    key = "${platform}_py_${pyVerNoDot}_${unit}";
+  in fetchurl (packages.${key} or {});
+
+  propagatedBuildInputs = [
+    astunparse
+    flatbuffers
+    typing-extensions
+    packaging
+    protobuf
+    numpy
+    scipy
+    jax
+    termcolor
+    grpcio
+    six
+    astor
+    absl-py
+    gast
+    opt-einsum
+    google-pasta
+    wrapt
+    tensorflow-estimator-bin
+    tensorboard
+    keras-applications
+    keras-preprocessing
+    h5py
+  ] ++ lib.optional (!isPy3k) mock;
+
+  nativeBuildInputs = [ wheel ] ++ lib.optionals cudaSupport [ addOpenGLRunpath ];
+
+  preConfigure = ''
+    unset SOURCE_DATE_EPOCH
+
+    # Make sure that dist and the wheel file are writable.
+    chmod u+rwx -R ./dist
+
+    pushd dist
+
+    orig_name="$(echo ./*.whl)"
+    wheel unpack --dest unpacked ./*.whl
+    rm ./*.whl
+    (
+      cd unpacked/tensorflow*
+      # Adjust dependency requirements:
+      # - Relax flatbuffers, gast, protobuf, tensorboard, and tensorflow-estimator version requirements that don't match what we have packaged
+      # - The purpose of python3Packages.libclang is not clear at the moment and we don't have it packaged yet
+      # - keras and tensorlow-io-gcs-filesystem will be considered as optional for now.
+      # - numpy was pinned to fix some internal tests: https://github.com/tensorflow/tensorflow/issues/60216
+      sed -i *.dist-info/METADATA \
+        -e "/Requires-Dist: flatbuffers/d" \
+        -e "/Requires-Dist: gast/d" \
+        -e "/Requires-Dist: keras/d" \
+        -e "/Requires-Dist: libclang/d" \
+        -e "/Requires-Dist: protobuf/d" \
+        -e "/Requires-Dist: tensorboard/d" \
+        -e "/Requires-Dist: tensorflow-estimator/d" \
+        -e "/Requires-Dist: tensorflow-io-gcs-filesystem/d" \
+        -e "s/Requires-Dist: numpy (.*)/Requires-Dist: numpy/"
+    )
+    wheel pack ./unpacked/tensorflow*
+    mv *.whl $orig_name # avoid changes to the _os_arch.whl suffix
+
+    popd
+  '';
+
+  # Note that we need to run *after* the fixup phase because the
+  # libraries are loaded at runtime. If we run in preFixup then
+  # patchelf --shrink-rpath will remove the cuda libraries.
+  postFixup =
+    let
+      # rpaths we only need to add if CUDA is enabled.
+      cudapaths = lib.optionals cudaSupport [
+        cudatoolkit.out
+        cudatoolkit.lib
+        cudnn
+      ];
+
+      libpaths = [
+        stdenv.cc.cc.lib
+        zlib
+      ];
+
+      rpath = lib.makeLibraryPath (libpaths ++ cudapaths);
+    in
+    lib.optionalString stdenv.isLinux ''
+      # This is an array containing all the directories in the tensorflow2
+      # package that contain .so files.
+      #
+      # TODO: Create this list programmatically, and remove paths that aren't
+      # actually needed.
+      rrPathArr=(
+        "$out/${python.sitePackages}/tensorflow/"
+        "$out/${python.sitePackages}/tensorflow/core/kernels"
+        "$out/${python.sitePackages}/tensorflow/compiler/mlir/stablehlo/"
+        "$out/${python.sitePackages}/tensorflow/compiler/tf2tensorrt/"
+        "$out/${python.sitePackages}/tensorflow/compiler/tf2xla/ops/"
+        "$out/${python.sitePackages}/tensorflow/include/external/ml_dtypes/"
+        "$out/${python.sitePackages}/tensorflow/lite/experimental/microfrontend/python/ops/"
+        "$out/${python.sitePackages}/tensorflow/lite/python/analyzer_wrapper/"
+        "$out/${python.sitePackages}/tensorflow/lite/python/interpreter_wrapper/"
+        "$out/${python.sitePackages}/tensorflow/lite/python/metrics/"
+        "$out/${python.sitePackages}/tensorflow/lite/python/optimize/"
+        "$out/${python.sitePackages}/tensorflow/python/"
+        "$out/${python.sitePackages}/tensorflow/python/autograph/impl/testing"
+        "$out/${python.sitePackages}/tensorflow/python/client"
+        "$out/${python.sitePackages}/tensorflow/python/data/experimental/service"
+        "$out/${python.sitePackages}/tensorflow/python/framework"
+        "$out/${python.sitePackages}/tensorflow/python/grappler"
+        "$out/${python.sitePackages}/tensorflow/python/lib/core"
+        "$out/${python.sitePackages}/tensorflow/python/lib/io"
+        "$out/${python.sitePackages}/tensorflow/python/platform"
+        "$out/${python.sitePackages}/tensorflow/python/profiler/internal"
+        "$out/${python.sitePackages}/tensorflow/python/saved_model"
+        "$out/${python.sitePackages}/tensorflow/python/util"
+        "$out/${python.sitePackages}/tensorflow/tsl/python/lib/core"
+        "${rpath}"
+      )
+
+      # The the bash array into a colon-separated list of RPATHs.
+      rrPath=$(IFS=$':'; echo "''${rrPathArr[*]}")
+      echo "about to run patchelf with the following rpath: $rrPath"
+
+      find $out -type f \( -name '*.so' -or -name '*.so.*' \) | while read lib; do
+        echo "about to patchelf $lib..."
+        chmod a+rx "$lib"
+        patchelf --set-rpath "$rrPath" "$lib"
+        ${lib.optionalString cudaSupport ''
+          addOpenGLRunpath "$lib"
+        ''}
+      done
+    '';
+
+  # Upstream has a pip hack that results in bin/tensorboard being in both tensorflow
+  # and the propagated input tensorboard, which causes environment collisions.
+  # Another possibility would be to have tensorboard only in the buildInputs
+  # See https://github.com/NixOS/nixpkgs/pull/44381 for more information.
+  postInstall = ''
+    rm $out/bin/tensorboard
+  '';
+
+  pythonImportsCheck = [
+    "tensorflow"
+    "tensorflow.python"
+    "tensorflow.python.framework"
+  ];
+
+  passthru = {
+    inherit cudaPackages;
+  };
+
+  meta = with lib; {
+    description = "Computation using data flow graphs for scalable machine learning";
+    homepage = "http://tensorflow.org";
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jyp abbradar ];
+    platforms = [ "x86_64-linux" "x86_64-darwin" ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tensorflow/binary-hashes.nix b/nixpkgs/pkgs/development/python-modules/tensorflow/binary-hashes.nix
new file mode 100644
index 000000000000..9204d1652d03
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow/binary-hashes.nix
@@ -0,0 +1,39 @@
+{
+version = "2.15.0";
+linux_py_39_cpu = {
+  url = "https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow_cpu-2.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl";
+  sha256 = "01m5wn9wpywd2cscklr2h8wdsf3wzg11dhgl0nfj7a997v2bvlyg";
+};
+linux_py_310_cpu = {
+  url = "https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow_cpu-2.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl";
+  sha256 = "0qjahvq9gd89cx2dwkb6gk3s947czmasp9cx1pqyw1x5f113s2zn";
+};
+linux_py_311_cpu = {
+  url = "https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow_cpu-2.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl";
+  sha256 = "0w3jz7rpbf4r8hm91rjh666qyqflqy6x619fas1iqcgnfx8pjv7l";
+};
+linux_py_39_gpu = {
+  url = "https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-2.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl";
+  sha256 = "0ckij6jffsi6yvjfiysnwrfblhqm5g1f8dkw4i7n3dwndnanba1z";
+};
+linux_py_310_gpu = {
+  url = "https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-2.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl";
+  sha256 = "1y0cxsps4rkidc2c3apaf7vd9vsnjg5lpcq30bnrnzcvvx1inq7d";
+};
+linux_py_311_gpu = {
+  url = "https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-2.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl";
+  sha256 = "1z7bd4yrdxa7rq4k1fybbwnyhxf4rm9nwx15bpk2m53c5hmyrs6y";
+};
+mac_py_39_cpu = {
+  url = "https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-2.15.0-cp39-cp39-macosx_10_15_x86_64.whl";
+  sha256 = "1kqb5h4vs4jlhlqjmqvcg6jivccwqj1rgklrgrhvw09wzzhxvz1c";
+};
+mac_py_310_cpu = {
+  url = "https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-2.15.0-cp310-cp310-macosx_10_15_x86_64.whl";
+  sha256 = "0wmawdfhva9ixal7468c0rrx8qd7nzgkxy6i9k2s7cqn8c7qw94v";
+};
+mac_py_311_cpu = {
+  url = "https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-2.15.0-cp311-cp311-macosx_10_15_x86_64.whl";
+  sha256 = "0cigk43fabps7vskz4pfgmca3wa0545b15qridyqdbyp5ri1c1qy";
+};
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tensorflow/com_google_absl_add_log.patch b/nixpkgs/pkgs/development/python-modules/tensorflow/com_google_absl_add_log.patch
new file mode 100644
index 000000000000..ebb2fb129c06
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow/com_google_absl_add_log.patch
@@ -0,0 +1,166 @@
+diff -Naurd x/third_party/absl/system.absl.base.BUILD y/third_party/absl/system.absl.base.BUILD
+--- x/third_party/absl/system.absl.base.BUILD	2023-09-17 09:12:05.499753364 +0000
++++ y/third_party/absl/system.absl.base.BUILD	2023-09-17 09:16:01.200082822 +0000
+@@ -22,7 +22,12 @@
+ 
+ cc_library(
+     name = "raw_logging_internal",
+-    linkopts = ["-labsl_raw_logging_internal"],
++    linkopts = [
++        "-labsl_raw_logging_internal",
++        "-labsl_log_internal_conditions",
++        "-labsl_log_internal_message",
++        "-labsl_log_internal_nullguard",
++    ],
+     visibility = [
+         "//absl:__subpackages__",
+     ],
+diff -Naurd x/third_party/absl/system.absl.log.BUILD y/third_party/absl/system.absl.log.BUILD
+--- x/third_party/absl/system.absl.log.BUILD	1970-01-01 00:00:00.000000000 +0000
++++ y/third_party/absl/system.absl.log.BUILD	2023-09-17 09:12:11.795762177 +0000
+@@ -0,0 +1,134 @@
++load("@rules_cc//cc:defs.bzl", "cc_library")
++
++package(default_visibility = ["//visibility:public"])
++
++cc_library(
++    name = "absl_check",
++    deps = [
++    ],
++)
++
++cc_library(
++    name = "absl_log",
++    deps = [
++    ],
++)
++
++cc_library(
++    name = "check",
++    deps = [
++    ],
++)
++
++cc_library(
++    name = "die_if_null",
++    deps = [
++        ":log",
++        "//absl/base:config",
++        "//absl/base:core_headers",
++        "//absl/strings",
++    ],
++)
++
++cc_library(
++    name = "flags",
++    deps = [
++        ":globals",
++        "//absl/base:config",
++        "//absl/base:core_headers",
++        "//absl/base:log_severity",
++        "//absl/flags:flag",
++        "//absl/flags:marshalling",
++        "//absl/strings",
++    ],
++)
++
++cc_library(
++    name = "globals",
++    deps = [
++        "//absl/base:atomic_hook",
++        "//absl/base:config",
++        "//absl/base:core_headers",
++        "//absl/base:log_severity",
++        "//absl/hash",
++        "//absl/strings",
++    ],
++)
++
++cc_library(
++    name = "initialize",
++    deps = [
++        ":globals",
++        "//absl/base:config",
++        "//absl/time",
++    ],
++)
++
++cc_library(
++    name = "log",
++    deps = [
++    ],
++)
++
++cc_library(
++    name = "log_entry",
++    deps = [
++        "//absl/base:config",
++        "//absl/base:core_headers",
++        "//absl/base:log_severity",
++        "//absl/strings",
++        "//absl/time",
++        "//absl/types:span",
++    ],
++)
++
++cc_library(
++    name = "log_sink",
++    deps = [
++        ":log_entry",
++        "//absl/base:config",
++    ],
++)
++
++cc_library(
++    name = "log_sink_registry",
++    deps = [
++        ":log_sink",
++        "//absl/base:config",
++    ],
++)
++
++cc_library(
++    name = "log_streamer",
++    deps = [
++        ":absl_log",
++        "//absl/base:config",
++        "//absl/base:log_severity",
++        "//absl/strings",
++        "//absl/strings:internal",
++        "//absl/types:optional",
++        "//absl/utility",
++    ],
++)
++
++cc_library(
++    name = "scoped_mock_log",
++    deps = [
++        ":log_entry",
++        ":log_sink",
++        ":log_sink_registry",
++        "//absl/base:config",
++        "//absl/base:log_severity",
++        "//absl/base:raw_logging_internal",
++        "//absl/strings",
++        "@com_google_googletest//:gtest",
++    ],
++)
++
++cc_library(
++    name = "structured",
++    deps = [
++        "//absl/base:config",
++        "//absl/strings",
++    ],
++)
+diff -Naurd x/third_party/absl/workspace.bzl y/third_party/absl/workspace.bzl
+--- x/third_party/absl/workspace.bzl	2023-09-17 09:12:05.499753364 +0000
++++ y/third_party/absl/workspace.bzl	2023-09-17 09:12:11.795762177 +0000
+@@ -20,6 +20,7 @@
+         "flags",
+         "functional",
+         "hash",
++        "log",
+         "memory",
+         "meta",
+         "numeric",
diff --git a/nixpkgs/pkgs/development/python-modules/tensorflow/com_google_absl_fix_macos.patch b/nixpkgs/pkgs/development/python-modules/tensorflow/com_google_absl_fix_macos.patch
new file mode 100644
index 000000000000..7da8ab1b2e9b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow/com_google_absl_fix_macos.patch
@@ -0,0 +1,15 @@
+diff -ru a/absl/base/config.h b/absl/base/config.h
+--- a/absl/base/config.h
++++ b/absl/base/config.h
+@@ -558,9 +558,9 @@
+         __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 50000) ||   \
+        (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) &&      \
+         __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 120000))))
+-#define ABSL_INTERNAL_APPLE_CXX17_TYPES_UNAVAILABLE 1
++// #define ABSL_INTERNAL_APPLE_CXX17_TYPES_UNAVAILABLE 1
+ #else
+-#define ABSL_INTERNAL_APPLE_CXX17_TYPES_UNAVAILABLE 0
++// #define ABSL_INTERNAL_APPLE_CXX17_TYPES_UNAVAILABLE 0
+ #endif
+ 
+ // ABSL_HAVE_STD_ANY
diff --git a/nixpkgs/pkgs/development/python-modules/tensorflow/default.nix b/nixpkgs/pkgs/development/python-modules/tensorflow/default.nix
new file mode 100644
index 000000000000..ff95c847eae5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow/default.nix
@@ -0,0 +1,602 @@
+{ stdenv, bazel_5, buildBazelPackage, lib, fetchFromGitHub, symlinkJoin
+, addOpenGLRunpath, fetchpatch, fetchzip, linkFarm
+# Python deps
+, buildPythonPackage, pythonOlder, python
+# Python libraries
+, numpy, tensorboard, abseil-cpp, absl-py
+, packaging, setuptools, wheel, keras-preprocessing, google-pasta
+, opt-einsum, astunparse, h5py
+, termcolor, grpcio, six, wrapt, protobuf-python, tensorflow-estimator-bin
+, dill, flatbuffers-python, portpicker, tblib, typing-extensions
+# Common deps
+, git, pybind11, which, binutils, glibcLocales, cython, perl
+# Common libraries
+, jemalloc, mpi, gast, grpc, sqlite, boringssl, jsoncpp, nsync
+, curl, snappy, flatbuffers-core, icu, double-conversion, libpng, libjpeg_turbo, giflib, protobuf-core
+# Upstream by default includes cuda support since tensorflow 1.15. We could do
+# that in nix as well. It would make some things easier and less confusing, but
+# it would also make the default tensorflow package unfree. See
+# https://groups.google.com/a/tensorflow.org/forum/#!topic/developers/iRCt5m4qUz0
+, config
+, cudaSupport ? config.cudaSupport
+, cudaPackages ? { }
+, cudaCapabilities ? cudaPackages.cudaFlags.cudaCapabilities
+, mklSupport ? false, mkl
+, tensorboardSupport ? true
+# XLA without CUDA is broken
+, xlaSupport ? cudaSupport
+, sse42Support ? stdenv.hostPlatform.sse4_2Support
+, avx2Support  ? stdenv.hostPlatform.avx2Support
+, fmaSupport   ? stdenv.hostPlatform.fmaSupport
+# Darwin deps
+, Foundation, Security, cctools, llvmPackages_11
+}:
+
+let
+  originalStdenv = stdenv;
+in
+let
+  # Tensorflow looks at many toolchain-related variables which may diverge.
+  #
+  # Toolchain for cuda-enabled builds.
+  # We want to achieve two things:
+  # 1. NVCC should use a compatible back-end (e.g. gcc11 for cuda11)
+  # 2. Normal C++ files should be compiled with the same toolchain,
+  #    to avoid potential weird dynamic linkage errors at runtime.
+  #    This may not be necessary though
+  #
+  # Toolchain for Darwin:
+  # clang 7 fails to emit a symbol for
+  # __ZN4llvm11SmallPtrSetIPKNS_10AllocaInstELj8EED1Ev in any of the
+  # translation units, so the build fails at link time
+  stdenv =
+    if cudaSupport then cudaPackages.backendStdenv
+    else if originalStdenv.isDarwin then llvmPackages_11.stdenv
+    else originalStdenv;
+  inherit (cudaPackages) cudatoolkit nccl;
+  # use compatible cuDNN (https://www.tensorflow.org/install/source#gpu)
+  # cudaPackages.cudnn led to this:
+  # https://github.com/tensorflow/tensorflow/issues/60398
+  cudnn = cudaPackages.cudnn_8_6;
+  gentoo-patches = fetchzip {
+    url = "https://dev.gentoo.org/~perfinion/patches/tensorflow-patches-2.12.0.tar.bz2";
+    hash = "sha256-SCRX/5/zML7LmKEPJkcM5Tebez9vv/gmE4xhT/jyqWs=";
+  };
+  protobuf-extra = linkFarm "protobuf-extra" [
+    { name = "include"; path = protobuf-core.src; }
+  ];
+in
+
+assert cudaSupport -> cudatoolkit != null
+                   && cudnn != null;
+
+# unsupported combination
+assert ! (stdenv.isDarwin && cudaSupport);
+
+let
+  withTensorboard = (pythonOlder "3.6") || tensorboardSupport;
+
+  # FIXME: migrate to redist cudaPackages
+  cudatoolkit_joined = symlinkJoin {
+    name = "${cudatoolkit.name}-merged";
+    paths = [
+      cudatoolkit.lib
+      cudatoolkit.out
+    ] ++ lib.optionals (lib.versionOlder cudatoolkit.version "11") [
+      # for some reason some of the required libs are in the targets/x86_64-linux
+      # directory; not sure why but this works around it
+      "${cudatoolkit}/targets/${stdenv.system}"
+    ];
+  };
+
+  # Tensorflow expects bintools at hard-coded paths, e.g. /usr/bin/ar
+  # The only way to overcome that is to set GCC_HOST_COMPILER_PREFIX,
+  # but that path must contain cc as well, so we merge them
+  cudatoolkit_cc_joined = symlinkJoin {
+    name = "${stdenv.cc.name}-merged";
+    paths = [
+      stdenv.cc
+      binutils.bintools # for ar, dwp, nm, objcopy, objdump, strip
+    ];
+  };
+
+  # Needed for _some_ system libraries, grep INCLUDEDIR.
+  includes_joined = symlinkJoin {
+    name = "tensorflow-deps-merged";
+    paths = [
+      jsoncpp
+    ];
+  };
+
+  tfFeature = x: if x then "1" else "0";
+
+  version = "2.13.0";
+  variant = lib.optionalString cudaSupport "-gpu";
+  pname = "tensorflow${variant}";
+
+  pythonEnv = python.withPackages (_:
+    [ # python deps needed during wheel build time (not runtime, see the buildPythonPackage part for that)
+      # This list can likely be shortened, but each trial takes multiple hours so won't bother for now.
+      absl-py
+      astunparse
+      dill
+      flatbuffers-python
+      gast
+      google-pasta
+      grpcio
+      h5py
+      keras-preprocessing
+      numpy
+      opt-einsum
+      packaging
+      protobuf-python
+      setuptools
+      six
+      tblib
+      tensorboard
+      tensorflow-estimator-bin
+      termcolor
+      typing-extensions
+      wheel
+      wrapt
+  ]);
+
+  rules_cc_darwin_patched = stdenv.mkDerivation {
+    name = "rules_cc-${pname}-${version}";
+
+    src = _bazel-build.deps;
+
+    prePatch = "pushd rules_cc";
+    patches = [
+      # https://github.com/bazelbuild/rules_cc/issues/122
+      (fetchpatch {
+        name = "tensorflow-rules_cc-libtool-path.patch";
+        url = "https://github.com/bazelbuild/rules_cc/commit/8c427ab30bf213630dc3bce9d2e9a0e29d1787db.diff";
+        hash = "sha256-C4v6HY5+jm0ACUZ58gBPVejCYCZfuzYKlHZ0m2qDHCk=";
+      })
+
+      # https://github.com/bazelbuild/rules_cc/pull/124
+      (fetchpatch {
+        name = "tensorflow-rules_cc-install_name_tool-path.patch";
+        url = "https://github.com/bazelbuild/rules_cc/commit/156497dc89100db8a3f57b23c63724759d431d05.diff";
+        hash = "sha256-NES1KeQmMiUJQVoV6dS4YGRxxkZEjOpFSCyOq9HZYO0=";
+      })
+    ];
+    postPatch = "popd";
+
+    dontConfigure = true;
+    dontBuild = true;
+
+    installPhase = ''
+      runHook preInstall
+
+      mv rules_cc/ "$out"
+
+      runHook postInstall
+    '';
+  };
+  llvm-raw_darwin_patched = stdenv.mkDerivation {
+    name = "llvm-raw-${pname}-${version}";
+
+    src = _bazel-build.deps;
+
+    prePatch = "pushd llvm-raw";
+    patches = [
+      # Fix a vendored config.h that requires the 10.13 SDK
+      ./llvm_bazel_fix_macos_10_12_sdk.patch
+    ];
+    postPatch = ''
+      touch {BUILD,WORKSPACE}
+      popd
+    '';
+
+    dontConfigure = true;
+    dontBuild = true;
+
+    installPhase = ''
+      runHook preInstall
+
+      mv llvm-raw/ "$out"
+
+      runHook postInstall
+    '';
+  };
+  bazel-build = if stdenv.isDarwin then _bazel-build.overrideAttrs (prev: {
+    bazelFlags = prev.bazelFlags ++ [
+      "--override_repository=rules_cc=${rules_cc_darwin_patched}"
+      "--override_repository=llvm-raw=${llvm-raw_darwin_patched}"
+    ];
+    preBuild = ''
+      export AR="${cctools}/bin/libtool"
+    '';
+  }) else _bazel-build;
+
+  _bazel-build = buildBazelPackage.override { inherit stdenv; } {
+    name = "${pname}-${version}";
+    bazel = bazel_5;
+
+    src = fetchFromGitHub {
+      owner = "tensorflow";
+      repo = "tensorflow";
+      rev = "refs/tags/v${version}";
+      hash = "sha256-Rq5pAVmxlWBVnph20fkAwbfy+iuBNlfFy14poDPd5h0=";
+    };
+
+    # On update, it can be useful to steal the changes from gentoo
+    # https://gitweb.gentoo.org/repo/gentoo.git/tree/sci-libs/tensorflow
+
+    nativeBuildInputs = [
+      which pythonEnv cython perl protobuf-core protobuf-extra
+    ] ++ lib.optional cudaSupport addOpenGLRunpath;
+
+    buildInputs = [
+      jemalloc
+      mpi
+      glibcLocales
+      git
+
+      # libs taken from system through the TF_SYS_LIBS mechanism
+      abseil-cpp
+      boringssl
+      curl
+      double-conversion
+      flatbuffers-core
+      giflib
+      grpc
+      # Necessary to fix the "`GLIBCXX_3.4.30' not found" error
+      (icu.override { inherit stdenv; })
+      jsoncpp
+      libjpeg_turbo
+      libpng
+      (pybind11.overridePythonAttrs (_: { inherit stdenv; }))
+      snappy
+      sqlite
+    ] ++ lib.optionals cudaSupport [
+      cudatoolkit
+      cudnn
+    ] ++ lib.optionals mklSupport [
+      mkl
+    ] ++ lib.optionals stdenv.isDarwin [
+      Foundation
+      Security
+    ] ++ lib.optionals (!stdenv.isDarwin) [
+      nsync
+    ];
+
+    # arbitrarily set to the current latest bazel version, overly careful
+    TF_IGNORE_MAX_BAZEL_VERSION = true;
+
+    LIBTOOL = lib.optionalString stdenv.isDarwin "${cctools}/bin/libtool";
+
+    # Take as many libraries from the system as possible. Keep in sync with
+    # list of valid syslibs in
+    # https://github.com/tensorflow/tensorflow/blob/master/third_party/systemlibs/syslibs_configure.bzl
+    TF_SYSTEM_LIBS = lib.concatStringsSep "," ([
+      "absl_py"
+      "astor_archive"
+      "astunparse_archive"
+      "boringssl"
+      "com_google_absl"
+      # Not packaged in nixpkgs
+      # "com_github_googleapis_googleapis"
+      # "com_github_googlecloudplatform_google_cloud_cpp"
+      "com_github_grpc_grpc"
+      "com_google_protobuf"
+      # Fails with the error: external/org_tensorflow/tensorflow/core/profiler/utils/tf_op_utils.cc:46:49: error: no matching function for call to 're2::RE2::FullMatch(absl::lts_2020_02_25::string_view&, re2::RE2&)'
+      # "com_googlesource_code_re2"
+      "curl"
+      "cython"
+      "dill_archive"
+      "double_conversion"
+      "flatbuffers"
+      "functools32_archive"
+      "gast_archive"
+      "gif"
+      "hwloc"
+      "icu"
+      "jsoncpp_git"
+      "libjpeg_turbo"
+      "nasm"
+      "opt_einsum_archive"
+      "org_sqlite"
+      "pasta"
+      "png"
+      "pybind11"
+      "six_archive"
+      "snappy"
+      "tblib_archive"
+      "termcolor_archive"
+      "typing_extensions_archive"
+      "wrapt"
+      "zlib"
+    ] ++ lib.optionals (!stdenv.isDarwin) [
+      "nsync" # fails to build on darwin
+    ]);
+
+    INCLUDEDIR = "${includes_joined}/include";
+
+    # This is needed for the Nix-provided protobuf dependency to work,
+    # as otherwise the rule `link_proto_files` tries to create the links
+    # to `/usr/include/...` which results in build failures.
+    PROTOBUF_INCLUDE_PATH = "${protobuf-core}/include";
+
+    PYTHON_BIN_PATH = pythonEnv.interpreter;
+
+    TF_NEED_GCP = true;
+    TF_NEED_HDFS = true;
+    TF_ENABLE_XLA = tfFeature xlaSupport;
+
+    CC_OPT_FLAGS = " ";
+
+    # https://github.com/tensorflow/tensorflow/issues/14454
+    TF_NEED_MPI = tfFeature cudaSupport;
+
+    TF_NEED_CUDA = tfFeature cudaSupport;
+    TF_CUDA_PATHS = lib.optionalString cudaSupport "${cudatoolkit_joined},${cudnn},${nccl}";
+    TF_CUDA_COMPUTE_CAPABILITIES = lib.concatStringsSep "," cudaCapabilities;
+
+    # Needed even when we override stdenv: e.g. for ar
+    GCC_HOST_COMPILER_PREFIX = lib.optionalString cudaSupport "${cudatoolkit_cc_joined}/bin";
+    GCC_HOST_COMPILER_PATH = lib.optionalString cudaSupport "${cudatoolkit_cc_joined}/bin/cc";
+
+    patches = [
+      "${gentoo-patches}/0002-systemlib-Latest-absl-LTS-has-split-cord-libs.patch"
+      "${gentoo-patches}/0005-systemlib-Updates-for-Abseil-20220623-LTS.patch"
+      "${gentoo-patches}/0007-systemlibs-Add-well_known_types_py_pb2-target.patch"
+      # https://github.com/conda-forge/tensorflow-feedstock/pull/329/commits/0a63c5a962451b4da99a9948323d8b3ed462f461
+      (fetchpatch {
+        name = "fix-layout-proto-duplicate-loading.patch";
+        url = "https://raw.githubusercontent.com/conda-forge/tensorflow-feedstock/0a63c5a962451b4da99a9948323d8b3ed462f461/recipe/patches/0001-Omit-linking-to-layout_proto_cc-if-protobuf-linkage-.patch";
+        hash = "sha256-/7buV6DinKnrgfqbe7KKSh9rCebeQdXv2Uj+Xg/083w=";
+      })
+      ./com_google_absl_add_log.patch
+      ./absl_py_argparse_flags.patch
+      ./protobuf_python.patch
+      ./pybind11_protobuf_python_runtime_dep.patch
+      ./pybind11_protobuf_newer_version.patch
+    ] ++ lib.optionals (stdenv.hostPlatform.system == "aarch64-darwin") [
+      ./absl_to_std.patch
+    ];
+
+    postPatch = ''
+      # bazel 3.3 should work just as well as bazel 3.1
+      rm -f .bazelversion
+      patchShebangs .
+    '' + lib.optionalString (stdenv.hostPlatform.system == "x86_64-darwin") ''
+      cat ${./com_google_absl_fix_macos.patch} >> third_party/absl/com_google_absl_fix_mac_and_nvcc_build.patch
+    '' + lib.optionalString (!withTensorboard) ''
+      # Tensorboard pulls in a bunch of dependencies, some of which may
+      # include security vulnerabilities. So we make it optional.
+      # https://github.com/tensorflow/tensorflow/issues/20280#issuecomment-400230560
+      sed -i '/tensorboard ~=/d' tensorflow/tools/pip_package/setup.py
+    '';
+
+    # https://github.com/tensorflow/tensorflow/pull/39470
+    env.NIX_CFLAGS_COMPILE = toString [ "-Wno-stringop-truncation" ];
+
+    preConfigure = let
+      opt_flags = []
+        ++ lib.optionals sse42Support ["-msse4.2"]
+        ++ lib.optionals avx2Support ["-mavx2"]
+        ++ lib.optionals fmaSupport ["-mfma"];
+    in ''
+      patchShebangs configure
+
+      # dummy ldconfig
+      mkdir dummy-ldconfig
+      echo "#!${stdenv.shell}" > dummy-ldconfig/ldconfig
+      chmod +x dummy-ldconfig/ldconfig
+      export PATH="$PWD/dummy-ldconfig:$PATH"
+
+      export PYTHON_LIB_PATH="$NIX_BUILD_TOP/site-packages"
+      export CC_OPT_FLAGS="${lib.concatStringsSep " " opt_flags}"
+      mkdir -p "$PYTHON_LIB_PATH"
+
+      # To avoid mixing Python 2 and Python 3
+      unset PYTHONPATH
+    '';
+
+    configurePhase = ''
+      runHook preConfigure
+      ./configure
+      runHook postConfigure
+    '';
+
+    hardeningDisable = [ "format" ];
+
+    bazelBuildFlags = [
+      "--config=opt" # optimize using the flags set in the configure phase
+    ]
+    ++ lib.optionals stdenv.cc.isClang [
+      "--cxxopt=-x" "--cxxopt=c++"
+      "--host_cxxopt=-x" "--host_cxxopt=c++"
+
+      # workaround for https://github.com/bazelbuild/bazel/issues/15359
+      "--spawn_strategy=sandboxed"
+    ]
+    ++ lib.optionals (mklSupport) [ "--config=mkl" ];
+
+    bazelTargets = [ "//tensorflow/tools/pip_package:build_pip_package //tensorflow/tools/lib_package:libtensorflow" ];
+
+    removeRulesCC = false;
+    # Without this Bazel complaints about sandbox violations.
+    dontAddBazelOpts = true;
+
+    fetchAttrs = {
+      sha256 = {
+      x86_64-linux = if cudaSupport
+        then "sha256-5VFMNHeLrUxW5RTr6EhT3pay9nWJ5JkZTGirDds5QkU="
+        else "sha256-KzgWV69Btr84FdwQ5JI2nQEsqiPg1/+TWdbw5bmxXOE=";
+      aarch64-linux = "sha256-9btXrNHqd720oXTPDhSmFidv5iaZRLjCVX8opmrMjXk=";
+      x86_64-darwin = "sha256-gqb03kB0z2pZQ6m1fyRp1/Nbt8AVVHWpOJSeZNCLc4w=";
+      aarch64-darwin = "sha256-WdgAaFZU+ePwWkVBhLzjlNT7ELfGHOTaMdafcAMD5yo=";
+      }.${stdenv.hostPlatform.system} or (throw "unsupported system ${stdenv.hostPlatform.system}");
+    };
+
+    buildAttrs = {
+      outputs = [ "out" "python" ];
+
+      # need to rebuild schemas since we use a different flatbuffers version
+      preBuild = ''
+        (cd tensorflow/lite/schema;${flatbuffers-core}/bin/flatc --gen-object-api -c schema.fbs)
+        (cd tensorflow/lite/schema;${flatbuffers-core}/bin/flatc --gen-object-api -c conversion_metadata.fbs)
+        (cd tensorflow/lite/acceleration/configuration;${flatbuffers-core}/bin/flatc -o configuration.fbs --proto configuration.proto)
+        sed -i s,tflite.proto,tflite,g tensorflow/lite/acceleration/configuration/configuration.fbs/configuration.fbs
+        (cd tensorflow/lite/acceleration/configuration;${flatbuffers-core}/bin/flatc --gen-compare --gen-object-api -c configuration.fbs/configuration.fbs)
+        cp -r tensorflow/lite/acceleration/configuration/configuration.fbs tensorflow/lite/experimental/acceleration/configuration
+        (cd tensorflow/lite/experimental/acceleration/configuration;${flatbuffers-core}/bin/flatc -c configuration.fbs/configuration.fbs)
+        (cd tensorflow/lite/delegates/gpu/cl;${flatbuffers-core}/bin/flatc -c compiled_program_cache.fbs)
+        (cd tensorflow/lite/delegates/gpu/cl;${flatbuffers-core}/bin/flatc -I $NIX_BUILD_TOP/source -c serialization.fbs)
+        (cd tensorflow/lite/delegates/gpu/common;${flatbuffers-core}/bin/flatc -I $NIX_BUILD_TOP/source -c gpu_model.fbs)
+        (cd tensorflow/lite/delegates/gpu/common/task;${flatbuffers-core}/bin/flatc -c serialization_base.fbs)
+        patchShebangs .
+      '';
+
+      installPhase = ''
+        mkdir -p "$out"
+        tar -xf bazel-bin/tensorflow/tools/lib_package/libtensorflow.tar.gz -C "$out"
+        # Write pkgconfig file.
+        mkdir "$out/lib/pkgconfig"
+        cat > "$out/lib/pkgconfig/tensorflow.pc" << EOF
+        Name: TensorFlow
+        Version: ${version}
+        Description: Library for computation using data flow graphs for scalable machine learning
+        Requires:
+        Libs: -L$out/lib -ltensorflow
+        Cflags: -I$out/include/tensorflow
+        EOF
+
+        # build the source code, then copy it to $python (build_pip_package
+        # actually builds a symlink farm so we must dereference them).
+        bazel-bin/tensorflow/tools/pip_package/build_pip_package --src "$PWD/dist"
+        cp -Lr "$PWD/dist" "$python"
+      '';
+
+      postFixup = lib.optionalString cudaSupport ''
+        find $out -type f \( -name '*.so' -or -name '*.so.*' \) | while read lib; do
+          addOpenGLRunpath "$lib"
+        done
+      '';
+
+      requiredSystemFeatures = [
+        "big-parallel"
+      ];
+    };
+
+    meta = with lib; {
+      changelog = "https://github.com/tensorflow/tensorflow/releases/tag/v${version}";
+      description = "Computation using data flow graphs for scalable machine learning";
+      homepage = "http://tensorflow.org";
+      license = licenses.asl20;
+      maintainers = with maintainers; [ abbradar ];
+      platforms = with platforms; linux ++ darwin;
+      broken = stdenv.isDarwin || !(xlaSupport -> cudaSupport);
+    } // lib.optionalAttrs stdenv.isDarwin {
+      timeout = 86400; # 24 hours
+      maxSilent = 14400; # 4h, double the default of 7200s
+    };
+  };
+
+in buildPythonPackage {
+  inherit version pname;
+  disabled = pythonOlder "3.8";
+
+  src = bazel-build.python;
+
+  # Adjust dependency requirements:
+  # - Drop tensorflow-io dependency until we get it to build
+  # - Relax flatbuffers and gast version requirements
+  # - The purpose of python3Packages.libclang is not clear at the moment and we don't have it packaged yet
+  # - keras and tensorlow-io-gcs-filesystem will be considered as optional for now.
+  postPatch = ''
+    sed -i setup.py \
+      -e '/tensorflow-io-gcs-filesystem/,+1d' \
+      -e "s/'flatbuffers[^']*',/'flatbuffers',/" \
+      -e "s/'gast[^']*',/'gast',/" \
+      -e "/'libclang[^']*',/d" \
+      -e "/'keras[^']*')\?,/d" \
+      -e "/'tensorflow-io-gcs-filesystem[^']*',/d" \
+      -e "s/'protobuf[^']*',/'protobuf',/" \
+  '';
+
+  # Upstream has a pip hack that results in bin/tensorboard being in both tensorflow
+  # and the propagated input tensorboard, which causes environment collisions.
+  # Another possibility would be to have tensorboard only in the buildInputs
+  # https://github.com/tensorflow/tensorflow/blob/v1.7.1/tensorflow/tools/pip_package/setup.py#L79
+  postInstall = ''
+    rm $out/bin/tensorboard
+  '';
+
+  setupPyGlobalFlags = [ "--project_name ${pname}" ];
+
+  # tensorflow/tools/pip_package/setup.py
+  propagatedBuildInputs = [
+    absl-py
+    abseil-cpp
+    astunparse
+    flatbuffers-python
+    gast
+    google-pasta
+    grpcio
+    h5py
+    keras-preprocessing
+    numpy
+    opt-einsum
+    packaging
+    protobuf-python
+    six
+    tensorflow-estimator-bin
+    termcolor
+    typing-extensions
+    wrapt
+  ] ++ lib.optionals withTensorboard [
+    tensorboard
+  ];
+
+  nativeBuildInputs = lib.optionals cudaSupport [ addOpenGLRunpath ];
+
+  postFixup = lib.optionalString cudaSupport ''
+    find $out -type f \( -name '*.so' -or -name '*.so.*' \) | while read lib; do
+      addOpenGLRunpath "$lib"
+
+      patchelf --set-rpath "${cudatoolkit}/lib:${cudatoolkit.lib}/lib:${cudnn}/lib:${nccl}/lib:$(patchelf --print-rpath "$lib")" "$lib"
+    done
+  '';
+
+  # Actual tests are slow and impure.
+  # TODO try to run them anyway
+  # TODO better test (files in tensorflow/tools/ci_build/builds/*test)
+  # TEST_PACKAGES in tensorflow/tools/pip_package/setup.py
+  nativeCheckInputs = [
+    dill
+    portpicker
+    tblib
+  ];
+  checkPhase = ''
+    ${python.interpreter} <<EOF
+    # A simple "Hello world"
+    import tensorflow as tf
+    hello = tf.constant("Hello, world!")
+    tf.print(hello)
+
+    tf.random.set_seed(0)
+    width = 512
+    choice = 48
+    t_in = tf.Variable(tf.random.uniform(shape=[width]))
+    with tf.GradientTape() as tape:
+        t_out = tf.slice(tf.nn.softmax(t_in), [choice], [1])
+    diff = tape.gradient(t_out, t_in)
+    assert(0 < tf.reduce_min(tf.slice(diff, [choice], [1])))
+    assert(0 > tf.reduce_max(tf.slice(diff, [1], [choice - 1])))
+    EOF
+  '';
+  # Regression test for #77626 removed because not more `tensorflow.contrib`.
+
+  passthru = {
+    inherit cudaPackages;
+    deps = bazel-build.deps;
+    libtensorflow = bazel-build.out;
+  };
+
+  inherit (bazel-build) meta;
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tensorflow/llvm_bazel_fix_macos_10_12_sdk.patch b/nixpkgs/pkgs/development/python-modules/tensorflow/llvm_bazel_fix_macos_10_12_sdk.patch
new file mode 100644
index 000000000000..6a858765c6a3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow/llvm_bazel_fix_macos_10_12_sdk.patch
@@ -0,0 +1,12 @@
+diff -ru a/utils/bazel/llvm-project-overlay/llvm/include/llvm/Config/config.h b/utils/bazel/llvm-project-overlay/llvm/include/llvm/Config/config.h
+--- a/utils/bazel/llvm-project-overlay/llvm/include/llvm/Config/config.h	2021-09-21 15:57:02.000000000 -0400
++++ b/utils/bazel/llvm-project-overlay/llvm/include/llvm/Config/config.h	2021-11-20 18:48:48.000000000 -0500
+@@ -102,7 +102,7 @@
+ /* #undef HAVE_FFI_H */
+ 
+ /* Define to 1 if you have the `futimens' function. */
+-#define HAVE_FUTIMENS 1
++/* #define HAVE_FUTIMENS 1 */
+ 
+ /* Define to 1 if you have the `futimes' function. */
+ #define HAVE_FUTIMES 1
diff --git a/nixpkgs/pkgs/development/python-modules/tensorflow/prefetcher.sh b/nixpkgs/pkgs/development/python-modules/tensorflow/prefetcher.sh
new file mode 100755
index 000000000000..136d982f2f60
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow/prefetcher.sh
@@ -0,0 +1,43 @@
+#!/usr/bin/env bash
+
+version="2.15.0"
+
+bucket="https://storage.googleapis.com/tensorflow"
+
+# List of binary wheels for Tensorflow.  The most recent versions can be found
+# on the following page:
+# https://www.tensorflow.org/install/pip?lang=python3#package-location
+url_and_key_list=(
+"linux_py_39_cpu $bucket/linux/cpu/tensorflow_cpu-${version}-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
+"linux_py_310_cpu $bucket/linux/cpu/tensorflow_cpu-${version}-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
+"linux_py_311_cpu $bucket/linux/cpu/tensorflow_cpu-${version}-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
+"linux_py_39_gpu $bucket/linux/gpu/tensorflow-${version}-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
+"linux_py_310_gpu $bucket/linux/gpu/tensorflow-${version}-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
+"linux_py_311_gpu $bucket/linux/gpu/tensorflow-${version}-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
+"mac_py_39_cpu $bucket/mac/cpu/tensorflow-${version}-cp39-cp39-macosx_10_15_x86_64.whl"
+"mac_py_310_cpu $bucket/mac/cpu/tensorflow-${version}-cp310-cp310-macosx_10_15_x86_64.whl"
+"mac_py_311_cpu $bucket/mac/cpu/tensorflow-${version}-cp311-cp311-macosx_10_15_x86_64.whl"
+)
+
+hashfile=binary-hashes.nix
+rm -f $hashfile
+echo "{" >> $hashfile
+echo "version = \"$version\";" >> $hashfile
+
+for url_and_key in "${url_and_key_list[@]}"; do
+  key=$(echo "$url_and_key" | cut -d' ' -f1)
+  url=$(echo "$url_and_key" | cut -d' ' -f2)
+
+  echo "prefetching ${url}..."
+  hash=$(nix-prefetch-url $url)
+
+  echo "$key = {" >> $hashfile
+  echo "  url = \"$url\";" >> $hashfile
+  echo "  sha256 = \"$hash\";" >> $hashfile
+  echo "};" >> $hashfile
+
+  echo
+done
+
+echo "}" >> $hashfile
+echo "done."
diff --git a/nixpkgs/pkgs/development/python-modules/tensorflow/protobuf_python.patch b/nixpkgs/pkgs/development/python-modules/tensorflow/protobuf_python.patch
new file mode 100644
index 000000000000..11de26605b4b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow/protobuf_python.patch
@@ -0,0 +1,19 @@
+diff -Naurd x/tensorflow/workspace2.bzl y/tensorflow/workspace2.bzl
+--- x/tensorflow/workspace2.bzl	2023-09-16 20:44:02.266422132 +0000
++++ y/tensorflow/workspace2.bzl	2023-09-16 20:50:40.370998305 +0000
+@@ -469,6 +469,7 @@
+         system_link_files = {
+             "//third_party/systemlibs:protobuf.bzl": "protobuf.bzl",
+             "//third_party/systemlibs:protobuf_deps.bzl": "protobuf_deps.bzl",
++            "//third_party/systemlibs:protobuf.python.BUILD": "python/BUILD",
+         },
+         urls = tf_mirror_urls("https://github.com/protocolbuffers/protobuf/archive/v3.21.9.zip"),
+     )
+diff -Naurd x/third_party/systemlibs/protobuf.python.BUILD y/third_party/systemlibs/protobuf.python.BUILD
+--- x/third_party/systemlibs/protobuf.python.BUILD	1970-01-01 00:00:00.000000000 +0000
++++ y/third_party/systemlibs/protobuf.python.BUILD	2023-09-16 20:49:12.514890584 +0000
+@@ -0,0 +1,4 @@
++cc_library(
++    name = "proto_api",
++    visibility = ["//visibility:public"]
++)
diff --git a/nixpkgs/pkgs/development/python-modules/tensorflow/pybind11_protobuf_newer_version.patch b/nixpkgs/pkgs/development/python-modules/tensorflow/pybind11_protobuf_newer_version.patch
new file mode 100644
index 000000000000..460ada1fb562
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow/pybind11_protobuf_newer_version.patch
@@ -0,0 +1,16 @@
+diff -Naurd x/tensorflow/workspace2.bzl y/tensorflow/workspace2.bzl
+--- x/tensorflow/workspace2.bzl	2023-09-21 12:55:06.104407343 +0000
++++ y/tensorflow/workspace2.bzl	2023-09-21 12:55:39.732453203 +0000
+@@ -872,9 +872,9 @@
+ 
+     tf_http_archive(
+         name = "pybind11_protobuf",
+-        urls = tf_mirror_urls("https://github.com/pybind/pybind11_protobuf/archive/80f3440cd8fee124e077e2e47a8a17b78b451363.zip"),
+-        sha256 = "c7ab64b1ccf9a678694a89035a8c865a693e4e872803778f91f0965c2f281d78",
+-        strip_prefix = "pybind11_protobuf-80f3440cd8fee124e077e2e47a8a17b78b451363",
++        urls = tf_mirror_urls("https://github.com/pybind/pybind11_protobuf/archive/c8cc30e2495309e3499b7d76033446236d21c837.zip"),
++        sha256 = "0663f73b34c0b4af55003edbb066e62aceff99bfcf12e47ea9a15d6013d81413",
++        strip_prefix = "pybind11_protobuf-c8cc30e2495309e3499b7d76033446236d21c837",
+         patch_file = [
+             "//third_party/pybind11_protobuf:remove_license.patch",
+             "//third_party/pybind11_protobuf:python_runtime_dep.patch",
diff --git a/nixpkgs/pkgs/development/python-modules/tensorflow/pybind11_protobuf_python_runtime_dep.patch b/nixpkgs/pkgs/development/python-modules/tensorflow/pybind11_protobuf_python_runtime_dep.patch
new file mode 100644
index 000000000000..daebaac86892
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorflow/pybind11_protobuf_python_runtime_dep.patch
@@ -0,0 +1,30 @@
+diff -Naurd x/tensorflow/workspace2.bzl y/tensorflow/workspace2.bzl
+--- x/tensorflow/workspace2.bzl	2023-09-17 22:22:22.029075202 +0000
++++ y/tensorflow/workspace2.bzl	2023-09-17 22:25:27.501289587 +0000
+@@ -876,7 +876,10 @@
+         urls = tf_mirror_urls("https://github.com/pybind/pybind11_protobuf/archive/80f3440cd8fee124e077e2e47a8a17b78b451363.zip"),
+         sha256 = "c7ab64b1ccf9a678694a89035a8c865a693e4e872803778f91f0965c2f281d78",
+         strip_prefix = "pybind11_protobuf-80f3440cd8fee124e077e2e47a8a17b78b451363",
+-        patch_file = ["//third_party/pybind11_protobuf:remove_license.patch"],
++        patch_file = [
++            "//third_party/pybind11_protobuf:remove_license.patch",
++            "//third_party/pybind11_protobuf:python_runtime_dep.patch",
++	],
+     )
+ 
+     tf_http_archive(
+diff -Naurd x/third_party/pybind11_protobuf/python_runtime_dep.patch y/third_party/pybind11_protobuf/python_runtime_dep.patch
+--- x/third_party/pybind11_protobuf/python_runtime_dep.patch	1970-01-01 00:00:00.000000000 +0000
++++ y/third_party/pybind11_protobuf/python_runtime_dep.patch	2023-09-17 22:23:07.849128180 +0000
+@@ -0,0 +1,11 @@
++diff -Naurd x/pybind11_protobuf/BUILD y/pybind11_protobuf/BUILD
++--- x/pybind11_protobuf/BUILD	2023-09-17 22:17:19.932725814 +0000
+++++ y/pybind11_protobuf/BUILD	2023-09-17 22:20:44.056961932 +0000
++@@ -86,6 +86,7 @@
++         "//visibility:private",
++     ],
++     deps = [
+++        "@org_tensorflow//third_party/python_runtime:headers",
++         "@com_google_absl//absl/container:flat_hash_map",
++         "@com_google_absl//absl/container:flat_hash_set",
++         "@com_google_absl//absl/meta:type_traits",
diff --git a/nixpkgs/pkgs/development/python-modules/tensorly/default.nix b/nixpkgs/pkgs/development/python-modules/tensorly/default.nix
new file mode 100644
index 000000000000..ad42066758a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorly/default.nix
@@ -0,0 +1,68 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, pytestCheckHook
+, pythonOlder
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "tensorly";
+  version = "0.8.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-hwpdExW/ESOavFkL3old1Efo5WC+PYmcgJp5/oLelaA=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "tensorly"
+    "tensorly.base"
+    "tensorly.cp_tensor"
+    "tensorly.tucker_tensor"
+    "tensorly.tt_tensor"
+    "tensorly.tt_matrix"
+    "tensorly.parafac2_tensor"
+    "tensorly.tenalg"
+    "tensorly.decomposition"
+    "tensorly.regression"
+    "tensorly.metrics"
+    "tensorly.random"
+    "tensorly.datasets"
+    "tensorly.plugins"
+    "tensorly.contrib"
+  ];
+
+  pytestFlagsArray = [
+    "tensorly"
+  ];
+
+  disabledTests = [
+    # this can fail on hydra and other peoples machines, check with others before re-enabling
+    # AssertionError: Partial_SVD took too long, maybe full_matrices set wrongly
+    "test_svd_time"
+  ];
+
+  meta = with lib; {
+    description = "Tensor learning in Python";
+    homepage = "https://tensorly.org/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tensorrt/default.nix b/nixpkgs/pkgs/development/python-modules/tensorrt/default.nix
new file mode 100644
index 000000000000..475e7627e4ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorrt/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, python
+, buildPythonPackage
+, autoPatchelfHook
+, unzip
+, cudaPackages
+}:
+
+let
+  pyVersion = "${lib.versions.major python.version}${lib.versions.minor python.version}";
+in
+buildPythonPackage rec {
+  pname = "tensorrt";
+  version = cudaPackages.tensorrt.version;
+
+  src = cudaPackages.tensorrt.src;
+
+  format = "wheel";
+  # We unpack the wheel ourselves because of the odd packaging.
+  dontUseWheelUnpack = true;
+
+  nativeBuildInputs = [
+    unzip
+    autoPatchelfHook
+    cudaPackages.autoAddOpenGLRunpathHook
+  ];
+
+  preUnpack = ''
+    mkdir -p dist
+    tar --strip-components=2 -xf "$src" --directory=dist \
+      "TensorRT-${version}/python/tensorrt-${version}-cp${pyVersion}-none-linux_x86_64.whl"
+  '';
+
+  sourceRoot = ".";
+
+  buildInputs = [
+    cudaPackages.cudnn
+    cudaPackages.tensorrt
+  ];
+
+  pythonImportsCheck = [
+    "tensorrt"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for TensorRT, a high-performance deep learning interface";
+    homepage = "https://developer.nvidia.com/tensorrt";
+    license = licenses.unfree;
+    platforms = [ "x86_64-linux" ];
+    maintainers = with maintainers; [ aidalgol ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tensorstore/default.nix b/nixpkgs/pkgs/development/python-modules/tensorstore/default.nix
new file mode 100644
index 000000000000..5e8631062394
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tensorstore/default.nix
@@ -0,0 +1,53 @@
+{ autoPatchelfHook
+, buildPythonPackage
+, fetchPypi
+, lib
+, numpy
+, python
+, stdenv
+}:
+
+let
+  pythonVersionNoDot = builtins.replaceStrings [ "." ] [ "" ] python.pythonVersion;
+  systemToPlatform = {
+    "x86_64-linux" = "manylinux_2_17_x86_64.manylinux2014_x86_64";
+    "aarch64-darwin" = "macosx_11_0_arm64";
+  };
+  hashes = {
+    "310-x86_64-linux" = "sha256-Zuy2zBLV950CMbdtpLNpIWqnXHw2jkjrZG48eGtm42w=";
+    "311-x86_64-linux" = "sha256-Bg5j8QB5z8Ju4bEQsZDojJHTJ4UoQF1pkd4ma83Sc/s=";
+    "310-aarch64-darwin" = "sha256-6Tta4ru1TnobFa4FXWz8fm9rAxF0G09Y2Pj/KaQPVnE=";
+    "311-aarch64-darwin" = "sha256-Sb0tv9ZPQJ4n9b0ybpjJWpreQPZvSC5Sd7CXuUwHCn0=";
+  };
+in
+buildPythonPackage rec {
+  pname = "tensorstore";
+  version = "0.1.40";
+  format = "wheel";
+
+  # The source build involves some wonky Bazel stuff.
+  src = fetchPypi {
+    inherit pname version;
+    format = "wheel";
+    python = "cp${pythonVersionNoDot}";
+    abi = "cp${pythonVersionNoDot}";
+    dist = "cp${pythonVersionNoDot}";
+    platform = systemToPlatform.${stdenv.system} or (throw "unsupported system");
+    hash = hashes."${pythonVersionNoDot}-${stdenv.system}" or (throw "unsupported system/python version combination");
+  };
+
+  nativeBuildInputs = lib.optionals stdenv.isLinux [ autoPatchelfHook ];
+
+  propagatedBuildInputs = [ numpy ];
+
+  pythonImportsCheck = [ "tensorstore" ];
+
+  meta = with lib; {
+    description = "Library for reading and writing large multi-dimensional arrays";
+    homepage = "https://google.github.io/tensorstore";
+    changelog = "https://github.com/google/tensorstore/releases/tag/v${version}";
+    license = licenses.asl20;
+    sourceProvenance = [ sourceTypes.binaryNativeCode ];
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/termcolor/default.nix b/nixpkgs/pkgs/development/python-modules/termcolor/default.nix
new file mode 100644
index 000000000000..0d40a1b44f96
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/termcolor/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hatch-vcs
+, hatchling
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "termcolor";
+  version = "2.3.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-tbCPaJN/E4/pL2wIm5nx4toK5WxSt4v3B1/ZVCD9mlo=";
+  };
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  pythonImportsCheck = [
+    "termcolor"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Termcolor";
+    homepage = "https://pypi.python.org/pypi/termcolor";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/termgraph/default.nix b/nixpkgs/pkgs/development/python-modules/termgraph/default.nix
new file mode 100644
index 000000000000..30d37d9f87d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/termgraph/default.nix
@@ -0,0 +1,32 @@
+{ buildPythonPackage
+, colorama
+, fetchFromGitHub
+, lib
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "termgraph";
+  version = "0.5.3";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "mkaz";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-0J9mEpDIdNEYwO+A+HBOaSw+Ct+HsbSPwGQYuYH6NN8=";
+  };
+
+  propagatedBuildInputs = [ colorama ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "termgraph" ];
+
+  meta = with lib; {
+    description = "A python command-line tool which draws basic graphs in the terminal";
+    homepage = "https://github.com/mkaz/termgraph";
+    license = licenses.mit;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/terminado/default.nix b/nixpkgs/pkgs/development/python-modules/terminado/default.nix
new file mode 100644
index 000000000000..3c75305e9078
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/terminado/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hatchling
+, ptyprocess
+, tornado
+, pytest-timeout
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "terminado";
+  version = "0.17.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bMu806T4olpewEmR85oLjbUt/NSH6g5XjZd+Z1I4AzM=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    ptyprocess
+    tornado
+  ];
+
+  pythonImportsCheck = [
+    "terminado"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Terminals served by Tornado websockets";
+    homepage = "https://github.com/jupyter/terminado";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/terminaltables/default.nix b/nixpkgs/pkgs/development/python-modules/terminaltables/default.nix
new file mode 100644
index 000000000000..7b548b763fdf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/terminaltables/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "terminaltables";
+  version = "3.1.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ba6eca5cb5ba02bba4c9f4f985af80c54ec3dccf94cfcd190154386255e47543";
+  };
+
+  meta = with lib; {
+    description = "Display simple tables in terminals";
+    homepage = "https://github.com/Robpol86/terminaltables";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/termplotlib/default.nix b/nixpkgs/pkgs/development/python-modules/termplotlib/default.nix
new file mode 100644
index 000000000000..5ed244959eb1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/termplotlib/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, substituteAll
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, exdown
+, numpy
+, gnuplot
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "termplotlib";
+  version = "0.3.9";
+
+  src = fetchFromGitHub {
+    owner = "nschloe";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1qfrv2w7vb2bbjvd5lqfq57c23iqkry0pwmif1ha3asmz330rja1";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  format = "pyproject";
+  nativeCheckInputs = [
+    pytestCheckHook
+    exdown
+  ];
+  pythonImportsCheck = [ "termplotlib" ];
+
+  propagatedBuildInputs = [ numpy ];
+
+  patches = [
+    (substituteAll {
+      src = ./gnuplot-subprocess.patch;
+      gnuplot = "${gnuplot.out}/bin/gnuplot";
+    })
+  ];
+
+  # The current gnuplot version renders slightly different test
+  # graphs, with emphasis on slightly. The plots are still correct.
+  # Tests pass on gnuplot 5.4.1, but fail on 5.4.2.
+  disabledTests = [
+    "test_plot"
+    "test_nolabel"
+  ];
+
+  meta = with lib; {
+    description = "matplotlib for your terminal";
+    homepage = "https://github.com/nschloe/termplotlib";
+    license = with licenses; [ gpl3Plus ];
+    maintainers = with maintainers; [ thoughtpolice ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/termplotlib/gnuplot-subprocess.patch b/nixpkgs/pkgs/development/python-modules/termplotlib/gnuplot-subprocess.patch
new file mode 100644
index 000000000000..5935dbda1265
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/termplotlib/gnuplot-subprocess.patch
@@ -0,0 +1,26 @@
+diff --git a/src/termplotlib/helpers.py b/src/termplotlib/helpers.py
+index 4b67fd0..38a2242 100644
+--- a/src/termplotlib/helpers.py
++++ b/src/termplotlib/helpers.py
+@@ -32,7 +32,7 @@ def is_unicode_standard_output():
+ 
+ 
+ def get_gnuplot_version():
+-    out = subprocess.check_output(["gnuplot", "--version"]).decode()
++    out = subprocess.check_output(["@gnuplot@", "--version"]).decode()
+     m = re.match("gnuplot (\\d).(\\d) patchlevel (\\d)\n", out)
+     if m is None:
+         raise RuntimeError("Couldn't get gnuplot version")
+diff --git a/src/termplotlib/plot.py b/src/termplotlib/plot.py
+index 0f46b87..1418fd1 100644
+--- a/src/termplotlib/plot.py
++++ b/src/termplotlib/plot.py
+@@ -17,7 +17,7 @@ def plot(
+     ticks_scale: int = 0,
+ ):
+     p = subprocess.Popen(
+-        ["gnuplot"],
++        ["@gnuplot@"],
+         stdout=subprocess.PIPE,
+         stdin=subprocess.PIPE,
+         stderr=subprocess.PIPE,
diff --git a/nixpkgs/pkgs/development/python-modules/termstyle/default.nix b/nixpkgs/pkgs/development/python-modules/termstyle/default.nix
new file mode 100644
index 000000000000..0a1c4e764129
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/termstyle/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "termstyle";
+  version = "0.1.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ef74b83698ea014112040cf32b1a093c1ab3d91c4dd18ecc03ec178fd99c9f9f";
+  };
+
+  # Only manual tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Console colouring for python";
+    homepage = "https://pypi.python.org/pypi/python-termstyle/0.1.10";
+    license = licenses.bsdOriginal;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tern/default.nix b/nixpkgs/pkgs/development/python-modules/tern/default.nix
new file mode 100644
index 000000000000..9a07c2103518
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tern/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, debian-inspector
+, docker
+, dockerfile-parse
+, fetchPypi
+, gitpython
+, idna
+, license-expression
+, packageurl-python
+, pbr
+, prettytable
+, pythonOlder
+, pyyaml
+, regex
+, requests
+, stevedore
+}:
+
+buildPythonPackage rec {
+  pname = "tern";
+  version = "2.12.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-yMIvFiliEHrbZMqvX3ZAROWcqii5VmB54QEYHGRJocA=";
+  };
+
+  preBuild = ''
+    cp requirements.{in,txt}
+  '';
+
+  nativeBuildInputs = [
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    pyyaml
+    docker
+    dockerfile-parse
+    license-expression
+    requests
+    stevedore
+    debian-inspector
+    regex
+    gitpython
+    prettytable
+    idna
+    packageurl-python
+  ];
+
+  # No tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "tern"
+  ];
+
+  meta = with lib; {
+    description = "A software composition analysis tool and Python library that generates a Software Bill of Materials for container images and Dockerfiles";
+    homepage = "https://github.com/tern-tools/tern";
+    changelog = "https://github.com/tern-tools/tern/releases/tag/v${version}";
+    license = licenses.bsd2;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tesla-powerwall/default.nix b/nixpkgs/pkgs/development/python-modules/tesla-powerwall/default.nix
new file mode 100644
index 000000000000..50fc9b2be6bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tesla-powerwall/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "tesla-powerwall";
+  version = "0.3.19";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jrester";
+    repo = "tesla_powerwall";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ClrMgPAMBtDMfD6hCJIN1u4mp75QW+c3re28v3FreQg=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  pytestFlagsArray = [
+    "tests/unit"
+  ];
+
+  pythonImportsCheck = [
+    "tesla_powerwall"
+  ];
+
+  meta = with lib; {
+    description = "API for Tesla Powerwall";
+    homepage = "https://github.com/jrester/tesla_powerwall";
+    changelog = "https://github.com/jrester/tesla_powerwall/blob/v${version}/CHANGELOG";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tesla-wall-connector/default.nix b/nixpkgs/pkgs/development/python-modules/tesla-wall-connector/default.nix
new file mode 100644
index 000000000000..9bce448f7d2a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tesla-wall-connector/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, aiohttp
+, aioresponses
+, aresponses
+, backoff
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "tesla-wall-connector";
+  version = "1.0.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "einarhauks";
+    repo = pname;
+    rev = version;
+    hash = "sha256-GblKXWV9h37E3bxNsx17hEe0uDm8ahzJUx8wiE+Vc38=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    backoff
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "tesla_wall_connector"
+  ];
+
+  meta = with lib; {
+    description = "Library for communicating with a Tesla Wall Connector";
+    homepage = "https://github.com/einarhauks/tesla-wall-connector";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/teslajsonpy/default.nix b/nixpkgs/pkgs/development/python-modules/teslajsonpy/default.nix
new file mode 100644
index 000000000000..fe840bcd4e2c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/teslajsonpy/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, aiohttp
+, authcaptureproxy
+, backoff
+, beautifulsoup4
+, buildPythonPackage
+, fetchFromGitHub
+, httpx
+, orjson
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, tenacity
+, wrapt
+}:
+
+buildPythonPackage rec {
+  pname = "teslajsonpy";
+  version = "3.9.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "zabuldon";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-A59b7qr9Y4LuIwP51ci7k1019/T+qNcDYPDNCkmqpi4=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    authcaptureproxy
+    aiohttp
+    backoff
+    beautifulsoup4
+    httpx
+    orjson
+    tenacity
+    wrapt
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "teslajsonpy"
+  ];
+
+  meta = with lib; {
+    description = "Python library to work with Tesla API";
+    homepage = "https://github.com/zabuldon/teslajsonpy";
+    changelog = "https://github.com/zabuldon/teslajsonpy/releases/tag/v${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tess/default.nix b/nixpkgs/pkgs/development/python-modules/tess/default.nix
new file mode 100644
index 000000000000..be8e8ff45e05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tess/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, numpy
+, scipy
+}:
+
+buildPythonPackage {
+  pname = "tess";
+  version = "unstable-2019-05-07";
+
+  src = fetchFromGitHub {
+    owner = "wackywendell";
+    repo = "tess";
+    rev = "22c19df952732f9749637d1bf6d7b676b6c7b26c";
+    sha256 = "0pj18nrfx749fjc6bjdk5r3g1104c6jy6xg7jrpmssllhypbb1m4";
+  };
+
+  buildInputs = [ cython ];
+
+  propagatedBuildInputs = [ numpy scipy ];
+
+  meta = with lib; {
+    description = "A module for calculating and analyzing Voronoi tessellations";
+    homepage = "https://tess.readthedocs.org";
+    license = licenses.bsd3;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tesserocr/default.nix b/nixpkgs/pkgs/development/python-modules/tesserocr/default.nix
new file mode 100644
index 000000000000..4b7a89ea7b73
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tesserocr/default.nix
@@ -0,0 +1,62 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+
+# build dependencies
+, cython
+, leptonica
+, pkg-config
+, tesseract4
+
+# propagates
+, pillow
+
+# tests
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tesserocr";
+  version = "2.6.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-RVJfocGjVvnRVanekbN1nKRECEr9hTVE9aKaqFizA5A=";
+  };
+
+  # https://github.com/sirfz/tesserocr/issues/314
+  postPatch = ''
+    sed -i '/allheaders.h/a\    pass\n\ncdef extern from "leptonica/pix_internal.h" nogil:' tesseract.pxd
+  '';
+
+  nativeBuildInputs = [
+    cython
+    pkg-config
+  ];
+
+  buildInputs = [
+    leptonica
+    tesseract4
+  ];
+
+  propagatedBuildInputs = [
+    pillow
+  ];
+
+  pythonImportsCheck = [
+    "tesserocr"
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/sirfz/tesserocr/releases/tag/v${version}";
+    description = "A simple, Pillow-friendly, wrapper around the tesseract-ocr API for Optical Character Recognition (OCR)";
+    homepage = "https://github.com/sirfz/tesserocr";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mtrsk ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/test-tube/default.nix b/nixpkgs/pkgs/development/python-modules/test-tube/default.nix
new file mode 100644
index 000000000000..b2044e2f0732
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/test-tube/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, isPy27
+, pytestCheckHook
+, future
+, imageio
+, numpy
+, pandas
+, torch
+, tensorboard
+}:
+
+buildPythonPackage rec {
+  pname = "test-tube";
+  version = "0.628";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "williamFalcon";
+    repo = pname;
+    rev = version;
+    sha256 = "0w60xarmcw06gc4002sy7bjfykdz34gbgniswxkl0lw8a1v0xn2m";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  propagatedBuildInputs = [
+    future
+    imageio
+    numpy
+    pandas
+    torch
+    tensorboard
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/williamFalcon/test-tube";
+    description = "Framework-agnostic library to track and parallelize hyperparameter search in machine learning experiments";
+    license = licenses.mit;
+    maintainers = [ maintainers.tbenst ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/testbook/default.nix b/nixpkgs/pkgs/development/python-modules/testbook/default.nix
new file mode 100644
index 000000000000..4b49755bf891
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/testbook/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, nbformat
+, nbclient
+, ipykernel
+, pandas
+, pytestCheckHook
+, traitlets
+}:
+
+buildPythonPackage rec {
+  pname = "testbook";
+  version = "0.4.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "nteract";
+    repo = pname;
+    rev = version;
+    hash = "sha256-qaDgae/5TRpjmjOf7aom7TC5HLHp0PHM/ds47AKtq8U=";
+  };
+
+  propagatedBuildInputs = [
+    nbclient
+    nbformat
+  ];
+
+  nativeCheckInputs = [
+    ipykernel
+    pandas
+    pytestCheckHook
+    traitlets
+  ];
+
+  pythonImportsCheck = [
+    "testbook"
+  ];
+
+  meta = with lib; {
+    description = "A unit testing framework extension for testing code in Jupyter Notebooks";
+    homepage = "https://testbook.readthedocs.io/";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ djacu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/testcontainers/default.nix b/nixpkgs/pkgs/development/python-modules/testcontainers/default.nix
new file mode 100644
index 000000000000..4da0d7702317
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/testcontainers/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, deprecation
+, docker
+, wrapt }:
+
+buildPythonPackage rec {
+  pname = "testcontainers";
+  version = "3.7.1";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "testcontainers";
+    repo = "testcontainers-python";
+    rev = "v${version}";
+    hash = "sha256-OHuvUi5oa0fVcfo0FW9XwaUp52MEH4NTM6GqK4ic0oM=";
+  };
+
+  postPatch = ''
+    echo "${version}" > VERSION
+  '';
+
+  buildInputs = [
+    deprecation
+    docker
+    wrapt
+  ];
+
+  # Tests require various container and database services running
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "testcontainers"
+  ];
+
+  meta = with lib; {
+    description = ''
+      Allows using docker containers for functional and integration testing
+    '';
+    homepage = "https://github.com/testcontainers/testcontainers-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/testfixtures/default.nix b/nixpkgs/pkgs/development/python-modules/testfixtures/default.nix
new file mode 100644
index 000000000000..64b49efbd1de
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/testfixtures/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, sybil
+, twisted
+, zope-component
+}:
+
+buildPythonPackage rec {
+  pname = "testfixtures";
+  version = "7.2.0";
+  format = "setuptools";
+  # DO NOT CONTACT upstream.
+  # https://github.com/simplistix/ is only concerned with internal CI process.
+  # Any attempt by non-standard pip workflows to comment on issues will
+  # be met with hostility.
+  # https://github.com/simplistix/testfixtures/issues/169
+  # https://github.com/simplistix/testfixtures/issues/168
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-jIwg3TDqETVIUHWEodqud5JI26pXEmcseruXCfD7+LI=";
+  };
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+    sybil
+    twisted
+    zope-component
+  ];
+
+  disabledTestPaths = [
+    # Django is too much hasle to setup at the moment
+    "testfixtures/tests/test_django"
+  ];
+
+  pytestFlagsArray = [
+    "testfixtures/tests"
+  ];
+
+  pythonImportsCheck = [
+    "testfixtures"
+  ];
+
+  meta = with lib; {
+    description = "Collection of helpers and mock objects for unit tests and doc tests";
+    homepage = "https://github.com/Simplistix/testfixtures";
+    changelog = "https://github.com/simplistix/testfixtures/blob/${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ siriobalmelli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/testing-common-database/default.nix b/nixpkgs/pkgs/development/python-modules/testing-common-database/default.nix
new file mode 100644
index 000000000000..ff323b85e720
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/testing-common-database/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi  }:
+
+buildPythonPackage rec {
+  pname = "testing.common.database";
+  version = "2.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0wvdv0frl7xib05sixjv9m6jywaa2wdhdhsqqdfk45akk2r80pcn";
+  };
+
+  postPatch =  ''
+    substituteInPlace src/testing/common/database.py \
+      --replace "collections.Callable" "collections.abc.Callable"
+  '';
+
+  # There are no unit tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "utilities for testing.* packages";
+    homepage = "https://github.com/tk0miya/testing.common.database";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/testing-postgresql/default.nix b/nixpkgs/pkgs/development/python-modules/testing-postgresql/default.nix
new file mode 100644
index 000000000000..ad64fa53bebb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/testing-postgresql/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pg8000
+, postgresql
+, psycopg2
+, pytestCheckHook
+, pythonOlder
+, sqlalchemy
+, testing-common-database
+}:
+
+buildPythonPackage rec {
+  pname = "testing-postgresql";
+  # Version 1.3.0 isn't working so let's use the latest commit from GitHub
+  version = "unstable-2017-10-31";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tk0miya";
+    repo = "testing.postgresql";
+    rev = "c81ded434d00ec8424de0f9e1f4063c778c6aaa8";
+    hash = "sha256-A4tahAaa98X66ZYa3QxIQDZkwAwVB6ZDRObEhkbUWKs=";
+  };
+
+  propagatedBuildInputs = [
+    testing-common-database
+    pg8000
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    psycopg2
+    sqlalchemy
+  ];
+
+  # Add PostgreSQL to search path
+  prePatch = ''
+    substituteInPlace src/testing/postgresql.py \
+      --replace "/usr/local/pgsql" "${postgresql}"
+  '';
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pg8000 >= 1.10" "pg8000"
+  '';
+
+  pythonImportsCheck = [
+    "testing.postgresql"
+  ];
+
+  # Fix tests for Darwin build. See:
+  # https://github.com/NixOS/nixpkgs/pull/74716#issuecomment-598546916
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Use temporary postgresql instance in testing";
+    homepage = "https://github.com/tk0miya/testing.postgresql";
+    license = licenses.asl20;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/testpath/default.nix b/nixpkgs/pkgs/development/python-modules/testpath/default.nix
new file mode 100644
index 000000000000..eb66bea56f57
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/testpath/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "testpath";
+  version = "0.6.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-LxuX5kQsAmgevgG9hPUxAop8rqGvOCUAD1I0XDAoXg8=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # exe are only required when testpath is used on windows
+  # https://github.com/jupyter/testpath/blob/de8ca59539eb23b9781e55848b7d2646c8c61df9/testpath/commands.py#L128
+  preBuild = lib.optionalString (!stdenv.hostPlatform.isWindows) ''
+    rm testpath/cli-32.exe testpath/cli-64.exe
+  '';
+
+  preCheck = lib.optionalString stdenv.isDarwin ''
+    # Work around https://github.com/jupyter/testpath/issues/24
+    export TMPDIR="/tmp"
+  '';
+
+  meta = with lib; {
+    description = "Test utilities for code working with files and commands";
+    license = licenses.mit;
+    homepage = "https://github.com/jupyter/testpath";
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/testrail-api/default.nix b/nixpkgs/pkgs/development/python-modules/testrail-api/default.nix
new file mode 100644
index 000000000000..b6bb8a1b2256
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/testrail-api/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+, responses
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "testrail-api";
+  version = "1.12.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tolstislon";
+    repo = "testrail-api";
+    rev = "refs/tags/${version}";
+    hash = "sha256-lIlTrAdNtBJdwiSFwpcHA2e+fRC+MbHS0PX7prAN+RY=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "testrail_api"
+  ];
+
+  meta = with lib; {
+    description = "A Python wrapper of the TestRail API";
+    homepage = "https://github.com/tolstislon/testrail-api";
+    changelog = "https://github.com/tolstislon/ytestrail-api/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ aanderse ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/testrepository/default.nix b/nixpkgs/pkgs/development/python-modules/testrepository/default.nix
new file mode 100644
index 000000000000..908779a45d69
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/testrepository/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, testtools
+, testresources
+, pbr
+, subunit
+, fixtures
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "testrepository";
+  version = "0.0.20";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1ssqb07c277010i6gzzkbdd46gd9mrj0bi0i8vn560n2k2y4j93m";
+  };
+
+  nativeCheckInputs = [ testresources ];
+  buildInputs = [ pbr ];
+  propagatedBuildInputs = [ fixtures subunit testtools ];
+
+  checkPhase = ''
+    ${python.interpreter} ./testr
+  '';
+
+  meta = with lib; {
+    description = "A database of test results which can be used as part of developer workflow";
+    homepage = "https://pypi.python.org/pypi/testrepository";
+    license = licenses.bsd2;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/testresources/default.nix b/nixpkgs/pkgs/development/python-modules/testresources/default.nix
new file mode 100644
index 000000000000..8a7a6160e1af
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/testresources/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, python
+, pbr, fixtures, testtools }:
+
+buildPythonPackage rec {
+  pname = "testresources";
+  version = "2.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ee9d1982154a1e212d4e4bac6b610800bfb558e4fb853572a827bc14a96e4417";
+  };
+
+  propagatedBuildInputs = [ pbr ];
+
+  nativeCheckInputs = [ fixtures testtools ];
+
+  checkPhase = ''
+    ${python.interpreter} -m testtools.run discover
+  '';
+
+  meta = with lib; {
+    description = "Pyunit extension for managing expensive test resources";
+    homepage = "https://launchpad.net/testresources";
+    license = licenses.bsd2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/testscenarios/default.nix b/nixpkgs/pkgs/development/python-modules/testscenarios/default.nix
new file mode 100644
index 000000000000..8df35ac4b889
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/testscenarios/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, testtools
+}:
+
+buildPythonPackage rec {
+  pname = "testscenarios";
+  version = "0.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c257cb6b90ea7e6f8fef3158121d430543412c9a87df30b5dde6ec8b9b57a2b6";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "buffer = 1" "" \
+      --replace "catch = 1" ""
+  '';
+
+  propagatedBuildInputs = [ testtools ];
+
+  meta = with lib; {
+    description = "A pyunit extension for dependency injection";
+    homepage = "https://pypi.python.org/pypi/testscenarios";
+    license = licenses.asl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/testtools/default.nix b/nixpkgs/pkgs/development/python-modules/testtools/default.nix
new file mode 100644
index 000000000000..c4f74d377d5f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/testtools/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonRelaxDepsHook
+, pbr
+, python-mimeparse
+, extras
+, traceback2
+, testscenarios
+}:
+
+buildPythonPackage rec {
+  pname = "testtools";
+  version = "2.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-KLZeFMDy0+y7+19VydzeXk+qgKwWo3qCOQmh/jy8swo=";
+  };
+
+  propagatedBuildInputs = [ pbr python-mimeparse extras ];
+  buildInputs = [ traceback2 ];
+  nativeBuildInputs = [ pythonRelaxDepsHook ];
+
+  # testscenarios has a circular dependency on testtools
+  doCheck = false;
+  nativeCheckInputs = [ testscenarios ];
+
+  pythonRemoveDeps = [ "fixtures" ];
+
+  meta = {
+    description = "A set of extensions to the Python standard library's unit testing framework";
+    homepage = "https://pypi.python.org/pypi/testtools";
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/text-unidecode/default.nix b/nixpkgs/pkgs/development/python-modules/text-unidecode/default.nix
new file mode 100644
index 000000000000..30f5b73f5fd3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/text-unidecode/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, pytest }:
+
+buildPythonPackage rec {
+  pname = "text-unidecode";
+  version = "1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93";
+  };
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    description = "The most basic Text::Unidecode port";
+    homepage = "https://github.com/kmike/text-unidecode";
+    license = licenses.artistic1;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/textacy/default.nix b/nixpkgs/pkgs/development/python-modules/textacy/default.nix
new file mode 100644
index 000000000000..4167cfd7d969
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/textacy/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, buildPythonPackage
+, cachetools
+, cytoolz
+, fetchPypi
+, floret
+, jellyfish
+, joblib
+, matplotlib
+, networkx
+, numpy
+, pyemd
+, pyphen
+, pytestCheckHook
+, pythonOlder
+, requests
+, scikit-learn
+, scipy
+, spacy
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "textacy";
+  version = "0.13.0";
+  disabled = pythonOlder "3.7";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-a+AkSMCPx9fE7fhSiQBuOaSlPvdHIB/yS2dcZS9AxoY=";
+  };
+
+  propagatedBuildInputs = [
+    cachetools
+    cytoolz
+    floret
+    jellyfish
+    joblib
+    matplotlib
+    networkx
+    numpy
+    pyemd
+    pyphen
+    requests
+    scikit-learn
+    scipy
+    spacy
+    tqdm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    # Almost all tests have to deal with downloading a dataset, only test pure tests
+    "tests/test_constants.py"
+    "tests/preprocessing/test_normalize.py"
+    "tests/similarity/test_edits.py"
+    "tests/preprocessing/test_resources.py"
+    "tests/preprocessing/test_replace.py"
+  ];
+
+  pythonImportsCheck = [ "textacy" ];
+
+  meta = with lib; {
+    description = "Higher-level text processing, built on spaCy";
+    homepage = "https://textacy.readthedocs.io/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ rvl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/textdistance/default.nix b/nixpkgs/pkgs/development/python-modules/textdistance/default.nix
new file mode 100644
index 000000000000..2c2d5ee23adf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/textdistance/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "textdistance";
+  version = "4.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-cyxQMVzU7pRjg4ZDzxnWkiEwLDYDHqpgcMMMwKpdqMo=";
+  };
+
+  # There aren't tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "textdistance"
+  ];
+
+  meta = with lib; {
+    description = "Python library for comparing distance between two or more sequences";
+    homepage = "https://github.com/life4/textdistance";
+    changelog = "https://github.com/life4/textdistance/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/textfsm/default.nix b/nixpkgs/pkgs/development/python-modules/textfsm/default.nix
new file mode 100644
index 000000000000..14d7c34cf406
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/textfsm/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, six
+, future
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "textfsm";
+  version = "1.1.3";
+  format = "setuptools";
+
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-IHgKG8v0X+LSK6purWBdwDnI/BCs5XA12ZJixuqqXWg=";
+  };
+
+  propagatedBuildInputs = [
+    six
+    future
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Python module for parsing semi-structured text into python tables";
+    homepage = "https://github.com/google/textfsm";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/textile/default.nix b/nixpkgs/pkgs/development/python-modules/textile/default.nix
new file mode 100644
index 000000000000..adae00ef3ec5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/textile/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, html5lib
+, pytestCheckHook
+, pythonOlder
+, regex
+}:
+
+buildPythonPackage rec {
+  pname = "textile";
+  version = "4.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = "python-textile";
+    rev = version;
+    hash = "sha256-WwX7h07Bq8sNsViHwmfhrrqleXacmrIY4ZBBaP2kKnI=";
+  };
+
+  propagatedBuildInputs = [
+    html5lib
+    regex
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace " --cov=textile --cov-report=html --cov-append --cov-report=term-missing" ""
+  '';
+
+  pythonImportsCheck = [
+    "textile"
+  ];
+
+  meta = with lib; {
+    description = "MOdule for generating web text";
+    homepage = "https://github.com/textile/python-textile";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/textnets/default.nix b/nixpkgs/pkgs/development/python-modules/textnets/default.nix
new file mode 100644
index 000000000000..f0dd9ab9a650
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/textnets/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, cairocffi
+, cython
+, fetchPypi
+, igraph
+, leidenalg
+, pandas
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, scipy
+, setuptools
+, spacy
+, spacy-lookups-data
+, en_core_web_sm
+, toolz
+, tqdm
+, wasabi
+}:
+
+buildPythonPackage rec {
+  pname = "textnets";
+  version = "0.9.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-fx2S43IqpSMsfJow26jB/D27dyUFQ1PlXP1rbUIZPPQ=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    poetry-core
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    cairocffi
+    igraph
+    leidenalg
+    pandas
+    scipy
+    spacy
+    spacy-lookups-data
+    toolz
+    tqdm
+    wasabi
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    en_core_web_sm
+  ];
+
+  pythonImportsCheck = [
+    "textnets"
+  ];
+
+  disabledTests = [
+    # Test fails: A warning is triggered because of a deprecation notice by pandas.
+    # TODO: Try to re-enable it when pandas is updated to 2.1.1
+    "test_corpus_czech"
+  ];
+
+  meta = with lib; {
+    description = "Text analysis with networks";
+    homepage = "https://textnets.readthedocs.io";
+    changelog = "https://github.com/jboynyc/textnets/blob/v${version}/HISTORY.rst";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ jboy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/textparser/default.nix b/nixpkgs/pkgs/development/python-modules/textparser/default.nix
new file mode 100644
index 000000000000..86c436ac21f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/textparser/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "textparser";
+  version = "0.24.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VvcI51qp0AKtt22CO6bvFm1+zsHj5MpMHKED+BdWgzU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "textparser"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/eerimoq/textparser";
+    description = "A text parser";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gray-heron ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/texttable/default.nix b/nixpkgs/pkgs/development/python-modules/texttable/default.nix
new file mode 100644
index 000000000000..d1134a28601a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/texttable/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "texttable";
+  version = "1.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-LSBo+1URWAfTrHekymj6SIA+hOuw7iNA+FgQejZSJjg=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "texttable"
+  ];
+
+  pytestFlagsArray = [
+    "tests.py"
+  ];
+
+  meta = with lib; {
+    description = "Module to generate a formatted text table, using ASCII characters";
+    homepage = "https://github.com/foutaise/texttable";
+    changelog = "https://github.com/foutaise/texttable/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/textual-dev/default.nix b/nixpkgs/pkgs/development/python-modules/textual-dev/default.nix
new file mode 100644
index 000000000000..16b77ffabc47
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/textual-dev/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, msgpack
+, poetry-core
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, textual
+, time-machine
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "textual-dev";
+  version = "1.2.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Textualize";
+    repo = "textual-dev";
+    # we use rev instead of tag since upstream doesn't use tags
+    rev = "6afa9013a42cb18e9105e49d6a56874097f7c812";
+    hash = "sha256-ef35389ZMU/zih7Se3KkMGECf5o2i5y6up64/1AECas=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    click
+    msgpack
+    textual
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytestCheckHook
+    time-machine
+  ];
+
+  pythonImportsCheck = [
+    "textual_dev"
+  ];
+
+  meta = with lib; {
+    description = "Development tools for Textual";
+    homepage = "https://github.com/Textualize/textual-dev";
+    license = licenses.mit;
+    maintainers = with maintainers; [ yannip ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/textual-universal-directorytree/default.nix b/nixpkgs/pkgs/development/python-modules/textual-universal-directorytree/default.nix
new file mode 100644
index 000000000000..5f14accbaca7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/textual-universal-directorytree/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, hatchling
+, textual
+, universal-pathlib
+, adlfs
+, aiohttp
+, gcsfs
+, paramiko
+, requests
+, s3fs
+}:
+
+buildPythonPackage rec {
+  pname = "textual-universal-directorytree";
+  version = "1.0.2";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "juftin";
+    repo = "textual-universal-directorytree";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-FL2bwPGqBmDn33Rhj7+VEpuqB4znEAw+GGAODTs25oo=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    textual
+    universal-pathlib
+  ];
+
+  passthru.optional-dependencies = {
+    remote = [
+      adlfs
+      aiohttp
+      gcsfs
+      paramiko
+      requests
+      s3fs
+    ];
+  };
+
+  pythonImportsCheck = [ "textual_universal_directorytree" ];
+
+  meta = with lib; {
+    description = "Textual plugin for a DirectoryTree compatible with remote filesystems";
+    homepage = "https://github.com/juftin/textual-universal-directorytree";
+    changelog = "https://github.com/juftin/textual-universal-directorytree/releases/tag/${src.rev}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/textual/default.nix b/nixpkgs/pkgs/development/python-modules/textual/default.nix
new file mode 100644
index 000000000000..3a5486ff86e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/textual/default.nix
@@ -0,0 +1,86 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, importlib-metadata
+, jinja2
+, markdown-it-py
+, poetry-core
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, rich
+, syrupy
+, time-machine
+, tree-sitter
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "textual";
+  version = "0.41.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Textualize";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-K3JpAVkw6njUT2AGGLL3ACagPK0K6Ny4PvCsbmuNvTo=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    importlib-metadata
+    markdown-it-py
+    rich
+    typing-extensions
+  ] ++ markdown-it-py.optional-dependencies.plugins
+    ++ markdown-it-py.optional-dependencies.linkify;
+
+  passthru.optional-dependencies = {
+    syntax = [
+      tree-sitter
+      # tree-sitter-languages
+    ];
+  };
+
+  nativeCheckInputs = [
+    jinja2
+    pytest-aiohttp
+    pytestCheckHook
+    syrupy
+    time-machine
+  ] ++ passthru.optional-dependencies.syntax;
+
+  disabledTestPaths = [
+    # snapshot tests require syrupy<4
+    "tests/snapshot_tests/test_snapshots.py"
+  ];
+
+  disabledTests = [
+    # Assertion issues
+    "test_textual_env_var"
+    "test_softbreak_split_links_rendered_correctly"
+
+    # requires tree-sitter-languages which is not packaged in nixpkgs
+    "test_register_language"
+  ];
+
+  pythonImportsCheck = [
+    "textual"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "TUI framework for Python inspired by modern web development";
+    homepage = "https://github.com/Textualize/textual";
+    changelog = "https://github.com/Textualize/textual/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ joelkoen ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/textwrap3/default.nix b/nixpkgs/pkgs/development/python-modules/textwrap3/default.nix
new file mode 100644
index 000000000000..2ba2ea4944c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/textwrap3/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "textwrap3";
+  version = "0.9.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    sha256 = "5008eeebdb236f6303dcd68f18b856d355f6197511d952ba74bc75e40e0c3414";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Textwrap from Python 3.6 backport plus a few tweaks";
+    homepage = "https://github.com/jonathaneunice/textwrap3";
+    license = licenses.psfl;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/textx/default.nix b/nixpkgs/pkgs/development/python-modules/textx/default.nix
new file mode 100644
index 000000000000..e169cbdb9b81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/textx/default.nix
@@ -0,0 +1,177 @@
+{ lib
+, buildPythonPackage
+, python
+, fetchFromGitHub
+, mkdocs
+, twine
+, arpeggio
+, click
+, future
+, setuptools
+, callPackage
+, gprof2dot
+, html5lib
+, jinja2
+, psutil
+, pytestCheckHook
+}:
+
+let
+  textx = buildPythonPackage rec {
+    pname = "textx";
+    version = "3.0.0";
+    format = "setuptools";
+
+    src = fetchFromGitHub {
+      owner = pname;
+      repo = pname;
+      rev = version;
+      hash = "sha256-uZlO82dKtWQQR5+Q7dWk3+ZoUzAjDJ8qzC4UMLCtnBk=";
+    };
+
+    postPatch = ''
+      substituteInPlace setup.cfg --replace "click >=7.0, <8.0" "click >=7.0"
+    '';
+
+    outputs = [
+      "out"
+      "testout"
+    ];
+
+    nativeBuildInputs = [
+      mkdocs
+      twine
+    ];
+
+    propagatedBuildInputs = [
+      arpeggio
+      click
+      future
+      setuptools
+    ];
+
+    postInstall = ''
+      # FileNotFoundError: [Errno 2] No such file or directory: '$out/lib/python3.10/site-packages/textx/textx.tx
+      cp "$src/textx/textx.tx" "$out/${python.sitePackages}/${pname}/"
+
+      # Install tests as the tests output.
+      mkdir $testout
+      cp -r tests $testout/tests
+    '';
+
+    pythonImportsCheck = [
+      "textx"
+    ];
+
+    # Circular dependencies, do tests in passthru.tests instead.
+    doCheck = false;
+
+    passthru.tests = {
+      textxTests = callPackage ./tests.nix {
+        inherit
+          textx-data-dsl
+          textx-example-project
+          textx-flow-codegen
+          textx-flow-dsl
+          textx-types-dsl;
+       };
+    };
+
+    meta = with lib; {
+      description = "Domain-specific languages and parsers in Python";
+      homepage = "https://github.com/textx/textx/";
+      license = licenses.mit;
+      maintainers = with maintainers; [ yuu ];
+    };
+  };
+
+  textx-data-dsl = buildPythonPackage rec {
+    pname = "textx-data-dsl";
+    version = "1.0.0";
+    inherit (textx) src;
+    # `format` isn't included in the output of `mk-python-derivation`.
+    # So can't inherit format: `error: attribute 'format' missing`.
+    format = "setuptools";
+    pathToSourceRoot = "tests/functional/registration/projects/data_dsl";
+    sourceRoot = "${src.name}/" + pathToSourceRoot;
+    propagatedBuildInputs = [
+      textx
+      textx-types-dsl
+    ];
+    meta = with lib; {
+      inherit (textx.meta) license maintainers;
+      description = "Sample textX language for testing";
+      homepage = textx.homepage + "tree/${version}/" + pathToSourceRoot;
+    };
+  };
+
+  textx-flow-codegen = buildPythonPackage rec {
+    pname = "textx-flow-codegen";
+    version = "1.0.0";
+    inherit (textx) src;
+    format = "setuptools";
+    pathToSourceRoot = "tests/functional/registration/projects/flow_codegen";
+    sourceRoot = "${src.name}/" + pathToSourceRoot;
+    propagatedBuildInputs = [
+      click
+      textx
+    ];
+    meta = with lib; {
+      inherit (textx.meta) license maintainers;
+      description = "Sample textX language for testing";
+      homepage = textx.homepage + "tree/${version}/" + pathToSourceRoot;
+    };
+  };
+
+  textx-flow-dsl = buildPythonPackage rec {
+    pname = "textx-flow-dsl";
+    version = "1.0.0";
+    inherit (textx) src;
+    format = "setuptools";
+    pathToSourceRoot = "tests/functional/registration/projects/flow_dsl";
+    sourceRoot = "${src.name}/" + pathToSourceRoot;
+    propagatedBuildInputs = [
+      textx
+    ];
+    meta = with lib; {
+      inherit (textx.meta) license maintainers;
+      description = "Sample textX language for testing";
+      homepage = textx.homepage + "tree/${version}/" + pathToSourceRoot;
+    };
+  };
+
+  textx-types-dsl = buildPythonPackage rec {
+    pname = "textx-types-dsl";
+    version = "1.0.0";
+    inherit (textx) src;
+    format = "setuptools";
+    pathToSourceRoot = "tests/functional/registration/projects/types_dsl";
+    sourceRoot = "${src.name}/" + pathToSourceRoot;
+    propagatedBuildInputs = [
+      textx
+    ];
+    meta = with lib; {
+      inherit (textx.meta) license maintainers;
+      description = "Sample textX language for testing";
+      homepage = textx.homepage + "tree/${version}/" + pathToSourceRoot;
+    };
+  };
+
+  textx-example-project = buildPythonPackage rec {
+    pname = "textx-example-project";
+    version = "1.0.0";
+    inherit (textx) src;
+    format = "setuptools";
+    pathToSourceRoot = "tests/functional/subcommands/example_project";
+    sourceRoot = "${src.name}/" + pathToSourceRoot;
+    propagatedBuildInputs = [
+      textx
+    ];
+    meta = with lib; {
+      inherit (textx.meta) license maintainers;
+      description = "Sample textX sub-command for testing";
+      homepage = textx.homepage + "tree/${version}/" + pathToSourceRoot;
+    };
+  };
+in
+  textx
diff --git a/nixpkgs/pkgs/development/python-modules/textx/tests.nix b/nixpkgs/pkgs/development/python-modules/textx/tests.nix
new file mode 100644
index 000000000000..488c276e910f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/textx/tests.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, click
+, gprof2dot
+, html5lib
+, jinja2
+, memory-profiler
+, psutil
+, pytestCheckHook
+, setuptools
+, textx
+, textx-data-dsl
+, textx-example-project
+, textx-flow-codegen
+, textx-flow-dsl
+, textx-types-dsl
+}:
+
+buildPythonPackage {
+  pname = "textx-tests";
+  inherit (textx) version;
+
+  srcs = textx.testout;
+
+  dontBuild = true;
+  dontInstall = true;
+
+  nativeCheckInputs = [
+    click
+    gprof2dot
+    html5lib
+    jinja2
+    memory-profiler
+    psutil
+    pytestCheckHook
+    setuptools
+    textx-data-dsl
+    textx-example-project
+    textx-flow-codegen
+    textx-flow-dsl
+    textx-types-dsl
+  ];
+
+  pytestFlagsArray = [
+    "tests/functional"
+  ];
+
+  meta = with lib; {
+    inherit (textx.meta) license maintainers;
+    description = "passthru.tests for textx";
+    homepage = textx.homepage + "tree/${version}/" + "tests/";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tf2onnx/default.nix b/nixpkgs/pkgs/development/python-modules/tf2onnx/default.nix
new file mode 100644
index 000000000000..f1359e6fdaac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tf2onnx/default.nix
@@ -0,0 +1,86 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonRelaxDepsHook
+, pytest-runner
+# runtime dependencies
+, numpy
+, onnx
+, requests
+, six
+, flatbuffers
+, protobuf
+, tensorflow
+# check dependencies
+, pytestCheckHook
+, graphviz
+, parameterized
+, pytest-cov
+, pyyaml
+, timeout-decorator
+, onnxruntime
+, keras
+}:
+
+buildPythonPackage rec {
+  pname = "tf2onnx";
+  version = "1.15.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "onnx";
+    repo = "tensorflow-onnx";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-HqzcoPPX9+NOj0uFfOSVI2MNCkxq1NmLqXflwdi5RF0=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    pytest-runner
+  ];
+
+  pythonRelaxDeps = [
+    "flatbuffers"
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    onnx
+    requests
+    six
+    flatbuffers
+    protobuf
+    tensorflow
+    onnxruntime
+  ];
+
+  pythonImportsCheck = [ "tf2onnx" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    graphviz
+    parameterized
+    pytest-cov
+    pyyaml
+    timeout-decorator
+    keras
+  ];
+
+  # TODO investigate the failures
+  disabledTestPaths = [
+    "tests/test_backend.py"
+    "tests/test_einsum_helper.py"
+    "tests/test_einsum_optimizers.py"
+  ];
+
+  disabledTests = [
+    "test_profile_conversion_time"
+  ];
+
+  meta = with lib; {
+    description = "Convert TensorFlow, Keras, Tensorflow.js and Tflite models to ONNX";
+    homepage = "https://github.com/onnx/tensorflow-onnx";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tflearn/default.nix b/nixpkgs/pkgs/development/python-modules/tflearn/default.nix
new file mode 100644
index 000000000000..91a92d6b8de4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tflearn/default.nix
@@ -0,0 +1,24 @@
+{ lib, fetchPypi, buildPythonPackage, pytest, scipy, h5py
+, pillow, tensorflow }:
+
+buildPythonPackage rec {
+  pname = "tflearn";
+  version = "0.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "818aa57667693810415dc203ba3f75f1541e931a8dc30b6e8b21563541a70388";
+  };
+
+  buildInputs = [ pytest ];
+
+  propagatedBuildInputs = [ scipy h5py pillow tensorflow ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Deep learning library featuring a higher-level API for TensorFlow";
+    homepage    = "https://github.com/tflearn/tflearn";
+    license     = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tftpy/default.nix b/nixpkgs/pkgs/development/python-modules/tftpy/default.nix
new file mode 100644
index 000000000000..92589c8cfc22
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tftpy/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "tftpy";
+  version = "0.8.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-4dGmgO/YjroXazURdYRCUwZzkqmw+LgViOP/K557u1s=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  pythonImportsCheck = [ "tftpy" ];
+
+  meta = {
+    description = "Pure Python TFTP library";
+    homepage = "https://github.com/msoulier/tftpy";
+    changelog = "https://github.com/msoulier/tftpy/releases/tag/${version}";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ otavio ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tgcrypto/default.nix b/nixpkgs/pkgs/development/python-modules/tgcrypto/default.nix
new file mode 100644
index 000000000000..6d5ebba2ee1e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tgcrypto/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tgcrypto";
+  version = "1.2.5";
+
+  disabled = pythonOlder "3.6";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pyrogram";
+    repo = "tgcrypto";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-u+mXzkmM79NBi4oHnb32RbN9WPnba/cm1q2Ko0uNEZg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "tgcrypto" ];
+
+  meta = with lib; {
+    description = "Fast and Portable Telegram Crypto Library for Python";
+    homepage = "https://github.com/pyrogram/tgcrypto";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/theano-pymc/default.nix b/nixpkgs/pkgs/development/python-modules/theano-pymc/default.nix
new file mode 100644
index 000000000000..441843a85272
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/theano-pymc/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, pandas
+, numpy
+, scipy
+, filelock
+, pytest
+, nose
+, parameterized
+}:
+
+buildPythonPackage rec {
+  pname = "theano-pymc";
+  version = "1.1.2";
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "Theano-PyMC";
+    inherit version;
+    sha256 = "5da6c2242ea72a991c8446d7fe7d35189ea346ef7d024c890397011114bf10fc";
+  };
+
+  # No need for coverage stats in Nix builds
+  postPatch = ''
+    substituteInPlace setup.py --replace ", 'pytest-cov'" ""
+  '';
+
+  propagatedBuildInputs = [
+    pandas
+    numpy
+    scipy
+    filelock
+  ];
+
+  # The test suite is computationally intensive and test failures are not
+  # indicative for package usability hence tests are disabled by default.
+  doCheck = false;
+  pythonImportsCheck = [ "theano" ];
+
+  meta = {
+    description = "PyMC theano fork";
+    homepage = "https://github.com/majidaldo/Theano-PyMC";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ nidabdella ];
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/theano/default.nix b/nixpkgs/pkgs/development/python-modules/theano/default.nix
new file mode 100644
index 000000000000..428bf4310d6b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/theano/default.nix
@@ -0,0 +1,106 @@
+{ lib, stdenv
+, runCommandCC
+, fetchPypi
+, buildPythonPackage
+, isPyPy
+, pythonOlder
+, isPy3k
+, nose
+, numpy
+, scipy
+, setuptools
+, six
+, libgpuarray
+, config
+, cudaSupport ? config.cudaSupport, cudaPackages ? { }
+, cudnnSupport ? cudaSupport
+}:
+
+let
+  inherit (cudaPackages) cudatoolkit cudnn;
+in
+
+assert cudnnSupport -> cudaSupport;
+
+let
+  wrapped = command: buildTop: buildInputs:
+    runCommandCC "${command}-wrapped" { inherit buildInputs; } ''
+      type -P '${command}' || { echo '${command}: not found'; exit 1; }
+      cat > "$out" <<EOF
+      #!$(type -P bash)
+      $(declare -xp | sed -e '/^[^=]\+="\('"''${NIX_STORE//\//\\/}"'\|[^\/]\)/!d')
+      declare -x NIX_BUILD_TOP="${buildTop}"
+      $(type -P '${command}') "\$@"
+      EOF
+      chmod +x "$out"
+    '';
+
+  # Theano spews warnings and disabled flags if the compiler isn't named g++
+  cxx_compiler_name =
+    if stdenv.cc.isGNU then "g++" else
+    if stdenv.cc.isClang then "clang++" else
+    throw "Unknown C++ compiler";
+  cxx_compiler = wrapped cxx_compiler_name "\\$HOME/.theano"
+    (    lib.optional cudaSupport libgpuarray_
+      ++ lib.optional cudnnSupport cudnn );
+
+  # We need to be careful with overriding Python packages within the package set
+  # as this can lead to collisions!
+  libgpuarray_ = libgpuarray.override { inherit cudaSupport cudaPackages; };
+
+in buildPythonPackage rec {
+  pname = "theano";
+  version = "1.0.5";
+
+  disabled = isPyPy || pythonOlder "2.6" || (isPy3k && pythonOlder "3.3");
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "129f43ww2a6badfdr6b88kzjzz2b0wk0dwkvwb55z6dsagfkk53f";
+  };
+
+  postPatch = ''
+    substituteInPlace theano/configdefaults.py \
+      --replace 'StrParam(param, is_valid=warn_cxx)' 'StrParam('\'''${cxx_compiler}'\''', is_valid=warn_cxx)' \
+      --replace 'rc == 0 and config.cxx != ""' 'config.cxx != ""'
+  '' + lib.optionalString cudaSupport ''
+    substituteInPlace theano/configdefaults.py \
+      --replace 'StrParam(get_cuda_root)' 'StrParam('\'''${cudatoolkit}'\''')'
+  '' + lib.optionalString cudnnSupport ''
+    substituteInPlace theano/configdefaults.py \
+      --replace 'StrParam(default_dnn_base_path)' 'StrParam('\'''${cudnn}'\''')'
+  '';
+
+  # needs to be postFixup so it runs before pythonImportsCheck even when
+  # doCheck = false (meaning preCheck would be disabled)
+  postFixup = ''
+    mkdir -p check-phase
+    export HOME=$(pwd)/check-phase
+  '';
+  doCheck = false;
+  # takes far too long, also throws "TypeError: sort() missing 1 required positional argument: 'a'"
+  # when run from the installer, and testing with Python 3.5 hits github.com/Theano/Theano/issues/4276,
+  # the fix for which hasn't been merged yet.
+
+  # keep Nose around since running the tests by hand is possible from Python or bash
+  nativeCheckInputs = [ nose ];
+  # setuptools needed for cuda support
+  propagatedBuildInputs = [
+    libgpuarray_
+    numpy
+    numpy.blas
+    scipy
+    setuptools
+    six
+  ];
+
+  pythonImportsCheck = [ "theano" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Theano/Theano";
+    description = "A Python library for large-scale array computation";
+    license = licenses.bsd3;
+    maintainers = [ ];
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/thefuzz/default.nix b/nixpkgs/pkgs/development/python-modules/thefuzz/default.nix
new file mode 100644
index 000000000000..8d240fe19e3e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/thefuzz/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytestCheckHook
+, hypothesis
+, levenshtein
+}:
+
+buildPythonPackage rec {
+  pname = "thefuzz";
+  version = "0.20.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ol5JeGscRgPH/G4taea8ZgmCopGWmLU2/4NU4GMcxA0=";
+  };
+
+  propagatedBuildInputs = [ levenshtein ];
+
+  # Skip linting
+  postPatch = ''
+    substituteInPlace test_thefuzz.py --replace "import pycodestyle" ""
+  '';
+
+  pythonImportsCheck = [
+    "thefuzz"
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Skip linting
+    "test_pep8_conformance"
+  ];
+
+  meta = with lib; {
+    description = "Fuzzy string matching for Python";
+    homepage = "https://github.com/seatgeek/thefuzz";
+    changelog = "https://github.com/seatgeek/thefuzz/blob/${version}/CHANGES.rst";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ sumnerevans ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/thelogrus/default.nix b/nixpkgs/pkgs/development/python-modules/thelogrus/default.nix
new file mode 100644
index 000000000000..1dc3f301dfea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/thelogrus/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, dateutils
+, fetchFromGitHub
+, poetry-core
+, pyaml
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "thelogrus";
+  version = "0.7.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "unixorn";
+    repo = "thelogrus";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-96/EjDh5XcTsfUcTnsltsT6LMYbyKuM/eNyeq2Pukfo=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    dateutils
+    pyaml
+  ];
+
+  # Module has no unit tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "thelogrus"
+  ];
+
+  meta = with lib; {
+    description = "Python 3 version of logrus";
+    homepage = "https://github.com/unixorn/thelogrus";
+    changelog = "https://github.com/unixorn/thelogrus/blob/${version}/ChangeLog.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/thermobeacon-ble/default.nix b/nixpkgs/pkgs/development/python-modules/thermobeacon-ble/default.nix
new file mode 100644
index 000000000000..16fed5c05598
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/thermobeacon-ble/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, bluetooth-data-tools
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "thermobeacon-ble";
+  version = "0.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bluetooth-devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-WjABxtZ5td25K9QCbLHisT+DMd2Cv/nljwYwxY2br3A=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-data-tools
+    bluetooth-sensor-state-data
+    sensor-state-data
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=thermobeacon_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "thermobeacon_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for Thermobeacon BLE devices";
+    homepage = "https://github.com/bluetooth-devices/thermobeacon-ble";
+    changelog = "https://github.com/Bluetooth-Devices/thermobeacon-ble/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/thermopro-ble/default.nix b/nixpkgs/pkgs/development/python-modules/thermopro-ble/default.nix
new file mode 100644
index 000000000000..1a07edc441d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/thermopro-ble/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, bluetooth-data-tools
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "thermopro-ble";
+  version = "0.4.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bluetooth-devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-z3RrPOV7NGl3aNor+baeVivn+DKwYHcrdlM5sNMGVD0=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-data-tools
+    bluetooth-sensor-state-data
+    sensor-state-data
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=thermopro_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "thermopro_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for Thermopro BLE devices";
+    homepage = "https://github.com/bluetooth-devices/thermopro-ble";
+    changelog = "https://github.com/Bluetooth-Devices/thermopro-ble/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/thespian/default.nix b/nixpkgs/pkgs/development/python-modules/thespian/default.nix
new file mode 100644
index 000000000000..b1f994fde763
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/thespian/default.nix
@@ -0,0 +1,25 @@
+{ fetchPypi, buildPythonPackage, lib }:
+
+buildPythonPackage rec {
+  version = "3.10.7";
+  pname = "thespian";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "zip";
+    hash = "sha256-HcHvZtMpBtNXq9Yp2ayeHTuIf7gpBUb6xZqjaECbfgo=";
+  };
+
+  # Do not run the test suite: it takes a long time and uses
+  # significant system resources, including requiring localhost
+  # network operations.  Thespian tests are performed via its Travis
+  # CI configuration and do not need to be duplicated here.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python Actor concurrency library";
+    homepage = "http://thespianpy.com/";
+    license = licenses.mit;
+    maintainers = [ maintainers.kquick ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/thinc/default.nix b/nixpkgs/pkgs/development/python-modules/thinc/default.nix
new file mode 100644
index 000000000000..ccf17cdb117f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/thinc/default.nix
@@ -0,0 +1,104 @@
+{ lib
+, stdenv
+, Accelerate
+, blis
+, buildPythonPackage
+, catalogue
+, confection
+, CoreFoundation
+, CoreGraphics
+, CoreVideo
+, cymem
+, cython
+, fetchPypi
+, hypothesis
+, mock
+, murmurhash
+, numpy
+, plac
+, preshed
+, pydantic
+, pytestCheckHook
+, python
+, pythonOlder
+, setuptools
+, srsly
+, tqdm
+, typing-extensions
+, wasabi
+}:
+
+buildPythonPackage rec {
+  pname = "thinc";
+  version = "8.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zX/bPYg6FeaQYlTn+wFi9ph46czdH4UZ22/7/ka/b0k=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "preshed>=3.0.2,<3.1.0" "preshed"
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  buildInputs = [
+    cython
+  ] ++ lib.optionals stdenv.isDarwin [
+    Accelerate
+    CoreFoundation
+    CoreGraphics
+    CoreVideo
+  ];
+
+  propagatedBuildInputs = [
+    blis
+    catalogue
+    confection
+    cymem
+    murmurhash
+    numpy
+    plac
+    preshed
+    pydantic
+    srsly
+    tqdm
+    wasabi
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    mock
+    pytestCheckHook
+  ];
+
+  # Add native extensions.
+  preCheck = ''
+    export PYTHONPATH=$out/${python.sitePackages}:$PYTHONPATH
+
+    # avoid local paths, relative imports wont resolve correctly
+    mv thinc/tests tests
+    rm -r thinc
+  '';
+
+  pythonImportsCheck = [
+    "thinc"
+  ];
+
+  meta = with lib; {
+    description = "Library for NLP machine learning";
+    homepage = "https://github.com/explosion/thinc";
+    changelog = "https://github.com/explosion/thinc/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ aborsu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/thorlabspm100/default.nix b/nixpkgs/pkgs/development/python-modules/thorlabspm100/default.nix
new file mode 100644
index 000000000000..333105d0ad6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/thorlabspm100/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, unittestCheckHook
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "thorlabspm100";
+  version = "1.2.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "clade";
+    repo = "ThorlabsPM100";
+    rev = "v${version}";
+    hash = "sha256-X4qEow6u4aE0sbFwZfK3YEso2RS0c9j4iaWJPHaPQV4=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ThorlabsPM100"
+  ];
+
+  meta = with lib; {
+    description = "Interface to the PM100A/D power meter from Thorlabs";
+    homepage = "https://github.com/clade/ThorlabsPM100/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fsagbuya ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/threadloop/default.nix b/nixpkgs/pkgs/development/python-modules/threadloop/default.nix
new file mode 100644
index 000000000000..2fb8dd4420ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/threadloop/default.nix
@@ -0,0 +1,30 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "threadloop";
+  version = "1.0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8b180aac31013de13c2ad5c834819771992d350267bddb854613ae77ef571944";
+  };
+
+  propagatedBuildInputs = [
+    tornado
+  ];
+
+  doCheck = false; # ImportError: cannot import name 'ThreadLoop' from 'threadloop'
+
+  pythonImportsCheck = [ "threadloop" ];
+
+  meta = with lib; {
+    description = "A library to run tornado coroutines from synchronous Python";
+    homepage = "https://github.com/GoodPete/threadloop";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/threadpool/default.nix b/nixpkgs/pkgs/development/python-modules/threadpool/default.nix
new file mode 100644
index 000000000000..9c83e7e45c28
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/threadpool/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "threadpool";
+  version = "1.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "197gzrxn9lbk0q1v079814c6s05cr4rwzyl6c1m6inkyif4yzr6c";
+  };
+
+  meta = with lib; {
+    homepage = "https://chrisarndt.de/projects/threadpool/";
+    description = "Easy to use object-oriented thread pool framework";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/threadpoolctl/default.nix b/nixpkgs/pkgs/development/python-modules/threadpoolctl/default.nix
new file mode 100644
index 000000000000..54d7fa128293
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/threadpoolctl/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, flit-core
+, pytestCheckHook
+, numpy
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "threadpoolctl";
+  version = "3.1.0";
+
+  disabled = pythonOlder "3.6";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "joblib";
+    repo = pname;
+    rev = version;
+    hash = "sha256-/qt7cgFbvpc1BLZC7a4S0RToqSggKXAqF1Xr6xOqzw8=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    numpy
+    scipy
+  ];
+
+  disabledTests = [
+    # accepts a limited set of cpu models based on project
+    # developers' hardware
+    "test_architecture"
+    # https://github.com/joblib/threadpoolctl/issues/128
+    "test_command_line_command_flag"
+    "test_command_line_import_flag"
+    "test_controller_info_actualized"
+    "test_set_threadpool_limits_by_api"
+    "test_set_threadpool_limits_no_limit"
+    "test_threadpool_limits_by_prefix"
+    "test_threadpool_limits_function_with_side_effect"
+    "test_threadpool_limits_manual_restore"
+  ];
+
+  pythonImportsCheck = [
+    "threadpoolctl"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/joblib/threadpoolctl";
+    description = "Helpers to limit number of threads used in native libraries";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/threat9-test-bed/default.nix b/nixpkgs/pkgs/development/python-modules/threat9-test-bed/default.nix
new file mode 100644
index 000000000000..4eab16c304e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/threat9-test-bed/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, click
+, faker
+, fetchFromGitHub
+, flask
+, gunicorn
+, pyopenssl
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "threat9-test-bed";
+  version = "0.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "threat9";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-0YSjMf2gDdrvkDaT77iwfCkiDDXKHnZyI8d7JmBSuCg=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    click
+    faker
+    flask
+    gunicorn
+    pyopenssl
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "threat9_test_bed"
+  ];
+
+  disabledTests = [
+    # Assertion issue with the response codes
+    "test_http_service_mock"
+    "tests_http_service_mock"
+    "test_http_service_mock_random_port"
+  ];
+
+  meta = with lib; {
+    description = "Module for adding unittests.mock as view functions";
+    homepage = "https://github.com/threat9/threat9-test-bed";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/three-merge/default.nix b/nixpkgs/pkgs/development/python-modules/three-merge/default.nix
new file mode 100644
index 000000000000..2bb1891cd0bb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/three-merge/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, diff-match-patch }:
+
+buildPythonPackage rec {
+  pname = "three-merge";
+  version = "0.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0w6rv7rv1zm901wbjkmm6d3vkwyf3csja9p37bb60mar8khszxk0";
+  };
+
+  propagatedBuildInputs = [ diff-match-patch ];
+
+  dontUseSetuptoolsCheck = true;
+
+  pythonImportsCheck = [ "three_merge" ];
+
+  meta = with lib; {
+    description = "Simple library for merging two strings with respect to a base one";
+    homepage = "https://github.com/spyder-ide/three-merge";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/thrift/default.nix b/nixpkgs/pkgs/development/python-modules/thrift/default.nix
new file mode 100644
index 000000000000..4ff39c59c468
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/thrift/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "thrift";
+  version = "0.16.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-K1tkiPze0h+dMSqiPJ/2oBldD2ribdvVrZ4+Jd/BRAg=";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  # No tests. Breaks when not disabling.
+  doCheck = false;
+
+  pythonImportsCheck = [ "thrift" ];
+
+  meta = with lib; {
+    description = "Python bindings for the Apache Thrift RPC system";
+    homepage = "https://thrift.apache.org/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hbunke ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/thriftpy2/default.nix b/nixpkgs/pkgs/development/python-modules/thriftpy2/default.nix
new file mode 100644
index 000000000000..6d8c9c9f83d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/thriftpy2/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchFromGitHub
+, ply
+, pythonOlder
+, six
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "thriftpy2";
+  version = "0.4.16";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Thriftpy";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-o+h38NREnh14M23gyF2X2UdW7/spmHFo0rqvkKnmSRQ=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    ply
+    six
+    tornado
+  ];
+
+  # Not all needed files seems to be present
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "thriftpy2"
+  ];
+
+  meta = with lib; {
+    description = "Python module for Apache Thrift";
+    homepage = "https://github.com/Thriftpy/thriftpy2";
+    changelog = "https://github.com/Thriftpy/thriftpy2/blob/v${version}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/throttler/default.nix b/nixpkgs/pkgs/development/python-modules/throttler/default.nix
new file mode 100644
index 000000000000..2742cdaa2935
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/throttler/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, aiohttp
+, codecov
+, flake8
+, pytest
+, pytest-asyncio
+, pytest-cov
+}:
+
+buildPythonPackage rec {
+  pname = "throttler";
+  version = "1.2.2";
+
+  src = fetchFromGitHub {
+    owner = "uburuntu";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-fE35zPjBUn4e1VRkkIUMtYJ/+LbnUxnxyfnU+UEPwr4=";
+  };
+
+  checkInputs = [
+    aiohttp
+    codecov
+    flake8
+    pytest
+    pytest-asyncio
+    pytest-cov
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [ "tests/" ];
+
+  meta = with lib; {
+    description = "Zero-dependency Python package for easy throttling with asyncio support.";
+    homepage = "https://github.com/uburuntu/throttler";
+    license = licenses.mit;
+    maintainers = with maintainers; [ renatoGarcia ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/thumborpexif/default.nix b/nixpkgs/pkgs/development/python-modules/thumborpexif/default.nix
new file mode 100644
index 000000000000..28b2e5a9f93c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/thumborpexif/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "thumbor-pexif";
+  version = "0.14.1";
+  disabled = ! isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "96dcc03ea6066d9546baf54f6841f4048b0b24a291eed65d098b3348c8872d99";
+  };
+
+  meta = with lib; {
+    description = "Module to parse and edit the EXIF data tags in a JPEG image";
+    homepage = "http://www.benno.id.au/code/pexif/";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tidalapi/default.nix b/nixpkgs/pkgs/development/python-modules/tidalapi/default.nix
new file mode 100644
index 000000000000..020417ece1df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tidalapi/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, python-dateutil
+, poetry-core
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "tidalapi";
+  version = "0.7.3";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sIPuo1kd08Quflf7oFxoo1H56cdUDlbNTfFkn8j3jVE=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    python-dateutil
+  ];
+
+  doCheck = false; # tests require internet access
+
+  pythonImportsCheck = [
+    "tidalapi"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/tamland/python-tidal/releases/tag/v${version}";
+    description = "Unofficial Python API for TIDAL music streaming service";
+    homepage = "https://github.com/tamland/python-tidal";
+    license = licenses.gpl3;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tidyexc/default.nix b/nixpkgs/pkgs/development/python-modules/tidyexc/default.nix
new file mode 100644
index 000000000000..5e14812fe7bc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tidyexc/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, flit
+}:
+
+buildPythonPackage rec {
+  pname = "tidyexc";
+  version = "0.10.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1gl1jmihafawg7hvnn4xb20vd2x5qpvca0m1wr2gk0m2jj42yiq6";
+  };
+
+  nativeBuildInputs = [
+    flit
+  ];
+
+  pythonImportsCheck = [
+    "tidyexc"
+  ];
+
+  meta = with lib; {
+    description = "Raise rich, helpful exceptions";
+    homepage = "https://github.com/kalekundert/tidyexc";
+    changelog = "https://github.com/kalekundert/tidyexc/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jpetrucciani ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tifffile/default.nix b/nixpkgs/pkgs/development/python-modules/tifffile/default.nix
new file mode 100644
index 000000000000..1b9582a71c8b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tifffile/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, dask
+, fetchPypi
+, fsspec
+, lxml
+, numpy
+, pytestCheckHook
+, pythonOlder
+, zarr
+}:
+
+buildPythonPackage rec {
+  pname = "tifffile";
+  version = "2023.8.30";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-aoxTsBKihrddCaFJirMvIC8kzGJwoQW11ZEdxEJvFio=";
+  };
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    dask
+    fsspec
+    lxml
+    pytestCheckHook
+    zarr
+  ];
+
+  disabledTests = [
+    # Test require network access
+    "test_class_omexml"
+    "test_write_ome"
+    # Test file is missing
+    "test_write_predictor"
+    "test_issue_imagej_hyperstack_arg"
+    "test_issue_description_overwrite"
+    # AssertionError
+    "test_write_bigtiff"
+    "test_write_imagej_raw"
+    # https://github.com/cgohlke/tifffile/issues/142
+    "test_func_bitorder_decode"
+    # Test file is missing
+    "test_issue_invalid_predictor"
+  ];
+
+  pythonImportsCheck = [
+    "tifffile"
+  ];
+
+  # flaky, often killed due to OOM or timeout
+  env.SKIP_LARGE = "1";
+
+  meta = with lib; {
+    description = "Read and write image data from and to TIFF files";
+    homepage = "https://github.com/cgohlke/tifffile/";
+    changelog = "https://github.com/cgohlke/tifffile/blob/v${version}/CHANGES.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ lebastr ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tika-client/default.nix b/nixpkgs/pkgs/development/python-modules/tika-client/default.nix
new file mode 100644
index 000000000000..e148fce24163
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tika-client/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, hatchling
+, httpx
+}:
+buildPythonPackage rec {
+  pname = "tika-client";
+  version = "0.5.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "stumpylog";
+    repo = "tika-client";
+    rev = "refs/tags/${version}";
+    hash = "sha256-fFibRF3SoDOje6M9YmZI0dwYVn/cvgXqmClvqvNy5f8=";
+  };
+
+  propagatedBuildInputs = [
+    hatchling
+    httpx
+  ];
+  pythonImportsCheck = [
+    "tika_client"
+  ];
+  # Almost all of the tests (all except one in 0.1.0) fail since there
+  # is no tika http API endpoint reachable. Since tika is not yet
+  # packaged for nixpkgs, it seems like an unreasonable amount of effort
+  # fixing these tests.
+  doChecks = false;
+
+  meta = with lib; {
+    description = "A modern Python REST client for Apache Tika server";
+    homepage = "https://github.com/stumpylog/tika-client";
+    changelog = "https://github.com/stumpylog/tika-client/blob/${version}/CHANGELOG.md";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ e1mo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tika/default.nix b/nixpkgs/pkgs/development/python-modules/tika/default.nix
new file mode 100644
index 000000000000..551813db15ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tika/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyyaml
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "tika";
+  version = "2.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VmcOuBKUTrJe1z8bOwdapB56E1t0skCCLyi4GeWzc9o=";
+  };
+
+  propagatedBuildInputs = [ pyyaml requests ];
+
+  # Requires network
+  doCheck = false;
+  pythonImportsCheck = [ pname ];
+
+  meta = with lib; {
+    description = "A Python binding to the Apache Tika™ REST services";
+    homepage = "https://github.com/chrismattmann/tika-python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ Flakebi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tiktoken/Cargo.lock b/nixpkgs/pkgs/development/python-modules/tiktoken/Cargo.lock
new file mode 100644
index 000000000000..e65fd819d3d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tiktoken/Cargo.lock
@@ -0,0 +1,394 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "aho-corasick"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "bit-set"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1"
+dependencies = [
+ "bit-vec",
+]
+
+[[package]]
+name = "bit-vec"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bstr"
+version = "1.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c2f7349907b712260e64b0afe2f84692af14a454be26187d9df565c7f69266a"
+dependencies = [
+ "memchr",
+ "regex-automata",
+ "serde",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "fancy-regex"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2"
+dependencies = [
+ "bit-set",
+ "regex",
+]
+
+[[package]]
+name = "indoc"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306"
+
+[[package]]
+name = "libc"
+version = "0.2.148"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b"
+
+[[package]]
+name = "lock_api"
+version = "0.4.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "memchr"
+version = "2.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c"
+
+[[package]]
+name = "memoffset"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+
+[[package]]
+name = "parking_lot"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-targets",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.67"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "pyo3"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e681a6cfdc4adcc93b4d3cf993749a4552018ee0a9b65fc0ccfad74352c72a38"
+dependencies = [
+ "cfg-if",
+ "indoc",
+ "libc",
+ "memoffset",
+ "parking_lot",
+ "pyo3-build-config",
+ "pyo3-ffi",
+ "pyo3-macros",
+ "unindent",
+]
+
+[[package]]
+name = "pyo3-build-config"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "076c73d0bc438f7a4ef6fdd0c3bb4732149136abd952b110ac93e4edb13a6ba5"
+dependencies = [
+ "once_cell",
+ "target-lexicon",
+]
+
+[[package]]
+name = "pyo3-ffi"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e53cee42e77ebe256066ba8aa77eff722b3bb91f3419177cf4cd0f304d3284d9"
+dependencies = [
+ "libc",
+ "pyo3-build-config",
+]
+
+[[package]]
+name = "pyo3-macros"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dfeb4c99597e136528c6dd7d5e3de5434d1ceaf487436a3f03b2d56b6fc9efd1"
+dependencies = [
+ "proc-macro2",
+ "pyo3-macros-backend",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "pyo3-macros-backend"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "947dc12175c254889edc0c02e399476c2f652b4b9ebd123aa655c224de259536"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "regex"
+version = "1.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"
+
+[[package]]
+name = "rustc-hash"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
+
+[[package]]
+name = "scopeguard"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
+[[package]]
+name = "serde"
+version = "1.0.188"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.188"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.36",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9"
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.36"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91e02e55d62894af2a08aca894c6577281f76769ba47c94d5756bec8ac6e7373"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "target-lexicon"
+version = "0.12.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a"
+
+[[package]]
+name = "tiktoken"
+version = "0.5.1"
+dependencies = [
+ "bstr",
+ "fancy-regex",
+ "pyo3",
+ "regex",
+ "rustc-hash",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
+
+[[package]]
+name = "unindent"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1766d682d402817b5ac4490b3c3002d91dfa0d22812f341609f97b08757359c"
+
+[[package]]
+name = "windows-targets"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
diff --git a/nixpkgs/pkgs/development/python-modules/tiktoken/default.nix b/nixpkgs/pkgs/development/python-modules/tiktoken/default.nix
new file mode 100644
index 000000000000..3cf68063f119
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tiktoken/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, rustPlatform
+, cargo
+, rustc
+, setuptools
+, setuptools-rust
+, wheel
+, libiconv
+, requests
+, regex
+, blobfile
+}:
+let
+  pname = "tiktoken";
+  version = "0.5.1";
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-J+dzVkIyAE9PgQ/R+FI2Zz7DpW7X8SBvye2GcOvtuXo=";
+  };
+  postPatch = ''
+    cp ${./Cargo.lock} Cargo.lock
+  '';
+in
+buildPythonPackage {
+  inherit pname version src postPatch;
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  nativeBuildInput = [
+    setuptools
+    setuptools-rust
+    wheel
+  ];
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src postPatch;
+    name = "${pname}-${version}";
+    hash = "sha256-Q7XO+auj4tKDAGbqNn9pmJg8EJvooN2ie0lWwZVrld4=";
+  };
+
+  nativeBuildInputs = [
+    rustPlatform.cargoSetupHook
+    setuptools-rust
+    cargo
+    rustc
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [ libiconv ];
+
+  propagatedBuildInputs = [
+    requests
+    regex
+    blobfile
+  ];
+
+  # almost all tests require network access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "tiktoken"
+  ];
+
+  meta = with lib; {
+    description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models.";
+    homepage = "https://github.com/openai/tiktoken";
+    license = licenses.mit;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tikzplotlib/default.nix b/nixpkgs/pkgs/development/python-modules/tikzplotlib/default.nix
new file mode 100644
index 000000000000..564d8e58b8ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tikzplotlib/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, matplotlib
+, numpy
+, pillow
+, webcolors
+, flit-core
+, pytestCheckHook
+, pandas
+}:
+
+buildPythonPackage rec {
+  pname = "tikzplotlib";
+  version = "0.10.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "nschloe";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-PLExHhEnxkEiXsE0rqvpNWwVZ+YoaDa2BTx8LktdHl0=";
+  };
+
+  propagatedBuildInputs = [
+    matplotlib
+    numpy
+    pillow
+    webcolors
+    flit-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pandas
+  ];
+
+  meta = with lib; {
+    description = "Save matplotlib figures as TikZ/PGFplots for smooth integration into LaTeX";
+    homepage = "https://github.com/nschloe/tikzplotlib";
+    license = licenses.mit;
+    maintainers = with maintainers; [ doronbehar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tiledb/default.nix b/nixpkgs/pkgs/development/python-modules/tiledb/default.nix
new file mode 100644
index 000000000000..516a22f44cce
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tiledb/default.nix
@@ -0,0 +1,87 @@
+{ lib
+, python
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, pybind11
+, tiledb
+, numpy
+, wheel
+, isPy3k
+, setuptools-scm
+, psutil
+, pandas
+}:
+
+buildPythonPackage rec {
+  pname = "tiledb";
+  version = "0.23.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "TileDB-Inc";
+    repo = "TileDB-Py";
+    rev = "refs/tags/${version}";
+    hash = "sha256-QxqUYu8y+k5SLRFtxpcs57gnAHgXIre0smURlqUzC1s=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    pybind11
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    tiledb
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    wheel # No idea why but it is listed
+  ];
+
+  nativeCheckInputs = [
+    psutil
+    # optional
+    pandas
+  ];
+
+  TILEDB_PATH = tiledb;
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  disabled = !isPy3k; # Not bothering with python2 anymore
+
+  postPatch = ''
+    # Hardcode path to shared object
+    substituteInPlace tiledb/__init__.py --replace \
+      'os.path.join(lib_dir, lib_name)' 'os.path.join("${tiledb}/lib", lib_name)'
+
+    # Disable failing test
+    substituteInPlace tiledb/tests/test_examples.py --replace \
+      "test_docs" "dont_test_docs"
+    # these tests don't always fail
+    substituteInPlace tiledb/tests/test_libtiledb.py --replace \
+      "test_varlen_write_int_subarray" "dont_test_varlen_write_int_subarray" \
+      --replace "test_memory_cleanup" "dont_test_memory_cleanup" \
+      --replace "test_ctx_thread_cleanup" "dont_test_ctx_thread_cleanup"
+    substituteInPlace tiledb/tests/test_metadata.py --replace \
+      "test_metadata_consecutive" "dont_test_metadata_consecutive"
+  '';
+
+  checkPhase = ''
+    pushd "$TMPDIR"
+    ${python.interpreter} -m unittest tiledb.tests.all.suite_test
+    popd
+  '';
+  pythonImportsCheck = [ "tiledb" ];
+
+  meta = with lib; {
+    description = "Python interface to the TileDB storage manager";
+    homepage = "https://github.com/TileDB-Inc/TileDB-Py";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fridh ];
+    # tiledb/core.cc:556:30: error: ‘struct std::array<long unsigned int, 2>’ has no member named ‘second’
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tilequant/default.nix b/nixpkgs/pkgs/development/python-modules/tilequant/default.nix
new file mode 100644
index 000000000000..fe4a748fa238
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tilequant/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, click
+, ordered-set
+, pythonOlder
+, pillow
+, sortedcollections
+, setuptools_dso
+}:
+
+buildPythonPackage rec {
+  pname = "tilequant";
+  version = "1.1.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uW1g3nlT6Y+1beifo/MOlGxsGL7on/jcAROxSddySHk=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    ordered-set
+    pillow
+    sortedcollections
+    setuptools_dso
+  ];
+
+  doCheck = false; # there are no tests
+
+  pythonImportsCheck = [
+    "tilequant"
+  ];
+
+  meta = with lib; {
+    description = "Tool for quantizing image colors using tile-based palette restrictions";
+    homepage = "https://github.com/SkyTemple/tilequant";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ marius851000 xfix ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tiler/default.nix b/nixpkgs/pkgs/development/python-modules/tiler/default.nix
new file mode 100644
index 000000000000..9de7bc0ec92f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tiler/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, setuptools
+, setuptools-scm
+, wheel
+, numpy
+, tqdm
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tiler";
+  version = "0.5.7";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2HWO/iJ9RCWNVmw2slu9F/+Mchk3evB5/F8EfbuMI/Y=";
+  };
+
+  patches = [
+    # https://github.com/the-lay/tiler/pull/24
+    (fetchpatch {
+      name = "unpin-setuptools-scm-dependency.patch";
+      url = "https://github.com/the-lay/tiler/commit/7a9f7e32c5f9c263c1ae28bfd19c7539556684cb.patch";
+      hash = "sha256-TMr3LJtiKUxJv2pAzAd8CWs3AtWsF0YS79NzKBN5TKM=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    tqdm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "tiler" ];
+
+  meta = with lib; {
+    description = "N-dimensional NumPy array tiling and merging with overlapping, padding and tapering";
+    homepage = "https://the-lay.github.io/tiler/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ atila ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tilestache/default.nix b/nixpkgs/pkgs/development/python-modules/tilestache/default.nix
new file mode 100644
index 000000000000..ce46fd56f243
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tilestache/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, modestmaps
+, pillow
+, pycairo
+, python-mapnik
+, simplejson
+, werkzeug
+, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "tilestache";
+  version = "1.51.14";
+  disabled = !isPy27;
+
+  src = fetchPypi {
+    pname = "TileStache";
+    inherit version;
+    sha256 = "1qjrabl6qr7i6yj6v647ck92abcyklb0vmb6h6kj7x8v2cj5xbvk";
+  };
+
+  propagatedBuildInputs = [ modestmaps pillow pycairo python-mapnik simplejson werkzeug ];
+
+  meta = with lib; {
+    description = "A tile server for rendered geographic data";
+    homepage = "http://tilestache.org";
+    license = licenses.bsd3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tilt-ble/default.nix b/nixpkgs/pkgs/development/python-modules/tilt-ble/default.nix
new file mode 100644
index 000000000000..1be167f9a88a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tilt-ble/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, fetchFromGitHub
+, home-assistant-bluetooth
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "tilt-ble";
+  version = "0.2.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ok9XWx47hcke535480NORfS1pSagaOJvMR48lYTa/Tg=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bluetooth-sensor-state-data
+    home-assistant-bluetooth
+    sensor-state-data
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=tilt_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "tilt_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for Tilt BLE devices";
+    homepage = "https://github.com/Bluetooth-Devices/tilt-ble";
+    changelog = "https://github.com/Bluetooth-Devices/tilt-ble/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/time-machine/default.nix b/nixpkgs/pkgs/development/python-modules/time-machine/default.nix
new file mode 100644
index 000000000000..799570ada1b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/time-machine/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonAtLeast
+, pythonOlder
+, backports-zoneinfo
+, python-dateutil
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "time-machine";
+  version = "2.12.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "adamchainz";
+    repo = pname;
+    rev = version;
+    hash = "sha256-vBww78/3vC3IA4Nh9Ne+rBo/CO9FggjP+TUUV2/ih9c=";
+  };
+
+  propagatedBuildInputs = [
+    python-dateutil
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    backports-zoneinfo
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals (pythonAtLeast "3.9") [
+    # Assertion Errors related to Africa/Addis_Ababa
+    "test_destination_datetime_tzinfo_zoneinfo_nested"
+    "test_destination_datetime_tzinfo_zoneinfo_no_orig_tz"
+    "test_destination_datetime_tzinfo_zoneinfo"
+    "test_move_to_datetime_with_tzinfo_zoneinfo"
+  ];
+
+  pythonImportsCheck = [
+    "time_machine"
+  ];
+
+  meta = with lib; {
+    description = "Travel through time in your tests";
+    homepage = "https://github.com/adamchainz/time-machine";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/timeago/default.nix b/nixpkgs/pkgs/development/python-modules/timeago/default.nix
new file mode 100644
index 000000000000..6a84d909f363
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/timeago/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "timeago";
+  version = "1.0.16";
+
+  src = fetchFromGitHub {
+    owner = "hustcc";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-PqORJKAVrjezU/yP2ky3gb1XsM8obDI3GQzi+mok/OM=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [ "test/testcase.py" ];
+
+  pythonImportsCheck = [ "timeago" ];
+
+  meta = with lib; {
+    description = "Python module to format past datetime output";
+    homepage = "https://github.com/hustcc/timeago";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/timecop/default.nix b/nixpkgs/pkgs/development/python-modules/timecop/default.nix
new file mode 100644
index 000000000000..272657dfaafd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/timecop/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "timecop";
+  version = "0.5.0dev";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0zbi58sw2yp1qchzfhyi7bsrwxajiypphg65fir98kvj03g011wd";
+  };
+
+  # test_epoch fails, see https://github.com/bluekelp/pytimecop/issues/4
+  preCheck = ''
+    sed -i 's/test_epoch/_test_epoch/' timecop/tests/test_freeze.py
+  '';
+
+  meta = with lib; {
+    description = "A port of the most excellent TimeCop Ruby Gem for Python";
+    homepage = "https://github.com/bluekelp/pytimecop";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ zakame ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/timelib/default.nix b/nixpkgs/pkgs/development/python-modules/timelib/default.nix
new file mode 100644
index 000000000000..e0f76c0c2e65
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/timelib/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "timelib";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-0bInBlVxhuYFjaiLoPhYN0AbKuneFX9ZNT3JeNglGHo=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  meta = with lib; {
+    description = "Parse english textual date descriptions";
+    homepage = "https://github.com/pediapress/timelib/";
+    license = licenses.zlib;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/timeout-decorator/default.nix b/nixpkgs/pkgs/development/python-modules/timeout-decorator/default.nix
new file mode 100644
index 000000000000..c2d21fea153f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/timeout-decorator/default.nix
@@ -0,0 +1,16 @@
+{ lib, buildPythonPackage, fetchPypi }:
+buildPythonPackage rec {
+  pname = "timeout-decorator";
+  version = "0.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6a2f2f58db1c5b24a2cc79de6345760377ad8bdc13813f5265f6c3e63d16b3d7";
+  };
+
+  meta = with lib; {
+    description = "Timeout decorator";
+    license = licenses.mit;
+    homepage = "https://github.com/pnpnpn/timeout-decorator";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/timeslot/default.nix b/nixpkgs/pkgs/development/python-modules/timeslot/default.nix
new file mode 100644
index 000000000000..1a71651ca054
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/timeslot/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, poetry-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "timeslot";
+  version = "0.1.2";
+
+  # pypi distribution doesn't include tests, so build from source instead
+  src = fetchFromGitHub {
+    owner = "ErikBjare";
+    repo = pname;
+    rev = "af35445e96cbb2f3fb671a75aac6aa93e4e7e7a6";
+    sha256 = "sha256-GEhg2iMsYMfalT7L9TCd1KHU6oa/wTl5m3mRC0zOH9Q=";
+  };
+
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    # The pyproject.toml specifies the flag `--cov=timeslot`,
+    # This causes an error when running without pytest-cov,
+    # so use this flag to override that option, as we don't need coverage.
+    "--override-ini addopts=''"
+  ];
+
+  pythonImportsCheck = [ "timeslot" ];
+
+  meta = with lib; {
+    description = "Data type for representing time slots with a start and end";
+    homepage = "https://github.com/ErikBjare/timeslot";
+    maintainers = with maintainers; [ huantian ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/timetagger/default.nix b/nixpkgs/pkgs/development/python-modules/timetagger/default.nix
new file mode 100644
index 000000000000..04c14fe5f068
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/timetagger/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, stdenv
+, asgineer
+, bcrypt
+, buildPythonPackage
+, fetchFromGitHub
+, iptools
+, itemdb
+, jinja2
+, markdown
+, nodejs
+, pscript
+, pyjwt
+, pytestCheckHook
+, pythonOlder
+, requests
+, uvicorn
+}:
+
+buildPythonPackage rec {
+  pname = "timetagger";
+  version = "23.11.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "almarklein";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-PPB/BTZLuHmbKmUIe5gZMAwV+TUDqXBYg6fKsokTotg=";
+  };
+
+  propagatedBuildInputs = [
+    asgineer
+    bcrypt
+    iptools
+    itemdb
+    jinja2
+    markdown
+    pscript
+    pyjwt
+    uvicorn
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  nativeCheckInputs = [
+    nodejs
+    pytestCheckHook
+    requests
+  ];
+
+  meta = with lib; {
+    description = "Library to interact with TimeTagger";
+    homepage = "https://github.com/almarklein/timetagger";
+    changelog = "https://github.com/almarklein/timetagger/releases/tag/v${version}";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ matthiasbeyer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/timezonefinder/default.nix b/nixpkgs/pkgs/development/python-modules/timezonefinder/default.nix
new file mode 100644
index 000000000000..a0a72de7bb17
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/timezonefinder/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cffi
+, h3
+, numba
+, numpy
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "timezonefinder";
+  version = "6.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "jannikmi";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-n6TcTezu5seKy34KDlzGikAVaqAud00gxywwJA3MaWM=";
+  };
+
+  nativeBuildInputs = [
+    cffi
+    poetry-core
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+    h3
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    numba
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'numpy = "^1.22"' 'numpy = "*"'
+  '';
+
+  pythonImportsCheck = [
+    "timezonefinder"
+  ];
+
+  preCheck = ''
+    # Some tests need the CLI on the PATH
+    export PATH=$out/bin:$PATH
+  '';
+
+  meta = with lib; {
+    changelog = "https://github.com/jannikmi/timezonefinder/blob/${version}/CHANGELOG.rst";
+    description = "Module for finding the timezone of any point on earth (coordinates) offline";
+    homepage = "https://github.com/MrMinimal64/timezonefinder";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/timm/default.nix b/nixpkgs/pkgs/development/python-modules/timm/default.nix
new file mode 100644
index 000000000000..90dfe5598785
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/timm/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, expecttest
+, pytest-timeout
+, huggingface-hub
+, pyyaml
+, safetensors
+, torch
+, torchvision
+}:
+
+buildPythonPackage rec {
+  pname = "timm";
+  version = "0.9.12";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "huggingface";
+    repo = "pytorch-image-models";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-dDd/Sjy4xmJlaAg+fOxxcuX3FX//uJJkW0q3AaeCfns=";
+  };
+
+  propagatedBuildInputs = [
+    huggingface-hub
+    pyyaml
+    safetensors
+    torch
+    torchvision
+  ];
+
+  nativeCheckInputs = [
+    expecttest
+    pytestCheckHook
+    pytest-timeout
+  ];
+
+  pytestFlagsArray = [
+    "tests"
+  ];
+
+  disabledTestPaths = [
+    # Takes too long and also tries to download models
+    "tests/test_models.py"
+  ];
+
+  disabledTests = [
+    # AttributeError: 'Lookahead' object has no attribute '_optimizer_step_pre...
+    "test_lookahead"
+  ];
+
+  pythonImportsCheck = [
+    "timm"
+    "timm.data"
+  ];
+
+  meta = with lib; {
+    description = "PyTorch image models, scripts, and pretrained weights";
+    homepage = "https://huggingface.co/docs/timm/index";
+    changelog = "https://github.com/huggingface/pytorch-image-models/blob/v${version}/README.md#whats-new";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tiny-proxy/default.nix b/nixpkgs/pkgs/development/python-modules/tiny-proxy/default.nix
new file mode 100644
index 000000000000..9a319d90a164
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tiny-proxy/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, anyio
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "tiny-proxy";
+  version = "0.2.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "romis2012";
+    repo = "tiny-proxy";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-59T09qcOstl/yfzQmNlTNxGerQethZntwDAHwz/5FFM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    anyio
+  ];
+
+  # The tests depend on httpx-socks, whose tests depend on tiny-proxy.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "tiny_proxy"
+  ];
+
+  meta = with lib; {
+    description = "SOCKS5/SOCKS4/HTTP proxy server";
+    homepage = "https://github.com/romis2012/tiny-proxy";
+    changelog = "https://github.com/romis2012/tiny-proxy/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ tjni ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tinycss/default.nix b/nixpkgs/pkgs/development/python-modules/tinycss/default.nix
new file mode 100644
index 000000000000..aa537c6a6135
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tinycss/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, cssutils
+, cython
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "tinycss";
+  version = "0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-EjBvtQ5enn6u74S4Au2HdIi6gONcZyhn9UjAkkp2cW4=";
+  };
+
+  postPatch = ''
+    sed -i "/--cov/d" setup.cfg
+  '';
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    cssutils
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preBuild = ''
+    # Force Cython to re-generate this file. If it is present, Cython will
+    # think it is "up to date" even though it was generated with an older,
+    # incompatible version of Cython. See
+    # https://github.com/Kozea/tinycss/issues/17.
+    rm tinycss/speedups.c
+  '';
+
+  # Disable Cython tests
+  TINYCSS_SKIP_SPEEDUPS_TESTS = true;
+
+  pythonImportsCheck = [
+    "tinycss"
+  ];
+
+  meta = with lib; {
+    description = "Complete yet simple CSS parser for Python";
+    homepage = "https://tinycss.readthedocs.io";
+    changelog = "https://github.com/Kozea/tinycss/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tinycss2/default.nix b/nixpkgs/pkgs/development/python-modules/tinycss2/default.nix
new file mode 100644
index 000000000000..5e6f441d3d3b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tinycss2/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, webencodings
+, pytestCheckHook
+, flit-core
+}:
+
+buildPythonPackage rec {
+  pname = "tinycss2";
+  version = "1.2.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "kozea";
+    repo = "tinycss2";
+    rev = "refs/tags/v${version}";
+    # for tests
+    fetchSubmodules = true;
+    hash = "sha256-rJtxMmW30NK+E+Dhh/fu6FPrEojWWdoEWNt0raYEubs=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "'pytest-cov', 'pytest-flake8', 'pytest-isort', 'coverage[toml]'" "" \
+      --replace "--isort --flake8 --cov --no-cov-on-fail" ""
+  '';
+
+  nativeBuildInputs = [ flit-core ];
+
+  propagatedBuildInputs = [ webencodings ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "Low-level CSS parser for Python";
+    homepage = "https://github.com/Kozea/tinycss2";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tinydb/default.nix b/nixpkgs/pkgs/development/python-modules/tinydb/default.nix
new file mode 100644
index 000000000000..2786018b99ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tinydb/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pycodestyle
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "tinydb";
+  version = "4.8.0";
+  disabled = pythonOlder "3.5";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "msiemens";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-sdWcpkjC8LtOI1k0Wyk4vLXBcwYe1vuQON9J7P8JPxA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  postPatch = ''
+    substituteInPlace pytest.ini \
+      --replace "--cov-append --cov-report term --cov tinydb" ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pycodestyle
+    pyyaml
+  ];
+
+  pythonImportsCheck = [ "tinydb" ];
+
+  meta = with lib; {
+    description = "Lightweight document oriented database written in Python";
+    homepage = "https://tinydb.readthedocs.org/";
+    changelog = "https://tinydb.readthedocs.io/en/latest/changelog.html";
+    license = licenses.mit;
+    maintainers = with maintainers; [ marcus7070 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tinyobjloader-py/default.nix b/nixpkgs/pkgs/development/python-modules/tinyobjloader-py/default.nix
new file mode 100644
index 000000000000..3c36dded5ee7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tinyobjloader-py/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, pybind11, tinyobjloader }:
+
+buildPythonPackage rec {
+  pname = "tinyobjloader-py";
+  inherit (tinyobjloader) version src;
+
+  # Build needs headers from ${src}, setting sourceRoot or fetching from pypi won't work.
+  preConfigure = ''
+    cd python
+  '';
+
+  buildInputs = [ pybind11 ];
+
+  # No tests are included upstream
+  doCheck = false;
+  pythonImportsCheck = [ "tinyobjloader" ];
+
+  meta = with lib; tinyobjloader.meta // {
+    description = "Python wrapper for the C++ wavefront .obj loader tinyobjloader";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tinyrecord/default.nix b/nixpkgs/pkgs/development/python-modules/tinyrecord/default.nix
new file mode 100644
index 000000000000..025ffdeefd49
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tinyrecord/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, tinydb
+}:
+
+buildPythonPackage rec {
+  pname = "tinyrecord";
+  version = "0.2.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "eugene-eeo";
+    repo = "tinyrecord";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-mF4hpHuNyiQ5DurRnyLck5e/Vp26GCLkhD8eeSB4NYs=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    tinydb
+  ];
+
+  pytestFlagsArray = [
+    "tests.py"
+  ];
+
+  pythonImportsCheck = [
+    "tinyrecord"
+  ];
+
+  meta = with lib; {
+    description = "Transaction support for TinyDB";
+    homepage = "https://github.com/eugene-eeo/tinyrecord";
+    changelog = "https://github.com/eugene-eeo/tinyrecord/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ nickcao ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tissue/default.nix b/nixpkgs/pkgs/development/python-modules/tissue/default.nix
new file mode 100644
index 000000000000..e1ef7f9edf46
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tissue/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, pep8
+}:
+
+buildPythonPackage rec {
+  pname = "tissue";
+  version = "0.9.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7e34726c3ec8fae358a7faf62de172db15716f5582e5192a109e33348bd76c2e";
+  };
+
+  buildInputs = [ nose ];
+  propagatedBuildInputs = [ pep8 ];
+
+  meta = with lib; {
+    homepage = "https://github.com/WoLpH/tissue";
+    description = "Tissue - automated pep8 checker for nose";
+    license = licenses.lgpl2;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/titlecase/default.nix b/nixpkgs/pkgs/development/python-modules/titlecase/default.nix
new file mode 100644
index 000000000000..6cd8e7faa1e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/titlecase/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, regex
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "titlecase";
+  version = "2.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ppannuto";
+    repo = "python-titlecase";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-aJbbfNnQvmmYPXVOO+xx7ADetsxE+jnVQOVDzV5jUp8=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    regex
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "titlecase/tests.py"
+  ];
+
+  pythonImportsCheck = [
+    "titlecase"
+  ];
+
+  meta = with lib; {
+    description = "Python library to capitalize strings as specified by the New York Times";
+    homepage = "https://github.com/ppannuto/python-titlecase";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tkinter/default.nix b/nixpkgs/pkgs/development/python-modules/tkinter/default.nix
new file mode 100644
index 000000000000..ccfc72907014
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tkinter/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, python
+, py
+, isPyPy
+}:
+
+buildPythonPackage {
+  pname = "tkinter";
+  version = python.version;
+  src = py;
+  format = "other";
+
+  disabled = isPyPy;
+
+  installPhase = ''
+    # Move the tkinter module
+    mkdir -p $out/${py.sitePackages}
+    mv lib/${py.libPrefix}/lib-dynload/_tkinter* $out/${py.sitePackages}/
+  '' + lib.optionalString (!stdenv.isDarwin) ''
+    # Update the rpath to point to python without x11Support
+    old_rpath=$(patchelf --print-rpath $out/${py.sitePackages}/_tkinter*)
+    new_rpath=$(sed "s#${py}#${python}#g" <<< "$old_rpath" )
+    patchelf --set-rpath $new_rpath $out/${py.sitePackages}/_tkinter*
+  '';
+
+  meta = py.meta // {
+    # Based on first sentence from https://docs.python.org/3/library/tkinter.html
+    description = "The standard Python interface to the Tcl/Tk GUI toolkit";
+    longDescription = ''
+      The tkinter package (“Tk interface”) is the standard Python interface to
+      the Tcl/Tk GUI toolkit. Both Tk and tkinter are available on most Unix
+      platforms, including macOS, as well as on Windows systems.
+
+      Running python -m tkinter from the command line should open a window
+      demonstrating a simple Tk interface, letting you know that tkinter is
+      properly installed on your system, and also showing what version of
+      Tcl/Tk is installed, so you can read the Tcl/Tk documentation specific to
+      that version.
+
+      Tkinter supports a range of Tcl/Tk versions, built either with or without
+      thread support. The official Python binary release bundles Tcl/Tk 8.6
+      threaded. See the source code for the _tkinter module for more
+      information about supported versions.
+
+      Tkinter is not a thin wrapper, but adds a fair amount of its own logic to
+      make the experience more pythonic. This documentation will concentrate on
+      these additions and changes, and refer to the official Tcl/Tk
+      documentation for details that are unchanged.
+    '';
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tld/default.nix b/nixpkgs/pkgs/development/python-modules/tld/default.nix
new file mode 100644
index 000000000000..a8a25bba00cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tld/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, factory-boy
+, faker
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "tld";
+  version = "0.13";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-k93l4cBL3xhEl26uRAcGN50h9KsjW3PAXXSD4HT7Vik=";
+  };
+
+  postPatch = ''
+    sed -i "/--cov/d" pytest.ini
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  checkInputs = [
+    factory-boy
+    faker
+  ];
+
+  # These tests require network access, but disabledTestPaths doesn't work.
+  # the file needs to be `import`ed by another Python test file, so it
+  # can't simply be removed.
+  preCheck = ''
+    echo > src/tld/tests/test_commands.py
+  '';
+
+  pythonImportsCheck = [
+    "tld"
+  ];
+
+  meta = with lib; {
+    description = "Extracts the top level domain (TLD) from the URL given";
+    homepage = "https://github.com/barseghyanartur/tld";
+    changelog = "https://github.com/barseghyanartur/tld/blob/${version}/CHANGELOG.rst";
+    # https://github.com/barseghyanartur/tld/blob/master/README.rst#license
+    # MPL-1.1 OR GPL-2.0-only OR LGPL-2.1-or-later
+    license = with licenses; [ lgpl21Plus mpl11 gpl2Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tldextract/default.nix b/nixpkgs/pkgs/development/python-modules/tldextract/default.nix
new file mode 100644
index 000000000000..58dffe94a66b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tldextract/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, filelock
+, idna
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-file
+, responses
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "tldextract";
+  version = "5.1.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "john-kurkowski";
+    repo = "tldextract";
+    rev = "refs/tags/${version}";
+    hash = "sha256-/VBbU8FuB8MEuX6MgGO44+gfqVjl1aHHDHncHY2Jo38=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    filelock
+    idna
+    requests
+    requests-file
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "tldextract"
+  ];
+
+  meta = with lib; {
+    description = "Python module to accurately separate the TLD from the domain of an URL";
+    longDescription = ''
+      tldextract accurately separates the gTLD or ccTLD (generic or country code top-level domain)
+      from the registered domain and subdomains of a URL.
+    '';
+    homepage = "https://github.com/john-kurkowski/tldextract";
+    changelog = "https://github.com/john-kurkowski/tldextract/blob/${version}/CHANGELOG.md";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tlds/default.nix b/nixpkgs/pkgs/development/python-modules/tlds/default.nix
new file mode 100644
index 000000000000..3967781bb0f8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tlds/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "tlds";
+  version = "2023110300";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "kichik";
+    repo = "tlds";
+    rev = "refs/tags/${version}";
+    hash = "sha256-rmKqY7Z4bBR4r+w4gH04g0Xm9N7QeMVcuFR3pB/pOQY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  pythonImportsCheck = [
+    "tlds"
+  ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Automatically updated list of valid TLDs taken directly from IANA";
+    homepage = "https://github.com/mweinelt/tlds";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tls-parser/default.nix b/nixpkgs/pkgs/development/python-modules/tls-parser/default.nix
new file mode 100644
index 000000000000..c9b317c3c22b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tls-parser/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, pythonOlder
+, fetchFromGitHub
+, buildPythonPackage
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tls-parser";
+  version = "2.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "nabla-c0d3";
+    repo = "tls_parser";
+    rev = version;
+    hash = "sha256-2XHhUDiJ1EctnYdxYFbNSVLF8dmHP9cZXjziOE9+Dew=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "tls_parser"
+  ];
+
+  meta = with lib; {
+    description = "Small library to parse TLS records";
+    homepage = "https://github.com/nabla-c0d3/tls_parser";
+    platforms = with platforms; linux ++ darwin;
+    license = licenses.mit;
+    maintainers = with maintainers; [ veehaitch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tlsh/default.nix b/nixpkgs/pkgs/development/python-modules/tlsh/default.nix
new file mode 100644
index 000000000000..c6809a06a406
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tlsh/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cmake
+}:
+
+buildPythonPackage rec {
+  pname = "tlsh";
+  version = "4.10.0";
+
+  src = fetchFromGitHub {
+    owner = "trendmicro";
+    repo = "tlsh";
+    rev = version;
+    hash = "sha256-9Vkj7a5xU/coFyM/8i8JB0DdnbgDAEMOjmmMF8ckKuE=";
+  };
+
+  nativeBuildInputs = [ cmake ];
+
+  # no test data
+  doCheck = false;
+
+  postConfigure = ''
+    cd ../py_ext
+  '';
+
+  meta = with lib; {
+    description = "Trend Micro Locality Sensitive Hash";
+    homepage = "https://tlsh.org/";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tlslite-ng/default.nix b/nixpkgs/pkgs/development/python-modules/tlslite-ng/default.nix
new file mode 100644
index 000000000000..c6146140163c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tlslite-ng/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, ecdsa
+}:
+
+buildPythonPackage rec {
+  pname = "tlslite-ng";
+  version = "0.7.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6ab56f0e9629ce3d807eb528c9112defa9f2e00af2b2961254e8429ca5c1ff00";
+  };
+
+  buildInputs = [ ecdsa ];
+
+  meta = with lib; {
+    description = "Pure python implementation of SSL and TLS.";
+    homepage = "https://pypi.python.org/pypi/tlslite-ng";
+    license = licenses.lgpl2;
+    maintainers = [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tlslite/default.nix b/nixpkgs/pkgs/development/python-modules/tlslite/default.nix
new file mode 100644
index 000000000000..52b662be2b2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tlslite/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "tlslite";
+  version = "0.4.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "9b9a487694c239efea8cec4454a99a56ee1ae1a5f3af0858ccf8029e2ac2d42d";
+  };
+
+  meta = with lib; {
+    description = "A pure Python implementation of SSL and TLS";
+    homepage = "https://pypi.python.org/pypi/tlslite";
+    license = licenses.bsd3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tlv8/default.nix b/nixpkgs/pkgs/development/python-modules/tlv8/default.nix
new file mode 100644
index 000000000000..05ece63e42e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tlv8/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tlv8";
+  version = "0.10.0";
+  format = "setuptools";
+
+  # pypi does not contain test files
+  src = fetchFromGitHub {
+    owner = "jlusiardi";
+    repo = "tlv8_python";
+    rev = "v${version}";
+    sha256 = "sha256-G35xMFYasKD3LnGi9q8wBmmFvqgtg0HPdC+y82nxRWA=";
+  };
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "tlv8"
+  ];
+
+  meta = with lib; {
+    description = "Type-Length-Value8 (TLV8) for Python";
+    longDescription = ''
+      Python module to handle type-length-value (TLV) encoded data 8-bit type, 8-bit length, and N-byte
+      value as described within the Apple HomeKit Accessory Protocol Specification Non-Commercial Version
+      Release R2.
+    '';
+    homepage = "https://github.com/jlusiardi/tlv8_python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jojosch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tmb/default.nix b/nixpkgs/pkgs/development/python-modules/tmb/default.nix
new file mode 100644
index 000000000000..1c5869ac5377
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tmb/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "tmb";
+  version = "0.1.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "alemuro";
+    repo = pname;
+    rev = version;
+    hash = "sha256-XuRhRmeTXAplb14UwISyzaqEIrFeg8/aCdMxUccMUos=";
+  };
+
+  VERSION = version;
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  pythonImportsCheck = [
+    "tmb"
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python library that interacts with TMB API";
+    homepage = "https://github.com/alemuro/tmb";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/todoist-api-python/default.nix b/nixpkgs/pkgs/development/python-modules/todoist-api-python/default.nix
new file mode 100644
index 000000000000..823fee06a4ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/todoist-api-python/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, requests
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "todoist-api-python";
+  version = "2.1.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "Doist";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Xi3B/Nl5bMbW0lYwrkEbBgFTEl07YkFyN18kN0WyGyw=";
+  };
+
+  patches = [
+    # Switch to poetry-core, https://github.com/Doist/todoist-api-python/pull/81
+    (fetchpatch {
+      name = "switch-to-poetry-core.patch";
+      url = "https://github.com/Doist/todoist-api-python/commit/42288e066d2f0c69611ab50cb57ca98b8c6bd1ca.patch";
+      hash = "sha256-yq+VVvjPYywvUn+ydyWVQPkiYPYWe9U6w38G54L2lkE=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [
+    "todoist_api_python"
+  ];
+
+  meta = with lib; {
+    description = "Library for the Todoist REST API";
+    homepage = "https://github.com/Doist/todoist-api-python";
+    changelog = "https://github.com/Doist/todoist-api-python/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/todoist/default.nix b/nixpkgs/pkgs/development/python-modules/todoist/default.nix
new file mode 100644
index 000000000000..d3d93e79946b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/todoist/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "todoist-python";
+  version = "8.1.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Rkg6eSLiQe8DZaVu2DEnlKLe8RLkRwKmpw+TaYj+lp0=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  pythonImportsCheck = [
+    "todoist"
+  ];
+
+  meta = with lib; {
+    description = "The official Todoist Python API library";
+    homepage = "https://todoist-python.readthedocs.io/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/toggl-cli/default.nix b/nixpkgs/pkgs/development/python-modules/toggl-cli/default.nix
new file mode 100644
index 000000000000..c3b08bad24e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/toggl-cli/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, buildPythonPackage
+, click
+, click-completion
+, factory-boy
+, faker
+, fetchPypi
+, inquirer
+, notify-py
+, pbr
+, pendulum
+, ptable
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, requests
+, twine
+, validate-email
+}:
+
+buildPythonPackage rec {
+  pname = "toggl-cli";
+  version = "2.4.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "togglCli";
+    inherit version;
+    hash = "sha256-ncMwiMwYivaFu5jrAsm1oCuXP/PZ2ALT+M+CmV6dtFo=";
+  };
+
+  nativeBuildInputs = [
+    pbr
+    twine
+  ];
+
+  propagatedBuildInputs = [
+    click
+    click-completion
+    inquirer
+    notify-py
+    pbr
+    pendulum
+    ptable
+    requests
+    validate-email
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-mock
+    faker
+    factory-boy
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "notify-py==0.3.3" "notify-py>=0.3.3" \
+      --replace "click==8.0.3" "click>=8.0.3" \
+      --replace "pbr==5.8.0" "pbr>=5.8.0" \
+      --replace "inquirer==2.9.1" "inquirer>=2.9.1"
+    substituteInPlace pytest.ini \
+      --replace ' --cov toggl -m "not premium"' ""
+  '';
+
+  preCheck = ''
+    export TOGGL_API_TOKEN=your_api_token
+    export TOGGL_PASSWORD=toggl_password
+    export TOGGL_USERNAME=user@example.com
+  '';
+
+  disabledTests = [
+    "integration"
+    "premium"
+    "test_parsing"
+    "test_type_check"
+    "test_now"
+  ];
+
+  pythonImportsCheck = [
+    "toggl"
+  ];
+
+  meta = with lib; {
+    description = "Command line tool and set of Python wrapper classes for interacting with toggl's API";
+    homepage = "https://toggl.uhlir.dev/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mmahut ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/token-bucket/default.nix b/nixpkgs/pkgs/development/python-modules/token-bucket/default.nix
new file mode 100644
index 000000000000..497d10d84fe8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/token-bucket/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "token-bucket";
+  version = "0.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "falconry";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-dazqJRpC8FUHOhgKFzDnIl5CT2L74J2o2Hsm0IQf4Cg=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'" ""
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  doCheck = !stdenv.isDarwin;
+
+  meta = with lib; {
+    description = "Token Bucket Implementation for Python Web Apps";
+    homepage = "https://github.com/falconry/token-bucket";
+    changelog = "https://github.com/falconry/token-bucket/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tokenize-rt/default.nix b/nixpkgs/pkgs/development/python-modules/tokenize-rt/default.nix
new file mode 100644
index 000000000000..107c3ae75c5a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tokenize-rt/default.nix
@@ -0,0 +1,28 @@
+{ buildPythonPackage
+, lib
+, fetchFromGitHub
+, isPy27
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tokenize-rt";
+  version = "4.2.1";
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "asottile";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-YNt4YwkuA3DVq4EjJaIES9V3A6ENa3k6/qVKisjA5Pc=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "A wrapper around the stdlib `tokenize` which roundtrips";
+    homepage = "https://github.com/asottile/tokenize-rt";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lovesegfault ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tokenizers/Cargo.lock b/nixpkgs/pkgs/development/python-modules/tokenizers/Cargo.lock
new file mode 100644
index 000000000000..ced7f1538734
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tokenizers/Cargo.lock
@@ -0,0 +1,1261 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "aho-corasick"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea5d730647d4fadd988536d06fecce94b7b4f2a7efdae548f1cf4b63205518ab"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "anstream"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44"
+dependencies = [
+ "anstyle",
+ "anstyle-parse",
+ "anstyle-query",
+ "anstyle-wincon",
+ "colorchoice",
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87"
+
+[[package]]
+name = "anstyle-parse"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140"
+dependencies = [
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle-query"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b"
+dependencies = [
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "anstyle-wincon"
+version = "3.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628"
+dependencies = [
+ "anstyle",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "base64"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bitflags"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
+
+[[package]]
+name = "cc"
+version = "1.0.79"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "clap"
+version = "4.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d04704f56c2cde07f43e8e2c154b43f216dc5c92fc98ada720177362f953b956"
+dependencies = [
+ "clap_builder",
+ "clap_derive",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e231faeaca65ebd1ea3c737966bf858971cd38c3849107aa3ea7de90a804e45"
+dependencies = [
+ "anstream",
+ "anstyle",
+ "clap_lex",
+ "strsim",
+]
+
+[[package]]
+name = "clap_derive"
+version = "4.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.25",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961"
+
+[[package]]
+name = "colorchoice"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
+
+[[package]]
+name = "console"
+version = "0.15.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8"
+dependencies = [
+ "encode_unicode",
+ "lazy_static",
+ "libc",
+ "unicode-width",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
+dependencies = [
+ "cfg-if",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7"
+dependencies = [
+ "autocfg",
+ "cfg-if",
+ "crossbeam-utils",
+ "memoffset",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "darling"
+version = "0.14.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850"
+dependencies = [
+ "darling_core",
+ "darling_macro",
+]
+
+[[package]]
+name = "darling_core"
+version = "0.14.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0"
+dependencies = [
+ "fnv",
+ "ident_case",
+ "proc-macro2",
+ "quote",
+ "strsim",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "darling_macro"
+version = "0.14.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e"
+dependencies = [
+ "darling_core",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "derive_builder"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d67778784b508018359cbc8696edb3db78160bab2c2a28ba7f56ef6932997f8"
+dependencies = [
+ "derive_builder_macro",
+]
+
+[[package]]
+name = "derive_builder_core"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c11bdc11a0c47bc7d37d582b5285da6849c96681023680b906673c5707af7b0f"
+dependencies = [
+ "darling",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "derive_builder_macro"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ebcda35c7a396850a55ffeac740804b40ffec779b98fffbb1738f4033f0ee79e"
+dependencies = [
+ "derive_builder_core",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "either"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
+
+[[package]]
+name = "encode_unicode"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
+
+[[package]]
+name = "env_logger"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0"
+dependencies = [
+ "humantime",
+ "is-terminal",
+ "log",
+ "regex",
+ "termcolor",
+]
+
+[[package]]
+name = "errno"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
+dependencies = [
+ "errno-dragonfly",
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "errno-dragonfly"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "esaxx-rs"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d817e038c30374a4bcb22f94d0a8a0e216958d4c3dcde369b1439fec4bdda6e6"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "fastrand"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "getrandom"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi",
+]
+
+[[package]]
+name = "heck"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+
+[[package]]
+name = "hermit-abi"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b"
+
+[[package]]
+name = "humantime"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
+
+[[package]]
+name = "ident_case"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+
+[[package]]
+name = "indicatif"
+version = "0.17.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb28741c9db9a713d93deb3bb9515c20788cef5815265bee4980e87bde7e0f25"
+dependencies = [
+ "console",
+ "instant",
+ "number_prefix",
+ "portable-atomic",
+ "unicode-width",
+]
+
+[[package]]
+name = "indoc"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306"
+
+[[package]]
+name = "instant"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "is-terminal"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b"
+dependencies = [
+ "hermit-abi",
+ "rustix",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "itertools"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a"
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "libc"
+version = "0.2.147"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3852614a3bd9ca9804678ba6be5e3b8ce76dfc902cae004e3e0c44051b6e88db"
+
+[[package]]
+name = "lock_api"
+version = "0.4.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4"
+
+[[package]]
+name = "macro_rules_attribute"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a82271f7bc033d84bbca59a3ce3e4159938cb08a9c3aebbe54d215131518a13"
+dependencies = [
+ "macro_rules_attribute-proc_macro",
+ "paste",
+]
+
+[[package]]
+name = "macro_rules_attribute-proc_macro"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8dd856d451cc0da70e2ef2ce95a18e39a93b7558bedf10201ad28503f918568"
+
+[[package]]
+name = "matrixmultiply"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "090126dc04f95dc0d1c1c91f61bdd474b3930ca064c1edc8a849da2c6cbe1e77"
+dependencies = [
+ "autocfg",
+ "rawpointer",
+]
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "memoffset"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
+[[package]]
+name = "monostate"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15f370ae88093ec6b11a710dec51321a61d420fafd1bad6e30d01bd9c920e8ee"
+dependencies = [
+ "monostate-impl",
+ "serde",
+]
+
+[[package]]
+name = "monostate-impl"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "371717c0a5543d6a800cac822eac735aa7d2d2fbb41002e9856a4089532dbdce"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.25",
+]
+
+[[package]]
+name = "ndarray"
+version = "0.15.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32"
+dependencies = [
+ "matrixmultiply",
+ "num-complex",
+ "num-integer",
+ "num-traits",
+ "rawpointer",
+]
+
+[[package]]
+name = "nom"
+version = "7.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]
+
+[[package]]
+name = "num-complex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "number_prefix"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
+
+[[package]]
+name = "numpy"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "437213adf41bbccf4aeae535fbfcdad0f6fed241e1ae182ebe97fa1f3ce19389"
+dependencies = [
+ "libc",
+ "ndarray",
+ "num-complex",
+ "num-integer",
+ "num-traits",
+ "pyo3",
+ "rustc-hash",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+
+[[package]]
+name = "onig"
+version = "6.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c4b31c8722ad9171c6d77d3557db078cab2bd50afcc9d09c8b315c59df8ca4f"
+dependencies = [
+ "bitflags 1.3.2",
+ "libc",
+ "once_cell",
+ "onig_sys",
+]
+
+[[package]]
+name = "onig_sys"
+version = "69.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b829e3d7e9cc74c7e315ee8edb185bf4190da5acde74afd7fc59c35b1f086e7"
+dependencies = [
+ "cc",
+ "pkg-config",
+]
+
+[[package]]
+name = "parking_lot"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-targets 0.48.1",
+]
+
+[[package]]
+name = "paste"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
+
+[[package]]
+name = "portable-atomic"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31114a898e107c51bb1609ffaf55a0e011cf6a4d7f1170d0015a165082c0338b"
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.64"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78803b62cbf1f46fde80d7c0e803111524b9877184cfe7c3033659490ac7a7da"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "pyo3"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e681a6cfdc4adcc93b4d3cf993749a4552018ee0a9b65fc0ccfad74352c72a38"
+dependencies = [
+ "cfg-if",
+ "indoc",
+ "libc",
+ "memoffset",
+ "parking_lot",
+ "pyo3-build-config",
+ "pyo3-ffi",
+ "pyo3-macros",
+ "unindent",
+]
+
+[[package]]
+name = "pyo3-build-config"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "076c73d0bc438f7a4ef6fdd0c3bb4732149136abd952b110ac93e4edb13a6ba5"
+dependencies = [
+ "once_cell",
+ "target-lexicon",
+]
+
+[[package]]
+name = "pyo3-ffi"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e53cee42e77ebe256066ba8aa77eff722b3bb91f3419177cf4cd0f304d3284d9"
+dependencies = [
+ "libc",
+ "pyo3-build-config",
+]
+
+[[package]]
+name = "pyo3-macros"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dfeb4c99597e136528c6dd7d5e3de5434d1ceaf487436a3f03b2d56b6fc9efd1"
+dependencies = [
+ "proc-macro2",
+ "pyo3-macros-backend",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "pyo3-macros-backend"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "947dc12175c254889edc0c02e399476c2f652b4b9ebd123aa655c224de259536"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "rawpointer"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
+
+[[package]]
+name = "rayon"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1"
+dependencies = [
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-cond"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "059f538b55efd2309c9794130bc149c6a553db90e9d99c2030785c82f0bd7df9"
+dependencies = [
+ "either",
+ "itertools",
+ "rayon",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed"
+dependencies = [
+ "crossbeam-deque",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+dependencies = [
+ "bitflags 1.3.2",
+]
+
+[[package]]
+name = "regex"
+version = "1.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2"
+
+[[package]]
+name = "rustc-hash"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
+
+[[package]]
+name = "rustix"
+version = "0.38.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d7db8590df6dfcd144d22afd1b83b36c21a18d7cbc1dc4bb5295a8712e9eb662"
+dependencies = [
+ "bitflags 2.4.0",
+ "errno",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9"
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "serde"
+version = "1.0.171"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.171"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.25",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.102"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5062a995d481b2308b6064e9af76011f2921c35f97b0468811ed9f6cd91dfed"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9"
+
+[[package]]
+name = "spm_precompiled"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5851699c4033c63636f7ea4cf7b7c1f1bf06d0cc03cfb42e711de5a5c46cf326"
+dependencies = [
+ "base64",
+ "nom",
+ "serde",
+ "unicode-segmentation",
+]
+
+[[package]]
+name = "strsim"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15e3fc8c0c74267e2df136e5e5fb656a464158aa57624053375eb9c8c6e25ae2"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "target-lexicon"
+version = "0.12.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df8e77cb757a61f51b947ec4a7e3646efd825b73561db1c232a8ccb639e611a0"
+
+[[package]]
+name = "tempfile"
+version = "3.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef"
+dependencies = [
+ "cfg-if",
+ "fastrand",
+ "redox_syscall",
+ "rustix",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "termcolor"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.49"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.49"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.25",
+]
+
+[[package]]
+name = "tokenizers"
+version = "0.14.1"
+dependencies = [
+ "aho-corasick",
+ "clap",
+ "derive_builder",
+ "esaxx-rs",
+ "getrandom",
+ "indicatif",
+ "itertools",
+ "lazy_static",
+ "log",
+ "macro_rules_attribute",
+ "monostate",
+ "onig",
+ "paste",
+ "rand",
+ "rayon",
+ "rayon-cond",
+ "regex",
+ "regex-syntax",
+ "serde",
+ "serde_json",
+ "spm_precompiled",
+ "thiserror",
+ "unicode-normalization-alignments",
+ "unicode-segmentation",
+ "unicode_categories",
+]
+
+[[package]]
+name = "tokenizers-python"
+version = "0.14.1"
+dependencies = [
+ "env_logger",
+ "itertools",
+ "libc",
+ "ndarray",
+ "numpy",
+ "onig",
+ "pyo3",
+ "rayon",
+ "serde",
+ "serde_json",
+ "tempfile",
+ "tokenizers",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73"
+
+[[package]]
+name = "unicode-normalization-alignments"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43f613e4fa046e69818dd287fdc4bc78175ff20331479dab6e1b0f98d57062de"
+dependencies = [
+ "smallvec",
+]
+
+[[package]]
+name = "unicode-segmentation"
+version = "1.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
+
+[[package]]
+name = "unicode-width"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
+
+[[package]]
+name = "unicode_categories"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e"
+
+[[package]]
+name = "unindent"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1766d682d402817b5ac4490b3c3002d91dfa0d22812f341609f97b08757359c"
+
+[[package]]
+name = "utf8parse"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "windows-sys"
+version = "0.45.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
+dependencies = [
+ "windows-targets 0.42.2",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets 0.48.1",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
+dependencies = [
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f"
+dependencies = [
+ "windows_aarch64_gnullvm 0.48.0",
+ "windows_aarch64_msvc 0.48.0",
+ "windows_i686_gnu 0.48.0",
+ "windows_i686_msvc 0.48.0",
+ "windows_x86_64_gnu 0.48.0",
+ "windows_x86_64_gnullvm 0.48.0",
+ "windows_x86_64_msvc 0.48.0",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
diff --git a/nixpkgs/pkgs/development/python-modules/tokenizers/default.nix b/nixpkgs/pkgs/development/python-modules/tokenizers/default.nix
new file mode 100644
index 000000000000..d8a731825feb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tokenizers/default.nix
@@ -0,0 +1,146 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cargo
+, datasets
+, fetchFromGitHub
+, fetchurl
+, libiconv
+, numpy
+, openssl
+, pkg-config
+, pytestCheckHook
+, pythonOlder
+, requests
+, rustPlatform
+, rustc
+, Security
+, setuptools-rust
+}:
+
+let
+  # See https://github.com/huggingface/tokenizers/blob/main/bindings/python/tests/utils.py for details
+  # about URLs and file names
+  robertaVocab = fetchurl {
+    url = "https://s3.amazonaws.com/models.huggingface.co/bert/roberta-base-vocab.json";
+    sha256 = "0m86wpkfb2gdh9x9i9ng2fvwk1rva4p0s98xw996nrjxs7166zwy";
+  };
+  robertaMerges = fetchurl {
+    url = "https://s3.amazonaws.com/models.huggingface.co/bert/roberta-base-merges.txt";
+    sha256 = "1idd4rvkpqqbks51i2vjbd928inw7slij9l4r063w3y5fd3ndq8w";
+  };
+  albertVocab = fetchurl {
+    url = "https://s3.amazonaws.com/models.huggingface.co/bert/albert-base-v1-tokenizer.json";
+    sha256 = "1hra9pn8rczx7378z88zjclw2qsdrdwq20m56sy42s2crbas6akf";
+  };
+  bertVocab = fetchurl {
+    url = "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-uncased-vocab.txt";
+    sha256 = "18rq42cmqa8zanydsbzrb34xwy4l6cz1y900r4kls57cbhvyvv07";
+  };
+  norvigBig = fetchurl {
+    url = "https://norvig.com/big.txt";
+    sha256 = "0yz80icdly7na03cfpl0nfk5h3j3cam55rj486n03wph81ynq1ps";
+  };
+  docPipelineTokenizer = fetchurl {
+    url = "https://s3.amazonaws.com/models.huggingface.co/bert/anthony/doc-pipeline/tokenizer.json";
+    hash = "sha256-i533xC8J5CDMNxBjo+p6avIM8UOcui8RmGAmK0GmfBc=";
+  };
+  docQuicktourTokenizer = fetchurl {
+    url = "https://s3.amazonaws.com/models.huggingface.co/bert/anthony/doc-quicktour/tokenizer.json";
+    hash = "sha256-ipY9d5DR5nxoO6kj7rItueZ9AO5wq9+Nzr6GuEIfIBI=";
+  };
+  openaiVocab = fetchurl {
+    url = "https://s3.amazonaws.com/models.huggingface.co/bert/openai-gpt-vocab.json";
+    sha256 = "0y40gc9bixj5rxv674br1rxmxkd3ly29p80x1596h8yywwcrpx7x";
+  };
+  openaiMerges = fetchurl {
+    url = "https://s3.amazonaws.com/models.huggingface.co/bert/openai-gpt-merges.txt";
+    sha256 = "09a754pm4djjglv3x5pkgwd6f79i2rq8ydg0f7c3q1wmwqdbba8f";
+  };
+in
+buildPythonPackage rec {
+  pname = "tokenizers";
+  version = "0.14.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "huggingface";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-cq7dQLttNkV5UUhXujxKKMuzhD7hz+zTTKxUKlvz1s0=";
+  };
+
+  cargoDeps = rustPlatform.importCargoLock {
+    lockFile = ./Cargo.lock;
+  };
+
+  sourceRoot = "${src.name}/bindings/python";
+
+  nativeBuildInputs = [
+    pkg-config
+    setuptools-rust
+    rustPlatform.cargoSetupHook
+    rustPlatform.maturinBuildHook
+    cargo
+    rustc
+  ];
+
+  buildInputs = [
+    openssl
+  ] ++ lib.optionals stdenv.isDarwin [
+    libiconv
+    Security
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    datasets
+    pytestCheckHook
+    requests
+  ];
+
+  postUnpack = ''
+    # Add data files for tests, otherwise tests attempt network access
+    mkdir $sourceRoot/tests/data
+    ( cd $sourceRoot/tests/data
+      ln -s ${robertaVocab} roberta-base-vocab.json
+      ln -s ${robertaMerges} roberta-base-merges.txt
+      ln -s ${albertVocab} albert-base-v1-tokenizer.json
+      ln -s ${bertVocab} bert-base-uncased-vocab.txt
+      ln -s ${docPipelineTokenizer} bert-wiki.json
+      ln -s ${docQuicktourTokenizer} tokenizer-wiki.json
+      ln -s ${norvigBig} big.txt
+      ln -s ${openaiVocab} openai-gpt-vocab.json
+      ln -s ${openaiMerges} openai-gpt-merges.txt )
+  '';
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  pythonImportsCheck = [
+    "tokenizers"
+  ];
+
+  disabledTests = [
+    # Downloads data using the datasets module
+    "TestTrainFromIterators"
+    # Those tests require more data
+    "test_from_pretrained"
+    "test_from_pretrained_revision"
+    "test_continuing_prefix_trainer_mistmatch"
+  ];
+
+  meta = with lib; {
+    description = "Fast State-of-the-Art Tokenizers optimized for Research and Production";
+    homepage = "https://github.com/huggingface/tokenizers";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tokenlib/default.nix b/nixpkgs/pkgs/development/python-modules/tokenlib/default.nix
new file mode 100644
index 000000000000..bed053f82826
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tokenlib/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, webob
+}:
+
+buildPythonPackage rec {
+  pname = "tokenlib";
+  version = "0.3.1";
+
+  src = fetchFromGitHub {
+    owner = "mozilla-services";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "0bq6dqyfwh29pg8ngmrm4mx4q27an9lsj0p9l79p9snn4g2rxzc8";
+  };
+
+  propagatedBuildInputs = [ requests webob ];
+
+  meta = with lib; {
+    homepage = "https://github.com/mozilla-services/tokenlib";
+    description = "Generic support library for signed-token-based auth schemes";
+    license = licenses.mpl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tokentrim/default.nix b/nixpkgs/pkgs/development/python-modules/tokentrim/default.nix
new file mode 100644
index 000000000000..c830d29b8a94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tokentrim/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, tiktoken
+}:
+
+buildPythonPackage {
+  pname = "tokentrim";
+  version = "unstable-2023-09-07";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "KillianLucas";
+    repo = "tokentrim";
+    rev = "e98ad3a2ca0e321a7347f76c30be584175495139";
+    hash = "sha256-95xitHnbFFaj0xPuLMWvIvuJzoCO3VSd592X1RI9h3A=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    tiktoken
+  ];
+
+  pythonImportsCheck = [ "tokentrim" ];
+
+  # tests connect to openai
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Easily trim 'messages' arrays for use with GPTs";
+    homepage = "https://github.com/KillianLucas/tokentrim";
+    license = licenses.mit;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tololib/default.nix b/nixpkgs/pkgs/development/python-modules/tololib/default.nix
new file mode 100644
index 000000000000..6d2ad4815b5a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tololib/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitLab
+, fetchpatch
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "tololib";
+  version = "0.1.0b4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitLab {
+    owner = "MatthiasLohr";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-2OQaJR70bx8qWs1IPErF+B3X1iRvHW74axTqtdvum3U=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Test requires network access
+    "test_discovery"
+  ];
+
+  pythonImportsCheck = [
+    "tololib"
+  ];
+
+  meta = with lib; {
+    description = "Python Library for Controlling TOLO Sauna/Steam Bath Devices";
+    homepage = "https://gitlab.com/MatthiasLohr/tololib";
+    changelog = "https://gitlab.com/MatthiasLohr/tololib/-/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/toml-adapt/default.nix b/nixpkgs/pkgs/development/python-modules/toml-adapt/default.nix
new file mode 100644
index 000000000000..66ad2d58dbc7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/toml-adapt/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, toml
+}:
+
+buildPythonPackage rec {
+  pname = "toml-adapt";
+  version = "0.2.12";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "firefly-cpp";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-DtxA63lutgjGMH8GYz5r6IFEuuZ9iFGPGup960c4xgE=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    click
+    toml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "toml_adapt"
+  ];
+
+  meta = with lib; {
+    description = "A simple Command-line interface for manipulating toml files";
+    homepage = "https://github.com/firefly-cpp/toml-adapt";
+    license = licenses.mit;
+    maintainers = with maintainers; [ firefly-cpp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/toml/default.nix b/nixpkgs/pkgs/development/python-modules/toml/default.nix
new file mode 100644
index 000000000000..bdc1b141eed7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/toml/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "toml";
+  version = "0.10.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f";
+  };
+
+  # This package has a test script (built for Travis) that involves a)
+  # looking in the home directory for a binary test runner and b) using
+  # git to download a test suite.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "a Python library for parsing and creating TOML";
+    homepage = "https://github.com/uiri/toml";
+    license = licenses.mit;
+    maintainers = with maintainers; [ twey ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tomli-w/default.nix b/nixpkgs/pkgs/development/python-modules/tomli-w/default.nix
new file mode 100644
index 000000000000..920063fd10eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tomli-w/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, callPackage
+, fetchFromGitHub
+, flit-core
+}:
+
+buildPythonPackage rec {
+  pname = "tomli-w";
+  version = "1.0.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "hukkin";
+    repo = pname;
+    rev = version;
+    hash = "sha256-wZSC5uOi1JUeKXIli1I8/Vo0wGsv9Q1I84dAMQQP95w=";
+  };
+
+  nativeBuildInputs = [ flit-core ];
+
+  pythonImportsCheck = [ "tomli_w" ];
+
+  meta = with lib; {
+    description = "A write-only counterpart to Tomli, which is a read-only TOML parser";
+    homepage = "https://github.com/hukkin/tomli-w";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lovesegfault ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tomli/default.nix b/nixpkgs/pkgs/development/python-modules/tomli/default.nix
new file mode 100644
index 000000000000..b2de1c0dfdeb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tomli/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, callPackage
+, fetchFromGitHub
+, flit-core
+, unittestCheckHook
+
+  # important downstream dependencies
+, flit
+, black
+, mypy
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "tomli";
+  version = "2.0.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "hukkin";
+    repo = pname;
+    rev = version;
+    hash = "sha256-v0ZMrHIIaGeORwD4JiBeLthmnKZODK5odZVL0SY4etA=";
+  };
+
+  nativeBuildInputs = [ flit-core ];
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  pythonImportsCheck = [ "tomli" ];
+
+  passthru.tests = {
+    # test downstream dependencies
+    inherit flit black mypy setuptools-scm;
+  };
+
+  meta = with lib; {
+    description = "A Python library for parsing TOML, fully compatible with TOML v1.0.0";
+    homepage = "https://github.com/hukkin/tomli";
+    license = licenses.mit;
+    maintainers = with maintainers; [ veehaitch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tomlkit/default.nix b/nixpkgs/pkgs/development/python-modules/tomlkit/default.nix
new file mode 100644
index 000000000000..605291edda0b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tomlkit/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+
+# build-system
+, poetry-core
+
+# tests
+, pytestCheckHook
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "tomlkit";
+  version = "0.12.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-OOH/jtuZEnPsn2GBJEpqORrDDp9QmOdTVkDqa+l6fIY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pyyaml
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "tomlkit" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/sdispater/tomlkit";
+    changelog = "https://github.com/sdispater/tomlkit/blob/${version}/CHANGELOG.md";
+    description = "Style-preserving TOML library for Python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jakewaksbaum ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/toolz/default.nix b/nixpkgs/pkgs/development/python-modules/toolz/default.nix
new file mode 100644
index 000000000000..c6c9ecf31d84
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/toolz/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "toolz";
+  version = "0.12.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-iMVwhhxEDuPy9gN8RlRhMij/QMk6bCXg66cNFygsYZQ=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pytoolz/toolz";
+    description = "List processing tools and functional utilities";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/toonapi/default.nix b/nixpkgs/pkgs/development/python-modules/toonapi/default.nix
new file mode 100644
index 000000000000..ac51cae1c805
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/toonapi/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, aiohttp
+, backoff
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "toonapi";
+  version = "0.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-toonapi";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-RaN9ppqJbTik1/vNX0/YLoBawrqjyQWU6+FLTspIxug=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    backoff
+    yarl
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "toonapi"
+  ];
+
+  meta = with lib; {
+    description = "Python client for the Quby ToonAPI";
+    homepage = "https://github.com/frenck/python-toonapi";
+    changelog = "https://github.com/frenck/python-toonapi/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/toposort/default.nix b/nixpkgs/pkgs/development/python-modules/toposort/default.nix
new file mode 100644
index 000000000000..5270da85f4a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/toposort/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "toposort";
+  version = "1.10";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-v7tHnFPQppbqdAJgH05pPJewNng3yImLxkca38o3pr0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  pythonImportsCheck = [
+    "toposort"
+  ];
+
+  meta = with lib; {
+    description = "A topological sort algorithm";
+    homepage = "https://pypi.python.org/pypi/toposort/";
+    maintainers = with maintainers; [ ];
+    platforms = platforms.unix;
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/torch-tb-profiler/default.nix b/nixpkgs/pkgs/development/python-modules/torch-tb-profiler/default.nix
new file mode 100644
index 000000000000..108acfb0d355
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torch-tb-profiler/default.nix
@@ -0,0 +1,48 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, pandas
+, pytestCheckHook
+, torch
+, tensorboard
+, torchvision
+}:
+
+let
+  version = "0.3.1";
+  repo = fetchFromGitHub {
+    owner = "pytorch";
+    repo = "kineto";
+    rev = "v${version}";
+    hash = "sha256-Yg001XzOPDmz9wEP2b7Ggz/uU6x5PFzaaBeUBwWKFS0=";
+  };
+in
+buildPythonPackage rec {
+  pname = "torch_tb_profiler";
+  inherit version;
+  format = "setuptools";
+
+  # See https://discourse.nixos.org/t/extracting-sub-directory-from-fetchgit-or-fetchurl-or-any-derivation/8830.
+  src = "${repo}/tb_plugin";
+
+  propagatedBuildInputs = [ pandas tensorboard ];
+
+  nativeCheckInputs = [ pytestCheckHook torch torchvision ];
+
+  disabledTests = [
+    # Tests that attempt to access the filesystem in naughty ways.
+    "test_profiler_api_without_gpu"
+    "test_tensorboard_end2end"
+    "test_tensorboard_with_path_prefix"
+    "test_tensorboard_with_symlinks"
+  ];
+
+  pythonImportsCheck = [ "torch_tb_profiler" ];
+
+  meta = with lib; {
+    description = "PyTorch Profiler TensorBoard Plugin";
+    homepage = "https://github.com/pytorch/kineto";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/torch/bin.nix b/nixpkgs/pkgs/development/python-modules/torch/bin.nix
new file mode 100644
index 000000000000..74eefd071890
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torch/bin.nix
@@ -0,0 +1,116 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchurl
+, python
+, pythonAtLeast
+, pythonOlder
+, addOpenGLRunpath
+, cudaPackages
+, future
+, numpy
+, autoPatchelfHook
+, pyyaml
+, requests
+, setuptools
+, typing-extensions
+, sympy
+, jinja2
+, networkx
+, filelock
+, openai-triton
+}:
+
+let
+  pyVerNoDot = builtins.replaceStrings [ "." ] [ "" ] python.pythonVersion;
+  srcs = import ./binary-hashes.nix version;
+  unsupported = throw "Unsupported system";
+  version = "2.1.1";
+in buildPythonPackage {
+  inherit version;
+
+  pname = "torch";
+  # Don't forget to update torch to the same version.
+
+  format = "wheel";
+
+  disabled = (pythonOlder "3.8") || (pythonAtLeast "3.12");
+
+  src = fetchurl srcs."${stdenv.system}-${pyVerNoDot}" or unsupported;
+
+  nativeBuildInputs = lib.optionals stdenv.isLinux [
+    addOpenGLRunpath
+    autoPatchelfHook
+    cudaPackages.autoAddOpenGLRunpathHook
+  ];
+
+  buildInputs = lib.optionals stdenv.isLinux (with cudaPackages; [
+    # $out/${sitePackages}/nvfuser/_C*.so wants libnvToolsExt.so.1 but torch/lib only ships
+    # libnvToolsExt-$hash.so.1
+    cuda_nvtx
+  ]);
+
+  autoPatchelfIgnoreMissingDeps = lib.optionals stdenv.isLinux [
+    # This is the hardware-dependent userspace driver that comes from
+    # nvidia_x11 package. It must be deployed at runtime in
+    # /run/opengl-driver/lib or pointed at by LD_LIBRARY_PATH variable, rather
+    # than pinned in runpath
+    "libcuda.so.1"
+  ];
+
+  propagatedBuildInputs = [
+    future
+    numpy
+    pyyaml
+    requests
+    setuptools
+    typing-extensions
+    sympy
+    jinja2
+    networkx
+    filelock
+  ] ++ lib.optionals stdenv.isx86_64 [
+    openai-triton
+  ];
+
+  postInstall = ''
+    # ONNX conversion
+    rm -rf $out/bin
+  '';
+
+  postFixup = lib.optionalString stdenv.isLinux ''
+    addAutoPatchelfSearchPath "$out/${python.sitePackages}/torch/lib"
+
+    patchelf $out/${python.sitePackages}/torch/lib/libcudnn.so.8 --add-needed libcudnn_cnn_infer.so.8
+
+    pushd $out/${python.sitePackages}/torch/lib || exit 1
+      for LIBNVRTC in ./libnvrtc*
+      do
+        case "$LIBNVRTC" in
+          ./libnvrtc-builtins*) true;;
+          ./libnvrtc*) patchelf "$LIBNVRTC" --add-needed libnvrtc-builtins* ;;
+        esac
+      done
+    popd || exit 1
+  '';
+
+  # The wheel-binary is not stripped to avoid the error of `ImportError: libtorch_cuda_cpp.so: ELF load command address/offset not properly aligned.`.
+  dontStrip = true;
+
+  pythonImportsCheck = [ "torch" ];
+
+  meta = with lib; {
+    description = "PyTorch: Tensors and Dynamic neural networks in Python with strong GPU acceleration";
+    homepage = "https://pytorch.org/";
+    changelog = "https://github.com/pytorch/pytorch/releases/tag/v${version}";
+    # Includes CUDA and Intel MKL, but redistributions of the binary are not limited.
+    # https://docs.nvidia.com/cuda/eula/index.html
+    # https://www.intel.com/content/www/us/en/developer/articles/license/onemkl-license-faq.html
+    # torch's license is BSD3.
+    # torch-bin includes CUDA and MKL binaries, therefore unfreeRedistributable is set.
+    license = with licenses; [ bsd3 issl unfreeRedistributable ];
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    platforms = [ "aarch64-darwin" "aarch64-linux" "x86_64-darwin" "x86_64-linux" ];
+    hydraPlatforms = []; # output size 3.2G on 1.11.0
+    maintainers = with maintainers; [ junjihashimoto ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/torch/binary-hashes.nix b/nixpkgs/pkgs/development/python-modules/torch/binary-hashes.nix
new file mode 100644
index 000000000000..42eed4485ebf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torch/binary-hashes.nix
@@ -0,0 +1,91 @@
+# Warning: use the same CUDA version as torch-bin.
+#
+# Precompiled wheels can be found at:
+# https://download.pytorch.org/whl/torch_stable.html
+
+# To add a new version, run "prefetch.sh 'new-version'" to paste the generated file as follows.
+
+version : builtins.getAttr version {
+  "2.1.1" = {
+    x86_64-linux-38 = {
+      name = "torch-2.1.1-cp38-cp38-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu121/torch-2.1.1%2Bcu121-cp38-cp38-linux_x86_64.whl";
+      hash = "sha256-h8y2g+ZCqYuO8FRV722GRntiB1pDJfTV+aouiTL2Bzk=";
+    };
+    x86_64-linux-39 = {
+      name = "torch-2.1.1-cp39-cp39-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu121/torch-2.1.1%2Bcu121-cp39-cp39-linux_x86_64.whl";
+      hash = "sha256-KCRfYtEHPCfW8N4DqBrUnVMzxGBlke2I/tHtuX8FUz0=";
+    };
+    x86_64-linux-310 = {
+      name = "torch-2.1.1-cp310-cp310-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu121/torch-2.1.1%2Bcu121-cp310-cp310-linux_x86_64.whl";
+      hash = "sha256-7HbRE1DI6IejTTZgLNN/UGObyc2p+upNQ/IHDpeS5KQ=";
+    };
+    x86_64-linux-311 = {
+      name = "torch-2.1.1-cp311-cp311-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu121/torch-2.1.1%2Bcu121-cp311-cp311-linux_x86_64.whl";
+      hash = "sha256-g7/hE036irhlU8Fdpd/6GQqG2CKvr+jqbeEWnBDZcao=";
+    };
+    x86_64-darwin-38 = {
+      name = "torch-2.1.1-cp38-none-macosx_10_9_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torch-2.1.1-cp38-none-macosx_10_9_x86_64.whl";
+      hash = "sha256-1WsDIXZFjir0cJYnu9LCD+KRfv+M0Ien/jE6zM9c4vE=";
+    };
+    x86_64-darwin-39 = {
+      name = "torch-2.1.1-cp39-none-macosx_10_9_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torch-2.1.1-cp39-none-macosx_10_9_x86_64.whl";
+      hash = "sha256-cVtQ2MHeXaVSSmgofrAA9z4CbnTV9rErxFDvaZX89fk=";
+    };
+    x86_64-darwin-310 = {
+      name = "torch-2.1.1-cp310-none-macosx_10_9_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torch-2.1.1-cp310-none-macosx_10_9_x86_64.whl";
+      hash = "sha256-Hh5frd1DqPLA4OIr6s0eI1ouRHeU2AdIPJSp4xtUp1g=";
+    };
+    x86_64-darwin-311 = {
+      name = "torch-2.1.1-cp311-none-macosx_10_9_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torch-2.1.1-cp311-none-macosx_10_9_x86_64.whl";
+      hash = "sha256-pwWTgG8dfmtTZX2WgQUY2g+I7yYIyYpAKVV2W4x51Sw=";
+    };
+    aarch64-darwin-38 = {
+      name = "torch-2.1.1-cp38-none-macosx_11_0_arm64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torch-2.1.1-cp38-none-macosx_11_0_arm64.whl";
+      hash = "sha256-KeO5CowoH2ZggEqTnR9CGGBMgBYuUh4ebYyFVzJZAqA=";
+    };
+    aarch64-darwin-39 = {
+      name = "torch-2.1.1-cp39-none-macosx_11_0_arm64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torch-2.1.1-cp39-none-macosx_11_0_arm64.whl";
+      hash = "sha256-22foclx29Mf08C51UbsW6BuhoZEoZ7w117uW0r6MeLQ=";
+    };
+    aarch64-darwin-310 = {
+      name = "torch-2.1.1-cp310-none-macosx_11_0_arm64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torch-2.1.1-cp310-none-macosx_11_0_arm64.whl";
+      hash = "sha256-52vzxcNUh08dpGXIUqL7YO5svOMG6TUzeIV2DwgPm6o=";
+    };
+    aarch64-darwin-311 = {
+      name = "torch-2.1.1-cp311-none-macosx_11_0_arm64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torch-2.1.1-cp311-none-macosx_11_0_arm64.whl";
+      hash = "sha256-4xL36C5JVl92Z7C7+VWasMWXBj2TBEdAeBwCrNWoeXg=";
+    };
+    aarch64-linux-38 = {
+      name = "torch-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torch-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl";
+      hash = "sha256-nKD8vz1bpkTWqFcsg6mrvfX3/1dbw4Up72wYWjpxvek=";
+    };
+    aarch64-linux-39 = {
+      name = "torch-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torch-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl";
+      hash = "sha256-sxIwvQWEJOVtun+JkoDbxqyLmUjkOQLgyEpEZmsewVE=";
+    };
+    aarch64-linux-310 = {
+      name = "torch-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torch-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl";
+      hash = "sha256-hP79YzVkFsDNIFeGN8zbuCFkmTQA7Re1fJUd1jdtzug=";
+    };
+    aarch64-linux-311 = {
+      name = "torch-2.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torch-2.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl";
+      hash = "sha256-YbUbM8YXN8KHBYsMMGHmqdPDY4Y+SglPgEvEhoiKGIo=";
+    };
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/torch/default.nix b/nixpkgs/pkgs/development/python-modules/torch/default.nix
new file mode 100644
index 000000000000..49ed033bd6a1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torch/default.nix
@@ -0,0 +1,494 @@
+{ stdenv, lib, fetchFromGitHub, fetchpatch, buildPythonPackage, python,
+  config, cudaSupport ? config.cudaSupport, cudaPackages,
+  effectiveMagma ?
+  if cudaSupport then magma-cuda-static
+  else if rocmSupport then magma-hip
+  else magma,
+  magma,
+  magma-hip,
+  magma-cuda-static,
+  useSystemNccl ? true,
+  MPISupport ? false, mpi,
+  buildDocs ? false,
+
+  # Native build inputs
+  cmake, linkFarm, symlinkJoin, which, pybind11, removeReferencesTo,
+  pythonRelaxDepsHook,
+
+  # Build inputs
+  numactl,
+  Accelerate, CoreServices, libobjc,
+
+  # Propagated build inputs
+  fsspec,
+  filelock,
+  jinja2,
+  networkx,
+  sympy,
+  numpy, pyyaml, cffi, click, typing-extensions,
+  # ROCm build and `torch.compile` requires `openai-triton`
+  tritonSupport ? (!stdenv.isDarwin), openai-triton,
+
+  # Unit tests
+  hypothesis, psutil,
+
+  # Disable MKLDNN on aarch64-darwin, it negatively impacts performance,
+  # this is also what official pytorch build does
+  mklDnnSupport ? !(stdenv.isDarwin && stdenv.isAarch64),
+
+  # virtual pkg that consistently instantiates blas across nixpkgs
+  # See https://github.com/NixOS/nixpkgs/pull/83888
+  blas,
+
+  # ninja (https://ninja-build.org) must be available to run C++ extensions tests,
+  ninja,
+
+  # dependencies for torch.utils.tensorboard
+  pillow, six, future, tensorboard, protobuf,
+
+  pythonOlder,
+
+  # ROCm dependencies
+  rocmSupport ? config.rocmSupport,
+  rocmPackages,
+  gpuTargets ? [ ]
+}:
+
+let
+  inherit (lib) attrsets lists strings trivial;
+  inherit (cudaPackages) cudaFlags cudnn;
+
+  # Some packages are not available on all platforms
+  nccl = cudaPackages.nccl or null;
+
+  setBool = v: if v then "1" else "0";
+
+  # https://github.com/pytorch/pytorch/blob/v2.0.1/torch/utils/cpp_extension.py#L1744
+  supportedTorchCudaCapabilities =
+    let
+      real = ["3.5" "3.7" "5.0" "5.2" "5.3" "6.0" "6.1" "6.2" "7.0" "7.2" "7.5" "8.0" "8.6" "8.7" "8.9" "9.0"];
+      ptx = lists.map (x: "${x}+PTX") real;
+    in
+    real ++ ptx;
+
+  # NOTE: The lists.subtractLists function is perhaps a bit unintuitive. It subtracts the elements
+  #   of the first list *from* the second list. That means:
+  #   lists.subtractLists a b = b - a
+
+  # For CUDA
+  supportedCudaCapabilities = lists.intersectLists cudaFlags.cudaCapabilities supportedTorchCudaCapabilities;
+  unsupportedCudaCapabilities = lists.subtractLists supportedCudaCapabilities cudaFlags.cudaCapabilities;
+
+  # Use trivial.warnIf to print a warning if any unsupported GPU targets are specified.
+  gpuArchWarner = supported: unsupported:
+    trivial.throwIf (supported == [ ])
+      (
+        "No supported GPU targets specified. Requested GPU targets: "
+        + strings.concatStringsSep ", " unsupported
+      )
+      supported;
+
+  # Create the gpuTargetString.
+  gpuTargetString = strings.concatStringsSep ";" (
+    if gpuTargets != [ ] then
+    # If gpuTargets is specified, it always takes priority.
+      gpuTargets
+    else if cudaSupport then
+      gpuArchWarner supportedCudaCapabilities unsupportedCudaCapabilities
+    else if rocmSupport then
+      rocmPackages.clr.gpuTargets
+    else
+      throw "No GPU targets specified"
+  );
+
+  rocmtoolkit_joined = symlinkJoin {
+    name = "rocm-merged";
+
+    paths = with rocmPackages; [
+      rocm-core clr rccl miopen miopengemm rocrand rocblas
+      rocsparse hipsparse rocthrust rocprim hipcub roctracer
+      rocfft rocsolver hipfft hipsolver hipblas
+      rocminfo rocm-thunk rocm-comgr rocm-device-libs
+      rocm-runtime clr.icd hipify
+    ];
+
+    # Fix `setuptools` not being found
+    postBuild = ''
+      rm -rf $out/nix-support
+    '';
+  };
+
+  brokenConditions = attrsets.filterAttrs (_: cond: cond) {
+    "CUDA and ROCm are mutually exclusive" = cudaSupport && rocmSupport;
+    "CUDA is not targeting Linux" = cudaSupport && !stdenv.isLinux;
+    "Unsupported CUDA version" = cudaSupport && !(builtins.elem cudaPackages.cudaMajorVersion [ "11" "12" ]);
+    "MPI cudatoolkit does not match cudaPackages.cudatoolkit" = MPISupport && cudaSupport && (mpi.cudatoolkit != cudaPackages.cudatoolkit);
+    "Magma cudaPackages does not match cudaPackages" = cudaSupport && (effectiveMagma.cudaPackages != cudaPackages);
+  };
+in buildPythonPackage rec {
+  pname = "torch";
+  # Don't forget to update torch-bin to the same version.
+  version = "2.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8.0";
+
+  outputs = [
+    "out" # output standard python package
+    "dev" # output libtorch headers
+    "lib" # output libtorch libraries
+  ];
+
+  src = fetchFromGitHub {
+    owner = "pytorch";
+    repo = "pytorch";
+    rev = "refs/tags/v${version}";
+    fetchSubmodules = true;
+    hash = "sha256-01+uqHvPbQVXKLohGWfsCsZOjb7xmfjBKkTGUGMEdAI=";
+  };
+
+  patches = lib.optionals cudaSupport [
+    ./fix-cmake-cuda-toolkit.patch
+  ]
+  ++ lib.optionals (stdenv.isDarwin && stdenv.isx86_64) [
+    # pthreadpool added support for Grand Central Dispatch in April
+    # 2020. However, this relies on functionality (DISPATCH_APPLY_AUTO)
+    # that is available starting with macOS 10.13. However, our current
+    # base is 10.12. Until we upgrade, we can fall back on the older
+    # pthread support.
+    ./pthreadpool-disable-gcd.diff
+  ] ++ lib.optionals stdenv.isLinux [
+    # Propagate CUPTI to Kineto by overriding the search path with environment variables.
+    # https://github.com/pytorch/pytorch/pull/108847
+    ./pytorch-pr-108847.patch
+  ];
+
+  postPatch = lib.optionalString rocmSupport ''
+    # https://github.com/facebookincubator/gloo/pull/297
+    substituteInPlace third_party/gloo/cmake/Hipify.cmake \
+      --replace "\''${HIPIFY_COMMAND}" "python \''${HIPIFY_COMMAND}"
+
+    # Replace hard-coded rocm paths
+    substituteInPlace caffe2/CMakeLists.txt \
+      --replace "/opt/rocm" "${rocmtoolkit_joined}" \
+      --replace "hcc/include" "hip/include" \
+      --replace "rocblas/include" "include/rocblas" \
+      --replace "hipsparse/include" "include/hipsparse"
+
+    # Doesn't pick up the environment variable?
+    substituteInPlace third_party/kineto/libkineto/CMakeLists.txt \
+      --replace "\''$ENV{ROCM_SOURCE_DIR}" "${rocmtoolkit_joined}" \
+      --replace "/opt/rocm" "${rocmtoolkit_joined}"
+
+    # Strangely, this is never set in cmake
+    substituteInPlace cmake/public/LoadHIP.cmake \
+      --replace "set(ROCM_PATH \$ENV{ROCM_PATH})" \
+        "set(ROCM_PATH \$ENV{ROCM_PATH})''\nset(ROCM_VERSION ${lib.concatStrings (lib.intersperse "0" (lib.splitString "." rocmPackages.clr.version))})"
+  ''
+  # Detection of NCCL version doesn't work particularly well when using the static binary.
+  + lib.optionalString cudaSupport ''
+    substituteInPlace cmake/Modules/FindNCCL.cmake \
+      --replace \
+        'message(FATAL_ERROR "Found NCCL header version and library version' \
+        'message(WARNING "Found NCCL header version and library version'
+  ''
+  # Remove PyTorch's FindCUDAToolkit.cmake and to use CMake's default.
+  # We do not remove the entirety of cmake/Modules_CUDA_fix because we need FindCUDNN.cmake.
+  + lib.optionalString cudaSupport ''
+    rm cmake/Modules/FindCUDAToolkit.cmake
+    rm -rf cmake/Modules_CUDA_fix/{upstream,FindCUDA.cmake}
+  ''
+  # error: no member named 'aligned_alloc' in the global namespace; did you mean simply 'aligned_alloc'
+  # This lib overrided aligned_alloc hence the error message. Tltr: his function is linkable but not in header.
+  + lib.optionalString (stdenv.isDarwin && lib.versionOlder stdenv.hostPlatform.darwinSdkVersion "11.0") ''
+    substituteInPlace third_party/pocketfft/pocketfft_hdronly.h --replace '#if __cplusplus >= 201703L
+    inline void *aligned_alloc(size_t align, size_t size)' '#if __cplusplus >= 201703L && 0
+    inline void *aligned_alloc(size_t align, size_t size)'
+  '';
+
+  # NOTE(@connorbaker): Though we do not disable Gloo or MPI when building with CUDA support, caution should be taken
+  # when using the different backends. Gloo's GPU support isn't great, and MPI and CUDA can't be used at the same time
+  # without extreme care to ensure they don't lock each other out of shared resources.
+  # For more, see https://github.com/open-mpi/ompi/issues/7733#issuecomment-629806195.
+  preConfigure = lib.optionalString cudaSupport ''
+    export TORCH_CUDA_ARCH_LIST="${gpuTargetString}"
+    export CUDNN_INCLUDE_DIR=${cudnn.dev}/include
+    export CUDNN_LIB_DIR=${cudnn.lib}/lib
+    export CUPTI_INCLUDE_DIR=${cudaPackages.cuda_cupti.dev}/include
+    export CUPTI_LIBRARY_DIR=${cudaPackages.cuda_cupti.lib}/lib
+  '' + lib.optionalString rocmSupport ''
+    export ROCM_PATH=${rocmtoolkit_joined}
+    export ROCM_SOURCE_DIR=${rocmtoolkit_joined}
+    export PYTORCH_ROCM_ARCH="${gpuTargetString}"
+    export CMAKE_CXX_FLAGS="-I${rocmtoolkit_joined}/include -I${rocmtoolkit_joined}/include/rocblas"
+    python tools/amd_build/build_amd.py
+  '';
+
+  # Use pytorch's custom configurations
+  dontUseCmakeConfigure = true;
+
+  # causes possible redefinition of _FORTIFY_SOURCE
+  hardeningDisable = [ "fortify3" ];
+
+  BUILD_NAMEDTENSOR = setBool true;
+  BUILD_DOCS = setBool buildDocs;
+
+  # We only do an imports check, so do not build tests either.
+  BUILD_TEST = setBool false;
+
+  # Unlike MKL, oneDNN (née MKLDNN) is FOSS, so we enable support for
+  # it by default. PyTorch currently uses its own vendored version
+  # of oneDNN through Intel iDeep.
+  USE_MKLDNN = setBool mklDnnSupport;
+  USE_MKLDNN_CBLAS = setBool mklDnnSupport;
+
+  # Avoid using pybind11 from git submodule
+  # Also avoids pytorch exporting the headers of pybind11
+  USE_SYSTEM_PYBIND11 = true;
+
+  preBuild = ''
+    export MAX_JOBS=$NIX_BUILD_CORES
+    ${python.pythonOnBuildForHost.interpreter} setup.py build --cmake-only
+    ${cmake}/bin/cmake build
+  '';
+
+  preFixup = ''
+    function join_by { local IFS="$1"; shift; echo "$*"; }
+    function strip2 {
+      IFS=':'
+      read -ra RP <<< $(patchelf --print-rpath $1)
+      IFS=' '
+      RP_NEW=$(join_by : ''${RP[@]:2})
+      patchelf --set-rpath \$ORIGIN:''${RP_NEW} "$1"
+    }
+    for f in $(find ''${out} -name 'libcaffe2*.so')
+    do
+      strip2 $f
+    done
+  '';
+
+  # Override the (weirdly) wrong version set by default. See
+  # https://github.com/NixOS/nixpkgs/pull/52437#issuecomment-449718038
+  # https://github.com/pytorch/pytorch/blob/v1.0.0/setup.py#L267
+  PYTORCH_BUILD_VERSION = version;
+  PYTORCH_BUILD_NUMBER = 0;
+
+  USE_NCCL = setBool (nccl != null);
+  USE_SYSTEM_NCCL = setBool useSystemNccl;                  # don't build pytorch's third_party NCCL
+  USE_STATIC_NCCL = setBool useSystemNccl;
+
+  # Suppress a weird warning in mkl-dnn, part of ideep in pytorch
+  # (upstream seems to have fixed this in the wrong place?)
+  # https://github.com/intel/mkl-dnn/commit/8134d346cdb7fe1695a2aa55771071d455fae0bc
+  # https://github.com/pytorch/pytorch/issues/22346
+  #
+  # Also of interest: pytorch ignores CXXFLAGS uses CFLAGS for both C and C++:
+  # https://github.com/pytorch/pytorch/blob/v1.11.0/setup.py#L17
+  env.NIX_CFLAGS_COMPILE = toString ((lib.optionals (blas.implementation == "mkl") [ "-Wno-error=array-bounds" ]
+  # Suppress gcc regression: avx512 math function raises uninitialized variable warning
+  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105593
+  # See also: Fails to compile with GCC 12.1.0 https://github.com/pytorch/pytorch/issues/77939
+  ++ lib.optionals (stdenv.cc.isGNU && lib.versionAtLeast stdenv.cc.version "12.0.0") [
+    "-Wno-error=maybe-uninitialized"
+    "-Wno-error=uninitialized"
+  ]
+  # Since pytorch 2.0:
+  # gcc-12.2.0/include/c++/12.2.0/bits/new_allocator.h:158:33: error: ‘void operator delete(void*, std::size_t)’
+  # ... called on pointer ‘<unknown>’ with nonzero offset [1, 9223372036854775800] [-Werror=free-nonheap-object]
+  ++ lib.optionals (stdenv.cc.isGNU && lib.versions.major stdenv.cc.version == "12" ) [
+    "-Wno-error=free-nonheap-object"
+  ]
+  # .../source/torch/csrc/autograd/generated/python_functions_0.cpp:85:3:
+  # error: cast from ... to ... converts to incompatible function type [-Werror,-Wcast-function-type-strict]
+  ++ lib.optionals (stdenv.cc.isClang && lib.versionAtLeast stdenv.cc.version "16") [
+    "-Wno-error=cast-function-type-strict"
+  # Suppresses the most spammy warnings.
+  # This is mainly to fix https://github.com/NixOS/nixpkgs/issues/266895.
+  ] ++ lib.optionals rocmSupport [
+    "-Wno-#warnings"
+    "-Wno-cpp"
+    "-Wno-unknown-warning-option"
+    "-Wno-ignored-attributes"
+    "-Wno-deprecated-declarations"
+    "-Wno-defaulted-function-deleted"
+    "-Wno-pass-failed"
+  ] ++ [
+    "-Wno-unused-command-line-argument"
+    "-Wno-uninitialized"
+    "-Wno-array-bounds"
+    "-Wno-free-nonheap-object"
+    "-Wno-unused-result"
+  ] ++ lib.optionals stdenv.cc.isGNU [
+    "-Wno-maybe-uninitialized"
+    "-Wno-stringop-overflow"
+  ]));
+
+  nativeBuildInputs = [
+    cmake
+    which
+    ninja
+    pybind11
+    pythonRelaxDepsHook
+    removeReferencesTo
+  ] ++ lib.optionals cudaSupport (with cudaPackages; [
+    autoAddOpenGLRunpathHook
+    cuda_nvcc
+  ])
+  ++ lib.optionals rocmSupport [ rocmtoolkit_joined ];
+
+  buildInputs = [ blas blas.provider ]
+    ++ lib.optionals cudaSupport (with cudaPackages; [
+      cuda_cccl.dev # <thrust/*>
+      cuda_cudart # cuda_runtime.h and libraries
+      cuda_cupti.dev # For kineto
+      cuda_cupti.lib # For kineto
+      cuda_nvcc.dev # crt/host_config.h; even though we include this in nativeBuildinputs, it's needed here too
+      cuda_nvml_dev.dev # <nvml.h>
+      cuda_nvrtc.dev
+      cuda_nvrtc.lib
+      cuda_nvtx.dev
+      cuda_nvtx.lib # -llibNVToolsExt
+      cudnn.dev
+      cudnn.lib
+      libcublas.dev
+      libcublas.lib
+      libcufft.dev
+      libcufft.lib
+      libcurand.dev
+      libcurand.lib
+      libcusolver.dev
+      libcusolver.lib
+      libcusparse.dev
+      libcusparse.lib
+    ] ++ lists.optionals (nccl != null) [
+      # Some platforms do not support NCCL (i.e., Jetson)
+      nccl.dev # Provides nccl.h AND a static copy of NCCL!
+    ] ++ lists.optionals (strings.versionOlder cudaVersion "11.8") [
+      cuda_nvprof.dev # <cuda_profiler_api.h>
+    ] ++ lists.optionals (strings.versionAtLeast cudaVersion "11.8") [
+      cuda_profiler_api.dev # <cuda_profiler_api.h>
+    ])
+    ++ lib.optionals rocmSupport [ rocmPackages.llvm.openmp ]
+    ++ lib.optionals (cudaSupport || rocmSupport) [ effectiveMagma ]
+    ++ lib.optionals stdenv.isLinux [ numactl ]
+    ++ lib.optionals stdenv.isDarwin [ Accelerate CoreServices libobjc ];
+
+  propagatedBuildInputs = [
+    cffi
+    click
+    numpy
+    pyyaml
+
+    # From install_requires:
+    fsspec
+    filelock
+    typing-extensions
+    sympy
+    networkx
+    jinja2
+
+    # the following are required for tensorboard support
+    pillow six future tensorboard protobuf
+
+    # torch/csrc requires `pybind11` at runtime
+    pybind11
+  ]
+  ++ lib.optionals tritonSupport [ openai-triton ]
+  ++ lib.optionals MPISupport [ mpi ]
+  ++ lib.optionals rocmSupport [ rocmtoolkit_joined ];
+
+  # Tests take a long time and may be flaky, so just sanity-check imports
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "torch"
+  ];
+
+  nativeCheckInputs = [ hypothesis ninja psutil ];
+
+  checkPhase = with lib.versions; with lib.strings; concatStringsSep " " [
+    "runHook preCheck"
+    "${python.interpreter} test/run_test.py"
+    "--exclude"
+    (concatStringsSep " " [
+      "utils" # utils requires git, which is not allowed in the check phase
+
+      # "dataloader" # psutils correctly finds and triggers multiprocessing, but is too sandboxed to run -- resulting in numerous errors
+      # ^^^^^^^^^^^^ NOTE: while test_dataloader does return errors, these are acceptable errors and do not interfere with the build
+
+      # tensorboard has acceptable failures for pytorch 1.3.x due to dependencies on tensorboard-plugins
+      (optionalString (majorMinor version == "1.3" ) "tensorboard")
+    ])
+    "runHook postCheck"
+  ];
+
+  pythonRemoveDeps = [
+    # In our dist-info the name is just "triton"
+    "pytorch-triton-rocm"
+  ];
+
+  postInstall = ''
+    find "$out/${python.sitePackages}/torch/include" "$out/${python.sitePackages}/torch/lib" -type f -exec remove-references-to -t ${stdenv.cc} '{}' +
+
+    mkdir $dev
+    cp -r $out/${python.sitePackages}/torch/include $dev/include
+    cp -r $out/${python.sitePackages}/torch/share $dev/share
+
+    # Fix up library paths for split outputs
+    substituteInPlace \
+      $dev/share/cmake/Torch/TorchConfig.cmake \
+      --replace \''${TORCH_INSTALL_PREFIX}/lib "$lib/lib"
+
+    substituteInPlace \
+      $dev/share/cmake/Caffe2/Caffe2Targets-release.cmake \
+      --replace \''${_IMPORT_PREFIX}/lib "$lib/lib"
+
+    mkdir $lib
+    mv $out/${python.sitePackages}/torch/lib $lib/lib
+    ln -s $lib/lib $out/${python.sitePackages}/torch/lib
+  '' + lib.optionalString rocmSupport ''
+    substituteInPlace $dev/share/cmake/Tensorpipe/TensorpipeTargets-release.cmake \
+      --replace "\''${_IMPORT_PREFIX}/lib64" "$lib/lib"
+
+    substituteInPlace $dev/share/cmake/ATen/ATenConfig.cmake \
+      --replace "/build/source/torch/include" "$dev/include"
+  '';
+
+  postFixup = lib.optionalString stdenv.isDarwin ''
+    for f in $(ls $lib/lib/*.dylib); do
+        install_name_tool -id $lib/lib/$(basename $f) $f || true
+    done
+
+    install_name_tool -change @rpath/libshm.dylib $lib/lib/libshm.dylib $lib/lib/libtorch_python.dylib
+    install_name_tool -change @rpath/libtorch.dylib $lib/lib/libtorch.dylib $lib/lib/libtorch_python.dylib
+    install_name_tool -change @rpath/libc10.dylib $lib/lib/libc10.dylib $lib/lib/libtorch_python.dylib
+
+    install_name_tool -change @rpath/libc10.dylib $lib/lib/libc10.dylib $lib/lib/libtorch.dylib
+
+    install_name_tool -change @rpath/libtorch.dylib $lib/lib/libtorch.dylib $lib/lib/libshm.dylib
+    install_name_tool -change @rpath/libc10.dylib $lib/lib/libc10.dylib $lib/lib/libshm.dylib
+  '';
+
+  # Builds in 2+h with 2 cores, and ~15m with a big-parallel builder.
+  requiredSystemFeatures = [ "big-parallel" ];
+
+  passthru = {
+    inherit cudaSupport cudaPackages;
+    # At least for 1.10.2 `torch.fft` is unavailable unless BLAS provider is MKL. This attribute allows for easy detection of its availability.
+    blasProvider = blas.provider;
+    # To help debug when a package is broken due to CUDA support
+    inherit brokenConditions;
+    cudaCapabilities = if cudaSupport then supportedCudaCapabilities else [ ];
+  };
+
+  meta = with lib; {
+    changelog = "https://github.com/pytorch/pytorch/releases/tag/v${version}";
+    # keep PyTorch in the description so the package can be found under that name on search.nixos.org
+    description = "PyTorch: Tensors and Dynamic neural networks in Python with strong GPU acceleration";
+    homepage = "https://pytorch.org/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ teh thoughtpolice tscholak ]; # tscholak esp. for darwin-related builds
+    platforms = with platforms; linux ++ lib.optionals (!cudaSupport && !rocmSupport) darwin;
+    broken = builtins.any trivial.id (builtins.attrValues brokenConditions);
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/torch/fix-cmake-cuda-toolkit.patch b/nixpkgs/pkgs/development/python-modules/torch/fix-cmake-cuda-toolkit.patch
new file mode 100644
index 000000000000..508118cc2e8a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torch/fix-cmake-cuda-toolkit.patch
@@ -0,0 +1,65 @@
+From aa7e7cfd5a5fe0c839406c1b197b81ef955a7ef5 Mon Sep 17 00:00:00 2001
+From: Gaetan Lepage <gaetan@glepage.com>
+Date: Thu, 23 Nov 2023 00:39:26 +0100
+Subject: [PATCH] fix-cmake-cuda-toolkit
+
+---
+ CMakeLists.txt               |  4 ----
+ cmake/public/cuda.cmake      | 12 +++++++++---
+ tools/setup_helpers/cmake.py |  2 ++
+ 3 files changed, 11 insertions(+), 7 deletions(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 3a48eaf4e29..3aaeef2593a 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -1152,10 +1152,6 @@ if(BUILD_SHARED_LIBS)
+       ${PROJECT_SOURCE_DIR}/cmake/Modules_CUDA_fix
+       DESTINATION share/cmake/Caffe2/
+       COMPONENT dev)
+-  install(FILES
+-      ${PROJECT_SOURCE_DIR}/cmake/Modules/FindCUDAToolkit.cmake
+-      DESTINATION share/cmake/Caffe2/
+-      COMPONENT dev)
+   install(FILES
+       ${PROJECT_SOURCE_DIR}/cmake/Modules/FindCUSPARSELT.cmake
+       DESTINATION share/cmake/Caffe2/
+diff --git a/cmake/public/cuda.cmake b/cmake/public/cuda.cmake
+index 32f3ba375b5..c8b666e4c78 100644
+--- a/cmake/public/cuda.cmake
++++ b/cmake/public/cuda.cmake
+@@ -62,9 +62,15 @@ cmake_policy(POP)
+ 
+ if(NOT CMAKE_CUDA_COMPILER_VERSION STREQUAL CUDAToolkit_VERSION OR
+     NOT CUDA_INCLUDE_DIRS STREQUAL CUDAToolkit_INCLUDE_DIR)
+-  message(FATAL_ERROR "Found two conflicting CUDA installs:\n"
+-                      "V${CMAKE_CUDA_COMPILER_VERSION} in '${CUDA_INCLUDE_DIRS}' and\n"
+-                      "V${CUDAToolkit_VERSION} in '${CUDAToolkit_INCLUDE_DIR}'")
++  if(CUDA_INCLUDE_DIRS IN_LIST CUDAToolkit_INCLUDE_DIR)
++    message(STATUS "CUDA_INCLUDE_DIRS is a substring of CUDAToolkit_INCLUDE_DIR. "
++                   "Setting CUDA_INCLUDE_DIRS to CUDAToolkit_INCLUDE_DIR.")
++    set(CUDA_INCLUDE_DIRS "${CUDAToolkit_INCLUDE_DIR}")
++  else()
++    message(FATAL_ERROR "Found two conflicting CUDA installs:\n"
++                        "V${CMAKE_CUDA_COMPILER_VERSION} in '${CUDA_INCLUDE_DIRS}' and\n"
++                        "V${CUDAToolkit_VERSION} in '${CUDAToolkit_INCLUDE_DIR}'")
++  endif()
+ endif()
+ 
+ if(NOT TARGET CUDA::nvToolsExt)
+diff --git a/tools/setup_helpers/cmake.py b/tools/setup_helpers/cmake.py
+index fb19b66dfba..3f83bef32fe 100644
+--- a/tools/setup_helpers/cmake.py
++++ b/tools/setup_helpers/cmake.py
+@@ -207,6 +207,8 @@ class CMake:
+                     "BUILDING_WITH_TORCH_LIBS",
+                     "CUDA_HOST_COMPILER",
+                     "CUDA_NVCC_EXECUTABLE",
++                    "CUDAToolkit_ROOT",
++                    "CUDAToolkit_INCLUDE_DIR",
+                     "CUDA_SEPARABLE_COMPILATION",
+                     "CUDNN_LIBRARY",
+                     "CUDNN_INCLUDE_DIR",
+-- 
+2.42.0
+
diff --git a/nixpkgs/pkgs/development/python-modules/torch/prefetch.sh b/nixpkgs/pkgs/development/python-modules/torch/prefetch.sh
new file mode 100755
index 000000000000..7b9c26de35f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torch/prefetch.sh
@@ -0,0 +1,53 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i bash -p nix-prefetch-scripts
+
+set -eou pipefail
+
+version=$1
+
+linux_cuda_version="cu121"
+linux_cuda_bucket="https://download.pytorch.org/whl/${linux_cuda_version}"
+linux_cpu_bucket="https://download.pytorch.org/whl/cpu"
+darwin_bucket="https://download.pytorch.org/whl/cpu"
+
+url_and_key_list=(
+  "x86_64-linux-38 $linux_cuda_bucket/torch-${version}%2B${linux_cuda_version}-cp38-cp38-linux_x86_64.whl torch-${version}-cp38-cp38-linux_x86_64.whl"
+  "x86_64-linux-39 $linux_cuda_bucket/torch-${version}%2B${linux_cuda_version}-cp39-cp39-linux_x86_64.whl torch-${version}-cp39-cp39-linux_x86_64.whl"
+  "x86_64-linux-310 $linux_cuda_bucket/torch-${version}%2B${linux_cuda_version}-cp310-cp310-linux_x86_64.whl torch-${version}-cp310-cp310-linux_x86_64.whl"
+  "x86_64-linux-311 $linux_cuda_bucket/torch-${version}%2B${linux_cuda_version}-cp311-cp311-linux_x86_64.whl torch-${version}-cp311-cp311-linux_x86_64.whl"
+  "x86_64-darwin-38 $darwin_bucket/torch-${version}-cp38-none-macosx_10_9_x86_64.whl torch-${version}-cp38-none-macosx_10_9_x86_64.whl"
+  "x86_64-darwin-39 $darwin_bucket/torch-${version}-cp39-none-macosx_10_9_x86_64.whl torch-${version}-cp39-none-macosx_10_9_x86_64.whl"
+  "x86_64-darwin-310 $darwin_bucket/torch-${version}-cp310-none-macosx_10_9_x86_64.whl torch-${version}-cp310-none-macosx_10_9_x86_64.whl"
+  "x86_64-darwin-311 $darwin_bucket/torch-${version}-cp311-none-macosx_10_9_x86_64.whl torch-${version}-cp311-none-macosx_10_9_x86_64.whl"
+  "aarch64-darwin-38 $darwin_bucket/torch-${version}-cp38-none-macosx_11_0_arm64.whl torch-${version}-cp38-none-macosx_11_0_arm64.whl"
+  "aarch64-darwin-39 $darwin_bucket/torch-${version}-cp39-none-macosx_11_0_arm64.whl torch-${version}-cp39-none-macosx_11_0_arm64.whl"
+  "aarch64-darwin-310 $darwin_bucket/torch-${version}-cp310-none-macosx_11_0_arm64.whl torch-${version}-cp310-none-macosx_11_0_arm64.whl"
+  "aarch64-darwin-311 $darwin_bucket/torch-${version}-cp311-none-macosx_11_0_arm64.whl torch-${version}-cp311-none-macosx_11_0_arm64.whl"
+  "aarch64-linux-38 $linux_cpu_bucket/torch-${version}-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl torch-${version}-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl"
+  "aarch64-linux-39 $linux_cpu_bucket/torch-${version}-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl torch-${version}-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl"
+  "aarch64-linux-310 $linux_cpu_bucket/torch-${version}-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl torch-${version}-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl"
+  "aarch64-linux-311 $linux_cpu_bucket/torch-${version}-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl torch-${version}-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl"
+)
+
+hashfile="binary-hashes-$version.nix"
+echo "  \"$version\" = {" >> $hashfile
+
+for url_and_key in "${url_and_key_list[@]}"; do
+  key=$(echo "$url_and_key" | cut -d' ' -f1)
+  url=$(echo "$url_and_key" | cut -d' ' -f2)
+  name=$(echo "$url_and_key" | cut -d' ' -f3)
+
+  echo "prefetching ${url}..."
+  hash=$(nix hash to-sri --type sha256 `nix-prefetch-url "$url" --name "$name"`)
+
+  echo "    $key = {" >> $hashfile
+  echo "      name = \"$name\";" >> $hashfile
+  echo "      url = \"$url\";" >> $hashfile
+  echo "      hash = \"$hash\";" >> $hashfile
+  echo "    };" >> $hashfile
+
+  echo
+done
+
+echo "  };" >> $hashfile
+echo "done."
diff --git a/nixpkgs/pkgs/development/python-modules/torch/pthreadpool-disable-gcd.diff b/nixpkgs/pkgs/development/python-modules/torch/pthreadpool-disable-gcd.diff
new file mode 100644
index 000000000000..eddd45723f8b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torch/pthreadpool-disable-gcd.diff
@@ -0,0 +1,45 @@
+diff --git a/third_party/pthreadpool/CMakeLists.txt b/third_party/pthreadpool/CMakeLists.txt
+index 0db3264..1ba91c4 100644
+--- a/third_party/pthreadpool/CMakeLists.txt
++++ b/third_party/pthreadpool/CMakeLists.txt
+@@ -74,9 +74,7 @@ IF(EMSCRIPTEN)
+   LIST(APPEND PTHREADPOOL_SRCS src/shim.c)
+ ELSE()
+   LIST(APPEND PTHREADPOOL_SRCS src/portable-api.c src/memory.c)
+-  IF(APPLE AND (PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "default" OR PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "gcd"))
+-    LIST(APPEND PTHREADPOOL_SRCS src/gcd.c)
+-  ELSEIF(CMAKE_SYSTEM_NAME MATCHES "^(Windows|CYGWIN|MSYS)$" AND (PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "default" OR PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "event"))
++  IF(CMAKE_SYSTEM_NAME MATCHES "^(Windows|CYGWIN|MSYS)$" AND (PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "default" OR PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "event"))
+     LIST(APPEND PTHREADPOOL_SRCS src/windows.c)
+   ELSE()
+     LIST(APPEND PTHREADPOOL_SRCS src/pthreads.c)
+@@ -111,10 +109,6 @@ ELSEIF(PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "futex")
+   TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_FUTEX=1)
+   TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_GCD=0)
+   TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_EVENT=0)
+-ELSEIF(PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "gcd")
+-  TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_FUTEX=0)
+-  TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_GCD=1)
+-  TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_EVENT=0)
+ ELSEIF(PTHREADPOOL_SYNC_PRIMITIVE STREQUAL "event")
+   TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_FUTEX=0)
+   TARGET_COMPILE_DEFINITIONS(pthreadpool PRIVATE PTHREADPOOL_USE_GCD=0)
+diff --git a/third_party/pthreadpool/src/threadpool-common.h b/third_party/pthreadpool/src/threadpool-common.h
+index ca84744..244d0ca 100644
+--- a/third_party/pthreadpool/src/threadpool-common.h
++++ b/third_party/pthreadpool/src/threadpool-common.h
+@@ -14,14 +14,6 @@
+ 	#endif
+ #endif
+ 
+-#ifndef PTHREADPOOL_USE_GCD
+-	#if defined(__APPLE__)
+-		#define PTHREADPOOL_USE_GCD 1
+-	#else
+-		#define PTHREADPOOL_USE_GCD 0
+-	#endif
+-#endif
+-
+ #ifndef PTHREADPOOL_USE_EVENT
+ 	#if defined(_WIN32) || defined(__CYGWIN__)
+ 		#define PTHREADPOOL_USE_EVENT 1
diff --git a/nixpkgs/pkgs/development/python-modules/torch/pytorch-pr-108847.patch b/nixpkgs/pkgs/development/python-modules/torch/pytorch-pr-108847.patch
new file mode 100644
index 000000000000..9511191ca926
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torch/pytorch-pr-108847.patch
@@ -0,0 +1,31 @@
+From bf4050edab9f294a8e0060c47f906cd7a80f25a2 Mon Sep 17 00:00:00 2001
+From: Samuel Ainsworth <skainsworth@gmail.com>
+Date: Sat, 9 Sep 2023 02:04:09 +0000
+Subject: [PATCH] Dependencies.cmake: support building against CUPTI outside of
+ CUDA_SOURCE_DIR
+
+Limitation discovered in https://github.com/NixOS/nixpkgs/pull/249259.
+---
+ cmake/Dependencies.cmake | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/cmake/Dependencies.cmake b/cmake/Dependencies.cmake
+index 0602d534dc4c14..5f6a5f79f3e3dc 100644
+--- a/cmake/Dependencies.cmake
++++ b/cmake/Dependencies.cmake
+@@ -1879,6 +1879,7 @@ if(USE_KINETO)
+         ${CUDA_SOURCE_DIR}/extras/CUPTI/lib64
+         ${CUDA_SOURCE_DIR}/lib
+         ${CUDA_SOURCE_DIR}/lib64
++        $ENV{CUPTI_LIBRARY_DIR}
+         NO_DEFAULT_PATH)
+ 
+     find_path(CUPTI_INCLUDE_DIR cupti.h PATHS
+@@ -1886,6 +1887,7 @@ if(USE_KINETO)
+         ${CUDA_INCLUDE_DIRS}
+         ${CUDA_SOURCE_DIR}
+         ${CUDA_SOURCE_DIR}/include
++        $ENV{CUPTI_INCLUDE_DIR}
+         NO_DEFAULT_PATH)
+ 
+     if(CUPTI_LIBRARY_PATH AND CUPTI_INCLUDE_DIR)
diff --git a/nixpkgs/pkgs/development/python-modules/torchaudio/bin.nix b/nixpkgs/pkgs/development/python-modules/torchaudio/bin.nix
new file mode 100644
index 000000000000..5ad263a8df67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchaudio/bin.nix
@@ -0,0 +1,78 @@
+{ lib
+, stdenv
+, addOpenGLRunpath
+, autoPatchelfHook
+, buildPythonPackage
+, cudaPackages
+, fetchurl
+, ffmpeg_4
+, ffmpeg_5
+, ffmpeg_6
+, sox
+, pythonAtLeast
+, pythonOlder
+, python
+, torch-bin
+}:
+
+buildPythonPackage rec {
+  pname = "torchaudio";
+  version = "2.1.1";
+  format = "wheel";
+
+  src =
+    let pyVerNoDot = lib.replaceStrings [ "." ] [ "" ] python.pythonVersion;
+        unsupported = throw "Unsupported system";
+        srcs = (import ./binary-hashes.nix version)."${stdenv.system}-${pyVerNoDot}" or unsupported;
+    in
+    fetchurl srcs;
+
+  disabled = (pythonOlder "3.8") || (pythonAtLeast "3.12");
+
+  buildInputs = with cudaPackages; [
+    # $out/${sitePackages}/torchaudio/lib/libtorchaudio*.so wants libcudart.so.11.0 but torch/lib only ships
+    # libcudart.$hash.so.11.0
+    cuda_cudart
+
+    # $out/${sitePackages}/torchaudio/lib/libtorchaudio*.so wants libnvToolsExt.so.2 but torch/lib only ships
+    # libnvToolsExt-$hash.so.1
+    cuda_nvtx
+
+    # We need to patch the lib/_torchaudio_ffmpeg[4-6]
+    ffmpeg_4.dev
+    ffmpeg_5.dev
+    ffmpeg_6.dev
+    sox
+  ];
+
+  nativeBuildInputs = [
+    autoPatchelfHook
+    addOpenGLRunpath
+  ];
+
+  propagatedBuildInputs = [
+    torch-bin
+  ];
+
+  preInstall = ''
+    addAutoPatchelfSearchPath "${torch-bin}/${python.sitePackages}/torch"
+  '';
+
+  # The wheel-binary is not stripped to avoid the error of `ImportError: libtorch_cuda_cpp.so: ELF load command address/offset not properly aligned.`.
+  dontStrip = true;
+
+  pythonImportsCheck = [ "torchaudio" ];
+
+  meta = with lib; {
+    description = "PyTorch audio library";
+    homepage = "https://pytorch.org/";
+    changelog = "https://github.com/pytorch/audio/releases/tag/v${version}";
+    # Includes CUDA and Intel MKL, but redistributions of the binary are not limited.
+    # https://docs.nvidia.com/cuda/eula/index.html
+    # https://www.intel.com/content/www/us/en/developer/articles/license/onemkl-license-faq.html
+    license = licenses.bsd3;
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    platforms = [ "aarch64-linux" "x86_64-linux" "aarch64-darwin" "x86_64-darwin" ];
+    maintainers = with maintainers; [ junjihashimoto ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/torchaudio/binary-hashes.nix b/nixpkgs/pkgs/development/python-modules/torchaudio/binary-hashes.nix
new file mode 100644
index 000000000000..21241253da3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchaudio/binary-hashes.nix
@@ -0,0 +1,91 @@
+# Warning: Need to update at the same time as torch-bin
+#
+# Precompiled wheels can be found at:
+# https://download.pytorch.org/whl/torch_stable.html
+
+# To add a new version, run "prefetch.sh 'new-version'" to paste the generated file as follows.
+
+version : builtins.getAttr version {
+  "2.1.1" = {
+    x86_64-linux-38 = {
+      name = "torchaudio-2.1.1-cp38-cp38-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu121/torchaudio-2.1.1%2Bcu121-cp38-cp38-linux_x86_64.whl";
+      hash = "sha256-GM8TlEbiLP2K+jglzkkvPPEf00LxcI7o9K+EtIKLTGA=";
+    };
+    x86_64-linux-39 = {
+      name = "torchaudio-2.1.1-cp39-cp39-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu121/torchaudio-2.1.1%2Bcu121-cp39-cp39-linux_x86_64.whl";
+      hash = "sha256-4YdH1mdew+TFmvpA23Lp5+pNcVy5KxQ9pV31lhPAPTA=";
+    };
+    x86_64-linux-310 = {
+      name = "torchaudio-2.1.1-cp310-cp310-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu121/torchaudio-2.1.1%2Bcu121-cp310-cp310-linux_x86_64.whl";
+      hash = "sha256-7/gmDgL4imlKlksrtvY3pq8xB3h9kH6uflgBgWAzv6c=";
+    };
+    x86_64-linux-311 = {
+      name = "torchaudio-2.1.1-cp311-cp311-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu121/torchaudio-2.1.1%2Bcu121-cp311-cp311-linux_x86_64.whl";
+      hash = "sha256-qq2dkQ5CDBlVsIpa8yatlplLitDQWW/L9gGxVYDof6c=";
+    };
+    x86_64-darwin-38 = {
+      name = "torchaudio-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torchaudio-2.1.1-cp38-cp38-macosx_10_13_x86_64.whl";
+      hash = "sha256-b8d8SNB5zSbvQMYTqm8xxcePD4FiEWYqJ4Vsf1RPHMw=";
+    };
+    x86_64-darwin-39 = {
+      name = "torchaudio-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torchaudio-2.1.1-cp39-cp39-macosx_10_13_x86_64.whl";
+      hash = "sha256-f/BYndc9vepm7SHIF8ttHvjs0+6EmXrqf8DjUroWjkg=";
+    };
+    x86_64-darwin-310 = {
+      name = "torchaudio-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torchaudio-2.1.1-cp310-cp310-macosx_10_13_x86_64.whl";
+      hash = "sha256-JPpYcPYgmU5FiEUtVO3LL/tfUJ1+42ugToxo6yiv/Io=";
+    };
+    x86_64-darwin-311 = {
+      name = "torchaudio-2.1.1-cp311-cp311-macosx_10_9_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torchaudio-2.1.1-cp311-cp311-macosx_10_13_x86_64.whl";
+      hash = "sha256-7j9/B9sCOprjYGpjDbRyJ+d/IOYEyZQGdnzsWKE5uW4=";
+    };
+    aarch64-darwin-38 = {
+      name = "torchaudio-2.1.1-cp38-cp38-macosx_11_0_arm64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torchaudio-2.1.1-cp38-cp38-macosx_11_0_arm64.whl";
+      hash = "sha256-L+SgvGuooE9xrLxmT93CtzY3y/G+NFxkM0KprtNDVDo=";
+    };
+    aarch64-darwin-39 = {
+      name = "torchaudio-2.1.1-cp39-cp39-macosx_11_0_arm64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torchaudio-2.1.1-cp39-cp39-macosx_11_0_arm64.whl";
+      hash = "sha256-VwmUP7JnXIVDvrYfAz+50AGr8VXxUJrzPhO8uD9UPQo=";
+    };
+    aarch64-darwin-310 = {
+      name = "torchaudio-2.1.1-cp310-cp310-macosx_11_0_arm64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torchaudio-2.1.1-cp310-cp310-macosx_11_0_arm64.whl";
+      hash = "sha256-fNRlvgb9OHNq2n1MCG8M3SSd4ot1ddEDXOJd+ziW+kw=";
+    };
+    aarch64-darwin-311 = {
+      name = "torchaudio-2.1.1-cp311-cp311-macosx_11_0_arm64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torchaudio-2.1.1-cp311-cp311-macosx_11_0_arm64.whl";
+      hash = "sha256-+tHGDPveoxu7KgDk0fFTYEYG3N00vJdPQ8YvpuJpYns=";
+    };
+    aarch64-linux-38 = {
+      name = "torchaudio-2.1.1-cp38-cp38-manylinux2014_aarch64.whl";
+      url = "https://download.pytorch.org/whl/torchaudio-2.1.1-cp38-cp38-linux_aarch64.whl";
+      hash = "sha256-bnhAF5QfPoGtvvJGIkqT1eXSZocF3NxFlWZo3nuiLTI=";
+    };
+    aarch64-linux-39 = {
+      name = "torchaudio-2.1.1-cp39-cp39-manylinux2014_aarch64.whl";
+      url = "https://download.pytorch.org/whl/torchaudio-2.1.1-cp39-cp39-linux_aarch64.whl";
+      hash = "sha256-FXE1qdeNwSe7J0XEZUqn6hQd3Huzn8rSHf+Oq6VXihQ=";
+    };
+    aarch64-linux-310 = {
+      name = "torchaudio-2.1.1-cp310-cp310-manylinux2014_aarch64.whl";
+      url = "https://download.pytorch.org/whl/torchaudio-2.1.1-cp310-cp310-linux_aarch64.whl";
+      hash = "sha256-dK3UoOX6BJmO1SoBN9Ox2cKtJdqCEsRt8O1z+h0Uanc=";
+    };
+    aarch64-linux-311 = {
+      name = "torchaudio-2.1.1-cp311-cp311-manylinux2014_aarch64.whl";
+      url = "https://download.pytorch.org/whl/torchaudio-2.1.1-cp311-cp311-linux_aarch64.whl";
+      hash = "sha256-6toEKY1TfF0CddoRIsRxmMF31CYetaXSI24Rqg6FyB8=";
+    };
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/torchaudio/default.nix b/nixpkgs/pkgs/development/python-modules/torchaudio/default.nix
new file mode 100644
index 000000000000..4ff44d123a48
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchaudio/default.nix
@@ -0,0 +1,93 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cmake
+, symlinkJoin
+, ffmpeg-full
+, pkg-config
+, ninja
+, pybind11
+, sox
+, torch
+, cudaSupport ? torch.cudaSupport
+, cudaPackages
+}:
+
+buildPythonPackage rec {
+  pname = "torchaudio";
+  version = "2.1.1";
+
+  src = fetchFromGitHub {
+    owner = "pytorch";
+    repo = "audio";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-5UlnOGXXFu1p9M5B+Ixc9DW5hLZ1nskv81Y+McbWu6Q=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'print(" --- Initializing submodules")' "return" \
+      --replace "_fetch_archives(_parse_sources())" "pass"
+  '';
+
+  env = {
+    TORCH_CUDA_ARCH_LIST = "${lib.concatStringsSep ";" torch.cudaCapabilities}";
+  };
+
+  # https://github.com/pytorch/audio/blob/v2.1.0/docs/source/build.linux.rst#optional-build-torchaudio-with-a-custom-built-ffmpeg
+  FFMPEG_ROOT = symlinkJoin {
+    name = "ffmpeg";
+    paths = [
+      ffmpeg-full.bin
+      ffmpeg-full.dev
+      ffmpeg-full.lib
+    ];
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+    ninja
+  ] ++ lib.optionals cudaSupport [
+    cudaPackages.cuda_nvcc
+  ];
+
+  buildInputs = [
+    ffmpeg-full
+    pybind11
+    sox
+  ] ++ lib.optionals cudaSupport [
+    cudaPackages.libcurand.dev
+    cudaPackages.libcurand.lib
+    cudaPackages.cuda_cudart # cuda_runtime.h and libraries
+    cudaPackages.cuda_cccl.dev # <thrust/*>
+    cudaPackages.cuda_nvtx.dev
+    cudaPackages.cuda_nvtx.lib # -llibNVToolsExt
+    cudaPackages.libcublas.dev
+    cudaPackages.libcublas.lib
+    cudaPackages.libcufft.dev
+    cudaPackages.libcufft.lib
+  ];
+
+  propagatedBuildInputs = [
+    torch
+  ];
+
+  BUILD_SOX=0;
+  BUILD_KALDI=0;
+  BUILD_RNNT=0;
+  BUILD_CTC_DECODER=0;
+
+  dontUseCmakeConfigure = true;
+
+  doCheck = false; # requires sox backend
+
+  meta = with lib; {
+    description = "PyTorch audio library";
+    homepage = "https://pytorch.org/";
+    changelog = "https://github.com/pytorch/audio/releases/tag/v${version}";
+    license = licenses.bsd2;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ junjihashimoto ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/torchaudio/prefetch.sh b/nixpkgs/pkgs/development/python-modules/torchaudio/prefetch.sh
new file mode 100755
index 000000000000..c0be5710121b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchaudio/prefetch.sh
@@ -0,0 +1,53 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i bash -p nix-prefetch-scripts
+
+set -eou pipefail
+
+version=$1
+
+linux_cuda_version="cu121"
+linux_cuda_bucket="https://download.pytorch.org/whl/${linux_cuda_version}"
+linux_cpu_bucket="https://download.pytorch.org/whl"
+darwin_bucket="https://download.pytorch.org/whl/cpu"
+
+url_and_key_list=(
+  "x86_64-linux-38 $linux_cuda_bucket/torchaudio-${version}%2B${linux_cuda_version}-cp38-cp38-linux_x86_64.whl torchaudio-${version}-cp38-cp38-linux_x86_64.whl"
+  "x86_64-linux-39 $linux_cuda_bucket/torchaudio-${version}%2B${linux_cuda_version}-cp39-cp39-linux_x86_64.whl torchaudio-${version}-cp39-cp39-linux_x86_64.whl"
+  "x86_64-linux-310 $linux_cuda_bucket/torchaudio-${version}%2B${linux_cuda_version}-cp310-cp310-linux_x86_64.whl torchaudio-${version}-cp310-cp310-linux_x86_64.whl"
+  "x86_64-linux-311 $linux_cuda_bucket/torchaudio-${version}%2B${linux_cuda_version}-cp311-cp311-linux_x86_64.whl torchaudio-${version}-cp311-cp311-linux_x86_64.whl"
+  "x86_64-darwin-38 $darwin_bucket/torchaudio-${version}-cp38-cp38-macosx_10_13_x86_64.whl torchaudio-${version}-cp38-cp38-macosx_10_9_x86_64.whl"
+  "x86_64-darwin-39 $darwin_bucket/torchaudio-${version}-cp39-cp39-macosx_10_13_x86_64.whl torchaudio-${version}-cp39-cp39-macosx_10_9_x86_64.whl"
+  "x86_64-darwin-310 $darwin_bucket/torchaudio-${version}-cp310-cp310-macosx_10_13_x86_64.whl torchaudio-${version}-cp310-cp310-macosx_10_9_x86_64.whl"
+  "x86_64-darwin-311 $darwin_bucket/torchaudio-${version}-cp311-cp311-macosx_10_13_x86_64.whl torchaudio-${version}-cp311-cp311-macosx_10_9_x86_64.whl"
+  "aarch64-darwin-38 $darwin_bucket/torchaudio-${version}-cp38-cp38-macosx_11_0_arm64.whl torchaudio-${version}-cp38-cp38-macosx_11_0_arm64.whl"
+  "aarch64-darwin-39 $darwin_bucket/torchaudio-${version}-cp39-cp39-macosx_11_0_arm64.whl torchaudio-${version}-cp39-cp39-macosx_11_0_arm64.whl"
+  "aarch64-darwin-310 $darwin_bucket/torchaudio-${version}-cp310-cp310-macosx_11_0_arm64.whl torchaudio-${version}-cp310-cp310-macosx_11_0_arm64.whl"
+  "aarch64-darwin-311 $darwin_bucket/torchaudio-${version}-cp311-cp311-macosx_11_0_arm64.whl torchaudio-${version}-cp311-cp311-macosx_11_0_arm64.whl"
+  "aarch64-linux-38 $linux_cpu_bucket/torchaudio-${version}-cp38-cp38-linux_aarch64.whl torchaudio-${version}-cp38-cp38-manylinux2014_aarch64.whl"
+  "aarch64-linux-39 $linux_cpu_bucket/torchaudio-${version}-cp39-cp39-linux_aarch64.whl torchaudio-${version}-cp39-cp39-manylinux2014_aarch64.whl"
+  "aarch64-linux-310 $linux_cpu_bucket/torchaudio-${version}-cp310-cp310-linux_aarch64.whl torchaudio-${version}-cp310-cp310-manylinux2014_aarch64.whl"
+  "aarch64-linux-311 $linux_cpu_bucket/torchaudio-${version}-cp311-cp311-linux_aarch64.whl torchaudio-${version}-cp311-cp311-manylinux2014_aarch64.whl"
+)
+
+hashfile=binary-hashes-"$version".nix
+echo "  \"$version\" = {" >> $hashfile
+
+for url_and_key in "${url_and_key_list[@]}"; do
+  key=$(echo "$url_and_key" | cut -d' ' -f1)
+  url=$(echo "$url_and_key" | cut -d' ' -f2)
+  name=$(echo "$url_and_key" | cut -d' ' -f3)
+
+  echo "prefetching ${url}..."
+  hash=$(nix hash to-sri --type sha256 `nix-prefetch-url "$url" --name "$name"`)
+
+  echo "    $key = {" >> $hashfile
+  echo "      name = \"$name\";" >> $hashfile
+  echo "      url = \"$url\";" >> $hashfile
+  echo "      hash = \"$hash\";" >> $hashfile
+  echo "    };" >> $hashfile
+
+  echo
+done
+
+echo "  };" >> $hashfile
+echo "done."
diff --git a/nixpkgs/pkgs/development/python-modules/torchdiffeq/default.nix b/nixpkgs/pkgs/development/python-modules/torchdiffeq/default.nix
new file mode 100644
index 000000000000..8195d750c6f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchdiffeq/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+
+# dependencies
+, torch
+, scipy
+
+# tests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "torchdiffeq";
+  version = "0.2.3";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/nX0NLkJCsDCdwLgK+0hRysPhwNb5lgfUe3F1AE+oxo=";
+  };
+
+  propagatedBuildInputs = [
+    torch
+    scipy
+  ];
+
+  pythonImportsCheck = [ "torchdiffeq" ];
+
+  # no tests in sdist, no tags on git
+  doCheck = false;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Differentiable ODE solvers with full GPU support and O(1)-memory backpropagation";
+    homepage = "https://github.com/rtqichen/torchdiffeq";
+    license = licenses.mit;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/torchgpipe/default.nix b/nixpkgs/pkgs/development/python-modules/torchgpipe/default.nix
new file mode 100644
index 000000000000..0ebce5b66ddb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchgpipe/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, torch
+}:
+
+buildPythonPackage rec {
+  pname = "torchgpipe";
+  version = "0.0.7";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "kakaobrain";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0ki0njhmz1i3pkpr3y6h6ac7p5qh1kih06mknc2s18mfw34f2l55";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'" ""
+  '';
+
+  propagatedBuildInputs = [ torch ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  disabledTests = [
+    "test_inplace_on_requires_grad"
+    "test_input_requiring_grad"
+  ];
+
+  meta = with lib; {
+    description = "GPipe implemented in Pytorch and optimized for CUDA rather than TPU";
+    homepage = "https://torchgpipe.readthedocs.io";
+    license = licenses.asl20;
+    maintainers = [ maintainers.bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/torchinfo/default.nix b/nixpkgs/pkgs/development/python-modules/torchinfo/default.nix
new file mode 100644
index 000000000000..59b7e99c9dfc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchinfo/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pythonOlder
+, torch
+, torchvision
+, pytestCheckHook
+, transformers
+}:
+
+buildPythonPackage rec {
+  pname = "torchinfo";
+  version = "1.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "TylerYep";
+    repo = "torchinfo";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-pPjg498aT8y4b4tqIzNxxKyobZX01u+66ScS/mee51Q=";
+  };
+
+  patches = [
+    (fetchpatch {  # Add support for Python 3.11 and pytorch 2.1
+      url = "https://github.com/TylerYep/torchinfo/commit/c74784c71c84e62bcf56664653b7f28d72a2ee0d.patch";
+      hash = "sha256-xSSqs0tuFpdMXUsoVv4sZLCeVnkK6pDDhX/Eobvn5mw=";
+      includes = [
+        "torchinfo/model_statistics.py"
+      ];
+    })
+  ];
+
+  propagatedBuildInputs = [
+    torch
+    torchvision
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    transformers
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  disabledTests = [
+    # Skip as it downloads pretrained weights (require network access)
+    "test_eval_order_doesnt_matter"
+    "test_flan_t5_small"
+    # AssertionError in output
+    "test_google"
+    # "addmm_impl_cpu_" not implemented for 'Half'
+    "test_input_size_half_precision"
+  ];
+
+  disabledTestPaths = [
+    # Test requires network access
+    "tests/torchinfo_xl_test.py"
+  ];
+
+  pythonImportsCheck = [
+    "torchinfo"
+  ];
+
+  meta = with lib; {
+    description = "API to visualize pytorch models";
+    homepage = "https://github.com/TylerYep/torchinfo";
+    license = licenses.mit;
+    maintainers = with maintainers; [ petterstorvik ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/torchio/default.nix b/nixpkgs/pkgs/development/python-modules/torchio/default.nix
new file mode 100644
index 000000000000..66071011f2fb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchio/default.nix
@@ -0,0 +1,65 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, deprecated
+, humanize
+, matplotlib
+, nibabel
+, numpy
+, parameterized
+, scipy
+, simpleitk
+, torch
+, tqdm
+, typer
+}:
+
+buildPythonPackage rec {
+  pname = "torchio";
+  version = "0.19.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "fepegar";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-SNX558kSRCS9Eks00Kj2kFmo7hCUgV6saYLsnx/Kus0=";
+  };
+
+  propagatedBuildInputs = [
+    deprecated
+    humanize
+    nibabel
+    numpy
+    scipy
+    simpleitk
+    torch
+    tqdm
+    typer
+  ] ++ typer.passthru.optional-dependencies.all;
+
+  nativeCheckInputs = [ pytestCheckHook matplotlib parameterized ];
+  disabledTests = [
+    # tries to download models:
+    "test_load_all"
+  ] ++ lib.optionals stdenv.isAarch64 [
+    # RuntimeError: DataLoader worker (pid(s) <...>) exited unexpectedly
+    "test_queue_multiprocessing"
+  ];
+  pythonImportsCheck = [
+    "torchio"
+    "torchio.data"
+  ];
+
+  meta = with lib; {
+    description = "Medical imaging toolkit for deep learning";
+    homepage = "https://torchio.readthedocs.io";
+    license = licenses.asl20;
+    maintainers = [ maintainers.bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/torchlibrosa/default.nix b/nixpkgs/pkgs/development/python-modules/torchlibrosa/default.nix
new file mode 100644
index 000000000000..ca8f890c0e62
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchlibrosa/default.nix
@@ -0,0 +1,41 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, librosa
+, numpy
+, torch
+}:
+
+buildPythonPackage rec {
+  pname = "torchlibrosa";
+  version = "0.1.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Yqi+7fnJtBQaBiNN8/ECKfe6huZ2eMzuAkiexO8EQCg=";
+  };
+
+  propagatedBuildInputs = [
+    librosa
+    numpy
+    torch
+  ];
+
+  # Project has no tests.
+  # In order to make pythonImportsCheck work, NUMBA_CACHE_DIR env var need to
+  # be set to a writable dir (https://github.com/numba/numba/issues/4032#issuecomment-488102702).
+  # pythonImportsCheck has no pre* hook, use checkPhase to workaround that.
+  checkPhase = ''
+    export NUMBA_CACHE_DIR="$(mktemp -d)"
+  '';
+  pythonImportsCheck = [ "torchlibrosa" ];
+
+  meta = with lib; {
+    description = "PyTorch implemention of part of librosa functions";
+    homepage = "https://github.com/qiuqiangkong/torchlibrosa";
+    license = licenses.mit;
+    maintainers = with maintainers; [ azuwis ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/torchmetrics/default.nix b/nixpkgs/pkgs/development/python-modules/torchmetrics/default.nix
new file mode 100644
index 000000000000..ee66ee817d1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchmetrics/default.nix
@@ -0,0 +1,98 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, numpy
+, lightning-utilities
+, cloudpickle
+, scikit-learn
+, scikit-image
+, packaging
+, psutil
+, py-deprecate
+, torch
+, pytestCheckHook
+, torchmetrics
+, pytorch-lightning
+, pytest-doctestplus
+, pytest-xdist
+}:
+
+let
+  pname = "torchmetrics";
+  version = "1.2.0";
+in
+buildPythonPackage {
+  inherit pname version;
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "Lightning-AI";
+    repo = "torchmetrics";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-g5JuTbiRd8yWx2nM3UE8ejOhuZ0XpAQdS5AC9AlrSFY=";
+  };
+
+  disabled = pythonOlder "3.8";
+
+  propagatedBuildInputs = [
+    numpy
+    lightning-utilities
+    packaging
+    py-deprecate
+  ];
+
+  # Let the user bring their own instance
+  buildInputs = [
+    torch
+  ];
+
+  nativeCheckInputs = [
+    pytorch-lightning
+    scikit-learn
+    scikit-image
+    cloudpickle
+    psutil
+    pytestCheckHook
+    pytest-doctestplus
+    pytest-xdist
+  ];
+
+  # A cyclic dependency in: integrations/test_lightning.py
+  doCheck = false;
+  passthru.tests.check = torchmetrics.overridePythonAttrs (_: {
+    pname = "${pname}-check";
+    doCheck = true;
+    # We don't have to install because the only purpose
+    # of this passthru test is to, well, test.
+    # This fixes having to set `catchConflicts` to false.
+    dontInstall = true;
+  });
+
+  disabledTests = [
+    # `IndexError: list index out of range`
+    "test_metric_lightning_log"
+  ];
+
+  disabledTestPaths = [
+    # These require too many "leftpad-level" dependencies
+    # Also too cross-dependent
+    "tests/unittests"
+
+    # A trillion import path mismatch errors
+    "src/torchmetrics"
+  ];
+
+  pythonImportsCheck = [
+    "torchmetrics"
+  ];
+
+  meta = with lib; {
+    description = "Machine learning metrics for distributed, scalable PyTorch applications (used in pytorch-lightning)";
+    homepage = "https://lightning.ai/docs/torchmetrics/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [
+      SomeoneSerge
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/torchsde/default.nix b/nixpkgs/pkgs/development/python-modules/torchsde/default.nix
new file mode 100644
index 000000000000..ba7b2e923612
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchsde/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, setuptools
+
+# dependencies
+, boltons
+, numpy
+, scipy
+, torch
+, trampoline
+
+# tests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "torchsde";
+  version = "0.2.6";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "google-research";
+    repo = "torchsde";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-D0p2tL/VvkouXrXfRhMuCq8wMtzeoBTppWEG5vM1qCo=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "numpy==1.19.*" "numpy" \
+      --replace "scipy==1.5.*" "scipy"
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    boltons
+    numpy
+    scipy
+    torch
+    trampoline
+  ];
+
+  pythonImportsCheck = [ "torchsde" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # RuntimeError: a view of a leaf Variable that requires grad is being used in an in-place operation.
+    "test_adjoint"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/google-research/torchsde/releases/tag/v${version}";
+    description = "Differentiable SDE solvers with GPU support and efficient sensitivity analysis";
+    homepage = "https://github.com/google-research/torchsde";
+    license = licenses.asl20;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/torchvision/bin.nix b/nixpkgs/pkgs/development/python-modules/torchvision/bin.nix
new file mode 100644
index 000000000000..574476ef8777
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchvision/bin.nix
@@ -0,0 +1,69 @@
+{ lib
+, stdenv
+, addOpenGLRunpath
+, autoPatchelfHook
+, buildPythonPackage
+, cudaPackages
+, fetchurl
+, pythonAtLeast
+, pythonOlder
+, pillow
+, python
+, torch-bin
+}:
+
+let
+  pyVerNoDot = builtins.replaceStrings [ "." ] [ "" ] python.pythonVersion;
+  srcs = import ./binary-hashes.nix version;
+  unsupported = throw "Unsupported system";
+  version = "0.16.1";
+in buildPythonPackage {
+  inherit version;
+
+  pname = "torchvision";
+
+  format = "wheel";
+
+  src = fetchurl srcs."${stdenv.system}-${pyVerNoDot}" or unsupported;
+
+  disabled = (pythonOlder "3.8") || (pythonAtLeast "3.12");
+
+  # Note that we don't rely on config.cudaSupport here, because the Linux wheels all come built with CUDA support.
+  buildInputs = with cudaPackages; lib.optionals stdenv.isLinux [
+    # $out/${sitePackages}/torchvision/_C.so wants libcudart.so.11.0 but torchvision.libs only ships
+    # libcudart.$hash.so.11.0
+    cuda_cudart
+  ];
+
+  nativeBuildInputs = lib.optionals stdenv.isLinux [
+    autoPatchelfHook
+    addOpenGLRunpath
+  ];
+
+  propagatedBuildInputs = [
+    pillow
+    torch-bin
+  ];
+
+  # The wheel-binary is not stripped to avoid the error of `ImportError: libtorch_cuda_cpp.so: ELF load command address/offset not properly aligned.`.
+  dontStrip = true;
+
+  pythonImportsCheck = [ "torchvision" ];
+
+  preInstall = lib.optionalString stdenv.isLinux ''
+    addAutoPatchelfSearchPath "${torch-bin}/${python.sitePackages}/torch"
+  '';
+
+  meta = with lib; {
+    description = "PyTorch vision library";
+    homepage = "https://pytorch.org/";
+    changelog = "https://github.com/pytorch/vision/releases/tag/v${version}";
+    # Includes CUDA and Intel MKL, but redistributions of the binary are not limited.
+    # https://docs.nvidia.com/cuda/eula/index.html
+    # https://www.intel.com/content/www/us/en/developer/articles/license/onemkl-license-faq.html
+    license = licenses.bsd3;
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    platforms = [ "aarch64-darwin" "x86_64-darwin" "x86_64-linux" ];
+    maintainers = with maintainers; [ junjihashimoto ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/torchvision/binary-hashes.nix b/nixpkgs/pkgs/development/python-modules/torchvision/binary-hashes.nix
new file mode 100644
index 000000000000..f560d78baaa4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchvision/binary-hashes.nix
@@ -0,0 +1,71 @@
+# Warning: use the same CUDA version as torch-bin.
+#
+# Precompiled wheels can be found at:
+# https://download.pytorch.org/whl/torch_stable.html
+
+# To add a new version, run "prefetch.sh 'new-version'" to paste the generated file as follows.
+
+version : builtins.getAttr version {
+  "0.16.1" = {
+    x86_64-linux-38 = {
+      name = "torchvision-0.16.1-cp38-cp38-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu121/torchvision-0.16.1%2Bcu121-cp38-cp38-linux_x86_64.whl";
+      hash = "sha256-xPO1sRtw2yyLBlrp3kduqc6yrVc8fFgGi+CXWkABgrQ=";
+    };
+    x86_64-linux-39 = {
+      name = "torchvision-0.16.1-cp39-cp39-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu121/torchvision-0.16.1%2Bcu121-cp39-cp39-linux_x86_64.whl";
+      hash = "sha256-1voLyIMnBZI9kBleyb819IhwW0nAFEizcCy3t9ebVPk=";
+    };
+    x86_64-linux-310 = {
+      name = "torchvision-0.16.1-cp310-cp310-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu121/torchvision-0.16.1%2Bcu121-cp310-cp310-linux_x86_64.whl";
+      hash = "sha256-AglL7N9dxCpq/iGQ4ayz8y3ZwtOt2Cfd/pG1RMwjrfQ=";
+    };
+    x86_64-linux-311 = {
+      name = "torchvision-0.16.1-cp311-cp311-linux_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cu121/torchvision-0.16.1%2Bcu121-cp311-cp311-linux_x86_64.whl";
+      hash = "sha256-tO7B2cBOsDa05yrqX0OuM8BkFNqdNjkb0E/9Ma2C+6k=";
+    };
+    x86_64-darwin-38 = {
+      name = "torchvision-0.16.1-cp38-cp38-macosx_10_9_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torchvision-0.16.1-cp38-cp38-macosx_10_13_x86_64.whl";
+      hash = "sha256-TyytYh+5bPEOKa+T4WyYsyJr3VOucStX6HPD3q8GFhc=";
+    };
+    x86_64-darwin-39 = {
+      name = "torchvision-0.16.1-cp39-cp39-macosx_10_9_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torchvision-0.16.1-cp39-cp39-macosx_10_13_x86_64.whl";
+      hash = "sha256-8U0gHDcXbcQQbux2sinWWFoVBSZrjOqZ0zZv04iXt8A=";
+    };
+    x86_64-darwin-310 = {
+      name = "torchvision-0.16.1-cp310-cp310-macosx_10_9_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torchvision-0.16.1-cp310-cp310-macosx_10_13_x86_64.whl";
+      hash = "sha256-mHEyeV5cA3y3TnvjWmk5mf2y9gMVImbuFbgCBug6Www=";
+    };
+    x86_64-darwin-311 = {
+      name = "torchvision-0.16.1-cp311-cp311-macosx_10_9_x86_64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torchvision-0.16.1-cp311-cp311-macosx_10_13_x86_64.whl";
+      hash = "sha256-Supc9JHGwhscvbsb8qODilnU25OtX0kBmmVk08pxJ8c=";
+    };
+    aarch64-darwin-38 = {
+      name = "torchvision-0.16.1-cp38-cp38-macosx_11_0_arm64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torchvision-0.16.1-cp38-cp38-macosx_11_0_arm64.whl";
+      hash = "sha256-HWFLPJ4t6c11zA5OGSP8+7zZ/bnwigu7v34TXkoKHPo=";
+    };
+    aarch64-darwin-39 = {
+      name = "torchvision-0.16.1-cp39-cp39-macosx_11_0_arm64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torchvision-0.16.1-cp39-cp39-macosx_11_0_arm64.whl";
+      hash = "sha256-oV6IqTp1Acx1t2Gi3NB6rtqvnL+vSMiv+oyYmJ7LsZ0=";
+    };
+    aarch64-darwin-310 = {
+      name = "torchvision-0.16.1-cp310-cp310-macosx_11_0_arm64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torchvision-0.16.1-cp310-cp310-macosx_11_0_arm64.whl";
+      hash = "sha256-JdpqeyLqA0j2LEXsDa8VdzEJa6vK5l0iJAQIGvluCFw=";
+    };
+    aarch64-darwin-311 = {
+      name = "torchvision-0.16.1-cp311-cp311-macosx_11_0_arm64.whl";
+      url = "https://download.pytorch.org/whl/cpu/torchvision-0.16.1-cp311-cp311-macosx_11_0_arm64.whl";
+      hash = "sha256-M5F1cWdjes4+8zpnydXvhrH4y9k+qlutRe688mbqYIk=";
+    };
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/torchvision/default.nix b/nixpkgs/pkgs/development/python-modules/torchvision/default.nix
new file mode 100644
index 000000000000..223130918af5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchvision/default.nix
@@ -0,0 +1,91 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, libjpeg_turbo
+, libpng
+, ninja
+, numpy
+, pillow
+, pytest
+, scipy
+, symlinkJoin
+, torch
+, which
+}:
+
+let
+  inherit (torch) cudaCapabilities cudaPackages cudaSupport;
+  inherit (cudaPackages) backendStdenv cudaVersion;
+
+  # NOTE: torchvision doesn't use cudnn; torch does!
+  #   For this reason it is not included.
+  cuda-common-redist = with cudaPackages; [
+    cuda_cccl # <thrust/*>
+    libcublas # cublas_v2.h
+    libcusolver # cusolverDn.h
+    libcusparse # cusparse.h
+  ];
+
+  cuda-native-redist = symlinkJoin {
+    name = "cuda-native-redist-${cudaVersion}";
+    paths = with cudaPackages; [
+      cuda_cudart # cuda_runtime.h
+      cuda_nvcc
+    ] ++ cuda-common-redist;
+  };
+
+  cuda-redist = symlinkJoin {
+    name = "cuda-redist-${cudaVersion}";
+    paths = cuda-common-redist;
+  };
+
+  pname = "torchvision";
+  version = "0.16.1";
+in
+buildPythonPackage {
+  inherit pname version;
+
+  src = fetchFromGitHub {
+    owner = "pytorch";
+    repo = "vision";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-TsYBDtedTQ3+F3LM4JwzkGH2XOr0WSp1Au5YoR07rSA=";
+  };
+
+  nativeBuildInputs = [ libpng ninja which ] ++ lib.optionals cudaSupport [ cuda-native-redist ];
+
+  buildInputs = [ libjpeg_turbo libpng ] ++ lib.optionals cudaSupport [ cuda-redist ];
+
+  propagatedBuildInputs = [ numpy pillow torch scipy ];
+
+  preConfigure = ''
+    export TORCHVISION_INCLUDE="${libjpeg_turbo.dev}/include/"
+    export TORCHVISION_LIBRARY="${libjpeg_turbo}/lib/"
+  ''
+  # NOTE: We essentially override the compilers provided by stdenv because we don't have a hook
+  #   for cudaPackages to swap in compilers supported by NVCC.
+  + lib.optionalString cudaSupport ''
+    export CC=${backendStdenv.cc}/bin/cc
+    export CXX=${backendStdenv.cc}/bin/c++
+    export TORCH_CUDA_ARCH_LIST="${lib.concatStringsSep ";" cudaCapabilities}"
+    export FORCE_CUDA=1
+  '';
+
+  # tries to download many datasets for tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "torchvision" ];
+  checkPhase = ''
+    HOME=$TMPDIR py.test test --ignore=test/test_datasets_download.py
+  '';
+
+  nativeCheckInputs = [ pytest ];
+
+  meta = with lib; {
+    description = "PyTorch vision library";
+    homepage = "https://pytorch.org/";
+    license = licenses.bsd3;
+    platforms = with platforms; linux ++ lib.optionals (!cudaSupport) darwin;
+    maintainers = with maintainers; [ ericsagnes ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/torchvision/prefetch.sh b/nixpkgs/pkgs/development/python-modules/torchvision/prefetch.sh
new file mode 100755
index 000000000000..e80718a50530
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torchvision/prefetch.sh
@@ -0,0 +1,48 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i bash -p nix-prefetch-scripts
+
+set -eou pipefail
+
+version=$1
+
+linux_cuda_version="cu121"
+linux_bucket="https://download.pytorch.org/whl/${linux_cuda_version}"
+darwin_bucket="https://download.pytorch.org/whl/cpu"
+
+url_and_key_list=(
+  "x86_64-linux-38 $linux_bucket/torchvision-${version}%2B${linux_cuda_version}-cp38-cp38-linux_x86_64.whl torchvision-${version}-cp38-cp38-linux_x86_64.whl"
+  "x86_64-linux-39 $linux_bucket/torchvision-${version}%2B${linux_cuda_version}-cp39-cp39-linux_x86_64.whl torchvision-${version}-cp39-cp39-linux_x86_64.whl"
+  "x86_64-linux-310 $linux_bucket/torchvision-${version}%2B${linux_cuda_version}-cp310-cp310-linux_x86_64.whl torchvision-${version}-cp310-cp310-linux_x86_64.whl"
+  "x86_64-linux-311 $linux_bucket/torchvision-${version}%2B${linux_cuda_version}-cp311-cp311-linux_x86_64.whl torchvision-${version}-cp311-cp311-linux_x86_64.whl"
+  "x86_64-darwin-38 $darwin_bucket/torchvision-${version}-cp38-cp38-macosx_10_13_x86_64.whl torchvision-${version}-cp38-cp38-macosx_10_9_x86_64.whl"
+  "x86_64-darwin-39 $darwin_bucket/torchvision-${version}-cp39-cp39-macosx_10_13_x86_64.whl torchvision-${version}-cp39-cp39-macosx_10_9_x86_64.whl"
+  "x86_64-darwin-310 $darwin_bucket/torchvision-${version}-cp310-cp310-macosx_10_13_x86_64.whl torchvision-${version}-cp310-cp310-macosx_10_9_x86_64.whl"
+  "x86_64-darwin-311 $darwin_bucket/torchvision-${version}-cp311-cp311-macosx_10_13_x86_64.whl torchvision-${version}-cp311-cp311-macosx_10_9_x86_64.whl"
+  "aarch64-darwin-38 $darwin_bucket/torchvision-${version}-cp38-cp38-macosx_11_0_arm64.whl torchvision-${version}-cp38-cp38-macosx_11_0_arm64.whl"
+  "aarch64-darwin-39 $darwin_bucket/torchvision-${version}-cp39-cp39-macosx_11_0_arm64.whl torchvision-${version}-cp39-cp39-macosx_11_0_arm64.whl"
+  "aarch64-darwin-310 $darwin_bucket/torchvision-${version}-cp310-cp310-macosx_11_0_arm64.whl torchvision-${version}-cp310-cp310-macosx_11_0_arm64.whl"
+  "aarch64-darwin-311 $darwin_bucket/torchvision-${version}-cp311-cp311-macosx_11_0_arm64.whl torchvision-${version}-cp311-cp311-macosx_11_0_arm64.whl"
+)
+
+hashfile="binary-hashes-$version.nix"
+echo "  \"$version\" = {" >> $hashfile
+
+for url_and_key in "${url_and_key_list[@]}"; do
+  key=$(echo "$url_and_key" | cut -d' ' -f1)
+  url=$(echo "$url_and_key" | cut -d' ' -f2)
+  name=$(echo "$url_and_key" | cut -d' ' -f3)
+
+  echo "prefetching ${url}..."
+  hash=$(nix hash to-sri --type sha256 `nix-prefetch-url "$url" --name "$name"`)
+
+  echo "    $key = {" >> $hashfile
+  echo "      name = \"$name\";" >> $hashfile
+  echo "      url = \"$url\";" >> $hashfile
+  echo "      hash = \"$hash\";" >> $hashfile
+  echo "    };" >> $hashfile
+
+  echo
+done
+
+echo "  };" >> $hashfile
+echo "done."
diff --git a/nixpkgs/pkgs/development/python-modules/tornado/4.nix b/nixpkgs/pkgs/development/python-modules/tornado/4.nix
new file mode 100644
index 000000000000..7476a22792ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tornado/4.nix
@@ -0,0 +1,41 @@
+{ lib
+, unittestCheckHook
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, isPy27
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "tornado";
+  version = "4.5.3";
+  disabled = isPy27 || pythonAtLeast "3.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "02jzd23l4r6fswmwxaica9ldlyc2p6q8dk6dyff7j58fmdzf853d";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "CVE-2023-28370.patch";
+      url = "https://github.com/tornadoweb/tornado/commit/32ad07c54e607839273b4e1819c347f5c8976b2f.patch";
+      hash = "sha256-2dpPHkNThOaZD8T2g1vb/I5WYZ/vy/t690539uprJyc=";
+    })
+  ];
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  # We specify the name of the test files to prevent
+  # https://github.com/NixOS/nixpkgs/issues/14634
+  unittestFlagsArray = [ "*_test.py" ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = {
+    description = "A web framework and asynchronous networking library";
+    homepage = "https://www.tornadoweb.org/";
+    license = lib.licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tornado/5.nix b/nixpkgs/pkgs/development/python-modules/tornado/5.nix
new file mode 100644
index 000000000000..8ba3a8c073ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tornado/5.nix
@@ -0,0 +1,41 @@
+{ lib
+, unittestCheckHook
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, isPy27
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "tornado";
+  version = "5.1.1";
+  disabled = isPy27 || pythonAtLeast "3.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "4e5158d97583502a7e2739951553cbd88a72076f152b4b11b64b9a10c4c49409";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "CVE-2023-28370.patch";
+      url = "https://github.com/tornadoweb/tornado/commit/32ad07c54e607839273b4e1819c347f5c8976b2f.patch";
+      hash = "sha256-2dpPHkNThOaZD8T2g1vb/I5WYZ/vy/t690539uprJyc=";
+    })
+  ];
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  # We specify the name of the test files to prevent
+  # https://github.com/NixOS/nixpkgs/issues/14634
+  unittestFlagsArray = [ "*_test.py" ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = {
+    description = "A web framework and asynchronous networking library";
+    homepage = "https://www.tornadoweb.org/";
+    license = lib.licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tornado/default.nix b/nixpkgs/pkgs/development/python-modules/tornado/default.nix
new file mode 100644
index 000000000000..ac57f212d229
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tornado/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, python
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+
+# for passthru.tests
+, distributed
+, jupyter-server
+, jupyterlab
+, matplotlib
+, mitmproxy
+, pytest-tornado
+, pytest-tornasync
+, pyzmq
+, sockjs-tornado
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "tornado";
+  version = "6.3.3";
+
+  src = fetchFromGitHub {
+    owner = "tornadoweb";
+    repo = "tornado";
+    rev = "v${version}";
+    hash = "sha256-l9Ce/c2wDSmsySr9yXu5Fl/+63QkQay46aDSUTJmetA=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # additional tests that have extra dependencies, run slowly, or produce more output than a simple pass/fail
+    # https://github.com/tornadoweb/tornado/blob/v6.2.0/maint/test/README
+    "maint/test"
+
+    # AttributeError: 'TestIOStreamWebMixin' object has no attribute 'io_loop'
+    "tornado/test/iostream_test.py"
+  ];
+
+  disabledTests = [
+    # Exception: did not get expected log message
+    "test_unix_socket_bad_request"
+  ];
+
+  pythonImportsCheck = [ "tornado" ];
+
+  __darwinAllowLocalNetworking = true;
+
+  passthru.tests = {
+    inherit
+      distributed
+      jupyter-server
+      jupyterlab
+      matplotlib
+      mitmproxy
+      pytest-tornado
+      pytest-tornasync
+      pyzmq
+      sockjs-tornado
+      urllib3;
+  };
+
+  meta = with lib; {
+    description = "A web framework and asynchronous networking library";
+    homepage = "https://www.tornadoweb.org/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/torpy/default.nix b/nixpkgs/pkgs/development/python-modules/torpy/default.nix
new file mode 100644
index 000000000000..ea9c96d33e15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torpy/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, cryptography
+, pytestCheckHook
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "torpy";
+  version = "1.1.6";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "torpyorg";
+    repo = "torpy";
+    rev = "v${version}";
+    hash = "sha256-Ni7GcpkxzAMtP4wBOFsi4KnxK+nC0XCZR/2Z/eS/C+w=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    requests
+   ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # requires network
+    "tests/integration"
+  ];
+
+  pythonImportsCheck = [
+    "cryptography"
+  ];
+
+  meta = with lib; {
+    description = "Pure python Tor client";
+    homepage = "https://github.com/torpyorg/torpy";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ larsr ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/torrent-parser/default.nix b/nixpkgs/pkgs/development/python-modules/torrent-parser/default.nix
new file mode 100644
index 000000000000..2e946229747f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torrent-parser/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "torrent-parser";
+  version = "0.4.1";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner  = "7sDream";
+    repo   = "torrent_parser";
+    rev    = "v${version}";
+    hash = "sha256-zM738r3o9dGZYoWLN7fM4E06m6YPcAODEkgDS6wU/Sc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "torrent_parser"
+  ];
+
+  meta = {
+    description = "A .torrent file parser and creator for both Python 2 and 3";
+    homepage    = "https://github.com/7sDream/torrent_parser";
+    changelog = "https://github.com/7sDream/torrent_parser/blob/${src.rev}/CHANGELOG.md";
+    license     = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/torrequest/default.nix b/nixpkgs/pkgs/development/python-modules/torrequest/default.nix
new file mode 100644
index 000000000000..99ea0e4e5351
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/torrequest/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, requests, pysocks, stem }:
+
+buildPythonPackage rec {
+  pname = "torrequest";
+  version = "0.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-N0XU6j/9qY16A0Njx4ets3qrd72rQAlKTZNzks1NroI=";
+  };
+
+  propagatedBuildInputs = [
+    pysocks requests stem
+  ];
+
+  # This package does not contain any tests.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "torrequest"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/erdiaker/torrequest";
+    description = "Simple Python interface for HTTP(s) requests over Tor";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ applePrincess ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/total-connect-client/default.nix b/nixpkgs/pkgs/development/python-modules/total-connect-client/default.nix
new file mode 100644
index 000000000000..f9635d5617d4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/total-connect-client/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, zeep
+}:
+
+buildPythonPackage rec {
+  pname = "total-connect-client";
+  version = "2023.11.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "craigjmidwinter";
+    repo = "total-connect-client";
+    rev = "refs/tags/${version}";
+    hash = "sha256-XyoyPMhp7KZrizAehuFnBAWYliv9A7D2JjGA+lO3p7Y=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    zeep
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "total_connect_client"
+  ];
+
+  meta = with lib; {
+    description = "Interact with Total Connect 2 alarm systems";
+    homepage = "https://github.com/craigjmidwinter/total-connect-client";
+    changelog = "https://github.com/craigjmidwinter/total-connect-client/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/towncrier/default.nix b/nixpkgs/pkgs/development/python-modules/towncrier/default.nix
new file mode 100644
index 000000000000..e90648ec0810
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/towncrier/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchPypi
+, git # shells out to git
+, hatchling
+, importlib-resources
+, incremental
+, jinja2
+, mock
+, pytestCheckHook
+, pythonOlder
+, tomli
+, twisted
+}:
+
+buildPythonPackage rec {
+  pname = "towncrier";
+  version = "23.11.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-E5N8JH4/iuIKxE2JXPX5amCtRs/cwWcXWVMNeDfZ7l0=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "hatchling ~= 1.17.1" "hatchling"
+  '';
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    click
+    incremental
+    jinja2
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    importlib-resources
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  preCheck = ''
+    export PATH=$out/bin:$PATH
+  '';
+
+  nativeCheckInputs = [
+    git
+    mock
+    twisted
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "towncrier"
+  ];
+
+  meta = with lib; {
+    description = "Utility to produce useful, summarised news files";
+    homepage = "https://github.com/twisted/towncrier/";
+    changelog = "https://github.com/twisted/towncrier/blob/${version}/NEWS.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tox/default.nix b/nixpkgs/pkgs/development/python-modules/tox/default.nix
new file mode 100644
index 000000000000..1b0bf1755ab7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tox/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, packaging
+, pluggy
+, py
+, six
+, virtualenv
+, setuptools-scm
+, toml
+, tomli
+, filelock
+, hatchling
+, hatch-vcs
+, platformdirs
+, pyproject-api
+, colorama
+, chardet
+, cachetools
+, testers
+, tox
+}:
+
+buildPythonPackage rec {
+  pname = "tox";
+  version = "4.11.3";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "tox-dev";
+    repo = "tox";
+    rev = "refs/tags/${version}";
+    hash = "sha256-VLoWRAiQ1TP9S0f8TKwQ0H2Lgemd+dTzSM+TjhioDMk=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "packaging>=22" "packaging"
+  '';
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    hatchling
+    hatch-vcs
+  ];
+
+  propagatedBuildInputs = [
+    cachetools
+    chardet
+    colorama
+    filelock
+    packaging
+    platformdirs
+    pluggy
+    py
+    pyproject-api
+    six
+    toml
+    virtualenv
+  ]  ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  doCheck = false; # infinite recursion via devpi-client
+
+  passthru.tests = {
+    version = testers.testVersion { package = tox; };
+  };
+
+  meta = with lib; {
+    changelog = "https://github.com/tox-dev/tox/releases/tag/${version}";
+    description = "A generic virtualenv management and test command line tool";
+    homepage = "https://github.com/tox-dev/tox";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tplink-omada-client/default.nix b/nixpkgs/pkgs/development/python-modules/tplink-omada-client/default.nix
new file mode 100644
index 000000000000..8dcb2cda2cea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tplink-omada-client/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, aiohttp
+, awesomeversion
+, buildPythonPackage
+, fetchPypi
+, hatchling
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "tplink-omada-client";
+  version = "1.3.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchPypi {
+    pname = "tplink_omada_client";
+    inherit version;
+    hash = "sha256-8NP+5qBdWiBUPf5DJWMrHJfZwpRNkCewjrjTbvgD3AA=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    awesomeversion
+  ];
+
+  # Module have no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "tplink_omada_client"
+  ];
+
+  meta = with lib; {
+    description = "Library for the TP-Link Omada SDN Controller API";
+    homepage = "https://github.com/MarkGodwin/tplink-omada-api";
+    changelog = "https://github.com/MarkGodwin/tplink-omada-api/releases/tag/release%2Fv${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tpm2-pytss/default.nix b/nixpkgs/pkgs/development/python-modules/tpm2-pytss/default.nix
new file mode 100644
index 000000000000..4b0f9adba51b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tpm2-pytss/default.nix
@@ -0,0 +1,111 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pythonOlder
+, asn1crypto
+, cffi
+, cryptography
+, pkgconfig # see nativeBuildInputs
+, pkg-config # see nativeBuildInputs
+, pycparser
+, pytestCheckHook
+, python
+, pyyaml
+, setuptools-scm
+, tpm2-tss
+, tpm2-tools
+, swtpm
+}:
+
+buildPythonPackage rec {
+  pname = "tpm2-pytss";
+  version = "2.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-W1tLFFb9wa7vPSw5cL6qB4yPfyZIyXppvPYMWi+VyJc=";
+  };
+
+  patches = [
+    # This patches the call to the C preprocessor not to include types
+    # pycparser does not handle.
+    # `hardeningDisable = [ "fortify" ]` would have the same effect but
+    # would also disable hardening from generated FFI objects.
+    #
+    # backport of https://github.com/tpm2-software/tpm2-pytss/pull/523
+    (fetchpatch {
+      url = "https://github.com/baloo/tpm2-pytss/commit/099c069f28cfcd0a3019adebfeafa976f9395221.patch";
+      sha256 = "sha256-wU2WfLYFDmkhGzYornZ386tB3zb3GYfGOTc+/QOFb1o=";
+    })
+
+    # Lookup tcti via getinfo not system's ld_library_path
+    # https://github.com/tpm2-software/tpm2-pytss/pull/525
+    (fetchpatch {
+      url = "https://github.com/tpm2-software/tpm2-pytss/commit/97289a08ddf44f7bdccdd122d6055c69e12dc584.patch";
+      sha256 = "sha256-VFq3Hv4I8U8ifP/aSjyu0BiW/4jfPlRDKqRcqUGw6UQ=";
+    })
+
+    (fetchpatch {
+      name = "test-new-cryptography.patch";
+      url = "https://github.com/tpm2-software/tpm2-pytss/commit/e4006e6066c015d9ed55befa9b98247fbdcafd7d.diff";
+      sha256 = "sha256-Wxe9u7Cvv2vKMGTcK3X8W1Mq/nCt70zrzWUKA+83Sas=";
+    })
+
+    # Fix hardcoded `fapi-config.json` configuration path
+    ./fapi-config.patch
+  ];
+
+  postPatch = ''
+    sed -i "s#@TPM2_TSS@#${tpm2-tss.out}#" src/tpm2_pytss/FAPI.py
+  '';
+
+  # Hardening has to be disabled
+  # due to pycparsing handling it poorly.
+  # See https://github.com/NixOS/nixpkgs/issues/252023
+  # for more details.
+  hardeningDisable = [
+    "fortify"
+  ];
+
+  nativeBuildInputs = [
+    cffi
+    pkgconfig # this is the Python module
+    pkg-config # this is the actual pkg-config tool
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    tpm2-tss
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+    asn1crypto
+    cryptography
+    pyyaml
+  ];
+
+  doCheck = true;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    tpm2-tools
+    swtpm
+  ];
+
+  pythonImportsCheck = [
+    "tpm2_pytss"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/tpm2-software/tpm2-pytss";
+    changelog = "https://github.com/tpm2-software/tpm2-pytss/blob/${version}/CHANGELOG.md";
+    description = "TPM2 TSS Python bindings for Enhanced System API (ESYS)";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ baloo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tpm2-pytss/fapi-config.patch b/nixpkgs/pkgs/development/python-modules/tpm2-pytss/fapi-config.patch
new file mode 100644
index 000000000000..f6245ef30467
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tpm2-pytss/fapi-config.patch
@@ -0,0 +1,12 @@
+diff --git a/src/tpm2_pytss/FAPI.py b/src/tpm2_pytss/FAPI.py
+index 916eda6..1afba3f 100644
+--- a/src/tpm2_pytss/FAPI.py
++++ b/src/tpm2_pytss/FAPI.py
+@@ -23,6 +23,7 @@ logger = logging.getLogger(__name__)
+ 
+ FAPI_CONFIG_ENV = "TSS2_FAPICONF"
+ FAPI_CONFIG_PATHS = [
++    "@TPM2_TSS@/etc/tpm2-tss/fapi-config.json",
+     "/etc/tpm2-tss/fapi-config.json",
+     "/usr/local/etc/tpm2-tss/fapi-config.json",
+ ]
diff --git a/nixpkgs/pkgs/development/python-modules/tqdm/default.nix b/nixpkgs/pkgs/development/python-modules/tqdm/default.nix
new file mode 100644
index 000000000000..640e62212081
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tqdm/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, setuptools-scm
+, wheel
+, pytestCheckHook
+, pytest-asyncio
+, pytest-timeout
+, numpy
+, pandas
+, rich
+, tkinter
+}:
+
+buildPythonPackage rec {
+  pname = "tqdm";
+  version = "4.66.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2I5lH5242FUaYlVtPP+eMDQnTKXWbpMZfPJJDi3Lacc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+    pytest-timeout
+    # tests of optional features
+    numpy
+    rich
+    tkinter
+  ] ++
+    # pandas is not supported on i686 or risc-v
+    lib.optional (!stdenv.isi686 && !stdenv.hostPlatform.isRiscV) pandas;
+
+  pytestFlagsArray = [
+    "-W" "ignore::FutureWarning"
+  ];
+
+  # Remove performance testing.
+  # Too sensitive for on Hydra.
+  disabledTests = [
+    "perf"
+  ];
+
+  LC_ALL="en_US.UTF-8";
+
+  pythonImportsCheck = [ "tqdm" ];
+
+  meta = with lib; {
+    description = "A Fast, Extensible Progress Meter";
+    homepage = "https://github.com/tqdm/tqdm";
+    changelog = "https://tqdm.github.io/releases/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/traceback2/default.nix b/nixpkgs/pkgs/development/python-modules/traceback2/default.nix
new file mode 100644
index 000000000000..040874286bde
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/traceback2/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pbr
+, linecache2
+}:
+
+buildPythonPackage rec {
+  version = "1.4.0";
+  pname = "traceback2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0c1h3jas1jp1fdbn9z2mrgn3jj0hw1x3yhnkxp7jw34q15xcdb05";
+  };
+
+  propagatedBuildInputs = [ pbr linecache2 ];
+
+  # circular dependencies for tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A backport of traceback to older supported Pythons";
+    homepage = "https://pypi.python.org/pypi/traceback2/";
+    license = licenses.psfl;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tracerite/default.nix b/nixpkgs/pkgs/development/python-modules/tracerite/default.nix
new file mode 100644
index 000000000000..e94e8a8d1d95
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tracerite/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, html5tagger
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "tracerite";
+  version = "1.1.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "sanic-org";
+    repo = "tracerite";
+    rev = "v${version}";
+    hash = "sha256-At8wVR3EcHEi051BBfjb+sOhs93GyzWlEAjtehTMeNU=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    html5tagger
+  ];
+
+  postInstall = ''
+    cp tracerite/style.css $out/${python.sitePackages}/tracerite
+  '';
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "tracerite"
+  ];
+
+  meta = with lib; {
+    description = "Tracebacks for Humans (in Jupyter notebooks";
+    homepage = "https://github.com/sanic-org/tracerite";
+    license = licenses.unlicense;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tracing/default.nix b/nixpkgs/pkgs/development/python-modules/tracing/default.nix
new file mode 100644
index 000000000000..c2adc9ec9c5a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tracing/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchurl
+, sphinx
+}:
+
+buildPythonPackage rec {
+  pname = "tracing";
+  version = "0.8";
+
+  src = fetchurl {
+    url = "http://code.liw.fi/debian/pool/main/p/python-tracing/python-tracing_${version}.orig.tar.gz";
+    sha256 = "1l4ybj5rvrrcxf8csyq7qx52izybd502pmx70zxp46gxqm60d2l0";
+  };
+
+  buildInputs = [ sphinx ];
+
+  # error: invalid command 'test'
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://liw.fi/tracing/";
+    description = "Python debug logging helper";
+    license = licenses.gpl3;
+    maintainers = [];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/trackpy/default.nix b/nixpkgs/pkgs/development/python-modules/trackpy/default.nix
new file mode 100644
index 000000000000..0123ce0cbd6c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trackpy/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, looseversion
+, matplotlib
+, numba
+, numpy
+, pandas
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, scipy
+}:
+
+buildPythonPackage rec {
+  pname = "trackpy";
+  version = "0.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "soft-matter";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-NG1TOppqRbIZHLxJjlaXD4icYlAUkSxtmmC/fsS/pXo=";
+  };
+
+  propagatedBuildInputs = [
+    looseversion
+    matplotlib
+    numba
+    numpy
+    pandas
+    pyyaml
+    scipy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = lib.optionalString stdenv.isDarwin ''
+    # specifically needed for darwin
+    export HOME=$(mktemp -d)
+    mkdir -p $HOME/.matplotlib
+    echo "backend: ps" > $HOME/.matplotlib/matplotlibrc
+  '';
+
+  pythonImportsCheck = [
+    "trackpy"
+  ];
+
+  meta = with lib; {
+    description = "Particle-tracking toolkit";
+    homepage = "https://github.com/soft-matter/trackpy";
+    changelog = "https://github.com/soft-matter/trackpy/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+    broken = (stdenv.isLinux && stdenv.isAarch64);
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/trailrunner/default.nix b/nixpkgs/pkgs/development/python-modules/trailrunner/default.nix
new file mode 100644
index 000000000000..04cf6b0c071f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trailrunner/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, pathspec
+, pythonOlder
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "trailrunner";
+  version = "1.4.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "omnilib";
+    repo = "trailrunner";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-qtEBr22yyj6WcSfyYr/4r0IuuMJ6chFFqnmb+uMfQPA=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    pathspec
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "trailrunner"
+  ];
+
+  meta = with lib; {
+    description = "Module to walk paths and run things";
+    homepage = "https://github.com/omnilib/trailrunner";
+    changelog = "https://github.com/omnilib/trailrunner/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/trainer/default.nix b/nixpkgs/pkgs/development/python-modules/trainer/default.nix
new file mode 100644
index 000000000000..734bc324e266
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trainer/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+, coqpit
+, fsspec
+, torch
+, tensorboard
+, protobuf
+, psutil
+
+, pytestCheckHook
+, soundfile
+, torchvision
+}:
+
+let
+  pname = "trainer";
+  version = "0.0.32";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "coqui-ai";
+    repo = "Trainer";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-lSfkokPFB09KZBHe/Qkon2gUsA82AK52WNK1bJfzCNc=";
+  };
+
+  postPatch = ''
+    sed -i 's/^protobuf.*/protobuf/' requirements.txt
+  '';
+
+  propagatedBuildInputs = [
+    coqpit
+    fsspec
+    protobuf
+    psutil
+    soundfile
+    tensorboard
+    torch
+  ];
+
+  # only one test and that requires training data from the internet
+  doCheck = false;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    torchvision
+  ];
+
+  pythonImportsCheck = [
+    "trainer"
+  ];
+
+  meta = with lib; {
+    description = "A general purpose model trainer, as flexible as it gets";
+    homepage = "https://github.com/coqui-ai/Trainer";
+    changelog = "https://github.com/coqui-ai/Trainer/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/traitlets/default.nix b/nixpkgs/pkgs/development/python-modules/traitlets/default.nix
new file mode 100644
index 000000000000..6df71a041b25
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/traitlets/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, hatchling
+}:
+
+buildPythonPackage rec {
+  pname = "traitlets";
+  version = "5.10.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-9YTqIJJARm5m6R88gap9AEukz3lJkLDHdZOKFUQhfNE=";
+  };
+
+  nativeBuildInputs = [ hatchling ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = {
+    description = "Traitlets Python config system";
+    homepage = "https://github.com/ipython/traitlets";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/traits/default.nix b/nixpkgs/pkgs/development/python-modules/traits/default.nix
new file mode 100644
index 000000000000..47b5eef29ced
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/traits/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, numpy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "traits";
+  version = "6.4.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-qbv9ngwIt94H6G72TmnLlqKcIQWkO/gyzYsWL6HiL0Q=";
+  };
+
+  # Circular dependency
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "traits"
+  ];
+
+  meta = with lib; {
+    description = "Explicitly typed attributes for Python";
+    homepage = "https://pypi.python.org/pypi/traits";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/traitsui/default.nix b/nixpkgs/pkgs/development/python-modules/traitsui/default.nix
new file mode 100644
index 000000000000..0c7245225d10
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/traitsui/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, setuptools
+, traits
+, pyface
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "traitsui";
+  version = "8.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-kBudHLxFUT4Apzl2d7CYRBsod0tojzChWbrUgBv0A2Q=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    traits
+    pyface
+  ];
+
+  # Needs X server
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "traitsui"
+  ];
+
+  meta = with lib; {
+    description = "Traits-capable windowing framework";
+    homepage = "https://github.com/enthought/traitsui";
+    changelog = "https://github.com/enthought/traitsui/releases/tag/${version}";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ knedlsepp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/traittypes/default.nix b/nixpkgs/pkgs/development/python-modules/traittypes/default.nix
new file mode 100644
index 000000000000..152b9e640040
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/traittypes/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, isPy27
+, pytestCheckHook
+, nose
+, numpy
+, pandas
+, xarray
+, traitlets
+}:
+
+buildPythonPackage rec {
+  pname = "traittypes";
+  version = "unstable-2019-06-23";
+
+  disabled = isPy27;
+
+  src = fetchFromGitHub {
+    owner = "jupyter-widgets";
+    repo = pname;
+    rev = "0a030b928991dec732c17a7a1cb13acbcd7650a2";
+    sha256 = "0rlm5krmq6n8yi47dgdsjyrkz3m079pndpbzkz2gx98pb3jd9pjs";
+  };
+
+  patches = [
+    (fetchpatch {
+       name = "fix-intarray-test.patch";
+       url = "https://github.com/minrk/traittypes/commit/a02441e5b259e5858453a853207260c9bd4efbb5.patch";
+       sha256 = "120dsvr5nksizw75z1ah3h38mi399fxbvz5anakica557jahi0aw";
+    })
+  ];
+
+  propagatedBuildInputs = [ traitlets ];
+
+  nativeCheckInputs = [ numpy pandas xarray nose pytestCheckHook ];
+
+  disabledTestPaths = lib.optionals (lib.versionAtLeast numpy.version "1.17") [
+    # https://github.com/jupyter-widgets/traittypes/blob/master/setup.py#L86-L87
+    "traittypes/tests/test_traittypes.py"
+  ];
+
+  pythonImportsCheck = [ "traittypes" ];
+
+  meta = with lib; {
+    description = "Trait types for NumPy, SciPy, XArray, and Pandas";
+    homepage = "https://github.com/jupyter-widgets/traittypes";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/trampoline/default.nix b/nixpkgs/pkgs/development/python-modules/trampoline/default.nix
new file mode 100644
index 000000000000..2be2ff6e819d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trampoline/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitLab
+, pytestCheckHook
+}:
+
+buildPythonPackage {
+  pname = "trampoline";
+  version = "0.1.2";
+  format = "setuptools";
+
+  # only wheel on pypi, no tags on git
+  src = fetchFromGitLab {
+    owner = "ferreum";
+    repo = "trampoline";
+    rev = "1d98f39c3015594e2ac8ed48dccc2f393b4dd82b";
+    hash = "sha256-A/tuR+QW9sKh76Qjwn1uQxlVJgWrSFzXeBRDdnSi2o4=";
+  };
+
+  pythonImportsCheck = [
+    "trampoline"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Simple and tiny yield-based trampoline implementation for python";
+    homepage = "https://gitlab.com/ferreum/trampoline";
+    license = licenses.mit;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/transaction/default.nix b/nixpkgs/pkgs/development/python-modules/transaction/default.nix
new file mode 100644
index 000000000000..12a86a134457
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/transaction/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, zope_interface
+, mock
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "transaction";
+  version = "3.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ZdCx6pLb58Tjsjf7a9i0Heoj10Wee92MOIC//a+RL6Q=";
+  };
+
+  propagatedBuildInputs = [
+    zope_interface
+    mock
+  ];
+
+  pythonImportsCheck = [
+    "transaction"
+  ];
+
+  meta = with lib; {
+    description = "Transaction management";
+    homepage = "https://transaction.readthedocs.io/";
+    changelog = "https://github.com/zopefoundation/transaction/blob/${version}/CHANGES.rst";
+    license = licenses.zpl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/transformers/default.nix b/nixpkgs/pkgs/development/python-modules/transformers/default.nix
new file mode 100644
index 000000000000..efee6e3d1fa4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/transformers/default.nix
@@ -0,0 +1,182 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+# propagated build inputs
+, filelock
+, huggingface-hub
+, numpy
+, protobuf
+, packaging
+, pyyaml
+, regex
+, requests
+, tokenizers
+, safetensors
+, tqdm
+# optional dependencies
+, scikit-learn
+, tensorflow
+, onnxconverter-common
+, tf2onnx
+, torch
+, accelerate
+, faiss
+, datasets
+, jax
+, jaxlib
+, flax
+, optax
+, ftfy
+, onnxruntime
+, onnxruntime-tools
+, cookiecutter
+, sagemaker
+, fairscale
+, optuna
+, ray
+, pydantic
+, uvicorn
+, fastapi
+, starlette
+, librosa
+, phonemizer
+, torchaudio
+, pillow
+, timm
+, torchvision
+, av
+, sentencepiece
+}:
+
+buildPythonPackage rec {
+  pname = "transformers";
+  version = "4.35.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "huggingface";
+    repo = "transformers";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-h1RMSEcuali05AWeTm1wyZQJz6XrHamCF1eHrSnFnfM=";
+  };
+
+  propagatedBuildInputs = [
+    filelock
+    huggingface-hub
+    numpy
+    packaging
+    pyyaml
+    regex
+    requests
+    tokenizers
+    safetensors
+    tqdm
+  ];
+
+  passthru.optional-dependencies =
+  let
+    audio = [
+      librosa
+      # pyctcdecode
+      phonemizer
+      # kenlm
+    ];
+    vision = [ pillow ];
+  in
+    {
+    ja = [
+      # fugashi
+      # ipadic
+      # rhoknp
+      # sudachidict_core
+      # sudachipy
+      # unidic
+      # unidic_lite
+    ];
+    sklearn = [
+      scikit-learn
+    ];
+    tf = [
+      tensorflow
+      onnxconverter-common
+      tf2onnx
+      # tensorflow-text
+      # keras-nlp
+    ];
+    torch = [
+      torch
+      accelerate
+    ];
+    retrieval = [ faiss datasets ];
+    flax = [ jax jaxlib flax optax ];
+    tokenizers = [
+      tokenizers
+    ];
+    ftfy = [ ftfy ];
+    onnxruntime = [
+      onnxruntime
+      onnxruntime-tools
+    ];
+    onnx = [
+      onnxconverter-common
+      tf2onnx
+      onnxruntime
+      onnxruntime-tools
+    ];
+    modelcreation = [
+      cookiecutter
+    ];
+    sagemaker = [
+      sagemaker
+    ];
+    deepspeed = [
+      # deepspeed
+      accelerate
+    ];
+    fairscale = [ fairscale ];
+    optuna = [ optuna ];
+    ray = [ ray ] ++ ray.optional-dependencies.tune-deps;
+    # sigopt = [ sigopt ];
+    # integrations = ray ++ optuna ++ sigopt;
+    serving = [
+      pydantic
+      uvicorn
+      fastapi
+      starlette
+    ];
+    audio = audio;
+    speech = [ torchaudio ] ++ audio;
+    torch-speech = [ torchaudio ] ++ audio;
+    tf-speech = audio;
+    flax-speech = audio;
+    timm = [ timm ];
+    torch-vision = [ torchvision ] ++ vision;
+    # natten = [ natten ];
+    # codecarbon = [ codecarbon ];
+    video = [
+      # decord
+      av
+    ];
+    sentencepiece = [ sentencepiece protobuf ];
+  };
+
+
+  # Many tests require internet access.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "transformers"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/huggingface/transformers";
+    description = "Natural Language Processing for TensorFlow 2.0 and PyTorch";
+    changelog = "https://github.com/huggingface/transformers/releases/tag/v${version}";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ pashashocky happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/transforms3d/default.nix b/nixpkgs/pkgs/development/python-modules/transforms3d/default.nix
new file mode 100644
index 000000000000..6bab6a5148b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/transforms3d/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, numpy
+, scipy
+, sympy
+}:
+
+buildPythonPackage rec {
+  pname = "transforms3d";
+  version = "0.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "matthew-brett";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-GgnjvwAfyxnDfBGvgMFIPPbR88BWFiNGrScVORygq94=";
+  };
+
+  propagatedBuildInputs = [ numpy sympy ];
+
+  nativeCheckInputs = [ pytestCheckHook scipy ];
+  pythonImportsCheck = [ "transforms3d" ];
+
+  meta = with lib; {
+    homepage = "https://matthew-brett.github.io/transforms3d";
+    description = "Convert between various geometric transformations";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ bcdarwin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/transitions/default.nix b/nixpkgs/pkgs/development/python-modules/transitions/default.nix
new file mode 100644
index 000000000000..9b054c823342
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/transitions/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pythonAtLeast
+, six
+, pygraphviz
+, pytestCheckHook
+, mock
+, graphviz
+, pycodestyle
+, fontconfig
+}:
+
+buildPythonPackage rec {
+  pname = "transitions";
+  version = "0.9.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-L1TRG9siV3nX5ykBHpOp+3F2aM49xl+NT1pde6L0jhA=";
+  };
+
+  propagatedBuildInputs = [
+    six
+    pygraphviz # optional
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+    graphviz
+    pycodestyle
+  ];
+
+  preCheck = ''
+    export FONTCONFIG_FILE=${fontconfig.out}/etc/fonts/fonts.conf
+    export HOME=$TMPDIR
+  '';
+
+  # upstream issue https://github.com/pygraphviz/pygraphviz/issues/441
+  pytestFlagsArray = lib.optionals stdenv.isDarwin [
+    "--deselect=tests/test_pygraphviz.py::PygraphvizTest::test_binary_stream"
+    "--deselect=tests/test_pygraphviz.py::PygraphvizTest::test_diagram"
+    "--deselect=tests/test_pygraphviz.py::TestPygraphvizNested::test_binary_stream"
+    "--deselect=tests/test_pygraphviz.py::TestPygraphvizNested::test_diagram"
+  ];
+
+  pythonImportsCheck = [
+    "transitions"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pytransitions/transitions";
+    description = "A lightweight, object-oriented finite state machine implementation in Python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/translatehtml/default.nix b/nixpkgs/pkgs/development/python-modules/translatehtml/default.nix
new file mode 100644
index 000000000000..e97e248edfdd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/translatehtml/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, argostranslate
+, beautifulsoup4
+}:
+
+buildPythonPackage rec {
+  pname = "translatehtml";
+  version = "1.5.2";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6b30ceb8b6f174917e2660caf2d2ccbaa71d8d24c815316edf56b061d678820d";
+  };
+
+  patches = [
+    # https://github.com/argosopentech/translate-html/pull/15
+    (fetchpatch {
+      url = "https://github.com/argosopentech/translate-html/commit/b1c2d210ec1b5fcd0eb79f578bdb5d3ed5c9963a.patch";
+      hash = "sha256-U65vVuRodMS32Aw6PZlLwaCos51P5B88n5hDgJNMZXU=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    argostranslate
+    beautifulsoup4
+  ];
+
+  postPatch = ''
+    ln -s */requires.txt requirements.txt
+
+    substituteInPlace requirements.txt  \
+      --replace "==" ">="
+  '';
+
+  # required for import check to work (argostranslate)
+  env.HOME = "/tmp";
+
+  pythonImportsCheck = [ "translatehtml" ];
+
+  doCheck = false; # no tests
+
+  meta = with lib; {
+    description = "Translate HTML using Beautiful Soup and Argos Translate.";
+    homepage = "https://www.argosopentech.com";
+    license = licenses.mit;
+    maintainers = with maintainers; [ misuzu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/translatepy/default.nix b/nixpkgs/pkgs/development/python-modules/translatepy/default.nix
new file mode 100644
index 000000000000..08e7dfab6177
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/translatepy/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, beautifulsoup4
+, pyuseragents
+, safeio
+, inquirer
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "translatepy";
+  version = "2.3";
+
+  src = fetchFromGitHub {
+    owner = "Animenosekai";
+    repo = "translate";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-cx5OeBrB8il8KrcyOmQbQ7VCXoaA5RP++oTTxCs/PcM=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    beautifulsoup4
+    pyuseragents
+    safeio
+    inquirer
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  disabledTestPaths = [
+    # Requires network connection
+    "tests/test_translate.py"
+    "tests/test_translators.py"
+  ];
+  pythonImportsCheck = [ "translatepy" ];
+
+  meta = with lib; {
+    description = "A module grouping multiple translation APIs";
+    homepage = "https://github.com/Animenosekai/translate";
+    license = with licenses; [ agpl3Only ];
+    maintainers = with maintainers; [ emilytrau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/translationstring/default.nix b/nixpkgs/pkgs/development/python-modules/translationstring/default.nix
new file mode 100644
index 000000000000..f7036128e08e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/translationstring/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "translationstring";
+  version = "1.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bf947538d76e69ba12ab17283b10355a9ecfbc078e6123443f43f2107f6376f3";
+  };
+
+  meta = with lib; {
+    homepage = "https://pylonsproject.org/";
+    description = "Utility library for i18n relied on by various Repoze and Pyramid packages";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/transmission-rpc/default.nix b/nixpkgs/pkgs/development/python-modules/transmission-rpc/default.nix
new file mode 100644
index 000000000000..32427487934a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/transmission-rpc/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, python-dotenv
+, pytz
+, requests
+, typing-extensions
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "transmission-rpc";
+  version = "7.0.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Trim21";
+    repo = "transmission-rpc";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-HthWeFInolNEs7RNA773DJjhGvl1rfDhvhO8WwRwuuY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    python-dotenv
+    pytz
+    pytestCheckHook
+    yarl
+  ];
+
+  pythonImportsCheck = [
+    "transmission_rpc"
+  ];
+
+  disabledTests = [
+    # Tests require a running Transmission instance
+    "test_real"
+  ];
+
+  meta = with lib; {
+    description = "Python module that implements the Transmission bittorent client RPC protocol";
+    homepage = "https://github.com/Trim21/transmission-rpc";
+    changelog = "https://github.com/trim21/transmission-rpc/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ eyjhb ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/transmissionrpc/default.nix b/nixpkgs/pkgs/development/python-modules/transmissionrpc/default.nix
new file mode 100644
index 000000000000..3a484692d1a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/transmissionrpc/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "transmissionrpc";
+  version = "0.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ec43b460f9fde2faedbfa6d663ef495b3fd69df855a135eebe8f8a741c0dde60";
+  };
+
+  propagatedBuildInputs = [ six ];
+
+  # no tests
+  doCheck = false;
+  pythonImportsCheck = [ "transmissionrpc" ];
+
+  meta = with lib; {
+    description = "Python implementation of the Transmission bittorent client RPC protocol";
+    homepage = "https://pypi.python.org/pypi/transmissionrpc/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/trectools/default.nix b/nixpkgs/pkgs/development/python-modules/trectools/default.nix
new file mode 100644
index 000000000000..3948d0441d90
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trectools/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, beautifulsoup4
+, pythonOlder
+, pandas
+, python
+, numpy
+, scikit-learn
+, scipy
+, lxml
+, matplotlib
+, sarge
+}:
+
+buildPythonPackage rec {
+  pname = "trectools";
+  version = "0.0.49";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "joaopalotti";
+    repo = pname;
+    # https://github.com/joaopalotti/trectools/issues/41
+    rev = "5c1d56e9cf955f45b5a1780ee6a82744d31e7a79";
+    hash = "sha256-Lh6sK2rxEdCsOUKHn1jgm+rsn8FK1f2po0UuZfZajBA=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "bs4 >= 0.0.0.1" "beautifulsoup4 >= 4.11.1"
+  '';
+
+  propagatedBuildInputs = [
+    pandas
+    numpy
+    scikit-learn
+    scipy
+    lxml
+    beautifulsoup4
+    matplotlib
+    sarge
+  ];
+
+  checkPhase = ''
+    cd unittests
+    ${python.interpreter} -m unittest runner
+  '';
+
+  pythonImportsCheck = [ "trectools" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/joaopalotti/trectools";
+    description = "Library for assisting Information Retrieval (IR) practitioners with TREC-like campaigns";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ MoritzBoehme ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tree-sitter/default.nix b/nixpkgs/pkgs/development/python-modules/tree-sitter/default.nix
new file mode 100644
index 000000000000..6eb833b92d50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tree-sitter/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "tree-sitter";
+  version = "0.20.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "tree_sitter";
+    inherit version;
+    hash = "sha256-atsSPi8+VjmbvyNZkkYzyILMQO6DRIhSALygki9xO+U=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  # PyPI tarball doesn't contains tests and source has additional requirements
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "tree_sitter"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings to the Tree-sitter parsing library";
+    homepage = "https://github.com/tree-sitter/py-tree-sitter";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/treelib/default.nix b/nixpkgs/pkgs/development/python-modules/treelib/default.nix
new file mode 100644
index 000000000000..cf32b37a2319
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/treelib/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "treelib";
+  version = "1.7.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "caesar0301";
+    repo = "treelib";
+    rev = "v${version}";
+    hash = "sha256-FIdJWpkOmUVZb+IkYocu1nn+oSPROrkcHeiw9wZupgM=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "treelib" ];
+
+  meta = with lib; {
+    description = "An efficient implementation of tree data structure in python 2/3";
+    homepage = "https://github.com/caesar0301/treelib";
+    changelog = "https://github.com/caesar0301/treelib/releases/tag/${src.rev}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/treelog/default.nix b/nixpkgs/pkgs/development/python-modules/treelog/default.nix
new file mode 100644
index 000000000000..e3b85cd64fb8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/treelog/default.nix
@@ -0,0 +1,28 @@
+{ lib , python, buildPythonPackage , fetchPypi, typing-extensions }:
+
+buildPythonPackage rec {
+  pname = "treelog";
+  version = "1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0hnivz4p4llky6djxgcsr9r3j4vr46mkjvp0ksybhpx0fsnhdi81";
+  };
+
+  pythonImportsCheck = [ "treelog" ];
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m unittest
+  '';
+
+  meta = with lib; {
+    description = "Logging framework that organizes messages in a tree structure";
+    homepage = "https://github.com/evalf/treelog";
+    license = licenses.mit;
+    maintainers = [ maintainers.Scriptkiddi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/treeo/default.nix b/nixpkgs/pkgs/development/python-modules/treeo/default.nix
new file mode 100644
index 000000000000..789eb346e8c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/treeo/default.nix
@@ -0,0 +1,59 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, jax
+, jaxlib
+, lib
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "treeo";
+  # Note that there is a version 0.4.0, but it was released in error. At the
+  # time of writing (2022-03-29), v0.0.11 is the latest as reported on GitHub
+  # and PyPI.
+  version = "0.4.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "cgarciae";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-0py7sKjq6WqdsZwTq61jqaIbULTfwtpz29TTpt8M2Zw=";
+  };
+
+  # See https://github.com/cgarciae/treex/issues/68.
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/cgarciae/treeo/pull/14/commits/022915da2b3bf76406a7c79d1b4593bee7956f16.patch";
+      hash = "sha256-WGxJqqrf2g0yZe30RyG1xxbloiqj1awuf1Y4eh5y+z0=";
+    })
+    (fetchpatch {
+      url = "https://github.com/cgarciae/treeo/pull/14/commits/99f9488bd0c977780844fd79743167b0010d359b.patch";
+      hash = "sha256-oKDYs+Ah0QXkhiJysIudQ6VLIiUiIcnQisxYp6GJuTc=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  # jax is not declared in the dependencies, but is necessary.
+  propagatedBuildInputs = [
+    jax
+  ];
+
+  nativeCheckInputs = [ jaxlib ];
+  pythonImportsCheck = [
+    "treeo"
+  ];
+
+  meta = with lib; {
+    description = "A small library for creating and manipulating custom JAX Pytree classes.";
+    homepage = "https://github.com/cgarciae/treeo";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ndl ];
+    # obsolete as of 2023-02-27 and not updated for more than a year as of 2023-08
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/treex/default.nix b/nixpkgs/pkgs/development/python-modules/treex/default.nix
new file mode 100644
index 000000000000..cfbadc344eff
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/treex/default.nix
@@ -0,0 +1,78 @@
+{ buildPythonPackage
+, cloudpickle
+, dm-haiku
+, einops
+, fetchFromGitHub
+, flax
+, hypothesis
+, jaxlib
+, keras
+, lib
+, poetry-core
+, pytestCheckHook
+, pyyaml
+, rich
+, tensorflow
+, treeo
+, torchmetrics
+, pythonRelaxDepsHook
+, torch
+}:
+
+buildPythonPackage rec {
+  pname = "treex";
+  version = "0.6.11";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "cgarciae";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-ObOnbtAT4SlrwOms1jtn7/XKZorGISGY6VuhQlC3DaQ=";
+  };
+
+  # At the time of writing (2022-03-29), rich is currently at version 11.0.0.
+  # The treeo dependency is compatible with a patch, but not marked as such in
+  # treex. See https://github.com/cgarciae/treex/issues/68.
+  pythonRelaxDeps = [
+    "certifi"
+    "flax"
+    "rich"
+    "treeo"
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  buildInputs = [ jaxlib ];
+
+  propagatedBuildInputs = [
+    einops
+    flax
+    pyyaml
+    rich
+    treeo
+    torch
+  ];
+
+  nativeCheckInputs = [
+    cloudpickle
+    dm-haiku
+    hypothesis
+    keras
+    pytestCheckHook
+    tensorflow
+    torchmetrics
+  ];
+
+  pythonImportsCheck = [ "treex" ];
+
+  meta = with lib; {
+    description = "Pytree Module system for Deep Learning in JAX";
+    homepage = "https://github.com/cgarciae/treex";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ndl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/treq/default.nix b/nixpkgs/pkgs/development/python-modules/treq/default.nix
new file mode 100644
index 000000000000..540e52f0793b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/treq/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, requests
+, twisted
+, incremental
+, httpbin
+}:
+
+buildPythonPackage rec {
+  pname = "treq";
+  version = "22.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-33V+PxQfx4Lt4HamBFIRlP/LQPomRc9I5aNwYDB/Uuw=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    incremental
+    twisted
+  ] ++ twisted.optional-dependencies.tls;
+
+  nativeCheckInputs = [
+    httpbin
+    twisted
+  ];
+
+  checkPhase = ''
+    trial treq
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/twisted/treq";
+    description = "Requests-like API built on top of twisted.web's Agent";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/trezor/default.nix b/nixpkgs/pkgs/development/python-modules/trezor/default.nix
new file mode 100644
index 000000000000..23af30faefba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trezor/default.nix
@@ -0,0 +1,86 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, installShellFiles
+, attrs
+, click
+, construct
+, construct-classes
+, ecdsa
+, hidapi
+, libusb1
+, mnemonic
+, pillow
+, protobuf
+, requests
+, shamir-mnemonic
+, simple-rlp
+, typing-extensions
+, trezor-udev-rules
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "trezor";
+  version = "0.13.8";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Y01O3fNWAyV8MhYY2FSMajWyc4Rle2XjsL261jWlfP8=";
+  };
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  propagatedBuildInputs = [
+    attrs
+    click
+    construct
+    construct-classes
+    ecdsa
+    hidapi
+    libusb1
+    mnemonic
+    pillow
+    protobuf
+    requests
+    shamir-mnemonic
+    simple-rlp
+    typing-extensions
+  ] ++ lib.optionals stdenv.isLinux [
+    trezor-udev-rules
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  disabledTestPaths = [
+    "tests/test_stellar.py" # requires stellar-sdk
+    "tests/test_firmware.py" # requires network downloads
+  ];
+
+  pythonImportsCheck = [ "trezorlib" ];
+
+  postCheck = ''
+    $out/bin/trezorctl --version
+  '';
+
+  postFixup = ''
+    mkdir completions
+    _TREZORCTL_COMPLETE=source_bash $out/bin/trezorctl > completions/trezorctl || true
+    _TREZORCTL_COMPLETE=source_zsh $out/bin/trezorctl > completions/_trezorctl || true
+    _TREZORCTL_COMPLETE=source_fish $out/bin/trezorctl > completions/trezorctl.fish || true
+    installShellCompletion --bash completions/trezorctl
+    installShellCompletion --zsh completions/_trezorctl
+    installShellCompletion --fish completions/trezorctl.fish
+  '';
+
+  meta = with lib; {
+    description = "Python library for communicating with Trezor Hardware Wallet";
+    homepage = "https://github.com/trezor/trezor-firmware/tree/master/python";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ np prusnak mmahut ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/trezor_agent/default.nix b/nixpkgs/pkgs/development/python-modules/trezor_agent/default.nix
new file mode 100644
index 000000000000..d6ff9bb36dfa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trezor_agent/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, trezor
+, libagent
+, ecdsa
+, ed25519
+, mnemonic
+, keepkey
+, semver
+, setuptools
+, wheel
+, pinentry
+}:
+
+buildPythonPackage rec {
+  pname = "trezor_agent";
+  version = "0.12.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-4IylpUvXZYAXFkyFGNbN9iPTsHff3M/RL2Eq9f7wWFU=";
+  };
+
+  propagatedBuildInputs = [ setuptools trezor libagent ecdsa ed25519 mnemonic keepkey semver wheel pinentry ];
+
+  # relax dependency constraint
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "trezor[hidapi]>=0.12.0,<0.13" "trezor[hidapi]>=0.12.0,<0.14"
+  '';
+
+  doCheck = false;
+  pythonImportsCheck = [ "libagent" ];
+
+  meta = with lib; {
+    description = "Using Trezor as hardware SSH agent";
+    homepage = "https://github.com/romanz/trezor-agent";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ hkjn np mmahut ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/trfl/default.nix b/nixpkgs/pkgs/development/python-modules/trfl/default.nix
new file mode 100644
index 000000000000..b81481e3841b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trfl/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, numpy
+, absl-py
+, dm-tree
+, wrapt
+, tensorflow
+, tensorflow-probability
+, pytestCheckHook
+, nose }:
+
+buildPythonPackage rec {
+  pname = "trfl";
+  version = "1.2.0";
+
+  src = fetchFromGitHub {
+    owner = "deepmind";
+    repo = pname;
+    rev = "ed6eff5b79ed56923bcb102e152c01ea52451d4c";
+    hash = "sha256-UsDUKJCHSJ4gP+P95Pm7RsPpqTJqJhrsW47C7fTZ77I=";
+  };
+
+  buildInputs = [
+    absl-py
+    dm-tree
+    numpy
+    wrapt
+  ];
+
+  propagatedBuildInputs = [
+    tensorflow
+    tensorflow-probability
+  ];
+
+  nativeCheckInputs = [
+    nose
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "trfl"
+  ];
+
+  # Tests currently fail with assertion errors
+  doCheck = false;
+
+  disabledTestPaths = [
+    # AssertionErrors
+    "trfl/indexing_ops_test.py"
+    "trfl/vtrace_ops_test.py"
+    "trfl/value_ops_test.py"
+    "trfl/target_update_ops_test.py"
+    "trfl/sequence_ops_test.py"
+    "trfl/retrace_ops_test.py"
+    "trfl/policy_ops_test.py"
+    "trfl/policy_gradient_ops_test.py"
+    "trfl/pixel_control_ops_test.py"
+    "trfl/periodic_ops_test.py"
+    "trfl/dpg_ops_test.py"
+    "trfl/distribution_ops_test.py"
+    "trfl/dist_value_ops_test.py"
+    "trfl/discrete_policy_gradient_ops_test.py"
+    "trfl/continuous_retrace_ops_test.py"
+    "trfl/clipping_ops_test.py"
+    "trfl/action_value_ops_test.py"
+  ];
+
+  meta = with lib; {
+    description = "TensorFlow Reinforcement Learning";
+    homepage = "https://github.com/deepmind/trfl";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/trimesh/default.nix b/nixpkgs/pkgs/development/python-modules/trimesh/default.nix
new file mode 100644
index 000000000000..477fb3b97438
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trimesh/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, pytestCheckHook
+, pythonOlder
+, numpy
+, lxml
+}:
+
+buildPythonPackage rec {
+  pname = "trimesh";
+  version = "4.0.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ub/P7AO3CrTSHwVd8atz6HQN0LyP1WSCc+74/sds3fk=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  propagatedBuildInputs = [ numpy ];
+
+  nativeCheckInputs = [ lxml pytestCheckHook ];
+
+  disabledTests = [
+    # requires loading models which aren't part of the Pypi tarball
+    "test_load"
+  ];
+
+  pytestFlagsArray = [ "tests/test_minimal.py" ];
+
+  pythonImportsCheck = [ "trimesh" ];
+
+  meta = with lib; {
+    description = "Python library for loading and using triangular meshes";
+    homepage = "https://trimsh.org/";
+    changelog = "https://github.com/mikedh/trimesh/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gebner pbsds ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/trino-python-client/default.nix b/nixpkgs/pkgs/development/python-modules/trino-python-client/default.nix
new file mode 100644
index 000000000000..479832bf9564
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trino-python-client/default.nix
@@ -0,0 +1,81 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+  # build
+, setuptools
+  # required
+, pytz
+, requests
+, tzlocal
+  # optional
+, requests-kerberos
+, sqlalchemy
+, keyring
+  # tests
+, pytestCheckHook
+, httpretty
+}:
+
+buildPythonPackage rec {
+  pname = "trino-python-client";
+  version = "0.322.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    repo = pname;
+    owner = "trinodb";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Hl88Keavyp1QBw67AFbevy/btzNs7UlsKQ93K02YgLM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pytz
+    requests
+    tzlocal
+  ];
+
+  passthru.optional-dependencies = lib.fix (self: {
+    kerberos = [
+      requests-kerberos
+    ];
+    sqlalchemy = [
+      sqlalchemy
+    ];
+    external-authentication-token-cache = [
+      keyring
+    ];
+    all = self.kerberos ++ self.sqlalchemy;
+  });
+
+  nativeCheckInputs = [
+    httpretty
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.all;
+
+  pythonImportsCheck = [
+    "trino"
+  ];
+
+  disabledTestPaths = [
+    # these all require a running trino instance
+    "tests/integration/test_types_integration.py"
+    "tests/integration/test_dbapi_integration.py"
+    "tests/integration/test_sqlalchemy_integration.py"
+  ];
+
+  pytestFlagsArray = [
+    "-k 'not auth'"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/trinodb/trino-python-client/blob/${version}/CHANGES.md";
+    description = "Client for the Trino distributed SQL Engine";
+    homepage = "https://github.com/trinodb/trino-python-client";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ cpcloud ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/trio-asyncio/default.nix b/nixpkgs/pkgs/development/python-modules/trio-asyncio/default.nix
new file mode 100644
index 000000000000..3585e2519918
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trio-asyncio/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, trio
+, outcome
+, sniffio
+, pytest-trio
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "trio-asyncio";
+  version = "0.12.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "trio_asyncio";
+    inherit version;
+    sha256 = "824be23b0c678c0df942816cdb57b92a8b94f264fffa89f04626b0ba2d009768";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'" ""
+  '';
+
+  propagatedBuildInputs = [
+    trio
+    outcome
+    sniffio
+  ];
+
+  nativeCheckInputs = [
+    pytest-trio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    # https://github.com/python-trio/trio-asyncio/issues/112
+    "-W" "ignore::DeprecationWarning"
+    # trio.MultiError is deprecated since Trio 0.22.0; use BaseExceptionGroup (on Python 3.11 and later) or exceptiongroup.BaseExceptionGroup (earlier versions) instead (https://github.com/python-trio/trio/issues/2211)
+    "-W" "ignore::trio.TrioDeprecationWarning"
+  ];
+
+  disabledTestPaths = [
+    "tests/python" # tries to import internal API test.test_asyncio
+  ];
+
+  disabledTests = lib.optionals (pythonAtLeast "3.11") [
+    "test_run_task"
+  ];
+
+  pythonImportsCheck = [
+    "trio_asyncio"
+  ];
+
+  meta = with lib; {
+    description = "Re-implementation of the asyncio mainloop on top of Trio";
+    homepage = "https://github.com/python-trio/trio-asyncio";
+    license = with licenses; [ asl20 /* or */ mit ];
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/trio-websocket/default.nix b/nixpkgs/pkgs/development/python-modules/trio-websocket/default.nix
new file mode 100644
index 000000000000..98fdcfae0c16
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trio-websocket/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, exceptiongroup
+, pytest-trio
+, pytestCheckHook
+, trio
+, trustme
+, wsproto
+}:
+
+buildPythonPackage rec {
+  pname = "trio-websocket";
+  version = "0.10.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "HyperionGray";
+    repo = "trio-websocket";
+    rev = version;
+    hash = "sha256-djoTxkIKY52l+WnxL1FwlqrU/zvsLVkPUAHn9BxJ45k=";
+  };
+
+  propagatedBuildInputs = [
+    exceptiongroup
+    trio
+    wsproto
+  ];
+
+  nativeCheckInputs = [
+    pytest-trio
+    pytestCheckHook
+    trustme
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # Failed: DID NOT RAISE <class 'ValueError'>
+    "test_finalization_dropped_exception"
+    # Timing related
+    "test_client_close_timeout"
+    "test_cm_exit_with_pending_messages"
+    "test_server_close_timeout"
+    "test_server_handler_exit"
+    "test_server_open_timeout"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [ "trio_websocket" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/HyperionGray/trio-websocket/blob/${version}/CHANGELOG.md";
+    description = "WebSocket client and server implementation for Python Trio";
+    homepage = "https://github.com/HyperionGray/trio-websocket";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/trio/default.nix b/nixpkgs/pkgs/development/python-modules/trio/default.nix
new file mode 100644
index 000000000000..c01db3259a7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trio/default.nix
@@ -0,0 +1,94 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder
+, attrs
+, sortedcontainers
+, async-generator
+, exceptiongroup
+, idna
+, outcome
+, pytestCheckHook
+, pytest-trio
+, pyopenssl
+, trustme
+, sniffio
+, stdenv
+, jedi
+, astor
+, yapf
+, coreutils
+}:
+
+let
+  # escape infinite recursion with pytest-trio
+  pytest-trio' = (pytest-trio.override {
+    trio = null;
+  }).overrideAttrs {
+    doCheck = false;
+    pythonImportsCheck = [];
+  };
+in
+buildPythonPackage rec {
+  pname = "trio";
+  version = "0.22.2";
+  format = "setuptools";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-OIfPGMi8yJRDNCAwVGg4jax2ky6WaK+hxJqjgGtqzLM=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    sortedcontainers
+    async-generator
+    idna
+    outcome
+    sniffio
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    exceptiongroup
+  ];
+
+  # tests are failing on Darwin
+  doCheck = !stdenv.isDarwin;
+
+  nativeCheckInputs = [
+    astor
+    jedi
+    pyopenssl
+    pytestCheckHook
+    pytest-trio'
+    trustme
+    yapf
+  ];
+
+  preCheck = ''
+    substituteInPlace trio/_tests/test_subprocess.py \
+      --replace "/bin/sleep" "${coreutils}/bin/sleep"
+
+    export HOME=$TMPDIR
+  '';
+
+  # It appears that the build sandbox doesn't include /etc/services, and these tests try to use it.
+  disabledTests = [
+    "getnameinfo"
+    "SocketType_resolve"
+    "getprotobyname"
+    "waitpid"
+    "static_tool_sees_all_symbols"
+    # tests pytest more than python
+    "fallback_when_no_hook_claims_it"
+    # requires mypy
+    "test_static_tool_sees_class_members"
+  ];
+
+  pytestFlagsArray = [
+    "-W" "ignore::DeprecationWarning"
+  ];
+
+  meta = {
+    description = "An async/await-native I/O library for humans and snake people";
+    homepage = "https://github.com/python-trio/trio";
+    license = with lib.licenses; [ mit asl20 ];
+    maintainers = with lib.maintainers; [ catern ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tritonclient/default.nix b/nixpkgs/pkgs/development/python-modules/tritonclient/default.nix
new file mode 100644
index 000000000000..f218d02a4e2b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tritonclient/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pythonOlder
+, python-rapidjson
+, numpy
+  # optional dependencies
+, grpcio
+, packaging
+, aiohttp
+, geventhttpclient
+}:
+
+let
+  pname = "tritonclient";
+  version = "2.35.0";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "wheel";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    python = "py3";
+    dist = "py3";
+    format = "wheel";
+    platform = "manylinux1_x86_64";
+    hash = "sha256-JXVr+DWkM2g7CiU9STMcZyQJieXgNbKXlX/jqf/oam8=";
+  };
+
+  propagatedBuildInputs = [
+    python-rapidjson
+    numpy
+  ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "tritonclient"
+  ];
+
+  passthru = {
+    optional-dependencies = {
+      http = [
+        aiohttp
+        geventhttpclient
+      ];
+      grpc = [
+        grpcio
+        packaging
+      ];
+    };
+  };
+
+  meta = with lib; {
+    description = "Triton python client";
+    homepage = "https://github.com/triton-inference-server/client";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ happysalada ];
+    platforms = platforms.linux;
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/troposphere/default.nix b/nixpkgs/pkgs/development/python-modules/troposphere/default.nix
new file mode 100644
index 000000000000..016ed7de737b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/troposphere/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, awacs
+, buildPythonPackage
+, cfn-flip
+, fetchFromGitHub
+, pythonOlder
+, typing-extensions
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "troposphere";
+  version = "4.5.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "cloudtools";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-LLky4lSSMUmLEf+qHwgPvDu0DZhG4WWZ1aFSXqFm1BA=";
+  };
+
+  propagatedBuildInputs = [
+    cfn-flip
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    awacs
+    unittestCheckHook
+  ];
+
+  passthru.optional-dependencies = {
+    policy = [
+      awacs
+    ];
+  };
+
+  pythonImportsCheck = [
+    "troposphere"
+  ];
+
+  meta = with lib; {
+    description = "Library to create AWS CloudFormation descriptions";
+    homepage = "https://github.com/cloudtools/troposphere";
+    changelog = "https://github.com/cloudtools/troposphere/blob/${version}/CHANGELOG.rst";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ jlesquembre ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/trove-classifiers/default.nix b/nixpkgs/pkgs/development/python-modules/trove-classifiers/default.nix
new file mode 100644
index 000000000000..e9691044a926
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trove-classifiers/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, calver
+, pytestCheckHook
+, pythonOlder
+}:
+
+let
+  self = buildPythonPackage rec {
+    pname = "trove-classifiers";
+    version = "2023.8.7";
+    format = "setuptools";
+
+    disabled = pythonOlder "3.7";
+
+    src = fetchPypi {
+      inherit pname version;
+      hash = "sha256-yfKgqF1UXlNi6Wfk8Gn1b939kSFeIv+kjGb7KDUhMZo=";
+    };
+
+    postPatch = ''
+      substituteInPlace setup.py \
+        --replace '"calver"' ""
+    '';
+
+    nativeBuildInputs = [
+      calver
+    ];
+
+    doCheck = false; # avoid infinite recursion with hatchling
+
+    nativeCheckInputs = [
+      pytestCheckHook
+    ];
+
+    pythonImportsCheck = [ "trove_classifiers" ];
+
+    passthru.tests.trove-classifiers = self.overridePythonAttrs { doCheck = true; };
+
+    meta = {
+      description = "Canonical source for classifiers on PyPI";
+      homepage = "https://github.com/pypa/trove-classifiers";
+      changelog = "https://github.com/pypa/trove-classifiers/releases/tag/${version}";
+      license = lib.licenses.asl20;
+      maintainers = with lib.maintainers; [ dotlambda ];
+    };
+  };
+in
+  self
diff --git a/nixpkgs/pkgs/development/python-modules/trueskill/default.nix b/nixpkgs/pkgs/development/python-modules/trueskill/default.nix
new file mode 100644
index 000000000000..db16ed7fafbc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trueskill/default.nix
@@ -0,0 +1,28 @@
+{ lib, buildPythonPackage, fetchPypi
+, six }:
+
+buildPythonPackage rec {
+  pname = "trueskill";
+  version = "0.4.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1fv7g1szyjykja9mzax2w4js7jm2z7wwzgnr5dqrsdi84j6v8qlx";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  # Can't build distribute, see https://github.com/NixOS/nixpkgs/pull/49340
+  doCheck = false;
+
+  meta = with lib; {
+    description = "The video game rating system";
+    homepage = "https://trueskill.org";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [
+      eadwu
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/trustme/default.nix b/nixpkgs/pkgs/development/python-modules/trustme/default.nix
new file mode 100644
index 000000000000..4648dd75a26e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trustme/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchPypi
+, idna
+, pyopenssl
+, pytestCheckHook
+, pythonOlder
+, service-identity
+}:
+
+buildPythonPackage rec {
+  pname = "trustme";
+  version = "1.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-U3Wtf7QnB0vslWWS4NTuKkz02miTThukvPQhcSa8ReY=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    idna
+  ];
+
+  nativeCheckInputs = [
+    pyopenssl
+    pytestCheckHook
+    service-identity
+  ];
+
+  # Some of the tests use localhost networking.
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [
+    "trustme"
+  ];
+
+  meta = with lib; {
+    description = "High quality TLS certs while you wait, for the discerning tester";
+    homepage = "https://github.com/python-trio/trustme";
+    changelog = "https://trustme.readthedocs.io/en/latest/#change-history";
+    license = with licenses; [ mit asl20 ];
+    maintainers = with maintainers; [ catern ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/truststore/default.nix b/nixpkgs/pkgs/development/python-modules/truststore/default.nix
new file mode 100644
index 000000000000..961799efeb72
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/truststore/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, httpx
+, pyopenssl
+, pythonOlder
+, requests
+, trustme
+}:
+
+buildPythonPackage rec {
+  pname = "truststore";
+  version = "0.8.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "sethmlarson";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-K11nHzpckNR8pqmgLOo/yCJ2cNQnqPHgjMDPQkpeRkQ=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    httpx
+    pyopenssl
+    requests
+    trustme
+  ];
+
+  # tests requires networking
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "truststore"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/sethmlarson/truststore";
+    description = "Verify certificates using native system trust stores";
+    changelog = "https://github.com/sethmlarson/truststore/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ anthonyroussel ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/trytond/default.nix b/nixpkgs/pkgs/development/python-modules/trytond/default.nix
new file mode 100644
index 000000000000..790a9e4f1a07
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/trytond/default.nix
@@ -0,0 +1,87 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, defusedxml
+, lxml
+, relatorio
+, genshi
+, python-dateutil
+, polib
+, python-sql
+, werkzeug
+, wrapt
+, passlib
+, pydot
+, levenshtein
+, html2text
+, weasyprint
+, gevent
+, pillow
+, withPostgresql ? true
+, psycopg2
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "trytond";
+  version = "6.8.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-o/U8bmCAotgDYY81eX+vXOxJC3f4aQvOF6ohMOHLuLY=";
+  };
+
+  propagatedBuildInputs = [
+    defusedxml
+    lxml
+    relatorio
+    genshi
+    python-dateutil
+    polib
+    python-sql
+    werkzeug
+    wrapt
+    passlib
+
+    # extra dependencies
+    pydot
+    levenshtein
+    html2text
+    weasyprint
+    gevent
+    pillow
+  ] ++ relatorio.optional-dependencies.fodt
+  ++ passlib.optional-dependencies.bcrypt
+  ++ passlib.optional-dependencies.argon2
+  ++ lib.optional withPostgresql psycopg2;
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+    export TRYTOND_DATABASE_URI="sqlite://"
+    export DB_NAME=":memory:";
+  '';
+
+  unittestFlagsArray = [ "-s" "trytond.tests" ];
+
+  meta = with lib; {
+    description = "The server of the Tryton application platform";
+    longDescription = ''
+      The server for Tryton, a three-tier high-level general purpose
+      application platform under the license GPL-3 written in Python and using
+      PostgreSQL as database engine.
+
+      It is the core base of a complete business solution providing
+      modularity, scalability and security.
+    '';
+    homepage = "http://www.tryton.org/";
+    changelog = "https://hg.tryton.org/trytond/file/${version}/CHANGELOG";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ udono johbo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tsfresh/default.nix b/nixpkgs/pkgs/development/python-modules/tsfresh/default.nix
new file mode 100644
index 000000000000..36a93a540051
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tsfresh/default.nix
@@ -0,0 +1,93 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, requests
+, numpy
+, pandas
+, scipy
+, statsmodels
+, patsy
+, scikit-learn
+, tqdm
+, dask
+, distributed
+, stumpy
+, cloudpickle
+, pytestCheckHook
+, pytest-xdist
+, mock
+, matplotlib
+, seaborn
+, ipython
+, notebook
+, pandas-datareader
+}:
+
+buildPythonPackage rec {
+  pname = "tsfresh";
+  version = "0.20.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "blue-yonder";
+    repo = "tsfresh";
+    rev = "v${version}";
+    hash = "sha256-JmdP/6aTnuYsBRiRq9zZng3xNYhOdr9V8bp1trAv508=";
+  };
+
+  patches = [
+    # The pyscaffold is not a build dependency but just a python project bootstrapping tool, so we do not need it
+    ./remove-pyscaffold.patch
+    ./remove-pytest-coverage-flags.patch
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    numpy
+    pandas
+    scipy
+    statsmodels
+    patsy
+    scikit-learn
+    tqdm
+    dask
+    distributed
+    stumpy
+    cloudpickle
+  ] ++ dask.optional-dependencies.dataframe;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-xdist
+    mock
+    matplotlib
+    seaborn
+    ipython
+    notebook
+    pandas-datareader
+  ];
+
+  disabledTests = [
+    # touches network
+    "test_relevant_extraction"
+    "test_characteristics_downloaded_robot_execution_failures"
+    "test_index"
+    "test_binary_target_is_default"
+    "test_characteristics_downloaded_robot_execution_failures"
+    "test_extraction_runs_through"
+    "test_multilabel_target_on_request"
+  ];
+
+  pythonImportsCheck = [ "tsfresh" ];
+
+  meta = with lib; {
+    description = "Automatic extraction of relevant features from time series";
+    homepage = "https://github.com/blue-yonder/tsfresh";
+    changelog = "https://github.com/blue-yonder/tsfresh/blob/${src.rev}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tsfresh/remove-pyscaffold.patch b/nixpkgs/pkgs/development/python-modules/tsfresh/remove-pyscaffold.patch
new file mode 100644
index 000000000000..b77f35cca704
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tsfresh/remove-pyscaffold.patch
@@ -0,0 +1,14 @@
+diff --git a/setup.cfg b/setup.cfg
+index e29e54e..75c3210 100644
+--- a/setup.cfg
++++ b/setup.cfg
+@@ -29,9 +29,6 @@ classifier =
+ 
+ [options]
+ packages = find:
+-# DON'T CHANGE THE FOLLOWING LINE! IT WILL BE UPDATED BY PYSCAFFOLD!
+-setup_requires =
+-   pyscaffold>=3.3a0,<4
+ # Add here dependencies of your project (semicolon/line-separated), e.g.
+ install_requires =
+     requests>=2.9.1
diff --git a/nixpkgs/pkgs/development/python-modules/tsfresh/remove-pytest-coverage-flags.patch b/nixpkgs/pkgs/development/python-modules/tsfresh/remove-pytest-coverage-flags.patch
new file mode 100644
index 000000000000..86b29606a6e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tsfresh/remove-pytest-coverage-flags.patch
@@ -0,0 +1,15 @@
+diff --git a/setup.cfg b/setup.cfg
+index e29e54e..fe8892f 100644
+--- a/setup.cfg
++++ b/setup.cfg
+@@ -99,10 +99,6 @@ extras = True
+ # e.g. --cov-report html (or xml) for html/xml output or --junitxml junit.xml
+ # in order to write a coverage file that can be read by Jenkins.
+ junit_family = xunit2
+-addopts =
+-    --cov tsfresh --cov-report term-missing
+-    --verbose
+-    #-n auto
+ testpaths = tests
+ filterwarnings =
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/tskit/default.nix b/nixpkgs/pkgs/development/python-modules/tskit/default.nix
new file mode 100644
index 000000000000..522d4a57adbc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tskit/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, pythonOlder
+, numpy
+, jsonschema
+, svgwrite
+}:
+
+buildPythonPackage rec {
+  pname = "tskit";
+  version = "0.5.6";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3f4hPxywY822mCF3IwooBezX38fM1zAm4Th4q//SzkY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    jsonschema
+    svgwrite
+  ];
+
+  # Pypi does not include test folder and too complex to compile from GitHub source
+  # will ask upstream to include tests in pypi
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "tskit"
+  ];
+
+  meta = with lib; {
+    description = "The tree sequence toolkit";
+    homepage = "https://github.com/tskit-dev/tskit";
+    license = licenses.mit;
+    maintainers = with maintainers; [ alxsimon ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ttach/default.nix b/nixpkgs/pkgs/development/python-modules/ttach/default.nix
new file mode 100644
index 000000000000..5a7420a27074
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ttach/default.nix
@@ -0,0 +1,33 @@
+{ fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, torch
+, buildPythonPackage
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "ttach";
+  version = "0.0.3";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "qubvel";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-R6QO+9hv0eI7dZW5iJf096+LU1q+vnmOpveurgZemPc=";
+  };
+
+  propagatedBuildInputs = [ torch ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [ "ttach" ];
+
+  meta = with lib; {
+    description = "Image Test Time Augmentation with PyTorch";
+    homepage = "https://github.com/qubvel/ttach";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ cfhammill ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ttls/default.nix b/nixpkgs/pkgs/development/python-modules/ttls/default.nix
new file mode 100644
index 000000000000..b4e5dcc1ec2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ttls/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, colour
+, fetchFromGitHub
+, poetry-core
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "ttls";
+  version = "1.8.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "jschlyter";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-7w+VFxqv1htN5rKvMbcBV6uYqT3PT0ocv3S9Om2Ol3k=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    colour
+    setuptools
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ttls"
+  ];
+
+  meta = with lib; {
+    description = "Module to interact with Twinkly LEDs";
+    homepage = "https://github.com/jschlyter/ttls";
+    changelog = "https://github.com/jschlyter/ttls/blob/v${version}/CHANGES.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ttp-templates/default.nix b/nixpkgs/pkgs/development/python-modules/ttp-templates/default.nix
new file mode 100644
index 000000000000..77acc320fe85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ttp-templates/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "ttp-templates";
+  version = "0.3.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "dmulyalin";
+    repo = "ttp_templates";
+    rev = "refs/tags/${version}";
+    hash = "sha256-NlTTydGdjn+hwAKYEyINg/9k/EdnLq2gU9cnujpZQLM=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  postPatch = ''
+    # Drop circular dependency on ttp
+    sed -i '/ttp =/d' pyproject.toml
+  '';
+
+  # Circular dependency on ttp
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Template Text Parser Templates collections";
+    homepage = "https://github.com/dmulyalin/ttp_templates";
+    changelog = "https://github.com/dmulyalin/ttp_templates/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ttp/default.nix b/nixpkgs/pkgs/development/python-modules/ttp/default.nix
new file mode 100644
index 000000000000..1807fdcf2b12
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ttp/default.nix
@@ -0,0 +1,111 @@
+{ lib
+, buildPythonPackage
+, cerberus
+, configparser
+, deepdiff
+, fetchFromGitHub
+, geoip2
+, jinja2
+, netmiko
+, openpyxl
+, pytestCheckHook
+, poetry-core
+, pyyaml
+, tabulate
+, ttp-templates
+, yangson
+}:
+
+buildPythonPackage rec {
+  pname = "ttp";
+  version = "0.9.5";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "dmulyalin";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-IWqPFspERBVkjsTYTAkOTOrugq4fD65Q140G3SCEV0w=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    # https://github.com/dmulyalin/ttp/blob/master/docs/source/Installation.rst#additional-dependencies
+    cerberus
+    configparser
+    deepdiff
+    geoip2
+    jinja2
+    # n2g unpackaged
+    netmiko
+    # nornir unpackaged
+    openpyxl
+    tabulate
+    yangson
+  ];
+
+  pythonImportsCheck = [
+    "ttp"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pyyaml
+    ttp-templates
+  ];
+
+  disabledTestPaths = [
+    # missing package n2g
+    "test/pytest/test_N2G_formatter.py"
+    # missing test file
+    "test/pytest/test_extend_tag.py"
+    "test/pytest/test_ttp_parser_methods.py"
+  ];
+
+  disabledTests = [
+    # data structure mismatches
+    "test_yangson_validate"
+    "test_yangson_validate_yang_lib_in_output_tag_data"
+    "test_yangson_validate_multiple_inputs_mode_per_input_with_yang_lib_in_file"
+    "test_yangson_validate_multiple_inputs_mode_per_template"
+    "test_yangson_validate_multiple_inputs_mode_per_input_with_yang_lib_in_file_to_xml"
+    "test_yangson_validate_multiple_inputs_mode_per_template_to_xml"
+    "test_adding_data_from_files"
+    "test_lookup_include_csv"
+    "test_inputs_with_template_base_path"
+    "test_group_inputs"
+    "test_inputs_url_filters_extensions"
+    # ValueError: dictionary update sequence element #0 has length 1; 2 is required
+    "test_include_attribute_with_yaml_loader"
+    # TypeError: string indices must be integers
+    "test_lookup_include_yaml"
+    # Missing .xslx files *shrug*
+    "test_excel_formatter_update"
+    "test_excel_formatter_update_using_result_kwargs"
+    # missing package n2g
+    "test_n2g_formatter"
+    # missing test files
+    "test_TTP_CACHE_FOLDER_env_variable_usage"
+    # requires additional network setup
+    "test_child_group_do_not_start_if_no_parent_started"
+    # Assertion Error
+    "test_in_threads_parsing"
+    # missing env var
+    "test_ttp_templates_dir_env_variable"
+  ];
+
+  pytestFlagsArray = [
+    "test/pytest"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/dmulyalin/ttp/releases/tag/${version}";
+    description = "Template Text Parser";
+    homepage = "https://github.com/dmulyalin/ttp";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ttstokenizer/default.nix b/nixpkgs/pkgs/development/python-modules/ttstokenizer/default.nix
new file mode 100644
index 000000000000..554e0341fb16
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ttstokenizer/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, anyascii
+, inflect
+, nltk
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "ttstokenizer";
+  version = "1.0.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-HtDXDKlZ3jpwIgb5DvaqurEkRe8TRJ2xqKl2IKElnKU=";
+  };
+
+  propagatedBuildInputs = [
+    anyascii
+    inflect
+    nltk
+    numpy
+  ];
+
+  pythonImportsCheck = [ "ttstokenizer" ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Tokenizer for Text to Speech (TTS) models";
+    homepage = "https://pypi.org/project/ttstokenizer";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tubes/default.nix b/nixpkgs/pkgs/development/python-modules/tubes/default.nix
new file mode 100644
index 000000000000..4c787af378a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tubes/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchPypi, python
+, characteristic, six, twisted
+}:
+
+buildPythonPackage rec {
+  pname = "tubes";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    pname = "Tubes";
+    inherit version;
+    hash = "sha256-WbkZfy+m9/xrwygd5VeXrccpu3XJxhO09tbEFZnw14s=";
+  };
+
+  propagatedBuildInputs = [ characteristic six twisted ];
+
+  checkPhase = ''
+    ${python.interpreter} -m twisted.trial -j $NIX_BUILD_CORES tubes
+  '';
+
+  pythonImportsCheck = [ "tubes" ];
+
+  meta = with lib; {
+    description = "a data-processing and flow-control engine for event-driven programs";
+    homepage    = "https://github.com/twisted/tubes";
+    license     = licenses.mit;
+    maintainers = with maintainers; [ exarkun ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tubeup/default.nix b/nixpkgs/pkgs/development/python-modules/tubeup/default.nix
new file mode 100644
index 000000000000..df06e4bd0263
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tubeup/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, internetarchive
+, fetchPypi
+, yt-dlp
+, docopt
+, pythonOlder
+, pythonRelaxDepsHook
+}:
+
+buildPythonPackage rec {
+  pname = "tubeup";
+  version = "2023.9.19";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Pp4h0MBoYhczmxPq21cLiYpLUeFP+2JoACcFpBl3b0E=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    internetarchive
+    docopt
+    yt-dlp
+  ];
+
+  pythonRelaxDeps = [
+    "docopt"
+  ];
+
+  pythonImportsCheck = [
+    "tubeup"
+  ];
+
+  # Tests failing upstream
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Youtube (and other video site) to Internet Archive Uploader";
+    homepage = "https://github.com/bibanon/tubeup";
+    changelog = "https://github.com/bibanon/tubeup/releases/tag/${version}";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tuf/default.nix b/nixpkgs/pkgs/development/python-modules/tuf/default.nix
new file mode 100644
index 000000000000..b6965a7f42e2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tuf/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, ed25519
+, fetchFromGitHub
+, hatchling
+, pytestCheckHook
+, pythonOlder
+, requests
+, securesystemslib
+}:
+
+buildPythonPackage rec {
+  pname = "tuf";
+  version = "3.1.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "theupdateframework";
+    repo = "python-tuf";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-IGF/8RdX7Oxl6gdqPGN1w/6q4zaei+MnYXBZepB4KUA=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "hatchling==" "hatchling>="
+  '';
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    securesystemslib
+  ] ++ securesystemslib.optional-dependencies.pynacl
+  ++ securesystemslib.optional-dependencies.crypto;
+
+  nativeCheckInputs = [
+    ed25519
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "tuf"
+  ];
+
+  preCheck = ''
+    cd tests
+  '';
+
+  meta = with lib; {
+    description = "Python reference implementation of The Update Framework (TUF)";
+    homepage = "https://github.com/theupdateframework/python-tuf";
+    changelog = "https://github.com/theupdateframework/python-tuf/blob/v${version}/docs/CHANGELOG.md";
+    license = with licenses; [ asl20 mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tunigo/default.nix b/nixpkgs/pkgs/development/python-modules/tunigo/default.nix
new file mode 100644
index 000000000000..c69f00f251b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tunigo/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchFromGitHub, requests, mock, responses, pytest }:
+
+buildPythonPackage rec {
+  pname = "tunigo";
+  version = "1.0.0";
+
+  propagatedBuildInputs = [ requests ];
+
+  src = fetchFromGitHub {
+    owner = "trygveaa";
+    repo = "python-tunigo";
+    rev = "v${version}";
+    sha256 = "07q9girrjjffzkn8xj4l3ynf9m4psi809zf6f81f54jdb330p2fs";
+  };
+
+  nativeCheckInputs = [ mock responses pytest ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    description = "Python API for the browse feature of Spotify";
+    homepage = "https://github.com/trygveaa/python-tunigo";
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/turnt/default.nix b/nixpkgs/pkgs/development/python-modules/turnt/default.nix
new file mode 100644
index 000000000000..b003f134004a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/turnt/default.nix
@@ -0,0 +1,38 @@
+{ lib, buildPythonPackage, fetchPypi, flit, click, tomli }:
+
+buildPythonPackage rec {
+  pname = "turnt";
+  version = "1.11.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-XN+qzRgZMSdeBmW0OM36mQ79sRCuP8E++SqH8FOoEq0=";
+  };
+
+  nativeBuildInputs = [
+    flit
+  ];
+
+  propagatedBuildInputs = [
+    click
+    tomli
+  ];
+
+  doCheck = true;
+
+  checkPhase = ''
+    runHook preCheck
+    $out/bin/turnt test/*/*.t
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [ "turnt" ];
+
+  meta = with lib; {
+    description = "Snapshot testing tool";
+    homepage = "https://github.com/cucapra/turnt";
+    license = licenses.mit;
+    maintainers = with maintainers; [ leungbk ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tuya-iot-py-sdk/default.nix b/nixpkgs/pkgs/development/python-modules/tuya-iot-py-sdk/default.nix
new file mode 100644
index 000000000000..d1b9d482da1d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tuya-iot-py-sdk/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, paho-mqtt
+, pycryptodome
+, pythonOlder
+, requests
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "tuya-iot-py-sdk";
+  version = "0.6.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "tuya";
+    repo = "tuya-iot-python-sdk";
+    rev = "v${version}";
+    hash = "sha256-KmSVa71CM/kNhzE4GznaxISGmIaV+UcTSn3v+fmxmrQ=";
+  };
+
+  propagatedBuildInputs = [
+    paho-mqtt
+    pycryptodome
+    requests
+    websocket-client
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "tuya_iot" ];
+
+  meta = with lib; {
+    description = "Tuya IoT Python SDK for Tuya Open API";
+    homepage = "https://github.com/tuya/tuya-iot-python-sdk";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tuyaha/default.nix b/nixpkgs/pkgs/development/python-modules/tuyaha/default.nix
new file mode 100644
index 000000000000..53d6c83d48ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tuyaha/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "tuyaha";
+  version = "0.0.11";
+
+  src = fetchFromGitHub {
+    owner = "PaulAnnekov";
+    repo = pname;
+    rev = version;
+    hash = "sha256-PTIw/2NRHHiqV6E5oj2pMeGq1uApevKfT2n5zV8AQmM=";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "tuyaha" ];
+
+  meta = with lib; {
+    description = "Python module with the Tuya API";
+    homepage = "https://github.com/PaulAnnekov/tuyaha";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tvdb-api/default.nix b/nixpkgs/pkgs/development/python-modules/tvdb-api/default.nix
new file mode 100644
index 000000000000..bec0964acc0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tvdb-api/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests-cache
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "tvdb-api";
+  version = "3.2.0-beta";
+
+  src = fetchFromGitHub {
+    owner = "dbr";
+    repo = "tvdb_api";
+    rev = "ce0382181a9e08a5113bfee0fed2c78f8b1e613f";
+    hash = "sha256-poUuwySr6+8U9PIHhqFaR7nXzh8kSaW7mZkuKTUJKj8=";
+  };
+
+  propagatedBuildInputs = [ requests-cache ];
+
+  nativeCheckInputs = [ pytest ];
+
+  # requires network access
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Simple to use TVDB (thetvdb.com) API in Python";
+    homepage = "https://github.com/dbr/tvdb_api";
+    license = licenses.unlicense;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tweedledum/default.nix b/nixpkgs/pkgs/development/python-modules/tweedledum/default.nix
new file mode 100644
index 000000000000..bc4808a268cb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tweedledum/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, cmake
+, ninja
+, scikit-build
+  # Check Inputs
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tweedledum";
+  version = "1.1.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub{
+    owner = "boschmitt";
+    repo = "tweedledum";
+    rev = "v${version}";
+    hash = "sha256-wgrY5ajaMYxznyNvlD0ul1PFr3W8oV9I/OVsStlZEBM=";
+  };
+
+  postPatch = ''
+    sed -i '/\[project\]/a version = "${version}"' pyproject.toml
+    sed -i '/\[project\]/a name = "tweedledum"' pyproject.toml
+  '';
+
+  nativeBuildInputs = [ cmake ninja scikit-build ];
+  dontUseCmakeConfigure = true;
+
+  pythonImportsCheck = [ "tweedledum" ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  pytestFlagsArray = [ "python/test" ];
+
+  meta = with lib; {
+    description = "A library for synthesizing and manipulating quantum circuits";
+    homepage = "https://github.com/boschmitt/tweedledum";
+    license = licenses.mit ;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tweepy/default.nix b/nixpkgs/pkgs/development/python-modules/tweepy/default.nix
new file mode 100644
index 000000000000..4b8312257592
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tweepy/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, aiohttp
+, async-lru
+, buildPythonPackage
+, fetchFromGitHub
+, oauthlib
+, pytestCheckHook
+, pythonOlder
+, requests
+, requests-oauthlib
+, six
+, vcrpy
+}:
+
+buildPythonPackage rec {
+  pname = "tweepy";
+  version = "4.14.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ugqa85l0eWVtMUl5d+BjEWvTyH8c5NVtsnPflkHTWh8=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-lru
+    oauthlib
+    requests
+    requests-oauthlib
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    vcrpy
+  ];
+
+  pythonImportsCheck = [
+    "tweepy"
+  ];
+
+  # The checks with streaming fail due to (seemingly) not decoding (or unexpectedly sending response in) GZIP
+  # Same issue impacted mastodon-py, see https://github.com/halcy/Mastodon.py/commit/cd86887d88bbc07de462d1e00a8fbc3d956c0151 (who just disabled these)
+  disabledTestPaths = [
+    "tests/test_client.py"
+  ];
+
+  disabledTests = [
+    "test_indicate_direct_message_typing"
+    "testcachedifferentqueryparameters"
+    "testcachedresult"
+    "testcreatedestroyblock"
+    "testcreatedestroyfriendship"
+    "testcreateupdatedestroylist"
+    "testgetfollowerids"
+    "testgetfollowers"
+    "testgetfriendids"
+    "testgetfriends"
+    "testgetuser"
+    "testcursorcursoritems"
+    "testcursorcursorpages"
+    "testcursornext"
+  ];
+
+  meta = with lib; {
+    description = "Twitter library for Python";
+    homepage = "https://github.com/tweepy/tweepy";
+    changelog = "https://github.com/tweepy/tweepy/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ marius851000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/twentemilieu/default.nix b/nixpkgs/pkgs/development/python-modules/twentemilieu/default.nix
new file mode 100644
index 000000000000..389f31ba89bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twentemilieu/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, aiohttp
+, yarl
+, aresponses
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "twentemilieu";
+  version = "2.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-twentemilieu";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-0rs+nBJfyXRj/3n/G2JzUDXaiIYZmWsoIcgLoWKhlV4=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov" "" \
+      --replace '"0.0.0"' '"${version}"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "twentemilieu"
+  ];
+
+  meta = with lib; {
+    description = "Python client for Twente Milieu";
+    homepage = "https://github.com/frenck/python-twentemilieu";
+    changelog = "https://github.com/frenck/python-twentemilieu/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/twiggy/default.nix b/nixpkgs/pkgs/development/python-modules/twiggy/default.nix
new file mode 100644
index 000000000000..748d45176613
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twiggy/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "Twiggy";
+  version = "0.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7938840275972f6ce89994a5bdfb0b84f0386301a043a960af6364952e78ffe4";
+  };
+
+  propagatedBuildInputs = [ six ];
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "http://twiggy.wearpants.org";
+    # Taken from http://i.wearpants.org/blog/meet-twiggy/
+    description = "Twiggy is the first totally new design for a logger since log4j";
+    license     = licenses.bsd3;
+    maintainers = with maintainers; [ pierron ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/twilio/default.nix b/nixpkgs/pkgs/development/python-modules/twilio/default.nix
new file mode 100644
index 000000000000..c053a9294fe9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twilio/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, aiohttp
+, aiohttp-retry
+, aiounittest
+, buildPythonPackage
+, cryptography
+, django
+, fetchFromGitHub
+, mock
+, multidict
+, pyngrok
+, pyjwt
+, pytestCheckHook
+, pythonOlder
+, pytz
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "twilio";
+  version = "8.10.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "twilio";
+    repo = "twilio-python";
+    rev = "refs/tags/${version}";
+    hash = "sha256-3Gm1oKhKcTb3c+awMKVQ3qFKkdXC3azR1ECTdw60oCg=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    aiohttp-retry
+    pyjwt
+    pyngrok
+    pytz
+    requests
+  ];
+
+  nativeCheckInputs = [
+    aiounittest
+    cryptography
+    django
+    mock
+    multidict
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_set_default_user_agent"
+    "test_set_user_agent_extensions"
+  ];
+
+  disabledTestPaths = [
+    # Tests require API token
+    "tests/cluster/test_webhook.py"
+    "tests/cluster/test_cluster.py"
+  ];
+
+  pythonImportsCheck = [
+    "twilio"
+  ];
+
+  meta = with lib; {
+    description = "Twilio API client and TwiML generator";
+    homepage = "https://github.com/twilio/twilio-python/";
+    changelog = "https://github.com/twilio/twilio-python/blob/${version}/CHANGES.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/twill/default.nix b/nixpkgs/pkgs/development/python-modules/twill/default.nix
new file mode 100644
index 000000000000..fdc750fa8962
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twill/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, lxml
+, requests
+, pyparsing
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "twill";
+  version = "3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-tWcZRvBvkRyQ7gD5zjocBzFVlzQ0Mhf1unF3gUkhB94=";
+  };
+
+  propagatedBuildInputs = [
+    lxml
+    requests
+    pyparsing
+  ];
+
+  pythonImportsCheck = [
+    "twill"
+  ];
+
+  # pypi package comes without tests, other homepage does not provide all verisons
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A simple scripting language for Web browsing";
+    homepage = "https://twill-tools.github.io/twill/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mic92 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/twine/default.nix b/nixpkgs/pkgs/development/python-modules/twine/default.nix
new file mode 100644
index 000000000000..9bd98fd5adbe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twine/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, importlib-metadata
+, keyring
+, pkginfo
+, readme_renderer
+, requests
+, requests-toolbelt
+, rich
+, rfc3986
+, setuptools-scm
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "twine";
+  version = "4.0.2";
+  format = "pyproject";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-nhAu9f3VogZh64j61GM4gGw70yzx23KWA/42l7G8g8g=";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [
+    importlib-metadata
+    keyring
+    pkginfo
+    readme_renderer
+    requests
+    requests-toolbelt
+    rfc3986
+    rich
+    urllib3
+  ];
+
+  # Requires network
+  doCheck = false;
+
+  pythonImportsCheck = [ "twine" ];
+
+  meta = {
+    description = "Collection of utilities for interacting with PyPI";
+    homepage = "https://github.com/pypa/twine";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/twinkly-client/default.nix b/nixpkgs/pkgs/development/python-modules/twinkly-client/default.nix
new file mode 100644
index 000000000000..d9931c044ba9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twinkly-client/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "twinkly-client";
+  version = "0.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-F/N6yMOvLHIfXvPyR7z3P/Rlh79OvCbvEiNwClLSLl8=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "twinkly_client"
+  ];
+
+  meta = with lib; {
+    description = "Python module to communicate with Twinkly LED strings";
+    homepage = "https://github.com/dr1rrb/py-twinkly-client";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/twisted/default.nix b/nixpkgs/pkgs/development/python-modules/twisted/default.nix
new file mode 100644
index 000000000000..801adb77da37
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twisted/default.nix
@@ -0,0 +1,205 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, fetchpatch
+, python
+
+# build-system
+, hatchling
+, hatch-fancy-pypi-readme
+
+# dependencies
+, attrs
+, automat
+, constantly
+, hyperlink
+, incremental
+, typing-extensions
+, zope_interface
+
+# optional-dependencies
+, appdirs
+, bcrypt
+, cryptography
+, h2
+, idna
+, priority
+, pyasn1
+, pyopenssl
+, pyserial
+, service-identity
+
+# tests
+, cython-test-exception-raiser
+, git
+, glibcLocales
+, pyhamcrest
+, hypothesis
+
+  # for passthru.tests
+, cassandra-driver
+, klein
+, magic-wormhole
+, scrapy
+, treq
+, txaio
+, txamqp
+, txrequests
+, txtorcon
+, thrift
+, nixosTests
+}:
+
+buildPythonPackage rec {
+  pname = "twisted";
+  version = "23.8.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    extension = "tar.gz";
+    hash = "sha256-PHM2Ct0XM2piLA2BHCos4phmtuWbESX9ZQmxclIJiiQ=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "11787.diff";
+      url = "https://github.com/twisted/twisted/commit/da3bf3dc29f067e7019b2a1c205834ab64b2139a.diff";
+      hash = "sha256-bQgUmbvDa61Vg8p/o/ivfkOAHyj1lTgHkrRVEGLM9aU=";
+    })
+    (fetchpatch {
+      # Conditionally skip tests that require METHOD_CRYPT
+      # https://github.com/twisted/twisted/pull/11827
+      url = "https://github.com/mweinelt/twisted/commit/e69e652de671aac0abf5c7e6c662fc5172758c5a.patch";
+      hash = "sha256-LmvKUTViZoY/TPBmSlx4S9FbJNZfB5cxzn/YcciDmoI=";
+    })
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeBuildInputs = [
+    hatchling
+    hatch-fancy-pypi-readme
+    incremental
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    automat
+    constantly
+    hyperlink
+    incremental
+    typing-extensions
+    zope_interface
+  ];
+
+  postPatch = ''
+    echo 'ListingTests.test_localeIndependent.skip = "Timezone issue"'>> src/twisted/conch/test/test_cftp.py
+    echo 'ListingTests.test_newFile.skip = "Timezone issue"'>> src/twisted/conch/test/test_cftp.py
+    echo 'ListingTests.test_newSingleDigitDayOfMonth.skip = "Timezone issue"'>> src/twisted/conch/test/test_cftp.py
+    echo 'ListingTests.test_oldFile.skip = "Timezone issue"'>> src/twisted/conch/test/test_cftp.py
+    echo 'ListingTests.test_oldSingleDigitDayOfMonth.skip = "Timezone issue"'>> src/twisted/conch/test/test_cftp.py
+
+    echo 'WrapClientTLSParserTests.test_tls.skip = "pyopenssl update"' >> src/twisted/internet/test/test_endpoints.py
+    echo 'UNIXTestsBuilder_AsyncioSelectorReactorTests.test_sendFileDescriptorTriggersPauseProducing.skip = "sendFileDescriptor producer was not paused"'>> src/twisted/internet/test/test_unix.py
+    echo 'UNIXTestsBuilder_SelectReactorTests.test_sendFileDescriptorTriggersPauseProducing.skip = "sendFileDescriptor producer was not paused"'>> src/twisted/internet/test/test_unix.py
+
+    echo 'FileObserverTests.test_getTimezoneOffsetEastOfUTC.skip = "mktime argument out of range"'>> src/twisted/test/test_log.py
+    echo 'FileObserverTests.test_getTimezoneOffsetWestOfUTC.skip = "mktime argument out of range"'>> src/twisted/test/test_log.py
+    echo 'FileObserverTests.test_getTimezoneOffsetWithoutDaylightSavingTime.skip = "tuple differs, values not"'>> src/twisted/test/test_log.py
+
+    echo 'MulticastTests.test_joinLeave.skip = "No such device"'>> src/twisted/test/test_udp.py
+    echo 'MulticastTests.test_loopback.skip = "No such device"'>> src/twisted/test/test_udp.py
+    echo 'MulticastTests.test_multicast.skip = "Reactor was unclean"'>> src/twisted/test/test_udp.py
+    echo 'MulticastTests.test_multiListen.skip = "No such device"'>> src/twisted/test/test_udp.py
+
+    # fails since migrating to libxcrypt
+    echo 'HelperTests.test_refuteCryptedPassword.skip = "OSError: Invalid argument"' >> src/twisted/conch/test/test_checkers.py
+
+    # expectation mismatch with `python -m twisted --help` and `python -m twisted.trial --help` usage output
+    echo 'MainTests.test_twisted.skip = "Expectation Mismatch"' >> src/twisted/test/test_main.py
+    echo 'MainTests.test_trial.skip = "Expectation Mismatch"' >> src/twisted/test/test_main.py
+
+    # tests for missing https support in usage
+    echo 'ServiceTests.test_HTTPSFailureOnMissingSSL.skip = "Expectation Mismatch"' >> src/twisted/web/test/test_tap.py
+
+    # not packaged
+    substituteInPlace src/twisted/test/test_failure.py \
+      --replace "from cython_test_exception_raiser import raiser  # type: ignore[import]" "raiser = None"
+  '' + lib.optionalString stdenv.isLinux ''
+    echo 'PTYProcessTestsBuilder_EPollReactorTests.test_openFileDescriptors.skip = "invalid syntax"'>> src/twisted/internet/test/test_process.py
+    echo 'PTYProcessTestsBuilder_PollReactorTests.test_openFileDescriptors.skip = "invalid syntax"'>> src/twisted/internet/test/test_process.py
+    echo 'UNIXTestsBuilder_EPollReactorTests.test_sendFileDescriptorTriggersPauseProducing.skip = "sendFileDescriptor producer was not paused"'>> src/twisted/internet/test/test_unix.py
+    echo 'UNIXTestsBuilder_PollReactorTests.test_sendFileDescriptorTriggersPauseProducing.skip = "sendFileDescriptor producer was not paused"'>> src/twisted/internet/test/test_unix.py
+
+    # Patch t.p._inotify to point to libc. Without this,
+    # twisted.python.runtime.platform.supportsINotify() == False
+    substituteInPlace src/twisted/python/_inotify.py --replace \
+      "ctypes.util.find_library(\"c\")" "'${stdenv.cc.libc}/lib/libc.so.6'"
+  '' + lib.optionalString stdenv.isDarwin ''
+    echo 'ProcessTestsBuilder_AsyncioSelectorReactorTests.test_openFileDescriptors.skip = "invalid syntax"'>> src/twisted/internet/test/test_process.py
+    echo 'ProcessTestsBuilder_SelectReactorTests.test_openFileDescriptors.skip = "invalid syntax"'>> src/twisted/internet/test/test_process.py
+  '';
+
+  # Generate Twisted's plug-in cache. Twisted users must do it as well. See
+  # http://twistedmatrix.com/documents/current/core/howto/plugin.html#auto3
+  # and http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=477103 for details.
+  postFixup = lib.optionalString (stdenv.buildPlatform.canExecute stdenv.hostPlatform) ''
+    $out/bin/twistd --help > /dev/null
+  '';
+
+  nativeCheckInputs = [
+    cython-test-exception-raiser
+    git
+    glibcLocales
+    hypothesis
+    pyhamcrest
+  ]
+  ++ passthru.optional-dependencies.conch
+  ++ passthru.optional-dependencies.http2
+  ++ passthru.optional-dependencies.serial
+  # not supported on aarch64-darwin: https://github.com/pyca/pyopenssl/issues/873
+  ++ lib.optionals (!(stdenv.isDarwin && stdenv.isAarch64)) passthru.optional-dependencies.tls;
+
+  checkPhase = ''
+    export SOURCE_DATE_EPOCH=315532800
+    export PATH=$out/bin:$PATH
+    # race conditions when running in paralell
+    ${python.interpreter} -m twisted.trial -j1 twisted
+  '';
+
+  passthru = {
+    optional-dependencies = {
+      conch = [ appdirs bcrypt cryptography pyasn1 ];
+      http2 = [ h2 priority ];
+      serial = [ pyserial ];
+      tls = [ idna pyopenssl service-identity ];
+    };
+
+    tests = {
+      inherit
+        cassandra-driver
+        klein
+        magic-wormhole
+        scrapy
+        treq
+        txaio
+        txamqp
+        txrequests
+        txtorcon
+        thrift;
+      inherit (nixosTests) buildbot matrix-synapse;
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/twisted/twisted";
+    description = "Asynchronous networking framework written in Python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/twitch-python/default.nix b/nixpkgs/pkgs/development/python-modules/twitch-python/default.nix
new file mode 100644
index 000000000000..e2f9c8caf31c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twitch-python/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi, requests, rx, pytestCheckHook, responses, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "twitch-python";
+  version = "0.0.20";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bgnXIQuOCrtoknZ9ciB56zWxTCnncM2032TVaey6oXw=";
+  };
+
+  disabled = !isPy3k;
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "'pipenv'," ""
+  '';
+
+  propagatedBuildInputs = [ requests rx ];
+
+  nativeCheckInputs = [ pytestCheckHook responses ];
+
+  pythonImportsCheck = [ "twitch" ];
+
+  meta = with lib; {
+    description = "Twitch module for Python";
+    homepage = "https://github.com/PetterKraabol/Twitch-Python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/twitchapi/default.nix b/nixpkgs/pkgs/development/python-modules/twitchapi/default.nix
new file mode 100644
index 000000000000..5c672eef4c2a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twitchapi/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, wheel
+, aiohttp
+, python-dateutil
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "twitchapi";
+  version = "4.1.0";
+
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "Teekeks";
+    repo = "pyTwitchAPI";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-aYYuHyILd3nT0jG59wJcRgSeri26YsC3NpwuQ9dsI1I=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    python-dateutil
+    typing-extensions
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "twitchAPI.eventsub"
+    "twitchAPI.oauth"
+    "twitchAPI.pubsub"
+    "twitchAPI.twitch"
+    "twitchAPI.type"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/Teekeks/pyTwitchAPI/blob/${src.rev}/docs/changelog.rst";
+    description = "Python implementation of the Twitch Helix API, its Webhook, PubSub and EventSub";
+    homepage = "https://github.com/Teekeks/pyTwitchAPI";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda wolfangaukang ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/twitter-common-collections/default.nix b/nixpkgs/pkgs/development/python-modules/twitter-common-collections/default.nix
new file mode 100644
index 000000000000..644a97d2b2ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twitter-common-collections/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, twitter-common-lang
+}:
+
+buildPythonPackage rec {
+  pname   = "twitter.common.collections";
+  version = "0.3.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ede4caff74928156f7ff38dac9b0811893de41966c39cd5b2fdea53418349ca8";
+  };
+
+  propagatedBuildInputs = [ twitter-common-lang ];
+
+  meta = with lib; {
+    description = "Twitter's common collections";
+    homepage    = "https://twitter.github.io/commons/";
+    license     = licenses.asl20;
+    maintainers = with maintainers; [ copumpkin ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/twitter-common-confluence/default.nix b/nixpkgs/pkgs/development/python-modules/twitter-common-confluence/default.nix
new file mode 100644
index 000000000000..d718a18822be
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twitter-common-confluence/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, twitter-common-log
+}:
+
+buildPythonPackage rec {
+  pname   = "twitter.common.confluence";
+  version = "0.3.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "323dde2c519f85020569d7a343432f3aac16bce6ebe5e34774dbde557296697c";
+  };
+
+  propagatedBuildInputs = [ twitter-common-log ];
+
+  meta = with lib; {
+    description = "Twitter's API to the confluence wiki";
+    homepage    = "https://twitter.github.io/commons/";
+    license     = licenses.asl20;
+    maintainers = with maintainers; [ copumpkin ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/twitter-common-dirutil/default.nix b/nixpkgs/pkgs/development/python-modules/twitter-common-dirutil/default.nix
new file mode 100644
index 000000000000..bf9ec099ddba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twitter-common-dirutil/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, twitter-common-lang
+}:
+
+buildPythonPackage rec {
+  pname   = "twitter.common.dirutil";
+  version = "0.3.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "49aeecad2434ac23c16abbfc1fccffd3790c056a9eb01468ec26c83e65a10119";
+  };
+
+  propagatedBuildInputs = [ twitter-common-lang ];
+
+  meta = with lib; {
+    description = "Utilities for manipulating and finding files and directories";
+    homepage    = "https://twitter.github.io/commons/";
+    license     = licenses.asl20;
+    maintainers = with maintainers; [ copumpkin ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/twitter-common-lang/default.nix b/nixpkgs/pkgs/development/python-modules/twitter-common-lang/default.nix
new file mode 100644
index 000000000000..93178f467921
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twitter-common-lang/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname   = "twitter.common.lang";
+  version = "0.3.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6e967ca2b5bb96ea749d21052f45b18e37deb5cc160eb12c64a8f1cb9dba7a22";
+  };
+
+  meta = with lib; {
+    description = "Twitter's 2.x / 3.x compatibility swiss-army knife";
+    homepage    = "https://twitter.github.io/commons/";
+    license     = licenses.asl20;
+    maintainers = with maintainers; [ copumpkin ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/twitter-common-log/default.nix b/nixpkgs/pkgs/development/python-modules/twitter-common-log/default.nix
new file mode 100644
index 000000000000..61f5d99a8f1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twitter-common-log/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, twitter-common-options
+, twitter-common-dirutil
+}:
+
+buildPythonPackage rec {
+  pname   = "twitter.common.log";
+  version = "0.3.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7160a864eed30044705e05b816077dd193aec0c66f50ef1c077b7f8490e0d06a";
+  };
+
+  propagatedBuildInputs = [ twitter-common-options twitter-common-dirutil ];
+
+  meta = with lib; {
+    description = "Twitter's common logging library";
+    homepage    = "https://twitter.github.io/commons/";
+    license     = licenses.asl20;
+    maintainers = with maintainers; [ copumpkin ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/twitter-common-options/default.nix b/nixpkgs/pkgs/development/python-modules/twitter-common-options/default.nix
new file mode 100644
index 000000000000..b3ae7f7f5d94
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twitter-common-options/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname   = "twitter.common.options";
+  version = "0.3.11";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a495bcdffc410039bc4166f1a30c2caa3c92769d7a161a4a39d3651836dd27e1";
+  };
+
+  meta = with lib; {
+    description = "Twitter's optparse wrapper";
+    homepage    = "https://twitter.github.io/commons/";
+    license     = licenses.asl20;
+    maintainers = with maintainers; [ copumpkin ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/twitter/default.nix b/nixpkgs/pkgs/development/python-modules/twitter/default.nix
new file mode 100644
index 000000000000..64ca41f60c2f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twitter/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, certifi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "twitter";
+  version = "1.19.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gN3WmuLuuIMT/u3uoxvxGf1ueVQe5bN6u5xD0jMZThA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    certifi
+  ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "twitter"
+  ];
+
+  meta = with lib; {
+    description = "Twitter API library";
+    homepage = "https://mike.verdone.ca/twitter/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ thoughtpolice ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/twitterapi/default.nix b/nixpkgs/pkgs/development/python-modules/twitterapi/default.nix
new file mode 100644
index 000000000000..72185f243bed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twitterapi/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, requests-oauthlib
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "twitterapi";
+  version = "2.8.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "geduldig";
+    repo = "TwitterAPI";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-4Z8XfgRhQXawCvaXM+kyMO3fejvXIF2LgVdmfXDDqIA=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    requests-oauthlib
+  ];
+
+  # Tests are interacting with the Twitter API
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "TwitterAPI"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for Twitter's REST and Streaming APIs";
+    homepage = "https://github.com/geduldig/TwitterAPI";
+    changelog = "https://github.com/geduldig/TwitterAPI/blob/v${version}/CHANGE.log";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/twofish/default.nix b/nixpkgs/pkgs/development/python-modules/twofish/default.nix
new file mode 100644
index 000000000000..1fe541b07290
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/twofish/default.nix
@@ -0,0 +1,33 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+
+# pythonPackages
+, javaobj-py3
+}:
+
+buildPythonPackage rec {
+  pname = "twofish";
+  version = "0.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1yihp2n42amrxw0wk9f66llpb3w5kwhgkcdg9krkzcik1nsqp7dh";
+  };
+
+  propagatedBuildInputs = [
+    javaobj-py3
+  ];
+
+  # No tests implemented
+  doCheck = false;
+
+  meta = {
+    description = "Bindings for the Twofish implementation by Niels Ferguson";
+    homepage = "https://github.com/keybase/python-twofish";
+    license = lib.licenses.bsd3;
+    maintainers = with lib.maintainers; [
+      kamadorueda
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/txaio/default.nix b/nixpkgs/pkgs/development/python-modules/txaio/default.nix
new file mode 100644
index 000000000000..eeb53a809255
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/txaio/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mock
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, twisted
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "txaio";
+  version = "23.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+akhbpduXjJG39ESrXrVXKkVYGtguEp1esdpvUBP9wQ=";
+  };
+
+  propagatedBuildInputs = [
+    twisted
+    zope_interface
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # No real value
+    "test_sdist"
+    # Some tests seems out-dated and require additional data
+    "test_as_future"
+    "test_errback"
+    "test_create_future"
+    "test_callback"
+    "test_immediate_result"
+    "test_cancel"
+  ];
+
+  pythonImportsCheck = [
+    "txaio"
+  ];
+
+  meta = with lib; {
+    description = "Utilities to support code that runs unmodified on Twisted and asyncio";
+    homepage = "https://github.com/crossbario/txaio";
+    changelog = "https://github.com/crossbario/txaio/blob/v${version}/docs/releases.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/txamqp/default.nix b/nixpkgs/pkgs/development/python-modules/txamqp/default.nix
new file mode 100644
index 000000000000..cc66e041ae38
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/txamqp/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, twisted
+}:
+
+buildPythonPackage rec {
+  pname = "txAMQP";
+  version = "0.8.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0jd9864k3csc06kipiwzjlk9mq4054s8kzk5q1cfnxj8572s4iv4";
+  };
+
+  propagatedBuildInputs = [ twisted ];
+
+  meta = with lib; {
+    homepage = "https://github.com/txamqp/txamqp";
+    description = "Library for communicating with AMQP peers and brokers using Twisted";
+    license = licenses.asl20;
+    maintainers = [];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/txdbus/default.nix b/nixpkgs/pkgs/development/python-modules/txdbus/default.nix
new file mode 100644
index 000000000000..31afbd4fdf95
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/txdbus/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, six, twisted }:
+
+buildPythonPackage rec {
+  pname = "txdbus";
+  version = "1.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8375a5fb68a12054f0def91af800c821fb2232949337756ed975f88d8ea2bc97";
+  };
+
+  propagatedBuildInputs = [ six twisted ];
+  pythonImportsCheck = [ "txdbus" ];
+
+  meta = with lib; {
+    description = "Native Python implementation of DBus for Twisted";
+    homepage = "https://github.com/cocagne/txdbus";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ oxzi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/txgithub/default.nix b/nixpkgs/pkgs/development/python-modules/txgithub/default.nix
new file mode 100644
index 000000000000..45e366764980
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/txgithub/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyopenssl
+, twisted
+, service-identity
+}:
+
+buildPythonPackage rec {
+  pname = "txgithub";
+  version = "15.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "16gbizy8vkxasxylwzj4p66yw8979nvzxdj6csidgmng7gi2k8nx";
+  };
+
+  propagatedBuildInputs = [ pyopenssl twisted service-identity ];
+
+  # fix python3 issues
+  patchPhase = ''
+    sed -i 's/except usage.UsageError, errortext/except usage.UsageError as errortext/' txgithub/scripts/create_token.py
+    sed -i 's/except usage.UsageError, errortext/except usage.UsageError as errortext/' txgithub/scripts/gist.py
+    sed -i 's/print response\[\x27html_url\x27\]/print(response\[\x27html_url\x27\])/' txgithub/scripts/gist.py
+    sed -i '41d' txgithub/scripts/gist.py
+    sed -i '41d' txgithub/scripts/gist.py
+  '';
+
+  # No tests distributed
+  doCheck = false;
+
+  meta = with lib; {
+    description = "GitHub API client implemented using Twisted.";
+    homepage    = "https://github.com/tomprince/txgithub";
+    license     = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/txi2p-tahoe/default.nix b/nixpkgs/pkgs/development/python-modules/txi2p-tahoe/default.nix
new file mode 100644
index 000000000000..3d891c6eeed1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/txi2p-tahoe/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, setuptools-scm
+, parsley
+, twisted
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "txi2p-tahoe";
+  version = "0.3.7";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "tahoe-lafs";
+    repo = "txi2p";
+    rev = "refs/tags/${version}";
+    hash = "sha256-u/IOhxK9jWC/tTKKLsc4PexbCuki+yEtMNw7LuQKmuk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  propagatedBuildInputs = [
+    parsley
+    twisted
+  ];
+
+  pythonImportsCheck = [ "txi2p" ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} -m twisted.trial txi2p
+    runHook postCheck
+  '';
+
+  meta = {
+    description = "I2P bindings for Twisted";
+    homepage = "https://github.com/tahoe-lafs/txi2p";
+    license = lib.licenses.isc;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/txredisapi/default.nix b/nixpkgs/pkgs/development/python-modules/txredisapi/default.nix
new file mode 100644
index 000000000000..315e7f8e2713
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/txredisapi/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, six
+, twisted
+, nixosTests
+}:
+
+buildPythonPackage rec {
+  pname = "txredisapi";
+  version = "1.4.9";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "IlyaSkriblovsky";
+    repo = "txredisapi";
+    rev = "refs/tags/${version}";
+    hash = "sha256-6Z2vurTAw9YHxvEiixtdxBH0YHj+Y9aTdsSkafPMZus=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    six
+    twisted
+  ]
+  ++ twisted.optional-dependencies.tls;
+
+  pythonImportsCheck = [
+    "txredisapi"
+  ];
+
+  doCheck = false;
+
+  passthru.tests.unit-tests = nixosTests.txredisapi;
+
+  meta = with lib; {
+    homepage = "https://github.com/IlyaSkriblovsky/txredisapi";
+    description = "non-blocking redis client for python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dandellion ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/txrequests/default.nix b/nixpkgs/pkgs/development/python-modules/txrequests/default.nix
new file mode 100644
index 000000000000..afe4b0f93b23
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/txrequests/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, twisted
+, requests
+, cryptography
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "txrequests";
+  version = "0.9.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b452a1cafa4d005678f6fa47922a330feb4907d5b4732d1841ca98e89f1362e1";
+  };
+
+  propagatedBuildInputs = [ twisted requests cryptography ];
+
+  # Require network access
+  doCheck = false;
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  meta = with lib; {
+    description = "Asynchronous Python HTTP for Humans.";
+    homepage    = "https://github.com/tardyp/txrequests";
+    license     = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/txtai/default.nix b/nixpkgs/pkgs/development/python-modules/txtai/default.nix
new file mode 100644
index 000000000000..45e8980da423
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/txtai/default.nix
@@ -0,0 +1,156 @@
+{
+  lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pythonRelaxDepsHook
+# propagated build input
+, faiss
+, torch
+, transformers
+, huggingface-hub
+, numpy
+, pyyaml
+, regex
+# optional-dependencies
+, aiohttp
+, fastapi
+, uvicorn
+# TODO add apache-libcloud
+# , apache-libcloud
+, rich
+, duckdb
+, pillow
+, networkx
+, python-louvain
+, onnx
+, onnxruntime
+, soundfile
+, scipy
+, ttstokenizer
+, beautifulsoup4
+, nltk
+, pandas
+, tika
+, imagehash
+, timm
+, fasttext
+, sentencepiece
+, accelerate
+, onnxmltools
+, annoy
+, hnswlib
+# TODO add pymagnitude-lite
+#, pymagnitude-lite
+, scikit-learn
+, sentence-transformers
+, croniter
+, openpyxl
+, requests
+, xmltodict
+# native check inputs
+, unittestCheckHook
+}:
+let
+  version = "6.2.0";
+  api = [ aiohttp fastapi uvicorn ];
+  # cloud = [ apache-libcloud ];
+  console = [ rich ];
+
+  database = [ duckdb pillow ];
+
+  graph = [ networkx python-louvain ];
+
+  model = [ onnx onnxruntime ];
+
+  pipeline-audio = [ onnx onnxruntime soundfile scipy ttstokenizer ];
+  pipeline-data = [ beautifulsoup4 nltk pandas tika ];
+  pipeline-image = [ imagehash pillow timm ];
+  pipeline-text = [ fasttext sentencepiece ];
+  pipeline-train = [ accelerate onnx onnxmltools onnxruntime ];
+  pipeline = pipeline-audio ++ pipeline-data ++ pipeline-image ++ pipeline-text ++ pipeline-train;
+
+  similarity = [
+    annoy
+    fasttext
+    hnswlib
+    # pymagnitude-lite
+    scikit-learn
+    sentence-transformers
+  ];
+  workflow = [
+    # apache-libcloud
+    croniter
+    openpyxl
+    pandas
+    pillow
+    requests
+    xmltodict
+  ];
+  all = api ++ console ++ database ++ graph ++ model ++ pipeline ++ similarity ++ workflow;
+
+  optional-dependencies = {
+    inherit api console database graph model pipeline-audio pipeline-image
+      pipeline-text pipeline-train pipeline similarity workflow all;
+  };
+in
+buildPythonPackage {
+  pname = "txtai";
+  inherit version;
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "neuml";
+    repo = "txtai";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-aWuY2z5DIVhZ5bRADhKSadCofIQQdLQAb52HnjPMS/4=";
+  };
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  pythonRemoveDeps = [
+    # We call it faiss, not faiss-cpu.
+    "faiss-cpu"
+  ];
+
+  propagatedBuildInputs = [
+    faiss
+    torch
+    transformers
+    huggingface-hub
+    numpy
+    pyyaml
+    regex
+  ];
+
+  passthru.optional-dependencies = optional-dependencies;
+
+  pythonImportsCheck = [ "txtai" ];
+
+  # some tests hang forever
+  doCheck = false;
+
+  preCheck = ''
+    export TRANSFORMERS_CACHE=$(mktemp -d)
+  '';
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ] ++ optional-dependencies.api ++ optional-dependencies.similarity;
+
+  unittestFlagsArray = [
+    "-s" "test/python" "-v"
+  ];
+
+  meta = with lib; {
+    description = "Semantic search and workflows powered by language models";
+    changelog = "https://github.com/neuml/txtai/releases/tag/v${version}";
+    homepage = "https://github.com/neuml/txtai";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/txtorcon/default.nix b/nixpkgs/pkgs/development/python-modules/txtorcon/default.nix
new file mode 100644
index 000000000000..c1acef68d19a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/txtorcon/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, stdenv
+, automat
+, buildPythonPackage
+, cryptography
+, fetchPypi
+, geoip
+, idna
+, incremental
+, lsof
+, mock
+, pyopenssl
+, pytestCheckHook
+, python
+, pythonOlder
+, service-identity
+, twisted
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "txtorcon";
+  version = "23.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-k/2Aqd1QX2mNCGT+k9uLapwRRLX+uRUwggtw7YmCZRw=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    incremental
+    twisted
+    automat
+    zope_interface
+  ] ++ twisted.optional-dependencies.tls;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+    lsof
+    geoip
+  ];
+
+  doCheck = !(stdenv.isDarwin && stdenv.isAarch64);
+
+  meta = with lib; {
+    description = "Twisted-based Tor controller client, with state-tracking and configuration abstractions";
+    homepage = "https://github.com/meejah/txtorcon";
+    changelog = "https://github.com/meejah/txtorcon/releases/tag/v${version}";
+    maintainers = with maintainers; [ jluttine exarkun ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/txzmq/default.nix b/nixpkgs/pkgs/development/python-modules/txzmq/default.nix
new file mode 100644
index 000000000000..4f6a4067d55a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/txzmq/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pyzmq
+, twisted
+}:
+
+buildPythonPackage rec {
+  pname = "txzmq";
+  version = "1.0.0";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "txZMQ";
+    hash = "sha256-jWB9C/CcqUYAuOQvByHb5D7lOgRwGCNErHrOfljcYXc=";
+  };
+
+  propagatedBuildInputs = [
+    pyzmq
+    twisted
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "txzmq" ];
+
+  meta = with lib; {
+    description = "Twisted bindings for ZeroMQ";
+    homepage = "https://github.com/smira/txZMQ";
+    license = licenses.mpl20;
+    maintainers = with maintainers; [ wolfangaukang ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/type-infer/default.nix b/nixpkgs/pkgs/development/python-modules/type-infer/default.nix
new file mode 100644
index 000000000000..55fe29e972a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/type-infer/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, poetry-core
+, colorlog
+, dataclasses-json
+, langid
+, nltk
+, numpy
+, pandas
+, psutil
+, python-dateutil
+, scipy
+, toml
+, nltk-data
+, symlinkJoin
+}:
+let
+  testNltkData = symlinkJoin {
+    name = "nltk-test-data";
+    paths = [ nltk-data.punkt nltk-data.stopwords ];
+  };
+in
+buildPythonPackage rec {
+  pname = "type-infer";
+  version = "0.0.15";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  # using PyPI because the repo does not have tags or release branches
+  src = fetchPypi {
+    pname = "type_infer";
+    inherit version;
+    hash = "sha256-AnThYE6hHc3Pwu8fl0VBiQJfGVjeEKo4RrCsOl2pfCA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    colorlog
+    dataclasses-json
+    langid
+    nltk
+    numpy
+    pandas
+    psutil
+    python-dateutil
+    scipy
+    toml
+  ];
+
+  # PyPI package does not include tests
+  doCheck = false;
+
+  # Package import requires NLTK data to be downloaded
+  # It is the only way to set NLTK_DATA environment variable,
+  # so that it is available in pythonImportsCheck
+  env.NLTK_DATA = testNltkData;
+  pythonImportsCheck = [ "type_infer" ];
+
+  meta = with lib; {
+    description = "Automated type inference for Machine Learning pipelines";
+    homepage = "https://pypi.org/project/type-infer/";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/typechecks/default.nix b/nixpkgs/pkgs/development/python-modules/typechecks/default.nix
new file mode 100644
index 000000000000..c458c9c15236
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typechecks/default.nix
@@ -0,0 +1,28 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "typechecks";
+  version = "unstable-2023-07-13";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "openvax";
+    repo = pname;
+    # See https://github.com/openvax/typechecks/issues/2. As of 2023-07-13,
+    # they do no have version tags.
+    rev = "5340b4e8a2f419b3a7aa816a5b19e2e0a6ce0679";
+    hash = "sha256-GdmBtkyuzLfpk6oneWgJ5M1bnhGJ5/lSbGliwoAQWZs=";
+  };
+
+  pythonImportsCheck = [ "typechecks" ];
+
+  meta = with lib; {
+    description = "Type checking helpers for Python";
+    homepage = "https://github.com/openvax/typechecks";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/typecode/default.nix b/nixpkgs/pkgs/development/python-modules/typecode/default.nix
new file mode 100644
index 000000000000..88e76fda670a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typecode/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, setuptools-scm
+, attrs
+, pdfminer-six
+, commoncode
+, plugincode
+, binaryornot
+, typecode-libmagic
+, pytestCheckHook
+, pytest-xdist
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "typecode";
+  version = "30.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Glc5QiTVr//euymeNTxGN+FVaOEa6cUxHGyGo9bQrJc=";
+  };
+
+  dontConfigure = true;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    pdfminer-six
+    commoncode
+    plugincode
+    binaryornot
+    typecode-libmagic
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-xdist
+  ];
+
+  disabledTests = [
+    "TestFileTypesDataDriven"
+
+    # Many of the failures below are reported in:
+    # https://github.com/nexB/typecode/issues/36
+
+    # AssertionError: assert 'application/x-bytecode.python'...
+    "test_compiled_python_1"
+    "test_package_json"
+
+    # fails due to change in file (libmagic) 5.45
+    "test_doc_postscript_eps"
+    "test_package_debian"
+  ];
+
+  pythonImportsCheck = [
+    "typecode"
+  ];
+
+  meta = with lib; {
+    description = "Comprehensive filetype and mimetype detection using libmagic and Pygments";
+    homepage = "https://github.com/nexB/typecode";
+    changelog = "https://github.com/nexB/typecode/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/typecode/libmagic.nix b/nixpkgs/pkgs/development/python-modules/typecode/libmagic.nix
new file mode 100644
index 000000000000..1c9144226bc2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typecode/libmagic.nix
@@ -0,0 +1,50 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, plugincode
+, file
+, zlib
+}:
+buildPythonPackage rec {
+  pname = "typecode-libmagic";
+  version = "21.4.4";
+
+  src = fetchFromGitHub {
+    owner = "nexB";
+    repo = "scancode-plugins";
+    rev = "v${version}";
+    sha256 = "xnUGDMS34iMVMGo/nZwRarGzzbj3X4Rt+YHvvKpmy6A=";
+  };
+
+  sourceRoot = "${src.name}/builtins/typecode_libmagic-linux";
+
+  propagatedBuildInputs = [
+    plugincode
+  ];
+
+  preBuild = ''
+    pushd src/typecode_libmagic
+
+    rm data/magic.mgc lib/libmagic.so lib/libz-lm539.so.1
+    ln -s ${file}/share/misc/magic.mgc data/magic.mgc
+    ln -s ${file}/lib/libmagic.so lib/libmagic.so
+    ln -s ${zlib}/lib/libz.so lib/libz-lm539.so.1
+
+    popd
+  '';
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "typecode_libmagic"
+  ];
+
+  meta = with lib; {
+    description = "A ScanCode Toolkit plugin to provide pre-built binary libraries and utilities and their locations";
+    homepage = "https://github.com/nexB/scancode-plugins/tree/main/builtins/typecode_libmagic-linux";
+    license = licenses.asl20;
+    maintainers = [ ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/typed-ast/default.nix b/nixpkgs/pkgs/development/python-modules/typed-ast/default.nix
new file mode 100644
index 000000000000..48ce811b9ebe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typed-ast/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "typed-ast";
+  version = "1.5.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "python";
+    repo = "typed_ast";
+    rev = version;
+    hash = "sha256-GRmKw7SRrrIIb61VeB8GLhSKCmLUd54AA+GAf43vor8=";
+  };
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    # We can't use pytestCheckHook because that invokes pytest with python -m pytest
+    # which adds the current directory to sys.path at the beginning.
+    # _That_ version of the typed_ast module doesn't have the C extensions we need.
+    pytest
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "typed_ast"
+    "typed_ast.ast27"
+    "typed_ast.ast3"
+    "typed_ast.conversions"
+  ];
+
+  meta = with lib; {
+    description = "Python AST modules with type comment support";
+    homepage = "https://github.com/python/typed_ast";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/typed-settings/default.nix b/nixpkgs/pkgs/development/python-modules/typed-settings/default.nix
new file mode 100644
index 000000000000..3511a87127ba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typed-settings/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, attrs
+, buildPythonPackage
+, cattrs
+, click
+, click-option-group
+, fetchPypi
+, hatchling
+, pytestCheckHook
+, pythonOlder
+, tomli
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "typed-settings";
+  version = "23.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "typed_settings";
+    inherit version;
+    hash = "sha256-gnwiSCVWU0mpUDiHt9GE2DtfFd2xpOsDL5r/fFctkg4=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    cattrs
+    click-option-group
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  passthru.optional-dependencies = {
+    click = [
+      click
+    ];
+  };
+
+  checkInputs = [
+    pytestCheckHook
+    typing-extensions
+  ] ++ passthru.optional-dependencies.click;
+
+  pytestFlagsArray = [
+    "tests"
+  ];
+
+  disabledTests = [
+    # AssertionError: assert [OptionInfo(p...
+    "test_deep_options"
+  ];
+
+  pythonImportsCheck = [
+    "typed_settings"
+  ];
+
+  meta = {
+    description = "Typed settings based on attrs classes";
+    homepage = "https://gitlab.com/sscherfke/typed-settings";
+    changelog = "https://gitlab.com/sscherfke/typed-settings/-/blob/${version}/CHANGELOG.rst";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/typeguard/default.nix b/nixpkgs/pkgs/development/python-modules/typeguard/default.nix
new file mode 100644
index 000000000000..23e3bdc5b546
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typeguard/default.nix
@@ -0,0 +1,71 @@
+{ buildPythonPackage
+, fetchPypi
+, pythonOlder
+, lib
+, setuptools
+, setuptools-scm
+, pytestCheckHook
+, typing-extensions
+, sphinxHook
+, sphinx-autodoc-typehints
+, sphinx-rtd-theme
+, glibcLocales
+}:
+
+buildPythonPackage rec {
+  pname = "typeguard";
+  version = "4.1.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6goRO7wRG8/8kHieuyFWJcljQR9wlqfpBi1ORjDBVf0=";
+  };
+
+  outputs = [
+    "out"
+    "doc"
+  ];
+
+  nativeBuildInputs = [
+    glibcLocales
+    setuptools
+    setuptools-scm
+    sphinxHook
+    sphinx-autodoc-typehints
+    sphinx-rtd-theme
+  ];
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  env.LC_ALL = "en_US.utf-8";
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # mypy tests aren't passing with latest mypy
+    "tests/mypy"
+  ];
+
+  disabledTests = [
+    # AssertionError: 'type of argument "x" must be ' != 'None'
+    "TestPrecondition::test_precondition_ok_and_typeguard_fails"
+    # AttributeError: 'C' object has no attribute 'x'
+    "TestInvariant::test_invariant_ok_and_typeguard_fails"
+    # AttributeError: 'D' object has no attribute 'x'
+    "TestInheritance::test_invariant_ok_and_typeguard_fails"
+  ];
+
+  meta = with lib; {
+    description = "This library provides run-time type checking for functions defined with argument type annotations";
+    homepage = "https://github.com/agronholm/typeguard";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/typepy/default.nix b/nixpkgs/pkgs/development/python-modules/typepy/default.nix
new file mode 100644
index 000000000000..ae97d857da8d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typepy/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mbstrdecoder
+, python-dateutil
+, pytz
+, packaging
+, pytestCheckHook
+, pythonOlder
+, tcolorpy
+}:
+
+buildPythonPackage rec {
+  pname = "typepy";
+  version = "1.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "thombashi";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-oIDVjJwapHun0Rk04zOZ4IjAh7qZ2k0BXK6zqFmtVds=";
+  };
+
+  propagatedBuildInputs = [
+    mbstrdecoder
+  ];
+
+  passthru.optional-dependencies = {
+    datetime = [
+      python-dateutil
+      pytz
+      packaging
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    tcolorpy
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "typepy"
+  ];
+
+  meta = with lib; {
+    description = "Library for variable type checker/validator/converter at a run time";
+    homepage = "https://github.com/thombashi/typepy";
+    changelog = "https://github.com/thombashi/typepy/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ genericnerdyusername ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/typer/default.nix b/nixpkgs/pkgs/development/python-modules/typer/default.nix
new file mode 100644
index 000000000000..b072f3a6d8ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typer/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, click
+, colorama
+, coverage
+, fetchpatch
+, fetchPypi
+, flit-core
+, pytest-sugar
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, rich
+, shellingham
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "typer";
+  version = "0.9.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-UJIv15rqL0dRqOBAj/ENJmK9DIu/qEdVppnzutopeLI=";
+  };
+
+  patches = [
+    # https://github.com/tiangolo/typer/pull/651
+    (fetchpatch {
+      name = "unpin-flit-core-dependency.patch";
+      url = "https://github.com/tiangolo/typer/commit/78a0ee2eec9f54ad496420e177fdaad84984def1.patch";
+      hash = "sha256-VVUzFvF2KCXXkCfCU5xu9acT6OLr+PlQQPeVGONtU4A=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    click
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = {
+    all = [
+      colorama
+      shellingham
+      rich
+    ];
+  };
+
+  nativeCheckInputs = [
+    coverage # execs coverage in tests
+    pytest-sugar
+    pytest-xdist
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.all;
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  disabledTests = [
+    "test_scripts"
+    # Likely related to https://github.com/sarugaku/shellingham/issues/35
+    # fails also on Linux
+    "test_show_completion"
+    "test_install_completion"
+  ] ++ lib.optionals (stdenv.isLinux && stdenv.isAarch64) [
+    "test_install_completion"
+  ];
+
+  pythonImportsCheck = [
+    "typer"
+  ];
+
+  meta = with lib; {
+    description = "Library for building CLI applications";
+    homepage = "https://typer.tiangolo.com/";
+    changelog = "https://github.com/tiangolo/typer/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ winpat ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-aiobotocore-packages/default.nix b/nixpkgs/pkgs/development/python-modules/types-aiobotocore-packages/default.nix
new file mode 100644
index 000000000000..7bc93024121e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-aiobotocore-packages/default.nix
@@ -0,0 +1,752 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, aiobotocore
+, botocore
+, typing-extensions
+, fetchPypi
+}:
+let
+  toUnderscore = str: builtins.replaceStrings [ "-" ] [ "_" ] str;
+
+  buildTypesAiobotocorePackage = serviceName: version: hash:
+    buildPythonPackage rec {
+      pname = "types-aiobotocore-${serviceName}";
+      inherit version;
+      format = "setuptools";
+
+      disabled = pythonOlder "3.7";
+
+      src = fetchPypi {
+        inherit pname version hash;
+      };
+
+      propagatedBuildInputs = [
+        aiobotocore
+        botocore
+      ] ++ lib.optionals (pythonOlder "3.12") [
+        typing-extensions
+      ];
+
+      # Project has no tests
+      doCheck = false;
+
+      pythonImportsCheck = [
+        "types_aiobotocore_${toUnderscore serviceName}"
+      ];
+
+      meta = with lib; {
+        description = "Type annotations for aiobotocore ${serviceName}";
+        homepage = "https://github.com/youtype/mypy_boto3_builder";
+        license = with licenses; [ mit ];
+        maintainers = with maintainers; [ mbalatsko ];
+      };
+    };
+in
+rec {
+  types-aiobotocore-accessanalyzer = buildTypesAiobotocorePackage "accessanalyzer" "2.6.0" "sha256-Bit55lGYI8+VOEm+6NKlfxWldFWdiAFwRZjJsgwuv7Q=";
+
+  types-aiobotocore-account = buildTypesAiobotocorePackage "account" "2.5.2.post3" "sha256-zuBKsuPD3Sjl8KWKIlMgKtzfmtVc8ZZyIMKyPC2QjmY=";
+
+  types-aiobotocore-acm = buildTypesAiobotocorePackage "acm" "2.5.4" "sha256-B7SsW+FtSOMfFFdfmH9iv/i9R/qj6ImAr95gpPAf3G4=";
+
+  types-aiobotocore-acm-pca = buildTypesAiobotocorePackage "acm-pca" "2.6.0" "sha256-AO3CEqWkLBTkx4k8YamcUUCg2TwHODCMjz6ujubzLjA=";
+
+  types-aiobotocore-alexaforbusiness = buildTypesAiobotocorePackage "alexaforbusiness" "2.6.0" "sha256-Pjfm+q8Wq7BT3QfFcLuODteOZdvNXSegde1sc6z2UOk=";
+
+  types-aiobotocore-amp = buildTypesAiobotocorePackage "amp" "2.6.0" "sha256-EZ/wSfcWnT7DoSRegMZnzukVLlTFYP2UsR+rEiLwtnE=";
+
+  types-aiobotocore-amplify = buildTypesAiobotocorePackage "amplify" "2.6.0" "sha256-IkvRE9xD0y8l48rWuV1cvnOQ7eHr0hYsrD3NusofgyI=";
+
+  types-aiobotocore-amplifybackend = buildTypesAiobotocorePackage "amplifybackend" "2.6.0" "sha256-4sSNDhmNuOnYPq0X/G8m0XDP08W+MUQ3xiWK9Yc8U6Q=";
+
+  types-aiobotocore-amplifyuibuilder = buildTypesAiobotocorePackage "amplifyuibuilder" "2.6.0" "sha256-K1esoNUDYWzqK12X6o5c12XJQGGDNlCyUiVsNsUaQhI=";
+
+  types-aiobotocore-apigateway = buildTypesAiobotocorePackage "apigateway" "2.6.0" "sha256-r4eDPDqkcQhApN/+4xjDuillQnDOqu2xqyACYHqXRpw=";
+
+  types-aiobotocore-apigatewaymanagementapi = buildTypesAiobotocorePackage "apigatewaymanagementapi" "2.6.0" "sha256-sAJW4q/mUaRsiN7Yt/uBMbxDfKhTSdiZaDd7nvvM3og=";
+
+  types-aiobotocore-apigatewayv2 = buildTypesAiobotocorePackage "apigatewayv2" "2.6.0" "sha256-cNNVvAX1o+ZieUaW59yp5ELFf2S96XdCOLeVe91oFI8=";
+
+  types-aiobotocore-appconfig = buildTypesAiobotocorePackage "appconfig" "2.6.0" "sha256-qliKZTlmnPwRdhQs26M0PlCM91Mn7cHCmccCAhDtryU=";
+
+  types-aiobotocore-appconfigdata = buildTypesAiobotocorePackage "appconfigdata" "2.6.0" "sha256-DcLOpKbUl/YOinXXtlo2su0uMh0Ja5cGrpbmKuQVGvw=";
+
+  types-aiobotocore-appfabric = buildTypesAiobotocorePackage "appfabric" "2.6.0" "sha256-yQvNa3iBsoAD4oBVmt0ZNjziBEhzTUE6E6FFLluxTZw=";
+
+  types-aiobotocore-appflow = buildTypesAiobotocorePackage "appflow" "2.6.0" "sha256-ILdWiqipfSnSjdToIq++JIu1WUmv+lMX72Ymo9KGZ9s=";
+
+  types-aiobotocore-appintegrations = buildTypesAiobotocorePackage "appintegrations" "2.6.0" "sha256-ZPNB2PUpeTttagX1rRmgINgahj3cNuBdKQMvdFNK15Y=";
+
+  types-aiobotocore-application-autoscaling = buildTypesAiobotocorePackage "application-autoscaling" "2.6.0" "sha256-p5EgvysfhIHz4ZALV8tJz/7ZkRIu2BIZwENiiVho67w=";
+
+  types-aiobotocore-application-insights = buildTypesAiobotocorePackage "application-insights" "2.6.0" "sha256-PUDqMFJu2BG3WVCS6SYyltrSr64VblVAgrCYQ6FR2sk=";
+
+  types-aiobotocore-applicationcostprofiler = buildTypesAiobotocorePackage "applicationcostprofiler" "2.6.0" "sha256-bGlbP0d38vFHkITC84N43Vt1Nrsf3+ByWSvvteDejBw=";
+
+  types-aiobotocore-appmesh = buildTypesAiobotocorePackage "appmesh" "2.6.0" "sha256-Lcoc/IJ9o1glV8gNNA/t9B3J6K5Qz/50fqPMsF78WVI=";
+
+  types-aiobotocore-apprunner = buildTypesAiobotocorePackage "apprunner" "2.6.0" "sha256-zyesnbNmSrQEsBVQJouP05zxhBTikGZVCR/VFdEkHNE=";
+
+  types-aiobotocore-appstream = buildTypesAiobotocorePackage "appstream" "2.6.0" "sha256-+4LWBHHwL1R4jBGHChSUOq9vFc+k7NmRXvo8ZjDIyXk=";
+
+  types-aiobotocore-appsync = buildTypesAiobotocorePackage "appsync" "2.6.0" "sha256-JFrBy9Ck/Ni4lwHV47fkzt/YI5cX9FvTeaT0tNgzdqs=";
+
+  types-aiobotocore-arc-zonal-shift = buildTypesAiobotocorePackage "arc-zonal-shift" "2.6.0" "sha256-qTW58yyFwbBYyisuL4NkaEXqblJ3vevXI1lHZVX4mZY=";
+
+  types-aiobotocore-athena = buildTypesAiobotocorePackage "athena" "2.6.0" "sha256-xmTKI8q82UohBE+Wh+j1xivsY8wmrcvOlDAlwTpJmxE=";
+
+  types-aiobotocore-auditmanager = buildTypesAiobotocorePackage "auditmanager" "2.6.0" "sha256-a+47CFM19RM3Y+9wLLe8D4II7rKeDQ93dy68jqJqBD4=";
+
+  types-aiobotocore-autoscaling = buildTypesAiobotocorePackage "autoscaling" "2.6.0" "sha256-s0ClcRgYJcd5GZXYWMn2FieNXebdlS9206mLtKCSy44=";
+
+  types-aiobotocore-autoscaling-plans = buildTypesAiobotocorePackage "autoscaling-plans" "2.6.0" "sha256-ZhOokFIm5KHBc5X+Lp19z5N7BudTQHU5KjHGYCrW/aE=";
+
+  types-aiobotocore-backup = buildTypesAiobotocorePackage "backup" "2.6.0" "sha256-rmm10kZXRkmj0TxqARf+57Nz8LapZF7TaH9GGwhIHys=";
+
+  types-aiobotocore-backup-gateway = buildTypesAiobotocorePackage "backup-gateway" "2.6.0" "sha256-/YH0nuyWaEVPlZFxJarGkWOnLcpiIvvf/GCmxMOaybI=";
+
+  types-aiobotocore-backupstorage = buildTypesAiobotocorePackage "backupstorage" "2.6.0" "sha256-OC1xWUT0BjBoelAxHkprhD54kF+YbK30H/42Q3XxdwY=";
+
+  types-aiobotocore-batch = buildTypesAiobotocorePackage "batch" "2.6.0" "sha256-/5yrgR7NbQ6GbkC9SsHaAhDa3juBjyRt705wHTu6Mr8=";
+
+  types-aiobotocore-billingconductor = buildTypesAiobotocorePackage "billingconductor" "2.6.0" "sha256-bDEICyyIUCRxbTWZFXHsj5yncQI+F+geC92vvsrKCxw=";
+
+  types-aiobotocore-braket = buildTypesAiobotocorePackage "braket" "2.6.0" "sha256-aobQZov192xNkN7cwIKLgJnhxltyLpWw1oKk2m1HkV8=";
+
+  types-aiobotocore-budgets = buildTypesAiobotocorePackage "budgets" "2.6.0" "sha256-0tFKq0VomVAD9NRtlQzilQEZHFOZp40vtTKfoBqjpyU=";
+
+  types-aiobotocore-ce = buildTypesAiobotocorePackage "ce" "2.6.0" "sha256-eKYNFMlDt9uUaqsK8PPTpt1wghN3nGgM+idQBVei8eY=";
+
+  types-aiobotocore-chime = buildTypesAiobotocorePackage "chime" "2.6.0" "sha256-5d9LUaSDvYI/Nrsmg4MnM0ucXmyzUQKV4DpX9pZst2s=";
+
+  types-aiobotocore-chime-sdk-identity = buildTypesAiobotocorePackage "chime-sdk-identity" "2.6.0" "sha256-UXVS4iTbkv9/xmL5AFv3xlWtWk5qN/dam/ic4mg3+cI=";
+
+  types-aiobotocore-chime-sdk-media-pipelines = buildTypesAiobotocorePackage "chime-sdk-media-pipelines" "2.6.0" "sha256-+2AioI5B/K5QhDsaBSAFyNW0Fd49EA8ZBVrULd3u7qQ=";
+
+  types-aiobotocore-chime-sdk-meetings = buildTypesAiobotocorePackage "chime-sdk-meetings" "2.6.0" "sha256-oxlFkYpDoi7pidqzDOYdeTazVl/HjnuZmnjMGZa/WIE=";
+
+  types-aiobotocore-chime-sdk-messaging = buildTypesAiobotocorePackage "chime-sdk-messaging" "2.6.0" "sha256-THOQl3ZUILwLRwYlBb7fQDgpYz7wkMyd+tSLEmHHBVY=";
+
+  types-aiobotocore-chime-sdk-voice = buildTypesAiobotocorePackage "chime-sdk-voice" "2.6.0" "sha256-RwMXK2NrM4BDzeg5lcpxfVzxFzrqjZw+xhZnJL81Uqw=";
+
+  types-aiobotocore-cleanrooms = buildTypesAiobotocorePackage "cleanrooms" "2.6.0" "sha256-i2XmS1m6YO7dOaMZKb0WRQB2WpRue+OCLbdR59oWA1Q=";
+
+  types-aiobotocore-cloud9 = buildTypesAiobotocorePackage "cloud9" "2.6.0" "sha256-W3ni8q7n4l8+SP/RyxibCTptextx4Vd8bmiQ3lhgszQ=";
+
+  types-aiobotocore-cloudcontrol = buildTypesAiobotocorePackage "cloudcontrol" "2.6.0" "sha256-qWbYfegOQ6QcEWA/gce9ZiIOBIVeWIj1qjfsksncDxY=";
+
+  types-aiobotocore-clouddirectory = buildTypesAiobotocorePackage "clouddirectory" "2.6.0" "sha256-5TzDHj/t0tqxbRYfnGRP9LNq9pSFj7aidadVB03ZY1k=";
+
+  types-aiobotocore-cloudformation = buildTypesAiobotocorePackage "cloudformation" "2.6.0" "sha256-EyiQY0NCVa3XuRpBH7aXEA7cBx8BzyRP917f/Ogx0mw=";
+
+  types-aiobotocore-cloudfront = buildTypesAiobotocorePackage "cloudfront" "2.6.0" "sha256-f9nqoXlg7sgY2QCkE1/+Q72N/8Besrl6gncmU+vNt/I=";
+
+  types-aiobotocore-cloudhsm = buildTypesAiobotocorePackage "cloudhsm" "2.6.0" "sha256-a3QRjQhW+cRJykNjhhJREGwuZxR0b+WxgRuS2yuGcTQ=";
+
+  types-aiobotocore-cloudhsmv2 = buildTypesAiobotocorePackage "cloudhsmv2" "2.6.0" "sha256-FyktFlTQAbS6YnoXljvtn6CabJHGLkRv1jCgb9dbz+s=";
+
+  types-aiobotocore-cloudsearch = buildTypesAiobotocorePackage "cloudsearch" "2.6.0" "sha256-eKLM+GYjbm3cweMtF/XI6k+P8t9gaJeRCeMHQbc832g=";
+
+  types-aiobotocore-cloudsearchdomain = buildTypesAiobotocorePackage "cloudsearchdomain" "2.6.0" "sha256-wn03HlgBaZIAkw8gxPehSKpcfQGOhYp0U1CF/84M/lg=";
+
+  types-aiobotocore-cloudtrail = buildTypesAiobotocorePackage "cloudtrail" "2.6.0" "sha256-/vpOE8tU7SsjHmn/YyVfku05ZGBZIiVuFsG6aK47K28=";
+
+  types-aiobotocore-cloudtrail-data = buildTypesAiobotocorePackage "cloudtrail-data" "2.6.0" "sha256-8W7TrB1EXp5JeBQ9xqkqFhf+Frflpd5bfVxpqju2ZPM=";
+
+  types-aiobotocore-cloudwatch = buildTypesAiobotocorePackage "cloudwatch" "2.6.0" "sha256-ntQkDjM3I3wuMH5jsifODEwRna2ctRW1M9bzyEjIF7w=";
+
+  types-aiobotocore-codeartifact = buildTypesAiobotocorePackage "codeartifact" "2.6.0" "sha256-NuMqaomry4ezNNRKBLOJ0xNwGUO2Prl4nf/5O38oyqI=";
+
+  types-aiobotocore-codebuild = buildTypesAiobotocorePackage "codebuild" "2.6.0" "sha256-dYe3uLk0ssQPQPEo+3glh+ic6recgV5WPIN09lLuuA4=";
+
+  types-aiobotocore-codecatalyst = buildTypesAiobotocorePackage "codecatalyst" "2.6.0" "sha256-7MKRVJ4fgberRmkHWHfvrfzU2+BYhMZxgb2ge7NAQp4=";
+
+  types-aiobotocore-codecommit = buildTypesAiobotocorePackage "codecommit" "2.6.0" "sha256-7StmPVxVNfFpqQmjyM4cn9NBrAsuUjxRkP0WgGCnuso=";
+
+  types-aiobotocore-codedeploy = buildTypesAiobotocorePackage "codedeploy" "2.6.0" "sha256-4TUcqf3kuRqsMjhfrUTX3/aOSl43NtwmbSgM6KtjAlk=";
+
+  types-aiobotocore-codeguru-reviewer = buildTypesAiobotocorePackage "codeguru-reviewer" "2.6.0" "sha256-qD42WySh9NpQBOveTRGP3hIp8zD1Y1DzSiM7kbbfR88=";
+
+  types-aiobotocore-codeguru-security = buildTypesAiobotocorePackage "codeguru-security" "2.6.0" "sha256-1qgsFoogu8MnWoCeKnqy4KIY7UdMeUPnaS1zVSVl2Mg=";
+
+  types-aiobotocore-codeguruprofiler = buildTypesAiobotocorePackage "codeguruprofiler" "2.6.0" "sha256-7Nbb+l7y5ccrVGymZ46nKwnGoa5nThrIOZ1AG0ykPEw=";
+
+  types-aiobotocore-codepipeline = buildTypesAiobotocorePackage "codepipeline" "2.6.0" "sha256-cIvM4g/CldgLuN10a3lNhISz08gT6VxZHMS5xo+B2IA=";
+
+  types-aiobotocore-codestar = buildTypesAiobotocorePackage "codestar" "2.6.0" "sha256-6b3QfRecmprhRU+loWafrcL1mWNLFmZXZOAhUMkpGqU=";
+
+  types-aiobotocore-codestar-connections = buildTypesAiobotocorePackage "codestar-connections" "2.6.0" "sha256-D/icEGVsuYSU7hCw2VEojLTkdaBcK6SoEZqpvD/NKV0=";
+
+  types-aiobotocore-codestar-notifications = buildTypesAiobotocorePackage "codestar-notifications" "2.6.0" "sha256-7vWHwrG7Z80Zb3ncGBqN4ItKAVWLR0XHITJxMmE8y8Y=";
+
+  types-aiobotocore-cognito-identity = buildTypesAiobotocorePackage "cognito-identity" "2.6.0" "sha256-C1JRefgyuiKDOJMhShyDPDjfKp5S5OMCaHcnORLxnvY=";
+
+  types-aiobotocore-cognito-idp = buildTypesAiobotocorePackage "cognito-idp" "2.6.0" "sha256-ks8MmuhrmdTS509vgxZ0raZqISMPaAItEjf93ppWhrU=";
+
+  types-aiobotocore-cognito-sync = buildTypesAiobotocorePackage "cognito-sync" "2.6.0" "sha256-pOLa8tDqPexDigPbRqTjnr7/ricz92/Ml79AyUXvXBg=";
+
+  types-aiobotocore-comprehend = buildTypesAiobotocorePackage "comprehend" "2.6.0" "sha256-qXIwjiNksQbQiTtwaKWNHaUCras/moRuFXN3sOEPYMc=";
+
+  types-aiobotocore-comprehendmedical = buildTypesAiobotocorePackage "comprehendmedical" "2.6.0" "sha256-C98s7dkFRgj8m4M+MmjvCWwrdohkLJafgo9j2ACQ2l4=";
+
+  types-aiobotocore-compute-optimizer = buildTypesAiobotocorePackage "compute-optimizer" "2.6.0" "sha256-4MRGtyFWceAuspTW6Xqwjf2ta0VC1SIoK/U80QZw7UA=";
+
+  types-aiobotocore-config = buildTypesAiobotocorePackage "config" "2.6.0" "sha256-qW+R5X/fu784kjARjISaNxwzIJn74SXfUaPEuGqsM1M=";
+
+  types-aiobotocore-connect = buildTypesAiobotocorePackage "connect" "2.6.0" "sha256-d+7VqW5H0hyINQVXoy6djyFmkGzlhLnEpzURuPQLyBc=";
+
+  types-aiobotocore-connect-contact-lens = buildTypesAiobotocorePackage "connect-contact-lens" "2.6.0" "sha256-3d2WJQpohaiwdsKOS2u5kNhHVsgELMxgjunHAk6v7Y8=";
+
+  types-aiobotocore-connectcampaigns = buildTypesAiobotocorePackage "connectcampaigns" "2.6.0" "sha256-lsDs0yxFf4ForZ2bU719LFCDHzR9lOE211XuYGYKZCw=";
+
+  types-aiobotocore-connectcases = buildTypesAiobotocorePackage "connectcases" "2.6.0" "sha256-/MRl46K5h5mtboGhWDop0psxPyxhm3tKhzvMpr91d/w=";
+
+  types-aiobotocore-connectparticipant = buildTypesAiobotocorePackage "connectparticipant" "2.6.0" "sha256-3E+8scTPCcNm8RDoxGWSm/u6drT12aiFqf3LbxWTy8w=";
+
+  types-aiobotocore-controltower = buildTypesAiobotocorePackage "controltower" "2.6.0" "sha256-Df25Lah8FBdCrbWMC+Y9ayQCO3ijG8cMdypA2+sE3oY=";
+
+  types-aiobotocore-cur = buildTypesAiobotocorePackage "cur" "2.6.0" "sha256-i+n53Eejdz26WGsHBmLR3V0ZxOBHPtTTzoxH0mmKPig=";
+
+  types-aiobotocore-customer-profiles = buildTypesAiobotocorePackage "customer-profiles" "2.6.0" "sha256-i1mv2M3bboOF3+iIKYhp4raYb7mHiQTirlWsttB/dXY=";
+
+  types-aiobotocore-databrew = buildTypesAiobotocorePackage "databrew" "2.6.0" "sha256-WMVPGbQkdbKc2T+gR9P3oWUxl5VSVf4IdcLeuW9SNUo=";
+
+  types-aiobotocore-dataexchange = buildTypesAiobotocorePackage "dataexchange" "2.6.0" "sha256-okcgm0Lx5s2AM2mprVwNjeI1TTmlR73FgjWbYa9uRdE=";
+
+  types-aiobotocore-datapipeline = buildTypesAiobotocorePackage "datapipeline" "2.6.0" "sha256-k0tYIWqPEnETISThasPHa9AaWdAs0p+hfrUuCI7VTJk=";
+
+  types-aiobotocore-datasync = buildTypesAiobotocorePackage "datasync" "2.6.0" "sha256-C138viPl57+Z79k1C0c4IjgdpMd4PhO352fUs6/YnE0=";
+
+  types-aiobotocore-dax = buildTypesAiobotocorePackage "dax" "2.6.0" "sha256-1BtV4vajDTlmNhX4oh1h81+1MsIe63gxnkd1oWn0yeI=";
+
+  types-aiobotocore-detective = buildTypesAiobotocorePackage "detective" "2.6.0" "sha256-UP8rTuCwNq6Eu5gYrMj5c+JaNy9grOOL9RRi/QsDvzE=";
+
+  types-aiobotocore-devicefarm = buildTypesAiobotocorePackage "devicefarm" "2.6.0" "sha256-Mc4Kl4dZyn9y+9V44QilacOHN9+E1M79uNLATsoH2Ks=";
+
+  types-aiobotocore-devops-guru = buildTypesAiobotocorePackage "devops-guru" "2.6.0" "sha256-pPn7O3oK75zRmOFMQmyzmRcjpRTswrVhdbkcqaI5Sj8=";
+
+  types-aiobotocore-directconnect = buildTypesAiobotocorePackage "directconnect" "2.6.0" "sha256-LwbqLf3BEwW/+f6vsddXt+FiyGkRKIPXfaqW5rtDrig=";
+
+  types-aiobotocore-discovery = buildTypesAiobotocorePackage "discovery" "2.6.0" "sha256-mBruXgMAELLGyEg7ON8PFesERMf5og8As58U9pvIKRc=";
+
+  types-aiobotocore-dlm = buildTypesAiobotocorePackage "dlm" "2.6.0" "sha256-JLOVu9OlJgrfTBlmzVNN5saYO8AFk8N54hRzDAjq7WI=";
+
+  types-aiobotocore-dms = buildTypesAiobotocorePackage "dms" "2.6.0" "sha256-cWGwdGBTgEag5SeRDLvAJtCS1dAxtt5R0uanPI6RjkY=";
+
+  types-aiobotocore-docdb = buildTypesAiobotocorePackage "docdb" "2.6.0" "sha256-yYm/H31gRIDV+r2H+8cTHkc5h40aFFUQ7zlX1wyLPAI=";
+
+  types-aiobotocore-docdb-elastic = buildTypesAiobotocorePackage "docdb-elastic" "2.6.0" "sha256-ro0xv2HHzTXA6tRNnr3eQjCj5iaqc1wOcsKny8j/hoQ=";
+
+  types-aiobotocore-drs = buildTypesAiobotocorePackage "drs" "2.6.0" "sha256-4CeNeftLpPSZYqw09LcPRC+8yVp+84azRHQ8O0JFOOo=";
+
+  types-aiobotocore-ds = buildTypesAiobotocorePackage "ds" "2.6.0" "sha256-HZEA8fivN05Puxycyl+2z4kIJMbGtF0J7ohLOwx+IzM=";
+
+  types-aiobotocore-dynamodb = buildTypesAiobotocorePackage "dynamodb" "2.6.0" "sha256-dFo/YsEQg7TXB5NENmFOv37R3B2GoN0TlIiULWEQr9I=";
+
+  types-aiobotocore-dynamodbstreams = buildTypesAiobotocorePackage "dynamodbstreams" "2.6.0" "sha256-8wsE774l7M8Qb3UiaxkAdN6sdnXs5oS4cFhncW0joBI=";
+
+  types-aiobotocore-ebs = buildTypesAiobotocorePackage "ebs" "2.6.0" "sha256-95lUlfOjLVgHufSv3UvaKB1K0F2N0cvtCcKh96VBtqg=";
+
+  types-aiobotocore-ec2 = buildTypesAiobotocorePackage "ec2" "2.6.0" "sha256-hSuwPcQEk9Qgkc/JtcZp2vqLXnMQN9gtzjkuC1Bv1C4=";
+
+  types-aiobotocore-ec2-instance-connect = buildTypesAiobotocorePackage "ec2-instance-connect" "2.6.0" "sha256-0Lwxob43TzJHNcriUEa3BAZE64iqS9Js4TtfL20YRj0=";
+
+  types-aiobotocore-ecr = buildTypesAiobotocorePackage "ecr" "2.6.0" "sha256-bMPp7QPa2f8GCRmX3y78XvZTUyYNfYxXDKj5lckBBvE=";
+
+  types-aiobotocore-ecr-public = buildTypesAiobotocorePackage "ecr-public" "2.6.0" "sha256-O2RieTv4vyZ6/mR8BRltfbGcPUjAyIIqriskSlmNcb4=";
+
+  types-aiobotocore-ecs = buildTypesAiobotocorePackage "ecs" "2.6.0" "sha256-C660Ync/6dV8c9i+N7bgV0TYaPScrJ40KPdG3LItGGs=";
+
+  types-aiobotocore-efs = buildTypesAiobotocorePackage "efs" "2.6.0" "sha256-jhIpP0cJEv2SqvmBJtxNVoWF4AOWci2sPj04dN3N+bo=";
+
+  types-aiobotocore-eks = buildTypesAiobotocorePackage "eks" "2.6.0" "sha256-MXMbA1QAyRMhTqihwKztK3EoRp1iesCvPEz30Xc/in8=";
+
+  types-aiobotocore-elastic-inference = buildTypesAiobotocorePackage "elastic-inference" "2.6.0" "sha256-xjMVOk0fzyvDoSNb+kxVQT9emfvIG/6Ws3h3MfCCTOY=";
+
+  types-aiobotocore-elasticache = buildTypesAiobotocorePackage "elasticache" "2.6.0" "sha256-7iUYuPOerdp1+fxI/KdC4sEWDOTJQAgYYheEmSvjBFo=";
+
+  types-aiobotocore-elasticbeanstalk = buildTypesAiobotocorePackage "elasticbeanstalk" "2.6.0" "sha256-yCF9EHyTsf1hmoeSGrNiM2Dd8gtGlcX79zqF25btN04=";
+
+  types-aiobotocore-elastictranscoder = buildTypesAiobotocorePackage "elastictranscoder" "2.6.0" "sha256-vRVH67/SbkncE4q3gssGce4NtTYgFM56RLzDKyvBCpc=";
+
+  types-aiobotocore-elb = buildTypesAiobotocorePackage "elb" "2.6.0" "sha256-+mFIAOecS21QFsnB+V1EFyGLv6uW+oMzkRi051HvPGA=";
+
+  types-aiobotocore-elbv2 = buildTypesAiobotocorePackage "elbv2" "2.6.0" "sha256-OIWzkp7AC2bK55bl3WvL2Zk7M0WRPc8jVHekPAGDtyw=";
+
+  types-aiobotocore-emr = buildTypesAiobotocorePackage "emr" "2.6.0" "sha256-TWCgT2xBi3UajaF6L+m61Q27YV8RCm+e/jRVnZKjwrI=";
+
+  types-aiobotocore-emr-containers = buildTypesAiobotocorePackage "emr-containers" "2.6.0" "sha256-pBr9zVqEbP0na385scKW28d0qIB+7HQdYC5QTdhxHNA=";
+
+  types-aiobotocore-emr-serverless = buildTypesAiobotocorePackage "emr-serverless" "2.6.0" "sha256-mdpuehCY0ki+sZSlNS0kIwijZphoyQixNWY4WKEcrMs=";
+
+  types-aiobotocore-entityresolution = buildTypesAiobotocorePackage "entityresolution" "2.6.0" "sha256-lFbcxmw7Le/rVVL70cOY/vEUShSRnsOdul+eI1jzX7Y=";
+
+  types-aiobotocore-es = buildTypesAiobotocorePackage "es" "2.6.0" "sha256-A/1kM0X4bKrPIXBpir9FuEkuYmUb/K06gfut6faGN0A=";
+
+  types-aiobotocore-events = buildTypesAiobotocorePackage "events" "2.6.0" "sha256-X0r0VZ/ZWYrn2NdE5dJrcS74OyWIvWMDJGSNheIOm0A=";
+
+  types-aiobotocore-evidently = buildTypesAiobotocorePackage "evidently" "2.6.0" "sha256-ec9XPmiGjhH+MsW81JtH13KACasiWqtmxOC/O8ewbgE=";
+
+  types-aiobotocore-finspace = buildTypesAiobotocorePackage "finspace" "2.6.0" "sha256-fPG/13VJzvdfoADYZXTZ2ssdJrKQ/MEic6rhsNUE4tU=";
+
+  types-aiobotocore-finspace-data = buildTypesAiobotocorePackage "finspace-data" "2.6.0" "sha256-2mAHrKw7Hur/nrVQpuRwGae5CumbjbQb4V9Z6NlsSmo=";
+
+  types-aiobotocore-firehose = buildTypesAiobotocorePackage "firehose" "2.6.0" "sha256-viWUrt2F0O1jVhkxK5G776A4r7d4jJJVI/5UsUS+cao=";
+
+  types-aiobotocore-fis = buildTypesAiobotocorePackage "fis" "2.6.0" "sha256-4T/EcdB+5TV8PnX1Z9c8Ato19kznO3yQPZohuWD1+J8=";
+
+  types-aiobotocore-fms = buildTypesAiobotocorePackage "fms" "2.6.0" "sha256-VIGEXyDyUEWshdYFUJ3VmCS1z/ZBOKq2PYCosalPZAw=";
+
+  types-aiobotocore-forecast = buildTypesAiobotocorePackage "forecast" "2.6.0" "sha256-rMjrKtR8BWtAYoyBY52o/5wbZCHqX1aFMRsVCunZTeo=";
+
+  types-aiobotocore-forecastquery = buildTypesAiobotocorePackage "forecastquery" "2.6.0" "sha256-rh53/1tmYyADrkUtQjrwrcEe78ji6II0yYnMQO38AOU=";
+
+  types-aiobotocore-frauddetector = buildTypesAiobotocorePackage "frauddetector" "2.6.0" "sha256-ICRkb+GIWginbc2LvsJTzBaEXDlwg+JOqWQwNRzu+CI=";
+
+  types-aiobotocore-fsx = buildTypesAiobotocorePackage "fsx" "2.6.0" "sha256-vZiK+Kat3RKN/OcKny5qLF+pYljoVlJGG9Kdlb75GWk=";
+
+  types-aiobotocore-gamelift = buildTypesAiobotocorePackage "gamelift" "2.6.0" "sha256-9qk0jvEAU6vh++k18ccjrZNLnYlOqiAGuVvBGS5QetQ=";
+
+  types-aiobotocore-gamesparks = buildTypesAiobotocorePackage "gamesparks" "2.6.0" "sha256-9iV7bpGMnzz9TH+g1YpPjbKBSKY3rcL/OJvMOzwLC1M=";
+
+  types-aiobotocore-glacier = buildTypesAiobotocorePackage "glacier" "2.6.0" "sha256-shUgv/KntAP0kuD8pJFLEAp/aIukEsLhte6C5odtNJs=";
+
+  types-aiobotocore-globalaccelerator = buildTypesAiobotocorePackage "globalaccelerator" "2.6.0" "sha256-U/74XOX/pXh4JJ4n6Fu6quL6gQwz+zt9bOWj/QYOS+8=";
+
+  types-aiobotocore-glue = buildTypesAiobotocorePackage "glue" "2.6.0" "sha256-K2asnioD1r9BJCX2PaNaN+fKDyA+oQhvdM0h0LgxbEY=";
+
+  types-aiobotocore-grafana = buildTypesAiobotocorePackage "grafana" "2.6.0" "sha256-acNr8U/E2Eq4wp68Td0k8xdORhT6ZOJBOi0enBnaacE=";
+
+  types-aiobotocore-greengrass = buildTypesAiobotocorePackage "greengrass" "2.6.0" "sha256-9mqnIWlLUoz28qp8AH8LiNdDgcJ04P0Z+jxNb/91jUg=";
+
+  types-aiobotocore-greengrassv2 = buildTypesAiobotocorePackage "greengrassv2" "2.6.0" "sha256-+G6nPOY2Suxa8LPTG8SHOZfwaIJQIyVGTRcsAQYXZzY=";
+
+  types-aiobotocore-groundstation = buildTypesAiobotocorePackage "groundstation" "2.6.0" "sha256-VGGDcARvtSeukjgVB9jwSamIrlrNCF+0pNszN6VkMC0=";
+
+  types-aiobotocore-guardduty = buildTypesAiobotocorePackage "guardduty" "2.6.0" "sha256-3bScTMTc7PMrHvZpfPYENj55w2JjnK/pVuNLcxCjw5Q=";
+
+  types-aiobotocore-health = buildTypesAiobotocorePackage "health" "2.6.0" "sha256-WBxZlnWrZ6b0MIEomvgUDqiKNe9KIIgOrNrRhRw07EA=";
+
+  types-aiobotocore-healthlake = buildTypesAiobotocorePackage "healthlake" "2.6.0" "sha256-8ofimJ4eTxq8yQjCc23FQ2OktMCNwlIBCn+eC+HLqlc=";
+
+  types-aiobotocore-honeycode = buildTypesAiobotocorePackage "honeycode" "2.6.0" "sha256-dCjt22yHlShPdG6Jipy3m4Rx3G4OLPiuUi1gyubcQ/g=";
+
+  types-aiobotocore-iam = buildTypesAiobotocorePackage "iam" "2.6.0" "sha256-NPvYTwvZY5MjfdIlTMRZEQ1S9IvxvQjoi5K2LOlSrMM=";
+
+  types-aiobotocore-identitystore = buildTypesAiobotocorePackage "identitystore" "2.6.0" "sha256-u4d+/kVZ+qtLyueNSGy6a2VoB0jIYdKZqvCQQfarbx4=";
+
+  types-aiobotocore-imagebuilder = buildTypesAiobotocorePackage "imagebuilder" "2.6.0" "sha256-uhkFIVr68n0ShrpZY9qyghd0XgMb0ZT6fF9WdjtF7g0=";
+
+  types-aiobotocore-importexport = buildTypesAiobotocorePackage "importexport" "2.6.0" "sha256-m0fUuupB8Eb9pJQnuir4THb4TdDstKcxHQRgz8Ce2Zg=";
+
+  types-aiobotocore-inspector = buildTypesAiobotocorePackage "inspector" "2.6.0" "sha256-dJQnb6AwtmScEIun0QB9CiiPkbdKti9+mc5LN3vf7e0=";
+
+  types-aiobotocore-inspector2 = buildTypesAiobotocorePackage "inspector2" "2.6.0" "sha256-kAhdyymMdbrPoCFzKiVCFzBlfpmz4aGlZ1Ilkrc8EiQ=";
+
+  types-aiobotocore-internetmonitor = buildTypesAiobotocorePackage "internetmonitor" "2.6.0" "sha256-3oJbkuU013LR7DUXvr8y0nbYh3caAF1c4GtgM1CizdU=";
+
+  types-aiobotocore-iot = buildTypesAiobotocorePackage "iot" "2.6.0" "sha256-Rt6dsE/9aR5AZC47G3RayV56VVobDWEah64cNHsaYII=";
+
+  types-aiobotocore-iot-data = buildTypesAiobotocorePackage "iot-data" "2.6.0" "sha256-KpgEjoEsCSiC6aKyHy64it0k87XYICbxMhUFYUjCBuo=";
+
+  types-aiobotocore-iot-jobs-data = buildTypesAiobotocorePackage "iot-jobs-data" "2.6.0" "sha256-IQRarMn1ZAh+kUG1I4Cyt/6WrIoby07g3qcSzpWUWWM=";
+
+  types-aiobotocore-iot-roborunner = buildTypesAiobotocorePackage "iot-roborunner" "2.6.0" "sha256-BFSV0lfXriD43UFXjdomHIQO60TjrYWmL6+htf9Z3mE=";
+
+  types-aiobotocore-iot1click-devices = buildTypesAiobotocorePackage "iot1click-devices" "2.6.0" "sha256-MRRil8KuR88NvjAOQHQSftplzk7+sdAJBb1Koxj1j8o=";
+
+  types-aiobotocore-iot1click-projects = buildTypesAiobotocorePackage "iot1click-projects" "2.6.0" "sha256-6YRdsbNw685KvSLCPP6cpCVA5zqht9gF/SthHHtjxfI=";
+
+  types-aiobotocore-iotanalytics = buildTypesAiobotocorePackage "iotanalytics" "2.6.0" "sha256-uhxX742flhdDM7zoYm6yggc41NW7glGPijiql4XKJa4=";
+
+  types-aiobotocore-iotdeviceadvisor = buildTypesAiobotocorePackage "iotdeviceadvisor" "2.6.0" "sha256-jrOVxsJHgpEvyLhreMrzttu3yQ4FXm4+MVDlNNIKWVU=";
+
+  types-aiobotocore-iotevents = buildTypesAiobotocorePackage "iotevents" "2.6.0" "sha256-M3wUbFFGsYQesy7ASen+b6yokGkjXY0P5wpGexO2CGg=";
+
+  types-aiobotocore-iotevents-data = buildTypesAiobotocorePackage "iotevents-data" "2.6.0" "sha256-ESm7ZCtEvHo/r9LXnBaIAVAb4bQkGjIlmUNlo/JuzjE=";
+
+  types-aiobotocore-iotfleethub = buildTypesAiobotocorePackage "iotfleethub" "2.6.0" "sha256-0NMp62HDGZ0FHVtyHOvgfMUaedqZG9bY46d2OrpGK7E=";
+
+  types-aiobotocore-iotfleetwise = buildTypesAiobotocorePackage "iotfleetwise" "2.6.0" "sha256-jbLoJOgFRNSPaFv/diM8L0mTGIB2IjAzHqx/QH7lriQ=";
+
+  types-aiobotocore-iotsecuretunneling = buildTypesAiobotocorePackage "iotsecuretunneling" "2.6.0" "sha256-8zvG95bDvJWNRmw9sCdBfPxQPdb4TNAzqMcth+hliLI=";
+
+  types-aiobotocore-iotsitewise = buildTypesAiobotocorePackage "iotsitewise" "2.6.0" "sha256-1i4Z4CE9PG7JByR9RpPazu7RmPIjNeDecnz5LH2ls2A=";
+
+  types-aiobotocore-iotthingsgraph = buildTypesAiobotocorePackage "iotthingsgraph" "2.6.0" "sha256-6161RDBwnvqvBtJWs5bPieI6AdwKFCmiT6ixKRE9GuM=";
+
+  types-aiobotocore-iottwinmaker = buildTypesAiobotocorePackage "iottwinmaker" "2.6.0" "sha256-/h85AoG+poq4t0EvpXdofWfbaEBD6CiCxhdaGKLi4C0=";
+
+  types-aiobotocore-iotwireless = buildTypesAiobotocorePackage "iotwireless" "2.6.0" "sha256-kuOboqDTHpdSW6vD/JGOdLL2U639wM+2V2KaSm1j0xo=";
+
+  types-aiobotocore-ivs = buildTypesAiobotocorePackage "ivs" "2.6.0" "sha256-CiMKW2suhsU2dZsLQkL3hK2qKRJ56FS4Ix7Dt347bMA=";
+
+  types-aiobotocore-ivs-realtime = buildTypesAiobotocorePackage "ivs-realtime" "2.6.0" "sha256-y4RRQdjaJS9GLW7HUNC9f3kWCOAGijlisrlB0MYQ1As=";
+
+  types-aiobotocore-ivschat = buildTypesAiobotocorePackage "ivschat" "2.6.0" "sha256-5ANdk601wY6vtjYbe8CxtY9lK4Fe6wbl5uB6Mq6uqII=";
+
+  types-aiobotocore-kafka = buildTypesAiobotocorePackage "kafka" "2.6.0" "sha256-cvmNob4pGa18W/2uh16zFJ58f0MHRDL2LwOKrsO16uI=";
+
+  types-aiobotocore-kafkaconnect = buildTypesAiobotocorePackage "kafkaconnect" "2.6.0" "sha256-pOk51+FrlKDNPPDaa1mf3HjpCqlUskeRYITkFp91l6M=";
+
+  types-aiobotocore-kendra = buildTypesAiobotocorePackage "kendra" "2.6.0" "sha256-1WeJI++z4QiF0bZ4FyNgoNWY6X62ZCyq7PGNM9urFn4=";
+
+  types-aiobotocore-kendra-ranking = buildTypesAiobotocorePackage "kendra-ranking" "2.6.0" "sha256-uaeHdW8lew6jq2KQApkY76eWRkYVLffN0h71icP9viE=";
+
+  types-aiobotocore-keyspaces = buildTypesAiobotocorePackage "keyspaces" "2.6.0" "sha256-vbWWkLbVnzfWHp3Yy3S6mh0+tHrkA/5Krw4GVSdILls=";
+
+  types-aiobotocore-kinesis = buildTypesAiobotocorePackage "kinesis" "2.6.0" "sha256-n5u7dzAnZ7YRGIC2qyynlsALR7tONulc0ZmimW+xotk=";
+
+  types-aiobotocore-kinesis-video-archived-media = buildTypesAiobotocorePackage "kinesis-video-archived-media" "2.6.0" "sha256-mjY7GbQ20pzL38tQMoluJISpaxk/IreluvmX7XsLfTg=";
+
+  types-aiobotocore-kinesis-video-media = buildTypesAiobotocorePackage "kinesis-video-media" "2.6.0" "sha256-8kK4JurIaid4k0BkpoZkaosn7cOIyMTt0RXnoJZUtSc=";
+
+  types-aiobotocore-kinesis-video-signaling = buildTypesAiobotocorePackage "kinesis-video-signaling" "2.6.0" "sha256-nUOb5NwCsz/7Z0bUMUsxysn2bgNi+yTvyGGCkwzCU1o=";
+
+  types-aiobotocore-kinesis-video-webrtc-storage = buildTypesAiobotocorePackage "kinesis-video-webrtc-storage" "2.6.0" "sha256-Tw+ozecMKAw56x47Wqq3wwwcmDT+5LvoUDAZSX0z2I4=";
+
+  types-aiobotocore-kinesisanalytics = buildTypesAiobotocorePackage "kinesisanalytics" "2.6.0" "sha256-QY5tN7QVP2WC7P/se6wNrnLp3sJVIr/rTEs9ePpADPE=";
+
+  types-aiobotocore-kinesisanalyticsv2 = buildTypesAiobotocorePackage "kinesisanalyticsv2" "2.6.0" "sha256-aedmxGOuU70uX/+bQL8coUWBpk9IQHAL7VqusH8zPbs=";
+
+  types-aiobotocore-kinesisvideo = buildTypesAiobotocorePackage "kinesisvideo" "2.6.0" "sha256-wyT6YahL3sRGHQcBTAyLd7l75wVWRp2waS+Q46Me/ok=";
+
+  types-aiobotocore-kms = buildTypesAiobotocorePackage "kms" "2.6.0" "sha256-mY26ICYSENAruEn4986zxi5R9ong4nyuRAHgMZDliqo=";
+
+  types-aiobotocore-lakeformation = buildTypesAiobotocorePackage "lakeformation" "2.6.0" "sha256-CR3Uopf6izBTlR16yIA3CUikWrS3OzkFZFpbJNDhBVs=";
+
+  types-aiobotocore-lambda = buildTypesAiobotocorePackage "lambda" "2.6.0" "sha256-pkZMQu5himEPO7z/AF7INb7H7jjmkyQV1ql2epF4yYA=";
+
+  types-aiobotocore-lex-models = buildTypesAiobotocorePackage "lex-models" "2.6.0" "sha256-sIQ85LzkQgMvVfAKEc5HxIXx85Tckx4HVXcex2hxZ6I=";
+
+  types-aiobotocore-lex-runtime = buildTypesAiobotocorePackage "lex-runtime" "2.6.0" "sha256-IZvLF0Wg7od/LqC2bcCxtvNun0n9JViuXE/CQMoBdMc=";
+
+  types-aiobotocore-lexv2-models = buildTypesAiobotocorePackage "lexv2-models" "2.6.0" "sha256-9eebhFQqnsParfZ1poJJX/ehx1lNHIynFwXEzAo10JM=";
+
+  types-aiobotocore-lexv2-runtime = buildTypesAiobotocorePackage "lexv2-runtime" "2.6.0" "sha256-ot+oM2a+CA/92d+tY54tqdOlsZWReknv+Pt3Aw8V1GU=";
+
+  types-aiobotocore-license-manager = buildTypesAiobotocorePackage "license-manager" "2.6.0" "sha256-iNlzgcjg3VrIZJEi2f+7msFqrfWsUS24k7OERB28uRo=";
+
+  types-aiobotocore-license-manager-linux-subscriptions = buildTypesAiobotocorePackage "license-manager-linux-subscriptions" "2.6.0" "sha256-1exWgnbG5ikd1pHWClPGq3Luku5qyTtG6pwvqL/zWdk=";
+
+  types-aiobotocore-license-manager-user-subscriptions = buildTypesAiobotocorePackage "license-manager-user-subscriptions" "2.6.0" "sha256-0fLwCr5eDRxcGZdw3sqExh8awX1qu5XmEYMD63xhD3w=";
+
+  types-aiobotocore-lightsail = buildTypesAiobotocorePackage "lightsail" "2.6.0" "sha256-eiibXP8S+xvn+PTX8cd3WiN6yL2JmjK9EG9BryexFjY=";
+
+  types-aiobotocore-location = buildTypesAiobotocorePackage "location" "2.6.0" "sha256-3zQZyDgaMuj5SAQ7Nc+XzF5dUi1E9bAjv9mIscJxfqM=";
+
+  types-aiobotocore-logs = buildTypesAiobotocorePackage "logs" "2.6.0" "sha256-qyA1uCrAFGZHMlfL8Dou1YkM6rb9xwcrDQmteSqOadM=";
+
+  types-aiobotocore-lookoutequipment = buildTypesAiobotocorePackage "lookoutequipment" "2.6.0" "sha256-ilPodAPj7J6xVCPEjsBQcQ4I5dNMEM2/hM1j8PJMUto=";
+
+  types-aiobotocore-lookoutmetrics = buildTypesAiobotocorePackage "lookoutmetrics" "2.6.0" "sha256-m/13nELWqdPNkZXmA3FhArlOKhB1CcbTaAsI9Iqzrik=";
+
+  types-aiobotocore-lookoutvision = buildTypesAiobotocorePackage "lookoutvision" "2.6.0" "sha256-gW+GFoQhI1Mj412Gh3MXfoSMKpNscUB4AqC9WMF4ACI=";
+
+  types-aiobotocore-m2 = buildTypesAiobotocorePackage "m2" "2.6.0" "sha256-DoFG4FxvJFnN54G5F2LZY5M0aYlCU9H5wwnAsiHaRmc=";
+
+  types-aiobotocore-machinelearning = buildTypesAiobotocorePackage "machinelearning" "2.6.0" "sha256-VZajCqSzofQLUBrXbMzdaPmbIDNp5YuUUk1wberVcFs=";
+
+  types-aiobotocore-macie = buildTypesAiobotocorePackage "macie" "2.6.0" "sha256-gbl7jEgjk4twoxGM+WRg4MZ/nkGg7btiPOsPptR7yfw=";
+
+  types-aiobotocore-macie2 = buildTypesAiobotocorePackage "macie2" "2.6.0" "sha256-IX2KY/guFLJ6jL4gRdTS6cQbNuFJuz8xa4QzqZ8j5h8=";
+
+  types-aiobotocore-managedblockchain = buildTypesAiobotocorePackage "managedblockchain" "2.6.0" "sha256-k/J7hBJDfGXMFR9jn7Tiec8bClrXIz6XyLMqLJad6oU=";
+
+  types-aiobotocore-managedblockchain-query = buildTypesAiobotocorePackage "managedblockchain-query" "2.6.0" "sha256-swmAlpVrP1eSvJatWaJL6QDfgZ0xzBttrpHt1aNULUk=";
+
+  types-aiobotocore-marketplace-catalog = buildTypesAiobotocorePackage "marketplace-catalog" "2.6.0" "sha256-9yD3FIFrRDMAckbztjrKeUEyXCUOggF5UfsPe5hcQ1Q=";
+
+  types-aiobotocore-marketplace-entitlement = buildTypesAiobotocorePackage "marketplace-entitlement" "2.6.0" "sha256-Q6S9pTfquW+Hv4uB9tbS/TEsC/i7iDfA+LyZCHq3cRI=";
+
+  types-aiobotocore-marketplacecommerceanalytics = buildTypesAiobotocorePackage "marketplacecommerceanalytics" "2.6.0" "sha256-iyHFWN8tWgQoShTO6bJQB89K+4JVWjMihzjMr2Lssvw=";
+
+  types-aiobotocore-mediaconnect = buildTypesAiobotocorePackage "mediaconnect" "2.6.0" "sha256-hEwlISpSm6r+a1MXxSH3UrBOiNu+Cx9d1T2RsFfrcyA=";
+
+  types-aiobotocore-mediaconvert = buildTypesAiobotocorePackage "mediaconvert" "2.6.0" "sha256-VdxG2yvN6g9UAn54OP6uafHGN+iHjNrfO4H5f5h6w18=";
+
+  types-aiobotocore-medialive = buildTypesAiobotocorePackage "medialive" "2.6.0" "sha256-hrfqkhKWIcP+fjDaeFjvk6c6GBTgsY3yxPodx9fFpxk=";
+
+  types-aiobotocore-mediapackage = buildTypesAiobotocorePackage "mediapackage" "2.6.0" "sha256-c7XLKvwiQL6e0tWH0DmOyauTz3q5b0hOVpjVzR1rmH8=";
+
+  types-aiobotocore-mediapackage-vod = buildTypesAiobotocorePackage "mediapackage-vod" "2.6.0" "sha256-zw2mJFQgX9xqjsvldssfMeulgCEY0kqaNg+nUe9PpCc=";
+
+  types-aiobotocore-mediapackagev2 = buildTypesAiobotocorePackage "mediapackagev2" "2.6.0" "sha256-fdZn+f03iIzzkpSCdTh2uUY4WcU1DcyRxozP7SSkGyo=";
+
+  types-aiobotocore-mediastore = buildTypesAiobotocorePackage "mediastore" "2.6.0" "sha256-KoZKeJPlIWhgifauIOSSLZaSJWn3E0lSNUOhKPfI0Go=";
+
+  types-aiobotocore-mediastore-data = buildTypesAiobotocorePackage "mediastore-data" "2.6.0" "sha256-HT/Kvi15YJLEno70ayEXQLPi9Y6NlRD8134IRJ7gdRY=";
+
+  types-aiobotocore-mediatailor = buildTypesAiobotocorePackage "mediatailor" "2.6.0" "sha256-3F1Gpd2kOU1rS7iSyDr0pkRECqYsyeeEQKDH2OO9H/A=";
+
+  types-aiobotocore-medical-imaging = buildTypesAiobotocorePackage "medical-imaging" "2.6.0" "sha256-zUXGqquEveHHDqA8XeJX++Yc42rnyW9Vzt5A7LOImfk=";
+
+  types-aiobotocore-memorydb = buildTypesAiobotocorePackage "memorydb" "2.6.0" "sha256-FJ9aeZRCY+bhot3cU3qX4EuFAowPCc7kT2D0FGVTpys=";
+
+  types-aiobotocore-meteringmarketplace = buildTypesAiobotocorePackage "meteringmarketplace" "2.6.0" "sha256-WsWw1y5XueMQnRTWYQP73GawsSzEsliPzu9Xlij3UAo=";
+
+  types-aiobotocore-mgh = buildTypesAiobotocorePackage "mgh" "2.6.0" "sha256-7wvX7X/NdB+GlWDogT2benTSC7ZCdVv97Zi6r+s5B2E=";
+
+  types-aiobotocore-mgn = buildTypesAiobotocorePackage "mgn" "2.6.0" "sha256-e6TTldFkZXf8A8bV7RKkIl6AD/lCC9elB6mT3WeWEiM=";
+
+  types-aiobotocore-migration-hub-refactor-spaces = buildTypesAiobotocorePackage "migration-hub-refactor-spaces" "2.6.0" "sha256-HVoia2UZMrjgH6aUQGit+MueUk0qW3KjWKYJy2pHlp0=";
+
+  types-aiobotocore-migrationhub-config = buildTypesAiobotocorePackage "migrationhub-config" "2.6.0" "sha256-hXju28oSNGlQ0qCwFD+qoyWFpKMbFkGWEXteOVOKiII=";
+
+  types-aiobotocore-migrationhuborchestrator = buildTypesAiobotocorePackage "migrationhuborchestrator" "2.6.0" "sha256-mo4vH/xsbRf1UViSRu4P2YzI+7LFkkzXsHeZZLdXg+U=";
+
+  types-aiobotocore-migrationhubstrategy = buildTypesAiobotocorePackage "migrationhubstrategy" "2.6.0" "sha256-eU4j+9z++Kgp2TaUX214XGuIXPxCriKu9w+XW8mZp+c=";
+
+  types-aiobotocore-mobile = buildTypesAiobotocorePackage "mobile" "2.6.0" "sha256-HKolI0fcGWye3Xow73qXOJRQ/Wb23ZXWLYyfA94zZT0=";
+
+  types-aiobotocore-mq = buildTypesAiobotocorePackage "mq" "2.6.0" "sha256-61iFbkOYLF6y1QUGePVAVEFqGgTmPbLYS7VDbvzmInA=";
+
+  types-aiobotocore-mturk = buildTypesAiobotocorePackage "mturk" "2.6.0" "sha256-pdRp9XjLVLCHeMSMV+NycKNt9kbH93/ZJKbiwNlb+A4=";
+
+  types-aiobotocore-mwaa = buildTypesAiobotocorePackage "mwaa" "2.6.0" "sha256-3/LXxvsVmKHpZPr1BISTndLFPmF3LF75kihknSt2cMk=";
+
+  types-aiobotocore-neptune = buildTypesAiobotocorePackage "neptune" "2.6.0" "sha256-2EIBP4NhRy+/OeFuPP/SIf1q6BhlKU9CFH7AM+y3558=";
+
+  types-aiobotocore-network-firewall = buildTypesAiobotocorePackage "network-firewall" "2.6.0" "sha256-3bVNQSzaMhkpiN1mhS9Lz2EfeEJpkSIcPCKPC6s02Uo=";
+
+  types-aiobotocore-networkmanager = buildTypesAiobotocorePackage "networkmanager" "2.6.0" "sha256-Pwmgi4ybpOtLWlY62+QcBHT0iF/6B4Hxbv4CQPA+7/o=";
+
+  types-aiobotocore-nimble = buildTypesAiobotocorePackage "nimble" "2.6.0" "sha256-x+wmTG6jeK8KpSDdhOZkbkRZ7ai7N4xaU4cEmHhO5xA=";
+
+  types-aiobotocore-oam = buildTypesAiobotocorePackage "oam" "2.6.0" "sha256-Q/msYeaXs9MxXj6X0p8Gw08/Y4FvvV2xAbEXU6iqi2g=";
+
+  types-aiobotocore-omics = buildTypesAiobotocorePackage "omics" "2.6.0" "sha256-UB0y0l2fb58yNJr36WpCeTDETAcdQkYd2ueETFEQSTo=";
+
+  types-aiobotocore-opensearch = buildTypesAiobotocorePackage "opensearch" "2.6.0" "sha256-ynRq7qRVNgpsP4lp6pbZqTv3zrF5Zu1v+STvv/yPgKw=";
+
+  types-aiobotocore-opensearchserverless = buildTypesAiobotocorePackage "opensearchserverless" "2.6.0" "sha256-M2tvTKjIg8aEP3KZvrMTCgiJqb6oWL9T5ylkj+Fr184=";
+
+  types-aiobotocore-opsworks = buildTypesAiobotocorePackage "opsworks" "2.6.0" "sha256-XY9DqNQUjFaumcOd2dvX/kV2sWt67Ni26H5SzCarr2E=";
+
+  types-aiobotocore-opsworkscm = buildTypesAiobotocorePackage "opsworkscm" "2.6.0" "sha256-k1QO54TXJJG5jAvPcoEyZEdEXSmLzHdSPDyF60Zmf78=";
+
+  types-aiobotocore-organizations = buildTypesAiobotocorePackage "organizations" "2.6.0" "sha256-kDxDdLaWlaNLfSCOc5Kho73cbk33FnK9c12PYKhdbFQ=";
+
+  types-aiobotocore-osis = buildTypesAiobotocorePackage "osis" "2.6.0" "sha256-Q8EIdCvT0Zjj9udUNpWZzgNClVjNBWTW3V7emhdf+yg=";
+
+  types-aiobotocore-outposts = buildTypesAiobotocorePackage "outposts" "2.6.0" "sha256-tXAQ+tNeZUF1snrB+76Ku+j1Wdslah38s0YMBOINrlo=";
+
+  types-aiobotocore-panorama = buildTypesAiobotocorePackage "panorama" "2.6.0" "sha256-/XJsZV5Yhp5BMSheF9zVf+MSJsH2zUrpnrkSwo+4PfI=";
+
+  types-aiobotocore-payment-cryptography = buildTypesAiobotocorePackage "payment-cryptography" "2.6.0" "sha256-x6uUO578BIDl1kFdyKXSPnegKLAX3FG4U5rDjsQpVQQ=";
+
+  types-aiobotocore-payment-cryptography-data = buildTypesAiobotocorePackage "payment-cryptography-data" "2.6.0" "sha256-+eHgcPA+egPBR06Mddw0RXuivpiprPMnBhPfCmh0sS4=";
+
+  types-aiobotocore-personalize = buildTypesAiobotocorePackage "personalize" "2.6.0" "sha256-5s0KmOdQyPtcFtb+XkR/zHEiEdZcDwZwldwUy+dvC4s=";
+
+  types-aiobotocore-personalize-events = buildTypesAiobotocorePackage "personalize-events" "2.6.0" "sha256-+9wtXNgXQhACa8NYfcjbZcJj0j9PlOavxs+c4NXy0kE=";
+
+  types-aiobotocore-personalize-runtime = buildTypesAiobotocorePackage "personalize-runtime" "2.6.0" "sha256-tvLfXhaFpdivIBtFYp0G4/QihOMSGXK1nVDFKuMJCto=";
+
+  types-aiobotocore-pi = buildTypesAiobotocorePackage "pi" "2.6.0" "sha256-j0ngXkDGIhSh/b1RPn+NY6V2BAUZJdvuT18iALwRkAY=";
+
+  types-aiobotocore-pinpoint = buildTypesAiobotocorePackage "pinpoint" "2.6.0" "sha256-Txme0jlgoF9IYywdKqv71kcEqBfF1juTJcagi/2wQ20=";
+
+  types-aiobotocore-pinpoint-email = buildTypesAiobotocorePackage "pinpoint-email" "2.6.0" "sha256-c6tqmW7i5AXrH2PFyVPCpBkDaiMdTu2fmbHeuc3SzPg=";
+
+  types-aiobotocore-pinpoint-sms-voice = buildTypesAiobotocorePackage "pinpoint-sms-voice" "2.6.0" "sha256-qvVYusxMw+ZrMJAKXqk1HzEDYHsvaUthnYMDF6b0xbQ=";
+
+  types-aiobotocore-pinpoint-sms-voice-v2 = buildTypesAiobotocorePackage "pinpoint-sms-voice-v2" "2.6.0" "sha256-ErqAFQYtKfsNABPm+KpOKm88Mh5MmXou6bqJfsqXdt0=";
+
+  types-aiobotocore-pipes = buildTypesAiobotocorePackage "pipes" "2.6.0" "sha256-vOszu7z/DiZwXrdqoiLUlpLQLNNuRbskI59BBippizI=";
+
+  types-aiobotocore-polly = buildTypesAiobotocorePackage "polly" "2.6.0" "sha256-AKP23N3xMzdOti6J7vONDM/cwdqTHYkiM6c/njspSXI=";
+
+  types-aiobotocore-pricing = buildTypesAiobotocorePackage "pricing" "2.6.0" "sha256-PccslOI6F2k50g03j22AYN3xtTsTW3ie4W4pEaT2XwY=";
+
+  types-aiobotocore-privatenetworks = buildTypesAiobotocorePackage "privatenetworks" "2.6.0" "sha256-3e6/IA6QYgGhipt5XP/b4h3soko1tLntMieXOmeWjlI=";
+
+  types-aiobotocore-proton = buildTypesAiobotocorePackage "proton" "2.6.0" "sha256-rtJ+idGSdRVZafFNppQgIQUobKzClCKHf4RqlBtppBw=";
+
+  types-aiobotocore-qldb = buildTypesAiobotocorePackage "qldb" "2.6.0" "sha256-AqV8yAUYTT8nc3jQkq0qDzZRKxewsrxIR/kVJiX3fwI=";
+
+  types-aiobotocore-qldb-session = buildTypesAiobotocorePackage "qldb-session" "2.6.0" "sha256-N4YntFIEyhhryAaIFY8Gu4Uehw6D/VcTeIlBxx7ej4c=";
+
+  types-aiobotocore-quicksight = buildTypesAiobotocorePackage "quicksight" "2.6.0" "sha256-DOum/vx6URynxImQN9SRhAr5rFgZdSJMdtAMom5YHe8=";
+
+  types-aiobotocore-ram = buildTypesAiobotocorePackage "ram" "2.6.0" "sha256-pZ/h8/1njNNp9+nhpbU/VhGevrZkSrWnhWm3weHAxWQ=";
+
+  types-aiobotocore-rbin = buildTypesAiobotocorePackage "rbin" "2.6.0" "sha256-TOI2FQdO71XT1NESXGrZN+UI6c7CGRmsBbp4ipuQwhg=";
+
+  types-aiobotocore-rds = buildTypesAiobotocorePackage "rds" "2.6.0" "sha256-M0IDOMbqGdLl0WSipPirjDn3Fr4AQ06+j3m0Ci3jyBE=";
+
+  types-aiobotocore-rds-data = buildTypesAiobotocorePackage "rds-data" "2.6.0" "sha256-GYddRqZeBP5f6chzZON9y59KcBiss9eWa8rVGo53C0g=";
+
+  types-aiobotocore-redshift = buildTypesAiobotocorePackage "redshift" "2.6.0" "sha256-6znZQUxNKE7SB6G+9l4iQSP9hZt+plKFA8VkE1scxrU=";
+
+  types-aiobotocore-redshift-data = buildTypesAiobotocorePackage "redshift-data" "2.6.0" "sha256-FRJeBjA5dfnnZ586VShmPt0CBgi5+ZYbldOUZIGR2L0=";
+
+  types-aiobotocore-redshift-serverless = buildTypesAiobotocorePackage "redshift-serverless" "2.6.0" "sha256-lMNUId8z4h/m0FmusvEjYoQj+PUSLaiOREd27vF3qxI=";
+
+  types-aiobotocore-rekognition = buildTypesAiobotocorePackage "rekognition" "2.6.0" "sha256-8luG3yWj82hmMq5KYjNG58pbiDBMk+D6ykgzqE752T8=";
+
+  types-aiobotocore-resiliencehub = buildTypesAiobotocorePackage "resiliencehub" "2.6.0" "sha256-nXZ7ZrpEOSdXdcuGVMNI7hjx6oisnnej18vALIEEzGQ=";
+
+  types-aiobotocore-resource-explorer-2 = buildTypesAiobotocorePackage "resource-explorer-2" "2.6.0" "sha256-cjBd3Ns1ckr7DT9gpaeb8CbXOrmwU3gENN5Is5BwrZI=";
+
+  types-aiobotocore-resource-groups = buildTypesAiobotocorePackage "resource-groups" "2.6.0" "sha256-GcbI21WVdMmwMcpbBkma4VrLsLVRP24/Uk43+4vE864=";
+
+  types-aiobotocore-resourcegroupstaggingapi = buildTypesAiobotocorePackage "resourcegroupstaggingapi" "2.6.0" "sha256-pW8/wn2Qk1jf1d2kYZ84yEaNUcl6xgHw+yuT0bHnsBE=";
+
+  types-aiobotocore-robomaker = buildTypesAiobotocorePackage "robomaker" "2.6.0" "sha256-aKO/fGT4UANiYkZOUuOQ4ungKpW8p+yAT5+42WHgp3M=";
+
+  types-aiobotocore-rolesanywhere = buildTypesAiobotocorePackage "rolesanywhere" "2.6.0" "sha256-jTAe8nMwbXwb+1uf9ITVIKtKyOLIwFH6yi+2IYYVIyU=";
+
+  types-aiobotocore-route53 = buildTypesAiobotocorePackage "route53" "2.6.0" "sha256-RMIrcFD+1RbA3AcRw3TSjENBzmHQL1zHX7FoOFA+UP0=";
+
+  types-aiobotocore-route53-recovery-cluster = buildTypesAiobotocorePackage "route53-recovery-cluster" "2.6.0" "sha256-mBwT11n8moLt/j46AayYES6rjVo3Tpa5UWJ4Klb1N0g=";
+
+  types-aiobotocore-route53-recovery-control-config = buildTypesAiobotocorePackage "route53-recovery-control-config" "2.6.0" "sha256-qYYT1FRpqxtR9LPGMOH+p0+kbeGvfrlIE6rp5Nupioc=";
+
+  types-aiobotocore-route53-recovery-readiness = buildTypesAiobotocorePackage "route53-recovery-readiness" "2.6.0" "sha256-66kGFeDv4PkKYd4UEL4Feqw5LnygBMGvHqctC4EWnNU=";
+
+  types-aiobotocore-route53domains = buildTypesAiobotocorePackage "route53domains" "2.6.0" "sha256-TQ7aNPrky6O+xQefuSkHyFN0XJC5u3xMaT0yrjwYv3E=";
+
+  types-aiobotocore-route53resolver = buildTypesAiobotocorePackage "route53resolver" "2.6.0" "sha256-55qUjFm6ryLjGAmxGLFkl9dPHXjDWyIINZQRQXe4bnk=";
+
+  types-aiobotocore-rum = buildTypesAiobotocorePackage "rum" "2.6.0" "sha256-e8LzXHMfEgkcJKx5a/I//L4/oCz1l7N487wNoTtBP1Y=";
+
+  types-aiobotocore-s3 = buildTypesAiobotocorePackage "s3" "2.6.0" "sha256-MIp/lGwJah2Jj/2KFfoeW2uQlV1DZbP8TYcdsNvEMU8=";
+
+  types-aiobotocore-s3control = buildTypesAiobotocorePackage "s3control" "2.6.0" "sha256-eyiAFFT5KOtTDT2EZNah1KRdcWw1v1titjHwG3DnRj4=";
+
+  types-aiobotocore-s3outposts = buildTypesAiobotocorePackage "s3outposts" "2.6.0" "sha256-g4wAsVc3gqiovsXZtEey4XKmLp/UkIeKD1pEjiey5DE=";
+
+  types-aiobotocore-sagemaker = buildTypesAiobotocorePackage "sagemaker" "2.6.0" "sha256-GUcRyWviI+JCG7XTGBQcUljxAdjBzso76d5A3ql5lbA=";
+
+  types-aiobotocore-sagemaker-a2i-runtime = buildTypesAiobotocorePackage "sagemaker-a2i-runtime" "2.6.0" "sha256-7znJt8gJGnBbTndTPeFOpN6iytOPTJPgvA/tHeYQVoo=";
+
+  types-aiobotocore-sagemaker-edge = buildTypesAiobotocorePackage "sagemaker-edge" "2.6.0" "sha256-O3oCXuvREHW7lcwDzbJRogb9Qa2Wfb8C5/rbpjhVm8A=";
+
+  types-aiobotocore-sagemaker-featurestore-runtime = buildTypesAiobotocorePackage "sagemaker-featurestore-runtime" "2.6.0" "sha256-mcU7ZGAGzbV7i8H1qMWFI9vm/8APRfmaAncxKBJL+NU=";
+
+  types-aiobotocore-sagemaker-geospatial = buildTypesAiobotocorePackage "sagemaker-geospatial" "2.6.0" "sha256-uKvgKNZHFZIYsE0hMWjuHN+QzI/eQcCn4HD2C8H+d2I=";
+
+  types-aiobotocore-sagemaker-metrics = buildTypesAiobotocorePackage "sagemaker-metrics" "2.6.0" "sha256-Hnq9JAdPiqfhb/uLQhMk7JWZ8xHko06KqHXh9f6al/8=";
+
+  types-aiobotocore-sagemaker-runtime = buildTypesAiobotocorePackage "sagemaker-runtime" "2.6.0" "sha256-/7Zzo383eWFjEHxZST1QKzTNHunhR8mjSE2uEHUw9IE=";
+
+  types-aiobotocore-savingsplans = buildTypesAiobotocorePackage "savingsplans" "2.6.0" "sha256-6sIHmILzIg1aOskXnjbDDzbkygXDwFcnd9mfuuhRFZQ=";
+
+  types-aiobotocore-scheduler = buildTypesAiobotocorePackage "scheduler" "2.6.0" "sha256-2BnFCPgaAWxBsc+79oQT+DDj6IM7cV7F+LjqsFG6BBc=";
+
+  types-aiobotocore-schemas = buildTypesAiobotocorePackage "schemas" "2.6.0" "sha256-TW57DJw0QgnPrIWlOlAvESYSEPUD/UKbXVs+NYW+7r0=";
+
+  types-aiobotocore-sdb = buildTypesAiobotocorePackage "sdb" "2.6.0" "sha256-cLciwg4d5EZKYquNitl3yD+8eJnemEiF27LcXfxy0Zs=";
+
+  types-aiobotocore-secretsmanager = buildTypesAiobotocorePackage "secretsmanager" "2.6.0" "sha256-dvte4Yjl+a/UqL5v7xJ9626igVjx/ZPdM2SsLGsVdDk=";
+
+  types-aiobotocore-securityhub = buildTypesAiobotocorePackage "securityhub" "2.6.0" "sha256-36BIOCHnkFyEp3MPa5NfjNJNBeqVMCmx9C907Bw3YWQ=";
+
+  types-aiobotocore-securitylake = buildTypesAiobotocorePackage "securitylake" "2.6.0" "sha256-DKmk2ddd7b0g6mnt0d37Y1ofb6dgN/6XFBCElqdQ9+A=";
+
+  types-aiobotocore-serverlessrepo = buildTypesAiobotocorePackage "serverlessrepo" "2.6.0" "sha256-PRzh/JFCHUqXTSAR4IoftxvkRBsVq4XEX7ihC9FzqSI=";
+
+  types-aiobotocore-service-quotas = buildTypesAiobotocorePackage "service-quotas" "2.6.0" "sha256-GcDl3LIy+urPEzXINmU4g7xgk8IIIJ6fBFFXhv18eSA=";
+
+  types-aiobotocore-servicecatalog = buildTypesAiobotocorePackage "servicecatalog" "2.6.0" "sha256-5IoQuLh6bh3mlzInR+Aci6yIRCSYJXfbvv49FEs2tPA=";
+
+  types-aiobotocore-servicecatalog-appregistry = buildTypesAiobotocorePackage "servicecatalog-appregistry" "2.6.0" "sha256-l0xrQXkDYmB3+RFtwJ70l6GgKeA0z1V107HG8Ddvb8U=";
+
+  types-aiobotocore-servicediscovery = buildTypesAiobotocorePackage "servicediscovery" "2.6.0" "sha256-KLdOmaO6x7AmQInP1RRAf8s5rlpD0PpDHeBnor5gl2A=";
+
+  types-aiobotocore-ses = buildTypesAiobotocorePackage "ses" "2.6.0" "sha256-QNjpM0m1PKSQx2f1eNkOeNP7pHN0PfHZlMFVQbGOgGU=";
+
+  types-aiobotocore-sesv2 = buildTypesAiobotocorePackage "sesv2" "2.6.0" "sha256-5g1LUvS324evqH+Rv+pUKlePnE3QqMqpiLCrknxjQX8=";
+
+  types-aiobotocore-shield = buildTypesAiobotocorePackage "shield" "2.6.0" "sha256-5NbnrGPo9jTCIxq7ubNX/OuKZOXU0PoSwgTjfuMvnKY=";
+
+  types-aiobotocore-signer = buildTypesAiobotocorePackage "signer" "2.6.0" "sha256-AZRsUZpKhzPiHoUcboBeX5zYlVD9kY6F4n6/ifRTpr8=";
+
+  types-aiobotocore-simspaceweaver = buildTypesAiobotocorePackage "simspaceweaver" "2.6.0" "sha256-WrkKQxXI7eIaX4GimyDyBqDWVjw0eF3jJTA40JScvG0=";
+
+  types-aiobotocore-sms = buildTypesAiobotocorePackage "sms" "2.6.0" "sha256-I//ZK5HolYkCfpTCPYhEDALfcn9AYcLk7x7vfRjTDlo=";
+
+  types-aiobotocore-sms-voice = buildTypesAiobotocorePackage "sms-voice" "2.6.0" "sha256-Qz+ZXVBSe3kHgGlqQjgxWoQhnguqauxmPKaISQbAG/8=";
+
+  types-aiobotocore-snow-device-management = buildTypesAiobotocorePackage "snow-device-management" "2.6.0" "sha256-Fh35RpHExkL/PeqEnWNR2pJYWERDJzOF9oE3SvIxxQ4=";
+
+  types-aiobotocore-snowball = buildTypesAiobotocorePackage "snowball" "2.6.0" "sha256-Wia4Xc/Kt8j6X5rZ9vvxupr6tCv1XQQQFOwRnugL0lE=";
+
+  types-aiobotocore-sns = buildTypesAiobotocorePackage "sns" "2.6.0" "sha256-hDPU7e14iYcpt8dXzjx7PgT4TQloAn2ZYrq6cMtMncc=";
+
+  types-aiobotocore-sqs = buildTypesAiobotocorePackage "sqs" "2.6.0" "sha256-J5QSpJQjhO6T2uGpDstHdEVJTLuTIxilmYmKdtB7u6g=";
+
+  types-aiobotocore-ssm = buildTypesAiobotocorePackage "ssm" "2.6.0" "sha256-NxTwgcrDNOHZ8PReIgfTOGLTl7bL1948NKAyjJ0QYKc=";
+
+  types-aiobotocore-ssm-contacts = buildTypesAiobotocorePackage "ssm-contacts" "2.6.0" "sha256-fWnCKnG6ikXzDx40HFxlh9DyLVlX9pBB4CMcJxUt+Ps=";
+
+  types-aiobotocore-ssm-incidents = buildTypesAiobotocorePackage "ssm-incidents" "2.6.0" "sha256-6wkvuRGT91a0Ggxt13amMzjWd6Pj62w4nrvWQNQ0GxI=";
+
+  types-aiobotocore-ssm-sap = buildTypesAiobotocorePackage "ssm-sap" "2.6.0" "sha256-7NkEDcuph8xxjlDjuEiSuhvM5srAeY4QfAKLwFLhCsU=";
+
+  types-aiobotocore-sso = buildTypesAiobotocorePackage "sso" "2.6.0" "sha256-pM6yxg0MxTXjSWZ/CLsatlIMx4tO0p9ZKRzOhyJYXWc=";
+
+  types-aiobotocore-sso-admin = buildTypesAiobotocorePackage "sso-admin" "2.6.0" "sha256-idc5d/Kvjhd7RkTHuErSoP/f64/Q1+jg0TE3UMiL4pQ=";
+
+  types-aiobotocore-sso-oidc = buildTypesAiobotocorePackage "sso-oidc" "2.6.0" "sha256-3eJaNx/Tzy9XQtHSPGKlkMG7klB2KDgL60knGghWAn8=";
+
+  types-aiobotocore-stepfunctions = buildTypesAiobotocorePackage "stepfunctions" "2.6.0" "sha256-7y8SiLa09lDqnMZtlG0Qw5tvAvQMvTNqMuCpRecOpXc=";
+
+  types-aiobotocore-storagegateway = buildTypesAiobotocorePackage "storagegateway" "2.6.0" "sha256-Umq4Slts9RHPJRJCWRAIAizLxB9Clcz8GomLsUr5gNE=";
+
+  types-aiobotocore-sts = buildTypesAiobotocorePackage "sts" "2.6.0" "sha256-iRwalkojzQCUiAQcxl8hEYFFbnIxhuaJfrATnK18ltI=";
+
+  types-aiobotocore-support = buildTypesAiobotocorePackage "support" "2.6.0" "sha256-+4rnAV2Qr29bvWRO6TnSaRZkUVCoefB3SDXc2Ye9kpE=";
+
+  types-aiobotocore-support-app = buildTypesAiobotocorePackage "support-app" "2.6.0" "sha256-CXYfdtO1TdmEz39v2AEeCTJmgiA/EF1gmaBBYGRgYV0=";
+
+  types-aiobotocore-swf = buildTypesAiobotocorePackage "swf" "2.6.0" "sha256-x9cBjUe4LC9uSsFpPciZP1QlUEqfNo3xZFKUqPuVV6E=";
+
+  types-aiobotocore-synthetics = buildTypesAiobotocorePackage "synthetics" "2.6.0" "sha256-Wew0A2xIYOGXzfZf3sBpHnRW/dZD1s6wHveNMwYj1s4=";
+
+  types-aiobotocore-textract = buildTypesAiobotocorePackage "textract" "2.6.0" "sha256-vWUMopzR+1095nN6POsHShvCKZIcUwfW11oMOJ9R94c=";
+
+  types-aiobotocore-timestream-query = buildTypesAiobotocorePackage "timestream-query" "2.6.0" "sha256-4QpCK14NogeYR9DB877zh760GEXYieiyOgepB9DZd+8=";
+
+  types-aiobotocore-timestream-write = buildTypesAiobotocorePackage "timestream-write" "2.6.0" "sha256-bBcMTJOVFq1mJQZtc9M/EMT45Xxxk2DqDgVHfM3qt3A=";
+
+  types-aiobotocore-tnb = buildTypesAiobotocorePackage "tnb" "2.6.0" "sha256-c4Y5kilT50Ips16/YhwduNbm89gB4iLHFv8eN8T4NDM=";
+
+  types-aiobotocore-transcribe = buildTypesAiobotocorePackage "transcribe" "2.6.0" "sha256-HB1CKe9mkD0+0TdFXmdiphDUqc+4xbwBIXSu0PulBE4=";
+
+  types-aiobotocore-transfer = buildTypesAiobotocorePackage "transfer" "2.6.0" "sha256-59SvnKQ+WpAKUZNYunFywLLah1aBnF0maZrFbALXcIM=";
+
+  types-aiobotocore-translate = buildTypesAiobotocorePackage "translate" "2.6.0" "sha256-cgxE6GYG9c4234RAiyFfF22NPHJ29oytOvLpETnjdS4=";
+
+  types-aiobotocore-verifiedpermissions = buildTypesAiobotocorePackage "verifiedpermissions" "2.6.0" "sha256-yg4zDBjgSB7JuuS2DXIUe3PFQq9stIfEJSMF1IP2BWI=";
+
+  types-aiobotocore-voice-id = buildTypesAiobotocorePackage "voice-id" "2.6.0" "sha256-Pnn3CGL5rr3MtzaakjDXmReVKXnyB76IxSnAPnKU45I=";
+
+  types-aiobotocore-vpc-lattice = buildTypesAiobotocorePackage "vpc-lattice" "2.6.0" "sha256-kxniFLA2e7aDKulF5z1Ap3z6wbE3eY3QVqhK+CVhrcE=";
+
+  types-aiobotocore-waf = buildTypesAiobotocorePackage "waf" "2.6.0" "sha256-adKf+AbPmeN57r93T36IewoiLZ+05CbpuS7NxCkQgMw=";
+
+  types-aiobotocore-waf-regional = buildTypesAiobotocorePackage "waf-regional" "2.6.0" "sha256-56SIq8Q6B405aqKU8UMddGHyrJeFaVKZSG4ImBWBZLU=";
+
+  types-aiobotocore-wafv2 = buildTypesAiobotocorePackage "wafv2" "2.6.0" "sha256-nAGK0tN42UhDUmpztGeAPRS5FuuTt+LugQmcgkR0oLA=";
+
+  types-aiobotocore-wellarchitected = buildTypesAiobotocorePackage "wellarchitected" "2.6.0" "sha256-p/2uqdRwKgsS2EUCr8ZLds6WHUjVQz8mEv35qcyMTYA=";
+
+  types-aiobotocore-wisdom = buildTypesAiobotocorePackage "wisdom" "2.6.0" "sha256-EInqI5EqriiI2L/tdQiy3/jY8tnZ6+QOk9PdEyDuSj4=";
+
+  types-aiobotocore-workdocs = buildTypesAiobotocorePackage "workdocs" "2.6.0" "sha256-cNegCM7a4QlI+NLzIRIoGHYzQqbFkNRKqDKLOqE3OUY=";
+
+  types-aiobotocore-worklink = buildTypesAiobotocorePackage "worklink" "2.6.0" "sha256-hMPU0wmTi0BQ+AWo4T6DIOl6FrAQbzdal8rcPoY3wP0=";
+
+  types-aiobotocore-workmail = buildTypesAiobotocorePackage "workmail" "2.6.0" "sha256-W/kHZMLFQ7kv8i/3urxbjdXc7RorMyy5joJNtFPAhVU=";
+
+  types-aiobotocore-workmailmessageflow = buildTypesAiobotocorePackage "workmailmessageflow" "2.6.0" "sha256-Mc3h0CSmJRoV+ncwhtd4Tu5LSoasWqK8V9hXK5+XYfs=";
+
+  types-aiobotocore-workspaces = buildTypesAiobotocorePackage "workspaces" "2.6.0" "sha256-xtsxrIzhjJSoGqd1fEgXP55bRtDsJTtdoWn8eooHCmY=";
+
+  types-aiobotocore-workspaces-web = buildTypesAiobotocorePackage "workspaces-web" "2.6.0" "sha256-J3lsLnwcttamV4NroDuXz9EupXrsoN/SumKrykQkwVU=";
+
+  types-aiobotocore-xray = buildTypesAiobotocorePackage "xray" "2.6.0" "sha256-DPirH1s636ZW6VKyD4wMiJEfM+u9NknH0ODLQagaLrs=";
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-aiobotocore/default.nix b/nixpkgs/pkgs/development/python-modules/types-aiobotocore/default.nix
new file mode 100644
index 000000000000..81be449f7f0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-aiobotocore/default.nix
@@ -0,0 +1,1824 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, wheel
+, botocore-stubs
+, typing-extensions
+, types-aiobotocore-accessanalyzer
+, types-aiobotocore-account
+, types-aiobotocore-acm
+, types-aiobotocore-acm-pca
+, aiobotocore
+, botocore
+, types-aiobotocore-alexaforbusiness
+, types-aiobotocore-amp
+, types-aiobotocore-amplify
+, types-aiobotocore-amplifybackend
+, types-aiobotocore-amplifyuibuilder
+, types-aiobotocore-apigateway
+, types-aiobotocore-apigatewaymanagementapi
+, types-aiobotocore-apigatewayv2
+, types-aiobotocore-appconfig
+, types-aiobotocore-appconfigdata
+, types-aiobotocore-appfabric
+, types-aiobotocore-appflow
+, types-aiobotocore-appintegrations
+, types-aiobotocore-application-autoscaling
+, types-aiobotocore-application-insights
+, types-aiobotocore-applicationcostprofiler
+, types-aiobotocore-appmesh
+, types-aiobotocore-apprunner
+, types-aiobotocore-appstream
+, types-aiobotocore-appsync
+, types-aiobotocore-arc-zonal-shift
+, types-aiobotocore-athena
+, types-aiobotocore-auditmanager
+, types-aiobotocore-autoscaling
+, types-aiobotocore-autoscaling-plans
+, types-aiobotocore-backup
+, types-aiobotocore-backup-gateway
+, types-aiobotocore-backupstorage
+, types-aiobotocore-batch
+, types-aiobotocore-billingconductor
+, types-aiobotocore-braket
+, types-aiobotocore-budgets
+, types-aiobotocore-ce
+, types-aiobotocore-chime
+, types-aiobotocore-chime-sdk-identity
+, types-aiobotocore-chime-sdk-media-pipelines
+, types-aiobotocore-chime-sdk-meetings
+, types-aiobotocore-chime-sdk-messaging
+, types-aiobotocore-chime-sdk-voice
+, types-aiobotocore-cleanrooms
+, types-aiobotocore-cloud9
+, types-aiobotocore-cloudcontrol
+, types-aiobotocore-clouddirectory
+, types-aiobotocore-cloudformation
+, types-aiobotocore-cloudfront
+, types-aiobotocore-cloudhsm
+, types-aiobotocore-cloudhsmv2
+, types-aiobotocore-cloudsearch
+, types-aiobotocore-cloudsearchdomain
+, types-aiobotocore-cloudtrail
+, types-aiobotocore-cloudtrail-data
+, types-aiobotocore-cloudwatch
+, types-aiobotocore-codeartifact
+, types-aiobotocore-codebuild
+, types-aiobotocore-codecatalyst
+, types-aiobotocore-codecommit
+, types-aiobotocore-codedeploy
+, types-aiobotocore-codeguru-reviewer
+, types-aiobotocore-codeguru-security
+, types-aiobotocore-codeguruprofiler
+, types-aiobotocore-codepipeline
+, types-aiobotocore-codestar
+, types-aiobotocore-codestar-connections
+, types-aiobotocore-codestar-notifications
+, types-aiobotocore-cognito-identity
+, types-aiobotocore-cognito-idp
+, types-aiobotocore-cognito-sync
+, types-aiobotocore-comprehend
+, types-aiobotocore-comprehendmedical
+, types-aiobotocore-compute-optimizer
+, types-aiobotocore-config
+, types-aiobotocore-connect
+, types-aiobotocore-connect-contact-lens
+, types-aiobotocore-connectcampaigns
+, types-aiobotocore-connectcases
+, types-aiobotocore-connectparticipant
+, types-aiobotocore-controltower
+, types-aiobotocore-cur
+, types-aiobotocore-customer-profiles
+, types-aiobotocore-databrew
+, types-aiobotocore-dataexchange
+, types-aiobotocore-datapipeline
+, types-aiobotocore-datasync
+, types-aiobotocore-dax
+, types-aiobotocore-detective
+, types-aiobotocore-devicefarm
+, types-aiobotocore-devops-guru
+, types-aiobotocore-directconnect
+, types-aiobotocore-discovery
+, types-aiobotocore-dlm
+, types-aiobotocore-dms
+, types-aiobotocore-docdb
+, types-aiobotocore-docdb-elastic
+, types-aiobotocore-drs
+, types-aiobotocore-ds
+, types-aiobotocore-dynamodb
+, types-aiobotocore-dynamodbstreams
+, types-aiobotocore-ebs
+, types-aiobotocore-ec2
+, types-aiobotocore-ec2-instance-connect
+, types-aiobotocore-ecr
+, types-aiobotocore-ecr-public
+, types-aiobotocore-ecs
+, types-aiobotocore-efs
+, types-aiobotocore-eks
+, types-aiobotocore-elastic-inference
+, types-aiobotocore-elasticache
+, types-aiobotocore-elasticbeanstalk
+, types-aiobotocore-elastictranscoder
+, types-aiobotocore-elb
+, types-aiobotocore-elbv2
+, types-aiobotocore-emr
+, types-aiobotocore-emr-containers
+, types-aiobotocore-emr-serverless
+, types-aiobotocore-entityresolution
+, types-aiobotocore-es
+, types-aiobotocore-events
+, types-aiobotocore-evidently
+, types-aiobotocore-finspace
+, types-aiobotocore-finspace-data
+, types-aiobotocore-firehose
+, types-aiobotocore-fis
+, types-aiobotocore-fms
+, types-aiobotocore-forecast
+, types-aiobotocore-forecastquery
+, types-aiobotocore-frauddetector
+, types-aiobotocore-fsx
+, types-aiobotocore-gamelift
+, types-aiobotocore-gamesparks
+, types-aiobotocore-glacier
+, types-aiobotocore-globalaccelerator
+, types-aiobotocore-glue
+, types-aiobotocore-grafana
+, types-aiobotocore-greengrass
+, types-aiobotocore-greengrassv2
+, types-aiobotocore-groundstation
+, types-aiobotocore-guardduty
+, types-aiobotocore-health
+, types-aiobotocore-healthlake
+, types-aiobotocore-honeycode
+, types-aiobotocore-iam
+, types-aiobotocore-identitystore
+, types-aiobotocore-imagebuilder
+, types-aiobotocore-importexport
+, types-aiobotocore-inspector
+, types-aiobotocore-inspector2
+, types-aiobotocore-internetmonitor
+, types-aiobotocore-iot
+, types-aiobotocore-iot-data
+, types-aiobotocore-iot-jobs-data
+, types-aiobotocore-iot-roborunner
+, types-aiobotocore-iot1click-devices
+, types-aiobotocore-iot1click-projects
+, types-aiobotocore-iotanalytics
+, types-aiobotocore-iotdeviceadvisor
+, types-aiobotocore-iotevents
+, types-aiobotocore-iotevents-data
+, types-aiobotocore-iotfleethub
+, types-aiobotocore-iotfleetwise
+, types-aiobotocore-iotsecuretunneling
+, types-aiobotocore-iotsitewise
+, types-aiobotocore-iotthingsgraph
+, types-aiobotocore-iottwinmaker
+, types-aiobotocore-iotwireless
+, types-aiobotocore-ivs
+, types-aiobotocore-ivs-realtime
+, types-aiobotocore-ivschat
+, types-aiobotocore-kafka
+, types-aiobotocore-kafkaconnect
+, types-aiobotocore-kendra
+, types-aiobotocore-kendra-ranking
+, types-aiobotocore-keyspaces
+, types-aiobotocore-kinesis
+, types-aiobotocore-kinesis-video-archived-media
+, types-aiobotocore-kinesis-video-media
+, types-aiobotocore-kinesis-video-signaling
+, types-aiobotocore-kinesis-video-webrtc-storage
+, types-aiobotocore-kinesisanalytics
+, types-aiobotocore-kinesisanalyticsv2
+, types-aiobotocore-kinesisvideo
+, types-aiobotocore-kms
+, types-aiobotocore-lakeformation
+, types-aiobotocore-lambda
+, types-aiobotocore-lex-models
+, types-aiobotocore-lex-runtime
+, types-aiobotocore-lexv2-models
+, types-aiobotocore-lexv2-runtime
+, types-aiobotocore-license-manager
+, types-aiobotocore-license-manager-linux-subscriptions
+, types-aiobotocore-license-manager-user-subscriptions
+, types-aiobotocore-lightsail
+, types-aiobotocore-location
+, types-aiobotocore-logs
+, types-aiobotocore-lookoutequipment
+, types-aiobotocore-lookoutmetrics
+, types-aiobotocore-lookoutvision
+, types-aiobotocore-m2
+, types-aiobotocore-machinelearning
+, types-aiobotocore-macie
+, types-aiobotocore-macie2
+, types-aiobotocore-managedblockchain
+, types-aiobotocore-managedblockchain-query
+, types-aiobotocore-marketplace-catalog
+, types-aiobotocore-marketplace-entitlement
+, types-aiobotocore-marketplacecommerceanalytics
+, types-aiobotocore-mediaconnect
+, types-aiobotocore-mediaconvert
+, types-aiobotocore-medialive
+, types-aiobotocore-mediapackage
+, types-aiobotocore-mediapackage-vod
+, types-aiobotocore-mediapackagev2
+, types-aiobotocore-mediastore
+, types-aiobotocore-mediastore-data
+, types-aiobotocore-mediatailor
+, types-aiobotocore-medical-imaging
+, types-aiobotocore-memorydb
+, types-aiobotocore-meteringmarketplace
+, types-aiobotocore-mgh
+, types-aiobotocore-mgn
+, types-aiobotocore-migration-hub-refactor-spaces
+, types-aiobotocore-migrationhub-config
+, types-aiobotocore-migrationhuborchestrator
+, types-aiobotocore-migrationhubstrategy
+, types-aiobotocore-mobile
+, types-aiobotocore-mq
+, types-aiobotocore-mturk
+, types-aiobotocore-mwaa
+, types-aiobotocore-neptune
+, types-aiobotocore-network-firewall
+, types-aiobotocore-networkmanager
+, types-aiobotocore-nimble
+, types-aiobotocore-oam
+, types-aiobotocore-omics
+, types-aiobotocore-opensearch
+, types-aiobotocore-opensearchserverless
+, types-aiobotocore-opsworks
+, types-aiobotocore-opsworkscm
+, types-aiobotocore-organizations
+, types-aiobotocore-osis
+, types-aiobotocore-outposts
+, types-aiobotocore-panorama
+, types-aiobotocore-payment-cryptography
+, types-aiobotocore-payment-cryptography-data
+, types-aiobotocore-personalize
+, types-aiobotocore-personalize-events
+, types-aiobotocore-personalize-runtime
+, types-aiobotocore-pi
+, types-aiobotocore-pinpoint
+, types-aiobotocore-pinpoint-email
+, types-aiobotocore-pinpoint-sms-voice
+, types-aiobotocore-pinpoint-sms-voice-v2
+, types-aiobotocore-pipes
+, types-aiobotocore-polly
+, types-aiobotocore-pricing
+, types-aiobotocore-privatenetworks
+, types-aiobotocore-proton
+, types-aiobotocore-qldb
+, types-aiobotocore-qldb-session
+, types-aiobotocore-quicksight
+, types-aiobotocore-ram
+, types-aiobotocore-rbin
+, types-aiobotocore-rds
+, types-aiobotocore-rds-data
+, types-aiobotocore-redshift
+, types-aiobotocore-redshift-data
+, types-aiobotocore-redshift-serverless
+, types-aiobotocore-rekognition
+, types-aiobotocore-resiliencehub
+, types-aiobotocore-resource-explorer-2
+, types-aiobotocore-resource-groups
+, types-aiobotocore-resourcegroupstaggingapi
+, types-aiobotocore-robomaker
+, types-aiobotocore-rolesanywhere
+, types-aiobotocore-route53
+, types-aiobotocore-route53-recovery-cluster
+, types-aiobotocore-route53-recovery-control-config
+, types-aiobotocore-route53-recovery-readiness
+, types-aiobotocore-route53domains
+, types-aiobotocore-route53resolver
+, types-aiobotocore-rum
+, types-aiobotocore-s3
+, types-aiobotocore-s3control
+, types-aiobotocore-s3outposts
+, types-aiobotocore-sagemaker
+, types-aiobotocore-sagemaker-a2i-runtime
+, types-aiobotocore-sagemaker-edge
+, types-aiobotocore-sagemaker-featurestore-runtime
+, types-aiobotocore-sagemaker-geospatial
+, types-aiobotocore-sagemaker-metrics
+, types-aiobotocore-sagemaker-runtime
+, types-aiobotocore-savingsplans
+, types-aiobotocore-scheduler
+, types-aiobotocore-schemas
+, types-aiobotocore-sdb
+, types-aiobotocore-secretsmanager
+, types-aiobotocore-securityhub
+, types-aiobotocore-securitylake
+, types-aiobotocore-serverlessrepo
+, types-aiobotocore-service-quotas
+, types-aiobotocore-servicecatalog
+, types-aiobotocore-servicecatalog-appregistry
+, types-aiobotocore-servicediscovery
+, types-aiobotocore-ses
+, types-aiobotocore-sesv2
+, types-aiobotocore-shield
+, types-aiobotocore-signer
+, types-aiobotocore-simspaceweaver
+, types-aiobotocore-sms
+, types-aiobotocore-sms-voice
+, types-aiobotocore-snow-device-management
+, types-aiobotocore-snowball
+, types-aiobotocore-sns
+, types-aiobotocore-sqs
+, types-aiobotocore-ssm
+, types-aiobotocore-ssm-contacts
+, types-aiobotocore-ssm-incidents
+, types-aiobotocore-ssm-sap
+, types-aiobotocore-sso
+, types-aiobotocore-sso-admin
+, types-aiobotocore-sso-oidc
+, types-aiobotocore-stepfunctions
+, types-aiobotocore-storagegateway
+, types-aiobotocore-sts
+, types-aiobotocore-support
+, types-aiobotocore-support-app
+, types-aiobotocore-swf
+, types-aiobotocore-synthetics
+, types-aiobotocore-textract
+, types-aiobotocore-timestream-query
+, types-aiobotocore-timestream-write
+, types-aiobotocore-tnb
+, types-aiobotocore-transcribe
+, types-aiobotocore-transfer
+, types-aiobotocore-translate
+, types-aiobotocore-verifiedpermissions
+, types-aiobotocore-voice-id
+, types-aiobotocore-vpc-lattice
+, types-aiobotocore-waf
+, types-aiobotocore-waf-regional
+, types-aiobotocore-wafv2
+, types-aiobotocore-wellarchitected
+, types-aiobotocore-wisdom
+, types-aiobotocore-workdocs
+, types-aiobotocore-worklink
+, types-aiobotocore-workmail
+, types-aiobotocore-workmailmessageflow
+, types-aiobotocore-workspaces
+, types-aiobotocore-workspaces-web
+, types-aiobotocore-xray
+}:
+
+buildPythonPackage rec {
+  pname = "types-aiobotocore";
+  version = "2.7.0";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JVtG3t6rkZ5nrttMlryqdcU35DSblNe3MfvlqLqHJp0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    botocore-stubs
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = {
+    accessanalyzer = [
+      types-aiobotocore-accessanalyzer
+    ];
+    account = [
+      types-aiobotocore-account
+    ];
+    acm = [
+      types-aiobotocore-acm
+    ];
+    acm-pca = [
+      types-aiobotocore-acm-pca
+    ];
+    aiobotocore = [
+      aiobotocore
+      botocore
+    ];
+    alexaforbusiness = [
+      types-aiobotocore-alexaforbusiness
+    ];
+    all = [
+      types-aiobotocore-accessanalyzer
+      types-aiobotocore-account
+      types-aiobotocore-acm
+      types-aiobotocore-acm-pca
+      types-aiobotocore-alexaforbusiness
+      types-aiobotocore-amp
+      types-aiobotocore-amplify
+      types-aiobotocore-amplifybackend
+      types-aiobotocore-amplifyuibuilder
+      types-aiobotocore-apigateway
+      types-aiobotocore-apigatewaymanagementapi
+      types-aiobotocore-apigatewayv2
+      types-aiobotocore-appconfig
+      types-aiobotocore-appconfigdata
+      types-aiobotocore-appfabric
+      types-aiobotocore-appflow
+      types-aiobotocore-appintegrations
+      types-aiobotocore-application-autoscaling
+      types-aiobotocore-application-insights
+      types-aiobotocore-applicationcostprofiler
+      types-aiobotocore-appmesh
+      types-aiobotocore-apprunner
+      types-aiobotocore-appstream
+      types-aiobotocore-appsync
+      types-aiobotocore-arc-zonal-shift
+      types-aiobotocore-athena
+      types-aiobotocore-auditmanager
+      types-aiobotocore-autoscaling
+      types-aiobotocore-autoscaling-plans
+      types-aiobotocore-backup
+      types-aiobotocore-backup-gateway
+      types-aiobotocore-backupstorage
+      types-aiobotocore-batch
+      types-aiobotocore-billingconductor
+      types-aiobotocore-braket
+      types-aiobotocore-budgets
+      types-aiobotocore-ce
+      types-aiobotocore-chime
+      types-aiobotocore-chime-sdk-identity
+      types-aiobotocore-chime-sdk-media-pipelines
+      types-aiobotocore-chime-sdk-meetings
+      types-aiobotocore-chime-sdk-messaging
+      types-aiobotocore-chime-sdk-voice
+      types-aiobotocore-cleanrooms
+      types-aiobotocore-cloud9
+      types-aiobotocore-cloudcontrol
+      types-aiobotocore-clouddirectory
+      types-aiobotocore-cloudformation
+      types-aiobotocore-cloudfront
+      types-aiobotocore-cloudhsm
+      types-aiobotocore-cloudhsmv2
+      types-aiobotocore-cloudsearch
+      types-aiobotocore-cloudsearchdomain
+      types-aiobotocore-cloudtrail
+      types-aiobotocore-cloudtrail-data
+      types-aiobotocore-cloudwatch
+      types-aiobotocore-codeartifact
+      types-aiobotocore-codebuild
+      types-aiobotocore-codecatalyst
+      types-aiobotocore-codecommit
+      types-aiobotocore-codedeploy
+      types-aiobotocore-codeguru-reviewer
+      types-aiobotocore-codeguru-security
+      types-aiobotocore-codeguruprofiler
+      types-aiobotocore-codepipeline
+      types-aiobotocore-codestar
+      types-aiobotocore-codestar-connections
+      types-aiobotocore-codestar-notifications
+      types-aiobotocore-cognito-identity
+      types-aiobotocore-cognito-idp
+      types-aiobotocore-cognito-sync
+      types-aiobotocore-comprehend
+      types-aiobotocore-comprehendmedical
+      types-aiobotocore-compute-optimizer
+      types-aiobotocore-config
+      types-aiobotocore-connect
+      types-aiobotocore-connect-contact-lens
+      types-aiobotocore-connectcampaigns
+      types-aiobotocore-connectcases
+      types-aiobotocore-connectparticipant
+      types-aiobotocore-controltower
+      types-aiobotocore-cur
+      types-aiobotocore-customer-profiles
+      types-aiobotocore-databrew
+      types-aiobotocore-dataexchange
+      types-aiobotocore-datapipeline
+      types-aiobotocore-datasync
+      types-aiobotocore-dax
+      types-aiobotocore-detective
+      types-aiobotocore-devicefarm
+      types-aiobotocore-devops-guru
+      types-aiobotocore-directconnect
+      types-aiobotocore-discovery
+      types-aiobotocore-dlm
+      types-aiobotocore-dms
+      types-aiobotocore-docdb
+      types-aiobotocore-docdb-elastic
+      types-aiobotocore-drs
+      types-aiobotocore-ds
+      types-aiobotocore-dynamodb
+      types-aiobotocore-dynamodbstreams
+      types-aiobotocore-ebs
+      types-aiobotocore-ec2
+      types-aiobotocore-ec2-instance-connect
+      types-aiobotocore-ecr
+      types-aiobotocore-ecr-public
+      types-aiobotocore-ecs
+      types-aiobotocore-efs
+      types-aiobotocore-eks
+      types-aiobotocore-elastic-inference
+      types-aiobotocore-elasticache
+      types-aiobotocore-elasticbeanstalk
+      types-aiobotocore-elastictranscoder
+      types-aiobotocore-elb
+      types-aiobotocore-elbv2
+      types-aiobotocore-emr
+      types-aiobotocore-emr-containers
+      types-aiobotocore-emr-serverless
+      types-aiobotocore-entityresolution
+      types-aiobotocore-es
+      types-aiobotocore-events
+      types-aiobotocore-evidently
+      types-aiobotocore-finspace
+      types-aiobotocore-finspace-data
+      types-aiobotocore-firehose
+      types-aiobotocore-fis
+      types-aiobotocore-fms
+      types-aiobotocore-forecast
+      types-aiobotocore-forecastquery
+      types-aiobotocore-frauddetector
+      types-aiobotocore-fsx
+      types-aiobotocore-gamelift
+      types-aiobotocore-gamesparks
+      types-aiobotocore-glacier
+      types-aiobotocore-globalaccelerator
+      types-aiobotocore-glue
+      types-aiobotocore-grafana
+      types-aiobotocore-greengrass
+      types-aiobotocore-greengrassv2
+      types-aiobotocore-groundstation
+      types-aiobotocore-guardduty
+      types-aiobotocore-health
+      types-aiobotocore-healthlake
+      types-aiobotocore-honeycode
+      types-aiobotocore-iam
+      types-aiobotocore-identitystore
+      types-aiobotocore-imagebuilder
+      types-aiobotocore-importexport
+      types-aiobotocore-inspector
+      types-aiobotocore-inspector2
+      types-aiobotocore-internetmonitor
+      types-aiobotocore-iot
+      types-aiobotocore-iot-data
+      types-aiobotocore-iot-jobs-data
+      types-aiobotocore-iot-roborunner
+      types-aiobotocore-iot1click-devices
+      types-aiobotocore-iot1click-projects
+      types-aiobotocore-iotanalytics
+      types-aiobotocore-iotdeviceadvisor
+      types-aiobotocore-iotevents
+      types-aiobotocore-iotevents-data
+      types-aiobotocore-iotfleethub
+      types-aiobotocore-iotfleetwise
+      types-aiobotocore-iotsecuretunneling
+      types-aiobotocore-iotsitewise
+      types-aiobotocore-iotthingsgraph
+      types-aiobotocore-iottwinmaker
+      types-aiobotocore-iotwireless
+      types-aiobotocore-ivs
+      types-aiobotocore-ivs-realtime
+      types-aiobotocore-ivschat
+      types-aiobotocore-kafka
+      types-aiobotocore-kafkaconnect
+      types-aiobotocore-kendra
+      types-aiobotocore-kendra-ranking
+      types-aiobotocore-keyspaces
+      types-aiobotocore-kinesis
+      types-aiobotocore-kinesis-video-archived-media
+      types-aiobotocore-kinesis-video-media
+      types-aiobotocore-kinesis-video-signaling
+      types-aiobotocore-kinesis-video-webrtc-storage
+      types-aiobotocore-kinesisanalytics
+      types-aiobotocore-kinesisanalyticsv2
+      types-aiobotocore-kinesisvideo
+      types-aiobotocore-kms
+      types-aiobotocore-lakeformation
+      types-aiobotocore-lambda
+      types-aiobotocore-lex-models
+      types-aiobotocore-lex-runtime
+      types-aiobotocore-lexv2-models
+      types-aiobotocore-lexv2-runtime
+      types-aiobotocore-license-manager
+      types-aiobotocore-license-manager-linux-subscriptions
+      types-aiobotocore-license-manager-user-subscriptions
+      types-aiobotocore-lightsail
+      types-aiobotocore-location
+      types-aiobotocore-logs
+      types-aiobotocore-lookoutequipment
+      types-aiobotocore-lookoutmetrics
+      types-aiobotocore-lookoutvision
+      types-aiobotocore-m2
+      types-aiobotocore-machinelearning
+      types-aiobotocore-macie
+      types-aiobotocore-macie2
+      types-aiobotocore-managedblockchain
+      types-aiobotocore-managedblockchain-query
+      types-aiobotocore-marketplace-catalog
+      types-aiobotocore-marketplace-entitlement
+      types-aiobotocore-marketplacecommerceanalytics
+      types-aiobotocore-mediaconnect
+      types-aiobotocore-mediaconvert
+      types-aiobotocore-medialive
+      types-aiobotocore-mediapackage
+      types-aiobotocore-mediapackage-vod
+      types-aiobotocore-mediapackagev2
+      types-aiobotocore-mediastore
+      types-aiobotocore-mediastore-data
+      types-aiobotocore-mediatailor
+      types-aiobotocore-medical-imaging
+      types-aiobotocore-memorydb
+      types-aiobotocore-meteringmarketplace
+      types-aiobotocore-mgh
+      types-aiobotocore-mgn
+      types-aiobotocore-migration-hub-refactor-spaces
+      types-aiobotocore-migrationhub-config
+      types-aiobotocore-migrationhuborchestrator
+      types-aiobotocore-migrationhubstrategy
+      types-aiobotocore-mobile
+      types-aiobotocore-mq
+      types-aiobotocore-mturk
+      types-aiobotocore-mwaa
+      types-aiobotocore-neptune
+      types-aiobotocore-network-firewall
+      types-aiobotocore-networkmanager
+      types-aiobotocore-nimble
+      types-aiobotocore-oam
+      types-aiobotocore-omics
+      types-aiobotocore-opensearch
+      types-aiobotocore-opensearchserverless
+      types-aiobotocore-opsworks
+      types-aiobotocore-opsworkscm
+      types-aiobotocore-organizations
+      types-aiobotocore-osis
+      types-aiobotocore-outposts
+      types-aiobotocore-panorama
+      types-aiobotocore-payment-cryptography
+      types-aiobotocore-payment-cryptography-data
+      types-aiobotocore-personalize
+      types-aiobotocore-personalize-events
+      types-aiobotocore-personalize-runtime
+      types-aiobotocore-pi
+      types-aiobotocore-pinpoint
+      types-aiobotocore-pinpoint-email
+      types-aiobotocore-pinpoint-sms-voice
+      types-aiobotocore-pinpoint-sms-voice-v2
+      types-aiobotocore-pipes
+      types-aiobotocore-polly
+      types-aiobotocore-pricing
+      types-aiobotocore-privatenetworks
+      types-aiobotocore-proton
+      types-aiobotocore-qldb
+      types-aiobotocore-qldb-session
+      types-aiobotocore-quicksight
+      types-aiobotocore-ram
+      types-aiobotocore-rbin
+      types-aiobotocore-rds
+      types-aiobotocore-rds-data
+      types-aiobotocore-redshift
+      types-aiobotocore-redshift-data
+      types-aiobotocore-redshift-serverless
+      types-aiobotocore-rekognition
+      types-aiobotocore-resiliencehub
+      types-aiobotocore-resource-explorer-2
+      types-aiobotocore-resource-groups
+      types-aiobotocore-resourcegroupstaggingapi
+      types-aiobotocore-robomaker
+      types-aiobotocore-rolesanywhere
+      types-aiobotocore-route53
+      types-aiobotocore-route53-recovery-cluster
+      types-aiobotocore-route53-recovery-control-config
+      types-aiobotocore-route53-recovery-readiness
+      types-aiobotocore-route53domains
+      types-aiobotocore-route53resolver
+      types-aiobotocore-rum
+      types-aiobotocore-s3
+      types-aiobotocore-s3control
+      types-aiobotocore-s3outposts
+      types-aiobotocore-sagemaker
+      types-aiobotocore-sagemaker-a2i-runtime
+      types-aiobotocore-sagemaker-edge
+      types-aiobotocore-sagemaker-featurestore-runtime
+      types-aiobotocore-sagemaker-geospatial
+      types-aiobotocore-sagemaker-metrics
+      types-aiobotocore-sagemaker-runtime
+      types-aiobotocore-savingsplans
+      types-aiobotocore-scheduler
+      types-aiobotocore-schemas
+      types-aiobotocore-sdb
+      types-aiobotocore-secretsmanager
+      types-aiobotocore-securityhub
+      types-aiobotocore-securitylake
+      types-aiobotocore-serverlessrepo
+      types-aiobotocore-service-quotas
+      types-aiobotocore-servicecatalog
+      types-aiobotocore-servicecatalog-appregistry
+      types-aiobotocore-servicediscovery
+      types-aiobotocore-ses
+      types-aiobotocore-sesv2
+      types-aiobotocore-shield
+      types-aiobotocore-signer
+      types-aiobotocore-simspaceweaver
+      types-aiobotocore-sms
+      types-aiobotocore-sms-voice
+      types-aiobotocore-snow-device-management
+      types-aiobotocore-snowball
+      types-aiobotocore-sns
+      types-aiobotocore-sqs
+      types-aiobotocore-ssm
+      types-aiobotocore-ssm-contacts
+      types-aiobotocore-ssm-incidents
+      types-aiobotocore-ssm-sap
+      types-aiobotocore-sso
+      types-aiobotocore-sso-admin
+      types-aiobotocore-sso-oidc
+      types-aiobotocore-stepfunctions
+      types-aiobotocore-storagegateway
+      types-aiobotocore-sts
+      types-aiobotocore-support
+      types-aiobotocore-support-app
+      types-aiobotocore-swf
+      types-aiobotocore-synthetics
+      types-aiobotocore-textract
+      types-aiobotocore-timestream-query
+      types-aiobotocore-timestream-write
+      types-aiobotocore-tnb
+      types-aiobotocore-transcribe
+      types-aiobotocore-transfer
+      types-aiobotocore-translate
+      types-aiobotocore-verifiedpermissions
+      types-aiobotocore-voice-id
+      types-aiobotocore-vpc-lattice
+      types-aiobotocore-waf
+      types-aiobotocore-waf-regional
+      types-aiobotocore-wafv2
+      types-aiobotocore-wellarchitected
+      types-aiobotocore-wisdom
+      types-aiobotocore-workdocs
+      types-aiobotocore-worklink
+      types-aiobotocore-workmail
+      types-aiobotocore-workmailmessageflow
+      types-aiobotocore-workspaces
+      types-aiobotocore-workspaces-web
+      types-aiobotocore-xray
+    ];
+    amp = [
+      types-aiobotocore-amp
+    ];
+    amplify = [
+      types-aiobotocore-amplify
+    ];
+    amplifybackend = [
+      types-aiobotocore-amplifybackend
+    ];
+    amplifyuibuilder = [
+      types-aiobotocore-amplifyuibuilder
+    ];
+    apigateway = [
+      types-aiobotocore-apigateway
+    ];
+    apigatewaymanagementapi = [
+      types-aiobotocore-apigatewaymanagementapi
+    ];
+    apigatewayv2 = [
+      types-aiobotocore-apigatewayv2
+    ];
+    appconfig = [
+      types-aiobotocore-appconfig
+    ];
+    appconfigdata = [
+      types-aiobotocore-appconfigdata
+    ];
+    appfabric = [
+      types-aiobotocore-appfabric
+    ];
+    appflow = [
+      types-aiobotocore-appflow
+    ];
+    appintegrations = [
+      types-aiobotocore-appintegrations
+    ];
+    application-autoscaling = [
+      types-aiobotocore-application-autoscaling
+    ];
+    application-insights = [
+      types-aiobotocore-application-insights
+    ];
+    applicationcostprofiler = [
+      types-aiobotocore-applicationcostprofiler
+    ];
+    appmesh = [
+      types-aiobotocore-appmesh
+    ];
+    apprunner = [
+      types-aiobotocore-apprunner
+    ];
+    appstream = [
+      types-aiobotocore-appstream
+    ];
+    appsync = [
+      types-aiobotocore-appsync
+    ];
+    arc-zonal-shift = [
+      types-aiobotocore-arc-zonal-shift
+    ];
+    athena = [
+      types-aiobotocore-athena
+    ];
+    auditmanager = [
+      types-aiobotocore-auditmanager
+    ];
+    autoscaling = [
+      types-aiobotocore-autoscaling
+    ];
+    autoscaling-plans = [
+      types-aiobotocore-autoscaling-plans
+    ];
+    backup = [
+      types-aiobotocore-backup
+    ];
+    backup-gateway = [
+      types-aiobotocore-backup-gateway
+    ];
+    backupstorage = [
+      types-aiobotocore-backupstorage
+    ];
+    batch = [
+      types-aiobotocore-batch
+    ];
+    billingconductor = [
+      types-aiobotocore-billingconductor
+    ];
+    braket = [
+      types-aiobotocore-braket
+    ];
+    budgets = [
+      types-aiobotocore-budgets
+    ];
+    ce = [
+      types-aiobotocore-ce
+    ];
+    chime = [
+      types-aiobotocore-chime
+    ];
+    chime-sdk-identity = [
+      types-aiobotocore-chime-sdk-identity
+    ];
+    chime-sdk-media-pipelines = [
+      types-aiobotocore-chime-sdk-media-pipelines
+    ];
+    chime-sdk-meetings = [
+      types-aiobotocore-chime-sdk-meetings
+    ];
+    chime-sdk-messaging = [
+      types-aiobotocore-chime-sdk-messaging
+    ];
+    chime-sdk-voice = [
+      types-aiobotocore-chime-sdk-voice
+    ];
+    cleanrooms = [
+      types-aiobotocore-cleanrooms
+    ];
+    cloud9 = [
+      types-aiobotocore-cloud9
+    ];
+    cloudcontrol = [
+      types-aiobotocore-cloudcontrol
+    ];
+    clouddirectory = [
+      types-aiobotocore-clouddirectory
+    ];
+    cloudformation = [
+      types-aiobotocore-cloudformation
+    ];
+    cloudfront = [
+      types-aiobotocore-cloudfront
+    ];
+    cloudhsm = [
+      types-aiobotocore-cloudhsm
+    ];
+    cloudhsmv2 = [
+      types-aiobotocore-cloudhsmv2
+    ];
+    cloudsearch = [
+      types-aiobotocore-cloudsearch
+    ];
+    cloudsearchdomain = [
+      types-aiobotocore-cloudsearchdomain
+    ];
+    cloudtrail = [
+      types-aiobotocore-cloudtrail
+    ];
+    cloudtrail-data = [
+      types-aiobotocore-cloudtrail-data
+    ];
+    cloudwatch = [
+      types-aiobotocore-cloudwatch
+    ];
+    codeartifact = [
+      types-aiobotocore-codeartifact
+    ];
+    codebuild = [
+      types-aiobotocore-codebuild
+    ];
+    codecatalyst = [
+      types-aiobotocore-codecatalyst
+    ];
+    codecommit = [
+      types-aiobotocore-codecommit
+    ];
+    codedeploy = [
+      types-aiobotocore-codedeploy
+    ];
+    codeguru-reviewer = [
+      types-aiobotocore-codeguru-reviewer
+    ];
+    codeguru-security = [
+      types-aiobotocore-codeguru-security
+    ];
+    codeguruprofiler = [
+      types-aiobotocore-codeguruprofiler
+    ];
+    codepipeline = [
+      types-aiobotocore-codepipeline
+    ];
+    codestar = [
+      types-aiobotocore-codestar
+    ];
+    codestar-connections = [
+      types-aiobotocore-codestar-connections
+    ];
+    codestar-notifications = [
+      types-aiobotocore-codestar-notifications
+    ];
+    cognito-identity = [
+      types-aiobotocore-cognito-identity
+    ];
+    cognito-idp = [
+      types-aiobotocore-cognito-idp
+    ];
+    cognito-sync = [
+      types-aiobotocore-cognito-sync
+    ];
+    comprehend = [
+      types-aiobotocore-comprehend
+    ];
+    comprehendmedical = [
+      types-aiobotocore-comprehendmedical
+    ];
+    compute-optimizer = [
+      types-aiobotocore-compute-optimizer
+    ];
+    config = [
+      types-aiobotocore-config
+    ];
+    connect = [
+      types-aiobotocore-connect
+    ];
+    connect-contact-lens = [
+      types-aiobotocore-connect-contact-lens
+    ];
+    connectcampaigns = [
+      types-aiobotocore-connectcampaigns
+    ];
+    connectcases = [
+      types-aiobotocore-connectcases
+    ];
+    connectparticipant = [
+      types-aiobotocore-connectparticipant
+    ];
+    controltower = [
+      types-aiobotocore-controltower
+    ];
+    cur = [
+      types-aiobotocore-cur
+    ];
+    customer-profiles = [
+      types-aiobotocore-customer-profiles
+    ];
+    databrew = [
+      types-aiobotocore-databrew
+    ];
+    dataexchange = [
+      types-aiobotocore-dataexchange
+    ];
+    datapipeline = [
+      types-aiobotocore-datapipeline
+    ];
+    datasync = [
+      types-aiobotocore-datasync
+    ];
+    dax = [
+      types-aiobotocore-dax
+    ];
+    detective = [
+      types-aiobotocore-detective
+    ];
+    devicefarm = [
+      types-aiobotocore-devicefarm
+    ];
+    devops-guru = [
+      types-aiobotocore-devops-guru
+    ];
+    directconnect = [
+      types-aiobotocore-directconnect
+    ];
+    discovery = [
+      types-aiobotocore-discovery
+    ];
+    dlm = [
+      types-aiobotocore-dlm
+    ];
+    dms = [
+      types-aiobotocore-dms
+    ];
+    docdb = [
+      types-aiobotocore-docdb
+    ];
+    docdb-elastic = [
+      types-aiobotocore-docdb-elastic
+    ];
+    drs = [
+      types-aiobotocore-drs
+    ];
+    ds = [
+      types-aiobotocore-ds
+    ];
+    dynamodb = [
+      types-aiobotocore-dynamodb
+    ];
+    dynamodbstreams = [
+      types-aiobotocore-dynamodbstreams
+    ];
+    ebs = [
+      types-aiobotocore-ebs
+    ];
+    ec2 = [
+      types-aiobotocore-ec2
+    ];
+    ec2-instance-connect = [
+      types-aiobotocore-ec2-instance-connect
+    ];
+    ecr = [
+      types-aiobotocore-ecr
+    ];
+    ecr-public = [
+      types-aiobotocore-ecr-public
+    ];
+    ecs = [
+      types-aiobotocore-ecs
+    ];
+    efs = [
+      types-aiobotocore-efs
+    ];
+    eks = [
+      types-aiobotocore-eks
+    ];
+    elastic-inference = [
+      types-aiobotocore-elastic-inference
+    ];
+    elasticache = [
+      types-aiobotocore-elasticache
+    ];
+    elasticbeanstalk = [
+      types-aiobotocore-elasticbeanstalk
+    ];
+    elastictranscoder = [
+      types-aiobotocore-elastictranscoder
+    ];
+    elb = [
+      types-aiobotocore-elb
+    ];
+    elbv2 = [
+      types-aiobotocore-elbv2
+    ];
+    emr = [
+      types-aiobotocore-emr
+    ];
+    emr-containers = [
+      types-aiobotocore-emr-containers
+    ];
+    emr-serverless = [
+      types-aiobotocore-emr-serverless
+    ];
+    entityresolution = [
+      types-aiobotocore-entityresolution
+    ];
+    es = [
+      types-aiobotocore-es
+    ];
+    essential = [
+      types-aiobotocore-cloudformation
+      types-aiobotocore-dynamodb
+      types-aiobotocore-ec2
+      types-aiobotocore-lambda
+      types-aiobotocore-rds
+      types-aiobotocore-s3
+      types-aiobotocore-sqs
+    ];
+    events = [
+      types-aiobotocore-events
+    ];
+    evidently = [
+      types-aiobotocore-evidently
+    ];
+    finspace = [
+      types-aiobotocore-finspace
+    ];
+    finspace-data = [
+      types-aiobotocore-finspace-data
+    ];
+    firehose = [
+      types-aiobotocore-firehose
+    ];
+    fis = [
+      types-aiobotocore-fis
+    ];
+    fms = [
+      types-aiobotocore-fms
+    ];
+    forecast = [
+      types-aiobotocore-forecast
+    ];
+    forecastquery = [
+      types-aiobotocore-forecastquery
+    ];
+    frauddetector = [
+      types-aiobotocore-frauddetector
+    ];
+    fsx = [
+      types-aiobotocore-fsx
+    ];
+    gamelift = [
+      types-aiobotocore-gamelift
+    ];
+    gamesparks = [
+      types-aiobotocore-gamesparks
+    ];
+    glacier = [
+      types-aiobotocore-glacier
+    ];
+    globalaccelerator = [
+      types-aiobotocore-globalaccelerator
+    ];
+    glue = [
+      types-aiobotocore-glue
+    ];
+    grafana = [
+      types-aiobotocore-grafana
+    ];
+    greengrass = [
+      types-aiobotocore-greengrass
+    ];
+    greengrassv2 = [
+      types-aiobotocore-greengrassv2
+    ];
+    groundstation = [
+      types-aiobotocore-groundstation
+    ];
+    guardduty = [
+      types-aiobotocore-guardduty
+    ];
+    health = [
+      types-aiobotocore-health
+    ];
+    healthlake = [
+      types-aiobotocore-healthlake
+    ];
+    honeycode = [
+      types-aiobotocore-honeycode
+    ];
+    iam = [
+      types-aiobotocore-iam
+    ];
+    identitystore = [
+      types-aiobotocore-identitystore
+    ];
+    imagebuilder = [
+      types-aiobotocore-imagebuilder
+    ];
+    importexport = [
+      types-aiobotocore-importexport
+    ];
+    inspector = [
+      types-aiobotocore-inspector
+    ];
+    inspector2 = [
+      types-aiobotocore-inspector2
+    ];
+    internetmonitor = [
+      types-aiobotocore-internetmonitor
+    ];
+    iot = [
+      types-aiobotocore-iot
+    ];
+    iot-data = [
+      types-aiobotocore-iot-data
+    ];
+    iot-jobs-data = [
+      types-aiobotocore-iot-jobs-data
+    ];
+    iot-roborunner = [
+      types-aiobotocore-iot-roborunner
+    ];
+    iot1click-devices = [
+      types-aiobotocore-iot1click-devices
+    ];
+    iot1click-projects = [
+      types-aiobotocore-iot1click-projects
+    ];
+    iotanalytics = [
+      types-aiobotocore-iotanalytics
+    ];
+    iotdeviceadvisor = [
+      types-aiobotocore-iotdeviceadvisor
+    ];
+    iotevents = [
+      types-aiobotocore-iotevents
+    ];
+    iotevents-data = [
+      types-aiobotocore-iotevents-data
+    ];
+    iotfleethub = [
+      types-aiobotocore-iotfleethub
+    ];
+    iotfleetwise = [
+      types-aiobotocore-iotfleetwise
+    ];
+    iotsecuretunneling = [
+      types-aiobotocore-iotsecuretunneling
+    ];
+    iotsitewise = [
+      types-aiobotocore-iotsitewise
+    ];
+    iotthingsgraph = [
+      types-aiobotocore-iotthingsgraph
+    ];
+    iottwinmaker = [
+      types-aiobotocore-iottwinmaker
+    ];
+    iotwireless = [
+      types-aiobotocore-iotwireless
+    ];
+    ivs = [
+      types-aiobotocore-ivs
+    ];
+    ivs-realtime = [
+      types-aiobotocore-ivs-realtime
+    ];
+    ivschat = [
+      types-aiobotocore-ivschat
+    ];
+    kafka = [
+      types-aiobotocore-kafka
+    ];
+    kafkaconnect = [
+      types-aiobotocore-kafkaconnect
+    ];
+    kendra = [
+      types-aiobotocore-kendra
+    ];
+    kendra-ranking = [
+      types-aiobotocore-kendra-ranking
+    ];
+    keyspaces = [
+      types-aiobotocore-keyspaces
+    ];
+    kinesis = [
+      types-aiobotocore-kinesis
+    ];
+    kinesis-video-archived-media = [
+      types-aiobotocore-kinesis-video-archived-media
+    ];
+    kinesis-video-media = [
+      types-aiobotocore-kinesis-video-media
+    ];
+    kinesis-video-signaling = [
+      types-aiobotocore-kinesis-video-signaling
+    ];
+    kinesis-video-webrtc-storage = [
+      types-aiobotocore-kinesis-video-webrtc-storage
+    ];
+    kinesisanalytics = [
+      types-aiobotocore-kinesisanalytics
+    ];
+    kinesisanalyticsv2 = [
+      types-aiobotocore-kinesisanalyticsv2
+    ];
+    kinesisvideo = [
+      types-aiobotocore-kinesisvideo
+    ];
+    kms = [
+      types-aiobotocore-kms
+    ];
+    lakeformation = [
+      types-aiobotocore-lakeformation
+    ];
+    lambda = [
+      types-aiobotocore-lambda
+    ];
+    lex-models = [
+      types-aiobotocore-lex-models
+    ];
+    lex-runtime = [
+      types-aiobotocore-lex-runtime
+    ];
+    lexv2-models = [
+      types-aiobotocore-lexv2-models
+    ];
+    lexv2-runtime = [
+      types-aiobotocore-lexv2-runtime
+    ];
+    license-manager = [
+      types-aiobotocore-license-manager
+    ];
+    license-manager-linux-subscriptions = [
+      types-aiobotocore-license-manager-linux-subscriptions
+    ];
+    license-manager-user-subscriptions = [
+      types-aiobotocore-license-manager-user-subscriptions
+    ];
+    lightsail = [
+      types-aiobotocore-lightsail
+    ];
+    location = [
+      types-aiobotocore-location
+    ];
+    logs = [
+      types-aiobotocore-logs
+    ];
+    lookoutequipment = [
+      types-aiobotocore-lookoutequipment
+    ];
+    lookoutmetrics = [
+      types-aiobotocore-lookoutmetrics
+    ];
+    lookoutvision = [
+      types-aiobotocore-lookoutvision
+    ];
+    m2 = [
+      types-aiobotocore-m2
+    ];
+    machinelearning = [
+      types-aiobotocore-machinelearning
+    ];
+    macie = [
+      types-aiobotocore-macie
+    ];
+    macie2 = [
+      types-aiobotocore-macie2
+    ];
+    managedblockchain = [
+      types-aiobotocore-managedblockchain
+    ];
+    managedblockchain-query = [
+      types-aiobotocore-managedblockchain-query
+    ];
+    marketplace-catalog = [
+      types-aiobotocore-marketplace-catalog
+    ];
+    marketplace-entitlement = [
+      types-aiobotocore-marketplace-entitlement
+    ];
+    marketplacecommerceanalytics = [
+      types-aiobotocore-marketplacecommerceanalytics
+    ];
+    mediaconnect = [
+      types-aiobotocore-mediaconnect
+    ];
+    mediaconvert = [
+      types-aiobotocore-mediaconvert
+    ];
+    medialive = [
+      types-aiobotocore-medialive
+    ];
+    mediapackage = [
+      types-aiobotocore-mediapackage
+    ];
+    mediapackage-vod = [
+      types-aiobotocore-mediapackage-vod
+    ];
+    mediapackagev2 = [
+      types-aiobotocore-mediapackagev2
+    ];
+    mediastore = [
+      types-aiobotocore-mediastore
+    ];
+    mediastore-data = [
+      types-aiobotocore-mediastore-data
+    ];
+    mediatailor = [
+      types-aiobotocore-mediatailor
+    ];
+    medical-imaging = [
+      types-aiobotocore-medical-imaging
+    ];
+    memorydb = [
+      types-aiobotocore-memorydb
+    ];
+    meteringmarketplace = [
+      types-aiobotocore-meteringmarketplace
+    ];
+    mgh = [
+      types-aiobotocore-mgh
+    ];
+    mgn = [
+      types-aiobotocore-mgn
+    ];
+    migration-hub-refactor-spaces = [
+      types-aiobotocore-migration-hub-refactor-spaces
+    ];
+    migrationhub-config = [
+      types-aiobotocore-migrationhub-config
+    ];
+    migrationhuborchestrator = [
+      types-aiobotocore-migrationhuborchestrator
+    ];
+    migrationhubstrategy = [
+      types-aiobotocore-migrationhubstrategy
+    ];
+    mobile = [
+      types-aiobotocore-mobile
+    ];
+    mq = [
+      types-aiobotocore-mq
+    ];
+    mturk = [
+      types-aiobotocore-mturk
+    ];
+    mwaa = [
+      types-aiobotocore-mwaa
+    ];
+    neptune = [
+      types-aiobotocore-neptune
+    ];
+    network-firewall = [
+      types-aiobotocore-network-firewall
+    ];
+    networkmanager = [
+      types-aiobotocore-networkmanager
+    ];
+    nimble = [
+      types-aiobotocore-nimble
+    ];
+    oam = [
+      types-aiobotocore-oam
+    ];
+    omics = [
+      types-aiobotocore-omics
+    ];
+    opensearch = [
+      types-aiobotocore-opensearch
+    ];
+    opensearchserverless = [
+      types-aiobotocore-opensearchserverless
+    ];
+    opsworks = [
+      types-aiobotocore-opsworks
+    ];
+    opsworkscm = [
+      types-aiobotocore-opsworkscm
+    ];
+    organizations = [
+      types-aiobotocore-organizations
+    ];
+    osis = [
+      types-aiobotocore-osis
+    ];
+    outposts = [
+      types-aiobotocore-outposts
+    ];
+    panorama = [
+      types-aiobotocore-panorama
+    ];
+    payment-cryptography = [
+      types-aiobotocore-payment-cryptography
+    ];
+    payment-cryptography-data = [
+      types-aiobotocore-payment-cryptography-data
+    ];
+    personalize = [
+      types-aiobotocore-personalize
+    ];
+    personalize-events = [
+      types-aiobotocore-personalize-events
+    ];
+    personalize-runtime = [
+      types-aiobotocore-personalize-runtime
+    ];
+    pi = [
+      types-aiobotocore-pi
+    ];
+    pinpoint = [
+      types-aiobotocore-pinpoint
+    ];
+    pinpoint-email = [
+      types-aiobotocore-pinpoint-email
+    ];
+    pinpoint-sms-voice = [
+      types-aiobotocore-pinpoint-sms-voice
+    ];
+    pinpoint-sms-voice-v2 = [
+      types-aiobotocore-pinpoint-sms-voice-v2
+    ];
+    pipes = [
+      types-aiobotocore-pipes
+    ];
+    polly = [
+      types-aiobotocore-polly
+    ];
+    pricing = [
+      types-aiobotocore-pricing
+    ];
+    privatenetworks = [
+      types-aiobotocore-privatenetworks
+    ];
+    proton = [
+      types-aiobotocore-proton
+    ];
+    qldb = [
+      types-aiobotocore-qldb
+    ];
+    qldb-session = [
+      types-aiobotocore-qldb-session
+    ];
+    quicksight = [
+      types-aiobotocore-quicksight
+    ];
+    ram = [
+      types-aiobotocore-ram
+    ];
+    rbin = [
+      types-aiobotocore-rbin
+    ];
+    rds = [
+      types-aiobotocore-rds
+    ];
+    rds-data = [
+      types-aiobotocore-rds-data
+    ];
+    redshift = [
+      types-aiobotocore-redshift
+    ];
+    redshift-data = [
+      types-aiobotocore-redshift-data
+    ];
+    redshift-serverless = [
+      types-aiobotocore-redshift-serverless
+    ];
+    rekognition = [
+      types-aiobotocore-rekognition
+    ];
+    resiliencehub = [
+      types-aiobotocore-resiliencehub
+    ];
+    resource-explorer-2 = [
+      types-aiobotocore-resource-explorer-2
+    ];
+    resource-groups = [
+      types-aiobotocore-resource-groups
+    ];
+    resourcegroupstaggingapi = [
+      types-aiobotocore-resourcegroupstaggingapi
+    ];
+    robomaker = [
+      types-aiobotocore-robomaker
+    ];
+    rolesanywhere = [
+      types-aiobotocore-rolesanywhere
+    ];
+    route53 = [
+      types-aiobotocore-route53
+    ];
+    route53-recovery-cluster = [
+      types-aiobotocore-route53-recovery-cluster
+    ];
+    route53-recovery-control-config = [
+      types-aiobotocore-route53-recovery-control-config
+    ];
+    route53-recovery-readiness = [
+      types-aiobotocore-route53-recovery-readiness
+    ];
+    route53domains = [
+      types-aiobotocore-route53domains
+    ];
+    route53resolver = [
+      types-aiobotocore-route53resolver
+    ];
+    rum = [
+      types-aiobotocore-rum
+    ];
+    s3 = [
+      types-aiobotocore-s3
+    ];
+    s3control = [
+      types-aiobotocore-s3control
+    ];
+    s3outposts = [
+      types-aiobotocore-s3outposts
+    ];
+    sagemaker = [
+      types-aiobotocore-sagemaker
+    ];
+    sagemaker-a2i-runtime = [
+      types-aiobotocore-sagemaker-a2i-runtime
+    ];
+    sagemaker-edge = [
+      types-aiobotocore-sagemaker-edge
+    ];
+    sagemaker-featurestore-runtime = [
+      types-aiobotocore-sagemaker-featurestore-runtime
+    ];
+    sagemaker-geospatial = [
+      types-aiobotocore-sagemaker-geospatial
+    ];
+    sagemaker-metrics = [
+      types-aiobotocore-sagemaker-metrics
+    ];
+    sagemaker-runtime = [
+      types-aiobotocore-sagemaker-runtime
+    ];
+    savingsplans = [
+      types-aiobotocore-savingsplans
+    ];
+    scheduler = [
+      types-aiobotocore-scheduler
+    ];
+    schemas = [
+      types-aiobotocore-schemas
+    ];
+    sdb = [
+      types-aiobotocore-sdb
+    ];
+    secretsmanager = [
+      types-aiobotocore-secretsmanager
+    ];
+    securityhub = [
+      types-aiobotocore-securityhub
+    ];
+    securitylake = [
+      types-aiobotocore-securitylake
+    ];
+    serverlessrepo = [
+      types-aiobotocore-serverlessrepo
+    ];
+    service-quotas = [
+      types-aiobotocore-service-quotas
+    ];
+    servicecatalog = [
+      types-aiobotocore-servicecatalog
+    ];
+    servicecatalog-appregistry = [
+      types-aiobotocore-servicecatalog-appregistry
+    ];
+    servicediscovery = [
+      types-aiobotocore-servicediscovery
+    ];
+    ses = [
+      types-aiobotocore-ses
+    ];
+    sesv2 = [
+      types-aiobotocore-sesv2
+    ];
+    shield = [
+      types-aiobotocore-shield
+    ];
+    signer = [
+      types-aiobotocore-signer
+    ];
+    simspaceweaver = [
+      types-aiobotocore-simspaceweaver
+    ];
+    sms = [
+      types-aiobotocore-sms
+    ];
+    sms-voice = [
+      types-aiobotocore-sms-voice
+    ];
+    snow-device-management = [
+      types-aiobotocore-snow-device-management
+    ];
+    snowball = [
+      types-aiobotocore-snowball
+    ];
+    sns = [
+      types-aiobotocore-sns
+    ];
+    sqs = [
+      types-aiobotocore-sqs
+    ];
+    ssm = [
+      types-aiobotocore-ssm
+    ];
+    ssm-contacts = [
+      types-aiobotocore-ssm-contacts
+    ];
+    ssm-incidents = [
+      types-aiobotocore-ssm-incidents
+    ];
+    ssm-sap = [
+      types-aiobotocore-ssm-sap
+    ];
+    sso = [
+      types-aiobotocore-sso
+    ];
+    sso-admin = [
+      types-aiobotocore-sso-admin
+    ];
+    sso-oidc = [
+      types-aiobotocore-sso-oidc
+    ];
+    stepfunctions = [
+      types-aiobotocore-stepfunctions
+    ];
+    storagegateway = [
+      types-aiobotocore-storagegateway
+    ];
+    sts = [
+      types-aiobotocore-sts
+    ];
+    support = [
+      types-aiobotocore-support
+    ];
+    support-app = [
+      types-aiobotocore-support-app
+    ];
+    swf = [
+      types-aiobotocore-swf
+    ];
+    synthetics = [
+      types-aiobotocore-synthetics
+    ];
+    textract = [
+      types-aiobotocore-textract
+    ];
+    timestream-query = [
+      types-aiobotocore-timestream-query
+    ];
+    timestream-write = [
+      types-aiobotocore-timestream-write
+    ];
+    tnb = [
+      types-aiobotocore-tnb
+    ];
+    transcribe = [
+      types-aiobotocore-transcribe
+    ];
+    transfer = [
+      types-aiobotocore-transfer
+    ];
+    translate = [
+      types-aiobotocore-translate
+    ];
+    verifiedpermissions = [
+      types-aiobotocore-verifiedpermissions
+    ];
+    voice-id = [
+      types-aiobotocore-voice-id
+    ];
+    vpc-lattice = [
+      types-aiobotocore-vpc-lattice
+    ];
+    waf = [
+      types-aiobotocore-waf
+    ];
+    waf-regional = [
+      types-aiobotocore-waf-regional
+    ];
+    wafv2 = [
+      types-aiobotocore-wafv2
+    ];
+    wellarchitected = [
+      types-aiobotocore-wellarchitected
+    ];
+    wisdom = [
+      types-aiobotocore-wisdom
+    ];
+    workdocs = [
+      types-aiobotocore-workdocs
+    ];
+    worklink = [
+      types-aiobotocore-worklink
+    ];
+    workmail = [
+      types-aiobotocore-workmail
+    ];
+    workmailmessageflow = [
+      types-aiobotocore-workmailmessageflow
+    ];
+    workspaces = [
+      types-aiobotocore-workspaces
+    ];
+    workspaces-web = [
+      types-aiobotocore-workspaces-web
+    ];
+    xray = [
+      types-aiobotocore-xray
+    ];
+  };
+
+  # Package has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Type annotations for aiobotocore generated with mypy-boto3-builder";
+    homepage = "https://pypi.org/project/types-aiobotocore/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-appdirs/default.nix b/nixpkgs/pkgs/development/python-modules/types-appdirs/default.nix
new file mode 100644
index 000000000000..f6fe4cf6e1b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-appdirs/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-appdirs";
+  version = "1.4.3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-gyaNpkWFNhv6KR+PUGogknYhKgSXvTfwUSqTmz1p/xQ=";
+  };
+
+  meta = {
+    description = "This is a PEP 561 type stub package for the appdirs package. It can be used by type-checking tools like mypy, pyright, pytype, PyCharm, etc. to check code that uses appdirs. ";
+    homepage = "https://pypi.org/project/types-appdirs";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-awscrt/default.nix b/nixpkgs/pkgs/development/python-modules/types-awscrt/default.nix
new file mode 100644
index 000000000000..94810408f0ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-awscrt/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "types-awscrt";
+  version = "0.19.18";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "types_awscrt";
+    inherit version;
+    hash = "sha256-T1pZyHwFgraev5lNYU4Pt2zC0KXsPzLk0dscCRhnzdM=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  pythonImportsCheck = [
+    "awscrt-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Type annotations and code completion for awscrt";
+    homepage = "https://github.com/youtype/types-awscrt";
+    changelog = "https://github.com/youtype/types-awscrt/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-beautifulsoup4/default.nix b/nixpkgs/pkgs/development/python-modules/types-beautifulsoup4/default.nix
new file mode 100644
index 000000000000..790692362677
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-beautifulsoup4/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, types-html5lib
+}:
+
+buildPythonPackage rec {
+  pname = "types-beautifulsoup4";
+  version = "4.12.0.7";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WZgAKNKb9V0Ns1nvowW3W6zwy5Lj8/az/UCPJTHfJ0w=";
+  };
+
+  propagatedBuildInputs = [
+    types-html5lib
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "bs4-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for beautifulsoup4";
+    homepage = "https://pypi.org/project/types-beautifulsoup4/";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-click/default.nix b/nixpkgs/pkgs/development/python-modules/types-click/default.nix
new file mode 100644
index 000000000000..78c99fe42808
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-click/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+}:
+
+let
+  pname = "types-click";
+  version = "7.1.8";
+in
+buildPythonPackage {
+  inherit pname version;
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-tmBJaL5kAdxRYxHKUHCKCii6p6DLhA79dBLw27/04JI=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  meta = with lib; {
+    description = "Collection of library stubs for Python, with static types";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jfvillablanca ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-colorama/default.nix b/nixpkgs/pkgs/development/python-modules/types-colorama/default.nix
new file mode 100644
index 000000000000..d724378fee85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-colorama/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-colorama";
+  version = "0.4.15.12";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-+9/F2dJNhcM70FT74zrcbOxE7tsZz7ur+7tX3CV65Lg=";
+  };
+
+  # Module has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Typing stubs for colorama";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-dateutil/default.nix b/nixpkgs/pkgs/development/python-modules/types-dateutil/default.nix
new file mode 100644
index 000000000000..92dfde3b5e6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-dateutil/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-dateutil";
+  version = "2.8.19.9";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "types-python-dateutil";
+    inherit version;
+    hash = "sha256-Y3cW+zr73H62g/ZBFx+HSTevExSc1Faoxj6PgRJ6Oe0=";
+  };
+
+  pythonImportsCheck = [
+    "dateutil-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for python-dateutil";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ milibopp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-decorator/default.nix b/nixpkgs/pkgs/development/python-modules/types-decorator/default.nix
new file mode 100644
index 000000000000..c2e71f224569
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-decorator/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-decorator";
+  version = "5.1.8.4";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-qMOQJGNOmYNL7xRs7C42xYX0eISt303GXW0Lex9idRc=";
+  };
+
+  # Modules doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "decorator-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for decorator";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-deprecated/default.nix b/nixpkgs/pkgs/development/python-modules/types-deprecated/default.nix
new file mode 100644
index 000000000000..ee4ede8620f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-deprecated/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-deprecated";
+  version = "1.2.9.3";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "types-Deprecated";
+    inherit version;
+    hash = "sha256-74cyet8+PEpMfY4G5Y9kdnENNGbs+1PEnvsICASnDvM=";
+  };
+
+  # Modules has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "deprecated-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for Deprecated";
+    homepage = "https://pypi.org/project/types-Deprecated/";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-docopt/default.nix b/nixpkgs/pkgs/development/python-modules/types-docopt/default.nix
new file mode 100644
index 000000000000..7c1128efb840
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-docopt/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-docopt";
+  version = "0.6.11.4";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-mRpkwVaTEMIkCuc0/SwQYnq7ikr6875axvTv+aYB8xo=";
+  };
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "docopt-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for docopt";
+    homepage = "https://pypi.org/project/types-docopt/";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-docutils/default.nix b/nixpkgs/pkgs/development/python-modules/types-docutils/default.nix
new file mode 100644
index 000000000000..c67234d5f25d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-docutils/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-docutils";
+  version = "0.20.0.3";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-SSjnkPQrmdWDOZD5nI3Z+p8Wgl9u0wOAypgYRtNocM0=";
+  };
+
+  # Module doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "docutils-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for docutils";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-enum34/default.nix b/nixpkgs/pkgs/development/python-modules/types-enum34/default.nix
new file mode 100644
index 000000000000..6c186f2d8756
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-enum34/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-enum34";
+  version = "1.1.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0421lr89vv3fpg77kkj5nmzd7z3nmhw4vh8ibsjp6vfh86b7d73g";
+  };
+
+  pythonImportsCheck = [
+    "enum-python2-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for enum34";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jpetrucciani ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-freezegun/default.nix b/nixpkgs/pkgs/development/python-modules/types-freezegun/default.nix
new file mode 100644
index 000000000000..ebca11ad4776
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-freezegun/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-freezegun";
+  version = "1.1.10";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-yzotLu6VDqy6rAZzq1BJmCM2XOuMZVursVRKQURkCew=";
+  };
+
+  # Module doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "freezegun-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for freezegun";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jpetrucciani ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-futures/default.nix b/nixpkgs/pkgs/development/python-modules/types-futures/default.nix
new file mode 100644
index 000000000000..afff438efef1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-futures/default.nix
@@ -0,0 +1,18 @@
+{ buildPythonPackage, fetchPypi, lib }:
+
+buildPythonPackage rec {
+  pname = "types-futures";
+  version = "3.3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6fe8ccc2c2af7ef2fdd9bf73eab6d617074f09f30ad7d373510b4043d39c42de";
+  };
+
+  meta = with lib; {
+    description = "Typing stubs for futures";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ andersk ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-html5lib/default.nix b/nixpkgs/pkgs/development/python-modules/types-html5lib/default.nix
new file mode 100644
index 000000000000..843b1a108c85
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-html5lib/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-html5lib";
+  version = "1.1.11.15";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gOGiBi0io6/+XCjZfaML/786B205PID8bxZxIWwb1JI=";
+  };
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "html5lib-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for html5lib";
+    homepage = "https://pypi.org/project/types-html5lib/";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-ipaddress/default.nix b/nixpkgs/pkgs/development/python-modules/types-ipaddress/default.nix
new file mode 100644
index 000000000000..19e048d1a9f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-ipaddress/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-ipaddress";
+  version = "1.0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0h9q9pjvw1ap5k70ygp750d096jkzymxlhx87yh0pr9mb6zg6gd0";
+  };
+
+  pythonImportsCheck = [
+    "ipaddress-python2-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for ipaddress";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jpetrucciani ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-mock/default.nix b/nixpkgs/pkgs/development/python-modules/types-mock/default.nix
new file mode 100644
index 000000000000..cb0d8060d89b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-mock/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-mock";
+  version = "5.1.0.3";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7urCVIAoe7ch+xf82i6XaNcKR23MFKLB0DiVNcVPgYQ=";
+  };
+
+  # Module has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Type stub package for the mock package";
+    homepage = "https://pypi.org/project/types-mock";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-pillow/default.nix b/nixpkgs/pkgs/development/python-modules/types-pillow/default.nix
new file mode 100644
index 000000000000..45d4c9bedf18
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-pillow/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-pillow";
+  version = "10.1.0.2";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "types-Pillow";
+    hash = "sha256-UlwcXuZ7CsFyHEDSvGGCJu8hI8NH5SfhTgW5IHIaE7k=";
+  };
+
+  # Modules doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "PIL-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for Pillow";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ arjan-s ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-protobuf/default.nix b/nixpkgs/pkgs/development/python-modules/types-protobuf/default.nix
new file mode 100644
index 000000000000..1004c671a1c7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-protobuf/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, types-futures
+}:
+
+buildPythonPackage rec {
+  pname = "types-protobuf";
+  version = "4.24.0.4";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-V6tCyxcd/bosdLtbUMJQR4U4zDxe2VuLNokprQyfkKU=";
+  };
+
+  propagatedBuildInputs = [
+    types-futures
+  ];
+
+  # Module doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "google-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for protobuf";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ andersk ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-psutil/default.nix b/nixpkgs/pkgs/development/python-modules/types-psutil/default.nix
new file mode 100644
index 000000000000..8e01ec2c3ff3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-psutil/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-psutil";
+  version = "5.9.5.16";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-TpshnvtiXT0E9r8QaTT4fKtJqkGpSwo7MIlAP0enkig=";
+  };
+
+  # Module doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "psutil-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for psutil";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ anselmschueler ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-pyopenssl/default.nix b/nixpkgs/pkgs/development/python-modules/types-pyopenssl/default.nix
new file mode 100644
index 000000000000..b7f751a0cca1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-pyopenssl/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cryptography
+}:
+
+buildPythonPackage rec {
+  pname = "types-pyopenssl";
+  version = "23.3.0.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "types-pyOpenSSL";
+    inherit version;
+    hash = "sha256-X/sHf+cLaZyI1cqrmZroDhkv4ov2zaeYm355seTi3NM=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  # Module doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "OpenSSL-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for pyopenssl";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-python-dateutil/default.nix b/nixpkgs/pkgs/development/python-modules/types-python-dateutil/default.nix
new file mode 100644
index 000000000000..2d00bae5a29c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-python-dateutil/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-python-dateutil";
+  version = "2.8.19.14";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-H08QrJi7ixat6dvuNRjZrOAXgh2UsFekJbBp+DRzf0s=";
+  };
+
+  # Modules doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "dateutil-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for python-dateutil";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-pytz/default.nix b/nixpkgs/pkgs/development/python-modules/types-pytz/default.nix
new file mode 100644
index 000000000000..9433d55512ec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-pytz/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-pytz";
+  version = "2023.3.1.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zCPQGSzUnI9rukTuDIHkWGqPMCBJcPwIlNIJprCNq5o=";
+  };
+
+  # Modules doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pytz-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for pytz";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-pyyaml/default.nix b/nixpkgs/pkgs/development/python-modules/types-pyyaml/default.nix
new file mode 100644
index 000000000000..58a66197d00b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-pyyaml/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-pyyaml";
+  version = "6.0.12.11";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "types-PyYAML";
+    inherit version;
+    hash = "sha256-fTQLGcoozd/bpDjuY4zUCEveIT5QGjl4c4VD4nCUd1s=";
+  };
+
+  # Module doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "yaml-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for PyYAML";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dnr ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-redis/default.nix b/nixpkgs/pkgs/development/python-modules/types-redis/default.nix
new file mode 100644
index 000000000000..03fe60ce33d2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-redis/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cryptography
+, types-pyopenssl
+}:
+
+buildPythonPackage rec {
+  pname = "types-redis";
+  version = "4.6.0.11";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-yM/IRjUYPeyi20pSiWbFVmRF/TcTmD8ANPsPWgngiQ0=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+    types-pyopenssl
+  ];
+
+  # Module doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "redis-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for redis";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-requests/default.nix b/nixpkgs/pkgs/development/python-modules/types-requests/default.nix
new file mode 100644
index 000000000000..557dce437d2a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-requests/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, types-urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "types-requests";
+  version = "2.31.0.10";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-3FhSp28er2Dq+oGi5Qrvo9HwFcNM8MuhMJMIZrGyKpI=";
+  };
+
+  propagatedBuildInputs = [
+    types-urllib3
+  ];
+
+  # Module doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "requests-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for requests";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-retry/default.nix b/nixpkgs/pkgs/development/python-modules/types-retry/default.nix
new file mode 100644
index 000000000000..ecef01714f9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-retry/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-retry";
+  version = "0.9.9.4";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5HMdxoS1a4ddl0ZFmtZl07woGla1MKzfHJdzAWd5mUE=";
+  };
+
+  # Modules doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "retry-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for retry";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-s3transfer/default.nix b/nixpkgs/pkgs/development/python-modules/types-s3transfer/default.nix
new file mode 100644
index 000000000000..44f025c23c1a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-s3transfer/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "types-s3transfer";
+  version = "0.8.1";
+  pyproject = true;
+
+  src = fetchPypi {
+    pname = "types_s3transfer";
+    inherit version;
+    hash = "sha256-tng+wpElwAtWCzVNL+KhhdxcznahfCOsLWMGdK+nAEA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "s3transfer-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Type annotations and code completion for s3transfer";
+    homepage = "https://github.com/youtype/types-s3transfer";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-setuptools/default.nix b/nixpkgs/pkgs/development/python-modules/types-setuptools/default.nix
new file mode 100644
index 000000000000..9c705d4bfbec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-setuptools/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-setuptools";
+  version = "68.2.0.2";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Ce/DgK1cf3jjC8oVRvcGRpVozyYITPq3Ps+D3qHShEY=";
+  };
+
+  # Module doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "setuptools-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for setuptools";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-tabulate/default.nix b/nixpkgs/pkgs/development/python-modules/types-tabulate/default.nix
new file mode 100644
index 000000000000..123aaa346171
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-tabulate/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-tabulate";
+  version = "0.9.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GXZR+dZGcZPNFm2FABFqbTom8qTrLbCTvJU17hwL5V4=";
+  };
+
+  # Module doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "tabulate-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for tabulate";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jpetrucciani ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-toml/default.nix b/nixpkgs/pkgs/development/python-modules/types-toml/default.nix
new file mode 100644
index 000000000000..140664989f3b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-toml/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-toml";
+  version = "0.10.8.7";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WLB4HGgeZx/wtcAxkwmRBon0q0DookMeIF1wyUu277E=";
+  };
+
+  # Module doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "toml-stubs" ];
+
+  meta = with lib; {
+    description = "Typing stubs for toml";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-tqdm/default.nix b/nixpkgs/pkgs/development/python-modules/types-tqdm/default.nix
new file mode 100644
index 000000000000..b8e7b096c835
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-tqdm/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "types-tqdm";
+  version = "4.66.0.5";
+  pyproject = true;
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-dL1+RpI4wogWMA9yqbcT0CA29rVXc0YWQwrbe350ESw=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  # This package does not have tests.
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Typing stubs for tqdm";
+    homepage = "https://pypi.org/project/types-tqdm/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-typed-ast/default.nix b/nixpkgs/pkgs/development/python-modules/types-typed-ast/default.nix
new file mode 100644
index 000000000000..32671d584641
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-typed-ast/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-typed-ast";
+  version = "1.5.8.7";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-93lfb51ZezUhIxQEC5k/ZhO1HYFzjtzjweOj6e9lUSQ=";
+  };
+
+  # Module doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "typed_ast-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for typed-ast";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ veehaitch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-ujson/default.nix b/nixpkgs/pkgs/development/python-modules/types-ujson/default.nix
new file mode 100644
index 000000000000..8819dec4220e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-ujson/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-ujson";
+  version = "5.8.0.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-KxQ4gkirTNH176jEZHYREll8zVfA2EI49zYxq+DiDP0=";
+  };
+
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ujson-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for ujson";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ centromere ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/types-urllib3/default.nix b/nixpkgs/pkgs/development/python-modules/types-urllib3/default.nix
new file mode 100644
index 000000000000..d02174d7727f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/types-urllib3/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "types-urllib3";
+  version = "1.26.25.14";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Ipt/V3yVG4wbksG8Ky/bC0mEe9KvbRzCouPdNA872o8=";
+  };
+
+  # Module doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "urllib3-stubs"
+  ];
+
+  meta = with lib; {
+    description = "Typing stubs for urllib3";
+    homepage = "https://github.com/python/typeshed";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/typesentry/default.nix b/nixpkgs/pkgs/development/python-modules/typesentry/default.nix
new file mode 100644
index 000000000000..5aa12fb041ad
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typesentry/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, colorama
+, pytest
+, pytest-cov
+}:
+
+buildPythonPackage {
+  pname = "typesentry";
+  version = "0.2.7";
+
+  # Only wheel distribution is available on PyPi.
+  src = fetchFromGitHub {
+    owner = "h2oai";
+    repo = "typesentry";
+    rev = "0ca8ed0e62d15ffe430545e7648c9a9b2547b49c";
+    sha256 = "0z615f9dxaab3bay3v27j7q99qm6l6q8xv872yvsp87sxj7apfki";
+  };
+
+  propagatedBuildInputs = [ colorama ];
+  nativeCheckInputs = [ pytest pytest-cov ];
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Python 2.7 & 3.5+ runtime type-checker";
+    homepage = "https://github.com/h2oai/typesentry";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/typesystem/default.nix b/nixpkgs/pkgs/development/python-modules/typesystem/default.nix
new file mode 100644
index 000000000000..96f351ccaf1f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typesystem/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, jinja2
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "typesystem";
+  version = "0.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "encode";
+    repo = pname;
+    rev = version;
+    hash = "sha256-fjnheHWjIDbJY1iXCRKCpqTCwtUWK9YXbynRCZquQ7c=";
+  };
+
+  propagatedBuildInputs = [
+    jinja2
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "typesystem"
+  ];
+
+  meta = with lib; {
+    description = "A type system library for Python";
+    homepage = "https://github.com/encode/typesystem";
+    license = licenses.bsd3;
+    maintainers =  with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/typical/default.nix b/nixpkgs/pkgs/development/python-modules/typical/default.nix
new file mode 100644
index 000000000000..67d55e64243e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typical/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, buildPythonPackage
+, fastjsonschema
+, fetchFromGitHub
+, future-typing
+, inflection
+, orjson
+, pandas
+, pendulum
+, poetry-core
+, pydantic
+, pytestCheckHook
+, pythonOlder
+, sqlalchemy
+, ujson
+}:
+
+buildPythonPackage rec {
+  pname = "typical";
+  version = "2.8.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "seandstewart";
+    repo = "typical";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-2t9Jhdy9NmYBNzdtjjgUnoK2RDEUsAvDkYMcBRzEcmI=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    fastjsonschema
+    future-typing
+    inflection
+    orjson
+    pendulum
+    ujson
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pydantic
+    sqlalchemy
+    pandas
+  ];
+
+  disabledTests = [
+    # ConstraintValueError: Given value <{'key...
+    "test_tagged_union_validate"
+    # TypeError: 'NoneType' object cannot be interpreted as an integer
+    "test_ujson"
+  ];
+
+  disabledTestPaths = [
+    # We don't care about benchmarks
+    "benchmark/"
+    # Tests are failing on Hydra
+    "tests/mypy/test_mypy.py"
+  ];
+
+  pythonImportsCheck = [
+    "typic"
+  ];
+
+  meta = with lib; {
+    description = "Python library for runtime analysis, inference and validation of Python types";
+    homepage = "https://python-typical.org/";
+    changelog = "https://github.com/seandstewart/typical/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kfollesdal ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/typing-extensions/default.nix b/nixpkgs/pkgs/development/python-modules/typing-extensions/default.nix
new file mode 100644
index 000000000000..72302723c855
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typing-extensions/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit-core
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "typing-extensions";
+  version = "4.7.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "typing_extensions";
+    inherit version;
+    hash = "sha256-t13cJk8LpWFdt7ohfa65lwGtKVNTxF+elZYzN87u/7I=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  # Tests are not part of PyPI releases. GitHub source can't be used
+  # as it ends with an infinite recursion
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "typing_extensions"
+  ];
+
+  meta = with lib; {
+    description = "Backported and Experimental Type Hints for Python";
+    changelog = "https://github.com/python/typing_extensions/blob/${version}/CHANGELOG.md";
+    homepage = "https://github.com/python/typing";
+    license = licenses.psfl;
+    maintainers = with maintainers; [ pmiddend ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/typing-inspect/default.nix b/nixpkgs/pkgs/development/python-modules/typing-inspect/default.nix
new file mode 100644
index 000000000000..59eb74554788
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typing-inspect/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, typing-extensions
+, mypy-extensions
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "typing-inspect";
+  version = "0.9.0";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "typing_inspect";
+    hash = "sha256-sj/EL/b272lU5IUsH7USzdGNvqAxNPkfhWqVzMlGH3g=";
+  };
+
+  propagatedBuildInputs = [
+    typing-extensions
+    mypy-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # https://github.com/ilevkivskyi/typing_inspect/issues/84
+    "test_typed_dict_typing_extension"
+  ];
+
+  pythonImportsCheck = [
+    "typing_inspect"
+  ];
+
+  meta = with lib; {
+    description = "Runtime inspection utilities for Python typing module";
+    homepage = "https://github.com/ilevkivskyi/typing_inspect";
+    license = licenses.mit;
+    maintainers = with maintainers; [ albakham ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/typish/default.nix b/nixpkgs/pkgs/development/python-modules/typish/default.nix
new file mode 100644
index 000000000000..c05518c257f0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typish/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "typish";
+  version = "1.9.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ramonhagenaars";
+    repo = "typish";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-LnOg1dVs6lXgPTwRYg7uJ3LCdExYrCxS47UEJxKHhVU=";
+  };
+
+  nativeCheckInputs = [
+    numpy
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Requires a very old version of nptyping
+    # which has a circular dependency on typish
+    "tests/functions/test_instance_of.py"
+  ];
+
+  disabledTests = lib.optionals (pythonAtLeast "3.11") [
+    # https://github.com/ramonhagenaars/typish/issues/32
+    "test_get_origin"
+  ];
+
+  pythonImportsCheck = [
+    "typish"
+  ];
+
+  meta = with lib; {
+    description = "Python module for checking types of objects";
+    homepage = "https://github.com/ramonhagenaars/typish";
+    changelog = "https://github.com/ramonhagenaars/typish/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fmoda3 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/typogrify/default.nix b/nixpkgs/pkgs/development/python-modules/typogrify/default.nix
new file mode 100644
index 000000000000..81425b22f181
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/typogrify/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, smartypants
+}:
+
+buildPythonPackage rec {
+  pname = "typogrify";
+  version = "2.0.7";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "8be4668cda434163ce229d87ca273a11922cb1614cb359970b7dc96eed13cb38";
+  };
+
+  propagatedBuildInputs = [
+    smartypants
+  ];
+
+  # Wants to set up Django
+  doCheck = false;
+
+  pythonImportsCheck = [ "typogrify.filters" ];
+
+  meta = with lib; {
+    description = "Filters to enhance web typography, including support for Django & Jinja templates";
+    homepage = "https://github.com/mintchaos/typogrify";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tzdata/default.nix b/nixpkgs/pkgs/development/python-modules/tzdata/default.nix
new file mode 100644
index 000000000000..91bbc854a26d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tzdata/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, importlib-resources
+, pytest-subtests
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "tzdata";
+  version = "2023.3";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Ee8eCOVKyw1Plb2xvgXaZZZz3krL0hv5xp6UzF6Qejo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-subtests
+  ] ++ lib.optionals (pythonOlder "3.7") [
+    importlib-resources
+  ];
+
+  pythonImportsCheck = [
+    "tzdata"
+  ];
+
+  meta = with lib; {
+    description = "Provider of IANA time zone data";
+    homepage = "https://github.com/python/tzdata";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/tzlocal/default.nix b/nixpkgs/pkgs/development/python-modules/tzlocal/default.nix
new file mode 100644
index 000000000000..e9ab0bc6abe3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/tzlocal/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, setuptools
+, wheel
+, pytz-deprecation-shim
+, pytest-mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "tzlocal";
+  version = "5.0.1"; # version needs to be compatible with APScheduler
+
+  disabled = pythonOlder "3.7";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-RuuZrUvbcfP3K30k9CZ3U+JAlE7PwW8l0nGbqJgnqAM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    pytz-deprecation-shim
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_conflicting"
+    "test_noconflict"
+    "test_symlink_localtime"
+  ] ++ lib.optional stdenv.isDarwin "test_assert_tz_offset";
+
+  pythonImportsCheck = [ "tzlocal" ];
+
+  meta = with lib; {
+    description = "Tzinfo object for the local timezone";
+    homepage = "https://github.com/regebro/tzlocal";
+    changelog = "https://github.com/regebro/tzlocal/blob/${version}/CHANGES.txt";
+    license = licenses.cddl;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/u-msgpack-python/default.nix b/nixpkgs/pkgs/development/python-modules/u-msgpack-python/default.nix
new file mode 100644
index 000000000000..1b79d265ff86
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/u-msgpack-python/default.nix
@@ -0,0 +1,30 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, glibcLocales
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "u-msgpack-python";
+  version = "2.8.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uAGoPW7XXm30HkRRi08qnCIdwtpLzVOA46D+2lILxho=";
+  };
+
+  env.LC_ALL="en_US.UTF-8";
+
+  buildInputs = [ glibcLocales ];
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  meta = {
+    description = "A portable, lightweight MessagePack serializer and deserializer written in pure Python";
+    homepage = "https://github.com/vsergeev/u-msgpack-python";
+    changelog = "https://github.com/vsergeev/u-msgpack-python/blob/v${version}/CHANGELOG.md";
+    license = lib.licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ua-parser/default.nix b/nixpkgs/pkgs/development/python-modules/ua-parser/default.nix
new file mode 100644
index 000000000000..ba0f75ce6f35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ua-parser/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyyaml
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ua-parser";
+  version = "0.18.0";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "ua-parser";
+    repo = "uap-python";
+    rev = version;
+    fetchSubmodules = true;
+    hash = "sha256-GiuGPnyYL0HQ/J2OpDTD1/panZCuzKtD3mKW5op5lXA=";
+  };
+
+  patches = [
+    ./dont-fetch-submodule.patch
+  ];
+
+  nativeBuildInputs = [
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    # import from $out
+    rm ua_parser/__init__.py
+  '';
+
+  pythonImportsCheck = [ "ua_parser" ];
+
+  meta = with lib; {
+    description = "A python implementation of the UA Parser";
+    homepage = "https://github.com/ua-parser/uap-python";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ua-parser/dont-fetch-submodule.patch b/nixpkgs/pkgs/development/python-modules/ua-parser/dont-fetch-submodule.patch
new file mode 100644
index 000000000000..fa0cfdeabf32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ua-parser/dont-fetch-submodule.patch
@@ -0,0 +1,17 @@
+diff --git a/setup.py b/setup.py
+index a976eee..6919795 100644
+--- a/setup.py
++++ b/setup.py
+@@ -64,12 +64,6 @@ class build_regexes(Command):
+ 
+     def run(self):
+         work_path = self.work_path
+-        if not os.path.exists(os.path.join(work_path, ".git")):
+-            return
+-
+-        log.info("initializing git submodules")
+-        check_output(["git", "submodule", "init"], cwd=work_path)
+-        check_output(["git", "submodule", "update"], cwd=work_path)
+ 
+         yaml_src = os.path.join(work_path, "uap-core", "regexes.yaml")
+         if not os.path.exists(yaml_src):
diff --git a/nixpkgs/pkgs/development/python-modules/uamqp/clang-fix-incompatible-function-pointer-conversion.patch b/nixpkgs/pkgs/development/python-modules/uamqp/clang-fix-incompatible-function-pointer-conversion.patch
new file mode 100644
index 000000000000..ed177797da0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uamqp/clang-fix-incompatible-function-pointer-conversion.patch
@@ -0,0 +1,13 @@
+diff --git a/src/message_receiver.pyx b/src/message_receiver.pyx
+index b99647c..479cc9c 100644
+--- a/src/message_receiver.pyx
++++ b/src/message_receiver.pyx
+@@ -120,7 +120,7 @@ cdef class cMessageReceiver(StructBase):
+ 
+ #### Callbacks (context is a MessageReceiver instance)
+ 
+-cdef void on_message_receiver_state_changed(void* context, c_message_receiver.MESSAGE_RECEIVER_STATE_TAG new_state, c_message_receiver.MESSAGE_RECEIVER_STATE_TAG previous_state):
++cdef void on_message_receiver_state_changed(const void* context, c_message_receiver.MESSAGE_RECEIVER_STATE_TAG new_state, c_message_receiver.MESSAGE_RECEIVER_STATE_TAG previous_state):
+     if context != NULL:
+         context_pyobj = <PyObject*>context
+         if context_pyobj.ob_refcnt == 0: # context is being garbage collected, skip the callback
diff --git a/nixpkgs/pkgs/development/python-modules/uamqp/darwin-azure-c-shared-utility-corefoundation.patch b/nixpkgs/pkgs/development/python-modules/uamqp/darwin-azure-c-shared-utility-corefoundation.patch
new file mode 100644
index 000000000000..ad2186543f3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uamqp/darwin-azure-c-shared-utility-corefoundation.patch
@@ -0,0 +1,37 @@
+From 52ab2095649b5951e6af77f68954209473296983 Mon Sep 17 00:00:00 2001
+From: Sandro <sandro.jaeckel@gmail.com>
+Date: Sat, 16 Jan 2021 15:54:05 +0100
+Subject: [PATCH] Fix finding apple libraries
+
+---
+ CMakeLists.txt | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+ 
+
+(rejected by upstream in https://github.com/Azure/azure-c-shared-utility/pull/499,
+seems problem it's solving is nixpkgs-specific)
+
+diff --git a/src/vendor/azure-uamqp-c/deps/azure-c-shared-utility/CMakeLists.txt b/src/vendor/azure-uamqp-c/deps/azure-c-shared-utility/CMakeLists.txt
+index 7bbfa6f3f..3567b18bc 100644
+--- a/src/vendor/azure-uamqp-c/deps/azure-c-shared-utility/CMakeLists.txt
++++ b/src/vendor/azure-uamqp-c/deps/azure-c-shared-utility/CMakeLists.txt
+@@ -120,8 +120,9 @@ endif()
+ 
+ if(${use_applessl})
+     # MACOSX only has native tls and open ssl, so use the native apple tls
+-    find_library(cf_foundation Foundation)
++    find_library(cf_foundation CoreFoundation)
+     find_library(cf_network CFNetwork)
++    find_library(cf_security Security)
+ endif()
+ 
+ if(${no_logging})
+@@ -581,7 +582,7 @@ endif()
+ 
+ 
+ if(${use_applessl})
+-    set(aziotsharedutil_target_libs ${aziotsharedutil_target_libs} ${cf_foundation} ${cf_network})
++    set(aziotsharedutil_target_libs ${aziotsharedutil_target_libs} ${cf_foundation} ${cf_network} ${cf_security})
+ endif()
+ 
+ if(WIN32)
diff --git a/nixpkgs/pkgs/development/python-modules/uamqp/default.nix b/nixpkgs/pkgs/development/python-modules/uamqp/default.nix
new file mode 100644
index 000000000000..c306068f7fdb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uamqp/default.nix
@@ -0,0 +1,94 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, cython
+, certifi
+, CFNetwork
+, cmake
+, CoreFoundation
+, libcxxabi
+, openssl
+, Security
+, pytestCheckHook
+, pytest-asyncio
+}:
+
+buildPythonPackage rec {
+  pname = "uamqp";
+  version = "1.6.5";
+
+  src = fetchFromGitHub {
+    owner = "Azure";
+    repo = "azure-uamqp-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-q8FxM4PBXLD5q68nrUJ+TGkui1yQJ3HHNF7jn+e+HkA=";
+  };
+
+  patches = lib.optionals (stdenv.isDarwin && stdenv.isx86_64) [
+    ./darwin-azure-c-shared-utility-corefoundation.patch
+  ] ++ [
+    # Fix incompatible function pointer conversion error with clang 16.
+    ./clang-fix-incompatible-function-pointer-conversion.patch
+  ];
+
+  postPatch = lib.optionalString (stdenv.isDarwin && !stdenv.isx86_64) ''
+    # force darwin aarch64 to use openssl instead of applessl, removing
+    # some quirks upstream thinks they need to use openssl on macos
+    sed -i \
+      -e '/^use_openssl =/cuse_openssl = True' \
+      -e 's/\bazssl\b/ssl/' \
+      -e 's/\bazcrypto\b/crypto/' \
+      setup.py
+    sed -i \
+      -e '/#define EVP_PKEY_id/d' \
+      src/vendor/azure-uamqp-c/deps/azure-c-shared-utility/adapters/x509_openssl.c
+    sed -z -i \
+      -e 's/OpenSSL 3\nif(LINUX)/OpenSSL 3\nif(1)/' \
+      src/vendor/azure-uamqp-c/deps/azure-c-shared-utility/CMakeLists.txt
+  '';
+
+  nativeBuildInputs = [
+    cmake
+    cython
+  ];
+
+  buildInputs = [
+    openssl
+  ] ++ lib.optionals stdenv.isDarwin [
+    CoreFoundation
+    CFNetwork
+    Security
+  ];
+
+  propagatedBuildInputs = [
+    certifi
+  ];
+
+  LDFLAGS = lib.optionals stdenv.isDarwin [
+    "-L${lib.getLib libcxxabi}/lib"
+  ];
+
+  dontUseCmakeConfigure = true;
+
+  preCheck = ''
+    # remove src module, so tests use the installed module instead
+    rm -r uamqp
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+  ];
+
+  pythonImportsCheck = [
+    "uamqp"
+  ];
+
+  meta = with lib; {
+    description = "An AMQP 1.0 client library for Python";
+    homepage = "https://github.com/Azure/azure-uamqp-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ maxwilson ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uarray/default.nix b/nixpkgs/pkgs/development/python-modules/uarray/default.nix
new file mode 100644
index 000000000000..31f55ebdea79
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uarray/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, matchpy
+, numpy
+, astunparse
+, typing-extensions
+, pytestCheckHook
+, pytest-cov
+}:
+
+buildPythonPackage rec {
+  pname = "uarray";
+  version = "0.8.2";
+
+  src = fetchFromGitHub {
+    owner = "Quansight-Labs";
+    repo = pname;
+    rev = version;
+    sha256 = "1x2jp7w2wmn2awyv05xs0frpq0fa0rprwcxyg72wgiss0bnzxnhm";
+  };
+
+  patches = [(
+    # Fixes a compile error with newer versions of GCC -- should be included
+    # in the next release after 0.8.2
+    fetchpatch {
+      url = "https://github.com/Quansight-Labs/uarray/commit/a2012fc7bb94b3773eb402c6fe1ba1a894ea3d18.patch";
+      sha256 = "1qqh407qg5dz6x766mya2bxrk0ffw5h17k478f5kcs53g4dyfc3s";
+    }
+  )];
+
+  nativeCheckInputs = [ pytestCheckHook pytest-cov ];
+  propagatedBuildInputs = [ matchpy numpy astunparse typing-extensions ];
+
+  # Tests must be run from outside the source directory
+  preCheck = ''
+    cd $TMP
+  '';
+  pytestFlagsArray = ["--pyargs" "uarray"];
+  pythonImportsCheck = [ "uarray" ];
+
+  meta = with lib; {
+    description = "Universal array library";
+    homepage = "https://github.com/Quansight-Labs/uarray";
+    license = licenses.bsd0;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uasiren/default.nix b/nixpkgs/pkgs/development/python-modules/uasiren/default.nix
new file mode 100644
index 000000000000..b6771266f2ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uasiren/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build time
+, setuptools-scm
+
+# propagates
+, aiohttp
+
+# tests
+, pytestCheckHook
+}:
+
+let
+  pname = "uasiren";
+  version = "0.0.1";
+in
+
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "PaulAnnekov";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-NHrnG5Vhz+JZgcTJyfIgGz0Ye+3dFVv2zLCCqw2++oM=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "uasiren"
+    "uasiren.client"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/PaulAnnekov/uasiren/releases/tag/v${version}";
+    description = "Implements siren.pp.ua API - public wrapper for api.ukrainealarm.com API that returns info about Ukraine air-raid alarms";
+    homepage = "https://github.com/PaulAnnekov/uasiren";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/ubelt/default.nix b/nixpkgs/pkgs/development/python-modules/ubelt/default.nix
new file mode 100644
index 000000000000..a85be00ddf79
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ubelt/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, wheel
+, numpy
+, python-dateutil
+, xxhash
+, pytestCheckHook
+, requests
+, xdoctest
+}:
+
+buildPythonPackage rec {
+  pname = "ubelt";
+  version = "1.3.4";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Erotemic";
+    repo = "ubelt";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-pvCmmdPRLupMUCiOvfa+JTX8NPFZ/UcXSPEaaDG3eTk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  passthru.optional-dependencies = {
+    optional = [
+      numpy
+      python-dateutil
+      xxhash
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    requests
+    xdoctest
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # fail due to sandbox environment
+    "CacheStamp.expired"
+    "userhome"
+  ];
+
+  pythonImportsCheck = [ "ubelt" ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "A Python utility library with a stdlib like feel and extra batteries. Paths, Progress, Dicts, Downloads, Caching, Hashing: ubelt makes it easy";
+    homepage = "https://github.com/Erotemic/ubelt";
+    changelog = "https://github.com/Erotemic/ubelt/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uc-micro-py/default.nix b/nixpkgs/pkgs/development/python-modules/uc-micro-py/default.nix
new file mode 100644
index 000000000000..f6aa059d709c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uc-micro-py/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "uc-micro-py";
+  version = "1.0.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "tsutsu3";
+    repo = "uc.micro-py";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-PUeWYG/VyxCfhB7onAcDFow1yYqArjmfMT99+058P7U=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  pythonImportsCheck = [
+    "uc_micro"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Micro subset of unicode data files for linkify-it-py";
+    homepage = "https://github.com/tsutsu3/uc.micro-py";
+    license = licenses.mit;
+    maintainers = with maintainers; [ AluisioASG ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ucsmsdk/default.nix b/nixpkgs/pkgs/development/python-modules/ucsmsdk/default.nix
new file mode 100644
index 000000000000..7d285b062880
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ucsmsdk/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyparsing
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "ucsmsdk";
+  version = "0.9.16";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "CiscoUcs";
+    repo = "ucsmsdk";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-9ksHA8uvBv370/6Umt5iz/4F8VsDDI9X8kVc5Lv0RVk=";
+  };
+
+  propagatedBuildInputs = [
+    pyparsing
+    six
+  ];
+
+  # most tests are broken
+  doCheck = false;
+
+  pythonImportsCheck = [ "ucsmsdk" ];
+
+  meta = with lib; {
+    description = "Python SDK for Cisco UCS";
+    homepage = "https://github.com/CiscoUcs/ucsmsdk";
+    changelog = "https://github.com/CiscoUcs/ucsmsdk/blob/v${version}/HISTORY.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/udatetime/default.nix b/nixpkgs/pkgs/development/python-modules/udatetime/default.nix
new file mode 100644
index 000000000000..9eef1512490d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/udatetime/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "udatetime";
+  version = "0.0.17";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-sQvFVwaZpDinLitaZOdr2MKO4779FvIJOHpVB/oLgwE=";
+  };
+
+  # tests not included on pypi
+  doCheck = false;
+
+  pythonImportsCheck = [ "udatetime" ];
+
+  meta = with lib; {
+    description = "Fast RFC3339 compliant Python date-time library";
+    homepage = "https://github.com/freach/udatetime";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ globin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ueagle/default.nix b/nixpkgs/pkgs/development/python-modules/ueagle/default.nix
new file mode 100644
index 000000000000..fc61123377aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ueagle/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "ueagle";
+  version = "0.0.2";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jcalbert";
+    repo = "uEagle";
+    rev = version;
+    sha256 = "1hxwk5alalvmhc31y917dxsnbiwq1xci2krma3235581319xr3w7";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "uEagle" ];
+
+  meta = with lib; {
+    description = "Python library Rainforest EAGLE devices";
+    homepage = "https://github.com/jcalbert/uEagle";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ueberzug/default.nix b/nixpkgs/pkgs/development/python-modules/ueberzug/default.nix
new file mode 100644
index 000000000000..69cc04ee2d9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ueberzug/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi, isPy27
+, libX11, libXext
+, attrs, docopt, pillow, psutil, xlib }:
+
+buildPythonPackage rec {
+  pname = "ueberzug";
+  version = "18.1.9";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "7ce49f351132c7d1b0f8097f6e4c5635376151ca59318540da3e296e5b21adc3";
+  };
+
+  buildInputs = [ libX11 libXext ];
+
+  propagatedBuildInputs = [ attrs docopt pillow psutil xlib ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [ "ueberzug" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/seebye/ueberzug";
+    description = "An alternative for w3mimgdisplay";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ Br1ght0ne ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ufmt/default.nix b/nixpkgs/pkgs/development/python-modules/ufmt/default.nix
new file mode 100644
index 000000000000..cc510c0fa76f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ufmt/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, black
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, flit-core
+, libcst
+, moreorless
+, pythonOlder
+, tomlkit
+, trailrunner
+, typing-extensions
+, unittestCheckHook
+, usort
+}:
+
+buildPythonPackage rec {
+  pname = "ufmt";
+  version = "2.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "omnilib";
+    repo = "ufmt";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-eQIbSC0Oxi6JD7/3o2y9f+KhT8GIiFiYiV4A3QBoWl0=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    black
+    click
+    libcst
+    moreorless
+    tomlkit
+    trailrunner
+    typing-extensions
+    usort
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ufmt"
+  ];
+
+  meta = with lib; {
+    description = "Safe, atomic formatting with black and usort";
+    homepage = "https://github.com/omnilib/ufmt";
+    changelog = "https://github.com/omnilib/ufmt/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ufo2ft/default.nix b/nixpkgs/pkgs/development/python-modules/ufo2ft/default.nix
new file mode 100644
index 000000000000..98087eaae75d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ufo2ft/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+
+# build
+, setuptools-scm
+
+# runtime
+, booleanoperations
+, cffsubr
+, compreffor
+, cu2qu
+, defcon
+, fonttools
+, skia-pathops
+, ufoLib2
+
+# tests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "ufo2ft";
+  version = "2.33.4";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-e6p/H1Vub0Ln0VhQvwsVLuD/p8uNG5oCPhfQPCTl1nY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    cu2qu
+    fonttools
+    defcon
+    compreffor
+    booleanoperations
+    cffsubr
+    ufoLib2
+    skia-pathops
+  ]
+  ++ fonttools.optional-dependencies.lxml
+  ++ fonttools.optional-dependencies.ufo;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    # Do not depend on skia.
+    "--deselect=tests/integration_test.py::IntegrationTest::test_removeOverlaps_CFF_pathops"
+    "--deselect=tests/integration_test.py::IntegrationTest::test_removeOverlaps_pathops"
+    "--deselect=tests/preProcessor_test.py::TTFPreProcessorTest::test_custom_filters_as_argument"
+    "--deselect=tests/preProcessor_test.py::TTFInterpolatablePreProcessorTest::test_custom_filters_as_argument"
+  ];
+
+  pythonImportsCheck = [ "ufo2ft" ];
+
+  meta = with lib; {
+    description = "Bridge from UFOs to FontTools objects";
+    homepage = "https://github.com/googlefonts/ufo2ft";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ufo2ft/fonttools-cu2qu.patch b/nixpkgs/pkgs/development/python-modules/ufo2ft/fonttools-cu2qu.patch
new file mode 100644
index 000000000000..56aba78b5b31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ufo2ft/fonttools-cu2qu.patch
@@ -0,0 +1,130 @@
+From eb63747509b2c18793b95eb12cc0141277520798 Mon Sep 17 00:00:00 2001
+From: Simon Cozens <simon@simon-cozens.org>
+Date: Thu, 11 Feb 2021 09:43:41 +0000
+Subject: [PATCH 1/2] Rename cu2qu to fontTools.cu2qu
+
+---
+ Lib/ufo2ft/filters/cubicToQuadratic.py | 4 ++--
+ Lib/ufo2ft/preProcessor.py             | 4 ++--
+ setup.py                               | 1 -
+ tests/outlineCompiler_test.py          | 2 +-
+ tests/preProcessor_test.py             | 2 +-
+ 5 files changed, 6 insertions(+), 7 deletions(-)
+
+diff --git a/Lib/ufo2ft/filters/cubicToQuadratic.py b/Lib/ufo2ft/filters/cubicToQuadratic.py
+index 87d81b1..4b77144 100644
+--- a/Lib/ufo2ft/filters/cubicToQuadratic.py
++++ b/Lib/ufo2ft/filters/cubicToQuadratic.py
+@@ -1,7 +1,7 @@
+ import logging
+ 
+-from cu2qu.pens import Cu2QuPointPen
+-from cu2qu.ufo import CURVE_TYPE_LIB_KEY, DEFAULT_MAX_ERR
++from fontTools.pens.cu2quPen import Cu2QuPointPen
++from fontTools.cu2qu.ufo import CURVE_TYPE_LIB_KEY, DEFAULT_MAX_ERR
+ 
+ from ufo2ft.filters import BaseFilter
+ from ufo2ft.fontInfoData import getAttrWithFallback
+diff --git a/Lib/ufo2ft/preProcessor.py b/Lib/ufo2ft/preProcessor.py
+index e239152..9463aea 100644
+--- a/Lib/ufo2ft/preProcessor.py
++++ b/Lib/ufo2ft/preProcessor.py
+@@ -267,7 +267,7 @@ class TTFInterpolatablePreProcessor:
+         skipExportGlyphs=None,
+         filters=None,
+     ):
+-        from cu2qu.ufo import DEFAULT_MAX_ERR
++        from fontTools.cu2qu.ufo import DEFAULT_MAX_ERR
+ 
+         self.ufos = ufos
+         self.inplace = inplace
+@@ -304,7 +304,7 @@ class TTFInterpolatablePreProcessor:
+         self.postFilters = [[f for f in filters if not f.pre] for filters in filterses]
+ 
+     def process(self):
+-        from cu2qu.ufo import fonts_to_quadratic
++        from fontTools.cu2qu.ufo import fonts_to_quadratic
+ 
+         needs_decomposition = set()
+ 
+diff --git a/setup.py b/setup.py
+index d8d9982..a165ab1 100644
+--- a/setup.py
++++ b/setup.py
+@@ -30,7 +30,6 @@ setup(
+     tests_require=["pytest>=2.8"],
+     install_requires=[
+         "fonttools[ufo]>=4.34.0",
+-        "cu2qu>=1.6.7",
+         "cffsubr>=0.2.8",
+         "booleanOperations>=0.9.0",
+     ],
+diff --git a/tests/outlineCompiler_test.py b/tests/outlineCompiler_test.py
+index b31319c..ee51920 100644
+--- a/tests/outlineCompiler_test.py
++++ b/tests/outlineCompiler_test.py
+@@ -2,7 +2,7 @@ import logging
+ import os
+ 
+ import pytest
+-from cu2qu.ufo import font_to_quadratic
++from fontTools.cu2qu.ufo import font_to_quadratic
+ from fontTools.ttLib import TTFont
+ from fontTools.ttLib.tables._g_l_y_f import USE_MY_METRICS
+ 
+diff --git a/tests/preProcessor_test.py b/tests/preProcessor_test.py
+index 11196f8..bc32d55 100644
+--- a/tests/preProcessor_test.py
++++ b/tests/preProcessor_test.py
+@@ -2,7 +2,7 @@ import logging
+ import os
+ 
+ import pytest
+-from cu2qu.ufo import CURVE_TYPE_LIB_KEY
++from fontTools.cu2qu.ufo import CURVE_TYPE_LIB_KEY
+ from fontTools import designspaceLib
+ 
+ import ufo2ft
+-- 
+2.36.1
+
+From 58f3ab5e5db8090aba10fefd58ad8df4b507e7c3 Mon Sep 17 00:00:00 2001
+From: Simon Cozens <simon@simon-cozens.org>
+Date: Thu, 11 Feb 2021 09:49:28 +0000
+Subject: [PATCH 2/2] Sort the imports
+
+---
+ Lib/ufo2ft/filters/cubicToQuadratic.py | 2 +-
+ tests/preProcessor_test.py             | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/Lib/ufo2ft/filters/cubicToQuadratic.py b/Lib/ufo2ft/filters/cubicToQuadratic.py
+index 4b77144..5f28ea4 100644
+--- a/Lib/ufo2ft/filters/cubicToQuadratic.py
++++ b/Lib/ufo2ft/filters/cubicToQuadratic.py
+@@ -1,7 +1,7 @@
+ import logging
+ 
+-from fontTools.pens.cu2quPen import Cu2QuPointPen
+ from fontTools.cu2qu.ufo import CURVE_TYPE_LIB_KEY, DEFAULT_MAX_ERR
++from fontTools.pens.cu2quPen import Cu2QuPointPen
+ 
+ from ufo2ft.filters import BaseFilter
+ from ufo2ft.fontInfoData import getAttrWithFallback
+diff --git a/tests/preProcessor_test.py b/tests/preProcessor_test.py
+index bc32d55..41c579c 100644
+--- a/tests/preProcessor_test.py
++++ b/tests/preProcessor_test.py
+@@ -2,8 +2,8 @@ import logging
+ import os
+ 
+ import pytest
+-from fontTools.cu2qu.ufo import CURVE_TYPE_LIB_KEY
+ from fontTools import designspaceLib
++from fontTools.cu2qu.ufo import CURVE_TYPE_LIB_KEY
+ 
+ import ufo2ft
+ from ufo2ft.constants import (
+-- 
+2.36.1
+
diff --git a/nixpkgs/pkgs/development/python-modules/ufoLib2/default.nix b/nixpkgs/pkgs/development/python-modules/ufoLib2/default.nix
new file mode 100644
index 000000000000..c2fef2e4656a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ufoLib2/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, attrs
+, fonttools
+, pytestCheckHook
+, setuptools-scm
+
+# optionals
+, cattrs
+, lxml
+, orjson
+, msgpack
+}:
+
+buildPythonPackage rec {
+  pname = "ufoLib2";
+  version = "0.16.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-SfDcf3LMrP5/rv4NU9N5cdRWZNiwVj7zaVb6e/pVor0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    fonttools
+  ] ++ fonttools.optional-dependencies.ufo;
+
+  passthru.optional-dependencies = {
+    lxml = [ lxml ];
+    converters = [ cattrs ];
+    json = [ cattrs orjson ];
+    msgpack = [ cattrs msgpack ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [ "ufoLib2" ];
+
+  meta = with lib; {
+    description = "Library to deal with UFO font sources";
+    homepage = "https://github.com/fonttools/ufoLib2";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ufonormalizer/default.nix b/nixpkgs/pkgs/development/python-modules/ufonormalizer/default.nix
new file mode 100644
index 000000000000..dbc02750de9a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ufonormalizer/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder, setuptools-scm }:
+
+buildPythonPackage rec {
+  pname = "ufonormalizer";
+  version = "0.6.1";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e61110e75a500083f265385b1354b578610f9542e3bbbeedb98a2a6155e4aa6c";
+    extension = "zip";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  meta = with lib; {
+    description = "Script to normalize the XML and other data inside of a UFO";
+    homepage = "https://github.com/unified-font-object/ufoNormalizer";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.sternenseemann ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ufoprocessor/default.nix b/nixpkgs/pkgs/development/python-modules/ufoprocessor/default.nix
new file mode 100644
index 000000000000..540aadd90132
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ufoprocessor/default.nix
@@ -0,0 +1,44 @@
+{ lib, buildPythonPackage, fetchPypi
+, defcon, fonttools, lxml, fs
+, mutatormath, fontmath, fontparts
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "ufoProcessor";
+  version = "1.9.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ns11aamgavgsfj8qf5kq7dvzmgl0mhr1cbych2f075ipfdvva5s";
+    extension = "zip";
+  };
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  propagatedBuildInputs = [
+    defcon
+    lxml
+    fonttools
+    fs
+    fontmath
+    fontparts
+    mutatormath
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    for t in Tests/*.py; do
+      # https://github.com/LettError/ufoProcessor/issues/32
+      [[ "$(basename "$t")" = "tests_fp.py" ]] || python "$t"
+    done
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Read, write and generate UFOs with designspace data";
+    homepage = "https://github.com/LettError/ufoProcessor";
+    license = licenses.mit;
+    maintainers = [ maintainers.sternenseemann ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uharfbuzz/default.nix b/nixpkgs/pkgs/development/python-modules/uharfbuzz/default.nix
new file mode 100644
index 000000000000..34bb5fef6df4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uharfbuzz/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, cython
+, setuptools-scm
+, pytestCheckHook
+, ApplicationServices
+}:
+
+buildPythonPackage rec {
+  pname = "uharfbuzz";
+  version = "0.37.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "harfbuzz";
+    repo = "uharfbuzz";
+    rev = "refs/tags/v${version}";
+    fetchSubmodules = true;
+    hash = "sha256-876gFYyMqeGYoXMdBguV6bi7DJKHJs9HNLw9xRu+Mxk=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    cython
+    setuptools-scm
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [ ApplicationServices ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "uharfbuzz" ];
+
+  meta = with lib; {
+    description = "Streamlined Cython bindings for the harfbuzz shaping engine";
+    homepage = "https://github.com/harfbuzz/uharfbuzz";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uhi/default.nix b/nixpkgs/pkgs/development/python-modules/uhi/default.nix
new file mode 100644
index 000000000000..774ff6f27312
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uhi/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, hatchling
+, hatch-vcs
+, numpy
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "uhi";
+  version = "0.4.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-DctrGXdQh9OKMe44jLLHDy7P4ExP/iymMiNBDK5b7vo=";
+  };
+
+  buildInputs = [
+    hatchling
+    hatch-vcs
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Universal Histogram Interface";
+    homepage = "https://uhi.readthedocs.io/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ujson/default.nix b/nixpkgs/pkgs/development/python-modules/ujson/default.nix
new file mode 100644
index 000000000000..9816c88f3e6b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ujson/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "ujson";
+  version = "5.8.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-eOMY3vSt6JikYbPZKnn5RB5+Dk0q1UGavtQzbXAsdCU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "ujson" ];
+
+  meta = with lib; {
+    description = "Ultra fast JSON encoder and decoder";
+    homepage = "https://github.com/ultrajson/ultrajson";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ukkonen/default.nix b/nixpkgs/pkgs/development/python-modules/ukkonen/default.nix
new file mode 100644
index 000000000000..5ea0930d7d89
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ukkonen/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, cffi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ukkonen";
+  version = "1.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "asottile";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "jG6VP/P5sadrdrmneH36/ExSld9blyMAAG963QS9+p0=";
+  };
+
+  nativeBuildInputs = [
+    cffi
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ukkonen"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of bounded Levenshtein distance (Ukkonen)";
+    homepage = "https://github.com/asottile/ukkonen";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ukpostcodeparser/default.nix b/nixpkgs/pkgs/development/python-modules/ukpostcodeparser/default.nix
new file mode 100644
index 000000000000..a2c452046ab9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ukpostcodeparser/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "UkPostcodeParser";
+  version = "1.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "930264efa293db80af0103a4fe9c161b06365598d24bb6fe5403f3f57c70530e";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "UK Postcode parser";
+    homepage    = "https://github.com/hamstah/ukpostcodeparser";
+    license     = licenses.publicDomain;
+    maintainers = with maintainers; [ siddharthist ];
+    platforms   = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ukrainealarm/default.nix b/nixpkgs/pkgs/development/python-modules/ukrainealarm/default.nix
new file mode 100644
index 000000000000..4cd4d2a852a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ukrainealarm/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+
+# build time
+, setuptools-scm
+
+# propagates
+, aiohttp
+
+# tests
+, pytestCheckHook
+}:
+
+let
+  pname = "ukrainealarm";
+  version = "0.0.1";
+in
+
+buildPythonPackage {
+  inherit pname version;
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "PaulAnnekov";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-0gsxXQiSkJIM/I0VYsjdCCB3NjPr6QJbD/rBkGrwtW8=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "ukrainealarm"
+    "ukrainealarm.client"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/PaulAnnekov/ukrainealarm/releases/tag/v${version}";
+    description = "Implements api.ukrainealarm.com API that returns info about Ukraine air raid alarms";
+    homepage = "https://github.com/PaulAnnekov/ukrainealarm";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/ulid-transform/default.nix b/nixpkgs/pkgs/development/python-modules/ulid-transform/default.nix
new file mode 100644
index 000000000000..95b765bd3e60
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ulid-transform/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, cython
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "ulid-transform";
+  version = "0.9.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-r9uxPXpmQSsL1rX4d9TH87olFbZugdGdNG++Ygjie1I=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    poetry-core
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=ulid_transform --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "ulid_transform"
+  ];
+
+  meta = with lib; {
+    description = "Library to create and transform ULIDs";
+    homepage = "https://github.com/bdraco/ulid-transform";
+    changelog = "https://github.com/bdraco/ulid-transform/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ultraheat-api/default.nix b/nixpkgs/pkgs/development/python-modules/ultraheat-api/default.nix
new file mode 100644
index 000000000000..b478c7c6c0ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ultraheat-api/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyserial
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "ultraheat-api";
+  version = "0.5.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "ultraheat_api";
+    inherit version;
+    hash = "sha256-rRQTjV9hyUawMaXBgUx/d6pQjM8ffjcFJE2x08Cf4Gw=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+  ];
+
+  # Source is not tagged, only PyPI releases
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ultraheat_api"
+  ];
+
+  meta = with lib; {
+    description = "Module for working with data from Landis+Gyr Ultraheat heat meter unit";
+    homepage = "https://github.com/vpathuis/uh50";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/umalqurra/default.nix b/nixpkgs/pkgs/development/python-modules/umalqurra/default.nix
new file mode 100644
index 000000000000..0e1b4c681e5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/umalqurra/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "umalqurra";
+  version = "0.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "719f6a36f908ada1c29dae0d934dd0f1e1f6e3305784edbec23ad719397de678";
+  };
+
+  # No tests included
+  doCheck = false;
+
+  # See for license
+  # https://github.com/tytkal/python-hijiri-ummalqura/issues/4
+  meta = with lib; {
+    description = "Date Api that support Hijri Umalqurra calendar";
+    homepage = "https://github.com/tytkal/python-hijiri-ummalqura";
+    license = with licenses; [ publicDomain ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/umap-learn/default.nix b/nixpkgs/pkgs/development/python-modules/umap-learn/default.nix
new file mode 100644
index 000000000000..e68d0be6ad35
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/umap-learn/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, keras
+, numba
+, numpy
+, pynndescent
+, pytestCheckHook
+, pythonOlder
+, scikit-learn
+, scipy
+, tensorflow
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "umap-learn";
+  version = "0.5.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "lmcinnes";
+    repo = "umap";
+    rev = "refs/tags/release-${version}";
+    hash = "sha256-bXAQjq7xBYn34tIZF96Sr5jDUii3s4FGkNx65rGKXkY=";
+  };
+
+  propagatedBuildInputs = [
+    numba
+    numpy
+    pynndescent
+    scikit-learn
+    scipy
+    tqdm
+  ];
+
+  nativeCheckInputs = [
+    keras
+    pytestCheckHook
+    tensorflow
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  disabledTests = [
+    # Plot functionality requires additional packages.
+    # These test also fail with 'RuntimeError: cannot cache function' error.
+    "test_umap_plot_testability"
+    "test_plot_runs_at_all"
+
+    # Flaky test. Fails with AssertionError sometimes.
+    "test_sparse_hellinger"
+    "test_densmap_trustworthiness_on_iris_supervised"
+
+    # tensorflow maybe incompatible? https://github.com/lmcinnes/umap/issues/821
+    "test_save_load"
+  ];
+
+  meta = with lib; {
+    description = "Uniform Manifold Approximation and Projection";
+    homepage = "https://github.com/lmcinnes/umap";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/umodbus/default.nix b/nixpkgs/pkgs/development/python-modules/umodbus/default.nix
new file mode 100644
index 000000000000..7ce499734203
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/umodbus/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "umodbus";
+  version = "1.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "AdvancedClimateSystems";
+    repo = "uModbus";
+    rev = "refs/tags/${version}";
+    hash = "sha256-5IXadb5mjrMwr+L9S1iMN5kba5VGrzYt1p8nBvvLCh4=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "umodbus"
+  ];
+
+  meta = with lib; {
+    description = "Implementation of the Modbus protocol";
+    homepage = "https://github.com/AdvancedClimateSystems/uModbus/";
+    license = with licenses; [ mpl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unasync/default.nix b/nixpkgs/pkgs/development/python-modules/unasync/default.nix
new file mode 100644
index 000000000000..d6e8c99510e4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unasync/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "unasync";
+  version = "0.5.0";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "python-trio";
+    repo = "unasync";
+    rev = "v${version}";
+    sha256 = "0h86i09v4909a8nk5lp36jlwz6rsln6vyg3d0i13ykxa6lrx1c2l";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # mess with $PYTHONPATH
+    "test_build_py_modules"
+    "test_build_py_packages"
+    "test_project_structure_after_build_py_packages"
+    "test_project_structure_after_customized_build_py_packages"
+  ];
+
+  pythonImportsCheck = [ "unasync" ];
+
+  meta = with lib; {
+    description = "Project that can transform your asynchronous code into synchronous code";
+    homepage = "https://github.com/python-trio/unasync";
+    license = with licenses; [ mit /* or */ asl20 ];
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uncertainties/default.nix b/nixpkgs/pkgs/development/python-modules/uncertainties/default.nix
new file mode 100644
index 000000000000..bf08374ece23
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uncertainties/default.nix
@@ -0,0 +1,27 @@
+{ lib, fetchPypi, buildPythonPackage
+, nose, numpy, future
+}:
+
+buildPythonPackage rec {
+  pname = "uncertainties";
+  version = "3.1.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gBEeCDnyOcWyM8tHcgF7SDoLehVzpYG5Krd0ajXm+qs=";
+  };
+
+  propagatedBuildInputs = [ future ];
+  nativeCheckInputs = [ nose numpy ];
+
+  checkPhase = ''
+    nosetests -sv
+  '';
+
+  meta = with lib; {
+    homepage = "https://pythonhosted.org/uncertainties/";
+    description = "Transparent calculations with uncertainties on the quantities involved (aka error propagation)";
+    maintainers = with maintainers; [ rnhmjoj ];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uncompyle6/default.nix b/nixpkgs/pkgs/development/python-modules/uncompyle6/default.nix
new file mode 100644
index 000000000000..16be16d443ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uncompyle6/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonAtLeast
+, spark_parser
+, xdis
+, nose
+, pytest
+, hypothesis
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "uncompyle6";
+  version = "3.9.0";
+  disabled = pythonAtLeast "3.9"; # See: https://github.com/rocky/python-uncompyle6/issues/331
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-HmqQLeYOpcP30q9+J0UAa05Lm97eiIoH+EQcmTjy7n0=";
+  };
+
+  nativeCheckInputs = [ nose pytest hypothesis six ];
+  propagatedBuildInputs = [ spark_parser xdis ];
+
+  # six import errors (yet it is supplied...)
+  checkPhase = ''
+    runHook preCheck
+    pytest ./pytest --ignore=pytest/test_function_call.py
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Python cross-version byte-code deparser";
+    homepage = "https://github.com/rocky/python-uncompyle6/";
+    license = licenses.gpl3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unearth/default.nix b/nixpkgs/pkgs/development/python-modules/unearth/default.nix
new file mode 100644
index 000000000000..7af5740fe315
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unearth/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, cached-property
+, packaging
+, pdm-backend
+, requests
+, flask
+, pytest-httpserver
+, pytestCheckHook
+, requests-wsgi-adapter
+, trustme
+}:
+
+buildPythonPackage rec {
+  pname = "unearth";
+  version = "0.12.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-TKrZQbYPUeUP3BCYZiNNQHkQrvd/EjOqG2tdFox0J+4=";
+  };
+
+  nativeBuildInputs = [
+    pdm-backend
+  ];
+
+  propagatedBuildInputs = [
+    packaging
+    requests
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    cached-property
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    flask
+    pytest-httpserver
+    pytestCheckHook
+    requests-wsgi-adapter
+    trustme
+  ];
+
+  pythonImportsCheck = [
+    "unearth"
+  ];
+
+  meta = with lib; {
+    description = "A utility to fetch and download Python packages";
+    homepage = "https://github.com/frostming/unearth";
+    changelog = "https://github.com/frostming/unearth/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ betaboon ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unicode-slugify/default.nix b/nixpkgs/pkgs/development/python-modules/unicode-slugify/default.nix
new file mode 100644
index 000000000000..1a4ccb1ee7d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unicode-slugify/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nose
+, six
+, unidecode
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "unicode-slugify";
+  version = "0.1.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "25f424258317e4cb41093e2953374b3af1f23097297664731cdb3ae46f6bd6c3";
+  };
+
+  propagatedBuildInputs = [ six unidecode ];
+
+  nativeCheckInputs = [
+    nose
+    unittestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Generates unicode slugs";
+    homepage = "https://pypi.org/project/unicode-slugify/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ mmai ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unicodecsv/default.nix b/nixpkgs/pkgs/development/python-modules/unicodecsv/default.nix
new file mode 100644
index 000000000000..ede2b0d3f093
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unicodecsv/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  version = "0.14.1";
+  pname = "unicodecsv";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1z7pdwkr6lpsa7xbyvaly7pq3akflbnz8gq62829lr28gl1hi301";
+  };
+
+  # ImportError: No module named runtests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Drop-in replacement for Python2's stdlib csv module, with unicode support";
+    homepage = "https://github.com/jdunck/python-unicodecsv";
+    maintainers = with maintainers; [ koral ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unicodedata2/default.nix b/nixpkgs/pkgs/development/python-modules/unicodedata2/default.nix
new file mode 100644
index 000000000000..972aa3093a8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unicodedata2/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "unicodedata2";
+  version = "15.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit version pname;
+    hash = "sha256-yzDxia1mSC+FKaRdpxsqiEHpvSuzdswpMwA6SlWgdkg=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "unicodedata2"
+  ];
+
+  meta = with lib; {
+    description = "Backport and updates for the unicodedata module";
+    homepage = "https://github.com/mikekap/unicodedata2";
+    changelog = "https://github.com/fonttools/unicodedata2/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ sternenseemann ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unicorn/default.nix b/nixpkgs/pkgs/development/python-modules/unicorn/default.nix
new file mode 100644
index 000000000000..c1f17ce880a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unicorn/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, setuptools
+, unicorn-emu
+}:
+
+buildPythonPackage rec {
+  pname = "unicorn";
+  version = lib.getVersion unicorn-emu;
+  format = "setuptools";
+
+  src = unicorn-emu.src;
+
+  sourceRoot = "${src.name}/bindings/python";
+
+  prePatch = ''
+    ln -s ${unicorn-emu}/lib/libunicorn.* prebuilt/
+  '';
+
+  # needed on non-x86 linux
+  setupPyBuildFlags = lib.optionals stdenv.isLinux [ "--plat-name" "linux" ]
+                   # aarch64 only available from MacOS SDK 11 onwards, so fix the version tag.
+                   # otherwise, bdist_wheel may detect "macosx_10_6_arm64" which doesn't make sense.
+                   ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [ "--plat-name" "macosx_11_0" ];
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+
+    mv unicorn unicorn.hidden
+    patchShebangs sample_*.py shellcode.py
+    sh -e sample_all.sh
+
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "unicorn"
+  ];
+
+  meta = with lib; {
+    description = "Python bindings for Unicorn CPU emulator engine";
+    homepage = "https://www.unicorn-engine.org/";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ bennofs ris ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unicrypto/default.nix b/nixpkgs/pkgs/development/python-modules/unicrypto/default.nix
new file mode 100644
index 000000000000..5167bc849469
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unicrypto/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pycryptodome
+, pycryptodomex
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "unicrypto";
+  version = "0.0.10";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "skelsec";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-mZEnYVM5r4utiGwM7bp2SwaDjYsH8AR/Qm5UdPNke0w=";
+  };
+
+  propagatedBuildInputs = [
+    pycryptodome
+    pycryptodomex
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "unicrypto"
+  ];
+
+  meta = with lib; {
+    description = "Unified interface for cryptographic libraries";
+    homepage = "https://github.com/skelsec/unicrypto";
+    changelog = "https://github.com/skelsec/unicrypto/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unicurses/default.nix b/nixpkgs/pkgs/development/python-modules/unicurses/default.nix
new file mode 100644
index 000000000000..0d4f75264ca2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unicurses/default.nix
@@ -0,0 +1,31 @@
+{ lib, buildPythonPackage, fetchPypi, ncurses, x256 }:
+
+buildPythonPackage rec {
+  pname = "unicurses";
+  version = "2.1.3";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "Uni-Curses";
+    hash = "sha256-uzSiF0jAZzI0iZngM/GuJ60o+UbLQ5XQzycTPito34w=";
+  };
+
+  propagatedBuildInputs = [ x256 ];
+
+  # Necessary because ctypes.util.find_library does not find the ncurses libraries
+  postPatch = ''
+    substituteInPlace './unicurses/__init__.py' \
+      --replace "find_library('ncursesw')" '"${ncurses}/lib/libncursesw.so.6"' \
+      --replace "find_library('panelw')" '"${ncurses}/lib/libpanelw.so.6"'
+  '';
+
+  pythonImportsCheck = [ "unicurses" ];
+
+  meta = with lib; {
+    description = "Unified Curses Wrapper for Python";
+    homepage = "https://github.com/unicurses/unicurses";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ michaelBelsanti ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unidecode/default.nix b/nixpkgs/pkgs/development/python-modules/unidecode/default.nix
new file mode 100644
index 000000000000..5fcf87e9ced9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unidecode/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "unidecode";
+  version = "1.3.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "avian2";
+    repo = pname;
+    rev = "${pname}-${version}";
+    hash = "sha256-75E2OlrGIxvwR9MeZEB4bDLdFd1SdprCVcBIJCPS3hM=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "unidecode"
+  ];
+
+  meta = with lib; {
+    description = "ASCII transliterations of Unicode text";
+    homepage = "https://github.com/avian2/unidecode";
+    changelog = "https://github.com/avian2/unidecode/blob/unidecode-${version}/ChangeLog";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unidic-lite/default.nix b/nixpkgs/pkgs/development/python-modules/unidic-lite/default.nix
new file mode 100644
index 000000000000..eec9c7022a0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unidic-lite/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "unidic-lite";
+  version = "1.0.8";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0idj4yp0sl27ylr2wzkybbh0wj7c843lp7cljw5d1m7xv5r4b7fv";
+  };
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "unidic_lite"
+  ];
+
+  meta = with lib; {
+    description = "A small version of UniDic";
+    homepage = "https://github.com/polm/unidic-lite";
+    license = licenses.mit;
+    maintainers = teams.tts.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unidic/default.nix b/nixpkgs/pkgs/development/python-modules/unidic/default.nix
new file mode 100644
index 000000000000..c138ea8e8d0c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unidic/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, mecab
+, setuptools-scm
+, requests
+, tqdm
+, wasabi
+, plac
+, cython
+, platformdirs
+}:
+
+buildPythonPackage rec {
+  pname = "unidic";
+  version = "1.1.0";
+  format = "setuptools";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "polm";
+    repo = "unidic-py";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-srhQDXGgoIMhYuCbyQB3kF4LrODnoOqLbjBQMvhPieY=";
+  };
+
+  patches = [ ./fix-download-directory.patch ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "wasabi>=0.6.0,<1.0.0" "wasabi"
+  '';
+
+  # no tests
+  doCheck = false;
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  propagatedBuildInputs = [ requests tqdm wasabi plac platformdirs ];
+
+  nativeBuildInputs = [ cython mecab setuptools-scm ];
+
+  pythonImportsCheck = [ "unidic" ];
+
+  meta = with lib; {
+    description = "Contemporary Written Japanese dictionary";
+    homepage = "https://github.com/polm/unidic-py";
+    license = licenses.mit;
+    maintainers = with maintainers; [ laurent-f1z1 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unidic/fix-download-directory.patch b/nixpkgs/pkgs/development/python-modules/unidic/fix-download-directory.patch
new file mode 100644
index 000000000000..d7e106072979
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unidic/fix-download-directory.patch
@@ -0,0 +1,23 @@
+diff --git a/unidic/download.py b/unidic/download.py
+index 445ce55..d488bd6 100644
+--- a/unidic/download.py
++++ b/unidic/download.py
+@@ -6,6 +6,8 @@ import sys
+ from wasabi import msg
+ from urllib.request import urlretrieve
+ from tqdm import tqdm
++from platformdirs import user_cache_dir
++from pathlib import Path
+ 
+ # This is used to show progress when downloading.
+ # see here: https://github.com/tqdm/tqdm#hooks-and-callbacks
+@@ -56,7 +58,8 @@ def download_and_clean(version, url, dirname='unidic', delfiles=[]):
+     This downloads the zip file from the source, extracts it, renames the
+     resulting directory, and removes large files not used at runtime.  
+     """
+-    cdir = os.path.dirname(os.path.abspath(__file__))
++    cdir = Path(user_cache_dir('unidic-py'))
++    cdir.mkdir(parents=True, exist_ok=True)
+     fname = os.path.join(cdir, 'unidic.zip')
+     print("Downloading UniDic v{}...".format(version), file=sys.stderr)
+     download_progress(url, fname)
diff --git a/nixpkgs/pkgs/development/python-modules/unidiff/default.nix b/nixpkgs/pkgs/development/python-modules/unidiff/default.nix
new file mode 100644
index 000000000000..85ec596a8912
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unidiff/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, unittestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "unidiff";
+  version = "0.7.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "2e5f0162052248946b9f0970a40e9e124236bf86c82b70821143a6fc1dea2574";
+  };
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  unittestFlagsArray = [ "-s" "tests" ];
+
+  pythonImportsCheck = [ "unidiff" ];
+
+  meta = with lib; {
+    description = "Unified diff python parsing/metadata extraction library";
+    homepage = "https://github.com/matiasb/python-unidiff";
+    changelog = "https://github.com/matiasb/python-unidiff/raw/v${version}/HISTORY";
+    license = licenses.mit;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unifi-discovery/default.nix b/nixpkgs/pkgs/development/python-modules/unifi-discovery/default.nix
new file mode 100644
index 000000000000..cd53dae36822
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unifi-discovery/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pyroute2
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "unifi-discovery";
+  version = "1.1.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-EQFk3kRY/JL1ZTDdHKzl0KbMUuhZSFc4tYqAYvsNSj0=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pyroute2
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=auto"
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov=unifi_discovery --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "unifi_discovery"
+  ];
+
+  meta = with lib; {
+    description = "Module to discover Unifi devices";
+    homepage = "https://github.com/bdraco/unifi-discovery";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unifi/default.nix b/nixpkgs/pkgs/development/python-modules/unifi/default.nix
new file mode 100644
index 000000000000..fc98695dd6fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unifi/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage
+, fetchPypi, urllib3 }:
+
+buildPythonPackage rec {
+  pname = "unifi";
+  version = "1.2.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0prgx01hzs49prrazgxrinm7ivqzy57ch06qm2h7s1p957sazds8";
+  };
+
+  propagatedBuildInputs = [ urllib3 ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "An API towards the Ubiquity Networks UniFi controller";
+    homepage    = "https://pypi.python.org/pypi/unifi/";
+    license     = licenses.mit;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unifiled/default.nix b/nixpkgs/pkgs/development/python-modules/unifiled/default.nix
new file mode 100644
index 000000000000..68fa57165df2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unifiled/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "unifiled";
+  version = "1.1";
+
+  src = fetchFromGitHub {
+    owner = "florisvdk";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1nmqxxhwa0isxdb889nhbp7w4axj1mcrwd3pr9d8nhpw4yj9h3vq";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    urllib3
+  ];
+
+  # Project doesn't have any tests
+  doCheck = false;
+  pythonImportsCheck = [ "unifiled" ];
+
+  meta = with lib; {
+    description = "Python module for Ubiquiti Unifi LED controller";
+    homepage = "https://github.com/florisvdk/unifiled";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unify/default.nix b/nixpkgs/pkgs/development/python-modules/unify/default.nix
new file mode 100644
index 000000000000..1935374d37e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unify/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, untokenize
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "unify";
+  version = "0.5";
+
+  # PyPi release is missing tests (see https://github.com/myint/unify/pull/18)
+  src = fetchFromGitHub {
+    owner = "myint";
+    repo = "unify";
+    rev = "v${version}";
+    sha256 = "1l6xxygaigacsxf0g5f7w5gpqha1ava6mcns81kqqy6vw91pyrbi";
+  };
+
+  propagatedBuildInputs = [ untokenize ];
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  meta = with lib; {
+    description = "Modifies strings to all use the same quote where possible";
+    homepage = "https://github.com/myint/unify";
+    license = licenses.mit;
+    maintainers = with maintainers; [ FlorianFranzen ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/units/default.nix b/nixpkgs/pkgs/development/python-modules/units/default.nix
new file mode 100644
index 000000000000..8e9742d2f6a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/units/default.nix
@@ -0,0 +1,21 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "units";
+  version = "0.07";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "43eb3e073e1b11289df7b1c3f184b5b917ccad178b717b03933298716f200e14";
+  };
+
+  meta = with lib; {
+    description = "Python support for quantities with units";
+    homepage = "https://bitbucket.org/adonohue/units/";
+    license = licenses.psfl;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unittest-data-provider/default.nix b/nixpkgs/pkgs/development/python-modules/unittest-data-provider/default.nix
new file mode 100644
index 000000000000..67a3cf313aec
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unittest-data-provider/default.nix
@@ -0,0 +1,21 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  version = "1.0.1";
+  pname = "unittest-data-provider";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1gn2ka4vqpayx4cpbp8712agqjh3wdpk9smdxnp709ccc2v7zg46";
+  };
+
+  meta = with lib; {
+    description = "PHPUnit-like @dataprovider decorator for unittest";
+    homepage = "https://github.com/yourlabs/unittest-data-provider";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unittest-xml-reporting/default.nix b/nixpkgs/pkgs/development/python-modules/unittest-xml-reporting/default.nix
new file mode 100644
index 000000000000..be25e21a43f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unittest-xml-reporting/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, lxml
+, pythonAtLeast
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "unittest-xml-reporting";
+  version = "3.2.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "xmlrunner";
+    repo = "unittest-xml-reporting";
+    rev = version;
+    hash = "sha256-lOJ/+8CVJUXdIaZLLF5PpPkG0DzlNgo46kRZ1Xy7Ju0=";
+  };
+
+  propagatedBuildInputs = [
+    lxml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = lib.optionals (pythonAtLeast "3.11") [
+    # AttributeError: 'tuple' object has no attribute 'shortDescription'
+    "--deselect=tests/testsuite.py::XMLTestRunnerTestCase::test_basic_unittest_constructs"
+    "--deselect=tests/testsuite.py::XMLTestRunnerTestCase::test_unexpected_success"
+  ];
+
+  pythonImportsCheck = [ "xmlrunner" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/xmlrunner/unittest-xml-reporting";
+    description = "unittest-based test runner with Ant/JUnit like XML reporting";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ rprospero ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/univers/default.nix b/nixpkgs/pkgs/development/python-modules/univers/default.nix
new file mode 100644
index 000000000000..3308be6a9b29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/univers/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, attrs
+, buildPythonPackage
+, commoncode
+, fetchPypi
+, packaging
+, pyparsing
+, pytestCheckHook
+, pythonOlder
+, saneyaml
+, semantic-version
+, semver
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "univers";
+  version = "30.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-xyrg8B+C5xUN8zHLrMbAe/MWjZb8fCL0MIAz2w4B7/U=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    packaging
+    pyparsing
+    semantic-version
+    semver
+  ];
+
+  nativeCheckInputs = [
+    commoncode
+    pytestCheckHook
+    saneyaml
+  ];
+
+  dontConfigure = true; # ./configure tries to setup virtualenv and downloads dependencies
+
+  pythonImportsCheck = [
+    "univers"
+  ];
+
+  disabledTests = [
+    # No value for us
+    "test_codestyle"
+    # AssertionError starting with 30.10.0
+    "test_enhanced_semantic_version"
+    "test_semver_version"
+  ];
+
+  meta = with lib; {
+    description = "Library for parsing version ranges and expressions";
+    homepage = "https://github.com/nexB/univers";
+    changelog = "https://github.com/nexB/univers/blob/v${version}/CHANGELOG.rst";
+    license = with licenses; [ asl20 bsd3 mit ];
+    maintainers = with maintainers; [ armijnhemel sbruder ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/universal-pathlib/default.nix b/nixpkgs/pkgs/development/python-modules/universal-pathlib/default.nix
new file mode 100644
index 000000000000..23667d02c283
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/universal-pathlib/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, setuptools
+, setuptools-scm
+, fsspec
+}:
+
+buildPythonPackage rec {
+  pname = "universal-pathlib";
+  version = "0.1.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "universal_pathlib";
+    inherit version;
+    hash = "sha256-guXYbRaifg6hrcfYisvLqdAtWkVIgWMXT5bZrCidsuQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    fsspec
+  ];
+
+  pythonImportsCheck = [ "upath" ];
+
+  meta = with lib; {
+    description = "Pathlib api extended to use fsspec backends";
+    homepage = "https://github.com/fsspec/universal_pathlib";
+    changelog = "https://github.com/fsspec/universal_pathlib/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/universal-silabs-flasher/default.nix b/nixpkgs/pkgs/development/python-modules/universal-silabs-flasher/default.nix
new file mode 100644
index 000000000000..420b9f078c15
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/universal-silabs-flasher/default.nix
@@ -0,0 +1,73 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+
+# build-system
+, setuptools
+, setuptools-git-versioning
+, wheel
+
+# dependencies
+, async-timeout
+, bellows
+, click
+, coloredlogs
+, crc
+, libgpiod
+, typing-extensions
+, zigpy
+
+# tests
+, pytestCheckHook
+, pytest-asyncio
+, pytest-mock
+, pytest-timeout
+}:
+
+buildPythonPackage rec {
+  pname = "universal-silabs-flasher";
+  version = "0.0.14";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "NabuCasa";
+    repo = "universal-silabs-flasher";
+    rev = "v${version}";
+    hash = "sha256-0c9b571gJXFOAe5ct8O/qy7D6rDosmBHDYEv6odLQ2s=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-git-versioning
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    async-timeout
+    bellows
+    click
+    coloredlogs
+    crc
+    typing-extensions
+    zigpy
+  ] ++ lib.optionals (stdenv.hostPlatform.isLinux) [
+    libgpiod
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+    pytest-mock
+    pytest-timeout
+  ];
+
+  pythonImportsCheck = [ "universal_silabs_flasher" ];
+
+  meta = with lib; {
+    description = "Flashes Silicon Labs radios running EmberZNet or CPC multi-pan firmware";
+    homepage = "https://github.com/NabuCasa/universal-silabs-flasher";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unpaddedbase64/default.nix b/nixpkgs/pkgs/development/python-modules/unpaddedbase64/default.nix
new file mode 100644
index 000000000000..b5ff5be20616
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unpaddedbase64/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  pname = "unpaddedbase64";
+  version = "2.1.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "matrix-org";
+    repo = "python-${pname}";
+    rev = "refs/tags/v${version}";
+    sha256 = "1n6har8pxv0mqb96lanzihp1xf76aa17jw3977drb1fgz947pnmz";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/matrix-org/python-unpaddedbase64";
+    description = "Unpadded Base64";
+    license = licenses.asl20;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unrardll/default.nix b/nixpkgs/pkgs/development/python-modules/unrardll/default.nix
new file mode 100644
index 000000000000..e6d746165144
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unrardll/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, buildPythonPackage, fetchPypi, unrar }:
+
+buildPythonPackage rec {
+  pname = "unrardll";
+  version = "0.1.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-4QZ/4nu03iBO+PNpLyPZPF07QpL3iyksb8fcT3V0n3Y=";
+  };
+
+  buildInputs = [ unrar ];
+
+  NIX_CFLAGS_LINK = lib.optionalString stdenv.isDarwin "-headerpad_max_install_names";
+
+  postInstall = lib.optionalString stdenv.isDarwin ''
+    install_name_tool -change libunrar.so ${unrar}/lib/libunrar.so $out/lib/python*/site-packages/unrardll/unrar.*-darwin.so
+    install_name_tool -change libunrar.so ${unrar}/lib/libunrar.so build/lib.*/unrardll/unrar.*-darwin.so
+  '';
+
+  pythonImportsCheck = [ "unrardll" ];
+
+  meta = with lib; {
+    description = "Wrap the Unrar DLL to enable unraring of files in python";
+    homepage = "https://github.com/kovidgoyal/unrardll";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ nyanloutre ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unrpa/default.nix b/nixpkgs/pkgs/development/python-modules/unrpa/default.nix
new file mode 100644
index 000000000000..eeddbd1d6b62
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unrpa/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, uncompyle6
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "unrpa";
+  version = "2.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0yl4qdwp3in170ks98qnldqz3r2iyzil5g1775ccg98qkh95s724";
+  };
+
+  passthru.optional-dependencies = {
+    ZiX = [ uncompyle6 ];
+  };
+
+  pythonImportsCheck = [ "unrpa" ];
+
+  # upstream has no unit tests
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/Lattyware/unrpa";
+    changelog = "https://github.com/Lattyware/unrpa/releases/tag/${version}";
+    description = "A program to extract files from the RPA archive format";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ leo60228 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unstructured-api-tools/default.nix b/nixpkgs/pkgs/development/python-modules/unstructured-api-tools/default.nix
new file mode 100644
index 000000000000..b3c904ba2f24
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unstructured-api-tools/default.nix
@@ -0,0 +1,93 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+# propagated build inputs
+, click
+, fastapi
+, jinja2
+, mypy
+, nbconvert
+, python-multipart
+, pandas
+, types-requests
+, types-ujson
+, uvicorn
+, autoflake
+# native check inputs
+, pytestCheckHook
+, black
+, coverage
+, flake8
+, httpx
+, ipython
+, pytest-cov
+, requests
+, requests-toolbelt
+, nbdev
+, pytest-mock
+}:
+let
+  version = "0.10.11";
+in
+buildPythonPackage {
+  pname = "unstructured-api-tools";
+  inherit version;
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Unstructured-IO";
+    repo = "unstructured-api-tools";
+    rev = "refs/tags/${version}";
+    hash = "sha256-t1fK40ayR2bxc1iMIwvn/OHuyVlR98Gq+NpIhOmaP+4=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    fastapi
+    jinja2
+    mypy
+    nbconvert
+    python-multipart
+    pandas
+    types-requests
+    types-ujson
+    uvicorn
+    autoflake
+  ] ++ uvicorn.optional-dependencies.standard;
+
+  pythonImportsCheck = [ "unstructured_api_tools" ];
+
+  # test require file generation but it complains about a missing file mypy
+  doCheck = false;
+  # preCheck = ''
+  #   substituteInPlace Makefile \
+  #     --replace "PYTHONPATH=." "" \
+  #     --replace "mypy" "${mypy}/bin/mypy"
+  #   make generate-test-api
+  # '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    black
+    coverage
+    flake8
+    httpx
+    ipython
+    pytest-cov
+    requests
+    requests-toolbelt
+    nbdev
+    pytest-mock
+  ];
+
+  meta = with lib; {
+    description = "";
+    homepage = "https://github.com/Unstructured-IO/unstructured-api-tools";
+    changelog = "https://github.com/Unstructured-IO/unstructured-api-tools/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unstructured-inference/default.nix b/nixpkgs/pkgs/development/python-modules/unstructured-inference/default.nix
new file mode 100644
index 000000000000..549c0b6dd0f2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unstructured-inference/default.nix
@@ -0,0 +1,99 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+# runtime dependencies
+, layoutparser
+, python-multipart
+, huggingface-hub
+, opencv
+, onnxruntime
+, transformers
+, detectron2
+, paddleocr
+# check inputs
+, pytestCheckHook
+, coverage
+, click
+, httpx
+, mypy
+, pytest-cov
+, pdf2image
+}:
+
+buildPythonPackage rec {
+  pname = "unstructured-inference";
+  version = "0.7.11";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Unstructured-IO";
+    repo = "unstructured-inference";
+    rev = "refs/tags/${version}";
+    hash = "sha256-cUd1umD61xHPehutBh5pUWTLyOdn3vbgerRQmsOpuDM=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements/base.in \
+      --replace "opencv-python" "opencv"
+  '';
+
+  propagatedBuildInputs = [
+    layoutparser
+    python-multipart
+    huggingface-hub
+    opencv
+    onnxruntime
+    transformers
+    detectron2
+    paddleocr
+    # yolox
+  ]
+    ++ layoutparser.optional-dependencies.layoutmodels
+    ++ layoutparser.optional-dependencies.tesseract;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    coverage
+    click
+    httpx
+    mypy
+    pytest-cov
+    pdf2image
+    huggingface-hub
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  disabledTests = [
+    # not sure why this fails
+    "test_get_path_oob_move_deeply_nested"
+    "test_get_path_oob_move_nested[False]"
+    # requires yolox
+    "test_yolox"
+  ];
+
+  disabledTestPaths = [
+    # network access
+    "test_unstructured_inference/inference/test_layout.py"
+    "test_unstructured_inference/models/test_chippermodel.py"
+    "test_unstructured_inference/models/test_detectron2.py"
+    "test_unstructured_inference/models/test_detectron2onnx.py"
+    # unclear failure
+    "test_unstructured_inference/models/test_donut.py"
+    "test_unstructured_inference/models/test_model.py"
+    "test_unstructured_inference/models/test_tables.py"
+  ];
+
+  pythonImportsCheck = [ "unstructured_inference" ];
+
+  meta = with lib; {
+    description = "hosted model inference code for layout parsing models";
+    homepage = "https://github.com/Unstructured-IO/unstructured-inference";
+    changelog = "https://github.com/Unstructured-IO/unstructured-inference/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+    platforms = [ "x86_64-linux" "x86_64-darwin" "aarch64-darwin" ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/unstructured/default.nix b/nixpkgs/pkgs/development/python-modules/unstructured/default.nix
new file mode 100644
index 000000000000..582d0040e109
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/unstructured/default.nix
@@ -0,0 +1,145 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+# propagated build inputs
+, chardet
+, filetype
+, lxml
+, msg-parser
+, nltk
+, openpyxl
+, pandas
+, pdf2image
+, pdfminer-six
+, pillow
+, pypandoc
+, python-docx
+, python-pptx
+, python-magic
+, markdown
+, requests
+, tabulate
+, xlrd
+# optional-dependencies
+, langdetect
+, sacremoses
+, sentencepiece
+, torch
+, transformers
+, unstructured-inference
+, s3fs
+, fsspec
+, adlfs
+# , discord-py
+, pygithub
+, python-gitlab
+, praw
+, slack-sdk
+, wikipedia
+, google-api-python-client
+# , gcsfs
+, elasticsearch8
+, jq
+# , dropboxdrivefs
+, atlassian-python-api
+# test dependencies
+, pytestCheckHook
+, black
+, coverage
+, click
+, freezegun
+# , label-studio-sdk
+, mypy
+, pytest-cov
+, pytest-mock
+, vcrpy
+, grpcio
+}:
+let
+  version = "0.10.30";
+  optional-dependencies = {
+    huggingflace = [
+      langdetect
+      sacremoses
+      sentencepiece
+      torch
+      transformers
+    ];
+    local-inference = [ unstructured-inference ];
+    s3 = [ s3fs fsspec ];
+    azure = [ adlfs fsspec ];
+    discord = [ ]; # discord-py
+    github = [ pygithub ];
+    gitlab = [ python-gitlab ];
+    reddit = [ praw ];
+    slack = [ slack-sdk ];
+    wikipedia = [ wikipedia ];
+    google-drive = [ google-api-python-client ];
+    gcs = []; # gcsfs fsspec
+    elasticsearch = [ elasticsearch8 jq ];
+    dropbox = []; # dropboxdrivefs fsspec
+    confluence = [ atlassian-python-api ];
+  };
+in
+buildPythonPackage {
+  pname = "unstructured";
+  inherit version;
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Unstructured-IO";
+    repo = "unstructured";
+    rev = "refs/tags/${version}";
+    hash = "sha256-RaVg4XNmh1S5G1CHQiME7t/BmK0MI9M8wI2YTKjpqzM=";
+  };
+
+  propagatedBuildInputs = [
+    chardet
+    filetype
+    lxml
+    msg-parser
+    nltk
+    openpyxl
+    pandas
+    pdf2image
+    pdfminer-six
+    pillow
+    pypandoc
+    python-docx
+    python-pptx
+    python-magic
+    markdown
+    requests
+    tabulate
+    xlrd
+  ];
+
+  pythonImportsCheck = [ "unstructured" ];
+
+  # test try to download punkt from nltk
+  # figure out how to make it available to enable the tests
+  doCheck = false;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    black
+    coverage
+    click
+    freezegun
+    mypy
+    pytest-cov
+    pytest-mock
+    vcrpy
+    grpcio
+  ];
+
+  passthru.optional-dependencies = optional-dependencies;
+
+  meta = with lib; {
+    description = "Open source libraries and APIs to build custom preprocessing pipelines for labeling, training, or production machine learning pipelines";
+    homepage = "https://github.com/Unstructured-IO/unstructured";
+    changelog = "https://github.com/Unstructured-IO/unstructured/blob/${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/untangle/default.nix b/nixpkgs/pkgs/development/python-modules/untangle/default.nix
new file mode 100644
index 000000000000..6456bdd3cbd8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/untangle/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchFromGitHub, unittestCheckHook, defusedxml }:
+
+buildPythonPackage rec {
+  pname = "untangle";
+  version = "1.2.1";
+
+  src = fetchFromGitHub {
+    owner = "stchris";
+    repo = "untangle";
+    # 1.1.1 is not tagged on GitHub
+    rev = "refs/tags/${version}";
+    hash = "sha256-cJkN8vT5hW5hRuLxr/6udwMO4GVH1pJhAc6qmPO2EEI=";
+  };
+
+  propagatedBuildInputs = [
+    defusedxml
+  ];
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  unittestFlagsArray = [ "-s" "tests" ];
+
+  meta = with lib; {
+    description = "Convert XML documents into Python objects";
+    homepage = "https://github.com/stchris/untangle";
+    license = licenses.mit;
+    maintainers = [ maintainers.arnoldfarkas ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/untokenize/default.nix b/nixpkgs/pkgs/development/python-modules/untokenize/default.nix
new file mode 100644
index 000000000000..3ee6b53d0586
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/untokenize/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "untokenize";
+  version = "0.1.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "3865dbbbb8efb4bb5eaa72f1be7f3e0be00ea8b7f125c69cbd1f5fda926f37a2";
+  };
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  meta = with lib; {
+    description = "Transforms tokens into original source code while preserving whitespace";
+    homepage = "https://github.com/myint/untokenize";
+    license = licenses.mit;
+    maintainers = with maintainers; [ FlorianFranzen ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uonet-request-signer-hebe/default.nix b/nixpkgs/pkgs/development/python-modules/uonet-request-signer-hebe/default.nix
new file mode 100644
index 000000000000..19d4bba0b974
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uonet-request-signer-hebe/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pyopenssl
+}:
+
+buildPythonPackage rec {
+  pname = "uonet-request-signer-hebe";
+  version = "0.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "fidopnpAt5CXPsLbx+V8wrJCQQ/WIO6AqxpsYLDv8qM=";
+  };
+
+  propagatedBuildInputs = [
+    pyopenssl
+  ];
+
+  # Source is not tagged
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "uonet_request_signer_hebe"
+  ];
+
+  meta = with lib; {
+    description = "UONET+ (hebe) request signer for Python";
+    homepage = "https://github.com/wulkanowy/uonet-request-signer";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/upass/default.nix b/nixpkgs/pkgs/development/python-modules/upass/default.nix
new file mode 100644
index 000000000000..342cd79e6837
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/upass/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyperclip
+, urwid
+}:
+
+buildPythonPackage rec {
+  pname = "upass";
+  version = "0.2.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Kwpolska";
+    repo = "upass";
+    rev = "v${version}";
+    sha256 = "0bgplq07dmlld3lp6jag1w055glqislfgwwq2k7cb2bzjgvysdnj";
+  };
+
+  propagatedBuildInputs = [
+    pyperclip
+    urwid
+  ];
+
+  # Projec thas no tests
+  doCheck = false;
+
+  postInstall = ''
+    export HOME=$(mktemp -d);
+    mkdir $HOME/.config
+  '';
+
+  pythonImportsCheck = [
+    "upass"
+  ];
+
+  meta = with lib; {
+    description = "Console UI for pass";
+    homepage = "https://github.com/Kwpolska/upass";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/upb-lib/default.nix b/nixpkgs/pkgs/development/python-modules/upb-lib/default.nix
new file mode 100644
index 000000000000..092cb5ed50b1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/upb-lib/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, pyserial-asyncio
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "upb-lib";
+  version = "0.5.4";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "upb_lib";
+    inherit version;
+    hash = "sha256-KEnSADj+sQtz37Xbi6fXoe2TN+F5Z9SYnlvCgXtxVnk=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial-asyncio
+    pytz
+  ];
+
+  # no tests on PyPI, no tags on GitHub
+  doCheck = false;
+
+  pythonImportsCheck = [ "upb_lib" ];
+
+  meta = with lib; {
+    description = "Library for interacting with UPB PIM";
+    homepage = "https://github.com/gwww/upb-lib";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/upcloud-api/default.nix b/nixpkgs/pkgs/development/python-modules/upcloud-api/default.nix
new file mode 100644
index 000000000000..17fec99811e3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/upcloud-api/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, pytestCheckHook
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "upcloud-api";
+  version = "2.5.1";
+
+  src = fetchFromGitHub {
+    owner = "UpCloudLtd";
+    repo = "upcloud-python-api";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-fMsI0aZ8jA08rrNPm8HmfYz/a3HLUExvvXIeDGPh2e8=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [ "upcloud_api" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/UpCloudLtd/upcloud-python-api/blob/${src.rev}/CHANGELOG.md";
+    description = "UpCloud API Client";
+    homepage = "https://github.com/UpCloudLtd/upcloud-python-api";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/update-copyright/default.nix b/nixpkgs/pkgs/development/python-modules/update-copyright/default.nix
new file mode 100644
index 000000000000..169c361e5074
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/update-copyright/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "update-copyright";
+  version = "0.6.2";
+
+  disabled = !isPy3k;
+
+  # Has no tests
+  doCheck = false;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "17ybdgbdc62yqhda4kfy1vcs1yzp78d91qfhj5zbvz1afvmvdk7z";
+  };
+
+  meta = with lib; {
+    description = "An automatic copyright update tool";
+    homepage = "http://blog.tremily.us/posts/update-copyright";
+    license = licenses.gpl3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/update-dotdee/default.nix b/nixpkgs/pkgs/development/python-modules/update-dotdee/default.nix
new file mode 100644
index 000000000000..00e4e51ebb78
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/update-dotdee/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, coloredlogs
+, executor
+, fetchFromGitHub
+, humanfriendly
+, naturalsort
+, property-manager
+, pytestCheckHook
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "update-dotdee";
+  version = "6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "xolox";
+    repo = "python-update-dotdee";
+    rev = version;
+    hash = "sha256-2k7FdgWM0ESHQb2za87yhXGaR/rbMYLVcv10QexUH1A=";
+  };
+
+  propagatedBuildInputs = [
+    coloredlogs
+    executor
+    humanfriendly
+    naturalsort
+    property-manager
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace tox.ini \
+      --replace " --cov --showlocals --verbose" ""
+  '';
+
+  pythonImportsCheck = [
+    "update_dotdee"
+  ];
+
+  disabledTests = [
+    # TypeError: %o format: an integer is required, not str
+    "test_executable"
+  ];
+
+  meta = with lib; {
+    description = "Generic modularized configuration file manager";
+    homepage = "https://github.com/xolox/python-update-dotdee";
+    license = licenses.mit;
+    maintainers = with maintainers; [ eyjhb ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/update_checker/default.nix b/nixpkgs/pkgs/development/python-modules/update_checker/default.nix
new file mode 100644
index 000000000000..432232c60f91
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/update_checker/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, requests, isPy27
+}:
+
+buildPythonPackage rec {
+  pname = "update_checker";
+  version = "0.18.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "6a2d45bb4ac585884a6b03f9eade9161cedd9e8111545141e9aa9058932acb13";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # requires network
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A python module that will check for package updates";
+    homepage = "https://github.com/bboe/update_checker";
+    license = licenses.bsd2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/upnpy/default.nix b/nixpkgs/pkgs/development/python-modules/upnpy/default.nix
new file mode 100644
index 000000000000..d64ff4b875c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/upnpy/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "upnpy";
+  version = "1.1.8";
+
+  src = fetchFromGitHub {
+    owner = "5kyc0d3r";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "17rqcmmwsl0m4722b1cr74f80kqwq7cgxsy7lq9c88zf6srcgjsf";
+  };
+
+  # Project has not published tests yet
+  doCheck = false;
+  pythonImportsCheck = [ "upnpy" ];
+
+  meta = with lib; {
+    description = "UPnP client library for Python";
+    homepage = "https://github.com/5kyc0d3r/upnpy";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uproot/default.nix b/nixpkgs/pkgs/development/python-modules/uproot/default.nix
new file mode 100644
index 000000000000..837d16204473
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uproot/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, awkward
+, hatchling
+, numpy
+, packaging
+, pytestCheckHook
+, lz4
+, pytest-timeout
+, scikit-hep-testdata
+, xxhash
+, zstandard
+}:
+
+buildPythonPackage rec {
+  pname = "uproot";
+  version = "5.1.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "scikit-hep";
+    repo = "uproot5";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-TMa+j2jdFagJJhlyCx4rNLaxQhrJyq1HdpnA40xiyME=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    awkward
+    numpy
+    packaging
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    lz4
+    pytest-timeout
+    scikit-hep-testdata
+    xxhash
+    zstandard
+  ];
+
+  preCheck = ''
+    export HOME="$(mktemp -d)"
+  '';
+
+  disabledTests = [
+    # Tests that try to download files
+    "test_http"
+    "test_no_multipart"
+    "test_fallback"
+    "test_pickle_roundtrip_http"
+    "test_open_fsspec_local"
+  ];
+
+  disabledTestPaths = [
+    # Tests that try to download files
+    "tests/test_0066-fix-http-fallback-freeze.py"
+    "tests/test_0088-read-with-http.py"
+    "tests/test_0220-contiguous-byte-ranges-in-http.py"
+    "tests/test_0916-read-from-s3.py"
+    "tests/test_0930-expressions-in-pandas.py"
+  ];
+
+  pythonImportsCheck = [
+    "uproot"
+  ];
+
+  meta = with lib; {
+    description = "ROOT I/O in pure Python and Numpy";
+    homepage = "https://github.com/scikit-hep/uproot5";
+    changelog = "https://github.com/scikit-hep/uproot5/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uptime-kuma-api/default.nix b/nixpkgs/pkgs/development/python-modules/uptime-kuma-api/default.nix
new file mode 100644
index 000000000000..1d7db943ad81
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uptime-kuma-api/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python-socketio
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "uptime-kuma-api";
+  version = "1.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "uptime_kuma_api";
+    inherit version;
+    hash = "sha256-tZ5ln3sy6W5RLcwjzLbhobCNLbHXIhXIzrcOVCG+Z+E=";
+  };
+
+  propagatedBuildInputs = [
+    python-socketio
+    python-socketio.optional-dependencies.client
+  ];
+
+  pythonImportsCheck = [
+    "uptime_kuma_api"
+  ];
+
+  # Tests need an uptime-kuma instance to run
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A Python wrapper for the Uptime Kuma Socket.IO API";
+    homepage = "https://github.com/lucasheld/uptime-kuma-api";
+    changelog = "https://github.com/lucasheld/uptime-kuma-api/blob/${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ julienmalka ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uptime-kuma-monitor/default.nix b/nixpkgs/pkgs/development/python-modules/uptime-kuma-monitor/default.nix
new file mode 100644
index 000000000000..f689942abf93
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uptime-kuma-monitor/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, requests
+, buildPythonPackage
+, fetchPypi
+, prometheus-client
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "uptime-kuma-monitor";
+  version = "1.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    pname = "uptime_kuma_monitor";
+    inherit version;
+    sha256 = "0zi4856hj5ar4yidh7366kx3xnh8qzydw9z8vlalcn98jf3jlnk9";
+  };
+
+  propagatedBuildInputs = [
+    requests
+    prometheus-client
+  ];
+
+  # Project has no test
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "uptime_kuma_monitor"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper around UptimeKuma /metrics endpoint";
+    homepage = "https://github.com/meichthys/utptime_kuma_monitor";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uptime/default.nix b/nixpkgs/pkgs/development/python-modules/uptime/default.nix
new file mode 100644
index 000000000000..640d2a6ed570
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uptime/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "uptime";
+  version = "3.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0wr9jkixprlywz0plyn5p42a5fd31aiwvjrxdvj7r02vfxa04c3w";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/Cairnarvon/uptime";
+    description = "Cross-platform way to retrieve system uptime and boot time";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ rob ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uqbar/default.nix b/nixpkgs/pkgs/development/python-modules/uqbar/default.nix
new file mode 100644
index 000000000000..e6633ab2e676
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uqbar/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, unidecode
+, sphinx
+, pythonAtLeast
+, pythonOlder
+, pytestCheckHook
+, pytest-cov
+}:
+
+buildPythonPackage rec {
+  pname = "uqbar";
+  version = "0.7.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-cEhWXGtMSXVjT5QigDedjT/lwYQnVqPCE5vbctXWznk=";
+  };
+
+  propagatedBuildInputs = [
+    unidecode
+    sphinx
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-cov
+  ];
+
+  pytestFlagsArray = [
+    "tests/"
+    "-vv"
+    "-rf"
+    "--cov-branch"
+    "--cov-report=html"
+    "--cov-report=term"
+    "--doctest-modules"
+  ];
+
+  disabledTests = [
+    # UnboundLocalError: local variable 'output_path' referenced before
+    # assignment
+    "test_01"
+    # AssertionError: assert False
+    "test_sphinx_book_html_cached"
+    # FileNotFoundError: [Errno 2] No such file or directory: 'unflatten'
+    "test_sphinx_style_html"
+    # assert not ["\x1b[91mWARNING: dot command 'dot' cannot be run (needed for
+    # graphviz output), check the graphviz_dot setting\x1b[39;49;00m"]
+    "test_sphinx_style_latex"
+  ]
+  # assert not '\x1b[91m/build/uqbar-0.7.0/tests/fake_package/enums.py:docstring
+  ++ lib.optional (pythonAtLeast "3.11") "test_sphinx_style";
+
+  pythonImportsCheck = [ "uqbar" ];
+
+  meta = {
+    description = "Tools for creating Sphinx and Graphviz documentation";
+    license = lib.licenses.mit;
+    homepage = "https://github.com/josiah-wolf-oberholtzer/uqbar";
+    changelog =
+      "https://github.com/josiah-wolf-oberholtzer/uqbar/releases/tag/v${version}";
+    maintainers = [ lib.maintainers.davisrichard437 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uranium/default.nix b/nixpkgs/pkgs/development/python-modules/uranium/default.nix
new file mode 100644
index 000000000000..8af65b0cc65d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uranium/default.nix
@@ -0,0 +1,37 @@
+{ lib, buildPythonPackage, fetchFromGitHub, python, cmake
+, pyqt5, numpy, scipy, shapely, libarcus, cryptography, doxygen, gettext, pythonOlder }:
+
+buildPythonPackage rec {
+  version = "4.12.0";
+  pname = "uranium";
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "Ultimaker";
+    repo = "Uranium";
+    rev = version;
+    hash = "sha256-SE9xqrloPXIRTJiiqUdRKFmb4c0OjmJK5CMn6VXMFmk=";
+  };
+
+  disabled = pythonOlder "3.5.0";
+
+  buildInputs = [ python gettext ];
+  propagatedBuildInputs = [ pyqt5 numpy scipy shapely libarcus cryptography ];
+  nativeBuildInputs = [ cmake doxygen ];
+
+  postPatch = ''
+    sed -i 's,/python''${PYTHON_VERSION_MAJOR}/dist-packages,/python''${PYTHON_VERSION_MAJOR}.''${PYTHON_VERSION_MINOR}/site-packages,g' CMakeLists.txt
+    sed -i \
+     -e "s,Resources.addSearchPath(os.path.join(os.path.abspath(os.path.dirname(__file__)).*,Resources.addSearchPath(\"$out/share/uranium/resources\")," \
+     -e "s,self._plugin_registry.addPluginLocation(os.path.join(os.path.abspath(os.path.dirname(__file__)).*,self._plugin_registry.addPluginLocation(\"$out/lib/uranium/plugins\")," \
+     UM/Application.py
+  '';
+
+  meta = with lib; {
+    description = "A Python framework for building Desktop applications";
+    homepage = "https://github.com/Ultimaker/Uranium";
+    license = licenses.lgpl3Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ abbradar gebner ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uri-template/default.nix b/nixpkgs/pkgs/development/python-modules/uri-template/default.nix
new file mode 100644
index 000000000000..7bebffce194a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uri-template/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, pythonOlder
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "uri-template";
+  version = "1.3.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "plinss";
+    repo = "uri_template";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-38HFFqM6yfpsPrhIpE639ePy/NbLqKw7gbnE3y8sL3w=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} test.py
+  '';
+
+  pythonImportsCheck = [
+    "uri_template"
+  ];
+
+  meta = with lib; {
+    description = "An implementation of RFC 6570 URI Templates";
+    homepage = "https://github.com/plinss/uri_template/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uritemplate/default.nix b/nixpkgs/pkgs/development/python-modules/uritemplate/default.nix
new file mode 100644
index 000000000000..363313163d6b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uritemplate/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, simplejson
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "uritemplate";
+  version = "4.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Q0bt/Fw7efaUvM1tYJmjIrvrYo2/LNhu6lWkVs5RJPA=";
+  };
+
+  propagatedBuildInputs = [
+    simplejson
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "uritemplate"
+  ];
+
+  meta = with lib; {
+    description = "Implementation of RFC 6570 URI templates";
+    homepage = "https://github.com/python-hyper/uritemplate";
+    license = with licenses; [ asl20 bsd3 ];
+    maintainers = with maintainers; [ matthiasbeyer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uritools/default.nix b/nixpkgs/pkgs/development/python-modules/uritools/default.nix
new file mode 100644
index 000000000000..7975e0f74231
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uritools/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "uritools";
+  version = "4.0.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BN8reH0Ot2IA6DGTgqA1Yvv+R0H9ZsFVBrCNO4IR1XM=";
+  };
+
+  pythonImportsCheck = [
+    "uritools"
+  ];
+
+  meta = with lib; {
+    description = "RFC 3986 compliant, Unicode-aware, scheme-agnostic replacement for urlparse";
+    homepage = "https://github.com/tkem/uritools/";
+    changelog = "https://github.com/tkem/uritools/blob/v${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rvolosatovs ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/url-normalize/default.nix b/nixpkgs/pkgs/development/python-modules/url-normalize/default.nix
new file mode 100644
index 000000000000..b851eccbe26f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/url-normalize/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, poetry-core
+, pytest-flakes
+, pytest-mock
+, pytest-socket
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "url-normalize";
+  version = "1.4.3";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "niksite";
+    repo = pname;
+    rev = version;
+    hash = "sha256-WE3MM9B/voI23taFbLp2FYhl0uxOfuUWsaCTBG1hyiY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytest-flakes
+    pytest-mock
+    pytest-socket
+    pytestCheckHook
+  ];
+
+  patches = [
+    # Switch to poetry-core, https://github.com/niksite/url-normalize/pull/28
+    (fetchpatch {
+      name = "switch-to-poetry-core.patch";
+      url = "https://github.com/niksite/url-normalize/commit/b8557b10c977b191cc9d37e6337afe874a24ad08.patch";
+      hash = "sha256-SVCQATV9V6HbLmjOHs7V7eBagO0PuqZLubIJghBYfQQ=";
+    })
+  ];
+
+  postPatch = ''
+    sed -i "/--cov/d" tox.ini
+    sed -i "/--flakes/d" tox.ini
+  '';
+
+  pythonImportsCheck = [
+    "url_normalize"
+  ];
+
+  meta = with lib; {
+    description = "URL normalization for Python";
+    homepage = "https://github.com/niksite/url-normalize";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/urlextract/default.nix b/nixpkgs/pkgs/development/python-modules/urlextract/default.nix
new file mode 100644
index 000000000000..90fb0d457c0a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/urlextract/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, dnspython
+, fetchPypi
+, filelock
+, idna
+, platformdirs
+, pytestCheckHook
+, pythonOlder
+, uritools
+}:
+
+buildPythonPackage rec {
+  pname = "urlextract";
+  version = "1.8.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NXP2uBKBTv4GykbpHoLZhO2qPNB9qqqilqRnrZiBoDc=";
+  };
+
+  propagatedBuildInputs = [
+    filelock
+    idna
+    platformdirs
+    uritools
+  ];
+
+  nativeCheckInputs = [
+    dnspython
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # fails with dns.resolver.NoResolverConfiguration due to network sandboxing
+    "test_check_dns_enabled"
+    "test_check_dns_find_urls"
+    "test_dns_cache_init"
+    "test_dns_cache_negative"
+    "test_dns_cache_reuse"
+  ];
+
+  pythonImportsCheck = [
+    "urlextract"
+  ];
+
+  meta = with lib; {
+    description = "Collects and extracts URLs from given text";
+    homepage = "https://github.com/lipoja/URLExtract";
+    changelog = "https://github.com/lipoja/URLExtract/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ilkecan ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/urlgrabber/default.nix b/nixpkgs/pkgs/development/python-modules/urlgrabber/default.nix
new file mode 100644
index 000000000000..e78dc9b904dc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/urlgrabber/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, pycurl, six }:
+
+buildPythonPackage rec {
+  pname = "urlgrabber";
+  version = "4.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "075af8afabae6362482d254e5ac3ffa595d1766117b684e53d9c25c2e937e139";
+  };
+
+  propagatedBuildInputs = [ pycurl six ];
+
+  meta = with lib; {
+    homepage = "http://urlgrabber.baseurl.org";
+    license = licenses.lgpl2Plus;
+    description = "Python module for downloading files";
+    maintainers = with maintainers; [ qknight ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/urllib3/default.nix b/nixpkgs/pkgs/development/python-modules/urllib3/default.nix
new file mode 100644
index 000000000000..7a374f7c0c2c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/urllib3/default.nix
@@ -0,0 +1,93 @@
+{ lib
+, backports-zoneinfo
+, brotli
+, brotlicffi
+, buildPythonPackage
+, certifi
+, cryptography
+, fetchPypi
+, hatchling
+, idna
+, isPyPy
+, pyopenssl
+, pysocks
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, tornado
+, trustme
+}:
+
+let self = buildPythonPackage rec {
+  pname = "urllib3";
+  version = "2.0.7";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-yX394fe9Q6ccjSpY42npsr9pLRM06p+crlWt19DdD4Q=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  passthru.optional-dependencies = {
+    brotli = if isPyPy then [
+      brotlicffi
+    ] else [
+      brotli
+    ];
+    # Use carefully since pyopenssl is not supported aarch64-darwin
+    secure = [
+      certifi
+      cryptography
+      idna
+      pyopenssl
+    ];
+    socks = [
+      pysocks
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytest-timeout
+    pytestCheckHook
+    tornado
+    trustme
+  ] ++ lib.optionals (pythonOlder "3.9") [
+    backports-zoneinfo
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  # Tests in urllib3 are mostly timeout-based instead of event-based and
+  # are therefore inherently flaky. On your own machine, the tests will
+  # typically build fine, but on a loaded cluster such as Hydra random
+  # timeouts will occur.
+  #
+  # The urllib3 test suite has two different timeouts in their test suite
+  # (see `test/__init__.py`):
+  # - SHORT_TIMEOUT
+  # - LONG_TIMEOUT
+  # When CI is in the env, LONG_TIMEOUT will be significantly increased.
+  # Still, failures can occur and for that reason tests are disabled.
+  doCheck = false;
+
+  passthru.tests.pytest = self.overridePythonAttrs (_: { doCheck = true; });
+
+  preCheck = ''
+    export CI # Increases LONG_TIMEOUT
+  '';
+
+  pythonImportsCheck = [
+    "urllib3"
+  ];
+
+  meta = with lib; {
+    description = "Powerful, user-friendly HTTP client for Python";
+    homepage = "https://github.com/urllib3/urllib3";
+    changelog = "https://github.com/urllib3/urllib3/blob/${version}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+};
+in self
diff --git a/nixpkgs/pkgs/development/python-modules/urlman/default.nix b/nixpkgs/pkgs/development/python-modules/urlman/default.nix
new file mode 100644
index 000000000000..8bc7ce028299
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/urlman/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "urlman";
+  version = "2.0.1";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "andrewgodwin";
+    repo = "urlman";
+    rev = version;
+    hash = "sha256-p6lRuMHM2xJrlY5LDa0XLCGQPDE39UwCouK6e0U9zJE=";
+  };
+
+  pythonImportsCheck = [
+    "urlman"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Django URL pattern helpers";
+    homepage = "https://github.com/andrewgodwin/urlman";
+    changelog = "https://github.com/andrewgodwin/urlman/blob/${src.rev}/CHANGELOG";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/urlpy/default.nix b/nixpkgs/pkgs/development/python-modules/urlpy/default.nix
new file mode 100644
index 000000000000..f03b8b564508
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/urlpy/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, publicsuffix2
+, pytestCheckHook
+, pythonAtLeast
+}:
+buildPythonPackage rec {
+  pname = "urlpy";
+  version = "0.5.0";
+
+  src = fetchFromGitHub {
+    owner = "nexB";
+    repo = "urlpy";
+    rev = "v${version}";
+    sha256 = "962jLyx+/GS8wrDPzG2ONnHvtUG5Pqe6l1Z5ml63Cmg=";
+  };
+
+  dontConfigure = true;
+
+  propagatedBuildInputs = [
+    publicsuffix2
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals (pythonAtLeast "3.9") [
+    # Fails with "AssertionError: assert 'unknown' == ''"
+    "test_unknown_protocol"
+  ];
+
+  pythonImportsCheck = [
+    "urlpy"
+  ];
+
+  meta = with lib; {
+    description = "Simple URL parsing, canonicalization and equivalence";
+    homepage = "https://github.com/nexB/urlpy";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/urwid-mitmproxy/default.nix b/nixpkgs/pkgs/development/python-modules/urwid-mitmproxy/default.nix
new file mode 100644
index 000000000000..60dd32fc6fc3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/urwid-mitmproxy/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, glibcLocales
+, pythonOlder
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "urwid-mitmproxy";
+  version = "2.1.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mitmproxy";
+    repo = "urwid-mitmproxy";
+    rev = "refs/tags/${version}";
+    hash = "sha256-93AauYWbrG/2smAhbNKGE0twGJZ2u9gBetlXGCpciH8=";
+  };
+
+  pythonImportsCheck = [
+    "urwid"
+  ];
+
+  # Tests which assert on strings don't decode results correctly, see urwid
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Urwid fork used by mitmproxy";
+    homepage = "https://github.com/mitmproxy/urwid-mitmproxy";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/urwid-readline/default.nix b/nixpkgs/pkgs/development/python-modules/urwid-readline/default.nix
new file mode 100644
index 000000000000..7d24067fd110
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/urwid-readline/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, urwid
+, glibcLocales
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "urwid_readline";
+  version = "0.13";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-AYAgy8hku17Ye+F9wmsGnq4nVcsp86nFaarDve0e+vQ=";
+  };
+
+  propagatedBuildInputs = [
+    urwid
+  ];
+
+  nativeCheckInputs = [
+    glibcLocales
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "A textbox edit widget for urwid that supports readline shortcuts";
+    homepage = "https://github.com/rr-/urwid_readline";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/urwid/default.nix b/nixpkgs/pkgs/development/python-modules/urwid/default.nix
new file mode 100644
index 000000000000..7f9512be2cb1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/urwid/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+
+# build-system
+, setuptools
+, setuptools-scm
+, wheel
+
+# tests
+, glibcLocales
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "urwid";
+  version = "2.2.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-4zkRqxjyxz/dvpvyFtAh504gstWqm+MEA8WPVRMbuKE=";
+  };
+
+  postPatch = ''
+    sed -i '/addopts =/d' pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  nativeCheckInputs = [
+    glibcLocales
+    pytestCheckHook
+  ];
+
+  env.LC_ALL = "en_US.UTF8";
+
+  disabledTestPaths = [
+    # expect call hangs
+    "urwid/tests/test_vterm.py"
+  ];
+
+  pythonImportsCheck = [
+    "urwid"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/urwid/urwid/releases/tag/${version}";
+    description = "A full-featured console (xterm et al.) user interface library";
+    downloadPage = "https://github.com/urwid/urwid";
+    homepage = "https://urwid.org/";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/urwidtrees/default.nix b/nixpkgs/pkgs/development/python-modules/urwidtrees/default.nix
new file mode 100644
index 000000000000..e9b355604301
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/urwidtrees/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, glibcLocales
+, urwid
+, fetchpatch
+}:
+
+buildPythonPackage rec {
+  pname = "urwidtrees";
+  version  = "1.0.3";
+
+  src = fetchFromGitHub {
+    owner = "pazz";
+    repo = "urwidtrees";
+    rev = version;
+    hash = "sha256-yGSjwagCd5TiwEFtF6ZhDuVqj4PTa5pVXhs8ebr2O/g=";
+  };
+
+  propagatedBuildInputs = [ urwid ];
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/pazz/urwidtrees/commit/ed39dbc4fc67b0e0249bf108116a88cd18543aa9.patch";
+    hash = "sha256-fA+30d2uVaoNCg4rtoWLNPvrZtq41Co4vcmM80hkURs=";
+    })
+  ];
+
+  nativeCheckInputs = [ glibcLocales ];
+  LC_ALL="en_US.UTF-8";
+
+  meta = with lib; {
+    description = "Tree widgets for urwid";
+    homepage = "https://github.com/pazz/urwidtrees";
+    license = licenses.gpl3;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/us/default.nix b/nixpkgs/pkgs/development/python-modules/us/default.nix
new file mode 100644
index 000000000000..e489879bd502
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/us/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jellyfish
+, pytestCheckHook
+, pythonOlder
+, pytz
+}:
+
+buildPythonPackage rec {
+  pname = "us";
+  version = "3.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-40eWPo0kocp0N69EP6aFkXdoR7UMhlDY7w61NILnBcI=";
+  };
+
+  postPatch = ''
+    # Upstream spins jellyfish
+    substituteInPlace setup.py \
+      --replace "jellyfish==" "jellyfish>="
+  '';
+
+  propagatedBuildInputs = [
+    jellyfish
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytz
+  ];
+
+  pythonImportsCheck = [
+    "us"
+  ];
+
+  meta = with lib; {
+    description = "A package for easily working with US and state metadata";
+    longDescription = ''
+      All US states and territories, postal abbreviations, Associated Press style
+      abbreviations, FIPS codes, capitals, years of statehood, time zones, phonetic
+      state name lookup, is contiguous or continental, URLs to shapefiles for state,
+      census, congressional districts, counties, and census tracts.
+    '';
+    homepage = "https://github.com/unitedstates/python-us/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/usb-devices/default.nix b/nixpkgs/pkgs/development/python-modules/usb-devices/default.nix
new file mode 100644
index 000000000000..8a77fd8597f9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/usb-devices/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "usb-devices";
+  version = "0.4.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-9w7YCAEpdptQC0GCnJCEyhZgcHMDIw0alj7q4Y82hmA=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=usb_devices --cov-report=term-missing:skip-covered" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "usb_devices"
+  ];
+
+  meta = with lib; {
+    description = "Library for for mapping, describing, and resetting USB devices";
+    homepage = "https://github.com/Bluetooth-Devices/usb-devices";
+    changelog = "https://github.com/Bluetooth-Devices/usb-devices/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/usbtmc/default.nix b/nixpkgs/pkgs/development/python-modules/usbtmc/default.nix
new file mode 100644
index 000000000000..57f2819ecc65
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/usbtmc/default.nix
@@ -0,0 +1,22 @@
+{ lib, fetchFromGitHub, buildPythonPackage, pyusb }:
+
+buildPythonPackage rec {
+  pname = "usbtmc";
+  version = "0.8";
+
+  src = fetchFromGitHub {
+    owner = "python-ivi";
+    repo = "python-usbtmc";
+    rev = "v${version}";
+    hash = "sha256-69kqBTqnVqdWC2mqlXylzb9VkdhwTGZI0Ykf6lqbypI=";
+  };
+
+  propagatedBuildInputs = [ pyusb ];
+
+  meta = with lib; {
+    description = "Python implementation of the USBTMC instrument control protocol";
+    homepage = "http://alexforencich.com/wiki/en/python-usbtmc/start";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/user-agents/default.nix b/nixpkgs/pkgs/development/python-modules/user-agents/default.nix
new file mode 100644
index 000000000000..d01c601c82a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/user-agents/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchFromGitHub, ua-parser }:
+
+buildPythonPackage rec {
+  pname = "user-agents";
+  version = "2.2.0";
+
+  # PyPI is missing devices.json
+  src = fetchFromGitHub {
+    owner = "selwin";
+    repo = "python-user-agents";
+    rev = "v${version}";
+    sha256 = "0pcbjqj21c2ixhl414bh2h8khi8y1igzfpkyqwan1pakix0lq45a";
+  };
+
+  propagatedBuildInputs = [ ua-parser ];
+
+  meta = with lib; {
+    description = "A Python library to identify devices by parsing user agent strings";
+    homepage = "https://github.com/selwin/python-user-agents";
+    license = licenses.mit;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/userpath/default.nix b/nixpkgs/pkgs/development/python-modules/userpath/default.nix
new file mode 100644
index 000000000000..5f4a31d39b19
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/userpath/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hatchling
+, click
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "userpath";
+  version = "1.9.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zoF2co2YyRS2QBeBvzsj/M2WjRZHU5yHiMcBA3XgJ5Y=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  # Test suite is difficult to emulate in sandbox due to shell manipulation
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "userpath"
+  ];
+
+  meta = with lib; {
+    description = "Cross-platform tool for adding locations to the user PATH";
+    homepage = "https://github.com/ofek/userpath";
+    changelog = "https://github.com/ofek/userpath/releases/tag/v${version}";
+    license = with licenses; [ asl20 mit ];
+    maintainers = with maintainers; [ yshym ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ush/default.nix b/nixpkgs/pkgs/development/python-modules/ush/default.nix
new file mode 100644
index 000000000000..a2b83bff3b38
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ush/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "ush";
+  version = "3.1.0";
+
+  src = fetchFromGitHub {
+    owner = "tarruda";
+    repo = "python-ush";
+    rev = version;
+    hash = "sha256-eL3vG3yS02enbLYorKvvYKbju9HInffUhrZgkodwhvo=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    six
+  ];
+
+  disabledTestPaths = [
+    # seems to be outdated?
+    "tests/test_glob.py"
+  ];
+
+  meta = with lib; {
+    description = "Powerful API for invoking with external commands";
+    homepage = "https://github.com/tarruda/python-ush";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ckie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/usort/default.nix b/nixpkgs/pkgs/development/python-modules/usort/default.nix
new file mode 100644
index 000000000000..d8369260587e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/usort/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, attrs
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, hatch-vcs
+, hatchling
+, libcst
+, moreorless
+, pythonOlder
+, stdlibs
+, toml
+, trailrunner
+, unittestCheckHook
+, volatile
+}:
+
+buildPythonPackage rec {
+  pname = "usort";
+  version = "1.0.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "facebook";
+    repo = "usort";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-emnrghdsUs+VfvYiJExG13SKQNrXAEtGNAJQLScADnw=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    attrs
+    click
+    libcst
+    moreorless
+    stdlibs
+    toml
+    trailrunner
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+    volatile
+  ];
+
+  pythonImportsCheck = [
+    "usort"
+  ];
+
+  meta = with lib; {
+    description = "Safe, minimal import sorting for Python projects";
+    homepage = "https://github.com/facebook/usort";
+    changelog = "https://github.com/facebook/usort/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/utils/default.nix b/nixpkgs/pkgs/development/python-modules/utils/default.nix
new file mode 100644
index 000000000000..c2ad8a87904c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/utils/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "utils";
+  version = "1.0.1";
+
+  src = fetchFromGitHub {
+    owner = "haaksmash";
+    repo = "pyutils";
+    rev = version;
+    sha256 = "07pr39cfw5ayzkp6h53y7lfpd0w19pphsdzsf100fsyy3npavgbr";
+  };
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "utils" ];
+
+  meta = with lib; {
+    description = "Python set of utility functions and objects";
+    homepage = "https://github.com/haaksmash/pyutils";
+    license = with licenses; [ lgpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uuid/default.nix b/nixpkgs/pkgs/development/python-modules/uuid/default.nix
new file mode 100644
index 000000000000..c7bcb7700701
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uuid/default.nix
@@ -0,0 +1,16 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "uuid";
+  version = "1.30";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0gqrjsm85nnkxkmd1vk8350wqj2cigjflnvcydk084n5980cr1qz";
+  };
+
+  meta = with lib; {
+    description = "UUID object and generation functions (Python 2.3 or higher)";
+    homepage = "http://zesty.ca/python/";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uvcclient/default.nix b/nixpkgs/pkgs/development/python-modules/uvcclient/default.nix
new file mode 100644
index 000000000000..61a14b85ebeb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uvcclient/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchFromGitHub, nose, mock }:
+
+buildPythonPackage rec {
+  pname = "uvcclient";
+  version = "0.11.0";
+
+  src = fetchFromGitHub {
+    owner = "kk7ds";
+    repo = pname;
+    rev = "58e7a53815482b7778481f81cde95f53a60bb6f6";
+    sha256 = "0k8aswrk1n08w6pi6dg0zdzsmk23cafihkrss9ywg3i85w7q43x2";
+  };
+
+  nativeCheckInputs = [
+    nose
+    mock
+  ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  meta = with lib; {
+    description = "Client for Ubiquiti's Unifi Camera NVR";
+    homepage = "https://github.com/kk7ds/uvcclient";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uvicorn/default.nix b/nixpkgs/pkgs/development/python-modules/uvicorn/default.nix
new file mode 100644
index 000000000000..bbec8df096fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uvicorn/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, buildPythonPackage
+, callPackage
+, fetchFromGitHub
+, click
+, h11
+, httptools
+, python-dotenv
+, pyyaml
+, typing-extensions
+, uvloop
+, watchfiles
+, websockets
+, hatchling
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "uvicorn";
+  version = "0.23.2";
+  disabled = pythonOlder "3.8";
+
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "encode";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-98Ahb6syD/J9StwaOqVj/MCdzbHOgey0sixp7SJnROE=";
+  };
+
+  outputs = [
+    "out"
+    "testsout"
+  ];
+
+  nativeBuildInputs = [ hatchling ];
+
+  propagatedBuildInputs = [
+    click
+    h11
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies.standard = [
+    httptools
+    python-dotenv
+    pyyaml
+    uvloop
+    watchfiles
+    websockets
+  ];
+
+  postInstall = ''
+    mkdir $testsout
+    cp -R tests $testsout/tests
+  '';
+
+  pythonImportsCheck = [
+    "uvicorn"
+  ];
+
+  # check in passthru.tests.pytest to escape infinite recursion with httpx/httpcore
+  doCheck = false;
+
+  passthru.tests = {
+    pytest = callPackage ./tests.nix { };
+  };
+
+  meta = with lib; {
+    homepage = "https://www.uvicorn.org/";
+    changelog = "https://github.com/encode/uvicorn/blob/${src.rev}/CHANGELOG.md";
+    description = "The lightning-fast ASGI server";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ wd15 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/uvicorn/tests.nix b/nixpkgs/pkgs/development/python-modules/uvicorn/tests.nix
new file mode 100644
index 000000000000..805e8df1c710
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uvicorn/tests.nix
@@ -0,0 +1,48 @@
+{ stdenv
+, buildPythonPackage
+, a2wsgi
+, uvicorn
+, httpx
+, pytestCheckHook
+, pytest-mock
+, trustme
+, watchgod
+, wsproto
+}:
+
+buildPythonPackage {
+  pname = "uvicorn-tests";
+  inherit (uvicorn) version;
+  format = "other";
+
+  src = uvicorn.testsout;
+
+  dontBuild = true;
+  dontInstall = true;
+
+  nativeCheckInputs = [
+    uvicorn
+    httpx
+    pytestCheckHook
+    pytest-mock
+    trustme
+
+    # strictly optional dependencies
+    a2wsgi
+    watchgod
+    wsproto
+  ]
+  ++ uvicorn.optional-dependencies.standard;
+
+  doCheck = !stdenv.isDarwin;
+
+  __darwinAllowLocalNetworking = true;
+
+  disabledTests = [
+    "test_supported_upgrade_request"
+    "test_invalid_upgrade"
+    "test_no_server_headers"
+    "test_multiple_server_header"
+  ];
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/uvloop/default.nix b/nixpkgs/pkgs/development/python-modules/uvloop/default.nix
new file mode 100644
index 000000000000..9ee7fec91944
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/uvloop/default.nix
@@ -0,0 +1,99 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+
+# build-system
+, cython
+, setuptools
+
+# native dependencies
+, libuv
+, CoreServices
+, ApplicationServices
+
+# tests
+, aiohttp
+, psutil
+, pyopenssl
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "uvloop";
+  version = "0.19.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Akb0/Rvyv3AuBrDUXukWd+5cMSQvOaq06m/gxRrt0P0=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    setuptools
+  ];
+
+  env.LIBUV_CONFIGURE_HOST = stdenv.hostPlatform.config;
+
+  buildInputs = [
+    libuv
+  ] ++ lib.optionals stdenv.isDarwin [
+    CoreServices
+    ApplicationServices
+  ];
+
+  nativeCheckInputs = [
+    aiohttp
+    pyopenssl
+    pytestCheckHook
+    psutil
+  ];
+
+  pytestFlagsArray = [
+    # Tries to run "env", but fails to find it, even with coreutils provided
+    "--deselect=tests/test_process.py::Test_UV_Process::test_process_env_2"
+    "--deselect=tests/test_process.py::Test_AIO_Process::test_process_env_2"
+    # AssertionError: b'' != b'out\n'
+    "--deselect=tests/test_process.py::Test_UV_Process::test_process_streams_redirect"
+    "--deselect=tests/test_process.py::Test_AIO_Process::test_process_streams_redirect"
+  ] ++ lib.optionals (stdenv.isDarwin) [
+    # Segmentation fault
+    "--deselect=tests/test_fs_event.py::Test_UV_FS_EVENT_RENAME::test_fs_event_rename"
+    # Broken: https://github.com/NixOS/nixpkgs/issues/160904
+    "--deselect=tests/test_context.py::Test_UV_Context::test_create_ssl_server_manual_connection_lost"
+  ];
+
+  disabledTestPaths = [
+    # ignore code linting tests
+    "tests/test_sourcecode.py"
+  ];
+
+  preCheck = ''
+    # force using installed/compiled uvloop
+    rm -rf uvloop
+  '' + lib.optionalString stdenv.isDarwin ''
+    # Work around "OSError: AF_UNIX path too long"
+    # https://github.com/MagicStack/uvloop/issues/463
+    export TMPDIR="/tmp"
+  '';
+
+  pythonImportsCheck = [
+    "uvloop"
+    "uvloop.loop"
+  ];
+
+  # Some of the tests use localhost networking.
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    changelog = "https://github.com/MagicStack/uvloop/releases/tag/v${version}";
+    description = "Fast implementation of asyncio event loop on top of libuv";
+    homepage = "https://github.com/MagicStack/uvloop";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vaa/default.nix b/nixpkgs/pkgs/development/python-modules/vaa/default.nix
new file mode 100644
index 000000000000..54c2520ee665
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vaa/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+, pytestCheckHook
+, cerberus
+, django
+, djangorestframework
+, marshmallow
+, pyschemes
+, wtforms
+, email-validator
+}:
+
+buildPythonPackage rec {
+  pname = "vaa";
+  version = "0.2.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "life4";
+    repo = pname;
+    rev = "refs/tags/v.${version}";
+    hash = "sha256-24GTTJSZ55ejyHoWP1/S3DLTKvOolAJr9UhWoOm84CU=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "requires = [\"flit\"]" "requires = [\"flit_core\"]" \
+      --replace "build-backend = \"flit.buildapi\"" "build-backend = \"flit_core.buildapi\""
+  '';
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    cerberus
+    django
+    djangorestframework
+    marshmallow
+    pyschemes
+    wtforms
+    email-validator
+  ];
+
+  pythonImportsCheck = [ "vaa" ];
+
+  meta = with lib; {
+    description = "VAlidators Adapter makes validation by any existing validator with the same interface";
+    homepage = "https://github.com/life4/vaa";
+    license = licenses.mit;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/validate-email/default.nix b/nixpkgs/pkgs/development/python-modules/validate-email/default.nix
new file mode 100644
index 000000000000..2b1fdb4963d5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/validate-email/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "validate-email";
+  version = "1.3";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "validate_email";
+    sha256 = "1bxffaf5yz2cph8ki55vdvdypbwkvn2xr1firlcy62vqbzf1jivq";
+  };
+
+  # No tests
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/syrusakbary/validate_email";
+    description = "Verify if an email address is valid and really exists";
+    license = licenses.lgpl3Plus;
+    maintainers = [ maintainers.mmahut ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/validators/default.nix b/nixpkgs/pkgs/development/python-modules/validators/default.nix
new file mode 100644
index 000000000000..8e29effda9a2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/validators/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "validators";
+  version = "0.22.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "python-validators";
+    repo = "validators";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Qu6Tu9uIluT1KBJYkFjDFt9AWN2Kez3uCYDQknXqYrU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "validators"
+  ];
+
+  meta = with lib; {
+    description = "Python Data Validation for Humans";
+    homepage = "https://github.com/python-validators/validators";
+    changelog = "https://github.com/python-validators/validators/blob/${version}/CHANGES.md";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/validobj/default.nix b/nixpkgs/pkgs/development/python-modules/validobj/default.nix
new file mode 100644
index 000000000000..73eaf56f9e9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/validobj/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, flit
+, hypothesis
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "validobj";
+  version = "1.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-CISX8pycEOYUBolyMoJqaKdE0u/8tf7mvbHYm9m148I=";
+  };
+
+  nativeBuildInputs = [ flit ];
+
+  nativeCheckInputs = [ hypothesis pytestCheckHook ];
+
+  pythonImportsCheck = [ "validobj" ];
+
+  meta = with lib; {
+    description = "Validobj is library that takes semistructured data (for example JSON and YAML configuration files) and converts it to more structured Python objects";
+    homepage = "https://github.com/Zaharid/validobj";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/validphys2/default.nix b/nixpkgs/pkgs/development/python-modules/validphys2/default.nix
new file mode 100644
index 000000000000..38debb91be11
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/validphys2/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, lhapdf
+, nnpdf
+, prompt-toolkit
+, reportengine
+, requests
+, seaborn
+, validobj
+}:
+
+buildPythonPackage rec {
+  pname = "validphys2";
+  version = "4.0";
+  format = "setuptools";
+
+  inherit (nnpdf) src;
+
+  prePatch = ''
+    cd validphys2
+  '';
+
+  postPatch = ''
+    substituteInPlace src/validphys/version.py \
+      --replace '= __give_git()' '= "'$version'"'
+  '';
+
+  propagatedBuildInputs = [
+    lhapdf
+    nnpdf
+    prompt-toolkit
+    reportengine
+    requests
+    seaborn
+    validobj
+  ];
+
+  doCheck = false; # no tests
+  pythonImportsCheck = [ "validphys" ];
+
+  meta = with lib; {
+    description = "NNPDF analysis framework";
+    homepage = "https://data.nnpdf.science/validphys-docs/guide.html";
+    inherit (nnpdf.meta) license;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vallox-websocket-api/default.nix b/nixpkgs/pkgs/development/python-modules/vallox-websocket-api/default.nix
new file mode 100644
index 000000000000..48fae161b20c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vallox-websocket-api/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, construct
+, websockets
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "vallox-websocket-api";
+  version = "3.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "yozik04";
+    repo = "vallox_websocket_api";
+    rev = "refs/tags/${version}";
+    hash = "sha256-wlkb6aa2UtqjrbNA26TUH+ZKvOM64An+lol+MCdQh3U=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    construct
+    websockets
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "vallox_websocket_api" ];
+
+  meta = {
+    description = "Async API for Vallox ventilation units";
+    homepage = "https://github.com/yozik04/vallox_websocket_api";
+    license = lib.licenses.lgpl3Only;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vapoursynth/default.nix b/nixpkgs/pkgs/development/python-modules/vapoursynth/default.nix
new file mode 100644
index 000000000000..da75653962ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vapoursynth/default.nix
@@ -0,0 +1,31 @@
+{ vapoursynth, cython, buildPythonPackage, unittestCheckHook, python }:
+
+buildPythonPackage {
+  pname = "vapoursynth";
+
+  inherit (vapoursynth) version src;
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  buildInputs = [
+    vapoursynth
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  unittestFlagsArray = [ "-s" "$src/test" "-p" "'*test.py'" ];
+
+  passthru = {
+    withPlugins = plugins:
+      python.pkgs.vapoursynth.override {
+        vapoursynth = vapoursynth.withPlugins plugins;
+      };
+  };
+
+  inherit (vapoursynth) meta;
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/variants/default.nix b/nixpkgs/pkgs/development/python-modules/variants/default.nix
new file mode 100644
index 000000000000..8379034af9e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/variants/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "variants";
+  version = "0.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-UR91tM90g8J+TYbZrM8rUxcmeQDBZtF2Nr7u0RiSm5A=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    six
+  ];
+
+  pythonImportsCheck = [
+    "variants"
+  ];
+
+  meta = with lib; {
+    description = "Library providing syntactic sugar for creating variant forms of a canonical function";
+    homepage = "https://github.com/python-variants/variants";
+    changelog = "https://github.com/python-variants/variants/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ rakesh4g ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/varint/default.nix b/nixpkgs/pkgs/development/python-modules/varint/default.nix
new file mode 100644
index 000000000000..143a452344ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/varint/default.nix
@@ -0,0 +1,25 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+}:
+buildPythonPackage rec {
+  pname = "varint";
+  version = "1.0.2";
+
+  src = fetchPypi {
+    inherit pname version ;
+    sha256 = "a6ecc02377ac5ee9d65a6a8ad45c9ff1dac8ccee19400a5950fb51d594214ca5";
+  };
+
+  # No tests are available
+  doCheck = false;
+
+  pythonImportsCheck = [ "varint" ];
+
+  meta = with lib; {
+    description = "A basic varint implementation in python";
+    homepage = "https://github.com/fmoo/python-varint";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rakesh4g ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vat-moss/default.nix b/nixpkgs/pkgs/development/python-modules/vat-moss/default.nix
new file mode 100644
index 000000000000..1bf0879d3427
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vat-moss/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "vat-moss";
+  version = "0.11.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "raphaelm";
+    repo = "vat_moss-python";
+    rev = version;
+    hash = "sha256-c0lcyeW8IUhWKcfn3BmsbNmHyAzm8T0sdYp0Zp0FbFw=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # Update API URL to HTTPS
+      url = "https://github.com/raphaelm/vat_moss-python/commit/ed32b7d893da101332d3bb202d17b1bf89e5d9ed.patch";
+      hash = "sha256-GpxaQ6/1LdFdxzXT/p4HS7FHU0WeM0i3LbdRFeqnFdw=";
+    })
+  ];
+
+  pythonImportsCheck = [
+    "vat_moss"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_fetch"
+  ];
+
+  disabledTestPaths = [
+    # network access
+    "tests/test_id.py"
+  ];
+
+  meta = with lib; {
+    description = "A Python library for dealing with VAT MOSS and Norway VAT on digital services. Includes VAT ID validation, rate calculation based on place of supply, exchange rate and currency tools for invoices";
+    homepage = "https://github.com/raphaelm/vat_moss-python";
+    changelog = "https://github.com/raphaelm/vat_moss-python/blob/${src.rev}/changelog.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vcard/default.nix b/nixpkgs/pkgs/development/python-modules/vcard/default.nix
new file mode 100644
index 000000000000..5e83f498722b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vcard/default.nix
@@ -0,0 +1,38 @@
+{ buildPythonPackage
+, fetchFromGitLab
+, lib
+, pytestCheckHook
+, python-dateutil
+, pythonAtLeast
+, pythonOlder
+}:
+buildPythonPackage rec {
+  pname = "vcard";
+  version = "0.15.4";
+
+  disabled = pythonOlder "3.8" || pythonAtLeast "3.12";
+
+  src = fetchFromGitLab {
+    owner = "engmark";
+    repo = "vcard";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-7GNq6PoWZgwhhpxhWOkUEpqckeSfzocex1ZGN9CTJyo=";
+  };
+
+  propagatedBuildInputs = [ python-dateutil ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "vcard" ];
+
+  meta = {
+    homepage = "https://gitlab.com/engmark/vcard";
+    description = "vCard validator, class and utility functions";
+    longDescription = ''
+      This program can be used for strict validation and parsing of vCards. It currently supports vCard 3.0 (RFC 2426).
+    '';
+    license = lib.licenses.agpl3Plus;
+    mainProgram = "vcard";
+    maintainers = [ lib.maintainers.l0b0 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vcrpy/default.nix b/nixpkgs/pkgs/development/python-modules/vcrpy/default.nix
new file mode 100644
index 000000000000..fc4283766b52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vcrpy/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest-httpbin
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, six
+, yarl
+, wrapt
+}:
+
+buildPythonPackage rec {
+  pname = "vcrpy";
+  version = "5.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-u/FTLyYYoE8RvOKpmvOpZHoyyICVcpP/keCl8Ye2s9I=";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+    six
+    yarl
+    wrapt
+  ];
+
+  nativeCheckInputs = [
+    pytest-httpbin
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    "tests/integration"
+  ];
+
+  disabledTests = [
+    "TestVCRConnection"
+    # https://github.com/kevin1024/vcrpy/issues/645
+    "test_get_vcr_with_matcher"
+    "test_testcase_playback"
+  ];
+
+  pythonImportsCheck = [
+    "vcr"
+  ];
+
+  meta = with lib; {
+    description = "Automatically mock your HTTP interactions to simplify and speed up testing";
+    homepage = "https://github.com/kevin1024/vcrpy";
+    changelog = "https://github.com/kevin1024/vcrpy/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vcver/default.nix b/nixpkgs/pkgs/development/python-modules/vcver/default.nix
new file mode 100644
index 000000000000..503a8f7df7e0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vcver/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, packaging
+}:
+
+buildPythonPackage rec {
+  pname = "vcver";
+  version = "0.2.12";
+
+  src = fetchFromGitHub {
+    owner = "toumorokoshi";
+    repo = "vcver-python";
+    rev = "c5d8a6f1f0e49bb25f5dbb07312e42cb4da096d6";
+    sha256 = "1cvgs70jf7ki78338zaglaw2dkvyndmx15ybd6k4zqwwsfgk490b";
+  };
+
+  propagatedBuildInputs = [
+    packaging
+  ];
+
+  # circular dependency on test tool uranium https://pypi.org/project/uranium/
+  doCheck = false;
+
+  pythonImportsCheck = [ "vcver" ];
+
+  meta = with lib; {
+    description = "Reference Implementation of vcver";
+    homepage = "https://github.com/toumorokoshi/vcver-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vcversioner/default.nix b/nixpkgs/pkgs/development/python-modules/vcversioner/default.nix
new file mode 100644
index 000000000000..236bb8d149b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vcversioner/default.nix
@@ -0,0 +1,17 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "vcversioner";
+  version = "2.16.0.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "16z10sm78jd7ca3jbkgc3q5i8a8q7y1h21q1li21yy3rlhbhrrns";
+  };
+
+  meta = with lib; {
+    description = "take version numbers from version control";
+    homepage = "https://github.com/habnabit/vcversioner";
+    license = licenses.isc;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vdf/default.nix b/nixpkgs/pkgs/development/python-modules/vdf/default.nix
new file mode 100644
index 000000000000..91c6fe3085f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vdf/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "vdf";
+  version = "3.4";
+
+  src = fetchFromGitHub {
+    owner = "ValvePython";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-6ozglzZZNKDtADkHwxX2Zsnkh6BE8WbcRcC9HkTTgPU=";
+  };
+
+  nativeCheckInputs = [ mock pytestCheckHook ];
+  pythonImportsCheck = [ "vdf" ];
+
+  meta = with lib; {
+    description = "Library for working with Valve's VDF text format";
+    homepage = "https://github.com/ValvePython/vdf";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kira-bruneau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vdirsyncer/default.nix b/nixpkgs/pkgs/development/python-modules/vdirsyncer/default.nix
new file mode 100644
index 000000000000..70446323f1d9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vdirsyncer/default.nix
@@ -0,0 +1,90 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, click
+, click-log
+, click-threading
+, requests-toolbelt
+, requests
+, atomicwrites
+, hypothesis
+, pytestCheckHook
+, pytest-subtesthack
+, setuptools
+, setuptools-scm
+, wheel
+, aiostream
+, aiohttp-oauthlib
+, aiohttp
+, pytest-asyncio
+, trustme
+, aioresponses
+, vdirsyncer
+, testers
+}:
+
+buildPythonPackage rec {
+  pname = "vdirsyncer";
+  version = "0.19.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/QWM7quCk0WaBGbNmw5Ks7OUYsbgiaDwrDfDB0INgro=";
+  };
+
+  postPatch = ''
+    sed -i -e '/--cov/d' -e '/--no-cov/d' pyproject.toml
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    atomicwrites
+    click
+    click-log
+    click-threading
+    requests
+    requests-toolbelt
+    aiostream
+    aiohttp
+    aiohttp-oauthlib
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+    pytest-subtesthack
+    pytest-asyncio
+    trustme
+    aioresponses
+  ];
+
+  preCheck = ''
+    export DETERMINISTIC_TESTS=true
+  '';
+
+  disabledTests = [
+    "test_create_collections" # Flaky test exceeds deadline on hydra: https://github.com/pimutils/vdirsyncer/issues/837
+    "test_request_ssl"
+    "test_verbosity"
+  ];
+
+  passthru.tests.version = testers.testVersion { package = vdirsyncer; };
+
+  meta = with lib; {
+    description = "Synchronize calendars and contacts";
+    homepage = "https://github.com/pimutils/vdirsyncer";
+    changelog = "https://github.com/pimutils/vdirsyncer/blob/v${version}/CHANGELOG.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ loewenheim ];
+    mainProgram = "vdirsyncer";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vector/default.nix b/nixpkgs/pkgs/development/python-modules/vector/default.nix
new file mode 100644
index 000000000000..1d8168467db5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vector/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, awkward
+, buildPythonPackage
+, fetchPypi
+, hatch-vcs
+, hatchling
+, numba
+, numpy
+, notebook
+, packaging
+, papermill
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "vector";
+  version = "1.1.1.post1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-elWuVJgW5fyg5S+rjMZtSw5Ls7d1OTPoW0FnZXlANys=";
+  };
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    packaging
+  ];
+
+  checkInputs = [
+    awkward
+    notebook
+    numba
+    papermill
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "vector"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Library for 2D, 3D, and Lorentz vectors, especially arrays of vectors, to solve common physics problems in a NumPy-like way";
+    homepage = "https://github.com/scikit-hep/vector";
+    changelog = "https://github.com/scikit-hep/vector/releases/tag/v${version}";
+    license = with licenses; [ bsd3 ];
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vega-datasets/default.nix b/nixpkgs/pkgs/development/python-modules/vega-datasets/default.nix
new file mode 100644
index 000000000000..e0c9133767fc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vega-datasets/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, pandas
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "vega-datasets";
+  version = "0.9.0";
+  pyproject = true;
+
+  src = fetchPypi {
+    pname = "vega_datasets";
+    inherit version;
+    hash = "sha256-nb6YNCCOjsMqtElw3zFd6RAoYeTNoT2OFDqreoDZP8A=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [ pandas ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pytestFlagsArray = [
+    "--doctest-modules"
+  ];
+
+  pythonImportsCheck = [
+    "vega_datasets"
+  ];
+
+  meta = with lib; let
+    tag = removeSuffix ".0" "v${version}";
+  in {
+    description = "A Python package for offline access to vega datasets";
+    homepage = "https://github.com/altair-viz/vega_datasets";
+    changelog = "https://github.com/altair-viz/vega_datasets/blob/${tag}/CHANGES.md";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vega/default.nix b/nixpkgs/pkgs/development/python-modules/vega/default.nix
new file mode 100644
index 000000000000..556d06d7d393
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vega/default.nix
@@ -0,0 +1,88 @@
+{ lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, pythonOlder
+, pythonRelaxDepsHook
+, altair
+, ipytablewidgets
+, ipywidgets
+, jupyter
+, jupyter-core
+, jupyterlab
+, pandas
+, poetry-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "vega";
+  version = "4.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-v1/8taHdN1n9+gy7L+g/wAJ2x9FwYCaxZiEdFqLct1Y=";
+  };
+
+  patches = [
+    # https://github.com/vega/ipyvega/pull/507
+    (fetchpatch {
+      name = "replace-poetry-with-poetry-core.patch";
+      url = "https://github.com/vega/ipyvega/commit/1a5028ee5d54e24b9650b66685f54c42b72c7899.patch";
+      hash = "sha256-W8UmMit7DJGKCM9+/OSRLTuRvC0ZR42AP/b/frVEvsk=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    "pandas"
+  ];
+
+  propagatedBuildInputs = [
+    ipytablewidgets
+    jupyter
+    jupyter-core
+    pandas
+  ];
+
+  passthru.optional-dependencies = {
+    widget = [
+      ipywidgets
+    ];
+    jupyterlab = [
+      jupyterlab
+    ];
+  };
+
+  nativeCheckInputs = [
+    altair
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # these tests are broken with jupyter-notebook >= 7
+    "vega/tests/test_entrypoint.py"
+  ];
+
+  pythonImportsCheck = [ "vega" ];
+
+  meta = with lib; {
+    description = "An IPython/Jupyter widget for Vega and Vega-Lite";
+    longDescription = ''
+      To use this you have to enter a nix-shell with vega. Then run:
+
+      jupyter nbextension install --user --py vega
+      jupyter nbextension enable --user vega
+    '';
+    homepage = "https://github.com/vega/ipyvega";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ teh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vehicle/default.nix b/nixpkgs/pkgs/development/python-modules/vehicle/default.nix
new file mode 100644
index 000000000000..a233b51773ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vehicle/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pydantic
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "vehicle";
+  version = "2.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-vehicle";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-EbjrAfbqVY336RHBWq81KM+oHixen+38aUTnWZQ+nCs=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pydantic
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # Upstream doesn't set a version for the pyproject.toml
+    substituteInPlace pyproject.toml \
+      --replace "0.0.0" "${version}" \
+      --replace "--cov" ""
+  '';
+
+  pythonImportsCheck = [
+    "vehicle"
+  ];
+
+  meta = with lib; {
+    description = "Python client providing RDW vehicle information";
+    homepage = "https://github.com/frenck/python-vehicle";
+    changelog = "https://github.com/frenck/python-vehicle/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/velbus-aio/default.nix b/nixpkgs/pkgs/development/python-modules/velbus-aio/default.nix
new file mode 100644
index 000000000000..6808c1d906d6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/velbus-aio/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, backoff
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pyserial
+, pyserial-asyncio
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "velbus-aio";
+  version = "2023.11.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "Cereal2nd";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-j0NGeuxhtxmlpal9MpnlHqGv47uTVx1Lyfy9u0cEtYg=";
+    fetchSubmodules = true;
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    backoff
+    pyserial
+    pyserial-asyncio
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "velbusaio"
+  ];
+
+  meta = with lib; {
+    description = "Python library to support the Velbus home automation system";
+    homepage = "https://github.com/Cereal2nd/velbus-aio";
+    changelog = "https://github.com/Cereal2nd/velbus-aio/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/venstarcolortouch/default.nix b/nixpkgs/pkgs/development/python-modules/venstarcolortouch/default.nix
new file mode 100644
index 000000000000..9945c09ea972
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/venstarcolortouch/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "venstarcolortouch";
+  version = "0.19";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QjcoF46GrBH7ExGQno8xDgtOSGNxhAP+NycJb22hL+E=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "venstarcolortouch"
+  ];
+
+  meta = with lib; {
+    description = "Python interface for Venstar ColorTouch thermostats Resources";
+    homepage = "https://github.com/hpeyerl/venstar_colortouch";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/venusian/default.nix b/nixpkgs/pkgs/development/python-modules/venusian/default.nix
new file mode 100644
index 000000000000..2e81a9559fc6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/venusian/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, pytest
+, pytest-cov
+}:
+
+buildPythonPackage rec {
+  pname = "venusian";
+  version = "3.0.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f6842b7242b1039c0c28f6feef29016e7e7dd3caaeb476a193acf737db31ee38";
+  };
+
+  nativeCheckInputs = [ pytest pytest-cov ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "A library for deferring decorator actions";
+    homepage = "https://pylonsproject.org/";
+    license = licenses.bsd0;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/verboselogs/default.nix b/nixpkgs/pkgs/development/python-modules/verboselogs/default.nix
new file mode 100644
index 000000000000..45f747b936ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/verboselogs/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "verboselogs";
+  version = "1.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "xolox";
+    repo = "python-verboselogs";
+    rev = version;
+    hash = "sha256-hcIdbn0gdkdJ33KcOx6uv0iMXW0x+i880SoROi+qX4I=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+  ];
+
+  pythonImportsCheck = [
+    "verboselogs"
+  ];
+
+  disabledTests = [
+    # Do not run pylint plugin test
+    "test_pylint_plugin"
+  ];
+
+  meta = with lib; {
+    description = "Verbose logging for Python's logging module";
+    homepage = "https://github.com/xolox/python-verboselogs";
+    license = licenses.mit;
+    maintainers = with maintainers; [ eyjhb ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/versioneer/default.nix b/nixpkgs/pkgs/development/python-modules/versioneer/default.nix
new file mode 100644
index 000000000000..bbd43887025c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/versioneer/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, tomli
+}:
+
+buildPythonPackage rec {
+  pname = "versioneer";
+  version = "0.29";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "python-versioneer";
+    repo = "python-versioneer";
+    rev = "refs/tags/${version}";
+    hash = "sha256-3b7Wfhd24Vym5XCeN/M1832Q1VzvlWi3quTRaZrID2s=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  passthru.optional-dependencies = {
+    toml = lib.optionals (pythonOlder "3.11") [
+      tomli
+    ];
+  };
+
+  # Couldn't get tests to work because, for instance, they used virtualenv and pip
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "versioneer"
+  ];
+
+  meta = with lib; {
+    description = "Version-string management for VCS-controlled trees";
+    homepage = "https://github.com/python-versioneer/python-versioneer";
+    changelog = "https://github.com/python-versioneer/python-versioneer/blob/${version}/NEWS.md";
+    license = licenses.publicDomain;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/versionfinder/default.nix b/nixpkgs/pkgs/development/python-modules/versionfinder/default.nix
new file mode 100644
index 000000000000..1930b14edad6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/versionfinder/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, backoff
+, buildPythonPackage
+, fetchFromGitHub
+, gitpython
+, pip
+, pytestCheckHook
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "versionfinder";
+  version = "1.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jantman";
+    repo = pname;
+    rev = version;
+    sha256 = "16mvjwyhmw39l8by69dgr9b9jnl7yav36523lkh7w7pwd529pbb9";
+  };
+
+  propagatedBuildInputs = [
+    gitpython
+    backoff
+  ];
+
+  nativeCheckInputs = [
+    pip
+    pytestCheckHook
+    requests
+  ];
+
+  disabledTestPaths = [
+    # Acceptance tests use the network
+    "versionfinder/tests/test_acceptance.py"
+  ];
+
+  disabledTests = [
+    # Tests are out-dated
+    "TestFindPipInfo"
+  ];
+
+  pythonImportsCheck = [
+    "versionfinder"
+  ];
+
+  meta = with lib; {
+    description = "Find the version of another package, whether installed via pip, setuptools or git";
+    homepage = "https://github.com/jantman/versionfinder";
+    changelog = "https://github.com/jantman/versionfinder/blob/${version}/CHANGES.rst";
+    license = licenses.agpl3Plus;
+    maintainers = with maintainers; [ zakame ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/versioningit/default.nix b/nixpkgs/pkgs/development/python-modules/versioningit/default.nix
new file mode 100644
index 000000000000..74a29ae175e9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/versioningit/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, importlib-metadata
+, packaging
+, setuptools
+, tomli
+, pytestCheckHook
+, build
+, pydantic
+, pytest-mock
+, git
+, mercurial
+}:
+
+buildPythonPackage rec {
+  pname = "versioningit";
+  version = "2.2.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6xjnunJoqIC/HM/pLlNOlqs04Dl/KNy8s/wNpPaltr0=";
+  };
+
+  postPatch = ''
+    substituteInPlace tox.ini \
+      --replace "--cov=versioningit" "" \
+      --replace "--cov-config=tox.ini" "" \
+      --replace "--no-cov-on-fail" ""
+  '';
+
+  propagatedBuildInputs = [
+    packaging
+    setuptools
+  ] ++ lib.optionals (pythonOlder "3.10") [
+    importlib-metadata
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    build
+    pydantic
+    pytest-mock
+    git
+    mercurial
+  ];
+
+  disabledTests = [
+    # wants to write to the Nix store
+    "test_editable_mode"
+  ];
+
+  pythonImportsCheck = [
+    "versioningit"
+  ];
+
+  meta = with lib; {
+    description = "setuptools plugin for determining package version from VCS";
+    homepage = "https://github.com/jwodder/versioningit";
+    changelog = "https://versioningit.readthedocs.io/en/latest/changelog.html";
+    license     = licenses.mit;
+    maintainers = with maintainers; [ DeeUnderscore ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/versiontag/default.nix b/nixpkgs/pkgs/development/python-modules/versiontag/default.nix
new file mode 100644
index 000000000000..3e250cd5ea4c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/versiontag/default.nix
@@ -0,0 +1,29 @@
+{ lib, buildPythonPackage, fetchFromGitHub, git }:
+
+buildPythonPackage rec {
+  pname = "versiontag";
+  version = "1.2.0";
+
+  src = fetchFromGitHub {
+    owner = "thelabnyc";
+    repo = "python-versiontag";
+    rev = "r${version}";
+    sha256 = "1axv2214ykgv5adajv10v2zy5fr9v77db54rkik6ja29p66zl90n";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "get_version(pypi=True)" '"${version}"'
+  '';
+
+  nativeCheckInputs = [ git ];
+
+  pythonImportsCheck = [ "versiontag" ];
+
+  meta = with lib; {
+    description = "Python library designed to make accessing the current version number of your software easy";
+    homepage = "https://github.com/thelabnyc/python-versiontag";
+    license = licenses.isc;
+    maintainers = with maintainers; [ MaskedBelgian ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/versiontools/default.nix b/nixpkgs/pkgs/development/python-modules/versiontools/default.nix
new file mode 100644
index 000000000000..f74c8610b4cc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/versiontools/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+}:
+
+buildPythonPackage rec {
+  pname = "versiontools";
+  version = "1.9.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1xhl6kl7f4srgnw6zw4lr8j2z5vmrbaa83nzn2c9r2m1hwl36sd9";
+  };
+
+  doCheck = (!isPy3k);
+
+  meta = with lib; {
+    homepage = "https://launchpad.net/versiontools";
+    description = "Smart replacement for plain tuple used in __version__";
+    license = licenses.lgpl2;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/verspec/default.nix b/nixpkgs/pkgs/development/python-modules/verspec/default.nix
new file mode 100644
index 000000000000..05a6a446c23e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/verspec/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pretend
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "verspec";
+  version = "0.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-xFBMppeyBWzbS/pxIUYfWg6BgJJVtBwD3aS6gjY3wB4=";
+  };
+
+  nativeCheckInputs = [
+    pretend
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Import fail
+    "test/test_specifiers.py"
+  ];
+
+  pythonImportsCheck = [
+    "verspec"
+  ];
+
+  meta = with lib; {
+    description = "Flexible version handling";
+    homepage = "https://github.com/jimporter/verspec";
+    changelog = "https://github.com/jimporter/averspec/releases/tag/v${version}";
+    license = with licenses; [ bsd2 /* and */ asl20 ];
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vertica-python/default.nix b/nixpkgs/pkgs/development/python-modules/vertica-python/default.nix
new file mode 100644
index 000000000000..018b0b27bf52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vertica-python/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, future
+, mock
+, parameterized
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "vertica-python";
+  version = "1.3.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Kl8NARHTzEZrh5I//TwmITKp+g44lk5D7vkKPM2ldFI=";
+  };
+
+  propagatedBuildInputs = [
+    future
+    python-dateutil
+    six
+  ];
+
+  nativeCheckInputs = [
+    mock
+    parameterized
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Integration tests require an accessible Vertica db
+    "vertica_python/tests/integration_tests"
+  ];
+
+  pythonImportsCheck = [
+    "vertica_python"
+  ];
+
+  meta = with lib; {
+    description = "Native Python client for Vertica database";
+    homepage = "https://github.com/vertica/vertica-python";
+    changelog = "https://github.com/vertica/vertica-python/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ arnoldfarkas ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/veryprettytable/default.nix b/nixpkgs/pkgs/development/python-modules/veryprettytable/default.nix
new file mode 100644
index 000000000000..003fd6db621c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/veryprettytable/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, termcolor
+, colorama
+}:
+
+buildPythonPackage rec {
+  pname = "veryprettytable";
+  version = "0.8.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1k1rifz8x6qcicmx2is9vgxcj0qb2f5pvzrp7zhmvbmci3yack3f";
+  };
+
+  propagatedBuildInputs = [ termcolor colorama ];
+
+  meta = with lib; {
+    description = "A simple Python library for easily displaying tabular data in a visually appealing ASCII table format";
+    homepage = "https://github.com/smeggingsmegger/VeryPrettyTable";
+    license = licenses.free;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vg/default.nix b/nixpkgs/pkgs/development/python-modules/vg/default.nix
new file mode 100644
index 000000000000..efda04f78b9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vg/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, poetry-core
+, pythonOlder
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "vg";
+  version = "2.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "lace";
+    repo = "vg";
+    rev = "refs/tags/${version}";
+    hash = "sha256-ZNUAfkhjmsxD8cH0fR8Htjs+/F/3R9xfe1XgRyndids=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'requires = ["setuptools", "poetry-core>=1.0.0"]' 'requires = ["poetry-core>=1.0.0"]'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "vg"
+  ];
+
+  meta = with lib; {
+    description = "Linear algebra for humans: a very good vector-geometry and linear-algebra toolbelt";
+    homepage = "https://github.com/lace/vg";
+    changelog = "https://github.com/lace/vg/blob/${version}/CHANGELOG.md";
+    license = with licenses; [ bsd2 ];
+    maintainers = with maintainers; [ clerie ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/videocr/default.nix b/nixpkgs/pkgs/development/python-modules/videocr/default.nix
new file mode 100644
index 000000000000..0685b184c4ab
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/videocr/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, levenshtein
+, pytesseract
+, opencv4
+, fuzzywuzzy
+}:
+
+buildPythonPackage rec {
+  pname = "videocr";
+  version = "0.1.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1clifwczvhvbaw2spgxkkyqsbqh21vyfw3rh094pxfmq89ylyj63";
+  };
+
+  propagatedBuildInputs = [
+    levenshtein
+    pytesseract
+    opencv4
+    fuzzywuzzy
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "python-Levenshtein" "Levenshtein" \
+      --replace "opencv-python" "opencv"
+    substituteInPlace videocr/constants.py \
+      --replace "master" "main"
+    substituteInPlace videocr/video.py \
+      --replace '--tessdata-dir "{}"' '--tessdata-dir="{}"'
+  '';
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "videocr" ];
+
+  meta = with lib; {
+    description = "Extract hardcoded subtitles from videos using machine learning";
+    homepage = "https://github.com/apm1467/videocr";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ozkutuk ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vidstab/default.nix b/nixpkgs/pkgs/development/python-modules/vidstab/default.nix
new file mode 100644
index 000000000000..dbddbe6be087
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vidstab/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, pandas
+, imutils
+, progress
+, matplotlib
+}:
+
+buildPythonPackage rec {
+  version = "1.7.4";
+  pname = "vidstab";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "865c4a097e2a8527aa8bfc96ab0bcc0d280a88cc93eabcc36531268f5d343ce1";
+  };
+
+  propagatedBuildInputs = [ numpy pandas imutils progress matplotlib ];
+
+  # tests not packaged with pypi
+  doCheck = false;
+  pythonImportsCheck = [ "vidstab" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/AdamSpannbauer/python_video_stab";
+    description = "Video Stabilization using OpenCV";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/viewstate/default.nix b/nixpkgs/pkgs/development/python-modules/viewstate/default.nix
new file mode 100644
index 000000000000..3b1c5e74617d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/viewstate/default.nix
@@ -0,0 +1,36 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, isPy3k
+, lib
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "viewstate";
+  version = "0.4.3";
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "yuvadm";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "15s0n1lhkz0zwi33waqkkjipal3f7s45rxsj1bw89xpr4dj87qx5";
+  };
+
+  nativeCheckInputs = [
+    pytest
+  ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = {
+    description = ".NET viewstate decoder";
+    homepage = "https://github.com/yuvadm/viewstate";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [
+      kamadorueda
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vilfo-api-client/default.nix b/nixpkgs/pkgs/development/python-modules/vilfo-api-client/default.nix
new file mode 100644
index 000000000000..6f023b184f16
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vilfo-api-client/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools-scm
+, getmac
+, requests
+, semver
+, pytestCheckHook
+, responses
+}:
+
+buildPythonPackage rec {
+  pname = "vilfo-api-client";
+  version = "0.4.1";
+
+  src = fetchFromGitHub {
+    owner = "ManneW";
+    repo = "vilfo-api-client-python";
+    rev = version;
+    hash = "sha256-j06Bbv0hWSmrlCv8RfgvfGTyOF+vSX+zZnX3AvG5Hys=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "get-mac" "getmac"
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  propagatedBuildInputs = [
+    getmac
+    requests
+    semver
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  pythonImportsCheck = [ "vilfo" ];
+
+  meta = with lib; {
+    description = "Simple wrapper client for the Vilfo router API";
+    homepage = "https://github.com/ManneW/vilfo-api-client-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vincenty/default.nix b/nixpkgs/pkgs/development/python-modules/vincenty/default.nix
new file mode 100644
index 000000000000..dbf174bd2a72
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vincenty/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "vincenty";
+  version = "0.1.4";
+
+  src = fetchFromGitHub {
+    owner = "maurycyp";
+    repo = "vincenty";
+    rev = version;
+    sha256 = "1li8gv0zb1pdbxdybgaykm38lqbkb5dr7rph6zs1k4k3sh15ldw3";
+  };
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [ "vincenty" ];
+
+  meta = with lib; {
+    description = "Calculate the geographical distance between 2 points with extreme accuracy";
+    homepage = "https://github.com/maurycyp/vincenty";
+    license = licenses.unlicense;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vine/default.nix b/nixpkgs/pkgs/development/python-modules/vine/default.nix
new file mode 100644
index 000000000000..47e9c7b7a3c7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vine/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, case
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "vine";
+  version = "5.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-i2LpgdNcQQSSEc9ioKEkLYwe6b0Vuxls44rv1nmeYeA=";
+  };
+
+  nativeCheckInputs = [
+    case
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "vine"
+  ];
+
+  meta = with lib; {
+    description = "Python promises";
+    homepage = "https://github.com/celery/vine";
+    changelog = "https://github.com/celery/vine/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/virtkey/default.nix b/nixpkgs/pkgs/development/python-modules/virtkey/default.nix
new file mode 100644
index 000000000000..27dcffbfea13
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/virtkey/default.nix
@@ -0,0 +1,26 @@
+{ stdenv, lib, buildPythonPackage, fetchurl, pkg-config, gtk2, libX11, libXtst, libXi, libxkbfile, xorgproto }:
+
+let
+  majorVersion = "0.63";
+  minorVersion = "0";
+in buildPythonPackage rec {
+  pname = "virtkey";
+  version = "${majorVersion}.${minorVersion}";
+
+  src = fetchurl {
+    url = "https://launchpad.net/virtkey/${majorVersion}/${version}/+download/virtkey-${version}.tar.gz";
+    sha256 = "0hd99hrxn6bh3rxcrdnad5cqjsphrn1s6fzx91q07d44k6cg6qcr";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [ gtk2 libX11 libXtst libXi libxkbfile xorgproto ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "Extension to emulate keypresses and to get the layout information from the X server";
+    homepage = "https://launchpad.net/virtkey";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/virtualenv-clone/default.nix b/nixpkgs/pkgs/development/python-modules/virtualenv-clone/default.nix
new file mode 100644
index 000000000000..1c464101bf7e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/virtualenv-clone/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, virtualenv
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "virtualenv-clone";
+  version = "0.5.7";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "edwardgeorge";
+    repo = pname;
+    rev = version;
+    hash = "sha256-qrN74IwLRqiVPxU8gVhdiM34yBmiS/5ot07uroYPDVw=";
+  };
+
+  postPatch = ''
+    substituteInPlace tests/__init__.py \
+      --replace "'virtualenv'" "'${virtualenv}/bin/virtualenv'" \
+      --replace "'3.9', '3.10']" "'3.9', '3.10', '3.11']" # if the Python version used isn't in this list, tests fail
+
+    substituteInPlace tests/test_virtualenv_sys.py \
+      --replace "'virtualenv'" "'${virtualenv}/bin/virtualenv'"
+  '';
+
+  propagatedBuildInputs = [
+    virtualenv
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/edwardgeorge/virtualenv-clone";
+    description = "Script to clone virtualenvs";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/virtualenv/default.nix b/nixpkgs/pkgs/development/python-modules/virtualenv/default.nix
new file mode 100644
index 000000000000..18db218039d3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/virtualenv/default.nix
@@ -0,0 +1,94 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, isPy27
+, isPyPy
+, cython
+, distlib
+, fetchPypi
+, filelock
+, flaky
+, hatch-vcs
+, hatchling
+, importlib-metadata
+, platformdirs
+, pytest-freezegun
+, pytest-mock
+, pytest-timeout
+, pytestCheckHook
+, time-machine
+}:
+
+buildPythonPackage rec {
+  pname = "virtualenv";
+  version = "20.24.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6DYZZ/bab73xQmSDv+n8qCh8JCrAvDBCmQVyHO+/91I=";
+  };
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    distlib
+    filelock
+    platformdirs
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  nativeCheckInputs = [
+    cython
+    flaky
+    pytest-freezegun
+    pytest-mock
+    pytest-timeout
+    pytestCheckHook
+  ] ++ lib.optionals (!isPyPy) [
+    time-machine
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  disabledTestPaths = [
+    # Ignore tests which require network access
+    "tests/unit/create/test_creator.py"
+    "tests/unit/seed/embed/test_bootstrap_link_via_app_data.py"
+  ];
+
+  disabledTests = [
+    # Network access
+    "test_create_no_seed"
+    "test_seed_link_via_app_data"
+    # Permission Error
+    "test_bad_exe_py_info_no_raise"
+  ] ++ lib.optionals (isPyPy) [
+    # encoding problems
+    "test_bash"
+    # permission error
+    "test_can_build_c_extensions"
+    # fails to detect pypy version
+    "test_discover_ok"
+  ];
+
+  pythonImportsCheck = [
+    "virtualenv"
+  ];
+
+  meta = with lib; {
+    description = "A tool to create isolated Python environments";
+    homepage = "http://www.virtualenv.org";
+    changelog = "https://github.com/pypa/virtualenv/blob/${version}/docs/changelog.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/virtualenvwrapper/default.nix b/nixpkgs/pkgs/development/python-modules/virtualenvwrapper/default.nix
new file mode 100644
index 000000000000..087a1a2ca517
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/virtualenvwrapper/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pbr
+, pip
+, pkgs
+, stevedore
+, virtualenv
+, virtualenv-clone
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "virtualenvwrapper";
+  version = "4.8.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "51a1a934e7ed0ff221bdd91bf9d3b604d875afbb3aa2367133503fee168f5bfa";
+  };
+
+  # pip depend on $HOME setting
+  preConfigure = "export HOME=$TMPDIR";
+
+  buildInputs = [ pbr pip pkgs.which ];
+  propagatedBuildInputs = [ stevedore virtualenv virtualenv-clone ];
+
+  postPatch = ''
+    for file in "virtualenvwrapper.sh" "virtualenvwrapper_lazy.sh"; do
+      substituteInPlace "$file" --replace "which" "${pkgs.which}/bin/which"
+
+      # We can't set PYTHONPATH in a normal way (like exporting in a wrapper
+      # script) because the user has to evaluate the script and we don't want
+      # modify the global PYTHONPATH which would affect the user's
+      # environment.
+      # Furthermore it isn't possible to just use VIRTUALENVWRAPPER_PYTHON
+      # for this workaround, because this variable is well quoted inside the
+      # shell script.
+      # (the trailing " -" is required to only replace things like these one:
+      # "$VIRTUALENVWRAPPER_PYTHON" -c "import os,[...] and not in
+      # if-statements or anything like that.
+      # ...and yes, this "patch" is hacky :)
+      substituteInPlace "$file" --replace '"$VIRTUALENVWRAPPER_PYTHON" -' 'env PYTHONPATH="$VIRTUALENVWRAPPER_PYTHONPATH" "$VIRTUALENVWRAPPER_PYTHON" -'
+    done
+  '';
+
+  postInstall = ''
+    # This might look like a dirty hack but we can't use the makeWrapper function because
+    # the wrapped file were then called via "exec". The virtualenvwrapper shell scripts
+    # aren't normal executables. Instead, the user has to evaluate them.
+
+    for file in "virtualenvwrapper.sh" "virtualenvwrapper_lazy.sh"; do
+      local wrapper="$out/bin/$file"
+      local wrapped="$out/bin/.$file-wrapped"
+      mv "$wrapper" "$wrapped"
+
+      # WARNING: Don't indent the lines below because that would break EOF
+      cat > "$wrapper" << EOF
+export PATH="${python}/bin:\$PATH"
+export VIRTUALENVWRAPPER_PYTHONPATH="$PYTHONPATH:$(toPythonPath $out)"
+source "$wrapped"
+EOF
+
+      chmod -x "$wrapped"
+      chmod +x "$wrapper"
+    done
+  '';
+
+  meta = with lib; {
+    description = "Enhancements to virtualenv";
+    homepage = "https://pypi.python.org/pypi/virtualenvwrapper";
+    license = licenses.mit;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/visitor/default.nix b/nixpkgs/pkgs/development/python-modules/visitor/default.nix
new file mode 100644
index 000000000000..1c0d725ac86b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/visitor/default.nix
@@ -0,0 +1,18 @@
+{ lib, buildPythonPackage, fetchPypi }:
+
+buildPythonPackage rec {
+  pname = "visitor";
+  version = "0.1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "02j87v93c50gz68gbgclmbqjcwcr7g7zgvk7c6y4x1mnn81pjwrc";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/mbr/visitor";
+    description = "A tiny pythonic visitor implementation";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vispy/default.nix b/nixpkgs/pkgs/development/python-modules/vispy/default.nix
new file mode 100644
index 000000000000..ae52494d78cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vispy/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, substituteAll
+, fetchPypi
+, cython
+, fontconfig
+, freetype-py
+, hsluv
+, kiwisolver
+, libGL
+, numpy
+, pythonOlder
+, setuptools-scm
+, setuptools-scm-git-archive
+}:
+
+buildPythonPackage rec {
+  pname = "vispy";
+  version = "0.14.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JJpQl5/ACotlEJKDNU3PEs9BXBpdz5gh4RP25ZC5uTw=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./library-paths.patch;
+      fontconfig = "${fontconfig.lib}/lib/libfontconfig${stdenv.hostPlatform.extensions.sharedLibrary}";
+      gl = "${libGL.out}/lib/libGL${stdenv.hostPlatform.extensions.sharedLibrary}";
+    })
+  ];
+
+  nativeBuildInputs = [
+    cython
+    setuptools-scm
+    setuptools-scm-git-archive
+  ];
+
+  buildInputs = [
+    libGL
+  ];
+
+  propagatedBuildInputs = [
+    fontconfig
+    freetype-py
+    hsluv
+    kiwisolver
+    numpy
+  ];
+
+  doCheck = false;  # otherwise runs OSX code on linux.
+
+  pythonImportsCheck = [
+    "vispy"
+    "vispy.color"
+    "vispy.geometry"
+    "vispy.gloo"
+    "vispy.glsl"
+    "vispy.io"
+    "vispy.plot"
+    "vispy.scene"
+    "vispy.util"
+    "vispy.visuals"
+  ];
+
+  meta = with lib; {
+    description = "Interactive scientific visualization in Python";
+    homepage = "https://vispy.org/index.html";
+    changelog = "https://github.com/vispy/vispy/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ goertzenator ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vispy/library-paths.patch b/nixpkgs/pkgs/development/python-modules/vispy/library-paths.patch
new file mode 100644
index 000000000000..05b583c12e4f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vispy/library-paths.patch
@@ -0,0 +1,39 @@
+diff --git a/vispy/ext/fontconfig.py b/vispy/ext/fontconfig.py
+index ff24662b..6a5079f0 100644
+--- a/vispy/ext/fontconfig.py
++++ b/vispy/ext/fontconfig.py
+@@ -7,10 +7,7 @@ from ..util.wrappers import run_subprocess
+ 
+ # Some code adapted from Pyglet
+ 
+-fc = util.find_library('fontconfig')
+-if fc is None:
+-    raise ImportError('fontconfig not found')
+-fontconfig = cdll.LoadLibrary(fc)
++fontconfig = cdll.LoadLibrary('@fontconfig@')
+ 
+ FC_FAMILY = 'family'.encode('ASCII')
+ FC_SIZE = 'size'.encode('ASCII')
+diff --git a/vispy/gloo/gl/gl2.py b/vispy/gloo/gl/gl2.py
+index d5bd9c38..63350e73 100644
+--- a/vispy/gloo/gl/gl2.py
++++ b/vispy/gloo/gl/gl2.py
+@@ -39,16 +39,8 @@ elif sys.platform.startswith('win'):
+         pass
+ else:
+     # Unix-ish
+-    if sys.platform.startswith('darwin'):
+-        _fname = ctypes.util.find_library('OpenGL')
+-    else:
+-        _fname = ctypes.util.find_library('GL')
+-    if not _fname:
+-        logger.warning('Could not load OpenGL library.')
+-        _lib = None
+-    else:
+-        # Load lib
+-        _lib = ctypes.cdll.LoadLibrary(_fname)
++    # Load lib
++    _lib = ctypes.cdll.LoadLibrary("@gl@")
+ 
+ 
+ def _have_context():
diff --git a/nixpkgs/pkgs/development/python-modules/viv-utils/default.nix b/nixpkgs/pkgs/development/python-modules/viv-utils/default.nix
new file mode 100644
index 000000000000..e0093f2ef892
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/viv-utils/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, funcy
+, intervaltree
+, pefile
+, typing-extensions
+, vivisect
+, pytest-sugar
+, pytestCheckHook
+, python-flirt
+}:
+buildPythonPackage rec {
+  pname = "viv-utils";
+  version = "0.7.9";
+
+  src = fetchFromGitHub {
+    owner = "williballenthin";
+    repo = "viv-utils";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-xM3jtA6fNk36+enL/EcQH59CNajYnGlEDu06QXIFz6A=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "==" ">="
+  '';
+
+  propagatedBuildInputs = [
+    funcy
+    intervaltree
+    pefile
+    typing-extensions
+    vivisect
+  ];
+
+  nativeCheckInputs = [
+    pytest-sugar
+    pytestCheckHook
+  ];
+
+  passthru = {
+    optional-dependencies = {
+      flirt = [
+        python-flirt
+      ];
+    };
+  };
+
+  meta = with lib; {
+    description = "Utilities for working with vivisect";
+    homepage = "https://github.com/williballenthin/viv-utils";
+    changelog = "https://github.com/williballenthin/viv-utils/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vivisect/default.nix b/nixpkgs/pkgs/development/python-modules/vivisect/default.nix
new file mode 100644
index 000000000000..bf281f374c50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vivisect/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, cxxfilt
+, fetchPypi
+, msgpack
+, pyasn1
+, pyasn1-modules
+, pycparser
+, pyqt5
+, pythonRelaxDepsHook
+, pyqtwebengine
+, pythonOlder
+, withGui ? false
+, wrapQtAppsHook
+}:
+
+buildPythonPackage rec {
+  pname = "vivisect";
+  version = "1.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-URRBEZelw4s43zqtb/GrLxIksvrqHbqQWntT9jVonhU=";
+  };
+
+  pythonRelaxDeps = [
+    "cxxfilt"
+    "pyasn1"
+    "pyasn1-modules"
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    wrapQtAppsHook
+  ];
+
+  propagatedBuildInputs = [
+    pyasn1
+    pyasn1-modules
+    cxxfilt
+    msgpack
+    pycparser
+  ] ++ lib.optionals (withGui) passthru.optional-dependencies.gui;
+
+  passthru.optional-dependencies.gui = [
+    pyqt5
+    pyqtwebengine
+  ];
+
+  postFixup = ''
+    wrapQtApp $out/bin/vivbin
+  '';
+
+  # requires another repo for test files
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "vivisect"
+  ];
+
+  meta = with lib; {
+    description = "Python disassembler, debugger, emulator, and static analysis framework";
+    homepage = "https://github.com/vivisect/vivisect";
+    changelog = "https://github.com/vivisect/vivisect/blob/v${version}/CHANGELOG.rst";
+    license = licenses.asl20;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vmprof/default.nix b/nixpkgs/pkgs/development/python-modules/vmprof/default.nix
new file mode 100644
index 000000000000..17af0485c4ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vmprof/default.nix
@@ -0,0 +1,58 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchpatch
+, fetchPypi
+, colorama
+, libunwind
+, pytz
+, requests
+, six
+}:
+
+buildPythonPackage rec {
+  version = "0.4.15";
+  pname = "vmprof";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "a2d872a40196404386d1e0d960e97b37c86c3f72a4f9d5a2b5f9ca1adaff5b62";
+  };
+
+  buildInputs = [ libunwind ];
+  propagatedBuildInputs = [ colorama requests six pytz ];
+
+  patches = [
+    (fetchpatch {
+      name = "${pname}-python-3.10-compat.patch";
+      # https://github.com/vmprof/vmprof-python/pull/198
+      url = "https://github.com/vmprof/vmprof-python/commit/e4e99e5aa677f96d1970d88c8a439f995f429f85.patch";
+      hash = "sha256-W/c6WtVuKi7xO2sCOr71mrZTWqI86bWg5a0FeDNolh0=";
+    })
+    (fetchpatch {
+      name = "${pname}-python-3.11-compat.patch";
+      # https://github.com/vmprof/vmprof-python/pull/251 (not yet merged)
+      url = "https://github.com/matthiasdiener/vmprof-python/compare/a1a1b5264ec0b197444c0053e44f8ae4ffed9353...13c39166363b960017393b614270befe01230be8.patch";
+      excludes = [ "test_requirements.txt" ];
+      hash = "sha256-3+0PVdAf83McNd93Q9dD4HLXt39UinVU5BA8jWfT6F4=";
+    })
+  ];
+
+  # No tests included
+  doCheck = false;
+  pythonImportsCheck = [ "vmprof" ];
+
+  # Workaround build failure on -fno-common toolchains:
+  #   ld: src/vmprof_unix.o:src/vmprof_common.h:92: multiple definition of
+  #     `_PyThreadState_Current'; src/_vmprof.o:src/vmprof_common.h:92: first defined here
+  # TODO: can be removed once next release contains:
+  #   https://github.com/vmprof/vmprof-python/pull/203
+  env.NIX_CFLAGS_COMPILE = "-fcommon";
+
+  meta = with lib; {
+    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
+    description = "A vmprof client";
+    license = licenses.mit;
+    homepage = "https://vmprof.readthedocs.org/";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vncdo/default.nix b/nixpkgs/pkgs/development/python-modules/vncdo/default.nix
new file mode 100644
index 000000000000..51b5abbe9ea2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vncdo/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pexpect
+, pillow
+, pycryptodomex
+, pytestCheckHook
+, pythonOlder
+, pyvirtualdisplay
+, setuptools
+, twisted
+}:
+
+buildPythonPackage rec {
+  pname = "vncdo";
+  version = "1.1.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sibson";
+    repo = "vncdotool";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-m8msWa8uUuDEjEUlXHCgYi0HFPKXLVXpXLyuQ3quNbA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pillow
+    pycryptodomex
+    twisted
+  ];
+
+  nativeCheckInputs = [
+    pexpect
+    pytestCheckHook
+    pyvirtualdisplay
+  ];
+
+  pythonImportsCheck = [
+    "vncdotool"
+  ];
+
+  meta = with lib; {
+    description = "A command line VNC client and Python library";
+    homepage = "https://github.com/sibson/vncdotool";
+    changelog = "https://github.com/sibson/vncdotool/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ elitak ];
+    mainProgram = "vncdo";
+    platforms = with platforms; linux ++ darwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vobject/default.nix b/nixpkgs/pkgs/development/python-modules/vobject/default.nix
new file mode 100644
index 000000000000..30f84150283c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vobject/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi, isPyPy, python, python-dateutil }:
+
+buildPythonPackage rec {
+  version = "0.9.6.1";
+  pname = "vobject";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "96512aec74b90abb71f6b53898dd7fe47300cc940104c4f79148f0671f790101";
+  };
+
+  disabled = isPyPy;
+
+  propagatedBuildInputs = [ python-dateutil ];
+
+  checkPhase = "${python.interpreter} tests.py";
+
+  meta = with lib; {
+    description = "Module for reading vCard and vCalendar files";
+    homepage = "http://eventable.github.io/vobject/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/volatile/default.nix b/nixpkgs/pkgs/development/python-modules/volatile/default.nix
new file mode 100644
index 000000000000..7be5989b159b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/volatile/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "volatile";
+  version = "2.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mbr";
+    repo = "volatile";
+    rev = "refs/tags/${version}";
+    hash = "sha256-TYUvr0bscM/FaPk9oiF4Ob7HdKa2HlbpEFmaPfh4ir0=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "volatile"
+  ];
+
+  meta = with lib; {
+    description = "A small extension for the tempfile module";
+    homepage = "https://github.com/mbr/volatile";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/volkszaehler/default.nix b/nixpkgs/pkgs/development/python-modules/volkszaehler/default.nix
new file mode 100644
index 000000000000..dcb153ba98ca
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/volkszaehler/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "volkszaehler";
+  version = "0.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-ecosystem";
+    repo = "python-volkszaehler";
+    rev = "refs/tags/${version}";
+    hash = "sha256-jX0nwBsBYU383LG8f08FVI7Lo9gnyPSQ0fiEF8dQc/M=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # no tests are present
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "volkszaehler"
+  ];
+
+  meta = with lib; {
+    description = "Python module for interacting with the Volkszahler API";
+    homepage = "https://github.com/home-assistant-ecosystem/python-volkszaehler";
+    changelog = "https://github.com/home-assistant-ecosystem/python-volkszaehler/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/voluptuous-serialize/default.nix b/nixpkgs/pkgs/development/python-modules/voluptuous-serialize/default.nix
new file mode 100644
index 000000000000..c5e0093f4487
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/voluptuous-serialize/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, voluptuous
+}:
+
+buildPythonPackage rec  {
+  pname = "voluptuous-serialize";
+  version = "2.6.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = "voluptuous-serialize";
+    rev = "refs/tags/${version}";
+    hash = "sha256-vvreXSQDkA3JkZpOKZqJgMRyObJX/cSR8r+A26h9fNE=";
+  };
+
+  propagatedBuildInputs = [
+    voluptuous
+  ];
+
+  pythonImportsCheck = [
+    "voluptuous_serialize"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Convert Voluptuous schemas to dictionaries so they can be serialized";
+    homepage = "https://github.com/home-assistant-libs/voluptuous-serialize";
+    changelog = "https://github.com/home-assistant-libs/voluptuous-serialize/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/voluptuous-stubs/default.nix b/nixpkgs/pkgs/development/python-modules/voluptuous-stubs/default.nix
new file mode 100644
index 000000000000..840a7cc51004
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/voluptuous-stubs/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mypy
+}:
+
+buildPythonPackage rec {
+  pname = "voluptuous-stubs";
+  version = "0.1.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-cPscCIJC8g4RAjJStWSM13+DH2ks2RDI+XE8wTXPjMg=";
+  };
+
+  nativeBuildInputs = [
+    mypy
+  ];
+
+  pythonImportsCheck = [
+    "voluptuous-stubs"
+  ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Typing stubs for voluptuous";
+    homepage = "https://github.com/ryanwang520/voluptuous-stubs";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/voluptuous/default.nix b/nixpkgs/pkgs/development/python-modules/voluptuous/default.nix
new file mode 100644
index 000000000000..c7e82d193f58
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/voluptuous/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "voluptuous";
+  version = "0.13.1";
+
+  src = fetchFromGitHub {
+    owner = "alecthomas";
+    repo = pname;
+    rev = version;
+    hash = "sha256-cz3Bd+/yPh+VOHxzi/W+gbDh/H5Nl/n4jvxDOirmAVk=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "voluptuous"
+  ];
+
+  pytestFlagsArray = [
+    "voluptuous/tests/"
+  ];
+
+  meta = with lib; {
+    description = "Python data validation library";
+    homepage = "http://alecthomas.github.io/voluptuous/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/volvooncall/default.nix b/nixpkgs/pkgs/development/python-modules/volvooncall/default.nix
new file mode 100644
index 000000000000..33efbf4082ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/volvooncall/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, aiohttp
+, amqtt
+, buildPythonPackage
+, certifi
+, docopt
+, fetchFromGitHub
+, fetchpatch
+, geopy
+, mock
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "volvooncall";
+  version = "0.10.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "molobrakos";
+    repo = "volvooncall";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-xr3g93rt3jvxVZrZY7cFh5eBP3k0arsejsgvx8p5EV4=";
+  };
+
+  patches = [
+    # Remove asynctest, https://github.com/molobrakos/volvooncall/pull/92
+    (fetchpatch {
+      name = "remove-asnyc.patch";
+      url = "https://github.com/molobrakos/volvooncall/commit/ef0df403250288c00ed4c600e9dfa79dcba8941e.patch";
+      hash = "sha256-U+hM7vzD9JSEUumvjPSLpVQcc8jAuZHG3/1dQ3wnIcA=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  passthru.optional-dependencies = {
+    console = [
+      certifi
+      docopt
+      geopy
+    ];
+    mqtt = [
+      amqtt
+      certifi
+    ];
+  };
+
+  checkInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.mqtt;
+
+  pythonImportsCheck = [
+    "volvooncall"
+  ];
+
+  meta = with lib; {
+    description = "Retrieve information from the Volvo On Call web service";
+    homepage = "https://github.com/molobrakos/volvooncall";
+    changelog = "https://github.com/molobrakos/volvooncall/releases/tag/v${version}";
+    license = licenses.unlicense;
+    mainProgram = "voc";
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vowpalwabbit/default.nix b/nixpkgs/pkgs/development/python-modules/vowpalwabbit/default.nix
new file mode 100644
index 000000000000..f53971637fb3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vowpalwabbit/default.nix
@@ -0,0 +1,75 @@
+{ stdenv
+, lib
+, fetchPypi
+, buildPythonPackage
+, cmake
+, python
+, zlib
+, ncurses
+, docutils
+, pygments
+, numpy
+, scipy
+, scikit-learn
+, spdlog
+, fmt
+, rapidjson
+}:
+
+buildPythonPackage rec {
+  pname = "vowpalwabbit";
+  version = "9.9.0";
+
+  src = fetchPypi{
+    inherit pname version;
+    hash = "sha256-YCg2EI4rhEMwcVEzx9ES8Z3CoCddeUFVk4lZ0nuQJUc=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+  ];
+
+  buildInputs = [
+    docutils
+    ncurses
+    pygments
+    python.pkgs.boost
+    zlib.dev
+    spdlog
+    fmt
+    rapidjson
+  ];
+
+  # As we disable configure via cmake, pass explicit global options to enable
+  # spdlog and fmt packages
+  setupPyGlobalFlags = [ "--cmake-options=\"-DSPDLOG_SYS_DEP=ON;-DFMT_SYS_DEP=ON\"" ];
+
+  propagatedBuildInputs = [
+    numpy
+    scikit-learn
+    scipy
+  ];
+
+  # Python build script uses CMake, but we don't want CMake to do the
+  # configuration.
+  dontUseCmakeConfigure = true;
+
+  # Python ctypes.find_library uses DYLD_LIBRARY_PATH.
+  preConfigure = lib.optionalString stdenv.isDarwin ''
+    export DYLD_LIBRARY_PATH="${python.pkgs.boost}/lib"
+  '';
+
+  checkPhase = ''
+    # check-manifest requires a git clone, not a tarball
+    # check-manifest --ignore "Makefile,PACKAGE.rst,*.cc,tox.ini,tests*,examples*,src*"
+    ${python.interpreter} setup.py check -ms
+  '';
+
+  meta = with lib; {
+    description = "Vowpal Wabbit is a fast machine learning library for online learning, and this is the python wrapper for the project.";
+    homepage    = "https://github.com/JohnLangford/vowpal_wabbit";
+    license     = licenses.bsd3;
+    broken      = stdenv.isAarch64;
+    maintainers = with maintainers; [ teh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vpk/default.nix b/nixpkgs/pkgs/development/python-modules/vpk/default.nix
new file mode 100644
index 000000000000..6adf28cebdd3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vpk/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "vpk";
+  version = "1.4.0";
+
+  src = fetchFromGitHub {
+    owner = "ValvePython";
+    repo = "vpk";
+    rev = "v${version}";
+    hash = "sha256-SPkPb8kveAR2cN9kd2plS+TjmBYBCfa6pJ0c22l69M0=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Library for working with Valve Pak files";
+    homepage = "https://github.com/ValvePython/vpk";
+    license = licenses.mit;
+    maintainers = with maintainers; [ joshuafern ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vqgan-jax/default.nix b/nixpkgs/pkgs/development/python-modules/vqgan-jax/default.nix
new file mode 100644
index 000000000000..e917230b62b3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vqgan-jax/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flax
+, jax
+, jaxlib
+, transformers
+}:
+
+buildPythonPackage rec {
+  pname = "vqgan-jax";
+  version = "unstable-2022-04-20";
+
+  src = fetchFromGitHub {
+    owner = "patil-suraj";
+    repo = "vqgan-jax";
+    rev = "1be20eee476e5d35c30e4ec3ed12222018af8ce4";
+    hash = "sha256-OZihAXpE0UsgauQ38XDmAF+lrIgz05uK0ro8SCdVsPc=";
+  };
+
+  format = "setuptools";
+
+  buildInputs = [
+    jaxlib
+  ];
+
+  propagatedBuildInputs = [
+    flax
+    jax
+    transformers
+  ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "vqgan_jax"
+  ];
+
+  meta = with lib; {
+    description = "JAX implementation of VQGAN";
+    homepage = "https://github.com/patil-suraj/vqgan-jax";
+    # license unknown: https://github.com/patil-suraj/vqgan-jax/issues/9
+    license = lib.licenses.unfree;
+    maintainers = with maintainers; [ r-burns ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vsts-cd-manager/default.nix b/nixpkgs/pkgs/development/python-modules/vsts-cd-manager/default.nix
new file mode 100644
index 000000000000..b1de4105668a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vsts-cd-manager/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchPypi, msrest
+, mock
+}:
+
+buildPythonPackage rec {
+  version = "1.0.2";
+  pname = "vsts-cd-manager";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0ys4hrmjbxl4qr26qr3dhhs27yfwn1635vwjdqh1qgjmrmcr1c0b";
+  };
+
+  propagatedBuildInputs = [ msrest mock ];
+
+  # no tests included
+  doCheck = false;
+
+  pythonImportsCheck = [ "vsts_cd_manager" ];
+
+  meta = with lib; {
+    description = "Microsoft Azure API Management Client Library for Python";
+    homepage = "https://github.com/Azure/azure-sdk-for-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vsts/default.nix b/nixpkgs/pkgs/development/python-modules/vsts/default.nix
new file mode 100644
index 000000000000..a7d676ac2c5d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vsts/default.nix
@@ -0,0 +1,34 @@
+{ buildPythonPackage
+, lib
+, python
+, fetchPypi
+, msrest
+}:
+
+buildPythonPackage rec {
+  version = "0.1.25";
+  pname = "vsts";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "15sgwqa72ynpahj101r2kc15s3dnsafg5gqx0sz3hnqz29h925ys";
+  };
+
+  propagatedBuildInputs = [ msrest ];
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "msrest>=0.6.0,<0.7.0" "msrest"
+  '';
+
+  # Tests are highly impure
+  checkPhase = ''
+    ${python.interpreter} -c 'import vsts.version; print(vsts.version.VERSION)'
+  '';
+
+  meta = with lib; {
+    description = "Python APIs for interacting with and managing Azure DevOps";
+    homepage = "https://github.com/microsoft/azure-devops-python-api";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vsure/default.nix b/nixpkgs/pkgs/development/python-modules/vsure/default.nix
new file mode 100644
index 000000000000..441969da6137
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vsure/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, click
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "vsure";
+  version = "2.6.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/eVFa1BTFbvFTAt48Bv+bjsV7f2eVSuKARJQVxDqU9s=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "verisure"
+  ];
+
+  meta = with lib; {
+    description = "Python library for working with verisure devices";
+    homepage = "https://github.com/persandstrom/python-verisure";
+    changelog = "https://github.com/persandstrom/python-verisure#version-history";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vt-py/default.nix b/nixpkgs/pkgs/development/python-modules/vt-py/default.nix
new file mode 100644
index 000000000000..ea44c4b5a165
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vt-py/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-httpserver
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "vt-py";
+  version = "0.17.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "VirusTotal";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-O95W/J5y7qcR6PSzNQwOl0W19CyXifbq8okquESFSqM=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-httpserver
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'" ""
+  '';
+
+  pythonImportsCheck = [
+    "vt"
+  ];
+
+  meta = with lib; {
+    description = "Python client library for VirusTotal";
+    homepage = "https://virustotal.github.io/vt-py/";
+    changelog = "https://github.com/VirusTotal/vt-py/releases/tag//${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vulcan-api/default.nix b/nixpkgs/pkgs/development/python-modules/vulcan-api/default.nix
new file mode 100644
index 000000000000..a7ed68b16a1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vulcan-api/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, aenum
+, aiodns
+, aiohttp
+, buildPythonPackage
+, faust-cchardet
+, fetchFromGitHub
+, pyopenssl
+, pythonOlder
+, pythonRelaxDepsHook
+, pytz
+, related
+, requests
+, uonet-request-signer-hebe
+, yarl
+}:
+
+buildPythonPackage rec {
+  pname = "vulcan-api";
+  version = "2.3.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "kapi2289";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-5Tj611p4wYn7GjoCtCTRhUZkKyAJglHcci76ciVFWik=";
+  };
+
+  pythonRemoveDeps = [
+    "faust-cchardet"
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    aenum
+    aiodns
+    aiohttp
+    faust-cchardet
+    pyopenssl
+    pytz
+    related
+    requests
+    uonet-request-signer-hebe
+    yarl
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "vulcan"
+  ];
+
+  meta = with lib; {
+    description = "Python library for UONET+ e-register API";
+    homepage = "https://vulcan-api.readthedocs.io/";
+    changelog = "https://github.com/kapi2289/vulcan-api/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vultr/default.nix b/nixpkgs/pkgs/development/python-modules/vultr/default.nix
new file mode 100644
index 000000000000..b6f8a407b234
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vultr/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+}:
+
+buildPythonPackage rec {
+  version = "1.0.1";
+  pname = "vultr";
+
+  src = fetchFromGitHub {
+    owner = "spry-group";
+    repo = "python-vultr";
+    rev = "v${version}";
+    sha256 = "00lc5hdhchvm0472p03019bp9541d8y2773xkjy8vblq9qhys8q7";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Tests disabled. They fail because they try to access the network
+  doCheck = false;
+
+  pythonImportsCheck = [ "vultr" ];
+
+  meta = with lib; {
+    description = "Vultr.com API Client";
+    homepage = "https://github.com/spry-group/python-vultr";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lihop ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vulture/default.nix b/nixpkgs/pkgs/development/python-modules/vulture/default.nix
new file mode 100644
index 000000000000..5578b54ccd28
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vulture/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pint
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, toml
+, tomli
+}:
+
+buildPythonPackage rec {
+  pname = "vulture";
+  version = "2.10";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-KlwxYL/7p3WVtubfzEEgFr0qCc1LZs33+7qRNoSJn28=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --cov vulture --cov-report=html --cov-report=term --cov-report=xml --cov-append" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = lib.optionals (pythonOlder "3.11") [
+    tomli
+  ];
+
+  nativeCheckInputs = [
+    pint
+    pytestCheckHook
+    toml
+  ];
+
+  pythonImportsCheck = [
+    "vulture"
+  ];
+
+  meta = with lib; {
+    description = "Finds unused code in Python programs";
+    homepage = "https://github.com/jendrikseipp/vulture";
+    changelog = "https://github.com/jendrikseipp/vulture/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mcwitt ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/vxi11/default.nix b/nixpkgs/pkgs/development/python-modules/vxi11/default.nix
new file mode 100644
index 000000000000..e33fb6dbc045
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/vxi11/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub, nose }:
+
+buildPythonPackage rec {
+  pname = "python-vxi11";
+  version = "0.9";
+
+  # no tests in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "python-ivi";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1xv7chp7rm0vrvbz6q57fpwhlgjz461h08q9zgmkcl2l0w96hmsn";
+  };
+
+  nativeCheckInputs = [ nose ];
+  checkPhase = ''
+    nosetests
+  '';
+
+  meta = with lib; {
+    description = "VXI-11 driver for controlling instruments over Ethernet";
+    homepage = "https://github.com/python-ivi/python-vxi11";
+    license = licenses.mit;
+    maintainers = with maintainers; [ bgamari ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/w1thermsensor/default.nix b/nixpkgs/pkgs/development/python-modules/w1thermsensor/default.nix
new file mode 100644
index 000000000000..e1592ab86287
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/w1thermsensor/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pkgs
+, setuptools
+, aiofiles
+, click
+, coverage
+, tomli
+, pytest
+, pytest-mock
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "w1thermsensor";
+  version = "2.3.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-n7wK4N1mzZtUxtYu17qyuI4UjJh/59UGD0dvkOgcInA=";
+  };
+
+  postPatch = ''
+    sed -i 's/3\.5\.\*/3.5/' setup.py
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    click
+  ];
+
+  passthru.optional-dependencies = {
+    async = [
+      aiofiles
+    ];
+  };
+
+  # Don't try to load the kernel module in tests.
+  env.W1THERMSENSOR_NO_KERNEL_MODULE = 1;
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytest-asyncio
+    pytestCheckHook
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    tomli
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "w1thermsensor"
+  ];
+
+  meta = with lib; {
+    description = "Python interface to 1-Wire temperature sensors";
+    longDescription = ''
+      A Python package and CLI tool to work with w1 temperature sensors like
+      DS1822, DS18S20 & DS18B20 on the Raspberry Pi, Beagle Bone and other
+      devices.
+    '';
+    homepage = "https://github.com/timofurrer/w1thermsensor";
+    changelog = "https://github.com/timofurrer/w1thermsensor/blob/v${version}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ quentin ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/w3lib/default.nix b/nixpkgs/pkgs/development/python-modules/w3lib/default.nix
new file mode 100644
index 000000000000..66e48a2b7f29
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/w3lib/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "w3lib";
+  version = "2.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-7Vt06ZfuoqvjwTIfkW40QUTujpBypvM0Y+6OV/hYpLE=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "w3lib"
+  ];
+
+  disabledTests = lib.optionals (pythonAtLeast "3.11") [
+    # regressed on Python 3.11.4
+    # https://github.com/scrapy/w3lib/issues/212
+    "test_safe_url_string_url"
+  ];
+
+  meta = with lib; {
+    description = "Library of web-related functions";
+    homepage = "https://github.com/scrapy/w3lib";
+    changelog = "https://github.com/scrapy/w3lib/blob/v${version}/NEWS";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wadllib/default.nix b/nixpkgs/pkgs/development/python-modules/wadllib/default.nix
new file mode 100644
index 000000000000..b169a93ff87f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wadllib/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy3k
+, setuptools
+, lazr-uri
+}:
+
+buildPythonPackage rec {
+  pname = "wadllib";
+  version = "1.3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "acd9ad6a2c1007d34ca208e1da6341bbca1804c0e6850f954db04bdd7666c5fc";
+  };
+
+  propagatedBuildInputs = [ setuptools lazr-uri ];
+
+  doCheck = isPy3k;
+
+  meta = with lib; {
+    description = "Navigate HTTP resources using WADL files as guides";
+    homepage = "https://launchpad.net/wadllib";
+    license = licenses.lgpl3;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wagtail-factories/default.nix b/nixpkgs/pkgs/development/python-modules/wagtail-factories/default.nix
new file mode 100644
index 000000000000..c31993b1e5f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wagtail-factories/default.nix
@@ -0,0 +1,38 @@
+{ buildPythonPackage
+, callPackage
+, factory-boy
+, fetchFromGitHub
+, lib
+, wagtail
+}:
+
+buildPythonPackage rec {
+  pname = "wagtail-factories";
+  version = "4.1.0";
+
+  src = fetchFromGitHub {
+    repo = pname;
+    owner = "wagtail";
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-xNLHJ/8IZt3pzHAzr9swcL6GcIQyIjIFfoeHUW1i76U=";
+  };
+
+  propagatedBuildInputs = [
+    factory-boy
+    wagtail
+  ];
+
+  # Tests require wagtail which in turn requires wagtail-factories
+  # Note that pythonImportsCheck is not used because it requires a Django app
+  doCheck = false;
+
+  passthru.tests.wagtail-factories = callPackage ./tests.nix { };
+
+  meta = with lib; {
+    description = "Factory boy classes for wagtail";
+    homepage = "https://github.com/wagtail/wagtail-factories";
+    changelog = "https://github.com/wagtail/wagtail-factories/blob/${version}/CHANGES";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sephi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wagtail-factories/tests.nix b/nixpkgs/pkgs/development/python-modules/wagtail-factories/tests.nix
new file mode 100644
index 000000000000..b340705f2e88
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wagtail-factories/tests.nix
@@ -0,0 +1,24 @@
+{ buildPythonPackage
+, django-pattern-library
+, pytest-django
+, pytestCheckHook
+, wagtail
+, wagtail-factories
+}:
+
+buildPythonPackage {
+  pname = "wagtail-factories-tests";
+  format = "other";
+  inherit (wagtail-factories) src version;
+
+  dontBuild = true;
+  dontInstall = true;
+
+  checkInputs = [
+    django-pattern-library
+    pytestCheckHook
+    pytest-django
+    wagtail
+    wagtail-factories
+  ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wagtail-localize/default.nix b/nixpkgs/pkgs/development/python-modules/wagtail-localize/default.nix
new file mode 100644
index 000000000000..d90a71ca2582
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wagtail-localize/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, dj-database-url
+, django
+, django-rq
+, fetchFromGitHub
+, flit-core
+, freezegun
+, google-cloud-translate
+, polib
+, python
+, pythonOlder
+, typing-extensions
+, wagtail
+}:
+
+buildPythonPackage rec {
+  pname = "wagtail-localize";
+  version = "1.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    repo = pname;
+    owner = "wagtail";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Q29Nh/4Z3tYuwoodWKDl5FS+lfl9yDXN7RHn/RReCds=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    django
+    wagtail
+    polib
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    dj-database-url
+    django-rq
+    freezegun
+    google-cloud-translate
+  ];
+
+  passthru.optional-dependencies = {
+    google = [
+      google-cloud-translate
+    ];
+  };
+
+  checkPhase = ''
+    # test_translate_html fails with later Beautifulsoup releases
+    rm wagtail_localize/machine_translators/tests/test_dummy_translator.py
+    ${python.interpreter} testmanage.py test
+  '';
+
+  meta = with lib; {
+    description = "Translation plugin for Wagtail CMS";
+    homepage = "https://github.com/wagtail/wagtail-localize";
+    changelog = "https://github.com/wagtail/wagtail-localize/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ sephi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wagtail/default.nix b/nixpkgs/pkgs/development/python-modules/wagtail/default.nix
new file mode 100644
index 000000000000..8fe5ba39ed51
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wagtail/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, anyascii
+, beautifulsoup4
+, buildPythonPackage
+, callPackage
+, django
+, django-filter
+, django-modelcluster
+, django-taggit
+, django-treebeard
+, djangorestframework
+, draftjs-exporter
+, fetchPypi
+, html5lib
+, l18n
+, openpyxl
+, permissionedforms
+, pillow
+, pythonOlder
+, requests
+, telepath
+, willow
+}:
+
+buildPythonPackage rec {
+  pname = "wagtail";
+  version = "5.1.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-RfrHlOTCDH51sBgGnX+XYfJfqjYZ7zDfJAE8okq/mnQ=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "beautifulsoup4>=4.8,<4.12" "beautifulsoup4>=4.8" \
+      --replace "draftjs_exporter>=2.1.5,<3.0" "draftjs_exporter>=2.1.5,<6.0"
+  '';
+
+  propagatedBuildInputs = [
+    anyascii
+    beautifulsoup4
+    django
+    django-treebeard
+    django-filter
+    django-modelcluster
+    django-taggit
+    djangorestframework
+    draftjs-exporter
+    html5lib
+    l18n
+    openpyxl
+    permissionedforms
+    pillow
+    requests
+    telepath
+    willow
+  ] ++ willow.optional-dependencies.heif;
+
+  # Tests are in separate derivation because they require a package that depends
+  # on wagtail (wagtail-factories)
+  doCheck = false;
+
+  passthru.tests.wagtail = callPackage ./tests.nix {};
+
+  meta = with lib; {
+    description = "A Django content management system focused on flexibility and user experience";
+    homepage = "https://github.com/wagtail/wagtail";
+    changelog = "https://github.com/wagtail/wagtail/blob/v${version}/CHANGELOG.txt";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ sephi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wagtail/tests.nix b/nixpkgs/pkgs/development/python-modules/wagtail/tests.nix
new file mode 100644
index 000000000000..23eb87c1b17c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wagtail/tests.nix
@@ -0,0 +1,42 @@
+{ azure-mgmt-cdn
+, azure-mgmt-frontdoor
+, boto3
+, buildPythonPackage
+, django-pattern-library
+, elasticsearch
+, freezegun
+, jinja2
+, python-dateutil
+, python
+, pytz
+, wagtail
+, wagtail-factories
+}:
+
+buildPythonPackage {
+  pname = "wagtail-tests";
+  inherit (wagtail) src version;
+  format = "other";
+
+  dontBuild = true;
+  dontInstall = true;
+
+  checkInputs = [
+    wagtail
+    wagtail-factories
+    jinja2
+    freezegun
+    elasticsearch
+    azure-mgmt-cdn
+    python-dateutil
+    pytz
+    boto3
+    django-pattern-library
+    azure-mgmt-frontdoor
+  ];
+
+  checkPhase = ''
+    export DJANGO_SETTINGS_MODULE=wagtail.test.settings
+    ${python.interpreter} -m django test
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/waitress-django/default.nix b/nixpkgs/pkgs/development/python-modules/waitress-django/default.nix
new file mode 100644
index 000000000000..4e40980d917a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/waitress-django/default.nix
@@ -0,0 +1,16 @@
+{ lib, buildPythonPackage, django, waitress }:
+
+buildPythonPackage {
+  pname = "waitress-django";
+  version = "1.0.0";
+
+  src = ./.;
+  pythonPath = [ django waitress ];
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A waitress WSGI server serving django";
+    license = licenses.mit;
+    maintainers = with maintainers; [ basvandijk ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/waitress-django/setup.py b/nixpkgs/pkgs/development/python-modules/waitress-django/setup.py
new file mode 100644
index 000000000000..16fde78f42a9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/waitress-django/setup.py
@@ -0,0 +1,12 @@
+#!/usr/bin/env python
+
+from distutils.core import setup
+
+setup( name         = "waitress-django"
+     , version      = "1.0.0"
+     , description  = "A waitress WSGI server serving django"
+     , author       = "Bas van Dijk"
+     , author_email = "v.dijk.bas@gmail.com"
+     , package_dir  = {"" : "src"}
+     , scripts      = ["src/waitress-serve-django"]
+     )
diff --git a/nixpkgs/pkgs/development/python-modules/waitress-django/src/waitress-serve-django b/nixpkgs/pkgs/development/python-modules/waitress-django/src/waitress-serve-django
new file mode 100755
index 000000000000..b710086c22b9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/waitress-django/src/waitress-serve-django
@@ -0,0 +1,14 @@
+#!/usr/bin/env python
+import sys
+from waitress import serve
+from waitress.adjustments import Adjustments
+import django
+from django.core.handlers.wsgi import WSGIHandler
+from django.contrib.staticfiles.handlers import StaticFilesHandler
+
+if __name__ == "__main__":
+  kw, args = Adjustments.parse_args(sys.argv[1:])
+  django.setup()
+  # These arguments are specific to the runner, not waitress itself.
+  del kw['call'], kw['help']
+  serve(StaticFilesHandler(WSGIHandler()), **kw)
diff --git a/nixpkgs/pkgs/development/python-modules/waitress/default.nix b/nixpkgs/pkgs/development/python-modules/waitress/default.nix
new file mode 100644
index 000000000000..898b1093159d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/waitress/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "waitress";
+  version = "2.1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "780a4082c5fbc0fde6a2fcfe5e26e6efc1e8f425730863c04085769781f51eba";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+     homepage = "https://github.com/Pylons/waitress";
+     description = "Waitress WSGI server";
+     license = licenses.zpl20;
+     maintainers = with maintainers; [ domenkozar ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wakeonlan/default.nix b/nixpkgs/pkgs/development/python-modules/wakeonlan/default.nix
new file mode 100644
index 000000000000..97ceedec0d26
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wakeonlan/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "wakeonlan";
+  version = "3.1.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "remcohaszing";
+    repo = "pywakeonlan";
+    rev = "refs/tags/${version}";
+    hash = "sha256-VPdklyD3GVn0cex4I6zV61I0bUr4KQp8DdMKAM/r4io=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "test_wakeonlan.py"
+  ];
+
+  pythonImportsCheck = [
+    "wakeonlan"
+  ];
+
+  meta = with lib; {
+    description = "Python module for wake on lan";
+    homepage = "https://github.com/remcohaszing/pywakeonlan";
+    changelog = "https://github.com/remcohaszing/pywakeonlan/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wallbox/default.nix b/nixpkgs/pkgs/development/python-modules/wallbox/default.nix
new file mode 100644
index 000000000000..a53344a76fd1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wallbox/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, aenum
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+, simplejson
+}:
+
+buildPythonPackage rec {
+  pname = "wallbox";
+  version = "0.5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-EDEB7/CkrfYSNcSh55Itrj6rThsNKeuj8lHLAY+Qml4=";
+  };
+
+  propagatedBuildInputs = [
+    aenum
+    requests
+    simplejson
+  ];
+
+  # no tests implemented
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "wallbox"
+  ];
+
+  meta = with lib; {
+    description = "Module for interacting with Wallbox EV charger api";
+    homepage = "https://github.com/cliviu74/wallbox";
+    changelog = "https://github.com/cliviu74/wallbox/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/walrus/default.nix b/nixpkgs/pkgs/development/python-modules/walrus/default.nix
new file mode 100644
index 000000000000..73376590bda3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/walrus/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, pkgs
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, redis
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "walrus";
+  version = "0.9.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "coleifer";
+    repo = "walrus";
+    rev = "refs/tags/${version}";
+    hash = "sha256-jinYMGSBAY8HTg92qU/iU5vGIrrDr5SeQG0XjsBVfcc=";
+  };
+
+  propagatedBuildInputs = [
+    redis
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  preCheck = ''
+    ${pkgs.redis}/bin/redis-server &
+    REDIS_PID=$!
+  '';
+
+  postCheck = ''
+    kill $REDIS_PID
+  '';
+
+  pythonImportsCheck = [
+    "walrus"
+  ];
+
+  meta = with lib; {
+    description = "Lightweight Python utilities for working with Redis";
+    homepage = "https://github.com/coleifer/walrus";
+    changelog = "https://github.com/coleifer/walrus/blob/${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wand/default.nix b/nixpkgs/pkgs/development/python-modules/wand/default.nix
new file mode 100644
index 000000000000..8436ee9b8c05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wand/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, imagemagickBig
+, py
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "wand";
+  version = "0.6.13";
+
+  src = fetchPypi {
+    pname = "Wand";
+    inherit version;
+    hash = "sha256-9QE0hOr3og6yLRghqu/mC1DMMpciNytfhWXUbUqq/Mo=";
+  };
+
+  postPatch = ''
+    substituteInPlace wand/api.py --replace \
+      "magick_home = os.environ.get('MAGICK_HOME')" \
+      "magick_home = '${imagemagickBig}'"
+  '';
+
+  nativeCheckInputs = [
+    py
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # https://github.com/emcconville/wand/issues/558
+    "test_forward_fourier_transform"
+    "test_inverse_fourier_transform"
+    # our imagemagick doesn't set MagickReleaseDate
+    "test_configure_options"
+  ];
+
+  passthru.imagemagick = imagemagickBig;
+
+  meta = with lib; {
+    changelog = "https://docs.wand-py.org/en/${version}/changes.html";
+    description = "Ctypes-based simple MagickWand API binding for Python";
+    homepage = "http://wand-py.org/";
+    license = [ licenses.mit ];
+    maintainers = with maintainers; [ infinisil dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wandb/default.nix b/nixpkgs/pkgs/development/python-modules/wandb/default.nix
new file mode 100644
index 000000000000..2622b1800684
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wandb/default.nix
@@ -0,0 +1,297 @@
+{ lib
+, stdenv
+, appdirs
+, azure-containerregistry
+, azure-core
+, azure-identity
+, azure-storage-blob
+, bokeh
+, boto3
+, buildPythonPackage
+, click
+, docker_pycreds
+, fetchFromGitHub
+, flask
+, git
+, gitpython
+, google-cloud-artifact-registry
+, google-cloud-compute
+, google-cloud-storage
+, hypothesis
+, jsonref
+, jsonschema
+, keras
+, kubernetes
+, matplotlib
+, mlflow
+, nbclient
+, nbformat
+, pandas
+, parameterized
+, pathtools
+, protobuf
+, psutil
+, pydantic
+, pyfakefs
+, pytest-mock
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, pythonRelaxDepsHook
+, pyyaml
+, requests
+, responses
+, scikit-learn
+, sentry-sdk
+, setproctitle
+, setuptools
+, substituteAll
+, torch
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "wandb";
+  version = "0.15.11";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-WaVgyF+pQgFCqIsi5Tcu+btyUKU2e3/qJi4Ma8dnx8M=";
+  };
+
+  patches = [
+    # Replace git paths
+    (substituteAll {
+      src = ./hardcode-git-path.patch;
+      git = "${lib.getBin git}/bin/git";
+    })
+  ];
+
+  nativeBuildInputs = [
+    pythonRelaxDepsHook
+    setuptools
+  ];
+
+  # setuptools is necessary since pkg_resources is required at runtime.
+  propagatedBuildInputs = [
+    appdirs
+    click
+    docker_pycreds
+    gitpython
+    pathtools
+    protobuf
+    psutil
+    pyyaml
+    requests
+    sentry-sdk
+    setproctitle
+    setuptools
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    azure-containerregistry
+    azure-core
+    azure-identity
+    azure-storage-blob
+    bokeh
+    boto3
+    flask
+    google-cloud-artifact-registry
+    google-cloud-compute
+    google-cloud-storage
+    hypothesis
+    jsonref
+    jsonschema
+    keras
+    kubernetes
+    matplotlib
+    mlflow
+    nbclient
+    nbformat
+    pandas
+    parameterized
+    pydantic
+    pyfakefs
+    pytest-mock
+    pytest-xdist
+    pytestCheckHook
+    responses
+    scikit-learn
+    torch
+    tqdm
+  ];
+
+  # Set BOKEH_CDN_VERSION to stop bokeh throwing an exception in tests
+  preCheck = ''
+    export HOME=$(mktemp -d)
+    export BOKEH_CDN_VERSION=${bokeh.version}
+  '';
+
+  pythonRelaxDeps = [ "protobuf" ];
+
+  pytestFlagsArray = [
+    # We want to run only unit tests
+    "tests/pytest_tests"
+  ];
+
+  disabledTestPaths = [
+    # Tests that try to get chatty over sockets or spin up servers, not possible in the nix build environment.
+    "tests/pytest_tests/system_tests/test_notebooks/test_notebooks.py"
+    "tests/pytest_tests/unit_tests_old/test_cli.py"
+    "tests/pytest_tests/unit_tests_old/test_data_types.py"
+    "tests/pytest_tests/unit_tests_old/test_file_stream.py"
+    "tests/pytest_tests/unit_tests_old/test_file_upload.py"
+    "tests/pytest_tests/unit_tests_old/test_footer.py"
+    "tests/pytest_tests/unit_tests_old/test_internal_api.py"
+    "tests/pytest_tests/unit_tests_old/test_keras.py"
+    "tests/pytest_tests/unit_tests_old/test_logging.py"
+    "tests/pytest_tests/unit_tests_old/test_metric_internal.py"
+    "tests/pytest_tests/unit_tests_old/test_public_api.py"
+    "tests/pytest_tests/unit_tests_old/test_runtime.py"
+    "tests/pytest_tests/unit_tests_old/test_sender.py"
+    "tests/pytest_tests/unit_tests_old/test_summary.py"
+    "tests/pytest_tests/unit_tests_old/test_tb_watcher.py"
+    "tests/pytest_tests/unit_tests_old/test_time_resolution.py"
+    "tests/pytest_tests/unit_tests_old/test_wandb_agent.py"
+    "tests/pytest_tests/unit_tests_old/test_wandb_artifacts.py"
+    "tests/pytest_tests/unit_tests_old/test_wandb_integration.py"
+    "tests/pytest_tests/unit_tests_old/test_wandb_run.py"
+    "tests/pytest_tests/unit_tests_old/test_wandb.py"
+    "tests/pytest_tests/unit_tests_old/tests_launch/test_launch_aws.py"
+    "tests/pytest_tests/unit_tests_old/tests_launch/test_launch_cli.py"
+    "tests/pytest_tests/unit_tests_old/tests_launch/test_launch_docker.py"
+    "tests/pytest_tests/unit_tests_old/tests_launch/test_launch.py"
+    "tests/pytest_tests/unit_tests/test_cli.py"
+    "tests/pytest_tests/unit_tests/test_data_types.py"
+    "tests/pytest_tests/unit_tests/test_internal_api.py"
+    "tests/pytest_tests/unit_tests/test_mode_disabled.py"
+    "tests/pytest_tests/unit_tests/test_model_workflows.py"
+    "tests/pytest_tests/unit_tests/test_plots.py"
+    "tests/pytest_tests/unit_tests/test_public_api.py"
+    "tests/pytest_tests/unit_tests/test_sender.py"
+    "tests/pytest_tests/unit_tests/test_util.py"
+    "tests/pytest_tests/unit_tests/test_wandb_verify.py"
+
+    # Requires docker access
+    "tests/pytest_tests/system_tests/test_artifacts/test_artifact_saver.py"
+    "tests/pytest_tests/system_tests/test_artifacts/test_wandb_artifacts_full.py"
+    "tests/pytest_tests/system_tests/test_artifacts/test_wandb_artifacts.py"
+    "tests/pytest_tests/system_tests/test_core/test_cli_full.py"
+    "tests/pytest_tests/system_tests/test_core/test_data_types_full.py"
+    "tests/pytest_tests/system_tests/test_core/test_file_stream_internal.py"
+    "tests/pytest_tests/system_tests/test_core/test_file_upload.py"
+    "tests/pytest_tests/system_tests/test_core/test_footer.py"
+    "tests/pytest_tests/system_tests/test_core/test_keras_full.py"
+    "tests/pytest_tests/system_tests/test_core/test_label_full.py"
+    "tests/pytest_tests/system_tests/test_core/test_metric_full.py"
+    "tests/pytest_tests/system_tests/test_core/test_metric_internal.py"
+    "tests/pytest_tests/system_tests/test_core/test_mode_disabled_full.py"
+    "tests/pytest_tests/system_tests/test_core/test_model_workflow.py"
+    "tests/pytest_tests/system_tests/test_core/test_mp_full.py"
+    "tests/pytest_tests/system_tests/test_core/test_public_api.py"
+    "tests/pytest_tests/system_tests/test_core/test_redir_full.py"
+    "tests/pytest_tests/system_tests/test_core/test_report_api.py"
+    "tests/pytest_tests/system_tests/test_core/test_runtime.py"
+    "tests/pytest_tests/system_tests/test_core/test_save_policies.py"
+    "tests/pytest_tests/system_tests/test_core/test_sender.py"
+    "tests/pytest_tests/system_tests/test_core/test_start_method.py"
+    "tests/pytest_tests/system_tests/test_core/test_system_info.py"
+    "tests/pytest_tests/system_tests/test_core/test_tb_watcher.py"
+    "tests/pytest_tests/system_tests/test_core/test_telemetry_full.py"
+    "tests/pytest_tests/system_tests/test_core/test_time_resolution.py"
+    "tests/pytest_tests/system_tests/test_core/test_torch_full.py"
+    "tests/pytest_tests/system_tests/test_core/test_validation_data_logger.py"
+    "tests/pytest_tests/system_tests/test_core/test_wandb_init.py"
+    "tests/pytest_tests/system_tests/test_core/test_wandb_integration.py"
+    "tests/pytest_tests/system_tests/test_core/test_wandb_run.py"
+    "tests/pytest_tests/system_tests/test_core/test_wandb_settings.py"
+    "tests/pytest_tests/system_tests/test_core/test_wandb_tensorflow.py"
+    "tests/pytest_tests/system_tests/test_core/test_wandb_verify.py"
+    "tests/pytest_tests/system_tests/test_core/test_wandb.py"
+    "tests/pytest_tests/system_tests/test_importers/test_import_mlflow.py"
+    "tests/pytest_tests/system_tests/test_nexus/test_nexus.py"
+    "tests/pytest_tests/system_tests/test_sweep/test_public_api.py"
+    "tests/pytest_tests/system_tests/test_sweep/test_sweep_scheduler.py"
+    "tests/pytest_tests/system_tests/test_sweep/test_sweep_utils.py"
+    "tests/pytest_tests/system_tests/test_sweep/test_wandb_agent_full.py"
+    "tests/pytest_tests/system_tests/test_sweep/test_wandb_agent.py"
+    "tests/pytest_tests/system_tests/test_sweep/test_wandb_sweep.py"
+    "tests/pytest_tests/system_tests/test_system_metrics/test_open_metrics.py"
+    "tests/pytest_tests/system_tests/test_launch/test_github_reference.py"
+    "tests/pytest_tests/system_tests/test_launch/test_job.py"
+    "tests/pytest_tests/system_tests/test_launch/test_launch_add.py"
+    "tests/pytest_tests/system_tests/test_launch/test_launch_cli.py"
+    "tests/pytest_tests/system_tests/test_launch/test_launch_kubernetes.py"
+    "tests/pytest_tests/system_tests/test_launch/test_launch_local_container.py"
+    "tests/pytest_tests/system_tests/test_launch/test_launch_run.py"
+    "tests/pytest_tests/system_tests/test_launch/test_launch_sagemaker.py"
+    "tests/pytest_tests/system_tests/test_launch/test_launch_sweep_cli.py"
+    "tests/pytest_tests/system_tests/test_launch/test_launch_sweep.py"
+    "tests/pytest_tests/system_tests/test_launch/test_launch.py"
+    "tests/pytest_tests/system_tests/test_launch/test_wandb_reference.py"
+
+    # Tries to access /homeless-shelter
+    "tests/pytest_tests/unit_tests/test_tables.py"
+
+    # E       AssertionError: assert 'Cannot use both --async and --queue with wandb launch' in 'wandb: ERROR Find detailed error logs at: /build/source/wandb/debug-cli.nixbld.log\nError: The wandb service process exited with 1. Ensure that `sys.executable` is a valid python interpreter. You can override it with the `_executable` setting or with the `WANDB__EXECUTABLE` environment variable.\n'
+    # E        +  where 'wandb: ERROR Find detailed error logs at: /build/source/wandb/debug-cli.nixbld.log\nError: The wandb service process exited with 1. Ensure that `sys.executable` is a valid python interpreter. You can override it with the `_executable` setting or with the `WANDB__EXECUTABLE` environment variable.\n' = <Result SystemExit(1)>.output
+    "tests/pytest_tests/unit_tests_old/tests_launch/test_launch_jobs.py"
+
+    # Requires google-cloud-aiplatform which is not packaged as of 2023-04-25.
+    "tests/pytest_tests/unit_tests/test_launch/test_runner/test_vertex.py"
+
+    # Requires google-cloud-artifact-registry which is not packaged as of 2023-04-25.
+    "tests/pytest_tests/unit_tests_old/tests_launch/test_kaniko_build.py"
+    "tests/pytest_tests/unit_tests/test_launch/test_registry/test_gcp_artifact_registry.py"
+
+    # Requires kfp which is not packaged as of 2023-04-25.
+    "tests/pytest_tests/system_tests/test_core/test_kfp.py"
+
+    # Requires metaflow which is not packaged as of 2023-04-25.
+    "tests/pytest_tests/unit_tests/test_metaflow.py"
+
+    # Requires tensorflow which is broken as of 2023-09-03
+    "tests/pytest_tests/unit_tests/test_keras.py"
+
+    # Try to get hardware information, not possible in the nix build environment
+    "tests/pytest_tests/unit_tests/test_system_metrics/test_disk.py"
+
+    # See https://github.com/wandb/wandb/issues/5423
+    "tests/pytest_tests/unit_tests/test_docker.py"
+    "tests/pytest_tests/unit_tests/test_library_public.py"
+  ] ++ lib.optionals stdenv.isLinux [
+    # Same as above
+    "tests/pytest_tests/unit_tests/test_artifacts/test_storage.py"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # Same as above
+    "tests/pytest_tests/unit_tests/test_lib/test_filesystem.py"
+  ];
+
+  disabledTests = [
+    # Timing sensitive
+    "test_login_timeout"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # Disable test that fails on darwin due to issue with python3Packages.psutil:
+    # https://github.com/giampaolo/psutil/issues/1219
+    "test_tpu_system_stats"
+  ];
+
+  pythonImportsCheck = [
+    "wandb"
+  ];
+
+  meta = with lib; {
+    description = "A CLI and library for interacting with the Weights and Biases API";
+    homepage = "https://github.com/wandb/wandb";
+    changelog = "https://github.com/wandb/wandb/raw/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wandb/hardcode-git-path.patch b/nixpkgs/pkgs/development/python-modules/wandb/hardcode-git-path.patch
new file mode 100644
index 000000000000..a0f45c04b2c3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wandb/hardcode-git-path.patch
@@ -0,0 +1,57 @@
+diff --git a/tests/functional_tests/t0_main/kfp/wandb_probe.py b/tests/functional_tests/t0_main/kfp/wandb_probe.py
+index 82fadfe1..25c1454c 100644
+--- a/tests/functional_tests/t0_main/kfp/wandb_probe.py
++++ b/tests/functional_tests/t0_main/kfp/wandb_probe.py
+@@ -5,7 +5,7 @@ import subprocess
+ def wandb_probe_package():
+     if not os.environ.get("WB_PROBE_PACKAGE"):
+         return
+-    s, o = subprocess.getstatusoutput("git rev-parse HEAD")
++    s, o = subprocess.getstatusoutput("@git@ rev-parse HEAD")
+     if s:
+         return
+     wandb_local = f"git+https://github.com/wandb/wandb.git@{o}#egg=wandb"
+diff --git a/wandb/cli/cli.py b/wandb/cli/cli.py
+index 5767e61c..56009fec 100644
+--- a/wandb/cli/cli.py
++++ b/wandb/cli/cli.py
+@@ -1919,7 +1919,7 @@ def restore(ctx, run, no_git, branch, project, entity):
+     commit, json_config, patch_content, metadata = api.run_config(
+         project, run=run, entity=entity
+     )
+-    repo = metadata.get("git", {}).get("repo")
++    repo = metadata.get("@git@", {}).get("repo")
+     image = metadata.get("docker")
+     restore_message = (
+         """`wandb restore` needs to be run from the same git repository as the original run.
+@@ -1938,7 +1938,7 @@ Run `git clone %s` and restore from there or pass the --no-git flag."""
+
+     if commit and api.git.enabled:
+         wandb.termlog(f"Fetching origin and finding commit: {commit}")
+-        subprocess.check_call(["git", "fetch", "--all"])
++        subprocess.check_call(["@git@", "fetch", "--all"])
+         try:
+             api.git.repo.commit(commit)
+         except ValueError:
+@@ -1992,7 +1992,7 @@ Run `git clone %s` and restore from there or pass the --no-git flag."""
+             # --reject is necessary or else this fails any time a binary file
+             # occurs in the diff
+             exit_code = subprocess.call(
+-                ["git", "apply", "--reject", patch_rel_path], cwd=root
++                ["@git@", "apply", "--reject", patch_rel_path], cwd=root
+             )
+             if exit_code == 0:
+                 wandb.termlog("Applied patch")
+diff --git a/wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/version.py b/wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/version.py
+index 614df9f5..38db460b 100644
+--- a/wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/version.py
++++ b/wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/version.py
+@@ -67,7 +67,7 @@ def get_git_changeset():
+     repo_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+     try:
+         git_log = subprocess.Popen(
+-            'git log --pretty=format:%ct --quiet -1 HEAD',
++            '@git@ log --pretty=format:%ct --quiet -1 HEAD',
+             stdout=subprocess.PIPE, stderr=subprocess.PIPE,
+             shell=True, cwd=repo_dir, universal_newlines=True,
+         )
diff --git a/nixpkgs/pkgs/development/python-modules/waqiasync/default.nix b/nixpkgs/pkgs/development/python-modules/waqiasync/default.nix
new file mode 100644
index 000000000000..8420ecbaef7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/waqiasync/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "waqiasync";
+  version = "1.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-SOs998BQV4UlLnRB3Yf7zze51u43g2Npwgk6y80S+m8=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # Project has no tests
+  doCheck = false;
+  pythonImportsCheck = [ "waqiasync" ];
+
+  meta = with lib; {
+    description = "Python library for http://aqicn.org";
+    homepage = "https://github.com/andrey-git/waqi-async";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/warble/default.nix b/nixpkgs/pkgs/development/python-modules/warble/default.nix
new file mode 100644
index 000000000000..c2c930d0f0a5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/warble/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cython
+, boost
+, bluez
+}:
+
+buildPythonPackage rec {
+  pname = "warble";
+  version = "1.2.9";
+  format = "setuptools";
+
+  enableParallelBuilding = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-oezcRD1AddWmDYDxueE0EwK0+UN/EZ5GQxwkdCz4xoY=";
+  };
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  buildInputs = [
+    boost
+    bluez
+  ];
+
+  pythonImportsCheck = [ "mbientlab" "mbientlab.warble" ];
+
+  meta = with lib; {
+    description = "Python bindings for MbientLab's Warble library";
+    homepage = "https://github.com/mbientlab/pywarble";
+    license = with licenses; [ unfree ];
+    maintainers = with maintainers; [ stepbrobd ];
+    platforms = [ "aarch64-linux" "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/warcio/default.nix b/nixpkgs/pkgs/development/python-modules/warcio/default.nix
new file mode 100644
index 000000000000..fe9f7bdeb0f1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/warcio/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, httpbin
+, multidict
+, pytestCheckHook
+, pythonOlder
+, requests
+, setuptools
+, six
+, wsgiprox
+}:
+
+buildPythonPackage rec {
+  pname = "warcio";
+  version = "1.7.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "webrecorder";
+    repo = "warcio";
+    rev = "aa702cb321621b233c6e5d2a4780151282a778be"; # Repo has no git tags, see https://github.com/webrecorder/warcio/issues/126
+    hash = "sha256-wn2rd73wRfOqHu9H0GIn76tmEsERBBCQatnk4b/JToU=";
+  };
+
+  patches = [
+    (fetchpatch {
+      # Add offline mode to skip tests that require an internet connection, https://github.com/webrecorder/warcio/pull/135
+      name = "add-offline-option.patch";
+      url = "https://github.com/webrecorder/warcio/pull/135/commits/2546fe457c57ab0b391764a4ce419656458d9d07.patch";
+      hash = "sha256-3izm9LvAeOFixiIUUqmd5flZIxH92+NxL7jeu35aObQ=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    six
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    httpbin
+    multidict # Optional. Without this, one test in test/test_utils.py is skipped.
+    pytestCheckHook
+    requests
+    wsgiprox
+  ];
+
+  pytestFlagsArray = [
+    "--offline"
+  ];
+
+  disabledTests = [
+    # Tests require network access, see above
+    "test_get_cache_to_file"
+  ];
+
+  pythonImportsCheck = [
+    "warcio"
+  ];
+
+  meta = with lib; {
+    description = "Streaming WARC/ARC library for fast web archive IO";
+    homepage = "https://github.com/webrecorder/warcio";
+    changelog = "https://github.com/webrecorder/warcio/blob/master/CHANGELIST.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ Luflosi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ward/default.nix b/nixpkgs/pkgs/development/python-modules/ward/default.nix
new file mode 100644
index 000000000000..9d438d74258f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ward/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, buildPythonPackage
+, click
+, click-completion
+, click-default-group
+, cucumber-tag-expressions
+, fetchFromGitHub
+, pluggy
+, poetry-core
+, pprintpp
+, pythonOlder
+, pythonRelaxDepsHook
+, rich
+, tomli
+}:
+
+buildPythonPackage rec {
+  pname = "ward";
+  version = "0.67.0b0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "darrenburns";
+    repo = pname;
+    rev = "refs/tags/release%2F${version}";
+    hash = "sha256-4dEMEEPySezgw3dIcYMl56HrhyaYlql9JvtamOn7Y8g=";
+  };
+
+  pythonRelaxDeps = [
+    "rich"
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    click
+    rich
+    tomli
+    pprintpp
+    cucumber-tag-expressions
+    click-default-group
+    click-completion
+    pluggy
+  ];
+
+  # Fixture is missing. Looks like an issue with the import of the sample file
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "ward"
+  ];
+
+  meta = with lib; {
+    description = "Test framework for Python";
+    homepage = "https://github.com/darrenburns/ward";
+    changelog = "https://github.com/darrenburns/ward/releases/tag/release%2F${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/warlock/default.nix b/nixpkgs/pkgs/development/python-modules/warlock/default.nix
new file mode 100644
index 000000000000..b0b16aed16a8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/warlock/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, poetry-core
+, jsonpatch
+, jsonschema
+, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "warlock";
+  version = "2.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "bcwaldon";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-HOCLzFYmOL/tCXT+NO/tCZuVXVowNEPP3g33ZYg4+6Q=";
+  };
+
+  postPatch = ''
+    sed -i '/--cov/d' pytest.ini
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    jsonpatch
+    jsonschema
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # https://github.com/bcwaldon/warlock/issues/64
+    "test_recursive_models"
+  ];
+
+  pythonImportsCheck = [
+    "warlock"
+  ];
+
+  meta = with lib; {
+    description = "Python object model built on JSON schema and JSON patch";
+    homepage = "https://github.com/bcwaldon/warlock";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/warrant-lite/default.nix b/nixpkgs/pkgs/development/python-modules/warrant-lite/default.nix
new file mode 100644
index 000000000000..4d5d77c2e84d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/warrant-lite/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, boto3
+, envs
+, python-jose
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "warrant-lite";
+  version = "1.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-FunWoslZn3o0WHet2+LtggO3bbbe2ULMXW93q07GxJ4=";
+  };
+
+  propagatedBuildInputs = [
+    boto3
+    envs
+    python-jose
+    requests
+  ];
+
+  postPatch = ''
+    # requirements.txt is not part of the source
+    substituteInPlace setup.py \
+      --replace "parse_requirements('requirements.txt')," "[],"
+  '';
+
+  # Tests require credentials
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "warrant_lite"
+  ];
+
+  meta = with lib; {
+    description = "Module for process SRP requests for AWS Cognito";
+    homepage = "https://github.com/capless/warrant-lite";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/warrant/default.nix b/nixpkgs/pkgs/development/python-modules/warrant/default.nix
new file mode 100644
index 000000000000..6482024a4da3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/warrant/default.nix
@@ -0,0 +1,44 @@
+{ lib, buildPythonPackage, fetchFromGitHub, fetchpatch
+, mock
+, boto3, envs, python-jose, requests }:
+
+buildPythonPackage {
+  pname = "warrant";
+  version = "0.6.1";
+
+  # move to fetchPyPi when https://github.com/capless/warrant/issues/97 is fixed
+  src = fetchFromGitHub {
+    owner  = "capless";
+    repo   = "warrant";
+    rev    = "ff2e4793d8479e770f2461ef7cbc0c15ee784395";
+    sha256 = "0gw3crg64p1zx3k5js0wh0x5bldgs7viy4g8hld9xbka8q0374hi";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "fix-pip10-compat.patch";
+      url = "https://github.com/capless/warrant/commit/ae17d17d9888b9218a8facf6f6ad0bf4adae9a12.patch";
+      sha256 = "1lvqi2qfa3kxdz05ab2lc7xnd3piyvvnz9kla2jl4pchi876z17c";
+    })
+  ];
+
+  # this needs to go when 0.6.2 or later is released
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "python-jose-cryptodome>=1.3.2" "python-jose>=2.0.0"
+  '';
+
+  nativeCheckInputs = [ mock ];
+
+  propagatedBuildInputs = [ boto3 envs python-jose requests ];
+
+  # all the checks are failing
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python library for using AWS Cognito with support for SRP";
+    homepage = "https://github.com/capless/warrant";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wasabi/default.nix b/nixpkgs/pkgs/development/python-modules/wasabi/default.nix
new file mode 100644
index 000000000000..618e0490605b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wasabi/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+
+# tests
+, ipykernel
+, nbconvert
+, pytestCheckHook
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "wasabi";
+  version = "1.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Gq7zrOqjLtuckTMNKdOTbAw5/blldDVJwXPLVLFsMLU=";
+  };
+
+  nativeCheckInputs = [
+    ipykernel
+    nbconvert
+    typing-extensions
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "wasabi"
+  ];
+
+  meta = with lib; {
+    description = "A lightweight console printing and formatting toolkit";
+    homepage = "https://github.com/ines/wasabi";
+    changelog = "https://github.com/ines/wasabi/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wasmer/default.nix b/nixpkgs/pkgs/development/python-modules/wasmer/default.nix
new file mode 100644
index 000000000000..947022eab4f6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wasmer/default.nix
@@ -0,0 +1,106 @@
+{ stdenv
+, lib
+, rustPlatform
+, rustc
+, callPackage
+, fetchFromGitHub
+, buildPythonPackage
+, libiconv
+, libffi
+, libxml2
+, llvm_14
+, ncurses
+, zlib
+}:
+
+let
+  common =
+    { pname
+    , buildAndTestSubdir
+    , cargoHash
+    , extraNativeBuildInputs ? [ ]
+    , extraBuildInputs ? [ ]
+    }: buildPythonPackage rec {
+      inherit pname;
+      version = "1.1.0";
+      format = "pyproject";
+
+      outputs = [ "out" ] ++ lib.optional (pname == "wasmer") "testsout";
+
+      src = fetchFromGitHub {
+        owner = "wasmerio";
+        repo = "wasmer-python";
+        rev = version;
+        hash = "sha256-nOeOhQ1XY+9qmLGURrI5xbgBUgWe5XRpV38f73kKX2s=";
+      };
+
+      cargoDeps = rustPlatform.fetchCargoTarball {
+        inherit src;
+        name = "${pname}-${version}";
+        sha256 = cargoHash;
+      };
+
+      nativeBuildInputs = (with rustPlatform; [ cargoSetupHook maturinBuildHook ])
+        ++ extraNativeBuildInputs;
+
+      postPatch = ''
+        # Workaround for metadata, that maturin 0.14 does not accept in Cargo.toml anymore
+        substituteInPlace ${buildAndTestSubdir}/Cargo.toml \
+          --replace "package.metadata.maturin" "broken"
+      '';
+
+      buildInputs = lib.optionals stdenv.isDarwin [ libiconv ]
+        ++ extraBuildInputs;
+
+      inherit buildAndTestSubdir;
+
+      postInstall = lib.optionalString (pname == "wasmer") ''
+        mkdir $testsout
+        cp -R tests $testsout/tests
+      '';
+
+      # check in passthru.tests.pytest because all packages are required to run the tests
+      doCheck = false;
+
+      passthru.tests = lib.optionalAttrs (pname == "wasmer") {
+        pytest = callPackage ./tests.nix { };
+      };
+
+      pythonImportsCheck = [ "${lib.replaceStrings ["-"] ["_"] pname}" ];
+
+      meta = with lib; {
+        description = "Python extension to run WebAssembly binaries";
+        homepage = "https://github.com/wasmerio/wasmer-python";
+        license = licenses.mit;
+        platforms = platforms.unix;
+        maintainers = [ ];
+      };
+    };
+in
+{
+  wasmer = common {
+    pname = "wasmer";
+    buildAndTestSubdir = "packages/api";
+    cargoHash = "sha256-twoog8LjQtoli+TlDipSuB7yLFkXQJha9BqobqgZW3Y=";
+  };
+
+  wasmer-compiler-cranelift = common {
+    pname = "wasmer-compiler-cranelift";
+    buildAndTestSubdir = "packages/compiler-cranelift";
+    cargoHash = "sha256-IqeMOY6emhIC7ekH8kIOZCr3JVkjxUg/lQli+ZZpdq4=";
+  };
+
+  wasmer-compiler-llvm = common {
+    pname = "wasmer-compiler-llvm";
+    buildAndTestSubdir = "packages/compiler-llvm";
+    cargoHash = "sha256-xawbf5gXXV+7I2F2fDSaMvjtFvGDBtqX7wL3c28TSbA=";
+    extraNativeBuildInputs = [ llvm_14 ];
+    extraBuildInputs = [ libffi libxml2.out ncurses zlib ];
+  };
+
+  wasmer-compiler-singlepass = common {
+    pname = "wasmer-compiler-singlepass";
+    buildAndTestSubdir = "packages/compiler-singlepass";
+    cargoHash = "sha256-4nZHMCNumNhdGPOmHXlJ5POYP7K+VPjwhEUMgzGb/Rk=";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wasmer/tests.nix b/nixpkgs/pkgs/development/python-modules/wasmer/tests.nix
new file mode 100644
index 000000000000..e46c9f7ac670
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wasmer/tests.nix
@@ -0,0 +1,25 @@
+{ buildPythonPackage
+, wasmer
+, pytestCheckHook
+, wasmer-compiler-cranelift
+, wasmer-compiler-llvm
+, wasmer-compiler-singlepass
+}:
+
+buildPythonPackage {
+  pname = "wasmer-tests";
+  inherit (wasmer) version;
+
+  src = wasmer.testsout;
+
+  dontBuild = true;
+  dontInstall = true;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    wasmer
+    wasmer-compiler-cranelift
+    wasmer-compiler-llvm
+    wasmer-compiler-singlepass
+  ];
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wasserstein/default.nix b/nixpkgs/pkgs/development/python-modules/wasserstein/default.nix
new file mode 100644
index 000000000000..1609e12f20c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wasserstein/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, numpy
+, llvmPackages
+, wurlitzer
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "wasserstein";
+  version = "1.1.0";
+
+  src = fetchFromGitHub {
+    owner = "pkomiske";
+    repo = "Wasserstein";
+    rev = "89c2d6279a7e0aa3b56bcc8fb7b6009420f2563e"; # https://github.com/pkomiske/Wasserstein/issues/1
+    hash = "sha256-s9en6XwvO/WPsF7/+SEmGePHZQgl7zLgu5sEn4nD9YE=";
+  };
+
+  buildInputs = [
+    llvmPackages.openmp
+  ];
+  propagatedBuildInputs = [
+    numpy
+    wurlitzer
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+  pytestFlagsArray = [
+    "wasserstein/tests"
+  ];
+  disabledTestPaths = [
+    "wasserstein/tests/test_emd.py" # requires "ot"
+    # cyclic dependency on energyflow
+    "wasserstein/tests/test_externalemdhandler.py"
+    "wasserstein/tests/test_pairwiseemd.py"
+  ];
+
+  pythonImportsCheck = [ "wasserstein" ];
+
+  meta = with lib; {
+    description = "Python/C++ library for computing Wasserstein distances efficiently";
+    homepage = "https://github.com/pkomiske/Wasserstein";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ veprbl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/watchdog-gevent/default.nix b/nixpkgs/pkgs/development/python-modules/watchdog-gevent/default.nix
new file mode 100644
index 000000000000..e1b812b9612f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/watchdog-gevent/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, gevent
+, pytestCheckHook
+, watchdog
+}:
+
+buildPythonPackage rec {
+  pname = "watchdog-gevent";
+  version = "0.1.1";
+  format = "setuptools";
+
+  # Need to fetch from github because tests are not present in pypi
+  src = fetchFromGitHub {
+    owner = "Bogdanp";
+    repo = "watchdog_gevent";
+    rev = "v${version}";
+    hash = "sha256-FESm3fNuLmOg2ilI/x8U9LuAimHLnahcTHYzW/nzOVY=";
+  };
+
+  propagatedBuildInputs = [ watchdog gevent ];
+
+  postPatch = ''
+    sed -i setup.cfg \
+      -e 's:--cov watchdog_gevent::' \
+      -e 's:--cov-report html::'
+  '';
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "watchdog_gevent" ];
+
+  meta = with lib; {
+    description = "A gevent-based observer for watchdog";
+    homepage = "https://github.com/Bogdanp/watchdog_gevent";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ traxys ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/watchdog/default.nix b/nixpkgs/pkgs/development/python-modules/watchdog/default.nix
new file mode 100644
index 000000000000..4e4f491e23ae
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/watchdog/default.nix
@@ -0,0 +1,110 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, CoreServices
+, eventlet
+, fetchpatch
+, fetchPypi
+, flaky
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "watchdog";
+  version = "3.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-TZijIFldp6fFoY/EjLYzwuc82nj5PKwu9C1Cv2CaM/k=";
+  };
+
+  # force kqueue on x86_64-darwin, because our api version does
+  # not support fsevents
+  patches = lib.optionals (stdenv.isDarwin && !stdenv.isAarch64) [
+    ./force-kqueue.patch
+  ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    CoreServices
+  ];
+
+  passthru.optional-dependencies.watchmedo = [
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    eventlet
+    flaky
+    pytest-timeout
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.watchmedo;
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "--cov=watchdog" "" \
+      --replace "--cov-report=term-missing" ""
+  '';
+
+  pytestFlagsArray = [
+    "--deselect=tests/test_emitter.py::test_create_wrong_encoding"
+    "--deselect=tests/test_emitter.py::test_close"
+  ] ++ lib.optionals (stdenv.isDarwin) [
+    # fails to stop process in teardown
+    "--deselect=tests/test_0_watchmedo.py::test_auto_restart_subprocess_termination"
+    # assert cap.out.splitlines(keepends=False).count('+++++ 0') == 2 != 3
+    "--deselect=tests/test_0_watchmedo.py::test_auto_restart_on_file_change_debounce"
+  ] ++ lib.optionals (stdenv.isDarwin && stdenv.isx86_64) [
+    # FileCreationEvent != FileDeletionEvent
+    "--deselect=tests/test_emitter.py::test_separate_consecutive_moves"
+    "--deselect=tests/test_observers_polling.py::test___init__"
+    # segfaults
+    "--deselect=tests/test_delayed_queue.py::test_delayed_get"
+    "--deselect=tests/test_emitter.py::test_delete"
+    # AttributeError: '_thread.RLock' object has no attribute 'key'"
+    "--deselect=tests/test_skip_repeats_queue.py::test_eventlet_monkey_patching"
+  ] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
+    # segfaults
+    "--deselect=tests/test_delayed_queue.py::test_delayed_get"
+    "--deselect=tests/test_0_watchmedo.py::test_tricks_from_file"
+    "--deselect=tests/test_fsevents.py::test_watcher_deletion_while_receiving_events_1"
+    "--deselect=tests/test_fsevents.py::test_watcher_deletion_while_receiving_events_2"
+    "--deselect=tests/test_skip_repeats_queue.py::test_eventlet_monkey_patching"
+    "--deselect=tests/test_fsevents.py::test_recursive_check_accepts_relative_paths"
+    # fsevents:fsevents.py:318 Unhandled exception in FSEventsEmitter
+    "--deselect=tests/test_fsevents.py::test_watchdog_recursive"
+    # SystemError: Cannot start fsevents stream. Use a kqueue or polling observer...
+    "--deselect=tests/test_fsevents.py::test_add_watch_twice"
+    # fsevents:fsevents.py:318 Unhandled exception in FSEventsEmitter
+    "--deselect=ests/test_fsevents.py::test_recursive_check_accepts_relative_paths"
+    # gets stuck
+    "--deselect=tests/test_fsevents.py::test_converting_cfstring_to_pyunicode"
+  ];
+
+  disabledTestPaths = [
+    # tests timeout easily
+    "tests/test_inotify_buffer.py"
+  ] ++ lib.optionals (stdenv.isDarwin) [
+    # segfaults the testsuite
+    "tests/test_emitter.py"
+    # unsupported on x86_64-darwin
+    "tests/test_fsevents.py"
+  ];
+
+  pythonImportsCheck = [
+    "watchdog"
+  ];
+
+  meta = with lib; {
+    description = "Python API and shell utilities to monitor file system events";
+    homepage = "https://github.com/gorakhargosh/watchdog";
+    changelog = "https://github.com/gorakhargosh/watchdog/blob/v${version}/changelog.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/watchdog/force-kqueue.patch b/nixpkgs/pkgs/development/python-modules/watchdog/force-kqueue.patch
new file mode 100644
index 000000000000..d4a0f4e6a00e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/watchdog/force-kqueue.patch
@@ -0,0 +1,26 @@
+diff --git a/setup.py b/setup.py
+index 337e4be..55ef9a6 100644
+--- a/setup.py
++++ b/setup.py
+@@ -38,7 +38,7 @@ _apple_devices = ("appletv", "iphone", "ipod", "ipad", "watch")
+ is_macos = sys.platform == "darwin" and not machine().lower().startswith(_apple_devices)
+ 
+ ext_modules = []
+-if is_macos or os.getenv("FORCE_MACOS_MACHINE", "0") == "1":
++if False:
+     ext_modules = [
+         Extension(
+             name="_watchdog_fsevents",
+diff --git a/tests/utils.py b/tests/utils.py
+index 00dcf40..9fbc42a 100644
+--- a/tests/utils.py
++++ b/tests/utils.py
+@@ -15,8 +15,6 @@ Emitter: Type[EventEmitter]
+ if sys.platform.startswith("linux"):
+     from watchdog.observers.inotify import InotifyEmitter as Emitter
+     from watchdog.observers.inotify import InotifyFullEmitter
+-elif sys.platform.startswith("darwin"):
+-    from watchdog.observers.fsevents import FSEventsEmitter as Emitter
+ elif sys.platform.startswith("win"):
+     from watchdog.observers.read_directory_changes import WindowsApiEmitter as Emitter
+ elif sys.platform.startswith(("dragonfly", "freebsd", "netbsd", "openbsd", "bsd")):
diff --git a/nixpkgs/pkgs/development/python-modules/watchfiles/default.nix b/nixpkgs/pkgs/development/python-modules/watchfiles/default.nix
new file mode 100644
index 000000000000..cb113420006b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/watchfiles/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, stdenv
+, anyio
+, buildPythonPackage
+, cargo
+, fetchFromGitHub
+, rustPlatform
+, rustc
+, pythonOlder
+, dirty-equals
+, pytest-mock
+, pytest-timeout
+, pytestCheckHook
+, CoreServices
+, libiconv
+}:
+
+buildPythonPackage rec {
+  pname = "watchfiles";
+  version = "0.21.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "samuelcolvin";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-/qNgkPF5N8jzSV3M0YFWvQngZ4Hf4WM/GBS1LtgFbWM=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-sqHTW1+E7Fp33KW6IYlNa77AYc2iCfaSoBRXzrhEKr8=";
+  };
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    CoreServices
+    libiconv
+  ];
+
+  nativeBuildInputs = [
+    rustPlatform.cargoSetupHook
+    rustPlatform.maturinBuildHook
+    cargo
+    rustc
+  ];
+
+  propagatedBuildInputs = [
+    anyio
+  ];
+
+  # Tests need these permissions in order to use the FSEvents API on macOS.
+  sandboxProfile = ''
+    (allow mach-lookup (global-name "com.apple.FSEvents"))
+  '';
+
+  nativeCheckInputs = [
+    dirty-equals
+    pytest-mock
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    sed -i "/^requires-python =.*/a version = '${version}'" pyproject.toml
+  '';
+
+  preCheck = ''
+    rm -rf watchfiles
+  '';
+
+  disabledTests = [
+    #  BaseExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
+    "test_awatch_interrupt_raise"
+  ];
+
+  pythonImportsCheck = [
+    "watchfiles"
+  ];
+
+  meta = with lib; {
+    description = "File watching and code reload";
+    homepage = "https://watchfiles.helpmanual.io/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/watchgod/default.nix b/nixpkgs/pkgs/development/python-modules/watchgod/default.nix
new file mode 100644
index 000000000000..ce61747baa0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/watchgod/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, anyio
+}:
+
+buildPythonPackage rec {
+  pname = "watchgod";
+  version = "0.8.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-yxH/ZmV777qU2CjjtiLV+3byL72hN281Xz5uUel9lFA=";
+  };
+
+  propagatedBuildInputs = [
+    anyio
+  ];
+
+  # no tests in release
+  doCheck = false;
+
+  pythonImportsCheck = [ "watchgod" ];
+
+  meta = with lib; {
+    description = "Simple, modern file watching and code reload in python";
+    homepage = "https://github.com/samuelcolvin/watchgod";
+    license = licenses.mit;
+    maintainers = with maintainers; [ globin ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/waterfurnace/default.nix b/nixpkgs/pkgs/development/python-modules/waterfurnace/default.nix
new file mode 100644
index 000000000000..eabd7de20ad0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/waterfurnace/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, mock
+, pytestCheckHook
+, requests
+, pythonOlder
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "waterfurnace";
+  version = "1.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sdague";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "1ba247fw1fvi7zy31zj2wbjq7fajrbxhp139cl9jj67rfvxfv8xf";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'," ""
+  '';
+
+  propagatedBuildInputs = [
+    click
+    requests
+    websocket-client
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "waterfurnace"
+  ];
+
+  meta = with lib; {
+    description = "Python interface to waterfurnace geothermal systems";
+    homepage = "https://github.com/sdague/waterfurnace";
+    changelog = "https://github.com/sdague/waterfurnace/blob/v${version}/HISTORY.rst";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/watermark/default.nix b/nixpkgs/pkgs/development/python-modules/watermark/default.nix
new file mode 100644
index 000000000000..6e9e169ace5e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/watermark/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, importlib-metadata
+, ipython
+, py3nvml
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "watermark";
+  version = "2.4.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rasbt";
+    repo = "watermark";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-4/1Y7cdh1tF33jgPrqdxCGPcRnnxx+Wf8lyztF54Ck0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    ipython
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    importlib-metadata
+  ];
+
+  passthru.optional-dependencies = {
+    gpu = [
+      py3nvml
+    ];
+  };
+
+  nativeCheckInputs =  [
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "watermark"
+  ];
+
+  meta = with lib; {
+    description = "IPython extension for printing date and timestamps, version numbers, and hardware information";
+    homepage = "https://github.com/rasbt/watermark";
+    changelog = "https://github.com/rasbt/watermark/releases/tag/v${version}";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ nphilou ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wavedrom/default.nix b/nixpkgs/pkgs/development/python-modules/wavedrom/default.nix
new file mode 100644
index 000000000000..25e7222608b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wavedrom/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, attrdict
+, buildPythonPackage
+, cairosvg
+, fetchPypi
+, pillow
+, pytestCheckHook
+, pyyaml
+, setuptools-scm
+, six
+, svgwrite
+, xmldiff
+}:
+
+buildPythonPackage rec {
+  pname = "wavedrom";
+  version = "2.0.3.post3";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-MntNXcpZPIElfCAv6lFvepCHR/sRUnw1nwNPW3r39Hs=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    attrdict
+    pyyaml
+    svgwrite
+    six
+  ];
+
+  nativeCheckInputs = [
+    cairosvg
+    pillow
+    pytestCheckHook
+    xmldiff
+  ];
+
+  disabledTests = [
+    # Requires to clone a full git repository
+    "test_upstream"
+  ];
+
+  pythonImportsCheck = [
+    "wavedrom"
+  ];
+
+  meta = with lib; {
+    description = "WaveDrom compatible Python command line";
+    homepage = "https://github.com/wallento/wavedrompy";
+    license = licenses.mit;
+    maintainers = with maintainers; [ airwoodix ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wavefile/default.nix b/nixpkgs/pkgs/development/python-modules/wavefile/default.nix
new file mode 100644
index 000000000000..21641008c826
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wavefile/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pyaudio
+, numpy
+, libsndfile
+, substituteAll
+}:
+
+buildPythonPackage rec {
+  pname = "wavefile";
+  version = "1.5";
+
+  src = fetchFromGitHub {
+    owner = "vokimon";
+    repo = "python-wavefile";
+    rev = "python-wavefile-${version}";
+    sha256 = "9sHj1gb93mCVpejRGSdLJzeFDCeTflZctE7kMWfqFrE=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  buildInputs = [
+    pyaudio
+    libsndfile
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  nativeCheckInputs = [
+    pyaudio
+    numpy
+    libsndfile
+  ];
+
+  patches = [
+    # Fix check error
+    # OSError: libsndfile.so.1: cannot open shared object file: No such file or directory
+    (substituteAll {
+      src = ./libsndfile.py.patch;
+      libsndfile = "${lib.getLib libsndfile}/lib/libsndfile${stdenv.hostPlatform.extensions.sharedLibrary}";
+    })
+  ];
+
+  doCheck = false; # all test files (test/wavefileTest.py) are failing
+
+  pythonImportsCheck = [
+    "wavefile"
+  ];
+
+  meta = with lib; {
+    description = "Pythonic libsndfile wrapper to read and write audio files";
+    homepage = "https://github.com/vokimon/python-wavefile";
+    changelog = "https://github.com/vokimon/python-wavefile#version-history";
+    maintainers = with maintainers; [ yuu ];
+    license = licenses.gpl3Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wavefile/libsndfile.py.patch b/nixpkgs/pkgs/development/python-modules/wavefile/libsndfile.py.patch
new file mode 100644
index 000000000000..6e10e6b6c03c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wavefile/libsndfile.py.patch
@@ -0,0 +1,18 @@
+diff --git a/wavefile/libsndfile.py b/wavefile/libsndfile.py
+index 67f0a46..ce066ee 100644
+--- a/wavefile/libsndfile.py
++++ b/wavefile/libsndfile.py
+@@ -19,11 +19,11 @@ import numpy as np
+ if sys.platform == "win32":
+     dllName = 'libsndfile-1'
+ elif "linux" in sys.platform:
+-    dllName = 'libsndfile.so.1'
++    dllName = '@libsndfile@'
+ elif "cygwin" in sys.platform:
+     dllName = 'libsndfile-1.dll'
+ elif "darwin" in sys.platform:
+-    dllName = 'libsndfile.dylib'
++    dllName = '@libsndfile@'
+ else:
+     dllName = 'libsndfile'
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/wavinsentio/default.nix b/nixpkgs/pkgs/development/python-modules/wavinsentio/default.nix
new file mode 100644
index 000000000000..8e994f8e9952
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wavinsentio/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "wavinsentio";
+  version = "0.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-c3MpFoJrT2FBQrNce+zP/bfIZFqu8gSAA9oIa1jKYCo=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "wavinsentio"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interact with the Wavin Sentio underfloor heating system";
+    homepage = "https://github.com/djerik/wavinsentio";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wazeroutecalculator/default.nix b/nixpkgs/pkgs/development/python-modules/wazeroutecalculator/default.nix
new file mode 100644
index 000000000000..34c2430632bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wazeroutecalculator/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "wazeroutecalculator";
+  version = "0.15";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "WazeRouteCalculator";
+    inherit version;
+    hash = "sha256-DB5oWthWNwamFG3kNxA/kmUBOVogoSg5LI2KrI39s4M=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # there are no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "WazeRouteCalculator"
+  ];
+
+  meta = with lib; {
+    description = "Calculate actual route time and distance with Waze API";
+    homepage = "https://github.com/kovacsbalu/WazeRouteCalculator";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wcag-contrast-ratio/default.nix b/nixpkgs/pkgs/development/python-modules/wcag-contrast-ratio/default.nix
new file mode 100644
index 000000000000..1a906934a531
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wcag-contrast-ratio/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hypothesis
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "wcag-contrast-ratio";
+  version = "0.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-aRkrjlwKfQ3F/xGH7rPjmBQWM6S95RxpyH9Y/oftNhw=";
+  };
+
+  nativeCheckInputs = [
+    hypothesis
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "test.py"
+  ];
+
+  pythonImportsCheck = [ "wcag_contrast_ratio" ];
+
+  meta = with lib; {
+    description = "Library for computing contrast ratios, as required by WCAG 2.0";
+    homepage = "https://github.com/gsnedders/wcag-contrast-ratio";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wcmatch/default.nix b/nixpkgs/pkgs/development/python-modules/wcmatch/default.nix
new file mode 100644
index 000000000000..08b6e1800955
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wcmatch/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, hatchling
+, pytestCheckHook
+, bracex
+}:
+
+buildPythonPackage rec {
+  pname = "wcmatch";
+  version = "8.5";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-hsF1ctD3XL87yxoY878vnnKzmpwIybSnTpkeGIKo77M=";
+  };
+
+  nativeBuildInputs = [
+    hatchling
+  ];
+
+  propagatedBuildInputs = [ bracex ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  disabledTests = [
+    "TestTilde"
+  ];
+
+  pythonImportsCheck = [ "wcmatch" ];
+
+  meta = with lib; {
+    description = "Wilcard File Name matching library";
+    homepage = "https://github.com/facelessuser/wcmatch";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wcwidth/default.nix b/nixpkgs/pkgs/development/python-modules/wcwidth/default.nix
new file mode 100644
index 000000000000..1d23225c2fd6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wcwidth/default.nix
@@ -0,0 +1,32 @@
+{ lib, fetchPypi, buildPythonPackage, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "wcwidth";
+  version = "0.2.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-pSIHgKQE2+M1N4mHCXjkcs/kd3YfBu5VB3JW5QmxVtA=";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  propagatedBuildInputs = [ setuptools ];
+
+  # To prevent infinite recursion with pytest
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Measures number of Terminal column cells of wide-character codes";
+    longDescription = ''
+      This API is mainly for Terminal Emulator implementors -- any Python
+      program that attempts to determine the printable width of a string on
+      a Terminal. It is implemented in python (no C library calls) and has
+      no 3rd-party dependencies.
+    '';
+    homepage = "https://github.com/jquast/wcwidth";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/weasel/default.nix b/nixpkgs/pkgs/development/python-modules/weasel/default.nix
new file mode 100644
index 000000000000..727ec482c161
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/weasel/default.nix
@@ -0,0 +1,83 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, setuptools
+, wheel
+, black
+, cloudpathlib
+, confection
+, isort
+, mypy
+, packaging
+, pre-commit
+, pydantic
+, pytest
+, requests
+, ruff
+, smart-open
+, srsly
+, typer
+, types-requests
+, types-setuptools
+, wasabi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "weasel";
+  version = "0.3.4";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "explosion";
+    repo = "weasel";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-6Ck8R10/YW2Nc6acNk2bzgyqSg+OPqwyJjhUgXP/umw=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    black
+    cloudpathlib
+    confection
+    isort
+    mypy
+    packaging
+    pre-commit
+    pydantic
+    pytest
+    requests
+    ruff
+    smart-open
+    srsly
+    typer
+    types-requests
+    types-setuptools
+    wasabi
+  ];
+
+  pythonImportsCheck = [ "weasel" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # This test requires internet access
+    "test_project_assets"
+  ];
+
+  meta = with lib; {
+    description = "Weasel: A small and easy workflow system";
+    homepage = "https://github.com/explosion/weasel/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ GaetanLepage ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/weasyprint/default.nix b/nixpkgs/pkgs/development/python-modules/weasyprint/default.nix
new file mode 100644
index 000000000000..d5fc26be9c68
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/weasyprint/default.nix
@@ -0,0 +1,107 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, cairosvg
+, cffi
+, cssselect2
+, fetchPypi
+, flit-core
+, fontconfig
+, fonttools
+, ghostscript
+, glib
+, harfbuzz
+, html5lib
+, pango
+, pillow
+, pydyf
+, pyphen
+, pytestCheckHook
+, pythonOlder
+, substituteAll
+, tinycss2
+}:
+
+buildPythonPackage rec {
+  pname = "weasyprint";
+  version = "60.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "weasyprint";
+    hash = "sha256-VrmBIoARg1ew9jse/hgZngg0PUpWozk8HUdauHjOomo=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./library-paths.patch;
+      fontconfig = "${fontconfig.lib}/lib/libfontconfig${stdenv.hostPlatform.extensions.sharedLibrary}";
+      pangoft2 = "${pango.out}/lib/libpangoft2-1.0${stdenv.hostPlatform.extensions.sharedLibrary}";
+      gobject = "${glib.out}/lib/libgobject-2.0${stdenv.hostPlatform.extensions.sharedLibrary}";
+      pango = "${pango.out}/lib/libpango-1.0${stdenv.hostPlatform.extensions.sharedLibrary}";
+      pangocairo = "${pango.out}/lib/libpangocairo-1.0${stdenv.hostPlatform.extensions.sharedLibrary}";
+      harfbuzz = "${harfbuzz.out}/lib/libharfbuzz${stdenv.hostPlatform.extensions.sharedLibrary}";
+    })
+  ];
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+    cssselect2
+    fonttools
+    html5lib
+    pillow
+    pydyf
+    pyphen
+    tinycss2
+  ] ++ fonttools.optional-dependencies.woff;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    ghostscript
+  ];
+
+  disabledTests = [
+    # needs the Ahem font (fails on macOS)
+    "test_font_stretch"
+    # sensitive to sandbox environments
+    "test_tab_size"
+    "test_tabulation_character"
+    "test_linear_gradients_5"
+    "test_linear_gradients_12"
+  ];
+
+  FONTCONFIG_FILE = "${fontconfig.out}/etc/fonts/fonts.conf";
+
+  # Set env variable explicitly for Darwin, but allow overriding when invoking directly
+  makeWrapperArgs = [
+    "--set-default FONTCONFIG_FILE ${FONTCONFIG_FILE}"
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--isort --flake8 --cov --no-cov-on-fail" ""
+  '';
+
+  preCheck = ''
+    # Fontconfig wants to create a cache.
+    export HOME=$TMPDIR
+  '';
+
+  pythonImportsCheck = [
+    "weasyprint"
+  ];
+
+  meta = with lib; {
+    description = "Converts web documents to PDF";
+    homepage = "https://weasyprint.org/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ elohmeier ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/weasyprint/library-paths.patch b/nixpkgs/pkgs/development/python-modules/weasyprint/library-paths.patch
new file mode 100644
index 000000000000..6d884f43ed3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/weasyprint/library-paths.patch
@@ -0,0 +1,31 @@
+diff --git a/weasyprint/text/ffi.py b/weasyprint/text/ffi.py
+index 09f614aad..cbe9a73dd 100644
+--- a/weasyprint/text/ffi.py
++++ b/weasyprint/text/ffi.py
+@@ -415,22 +415,11 @@ def _dlopen(ffi, *names):
+         with suppress((OSError, FileNotFoundError)):
+             os.add_dll_directory(dll_directory)
+ 
+-gobject = _dlopen(
+-    ffi, 'gobject-2.0-0', 'gobject-2.0', 'libgobject-2.0-0',
+-    'libgobject-2.0.so.0', 'libgobject-2.0.dylib',  'libgobject-2.0-0.dll')
+-pango = _dlopen(
+-    ffi, 'pango-1.0-0', 'pango-1.0', 'libpango-1.0-0', 'libpango-1.0.so.0',
+-    'libpango-1.0.dylib', 'libpango-1.0-0.dll')
+-harfbuzz = _dlopen(
+-    ffi, 'harfbuzz', 'harfbuzz-0.0', 'libharfbuzz-0',
+-    'libharfbuzz.so.0', 'libharfbuzz.so.0', 'libharfbuzz.0.dylib',
+-    'libharfbuzz-0.dll')
+-fontconfig = _dlopen(
+-    ffi, 'fontconfig-1', 'fontconfig', 'libfontconfig', 'libfontconfig.so.1',
+-    'libfontconfig.1.dylib', 'libfontconfig-1.dll')
+-pangoft2 = _dlopen(
+-    ffi, 'pangoft2-1.0-0', 'pangoft2-1.0', 'libpangoft2-1.0-0',
+-    'libpangoft2-1.0.so.0', 'libpangoft2-1.0.dylib', 'libpangoft2-1.0-0.dll')
++gobject = _dlopen(ffi, '@gobject@')
++pango = _dlopen(ffi, '@pango@')
++harfbuzz = _dlopen(ffi, '@harfbuzz@')
++fontconfig = _dlopen(ffi, '@fontconfig@')
++pangoft2 = _dlopen(ffi, '@pangoft2@')
+ 
+ gobject.g_type_init()
\ No newline at end of file
diff --git a/nixpkgs/pkgs/development/python-modules/weaviate-client/default.nix b/nixpkgs/pkgs/development/python-modules/weaviate-client/default.nix
new file mode 100644
index 000000000000..d1ba11d15ec3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/weaviate-client/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, authlib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools-scm
+, tqdm
+, validators
+}:
+
+buildPythonPackage rec {
+  pname = "weaviate-client";
+  version = "3.25.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-iU33APwfCpMvo3ACn2RK9AYvhxgCb9pa0HZH01fZUWc=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "validators>=0.18.2,<=0.21.0" "validators>=0.18.2" \
+      --replace "requests>=2.28.0,<2.29.0" "requests>=2.28.0"
+  '';
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    authlib
+    tqdm
+    validators
+  ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "weaviate"
+  ];
+
+  meta = with lib; {
+    description = "Python native client for easy interaction with a Weaviate instance";
+    homepage = "https://github.com/weaviate/weaviate-python-client";
+    changelog = "https://github.com/weaviate/weaviate-python-client/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/web-cache/default.nix b/nixpkgs/pkgs/development/python-modules/web-cache/default.nix
new file mode 100644
index 000000000000..dba9d91875c2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/web-cache/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "web-cache";
+  version = "1.1.0";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit version;
+    pname = "web_cache";
+    sha256 = "1d8f1s3i0s3h1jqvjq6cp639hhbbpxvyq7cf9dwzrvvvr0s0m8fm";
+  };
+
+  # No tests in downloaded archive
+  doCheck = false;
+
+  pythonImportsCheck = [ "web_cache" ];
+
+  meta = with lib; {
+    description = "Simple Python key-value storage backed up by sqlite3 database";
+    homepage = "https://github.com/desbma/web_cache";
+    license = licenses.lgpl2Plus;
+    maintainers = with maintainers; [ moni ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/web/default.nix b/nixpkgs/pkgs/development/python-modules/web/default.nix
new file mode 100644
index 000000000000..33017b3a4650
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/web/default.nix
@@ -0,0 +1,35 @@
+{ lib, buildPythonPackage, fetchPypi, pytestCheckHook
+, cheroot
+, dbutils, mysqlclient, pymysql, mysql-connector, psycopg2
+}:
+
+buildPythonPackage rec {
+  version = "0.62";
+  pname = "web.py";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "5ce684caa240654cae5950da8b4b7bc178812031e08f990518d072bd44ab525e";
+  };
+
+  propagatedBuildInputs = [ cheroot ];
+
+  # requires multiple running databases
+  doCheck = false;
+
+  pythonImportsCheck = [ "web" ];
+
+  nativeCheckInputs = [ pytestCheckHook dbutils mysqlclient pymysql mysql-connector psycopg2 ];
+
+  meta = with lib; {
+    description = "Makes web apps";
+    longDescription = ''
+      Think about the ideal way to write a web app.
+      Write the code to make it happen.
+    '';
+    homepage = "https://webpy.org/";
+    license = licenses.publicDomain;
+    maintainers = with maintainers; [ layus ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/web3/default.nix b/nixpkgs/pkgs/development/python-modules/web3/default.nix
new file mode 100644
index 000000000000..ae709ef40886
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/web3/default.nix
@@ -0,0 +1,71 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, aiohttp
+, eth-abi
+, eth-account
+, eth-hash
+, eth-typing
+, eth-utils
+, hexbytes
+, ipfshttpclient
+, jsonschema
+, lru-dict
+, protobuf
+, requests
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "web3";
+  version = "6.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ethereum";
+    repo = "web3.py";
+    rev = "v${version}";
+    hash = "sha256-RNWCZQjcse415SSNkHhMWckDcBJGFZnjisckF7gbYY8=";
+  };
+
+  # Note: to reflect the extra_requires in main/setup.py.
+  passthru.optional-dependencies = {
+    ipfs = [ ipfshttpclient ];
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    eth-abi
+    eth-account
+    eth-hash ] ++ eth-hash.optional-dependencies.pycryptodome ++ [
+    eth-typing
+    eth-utils
+    hexbytes
+    jsonschema
+    lru-dict
+    protobuf
+    requests
+    websockets
+  ];
+
+  # TODO: package eth-tester required for tests
+  doCheck = false;
+
+  postPatch = ''
+    substituteInPlace setup.py --replace "types-protobuf==3.19.13" "types-protobuf"
+  '';
+
+  pythonImportsCheck = [
+    "web3"
+  ];
+
+  meta = with lib; {
+    description = "A python interface for interacting with the Ethereum blockchain and ecosystem";
+    homepage = "https://web3py.readthedocs.io/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hellwolf ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/webargs/default.nix b/nixpkgs/pkgs/development/python-modules/webargs/default.nix
new file mode 100644
index 000000000000..91d62cf849b8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webargs/default.nix
@@ -0,0 +1,41 @@
+{ buildPythonPackage, fetchPypi, lib, isPy27, marshmallow, pytestCheckHook
+, pytest-aiohttp, webtest, webtest-aiohttp, flask, django, bottle, tornado
+, pyramid, falcon, aiohttp }:
+
+buildPythonPackage rec {
+  pname = "webargs";
+  version = "8.3.0";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-yrIHlBsGhsTQhsgjYy3c1DQxUWRDQaMvz1C46qceMcc=";
+  };
+
+  pythonImportsCheck = [
+    "webargs"
+  ];
+
+  propagatedBuildInputs = [ marshmallow ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-aiohttp
+    webtest
+    webtest-aiohttp
+    flask
+    django
+    bottle
+    tornado
+    pyramid
+    falcon
+    aiohttp
+  ];
+
+  meta = with lib; {
+    description = "Declarative parsing and validation of HTTP request objects, with built-in support for popular web frameworks";
+    homepage = "https://github.com/marshmallow-code/webargs";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cript0nauta ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/webassets/default.nix b/nixpkgs/pkgs/development/python-modules/webassets/default.nix
new file mode 100644
index 000000000000..081fdc59bbe3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webassets/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonPackage, fetchPypi, pyyaml, nose, jinja2, mock, pytest }:
+
+buildPythonPackage rec {
+  pname = "webassets";
+  version = "2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1kc1042jydgk54xpgcp0r1ib4gys91nhy285jzfcxj3pfqrk4w8n";
+  };
+
+  propagatedBuildInputs = [ pyyaml ];
+  nativeCheckInputs = [ nose jinja2 mock pytest ];
+
+  # Needs Babel CLI tool
+  doCheck = false;
+  checkPhase = "py.test";
+
+  meta = with lib; {
+    description = "Media asset management for Python, with glue code for various web frameworks";
+    homepage = "https://github.com/miracle2k/webassets/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/webauthn/default.nix b/nixpkgs/pkgs/development/python-modules/webauthn/default.nix
new file mode 100644
index 000000000000..257649a9db0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webauthn/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, asn1crypto
+, cbor2
+, pythonOlder
+, pydantic
+, pyopenssl
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "webauthn";
+  version = "1.11.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "duo-labs";
+    repo = "py_webauthn";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+pp21rtwavtjj6ahG091xsJpsYOH3zpqU3xH2/YFXqY=";
+  };
+
+  propagatedBuildInputs = [
+    asn1crypto
+    cbor2
+    pydantic
+    pyopenssl
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "webauthn"
+  ];
+
+  disabledTests = [
+    # TypeError: X509StoreContextError.__init__() missing 1 required...
+    "test_throws_on_bad_root_cert"
+  ];
+
+  meta = with lib; {
+    description = "Implementation of the WebAuthn API";
+    homepage = "https://github.com/duo-labs/py_webauthn";
+    changelog = "https://github.com/duo-labs/py_webauthn/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/webcolors/default.nix b/nixpkgs/pkgs/development/python-modules/webcolors/default.nix
new file mode 100644
index 000000000000..7ee91e7ea2b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webcolors/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, unittestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "webcolors";
+  version = "1.13";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wiW2dMg/qSO+k9I1MwzgMANz0CiFzvIyOIE7DVZoMEo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [ unittestCheckHook ];
+
+  unittestFlagsArray = [ "-s" "tests" ];
+
+  pythonImportsCheck = [
+    "webcolors"
+  ];
+
+  meta = with lib; {
+    description = "Library for working with color names/values defined by the HTML and CSS specifications";
+    homepage = "https://github.com/ubernostrum/webcolors";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/webdav4/default.nix b/nixpkgs/pkgs/development/python-modules/webdav4/default.nix
new file mode 100644
index 000000000000..22c1ea8a964e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webdav4/default.nix
@@ -0,0 +1,100 @@
+{ lib
+, buildPythonPackage
+, cheroot
+, colorama
+, fetchFromGitHub
+, fsspec
+, hatch-vcs
+, hatchling
+, httpx
+, pytest-xdist
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, wsgidav
+}:
+
+buildPythonPackage rec {
+  pname = "webdav4";
+  version = "0.9.8";
+  pyproject = true;
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "skshetry";
+    repo = "webdav4";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Le/gABaUxMmSW2SjgucsBKqjxOq1h9UCAWl5YyUsCPk=";
+  };
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov" ""
+  '';
+
+  nativeBuildInputs = [
+    hatch-vcs
+    hatchling
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+    python-dateutil
+  ];
+
+  nativeCheckInputs = [
+    cheroot
+    colorama
+    pytest-xdist
+    pytestCheckHook
+    wsgidav
+  ] ++ passthru.optional-dependencies.fsspec;
+
+  passthru.optional-dependencies = {
+    fsspec = [
+      fsspec
+    ];
+    http2 = [
+      httpx.optional-dependencies.http2
+    ];
+    all = [
+      fsspec
+      httpx.optional-dependencies.http2
+    ];
+  };
+
+  pythonImportsCheck = [
+    "webdav4"
+  ];
+
+  disabledTests = [
+    # ValueError: Invalid dir_browser htdocs_path
+    "test_retry_reconnect_on_failure"
+    "test_open"
+    "test_open_binary"
+    "test_close_connection_if_nothing_is_read"
+    # Assertion error due to comparing output
+    "test_cp_cli"
+    "test_mv_cli"
+    "test_sync_remote_to_local"
+
+  ];
+
+  disabledTestPaths = [
+    # Tests requires network access
+    "tests/test_client.py"
+    "tests/test_fsspec.py"
+    "tests/test_cli.py"
+  ];
+
+  meta = with lib; {
+    description = "Library for interacting with WebDAV";
+    homepage = "https://skshetry.github.io/webdav4/";
+    changelog = "https://github.com/skshetry/webdav4/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/webdavclient3/default.nix b/nixpkgs/pkgs/development/python-modules/webdavclient3/default.nix
new file mode 100644
index 000000000000..d74d7b2e7ab9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webdavclient3/default.nix
@@ -0,0 +1,30 @@
+{ buildPythonPackage, fetchPypi, isPy27, lib, python-dateutil, lxml, requests
+, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "webdavclient3";
+  version = "3.14.6";
+
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "bcd22586bb0d58abc26ca56054fd04228e704bd36073c3080f4597c1556c880d";
+  };
+
+  propagatedBuildInputs = [ python-dateutil lxml requests ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  # disable tests completely, as most of them fail due to urllib3 not being able to establish a http connection
+  doCheck = false;
+
+  pythonImportsCheck = [ "webdav3.client" ];
+
+  meta = with lib; {
+    description = "Easy to use WebDAV Client for Python 3.x";
+    homepage = "https://github.com/ezhov-evgeny/webdav-client-python-3";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dmrauh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/webencodings/default.nix b/nixpkgs/pkgs/development/python-modules/webencodings/default.nix
new file mode 100644
index 000000000000..a8686fb7c7ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webencodings/default.nix
@@ -0,0 +1,27 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "webencodings";
+  version = "0.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923";
+  };
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test webencodings/tests.py
+  '';
+
+  meta = {
+    description = "Character encoding aliases for legacy web content";
+    homepage = "https://github.com/SimonSapin/python-webencodings";
+    license = lib.licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/webexteamssdk/default.nix b/nixpkgs/pkgs/development/python-modules/webexteamssdk/default.nix
new file mode 100644
index 000000000000..1e81e90af9a6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webexteamssdk/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, future
+, pyjwt
+, pythonOlder
+, requests
+, requests-toolbelt
+}:
+
+buildPythonPackage rec {
+  pname = "webexteamssdk";
+  version = "1.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "CiscoDevNet";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-xlkmXl4tVm48drXmkUijv9GNXzJcDnfSKbOMciPIRRo=";
+  };
+
+  propagatedBuildInputs = [
+    future
+    pyjwt
+    requests
+    requests-toolbelt
+  ];
+
+  # Tests require a Webex Teams test domain
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "webexteamssdk"
+  ];
+
+  meta = with lib; {
+    description = "Python module for Webex Teams APIs";
+    homepage = "https://github.com/CiscoDevNet/webexteamssdk";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/webhelpers/default.nix b/nixpkgs/pkgs/development/python-modules/webhelpers/default.nix
new file mode 100644
index 000000000000..dcb2bd3817d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webhelpers/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, routes
+, markupsafe
+, webob
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "WebHelpers";
+  version = "1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ea86f284e929366b77424ba9a89341f43ae8dee3cbeb8702f73bcf86058aa583";
+  };
+
+  buildInputs = [ routes markupsafe webob nose ];
+
+  # TODO: failing tests https://bitbucket.org/bbangert/webhelpers/pull-request/1/fix-error-on-webob-123/diff
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://webhelpers.readthedocs.org/en/latest/";
+    description = "Web Helpers";
+    license = licenses.free;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/webob/default.nix b/nixpkgs/pkgs/development/python-modules/webob/default.nix
new file mode 100644
index 000000000000..2b07f61e1d3a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webob/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "webob";
+  version = "1.8.7";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "WebOb";
+    inherit version;
+    hash = "sha256-tk71FBvlWc+t5EjwRPpFwiYDUe3Lao72t+AMfc7wwyM=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "webob"
+  ];
+
+  disabledTestPaths = [
+    # AttributeError: 'Thread' object has no attribute 'isAlive'
+    "tests/test_in_wsgiref.py"
+    "tests/test_client_functional.py"
+  ];
+
+  meta = with lib; {
+    description = "WSGI request and response object";
+    homepage = "https://webob.org/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/weboob/default.nix b/nixpkgs/pkgs/development/python-modules/weboob/default.nix
new file mode 100644
index 000000000000..79a88db2a576
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/weboob/default.nix
@@ -0,0 +1,97 @@
+{ lib
+, babel
+, buildPythonPackage
+, cssselect
+, feedparser
+, fetchPypi
+, gdata
+, gnupg
+, google-api-python-client
+, html2text
+, libyaml
+, lxml
+, mechanize
+, nose
+, pdfminer-six
+, pillow
+, prettytable
+, pyqt5
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, pyyaml
+, requests
+, simplejson
+, termcolor
+, unidecode
+}:
+
+buildPythonPackage rec {
+  pname = "weboob";
+  version = "2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1c69vzf8sg8471lcaafpz9iw2q3rfj5hmcpqrs2k59fkgbvy32zw";
+  };
+
+  nativeBuildInputs = [
+    pyqt5
+  ];
+
+  propagatedBuildInputs = [
+    babel
+    cssselect
+    python-dateutil
+    feedparser
+    gdata
+    gnupg
+    google-api-python-client
+    html2text
+    libyaml
+    lxml
+    mechanize
+    pdfminer-six
+    pillow
+    prettytable
+    pyqt5
+    pyyaml
+    requests
+    simplejson
+    termcolor
+    unidecode
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace "with-doctest = 1" "" \
+      --replace "with-coverage = 1" "" \
+      --replace "weboob.browser.filters.standard," "" \
+      --replace "weboob.browser.tests.filters," "" \
+      --replace "weboob.tools.application.formatters.json," "" \
+      --replace "weboob.tools.application.formatters.table," "" \
+      --replace "weboob.tools.capabilities.bank.transactions," ""
+  '';
+
+  nativeCheckInputs = [
+    nose
+  ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  pythonImportsCheck = [
+    "weboob"
+  ];
+
+  meta = with lib; {
+    description = "Collection of applications and APIs to interact with websites";
+    homepage = "http://weboob.org";
+    license = licenses.agpl3Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/webrtc-noise-gain/default.nix b/nixpkgs/pkgs/development/python-modules/webrtc-noise-gain/default.nix
new file mode 100644
index 000000000000..63b02a1bfd0d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webrtc-noise-gain/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, stdenv
+
+# build-system
+, pybind11
+, setuptools
+
+# native dependencies
+, abseil-cpp
+, darwin
+
+# tests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "webrtc-noise-gain";
+  version = "1.2.3";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "rhasspy";
+    repo = "webrtc-noise-gain";
+    rev = "v${version}";
+    hash = "sha256-DFEtuO49zXNixLwBjQ/WOiARDhMAXVH+5hfc3eSdPIo=";
+  };
+
+  nativeBuildInputs = [
+    pybind11
+    setuptools
+  ];
+
+  buildInputs = [
+    abseil-cpp
+  ] ++ lib.optionals (stdenv.isDarwin) [
+    darwin.apple_sdk.frameworks.CoreServices
+  ];
+
+  pythonImportsCheck = [
+    "webrtc_noise_gain"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Tiny wrapper around webrtc-audio-processing for noise suppression/auto gain only";
+    homepage = "https://github.com/rhasspy/webrtc-noise-gain";
+    changelog = "https://github.com/rhasspy/webrtc-noise-gain/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/webrtcvad/default.nix b/nixpkgs/pkgs/development/python-modules/webrtcvad/default.nix
new file mode 100644
index 000000000000..f90d0b97bee6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webrtcvad/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "webrtcvad";
+  version = "2.0.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f1bed2fb25b63fb7b1a55d64090c993c9c9167b28485ae0bcdd81cf6ede96aea";
+  };
+
+  # required WAV files for testing are not included in the tarball
+  doCheck = false;
+
+  meta = {
+    description = "Interface to the Google WebRTC Voice Activity Detector (VAD)";
+    homepage = "https://github.com/wiseman/py-webrtcvad";
+    license = with lib.licenses; [ mit ];
+    maintainers = with lib.maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/websocket-client/default.nix b/nixpkgs/pkgs/development/python-modules/websocket-client/default.nix
new file mode 100644
index 000000000000..26c27825f7bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/websocket-client/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytestCheckHook
+, python-socks
+}:
+
+buildPythonPackage rec {
+  pname = "websocket-client";
+  version = "1.6.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Oq0l0xKEJmvPz9H9inQ/YygjBaNkuNCUikO9YGrMZS8=";
+  };
+
+  propagatedBuildInputs = [
+    python-socks
+   ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "websocket"
+  ];
+
+  meta = with lib; {
+    description = "Websocket client for Python";
+    homepage = "https://github.com/websocket-client/websocket-client";
+    changelog = "https://github.com/websocket-client/websocket-client/blob/v${version}/ChangeLog";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/websockets/default.nix b/nixpkgs/pkgs/development/python-modules/websockets/default.nix
new file mode 100644
index 000000000000..ec6e429f5945
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/websockets/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, unittestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "websockets";
+  version = "11.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "aaugustin";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-RdkbIiZI/UYsWdnnl5gJPsnJ/6adfFtkiXC7MO/HwcI=";
+  };
+
+  patchPhase = ''
+    # Disable all tests that need to terminate within a predetermined amount of
+    # time. This is nondeterministic.
+    sed -i 's/with self.assertCompletesWithin.*:/if True:/' \
+      tests/legacy/test_protocol.py
+
+    # Disables tests relying on tight timeouts to avoid failures like:
+    #   File "/build/source/tests/legacy/test_protocol.py", line 1270, in test_keepalive_ping_with_no_ping_timeout
+    #     ping_1_again, ping_2 = tuple(self.protocol.pings)
+    #   ValueError: too many values to unpack (expected 2)
+    for t in \
+             test_keepalive_ping_stops_when_connection_closing \
+             test_keepalive_ping_does_not_crash_when_connection_lost \
+             test_keepalive_ping \
+             test_keepalive_ping_not_acknowledged_closes_connection \
+             test_keepalive_ping_with_no_ping_timeout \
+      ; do
+      sed -i "s/def $t(/def skip_$t(/" tests/legacy/test_protocol.py
+    done
+  '';
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  # Tests fail on Darwin with `OSError: AF_UNIX path too long`
+  doCheck = !stdenv.isDarwin;
+
+  pythonImportsCheck = [
+    "websockets"
+  ];
+
+  meta = with lib; {
+    description = "WebSocket implementation in Python";
+    homepage = "https://websockets.readthedocs.io/";
+    changelog = "https://github.com/aaugustin/websockets/blob/${version}/docs/project/changelog.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/websockify/default.nix b/nixpkgs/pkgs/development/python-modules/websockify/default.nix
new file mode 100644
index 000000000000..b456de718c7e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/websockify/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, jwcrypto
+, numpy
+, pytestCheckHook
+, pythonOlder
+, redis
+, requests
+, simplejson
+}:
+
+buildPythonPackage rec {
+  pname = "websockify";
+  version = "0.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "novnc";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-82Fk9qbiiCD5Rts1d14sK/njeN7DcjKMKPqE7S/1WHs=";
+  };
+
+  propagatedBuildInputs = [
+    jwcrypto
+    numpy
+    redis
+    requests
+    simplejson
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    # this test failed on macos
+    # https://github.com/novnc/websockify/issues/552
+    "test_socket_set_keepalive_options"
+  ];
+
+  pythonImportsCheck = [
+    "websockify"
+  ];
+
+  meta = with lib; {
+    description = "WebSockets support for any application/server";
+    homepage = "https://github.com/kanaka/websockify";
+    changelog = "https://github.com/novnc/websockify/releases/tag/v${version}";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/webssh/default.nix b/nixpkgs/pkgs/development/python-modules/webssh/default.nix
new file mode 100644
index 000000000000..dd7fcaa5bcf9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webssh/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, paramiko
+, pytestCheckHook
+, tornado
+}:
+
+buildPythonPackage rec {
+  pname = "webssh";
+  version = "1.6.2";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-mRestRJukaf7ti3vIs/MM/R+zpGmK551j5HAM2chBsE=";
+  };
+
+  propagatedBuildInputs = [
+    paramiko
+    tornado
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "webssh"
+  ];
+
+  disabledTests = [
+    # Test fails with AttributeError (possibly related to paramiko update)
+    "test_app_with_bad_host_key"
+  ];
+
+  meta = with lib; {
+    description = "Web based SSH client";
+    homepage = "https://github.com/huashengdun/webssh/";
+    changelog = "https://github.com/huashengdun/webssh/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ davidtwco ];
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/webtest-aiohttp/default.nix b/nixpkgs/pkgs/development/python-modules/webtest-aiohttp/default.nix
new file mode 100644
index 000000000000..f8666689ca31
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webtest-aiohttp/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, webtest
+}:
+
+buildPythonPackage rec {
+  pname = "webtest-aiohttp";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sloria";
+    repo = pname;
+    rev = version;
+    hash = "sha256-UuAz/k/Tnumupv3ybFR7PkYHwG3kH7M5oobZykEP+ao=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "python311-compat.patch";
+      url = "https://github.com/sloria/webtest-aiohttp/commit/64e5ab1867ea9ef87901bb2a1a6142566bffc90b.patch";
+      hash = "sha256-OKJGajqJLFMkcbGmGfU9G5hCpJaj24Gs363sI0z7YZw=";
+    })
+  ];
+
+  propagatedBuildInputs = [
+    webtest
+  ];
+
+  nativeCheckInputs = [
+    aiohttp
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "webtest_aiohttp"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/sloria/webtest-aiohttp/blob/${src.rev}/CHANGELOG.rst";
+    description = "Provides integration of WebTest with aiohttp.web applications";
+    homepage = "https://github.com/sloria/webtest-aiohttp";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cript0nauta ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/webtest/default.nix b/nixpkgs/pkgs/development/python-modules/webtest/default.nix
new file mode 100644
index 000000000000..ce34b045fd67
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webtest/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, beautifulsoup4
+, buildPythonPackage
+, fetchPypi
+, pastedeploy
+, pyquery
+, pytestCheckHook
+, pythonOlder
+, six
+, waitress
+, webob
+, wsgiproxy2
+}:
+
+buildPythonPackage rec {
+  pname = "webtest";
+  version = "3.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    pname = "WebTest";
+    inherit version;
+    hash = "sha256-VL2WlyWDjZhhqfon+Nlx950nXZSuJV9cUB9Tu22ZKes=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    six
+    waitress
+    webob
+  ];
+
+  nativeCheckInputs = [
+    pastedeploy
+    pyquery
+    pytestCheckHook
+    wsgiproxy2
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [
+    "webtest"
+  ];
+
+  meta = with lib; {
+    description = "Helper to test WSGI applications";
+    homepage = "https://webtest.readthedocs.org/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/webthing-ws/default.nix b/nixpkgs/pkgs/development/python-modules/webthing-ws/default.nix
new file mode 100644
index 000000000000..1e7b89e03b62
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webthing-ws/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, aiohttp
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "webthing-ws";
+  version = "0.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-ecosystem";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-j7nc4yJczDs28RVFDHeQ2ZIG9mIW2m25AAeErVKi4E4=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    async-timeout
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "webthing_ws"
+  ];
+
+  meta = with lib; {
+    description = "WebThing WebSocket consumer and API client";
+    homepage = "https://github.com/home-assistant-ecosystem/webthing-ws";
+    changelog = "https://github.com/home-assistant-ecosystem/webthing-ws/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/webthing/default.nix b/nixpkgs/pkgs/development/python-modules/webthing/default.nix
new file mode 100644
index 000000000000..aea123bc78c1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/webthing/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, ifaddr
+, jsonschema
+, pyee
+, pythonOlder
+, tornado
+, zeroconf
+}:
+
+buildPythonPackage rec {
+  pname = "webthing";
+  version = "0.15.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "WebThingsIO";
+    repo = "webthing-python";
+    rev = "v${version}";
+    hash = "sha256-z4GVycdq25QZxuzZPLg6nhj0MAD1bHrsqph4yHgmRhg=";
+  };
+
+  propagatedBuildInputs = [
+    ifaddr
+    jsonschema
+    pyee
+    tornado
+    zeroconf
+  ];
+
+  # No tests are present
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "webthing"
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of a Web Thing server";
+    homepage = "https://github.com/WebThingsIO/webthing-python";
+    license = with licenses; [ mpl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/weconnect-mqtt/default.nix b/nixpkgs/pkgs/development/python-modules/weconnect-mqtt/default.nix
new file mode 100644
index 000000000000..3f85f8064899
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/weconnect-mqtt/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, paho-mqtt
+, python-dateutil
+, weconnect
+}:
+
+buildPythonPackage rec {
+  pname = "weconnect-mqtt";
+  version = "0.48.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "tillsteinbach";
+    repo = "WeConnect-mqtt";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Pja9BP0gbWXTgOokEngNS364tJp1oWJYNKcTxyYJHGw=";
+  };
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "weconnect[Images]~=" "weconnect>="
+    substituteInPlace weconnect_mqtt/__version.py \
+      --replace "develop" "${version}"
+    substituteInPlace pytest.ini \
+      --replace "--cov=weconnect_mqtt --cov-config=.coveragerc --cov-report html" "" \
+      --replace "pytest-cov" ""
+  '';
+
+  propagatedBuildInputs = [
+    paho-mqtt
+    python-dateutil
+    weconnect
+  ] ++ weconnect.optional-dependencies.Images;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "weconnect_mqtt"
+  ];
+
+  meta = with lib; {
+    description = "Python client that publishes data from Volkswagen WeConnect";
+    homepage = "https://github.com/tillsteinbach/WeConnect-mqtt";
+    changelog = "https://github.com/tillsteinbach/WeConnect-mqtt/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/weconnect/default.nix b/nixpkgs/pkgs/development/python-modules/weconnect/default.nix
new file mode 100644
index 000000000000..e9f4877110ef
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/weconnect/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, ascii-magic
+, buildPythonPackage
+, fetchFromGitHub
+, pillow
+, pytest-httpserver
+, pytestCheckHook
+, pythonOlder
+, requests
+, oauthlib
+}:
+
+buildPythonPackage rec {
+  pname = "weconnect";
+  version = "0.59.5";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "tillsteinbach";
+    repo = "WeConnect-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ujIA98QD8ds2/iLLeJqn88nY9tZuuOSnOwGvRznA8PQ=";
+  };
+
+  propagatedBuildInputs = [
+    oauthlib
+    requests
+  ];
+
+  passthru.optional-dependencies = {
+    Images = [
+      ascii-magic
+      pillow
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytest-httpserver
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace weconnect/__version.py \
+      --replace "develop" "${version}"
+    substituteInPlace setup.py \
+      --replace "setup_requires=SETUP_REQUIRED," "setup_requires=[]," \
+      --replace "tests_require=TEST_REQUIRED," "tests_require=[],"
+    substituteInPlace image_extra_requirements.txt \
+      --replace "pillow~=" "pillow>=" \
+      --replace "ascii_magic~=" "ascii_magic>="
+    substituteInPlace pytest.ini \
+      --replace "--cov=weconnect --cov-config=.coveragerc --cov-report html" "" \
+      --replace "required_plugins = pytest-httpserver pytest-cov" ""
+  '';
+
+  pythonImportsCheck = [
+    "weconnect"
+  ];
+
+  meta = with lib; {
+    description = "Python client for the Volkswagen WeConnect Services";
+    homepage = "https://github.com/tillsteinbach/WeConnect-python";
+    changelog = "https://github.com/tillsteinbach/WeConnect-python/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/werkzeug/default.nix b/nixpkgs/pkgs/development/python-modules/werkzeug/default.nix
new file mode 100644
index 000000000000..db045e77c52f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/werkzeug/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, flit-core
+, watchdog
+, ephemeral-port-reserve
+, pytest-timeout
+, pytest-xprocess
+, pytestCheckHook
+, markupsafe
+# for passthru.tests
+, moto, sentry-sdk
+}:
+
+buildPythonPackage rec {
+  pname = "werkzeug";
+  version = "2.3.7";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-K4wORHtLnbzIXdl7butNy69si2w74L1lTiVVPgohV9g=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    markupsafe
+  ];
+
+  passthru.optional-dependencies = {
+    watchdog = lib.optionals (!stdenv.isDarwin) [
+      # watchdog requires macos-sdk 10.13[
+      watchdog
+    ];
+  };
+
+  nativeCheckInputs = [
+    ephemeral-port-reserve
+    pytest-timeout
+    pytest-xprocess
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  disabledTests = lib.optionals stdenv.isDarwin [
+    "test_get_machine_id"
+  ];
+
+  disabledTestPaths = [
+    # ConnectionRefusedError: [Errno 111] Connection refused
+    "tests/test_serving.py"
+  ];
+
+  pytestFlagsArray = [
+    # don't run tests that are marked with filterwarnings, they fail with
+    # warnings._OptionError: unknown warning category: 'pytest.PytestUnraisableExceptionWarning'
+    "-m 'not filterwarnings'"
+  ];
+
+  passthru.tests = {
+    inherit moto sentry-sdk;
+  };
+
+  meta = with lib; {
+    homepage = "https://palletsprojects.com/p/werkzeug/";
+    description = "The comprehensive WSGI web application library";
+    longDescription = ''
+      Werkzeug is a comprehensive WSGI web application library. It
+      began as a simple collection of various utilities for WSGI
+      applications and has become one of the most advanced WSGI
+      utility libraries.
+    '';
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/west/default.nix b/nixpkgs/pkgs/development/python-modules/west/default.nix
new file mode 100644
index 000000000000..b3cfcaa30b60
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/west/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, colorama
+, configobj
+, fetchPypi
+, packaging
+, pykwalify
+, pythonOlder
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "west";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-tB5RrJA5OUT5wB974nAA1LMpYVt+0HT7DvaTtGRoEpc=";
+  };
+
+  propagatedBuildInputs = [
+    colorama
+    configobj
+    packaging
+    pyyaml
+    pykwalify
+  ];
+
+  # pypi package does not include tests (and for good reason):
+  # tests run under 'tox' and have west try to git clone repos (not sandboxable)
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "west"
+  ];
+
+  meta = with lib; {
+    description = "Zephyr RTOS meta tool";
+    longDescription = ''
+      West lets you manage multiple Git repositories under a single directory using a single file,
+      called the west manifest file, or manifest for short.
+
+      The manifest file is named west.yml.
+      You use west init to set up this directory,
+      then west update to fetch and/or update the repositories
+      named in the manifest.
+
+      By default, west uses upstream Zephyr’s manifest file
+      (https://github.com/zephyrproject-rtos/zephyr/blob/master/west.yml),
+      but west doesn’t care if the manifest repository is a Zephyr tree or not.
+
+      For more details, see Multiple Repository Management in the west documentation
+      (https://docs.zephyrproject.org/latest/guides/west/repo-tool.html).
+    '';
+    homepage = "https://github.com/zephyrproject-rtos/west";
+    changelog = "https://github.com/zephyrproject-rtos/west/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ siriobalmelli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wfuzz/default.nix b/nixpkgs/pkgs/development/python-modules/wfuzz/default.nix
new file mode 100644
index 000000000000..1bc512398bd0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wfuzz/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, chardet
+, colorama
+, fetchFromGitHub
+, netaddr
+, pycurl
+, pyparsing
+, pytest
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "wfuzz";
+  version = "3.1.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "xmendez";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-RM6QM/iR00ymg0FBUtaWAtxPHIX4u9U/t5N/UT/T6sc=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pyparsing>=2.4*" "pyparsing>=2.4"
+  '';
+
+  propagatedBuildInputs = [
+    chardet
+    pycurl
+    six
+    setuptools
+    pyparsing
+  ] ++ lib.optionals stdenv.hostPlatform.isWindows [
+    colorama
+  ];
+
+  nativeCheckInputs = [
+    netaddr
+    pytest
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  disabledTestPaths = [
+    # The tests are requiring a local web server
+    "tests/test_acceptance.py"
+    "tests/acceptance/test_saved_filter.py"
+  ];
+
+  pythonImportsCheck = [
+    "wfuzz"
+  ];
+
+  postInstall = ''
+    mkdir -p $out/share/wordlists/wfuzz
+    cp -R -T "wordlist" "$out/share/wordlists/wfuzz"
+  '';
+
+  meta = with lib; {
+    description = "Web content fuzzer to facilitate web applications assessments";
+    longDescription = ''
+      Wfuzz provides a framework to automate web applications security assessments
+      and could help you to secure your web applications by finding and exploiting
+      web application vulnerabilities.
+    '';
+    homepage = "https://wfuzz.readthedocs.io";
+    license = with licenses; [ gpl2Only ];
+    maintainers = with maintainers; [ pamplemousse ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wget/default.nix b/nixpkgs/pkgs/development/python-modules/wget/default.nix
new file mode 100644
index 000000000000..a86b693affa4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wget/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "wget";
+  version = "3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "35e630eca2aa50ce998b9b1a127bb26b30dfee573702782aa982f875e3f16061";
+    extension = "zip";
+  };
+
+  meta = {
+    description = "Pure python download utility";
+    homepage = "https://bitbucket.org/techtonik/python-wget/";
+    license = with lib.licenses; [ unlicense ];
+    maintainers = with lib.maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/whatthepatch/default.nix b/nixpkgs/pkgs/development/python-modules/whatthepatch/default.nix
new file mode 100644
index 000000000000..b2379a82006e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/whatthepatch/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, setuptools
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "whatthepatch";
+  version = "1.0.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "cscorley";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-1+OIs77Vyx56pgf7VSmi4UsPgkv8qZXFm8L2jK2CTMk=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "whatthepatch"
+  ];
+
+  meta = with lib; {
+    description = "Python library for both parsing and applying patch files";
+    homepage = "https://github.com/cscorley/whatthepatch";
+    changelog = "https://github.com/cscorley/whatthepatch/blob/${version}/HISTORY.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ joelkoen ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wheel-filename/default.nix b/nixpkgs/pkgs/development/python-modules/wheel-filename/default.nix
new file mode 100644
index 000000000000..1937d7710f3c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wheel-filename/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "wheel-filename";
+  version = "1.4.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "jwodder";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-M3XGHG733X5qKuMS6mvFSFHYOwWPaBMXw+w0eYo6ByE=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "remove-wheel-dependency-constraint.patch";
+      url = "https://github.com/jwodder/wheel-filename/commit/11cfa57c8a32fa2a52fb5fe537859997bb642e75.patch";
+      hash = "sha256-ssePCVlJuHPJpPyFET3FnnWRlslLnZbnfn42g52yVN4=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace tox.ini \
+      --replace " --cov=wheel_filename --no-cov-on-fail" ""
+  '';
+
+  pythonImportsCheck = [
+    "wheel_filename"
+  ];
+
+  meta = with lib; {
+    description = "Parse wheel filenames";
+    homepage = "https://github.com/jwodder/wheel-filename";
+    license = with licenses; [ mit ];
+    maintainers = with lib.maintainers; [ ayazhafiz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wheel-inspect/default.nix b/nixpkgs/pkgs/development/python-modules/wheel-inspect/default.nix
new file mode 100644
index 000000000000..c8ce155c788f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wheel-inspect/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, attrs
+, buildPythonPackage
+, entry-points-txt
+, fetchFromGitHub
+, headerparser
+, jsonschema
+, packaging
+, pytestCheckHook
+, pythonOlder
+, readme_renderer
+, wheel-filename
+}:
+
+buildPythonPackage rec {
+  pname = "wheel-inspect";
+  version = "1.7.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "jwodder";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-pB9Rh+A7GlxnYuka2mTSBoxpoyYCzoaMPVgsHDlpos0=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    entry-points-txt
+    headerparser
+    packaging
+    readme_renderer
+    wheel-filename
+  ];
+
+  nativeCheckInputs = [
+    jsonschema
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace tox.ini \
+      --replace " --cov=wheel_inspect --no-cov-on-fail" ""
+    substituteInPlace setup.cfg \
+      --replace "entry-points-txt ~= 0.1.0" "entry-points-txt >= 0.1.0"
+  '';
+
+  pythonImportsCheck = [
+    "wheel_inspect"
+  ];
+
+  pytestFlagsArray = [
+    "-W"
+    "ignore::DeprecationWarning"
+  ];
+
+  meta = with lib; {
+    description = "Extract information from wheels";
+    homepage = "https://github.com/jwodder/wheel-inspect";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ ayazhafiz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wheel/0001-tests-Rename-a-a-o-_-.py-_-.py.patch b/nixpkgs/pkgs/development/python-modules/wheel/0001-tests-Rename-a-a-o-_-.py-_-.py.patch
new file mode 100644
index 000000000000..8e70f0069d65
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wheel/0001-tests-Rename-a-a-o-_-.py-_-.py.patch
@@ -0,0 +1,34 @@
+From 5879a4bbc34d1eb25e160b15b2f5a4f10eac6bd2 Mon Sep 17 00:00:00 2001
+From: toonn <toonn@toonn.io>
+Date: Mon, 13 Sep 2021 18:07:26 +0200
+Subject: [PATCH] =?UTF-8?q?tests:=20Rename=20a=CC=8Aa=CC=88o=CC=88=5F?=
+ =?UTF-8?q?=E6=97=A5=E6=9C=AC=E8=AA=9E.py=20=3D>=20=C3=A6=C9=90=C3=B8=5F?=
+ =?UTF-8?q?=E6=97=A5=E6=9C=AC=E5=83=B9.py?=
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+`åäö_日本語.py` normalizes differently in NFC and NFD normal forms. This
+means a hash generated for the source directory can differ depending on
+whether or not the filesystem is normalizing and which normal form it
+uses.
+
+By renaming the file to `æɐø_日本價.py` we avoid this issue by using a
+name that has the same encoding in each normal form.
+---
+ tests/test_bdist_wheel.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tests/test_bdist_wheel.py b/tests/test_bdist_wheel.py
+index 5a6db16..42cf121 100644
+--- a/tests/test_bdist_wheel.py
++++ b/tests/test_bdist_wheel.py
+@@ -69,7 +69,7 @@ def test_unicode_record(wheel_paths):
+     with ZipFile(path) as zf:
+         record = zf.read("unicode.dist-0.1.dist-info/RECORD")
+ 
+-    assert "åäö_日本語.py".encode() in record
++    assert "æɐø_日本價.py".encode() in record
+ 
+ 
+ UTF8_PKG_INFO = """\
diff --git a/nixpkgs/pkgs/development/python-modules/wheel/default.nix b/nixpkgs/pkgs/development/python-modules/wheel/default.nix
new file mode 100644
index 000000000000..16c6c2dc087d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wheel/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, flit-core
+}:
+
+buildPythonPackage rec {
+  pname = "wheel";
+  version = "0.41.1";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "pypa";
+    repo = pname;
+    rev = version;
+    hash = "sha256-/EaDJ2zI/ly2BrrGhiZGwiBYDVPYWTki+87UqtCS3bw=";
+    postFetch = ''
+      cd $out
+      mv tests/testdata/unicode.dist/unicodedist/åäö_日本語.py \
+        tests/testdata/unicode.dist/unicodedist/æɐø_日本價.py
+      patch -p1 < ${./0001-tests-Rename-a-a-o-_-.py-_-.py.patch}
+    '';
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  # No tests in archive
+  doCheck = false;
+
+  pythonImportsCheck = [ "wheel" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/pypa/wheel";
+    description = "A built-package format for Python";
+    longDescription = ''
+      This library is the reference implementation of the Python wheel packaging standard,
+      as defined in PEP 427.
+
+      It has two different roles:
+
+      - A setuptools extension for building wheels that provides the bdist_wheel setuptools command
+      - A command line tool for working with wheel files
+
+      It should be noted that wheel is not intended to be used as a library,
+      and as such there is no stable, public API.
+    '';
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ siriobalmelli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wheezy-captcha/default.nix b/nixpkgs/pkgs/development/python-modules/wheezy-captcha/default.nix
new file mode 100644
index 000000000000..4006bedf14e1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wheezy-captcha/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pillow
+}:
+
+buildPythonPackage rec {
+  pname = "wheezy.captcha";
+  version = "3.0.2";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-PdtOhoVOopQsX2raPqh0P8meM8/MysgKsIe27HNtl3s=";
+  };
+
+  propagatedBuildInputs = [ pillow ];
+
+  pythonImportsCheck = [ "wheezy.captcha" ];
+
+  meta = with lib; {
+    homepage = "https://wheezycaptcha.readthedocs.io/en/latest/";
+    description = "A lightweight CAPTCHA library";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Flakebi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wheezy-template/default.nix b/nixpkgs/pkgs/development/python-modules/wheezy-template/default.nix
new file mode 100644
index 000000000000..ef70345c1a18
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wheezy-template/default.nix
@@ -0,0 +1,23 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "wheezy.template";
+  version = "3.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-4RAHysczaNzhKZjjS2bEdgFrtGFHH/weTVboQALslg8=";
+  };
+
+  pythonImportsCheck = [ "wheezy.template" ];
+
+  meta = with lib; {
+    homepage = "https://wheezytemplate.readthedocs.io/en/latest/";
+    description = "A lightweight template library";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lilyinstarlight ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/whichcraft/default.nix b/nixpkgs/pkgs/development/python-modules/whichcraft/default.nix
new file mode 100644
index 000000000000..c68925b46ae3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/whichcraft/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, pytest, glibcLocales }:
+
+buildPythonPackage rec {
+  pname = "whichcraft";
+  version = "0.6.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "11yfkzyplizdgndy34vyd5qlmr1n5mxis3a3svxmx8fnccdvknxc";
+  };
+
+  LC_ALL="en_US.utf-8";
+  buildInputs = [ glibcLocales ];
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    py.test
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/pydanny/whichcraft";
+    description = "Cross-platform cross-python shutil.which functionality";
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/whirlpool-sixth-sense/default.nix b/nixpkgs/pkgs/development/python-modules/whirlpool-sixth-sense/default.nix
new file mode 100644
index 000000000000..91c56472e77e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/whirlpool-sixth-sense/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, aioconsole
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "whirlpool-sixth-sense";
+  version = "0.18.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "abmantis";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-0NJsZex054CWfKX2wyJRd6Cnxa89mNrZN59VqIV2MD8=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aioconsole
+    aiohttp
+    websockets
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  # https://github.com/abmantis/whirlpool-sixth-sense/issues/15
+  doCheck = false;
+
+  pythonImportsCheck = [ "whirlpool" ];
+
+  meta = with lib; {
+    description = "Python library for Whirlpool 6th Sense appliances";
+    homepage = "https://github.com/abmantis/whirlpool-sixth-sense/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/whisper/default.nix b/nixpkgs/pkgs/development/python-modules/whisper/default.nix
new file mode 100644
index 000000000000..300465b65474
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/whisper/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, mock
+, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "whisper";
+  version = "1.1.10";
+
+  src = fetchFromGitHub {
+    owner = "graphite-project";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-CnCbRmI2jc67mTtfupoE1uHtobrAiWoUXbfX8YeEV6A=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # whisper-resize.py: not found
+    "test_resize_with_aggregate"
+  ];
+
+  pythonImportsCheck = [ "whisper" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/graphite-project/whisper";
+    description = "Fixed size round-robin style database";
+    maintainers = with maintainers; [ offline basvandijk ];
+    license = licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/whispers/default.nix b/nixpkgs/pkgs/development/python-modules/whispers/default.nix
new file mode 100644
index 000000000000..bba0f14e159b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/whispers/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, astroid
+, beautifulsoup4
+, buildPythonPackage
+, crossplane
+, fetchFromGitHub
+, jellyfish
+, jproperties
+, luhn
+, lxml
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "whispers";
+  version = "2.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "adeptex";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-9vXku8BWJtlf+lmAcQ8a7qTisRNc+xVw0T0Eunc4lt4=";
+  };
+
+  propagatedBuildInputs = [
+    astroid
+    beautifulsoup4
+    crossplane
+    jellyfish
+    jproperties
+    luhn
+    lxml
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace '"pytest-runner"' ""
+  '';
+
+  preCheck = ''
+    # Some tests need the binary available in PATH
+    export PATH=$out/bin:$PATH
+  '';
+
+  pythonImportsCheck = [
+    "whispers"
+  ];
+
+  meta = with lib; {
+    description = "Tool to identify hardcoded secrets in static structured text";
+    homepage = "https://github.com/Skyscanner/whispers";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/whitenoise/default.nix b/nixpkgs/pkgs/development/python-modules/whitenoise/default.nix
new file mode 100644
index 000000000000..13168c3757eb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/whitenoise/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, brotli
+, buildPythonPackage
+, django
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, requests
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "whitenoise";
+  version = "6.5.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  __darwinAllowLocalNetworking = true;
+
+  src = fetchFromGitHub {
+    owner = "evansd";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-g1D0tjGsAP3y1fWvODWwNvxnTSZJuTpyZ0Otk83Oq9E=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    brotli
+  ];
+
+  nativeCheckInputs = [
+    django
+    pytestCheckHook
+    requests
+  ];
+
+  disabledTestPaths = [
+    # Don't run Django tests
+    "tests/test_django_whitenoise.py"
+    "tests/test_runserver_nostatic.py"
+    "tests/test_storage.py"
+  ];
+
+  disabledTests = [
+    # Test fails with AssertionError
+    "test_modified"
+  ];
+
+  pythonImportsCheck = [
+    "whitenoise"
+  ];
+
+  meta = with lib; {
+    description = "Library to serve static file for WSGI applications";
+    homepage = "https://whitenoise.readthedocs.io/";
+    changelog = "https://github.com/evansd/whitenoise/blob/${version}/docs/changelog.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/whodap/default.nix b/nixpkgs/pkgs/development/python-modules/whodap/default.nix
new file mode 100644
index 000000000000..c991e5a5922c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/whodap/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, httpx
+}:
+
+buildPythonPackage rec {
+  pname = "whodap";
+  version = "0.1.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "pogzyb";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-IX4sxuOxH4rXZlpRiWncXvaB2TkfZl1rKioZ3eqDGHs=";
+  };
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    # Requires network access
+    "tests/test_client.py"
+  ];
+
+  pythonImportsCheck = [
+    "whodap"
+  ];
+
+  meta = with lib; {
+    description = "Python RDAP utility for querying and parsing information about domain names";
+    homepage = "https://github.com/pogzyb/whodap";
+    changelog = "https://github.com/pogzyb/whodap/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/whois-api/default.nix b/nixpkgs/pkgs/development/python-modules/whois-api/default.nix
new file mode 100644
index 000000000000..775fb6335697
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/whois-api/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, requests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "whois-api";
+  version = "1.2.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "whois-api-llc";
+    repo = "whois-api-py";
+    rev = "v${version}";
+    hash = "sha256-SeBeJ6k2R53LxHov+8t70geqUosk/yBJQCi6GaVteMM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # all tests touch internet
+  doCheck = false;
+
+  pythonImportsCheck = [ "whoisapi" ];
+
+  meta = with lib; {
+    description = "Whois API client library for Python";
+    homepage = "https://github.com/whois-api-llc/whois-api-py";
+    changelog = "https://github.com/whois-api-llc/whois-api-py/blob/${src.rev}/CHANGELOG.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/whois/default.nix b/nixpkgs/pkgs/development/python-modules/whois/default.nix
new file mode 100644
index 000000000000..184e5fe4c53d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/whois/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, inetutils
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "whois";
+  version = "0.9.27";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "DannyCork";
+    repo = "python-whois";
+    rev = "refs/tags/${version}";
+    hash = "sha256-hs4iCv2OqwLhTj2H4oijRYIyqXrHmewqgnMtU+3Uup0=";
+  };
+
+  propagatedBuildInputs = [
+    # whois is needed
+    inetutils
+  ];
+
+  # tests require network access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "whois"
+  ];
+
+  meta = with lib; {
+    description = "Python module/library for retrieving WHOIS information";
+    homepage = "https://github.com/DannyCork/python-whois/";
+    changelog = "https://github.com/DannyCork/python-whois/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/whoosh/default.nix b/nixpkgs/pkgs/development/python-modules/whoosh/default.nix
new file mode 100644
index 000000000000..10053bc27918
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/whoosh/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi, pytest }:
+
+buildPythonPackage rec {
+  pname = "Whoosh";
+  version = "2.7.4";
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "10qsqdjpbc85fykc1vgcs8xwbgn4l2l52c8d83xf1q59pwyn79bw";
+  };
+
+  nativeCheckInputs = [ pytest ];
+
+  # Wrong encoding
+  postPatch = ''
+    rm tests/test_reading.py
+    substituteInPlace setup.cfg --replace "[pytest]" "[tool:pytest]"
+  '';
+  checkPhase =  ''
+    # FIXME: test_minimize_dfa fails on python 3.6
+    py.test -k "not test_timelimit and not test_minimize_dfa"
+  '';
+
+  meta = with lib; {
+    description = "Fast, pure-Python full text indexing, search, and spell
+checking library.";
+    homepage    = "https://bitbucket.org/mchaput/whoosh";
+    license     = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/widgetsnbextension/default.nix b/nixpkgs/pkgs/development/python-modules/widgetsnbextension/default.nix
new file mode 100644
index 000000000000..679e19722f45
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/widgetsnbextension/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, jupyter-packaging
+, notebook
+, ipywidgets
+}:
+
+buildPythonPackage rec {
+  pname = "widgetsnbextension";
+  version = "4.0.9";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-PB9eRtwRZt/UCkLWhealE5b9NP+Hh0Kj5HxvDMSio4U=";
+  };
+
+  nativeBuildInputs = [
+    jupyter-packaging
+  ];
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = {
+    description = "IPython HTML widgets for Jupyter";
+    homepage = "https://github.com/jupyter-widgets/ipywidgets/tree/master/python/widgetsnbextension";
+    license = ipywidgets.meta.license; # Build from same repo
+    maintainers = with lib.maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/widlparser/default.nix b/nixpkgs/pkgs/development/python-modules/widlparser/default.nix
new file mode 100644
index 000000000000..2501d4821f0f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/widlparser/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+# build inputs
+, typing-extensions
+}:
+
+buildPythonPackage rec {
+  pname = "widlparser";
+  version = "1.0.12";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "plinss";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-T17fDWYd1naza/ao7kXWGcRIl2fzL1/Z9SaJiutZzqk=";
+  };
+
+  postPatch = ''
+    sed -i -e 's/0.0.0/${version}/' setup.py
+  '';
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  pythonImportsCheck = [ "widlparser" ];
+
+  meta = with lib; {
+    description = "Stand-alone WebIDL Parser in Python";
+    homepage = "https://github.com/plinss/widlparser";
+    license = licenses.mit;
+    maintainers = [];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wiffi/default.nix b/nixpkgs/pkgs/development/python-modules/wiffi/default.nix
new file mode 100644
index 000000000000..208265ba9a3b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wiffi/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "wiffi";
+  version = "1.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "mampfes";
+    repo = "python-wiffi";
+    rev = "refs/tags/${version}";
+    hash = "sha256-pnbzJxq8K947Yg54LysPPho6IRKf0cc+szTETgyzFao=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "wiffi"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interface with STALL WIFFI devices";
+    homepage = "https://github.com/mampfes/python-wiffi";
+    changelog = "https://github.com/mampfes/python-wiffi/blob/${version}/HISTORY.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wifi/default.nix b/nixpkgs/pkgs/development/python-modules/wifi/default.nix
new file mode 100644
index 000000000000..45594c226ef0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wifi/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pbkdf2
+, pytestCheckHook
+, pythonOlder
+, substituteAll
+, wirelesstools
+}:
+
+buildPythonPackage rec {
+  pname = "wifi";
+  version = "0.3.5";
+
+  src = fetchFromGitHub {
+    owner = "rockymeza";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-scg/DvApvyQZtzDgkHFJzf9gCRfJgBvZ64CG/c2Cx8E=";
+  };
+
+  disabled = pythonOlder "2.6";
+
+  postPatch = ''
+    substituteInPlace wifi/scan.py \
+      --replace "/sbin/iwlist" "${wirelesstools}/bin/iwlist"
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  propagatedBuildInputs = [
+    pbkdf2
+  ];
+
+  pythonImportsCheck = [ "wifi" ];
+
+  meta = with lib; {
+    description = "Provides a command line wrapper for iwlist and /etc/network/interfaces";
+    homepage = "https://github.com/rockymeza/wifi";
+    maintainers = with maintainers; [ rhoriguchi ];
+    license = licenses.bsd2;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wikipedia-api/default.nix b/nixpkgs/pkgs/development/python-modules/wikipedia-api/default.nix
new file mode 100644
index 000000000000..bb1fbd67dabb
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wikipedia-api/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "Wikipedia-API";
+  version = "0.6.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "martin-majlis";
+    repo = "Wikipedia-API";
+    rev = "v${version}";
+    hash = "sha256-cmwyQhKbkIpZXkKqqT0X2Lp8OFma2joeb4uxDRPiQe8=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "wikipediaapi" ];
+
+  meta = with lib; {
+    description = "Python wrapper for Wikipedia";
+    homepage = "https://github.com/martin-majlis/Wikipedia-API";
+    changelog = "https://github.com/martin-majlis/Wikipedia-API/blob/${src.rev}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mbalatsko ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wikipedia/default.nix b/nixpkgs/pkgs/development/python-modules/wikipedia/default.nix
new file mode 100644
index 000000000000..dce8160e7ff8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wikipedia/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, beautifulsoup4
+, requests
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "wikipedia";
+  version = "1.4.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2w+tGCn91EGxhSMG6YVjmCBNwHhtKZbdLgyLuOJhM7I=";
+  };
+
+  propagatedBuildInputs = [
+    beautifulsoup4
+    requests
+  ];
+
+  nativeCheckInputs = [
+    unittestCheckHook
+  ];
+
+  unittestFlagsArray = [
+    "tests/ '*test.py'"
+  ];
+
+  meta = with lib; {
+    description = "A Pythonic wrapper for the Wikipedia API";
+    homepage = "https://github.com/goldsmith/Wikipedia";
+    changelog = "https://github.com/goldsmith/Wikipedia/blob/master/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ natsukium ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wikitextparser/default.nix b/nixpkgs/pkgs/development/python-modules/wikitextparser/default.nix
new file mode 100644
index 000000000000..b7af5aeeb652
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wikitextparser/default.nix
@@ -0,0 +1,39 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+, pytestCheckHook
+, regex
+, wcwidth
+}:
+
+buildPythonPackage rec {
+  pname = "wikitextparser";
+  version = "0.55.5";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "5j9";
+    repo = "wikitextparser";
+    rev = "v${version}";
+    hash = "sha256-cmzyRbq4tCbuyrNnT0UYxoxuwXrFkIcWdrogSTfxSys=";
+  };
+
+  propagatedBuildInputs = [
+    wcwidth
+    regex
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "wikitextparser" ];
+
+  meta = {
+    homepage = "https://github.com/5j9/wikitextparser";
+    description = "A simple parsing tool for MediaWiki's wikitext markup";
+    changelog = "https://github.com/5j9/wikitextparser/blob/v${version}/CHANGELOG.rst";
+    license = lib.licenses.gpl3Only;
+    maintainers = with lib.maintainers; [ rapiteanu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/willow/default.nix b/nixpkgs/pkgs/development/python-modules/willow/default.nix
new file mode 100644
index 000000000000..1787faa38905
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/willow/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+
+# build-system
+, flit-core
+
+# dependencies
+, filetype
+, defusedxml
+
+# optional-dependencies
+, pillow-heif
+
+# tests
+, numpy
+, opencv4
+, pillow
+, pytestCheckHook
+, wand
+}:
+
+buildPythonPackage rec {
+  pname = "willow";
+  version = "1.6.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "2.7";
+
+  src = fetchFromGitHub {
+    owner = "wagtail";
+    repo = "Willow";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-dW2FVN3/mBAhVQ094uBsnXzdyTRKgHUDx0SWLm3g374=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    filetype
+    defusedxml
+  ];
+
+  passthru.optional-dependencies = {
+    heif = [
+      pillow-heif
+    ];
+  };
+
+  nativeCheckInputs = [
+    numpy
+    opencv4
+    pytestCheckHook
+    pillow
+    wand
+  ] ++ passthru.optional-dependencies.heif;
+
+  meta = with lib; {
+    description = "A Python image library that sits on top of Pillow, Wand and OpenCV";
+    homepage = "https://github.com/torchbox/Willow/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ desiderius ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/winacl/default.nix b/nixpkgs/pkgs/development/python-modules/winacl/default.nix
new file mode 100644
index 000000000000..ab27147d6519
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/winacl/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "winacl";
+  version = "0.1.8";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-RCcaMCVi3lFin2jvFUDUDzom57wBc2RrAaZ3nO2tZEw=";
+  };
+
+  propagatedBuildInputs = [
+    cryptography
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "cryptography>=38.0.1" "cryptography"
+  '';
+
+  # Project doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "winacl"
+  ];
+
+  meta = with lib; {
+    description = "Python module for ACL/ACE/Security descriptor manipulation";
+    homepage = "https://github.com/skelsec/winacl";
+    changelog = "https://github.com/skelsec/winacl/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/winsspi/default.nix b/nixpkgs/pkgs/development/python-modules/winsspi/default.nix
new file mode 100644
index 000000000000..d15ce8e261b5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/winsspi/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, minikerberos
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "winsspi";
+  version = "0.0.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-AXC6SJ+iWPGqTmdgoWKEbD8tDUUcg2aD609hO2bdQfM=";
+  };
+
+  propagatedBuildInputs = [
+    minikerberos
+  ];
+
+  # Module doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "winsspi"
+  ];
+
+  meta = with lib; {
+    description = "Python module for ACL/ACE/Security descriptor manipulation";
+    homepage = "https://github.com/skelsec/winsspi";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/withings-api/default.nix b/nixpkgs/pkgs/development/python-modules/withings-api/default.nix
new file mode 100644
index 000000000000..5be701fa298f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/withings-api/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, arrow
+, requests-oauthlib
+, typing-extensions
+, pydantic
+, responses
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "withings-api";
+  version = "2.4.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "vangorra";
+    repo = "python_withings_api";
+    rev = "refs/tags/${version}";
+    hash = "sha256-8cOLHYnodPGk1b1n6xbVyW2iju3cG6MgnzYTKDsP/nw=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'requests-oauth = ">=0.4.1"' ''' \
+      --replace 'addopts = "--capture no --cov ./withings_api --cov-report html:build/coverage_report --cov-report term --cov-report xml:build/coverage.xml"' '''
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    arrow
+    requests-oauthlib
+    typing-extensions
+    pydantic
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    responses
+  ];
+
+  meta = with lib; {
+    description = "Library for the Withings Health API";
+    homepage = "https://github.com/vangorra/python_withings_api";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kittywitch ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/withings-sync/default.nix b/nixpkgs/pkgs/development/python-modules/withings-sync/default.nix
new file mode 100644
index 000000000000..60cce387fa62
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/withings-sync/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, garth
+, lxml
+, pythonOlder
+, requests
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "withings-sync";
+  version = "4.2.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "jaroslawhartman";
+    repo = "withings-sync";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-6igjUmgIA077/1SQMt10tRpnLVKxGFNJN1GeLhQLROg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    garth
+    lxml
+    requests
+  ];
+
+  pythonImportsCheck = [
+    "withings_sync"
+  ];
+
+  meta = with lib; {
+    description = "Synchronisation of Withings weight";
+    homepage = "https://github.com/jaroslawhartman/withings-sync";
+    changelog = "https://github.com/jaroslawhartman/withings-sync/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wktutils/default.nix b/nixpkgs/pkgs/development/python-modules/wktutils/default.nix
new file mode 100644
index 000000000000..549e7f480b08
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wktutils/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, buildPythonPackage
+, dateparser
+, defusedxml
+, fetchFromGitHub
+, fiona
+, geomet
+, geopandas
+, kml2geojson
+, pyshp
+, pythonOlder
+, pyyaml
+, regex
+, requests
+, shapely
+, scikit-learn
+}:
+
+buildPythonPackage rec {
+  pname = "wktutils";
+  version = "1.1.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "asfadmin";
+    repo = "Discovery-WKTUtils";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-PFeIMIFOff9ztdmIP7jcFzKkmhm01G0QnDm20AafUsg=";
+  };
+
+  propagatedBuildInputs = [
+    dateparser
+    defusedxml
+    fiona
+    geomet
+    geopandas
+    kml2geojson
+    pyshp
+    pyyaml
+    regex
+    requests
+    shapely
+    scikit-learn
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "sklearn" "scikit-learn"
+  '';
+
+  # Module doesn't have tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "WKTUtils"
+  ];
+
+  meta = with lib; {
+    description = "Collection of tools for handling WKTs";
+    homepage = "https://github.com/asfadmin/Discovery-WKTUtils";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wled/default.nix b/nixpkgs/pkgs/development/python-modules/wled/default.nix
new file mode 100644
index 000000000000..c1a5f51956d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wled/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, aiohttp
+, awesomeversion
+, backoff
+, buildPythonPackage
+, cachetools
+, fetchFromGitHub
+, poetry-core
+, yarl
+, aresponses
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "wled";
+  version = "0.17.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "frenck";
+    repo = "python-wled";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-y32zynkVsn5vWw+BZ6ZRf9zemGOWJMN4yfNQZ0bRpos=";
+  };
+
+  postPatch = ''
+    # Upstream doesn't set a version for the pyproject.toml
+    substituteInPlace pyproject.toml \
+      --replace "0.0.0" "${version}" \
+      --replace "--cov" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    awesomeversion
+    backoff
+    cachetools
+    yarl
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "wled"
+  ];
+
+  meta = with lib; {
+    description = "Asynchronous Python client for WLED";
+    homepage = "https://github.com/frenck/python-wled";
+    changelog = "https://github.com/frenck/python-wled/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wn/default.nix b/nixpkgs/pkgs/development/python-modules/wn/default.nix
new file mode 100644
index 000000000000..b2540d0b2d68
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wn/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, flit-core
+, requests
+, tomli
+}:
+
+buildPythonPackage rec {
+  pname = "wn";
+  version = "0.9.4";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-n03hFoGMAqLu57gw52tY2jkE8uuLFAbwTZ63sHG2168=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    tomli
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+  '';
+
+  pythonImportsCheck = [
+    "wn"
+  ];
+
+  meta = with lib; {
+    description = "A modern, interlingual wordnet interface for Python";
+    homepage = "https://github.com/goodmami/wn";
+    changelog = "https://github.com/goodmami/wn/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ zendo ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/woob/default.nix b/nixpkgs/pkgs/development/python-modules/woob/default.nix
new file mode 100644
index 000000000000..72f390df41f5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/woob/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, babel
+, buildPythonPackage
+, fetchFromGitLab
+, fetchpatch
+, gnupg
+, html2text
+, libyaml
+, lxml
+, nose
+, packaging
+, pillow
+, prettytable
+, pycountry
+, python-dateutil
+, pythonOlder
+, pyyaml
+, requests
+, rich
+, termcolor
+, testers
+, unidecode
+, woob
+}:
+
+buildPythonPackage rec {
+  pname = "woob";
+  version = "3.6";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitLab {
+    owner = "woob";
+    repo = pname;
+    rev = version;
+    hash = "sha256-M9AjV954H1w64YGCVxDEGGSnoEbmocG3zwltob6IW04=";
+  };
+
+  nativeBuildInputs = [
+    packaging
+  ];
+
+  propagatedBuildInputs = [
+    babel
+    python-dateutil
+    gnupg
+    html2text
+    libyaml
+    lxml
+    packaging
+    pillow
+    prettytable
+    pycountry
+    pyyaml
+    requests
+    rich
+    termcolor
+    unidecode
+  ];
+
+  nativeCheckInputs = [
+    nose
+  ];
+
+  checkPhase = ''
+    nosetests
+  '';
+
+  pythonImportsCheck = [
+    "woob"
+  ];
+
+  passthru.tests.version = testers.testVersion {
+    package = woob;
+    version = "v${version}";
+  };
+
+  meta = with lib; {
+    description = "Collection of applications and APIs to interact with websites";
+    homepage = "https://woob.tech";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ DamienCassou ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/woodblock/default.nix b/nixpkgs/pkgs/development/python-modules/woodblock/default.nix
new file mode 100644
index 000000000000..c74a6ba78820
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/woodblock/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, click
+, multimethod
+, numpy
+}:
+buildPythonPackage rec {
+  pname = "woodblock";
+  version = "0.1.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c0347ece920b7009d94551983a01f42db02920ca8d7b0ff36d24a337e2c937f7";
+  };
+
+  propagatedBuildInputs = [
+    click
+    multimethod
+    numpy
+  ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "woodblock"
+  ];
+
+  meta = with lib; {
+    description = "A framework to generate file carving test data";
+    homepage = "https://github.com/fkie-cad/woodblock";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wordcloud/default.nix b/nixpkgs/pkgs/development/python-modules/wordcloud/default.nix
new file mode 100644
index 000000000000..1bca71009a99
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wordcloud/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, buildPythonPackage
+, cython
+, fetchFromGitHub
+, matplotlib
+, mock
+, numpy
+, pillow
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "wordcloud";
+  version = "1.9.1.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "amueller";
+    repo = "word_cloud";
+    rev = "refs/tags/${version}";
+    hash = "sha256-Tcle9otT1eBN/RzajwKZDUq8xX0Lhi2t74OvhUrvHZE=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.cfg \
+      --replace " --cov --cov-report xml --tb=short" ""
+  '';
+
+  nativeBuildInputs = [
+    cython
+  ];
+
+  propagatedBuildInputs = [
+    matplotlib
+    numpy
+    pillow
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    cd test
+  '';
+
+  pythonImportsCheck = [
+    "wordcloud"
+  ];
+
+  disabledTests = [
+    # Don't tests CLI
+    "test_cli_as_executable"
+    # OSError: invalid ppem value
+    "test_recolor_too_small"
+    "test_coloring_black_works"
+  ];
+
+  meta = with lib; {
+    description = "Word cloud generator in Python";
+    homepage = "https://github.com/amueller/word_cloud";
+    changelog = "https://github.com/amueller/word_cloud/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jm2dev ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wordfreq/default.nix b/nixpkgs/pkgs/development/python-modules/wordfreq/default.nix
new file mode 100644
index 000000000000..2b98674fb575
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wordfreq/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, poetry-core
+, regex
+, langcodes
+, ftfy
+, msgpack
+, mecab-python3
+, jieba
+, pytestCheckHook
+, pythonOlder
+, fetchFromGitHub
+}:
+
+buildPythonPackage rec {
+  pname = "wordfreq";
+  version = "3.0.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "rspeer";
+    repo = "wordfreq";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ANOBbQWLB35Vz6oil6QZDpsNpKHeKUJnDKA5Q9JRVdE=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    regex
+    langcodes
+    ftfy
+    msgpack
+    mecab-python3
+    jieba
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+  disabledTests = [
+    # These languages require additional dictionaries that aren't packaged
+    "test_languages"
+    "test_japanese"
+    "test_korean"
+  ];
+
+  meta = with lib; {
+    description = "A library for looking up the frequencies of words in many languages, based on many sources of data";
+    homepage =  "https://github.com/rspeer/wordfreq/";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/worldengine/default.nix b/nixpkgs/pkgs/development/python-modules/worldengine/default.nix
new file mode 100644
index 000000000000..28d25317afa9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/worldengine/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, gdal
+, h5py
+, noise
+, numpy
+, protobuf
+, purepng
+, pyplatec
+, six
+, isPy27
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "worldengine";
+  version = "0.19.0";
+
+  src = fetchFromGitHub {
+    owner = "Mindwerks";
+    repo = "worldengine";
+    rev = "v${version}";
+    sha256 = "1xrckb0dn2841gvp32n18gib14bpi77hmjw3r9jiyhg402iip7ry";
+  };
+
+  src-data = fetchFromGitHub {
+    owner = "Mindwerks";
+    repo = "worldengine-data";
+    rev = "029051e";
+    sha256 = "06xbf8gj3ljgr11v1n8jbs2q8pdf9wz53xdgkhpm8hdnjahgdxdm";
+  };
+
+  postUnpack = ''
+    ln -s ${src-data} worldengine-data
+  '';
+
+  propagatedBuildInputs = [
+    gdal
+    h5py
+    noise
+    numpy
+    protobuf
+    purepng
+    pyplatec
+    six
+  ];
+
+  prePatch = ''
+    substituteInPlace setup.py \
+      --replace pypng>=0.0.18 purepng \
+      --replace 'numpy>=1.9.2, <= 1.10.0.post2' 'numpy' \
+      --replace 'argparse==1.2.1' "" \
+      --replace 'protobuf==3.0.0a3' 'protobuf' \
+      --replace 'noise==1.2.2' 'noise' \
+      --replace 'PyPlatec==1.4.0' 'PyPlatec' \
+
+    substituteInPlace \
+      worldengine/{draw.py,hdf5_serialization.py} \
+      --replace numpy.float float
+  '';
+
+  doCheck = !isPy27; # google namespace clash
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  disabledTests = [
+    "TestSerialization"
+  ];
+
+  meta = with lib; {
+    broken = true;
+    homepage = "https://github.com/mindwerks/worldengine";
+    description = "World generator using simulation of plates, rain shadow, erosion, etc";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rardiol ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wrapio/default.nix b/nixpkgs/pkgs/development/python-modules/wrapio/default.nix
new file mode 100644
index 000000000000..f18bf597be52
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wrapio/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "wrapio";
+  version = "2.0.0";
+
+  disabled = pythonOlder "3.5";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-CUocIbdZ/tJQCxAHzhFpB267ynlXf8Mu+thcRRc0yeg=";
+  };
+
+  doCheck = false;
+  pythonImportsCheck = [ "wrapio" ];
+
+  meta = with lib; {
+    description = "Handling event-based streams";
+    homepage = "https://github.com/Exahilosys/wrapio";
+    changelog = "https://github.com/Exahilosys/wrapio/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sfrijters ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wrapt/default.nix b/nixpkgs/pkgs/development/python-modules/wrapt/default.nix
new file mode 100644
index 000000000000..268f2775d5cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wrapt/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, sphinxHook
+, sphinx-rtd-theme
+}:
+
+buildPythonPackage rec {
+  pname = "wrapt";
+  version = "1.14.1";
+  outputs = [ "out" "doc" ];
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "GrahamDumpleton";
+    repo = pname;
+    rev = version;
+    hash = "sha256-nXwDuNo4yZxgjnkus9bVwIZltPaSH93D+PcZMGT2nGM=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  nativeBuildInputs = [
+    sphinxHook
+    sphinx-rtd-theme
+  ];
+
+  pythonImportsCheck = [
+    "wrapt"
+  ];
+
+  meta = with lib; {
+    description = "Module for decorators, wrappers and monkey patching";
+    homepage = "https://github.com/GrahamDumpleton/wrapt";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wrf-python/default.nix b/nixpkgs/pkgs/development/python-modules/wrf-python/default.nix
new file mode 100644
index 000000000000..77d5ea8a4eba
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wrf-python/default.nix
@@ -0,0 +1,64 @@
+{ stdenv
+, lib
+, fetchFromGitHub
+, pythonOlder
+, buildPythonPackage
+, basemap
+, gfortran
+, netcdf4
+, numpy
+, python
+, setuptools
+, xarray
+, wrapt
+}:
+
+buildPythonPackage rec {
+  pname = "wrf-python";
+  version = "1.3.4.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "NCAR";
+    repo = "wrf-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-4iIs/M9fzGJsnKCDSl09OTUoh7j6REBXuutE5uXFe3k=";
+  };
+
+  nativeBuildInputs = [
+    gfortran
+  ];
+
+  propagatedBuildInputs = [
+    basemap
+    numpy
+    setuptools
+    xarray
+    wrapt
+  ];
+
+  nativeCheckInputs = [
+    netcdf4
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    cd ./test/ci_tests
+    ${python.interpreter} utests.py
+    runHook postCheck
+  '';
+
+  pythonImportsCheck = [
+    "wrf"
+  ];
+
+  meta = with lib; {
+    description = "WRF postprocessing library for Python";
+    homepage = "http://wrf-python.rtfd.org";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ mhaselsteiner ];
+    broken = stdenv.isDarwin;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ws4py/default.nix b/nixpkgs/pkgs/development/python-modules/ws4py/default.nix
new file mode 100644
index 000000000000..58649de2056e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ws4py/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchPypi, pytest, mock, git
+, cherrypy, gevent, tornado }:
+
+buildPythonPackage rec {
+  pname = "ws4py";
+  version = "0.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "29d073d7f2e006373e6a848b1d00951a1107eb81f3742952be905429dc5a5483";
+  };
+
+  nativeCheckInputs = [ pytest mock git ];
+  propagatedBuildInputs = [ cherrypy gevent tornado ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    homepage = "https://ws4py.readthedocs.org";
+    description = "A WebSocket package for Python";
+    maintainers = [];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wsdiscovery/default.nix b/nixpkgs/pkgs/development/python-modules/wsdiscovery/default.nix
new file mode 100644
index 000000000000..784172b7cef4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wsdiscovery/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, mock
+, netifaces
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "wsdiscovery";
+  version = "2.0.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "andreikop";
+    repo = "python-ws-discovery";
+    rev = version;
+    hash = "sha256-6LGZogNRCnmCrRXvHq9jmHwqW13KQPpaGaao/52JPtk=";
+  };
+
+  propagatedBuildInputs = [
+    click
+    netifaces
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "wsdiscovery"
+  ];
+
+  meta = with lib; {
+    description = "WS-Discovery implementation for Python";
+    homepage = "https://github.com/andreikop/python-ws-discovery";
+    license = with licenses; [ lgpl3Plus ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wsgi-intercept/default.nix b/nixpkgs/pkgs/development/python-modules/wsgi-intercept/default.nix
new file mode 100644
index 000000000000..6e943a0b34f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wsgi-intercept/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, six
+, httplib2
+, py
+, pytestCheckHook
+, pythonOlder
+, requests
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "wsgi-intercept";
+  version = "1.12.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "wsgi_intercept";
+    inherit version;
+    hash = "sha256-StUxEN91fU7qoptH9iKJFpZWIBIOtIe6S4gvdBgN48E=";
+  };
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  nativeCheckInputs = [
+    httplib2
+    py
+    pytestCheckHook
+    requests
+    urllib3
+  ];
+
+  disabledTests = [
+    "test_http_not_intercepted"
+    "test_https_not_intercepted"
+    "test_https_no_ssl_verification_not_intercepted"
+  ];
+
+  pythonImportsCheck = [
+    "wsgi_intercept"
+  ];
+
+  meta = with lib; {
+    description = "Module that acts as a WSGI application in place of a real URI for testing";
+    homepage = "https://github.com/cdent/wsgi-intercept";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wsgidav/default.nix b/nixpkgs/pkgs/development/python-modules/wsgidav/default.nix
new file mode 100644
index 000000000000..bff7c88f1463
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wsgidav/default.nix
@@ -0,0 +1,63 @@
+{ lib
+, buildPythonPackage
+, cheroot
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, defusedxml
+, jinja2
+, json5
+, python-pam
+, pyyaml
+, requests
+, setuptools
+, webtest
+}:
+
+buildPythonPackage rec {
+  pname = "wsgidav";
+  version = "4.3.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "mar10";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-DEUoKoFELIOg5KX6hL1VgR18dtsery4ZzKksrxl0D7Q=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    defusedxml
+    jinja2
+    json5
+    python-pam
+    pyyaml
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  nativeCheckInputs = [
+    cheroot
+    pytestCheckHook
+    requests
+    webtest
+  ];
+
+  pythonImportsCheck = [
+    "wsgidav"
+  ];
+
+  meta = with lib; {
+    description = "Generic and extendable WebDAV server based on WSGI";
+    homepage = "https://wsgidav.readthedocs.io/";
+    changelog = "https://github.com/mar10/wsgidav/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wsgiprox/default.nix b/nixpkgs/pkgs/development/python-modules/wsgiprox/default.nix
new file mode 100644
index 000000000000..ecaef390fab1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wsgiprox/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, six
+, certauth
+}:
+
+buildPythonPackage rec {
+  pname = "wsgiprox";
+  version = "1.5.2";
+
+  src = fetchFromGitHub {
+    owner = "webrecorder";
+    repo = "wsgiprox";
+    # https://github.com/webrecorder/wsgiprox/issues/8
+    rev = "004870a87959e68ff28ff4362e4f0df28ec22030";
+    hash = "sha256-EquddaNrVceyJHuQMCajKHGZX2Q7ebR0Zhvi2pl2WEw=";
+  };
+
+  propagatedBuildInputs = [
+    six
+    certauth
+  ];
+
+  pythonImportsCheck = [ "wsgiprox" ];
+
+  # See https://github.com/webrecorder/wsgiprox/issues/6
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Python WSGI Middleware for adding HTTP/S proxy support to any WSGI Application";
+    homepage = "https://github.com/webrecorder/wsgiprox";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ Luflosi ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wsgiproxy2/default.nix b/nixpkgs/pkgs/development/python-modules/wsgiproxy2/default.nix
new file mode 100644
index 000000000000..0f50c6474c59
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wsgiproxy2/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, webob
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "wsgiproxy2";
+  version = "0.5.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "gawel";
+    repo = "WSGIProxy2";
+    rev = version;
+    hash = "sha256-ouofw3cBQzBwSh3Pdtdl7KI2pg/T/z3qoh8zoeiKiSs=";
+  };
+
+  propagatedBuildInputs = [
+    webob
+  ];
+
+  # Circular dependency on webtest
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "wsgiproxy"
+  ];
+
+  meta = with lib; {
+    description = "HTTP proxying tools for WSGI apps";
+    homepage = "https://wsgiproxy2.readthedocs.io/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wsgitools/default.nix b/nixpkgs/pkgs/development/python-modules/wsgitools/default.nix
new file mode 100644
index 000000000000..ab6f06abac65
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wsgitools/default.nix
@@ -0,0 +1,28 @@
+{lib
+,buildPythonPackage
+,fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "wsgitools";
+  version = "0.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0q6kmrkqf02fgww7z1g9cw8f70fimdzs1bvv9inb7fsk0c3pcf1i";
+  };
+
+  meta = with lib; {
+    maintainers = with maintainers; [ clkamp ];
+    description = "A set of tools working with WSGI";
+    longDescription = ''
+      wsgitools is a set of tools working with WSGI (see PEP 333). It
+      includes classes for filtering content, middlewares for caching,
+      logging and tracebacks as well as two backends for SCGI. Goals
+      in writing it were portability and simplicity.
+    '';
+    homepage = "https://subdivi.de/~helmut/wsgitools/";
+    license = licenses.gpl2Plus;
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wsme/default.nix b/nixpkgs/pkgs/development/python-modules/wsme/default.nix
new file mode 100644
index 000000000000..a818b3baf4b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wsme/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonAtLeast
+, pbr
+, six
+, simplegeneric
+, netaddr
+, pytz
+, webob
+# Test inputs
+, cherrypy
+, flask
+, flask-restful
+, glibcLocales
+, nose
+, pecan
+, sphinx
+, transaction
+, webtest
+}:
+
+buildPythonPackage rec {
+  pname = "wsme";
+  version = "0.11.0";
+
+  disabled = pythonAtLeast "3.9";
+
+  src = fetchPypi {
+    pname = "WSME";
+    inherit version;
+    sha256 = "bd2dfc715bedcc8f4649611bc0c8a238f483dc01cff7102bc1efa6bea207b64b";
+  };
+
+  nativeBuildInputs = [ pbr ];
+
+  propagatedBuildInputs = [
+    netaddr
+    pytz
+    simplegeneric
+    six
+    webob
+  ];
+
+  nativeCheckInputs = [
+    nose
+    cherrypy
+    flask
+    flask-restful
+    glibcLocales
+    pecan
+    sphinx
+    transaction
+    webtest
+  ];
+
+  # from tox.ini, tests don't work with pytest
+  checkPhase = ''
+    nosetests wsme/tests tests/pecantest tests/test_sphinxext.py tests/test_flask.py --verbose
+  '';
+
+  meta = with lib; {
+    description = "Simplify the writing of REST APIs, and extend them with additional protocols";
+    homepage = "https://pythonhosted.org/WSME/";
+    changelog = "https://pythonhosted.org/WSME/changes.html";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wsnsimpy/default.nix b/nixpkgs/pkgs/development/python-modules/wsnsimpy/default.nix
new file mode 100644
index 000000000000..febb66605c8a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wsnsimpy/default.nix
@@ -0,0 +1,31 @@
+{ buildPythonPackage, fetchPypi, isPy27, lib, setuptools, simpy, tkinter
+# GUI-based visualization of the simulation is optional
+, enableVisualization ? true }:
+
+buildPythonPackage rec {
+  pname = "wsnsimpy";
+  version = "0.2.5";
+  disabled = isPy27;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1b7fdqwc2v9alfwf2fr0aqr8rf2pb5lpm4anpilmvrh2lhjar4i2";
+  };
+
+  propagatedBuildInputs = [ setuptools simpy ]
+    ++ lib.optional enableVisualization tkinter;
+
+  # No test cases are included, thus unittest tries to run the examples, which
+  # fail because no DISPLAYs are available.
+  doCheck = false;
+
+  pythonImportsCheck = [ "wsnsimpy" ]
+    ++ lib.optional enableVisualization "wsnsimpy.wsnsimpy_tk";
+
+  meta = with lib; {
+    description = "SimPy-based WSN Simulator";
+    homepage = "https://pypi.org/project/wsnsimpy/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ dmrauh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wsproto/default.nix b/nixpkgs/pkgs/development/python-modules/wsproto/default.nix
new file mode 100644
index 000000000000..2c06d187c35f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wsproto/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, h11
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "wsproto";
+  version = "1.2.0";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rVZfJuy5JYij5DvD2WFk3oTNmQJIKxMNDduqlmSoUGU=";
+  };
+
+  propagatedBuildInputs = [ h11 ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "wsproto" ];
+
+  meta = with lib; {
+    description = "Pure Python, pure state-machine WebSocket implementation";
+    homepage = "https://github.com/python-hyper/wsproto/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wtf-peewee/default.nix b/nixpkgs/pkgs/development/python-modules/wtf-peewee/default.nix
new file mode 100644
index 000000000000..d4e37b597681
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wtf-peewee/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, peewee
+, wtforms
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "wtf-peewee";
+  version = "3.0.4";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-cTbYRdvAUTY86MPR33BH+nA6H/epR8sgHDgOBQ/TUkQ=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    peewee
+    wtforms
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    ${python.interpreter} runtests.py
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "WTForms integration for peewee models";
+    homepage = "https://github.com/coleifer/wtf-peewee/";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wtforms/default.nix b/nixpkgs/pkgs/development/python-modules/wtforms/default.nix
new file mode 100644
index 000000000000..deffda6ef5fe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wtforms/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, markupsafe
+, babel
+, pytestCheckHook
+, email-validator
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "wtforms";
+  version = "3.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "WTForms";
+    inherit version;
+    hash = "sha256-azUbuxLdWK9X/+8FvHhCXQjRkU4P1o7hQUO3reAjxbw=";
+  };
+
+  propagatedBuildInputs = [
+    markupsafe
+    babel
+  ];
+
+  passthru.optional-dependencies = {
+    email = [
+      email-validator
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  pythonImportsCheck = [
+    "wtforms"
+  ];
+
+  meta = with lib; {
+    description = "A flexible forms validation and rendering library for Python";
+    homepage = "https://github.com/wtforms/wtforms";
+    changelog = "https://github.com/wtforms/wtforms/blob/${version}/CHANGES.rst";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bhipple ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wurlitzer/default.nix b/nixpkgs/pkgs/development/python-modules/wurlitzer/default.nix
new file mode 100644
index 000000000000..ee93a2c6454d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wurlitzer/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "wurlitzer";
+  version = "3.0.3";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Ik9f5wYYvjhywF393IxFcZHsGHBlRZYnn8we2t6+Pls=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "wurlitzer"
+  ];
+
+  pytestFlagsArray = [
+    "test.py"
+  ];
+
+  meta = with lib; {
+    description = "Capture C-level output in context managers";
+    homepage = "https://github.com/minrk/wurlitzer";
+    changelog = "https://github.com/minrk/wurlitzer/blob/{version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wxPython/4.2-ctypes.patch b/nixpkgs/pkgs/development/python-modules/wxPython/4.2-ctypes.patch
new file mode 100644
index 000000000000..17fd8a9a8490
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wxPython/4.2-ctypes.patch
@@ -0,0 +1,18 @@
+diff --git a/wx/lib/wxcairo/wx_pycairo.py b/wx/lib/wxcairo/wx_pycairo.py
+index 7cfe3071..24d1120f 100644
+--- a/wx/lib/wxcairo/wx_pycairo.py
++++ b/wx/lib/wxcairo/wx_pycairo.py
+@@ -197,7 +197,12 @@ def _findCairoLib():
+ 
+ # For other DLLs we'll just use a dictionary to track them, as there
+ # probably isn't any need to use them outside of this module.
+-_dlls = dict()
++_dlls = {
++    "gdk": ctypes.CDLL("@libgdk@"),
++    "pangocairo": ctypes.CDLL("@libpangocairo@"),
++    "cairoLib": ctypes.CDLL("@libcairo@"),
++    "appsvc": ctypes.CDLL(None),
++}
+ 
+ def _findHelper(names, key, msg):
+     dll = _dlls.get(key, None)
diff --git a/nixpkgs/pkgs/development/python-modules/wxPython/4.2.nix b/nixpkgs/pkgs/development/python-modules/wxPython/4.2.nix
new file mode 100644
index 000000000000..5cbab3005120
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wxPython/4.2.nix
@@ -0,0 +1,136 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, setuptools
+, pythonOlder
+, fetchPypi
+, substituteAll
+
+# build
+, autoPatchelfHook
+, attrdict
+, doxygen
+, pkg-config
+, python
+, sip
+, which
+
+# runtime
+, cairo
+, gst_all_1
+, gtk3
+, libGL
+, libGLU
+, libSM
+, libXinerama
+, libXtst
+, libXxf86vm
+, libglvnd
+, mesa
+, pango
+, SDL
+, webkitgtk
+, wxGTK
+, xorgproto
+
+# propagates
+, numpy
+, pillow
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "wxPython";
+  version = "4.2.1";
+  format = "other";
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5I3iEaZga/By7D+neHcda3RsALf0uXDrWHKN31bRPVw=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./4.2-ctypes.patch;
+      libgdk = "${gtk3.out}/lib/libgdk-3.so";
+      libpangocairo = "${pango}/lib/libpangocairo-1.0.so";
+      libcairo = "${cairo}/lib/libcairo.so";
+    })
+  ];
+
+  nativeBuildInputs = [
+    attrdict
+    pkg-config
+    setuptools
+    SDL
+    sip
+    which
+    wxGTK
+  ] ++ lib.optionals stdenv.isLinux [
+    autoPatchelfHook
+  ];
+
+  buildInputs = [
+    wxGTK
+    SDL
+  ] ++ lib.optionals stdenv.isLinux [
+    gst_all_1.gst-plugins-base
+    gst_all_1.gstreamer
+    libGL
+    libGLU
+    libSM
+    libXinerama
+    libXtst
+    libXxf86vm
+    libglvnd
+    mesa
+    webkitgtk
+    xorgproto
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    pillow
+    six
+  ];
+
+  buildPhase = ''
+    runHook preBuild
+
+    export DOXYGEN=${doxygen}/bin/doxygen
+    export PATH="${wxGTK}/bin:$PATH"
+    export SDL_CONFIG="${SDL.dev}/bin/sdl-config"
+
+    ${python.pythonOnBuildForHost.interpreter} build.py -v --use_syswx dox etg sip --nodoc build_py
+
+    runHook postBuild
+  '';
+
+
+  installPhase = ''
+    runHook preInstall
+
+    ${python.pythonOnBuildForHost.interpreter} setup.py install --skip-build --prefix=$out
+    wrapPythonPrograms
+
+    runHook postInstall
+  '';
+
+  checkPhase = ''
+    runHook preCheck
+
+    ${python.interpreter} build.py -v test
+
+    runHook postCheck
+  '';
+
+
+  meta = with lib; {
+    changelog = "https://github.com/wxWidgets/Phoenix/blob/wxPython-${version}/CHANGES.rst";
+    description = "Cross platform GUI toolkit for Python, Phoenix version";
+    homepage = "http://wxpython.org/";
+    license = licenses.wxWindows;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/wyoming/default.nix b/nixpkgs/pkgs/development/python-modules/wyoming/default.nix
new file mode 100644
index 000000000000..b7ae51379cdc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/wyoming/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+
+# tests
+, wyoming-faster-whisper
+, wyoming-openwakeword
+, wyoming-piper
+}:
+
+buildPythonPackage rec {
+  pname = "wyoming";
+  version = "1.2.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-mgNhc8PMRrwfvGZEcgIvQ/P2dysdDo2juvZccvb2C/g=";
+  };
+
+  pythonImportsCheck = [
+    "wyoming"
+  ];
+
+  # no tests
+  doCheck = false;
+
+  passthru.tests = {
+    inherit
+      wyoming-faster-whisper
+      wyoming-openwakeword
+      wyoming-piper
+    ;
+  };
+
+  meta = with lib; {
+    description = "Protocol for Rhasspy Voice Assistant";
+    homepage = "https://pypi.org/project/wyoming/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/x-wr-timezone/default.nix b/nixpkgs/pkgs/development/python-modules/x-wr-timezone/default.nix
new file mode 100644
index 000000000000..17afeaf5a348
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/x-wr-timezone/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, icalendar
+, pytz
+, pytestCheckHook
+, restructuredtext-lint
+, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "x-wr-timezone";
+  version = "0.0.6";
+
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "niccokunzmann";
+    repo = "x-wr-timezone";
+    rev = "v${version}";
+    hash = "sha256-9B1gXabpZsJSHYUHLu6bBGidO3C5m/I0oOc5U/mbX0I=";
+  };
+
+  propagatedBuildInputs = [
+    icalendar
+    pytz
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    restructuredtext-lint
+    pygments
+  ];
+
+  preCheck = ''
+    export PATH=$out/bin:$PATH
+  '';
+
+  # https://github.com/niccokunzmann/x-wr-timezone/issues/8
+  doCheck = false;
+
+  pythonImportsCheck = [ "x_wr_timezone" ];
+
+  meta = {
+    changelog = "https://github.com/niccokunzmann/x-wr-timezone/blob/${src.rev}/README.rst#changelog";
+    description = "Convert calendars using X-WR-TIMEZONE to standard ones";
+    homepage = "https://github.com/niccokunzmann/x-wr-timezone";
+    license = lib.licenses.lgpl3Plus;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/x11-hash/default.nix b/nixpkgs/pkgs/development/python-modules/x11-hash/default.nix
new file mode 100644
index 000000000000..403f1ed3e12f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/x11-hash/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  version = "1.4";
+  pname = "x11-hash";
+  pyproject = true;
+
+  src = fetchPypi {
+    pname = "x11_hash";
+    inherit version;
+    hash = "sha256-QtzqxEzpVGK48/lvOEr8VtPUYexLdXKD3zGv1VOdWpw=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  # pypi's source doesn't include tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "x11_hash"
+  ];
+
+  meta = with lib; {
+    description = "Binding for X11 proof of work hashing";
+    homepage = "https://github.com/mazaclub/x11_hash";
+    license = licenses.mit;
+    maintainers = with maintainers; [ np ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/x256/default.nix b/nixpkgs/pkgs/development/python-modules/x256/default.nix
new file mode 100644
index 000000000000..4430fa2e4b8a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/x256/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "x256";
+  version = "0.0.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "00g02b9a6jsl377xb5fmxvkjff3lalw21n430a4zalqyv76dnmgq";
+  };
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Find the nearest xterm 256 color index for an RGB";
+    homepage = "https://github.com/magarcia/python-x256";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Scriptkiddi ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/development/python-modules/xapian/default.nix b/nixpkgs/pkgs/development/python-modules/xapian/default.nix
new file mode 100644
index 000000000000..2daf40454974
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xapian/default.nix
@@ -0,0 +1,43 @@
+{ lib, buildPythonPackage, fetchurl, python
+, sphinx
+, xapian
+}:
+
+let
+  pythonSuffix = lib.optionalString python.isPy3k "3";
+in
+buildPythonPackage rec {
+  pname = "xapian";
+  inherit (xapian) version;
+  format = "other";
+
+  src = fetchurl {
+    url = "https://oligarchy.co.uk/xapian/${version}/xapian-bindings-${version}.tar.xz";
+    hash = "sha256-UT1XhIgnkZis4TrUl1ENKyIgTV15S2QUPQW3vpdOts8=";
+  };
+
+  configureFlags = [
+    "--with-python${pythonSuffix}"
+    "PYTHON${pythonSuffix}_LIB=${placeholder "out"}/${python.sitePackages}"
+  ];
+
+  preConfigure = ''
+    export XAPIAN_CONFIG=${xapian}/bin/xapian-config
+  '';
+
+  buildInputs = [ sphinx xapian ];
+
+  doCheck = true;
+
+  checkPhase = ''
+    ${python.interpreter} python${pythonSuffix}/pythontest.py
+  '';
+
+  meta = with lib; {
+    description = "Python Bindings for Xapian";
+    homepage = "https://xapian.org/";
+    changelog = "https://xapian.org/docs/xapian-bindings-${version}/NEWS";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xapp/default.nix b/nixpkgs/pkgs/development/python-modules/xapp/default.nix
new file mode 100644
index 000000000000..8b8b795edda9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xapp/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, python
+, meson
+, ninja
+, psutil
+, pygobject3
+, gtk3
+, gobject-introspection
+, xapp
+, polkit
+, gitUpdater
+}:
+
+buildPythonPackage rec {
+  pname = "xapp";
+  version = "21";
+
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "linuxmint";
+    repo = "python-xapp";
+    rev = "refs/tags/master.mint${version}";
+    hash = "sha256-Kvhp+biZ+KK9FYma/8cUEaQCHPKMLjOO909kbyMLQ3o=";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+  ];
+
+  propagatedBuildInputs = [
+    psutil
+    pygobject3
+    gtk3
+    gobject-introspection
+    xapp
+    polkit
+  ];
+
+  postPatch = ''
+    substituteInPlace "xapp/os.py" --replace "/usr/bin/pkexec" "${polkit}/bin/pkexec"
+  '';
+
+  postInstall = ''
+    # This is typically set by pipInstallHook/eggInstallHook,
+    # so we have to do so manually when using meson.
+    # https://github.com/NixOS/nixpkgs/issues/175227
+    export PYTHONPATH=$out/${python.sitePackages}:$PYTHONPATH
+  '';
+
+  doCheck = false;
+  pythonImportsCheck = [ "xapp" ];
+
+  passthru.updateScript = gitUpdater {
+    ignoredVersions = "^master.*";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/linuxmint/python-xapp";
+    description = "Cross-desktop libraries and common resources for python";
+    license = licenses.lgpl2;
+    platforms = platforms.linux;
+    maintainers = teams.cinnamon.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xarray-einstats/default.nix b/nixpkgs/pkgs/development/python-modules/xarray-einstats/default.nix
new file mode 100644
index 000000000000..78f7c101fd3f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xarray-einstats/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, einops
+, fetchFromGitHub
+, flit-core
+, numba
+, numpy
+, pandas
+, pytestCheckHook
+, pythonOlder
+, scipy
+, xarray
+}:
+
+buildPythonPackage rec {
+  pname = "xarray-einstats";
+  version = "0.6.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "arviz-devs";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-TXuNqXsny7VpJqV5/3riKzXLheZl+qF+zf4SCMipzmw=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    scipy
+    xarray
+  ];
+
+  nativeCheckInputs = [
+    einops
+    numba
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "xarray_einstats"
+  ];
+
+  meta = with lib; {
+    description = "Stats, linear algebra and einops for xarray";
+    homepage = "https://github.com/arviz-devs/xarray-einstats";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xarray/default.nix b/nixpkgs/pkgs/development/python-modules/xarray/default.nix
new file mode 100644
index 000000000000..12cefa0332aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xarray/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, numpy
+, packaging
+, pandas
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, setuptools-scm
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "xarray";
+  version = "2023.8.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-glxtZCAqcxpOSTIe3R6d+r9L4GgC8bjIo8AKPr/Izt8=";
+  };
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    packaging
+    pandas
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "xarray"
+  ];
+
+  meta = with lib; {
+    description = "N-D labeled arrays and datasets in Python";
+    homepage = "https://github.com/pydata/xarray";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fridh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xattr/default.nix b/nixpkgs/pkgs/development/python-modules/xattr/default.nix
new file mode 100644
index 000000000000..c57f5a4da52c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xattr/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, cffi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "xattr";
+  version = "0.10.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-wS59gf+qBgWzrIwiwplKjhipzxxZKHobdyKiKJyVLsU=";
+  };
+
+  propagatedBuildInputs = [
+    cffi
+  ];
+
+  # https://github.com/xattr/xattr/issues/43
+  doCheck = false;
+
+  postBuild = ''
+    ${python.pythonOnBuildForHost.interpreter} -m compileall -f xattr
+  '';
+
+  pythonImportsCheck = [
+    "xattr"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for extended filesystem attributes";
+    homepage = "https://github.com/xattr/xattr";
+    changelog = "https://github.com/xattr/xattr/blob/v${version}/CHANGES.txt";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xbox-webapi/default.nix b/nixpkgs/pkgs/development/python-modules/xbox-webapi/default.nix
new file mode 100644
index 000000000000..e4701e806d9d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xbox-webapi/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, aiohttp
+, appdirs
+, ecdsa
+, ms-cv
+, pydantic
+, aresponses
+, pytest-asyncio
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "xbox-webapi";
+  version = "2.0.11";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "OpenXbox";
+    repo = "xbox-webapi-python";
+    rev = "v${version}";
+    sha256 = "0li0bq914xizx9fj49s1iwfrv4bpzvl74bwsi5a34r9yizw02cvz";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "pytest-runner" ""
+  '';
+
+  propagatedBuildInputs = [
+    aiohttp
+    appdirs
+    ecdsa
+    ms-cv
+    pydantic
+  ];
+
+  nativeCheckInputs = [
+    aresponses
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--asyncio-mode=auto"
+  ];
+
+  meta = with lib; {
+    description = "Library to authenticate with Windows Live/Xbox Live and use their API";
+    homepage = "https://github.com/OpenXbox/xbox-webapi-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xboxapi/default.nix b/nixpkgs/pkgs/development/python-modules/xboxapi/default.nix
new file mode 100644
index 000000000000..0f34bec3c886
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xboxapi/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "xboxapi";
+  version = "2.0.1";
+
+  src = fetchFromGitHub {
+    owner = "mKeRix";
+    repo = "xboxapi-python";
+    rev = version;
+    sha256 = "10mhvallkwf5lw91hj5rv16sziqhhjq7sgcgr28sqqnlgjnyazdd";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "xboxapi" ];
+
+  meta = with lib; {
+    description = "Python XBOX One API wrapper";
+    homepage = "https://github.com/mKeRix/xboxapi-python";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xcffib/default.nix b/nixpkgs/pkgs/development/python-modules/xcffib/default.nix
new file mode 100644
index 000000000000..b0b00da0dc32
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xcffib/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, cffi
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+, xorg
+}:
+
+buildPythonPackage rec {
+  pname = "xcffib";
+  version = "1.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-qVyUZfL5e0/O3mBr0eCEB6Mt9xy3YP1Xv+U2d9tpGsw=";
+  };
+
+  postPatch = ''
+    # Hardcode cairo library path
+    sed -e 's,ffi\.dlopen(,&"${xorg.libxcb.out}/lib/" + ,' -i xcffib/__init__.py
+  '';
+
+  propagatedNativeBuildInputs = [
+    cffi
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    xorg.xeyes
+    xorg.xorgserver
+  ];
+
+  preCheck = ''
+    # import from $out
+    rm -r xcffib
+  '';
+
+  pythonImportsCheck = [
+    "xcffib"
+  ];
+
+  meta = with lib; {
+    description = "A drop in replacement for xpyb, an XCB python binding";
+    homepage = "https://github.com/tych0/xcffib";
+    changelog = "https://github.com/tych0/xcffib/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ kamilchm ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xdg-base-dirs/default.nix b/nixpkgs/pkgs/development/python-modules/xdg-base-dirs/default.nix
new file mode 100644
index 000000000000..b2eb4094c927
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xdg-base-dirs/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "xdg-base-dirs";
+  version = "6.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.10";
+
+  src = fetchFromGitHub {
+    owner = "srstevenson";
+    repo = "xdg-base-dirs";
+    rev = version;
+    hash = "sha256-nbdF1tjVqlxwiGW0pySS6HyJbmNuQ7mVdQYfhofO4Dk=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "xdg_base_dirs" ];
+
+  # remove coverage flags from pytest config
+  postPatch = ''
+    sed -i /addopts/d pyproject.toml
+  '';
+
+  meta = with lib; {
+    description = "An implementation of the XDG Base Directory Specification in Python";
+    homepage = "https://github.com/srstevenson/xdg-base-dirs";
+    changelog = "https://github.com/srstevenson/xdg-base-dirs/releases/tag/${src.rev}";
+    license = licenses.isc;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xdg/default.nix b/nixpkgs/pkgs/development/python-modules/xdg/default.nix
new file mode 100644
index 000000000000..065f434bd7ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xdg/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, clikit
+, poetry-core
+}:
+
+buildPythonPackage rec {
+  version = "6.0.0";
+  pname = "xdg";
+  disabled = pythonOlder "3.7";
+  format = "pyproject";
+
+  # the github source uses `xdg_base_dirs`, but pypi's sdist maintains `xdg` for compatibility.
+  # there are actually breaking changes in xdg_base_dirs,
+  # and libraries that want to support python 3.9 and below need to use xdg.
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-JCeAlPLUXoRtHrKKLruS17Z/wMq1JJ7jzojJX2SaHJI=";
+  };
+
+  nativeBuildInputs = [ poetry-core ];
+
+  propagatedBuildInputs = [
+    clikit
+  ];
+
+  # sdist has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "xdg"
+  ];
+
+  meta = with lib; {
+    description = "XDG Base Directory Specification for Python";
+    homepage = "https://github.com/srstevenson/xdg";
+    license = licenses.isc;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xdis/default.nix b/nixpkgs/pkgs/development/python-modules/xdis/default.nix
new file mode 100644
index 000000000000..9f5d40248c7c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xdis/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, fetchpatch
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "xdis";
+  version = "6.0.5";
+  format = "setuptools";
+
+  # No support for Python 3.11, https://github.com/rocky/python-xdis/issues/98
+  disabled = pythonOlder "3.6" || pythonAtLeast "3.11";
+
+  src = fetchFromGitHub {
+    owner = "rocky";
+    repo = "python-xdis";
+    rev = "refs/tags/${version}";
+    hash = "sha256-3mL0EuPHF/dithovrYvMjweYGwGhrN75N9MRfLjNC34=";
+  };
+
+  postPatch = ''
+    # Our Python release is not in the test matrix
+    substituteInPlace xdis/magics.py \
+      --replace "3.10.4" "3.10.5 3.10.6 3.10.7 3.10.8 3.10.10 3.10.11 3.10.12 3.10.13 3.10.14"
+  '';
+
+  propagatedBuildInputs = [
+    click
+    six
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "xdis"
+  ];
+
+  # import file mismatch:
+  # imported module 'test_disasm' has this __file__ attribute:
+  #   /build/source/pytest/test_disasm.py
+  # which is not the same as the test file we want to collect:
+  #   /build/source/test_unit/test_disasm.py
+  disabledTestPaths = [
+    "test_unit/test_disasm.py"
+  ];
+
+  disabledTests = [
+    # AssertionError: events did not match expectation
+    "test_big_linenos"
+    # AssertionError: False is not true : PYTHON VERSION 4.0 is not in magic.magics.keys
+    "test_basic"
+  ];
+
+  meta = with lib; {
+    description = "Python cross-version byte-code disassembler and marshal routines";
+    homepage = "https://github.com/rocky/python-xdis";
+    changelog = "https://github.com/rocky/python-xdis/releases/tag/${version}";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xdoctest/default.nix b/nixpkgs/pkgs/development/python-modules/xdoctest/default.nix
new file mode 100644
index 000000000000..357e605d8534
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xdoctest/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+, wheel
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "xdoctest";
+  version = "1.1.2";
+  pyproject = true;
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "Erotemic";
+    repo = "xdoctest";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-yTu5ldr9TkpYRP8hjgUPpexBVLjaK2gfPvISjMJLY74=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    export HOME=$TMPDIR
+    export PATH=$out/bin:$PATH
+  '';
+
+  pythonImportsCheck = [ "xdoctest" ];
+
+  meta = with lib; {
+    description = "A rewrite of Python's builtin doctest module (with pytest plugin integration) with AST instead of REGEX";
+    homepage = "https://github.com/Erotemic/xdoctest";
+    changelog = "https://github.com/Erotemic/xdoctest/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ natsukium ];
+    mainProgram = "xdoctest";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xdot/default.nix b/nixpkgs/pkgs/development/python-modules/xdot/default.nix
new file mode 100644
index 000000000000..3e1ce8b1477a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xdot/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, xvfb-run
+, wrapGAppsHook
+, gobject-introspection
+, pygobject3
+, graphviz
+, gtk3
+, numpy
+}:
+
+buildPythonPackage rec {
+  pname = "xdot";
+  version = "1.3";
+
+  src = fetchFromGitHub {
+    owner = "jrfonseca";
+    repo = "xdot.py";
+    rev = version;
+    hash = "sha256-0UfvN7z7ThlFu825h03Z5Wur9zbiUpvD5cb5gcIhQQI=";
+  };
+
+  nativeBuildInputs = [
+    gobject-introspection
+    wrapGAppsHook
+  ];
+  propagatedBuildInputs = [
+    pygobject3
+    graphviz
+    gtk3
+    numpy
+  ];
+  nativeCheckInputs = [
+    xvfb-run
+  ];
+
+  dontWrapGApps = true;
+  # Arguments to be passed to `makeWrapper`, only used by buildPython*
+  preFixup = ''
+    makeWrapperArgs+=("''${gappsWrapperArgs[@]}")
+    makeWrapperArgs+=(--prefix PATH : ${lib.makeBinPath [ graphviz ]})
+  '';
+
+  checkPhase = ''
+    runHook preCheck
+
+    xvfb-run -s '-screen 0 800x600x24' ${python.interpreter} test.py
+
+    runHook postCheck
+  '';
+
+  doCheck = true;
+
+  meta = with lib; {
+    description = "An interactive viewer for graphs written in Graphviz's dot";
+    homepage = "https://github.com/jrfonseca/xdot.py";
+    license = licenses.lgpl3Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xformers/default.nix b/nixpkgs/pkgs/development/python-modules/xformers/default.nix
new file mode 100644
index 000000000000..bf2d415b3e7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xformers/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, which
+# runtime dependencies
+, numpy
+, torch
+# check dependencies
+, pytestCheckHook
+, pytest-cov
+# , pytest-mpi
+, pytest-timeout
+# , pytorch-image-models
+, hydra-core
+, fairscale
+, scipy
+, cmake
+, openai-triton
+, networkx
+#, apex
+, einops
+, transformers
+, timm
+#, flash-attn
+}:
+let
+  version = "0.0.22.post7";
+in
+buildPythonPackage {
+  pname = "xformers";
+  inherit version;
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "facebookresearch";
+    repo = "xformers";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-7lZi3+2dVDZJFYCUlxsyDU8t9qdnl+b2ERRXKA6Zp7U=";
+    fetchSubmodules = true;
+  };
+
+  preBuild = ''
+    cat << EOF > ./xformers/version.py
+    # noqa: C801
+    __version__ = "${version}"
+    EOF
+  '';
+
+  nativeBuildInputs = [
+    which
+  ];
+
+  propagatedBuildInputs = [
+    numpy
+    torch
+  ];
+
+  pythonImportsCheck = [ "xformers" ];
+
+  dontUseCmakeConfigure = true;
+
+  # see commented out missing packages
+  doCheck = false;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-cov
+    pytest-timeout
+    hydra-core
+    fairscale
+    scipy
+    cmake
+    networkx
+    openai-triton
+    # apex
+    einops
+    transformers
+    timm
+    # flash-attn
+  ];
+
+  meta = with lib; {
+    description = "XFormers: A collection of composable Transformer building blocks";
+    homepage = "https://github.com/facebookresearch/xformers";
+    changelog = "https://github.com/facebookresearch/xformers/blob/${version}/CHANGELOG.md";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ happysalada ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xgboost/default.nix b/nixpkgs/pkgs/development/python-modules/xgboost/default.nix
new file mode 100644
index 000000000000..2a65992e048d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xgboost/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, cmake
+, numpy
+, scipy
+, hatchling
+, stdenv
+, xgboost
+}:
+
+buildPythonPackage {
+  pname = "xgboost";
+  format = "pyproject";
+  inherit (xgboost) version src meta;
+
+  disabled = pythonOlder "3.8";
+
+  nativeBuildInputs = [ cmake hatchling ];
+  buildInputs = [ xgboost ];
+  propagatedBuildInputs = [ numpy scipy ];
+
+  # Override existing logic for locating libxgboost.so which is not appropriate for Nix
+  prePatch = let
+    libPath = "${xgboost}/lib/libxgboost${stdenv.hostPlatform.extensions.sharedLibrary}";
+  in ''
+    echo 'find_lib_path = lambda: ["${libPath}"]' > python-package/xgboost/libpath.py
+  '';
+
+  dontUseCmakeConfigure = true;
+
+  postPatch = ''
+    cd python-package
+  '';
+
+  # test setup tries to download test data with no option to disable
+  # (removing sklearn from nativeCheckInputs causes all previously enabled tests to be skipped)
+  # and are extremely cpu intensive anyway
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "xgboost"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xhtml2pdf/default.nix b/nixpkgs/pkgs/development/python-modules/xhtml2pdf/default.nix
new file mode 100644
index 000000000000..931d08e12c1c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xhtml2pdf/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, arabic-reshaper
+, buildPythonPackage
+, fetchFromGitHub
+, html5lib
+, pillow
+, pyhanko
+, pypdf
+, pytestCheckHook
+, python-bidi
+, pythonOlder
+, reportlab
+, svglib
+}:
+
+buildPythonPackage rec {
+  pname = "xhtml2pdf";
+  version = "0.2.11";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-L/HCw+O8bidtE5nDdO+cLS54m64dlJL+9Gjcye5gM+w=";
+  };
+
+  propagatedBuildInputs = [
+    arabic-reshaper
+    html5lib
+    pillow
+    pyhanko
+    pypdf
+    python-bidi
+    reportlab
+    svglib
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "xhtml2pdf"
+  ];
+
+  meta = with lib; {
+    description = "A PDF generator using HTML and CSS";
+    homepage = "https://github.com/xhtml2pdf/xhtml2pdf";
+    changelog = "https://github.com/xhtml2pdf/xhtml2pdf/releases/tag/v${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xiaomi-ble/default.nix b/nixpkgs/pkgs/development/python-modules/xiaomi-ble/default.nix
new file mode 100644
index 000000000000..45edddf408c0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xiaomi-ble/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, bleak
+, bleak-retry-connector
+, bluetooth-data-tools
+, bluetooth-sensor-state-data
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, home-assistant-bluetooth
+, poetry-core
+, pycryptodomex
+, pytestCheckHook
+, pythonOlder
+, sensor-state-data
+}:
+
+buildPythonPackage rec {
+  pname = "xiaomi-ble";
+  version = "0.21.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "Bluetooth-Devices";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-5AzqsCWDgGhJ1EgJrbA8QHjP/Y14cIdSA0GKwZMrxX0=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=xiaomi_ble --cov-report=term-missing:skip-covered" "" \
+      --replace 'pycryptodomex = ">=3.18.0"' 'pycryptodomex = ">=3.17.0"'
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    bleak
+    bleak-retry-connector
+    bluetooth-data-tools
+    bluetooth-sensor-state-data
+    cryptography
+    home-assistant-bluetooth
+    pycryptodomex
+    sensor-state-data
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "xiaomi_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for Xiaomi BLE devices";
+    homepage = "https://github.com/Bluetooth-Devices/xiaomi-ble";
+    changelog = "https://github.com/Bluetooth-Devices/xiaomi-ble/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xkbcommon/default.nix b/nixpkgs/pkgs/development/python-modules/xkbcommon/default.nix
new file mode 100644
index 000000000000..35556fe32d9c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xkbcommon/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, cffi
+, pkg-config
+, libxkbcommon
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "xkbcommon";
+  version = "0.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-W+WXO/W3UlaHpN9shHibQhWQ1/fPkq5W8qqxd7eV1RY=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  propagatedNativeBuildInputs = [ cffi ];
+  buildInputs = [ libxkbcommon ];
+  propagatedBuildInputs = [ cffi ];
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  postBuild = ''
+    ${python.pythonOnBuildForHost.interpreter} xkbcommon/ffi_build.py
+  '';
+
+  pythonImportsCheck = [ "xkbcommon" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/sde1000/python-xkbcommon";
+    description = "Python bindings for libxkbcommon using cffi";
+    license = licenses.mit;
+    maintainers = with maintainers; [ chvp ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xkcdpass/default.nix b/nixpkgs/pkgs/development/python-modules/xkcdpass/default.nix
new file mode 100644
index 000000000000..d4a04317ad80
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xkcdpass/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, installShellFiles
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "xkcdpass";
+  version = "1.19.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-zrdR4KuORCGIoRTZDednT9JDV/seWQRa3aPal8gxdTE=";
+  };
+
+  nativeBuildInputs = [
+    installShellFiles
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "xkcdpass"
+  ];
+
+  disabledTests = lib.optionals (pythonAtLeast "3.10") [
+    # https://github.com/redacted/XKCD-password-generator/issues/138
+    "test_entropy_printout_valid_input"
+  ];
+
+  postInstall = ''
+    installManPage *.?
+    install -Dm444 -t $out/share/doc/${pname} README*
+  '';
+
+  meta = with lib; {
+    description = "Generate secure multiword passwords/passphrases, inspired by XKCD";
+    homepage = "https://github.com/redacted/XKCD-password-generator";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xknx/default.nix b/nixpkgs/pkgs/development/python-modules/xknx/default.nix
new file mode 100644
index 000000000000..6151edfb5066
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xknx/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, cryptography
+, ifaddr
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "xknx";
+  version = "2.11.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "XKNX";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-rKvHb0wkWVuZO8M8uIQdOiY1N6DmGSpqUgz4YYbUfSM=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "unpin-setuptools.patch";
+      url = "https://github.com/XKNX/xknx/commit/c0826aec52ab69b8bd81f600bea154fae16f334e.patch";
+      hash = "sha256-EpfgEq4pIx7ahqJZalzo30ruj8NlZYHcKHxFXCGL98w=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    async-timeout
+    cryptography
+    ifaddr
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "xknx"
+  ];
+
+  disabledTests = [
+    # Test requires network access
+    "test_scan_timeout"
+    "test_start_secure_routing_knx_keys"
+    "test_start_secure_routing_manual"
+  ];
+
+  meta = with lib; {
+    description = "KNX Library Written in Python";
+    longDescription = ''
+      XKNX is an asynchronous Python library for reading and writing KNX/IP
+      packets. It provides support for KNX/IP routing and tunneling devices.
+    '';
+    homepage = "https://github.com/XKNX/xknx";
+    changelog = "https://github.com/XKNX/xknx/releases/tag/${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xknxproject/default.nix b/nixpkgs/pkgs/development/python-modules/xknxproject/default.nix
new file mode 100644
index 000000000000..56d08ad5146d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xknxproject/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, pyzipper
+, setuptools
+, striprtf
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "xknxproject";
+  version = "3.4.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "XKNX";
+    repo = "xknxproject";
+    rev = "refs/tags/${version}";
+    hash = "sha256-J257Y8Y0mVtlFHiHju5lxPyV0yx3IAYH8ikbmZlI3fY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    cryptography
+    pyzipper
+    striprtf
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "xknxproject"
+  ];
+
+  meta = with lib; {
+    description = "ETS project parser";
+    homepage = "https://github.com/XKNX/xknxproject";
+    changelog = "https://github.com/XKNX/xknxproject/releases/tag/${version}";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xlib/default.nix b/nixpkgs/pkgs/development/python-modules/xlib/default.nix
new file mode 100644
index 000000000000..c9fd70140301
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xlib/default.nix
@@ -0,0 +1,61 @@
+{ lib, stdenv
+, buildPythonPackage
+, fetchFromGitHub
+, six
+, setuptools-scm
+, xorg
+, python
+, mock
+, nose
+, pytestCheckHook
+, util-linux
+}:
+
+buildPythonPackage rec {
+  pname = "xlib";
+  version = "0.33";
+
+  src = fetchFromGitHub {
+    owner = "python-xlib";
+    repo = "python-xlib";
+    rev = "refs/tags/${version}";
+    hash = "sha256-u06OWlMIOUzHOVS4hvm72jGgTSXWUqMvEQd8bTpFog0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  buildInputs = [
+    xorg.libX11
+  ];
+
+  propagatedBuildInputs = [
+    six
+  ];
+
+  doCheck = !stdenv.isDarwin;
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    mock
+    nose
+    util-linux
+    xorg.xauth
+    xorg.xorgserver
+  ];
+
+  disabledTestPaths = [
+    # requires x session
+    "test/test_xlib_display.py"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/python-xlib/python-xlib/releases/tag/${version}";
+    description = "Fully functional X client library for Python programs";
+    homepage = "https://github.com/python-xlib/python-xlib";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xlib/fix-no-protocol-specified.patch b/nixpkgs/pkgs/development/python-modules/xlib/fix-no-protocol-specified.patch
new file mode 100644
index 000000000000..1f3ab927f840
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xlib/fix-no-protocol-specified.patch
@@ -0,0 +1,13 @@
+diff --git a/Xlib/xauth.py b/Xlib/xauth.py
+index 2ed7dd5..303bd49 100644
+--- a/Xlib/xauth.py
++++ b/Xlib/xauth.py
+@@ -120,6 +120,8 @@ class Xauthority(object):
+         matches = {}
+ 
+         for efam, eaddr, enum, ename, edata in self.entries:
++            if enum == b'' and ename not in matches:
++                enum = num
+             if efam == family and eaddr == address and num == enum:
+                 matches[ename] = edata
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/xlrd/default.nix b/nixpkgs/pkgs/development/python-modules/xlrd/default.nix
new file mode 100644
index 000000000000..6fa9b6935def
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xlrd/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "xlrd";
+  version = "2.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f72f148f54442c6b056bf931dbc34f986fd0c3b0b6b5a58d013c9aef274d0c88";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  # No tests in archive
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://www.python-excel.org/";
+    description = "Library for developers to extract data from Microsoft Excel (tm) spreadsheet files";
+    license = licenses.bsd0;
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xlsx2csv/default.nix b/nixpkgs/pkgs/development/python-modules/xlsx2csv/default.nix
new file mode 100644
index 000000000000..156fbb9d387a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xlsx2csv/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, setuptools-scm
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "xlsx2csv";
+  version = "0.8.1";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-fs1tK8JCby5DL0/awSIR4ZdtPLtl+QM+Htpl7dogReM=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+    wheel
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/dilshod/xlsx2csv";
+    description = "Convert xlsx to csv";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ jb55 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xlsxwriter/default.nix b/nixpkgs/pkgs/development/python-modules/xlsxwriter/default.nix
new file mode 100644
index 000000000000..5bd96b3aa1b6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xlsxwriter/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "xlsxwriter";
+  version = "3.1.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jmcnamara";
+    repo = "XlsxWriter";
+    rev = "RELEASE_${version}";
+    hash = "sha256-FkSInLinyn/eXBMSuivzFxCTZijOKdSG4l+gHyKENuY=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "xlsxwriter"
+  ];
+
+  meta = with lib; {
+    description = "Module for creating Excel XLSX files";
+    homepage = "https://xlsxwriter.readthedocs.io/";
+    changelog = "https://xlsxwriter.readthedocs.io/changes.html";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xlwt/default.nix b/nixpkgs/pkgs/development/python-modules/xlwt/default.nix
new file mode 100644
index 000000000000..efcc4adfda6f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xlwt/default.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage
+, fetchPypi
+, nose
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "xlwt";
+  version = "1.3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "c59912717a9b28f1a3c2a98fd60741014b06b043936dcecbc113eaaada156c88";
+  };
+
+  nativeCheckInputs = [ nose ];
+  checkPhase = ''
+    nosetests -v
+  '';
+
+  meta = {
+    description = "Library to create spreadsheet files compatible with MS";
+    homepage = "https://github.com/python-excel/xlwt";
+    license = with lib.licenses; [ bsdOriginal bsd3 lgpl21 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xmind/default.nix b/nixpkgs/pkgs/development/python-modules/xmind/default.nix
new file mode 100644
index 000000000000..ab12f26a72df
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xmind/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "xmind";
+  version = "1.2.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "zhuifengshen";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "xC1WpHz2eHb5+xShM/QUQAIYnJNyK1EKWbTXJKhDwbQ=";
+  };
+
+  # Projec thas no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "xmind"
+  ];
+
+  meta = with lib; {
+    description = "Python module to create mindmaps";
+    homepage = "https://github.com/zhuifengshen/xmind";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xml-marshaller/default.nix b/nixpkgs/pkgs/development/python-modules/xml-marshaller/default.nix
new file mode 100644
index 000000000000..6e1c6d8c2bfe
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xml-marshaller/default.nix
@@ -0,0 +1,28 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, lxml
+, six
+}:
+
+buildPythonPackage rec {
+  pname = "xml-marshaller";
+  version = "1.0.2";
+
+  src = fetchPypi {
+    pname = "xml_marshaller";
+    inherit version;
+    hash = "sha256-QvBALLDD8o5nZQ5Z4bembhadK6jcydWKQpJaSmGqqJM=";
+  };
+
+  propagatedBuildInputs = [ lxml six ];
+
+  pythonImportsCheck = [ "xml_marshaller" ];
+
+  meta = with lib; {
+    description = "This module allows one to marshal simple Python data types into a custom XML format.";
+    homepage = "https://www.python.org/community/sigs/current/xml-sig/";
+    license = licenses.psfl;
+    maintainers = with maintainers; [ mazurel ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xml2rfc/default.nix b/nixpkgs/pkgs/development/python-modules/xml2rfc/default.nix
new file mode 100644
index 000000000000..0123cf4c554f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xml2rfc/default.nix
@@ -0,0 +1,97 @@
+{ lib
+, appdirs
+, buildPythonPackage
+, configargparse
+, decorator
+, dict2xml
+, fetchFromGitHub
+, google-i18n-address
+, html5lib
+, intervaltree
+, jinja2
+, lxml
+, markupsafe
+, platformdirs
+, pycairo
+, pycountry
+, pyflakes
+, pypdf2
+, pytestCheckHook
+, python-fontconfig
+, pythonOlder
+, pyyaml
+, requests
+, six
+, wcwidth
+}:
+
+buildPythonPackage rec {
+  pname = "xml2rfc";
+  version = "3.18.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ietf-tools";
+    repo = "xml2rfc";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-IpCC5r9sOf4SFn0Bd6QgWqx3Sx0eRGcii7xyMpN5V/s=";
+  };
+
+  postPatch = ''
+    substituteInPlace Makefile \
+      --replace "SHELL := /bin/bash" "SHELL := bash" \
+      --replace "test flaketest" "test"
+    substituteInPlace setup.py \
+      --replace "'tox'," ""
+  '';
+
+  propagatedBuildInputs = [
+    appdirs
+    configargparse
+    dict2xml
+    google-i18n-address
+    html5lib
+    intervaltree
+    jinja2
+    lxml
+    markupsafe
+    platformdirs
+    pycountry
+    pyflakes
+    pypdf2
+    pyyaml
+    requests
+    six
+    wcwidth
+  ];
+
+  nativeCheckInputs = [
+    decorator
+    pycairo
+    pytestCheckHook
+    python-fontconfig
+  ];
+
+   # Requires Noto Serif and Roboto Mono font
+  doCheck = false;
+
+  checkPhase = ''
+    make tests-no-network
+  '';
+
+  pythonImportsCheck = [
+    "xml2rfc"
+  ];
+
+  meta = with lib; {
+    description = "Tool generating IETF RFCs and drafts from XML sources";
+    homepage = "https://github.com/ietf-tools/xml2rfc";
+    changelog = "https://github.com/ietf-tools/xml2rfc/blob/v${version}/CHANGELOG.md";
+    # Well, parts might be considered unfree, if being strict; see:
+    # http://metadata.ftp-master.debian.org/changelogs/non-free/x/xml2rfc/xml2rfc_2.9.6-1_copyright
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ vcunat yrashk ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xmldiff/default.nix b/nixpkgs/pkgs/development/python-modules/xmldiff/default.nix
new file mode 100644
index 000000000000..763503ecf20a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xmldiff/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, lxml
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "xmldiff";
+  version = "2.6.3";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-GbAws/o30fC1xa2a2pBZiEw78sdRxd2PHrTtSc/j/GA=";
+  };
+
+  propagatedBuildInputs = [
+    lxml
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "xmldiff"
+  ];
+
+  meta = with lib; {
+    description = "Creates diffs of XML files";
+    homepage = "https://github.com/Shoobx/xmldiff";
+    changelog = "https://github.com/Shoobx/xmldiff/blob/master/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sfrijters ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xmljson/default.nix b/nixpkgs/pkgs/development/python-modules/xmljson/default.nix
new file mode 100644
index 000000000000..60752537e339
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xmljson/default.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage
+, fetchPypi
+, lib
+, lxml
+}:
+
+buildPythonPackage rec {
+  pname = "xmljson";
+  version = "0.2.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b4158e66aa1e62ee39f7f80eb2fe4f767670ba3c0d5de9804420dc53427fdec8";
+  };
+
+  nativeCheckInputs = [
+    lxml
+  ];
+
+  meta = with lib; {
+    description = "Converts XML into dictionary structures and vice-versa";
+    homepage = "https://github.com/sanand0/xmljson";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ rakesh4g ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xmlschema/default.nix b/nixpkgs/pkgs/development/python-modules/xmlschema/default.nix
new file mode 100644
index 000000000000..a8e595e49792
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xmlschema/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, elementpath
+, jinja2
+, lxml
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "xmlschema";
+  version = "2.5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sissaschool";
+    repo = "xmlschema";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ETWD+i0VJbmfSHFvOsRkuzScKZdEyr6It3+U5Q7cQbQ=";
+  };
+
+  propagatedBuildInputs = [
+    elementpath
+  ];
+
+  nativeCheckInputs = [
+    jinja2
+    lxml
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "xmlschema"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/sissaschool/xmlschema/blob/${src.rev}/CHANGELOG.rst";
+    description = "XML Schema validator and data conversion library for Python";
+    homepage = "https://github.com/sissaschool/xmlschema";
+    license = licenses.mit;
+    maintainers = with maintainers; [ jonringer ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xmlsec/default.nix b/nixpkgs/pkgs/development/python-modules/xmlsec/default.nix
new file mode 100644
index 000000000000..94af405e8f64
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xmlsec/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, pytestCheckHook
+, libxslt
+, libxml2
+, libtool
+, pkg-config
+, xmlsec
+, pkgconfig
+, setuptools-scm
+, lxml
+, hypothesis
+}:
+
+buildPythonPackage rec {
+  pname = "xmlsec";
+  version = "1.3.13";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-kW9deOgEH2zZORq7plnajJSk/vcZbRJtQK8f9Bfyz4Y=";
+  };
+
+  nativeBuildInputs = [ pkg-config pkgconfig setuptools-scm ];
+
+  buildInputs = [ xmlsec libxslt libxml2 libtool ];
+
+  propagatedBuildInputs = [ lxml ];
+
+  nativeCheckInputs = [ pytestCheckHook hypothesis ];
+
+  disabledTestPaths = [
+    # Full git clone required for test_doc_examples
+    "tests/test_doc_examples.py"
+    # test_reinitialize_module segfaults python
+    # https://github.com/mehcode/python-xmlsec/issues/203
+    "tests/test_xmlsec.py"
+  ];
+
+  pythonImportsCheck = [ "xmlsec" ];
+
+  meta = with lib; {
+    description = "Python bindings for the XML Security Library";
+    homepage = "https://github.com/mehcode/python-xmlsec";
+    license = licenses.mit;
+    maintainers = with maintainers; [ zhaofengli ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xmltodict/default.nix b/nixpkgs/pkgs/development/python-modules/xmltodict/default.nix
new file mode 100644
index 000000000000..bd4e2cbb0f2d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xmltodict/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "xmltodict";
+  version = "0.13.0";
+  format = "setuptools";
+  disabled = pythonOlder "3.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-NBWVpIjj4BqFqdiRHYkS/ZIu3l/sxNzkN+tLbI0DflY=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "xmltodict" ];
+
+  meta = with lib; {
+    description = "Makes working with XML feel like you are working with JSON";
+    homepage = "https://github.com/martinblech/xmltodict";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xmodem/default.nix b/nixpkgs/pkgs/development/python-modules/xmodem/default.nix
new file mode 100644
index 000000000000..652c0f43be40
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xmodem/default.nix
@@ -0,0 +1,26 @@
+{ lib, buildPythonPackage, fetchFromGitHub, pytest, which, lrzsz }:
+
+buildPythonPackage rec {
+  pname = "xmodem";
+  version = "0.4.7";
+
+  src = fetchFromGitHub {
+    owner = "tehmaze";
+    repo = "xmodem";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-kwPA/lYiv6IJSKGRuH13tBofZwp19vebwQniHK7A/i8=";
+  };
+
+  nativeCheckInputs = [ pytest which lrzsz ];
+
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Pure python implementation of the XMODEM protocol";
+    maintainers = with maintainers; [ emantor ];
+    homepage = "https://github.com/tehmaze/xmodem";
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xnatpy/default.nix b/nixpkgs/pkgs/development/python-modules/xnatpy/default.nix
new file mode 100644
index 000000000000..4738f137d427
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xnatpy/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, click
+, isodate
+, progressbar2
+, pydicom
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "xnatpy";
+  version = "0.5.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "xnat";
+    inherit version;
+    hash = "sha256-iOw9cVWP5Am4S9JQ0NTmtew38KZiKmau+19K2KG2aKQ=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  propagatedBuildInputs = [
+    click
+    isodate
+    progressbar2
+    pydicom
+    requests
+  ];
+
+  # tests missing in PyPI dist and require network access and Docker container
+  doCheck = false;
+
+  pythonImportsCheck = [ "xnat" ];
+
+  meta = with lib; {
+    homepage = "https://xnat.readthedocs.io";
+    description =
+      "A new XNAT client (distinct from pyxnat) that exposes XNAT objects/functions as Python objects/functions";
+    changelog = "https://gitlab.com/radiology/infrastructure/xnatpy/-/blob/${version}/CHANGELOG?ref_type=tags";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ bcdarwin ];
+    mainProgram = "xnat";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xnd/default.nix b/nixpkgs/pkgs/development/python-modules/xnd/default.nix
new file mode 100644
index 000000000000..eac1153b4f50
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xnd/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, stdenv
+, fetchpatch
+, buildPythonPackage
+, python
+, ndtypes
+, libndtypes
+, libxnd
+, isPy27
+}:
+
+buildPythonPackage {
+  pname = "xnd";
+  disabled = isPy27;
+  inherit (libxnd) version src meta;
+
+  propagatedBuildInputs = [ ndtypes ];
+
+  buildInputs = [ libndtypes ];
+
+  patches = [
+    # python311 fixes which are on main. remove on update
+    (fetchpatch {
+      name = "python311.patch";
+      url = "https://github.com/xnd-project/xnd/commit/e1a06d9f6175f4f4e1da369b7e907ad6b2952c00.patch";
+      hash = "sha256-xzrap+FL5be13bVdsJ3zeV7t57ZC4iyhuZhuLsOzHyE=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace 'include_dirs = ["libxnd", "ndtypes/python/ndtypes"] + INCLUDES' \
+                'include_dirs = ["${libndtypes}/include", "${ndtypes}/include", "${libxnd}/include"]' \
+      --replace 'library_dirs = ["libxnd", "ndtypes/libndtypes"] + LIBS' \
+                'library_dirs = ["${libndtypes}/lib", "${libxnd}/lib"]' \
+      --replace 'runtime_library_dirs = ["$ORIGIN"]' \
+                'runtime_library_dirs = ["${libndtypes}/lib", "${libxnd}/lib"]' \
+  '';
+
+  postInstall = ''
+    mkdir $out/include
+    cp python/xnd/*.h $out/include
+  '' + lib.optionalString stdenv.isDarwin ''
+    install_name_tool -add_rpath ${libxnd}/lib $out/${python.sitePackages}/xnd/_xnd.*.so
+  '';
+
+  checkPhase = ''
+    pushd python
+    mv xnd _xnd
+    python test_xnd.py
+    popd
+  '';
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xpath-expressions/default.nix b/nixpkgs/pkgs/development/python-modules/xpath-expressions/default.nix
new file mode 100644
index 000000000000..97e5e62b01aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xpath-expressions/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, fetchpatch
+, lxml
+, poetry-core
+, pythonOlder
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "xpath-expressions";
+  version = "1.1.0";
+  format = "pyproject";
+  disabled = pythonOlder "3.5";
+
+  src = fetchFromGitHub {
+    owner = "orf";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-UAzDXrz1Tr9/OOjKAg/5Std9Qlrnizei8/3XL3hMSFA=";
+  };
+
+  patches = [
+    # https://github.com/orf/xpath-expressions/pull/4
+    (fetchpatch {
+      name = "replace-poetry-with-poetry-core.patch";
+      url = "https://github.com/orf/xpath-expressions/commit/3c5900fd6b2d08dd9468707f35ab42072cf75bd3.patch";
+      hash = "sha256-IeV6ncJyt/w2s5TPpbM5a3pljNT6Bp5PIiqgTg2iTRA=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  nativeCheckInputs = [
+    lxml
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "xpath" ];
+
+  meta = with lib; {
+    description = "Python module to handle XPath expressions";
+    homepage = "https://github.com/orf/xpath-expressions";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xpybutil/default.nix b/nixpkgs/pkgs/development/python-modules/xpybutil/default.nix
new file mode 100644
index 000000000000..cc574c582418
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xpybutil/default.nix
@@ -0,0 +1,33 @@
+{ lib, buildPythonPackage, fetchFromGitHub, xcffib, pillow }:
+
+buildPythonPackage rec {
+  pname = "xpybutil";
+  version = "0.0.6";
+
+  # Pypi only offers a wheel
+  src = fetchFromGitHub {
+    owner = "BurntSushi";
+    repo = pname;
+    rev = version;
+    sha256 = "17gbqq955fcl29aayn8l0x14azc60cxgkvdxblz9q8x3l50w0xpg";
+  };
+
+  # pillow is a dependency in image.py which is not listed in setup.py
+  propagatedBuildInputs = [ pillow xcffib ];
+
+  propagatedNativeBuildInputs = [ xcffib ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "xpybutil"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/BurntSushi/xpybutil";
+    description = "An incomplete xcb-util port plus some extras";
+    license = licenses.wtfpl;
+    maintainers = with maintainers; [ artturin ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xsdata/default.nix b/nixpkgs/pkgs/development/python-modules/xsdata/default.nix
new file mode 100644
index 000000000000..d44bd2d8d7da
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xsdata/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, click
+, click-default-group
+, docformatter
+, jinja2
+, toposort
+, typing-extensions
+, lxml
+, requests
+, pytestCheckHook
+, setuptools
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "xsdata";
+  version = "23.8";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-VfA9TIgjbwRyZq/+VQug3RlHat/OagHz4K76x8gHjlY=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--benchmark-skip" ""
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    typing-extensions
+  ];
+
+  passthru.optional-dependencies = {
+    cli = [
+      click
+      click-default-group
+      docformatter
+      jinja2
+      toposort
+    ];
+    lxml = [
+      lxml
+    ];
+    soap = [
+      requests
+    ];
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ] ++ passthru.optional-dependencies.cli
+    ++ passthru.optional-dependencies.lxml
+    ++ passthru.optional-dependencies.soap;
+
+  disabledTestPaths = [
+    "tests/integration/benchmarks"
+  ];
+
+  pythonImportsCheck = [
+    "xsdata.formats.dataclass.context"
+    "xsdata.formats.dataclass.models.elements"
+    "xsdata.formats.dataclass.models.generics"
+    "xsdata.formats.dataclass.parsers"
+    "xsdata.formats.dataclass.parsers.handlers"
+    "xsdata.formats.dataclass.parsers.nodes"
+    "xsdata.formats.dataclass.serializers"
+    "xsdata.formats.dataclass.serializers.config"
+    "xsdata.formats.dataclass.serializers.mixins"
+    "xsdata.formats.dataclass.serializers.writers"
+    "xsdata.models.config"
+    "xsdata.utils.text"
+  ];
+
+  meta = {
+    description = "Python XML Binding";
+    homepage = "https://github.com/tefra/xsdata";
+    changelog = "https://github.com/tefra/xsdata/blob/v${version}/CHANGES.rst";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xstatic-asciinema-player/default.nix b/nixpkgs/pkgs/development/python-modules/xstatic-asciinema-player/default.nix
new file mode 100644
index 000000000000..d970f0888aa8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xstatic-asciinema-player/default.nix
@@ -0,0 +1,24 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "XStatic-asciinema-player";
+  version = "2.6.1.1";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "sha256-yA6WC067St82Dm6StaCKdWrRBhmNemswetIO8iodfcw=";
+  };
+
+  # no tests implemented
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/python-xstatic/asciinema-player";
+    description = "Asciinema-player packaged for python";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ aither64 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xstatic-bootbox/default.nix b/nixpkgs/pkgs/development/python-modules/xstatic-bootbox/default.nix
new file mode 100644
index 000000000000..6e5200d2a887
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xstatic-bootbox/default.nix
@@ -0,0 +1,25 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "XStatic-Bootbox";
+  version = "5.5.1.1";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "4b2120bb33a1d8ada8f9e0532ad99987aa03879b17b08bfdc6b8326d6eb7c205";
+  };
+
+  # no tests implemented
+  doCheck = false;
+
+  meta = with lib;{
+    homepage = "http://bootboxjs.com";
+    description = "Bootboxjs packaged static files for python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ makefu ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xstatic-bootstrap/default.nix b/nixpkgs/pkgs/development/python-modules/xstatic-bootstrap/default.nix
new file mode 100644
index 000000000000..0d9962e5faf5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xstatic-bootstrap/default.nix
@@ -0,0 +1,25 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "XStatic-Bootstrap";
+  version = "4.5.3.1";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "cf67d205437b32508a88b69a7e7c5bbe2ca5a8ae71097391a6a6f510ebfd2820";
+  };
+
+  # no tests implemented
+  doCheck = false;
+
+  meta = with lib;{
+    homepage = "https://getbootstrap.com";
+    description = "Bootstrap packaged static files for python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ makefu ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xstatic-font-awesome/default.nix b/nixpkgs/pkgs/development/python-modules/xstatic-font-awesome/default.nix
new file mode 100644
index 000000000000..71028393dc8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xstatic-font-awesome/default.nix
@@ -0,0 +1,24 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "XStatic-Font-Awesome";
+  version = "6.2.1.1";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "sha256-8HWHEJYShjjy4VOQINgid1TD2IXdaOfubemgEjUHaCg=";
+  };
+
+  # no tests implemented
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/python-xstatic/font-awesome";
+    description = "Font Awesome packaged for python";
+    license = licenses.ofl;
+    maintainers = with maintainers; [ aither64 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xstatic-jquery-file-upload/default.nix b/nixpkgs/pkgs/development/python-modules/xstatic-jquery-file-upload/default.nix
new file mode 100644
index 000000000000..ce3f8c76dfa6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xstatic-jquery-file-upload/default.nix
@@ -0,0 +1,28 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, xstatic-jquery
+}:
+
+buildPythonPackage rec {
+  pname = "XStatic-jQuery-File-Upload";
+  version = "10.31.0.1";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "7d716f26aca14732c35c54f0ba6d38187600ab472fc98a91d972d12c5a70db27";
+  };
+
+  # no tests implemented
+  doCheck = false;
+
+  propagatedBuildInputs = [ xstatic-jquery ];
+
+  meta = with lib;{
+    homepage =  "https://plugins.jquery.com/project/jQuery-File-Upload";
+    description = "jquery-file-upload packaged static files for python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ makefu ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xstatic-jquery-ui/default.nix b/nixpkgs/pkgs/development/python-modules/xstatic-jquery-ui/default.nix
new file mode 100644
index 000000000000..f5509676d114
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xstatic-jquery-ui/default.nix
@@ -0,0 +1,28 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+, xstatic-jquery
+}:
+
+buildPythonPackage rec {
+  pname = "XStatic-jquery-ui";
+  version = "1.13.0.1";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "3697e5f0ef355b8f4a1c724221592683c2db031935cbb57b46224eef474bd294";
+  };
+
+  # no tests implemented
+  doCheck = false;
+
+  propagatedBuildInputs = [ xstatic-jquery ];
+
+  meta = with lib;{
+    homepage = "https://jqueryui.com/";
+    description = "jquery-ui packaged static files for python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ makefu ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xstatic-jquery/default.nix b/nixpkgs/pkgs/development/python-modules/xstatic-jquery/default.nix
new file mode 100644
index 000000000000..e2a8f8266111
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xstatic-jquery/default.nix
@@ -0,0 +1,25 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "XStatic-jQuery";
+  version = "3.5.1.1";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "e0ae8f8ec5bbd28045ba4bca06767a38bd5fc27cf9b71f434589f59370dcd323";
+  };
+
+  # no tests implemented
+  doCheck = false;
+
+  meta = with lib;{
+    homepage =  "https://jquery.org";
+    description = "jquery packaged static files for python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ makefu ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xstatic-pygments/default.nix b/nixpkgs/pkgs/development/python-modules/xstatic-pygments/default.nix
new file mode 100644
index 000000000000..68fc2339f559
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xstatic-pygments/default.nix
@@ -0,0 +1,25 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "XStatic-Pygments";
+  version = "2.9.0.1";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "082c1e9fe606fbbef474f78b6fdb19e9a2efcc7a9b7d94163cf66f7bfae75762";
+  };
+
+  # no tests implemented
+  doCheck = false;
+
+  meta = with lib;{
+    homepage = "https://pygments.org";
+    description = "pygments packaged static files for python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ makefu ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xstatic/default.nix b/nixpkgs/pkgs/development/python-modules/xstatic/default.nix
new file mode 100644
index 000000000000..39e5f233ccd2
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xstatic/default.nix
@@ -0,0 +1,25 @@
+{ buildPythonPackage
+, lib
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "XStatic";
+  version = "1.0.2";
+
+  src = fetchPypi {
+    inherit version pname;
+    sha256 = "80b78dfe37bce6dee4343d64c65375a80bcf399b46dd47c0c7d56161568a23a8";
+  };
+
+  # no tests implemented
+  doCheck = false;
+
+  meta = with lib;{
+    homepage = "https://bitbucket.org/thomaswaldmann/xstatic";
+    description = "Base packaged static files for python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ makefu ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xtensor-python/default.nix b/nixpkgs/pkgs/development/python-modules/xtensor-python/default.nix
new file mode 100644
index 000000000000..2d652fbd245c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xtensor-python/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, toPythonModule
+, stdenv
+, fetchFromGitHub
+, cmake
+, gtest
+, xtensor
+, pybind11
+, numpy
+}:
+
+toPythonModule (stdenv.mkDerivation(finalAttrs: {
+  pname = "xtensor-python";
+  version = "0.26.1";
+
+  src = fetchFromGitHub {
+    owner = "xtensor-stack";
+    repo = "xtensor-python";
+    rev = finalAttrs.version;
+    sha256 = "sha256-kLFt5Ah5/ZO6wfTZQviVXeIAVok+/F/XCwpgPSagOMo=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+  ];
+  buildInputs = [
+    pybind11
+  ];
+  nativeCheckInputs = [
+    gtest
+  ];
+  doCheck = true;
+  cmakeFlags = [
+    "-DBUILD_TESTS=${if finalAttrs.doCheck then "ON" else "OFF"}"
+  ];
+
+  propagatedBuildInputs = [
+    xtensor
+    numpy
+  ];
+
+  checkTarget = "xtest";
+
+  meta = with lib; {
+    homepage = "https://github.com/xtensor-stack/xtensor-python";
+    description = "Python bindings for the xtensor C++ multi-dimensional array library";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ lsix ];
+  };
+}))
diff --git a/nixpkgs/pkgs/development/python-modules/xvfbwrapper/default.nix b/nixpkgs/pkgs/development/python-modules/xvfbwrapper/default.nix
new file mode 100644
index 000000000000..90890677ef9a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xvfbwrapper/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, xorgserver
+, mock
+}:
+
+buildPythonPackage rec {
+  pname = "xvfbwrapper";
+  version = "0.2.9";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "097wxhvp01ikqpg1z3v8rqhss6f1vwr399zpz9a05d2135bsxx5w";
+  };
+  propagatedBuildInputs = [ xorgserver ];
+
+  # See: https://github.com/cgoldberg/xvfbwrapper/issues/30
+  doCheck = false;
+
+  nativeCheckInputs = [ mock ];
+
+  meta = with lib; {
+    description = "Run headless display inside X virtual framebuffer (Xvfb)";
+    homepage = "https://github.com/cgoldberg/xvfbwrapper";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ashgillman ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xxhash/default.nix b/nixpkgs/pkgs/development/python-modules/xxhash/default.nix
new file mode 100644
index 000000000000..10afcbe83789
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xxhash/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  version = "3.3.0";
+  pname = "xxhash";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-w/njIrHr7r1E49nS2bEk4MVQwe9BvVUq/c3XGVFu5Bo=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ifduyue/python-xxhash";
+    description = "Python Binding for xxHash https://pypi.org/project/xxhash/";
+    license = licenses.bsd2;
+    maintainers = [ maintainers.teh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/xyzservices/default.nix b/nixpkgs/pkgs/development/python-modules/xyzservices/default.nix
new file mode 100644
index 000000000000..797242993f92
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/xyzservices/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, mercantile
+, pytestCheckHook
+, requests
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "xyzservices";
+  version = "2023.7.0";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-DskodCIn1vXUNn6ntFf8/tlDQp9N4pSbWwKoLN9VadY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  disabledTests = [
+    # requires network connections
+    "test_free_providers"
+  ];
+
+  pythonImportsCheck = [
+    "xyzservices.providers"
+  ];
+
+  nativeCheckInputs = [
+    mercantile
+    pytestCheckHook
+    requests
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/geopandas/xyzservices/releases/tag/${version}";
+    description = "Source of XYZ tiles providers";
+    homepage = "https://github.com/geopandas/xyzservices";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/y-py/default.nix b/nixpkgs/pkgs/development/python-modules/y-py/default.nix
new file mode 100644
index 000000000000..97747ccfdf5b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/y-py/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, rustPlatform
+, cargo
+, rustc
+, libiconv
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "y-py";
+  version = "0.6.2";
+  format = "pyproject";
+
+  src = fetchPypi {
+    pname = "y_py";
+    inherit version;
+    hash = "sha256-R1eoKlBAags6MzqgEiAZozG9bxbkn+1n3KQj+Siz/U0=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit src;
+    name = "${pname}-${version}";
+    hash = "sha256-RXwrDSPU0wiprsUJwoDzti14H/+bSwy4hK4tYhNVfYw=";
+  };
+
+  nativeBuildInputs = [
+    rustPlatform.cargoSetupHook
+    rustPlatform.maturinBuildHook
+    cargo
+    rustc
+  ];
+
+  buildInputs = lib.optional stdenv.isDarwin libiconv;
+
+  pythonImportsCheck = [ "y_py" ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = {
+    description = "Python bindings for Y-CRDT";
+    homepage = "https://github.com/y-crdt/ypy";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yabadaba/default.nix b/nixpkgs/pkgs/development/python-modules/yabadaba/default.nix
new file mode 100644
index 000000000000..bc8146a91489
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yabadaba/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, cdcs
+, datamodeldict
+, fetchFromGitHub
+, ipython
+, lxml
+, numpy
+, pandas
+, pymongo
+, pytestCheckHook
+, pythonOlder
+, tqdm
+}:
+
+buildPythonPackage rec {
+  pname = "yabadaba";
+  version = "0.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "usnistgov";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-D3dzO+vhf1utBMmX2RUgvxuaPneFnXDseqfz6CMDmv4=";
+  };
+
+  propagatedBuildInputs = [
+    cdcs
+    datamodeldict
+    ipython
+    lxml
+    numpy
+    pandas
+    pymongo
+    tqdm
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "yabadaba"
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d);
+  '';
+
+  meta = with lib; {
+    description = "Abstraction layer allowing for common interactions with databases and records";
+    homepage = "https://github.com/usnistgov/yabadaba";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yacs/default.nix b/nixpkgs/pkgs/development/python-modules/yacs/default.nix
new file mode 100644
index 000000000000..e5712b240f8c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yacs/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, python
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "yacs";
+  version = "0.1.8";
+
+  src = fetchFromGitHub {
+    owner = "rbgirshick";
+    repo = "yacs";
+    rev = "v${version}";
+    hash = "sha256-nO8FL4tTkfTthXYXxXORLieFwvn780DDxfrxC9EUUJ0=";
+  };
+
+  propagatedBuildInputs = [ pyyaml ];
+
+  pythonImportsCheck = [ "yacs" ];
+  checkPhase = ''
+    ${python.interpreter} yacs/tests.py
+  '';
+
+  meta = with lib; {
+    description = "Yet Another Configuration System";
+    homepage = "https://github.com/rbgirshick/yacs";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ lucasew ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yahooweather/default.nix b/nixpkgs/pkgs/development/python-modules/yahooweather/default.nix
new file mode 100644
index 000000000000..7bcf637af327
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yahooweather/default.nix
@@ -0,0 +1,23 @@
+{ lib, buildPythonPackage, fetchPypi, isPy3k }:
+
+buildPythonPackage rec {
+  pname = "yahooweather";
+  version = "0.10";
+
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0bsxmngkpzvqm50i2cnxjzhpbdhb8s10ly8h5q08696cjihqdkpa";
+  };
+
+  # Tests require network access
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Provide an interface to the Yahoo! Weather RSS feed";
+    homepage = "https://github.com/pvizeli/yahooweather";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yalesmartalarmclient/default.nix b/nixpkgs/pkgs/development/python-modules/yalesmartalarmclient/default.nix
new file mode 100644
index 000000000000..c621fa1138e6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yalesmartalarmclient/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, backoff
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "yalesmartalarmclient";
+  version = "0.3.9";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "domwillcode";
+    repo = "yale-smart-alarm-client";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Zpj1lLaxiTaYpcj1R/ktuVldl/r19r7fzNKvnSIDq80=";
+  };
+
+  propagatedBuildInputs = [
+    backoff
+    requests
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "yalesmartalarmclient"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interface with Yale Smart Alarm Systems";
+    homepage = "https://github.com/domwillcode/yale-smart-alarm-client";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yalexs-ble/default.nix b/nixpkgs/pkgs/development/python-modules/yalexs-ble/default.nix
new file mode 100644
index 000000000000..29ac9d1c68d7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yalexs-ble/default.nix
@@ -0,0 +1,64 @@
+{ lib
+, async-interrupt
+, async-timeout
+, bleak
+, bleak-retry-connector
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, lru-dict
+, poetry-core
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "yalexs-ble";
+  version = "2.3.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-uHkJEtaohuTRs1RXDPbe4dohbjBnYi9MFguP9CTwM5w=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    async-interrupt
+    async-timeout
+    bleak
+    bleak-retry-connector
+    cryptography
+    lru-dict
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov=yalexs_ble --cov-report=term-missing:skip-covered" ""
+  '';
+
+  pythonImportsCheck = [
+    "yalexs_ble"
+  ];
+
+  meta = with lib; {
+    description = "Library for Yale BLE devices";
+    homepage = "https://github.com/bdraco/yalexs-ble";
+    changelog = "https://github.com/bdraco/yalexs-ble/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yalexs/default.nix b/nixpkgs/pkgs/development/python-modules/yalexs/default.nix
new file mode 100644
index 000000000000..19d40b4f8051
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yalexs/default.nix
@@ -0,0 +1,66 @@
+{ lib
+, aiofiles
+, aiohttp
+, aioresponses
+, aiounittest
+, buildPythonPackage
+, ciso8601
+, fetchFromGitHub
+, pubnub
+, pyjwt
+, pytestCheckHook
+, python-dateutil
+, pythonOlder
+, requests
+, requests-mock
+}:
+
+buildPythonPackage rec {
+  pname = "yalexs";
+  version = "1.10.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "bdraco";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-7LFKqC8IHzXKKU5Pw6Qud9jqJFc0lSEJFn636T6CsfQ=";
+  };
+
+  propagatedBuildInputs = [
+    aiofiles
+    aiohttp
+    ciso8601
+    pubnub
+    pyjwt
+    python-dateutil
+    requests
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    aiounittest
+    pytestCheckHook
+    requests-mock
+  ];
+
+  postPatch = ''
+    # Not used requirement
+    substituteInPlace setup.py \
+      --replace '"vol",' ""
+  '';
+
+  pythonImportsCheck = [
+    "yalexs"
+  ];
+
+  meta = with lib; {
+    description = "Python API for Yale Access (formerly August) Smart Lock and Doorbell";
+    homepage = "https://github.com/bdraco/yalexs";
+    changelog = "https://github.com/bdraco/yalexs/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yamale/default.nix b/nixpkgs/pkgs/development/python-modules/yamale/default.nix
new file mode 100644
index 000000000000..f4e90d649a71
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yamale/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, pytestCheckHook
+, pyyaml
+, ruamel-yaml
+}:
+
+buildPythonPackage rec {
+  pname = "yamale";
+  version = "4.0.4";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "23andMe";
+    repo = pname;
+    rev = version;
+    hash = "sha256-1GFvgfy3MDsJGKSEm0yaQoLM7VqIS2wphw16trNTUOc=";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+    ruamel-yaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "yamale"
+  ];
+
+  meta = with lib; {
+    description = "A schema and validator for YAML";
+    homepage = "https://github.com/23andMe/Yamale";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rtburns-jpl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yamlfix/default.nix b/nixpkgs/pkgs/development/python-modules/yamlfix/default.nix
new file mode 100644
index 000000000000..122a39d82615
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yamlfix/default.nix
@@ -0,0 +1,55 @@
+{ lib
+, buildPythonPackage
+, click
+, fetchFromGitHub
+, maison
+, pdm-pep517
+, pytest-xdist
+, pytestCheckHook
+, pythonOlder
+, ruyaml
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "yamlfix";
+  version = "1.13.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "lyz-code";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-GoCQtanQHYOFrhRvZjzk/cCPnUFwYUAclZuYGZfNg5E=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    pdm-pep517
+  ];
+
+  propagatedBuildInputs = [
+    click
+    maison
+    ruyaml
+  ];
+
+  nativeCheckInputs = [
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "yamlfix"
+  ];
+
+  meta = with lib; {
+    description = "Python YAML formatter that keeps your comments";
+    homepage = "https://github.com/lyz-code/yamlfix";
+    changelog = "https://github.com/lyz-code/yamlfix/blob/${version}/CHANGELOG.md";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ koozz ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yamllint/default.nix b/nixpkgs/pkgs/development/python-modules/yamllint/default.nix
new file mode 100644
index 000000000000..c5664846dcfc
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yamllint/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, setuptools
+, pathspec
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+, stdenv
+}:
+
+buildPythonPackage rec {
+  pname = "yamllint";
+  version = "1.33.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "adrienverge";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-hWN5PhEAhckp250Dj7h5PpyH/E1jCi38O4VmMYgPtzE=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    pyyaml
+    pathspec
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # test failure reported upstream: https://github.com/adrienverge/yamllint/issues/373
+    "test_find_files_recursively"
+  ] ++ lib.optionals stdenv.isDarwin [
+    # locale tests are broken on BSDs; see https://github.com/adrienverge/yamllint/issues/307
+    "test_locale_accents"
+    "test_locale_case"
+    "test_run_with_locale"
+  ];
+
+  pythonImportsCheck = [ "yamllint" ];
+
+  meta = with lib; {
+    description = "A linter for YAML files";
+    homepage = "https://github.com/adrienverge/yamllint";
+    changelog = "https://github.com/adrienverge/yamllint/blob/v${version}/CHANGELOG.rst";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ jonringer mikefaille ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yamlloader/default.nix b/nixpkgs/pkgs/development/python-modules/yamlloader/default.nix
new file mode 100644
index 000000000000..d838233a7234
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yamlloader/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytest
+, pyyaml
+, hypothesis
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "yamlloader";
+  version = "1.3.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-fb2YQh2AkMUhZV8bBsoDAGfynfUlOoh4EmvOOpD1aBc=";
+  };
+
+  propagatedBuildInputs = [
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+    pytest
+  ];
+
+  pythonImportsCheck = [
+    "yaml"
+    "yamlloader"
+  ];
+
+  meta = with lib; {
+    description = "A case-insensitive list for Python";
+    homepage = "https://github.com/Phynix/yamlloader";
+    changelog = "https://github.com/Phynix/yamlloader/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ freezeboy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yamlordereddictloader/default.nix b/nixpkgs/pkgs/development/python-modules/yamlordereddictloader/default.nix
new file mode 100644
index 000000000000..631d61e3f594
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yamlordereddictloader/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "yamlordereddictloader";
+  version = "0.4.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-Nq8vYhD8/12k/EwS4dgV+XPc60EETnleHwYRXWNLyhM=";
+  };
+
+  propagatedBuildInputs = [ pyyaml ];
+
+  # no tests
+  doCheck = false;
+
+  pythonImportsCheck = [ "yamlordereddictloader" ];
+
+  meta = with lib; {
+    description = "YAML loader and dump for PyYAML allowing to keep keys order";
+    homepage = "https://github.com/fmenabe/python-yamlordereddictloader";
+    license = licenses.mit;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yanc/default.nix b/nixpkgs/pkgs/development/python-modules/yanc/default.nix
new file mode 100644
index 000000000000..dfe590390166
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yanc/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, pythonOlder, fetchPypi, nose }:
+
+buildPythonPackage rec {
+  pname = "yanc";
+  version = "0.3.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0z35bkk9phs40lf5061k1plhjdl5fskm0dmdikrsqi1bjihnxp8w";
+  };
+
+  # Tests fail on Python>=3.5. See: https://github.com/0compute/yanc/issues/10
+  doCheck = pythonOlder "3.5";
+
+  nativeCheckInputs = [ nose ];
+
+  checkPhase = ''
+    nosetests .
+  '';
+
+  meta = with lib; {
+    description = "Yet another nose colorer";
+    homepage = "https://github.com/0compute/yanc";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ jluttine ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yangson/default.nix b/nixpkgs/pkgs/development/python-modules/yangson/default.nix
new file mode 100644
index 000000000000..00cdf026c46f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yangson/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools-scm
+, elementpath
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "yangson";
+  version = "1.4.19";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-rYUxv3TEdyr2D3UEmmHcJJtlG6gXJnp1c2pez4H13SU=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    elementpath
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "yangson"
+  ];
+
+  meta = with lib; {
+    description = "Library for working with data modelled in YANG";
+    homepage = "https://github.com/CZ-NIC/yangson";
+    license = with licenses; [
+      gpl3Plus
+      lgpl3Plus
+    ];
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yapf/default.nix b/nixpkgs/pkgs/development/python-modules/yapf/default.nix
new file mode 100644
index 000000000000..6e402627245b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yapf/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, nose
+, importlib-metadata
+, platformdirs
+, tomli
+}:
+
+buildPythonPackage rec {
+  pname = "yapf";
+  version = "0.40.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-lYWH61yOxshgEZqcJdAq3fMKRPdaoVKkIg0w5WqYA3w=";
+  };
+
+  # nose is unavailable on pypy
+  doCheck = !isPyPy;
+
+  propagatedBuildInputs = [
+    importlib-metadata
+    platformdirs
+    tomli
+  ];
+
+  nativeCheckInputs = [
+    nose
+  ];
+
+  meta = {
+    homepage = "https://github.com/google/yapf";
+    description = "Yet Another Python Formatter";
+    longDescription = ''
+      Most of the current formatters for Python --- e.g., autopep8, and pep8ify
+      --- are made to remove lint errors from code. This has some obvious
+      limitations. For instance, code that conforms to the PEP 8 guidelines may
+      not be reformatted. But it doesn't mean that the code looks good.
+
+      YAPF takes a different approach. It's based off of 'clang-format',
+      developed by Daniel Jasper. In essence, the algorithm takes the code and
+      reformats it to the best formatting that conforms to the style guide, even
+      if the original code didn't violate the style guide. The idea is also
+      similar to the 'gofmt' tool for the Go programming language: end all holy
+      wars about formatting - if the whole codebase of a project is simply piped
+      through YAPF whenever modifications are made, the style remains consistent
+      throughout the project and there's no point arguing about style in every
+      code review.
+
+      The ultimate goal is that the code YAPF produces is as good as the code
+      that a programmer would write if they were following the style guide. It
+      takes away some of the drudgery of maintaining your code.
+    '';
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ AndersonTorres siddharthist ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yappi/default.nix b/nixpkgs/pkgs/development/python-modules/yappi/default.nix
new file mode 100644
index 000000000000..cb12c4f63f37
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yappi/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, gevent
+, python
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "yappi";
+  version = "1.4.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "sumerc";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-AogBnqhLcwsyTHLP+Uxc+EOgYzhdwX5rbi9RMCuC2IU=";
+  };
+
+  patches = [
+    ./tests.patch
+  ];
+
+  nativeCheckInputs = [
+    gevent
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} run_tests.py
+  '';
+
+  pythonImportsCheck = [
+    "yappi"
+  ];
+
+  meta = with lib; {
+    description = "Python profiler that supports multithreading and measuring CPU time";
+    homepage = "https://github.com/sumerc/yappi";
+    license = licenses.mit;
+    maintainers = with maintainers; [ orivej ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yappi/tests.patch b/nixpkgs/pkgs/development/python-modules/yappi/tests.patch
new file mode 100644
index 000000000000..96419e01a26e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yappi/tests.patch
@@ -0,0 +1,14 @@
+--- a/tests/test_functionality.py
++++ b/tests/test_functionality.py
+@@ -262,1 +262,2 @@ class BasicUsage(utils.YappiUnitTestCase):
++    @unittest.skip('wall-clock-time-sensitive')
+     def test_get_clock(self):
+@@ -363,2 +363,3 @@ class BasicUsage(utils.YappiUnitTestCase):
+     @unittest.skipIf(os.name == "nt", "do not run on Windows")
++    @unittest.skip('broken-path')
+     def test_run_as_script(self):
+--- a/tests/test_hooks.py
++++ b/tests/test_hooks.py
+@@ -127,1 +127,2 @@ class ContextIdCallbackTest(utils.YappiUnitTestCase):
++    @unittest.skip('wall-clock-time-sensitive')
+     def test_pause_resume(self):
diff --git a/nixpkgs/pkgs/development/python-modules/yapsy/default.nix b/nixpkgs/pkgs/development/python-modules/yapsy/default.nix
new file mode 100644
index 000000000000..8a0e4211742e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yapsy/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, stdenv
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "yapsy";
+  version = "1.12.2";
+
+  src = fetchPypi {
+    pname = "Yapsy";
+    inherit version;
+    sha256 = "12rznbnswfw0w7qfbvmmffr9r317gl1rqg36nijwzsklkjgks4fq";
+  };
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  pythonImportsCheck = [ "yapsy" ];
+
+  meta = with lib; {
+    homepage = "https://yapsy.sourceforge.net/";
+    description = "Yet another plugin system";
+    license = licenses.bsd0;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yara-python/default.nix b/nixpkgs/pkgs/development/python-modules/yara-python/default.nix
new file mode 100644
index 000000000000..403ee6df52bd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yara-python/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+, yara
+}:
+
+buildPythonPackage rec {
+  pname = "yara-python";
+  version = "4.3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "VirusTotal";
+    repo = "yara-python";
+    rev = "v${version}";
+    hash = "sha256-WjH27pOOBXmbj8ghr42TLTp8eAKiTq4eRTYnim56J/8=";
+  };
+
+  buildInputs = [
+    yara
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  setupPyBuildFlags = [
+    "--dynamic-linking"
+  ];
+
+  pytestFlagsArray = [
+    "tests.py"
+  ];
+
+  pythonImportsCheck = [
+    "yara"
+  ];
+
+  meta = with lib; {
+    description = "Python interface for YARA";
+    homepage = "https://github.com/VirusTotal/yara-python";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yaramod/default.nix b/nixpkgs/pkgs/development/python-modules/yaramod/default.nix
new file mode 100644
index 000000000000..1f459858dfa0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yaramod/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, buildPythonPackage
+, cmake
+, fetchFromGitHub
+, pytestCheckHook
+, libxcrypt
+, pythonOlder
+, gtest
+, pybind11
+, nlohmann_json
+}:
+
+let
+  pog = fetchFromGitHub {
+    owner = "metthal";
+    repo = "pog";
+    rev = "b09bbf9cea573ee62aab7eccda896e37961d16cd";
+    hash = "sha256-El4WA92t2O/L4wUqH6Xj8w+ANtb6liRwafDhqn8jxjQ=";
+  };
+in
+  buildPythonPackage rec {
+    pname = "yaramod";
+    version = "3.20.2";
+    format = "setuptools";
+
+    disabled = pythonOlder "3.7";
+
+    src = fetchFromGitHub {
+      owner = "avast";
+      repo = pname;
+      rev = "refs/tags/v${version}";
+      hash = "sha256-OLsTvG+qaUJlKdHwswGBifzoT/uNunrrVWQg7hJxkhE=";
+    };
+
+    postPatch = ''
+      rm -r deps/googletest deps/pog/ deps/pybind11/ deps/json/json.hpp
+      cp -r --no-preserve=all ${pog} deps/pog/
+      cp -r --no-preserve=all ${nlohmann_json.src}/single_include/nlohmann/json.hpp deps/json/
+      cp -r --no-preserve=all ${pybind11.src} deps/pybind11/
+      cp -r --no-preserve=all ${gtest.src} deps/googletest/
+    '';
+
+    dontUseCmakeConfigure = true;
+
+    buildInputs = [
+      libxcrypt
+    ];
+
+    nativeBuildInputs = [
+      cmake
+      pog
+      gtest
+    ];
+
+    setupPyBuildFlags = [
+      "--with-unit-tests"
+    ];
+
+    checkInputs = [
+      pytestCheckHook
+    ];
+
+    pytestFlagsArray = [
+      "tests/"
+    ];
+
+    pythonImportsCheck = [
+      "yaramod"
+    ];
+
+    meta = with lib; {
+      description = "Parsing of YARA rules into AST and building new rulesets in C++";
+      homepage = "https://github.com/avast/yaramod";
+      changelog = "https://github.com/avast/yaramod/blob/v${version}/CHANGELOG.md";
+      license = licenses.mit;
+      maintainers = with maintainers; [ msm ];
+    };
+  }
diff --git a/nixpkgs/pkgs/development/python-modules/yarg/default.nix b/nixpkgs/pkgs/development/python-modules/yarg/default.nix
new file mode 100644
index 000000000000..6368fbc463cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yarg/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildPythonPackage, fetchFromGitHub, requests, nose, mock }:
+
+buildPythonPackage rec {
+  pname = "yarg";
+  version = "0.1.9";
+
+  src = fetchFromGitHub {
+    owner = "kura";
+    repo = pname;
+    rev = version;
+    sha256 = "1isq02s404fp9whkm8w2kvb2ik1sz0r258iby0q532zw81lga0d0";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  nativeCheckInputs = [ nose mock ];
+  checkPhase = ''
+    nosetests
+  '';
+
+  meta = with lib; {
+    description = "An easy to use PyPI client";
+    homepage = "https://yarg.readthedocs.io";
+    license = licenses.mit;
+    maintainers = with maintainers; [ psyanticy ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yargy/default.nix b/nixpkgs/pkgs/development/python-modules/yargy/default.nix
new file mode 100644
index 000000000000..30ada41f87b0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yargy/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pymorphy2
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "yargy";
+  version = "0.16.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-yRfu+zKkDCPEa2yojWiScHLdAKuU6Q/V3GqwpitZtZM=";
+  };
+
+  propagatedBuildInputs = [ pymorphy2 ];
+  pythonImportCheck = [ "yargy" ];
+  nativeCheckInputs = [ pytestCheckHook ];
+  pytestFlagsArray = [ "tests" ];
+
+  meta = with lib; {
+    description = "Rule-based facts extraction for Russian language";
+    homepage = "https://github.com/natasha/yargu";
+    license = licenses.mit;
+    maintainers = with maintainers; [ npatsakula ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yark/default.nix b/nixpkgs/pkgs/development/python-modules/yark/default.nix
new file mode 100644
index 000000000000..f7b9f696d6cf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yark/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, poetry-core
+, pythonRelaxDepsHook
+, click
+, colorama
+, flask
+, requests
+, yt-dlp
+, progress
+}:
+
+buildPythonPackage rec {
+  pname = "yark";
+  version = "1.2.9";
+
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-g9JwFnB4tFuvRvQGEURbIB2gaXQgCQJkL1sNmYMFvck=";
+  };
+
+  pythonRelaxDeps = [
+    "requests"
+  ];
+
+  nativeBuildInputs = [
+    poetry-core
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    click
+    colorama
+    flask
+    progress
+    requests
+    yt-dlp
+  ];
+
+  # There aren't any unit tests. If test discovery runs, it will crash, halting the build.
+  # When upstream adds unit tests, please configure them here. Thanks! ~ C.
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "yark"
+  ];
+
+  meta = with lib; {
+    description = "YouTube archiving made simple";
+    homepage = "https://github.com/Owez/yark";
+    license = licenses.mit;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yarl/default.nix b/nixpkgs/pkgs/development/python-modules/yarl/default.nix
new file mode 100644
index 000000000000..c4d8dac9995c
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yarl/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, pythonAtLeast
+, pythonOlder
+, idna
+, multidict
+, typing-extensions
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "yarl";
+  version = "1.9.2";
+
+  disabled = pythonOlder "3.7";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-BKudS59YfAbYAcKr/pMXt3zfmWxlqQ1ehOzEUBCCNXE=";
+  };
+
+  patches = [
+    # https://github.com/aio-libs/yarl/issues/876
+    (fetchpatch {
+      url = "https://github.com/aio-libs/yarl/commit/0a94c6e4948e00fff072c0cf367afbf4ac36f906.patch";
+      hash = "sha256-bqT46OLZLkBef8FQ1L95ITD70mC3+WIkr3+h2ekKrvE=";
+    })
+  ];
+
+  postPatch = ''
+    sed -i '/^addopts/d' setup.cfg
+  '';
+
+  propagatedBuildInputs = [
+    idna
+    multidict
+  ] ++ lib.optionals (pythonOlder "3.8") [
+    typing-extensions
+  ];
+
+  preCheck = ''
+    # don't import yarl from ./ so the C extension is available
+    pushd tests
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postCheck = ''
+    popd
+  '';
+
+  pythonImportsCheck = [ "yarl" ];
+
+  meta = with lib; {
+    changelog = "https://github.com/aio-libs/yarl/blob/v${version}/CHANGES.rst";
+    description = "Yet another URL library";
+    homepage = "https://github.com/aio-libs/yarl";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yasi/default.nix b/nixpkgs/pkgs/development/python-modules/yasi/default.nix
new file mode 100644
index 000000000000..8759e499b639
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yasi/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonApplication
+, colorama
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonApplication rec {
+  pname = "yasi";
+  version = "2.1.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "nkmathew";
+    repo = "yasi-sexp-indenter";
+    rev = "v${version}";
+    hash = "sha256-xKhVTmh/vrtBkatxtk8R4yqbGroH0I+xTKNYUpuikt4=";
+  };
+
+  propagatedBuildInputs = [
+    colorama
+  ];
+
+  nativeBuildInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "test.test_yasi" "tests.test_yasi"
+  '';
+
+  pythonImportsCheck = [ "yasi" ];
+
+  meta = with lib; {
+    description = "A dialect-aware s-expression indenter written in Python and newLISP";
+    homepage = "https://github.com/nkmathew/yasi-sexp-indenter";
+    changelog = "https://github.com/nkmathew/yasi-sexp-indenter/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ kranzes ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yaspin/default.nix b/nixpkgs/pkgs/development/python-modules/yaspin/default.nix
new file mode 100644
index 000000000000..c90da30a746b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yaspin/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, termcolor
+}:
+
+buildPythonPackage rec {
+  pname = "yaspin";
+  version = "3.0.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pavdmyt";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-cYTCJyHZ9yNg6BfpZ+g3P0yMWFhYUxgYtlbANNgfohQ=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    termcolor
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # https://github.com/pavdmyt/yaspin/pull/212
+    substituteInPlace pyproject.toml \
+      --replace 'termcolor-whl = "1.1.2"' 'termcolor = "*"'
+  '';
+
+  pythonImportsCheck = [
+    "yaspin"
+  ];
+
+  meta = with lib; {
+    description = "Yet Another Terminal Spinner";
+    homepage = "https://github.com/pavdmyt/yaspin";
+    license = licenses.mit;
+    maintainers = with maintainers; [ samuela ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yaswfp/default.nix b/nixpkgs/pkgs/development/python-modules/yaswfp/default.nix
new file mode 100644
index 000000000000..8b7843d91752
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yaswfp/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "yaswfp";
+  version = "unstable-20210331";
+
+  src = fetchFromGitHub {
+    owner = "facundobatista";
+    repo = pname;
+    rev = "2a2cc6ca4c0b4d52bd2e658fb5f80fdc0db4924c";
+    sha256 = "1dxdz89hlycy1rnn269fwl1f0qxgxqarkc0ivs2m77f8xba2qgj9";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "yaswfp" ];
+
+  meta = with lib; {
+    description = "Python SWF Parser";
+    homepage = "https://github.com/facundobatista/yaswfp";
+    license = with licenses; [ gpl3Only ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yattag/default.nix b/nixpkgs/pkgs/development/python-modules/yattag/default.nix
new file mode 100644
index 000000000000..c66f85cc1583
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yattag/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "yattag";
+  version = "1.15.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-qtn1QL0i3FA+W1UGzEeFb6zwgapx/TX3JzcbY+HkAr8=";
+  };
+
+  pythonImportsCheck = [
+    "yattag"
+  ];
+
+  meta = with lib; {
+    description = "Library to generate HTML or XML";
+    homepage = "https://www.yattag.org/";
+    license = licenses.lgpl21Only;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ydiff/default.nix b/nixpkgs/pkgs/development/python-modules/ydiff/default.nix
new file mode 100644
index 000000000000..46490a098eb8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ydiff/default.nix
@@ -0,0 +1,48 @@
+{ lib, buildPythonPackage, fetchPypi, docutils, pygments
+, gitMinimal, mercurial, subversion, patchutils, less
+}:
+
+buildPythonPackage rec {
+  pname = "ydiff";
+  version = "1.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "f5430577ecd30974d766ee9b8333e06dc76a947b4aae36d39612a0787865a121";
+  };
+
+  patchPhase = ''
+    substituteInPlace ydiff.py \
+      --replace "['git'" "['${gitMinimal}/bin/git'" \
+      --replace "['hg'" "['${mercurial}/bin/hg'" \
+      --replace "['svn'" "['${subversion}/bin/svn'" \
+      --replace "['filterdiff'" "['${patchutils}/bin/filterdiff'" \
+      --replace "['less'" "['${less}/bin/less'" # doesn't support PAGER from env
+    substituteInPlace tests/test_ydiff.py \
+      --replace /bin/rm rm \
+      --replace /bin/sh sh
+    patchShebangs setup.py
+    patchShebangs tests/*.sh
+  '';
+
+  nativeCheckInputs = [ docutils pygments ];
+
+  checkPhase = ''
+    runHook preCheck
+    make doc-check reg # We don't want the linter or coverage check.
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "View colored, incremental diff in workspace or from stdin with side by side and auto pager support (Was \"cdiff\")";
+    longDescription = ''
+      Term based tool to view colored, incremental diff in a version
+      controlled workspace (supports Git, Mercurial, Perforce and Svn
+      so far) or from stdin, with side by side (similar to diff -y)
+      and auto pager support.
+    '';
+    homepage = "https://github.com/ymattw/ydiff";
+    license = licenses.bsd3;
+    maintainers = (with maintainers; [ leenaars ]) ++ teams.deshaw.members;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yeelight/default.nix b/nixpkgs/pkgs/development/python-modules/yeelight/default.nix
new file mode 100644
index 000000000000..12fb6ffccc72
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yeelight/default.nix
@@ -0,0 +1,54 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, fetchFromGitLab
+, flit-core
+, future
+, ifaddr
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "yeelight";
+  version = "0.7.14";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitLab {
+    owner = "stavros";
+    repo = "python-yeelight";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-BnMvRs95rsmoBa/5bp0zShgU1BBHtZzyADjbH0y1d/o=";
+  };
+
+  nativeBuildInputs = [ flit-core ];
+
+  propagatedBuildInputs = [
+    future
+    ifaddr
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    async-timeout
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "yeelight/tests.py"
+  ];
+
+  pythonImportsCheck = [
+    "yeelight"
+  ];
+
+  meta = with lib; {
+    description = "Python library for controlling YeeLight RGB bulbs";
+    homepage = "https://gitlab.com/stavros/python-yeelight/";
+    changelog = "https://gitlab.com/stavros/python-yeelight/-/blob/v${version}/CHANGELOG.md";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ nyanloutre ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yfinance/default.nix b/nixpkgs/pkgs/development/python-modules/yfinance/default.nix
new file mode 100644
index 000000000000..500dbcefb1e5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yfinance/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, appdirs
+, beautifulsoup4
+, buildPythonPackage
+, cryptography
+, fetchFromGitHub
+, frozendict
+, html5lib
+, multitasking
+, numpy
+, pandas
+, peewee
+, pythonOlder
+, requests
+, lxml
+}:
+
+buildPythonPackage rec {
+  pname = "yfinance";
+  version = "0.2.32";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "ranaroussi";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-sEEYi2qp3LcgBxN0tlbmOaCpkjiDO80lFIaY0qdbuoo=";
+  };
+
+  propagatedBuildInputs = [
+    appdirs
+    beautifulsoup4
+    cryptography
+    frozendict
+    html5lib
+    lxml
+    multitasking
+    numpy
+    pandas
+    peewee
+    requests
+  ];
+
+  # Tests require internet access
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "yfinance"
+  ];
+
+  meta = with lib; {
+    description = "Module to doiwnload Yahoo! Finance market data";
+    homepage = "https://github.com/ranaroussi/yfinance";
+    changelog = "https://github.com/ranaroussi/yfinance/blob/${version}/CHANGELOG.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ drewrisinger ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yolink-api/default.nix b/nixpkgs/pkgs/development/python-modules/yolink-api/default.nix
new file mode 100644
index 000000000000..8b27812166a0
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yolink-api/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aiohttp
+, aiomqtt
+, buildPythonPackage
+, fetchFromGitHub
+, pydantic
+, pythonOlder
+, setuptools
+, tenacity
+}:
+
+buildPythonPackage rec {
+  pname = "yolink-api";
+  version = "0.3.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "YoSmart-Inc";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-bxaxjUKmhScku9mBjtuwiaT4TLTsRlro3y/XatyAfs0=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    aiomqtt
+    pydantic
+    tenacity
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "yolink"
+  ];
+
+  meta = with lib; {
+    description = "Library to interface with Yolink";
+    homepage = "https://github.com/YoSmart-Inc/yolink-api";
+    changelog = "https://github.com/YoSmart-Inc/yolink-api/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/youless-api/default.nix b/nixpkgs/pkgs/development/python-modules/youless-api/default.nix
new file mode 100644
index 000000000000..3fc465d9bad1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/youless-api/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromBitbucket
+, pythonOlder
+, certifi
+, chardet
+, idna
+, nose
+, requests
+, urllib3
+}:
+
+buildPythonPackage rec {
+  pname = "youless-api";
+  version = "1.0.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromBitbucket {
+    owner = "jongsoftdev";
+    repo = "youless-python-bridge";
+    rev = version;
+    hash = "sha256-49/HmkGr87aDhr8GEtARpXvr2RcgmLdAqhvMLI5x+vQ=";
+  };
+
+  propagatedBuildInputs = [
+    certifi
+    chardet
+    idna
+    requests
+    urllib3
+  ];
+
+  nativeCheckInputs = [
+    nose
+  ];
+
+  pythonImportsCheck = [
+    "youless_api"
+  ];
+
+  meta = with lib; {
+    description = "Python library for YouLess sensors";
+    homepage = "https://pypi.org/project/youless-api/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/youtube-search-python/default.nix b/nixpkgs/pkgs/development/python-modules/youtube-search-python/default.nix
new file mode 100644
index 000000000000..11da850c992d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/youtube-search-python/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+, httpx
+}:
+
+buildPythonPackage rec {
+  pname = "youtube-search-python";
+  version = "1.6.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-RWjR12ns1+tLuDZfBO7G42TF9w7sezdl9UPa67E1/PU=";
+  };
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  pythonImportsCheck = [
+    "youtubesearchpython"
+  ];
+
+  # Project has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Search for YouTube videos, channels & playlists & get video information using link without YouTube Data API";
+    homepage = "https://github.com/alexmercerind/youtube-search-python";
+    license = licenses.mit;
+    maintainers = with maintainers; [ marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/youtube-search/default.nix b/nixpkgs/pkgs/development/python-modules/youtube-search/default.nix
new file mode 100644
index 000000000000..215b9516c650
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/youtube-search/default.nix
@@ -0,0 +1,37 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "youtube-search";
+  version = "2.1.2";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-V0mm2Adv2mVVfJE2fw+rCTYpDs3qRXyDHJ8/BZGKOqI=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # Tests require network connection
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "youtube_search"
+  ];
+
+  meta = with lib; {
+    description = "Tool for searching for youtube videos to avoid using their heavily rate-limited API";
+    homepage = "https://github.com/joetats/youtube_search";
+    license = licenses.mit;
+    maintainers = with maintainers; [ j0hax ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/youtube-transcript-api/default.nix b/nixpkgs/pkgs/development/python-modules/youtube-transcript-api/default.nix
new file mode 100644
index 000000000000..560810323f2d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/youtube-transcript-api/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, requests
+, mock
+, httpretty
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "youtube-transcript-api";
+  version = "0.6.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jdepoix";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-7s2qzmfYkaQ7xAi/U+skOEVTAj2gp+2WnODu9k1ojJY=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  nativeCheckInputs = [
+    mock
+    httpretty
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "youtube_transcript_api"
+  ];
+
+  meta = with lib; {
+    description = "Python API which allows you to get the transcripts/subtitles for a given YouTube video";
+    homepage = "https://github.com/jdepoix/youtube-transcript-api";
+    changelog = "https://github.com/jdepoix/youtube-transcript-api/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yowsup/default.nix b/nixpkgs/pkgs/development/python-modules/yowsup/default.nix
new file mode 100644
index 000000000000..b95445192468
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yowsup/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, buildPythonPackage
+, isPy3k
+, fetchFromGitHub
+, appdirs
+, consonance
+, protobuf
+, python-axolotl
+, six
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "yowsup";
+  version = "3.3.0";
+
+  # The Python 2.x support of this package is incompatible with `six==1.11`:
+  # https://github.com/tgalal/yowsup/issues/2416#issuecomment-365113486
+  disabled = !isPy3k;
+
+  src = fetchFromGitHub {
+    owner = "tgalal";
+    repo = "yowsup";
+    rev = "v${version}";
+    sha256 = "1pz0r1gif15lhzdsam8gg3jm6zsskiv2yiwlhaif5rl7lv3p0v7q";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "argparse" "" \
+      --replace "==" ">=" \
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  propagatedBuildInputs = [
+    appdirs
+    consonance
+    protobuf
+    python-axolotl
+    six
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/tgalal/yowsup";
+    description = "The python WhatsApp library";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yoyo-migrations/default.nix b/nixpkgs/pkgs/development/python-modules/yoyo-migrations/default.nix
new file mode 100644
index 000000000000..eb79d8ac0c9a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yoyo-migrations/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, importlib-metadata
+, setuptools
+, sqlparse
+, tabulate
+}:
+
+buildPythonPackage rec {
+  pname = "yoyo-migrations";
+  version = "8.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ggYGoD4mLPHNT1niVsKPpEZCUiTVuCo9EnX9eBeFI+Q=";
+  };
+
+  propagatedBuildInputs = [
+    importlib-metadata
+    setuptools
+    sqlparse
+    tabulate
+  ];
+
+  doCheck = false; # pypi tarball does not contain tests
+
+  pythonImportsCheck = [ "yoyo" ];
+
+  meta = with lib; {
+    description = "Database schema migration tool";
+    homepage = "https://ollycope.com/software/yoyo";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ypy-websocket/default.nix b/nixpkgs/pkgs/development/python-modules/ypy-websocket/default.nix
new file mode 100644
index 000000000000..b1840800622f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ypy-websocket/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, hatchling
+, aiosqlite
+, anyio
+, y-py
+, pytest-asyncio
+, pytestCheckHook
+, pythonRelaxDepsHook
+, uvicorn
+, websockets
+}:
+
+buildPythonPackage rec {
+  pname = "ypy-websocket";
+  version = "0.12.4";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "y-crdt";
+    repo = "ypy-websocket";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-48x+MUhev9dErC003XOP3oGKd5uOghlBFgcR8Nm/0xs=";
+  };
+
+  pythonRelaxDeps = [
+    "aiofiles"
+  ];
+
+  nativeBuildInputs = [
+    hatchling
+    pythonRelaxDepsHook
+  ];
+
+  propagatedBuildInputs = [
+    aiosqlite
+    anyio
+    y-py
+  ];
+
+  pythonImportsCheck = [
+    "ypy_websocket"
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    uvicorn
+    websockets
+  ];
+
+  disabledTestPaths = [
+    # requires installing yjs Node.js module
+    "tests/test_ypy_yjs.py"
+  ];
+
+  meta = {
+    changelog = "https://github.com/y-crdt/ypy-websocket/blob/${src.rev}/CHANGELOG.md";
+    description = "WebSocket Connector for Ypy";
+    homepage = "https://github.com/y-crdt/ypy-websocket";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yq/default.nix b/nixpkgs/pkgs/development/python-modules/yq/default.nix
new file mode 100644
index 000000000000..cae85c51f4db
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yq/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, argcomplete
+, buildPythonPackage
+, fetchPypi
+, jq
+, pytestCheckHook
+, pyyaml
+, setuptools-scm
+, substituteAll
+, tomlkit
+, xmltodict
+}:
+
+buildPythonPackage rec {
+  pname = "yq";
+  version = "3.2.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Kcj+HTa09kFj9NATFMauIXU5hw9hAhbe5gJd+16vr7E=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./jq-path.patch;
+      jq = "${lib.getBin jq}/bin/jq";
+    })
+  ];
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    argcomplete
+    pyyaml
+    tomlkit
+    xmltodict
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [ "test/test.py" ];
+
+  pythonImportsCheck = [ "yq" ];
+
+  meta = with lib; {
+    description = "Command-line YAML/XML/TOML processor - jq wrapper for YAML, XML, TOML documents";
+    homepage = "https://github.com/kislyuk/yq";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ womfoo SuperSandro2000 ];
+    mainProgram = "yq";
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yq/jq-path.patch b/nixpkgs/pkgs/development/python-modules/yq/jq-path.patch
new file mode 100644
index 000000000000..bd2967b6ab02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yq/jq-path.patch
@@ -0,0 +1,26 @@
+diff --git a/test/test.py b/test/test.py
+index db674a4..b6c797e 100755
+--- a/test/test.py
++++ b/test/test.py
+@@ -130,7 +130,7 @@ class TestYq(unittest.TestCase):
+                 tf2.seek(0)
+                 self.assertEqual(self.run_yq("", ["-y", arg, tf.name, self.fd_path(tf2)]), "1\n...\n")
+ 
+-    @unittest.skipIf(subprocess.check_output(["jq", "--version"]) < b"jq-1.6", "Test options introduced in jq 1.6")
++    @unittest.skipIf(subprocess.check_output(["@jq@", "--version"]) < b"jq-1.6", "Test options introduced in jq 1.6")
+     def test_jq16_arg_passthrough(self):
+         self.assertEqual(
+             self.run_yq("{}", ["--indentless", "-y", ".a=$ARGS.positional", "--args", "a", "b"]), "a:\n- a\n- b\n"
+diff --git a/yq/__init__.py b/yq/__init__.py
+index 0ccb8e8..8342ff0 100644
+--- a/yq/__init__.py
++++ b/yq/__init__.py
+@@ -206,7 +206,7 @@ def yq(
+         # Notes: universal_newlines is just a way to induce subprocess to make stdin a text buffer and encode it for us;
+         # close_fds must be false for command substitution to work (yq . t.yml --slurpfile t <(yq . t.yml))
+         jq = subprocess.Popen(
+-            ["jq"] + list(jq_args),
++            ["@jq@"] + list(jq_args),
+             stdin=subprocess.PIPE,
+             stdout=subprocess.PIPE if converting_output else None,
+             close_fds=False,
diff --git a/nixpkgs/pkgs/development/python-modules/yte/default.nix b/nixpkgs/pkgs/development/python-modules/yte/default.nix
new file mode 100644
index 000000000000..3280cc76803e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yte/default.nix
@@ -0,0 +1,59 @@
+{ lib
+, buildPythonPackage
+, dpath
+, fetchFromGitHub
+, plac
+, poetry-core
+, pytestCheckHook
+, pythonOlder
+, pyyaml
+}:
+
+buildPythonPackage rec {
+  pname = "yte";
+  version = "1.5.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "koesterlab";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-7erT5UpejPMIoyqhpYNEON3YWE2l5SdP2olOVpkbNkY=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    dpath
+    plac
+    pyyaml
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "yte"
+  ];
+
+  pytestFlagsArray = [
+    "tests.py"
+  ];
+
+  preCheck = ''
+    # The CLI test need yte on the PATH
+    export PATH=$out/bin:$PATH
+  '';
+
+  meta = with lib; {
+    description = "YAML template engine with Python expressions";
+    homepage = "https://github.com/koesterlab/yte";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ytmusicapi/default.nix b/nixpkgs/pkgs/development/python-modules/ytmusicapi/default.nix
new file mode 100644
index 000000000000..40af2c4fb629
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ytmusicapi/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, requests
+, setuptools
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "ytmusicapi";
+  version = "1.3.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "sigma67";
+    repo = "ytmusicapi";
+    rev = "refs/tags/${version}";
+    hash = "sha256-vDkrKVqyisPkswvfb+UPH95mehwNgyFxRmeT+1UHvXs=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+    setuptools-scm
+  ];
+
+  SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  doCheck = false; # requires network access
+
+  pythonImportsCheck = [
+    "ytmusicapi"
+  ];
+
+  meta = with lib; {
+    description = "Python API for YouTube Music";
+    homepage = "https://github.com/sigma67/ytmusicapi";
+    changelog = "https://github.com/sigma67/ytmusicapi/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yubico-client/default.nix b/nixpkgs/pkgs/development/python-modules/yubico-client/default.nix
new file mode 100644
index 000000000000..e8457055c180
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yubico-client/default.nix
@@ -0,0 +1,24 @@
+{ lib, buildPythonPackage, fetchPypi
+, requests }:
+
+buildPythonPackage rec {
+  pname = "yubico-client";
+  version = "1.13.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "e3b86cd2a123105edfacad40551c7b26e9c1193d81ffe168ee704ebfd3d11162";
+  };
+
+  propagatedBuildInputs = [ requests ];
+
+  # pypi package missing test_utils and github releases is behind
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Verifying Yubico OTPs based on the validation protocol version 2.0";
+    homepage = "https://github.com/Kami/python-yubico-client/";
+    maintainers= with maintainers; [ peterromfeldhk ];
+    license = licenses.bsd3;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/yubico/default.nix b/nixpkgs/pkgs/development/python-modules/yubico/default.nix
new file mode 100644
index 000000000000..0fe6a90bfd7f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/yubico/default.nix
@@ -0,0 +1,27 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, pytestCheckHook, pyusb }:
+
+buildPythonPackage rec {
+  pname = "python-yubico";
+  version = "1.3.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1gd3an1cdcq328nr1c9ijrsf32v0crv6dgq7knld8m9cadj517c7";
+  };
+
+  propagatedBuildInputs = [ pyusb ];
+
+  checkInputs = [ pytestCheckHook ];
+  pythonImportsCheck = [ "yubico" ];
+
+  disabledTests = [
+    "usb" # requires a physical yubikey to test
+  ];
+
+  meta = with lib; {
+    description = "Python code to talk to YubiKeys";
+    homepage    = "https://github.com/Yubico/python-yubico";
+    license     = licenses.bsd2;
+    maintainers = with maintainers; [ s1341 ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/z3c-checkversions/default.nix b/nixpkgs/pkgs/development/python-modules/z3c-checkversions/default.nix
new file mode 100644
index 000000000000..67c8c016e3f3
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/z3c-checkversions/default.nix
@@ -0,0 +1,34 @@
+{ stdenv
+, lib
+, buildPythonPackage
+, fetchPypi
+, python
+, zc-buildout
+, zope_testrunner
+}:
+
+buildPythonPackage rec {
+  pname = "z3c-checkversions";
+  version = "2.1";
+
+  src = fetchPypi {
+    inherit version;
+    pname = "z3c.checkversions";
+    hash = "sha256-j5So40SyJf7XfCz3P9YFR/6z94up3LY2/dfEmmIbxAk=";
+  };
+
+  propagatedBuildInputs = [ zc-buildout ];
+
+  nativeCheckInputs = [ zope_testrunner ];
+
+  checkPhase = ''
+    ${python.interpreter} -m zope.testrunner --test-path=src []
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/zopefoundation/z3c.checkversions";
+    changelog = "https://github.com/zopefoundation/z3c.checkversions/blob/${version}/CHANGES.rst";
+    description = "Find newer package versions on PyPI";
+    license = licenses.zpl21;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zadnegoale/default.nix b/nixpkgs/pkgs/development/python-modules/zadnegoale/default.nix
new file mode 100644
index 000000000000..64feef272491
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zadnegoale/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, aiohttp
+, aioresponses
+, buildPythonPackage
+, fetchFromGitHub
+, dacite
+, orjson
+, pytest-asyncio
+, pytest-error-for-skips
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "zadnegoale";
+  version = "0.7.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "bieniu";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-ij8xou8LXC4/BUTApIV6xSgb7ethwLyrHNJvBgxSBYM=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    dacite
+    orjson
+  ];
+
+  nativeCheckInputs = [
+    aioresponses
+    pytest-asyncio
+    pytest-error-for-skips
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "zadnegoale"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for getting allergen concentration data from Żadnego Ale servers";
+    homepage = "https://github.com/bieniu/zadnegoale";
+    changelog = "https://github.com/bieniu/zadnegoale/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zamg/default.nix b/nixpkgs/pkgs/development/python-modules/zamg/default.nix
new file mode 100644
index 000000000000..5138ebd1319a
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zamg/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aiohttp
+, aresponses
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "zamg";
+  version = "0.3.3";
+  pyproject = true;
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "killer0071234";
+    repo = "python-zamg";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-hgJtM208xsDh9RbxOFu5DOiKonLMj8aWyu9+EhpE6TA=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace " --cov" ""
+  '';
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "zamg"
+  ];
+
+  meta = with lib; {
+    description = "Library to read weather data from ZAMG Austria";
+    homepage = "https://github.com/killer0071234/python-zamg";
+    changelog = "https://github.com/killer0071234/python-zamg/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zarr/default.nix b/nixpkgs/pkgs/development/python-modules/zarr/default.nix
new file mode 100644
index 000000000000..78610073af01
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zarr/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, asciitree
+, buildPythonPackage
+, fasteners
+, fetchPypi
+, numcodecs
+, numpy
+, pytestCheckHook
+, pythonOlder
+, setuptools-scm
+}:
+
+buildPythonPackage rec {
+  pname = "zarr";
+  version = "2.16.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-QnbPS0plNDEELNU/8igrxNKSpoQkEeiFKZZFBPsHMoY=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = [
+    asciitree
+    numpy
+    fasteners
+    numcodecs
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "zarr"
+  ];
+
+  meta = with lib; {
+    description = "An implementation of chunked, compressed, N-dimensional arrays for Python";
+    homepage = "https://github.com/zarr-developers/zarr";
+    changelog = "https://github.com/zarr-developers/zarr-python/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zbaemon/default.nix b/nixpkgs/pkgs/development/python-modules/zbaemon/default.nix
new file mode 100644
index 000000000000..00f1c57abb03
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zbaemon/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zconfig
+}:
+
+buildPythonPackage rec {
+  pname = "zdaemon";
+  version = "4.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-SCHjvbRzh88eklWwREusQ3z3KqC1nRQHuTLjH9QyPvw=";
+  };
+
+  propagatedBuildInputs = [ zconfig ];
+
+  # too many deps..
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A daemon process control library and tools for Unix-based systems";
+    homepage = "https://pypi.python.org/pypi/zdaemon";
+    license = licenses.zpl20;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zc_lockfile/default.nix b/nixpkgs/pkgs/development/python-modules/zc_lockfile/default.nix
new file mode 100644
index 000000000000..70e2406ffa41
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zc_lockfile/default.nix
@@ -0,0 +1,26 @@
+{ buildPythonPackage
+, fetchPypi
+, mock
+, zope_testing
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "zc.lockfile";
+  version = "3.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-5Y/9ndYsbUMuhoK/oZbJDKw+XB4/JNrjuJ1ggihV14g=";
+  };
+
+  buildInputs = [ mock ];
+  propagatedBuildInputs = [ zope_testing ];
+
+  meta = with lib; {
+    description = "Inter-process locks";
+    homepage =  "https://www.python.org/pypi/zc.lockfile";
+    license = licenses.zpl20;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zcbor/default.nix b/nixpkgs/pkgs/development/python-modules/zcbor/default.nix
new file mode 100644
index 000000000000..21d6e7e790ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zcbor/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+
+# build dependencies
+, setuptools
+
+# dependencies
+, cbor2
+, pyyaml
+, regex
+}:
+
+buildPythonPackage rec {
+  pname = "zcbor";
+  version = "0.7.0";
+  pyproject = true;
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-0mGp7Hnq8ZNEUx/9eQ6UD9/cOuLl6S5Aif1qNh1+jYA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    cbor2
+    pyyaml
+    regex
+  ];
+
+  pythonImportsCheck = [ "zcbor" ];
+
+  meta = with lib; {
+    description = "A low footprint CBOR library in the C language (C++ compatible), tailored for use in microcontrollers";
+    homepage = "https://pypi.org/project/zcbor/";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ otavio ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zconfig/default.nix b/nixpkgs/pkgs/development/python-modules/zconfig/default.nix
new file mode 100644
index 000000000000..d02848c6b167
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zconfig/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, stdenv
+, fetchPypi
+, buildPythonPackage
+, zope_testrunner
+, manuel
+, docutils
+, pygments
+}:
+
+buildPythonPackage rec {
+  pname = "ZConfig";
+  version = "3.6.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-RCLH1mOvdizXeVd1NmvGpnq0QKGreW6w90JbDpA08HY=";
+  };
+
+  patches = lib.optional stdenv.hostPlatform.isMusl ./remove-setlocale-test.patch;
+
+  buildInputs = [ manuel docutils ];
+  propagatedBuildInputs = [ zope_testrunner ];
+  nativeCheckInputs = [ pygments ];
+
+  meta = with lib; {
+    description = "Structured Configuration Library";
+    homepage = "https://pypi.python.org/pypi/ZConfig";
+    license = licenses.zpl20;
+    maintainers = [ maintainers.goibhniu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zconfig/remove-setlocale-test.patch b/nixpkgs/pkgs/development/python-modules/zconfig/remove-setlocale-test.patch
new file mode 100644
index 000000000000..6b3d3266b21b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zconfig/remove-setlocale-test.patch
@@ -0,0 +1,24 @@
+From 43fd87037be1c98b6afa20f179f2e2d8ef5491ba Mon Sep 17 00:00:00 2001
+From: Will Dietz <w@wdtz.org>
+Date: Fri, 20 Jul 2018 10:07:22 -0500
+Subject: [PATCH] remove test that fails w/musl (setlocale() always succeeds)
+
+---
+ ZConfig/tests/test_datatypes.py | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/ZConfig/tests/test_datatypes.py b/ZConfig/tests/test_datatypes.py
+index 7c8d80c..addecd2 100644
+--- a/ZConfig/tests/test_datatypes.py
++++ b/ZConfig/tests/test_datatypes.py
+@@ -229,7 +229,6 @@ class DatatypeTestCase(unittest.TestCase):
+         convert = self.types.get("locale")
+         # Python supports "C" even when the _locale module is not available
+         self.assertEqual(convert("C"), "C")
+-        self.assertRaises(ValueError, convert, "locale-does-not-exist")
+ 
+     def test_datatype_port(self):
+         convert = self.types.get("port-number")
+-- 
+2.18.0
+
diff --git a/nixpkgs/pkgs/development/python-modules/zcs/default.nix b/nixpkgs/pkgs/development/python-modules/zcs/default.nix
new file mode 100644
index 000000000000..89ee7a239098
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zcs/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, python
+, yacs
+, boxx
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "zcs";
+  version = "0.1.25";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-/QIyRQtxLDVW+vcQi5bL8rJ0o3+OhqGhQEALR1YO1pg=";
+  };
+
+  patches = [
+    ./fix-test-yaml.patch
+  ];
+
+  propagatedBuildInputs = [
+    yacs
+  ];
+
+  pythonImportsCheck = [
+    "zcs"
+  ];
+
+  nativeCheckInputs = [
+    boxx
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} test/test_zcs.py
+  '';
+
+  meta = with lib; {
+    description = "Configuration system which takes advantage of both argparse and yacs";
+    homepage = "https://github.com/DIYer22/zcs";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lucasew ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zcs/fix-test-yaml.patch b/nixpkgs/pkgs/development/python-modules/zcs/fix-test-yaml.patch
new file mode 100644
index 000000000000..a046f1808296
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zcs/fix-test-yaml.patch
@@ -0,0 +1,13 @@
+diff --git a/test/test_zcs.py b/test/test_zcs.py
+index e4981d3..893999f 100644
+--- a/test/test_zcs.py
++++ b/test/test_zcs.py
+@@ -65,7 +65,7 @@ class TestCfgNode(unittest.TestCase):
+         cfg = self.cfg.clone()
+         yamlp = pathjoin(tmpboxx(), "test.yaml")
+         cfg.dump(yamlp)
+-        cfg_dict = yaml.load(open(yamlp))
++        cfg_dict = yaml.load(open(yamlp), yaml.Loader)
+         cfgd = CfgNode(cfg_dict)
+         self.assertTrue(str(cfg.dump()) == str(cfgd.dump()))
+ 
diff --git a/nixpkgs/pkgs/development/python-modules/zdaemon/default.nix b/nixpkgs/pkgs/development/python-modules/zdaemon/default.nix
new file mode 100644
index 000000000000..4434ceb09545
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zdaemon/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, zconfig
+}:
+
+buildPythonPackage rec {
+  pname = "zdaemon";
+  version = "5.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-ml7GxRmigLvPqPfnP04Q2AjnuCcQq2COD0Sb88BtQ9U=";
+  };
+
+  propagatedBuildInputs = [
+    zconfig
+  ];
+
+  # too many deps..
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "zdaemon"
+  ];
+
+  meta = with lib; {
+    description = "A daemon process control library and tools for Unix-based systems";
+    homepage = "https://pypi.python.org/pypi/zdaemon";
+    changelog = "https://github.com/zopefoundation/zdaemon/blob/${version}/CHANGES.rst";
+    license = licenses.zpl21;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zeep/default.nix b/nixpkgs/pkgs/development/python-modules/zeep/default.nix
new file mode 100644
index 000000000000..ab5f7b8147c8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zeep/default.nix
@@ -0,0 +1,90 @@
+{ lib
+, aiohttp
+, aioresponses
+, attrs
+, buildPythonPackage
+, defusedxml
+, fetchFromGitHub
+, freezegun
+, httpx
+, isodate
+, lxml
+, mock
+, platformdirs
+, pretend
+, pytest-asyncio
+, pytest-httpx
+, pytestCheckHook
+, pythonOlder
+, pytz
+, requests
+, requests-toolbelt
+, requests-file
+, requests-mock
+, xmlsec
+}:
+
+buildPythonPackage rec {
+  pname = "zeep";
+  version = "4.2.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "mvantellingen";
+    repo = "python-zeep";
+    rev = "refs/tags/${version}";
+    hash = "sha256-8f6kS231gbaZ8qyE8BKMcbnZsm8o2+iBoTlQrs5X+jY=";
+  };
+
+  propagatedBuildInputs = [
+    attrs
+    defusedxml
+    isodate
+    lxml
+    platformdirs
+    pytz
+    requests
+    requests-file
+    requests-toolbelt
+  ];
+
+  passthru.optional-dependencies = {
+    async_require = [
+      httpx
+    ];
+    xmlsec_require = [
+      xmlsec
+    ];
+  };
+
+  pythonImportsCheck = [
+    "zeep"
+  ];
+
+  nativeCheckInputs = [
+    aiohttp
+    aioresponses
+    freezegun
+    mock
+    pretend
+    pytest-asyncio
+    pytest-httpx
+    pytestCheckHook
+    requests-mock
+  ]
+  ++ lib.flatten (builtins.attrValues passthru.optional-dependencies);
+
+  preCheck = ''
+    export HOME=$TMPDIR
+  '';
+
+  meta = with lib; {
+    changelog = "https://github.com/mvantellingen/python-zeep/releases/tag/${version}";
+    description = "Python SOAP client";
+    homepage = "http://docs.python-zeep.org";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rvl ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zephyr-python-api/default.nix b/nixpkgs/pkgs/development/python-modules/zephyr-python-api/default.nix
new file mode 100644
index 000000000000..07cc6a2b7a19
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zephyr-python-api/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, requests
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "zephyr-python-api";
+  version = "0.0.3";
+  format = "pyproject";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-M9Kf0RtoSeDFAAgAuks+Ek+Wg5OM8qmd3eDoaAgAa3A=";
+  };
+
+  nativeBuildInputs = [ setuptools ];
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  # No tests in archive
+  doCheck = false;
+
+  pythonImportsCheck = [ "zephyr" ];
+
+  meta = {
+    homepage = "https://github.com/nassauwinter/zephyr-python-api";
+    description = "A set of wrappers for Zephyr Scale (TM4J) REST API";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ rapiteanu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zeroc-ice/default.nix b/nixpkgs/pkgs/development/python-modules/zeroc-ice/default.nix
new file mode 100644
index 000000000000..3c1627eb9e1b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zeroc-ice/default.nix
@@ -0,0 +1,23 @@
+{ stdenv, lib, buildPythonPackage, fetchPypi, openssl, bzip2 }:
+
+buildPythonPackage rec {
+  pname = "zeroc-ice";
+  version = "3.7.9.1";
+
+  src = fetchPypi {
+    inherit version pname;
+    hash = "sha256-MOVsYfUq3n62hPEUIOGA75RviGofHcXaJKMnYERxg74=";
+  };
+
+  buildInputs = [ openssl bzip2 ];
+
+  pythonImportsCheck = [ "Ice" ];
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    homepage = "https://zeroc.com/";
+    license = licenses.gpl2;
+    description = "Comprehensive RPC framework with support for Python, C++, .NET, Java, JavaScript and more.";
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zeroconf/default.nix b/nixpkgs/pkgs/development/python-modules/zeroconf/default.nix
new file mode 100644
index 000000000000..7c2cf10e5daf
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zeroconf/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, stdenv
+, cython
+, async-timeout
+, buildPythonPackage
+, fetchFromGitHub
+, ifaddr
+, poetry-core
+, pytest-asyncio
+, pytest-timeout
+, pythonOlder
+, pytestCheckHook
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "zeroconf";
+  version = "0.119.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "jstasiak";
+    repo = "python-zeroconf";
+    rev = "refs/tags/${version}";
+    hash = "sha256-VaqKk2WrRLZM2tfx3+y9GngEc6rMcw0b12ExFVfDYf4=";
+  };
+
+  nativeBuildInputs = [
+    cython
+    poetry-core
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    ifaddr
+  ] ++ lib.optionals (pythonOlder "3.11") [
+    async-timeout
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  preCheck = ''
+    sed -i '/addopts/d' pyproject.toml
+  '';
+
+  disabledTests = [
+    # OSError: [Errno 19] No such device
+    "test_close_multiple_times"
+    "test_integration_with_listener_ipv6"
+    "test_launch_and_close"
+    "test_launch_and_close_context_manager"
+    "test_launch_and_close_v4_v6"
+  ];
+
+  __darwinAllowLocalNetworking = true;
+
+  pythonImportsCheck = [
+    "zeroconf"
+    "zeroconf.asyncio"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/python-zeroconf/python-zeroconf/releases/tag/${version}";
+    description = "Python implementation of multicast DNS service discovery";
+    homepage = "https://github.com/python-zeroconf/python-zeroconf";
+    license = licenses.lgpl21Only;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zerorpc/default.nix b/nixpkgs/pkgs/development/python-modules/zerorpc/default.nix
new file mode 100644
index 000000000000..343c7c6e2515
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zerorpc/default.nix
@@ -0,0 +1,22 @@
+{ lib, buildPythonPackage, fetchPypi, future, gevent, msgpack, pyzmq }:
+
+buildPythonPackage rec {
+  pname = "zerorpc";
+  version = "0.6.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "d2ee247a566fc703f29c277d767f6f61f1e12f76d0402faea4bd815f32cbf37f";
+  };
+
+  propagatedBuildInputs = [ future gevent msgpack pyzmq ];
+
+  doCheck = false; # pypi version doesn't include tests
+
+  meta = with lib; {
+    description = "An easy to use, intuitive, and cross-language RPC";
+    homepage = "https://www.zerorpc.io";
+    license = licenses.mit;
+    maintainers = with maintainers; [ xeji ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zetup/default.nix b/nixpkgs/pkgs/development/python-modules/zetup/default.nix
new file mode 100644
index 000000000000..4808aa497270
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zetup/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, nbconvert
+, path
+, pytestCheckHook
+, setuptools-scm
+, pythonAtLeast
+}:
+
+buildPythonPackage rec {
+  pname = "zetup";
+  version = "0.2.64";
+
+  # https://github.com/zimmermanncode/zetup/issues/4
+  disabled = pythonAtLeast "3.10";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b8a9bdcfa4b705d72b55b218658bc9403c157db7b57a14158253c98d03ab713d";
+  };
+
+  # Python > 3.7 compatibility
+  postPatch = ''
+    substituteInPlace zetup/zetup_config.py \
+      --replace "'3.7']" "'3.7', '3.8', '3.9', '3.10']"
+  '';
+
+  checkPhase = ''
+    py.test test -k "not TestObject" --deselect=test/test_zetup_config.py::test_classifiers
+  '';
+
+  propagatedBuildInputs = [ setuptools-scm ];
+
+  nativeCheckInputs = [
+    path
+    nbconvert
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "zetup" ];
+
+  meta = with lib; {
+    description = "Zimmermann's Extensible Tools for Unified Project setups";
+    homepage = "https://github.com/zimmermanncode/zetup";
+    license = licenses.gpl3Plus;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zeversolarlocal/default.nix b/nixpkgs/pkgs/development/python-modules/zeversolarlocal/default.nix
new file mode 100644
index 000000000000..b1e515d76320
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zeversolarlocal/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, fetchpatch
+, flit-core
+, dos2unix
+, httpx
+, pytest-asyncio
+, pytest-mock
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "zeversolarlocal";
+  version = "1.1.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "ExZy5k5RE7k+D0lGmuIkGWrWQ+m24K2oqbUEg4BAVuY=";
+  };
+
+  nativeBuildInputs = [
+    flit-core
+    dos2unix
+  ];
+
+  propagatedBuildInputs = [
+    httpx
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  # the patch below won't apply unless we fix the line endings
+  prePatch = ''
+    dos2unix pyproject.toml
+  '';
+
+  patches = [
+    # Raise the flit-core limit
+    # https://github.com/sander76/zeversolarlocal/pull/4
+    (fetchpatch {
+      url = "https://github.com/sander76/zeversolarlocal/commit/bff072ea046de07eced77bc79eb8e90dfef1f53f.patch";
+      hash = "sha256-tzFCwPzhAfwVfN5mLY/DMwRv7zGzx3ScBe+kKzkYcvo=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "--cov zeversolarlocal --cov-report xml:cov.xml --cov-report term-missing -vv" ""
+  '';
+
+  disabledTests = [
+    # Test requires network access
+    "test_httpx_timeout"
+  ];
+
+  pythonImportsCheck = [
+    "zeversolarlocal"
+  ];
+
+  meta = with lib; {
+    description = "Python module to interact with Zeversolar inverters";
+    homepage = "https://github.com/sander76/zeversolarlocal";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zfec/default.nix b/nixpkgs/pkgs/development/python-modules/zfec/default.nix
new file mode 100644
index 000000000000..fd5b99448d48
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zfec/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pyutil
+, twisted
+}:
+
+buildPythonPackage rec {
+  pname = "zfec";
+  version = "1.5.7.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-TuUZvg3MfaLohIK8/Av5d6Ql4dfoJ4z1u7uNAPiir7Y=";
+  };
+
+  propagatedBuildInputs = [ pyutil ];
+
+  nativeCheckInputs = [ twisted ];
+
+  checkPhase = "trial zfec";
+
+  pythonImportsCheck = [ "zfec" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/tahoe-lafs/zfec";
+    description = "Zfec, a fast erasure codec which can be used with the command-line, C, Python, or Haskell";
+    longDescription = ''
+      Fast, portable, programmable erasure coding a.k.a. "forward
+      error correction": the generation of redundant blocks of
+      information such that if some blocks are lost then the
+      original data can be recovered from the remaining blocks. The
+      zfec package includes command-line tools, C API, Python API,
+      and Haskell API.
+    '';
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ prusnak ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zha-quirks/default.nix b/nixpkgs/pkgs/development/python-modules/zha-quirks/default.nix
new file mode 100644
index 000000000000..a8959a9e863b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zha-quirks/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, zigpy
+}:
+
+buildPythonPackage rec {
+  pname = "zha-quirks";
+  version = "0.0.106";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "zigpy";
+    repo = "zha-device-handlers";
+    rev = "refs/tags/${version}";
+    hash = "sha256-+sL3AbjDg0Kl6eqMwVAN9W85QKJqFR1ANKz1E958KeA=";
+  };
+
+  propagatedBuildInputs = [
+    aiohttp
+    zigpy
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "zhaquirks"
+  ];
+
+  meta = with lib; {
+    description = "ZHA Device Handlers are custom quirks implementations for Zigpy";
+    homepage = "https://github.com/dmulcahey/zha-device-handlers";
+    changelog = "https://github.com/zigpy/zha-device-handlers/releases/tag/${version}";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fab ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ziafont/default.nix b/nixpkgs/pkgs/development/python-modules/ziafont/default.nix
new file mode 100644
index 000000000000..4e55583b211b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ziafont/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, pytestCheckHook
+, nbval
+}:
+
+buildPythonPackage rec {
+  pname = "ziafont";
+  version = "0.6";
+
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "cdelker";
+    repo = pname;
+    rev = version;
+    hash = "sha256-3ZVj1ZxbFkFDDYbsIPzo7GMWGx7f5qWZQlcGCVXv73M=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    nbval
+  ];
+
+  preCheck = "rm test/manyfonts.ipynb";  # Tries to download fonts
+
+  pytestFlagsArray = [ "--nbval-lax" ];
+
+  pythonImportsCheck = [ "ziafont" ];
+
+  meta = with lib; {
+    description = "Convert TTF/OTF font glyphs to SVG paths";
+    homepage = "https://ziafont.readthedocs.io/en/latest/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sfrijters ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/ziamath/default.nix b/nixpkgs/pkgs/development/python-modules/ziamath/default.nix
new file mode 100644
index 000000000000..5e24f3c41670
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/ziamath/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, ziafont
+, pytestCheckHook
+, nbval
+, latex2mathml
+}:
+
+buildPythonPackage rec {
+  pname = "ziamath";
+  version = "0.8.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "cdelker";
+    repo = pname;
+    rev = version;
+    hash = "sha256-Bbwq4Ods3P/724KO94jSmMLD1ubfaMHP/gTlOL/2pnE=";
+  };
+
+  propagatedBuildInputs = [
+    ziafont
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    nbval
+    latex2mathml
+  ];
+
+  pytestFlagsArray = [ "--nbval-lax" ];
+
+  # Prevent the test suite from attempting to download fonts
+  postPatch = ''
+    substituteInPlace test/styles.ipynb \
+      --replace '"def testfont(exprs, fonturl):\n",' '"def testfont(exprs, fonturl):\n", "    return\n",' \
+      --replace "mathfont='FiraMath-Regular.otf', " ""
+  '';
+
+  pythonImportsCheck = [ "ziamath" ];
+
+  meta = with lib; {
+    description = "Render MathML and LaTeX Math to SVG without Latex installation";
+    homepage = "https://ziamath.readthedocs.io/en/latest/";
+    changelog = "https://ziamath.readthedocs.io/en/latest/changes.html";
+    license = licenses.mit;
+    maintainers = with maintainers; [ sfrijters ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zict/default.nix b/nixpkgs/pkgs/development/python-modules/zict/default.nix
new file mode 100644
index 000000000000..4bd3e7692283
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zict/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pytestCheckHook
+, pytest-asyncio
+, pytest-repeat
+, pytest-timeout
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "zict";
+  version = "3.0.0";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-4yHiY7apeq/AeQw8+zwEZWtwZuZzjDf//MqV2APJ+6U=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+    pytest-repeat
+    pytest-timeout
+  ];
+
+  meta = with lib; {
+    description = "Mutable mapping tools.";
+    homepage = "https://github.com/dask/zict";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ teh ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zigpy-cc/default.nix b/nixpkgs/pkgs/development/python-modules/zigpy-cc/default.nix
new file mode 100644
index 000000000000..505e152f087b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zigpy-cc/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, asynctest
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+, pyserial-asyncio
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, zigpy
+}:
+
+buildPythonPackage rec {
+  pname = "zigpy-cc";
+  version = "0.5.2";
+  format = "setuptools";
+
+  # https://github.com/Martiusweb/asynctest/issues/152
+  # broken by upstream python bug with asynctest and
+  # is used exclusively by home-assistant with python 3.8
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "zigpy";
+    repo = "zigpy-cc";
+    rev = version;
+    sha256 = "U3S8tQ3zPlexZDt5GvCd+rOv7CBVeXJJM1NGe7nRl2o=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial-asyncio
+    zigpy
+  ];
+
+  doCheck = pythonOlder "3.11"; # asynctest is unsupported on python3.11
+
+  nativeCheckInputs = [
+    asynctest
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    "test_incoming_msg"
+    "test_incoming_msg2"
+    "test_deser"
+    # Fails in sandbox
+    "tests/test_application.py "
+  ];
+
+  pythonImportsCheck = [
+    "zigpy_cc"
+  ];
+
+  meta = with lib; {
+    description = "Library which communicates with Texas Instruments CC2531 radios for zigpy";
+    homepage = "https://github.com/zigpy/zigpy-cc";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ mvnetbiz ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zigpy-deconz/default.nix b/nixpkgs/pkgs/development/python-modules/zigpy-deconz/default.nix
new file mode 100644
index 000000000000..a0bc46b09a02
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zigpy-deconz/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+, pyserial-asyncio
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, zigpy
+}:
+
+buildPythonPackage rec {
+  pname = "zigpy-deconz";
+  version = "0.21.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "zigpy";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-YRJMIpC6Zk5sQjGyzdEbQEeYgFJzIbxe4BReayceu10=";
+  };
+
+  propagatedBuildInputs = [
+    pyserial
+    pyserial-asyncio
+    zigpy
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "zigpy_deconz"
+  ];
+
+  meta = with lib; {
+    description = "Library which communicates with Deconz radios for zigpy";
+    homepage = "https://github.com/zigpy/zigpy-deconz";
+    changelog = "https://github.com/zigpy/zigpy-deconz/releases/tag/${version}";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ mvnetbiz ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zigpy-xbee/default.nix b/nixpkgs/pkgs/development/python-modules/zigpy-xbee/default.nix
new file mode 100644
index 000000000000..92e995c1ec05
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zigpy-xbee/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pyserial
+, pyserial-asyncio
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, zigpy
+}:
+
+buildPythonPackage rec {
+  pname = "zigpy-xbee";
+  version = "0.19.0";
+  # https://github.com/Martiusweb/asynctest/issues/152
+  # broken by upstream python bug with asynctest and
+  # is used exclusively by home-assistant with python 3.8
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "zigpy";
+    repo = "zigpy-xbee";
+    rev = "refs/tags/${version}";
+    hash = "sha256-KUXXOySuPFNKcW3O08FBYIfm4WwVjOuIF+GefmKnwl0=";
+  };
+
+  buildInputs = [
+    pyserial
+    pyserial-asyncio
+    zigpy
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # fixed in https://github.com/zigpy/zigpy-xbee/commit/f85233fc28ae01c08267965e99a29e43b00e1561
+    "test_shutdown"
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/zigpy/zigpy-xbee/releases/tag/${version}";
+    description = "A library which communicates with XBee radios for zigpy";
+    homepage = "https://github.com/zigpy/zigpy-xbee";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ mvnetbiz ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zigpy-zigate/default.nix b/nixpkgs/pkgs/development/python-modules/zigpy-zigate/default.nix
new file mode 100644
index 000000000000..4b11d35b6b7d
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zigpy-zigate/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, gpiozero
+, mock
+, pyserial
+, pyserial-asyncio
+, pyusb
+, pytest-asyncio
+, pytestCheckHook
+, pythonOlder
+, zigpy
+}:
+
+buildPythonPackage rec {
+  pname = "zigpy-zigate";
+  version = "0.11.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "zigpy";
+    repo = "zigpy-zigate";
+    rev = "refs/tags/${version}";
+    hash = "sha256-eGN2QvPHZ8gfPPFdUbAP9cs43jzUHDBS/w1tni1shB0=";
+  };
+
+  propagatedBuildInputs = [
+    gpiozero
+    pyserial
+    pyserial-asyncio
+    pyusb
+    zigpy
+  ];
+
+  nativeCheckInputs = [
+    mock
+    pytest-asyncio
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "zigpy_zigate"
+  ];
+
+  disabledTestPaths = [
+    # Fails in sandbox
+    "tests/test_application.py "
+  ];
+
+  meta = with lib; {
+    description = "Library which communicates with ZiGate radios for zigpy";
+    homepage = "https://github.com/zigpy/zigpy-zigate";
+    changelog = "https://github.com/zigpy/zigpy-zigate/releases/tag/${version}";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ mvnetbiz ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zigpy-znp/default.nix b/nixpkgs/pkgs/development/python-modules/zigpy-znp/default.nix
new file mode 100644
index 000000000000..cf487cae0894
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zigpy-znp/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, async-timeout
+, buildPythonPackage
+, coloredlogs
+, fetchFromGitHub
+, jsonschema
+, pytest-asyncio
+, pytest-mock
+, pytest-rerunfailures
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, voluptuous
+, zigpy
+}:
+
+buildPythonPackage rec {
+  pname = "zigpy-znp";
+  version = "0.11.6";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "zigpy";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-K85AmksP/dXKL4DQKadyvjK7y5x6yEgc6vDJAPfblTw=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "timeout = 20" "timeout = 300"
+  '';
+
+  propagatedBuildInputs = [
+    async-timeout
+    coloredlogs
+    jsonschema
+    voluptuous
+    zigpy
+  ];
+
+  nativeCheckInputs = [
+    pytest-asyncio
+    pytest-mock
+    pytest-rerunfailures
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "--reruns=3"
+  ];
+
+  pythonImportsCheck = [
+    "zigpy_znp"
+  ];
+
+  meta = with lib; {
+    description = "Library for zigpy which communicates with TI ZNP radios";
+    homepage = "https://github.com/zigpy/zigpy-znp";
+    changelog = "https://github.com/zigpy/zigpy-znp/releases/tag/v${version}";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ mvnetbiz ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zigpy/default.nix b/nixpkgs/pkgs/development/python-modules/zigpy/default.nix
new file mode 100644
index 000000000000..1f6560377ea7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zigpy/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, aiohttp
+, aiosqlite
+, buildPythonPackage
+, crccheck
+, cryptography
+, freezegun
+, fetchFromGitHub
+, pycryptodome
+, pyserial-asyncio
+, pytest-asyncio
+, pytest-timeout
+, pytestCheckHook
+, pythonOlder
+, setuptools
+, voluptuous
+, wheel
+}:
+
+buildPythonPackage rec {
+  pname = "zigpy";
+  version = "0.58.1";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "zigpy";
+    repo = "zigpy";
+    rev = "refs/tags/${version}";
+    hash = "sha256-i2P9QyhT/UQ8Xu0IfQ2OzAxIiMF4H04Jkz3/6e2FCpY=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace '"setuptools-git-versioning<2"' "" \
+      --replace 'dynamic = ["version"]' 'version = "${version}"'
+  '';
+
+  nativeBuildInputs = [
+    setuptools
+    wheel
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    aiosqlite
+    crccheck
+    cryptography
+    pyserial-asyncio
+    pycryptodome
+    voluptuous
+  ];
+
+  nativeCheckInputs = [
+    freezegun
+    pytest-asyncio
+    pytest-timeout
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # # Our two manual scans succeeded and the periodic one was attempted
+    # assert len(mock_scan.mock_calls) == 3
+    # AssertionError: assert 4 == 3
+    "test_periodic_scan_priority"
+  ];
+
+  pythonImportsCheck = [
+    "zigpy.application"
+    "zigpy.config"
+    "zigpy.exceptions"
+    "zigpy.types"
+    "zigpy.zcl"
+  ];
+
+  meta = with lib; {
+    description = "Library implementing a ZigBee stack";
+    homepage = "https://github.com/zigpy/zigpy";
+    changelog = "https://github.com/zigpy/zigpy/releases/tag/${version}";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ mvnetbiz ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zimports/default.nix b/nixpkgs/pkgs/development/python-modules/zimports/default.nix
new file mode 100644
index 000000000000..22cd50c9189e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zimports/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, fetchFromGitHub
+, buildPythonPackage
+, flake8-import-order
+, pyflakes
+, tomli
+, setuptools
+, pytestCheckHook
+, pythonAtLeast
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "zimports";
+  version = "0.6.1";
+  format = "setuptools";
+
+  # upstream technically support 3.7 through 3.9, but 3.10 happens to work while 3.11 breaks with an import error
+  disabled = pythonOlder "3.7" || pythonAtLeast "3.11";
+
+  src = fetchFromGitHub {
+    owner = "sqlalchemyorg";
+    repo = "zimports";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-+sDvl8z0O0cZyS1oZgt924hlOkYeHiStpXL9y9+JZ5I=";
+  };
+
+  propagatedBuildInputs = [
+    flake8-import-order
+    pyflakes
+    setuptools
+    tomli
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "zimports"
+  ];
+
+  meta = with lib; {
+    description = "Python import rewriter";
+    homepage = "https://github.com/sqlalchemyorg/zimports";
+    license = licenses.mit;
+    maintainers = with maintainers; [ timokau ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zipfile2/default.nix b/nixpkgs/pkgs/development/python-modules/zipfile2/default.nix
new file mode 100644
index 000000000000..fc733e6cdbd4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zipfile2/default.nix
@@ -0,0 +1,27 @@
+{ buildPythonPackage
+, fetchFromGitHub
+, lib
+}:
+
+buildPythonPackage rec {
+  pname = "zipfile2";
+  version = "0.0.12";
+
+  src = fetchFromGitHub {
+    owner = "cournape";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-BwcEgW4XrQqz0Jmtbyxf8q0mWTJXv2dL3Tk7N/IYuMI=";
+  };
+
+  patches = [ ./no-setuid.patch ];
+
+  pythonImportsCheck = [ "zipfile2" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/cournape/zipfile2";
+    description = "A backwards-compatible improved zipfile class";
+    maintainers = with maintainers; [ genericnerdyusername ];
+    license = licenses.psfl;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zipfile2/no-setuid.patch b/nixpkgs/pkgs/development/python-modules/zipfile2/no-setuid.patch
new file mode 100644
index 000000000000..951358585a77
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zipfile2/no-setuid.patch
@@ -0,0 +1,15 @@
+diff --git a/zipfile2/tests/test__zipfile.py b/zipfile2/tests/test__zipfile.py
+index 60f2ed2..db6e5bc 100644
+--- a/zipfile2/tests/test__zipfile.py
++++ b/zipfile2/tests/test__zipfile.py
+@@ -585,8 +585,8 @@ class TestsPermissionExtraction(unittest.TestCase):
+                         if index & 1 << order:
+                             mode |= permissions[permgroup][order]
+                     for order in range(3):
+-                        if specialindex & 1 << order:
+-                            mode |= permissions['special'][order]
++                        if specialindex & 1 << order and order == 0:
++                            raise unittest.SkipTest("The nix build process doesn't allow you to use the setuid bit")
+                     os.chmod(path, mode)
+                     real_permission = os.stat(path).st_mode & 0xFFF
+                     self.files.append((path, real_permission))
diff --git a/nixpkgs/pkgs/development/python-modules/zipp/default.nix b/nixpkgs/pkgs/development/python-modules/zipp/default.nix
new file mode 100644
index 000000000000..1b033810b5b4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zipp/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, func-timeout
+, jaraco-itertools
+, pythonOlder
+, setuptools-scm
+}:
+
+let zipp = buildPythonPackage rec {
+  pname = "zipp";
+  version = "3.16.2";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-68FZRqp4vWNFiZL8gew7b3sektUcNebeHDgE5zt5kUc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools-scm
+  ];
+
+  # Prevent infinite recursion with pytest
+  doCheck = false;
+
+  nativeCheckInputs = [
+    func-timeout
+    jaraco-itertools
+  ];
+
+  pythonImportsCheck = [
+    "zipp"
+  ];
+
+  passthru.tests = {
+    check = zipp.overridePythonAttrs (_: { doCheck = true; });
+  };
+
+  meta = with lib; {
+    description = "Pathlib-compatible object wrapper for zip files";
+    homepage = "https://github.com/jaraco/zipp";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ];
+  };
+}; in zipp
diff --git a/nixpkgs/pkgs/development/python-modules/zipstream-new/default.nix b/nixpkgs/pkgs/development/python-modules/zipstream-new/default.nix
new file mode 100644
index 000000000000..143f4040cce8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zipstream-new/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, nose
+}:
+
+buildPythonPackage rec {
+  pname = "zipstream-new";
+  version = "1.1.8";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "arjan-s";
+    repo = "python-zipstream";
+    rev = "v${version}";
+    sha256 = "14vhgg8mcjqi8cpzrw8qzbij2fr2a63l2a8fhil21k2r8vzv92cv";
+  };
+
+  pythonImportsCheck = [
+    "zipstream"
+  ];
+
+  nativeCheckInputs = [
+    nose
+  ];
+
+  checkPhase = ''
+    runHook preCheck
+    nosetests
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    description = "Like Python's ZipFile module, except it works as a generator that provides the file in many small chunks";
+    homepage = "https://github.com/arjan-s/python-zipstream";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zipstream-ng/default.nix b/nixpkgs/pkgs/development/python-modules/zipstream-ng/default.nix
new file mode 100644
index 000000000000..fe6e8771c057
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zipstream-ng/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "zipstream-ng";
+  version = "1.7.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchFromGitHub {
+    owner = "pR0Ps";
+    repo = "zipstream-ng";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-BYQse+DlyLUH9CofRfGrPUZjP7E8AP/wpirvJmSRfow=";
+  };
+
+  pythonImportsCheck = [
+    "zipstream"
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Library to generate streamable zip files";
+    longDescription = ''
+      A modern and easy to use streamable zip file generator. It can package and stream many files
+      and folders on the fly without needing temporary files or excessive memory
+    '';
+    homepage = "https://github.com/pR0Ps/zipstream-ng";
+    changelog = "https://github.com/pR0Ps/zipstream-ng/blob/v${version}/CHANGELOG.md";
+    license = licenses.lgpl3Only;
+    maintainers = with maintainers; [ gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zipstream/default.nix b/nixpkgs/pkgs/development/python-modules/zipstream/default.nix
new file mode 100644
index 000000000000..3ec6fd24aa59
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zipstream/default.nix
@@ -0,0 +1,20 @@
+{ lib, buildPythonPackage, fetchPypi, nose }:
+
+buildPythonPackage rec {
+  pname = "zipstream";
+  version = "1.1.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "01im5anqdyggmwkigqcjg0qw2a5bnn84h33mfaqjjd69a28lpwif";
+  };
+
+  nativeCheckInputs = [ nose ];
+
+  meta = {
+    description = "A zip archive generator";
+    homepage = "https://github.com/allanlei/python-zipstream";
+    license = lib.licenses.gpl3Plus;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zm-py/default.nix b/nixpkgs/pkgs/development/python-modules/zm-py/default.nix
new file mode 100644
index 000000000000..ce461a3dffea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zm-py/default.nix
@@ -0,0 +1,29 @@
+{ lib, fetchPypi, buildPythonPackage, isPy3k
+, pytest, requests }:
+
+buildPythonPackage rec {
+  pname = "zm-py";
+  version = "0.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "b391cca0e52f2a887aa7a46c314b73335b7e3341c428b425fcf314983e5ebb36";
+  };
+
+  disabled = !isPy3k;
+
+  propagatedBuildInputs = [ requests ];
+
+  nativeCheckInputs = [ pytest ];
+
+  checkPhase = ''
+    PYTHONPATH="./zoneminder:$PYTHONPATH" pytest
+  '';
+
+  meta = with lib; {
+    description = "A loose python wrapper around the ZoneMinder REST API";
+    homepage = "https://github.com/rohankapoorcom/zm-py";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ peterhoeg ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zodb/default.nix b/nixpkgs/pkgs/development/python-modules/zodb/default.nix
new file mode 100644
index 000000000000..4e1ed3ce994e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zodb/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, fetchPypi
+, buildPythonPackage
+, python
+, zope_testrunner
+, transaction
+, six
+, zope_interface
+, zodbpickle
+, zconfig
+, persistent
+, zc_lockfile
+, btrees
+, manuel
+}:
+
+buildPythonPackage rec {
+  pname = "ZODB";
+  version = "5.8.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-KNugDvYm3hBYnt7auFrQ8O33KSXnXTahXJnGOsBf52Q=";
+  };
+
+  # remove broken test
+  postPatch = ''
+    rm -vf src/ZODB/tests/testdocumentation.py
+  '';
+
+  propagatedBuildInputs = [
+    transaction
+    six
+    zope_interface
+    zodbpickle
+    zconfig
+    persistent
+    zc_lockfile
+    btrees
+  ];
+
+  nativeCheckInputs = [
+    manuel
+    zope_testrunner
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m zope.testrunner --test-path=src []
+  '';
+
+  meta = with lib; {
+    description = "Zope Object Database: object database and persistence";
+    homepage = "https://zodb-docs.readthedocs.io/";
+    changelog = "https://github.com/zopefoundation/ZODB/blob/${version}/CHANGES.rst";
+    license = licenses.zpl21;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zodbpickle/default.nix b/nixpkgs/pkgs/development/python-modules/zodbpickle/default.nix
new file mode 100644
index 000000000000..38abffac75ac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zodbpickle/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "zodbpickle";
+  version = "3.1";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-uewy5wbHuAi3mlOnrZZgkRfpQoN3K0AO52VSEHqrzBE=";
+  };
+
+  # fails..
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "zodbpickle"
+  ];
+
+  meta = with lib; {
+    description = "Fork of Python's pickle module to work with ZODB";
+    homepage = "https://github.com/zopefoundation/zodbpickle";
+    changelog = "https://github.com/zopefoundation/zodbpickle/blob/${version}/CHANGES.rst";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zope-cachedescriptors/default.nix b/nixpkgs/pkgs/development/python-modules/zope-cachedescriptors/default.nix
new file mode 100644
index 000000000000..e6aa92cd357b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope-cachedescriptors/default.nix
@@ -0,0 +1,40 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "zope-cachedescriptors";
+  version = "5.0";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "zope.cachedescriptors";
+    inherit version;
+    hash = "sha256-MVe+hm/Jck0Heotb9sP8IcOKQUerZk5yRiLf5fr/BIo=";
+  };
+
+  propagatedBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "src/zope/cachedescriptors/tests.py"
+  ];
+
+  pythonImportsCheck = [ "zope.cachedescriptors" ];
+
+  meta = {
+    description = "Method and property caching decorators";
+    homepage = "https://github.com/zopefoundation/zope.cachedescriptors";
+    license = lib.licenses.zpl21;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zope-component/default.nix b/nixpkgs/pkgs/development/python-modules/zope-component/default.nix
new file mode 100644
index 000000000000..522b2817a845
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope-component/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zope_configuration
+, zope-deferredimport
+, zope-deprecation
+, zope_event
+, zope-hookable
+, zope-i18nmessageid
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "zope-component";
+  version = "6.0";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "zope.component";
+    inherit version;
+    hash = "sha256-mgoEcq0gG5S0/mdBzprCwwuLsixRYHe/A2kt7E37aQY=";
+  };
+
+  propagatedBuildInputs = [
+    zope_configuration
+    zope-deferredimport
+    zope-deprecation
+    zope_event
+    zope-hookable
+    zope-i18nmessageid
+    zope_interface
+  ];
+
+  # ignore tests because of a circular dependency on zope_security
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "zope.component"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/zopefoundation/zope.component";
+    description = "Zope Component Architecture";
+    changelog = "https://github.com/zopefoundation/zope.component/blob/${version}/CHANGES.rst";
+    license = licenses.zpl20;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zope-contenttype/default.nix b/nixpkgs/pkgs/development/python-modules/zope-contenttype/default.nix
new file mode 100644
index 000000000000..c9d88d056eea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope-contenttype/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, zope_testrunner
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "zope-contenttype";
+  version = "5.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "zope.contenttype";
+    inherit version;
+    hash = "sha256-AAHvG2XKZQUZBW3OUwxY0LOWlXzPBQIyPIoVSdtk0xc=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    zope_testrunner
+  ];
+
+  pythonImportsCheck = [
+    "zope.contenttype"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/zopefoundation/zope.contenttype";
+    description = "A utility module for content-type (MIME type) handling";
+    changelog = "https://github.com/zopefoundation/zope.contenttype/blob/${version}/CHANGES.rst";
+    license = licenses.zpl21;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zope-deferredimport/default.nix b/nixpkgs/pkgs/development/python-modules/zope-deferredimport/default.nix
new file mode 100644
index 000000000000..0c0209740332
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope-deferredimport/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zope-proxy
+, zope_testrunner
+}:
+
+buildPythonPackage rec {
+  pname = "zope-deferredimport";
+  version = "5.0";
+
+  src = fetchPypi {
+    pname = "zope.deferredimport";
+    inherit version;
+    sha256 = "sha256-Orvw4YwfF2WRTs0dQbVJ5NBFshso5AZfsMHeCtc2ssM=";
+  };
+
+  propagatedBuildInputs = [ zope-proxy ];
+
+  nativeCheckInputs = [ zope_testrunner ];
+
+  checkPhase = ''
+    zope-testrunner --test-path=src []
+  '';
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Allows you to perform imports names that will only be resolved when used in the code";
+    homepage = "https://github.com/zopefoundation/zope.deferredimport";
+    license = licenses.zpl21;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zope-deprecation/default.nix b/nixpkgs/pkgs/development/python-modules/zope-deprecation/default.nix
new file mode 100644
index 000000000000..4a0437e2b2f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope-deprecation/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "zope-deprecation";
+  version = "5.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "zope.deprecation";
+    inherit version;
+    hash = "sha256-t8MtM5IDayFFxAsxA+cyLbaGYqsJtyZ6/hUyqdk/ZA8=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "src/zope/deprecation/tests.py"
+  ];
+
+  pythonImportsCheck = [
+    "zope.deprecation"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/zopefoundation/zope.deprecation";
+    description = "Zope Deprecation Infrastructure";
+    changelog = "https://github.com/zopefoundation/zope.deprecation/blob/${version}/CHANGES.rst";
+    license = licenses.zpl21;
+    maintainers = with maintainers; [ domenkozar ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zope-dottedname/default.nix b/nixpkgs/pkgs/development/python-modules/zope-dottedname/default.nix
new file mode 100644
index 000000000000..895b00231aea
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope-dottedname/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "zope-dottedname";
+  version = "6.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "zope.dottedname";
+    inherit version;
+    hash = "sha256-28S4W/vzSx74jasWJSrG7xbZBDnyIjstCiYs9Bnq6QI=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "src/zope/dottedname/tests.py"
+  ];
+
+  pythonImportsCheck = [
+    "zope.dottedname"
+  ];
+
+  pythonNamespaces = [
+    "zope"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/zopefoundation/zope.dottedname";
+    description = "Resolver for Python dotted names";
+    changelog = "https://github.com/zopefoundation/zope.dottedname/blob/${version}/CHANGES.rst";
+    license = licenses.zpl21;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zope-hookable/default.nix b/nixpkgs/pkgs/development/python-modules/zope-hookable/default.nix
new file mode 100644
index 000000000000..64db918321d1
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope-hookable/default.nix
@@ -0,0 +1,24 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zope_testing
+}:
+
+buildPythonPackage rec {
+  pname = "zope-hookable";
+  version = "5.4";
+
+  src = fetchPypi {
+    pname = "zope.hookable";
+    inherit version;
+    hash = "sha256-+2AfAKyH5apYKoExXtlnaM41EygHKdP1H3kxLiuLlKw=";
+  };
+
+  nativeCheckInputs = [ zope_testing ];
+
+  meta = with lib; {
+    description = "Supports the efficient creation of “hookable” objects";
+    homepage = "https://github.com/zopefoundation/zope.hookable";
+    license = licenses.zpl21;
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zope-i18nmessageid/default.nix b/nixpkgs/pkgs/development/python-modules/zope-i18nmessageid/default.nix
new file mode 100644
index 000000000000..fa8f4c1a30ee
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope-i18nmessageid/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zope_testrunner
+, unittestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "zope-i18nmessageid";
+  version = "6.0.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "zope.i18nmessageid";
+    inherit version;
+    hash = "sha256-LVvOb7MfHOoO+iZEZJvIZ9KXIwPx272f/vzlsuueAXY=";
+  };
+
+  nativeCheckInputs = [
+    unittestCheckHook
+    zope_testrunner
+  ];
+
+  unittestFlagsArray = [
+    "src/zope/i18nmessageid"
+  ];
+
+  pythonImportsCheck = [
+    "zope.i18nmessageid"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/zopefoundation/zope.i18nmessageid";
+    description = "Message Identifiers for internationalization";
+    changelog = "https://github.com/zopefoundation/zope.i18nmessageid/blob/${version}/CHANGES.rst";
+    license = licenses.zpl20;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zope-lifecycleevent/default.nix b/nixpkgs/pkgs/development/python-modules/zope-lifecycleevent/default.nix
new file mode 100644
index 000000000000..fc6b0005ffac
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope-lifecycleevent/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, zope_event
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "zope-lifecycleevent";
+  version = "5.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "zope.lifecycleevent";
+    inherit version;
+    hash = "sha256-6tP7SW52FPm1adFtrUt4BSsKwhh1utjWbKNQNS2bb50=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [ zope_event zope_interface ];
+
+  # namespace colides with local directory
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "zope.lifecycleevent"
+    "zope.interface"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/zopefoundation/zope.lifecycleevent";
+    description = "Object life-cycle events";
+    changelog = "https://github.com/zopefoundation/zope.lifecycleevent/blob/${version}/CHANGES.rst";
+    license = licenses.zpl21;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zope-proxy/default.nix b/nixpkgs/pkgs/development/python-modules/zope-proxy/default.nix
new file mode 100644
index 000000000000..d6a93b9d3eb5
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope-proxy/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, pythonOlder
+, setuptools
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "zope-proxy";
+  version = "5.1";
+  pyproject = true;
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    pname = "zope.proxy";
+    inherit version;
+    hash = "sha256-d3e9P4986nRSFyYgLhptUVPb9knyBOJQBYrQOvRqQxg=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [ zope_interface ];
+
+  # circular deps
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "zope.proxy"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/zopefoundation/zope.proxy";
+    description = "Generic Transparent Proxies";
+    changelog = "https://github.com/zopefoundation/zope.proxy/blob/${version}/CHANGES.rst";
+    license = licenses.zpl21;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zope-testbrowser/default.nix b/nixpkgs/pkgs/development/python-modules/zope-testbrowser/default.nix
new file mode 100644
index 000000000000..15b3f74a4394
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope-testbrowser/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, setuptools
+, zope_interface
+, zope_schema
+, zope-cachedescriptors
+, pytz
+, webtest
+, beautifulsoup4
+, soupsieve
+, wsgiproxy2
+, six
+, mock
+, zope_testing
+, zope_testrunner
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "zope-testbrowser";
+  version = "6.0";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    pname = "zope.testbrowser";
+    inherit version;
+    sha256 = "sha256-RLd6XpA3q+3DZHai6j3H6XTWE85Sk913zAL4iO4x+ho=";
+  };
+
+  postPatch = ''
+    # remove test that requires network access
+    substituteInPlace src/zope/testbrowser/tests/test_doctests.py \
+      --replace "suite.addTests(wire)" ""
+  '';
+
+  propagatedBuildInputs = [
+    setuptools
+    zope_interface
+    zope_schema
+    zope-cachedescriptors
+    pytz
+    webtest
+    beautifulsoup4
+    soupsieve
+    wsgiproxy2
+    six
+  ];
+
+  nativeCheckInputs = [
+    mock
+    zope_testing
+    zope_testrunner
+  ];
+
+  checkPhase = ''
+    ${python.interpreter} -m zope.testrunner --test-path=src
+  '';
+
+  pythonImportsCheck = [
+    "zope.testbrowser"
+    "zope.testbrowser.browser"
+    "zope.testbrowser.interfaces"
+    "zope.testbrowser.testing"
+    "zope.testbrowser.wsgi"
+  ];
+
+  meta = {
+    description = "Programmable browser for functional black-box tests";
+    homepage = "https://github.com/zopefoundation/zope.testbrowser";
+    license = lib.licenses.zpl21;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zope_configuration/default.nix b/nixpkgs/pkgs/development/python-modules/zope_configuration/default.nix
new file mode 100644
index 000000000000..b6cc1c0f9998
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_configuration/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zope-i18nmessageid
+, zope_schema
+, zope_testrunner
+, manuel
+}:
+
+buildPythonPackage rec {
+  pname = "zope.configuration";
+  version = "4.4.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-giPqSvU5hmznqccwrH6xjlHRfrUVk6p3c7NZPI1tdgg=";
+  };
+
+  nativeCheckInputs = [ zope_testrunner manuel ];
+
+  propagatedBuildInputs = [ zope-i18nmessageid zope_schema ];
+
+  # Need to investigate how to run the tests with zope-testrunner
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Zope Configuration Markup Language (ZCML)";
+    homepage = "https://github.com/zopefoundation/zope.configuration";
+    license = licenses.zpl20;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zope_copy/default.nix b/nixpkgs/pkgs/development/python-modules/zope_copy/default.nix
new file mode 100644
index 000000000000..4be3b5600e1e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_copy/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPy27
+, zope_interface
+, zope_location
+, zope_schema
+, unittestCheckHook
+}:
+
+
+buildPythonPackage rec {
+  pname = "zope.copy";
+  version = "4.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-epg2yjqX9m1WGzYPeGUBKGif4JNAddzg75ECe9xPOlc=";
+  };
+
+  propagatedBuildInputs = [ zope_interface ];
+
+  doCheck = !isPy27; # namespace conflicts
+  nativeCheckInputs = [ unittestCheckHook zope_location zope_schema ];
+
+  unittestFlagsArray = [ "-s" "src/zope/copy" ];
+
+  meta = {
+    maintainers = with lib.maintainers; [ domenkozar ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zope_event/default.nix b/nixpkgs/pkgs/development/python-modules/zope_event/default.nix
new file mode 100644
index 000000000000..93cfc749c923
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_event/default.nix
@@ -0,0 +1,22 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+}:
+
+buildPythonPackage rec {
+  pname = "zope.event";
+  version = "4.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-gdmIEwRvyGzEE242mP7mKKMoL5wyDbGGWMIXSSNfzoA=";
+  };
+
+  meta = with lib; {
+    description = "An event publishing system";
+    homepage = "https://pypi.org/project/zope.event/";
+    license = licenses.zpl20;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zope_exceptions/default.nix b/nixpkgs/pkgs/development/python-modules/zope_exceptions/default.nix
new file mode 100644
index 000000000000..14c81f7924fa
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_exceptions/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "zope.exceptions";
+  version = "4.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-YZ0kpMZb7Zez3QUV5zLoK2nxVdQsyUlV0b6MKCiGg80=";
+  };
+
+  propagatedBuildInputs = [ zope_interface ];
+
+  # circular deps
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Exception interfaces and implementations";
+    homepage = "https://pypi.python.org/pypi/zope.exceptions";
+    license = licenses.zpl20;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zope_filerepresentation/default.nix b/nixpkgs/pkgs/development/python-modules/zope_filerepresentation/default.nix
new file mode 100644
index 000000000000..b119099f9b60
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_filerepresentation/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zope_schema
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "zope.filerepresentation";
+  version = "6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-yza3iGspJ2+C8WhfPykfQjXmac2HhdFHQtRl0Trvaqs=";
+  };
+
+  propagatedBuildInputs = [ zope_interface zope_schema ];
+
+  checkPhase = ''
+    cd src/zope/filerepresentation && python -m unittest
+  '';
+
+  meta = with lib; {
+    homepage = "https://zopefilerepresentation.readthedocs.io/";
+    description = "File-system Representation Interfaces";
+    license = licenses.zpl20;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zope_interface/default.nix b/nixpkgs/pkgs/development/python-modules/zope_interface/default.nix
new file mode 100644
index 000000000000..2a8bd1d7854b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_interface/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zope_event
+}:
+
+buildPythonPackage rec {
+  pname = "zope.interface";
+  version = "5.5.2";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-v+4fP/YhQ4GUmeNI9bin86oCWfmspeDdrnOR0Fnc5nE=";
+  };
+
+  propagatedBuildInputs = [ zope_event ];
+
+  doCheck = false; # Circular deps.
+
+  meta = with lib; {
+    description = "Zope.Interface";
+    homepage = "https://zope.org/Products/ZopeInterface";
+    license = licenses.zpl20;
+    maintainers = [ maintainers.goibhniu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zope_location/default.nix b/nixpkgs/pkgs/development/python-modules/zope_location/default.nix
new file mode 100644
index 000000000000..d0f79775d12b
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_location/default.nix
@@ -0,0 +1,32 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zope-proxy
+}:
+
+buildPythonPackage rec {
+  pname = "zope.location";
+  version = "4.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-Fx7tyKIOw6isJxOaqQzyd/93dy6gMrVLaicBp5J7OsU=";
+  };
+
+  propagatedBuildInputs = [ zope-proxy ];
+
+  # ignore circular dependency on zope_schema
+  preBuild = ''
+    sed -i '/zope.schema/d' setup.py
+  '';
+
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/zopefoundation/zope.location/";
+    description = "Zope Location";
+    license = licenses.zpl20;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zope_schema/default.nix b/nixpkgs/pkgs/development/python-modules/zope_schema/default.nix
new file mode 100644
index 000000000000..b3694fe09dc9
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_schema/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zope_location
+, zope_event
+, zope_interface
+, zope_testing
+}:
+
+buildPythonPackage rec {
+  pname = "zope.schema";
+  version = "7.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6tTbywM1TU5BDJo7kERR60TZAlR1Gxy97fSmGu3p+7k=";
+  };
+
+  propagatedBuildInputs = [ zope_location zope_event zope_interface zope_testing ];
+
+  # ImportError: No module named 'zope.event'
+  # even though zope_event has been included.
+  # Package seems to work fine.
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/zopefoundation/zope.schema";
+    description = "zope.interface extension for defining data schemas";
+    license = licenses.zpl20;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zope_size/default.nix b/nixpkgs/pkgs/development/python-modules/zope_size/default.nix
new file mode 100644
index 000000000000..836d0fa66f82
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_size/default.nix
@@ -0,0 +1,26 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zope-i18nmessageid
+, zope_interface
+}:
+
+buildPythonPackage rec {
+  pname = "zope.size";
+  version = "4.4";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-bhv3QJdZtNpyAuL6/aZXWD1Acx8661VweWaItJPpkHk=";
+  };
+
+  propagatedBuildInputs = [ zope-i18nmessageid zope_interface ];
+
+  meta = with lib; {
+    homepage = "https://github.com/zopefoundation/zope.size";
+    description = "Interfaces and simple adapter that give the size of an object";
+    license = licenses.zpl20;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zope_testing/default.nix b/nixpkgs/pkgs/development/python-modules/zope_testing/default.nix
new file mode 100644
index 000000000000..bc5d9ed94b2e
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_testing/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, isPyPy
+, zope_interface
+, zope_exceptions
+, zope_location
+}:
+
+buildPythonPackage rec {
+  pname = "zope.testing";
+  version = "5.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-6HzQ2NZmVzza8TOBare5vuyAGmSoZZXBnLX+mS7z1kk=";
+  };
+
+  doCheck = !isPyPy;
+
+  propagatedBuildInputs = [ zope_interface zope_exceptions zope_location ];
+
+  meta = with lib; {
+    description = "Zope testing helpers";
+    homepage =  "http://pypi.python.org/pypi/zope.testing";
+    license = licenses.zpl20;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zope_testrunner/default.nix b/nixpkgs/pkgs/development/python-modules/zope_testrunner/default.nix
new file mode 100644
index 000000000000..d687e24082f4
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zope_testrunner/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, zope_interface
+, zope_exceptions
+, zope_testing
+, six
+}:
+
+
+buildPythonPackage rec {
+  pname = "zope.testrunner";
+  version = "5.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-1r1y9E6jLKpBW5bP4UFSsnhjF67xzW9IqCe2Le8Fj9Q=";
+  };
+
+  propagatedBuildInputs = [ zope_interface zope_exceptions zope_testing six ];
+
+  doCheck = false; # custom test modifies sys.path
+
+  meta = with lib; {
+    description = "A flexible test runner with layer support";
+    homepage = "https://pypi.python.org/pypi/zope.testrunner";
+    license = licenses.zpl20;
+    maintainers = [ maintainers.goibhniu ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zopfli/default.nix b/nixpkgs/pkgs/development/python-modules/zopfli/default.nix
new file mode 100644
index 000000000000..c8ecd77730d8
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zopfli/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildPythonPackage, fetchPypi, pythonOlder, setuptools-scm, zopfli, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "zopfli";
+  version = "0.2.3";
+
+  disabled = pythonOlder "3.7";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-28mEG+3XNgQeteaYLNktqTvuFFdF9UIvN5X28ljNxu8=";
+    extension = "zip";
+  };
+
+  format = "pyproject";
+
+  nativeBuildInputs = [ setuptools-scm ];
+
+  buildInputs = [ zopfli ];
+  USE_SYSTEM_ZOPFLI = "True";
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  meta = with lib; {
+    description = "cPython bindings for zopfli";
+    homepage = "https://github.com/obp/py-zopfli";
+    license = licenses.asl20;
+    maintainers = [ maintainers.sternenseemann ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zstandard/default.nix b/nixpkgs/pkgs/development/python-modules/zstandard/default.nix
new file mode 100644
index 000000000000..2bc20be4d4ed
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zstandard/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, cffi
+, hypothesis
+, pythonOlder
+}:
+
+buildPythonPackage rec {
+  pname = "zstandard";
+  version = "0.21.0";
+  format = "setuptools";
+
+  disabled = pythonOlder "3.6";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-8I46ENAaJHh35MthqCoxnqdGw1ajeGVYvtJIHmxAVUY=";
+  };
+
+  propagatedNativeBuildInputs = [
+    cffi
+  ];
+
+  propagatedBuildInputs = [
+    cffi
+  ];
+
+  nativeCheckInputs = [
+    hypothesis
+  ];
+
+  pythonImportsCheck = [
+    "zstandard"
+  ];
+
+  meta = with lib; {
+    description = "zstandard bindings for Python";
+    homepage = "https://github.com/indygreg/python-zstandard";
+    license = licenses.bsdOriginal;
+    maintainers = with maintainers; [ arnoldfarkas ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zstd/default.nix b/nixpkgs/pkgs/development/python-modules/zstd/default.nix
new file mode 100644
index 000000000000..bc233a6555b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zstd/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, pkg-config
+, fetchPypi
+, buildPythonPackage
+, buildPackages
+, zstd
+, pytest
+}:
+
+buildPythonPackage rec {
+  pname = "zstd";
+  version = "1.5.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-HvmAq/Dh4HKwKNLXbvlbR2YyZRyWIlzzC2Gcbu9iVnI=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "/usr/bin/pkg-config" "${buildPackages.pkg-config}/bin/${buildPackages.pkg-config.targetPrefix}pkg-config"
+  '';
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ zstd ];
+
+  setupPyBuildFlags = [
+    "--external"
+    "--include-dirs=${zstd}/include"
+    "--libraries=zstd"
+    "--library-dirs=${zstd}/lib"
+  ];
+
+  # Running tests via setup.py triggers an attempt to recompile with the vendored zstd
+  ZSTD_EXTERNAL = 1;
+  VERSION = zstd.version;
+  PKG_VERSION = version;
+
+  nativeCheckInputs = [ pytest ];
+  checkPhase = ''
+    pytest
+  '';
+
+  meta = with lib; {
+    description = "Simple python bindings to Yann Collet ZSTD compression library";
+    homepage = "https://github.com/sergey-dryabzhinsky/python-zstd";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [
+      eadwu
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zulip/default.nix b/nixpkgs/pkgs/development/python-modules/zulip/default.nix
new file mode 100644
index 000000000000..fe889522e5f7
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zulip/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, buildPythonPackage
+, pythonOlder
+, fetchFromGitHub
+, requests
+, matrix-client
+, distro
+, click
+, typing-extensions
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "zulip";
+  version = "0.8.2";
+
+  disabled = pythonOlder "3.6";
+
+  # no sdist on PyPI
+  src = fetchFromGitHub {
+    owner = "zulip";
+    repo = "python-zulip-api";
+    rev = version;
+    hash = "sha256-Z5WrV/RDQwdKUBF86M5/xWhXn3fGNqJtqO5PTd7s5ME=";
+  };
+  sourceRoot = "${src.name}/zulip";
+
+  propagatedBuildInputs = [
+    requests
+    matrix-client
+    distro
+    click
+    typing-extensions
+  ];
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [ "zulip" ];
+
+  meta = with lib; {
+    description = "Bindings for the Zulip message API";
+    homepage = "https://github.com/zulip/python-zulip-api";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ dotlambda ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zwave-js-server-python/default.nix b/nixpkgs/pkgs/development/python-modules/zwave-js-server-python/default.nix
new file mode 100644
index 000000000000..fbddedbe867f
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zwave-js-server-python/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, aiohttp
+, buildPythonPackage
+, fetchFromGitHub
+, pydantic
+, pytest-aiohttp
+, pytestCheckHook
+, pythonOlder
+, setuptools
+}:
+
+buildPythonPackage rec {
+  pname = "zwave-js-server-python";
+  version = "0.54.0";
+  pyproject = true;
+
+  disabled = pythonOlder "3.11";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-libs";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-FdA8GHwe/An53CqPxE6QUwXTxk3HSqLBrk1dMaVWamA=";
+  };
+
+  nativeBuildInputs = [
+    setuptools
+  ];
+
+  propagatedBuildInputs = [
+    aiohttp
+    pydantic
+  ];
+
+  nativeCheckInputs = [
+    pytest-aiohttp
+    pytestCheckHook
+  ];
+
+  pythonImportsCheck = [
+    "zwave_js_server"
+  ];
+
+  meta = with lib; {
+    description = "Python wrapper for zwave-js-server";
+    homepage = "https://github.com/home-assistant-libs/zwave-js-server-python";
+    changelog = "https://github.com/home-assistant-libs/zwave-js-server-python/releases/tag/${version}";
+    license = with licenses; [ asl20 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zwave-me-ws/default.nix b/nixpkgs/pkgs/development/python-modules/zwave-me-ws/default.nix
new file mode 100644
index 000000000000..152beb51c326
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zwave-me-ws/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, pythonOlder
+, requests
+, websocket-client
+}:
+
+buildPythonPackage rec {
+  pname = "zwave-me-ws";
+  version = "0.4.3";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.8";
+
+  src = fetchFromGitHub {
+    owner = "Z-Wave-Me";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-bTchtgr+UbHCpcXMaQA3bTrhasJ79TguvAqLNlpD/2c=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    websocket-client
+  ];
+
+  # Module has no tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "zwave_me_ws"
+  ];
+
+  meta = with lib; {
+    description = "Library to connect to a ZWave-Me instance";
+    homepage = "https://github.com/Z-Wave-Me/zwave-me-ws";
+    changelog = "https://github.com/Z-Wave-Me/zwave-me-ws/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zxcvbn/default.nix b/nixpkgs/pkgs/development/python-modules/zxcvbn/default.nix
new file mode 100644
index 000000000000..e9a8f32700c6
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zxcvbn/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pytestCheckHook }:
+
+buildPythonPackage rec {
+  pname = "zxcvbn";
+  version = "4.4.28";
+  format = "setuptools";
+
+  # no tests included in PyPI tarball
+  src = fetchFromGitHub {
+    owner = "dwolfhub";
+    repo = "zxcvbn-python";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-etcST7pxlpOH5Q9KtOPGf1vmnkyjEp6Cd5QCmBjW9Hc=";
+  };
+
+  nativeCheckInputs = [
+    pytestCheckHook
+  ];
+
+  meta = with lib; {
+    description = "Python implementation of Dropbox's realistic password strength estimator";
+    homepage = "https://github.com/dwolfhub/zxcvbn-python";
+    license = licenses.mit;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/python-modules/zxing-cpp/default.nix b/nixpkgs/pkgs/development/python-modules/zxing-cpp/default.nix
new file mode 100644
index 000000000000..dbdc4c50effd
--- /dev/null
+++ b/nixpkgs/pkgs/development/python-modules/zxing-cpp/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, buildPythonPackage
+, cmake
+, setuptools-scm
+, numpy
+, pillow
+, pybind11
+, libzxing-cpp
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "zxing-cpp";
+  inherit (libzxing-cpp) src version meta;
+  pyproject = true;
+
+  sourceRoot = "${src.name}/wrappers/python";
+
+  # we don't need pybind11 in the root environment
+  # https://pybind11.readthedocs.io/en/stable/installing.html#include-with-pypi
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "pybind11[global]" "pybind11"
+  '';
+
+  dontUseCmakeConfigure = true;
+
+  propagatedBuildInputs = [
+    numpy
+  ];
+
+  buildInputs = [
+    pybind11
+  ];
+
+  nativeBuildInputs = [
+    cmake
+    setuptools-scm
+  ];
+
+  nativeCheckInputs = [
+    pillow
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "test.py"
+  ];
+
+  pythonImportsCheck = [
+    "zxingcpp"
+  ];
+}